Update database schema

This commit is contained in:
2023-04-14 20:39:04 +02:00
parent 28ce38779c
commit d5c8c224df
4 changed files with 142 additions and 40 deletions

View File

@ -331,6 +331,7 @@ def migrate_attributes(in_dir: str, out_dir: str) -> None:
f.write(csv.format_row(a['SANR'], a['Attribut'], int(a['KgProHa'])))
if WG == 'MATZEN':
f.write(csv.format_row('M', 'Matzen', 10000))
f.write(csv.format_row('HU', 'Huber', 10000))
def migrate_cultivations(in_dir: str, out_dir: str) -> None:
@ -649,9 +650,12 @@ def migrate_contracts(in_dir: str, out_dir: str) -> None:
invalid(mgnr, 'GstNr.', f'{kgnr:05}-{nr_str}')
return []
with open(f'{out_dir}/contract.csv', 'w+') as f_c, open(f'{out_dir}/area_commitment.csv', 'w+') as f_fb:
with open(f'{out_dir}/contract.csv', 'w+') as f_c, \
open(f'{out_dir}/area_commitment.csv', 'w+') as f_fb, \
open(f'{out_dir}/area_commitment_attribute.csv', 'w+') as f_attr:
f_c.write('vnr;mgnr;year_from;year_to\n')
f_fb.write('vnr;kgnr;gstnr;rdnr;area;sortid;attrid;cultid\n')
f_fb.write('vnr;kgnr;gstnr;rdnr;area;sortid;cultid\n')
f_attr.write('vnr;kgnr;gstnr;attrid\n')
for fb in csv.parse_dict(f'{in_dir}/TFlaechenbindungen.csv'):
if fb['Von'] is None and fb['Bis'] is None:
@ -682,8 +686,10 @@ def migrate_contracts(in_dir: str, out_dir: str) -> None:
a = area - gst_area * (len(gstnrs) - 1) if i == 0 else gst_area
rdnr = REED_MAP[fb['RNR']][1] if fb['RNR'] else None
f_fb.write(csv.format_row(
vnr, kgnr, gstnr, rdnr, a, fb['SNR'], fb['SANR'], CULTIVATION_MAP[fb['BANR']]
vnr, kgnr, gstnr, rdnr, a, fb['SNR'], CULTIVATION_MAP[fb['BANR']]
))
if fb['SANR']:
f_attr.write(csv.format_row(vnr, kgnr, gstnr, fb['SANR']))
def fix_deliveries(deliveries: Iterable[Dict[str, Any]]) -> Iterable[Tuple[str, List[int], datetime.date]]:
@ -744,15 +750,24 @@ def migrate_deliveries(in_dir: str, out_dir: str) -> None:
seasons = {}
branches = {}
for mod in modifiers.values():
name: str = mod['Bezeichnung']
if WG == 'MATZEN':
mod['id'] = name[-1] if name.startswith('Klasse') else 'TB' if name == 'Treuebonus' else 'PZS'
else:
raise NotImplementedError()
deliveries = list(csv.parse_dict(f'{in_dir}/TLieferungen.csv'))
delivery_dict = {d['LINR']: d for d in deliveries}
fixed = fix_deliveries(deliveries)
with open(f'{out_dir}/delivery.csv', 'w+') as f_delivery, \
open(f'{out_dir}/delivery_part.csv', 'w+') as f_part:
open(f'{out_dir}/delivery_part.csv', 'w+') as f_part, \
open(f'{out_dir}/delivery_part_attribute.csv', 'w+') as f_attr:
f_delivery.write('year;did;date;time;zwstid;lnr;lsnr;mgnr;comment\n')
f_part.write('year;did;dpnr;sortid;attrid;weight;kmw;qualid;hkid;kgnr;rdnr;gerebelt;manual_weighing;spl_check;'
'hand_picked;lesemaschine;temperature;acid;scale_id;weighing_id;comment\n')
f_part.write('year;did;dpnr;sortid;weight;kmw;qualid;hkid;kgnr;rdnr;gerebelt;manual_weighing;spl_check;'
'hand_picked;lesewagen;temperature;acid;scale_id;weighing_id;comment\n')
f_attr.write('year;did;dpnr;attrid\n')
for lsnr, linrs, date in fixed:
if date.year not in seasons:
@ -778,6 +793,7 @@ def migrate_deliveries(in_dir: str, out_dir: str) -> None:
lnr = branches[znr][date]
comments = []
attributes = set()
for dpnr, linr in enumerate(linrs, start=1):
d = delivery_dict[linr]
delivery_map[linr] = (date.year, snr, dpnr)
@ -786,28 +802,32 @@ def migrate_deliveries(in_dir: str, out_dir: str) -> None:
oe = d['OechsleOriginal'] or d['Oechsle']
kmw = GRADATION_MAP[oe]
sortid, attrid = d['SNR'].upper(), d['SANR'] or None
sortid = d['SNR'].upper()
if d['SANR']:
attributes.add(d['SANR'])
if len(sortid) != 2:
attrid = sortid[-1]
attributes.add(sortid[2:])
sortid = sortid[:2]
if WG == 'MATZEN':
if sortid == 'HU':
# Gr.Veltliner (Huber)
sortid = 'GV'
attributes.add('HU')
elif sortid == 'SV':
# FIXME probably Sortenverschnitt?
sortid = 'SW'
elif sortid == 'WC':
# WEIßBURGUNDER/CHARDONNAY
# WEIBURGUNDER/CHARDONNAY
sortid = 'SW'
if attrid == 'H':
attrid = 'HK'
elif attrid == 'W':
attrid = None
if 'H' in attributes:
attributes.remove('H')
attributes.add('HK')
if 'W' in attributes:
attributes.remove('W')
if d['SNR'] != sortid:
print(f'{d["SNR"]}/{d["SANR"]} -> {sortid}/{attrid}')
print(f'{d["SNR"]}/{d["SANR"]} -> {sortid}/{attributes}')
kgnr, rdnr = None, None
if d['GNR']:
@ -851,32 +871,34 @@ def migrate_deliveries(in_dir: str, out_dir: str) -> None:
comments.append(comment)
f_part.write(csv.format_row(
date.year, snr, dpnr, sortid, attrid, int(d['Gewicht']), kmw, QUAL_MAP[d['QSNR']], HKID, kgnr, rdnr,
date.year, snr, dpnr, sortid, int(d['Gewicht']), kmw, QUAL_MAP[d['QSNR']], HKID, kgnr, rdnr,
d['Gerebelt'] or False, d['Handwiegung'] or False, d['Spaetlese-Ueberpruefung'] or False,
hand, lesemaschine, d['Temperatur'], acid, scale_id, weighing_id, comment
))
for attrid in attributes:
f_attr.write(csv.format_row(date.year, snr, dpnr, attrid))
f_delivery.write(csv.format_row(
date.year, snr, date, d['Uhrzeit'], BRANCH_MAP[d['ZNR']], lnr, lsnr, d['MGNR'],
'; '.join(comments) or None
))
with open(f'{out_dir}/delivery_part_modifier.csv', 'w+') as f_part_mod:
f_part_mod.write('year;did;dpnr;mnr\n')
f_part_mod.write('year;did;dpnr;modid\n')
for m in csv.parse_dict(f'{in_dir}/TLieferungAbschlag.csv'):
if m['LINR'] not in delivery_map:
continue
nid = delivery_map[m['LINR']]
f_part_mod.write(csv.format_row(nid[0], nid[1], nid[2], m['ASNR']))
f_part_mod.write(csv.format_row(nid[0], nid[1], nid[2], modifiers[m['ASNR']]['id']))
with open(f'{out_dir}/season.csv', 'w+') as f_season, open(f'{out_dir}/modifier.csv', 'w+') as f_mod:
f_season.write('year;currency;precision;start_date;end_date\n')
f_mod.write('year;mnr;name;abs;rel;standard;quick_select\n')
f_mod.write('year;modid;name;abs;rel;standard;quick_select\n')
for y, s in seasons.items():
f_season.write(csv.format_row(y, s['currency'], s['precision'], s['start'], s['end']))
for m in modifiers.values():
abs_v = int(m['AZAS'] * pow(10, s['precision'])) if m['AZAS'] is not None else None
f_mod.write(csv.format_row(
y, m['ASNR'], m['Bezeichnung'], abs_v, m['AZASProzent'], m['Standard'], m['Schnellauswahl']
y, m['id'], m['Bezeichnung'], abs_v, m['AZASProzent'], m['Standard'], m['Schnellauswahl']
))