Migrate Liefermengen

This commit is contained in:
2023-08-23 15:48:40 +02:00
parent b27d40aa92
commit 1c88dfe6a5
4 changed files with 70 additions and 62 deletions

View File

@ -272,6 +272,30 @@ CREATE TABLE wine_attribute (
CONSTRAINT pk_wine_attribute PRIMARY KEY (attrid) CONSTRAINT pk_wine_attribute PRIMARY KEY (attrid)
) STRICT; ) 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 ( CREATE TABLE wine_cultivation (
cultid TEXT NOT NULL CHECK (cultid REGEXP '^[A-Z]+$'), cultid TEXT NOT NULL CHECK (cultid REGEXP '^[A-Z]+$'),
name TEXT NOT NULL, name TEXT NOT NULL,
@ -371,7 +395,7 @@ CREATE TABLE area_commitment (
fbnr INTEGER NOT NULL, fbnr INTEGER NOT NULL,
mgnr INTEGER NOT NULL, mgnr INTEGER NOT NULL,
sortid TEXT NOT NULL, vtrgid TEXT NOT NULL,
cultid TEXT NOT NULL, cultid TEXT NOT NULL,
area INTEGER 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) CONSTRAINT fk_are_commitment_member FOREIGN KEY (mgnr) REFERENCES member (mgnr)
ON UPDATE CASCADE ON UPDATE CASCADE
ON DELETE RESTRICT, 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 UPDATE CASCADE
ON DELETE RESTRICT, ON DELETE RESTRICT,
CONSTRAINT fk_area_commitment_wine_cultivation FOREIGN KEY (cultid) REFERENCES wine_cultivation (cultid) CONSTRAINT fk_area_commitment_wine_cultivation FOREIGN KEY (cultid) REFERENCES wine_cultivation (cultid)
@ -404,19 +428,6 @@ CREATE TABLE area_commitment (
ON DELETE RESTRICT ON DELETE RESTRICT
) STRICT; ) 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) CONSTRAINT pk_payment PRIMARY KEY (year, avnr)
) STRICT; ) STRICT;
CREATE TABLE payment_delivery ( CREATE TABLE payment_delivery_part (
year INTEGER NOT NULL, year INTEGER NOT NULL,
did INTEGER NOT NULL, did INTEGER NOT NULL,
dpnr INTEGER NOT NULL, dpnr INTEGER NOT NULL,
@ -665,33 +676,33 @@ CREATE TABLE payment_delivery (
amount INTEGER NOT NULL, amount INTEGER NOT NULL,
CONSTRAINT pk_payment_delivery PRIMARY KEY (year, did, dpnr, avnr), CONSTRAINT pk_payment_delivery_part PRIMARY KEY (year, did, dpnr, avnr),
CONSTRAINT fk_payment_delivery_delivery_part FOREIGN KEY (year, did, dpnr) REFERENCES delivery_part (year, did, dpnr) CONSTRAINT fk_payment_delivery_part_delivery_part FOREIGN KEY (year, did, dpnr) REFERENCES delivery_part (year, did, dpnr)
ON UPDATE CASCADE ON UPDATE CASCADE
ON DELETE 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 UPDATE CASCADE
ON DELETE CASCADE ON DELETE CASCADE
) STRICT; ) STRICT;
CREATE TRIGGER t_payment_delivery_i CREATE TRIGGER t_payment_delivery_part_i
AFTER INSERT ON payment_delivery FOR EACH ROW AFTER INSERT ON payment_delivery_part FOR EACH ROW
BEGIN BEGIN
INSERT INTO payment_member (year, avnr, mgnr, amount) 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) 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; ON CONFLICT DO UPDATE SET amount = amount + NEW.amount;
END; END;
CREATE TRIGGER t_payment_delivery_u CREATE TRIGGER t_payment_delivery_part_u
AFTER UPDATE OF amount ON payment_delivery FOR EACH ROW AFTER UPDATE OF amount ON payment_delivery_part FOR EACH ROW
BEGIN BEGIN
UPDATE payment_member UPDATE payment_member
SET amount = amount - OLD.amount + NEW.amount 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))); WHERE (year, avnr, mgnr) = (NEW.year, NEW.avnr, (SELECT mgnr FROM delivery WHERE (year, did) = (NEW.year, NEW.did)));
END; END;
CREATE TRIGGER t_payment_delivery_d CREATE TRIGGER t_payment_delivery_part_d
AFTER DELETE ON payment_delivery FOR EACH ROW AFTER DELETE ON payment_delivery_part FOR EACH ROW
BEGIN BEGIN
UPDATE payment_member UPDATE payment_member
SET amount = amount - OLD.amount SET amount = amount - OLD.amount

View File

