diff --git a/sql/v01/10.create.sql b/sql/v01/10.create.sql index 6d7e5e8..6de5b6d 100644 --- a/sql/v01/10.create.sql +++ b/sql/v01/10.create.sql @@ -272,6 +272,30 @@ CREATE TABLE wine_attribute ( CONSTRAINT pk_wine_attribute PRIMARY KEY (attrid) ) STRICT; +CREATE TABLE area_commitment_type ( + vtrgid TEXT NOT NULL CHECK (vtrgid LIKE sortid || attrid_1 || attrid_2 || disc), + sortid TEXT NOT NULL, + attrid_1 TEXT, + attrid_2 TEXT, + disc TEXT DEFAULT NULL CHECK (disc REGEXP '^[A-Z0-9]+$'), + + min_kg_per_ha INTEGER, + max_kg_per_ha INTEGER, + penalty_amount REAL, + + CONSTRAINT pk_area_commitment_type PRIMARY KEY (vtrgid), + CONSTRAINT sk_area_commitment_type_sort_attr UNIQUE (sortid, attrid_1, attrid_2, 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_1) REFERENCES wine_attribute (attrid) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT fk_area_commitment_type_wine_attribute FOREIGN KEY (attrid_2) REFERENCES wine_attribute (attrid) + ON UPDATE CASCADE + ON DELETE RESTRICT +) STRICT; + CREATE TABLE wine_cultivation ( cultid TEXT NOT NULL CHECK (cultid REGEXP '^[A-Z]+$'), name TEXT NOT NULL, @@ -371,7 +395,7 @@ CREATE TABLE area_commitment ( fbnr INTEGER NOT NULL, mgnr INTEGER NOT NULL, - sortid TEXT NOT NULL, + vtrgid TEXT NOT NULL, cultid TEXT NOT NULL, area INTEGER NOT NULL, @@ -390,7 +414,7 @@ CREATE TABLE area_commitment ( CONSTRAINT fk_are_commitment_member FOREIGN KEY (mgnr) REFERENCES member (mgnr) ON UPDATE CASCADE ON DELETE RESTRICT, - CONSTRAINT fk_area_commitment_wine_variety FOREIGN KEY (sortid) REFERENCES wine_variety (sortid) + CONSTRAINT fk_area_commitment_area_commitment_type FOREIGN KEY (vtrgid) REFERENCES area_commitment_type (vtrgid) ON UPDATE CASCADE ON DELETE RESTRICT, CONSTRAINT fk_area_commitment_wine_cultivation FOREIGN KEY (cultid) REFERENCES wine_cultivation (cultid) @@ -404,19 +428,6 @@ CREATE TABLE area_commitment ( ON DELETE RESTRICT ) STRICT; -CREATE TABLE area_commitment_attribute ( - fbnr INTEGER NOT NULL, - attrid TEXT NOT NULL, - - CONSTRAINT pk_area_commitment_attribute PRIMARY KEY (fbnr, attrid), - CONSTRAINT fk_area_commitment_attribute_area_commitment FOREIGN KEY (fbnr) REFERENCES area_commitment (fbnr) - ON UPDATE CASCADE - ON DELETE CASCADE, - CONSTRAINT fk_area_commitment_attribute_wine_attribute FOREIGN KEY (attrid) REFERENCES wine_attribute (attrid) - ON UPDATE CASCADE - ON DELETE RESTRICT -) STRICT; - ---------------------------------------------------------------- @@ -634,7 +645,7 @@ CREATE TABLE payment_variant ( CONSTRAINT pk_payment PRIMARY KEY (year, avnr) ) STRICT; -CREATE TABLE payment_delivery ( +CREATE TABLE payment_delivery_part ( year INTEGER NOT NULL, did INTEGER NOT NULL, dpnr INTEGER NOT NULL, @@ -665,33 +676,33 @@ CREATE TABLE payment_delivery ( amount INTEGER NOT NULL, - CONSTRAINT pk_payment_delivery PRIMARY KEY (year, did, dpnr, avnr), - CONSTRAINT fk_payment_delivery_delivery_part FOREIGN KEY (year, did, dpnr) REFERENCES delivery_part (year, did, dpnr) + CONSTRAINT pk_payment_delivery_part PRIMARY KEY (year, did, dpnr, avnr), + CONSTRAINT fk_payment_delivery_part_delivery_part FOREIGN KEY (year, did, dpnr) REFERENCES delivery_part (year, did, dpnr) ON UPDATE CASCADE ON DELETE CASCADE, - CONSTRAINT fk_payment_delivery_payment_variant FOREIGN KEY (year, avnr) REFERENCES payment_variant (year, avnr) + CONSTRAINT fk_payment_delivery_part_payment_variant FOREIGN KEY (year, avnr) REFERENCES payment_variant (year, avnr) ON UPDATE CASCADE ON DELETE CASCADE ) STRICT; -CREATE TRIGGER t_payment_delivery_i - AFTER INSERT ON payment_delivery FOR EACH ROW +CREATE TRIGGER t_payment_delivery_part_i + AFTER INSERT ON payment_delivery_part FOR EACH ROW BEGIN INSERT INTO payment_member (year, avnr, mgnr, amount) VALUES (NEW.year, NEW.avnr, (SELECT mgnr FROM delivery WHERE (year, did) = (NEW.year, NEW.did)), NEW.amount) ON CONFLICT DO UPDATE SET amount = amount + NEW.amount; END; -CREATE TRIGGER t_payment_delivery_u - AFTER UPDATE OF amount ON payment_delivery FOR EACH ROW +CREATE TRIGGER t_payment_delivery_part_u + AFTER UPDATE OF amount ON payment_delivery_part FOR EACH ROW BEGIN UPDATE payment_member SET amount = amount - OLD.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_d - AFTER DELETE ON payment_delivery FOR EACH ROW +CREATE TRIGGER t_payment_delivery_part_d + AFTER DELETE ON payment_delivery_part FOR EACH ROW BEGIN UPDATE payment_member SET amount = amount - OLD.amount diff --git a/sql/v01/11.timestamp-trigger.sql b/sql/v01/11.timestamp-trigger.sql index c930821..7337a2a 100644 --- a/sql/v01/11.timestamp-trigger.sql +++ b/sql/v01/11.timestamp-trigger.sql @@ -99,26 +99,6 @@ END; ---------------------------------------------------------------- -CREATE TRIGGER t_area_commitment_attribute_i_mtime_area_commitment - AFTER INSERT ON area_commitment_attribute FOR EACH ROW -BEGIN - UPDATE area_commitment SET mtime = UNIXEPOCH() WHERE fbnr = NEW.fbnr; -END; - -CREATE TRIGGER t_area_commitment_attribute_u_mtime_area_commitment - AFTER UPDATE ON area_commitment_attribute FOR EACH ROW -BEGIN - UPDATE area_commitment SET mtime = UNIXEPOCH() WHERE fbnr = OLD.fbnr OR fbnr = NEW.fbnr; -END; - -CREATE TRIGGER t_area_commitment_attribute_d_mtime_area_commitment - AFTER DELETE ON area_commitment_attribute FOR EACH ROW -BEGIN - UPDATE area_commitment SET mtime = UNIXEPOCH() WHERE fbnr = OLD.fbnr; -END; - ----------------------------------------------------------------- - CREATE TRIGGER t_delivery_i_ctime AFTER INSERT ON delivery FOR EACH ROW WHEN NEW.ctime != UNIXEPOCH() @@ -267,20 +247,20 @@ END; ---------------------------------------------------------------- -CREATE TRIGGER t_payment_delivery_i_mtime_payment_variant - AFTER INSERT ON payment_delivery FOR EACH ROW +CREATE TRIGGER t_payment_delivery_part_i_mtime_payment_variant + AFTER INSERT ON payment_delivery_part FOR EACH ROW BEGIN UPDATE payment_variant SET mtime = UNIXEPOCH() WHERE (year, avnr) = (NEW.year, NEW.avnr); END; -CREATE TRIGGER t_payment_delivery_u_mtime_payment_variant - AFTER UPDATE ON payment_delivery FOR EACH ROW +CREATE TRIGGER t_payment_delivery_part_u_mtime_payment_variant + AFTER UPDATE ON payment_delivery_part FOR EACH ROW BEGIN UPDATE payment_variant SET mtime = UNIXEPOCH() WHERE (year, avnr) = (OLD.year, OLD.avnr) OR (year, avnr) = (NEW.year, NEW.avnr); END; -CREATE TRIGGER t_payment_delivery_d_mtime_payment_variant - AFTER DELETE ON payment_delivery FOR EACH ROW +CREATE TRIGGER t_payment_delivery_part_d_mtime_payment_variant + AFTER DELETE ON payment_delivery_part FOR EACH ROW BEGIN UPDATE payment_variant SET mtime = UNIXEPOCH() WHERE (year, avnr) = (OLD.year, OLD.avnr); END; diff --git a/wgmaster/import.py b/wgmaster/import.py index 713a76f..d987541 100755 --- a/wgmaster/import.py +++ b/wgmaster/import.py @@ -13,9 +13,9 @@ import utils DIR: str TABLES = ['client_parameter', 'branch', 'wb_gl', 'wb_kg', 'wb_rd', 'wine_attribute', 'wine_cultivation', - 'member', 'member_billing_address', 'member_telephone_number', 'area_commitment', 'area_commitment_attribute', + 'area_commitment_type', 'member', 'member_billing_address', 'member_telephone_number', 'area_commitment', 'season', 'modifier', 'delivery', 'delivery_part', 'delivery_part_attribute', 'delivery_part_modifier', - 'payment_variant', 'payment_delivery'] + 'payment_variant', 'payment_delivery_part'] def get_sql_files() -> List[str]: diff --git a/wgmaster/migrate.py b/wgmaster/migrate.py index 2c4714f..be376f6 100755 --- a/wgmaster/migrate.py +++ b/wgmaster/migrate.py @@ -608,6 +608,27 @@ def migrate_cultivations(in_dir: str, out_dir: str) -> None: f.row(cultid, name) +def migrate_area_commitment_types(in_dir: str, out_dir: str) -> None: + with utils.csv_open(f'{out_dir}/area_commitment_type.csv') as f: + f.header('vtrgid', 'sortid', 'attrid_1', 'attrid_2', 'disc', + 'min_kg_per_ha', 'max_kg_per_ha', 'penalty_amount') + for t in utils.csv_parse_dict(f'{in_dir}/TLiefermengen.csv'): + sortid: str = t['SNR'] + if not sortid or sortid == 'SV': + continue + menge = int(t['ErwarteteLiefermengeProHa']) + f.row(sortid + (t['SANR'] or ''), sortid[:2], t['SANR'] or sortid[2:] or None, None, None, + menge, menge, None) + bio = [] + if WG == 'MATZEN': + bio = ['GV', 'ZW', 'MT'] + f.row('BM', 'BM', None, None, None, 5000, 5000, None) + elif WG == 'GWK': + bio = ['GV', 'ZW', 'WR', 'MT', 'RR', 'WB', 'CH', 'MU'] + for sortid in bio: + f.row(f'{sortid}B', sortid, 'B', None, None, None, None, None) + + def normalize_name(family_name: str, given_name: str) -> Tuple[Optional[str], Optional[str], Optional[str], Optional[str], Optional[str], Optional[str]]: letters = string.ascii_letters + 'äöüßÄÖÜẞ-' double_names = ['eva maria', 'maria theresia'] @@ -1148,11 +1169,9 @@ def migrate_area_commitments(in_dir: str, out_dir: str) -> None: new_reeds: Dict[Tuple[int, int], int] = {} with utils.csv_open(f'{out_dir}/area_commitment.csv') as f_fb, \ - utils.csv_open(f'{out_dir}/area_commitment_attribute.csv') as f_attr, \ utils.csv_open(f'{out_dir}/wb_rd.csv', 'a+') as f_rd: - f_fb.header('fbnr', 'mgnr', 'sortid', 'cultid', 'area', 'kgnr', 'gstnr', 'rdnr', + f_fb.header('fbnr', 'mgnr', 'vtrgid', 'cultid', 'area', 'kgnr', 'gstnr', 'rdnr', 'year_from', 'year_to', 'comment') - f_attr.header('fbnr', 'attrid') for fb in utils.csv_parse_dict(f'{in_dir}/TFlaechenbindungen.csv'): if (fb['Von'] is None and fb['Bis'] is None) or fb['GNR'] is None: @@ -1201,7 +1220,6 @@ def migrate_area_commitments(in_dir: str, out_dir: str) -> None: if WG == 'MATZEN': gstnrs = parse_gstnrs(parz, kgnr, fb['MGNR']) else: - # TODO GWK GstNrs gstnrs = [] comment, gstnr = None, None if parz is None or parz == '0000': @@ -1209,17 +1227,15 @@ def migrate_area_commitments(in_dir: str, out_dir: str) -> None: invalid(mgnr, 'GstNr.', f'{lookup_kg_name(kgnr)} {kgnr or 0:05}-{parz}') gstnrs = [] gstnr = '-' - if len(gstnrs) == 0: + if WG == 'MATZEN' and len(gstnrs) == 0: comment = f'KG {kgnr or 0:05}: {parz}' gstnr = format_gstnr(gstnrs) or gstnr or parz if parz != gstnr.replace('+', '/'): convert(mgnr, f'GstNr. ({fbnr})', parz, gstnr) to = fb['Bis'] if fb['Bis'] and fb['Bis'] < 3000 else None - f_fb.row(fbnr, mgnr, fb['SNR'], CULTIVATION_MAP[fb['BANR'] or 1], area, + f_fb.row(fbnr, mgnr, fb['SNR'] + (fb['SANR'] or ''), CULTIVATION_MAP[fb['BANR'] or 1], area, kgnr, gstnr, rdnr, fb['Von'], to, comment) - if fb['SANR']: - f_attr.row(fbnr, fb['SANR']) def fix_deliveries(deliveries: Iterable[Dict[str, Any]]) -> Iterable[Tuple[str, List[int], datetime.date]]: @@ -1599,7 +1615,7 @@ def migrate_payments(in_dir: str, out_dir: str) -> None: prec = pow(10, WGMASTER_PRECISION) return round(p1 * prec), round(p2 * prec), round(p3 * prec) - with utils.csv_open(f'{out_dir}/payment_delivery.csv') as f_del_pay: + with utils.csv_open(f'{out_dir}/payment_delivery_part.csv') as f_del_pay: f_del_pay.header('year', 'did', 'dpnr', 'avnr', 'bucket_1', 'bucket_2', 'bucket_3', 'amount') deliveries = {d['LINR']: d for d in utils.csv_parse_dict(f'{in_dir}/TLieferungen.csv')} for linr, (y, did, dpnr) in DELIVERY_MAP.items(): @@ -1704,6 +1720,7 @@ def main() -> None: migrate_reeds(args.in_dir, args.out_dir) migrate_attributes(args.in_dir, args.out_dir) migrate_cultivations(args.in_dir, args.out_dir) + migrate_area_commitment_types(args.in_dir, args.out_dir) migrate_members(args.in_dir, args.out_dir) migrate_area_commitments(args.in_dir, args.out_dir) migrate_deliveries(args.in_dir, args.out_dir)