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)
) 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

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
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;

View File

@ -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]:

View File

@ -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)