@ -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 CREATE TRIGGER t_delivery_i_ctime
AFTER INSERT ON delivery FOR EACH ROW AFTER INSERT ON delivery FOR EACH ROW
WHEN NEW.ctime != UNIXEPOCH() WHEN NEW.ctime != UNIXEPOCH()
@ -267,20 +247,20 @@ END;
---------------------------------------------------------------- ----------------------------------------------------------------
CREATE TRIGGER t_payment_delivery_i_mtime_payment_variant CREATE TRIGGER t_payment_delivery_part_i_mtime_payment_variant
AFTER INSERT ON payment_delivery FOR EACH ROW AFTER INSERT ON payment_delivery_part FOR EACH ROW
BEGIN BEGIN
UPDATE payment_variant SET mtime = UNIXEPOCH() WHERE (year, avnr) = (NEW.year, NEW.avnr); UPDATE payment_variant SET mtime = UNIXEPOCH() WHERE (year, avnr) = (NEW.year, NEW.avnr);
END; END;
CREATE TRIGGER t_payment_delivery_u_mtime_payment_variant CREATE TRIGGER t_payment_delivery_part_u_mtime_payment_variant
AFTER UPDATE ON payment_delivery FOR EACH ROW AFTER UPDATE ON payment_delivery_part FOR EACH ROW
BEGIN BEGIN
UPDATE payment_variant SET mtime = UNIXEPOCH() WHERE (year, avnr) = (OLD.year, OLD.avnr) OR (year, avnr) = (NEW.year, NEW.avnr); UPDATE payment_variant SET mtime = UNIXEPOCH() WHERE (year, avnr) = (OLD.year, OLD.avnr) OR (year, avnr) = (NEW.year, NEW.avnr);
END; END;
CREATE TRIGGER t_payment_delivery_d_mtime_payment_variant CREATE TRIGGER t_payment_delivery_part_d_mtime_payment_variant
AFTER DELETE ON payment_delivery FOR EACH ROW AFTER DELETE ON payment_delivery_part FOR EACH ROW
BEGIN BEGIN
UPDATE payment_variant SET mtime = UNIXEPOCH() WHERE (year, avnr) = (OLD.year, OLD.avnr); UPDATE payment_variant SET mtime = UNIXEPOCH() WHERE (year, avnr) = (OLD.year, OLD.avnr);
END; END;

View File

@ -13,9 +13,9 @@ import utils
DIR: str DIR: str
TABLES = ['client_parameter', 'branch', 'wb_gl', 'wb_kg', 'wb_rd', 'wine_attribute', 'wine_cultivation', 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', '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]: def get_sql_files() -> List[str]:

View File

@ -608,6 +608,27 @@ def migrate_cultivations(in_dir: str, out_dir: str) -> None:
f.row(cultid, name) 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]]: 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 + 'äöüßÄÖÜẞ-' letters = string.ascii_letters + 'äöüßÄÖÜẞ-'
double_names = ['eva maria', 'maria theresia'] 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] = {} new_reeds: Dict[Tuple[int, int], int] = {}
with utils.csv_open(f'{out_dir}/area_commitment.csv') as f_fb, \ 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: 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') 'year_from', 'year_to', 'comment')
f_attr.header('fbnr', 'attrid')
for fb in utils.csv_parse_dict(f'{in_dir}/TFlaechenbindungen.csv'): 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: 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': if WG == 'MATZEN':
gstnrs = parse_gstnrs(parz, kgnr, fb['MGNR']) gstnrs = parse_gstnrs(parz, kgnr, fb['MGNR'])
else: else:
# TODO GWK GstNrs
gstnrs = [] gstnrs = []
comment, gstnr = None, None comment, gstnr = None, None
if parz is None or parz == '0000': 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}') invalid(mgnr, 'GstNr.', f'{lookup_kg_name(kgnr)} {kgnr or 0:05}-{parz}')
gstnrs = [] gstnrs = []
gstnr = '-' gstnr = '-'
if len(gstnrs) == 0: if WG == 'MATZEN' and len(gstnrs) == 0:
comment = f'KG {kgnr or 0:05}: {parz}' comment = f'KG {kgnr or 0:05}: {parz}'
gstnr = format_gstnr(gstnrs) or gstnr or parz gstnr = format_gstnr(gstnrs) or gstnr or parz
if parz != gstnr.replace('+', '/'): if parz != gstnr.replace('+', '/'):
convert(mgnr, f'GstNr. ({fbnr})', parz, gstnr) convert(mgnr, f'GstNr. ({fbnr})', parz, gstnr)
to = fb['Bis'] if fb['Bis'] and fb['Bis'] < 3000 else None 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) 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]]: 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) prec = pow(10, WGMASTER_PRECISION)
return round(p1 * prec), round(p2 * prec), round(p3 * prec) 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') 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')} 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(): 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_reeds(args.in_dir, args.out_dir)
migrate_attributes(args.in_dir, args.out_dir) migrate_attributes(args.in_dir, args.out_dir)
migrate_cultivations(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_members(args.in_dir, args.out_dir)
migrate_area_commitments(args.in_dir, args.out_dir) migrate_area_commitments(args.in_dir, args.out_dir)
migrate_deliveries(args.in_dir, args.out_dir) migrate_deliveries(args.in_dir, args.out_dir)