diff --git a/Elwig/Elwig.csproj b/Elwig/Elwig.csproj index d574c3a..06b5d04 100644 --- a/Elwig/Elwig.csproj +++ b/Elwig/Elwig.csproj @@ -14,7 +14,8 @@ - + + diff --git a/Elwig/Helpers/AppDbUpdater.cs b/Elwig/Helpers/AppDbUpdater.cs index 2c1d5d1..3933384 100644 --- a/Elwig/Helpers/AppDbUpdater.cs +++ b/Elwig/Helpers/AppDbUpdater.cs @@ -1,5 +1,9 @@ using Microsoft.Data.Sqlite; using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; using System.Threading.Tasks; namespace Elwig.Helpers { @@ -7,17 +11,12 @@ namespace Elwig.Helpers { public static readonly int RequiredSchemaVersion = 12; - private static int _versionOffset = 0; - private static readonly Func[] _updaters = [ - UpdateDbSchema_1_To_2, UpdateDbSchema_2_To_3, UpdateDbSchema_3_To_4, UpdateDbSchema_4_To_5, - UpdateDbSchema_5_To_6, UpdateDBSchema_6_To_7, UpdateDbSchema_7_To_8, UpdateDbSchema_8_To_9, - UpdateDbSchema_9_To_10, UpdateDbSchema_10_To_11, UpdateDbSchema_11_To_12, - ]; + private static int VersionOffset = 0; private static async Task ExNonQuery(SqliteConnection cnx, string sql) { using var cmd = cnx.CreateCommand(); cmd.CommandText = sql; - await cmd.ExecuteNonQueryAsync(); + await (await cmd.ExecuteReaderAsync()).CloseAsync(); } private static async Task ExScalar(SqliteConnection cnx, string sql) { @@ -33,8 +32,8 @@ namespace Elwig.Helpers { if (applId != 0x454C5747) throw new Exception("Invalid application_id of database"); var schemaVers = (long?)await ExScalar(cnx, "PRAGMA schema_version") ?? 0; - _versionOffset = (int)(schemaVers % 100); - if (_versionOffset != 0) { + VersionOffset = (int)(schemaVers % 100); + if (VersionOffset != 0) { // schema was modified manually/externally // TODO issue warning } @@ -57,762 +56,49 @@ namespace Elwig.Helpers { private static async Task UpdateDbSchema(SqliteConnection cnx, int fromVersion, int toVersion) { if (fromVersion == toVersion) { - return; + //return; } else if (fromVersion > toVersion) { throw new Exception("schema_version of database is too new"); - } else if (toVersion - 1 > _updaters.Length) { - throw new Exception("Unable to update database schema: Updater not implemented"); } else if (fromVersion <= 0) { throw new Exception("schema_version of database is invalid"); } - await ExNonQuery(cnx, "PRAGMA locking_mode = EXCLUSIVE"); - await ExNonQuery(cnx, "PRAGMA foreign_keys = OFF"); - await ExNonQuery(cnx, "BEGIN EXCLUSIVE"); - for (int i = fromVersion; i < toVersion; i++) { - await _updaters[i - 1](cnx); + var asm = Assembly.GetExecutingAssembly(); + (int From, int To, string Name)[] scripts = asm.GetManifestResourceNames() + .Where(n => n.StartsWith("Elwig.Resources.Sql.")) + .Select(n => { + var p = n.Split(".")[^2].Split("-"); + return (int.Parse(p[0]), int.Parse(p[1]), n); + }) + .OrderBy(s => s.Item1).ThenBy(s => s.Item2) + .ToArray(); + + List toExecute = []; + var vers = fromVersion; + while (vers < toVersion) { + var (_, to, name) = scripts.Where(s => s.From == vers).Last(); + toExecute.Add(name); + vers = to; } - await ExNonQuery(cnx, "PRAGMA foreign_key_check"); - await ExNonQuery(cnx, "COMMIT"); - await ExNonQuery(cnx, "PRAGMA foreign_keys = ON"); - await ExNonQuery(cnx, "VACUUM"); - await ExNonQuery(cnx, $"PRAGMA schema_version = {toVersion * 100 + _versionOffset}"); - } - - private static async Task UpdateDbSchema_1_To_2(SqliteConnection cnx) { - await ExNonQuery(cnx, "DROP VIEW v_area_commitment"); - await ExNonQuery(cnx, "ALTER TABLE delivery_part DROP COLUMN weighing_reason"); - await ExNonQuery(cnx, "ALTER TABLE delivery_part ADD COLUMN weighing_reason TEXT CHECK(NOT (manual_weighing = FALSE AND weighing_reason IS NOT NULL))"); - } - - private static async Task UpdateDbSchema_2_To_3(SqliteConnection cnx) { - await ExNonQuery(cnx, """ - CREATE TABLE delivery_part_bin ( - year INTEGER NOT NULL, - did INTEGER NOT NULL, - dpnr INTEGER NOT NULL, - binnr INTEGER NOT NULL, - - discr TEXT NOT NULL, - value INTEGER NOT NULL, - - CONSTRAINT pk_delivery_part_bin PRIMARY KEY (year, did, dpnr, binnr), - CONSTRAINT fk_delivery_part_bin_delivery_part FOREIGN KEY (year, did, dpnr) REFERENCES delivery_part (year, did, dpnr) - ON UPDATE CASCADE - ON DELETE CASCADE - ) STRICT; - """); - await ExNonQuery(cnx, """ - INSERT INTO delivery_part_bin (year, did, dpnr, binnr, discr, value) - SELECT year, did, dpnr, 0, '_', bucket_2 + bucket_3 - FROM payment_delivery_part - WHERE COALESCE(bucket_1, bucket_2, bucket_3, bucket_4, bucket_5, bucket_6, bucket_7, bucket_8, bucket_9) IS NOT NULL - ON CONFLICT DO NOTHING; - """); - await ExNonQuery(cnx, """ - INSERT INTO delivery_part_bin (year, did, dpnr, binnr, discr, value) - SELECT d.year, d.did, d.dpnr, 1, COALESCE(attributes, ''), bucket_1 - FROM payment_delivery_part p - JOIN v_delivery d ON (d.year, d.did, d.dpnr) = (p.year, p.did, p.dpnr) - WHERE COALESCE(bucket_1, bucket_2, bucket_3, bucket_4, bucket_5, bucket_6, bucket_7, bucket_8, bucket_9) IS NOT NULL - ON CONFLICT DO NOTHING; - """); - await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_1"); - await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_2"); - await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_3"); - await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_4"); - await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_5"); - await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_6"); - await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_7"); - await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_8"); - await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN bucket_9"); - await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_1_name"); - await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_2_name"); - await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_3_name"); - await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_4_name"); - await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_5_name"); - await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_6_name"); - await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_7_name"); - await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_8_name"); - await ExNonQuery(cnx, "ALTER TABLE payment_variant DROP COLUMN bucket_9_name"); - - await ExNonQuery(cnx, "ALTER TABLE delivery_part ADD COLUMN gebunden INTEGER CHECK (gebunden IN (TRUE, FALSE)) DEFAULT NULL"); - - await ExNonQuery(cnx, "DROP VIEW v_delivery"); - await ExNonQuery(cnx, """ - CREATE VIEW v_delivery AS - SELECT s.*, GROUP_CONCAT(o.modid) AS modifiers - FROM (SELECT p.year, p.did, p.dpnr, - d.date, d.time, d.zwstid, d.lnr, d.lsnr, - m.mgnr, m.family_name, m.given_name, - p.sortid, p.weight, p.kmw, ROUND(p.kmw * (4.54 + 0.022 * p.kmw), 0) AS oe, p.qualid, p.hkid, p.kgnr, p.rdnr, - p.gerebelt, p.gebunden, - p.qualid IN (SELECT l.qualid FROM wine_quality_level l WHERE NOT l.predicate AND (p.kmw >= l.min_kmw OR l.min_kmw IS NULL) ORDER BY l.min_kmw DESC LIMIT 1,100) AS abgewertet, - p.qualid NOT IN ('WEI', 'RSW', 'LDW') AS min_quw, - GROUP_CONCAT(a.attrid) AS attributes, - COALESCE(SUM(a.fill_lower_bins), 0) AS attribute_prio, - d.comment, p.comment AS part_comment - FROM delivery_part p - JOIN delivery d ON (d.year, d.did) = (p.year, p.did) - JOIN member m ON m.mgnr = d.mgnr - LEFT JOIN delivery_part_attribute pa ON (pa.year, pa.did, pa.dpnr) = (p.year, p.did, p.dpnr) - LEFT JOIN wine_attribute a ON a.attrid = pa.attrid - GROUP BY p.year, p.did, p.dpnr - ORDER BY p.year, p.did, p.dpnr, a.attrid) s - LEFT JOIN delivery_part_modifier o ON (o.year, o.did, o.dpnr) = (s.year, s.did, s.dpnr) - GROUP BY s.year, s.lsnr, s.dpnr - ORDER BY s.year, s.lsnr, s.dpnr, o.modid; - """); - - await ExNonQuery(cnx, "DROP VIEW v_bucket"); - await ExNonQuery(cnx, """ - CREATE VIEW v_delivery_bin AS - SELECT year, mgnr, - sortid || IIF(min_quw, REPLACE(COALESCE(attributes, ''), ',', ''), '_') AS bin, - SUM(weight) AS weight - FROM v_delivery - GROUP BY year, mgnr, bin - ORDER BY year, mgnr, LENGTH(bin) DESC, bin; - """); + if (toExecute.Count == 0) + return; await ExNonQuery(cnx, """ - CREATE VIEW v_payment_bin AS - SELECT d.year, d.mgnr, - sortid || discr AS bin, - SUM(value) AS weight - FROM v_delivery d - JOIN delivery_part_bin b ON (b.year, b.did, b.dpnr) = (d.year, d.did, d.dpnr) - GROUP BY d.year, d.mgnr, bin - HAVING SUM(value) > 0 - ORDER BY d.year, d.mgnr, bin; + PRAGMA locking_mode = EXCLUSIVE; + PRAGMA foreign_keys = OFF; + BEGIN EXCLUSIVE; """); - - await ExNonQuery(cnx, "ALTER TABLE wine_attribute ADD COLUMN fill_lower_bins INTEGER NOT NULL CHECK (fill_lower_bins IN (0, 1, 2)) DEFAULT 0"); - } - - private static async Task UpdateDbSchema_3_To_4(SqliteConnection cnx) { - await ExNonQuery(cnx, "DROP VIEW v_payment_bin"); - await ExNonQuery(cnx, """ - CREATE VIEW v_payment_bin AS - SELECT d.year, d.mgnr, - sortid || discr AS bin, - SUM(value) AS weight - FROM v_delivery d - JOIN delivery_part_bin b ON (b.year, b.did, b.dpnr) = (d.year, d.did, d.dpnr) - GROUP BY d.year, d.mgnr, bin - HAVING SUM(value) > 0 - ORDER BY d.year, d.mgnr, LENGTH(bin) DESC, bin; - """); - - await ExNonQuery(cnx, """ - CREATE VIEW v_area_commitment_bin AS - SELECT s.year, c.mgnr, - c.vtrgid AS bin, - CAST(ROUND(SUM(COALESCE(area * min_kg_per_ha, 0)) / 10000.0, 0) AS INTEGER) AS min_kg, - CAST(ROUND(SUM(COALESCE(area * max_kg_per_ha, 0)) / 10000.0, 0) AS INTEGER) AS max_kg - FROM area_commitment c, season s - JOIN area_commitment_type t ON t.vtrgid = c.vtrgid - WHERE (year_from IS NULL OR year_from <= s.year) AND - (year_to IS NULL OR year_to >= s.year) - GROUP BY s.year, c.mgnr, c.vtrgid - ORDER BY s.year, c.mgnr, LENGTH(c.vtrgid) DESC, c.vtrgid; - """); - } - - private static async Task UpdateDbSchema_4_To_5(SqliteConnection cnx) { - await ExNonQuery(cnx, """ - CREATE TABLE _area_commitment_type ( - vtrgid TEXT NOT NULL CHECK (vtrgid = sortid || COALESCE(attrid, '') || disc), - sortid TEXT NOT NULL, - attrid TEXT, - disc TEXT DEFAULT NULL CHECK (disc REGEXP '^[A-Z0-9]+$'), - - min_kg_per_ha INTEGER, - max_kg_per_ha INTEGER, - penalty_amount INTEGER, - - CONSTRAINT pk_area_commitment_type PRIMARY KEY (vtrgid), - CONSTRAINT sk_area_commitment_type_sort_attr UNIQUE (sortid, attrid, disc), - CONSTRAINT fk_area_commitment_type_wine_variety FOREIGN KEY (sortid) REFERENCES wine_variety (sortid) - ON UPDATE CASCADE - ON DELETE RESTRICT, - CONSTRAINT fk_area_commitment_type_wine_attribute FOREIGN KEY (attrid) REFERENCES wine_attribute (attrid) - ON UPDATE CASCADE - ON DELETE RESTRICT - ) STRICT; - """); - await ExNonQuery(cnx, """ - INSERT INTO _area_commitment_type (vtrgid, sortid, attrid, disc, min_kg_per_ha, max_kg_per_ha, penalty_amount) - SELECT vtrgid, sortid, attrid_1, disc, min_kg_per_ha, max_kg_per_ha, penalty_amount FROM area_commitment_type - """); - await ExNonQuery(cnx, "PRAGMA writable_schema = ON"); - await ExNonQuery(cnx, "DROP TABLE area_commitment_type"); - await ExNonQuery(cnx, "ALTER TABLE _area_commitment_type RENAME TO area_commitment_type"); - await ExNonQuery(cnx, "PRAGMA writable_schema = OFF"); - - await ExNonQuery(cnx, """ - ALTER TABLE delivery_part ADD COLUMN attrid TEXT DEFAULT NULL - REFERENCES wine_attribute (attrid) - ON UPDATE CASCADE - ON DELETE RESTRICT - """); - await ExNonQuery(cnx, """ - UPDATE delivery_part - SET attrid = (SELECT attrid - FROM delivery_part_attribute a - WHERE (delivery_part.year, delivery_part.did, delivery_part.dpnr) = (a.year, a.did, a.dpnr) - ORDER BY attrid DESC - LIMIT 1) - """); - await ExNonQuery(cnx, "DROP TRIGGER t_delivery_part_attribute_i_mtime_delivery_part"); - await ExNonQuery(cnx, "DROP TRIGGER t_delivery_part_attribute_u_mtime_delivery_part"); - await ExNonQuery(cnx, "DROP TRIGGER t_delivery_part_attribute_d_mtime_delivery_part"); - await ExNonQuery(cnx, "DROP TABLE delivery_part_attribute"); - - await ExNonQuery(cnx, "DROP VIEW v_delivery"); - await ExNonQuery(cnx, """ - CREATE VIEW v_delivery AS - SELECT p.year, p.did, p.dpnr, - d.date, d.time, d.zwstid, d.lnr, d.lsnr, - m.mgnr, m.family_name, m.given_name, - p.sortid, a.attrid, - p.weight, p.kmw, ROUND(p.kmw * (4.54 + 0.022 * p.kmw), 0) AS oe, p.qualid, - p.hkid, p.kgnr, p.rdnr, - p.gerebelt, p.gebunden, - p.qualid IN (SELECT l.qualid FROM wine_quality_level l WHERE NOT l.predicate AND (p.kmw >= l.min_kmw OR l.min_kmw IS NULL) ORDER BY l.min_kmw DESC LIMIT 1,100) AS abgewertet, - p.qualid NOT IN ('WEI', 'RSW', 'LDW') AS min_quw, - COALESCE(a.fill_lower_bins, 0) AS attribute_prio, - GROUP_CONCAT(o.modid) AS modifiers, - d.comment, p.comment AS part_comment - FROM delivery_part p - JOIN delivery d ON (d.year, d.did) = (p.year, p.did) - JOIN member m ON m.mgnr = d.mgnr - LEFT JOIN wine_attribute a ON a.attrid = p.attrid - LEFT JOIN delivery_part_modifier o ON (o.year, o.did, o.dpnr) = (p.year, p.did, p.dpnr) - GROUP BY p.year, p.did, p.dpnr - ORDER BY p.year, p.did, p.dpnr, o.modid; - """); - - await ExNonQuery(cnx, "DROP VIEW v_delivery_bin"); - await ExNonQuery(cnx, """ - CREATE VIEW v_delivery_bin AS - SELECT year, mgnr, - sortid || IIF(min_quw, COALESCE(attrid, ''), '_') AS bin, - SUM(weight) AS weight - FROM v_delivery - GROUP BY year, mgnr, bin - ORDER BY year, mgnr, LENGTH(bin) DESC, bin; - """); - - await ExNonQuery(cnx, "DROP VIEW v_stat_attr"); - await ExNonQuery(cnx, """ - CREATE VIEW v_stat_attr AS - SELECT year, attrid, - SUM(weight) as sum, - ROUND(SUM(kmw * weight) / SUM(weight), 2) AS kmw, - ROUND(SUM(oe * weight) / SUM(weight), 1) AS oe, - COUNT(DISTINCT did) AS lieferungen, - COUNT(DISTINCT mgnr) AS mitglieder - FROM v_delivery - GROUP BY year, attrid - ORDER BY year, attrid; - """); - - await ExNonQuery(cnx, "DROP VIEW v_stat_sort_attr"); - await ExNonQuery(cnx, """ - CREATE VIEW v_stat_sort_attr AS - SELECT year, sortid, attrid, - SUM(weight) as sum, - ROUND(SUM(kmw * weight) / SUM(weight), 2) AS kmw, - ROUND(SUM(oe * weight) / SUM(weight), 1) AS oe, - COUNT(DISTINCT did) AS lieferungen, - COUNT(DISTINCT mgnr) AS mitglieder - FROM v_delivery - GROUP BY year, sortid, attrid - ORDER BY year, sortid, attrid; - """); - } - - private static async Task UpdateDbSchema_5_To_6(SqliteConnection cnx) { - await ExNonQuery(cnx, "DROP VIEW IF EXISTS v_area_commitment"); - - await ExNonQuery(cnx, "PRAGMA writable_schema = ON"); - await ExNonQuery(cnx, "ALTER TABLE wine_attribute DROP COLUMN fill_lower_bins"); - await ExNonQuery(cnx, "ALTER TABLE wine_attribute ADD COLUMN strict INTEGER NOT NULL CHECK (strict IN (TRUE, FALSE)) DEFAULT FALSE"); - await ExNonQuery(cnx, "ALTER TABLE wine_attribute ADD COLUMN fill_lower INTEGER NOT NULL CHECK (fill_lower IN (0, 1, 2)) DEFAULT 0"); - await ExNonQuery(cnx, "DROP VIEW v_delivery"); - await ExNonQuery(cnx, """ - CREATE VIEW v_delivery AS - SELECT p.year, p.did, p.dpnr, - d.date, d.time, d.zwstid, d.lnr, d.lsnr, - m.mgnr, m.family_name, m.given_name, - p.sortid, a.attrid, - p.weight, p.kmw, ROUND(p.kmw * (4.54 + 0.022 * p.kmw), 0) AS oe, p.qualid, - p.hkid, p.kgnr, p.rdnr, - p.gerebelt, p.gebunden, - p.qualid IN (SELECT l.qualid FROM wine_quality_level l WHERE NOT l.predicate AND (p.kmw >= l.min_kmw OR l.min_kmw IS NULL) ORDER BY l.min_kmw DESC LIMIT 1,100) AS abgewertet, - p.qualid NOT IN ('WEI', 'RSW', 'LDW') AS min_quw, - IIF(a.strict, COALESCE(a.fill_lower, 0), 0) AS attribute_prio, - GROUP_CONCAT(o.modid) AS modifiers, - d.comment, p.comment AS part_comment - FROM delivery_part p - JOIN delivery d ON (d.year, d.did) = (p.year, p.did) - JOIN member m ON m.mgnr = d.mgnr - LEFT JOIN wine_attribute a ON a.attrid = p.attrid - LEFT JOIN delivery_part_modifier o ON (o.year, o.did, o.dpnr) = (p.year, p.did, p.dpnr) - GROUP BY p.year, p.did, p.dpnr - ORDER BY p.year, p.did, p.dpnr, o.modid; - """); - await ExNonQuery(cnx, "PRAGMA writable_schema = OFF"); - - await ExNonQuery(cnx, "DROP VIEW v_area_commitment_bin"); - await ExNonQuery(cnx, "DROP VIEW v_delivery_bin"); - await ExNonQuery(cnx, "DROP VIEW v_payment_bin"); - - await ExNonQuery(cnx, "ALTER TABLE area_commitment_type DROP COLUMN max_kg_per_ha"); - await ExNonQuery(cnx, "ALTER TABLE area_commitment_type ADD COLUMN penalty_per_kg INTEGER DEFAULT NULL"); - await ExNonQuery(cnx, "ALTER TABLE area_commitment_type ADD COLUMN penalty_none INTEGER DEFAULT NULL"); - - await ExNonQuery(cnx, "ALTER TABLE wine_cultivation ADD COLUMN description TEXT DEFAULT NULL"); - await ExNonQuery(cnx, "ALTER TABLE member ADD COLUMN organic INTEGER NOT NULL CHECK (organic IN (TRUE, FALSE)) DEFAULT FALSE"); - - await ExNonQuery(cnx, "ALTER TABLE season ADD COLUMN max_kg_per_ha INTEGER NOT NULL DEFAULT 10000"); - await ExNonQuery(cnx, "ALTER TABLE season ADD COLUMN vat_normal REAL NOT NULL DEFAULT 0.10"); - await ExNonQuery(cnx, "ALTER TABLE season ADD COLUMN vat_flatrate REAL NOT NULL DEFAULT 0.13"); - await ExNonQuery(cnx, "ALTER TABLE season ADD COLUMN min_kg_per_bs INTEGER NOT NULL DEFAULT 750"); - await ExNonQuery(cnx, "ALTER TABLE season ADD COLUMN max_kg_per_bs INTEGER NOT NULL DEFAULT 3000"); - await ExNonQuery(cnx, "ALTER TABLE season ADD COLUMN penalty_per_kg INTEGER DEFAULT NULL"); - await ExNonQuery(cnx, "ALTER TABLE season ADD COLUMN penalty_amount INTEGER DEFAULT NULL"); - await ExNonQuery(cnx, "ALTER TABLE season ADD COLUMN penalty_none INTEGER DEFAULT NULL"); - - await ExNonQuery(cnx, "DELETE FROM client_parameter WHERE param IN ('DELIVERY_RIGHT', 'DELIVERY_OBLIGATION', 'VAT_NORMAL', 'VAT_REDUCED', 'VAT_FLATRATE')"); - - await ExNonQuery(cnx, """ - CREATE TABLE delivery_part_bucket ( - year INTEGER NOT NULL, - did INTEGER NOT NULL, - dpnr INTEGER NOT NULL, - bktnr INTEGER NOT NULL, - - discr TEXT NOT NULL, - value INTEGER NOT NULL, - - CONSTRAINT pk_delivery_part_bucket PRIMARY KEY (year, did, dpnr, bktnr), - CONSTRAINT fk_delivery_part_bucket_delivery_part FOREIGN KEY (year, did, dpnr) REFERENCES delivery_part (year, did, dpnr) - ON UPDATE CASCADE - ON DELETE CASCADE - ) STRICT; - """); - await ExNonQuery(cnx, """ - INSERT INTO delivery_part_bucket (year, did, dpnr, bktnr, discr, value) - SELECT year, did, dpnr, binnr, discr, value - FROM delivery_part_bin - """); - await ExNonQuery(cnx, "DROP TABLE delivery_part_bin"); - - await ExNonQuery(cnx, """ - CREATE VIEW v_area_commitment_bucket_strict AS - SELECT s.year, c.mgnr, - t.sortid || COALESCE(a.attrid, '') AS bucket, - t.sortid, a.attrid, - CAST(ROUND(SUM(area) * COALESCE(t.min_kg_per_ha, 0) / 10000.0, 0) AS INTEGER) AS min_kg, - CAST(ROUND(SUM(area) * MIN(COALESCE(a.max_kg_per_ha, s.max_kg_per_ha), s.max_kg_per_ha) / 10000.0, 0) AS INTEGER) AS max_kg, - CAST(ROUND(SUM(area) * s.max_kg_per_ha / 10000.0, 0) AS INTEGER) AS upper_max_kg - FROM season s, area_commitment c - JOIN area_commitment_type t ON t.vtrgid = c.vtrgid - LEFT JOIN wine_attribute a ON a.attrid = t.attrid - WHERE (year_from IS NULL OR year_from <= s.year) AND - (year_to IS NULL OR year_to >= s.year) - GROUP BY s.year, c.mgnr, bucket - ORDER BY s.year, c.mgnr, bucket; - """); - await ExNonQuery(cnx, """ - CREATE VIEW v_area_commitment_bucket AS - SELECT year, mgnr, bucket, min_kg, max_kg - FROM v_area_commitment_bucket_strict - WHERE attrid IS NOT NULL - UNION ALL - SELECT b.year, b.mgnr, b.sortid, - SUM(b.min_kg) AS min_kg, - SUM(b.upper_max_kg) AS max_kg - FROM v_area_commitment_bucket_strict b - LEFT JOIN wine_attribute a ON a.attrid = b.attrid - WHERE a.strict IS NULL OR a.strict = FALSE - GROUP BY b.year, b.mgnr, b.sortid - ORDER BY year, mgnr, bucket; - """); - await ExNonQuery(cnx, """ - CREATE VIEW v_delivery_bucket_strict AS - SELECT year, mgnr, - sortid || IIF(min_quw, COALESCE(attrid, ''), '_') AS bucket, - sortid, IIF(min_quw, attrid, NULL) AS attrid, - SUM(weight) AS weight, - min_quw - FROM v_delivery - GROUP BY year, mgnr, bucket - ORDER BY year, mgnr, bucket; - """); - await ExNonQuery(cnx, """ - CREATE VIEW v_delivery_bucket AS - SELECT year, mgnr, bucket, weight - FROM v_delivery_bucket_strict - WHERE attrid IS NOT NULL OR NOT min_quw - UNION ALL - SELECT b.year, b.mgnr, b.sortid, - SUM(b.weight) AS weight - FROM v_delivery_bucket_strict b - LEFT JOIN wine_attribute a ON a.attrid = b.attrid - WHERE min_quw AND (a.strict IS NULL OR a.strict = FALSE) - GROUP BY b.year, b.mgnr, b.sortid - ORDER BY year, mgnr, bucket; - """); - await ExNonQuery(cnx, """ - CREATE VIEW v_payment_bucket_strict AS - SELECT d.year, d.mgnr, - d.sortid || b.discr AS bucket, - d.sortid, IIF(b.discr IN ('', '_'), NULL, b.discr) AS attrid, - SUM(b.value) AS weight, - b.discr != '_' AS gebunden - FROM v_delivery d - LEFT JOIN delivery_part_bucket b ON (b.year, b.did, b.dpnr) = (d.year, d.did, d.dpnr) - GROUP BY d.year, d.mgnr, bucket - HAVING SUM(b.value) > 0 - ORDER BY d.year, d.mgnr, bucket; - """); - await ExNonQuery(cnx, """ - CREATE VIEW v_payment_bucket AS - SELECT year, mgnr, bucket, weight - FROM v_payment_bucket_strict - WHERE attrid IS NOT NULL OR NOT gebunden - UNION ALL - SELECT b.year, b.mgnr, b.sortid, - SUM(b.weight) AS weight - FROM v_payment_bucket_strict b - LEFT JOIN wine_attribute a ON a.attrid = b.attrid - WHERE gebunden AND (a.strict IS NULL OR a.strict = FALSE) - GROUP BY b.year, b.mgnr, b.sortid - ORDER BY year, mgnr, bucket; - """); - } - - private static async Task UpdateDBSchema_6_To_7(SqliteConnection cnx) { - await ExNonQuery(cnx, "DROP VIEW v_area_commitment_bucket_strict"); - await ExNonQuery(cnx, """ - CREATE VIEW v_area_commitment_bucket_strict AS - SELECT s.year, c.mgnr, - t.sortid || COALESCE(a.attrid, '') AS bucket, - t.sortid, a.attrid, - SUM(area) AS area, - CAST(ROUND(SUM(area) * COALESCE(t.min_kg_per_ha, 0) / 10000.0, 0) AS INTEGER) AS min_kg, - CAST(ROUND(SUM(area) * MIN(COALESCE(a.max_kg_per_ha, s.max_kg_per_ha), s.max_kg_per_ha) / 10000.0, 0) AS INTEGER) AS max_kg, - CAST(ROUND(SUM(area) * s.max_kg_per_ha / 10000.0, 0) AS INTEGER) AS upper_max_kg - FROM season s, area_commitment c - JOIN area_commitment_type t ON t.vtrgid = c.vtrgid - LEFT JOIN wine_attribute a ON a.attrid = t.attrid - WHERE (year_from IS NULL OR year_from <= s.year) AND - (year_to IS NULL OR year_to >= s.year) - GROUP BY s.year, c.mgnr, bucket - ORDER BY s.year, c.mgnr, bucket; - """); - - await ExNonQuery(cnx, """ - CREATE VIEW v_under_delivery_bucket_strict AS - SELECT c.year, c.mgnr, c.bucket, c.min_kg, COALESCE(p.weight, 0) AS weight - FROM v_area_commitment_bucket_strict c - LEFT JOIN v_payment_bucket_strict p ON (p.year, p.mgnr, p.bucket) = (c.year, c.mgnr, c.bucket) - ORDER BY c.year, c.mgnr, c.bucket; - """); - await ExNonQuery(cnx, """ - CREATE VIEW v_under_delivery_bucket AS - SELECT u.year, u.mgnr, u.bucket, u.min_kg, - u.weight + SUM(MAX(COALESCE(p.weight - s.min_kg, 0), 0)) AS weight - FROM v_under_delivery_bucket_strict u - LEFT JOIN v_payment_bucket_strict p ON (p.year, p.mgnr, p.sortid) = (u.year, u.mgnr, u.bucket) AND p.attrid IS NOT NULL - LEFT JOIN wine_attribute a ON a.attrid = p.attrid - LEFT JOIN v_area_commitment_bucket_strict s ON (s.year, s.mgnr, s.bucket) = (p.year, p.mgnr, p.bucket) - WHERE (p.gebunden IS NULL OR p.gebunden) AND (a.strict IS NULL OR a.strict = FALSE) - GROUP BY u.year, u.mgnr, u.bucket - ORDER BY u.year, u.mgnr, u.bucket; - """); - await ExNonQuery(cnx, """ - CREATE VIEW v_under_delivery AS - SELECT year, mgnr, bucket, min_kg, weight, weight - min_kg AS diff - FROM v_under_delivery_bucket - WHERE diff < 0; - """); - } - - private static async Task UpdateDbSchema_7_To_8(SqliteConnection cnx) { - await ExNonQuery(cnx, """ - INSERT INTO wb_gem - SELECT a.gkz, 'WLNO' - FROM AT_gem a - LEFT JOIN wb_gem w ON w.gkz = a.gkz - WHERE a.gkz / 10000 = 3 AND w.hkid IS NULL; - """); - await ExNonQuery(cnx, """ - INSERT INTO wb_gem - SELECT gkz, 'SLVL' - FROM AT_gem - WHERE gkz / 100 IN (617, 622, 623); - """); - await ExNonQuery(cnx, """ - INSERT INTO wb_gem - SELECT gkz, 'SLSS' - FROM AT_gem - WHERE gkz / 100 = 610; - """); - await ExNonQuery(cnx, """ - UPDATE wb_gem - SET hkid = 'SLVL' - WHERE gkz IN (61007, 61052, 61001, 61055, 61027, 61057, 61008, 61057); - """); - await ExNonQuery(cnx, """ - INSERT INTO wb_gem - SELECT gkz, 'SLWS' - FROM AT_gem - WHERE gkz / 100 IN (603, 616) OR gkz IN (60101, 60663, 60651, 60659, 60664, 60647, 60641, 60639, 60665, 60669, 60618, 60629, 60608, 60670, 60624, 60660, 60656, 60655); - """); - await ExNonQuery(cnx, """ - INSERT INTO wb_gem - SELECT g.gkz, 'SLVL' - FROM AT_gem g - LEFT JOIN wb_gem w ON w.gkz = g.gkz - WHERE g.gkz / 100 = 606 AND w.hkid IS NULL; - """); - await ExNonQuery(cnx, """ - INSERT INTO wb_gem - SELECT g.gkz, 'SLST' - FROM AT_gem g - LEFT JOIN wb_gem w ON w.gkz = g.gkz - WHERE g.gkz / 10000 = 6 AND w.hkid IS NULL; - """); - await ExNonQuery(cnx, """ - INSERT INTO wb_gem - SELECT gkz, 'BLOO' - FROM AT_gem - WHERE gkz / 10000 = 4; - """); - await ExNonQuery(cnx, """ - INSERT INTO wb_gem - SELECT gkz, 'BLKA' - FROM AT_gem - WHERE gkz / 10000 = 2; - """); - await ExNonQuery(cnx, """ - INSERT INTO wb_gem - SELECT gkz, 'BLSB' - FROM AT_gem - WHERE gkz / 10000 = 5; - """); - await ExNonQuery(cnx, """ - INSERT INTO wb_gem - SELECT gkz, 'BLTI' - FROM AT_gem - WHERE gkz / 10000 = 7; - """); - await ExNonQuery(cnx, """ - INSERT INTO wb_gem - SELECT gkz, 'BLVO' - FROM AT_gem - WHERE gkz / 10000 = 8; - """); - } - - private static async Task UpdateDbSchema_8_To_9(SqliteConnection cnx) { - await ExNonQuery(cnx, """ - CREATE TABLE payment_delivery_part_bucket ( - year INTEGER NOT NULL, - did INTEGER NOT NULL, - dpnr INTEGER NOT NULL, - bktnr INTEGER NOT NULL, - avnr INTEGER NOT NULL, - - price INTEGER NOT NULL, - amount INTEGER NOT NULL, - - CONSTRAINT pk_payment_delivery_part_bucket PRIMARY KEY (year, did, dpnr, bktnr, avnr), - CONSTRAINT fk_payment_delivery_part_bucket_delivery_part_bucket FOREIGN KEY (year, did, dpnr, bktnr) REFERENCES delivery_part_bucket (year, did, dpnr, bktnr) - ON UPDATE CASCADE - ON DELETE CASCADE, - CONSTRAINT fk_payment_delivery_part_bucket_payment_variant FOREIGN KEY (year, avnr) REFERENCES payment_variant (year, avnr) - ON UPDATE CASCADE - ON DELETE CASCADE - ) STRICT; - """); - - await ExNonQuery(cnx, "DROP TRIGGER IF EXISTS t_payment_delivery_part_i"); - await ExNonQuery(cnx, "DROP TRIGGER IF EXISTS t_payment_delivery_part_u"); - await ExNonQuery(cnx, "DROP TRIGGER IF EXISTS t_payment_delivery_part_d"); - await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part RENAME COLUMN amount TO net_amount"); - await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part ADD COLUMN amount INTEGER NOT NULL GENERATED ALWAYS AS (ROUND(net_amount * (1 + mod_rel) + mod_abs)) VIRTUAL"); - - await ExNonQuery(cnx, """ - CREATE TRIGGER t_payment_delivery_part_bucket_i - AFTER INSERT ON payment_delivery_part_bucket FOR EACH ROW - BEGIN - INSERT INTO payment_delivery_part (year, did, dpnr, avnr, net_amount) - VALUES (NEW.year, NEW.did, NEW.dpnr, NEW.avnr, NEW.amount) - ON CONFLICT DO UPDATE SET net_amount = net_amount + NEW.amount; - END; - """); - await ExNonQuery(cnx, """ - CREATE TRIGGER t_payment_delivery_part_bucket_u - AFTER UPDATE OF amount ON payment_delivery_part_bucket FOR EACH ROW - BEGIN - UPDATE payment_delivery_part - SET net_amount = net_amount - OLD.amount - WHERE (year, did, dpnr, avnr) = (NEW.year, NEW.did, NEW.dpnr, NEW.avnr); - UPDATE payment_delivery_part - SET net_amount = net_amount + NEW.amount - WHERE (year, did, dpnr, avnr) = (NEW.year, NEW.did, NEW.dpnr, NEW.avnr); - END; - """); - await ExNonQuery(cnx, """ - CREATE TRIGGER t_payment_delivery_part_bucket_d - AFTER DELETE ON payment_delivery_part_bucket FOR EACH ROW - BEGIN - UPDATE payment_delivery_part - SET net_amount = net_amount - OLD.amount - WHERE (year, did, dpnr, avnr) = (OLD.year, OLD.did, OLD.dpnr, OLD.avnr); - END; - """); - - await ExNonQuery(cnx, "ALTER TABLE payment_member RENAME COLUMN amount TO net_amount"); - await ExNonQuery(cnx, "ALTER TABLE payment_member ADD COLUMN mod_abs INTEGER NOT NULL DEFAULT 0"); - await ExNonQuery(cnx, "ALTER TABLE payment_member ADD COLUMN mod_rel REAL NOT NULL DEFAULT 0"); - await ExNonQuery(cnx, "ALTER TABLE payment_member ADD COLUMN amount INTEGER NOT NULL GENERATED ALWAYS AS (ROUND(net_amount * (1 + mod_rel) + mod_rel)) VIRTUAL"); - - await ExNonQuery(cnx, """ - CREATE TRIGGER t_payment_delivery_part_i - AFTER INSERT ON payment_delivery_part FOR EACH ROW - BEGIN - INSERT INTO payment_member (year, avnr, mgnr, net_amount) - VALUES (NEW.year, NEW.avnr, (SELECT mgnr FROM delivery WHERE (year, did) = (NEW.year, NEW.did)), NEW.amount) - ON CONFLICT DO UPDATE SET net_amount = net_amount + excluded.net_amount; - END; - """); - await ExNonQuery(cnx, """ - CREATE TRIGGER t_payment_delivery_part_u - AFTER UPDATE OF amount ON payment_delivery_part FOR EACH ROW - BEGIN - UPDATE payment_member - SET net_amount = net_amount - OLD.amount - WHERE (year, avnr, mgnr) = (NEW.year, NEW.avnr, (SELECT mgnr FROM delivery WHERE (year, did) = (NEW.year, NEW.did))); - UPDATE payment_member - SET net_amount = net_amount + NEW.amount - WHERE (year, avnr, mgnr) = (NEW.year, NEW.avnr, (SELECT mgnr FROM delivery WHERE (year, did) = (NEW.year, NEW.did))); - END; - """); - await ExNonQuery(cnx, """ - CREATE TRIGGER t_payment_delivery_part_d - AFTER DELETE ON payment_delivery_part FOR EACH ROW - BEGIN - UPDATE payment_member - SET net_amount = net_amount - OLD.amount - WHERE (year, avnr, mgnr) = (OLD.year, OLD.avnr, (SELECT mgnr FROM delivery WHERE (year, did) = (OLD.year, OLD.did))); - END; - """); - } - - private static async Task UpdateDbSchema_9_To_10(SqliteConnection cnx) { - await ExNonQuery(cnx, "UPDATE wine_quality_level SET min_kmw = 10.6 WHERE qualid = 'RSW'"); - await ExNonQuery(cnx, "DROP VIEW v_area_commitment_bucket"); - await ExNonQuery(cnx, """ - CREATE VIEW v_area_commitment_bucket AS - SELECT year, mgnr, bucket, area, min_kg, max_kg - FROM v_area_commitment_bucket_strict - WHERE attrid IS NOT NULL - UNION ALL - SELECT b.year, b.mgnr, b.sortid, - SUM(b.area) AS area, - SUM(b.min_kg) AS min_kg, - SUM(b.upper_max_kg) AS max_kg - FROM v_area_commitment_bucket_strict b - LEFT JOIN wine_attribute a ON a.attrid = b.attrid - WHERE a.strict IS NULL OR a.strict = FALSE - GROUP BY b.year, b.mgnr, b.sortid - ORDER BY year, mgnr, bucket; - """); - } - - private static async Task UpdateDbSchema_10_To_11(SqliteConnection cnx) { - // Drop columns, if they exist... - await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_1"); - await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_2"); - await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_3"); - await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_4"); - await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_5"); - await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_6"); - await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_7"); - await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_8"); - await ExNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_9"); - - await ExNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_i"); - await ExNonQuery(cnx, """ - CREATE TRIGGER t_payment_delivery_part_i - AFTER INSERT ON payment_delivery_part FOR EACH ROW - BEGIN - INSERT INTO payment_member (year, avnr, mgnr, net_amount) - SELECT year, NEW.avnr, mgnr, NEW.amount FROM delivery WHERE (year, did) = (NEW.year, NEW.did) - ON CONFLICT DO UPDATE SET net_amount = net_amount + excluded.net_amount; - END; - """); - - await ExNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_u"); - await ExNonQuery(cnx, """ - CREATE TRIGGER t_payment_delivery_part_u - AFTER UPDATE ON payment_delivery_part FOR EACH ROW - BEGIN - UPDATE payment_member - SET net_amount = net_amount - OLD.amount - WHERE (year, avnr, mgnr) IN (SELECT year, OLD.avnr, mgnr FROM delivery WHERE (year, did) = (OLD.year, OLD.did)); - INSERT INTO payment_member (year, avnr, mgnr, net_amount) - SELECT year, NEW.avnr, mgnr, NEW.amount FROM delivery WHERE (year, did) = (NEW.year, NEW.did) - ON CONFLICT DO UPDATE SET net_amount = net_amount + excluded.net_amount; - END; - """); - - await ExNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_d"); - await ExNonQuery(cnx, """ - CREATE TRIGGER t_payment_delivery_part_d - AFTER DELETE ON payment_delivery_part FOR EACH ROW - BEGIN - UPDATE payment_member - SET net_amount = net_amount - OLD.amount - WHERE (year, avnr, mgnr) IN (SELECT year, OLD.avnr, mgnr FROM delivery WHERE (year, did) = (OLD.year, OLD.did)); - END; - """); - - await ExNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_bucket_u"); - await ExNonQuery(cnx, """ - CREATE TRIGGER t_payment_delivery_part_bucket_u - AFTER UPDATE ON payment_delivery_part_bucket FOR EACH ROW - BEGIN - UPDATE payment_delivery_part - SET net_amount = net_amount - OLD.amount - WHERE (year, did, dpnr, avnr) = (OLD.year, OLD.did, OLD.dpnr, OLD.avnr); - UPDATE payment_delivery_part - SET net_amount = net_amount + NEW.amount - WHERE (year, did, dpnr, avnr) = (NEW.year, NEW.did, NEW.dpnr, NEW.avnr); - END; - """); - - await ExNonQuery(cnx, "ALTER TABLE payment_member DROP COLUMN amount"); - await ExNonQuery(cnx, "ALTER TABLE payment_member ADD COLUMN amount INTEGER NOT NULL GENERATED ALWAYS AS (ROUND(net_amount * (1 + mod_rel) + mod_abs)) VIRTUAL"); - } - - private static async Task UpdateDbSchema_11_To_12(SqliteConnection cnx) { - await ExNonQuery(cnx, """ - CREATE VIEW v_stat_member AS - SELECT year, mgnr, - SUM(weight) AS sum, - ROUND(SUM(kmw * weight) / SUM(weight), 2) AS kmw, - ROUND(SUM(oe * weight) / SUM(weight), 1) AS oe, - COUNT(DISTINCT did) AS lieferungen - FROM v_delivery - GROUP BY year, mgnr - ORDER BY year, mgnr; + foreach (var script in toExecute) { + using var stream = asm.GetManifestResourceStream(script) ?? throw new Exception("Unable to load embedded resource"); + using var reader = new StreamReader(stream); + await ExNonQuery(cnx, await reader.ReadToEndAsync()); + } + await ExNonQuery(cnx, $""" + PRAGMA foreign_key_check; + COMMIT; + PRAGMA foreign_keys = ON; + VACUUM; + PRAGMA schema_version = {toVersion * 100 + VersionOffset}; """); } } diff --git a/Elwig/Resources/Sql/01-02.sql b/Elwig/Resources/Sql/01-02.sql new file mode 100644 index 0000000..e8f9bb7 --- /dev/null +++ b/Elwig/Resources/Sql/01-02.sql @@ -0,0 +1,7 @@ +-- schema version 1 to 2 + +DROP VIEW v_area_commitment; + +ALTER TABLE delivery_part DROP COLUMN weighing_reason; + +ALTER TABLE delivery_part ADD COLUMN weighing_reason TEXT CHECK(NOT (manual_weighing = FALSE AND weighing_reason IS NOT NULL)); diff --git a/Elwig/Resources/Sql/02-03.sql b/Elwig/Resources/Sql/02-03.sql new file mode 100644 index 0000000..a03faa9 --- /dev/null +++ b/Elwig/Resources/Sql/02-03.sql @@ -0,0 +1,96 @@ +-- schema version 2 to 3 + +CREATE TABLE delivery_part_bin ( + year INTEGER NOT NULL, + did INTEGER NOT NULL, + dpnr INTEGER NOT NULL, + binnr INTEGER NOT NULL, + + discr TEXT NOT NULL, + value INTEGER NOT NULL, + + CONSTRAINT pk_delivery_part_bin PRIMARY KEY (year, did, dpnr, binnr), + CONSTRAINT fk_delivery_part_bin_delivery_part FOREIGN KEY (year, did, dpnr) REFERENCES delivery_part (year, did, dpnr) + ON UPDATE CASCADE + ON DELETE CASCADE +) STRICT; + +INSERT INTO delivery_part_bin (year, did, dpnr, binnr, discr, value) +SELECT year, did, dpnr, 0, '_', bucket_2 + bucket_3 +FROM payment_delivery_part +WHERE COALESCE(bucket_1, bucket_2, bucket_3, bucket_4, bucket_5, bucket_6, bucket_7, bucket_8, bucket_9) IS NOT NULL +ON CONFLICT DO NOTHING; + +INSERT INTO delivery_part_bin (year, did, dpnr, binnr, discr, value) +SELECT d.year, d.did, d.dpnr, 1, COALESCE(attributes, ''), bucket_1 +FROM payment_delivery_part p + JOIN v_delivery d ON (d.year, d.did, d.dpnr) = (p.year, p.did, p.dpnr) +WHERE COALESCE(bucket_1, bucket_2, bucket_3, bucket_4, bucket_5, bucket_6, bucket_7, bucket_8, bucket_9) IS NOT NULL +ON CONFLICT DO NOTHING; + +ALTER TABLE payment_delivery_part DROP COLUMN bucket_1; +ALTER TABLE payment_delivery_part DROP COLUMN bucket_2; +ALTER TABLE payment_delivery_part DROP COLUMN bucket_3; +ALTER TABLE payment_delivery_part DROP COLUMN bucket_4; +ALTER TABLE payment_delivery_part DROP COLUMN bucket_5; +ALTER TABLE payment_delivery_part DROP COLUMN bucket_6; +ALTER TABLE payment_delivery_part DROP COLUMN bucket_7; +ALTER TABLE payment_delivery_part DROP COLUMN bucket_8; +ALTER TABLE payment_delivery_part DROP COLUMN bucket_9; +ALTER TABLE payment_variant DROP COLUMN bucket_1_name; +ALTER TABLE payment_variant DROP COLUMN bucket_2_name; +ALTER TABLE payment_variant DROP COLUMN bucket_3_name; +ALTER TABLE payment_variant DROP COLUMN bucket_4_name; +ALTER TABLE payment_variant DROP COLUMN bucket_5_name; +ALTER TABLE payment_variant DROP COLUMN bucket_6_name; +ALTER TABLE payment_variant DROP COLUMN bucket_7_name; +ALTER TABLE payment_variant DROP COLUMN bucket_8_name; +ALTER TABLE payment_variant DROP COLUMN bucket_9_name; + +ALTER TABLE delivery_part ADD COLUMN gebunden INTEGER CHECK (gebunden IN (TRUE, FALSE)) DEFAULT NULL; + +DROP VIEW v_delivery; +CREATE VIEW v_delivery AS +SELECT s.*, GROUP_CONCAT(o.modid) AS modifiers +FROM (SELECT p.year, p.did, p.dpnr, + d.date, d.time, d.zwstid, d.lnr, d.lsnr, + m.mgnr, m.family_name, m.given_name, + p.sortid, p.weight, p.kmw, ROUND(p.kmw * (4.54 + 0.022 * p.kmw), 0) AS oe, p.qualid, p.hkid, p.kgnr, p.rdnr, + p.gerebelt, p.gebunden, + p.qualid IN (SELECT l.qualid FROM wine_quality_level l WHERE NOT l.predicate AND (p.kmw >= l.min_kmw OR l.min_kmw IS NULL) ORDER BY l.min_kmw DESC LIMIT 1,100) AS abgewertet, + p.qualid NOT IN ('WEI', 'RSW', 'LDW') AS min_quw, + GROUP_CONCAT(a.attrid) AS attributes, + COALESCE(SUM(a.fill_lower_bins), 0) AS attribute_prio, + d.comment, p.comment AS part_comment + FROM delivery_part p + JOIN delivery d ON (d.year, d.did) = (p.year, p.did) + JOIN member m ON m.mgnr = d.mgnr + LEFT JOIN delivery_part_attribute pa ON (pa.year, pa.did, pa.dpnr) = (p.year, p.did, p.dpnr) + LEFT JOIN wine_attribute a ON a.attrid = pa.attrid + GROUP BY p.year, p.did, p.dpnr + ORDER BY p.year, p.did, p.dpnr, a.attrid) s +LEFT JOIN delivery_part_modifier o ON (o.year, o.did, o.dpnr) = (s.year, s.did, s.dpnr) +GROUP BY s.year, s.lsnr, s.dpnr +ORDER BY s.year, s.lsnr, s.dpnr, o.modid; + +DROP VIEW v_bucket; + +CREATE VIEW v_delivery_bin AS +SELECT year, mgnr, + sortid || IIF(min_quw, REPLACE(COALESCE(attributes, ''), ',', ''), '_') AS bin, + SUM(weight) AS weight +FROM v_delivery +GROUP BY year, mgnr, bin +ORDER BY year, mgnr, LENGTH(bin) DESC, bin; + +CREATE VIEW v_payment_bin AS +SELECT d.year, d.mgnr, + sortid || discr AS bin, + SUM(value) AS weight +FROM v_delivery d + JOIN delivery_part_bin b ON (b.year, b.did, b.dpnr) = (d.year, d.did, d.dpnr) +GROUP BY d.year, d.mgnr, bin +HAVING SUM(value) > 0 +ORDER BY d.year, d.mgnr, bin; + +ALTER TABLE wine_attribute ADD COLUMN fill_lower_bins INTEGER NOT NULL CHECK (fill_lower_bins IN (0, 1, 2)) DEFAULT 0; diff --git a/Elwig/Resources/Sql/03-04.sql b/Elwig/Resources/Sql/03-04.sql new file mode 100644 index 0000000..cc9fdd0 --- /dev/null +++ b/Elwig/Resources/Sql/03-04.sql @@ -0,0 +1,24 @@ +-- schema version 3 to 4 + +DROP VIEW v_payment_bin; +CREATE VIEW v_payment_bin AS +SELECT d.year, d.mgnr, + sortid || discr AS bin, + SUM(value) AS weight +FROM v_delivery d + JOIN delivery_part_bin b ON (b.year, b.did, b.dpnr) = (d.year, d.did, d.dpnr) +GROUP BY d.year, d.mgnr, bin +HAVING SUM(value) > 0 +ORDER BY d.year, d.mgnr, LENGTH(bin) DESC, bin; + +CREATE VIEW v_area_commitment_bin AS +SELECT s.year, c.mgnr, + c.vtrgid AS bin, + CAST(ROUND(SUM(COALESCE(area * min_kg_per_ha, 0)) / 10000.0, 0) AS INTEGER) AS min_kg, + CAST(ROUND(SUM(COALESCE(area * max_kg_per_ha, 0)) / 10000.0, 0) AS INTEGER) AS max_kg +FROM area_commitment c, season s + JOIN area_commitment_type t ON t.vtrgid = c.vtrgid +WHERE (year_from IS NULL OR year_from <= s.year) AND + (year_to IS NULL OR year_to >= s.year) +GROUP BY s.year, c.mgnr, c.vtrgid +ORDER BY s.year, c.mgnr, LENGTH(c.vtrgid) DESC, c.vtrgid; diff --git a/Elwig/Resources/Sql/04-05.sql b/Elwig/Resources/Sql/04-05.sql new file mode 100644 index 0000000..6762f43 --- /dev/null +++ b/Elwig/Resources/Sql/04-05.sql @@ -0,0 +1,100 @@ +-- schema version 4 to 5 + +CREATE TABLE _area_commitment_type ( + vtrgid TEXT NOT NULL CHECK (vtrgid = sortid || COALESCE(attrid, '') || disc), + sortid TEXT NOT NULL, + attrid TEXT, + disc TEXT DEFAULT NULL CHECK (disc REGEXP '^[A-Z0-9]+$'), + + min_kg_per_ha INTEGER, + max_kg_per_ha INTEGER, + penalty_amount INTEGER, + + CONSTRAINT pk_area_commitment_type PRIMARY KEY (vtrgid), + CONSTRAINT sk_area_commitment_type_sort_attr UNIQUE (sortid, attrid, disc), + CONSTRAINT fk_area_commitment_type_wine_variety FOREIGN KEY (sortid) REFERENCES wine_variety (sortid) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT fk_area_commitment_type_wine_attribute FOREIGN KEY (attrid) REFERENCES wine_attribute (attrid) + ON UPDATE CASCADE + ON DELETE RESTRICT +) STRICT; + +INSERT INTO _area_commitment_type (vtrgid, sortid, attrid, disc, min_kg_per_ha, max_kg_per_ha, penalty_amount) +SELECT vtrgid, sortid, attrid_1, disc, min_kg_per_ha, max_kg_per_ha, penalty_amount FROM area_commitment_type; + +PRAGMA writable_schema = ON; +DROP TABLE area_commitment_type; +ALTER TABLE _area_commitment_type RENAME TO area_commitment_type; +PRAGMA writable_schema = OFF; + +ALTER TABLE delivery_part ADD COLUMN attrid TEXT DEFAULT NULL REFERENCES wine_attribute (attrid) + ON UPDATE CASCADE + ON DELETE RESTRICT; + +UPDATE delivery_part +SET attrid = (SELECT attrid + FROM delivery_part_attribute a + WHERE (delivery_part.year, delivery_part.did, delivery_part.dpnr) = (a.year, a.did, a.dpnr) + ORDER BY attrid DESC + LIMIT 1); + +DROP TRIGGER t_delivery_part_attribute_i_mtime_delivery_part; +DROP TRIGGER t_delivery_part_attribute_u_mtime_delivery_part; +DROP TRIGGER t_delivery_part_attribute_d_mtime_delivery_part; +DROP TABLE delivery_part_attribute; + +DROP VIEW v_delivery; +CREATE VIEW v_delivery AS +SELECT p.year, p.did, p.dpnr, + d.date, d.time, d.zwstid, d.lnr, d.lsnr, + m.mgnr, m.family_name, m.given_name, + p.sortid, a.attrid, + p.weight, p.kmw, ROUND(p.kmw * (4.54 + 0.022 * p.kmw), 0) AS oe, p.qualid, + p.hkid, p.kgnr, p.rdnr, + p.gerebelt, p.gebunden, + p.qualid IN (SELECT l.qualid FROM wine_quality_level l WHERE NOT l.predicate AND (p.kmw >= l.min_kmw OR l.min_kmw IS NULL) ORDER BY l.min_kmw DESC LIMIT 1,100) AS abgewertet, + p.qualid NOT IN ('WEI', 'RSW', 'LDW') AS min_quw, + COALESCE(a.fill_lower_bins, 0) AS attribute_prio, + GROUP_CONCAT(o.modid) AS modifiers, + d.comment, p.comment AS part_comment +FROM delivery_part p + JOIN delivery d ON (d.year, d.did) = (p.year, p.did) + JOIN member m ON m.mgnr = d.mgnr + LEFT JOIN wine_attribute a ON a.attrid = p.attrid + LEFT JOIN delivery_part_modifier o ON (o.year, o.did, o.dpnr) = (p.year, p.did, p.dpnr) +GROUP BY p.year, p.did, p.dpnr +ORDER BY p.year, p.did, p.dpnr, o.modid; + +DROP VIEW v_delivery_bin; +CREATE VIEW v_delivery_bin AS +SELECT year, mgnr, + sortid || IIF(min_quw, COALESCE(attrid, ''), '_') AS bin, + SUM(weight) AS weight +FROM v_delivery +GROUP BY year, mgnr, bin +ORDER BY year, mgnr, LENGTH(bin) DESC, bin; + +DROP VIEW v_stat_attr; +CREATE VIEW v_stat_attr AS +SELECT year, attrid, + SUM(weight) as sum, + ROUND(SUM(kmw * weight) / SUM(weight), 2) AS kmw, + ROUND(SUM(oe * weight) / SUM(weight), 1) AS oe, + COUNT(DISTINCT did) AS lieferungen, + COUNT(DISTINCT mgnr) AS mitglieder +FROM v_delivery +GROUP BY year, attrid +ORDER BY year, attrid; + +DROP VIEW v_stat_sort_attr; +CREATE VIEW v_stat_sort_attr AS +SELECT year, sortid, attrid, + SUM(weight) as sum, + ROUND(SUM(kmw * weight) / SUM(weight), 2) AS kmw, + ROUND(SUM(oe * weight) / SUM(weight), 1) AS oe, + COUNT(DISTINCT did) AS lieferungen, + COUNT(DISTINCT mgnr) AS mitglieder +FROM v_delivery +GROUP BY year, sortid, attrid +ORDER BY year, sortid, attrid; diff --git a/Elwig/Resources/Sql/05-06.sql b/Elwig/Resources/Sql/05-06.sql new file mode 100644 index 0000000..c2b4a90 --- /dev/null +++ b/Elwig/Resources/Sql/05-06.sql @@ -0,0 +1,150 @@ +-- schema version 5 to 6 + +DROP VIEW IF EXISTS v_area_commitment; + +PRAGMA writable_schema = ON; +ALTER TABLE wine_attribute DROP COLUMN fill_lower_bins; +ALTER TABLE wine_attribute ADD COLUMN strict INTEGER NOT NULL CHECK (strict IN (TRUE, FALSE)) DEFAULT FALSE; +ALTER TABLE wine_attribute ADD COLUMN fill_lower INTEGER NOT NULL CHECK (fill_lower IN (0, 1, 2)) DEFAULT 0; +DROP VIEW v_delivery; +CREATE VIEW v_delivery AS +SELECT p.year, p.did, p.dpnr, + d.date, d.time, d.zwstid, d.lnr, d.lsnr, + m.mgnr, m.family_name, m.given_name, + p.sortid, a.attrid, + p.weight, p.kmw, ROUND(p.kmw * (4.54 + 0.022 * p.kmw), 0) AS oe, p.qualid, + p.hkid, p.kgnr, p.rdnr, + p.gerebelt, p.gebunden, + p.qualid IN (SELECT l.qualid FROM wine_quality_level l WHERE NOT l.predicate AND (p.kmw >= l.min_kmw OR l.min_kmw IS NULL) ORDER BY l.min_kmw DESC LIMIT 1,100) AS abgewertet, + p.qualid NOT IN ('WEI', 'RSW', 'LDW') AS min_quw, + IIF(a.strict, COALESCE(a.fill_lower, 0), 0) AS attribute_prio, + GROUP_CONCAT(o.modid) AS modifiers, + d.comment, p.comment AS part_comment +FROM delivery_part p + JOIN delivery d ON (d.year, d.did) = (p.year, p.did) + JOIN member m ON m.mgnr = d.mgnr + LEFT JOIN wine_attribute a ON a.attrid = p.attrid + LEFT JOIN delivery_part_modifier o ON (o.year, o.did, o.dpnr) = (p.year, p.did, p.dpnr) +GROUP BY p.year, p.did, p.dpnr +ORDER BY p.year, p.did, p.dpnr, o.modid; +PRAGMA writable_schema = OFF; + +DROP VIEW v_area_commitment_bin; +DROP VIEW v_delivery_bin; +DROP VIEW v_payment_bin; + +ALTER TABLE area_commitment_type DROP COLUMN max_kg_per_ha; +ALTER TABLE area_commitment_type ADD COLUMN penalty_per_kg INTEGER DEFAULT NULL; +ALTER TABLE area_commitment_type ADD COLUMN penalty_none INTEGER DEFAULT NULL; + +ALTER TABLE wine_cultivation ADD COLUMN description TEXT DEFAULT NULL; +ALTER TABLE member ADD COLUMN organic INTEGER NOT NULL CHECK (organic IN (TRUE, FALSE)) DEFAULT FALSE; + +ALTER TABLE season ADD COLUMN max_kg_per_ha INTEGER NOT NULL DEFAULT 10000; +ALTER TABLE season ADD COLUMN vat_normal REAL NOT NULL DEFAULT 0.10; +ALTER TABLE season ADD COLUMN vat_flatrate REAL NOT NULL DEFAULT 0.13; +ALTER TABLE season ADD COLUMN min_kg_per_bs INTEGER NOT NULL DEFAULT 750; +ALTER TABLE season ADD COLUMN max_kg_per_bs INTEGER NOT NULL DEFAULT 3000; +ALTER TABLE season ADD COLUMN penalty_per_kg INTEGER DEFAULT NULL; +ALTER TABLE season ADD COLUMN penalty_amount INTEGER DEFAULT NULL; +ALTER TABLE season ADD COLUMN penalty_none INTEGER DEFAULT NULL; + +DELETE FROM client_parameter WHERE param IN ('DELIVERY_RIGHT', 'DELIVERY_OBLIGATION', 'VAT_NORMAL', 'VAT_REDUCED', 'VAT_FLATRATE'); + +CREATE TABLE delivery_part_bucket ( + year INTEGER NOT NULL, + did INTEGER NOT NULL, + dpnr INTEGER NOT NULL, + bktnr INTEGER NOT NULL, + + discr TEXT NOT NULL, + value INTEGER NOT NULL, + + CONSTRAINT pk_delivery_part_bucket PRIMARY KEY (year, did, dpnr, bktnr), + CONSTRAINT fk_delivery_part_bucket_delivery_part FOREIGN KEY (year, did, dpnr) REFERENCES delivery_part (year, did, dpnr) + ON UPDATE CASCADE + ON DELETE CASCADE +) STRICT; + +INSERT INTO delivery_part_bucket (year, did, dpnr, bktnr, discr, value) +SELECT year, did, dpnr, binnr, discr, value +FROM delivery_part_bin; + +DROP TABLE delivery_part_bin; + +CREATE VIEW v_area_commitment_bucket_strict AS +SELECT s.year, c.mgnr, + t.sortid || COALESCE(a.attrid, '') AS bucket, + t.sortid, a.attrid, + CAST(ROUND(SUM(area) * COALESCE(t.min_kg_per_ha, 0) / 10000.0, 0) AS INTEGER) AS min_kg, + CAST(ROUND(SUM(area) * MIN(COALESCE(a.max_kg_per_ha, s.max_kg_per_ha), s.max_kg_per_ha) / 10000.0, 0) AS INTEGER) AS max_kg, + CAST(ROUND(SUM(area) * s.max_kg_per_ha / 10000.0, 0) AS INTEGER) AS upper_max_kg +FROM season s, area_commitment c + JOIN area_commitment_type t ON t.vtrgid = c.vtrgid + LEFT JOIN wine_attribute a ON a.attrid = t.attrid +WHERE (year_from IS NULL OR year_from <= s.year) AND + (year_to IS NULL OR year_to >= s.year) +GROUP BY s.year, c.mgnr, bucket +ORDER BY s.year, c.mgnr, bucket; + +CREATE VIEW v_area_commitment_bucket AS +SELECT year, mgnr, bucket, min_kg, max_kg +FROM v_area_commitment_bucket_strict +WHERE attrid IS NOT NULL +UNION ALL +SELECT b.year, b.mgnr, b.sortid, + SUM(b.min_kg) AS min_kg, + SUM(b.upper_max_kg) AS max_kg +FROM v_area_commitment_bucket_strict b + LEFT JOIN wine_attribute a ON a.attrid = b.attrid +WHERE a.strict IS NULL OR a.strict = FALSE +GROUP BY b.year, b.mgnr, b.sortid +ORDER BY year, mgnr, bucket; + +CREATE VIEW v_delivery_bucket_strict AS +SELECT year, mgnr, + sortid || IIF(min_quw, COALESCE(attrid, ''), '_') AS bucket, + sortid, IIF(min_quw, attrid, NULL) AS attrid, + SUM(weight) AS weight, + min_quw +FROM v_delivery +GROUP BY year, mgnr, bucket +ORDER BY year, mgnr, bucket; + +CREATE VIEW v_delivery_bucket AS +SELECT year, mgnr, bucket, weight +FROM v_delivery_bucket_strict +WHERE attrid IS NOT NULL OR NOT min_quw +UNION ALL +SELECT b.year, b.mgnr, b.sortid, + SUM(b.weight) AS weight +FROM v_delivery_bucket_strict b + LEFT JOIN wine_attribute a ON a.attrid = b.attrid +WHERE min_quw AND (a.strict IS NULL OR a.strict = FALSE) +GROUP BY b.year, b.mgnr, b.sortid +ORDER BY year, mgnr, bucket; + +CREATE VIEW v_payment_bucket_strict AS +SELECT d.year, d.mgnr, + d.sortid || b.discr AS bucket, + d.sortid, IIF(b.discr IN ('', '_'), NULL, b.discr) AS attrid, + SUM(b.value) AS weight, + b.discr != '_' AS gebunden +FROM v_delivery d + LEFT JOIN delivery_part_bucket b ON (b.year, b.did, b.dpnr) = (d.year, d.did, d.dpnr) +GROUP BY d.year, d.mgnr, bucket +HAVING SUM(b.value) > 0 +ORDER BY d.year, d.mgnr, bucket; + +CREATE VIEW v_payment_bucket AS +SELECT year, mgnr, bucket, weight +FROM v_payment_bucket_strict +WHERE attrid IS NOT NULL OR NOT gebunden +UNION ALL +SELECT b.year, b.mgnr, b.sortid, + SUM(b.weight) AS weight +FROM v_payment_bucket_strict b + LEFT JOIN wine_attribute a ON a.attrid = b.attrid +WHERE gebunden AND (a.strict IS NULL OR a.strict = FALSE) +GROUP BY b.year, b.mgnr, b.sortid +ORDER BY year, mgnr, bucket; diff --git a/Elwig/Resources/Sql/06-07.sql b/Elwig/Resources/Sql/06-07.sql new file mode 100644 index 0000000..ea4f1ae --- /dev/null +++ b/Elwig/Resources/Sql/06-07.sql @@ -0,0 +1,40 @@ +-- schema version 6 to 7 + +DROP VIEW v_area_commitment_bucket_strict; +CREATE VIEW v_area_commitment_bucket_strict AS +SELECT s.year, c.mgnr, + t.sortid || COALESCE(a.attrid, '') AS bucket, + t.sortid, a.attrid, + SUM(area) AS area, + CAST(ROUND(SUM(area) * COALESCE(t.min_kg_per_ha, 0) / 10000.0, 0) AS INTEGER) AS min_kg, + CAST(ROUND(SUM(area) * MIN(COALESCE(a.max_kg_per_ha, s.max_kg_per_ha), s.max_kg_per_ha) / 10000.0, 0) AS INTEGER) AS max_kg, + CAST(ROUND(SUM(area) * s.max_kg_per_ha / 10000.0, 0) AS INTEGER) AS upper_max_kg +FROM season s, area_commitment c + JOIN area_commitment_type t ON t.vtrgid = c.vtrgid + LEFT JOIN wine_attribute a ON a.attrid = t.attrid +WHERE (year_from IS NULL OR year_from <= s.year) AND + (year_to IS NULL OR year_to >= s.year) +GROUP BY s.year, c.mgnr, bucket +ORDER BY s.year, c.mgnr, bucket; + +CREATE VIEW v_under_delivery_bucket_strict AS +SELECT c.year, c.mgnr, c.bucket, c.min_kg, COALESCE(p.weight, 0) AS weight +FROM v_area_commitment_bucket_strict c + LEFT JOIN v_payment_bucket_strict p ON (p.year, p.mgnr, p.bucket) = (c.year, c.mgnr, c.bucket) +ORDER BY c.year, c.mgnr, c.bucket; + +CREATE VIEW v_under_delivery_bucket AS +SELECT u.year, u.mgnr, u.bucket, u.min_kg, + u.weight + SUM(MAX(COALESCE(p.weight - s.min_kg, 0), 0)) AS weight +FROM v_under_delivery_bucket_strict u + LEFT JOIN v_payment_bucket_strict p ON (p.year, p.mgnr, p.sortid) = (u.year, u.mgnr, u.bucket) AND p.attrid IS NOT NULL + LEFT JOIN wine_attribute a ON a.attrid = p.attrid + LEFT JOIN v_area_commitment_bucket_strict s ON (s.year, s.mgnr, s.bucket) = (p.year, p.mgnr, p.bucket) +WHERE (p.gebunden IS NULL OR p.gebunden) AND (a.strict IS NULL OR a.strict = FALSE) +GROUP BY u.year, u.mgnr, u.bucket +ORDER BY u.year, u.mgnr, u.bucket; + +CREATE VIEW v_under_delivery AS +SELECT year, mgnr, bucket, min_kg, weight, weight - min_kg AS diff +FROM v_under_delivery_bucket +WHERE diff < 0; diff --git a/Elwig/Resources/Sql/07-08.sql b/Elwig/Resources/Sql/07-08.sql new file mode 100644 index 0000000..3002974 --- /dev/null +++ b/Elwig/Resources/Sql/07-08.sql @@ -0,0 +1,63 @@ +-- schema version 7 to 8 + +INSERT INTO wb_gem +SELECT a.gkz, 'WLNO' +FROM AT_gem a + LEFT JOIN wb_gem w ON w.gkz = a.gkz +WHERE a.gkz / 10000 = 3 AND w.hkid IS NULL; + +INSERT INTO wb_gem +SELECT gkz, 'SLVL' +FROM AT_gem +WHERE gkz / 100 IN (617, 622, 623); + +INSERT INTO wb_gem +SELECT gkz, 'SLSS' +FROM AT_gem +WHERE gkz / 100 = 610; + +UPDATE wb_gem +SET hkid = 'SLVL' +WHERE gkz IN (61007, 61052, 61001, 61055, 61027, 61057, 61008, 61057); + +INSERT INTO wb_gem +SELECT gkz, 'SLWS' +FROM AT_gem +WHERE gkz / 100 IN (603, 616) OR gkz IN (60101, 60663, 60651, 60659, 60664, 60647, 60641, 60639, 60665, 60669, 60618, 60629, 60608, 60670, 60624, 60660, 60656, 60655); + +INSERT INTO wb_gem +SELECT g.gkz, 'SLVL' +FROM AT_gem g + LEFT JOIN wb_gem w ON w.gkz = g.gkz +WHERE g.gkz / 100 = 606 AND w.hkid IS NULL; + +INSERT INTO wb_gem +SELECT g.gkz, 'SLST' +FROM AT_gem g + LEFT JOIN wb_gem w ON w.gkz = g.gkz +WHERE g.gkz / 10000 = 6 AND w.hkid IS NULL; + +INSERT INTO wb_gem +SELECT gkz, 'BLOO' +FROM AT_gem +WHERE gkz / 10000 = 4; + +INSERT INTO wb_gem +SELECT gkz, 'BLKA' +FROM AT_gem +WHERE gkz / 10000 = 2; + +INSERT INTO wb_gem +SELECT gkz, 'BLSB' +FROM AT_gem +WHERE gkz / 10000 = 5; + +INSERT INTO wb_gem +SELECT gkz, 'BLTI' +FROM AT_gem +WHERE gkz / 10000 = 7; + +INSERT INTO wb_gem +SELECT gkz, 'BLVO' +FROM AT_gem +WHERE gkz / 10000 = 8; diff --git a/Elwig/Resources/Sql/08-09.sql b/Elwig/Resources/Sql/08-09.sql new file mode 100644 index 0000000..50e58d7 --- /dev/null +++ b/Elwig/Resources/Sql/08-09.sql @@ -0,0 +1,85 @@ +-- schema version 8 to 9 + +CREATE TABLE payment_delivery_part_bucket ( + year INTEGER NOT NULL, + did INTEGER NOT NULL, + dpnr INTEGER NOT NULL, + bktnr INTEGER NOT NULL, + avnr INTEGER NOT NULL, + + price INTEGER NOT NULL, + amount INTEGER NOT NULL, + + CONSTRAINT pk_payment_delivery_part_bucket PRIMARY KEY (year, did, dpnr, bktnr, avnr), + CONSTRAINT fk_payment_delivery_part_bucket_delivery_part_bucket FOREIGN KEY (year, did, dpnr, bktnr) REFERENCES delivery_part_bucket (year, did, dpnr, bktnr) + ON UPDATE CASCADE + ON DELETE CASCADE, + CONSTRAINT fk_payment_delivery_part_bucket_payment_variant FOREIGN KEY (year, avnr) REFERENCES payment_variant (year, avnr) + ON UPDATE CASCADE + ON DELETE CASCADE +) STRICT; + +DROP TRIGGER IF EXISTS t_payment_delivery_part_i; +DROP TRIGGER IF EXISTS t_payment_delivery_part_u; +DROP TRIGGER IF EXISTS t_payment_delivery_part_d; +ALTER TABLE payment_delivery_part RENAME COLUMN amount TO net_amount; +ALTER TABLE payment_delivery_part ADD COLUMN amount INTEGER NOT NULL GENERATED ALWAYS AS (ROUND(net_amount * (1 + mod_rel) + mod_abs)) VIRTUAL; + +CREATE TRIGGER t_payment_delivery_part_bucket_i + AFTER INSERT ON payment_delivery_part_bucket FOR EACH ROW +BEGIN + INSERT INTO payment_delivery_part (year, did, dpnr, avnr, net_amount) + VALUES (NEW.year, NEW.did, NEW.dpnr, NEW.avnr, NEW.amount) + ON CONFLICT DO UPDATE SET net_amount = net_amount + NEW.amount; +END; + +CREATE TRIGGER t_payment_delivery_part_bucket_u + AFTER UPDATE OF amount ON payment_delivery_part_bucket FOR EACH ROW +BEGIN + UPDATE payment_delivery_part + SET net_amount = net_amount - OLD.amount + WHERE (year, did, dpnr, avnr) = (NEW.year, NEW.did, NEW.dpnr, NEW.avnr); + UPDATE payment_delivery_part + SET net_amount = net_amount + NEW.amount + WHERE (year, did, dpnr, avnr) = (NEW.year, NEW.did, NEW.dpnr, NEW.avnr); +END; + +CREATE TRIGGER t_payment_delivery_part_bucket_d + AFTER DELETE ON payment_delivery_part_bucket FOR EACH ROW +BEGIN + UPDATE payment_delivery_part + SET net_amount = net_amount - OLD.amount + WHERE (year, did, dpnr, avnr) = (OLD.year, OLD.did, OLD.dpnr, OLD.avnr); +END; + +ALTER TABLE payment_member RENAME COLUMN amount TO net_amount; +ALTER TABLE payment_member ADD COLUMN mod_abs INTEGER NOT NULL DEFAULT 0; +ALTER TABLE payment_member ADD COLUMN mod_rel REAL NOT NULL DEFAULT 0; +ALTER TABLE payment_member ADD COLUMN amount INTEGER NOT NULL GENERATED ALWAYS AS (ROUND(net_amount * (1 + mod_rel) + mod_rel)) VIRTUAL; + +CREATE TRIGGER t_payment_delivery_part_i + AFTER INSERT ON payment_delivery_part FOR EACH ROW +BEGIN + INSERT INTO payment_member (year, avnr, mgnr, net_amount) + VALUES (NEW.year, NEW.avnr, (SELECT mgnr FROM delivery WHERE (year, did) = (NEW.year, NEW.did)), NEW.amount) + ON CONFLICT DO UPDATE SET net_amount = net_amount + excluded.net_amount; +END; + +CREATE TRIGGER t_payment_delivery_part_u + AFTER UPDATE OF amount ON payment_delivery_part FOR EACH ROW +BEGIN + UPDATE payment_member + SET net_amount = net_amount - OLD.amount + WHERE (year, avnr, mgnr) = (NEW.year, NEW.avnr, (SELECT mgnr FROM delivery WHERE (year, did) = (NEW.year, NEW.did))); + UPDATE payment_member + SET net_amount = net_amount + NEW.amount + WHERE (year, avnr, mgnr) = (NEW.year, NEW.avnr, (SELECT mgnr FROM delivery WHERE (year, did) = (NEW.year, NEW.did))); +END; + +CREATE TRIGGER t_payment_delivery_part_d + AFTER DELETE ON payment_delivery_part FOR EACH ROW +BEGIN + UPDATE payment_member + SET net_amount = net_amount - OLD.amount + WHERE (year, avnr, mgnr) = (OLD.year, OLD.avnr, (SELECT mgnr FROM delivery WHERE (year, did) = (OLD.year, OLD.did))); +END; diff --git a/Elwig/Resources/Sql/09-10.sql b/Elwig/Resources/Sql/09-10.sql new file mode 100644 index 0000000..619ab9f --- /dev/null +++ b/Elwig/Resources/Sql/09-10.sql @@ -0,0 +1,19 @@ +-- schema version 9 to 10 + +UPDATE wine_quality_level SET min_kmw = 10.6 WHERE qualid = 'RSW'; + +DROP VIEW v_area_commitment_bucket; +CREATE VIEW v_area_commitment_bucket AS +SELECT year, mgnr, bucket, area, min_kg, max_kg +FROM v_area_commitment_bucket_strict +WHERE attrid IS NOT NULL +UNION ALL +SELECT b.year, b.mgnr, b.sortid, + SUM(b.area) AS area, + SUM(b.min_kg) AS min_kg, + SUM(b.upper_max_kg) AS max_kg +FROM v_area_commitment_bucket_strict b + LEFT JOIN wine_attribute a ON a.attrid = b.attrid +WHERE a.strict IS NULL OR a.strict = FALSE +GROUP BY b.year, b.mgnr, b.sortid +ORDER BY year, mgnr, bucket; diff --git a/Elwig/Resources/Sql/10-11.sql b/Elwig/Resources/Sql/10-11.sql new file mode 100644 index 0000000..dfdc057 --- /dev/null +++ b/Elwig/Resources/Sql/10-11.sql @@ -0,0 +1,57 @@ +-- schema version 10 to 11 + +-- Drop columns, if they exist... +ALTER TABLE payment_delivery_part DROP COLUMN price_1; +ALTER TABLE payment_delivery_part DROP COLUMN price_2; +ALTER TABLE payment_delivery_part DROP COLUMN price_3; +ALTER TABLE payment_delivery_part DROP COLUMN price_4; +ALTER TABLE payment_delivery_part DROP COLUMN price_5; +ALTER TABLE payment_delivery_part DROP COLUMN price_6; +ALTER TABLE payment_delivery_part DROP COLUMN price_7; +ALTER TABLE payment_delivery_part DROP COLUMN price_8; +ALTER TABLE payment_delivery_part DROP COLUMN price_9; + +DROP TRIGGER t_payment_delivery_part_i; +CREATE TRIGGER t_payment_delivery_part_i + AFTER INSERT ON payment_delivery_part FOR EACH ROW +BEGIN + INSERT INTO payment_member (year, avnr, mgnr, net_amount) + SELECT year, NEW.avnr, mgnr, NEW.amount FROM delivery WHERE (year, did) = (NEW.year, NEW.did) + ON CONFLICT DO UPDATE SET net_amount = net_amount + excluded.net_amount; +END; + +DROP TRIGGER t_payment_delivery_part_u; +CREATE TRIGGER t_payment_delivery_part_u + AFTER UPDATE ON payment_delivery_part FOR EACH ROW +BEGIN + UPDATE payment_member + SET net_amount = net_amount - OLD.amount + WHERE (year, avnr, mgnr) IN (SELECT year, OLD.avnr, mgnr FROM delivery WHERE (year, did) = (OLD.year, OLD.did)); + INSERT INTO payment_member (year, avnr, mgnr, net_amount) + SELECT year, NEW.avnr, mgnr, NEW.amount FROM delivery WHERE (year, did) = (NEW.year, NEW.did) + ON CONFLICT DO UPDATE SET net_amount = net_amount + excluded.net_amount; +END; + +DROP TRIGGER t_payment_delivery_part_d; +CREATE TRIGGER t_payment_delivery_part_d + AFTER DELETE ON payment_delivery_part FOR EACH ROW +BEGIN + UPDATE payment_member + SET net_amount = net_amount - OLD.amount + WHERE (year, avnr, mgnr) IN (SELECT year, OLD.avnr, mgnr FROM delivery WHERE (year, did) = (OLD.year, OLD.did)); +END; + +DROP TRIGGER t_payment_delivery_part_bucket_u; +CREATE TRIGGER t_payment_delivery_part_bucket_u + AFTER UPDATE ON payment_delivery_part_bucket FOR EACH ROW +BEGIN + UPDATE payment_delivery_part + SET net_amount = net_amount - OLD.amount + WHERE (year, did, dpnr, avnr) = (OLD.year, OLD.did, OLD.dpnr, OLD.avnr); + UPDATE payment_delivery_part + SET net_amount = net_amount + NEW.amount + WHERE (year, did, dpnr, avnr) = (NEW.year, NEW.did, NEW.dpnr, NEW.avnr); +END; + +ALTER TABLE payment_member DROP COLUMN amount; +ALTER TABLE payment_member ADD COLUMN amount INTEGER NOT NULL GENERATED ALWAYS AS (ROUND(net_amount * (1 + mod_rel) + mod_abs)) VIRTUAL; diff --git a/Elwig/Resources/Sql/11-12.sql b/Elwig/Resources/Sql/11-12.sql new file mode 100644 index 0000000..6175109 --- /dev/null +++ b/Elwig/Resources/Sql/11-12.sql @@ -0,0 +1,11 @@ +-- schema version 11 to 12 + +CREATE VIEW v_stat_member AS +SELECT year, mgnr, + SUM(weight) AS sum, + ROUND(SUM(kmw * weight) / SUM(weight), 2) AS kmw, + ROUND(SUM(oe * weight) / SUM(weight), 1) AS oe, + COUNT(DISTINCT did) AS lieferungen +FROM v_delivery +GROUP BY year, mgnr +ORDER BY year, mgnr;