From ec7486124bbd26386362a0c1ae2583ab4e4822a8 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Wed, 1 Jul 2026 00:20:33 +0200 Subject: [PATCH] database: Add member_history and different types of business shares --- sql/sample/WLNS.sql | 2 +- sql/sample/WLWV.sql | 2 +- sql/sample/base.sql | 4 +- sql/v01/11.create.client.sql | 92 +++++++++++++++++++++++++++--- sql/v01/12.create.season.sql | 20 ++++--- sql/v01/30.create.view.sql | 77 +++++++++++++++++++------ sql/v01/32.create.penalty-view.sql | 24 ++++---- sql/v01/99.schema_version.sql | 2 +- 8 files changed, 174 insertions(+), 49 deletions(-) diff --git a/sql/sample/WLNS.sql b/sql/sample/WLNS.sql index 05a053d..568dc3c 100644 --- a/sql/sample/WLNS.sql +++ b/sql/sample/WLNS.sql @@ -11,7 +11,7 @@ WHERE hkid = 'WLNS' AND k.name NOT IN ('Nickelsdorf', 'Zurndorf', 'Parndorf', 'Bruckneudorf', 'Kaisersteinbruch', 'Gattendorf', 'Neudorf bei Parndorf', 'Potzneusiedl', 'Pama', 'Deutsch Jahrndorf', 'Kittsee', 'Edelstal'); -INSERT INTO member (mgnr, name, given_name, juridical_pers, zwstid, birthday, entry_date, business_shares, volllieferant, buchführend, country, postal_dest, address, default_kgnr, iban, lfbis_nr, ustid_nr) VALUES +INSERT INTO member (mgnr, name, given_name, juridical_pers, zwstid, birthday, entry_date, shares, volllieferant, buchführend, country, postal_dest, address, default_kgnr, iban, lfbis_nr, ustid_nr) VALUES (101, 'Mustermann', 'Max', FALSE, 'X', '1991', '2012-06-04', 5, FALSE, FALSE, 40, 715200162, 'Winzerstraße 1', 32019, 'AT811234567890123457', '0123463', NULL ), (102, 'Weinbauer', 'Wernhardt', FALSE, 'X', '1975', '1994-05-20', 3, FALSE, FALSE, 40, 714300143, 'Winzerstraße 2', 32002, 'AT541234567890123458', '0123471', 'ATU12345684'), (103, 'Musterbauer', 'Matthäus', FALSE, 'X', '2000', '2021-07-03', 4, FALSE, FALSE, 40, 714200154, 'Ödenburger Straße 10', 32010, 'AT271234567890123459', '0123480', NULL ), diff --git a/sql/sample/WLWV.sql b/sql/sample/WLWV.sql index 22f2dee..b19ea93 100644 --- a/sql/sample/WLWV.sql +++ b/sql/sample/WLWV.sql @@ -31,7 +31,7 @@ FROM wb_gem wg WHERE hkid = 'WLWV' AND g.gkz / 100 IN (308, 316) AND k.name IN ('Erdpreß', 'Martinsdorf', 'Niedersulz', 'Obersulz', 'Großinzersdorf', 'Palterndorf', 'Gaweinstal', 'Zistersdorf'); -INSERT INTO member (mgnr, name, given_name, juridical_pers, zwstid, birthday, entry_date, business_shares, volllieferant, buchführend, country, postal_dest, address, default_kgnr, iban, lfbis_nr, ustid_nr) VALUES +INSERT INTO member (mgnr, name, given_name, juridical_pers, zwstid, birthday, entry_date, shares, volllieferant, buchführend, country, postal_dest, address, default_kgnr, iban, lfbis_nr, ustid_nr) VALUES (101, 'Mustermann', 'Max', FALSE, 'X', '1991', '2012-06-04', 5, FALSE, FALSE, 40, 212005138, 'Winzerstraße 1', 15224, 'AT811234567890123457', '0123463', NULL ), (102, 'Weinbauer', 'Wernhardt', FALSE, 'X', '1975', '1994-05-20', 3, FALSE, FALSE, 40, 221105097, 'Winzerstraße 2', 15213, 'AT541234567890123458', '0123471', 'ATU12345684'), (103, 'Musterbauer', 'Matthäus', FALSE, 'X', '2000', '2021-07-03', 4, FALSE, FALSE, 40, 222303524, 'Brünner Straße 10', 06019, 'AT271234567890123459', '0123480', NULL ), diff --git a/sql/sample/base.sql b/sql/sample/base.sql index c557a07..799a3fc 100644 --- a/sql/sample/base.sql +++ b/sql/sample/base.sql @@ -25,8 +25,8 @@ INSERT INTO wine_attribute (attrid, name, active, max_kg_per_ha, strict, fill_lo ('S', 'Saft', TRUE, NULL, FALSE, 0), ('Z', 'Sekt', TRUE, NULL, FALSE, 0); -INSERT INTO season (year, currency, min_kg_per_bs, max_kg_per_bs, penalty_per_kg, penalty_amount, penalty_none, penalty_per_bs_amount, penalty_per_bs_none, bs_value, start_date, end_date) VALUES -(2025, 'EUR', 1000, 3000, NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-15', '2025-10-31'); +INSERT INTO season (year, currency, min_kg_per_share, max_kg_per_share, start_date, end_date) VALUES +(2025, 'EUR', 1000, 3000, '2025-09-15', '2025-10-31'); INSERT INTO modifier (year, modid, ordering, name, abs, rel) VALUES (2025, 'L', 1, 'Leicht geschädigtes Traubenmaterial', NULL, -0.05), diff --git a/sql/v01/11.create.client.sql b/sql/v01/11.create.client.sql index 6da6e6e..1c25e15 100644 --- a/sql/v01/11.create.client.sql +++ b/sql/v01/11.create.client.sql @@ -84,7 +84,10 @@ CREATE TABLE member ( entry_date TEXT CHECK (entry_date REGEXP '^[1-9][0-9]{3}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$') DEFAULT CURRENT_DATE, exit_date TEXT CHECK (exit_date REGEXP '^[1-9][0-9]{3}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$') DEFAULT NULL, - business_shares INTEGER NOT NULL DEFAULT 0, + shares INTEGER NOT NULL DEFAULT 0 CHECK (shares >= 0), + shares_red INTEGER NOT NULL DEFAULT 0 CHECK (shares_red >= 0), + shares_white INTEGER NOT NULL DEFAULT 0 CHECK (shares_white >= 0), + shares_dormant INTEGER NOT NULL DEFAULT 0 CHECK (shares_dormant >= 0), accounting_nr TEXT DEFAULT NULL, zwstid TEXT CHECK (NOT active OR zwstid IS NOT NULL), @@ -229,15 +232,86 @@ CREATE TABLE area_commitment ( ) STRICT; CREATE TABLE member_history ( - mgnr INTEGER NOT NULL, - date TEXT NOT NULL CHECK (date REGEXP '^[1-9][0-9]{3}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$') DEFAULT CURRENT_DATE, - type TEXT NOT NULL CHECK (type REGEXP '^[a-z_]+$'), + histnr INTEGER NOT NULL, + from_mgnr INTEGER, + from_type INTEGER, + to_mgnr INTEGER, + to_type INTEGER, + date_notice TEXT NOT NULL CHECK (date_notice REGEXP '^[1-9][0-9]{3}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$') DEFAULT CURRENT_DATE, + date_effective TEXT NOT NULL CHECK (date_effective REGEXP '^[1-9][0-9]{3}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$') DEFAULT CURRENT_DATE, + reason TEXT NOT NULL CHECK (reason REGEXP '^[a-z_]+$'), + source TEXT NOT NULL CHECK (source REGEXP '^[a-z_]+$'), - business_shares INTEGER NOT NULL, - comment TEXT DEFAULT NULL, + shares INTEGER NOT NULL CHECK (shares > 0), + signed INTEGER NOT NULL CHECK (signed IN (TRUE, FALSE)) DEFAULT FALSE, + value_per_share INTEGER DEFAULT NULL, + currency TEXT DEFAULT NULL, + deduct_year INTEGER DEFAULT NULL, + comment TEXT DEFAULT NULL, - CONSTRAINT pk_member_history PRIMARY KEY (mgnr, date, type), - CONSTRAINT fk_member_history_member FOREIGN KEY (mgnr) REFERENCES member (mgnr) + CONSTRAINT pk_member_history PRIMARY KEY (histnr), + CONSTRAINT fk_member_history_member_from FOREIGN KEY (from_mgnr) REFERENCES member (mgnr) ON UPDATE CASCADE - ON DELETE CASCADE + ON DELETE RESTRICT, + CONSTRAINT fk_member_history_member_to FOREIGN KEY (to_mgnr) REFERENCES member (mgnr) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT fk_member_history_currency FOREIGN KEY (currency) REFERENCES currency (code) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT c_member_history CHECK ((from_mgnr IS NOT NULL OR to_mgnr IS NOT NULL) AND + ((from_mgnr IS NULL AND from_type IS NULL) OR (from_mgnr IS NOT NULL AND from_type IS NOT NULL)) AND + ((to_mgnr IS NULL AND to_type IS NULL) OR (to_mgnr IS NOT NULL AND to_type IS NOT NULL))) ) STRICT; + +INSERT INTO client_parameter (param, value) VALUES ('ENABLE_MEMBER_HISTORY_TRIGGERS', '1'); + +CREATE TRIGGER t_member_history_i_member + AFTER INSERT ON member_history FOR EACH ROW + WHEN (SELECT value FROM client_parameter WHERE param = 'ENABLE_MEMBER_HISTORY_TRIGGERS') = 1 +BEGIN + UPDATE member SET shares = shares - NEW.shares WHERE mgnr = NEW.from_mgnr AND NEW.from_type = 1; + UPDATE member SET shares_red = shares_red - NEW.shares WHERE mgnr = NEW.from_mgnr AND NEW.from_type = 2; + UPDATE member SET shares_white = shares_white - NEW.shares WHERE mgnr = NEW.from_mgnr AND NEW.from_type = 3; + UPDATE member SET shares_dormant = shares_dormant - NEW.shares WHERE mgnr = NEW.from_mgnr AND NEW.from_type = 9; + UPDATE member SET shares = shares + NEW.shares WHERE mgnr = NEW.to_mgnr AND NEW.to_type = 1; + UPDATE member SET shares_red = shares_red + NEW.shares WHERE mgnr = NEW.to_mgnr AND NEW.to_type = 2; + UPDATE member SET shares_white = shares_white + NEW.shares WHERE mgnr = NEW.to_mgnr AND NEW.to_type = 3; + UPDATE member SET shares_dormant = shares_dormant + NEW.shares WHERE mgnr = NEW.to_mgnr AND NEW.to_type = 9; +END; + +CREATE TRIGGER t_member_history_u_member + AFTER UPDATE OF from_mgnr, from_type, to_mgnr, to_type, shares ON member_history FOR EACH ROW + WHEN (SELECT value FROM client_parameter WHERE param = 'ENABLE_MEMBER_HISTORY_TRIGGERS') = 1 +BEGIN + UPDATE member SET shares = shares + OLD.shares WHERE mgnr = OLD.from_mgnr AND OLD.from_type = 1; + UPDATE member SET shares_red = shares_red + OLD.shares WHERE mgnr = OLD.from_mgnr AND OLD.from_type = 2; + UPDATE member SET shares_white = shares_white + OLD.shares WHERE mgnr = OLD.from_mgnr AND OLD.from_type = 3; + UPDATE member SET shares_dormant = shares_dormant + OLD.shares WHERE mgnr = OLD.from_mgnr AND OLD.from_type = 9; + UPDATE member SET shares = shares - OLD.shares WHERE mgnr = OLD.to_mgnr AND OLD.to_type = 1; + UPDATE member SET shares_red = shares_red - OLD.shares WHERE mgnr = OLD.to_mgnr AND OLD.to_type = 2; + UPDATE member SET shares_white = shares_white - OLD.shares WHERE mgnr = OLD.to_mgnr AND OLD.to_type = 3; + UPDATE member SET shares_dormant = shares_dormant - OLD.shares WHERE mgnr = OLD.to_mgnr AND OLD.to_type = 9; + UPDATE member SET shares = shares - NEW.shares WHERE mgnr = NEW.from_mgnr AND NEW.from_type = 1; + UPDATE member SET shares_red = shares_red - NEW.shares WHERE mgnr = NEW.from_mgnr AND NEW.from_type = 2; + UPDATE member SET shares_white = shares_white - NEW.shares WHERE mgnr = NEW.from_mgnr AND NEW.from_type = 3; + UPDATE member SET shares_dormant = shares_dormant - NEW.shares WHERE mgnr = NEW.from_mgnr AND NEW.from_type = 9; + UPDATE member SET shares = shares + NEW.shares WHERE mgnr = NEW.to_mgnr AND NEW.to_type = 1; + UPDATE member SET shares_red = shares_red + NEW.shares WHERE mgnr = NEW.to_mgnr AND NEW.to_type = 2; + UPDATE member SET shares_white = shares_white + NEW.shares WHERE mgnr = NEW.to_mgnr AND NEW.to_type = 3; + UPDATE member SET shares_dormant = shares_dormant + NEW.shares WHERE mgnr = NEW.to_mgnr AND NEW.to_type = 9; +END; + +CREATE TRIGGER t_member_history_d_member + AFTER DELETE ON member_history FOR EACH ROW + WHEN (SELECT value FROM client_parameter WHERE param = 'ENABLE_MEMBER_HISTORY_TRIGGERS') = 1 +BEGIN + UPDATE member SET shares = shares + OLD.shares WHERE mgnr = OLD.from_mgnr AND OLD.from_type = 1; + UPDATE member SET shares_red = shares_red + OLD.shares WHERE mgnr = OLD.from_mgnr AND OLD.from_type = 2; + UPDATE member SET shares_white = shares_white + OLD.shares WHERE mgnr = OLD.from_mgnr AND OLD.from_type = 3; + UPDATE member SET shares_dormant = shares_dormant + OLD.shares WHERE mgnr = OLD.from_mgnr AND OLD.from_type = 9; + UPDATE member SET shares = shares - OLD.shares WHERE mgnr = OLD.to_mgnr AND OLD.to_type = 1; + UPDATE member SET shares_red = shares_red - OLD.shares WHERE mgnr = OLD.to_mgnr AND OLD.to_type = 2; + UPDATE member SET shares_white = shares_white - OLD.shares WHERE mgnr = OLD.to_mgnr AND OLD.to_type = 3; + UPDATE member SET shares_dormant = shares_dormant - OLD.shares WHERE mgnr = OLD.to_mgnr AND OLD.to_type = 9; +END; diff --git a/sql/v01/12.create.season.sql b/sql/v01/12.create.season.sql index 21896f3..f07bb9d 100644 --- a/sql/v01/12.create.season.sql +++ b/sql/v01/12.create.season.sql @@ -8,14 +8,18 @@ CREATE TABLE season ( vat_normal REAL NOT NULL DEFAULT 0.10, vat_flatrate REAL NOT NULL DEFAULT 0.13, - min_kg_per_bs INTEGER NOT NULL, - max_kg_per_bs INTEGER NOT NULL, - penalty_per_kg INTEGER, - penalty_amount INTEGER, - penalty_none INTEGER, - penalty_per_bs_amount INTEGER, - penalty_per_bs_none INTEGER, - bs_value INTEGER, + min_kg_per_share INTEGER DEFAULT NULL, + max_kg_per_share INTEGER DEFAULT NULL, + min_kg_per_share_red INTEGER DEFAULT NULL, + max_kg_per_share_red INTEGER DEFAULT NULL, + min_kg_per_share_white INTEGER DEFAULT NULL, + max_kg_per_share_white INTEGER DEFAULT NULL, + penalty_per_kg INTEGER DEFAULT NULL, + penalty_amount INTEGER DEFAULT NULL, + penalty_none INTEGER DEFAULT NULL, + penalty_per_share_amount INTEGER DEFAULT NULL, + penalty_per_share_none INTEGER DEFAULT NULL, + share_value INTEGER, start_date TEXT CHECK (start_date REGEXP '^[1-9][0-9]{3}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$'), end_date TEXT CHECK (end_date REGEXP '^[1-9][0-9]{3}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$'), diff --git a/sql/v01/30.create.view.sql b/sql/v01/30.create.view.sql index 23b0d8a..6476c64 100644 --- a/sql/v01/30.create.view.sql +++ b/sql/v01/30.create.view.sql @@ -40,7 +40,7 @@ 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.name, m.given_name, - p.sortid, a.attrid, p.cultid, + v.sortid, v.type, a.attrid, p.cultid, 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.net_weight, p.gebunden, @@ -52,6 +52,7 @@ SELECT p.year, p.did, p.dpnr, 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_variety v ON v.sortid = p.sortid 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 @@ -59,7 +60,9 @@ ORDER BY p.year, p.did, p.dpnr, o.modid; CREATE VIEW v_stat_season AS SELECT year, - SUM(weight) AS sum, + SUM(weight) AS weight_total, + SUM(IIF(type = 'R', weight, 0)) AS weight_red, + SUM(IIF(type = 'W', weight, 0)) AS weight_white, ROUND(SUM(kmw * weight) / SUM(weight), 2) AS kmw, ROUND(SUM(oe * weight) / SUM(weight), 1) AS oe, COUNT(DISTINCT did) AS lieferungen, @@ -68,9 +71,11 @@ FROM v_delivery GROUP BY year ORDER BY year; -CREATE VIEW v_stat_sort AS +CREATE VIEW v_stat_variety AS SELECT year, sortid, - SUM(weight) AS sum, + SUM(weight) AS weight_total, + SUM(IIF(type = 'R', weight, 0)) AS weight_red, + SUM(IIF(type = 'W', weight, 0)) AS weight_white, ROUND(SUM(kmw * weight) / SUM(weight), 2) AS kmw, ROUND(SUM(oe * weight) / SUM(weight), 1) AS oe, COUNT(DISTINCT did) AS lieferungen, @@ -81,7 +86,9 @@ ORDER BY year, sortid; CREATE VIEW v_stat_attr AS SELECT year, attrid, - SUM(weight) AS sum, + SUM(weight) AS weight_total, + SUM(IIF(type = 'R', weight, 0)) AS weight_red, + SUM(IIF(type = 'W', weight, 0)) AS weight_white, ROUND(SUM(kmw * weight) / SUM(weight), 2) AS kmw, ROUND(SUM(oe * weight) / SUM(weight), 1) AS oe, COUNT(DISTINCT did) AS lieferungen, @@ -90,9 +97,11 @@ FROM v_delivery GROUP BY year, attrid ORDER BY year, attrid; -CREATE VIEW v_stat_sort_attr AS +CREATE VIEW v_stat_variety_attr AS SELECT year, sortid, attrid, - SUM(weight) AS sum, + SUM(weight) AS weight_total, + SUM(IIF(type = 'R', weight, 0)) AS weight_red, + SUM(IIF(type = 'W', weight, 0)) AS weight_white, ROUND(SUM(kmw * weight) / SUM(weight), 2) AS kmw, ROUND(SUM(oe * weight) / SUM(weight), 1) AS oe, COUNT(DISTINCT did) AS lieferungen, @@ -103,7 +112,9 @@ ORDER BY year, sortid, attrid; CREATE VIEW v_stat_member AS SELECT year, mgnr, - SUM(weight) AS sum, + SUM(weight) AS weight_total, + SUM(IIF(type = 'R', weight, 0)) AS weight_red, + SUM(IIF(type = 'W', weight, 0)) AS weight_white, ROUND(SUM(kmw * weight) / SUM(weight), 2) AS kmw, ROUND(SUM(oe * weight) / SUM(weight), 1) AS oe, COUNT(DISTINCT did) AS lieferungen @@ -136,17 +147,49 @@ FROM v_delivery d JOIN wine_variety v ON v.sortid = d.sortid ORDER BY d.date, d.time; +CREATE VIEW v_member_history AS +SELECT m.mgnr, s.year, + m.shares + SUM(IIF(h1.from_type = 1, h1.shares, 0)) - SUM(IIF(h2.to_type = 1, h2.shares, 0)) AS shares, + m.shares_red + SUM(IIF(h1.from_type = 2, h1.shares, 0)) - SUM(IIF(h2.to_type = 2, h2.shares, 0)) AS shares_red, + m.shares_white + SUM(IIF(h1.from_type = 3, h1.shares, 0)) - SUM(IIF(h2.to_type = 3, h2.shares, 0)) AS shares_white, + m.shares_dormant + SUM(IIF(h1.from_type = 9, h1.shares, 0)) - SUM(IIF(h2.to_type = 9, h2.shares, 0)) AS shares_dormant +FROM member m, v_virtual_season s + LEFT JOIN member_history h1 ON (SUBSTR(h1.date_notice, 1, 4) + 0) > s.year AND h1.from_mgnr = m.mgnr + LEFT JOIN member_history h2 ON (SUBSTR(h2.date_notice, 1, 4) + 0) > s.year AND h2.to_mgnr = m.mgnr +GROUP BY m.mgnr, s.year +ORDER BY m.mgnr, s.year; + CREATE VIEW v_total_under_delivery AS -SELECT s.year, m.mgnr, m.business_shares, - m.business_shares * s.min_kg_per_bs AS min_kg, - m.business_shares * s.max_kg_per_bs AS max_kg, - COALESCE(d.sum, 0) AS weight, - IIF(COALESCE(d.sum, 0) < m.business_shares * s.min_kg_per_bs, - COALESCE(d.sum, 0) - m.business_shares * s.min_kg_per_bs, - IIF(COALESCE(d.sum, 0) > m.business_shares * s.max_kg_per_bs, - COALESCE(d.sum, 0) - m.business_shares * s.max_kg_per_bs, - 0)) AS diff +SELECT s.year, m.mgnr, + h.shares, + h.shares * COALESCE(s.min_kg_per_share, 0) AS min_kg, + h.shares * COALESCE(s.max_kg_per_share, 0) AS max_kg, + COALESCE(d.weight_total, 0) AS weight_total, + IIF(COALESCE(d.weight_total, 0) < h.shares * COALESCE(s.min_kg_per_share, 0), + COALESCE(d.weight_total, 0) - h.shares * COALESCE(s.min_kg_per_share, 0), + IIF(COALESCE(d.weight_total, 0) > h.shares * COALESCE(s.max_kg_per_share, 0), + COALESCE(d.weight_total, 0) - h.shares * COALESCE(s.max_kg_per_share, 0), + 0)) AS diff, + h.shares_red, + h.shares_red * COALESCE(s.min_kg_per_share_red, s.min_kg_per_share, 0) AS min_kg_red, + h.shares_red * COALESCE(s.max_kg_per_share_red, s.max_kg_per_share, 0) AS max_kg_red, + COALESCE(d.weight_red, 0) AS weight_red, + IIF(COALESCE(d.weight_red, 0) < h.shares_red * COALESCE(s.min_kg_per_share_red, s.min_kg_per_share, 0), + COALESCE(d.weight_red, 0) - h.shares_red * COALESCE(s.min_kg_per_share_red, s.min_kg_per_share, 0), + IIF(COALESCE(d.weight_red, 0) > h.shares_red * COALESCE(s.max_kg_per_share_red, s.max_kg_per_share, 0), + COALESCE(d.weight_red, 0) - h.shares_red * COALESCE(s.max_kg_per_share_red, s.max_kg_per_share, 0), + 0)) AS diff_red, + h.shares_white, + h.shares_white * COALESCE(s.min_kg_per_share_white, s.min_kg_per_share, 0) AS min_kg_white, + h.shares_white * COALESCE(s.max_kg_per_share_white, s.max_kg_per_share, 0) AS max_kg_white, + COALESCE(d.weight_white, 0) AS weight_white, + IIF(COALESCE(d.weight_white, 0) < h.shares_white * COALESCE(s.min_kg_per_share_white, s.min_kg_per_share, 0), + COALESCE(d.weight_white, 0) - h.shares_white * COALESCE(s.min_kg_per_share_white, s.min_kg_per_share, 0), + IIF(COALESCE(d.weight_white, 0) > h.shares_white * COALESCE(s.max_kg_per_share_white, s.max_kg_per_share, 0), + COALESCE(d.weight_white, 0) - h.shares_white * COALESCE(s.max_kg_per_share_white, s.max_kg_per_share, 0), + 0)) AS diff_white FROM member m, season s + LEFT JOIN v_member_history h ON (h.year, h.mgnr) = (s.year, m.mgnr) LEFT JOIN v_stat_member d ON (d.year, d.mgnr) = (s.year, m.mgnr) ORDER BY s.year, m.mgnr; diff --git a/sql/v01/32.create.penalty-view.sql b/sql/v01/32.create.penalty-view.sql index cf9b0ed..f7854f4 100644 --- a/sql/v01/32.create.penalty-view.sql +++ b/sql/v01/32.create.penalty-view.sql @@ -1,9 +1,12 @@ CREATE VIEW v_penalty_business_shares AS SELECT u.year, u.mgnr, - SUM(IIF(u.weight = 0, COALESCE(-s.penalty_none, 0) + COALESCE(-u.business_shares * s.penalty_per_bs_none, 0), 0) + - IIF(u.diff < 0, COALESCE(-s.penalty_amount, 0), 0) + - COALESCE(u.diff * s.penalty_per_kg, 0) + COALESCE(CEIL(CAST(u.diff AS REAL) / s.min_kg_per_bs) * s.penalty_per_bs_amount, 0) + SUM(IIF(u.weight_total = 0, COALESCE(-s.penalty_none, 0) + COALESCE(-(u.shares + u.shares_red + u.shares_white) * s.penalty_per_share_none, 0), 0) + + IIF(u.diff < 0 OR u.diff_red < 0 OR u.diff_white < 0, COALESCE(-s.penalty_amount, 0), 0) + + COALESCE((u.diff + u.diff_red + u.diff_white) * s.penalty_per_kg, 0) + + COALESCE(CEIL(CAST(u.diff AS REAL) / s.min_kg_per_share) * s.penalty_per_share_amount, 0) + + COALESCE(CEIL(CAST(u.diff_red AS REAL) / s.min_kg_per_share_red) * s.penalty_per_share_amount, 0) + + COALESCE(CEIL(CAST(u.diff_white AS REAL) / s.min_kg_per_share_white) * s.penalty_per_share_amount, 0) ) AS total_penalty FROM v_total_under_delivery u JOIN season s ON u.year = s.year @@ -26,10 +29,11 @@ HAVING total_penalty < 0 ORDER BY year, mgnr; CREATE VIEW v_auto_business_shares AS -SELECT s.year, h.mgnr, - SUM(h.business_shares) AS business_shares, - SUM(h.business_shares) * s.bs_value AS total_amount -FROM member_history h, season s -WHERE h.type = 'auto' AND h.date >= s.year || '-01-01' AND h.date <= s.year || '-12-31' -GROUP BY s.year, h.mgnr -ORDER BY s.year, h.mgnr; +SELECT (SUBSTR(h.date_notice, 1, 4) + 0) AS year, + h.to_mgnr AS mgnr, + SUM(h.shares) AS shares, + SUM(h.shares * COALESCE(h.value_per_share, 0)) AS total_amount +FROM member_history h +WHERE h.reason = 'prescription' AND h.source = 'elwig' +GROUP BY year, h.to_mgnr +ORDER BY year, h.to_mgnr; diff --git a/sql/v01/99.schema_version.sql b/sql/v01/99.schema_version.sql index 7e206d2..a2ae4a3 100644 --- a/sql/v01/99.schema_version.sql +++ b/sql/v01/99.schema_version.sql @@ -1,3 +1,3 @@ -- This value MUST NOT be changed while other connections are open! -PRAGMA schema_version = 3900; +PRAGMA schema_version = 4000;