Fix migrating GWK
This commit is contained in:
@ -26,9 +26,10 @@ GRADATION_MAP: Optional[Dict[float, float]] = None
|
||||
CULTIVATION_MAP: Optional[Dict[int, str]] = None
|
||||
BRANCH_MAP: Optional[Dict[int, str]] = None
|
||||
GEM_MAP: Optional[Dict[int, List[Tuple[int, int]]]] = None
|
||||
REED_MAP: Optional[Dict[int, Tuple[int, int]]] = None
|
||||
REED_MAP: Optional[Dict[int, Tuple[int, int, str]]] = None
|
||||
GROSSLAGE_MAP: Optional[Dict[int, int]] = None
|
||||
MEMBER_MAP: Optional[Dict[int, Dict[str, Any]]] = None
|
||||
GROSSLAGE_KG_MAP: Optional[Dict[int, int]] = None
|
||||
|
||||
QUAL_MAP: Dict[int, str] = {
|
||||
0: 'WEI',
|
||||
@ -39,44 +40,102 @@ QUAL_MAP: Dict[int, str] = {
|
||||
5: 'SPL',
|
||||
}
|
||||
|
||||
# TODO GWK streetnames
|
||||
ORT_NAMES: Dict[str, Optional[str]] = {
|
||||
'Pirawarth': None,
|
||||
'Raggendorf': None,
|
||||
'Matzen': 'Matzner',
|
||||
'Matzn': None,
|
||||
'Stillfried': None,
|
||||
'Harras': None,
|
||||
'Gänserndorf': None,
|
||||
'Sulz': None,
|
||||
'Brünn': None,
|
||||
'Wien': None,
|
||||
'Angern': None,
|
||||
'Schweinbarth': None,
|
||||
'Hohenruppersdorf': None,
|
||||
'Grub': None,
|
||||
'Auersthal': None,
|
||||
'Ollersdorf': None,
|
||||
'Spannberg': None,
|
||||
'Ebenthal': None,
|
||||
'Bockfließ': None,
|
||||
'Dörfless': 'Dörfleser',
|
||||
'Dörfles': None,
|
||||
'Ableiding': None,
|
||||
'Absberg': None,
|
||||
'Eibesbrunn': None,
|
||||
'Engersdorf': None,
|
||||
'Enzersfeld': None,
|
||||
'Großebersdorf': None,
|
||||
'Hollabrunn': None,
|
||||
'Korneuburg': None,
|
||||
'Königsbrunn': None,
|
||||
'Laa': None,
|
||||
'Leopoldau': None,
|
||||
'Manhartsbrunn': None,
|
||||
'Mannhartsbrunn': 'Manhartsbrunner',
|
||||
'Münichsthal': None,
|
||||
'Pernau': None,
|
||||
'Pillichsdorf': None,
|
||||
'Retz': None,
|
||||
'Russbach': None,
|
||||
'Schleinbach': None,
|
||||
'Seefeld': None,
|
||||
'Seyring': None,
|
||||
'Stammersdorf': None,
|
||||
'Stelzendorf': None,
|
||||
'Traunfeld': None,
|
||||
'Tresdorf': None,
|
||||
'Trumau': None,
|
||||
'Wolkersdorf': None,
|
||||
'Znaim': None,
|
||||
'Obersdorf': None,
|
||||
}
|
||||
|
||||
STREET_NAMES: Dict[str, str] = {
|
||||
'Hans-Wagnerstraße': 'Hans-Wagner-Straße',
|
||||
'J.Seitzstraße': 'Josef-Seitz-Straße',
|
||||
'Kurhaus-Str.': 'Kurhausstraße',
|
||||
'Kurhaus-Straße': 'Kurhausstraße',
|
||||
'Pirawartherstraße': 'Pirawarther Straße',
|
||||
'Raggendorferstraße': 'Raggendorfer Straße',
|
||||
'Matznerstraße': 'Matzner Straße',
|
||||
'Stillfriederstraße': 'Stillfrieder Straße',
|
||||
'Harraserstraße': 'Harraser Straße',
|
||||
'Gänserndorferstraße': 'Gänserdorfer Straße',
|
||||
'Hofrat Döltlstraße': 'Hofrat-Döltl-Straße',
|
||||
'Sulzerstraße': 'Sulzer Straße',
|
||||
'Brünnerstraße': 'Brünner Straße',
|
||||
'Flustraße': 'Flurstraße',
|
||||
'Wienerstraße': 'Wiener Straße',
|
||||
'St.Laurentstraße': 'St.-Laurentstraße',
|
||||
'Angernerstraße': 'Angerner Straße',
|
||||
'Schweinbartherstraße': 'Schweinbarther Straße',
|
||||
'Hohenruppersdorferstraße': 'Hohenruppersdorfer Straße',
|
||||
'Gruberhauptstraße': 'Gruber Hauptstraße',
|
||||
'Josef Seitzstraße': 'Josef-Seitz-Straße',
|
||||
'Auersthalerstraße': 'Auerstahler Straße',
|
||||
'Ollersdorferstraße': 'Ollersdorfer Straße',
|
||||
'Ritter Zoppelstraße': 'Ritter-Zoppel-Straße',
|
||||
'Spannbergerstraße': 'Spannberger Straße',
|
||||
'Ritter Zoppel Straße': 'Ritter-Zoppel-Straße',
|
||||
'R. Virchow-Straße': 'Rudolf-Virchow-Straße',
|
||||
'Ebenthalerstraße': 'Ebenthaler Straße',
|
||||
'Bockfließerstraße': 'Bockfließer Straße',
|
||||
'Dörfleserstraße': 'Dörfleser Straße',
|
||||
'Dörflesserstraße': 'Dörfleser Straße',
|
||||
'Grubere Hauptstraße': 'Gruber Hauptstraße',
|
||||
'Groß Inzersdorf': 'Großinzersdorf',
|
||||
'Erdpress': 'Erdpreß',
|
||||
'Hochleitengasse': 'Hochleithengasse',
|
||||
'Bei Der Gösselmühle': 'Bei der Gösslmühle',
|
||||
'Dr. Peschlstraße': 'Dr.-Peschl-Straße',
|
||||
'Dr.Peschlstraße': 'Dr.-Peschl-Straße',
|
||||
'Dr. Salzbornstraße': 'Dr.-Salzborn-Straße',
|
||||
'Elsa Brandström-Straße': 'Elsa-Brandström-Straße',
|
||||
'Franz Ecker Siedlung': 'Franz-Ecker-Siedlung',
|
||||
'Franz-Ecker Siedlung': 'Franz-Ecker-Siedlung',
|
||||
'Franz Gillygasse': 'Franz-Gilly-Gasse',
|
||||
'Franz V. Zülowstraße': 'Franz-von-Zülow-Straße',
|
||||
'Gr. Nondorf': 'Großnondorf',
|
||||
'In Der Trift': 'In der Trift',
|
||||
'Johann Degengasse': 'Johann-Degen-Gasse',
|
||||
'Josef Fürnkranz Siedlung': 'Josef-Fürnkranz-Siedlung',
|
||||
'Kaiser Franz Josef Platz': 'Kaiser-Franz-Josef-Platz',
|
||||
'Klein Haugsdorf': 'Kleinhaugsdorf',
|
||||
'Leopold Leuthnerstraße': 'Leopold-Leuthner-Straße',
|
||||
'Lh.-Mayer-Platz': 'Landeshauptmann-Mayer-Platz',
|
||||
'Manhartsbr.Straße': 'Manhartsbrunner Straße',
|
||||
'Maria Lourd Weg': 'Maria-Lourd-Weg',
|
||||
'U. Weißgasse Straße': 'Untere Weißgerberstraße',
|
||||
}
|
||||
|
||||
|
||||
def new(t: str, ids: Any, name: str, comment: str = None) -> None:
|
||||
print(f'\x1B[1;32mNew {t:>6}: {str(ids):>10} ({name}{", " + comment if comment else ""})\x1B[0m', file=sys.stderr)
|
||||
|
||||
|
||||
def success(mgnr: int, key: str, value) -> None:
|
||||
if not QUIET:
|
||||
print(f'\x1B[1;32m{mgnr:>6}: {key:<12} {value}\x1B[0m', file=sys.stderr)
|
||||
@ -92,15 +151,15 @@ def invalid(mgnr: int, key: str, value) -> None:
|
||||
|
||||
def renumber_delivery(lsnr_1: str, lsnr_2: str) -> None:
|
||||
if not QUIET:
|
||||
print(f'\x1B[1m{lsnr_1:<14} -> {lsnr_2:<14}\x1B[0m')
|
||||
print(f'\x1B[1m{lsnr_1:<15} -> {lsnr_2:<15}\x1B[0m', file=sys.stderr)
|
||||
|
||||
|
||||
def warning_delivery(lsnr: str, mgnr: int, key: str, value) -> None:
|
||||
print(f'\x1B[1;33m{lsnr:<13} ({mgnr:>6}): {key:<12} {value}\x1B[0m', file=sys.stderr)
|
||||
print(f'\x1B[1;33m{lsnr:<15} ({mgnr:>6}): {key:<12} {value}\x1B[0m', file=sys.stderr)
|
||||
|
||||
|
||||
def invalid_delivery(lsnr: str, mgnr: int, key: str, value) -> None:
|
||||
print(f'\x1B[1;31m{lsnr:<13} ({mgnr:>6}): {key:<12} {value}\x1B[0m', file=sys.stderr)
|
||||
print(f'\x1B[1;31m{lsnr:<15} ({mgnr:>6}): {key:<12} {value}\x1B[0m', file=sys.stderr)
|
||||
|
||||
|
||||
def convert(mgnr: int, key: str, old_value: str, new_value) -> None:
|
||||
@ -169,6 +228,15 @@ def normalize_phone_nr(nr: Optional[str]) -> Optional[str]:
|
||||
return nr
|
||||
|
||||
|
||||
def fix_street_name(name: str) -> str:
|
||||
if name in STREET_NAMES:
|
||||
return STREET_NAMES[name]
|
||||
orte = [(k, v) for k, v in ORT_NAMES.items() if name.startswith(k + 'er')]
|
||||
if (name.endswith('straße') or name.endswith('platz')) and len(orte) == 1:
|
||||
return f'{orte[0][1] or orte[0][0] + "er"} {name[len(orte[0][0]) + 2:].title()}'.replace(' ', ' ')
|
||||
return name
|
||||
|
||||
|
||||
def get_bev_gst_size(kgnr: int, gstnr: str) -> Optional[int]:
|
||||
r = requests.get(f'https://kataster.bev.gv.at/api/gst/{kgnr:05}/{gstnr}/')
|
||||
if r.status_code != 200:
|
||||
@ -262,11 +330,13 @@ def lookup_gem_name(name: str) -> List[Tuple[int, int]]:
|
||||
elif name.lower() == 'grub':
|
||||
name = 'Grub an der March'
|
||||
elif WG == 'GWK':
|
||||
hkid = "'WLWV', 'WIEN', 'WLWG', 'WLWA'"
|
||||
hkid = "'WLWV', 'WIEN', 'WLWG'"
|
||||
if name.endswith('*'):
|
||||
# TODO do something with *
|
||||
# TODO GWK do something with * in gemeinde
|
||||
name = name[:-1].strip()
|
||||
if name.lower() == 'kreuttal':
|
||||
if name.lower() == 'joching':
|
||||
return [(12185, 31351)]
|
||||
elif name.lower() == 'kreuttal':
|
||||
return [(15206, 31627), (15221, 31627), (15226, 31627)]
|
||||
elif name.lower() == 'hochleithen':
|
||||
return [(15219, 31622), (15223, 31622), (15202, 31622)]
|
||||
@ -348,7 +418,11 @@ def lookup_kg_name(kgnr: int) -> str:
|
||||
cur.execute("SELECT name FROM AT_kg WHERE kgnr = ?", (kgnr,))
|
||||
rows = cur.fetchall()
|
||||
cur.close()
|
||||
return rows[0][0]
|
||||
return rows[0][0] if len(rows) > 0 else None
|
||||
|
||||
|
||||
def lookup_rnr_name(rnr: int) -> str:
|
||||
return REED_MAP[rnr][2]
|
||||
|
||||
|
||||
def lookup_hkid(kgnr: Optional[int], qualid: str) -> str:
|
||||
@ -373,6 +447,26 @@ def lookup_hkid(kgnr: Optional[int], qualid: str) -> str:
|
||||
return hkid
|
||||
|
||||
|
||||
def guess_glnr(kgnr: int) -> Optional[int]:
|
||||
cur = DB_CNX.cursor()
|
||||
cur.execute("SELECT kgnr FROM AT_kg "
|
||||
"WHERE gkz / 100 != 900 AND gkz / 100 = (SELECT gkz / 100 FROM AT_kg WHERE kgnr = ?)", (kgnr,))
|
||||
rows0 = cur.fetchall()
|
||||
cur.execute("SELECT kgnr FROM AT_kg "
|
||||
"WHERE gkz / 100 != 900 AND gkz = (SELECT gkz FROM AT_kg WHERE kgnr = ?)", (kgnr,))
|
||||
rows1 = cur.fetchall()
|
||||
cur.close()
|
||||
|
||||
glnrs = list(set([GROSSLAGE_KG_MAP[k] for k, in rows0 if k in GROSSLAGE_KG_MAP]))
|
||||
if len(glnrs) == 0:
|
||||
return None
|
||||
elif len(glnrs) == 1:
|
||||
return glnrs[0]
|
||||
|
||||
glnrs = list(set([GROSSLAGE_KG_MAP[k] for k, in rows1 if k in GROSSLAGE_KG_MAP]))
|
||||
return glnrs[0] if len(glnrs) > 0 else None
|
||||
|
||||
|
||||
def migrate_gradation(in_dir: str, out_dir: str) -> None:
|
||||
global GRADATION_MAP
|
||||
GRADATION_MAP = {}
|
||||
@ -406,13 +500,16 @@ def migrate_grosslagen(in_dir: str, out_dir: str) -> None:
|
||||
f.header('glnr', 'name')
|
||||
for gl in utils.csv_parse_dict(f'{in_dir}/TGrosslagen.csv'):
|
||||
glnr += 1
|
||||
if WG == 'GWK' and gl['GLNR'] == 8:
|
||||
GROSSLAGE_MAP[8] = 6
|
||||
continue
|
||||
GROSSLAGE_MAP[gl['GLNR']] = glnr
|
||||
f.row(glnr, gl['Bezeichnung'])
|
||||
|
||||
|
||||
def migrate_gemeinden(in_dir: str, out_dir: str) -> None:
|
||||
global GEM_MAP
|
||||
GEM_MAP = {}
|
||||
global GEM_MAP, GROSSLAGE_KG_MAP
|
||||
GEM_MAP, GROSSLAGE_KG_MAP = {}, {}
|
||||
|
||||
inserted = set()
|
||||
with utils.csv_open(f'{out_dir}/wb_kg.csv') as f:
|
||||
@ -424,7 +521,9 @@ def migrate_gemeinden(in_dir: str, out_dir: str) -> None:
|
||||
if kgnr in inserted:
|
||||
continue
|
||||
inserted.add(kgnr)
|
||||
f.row(kgnr, GROSSLAGE_MAP[g['GLNR']])
|
||||
glnr = GROSSLAGE_MAP[g['GLNR']]
|
||||
GROSSLAGE_KG_MAP[kgnr] = glnr
|
||||
f.row(kgnr, glnr)
|
||||
|
||||
|
||||
def migrate_reeds(in_dir: str, out_dir: str) -> None:
|
||||
@ -435,7 +534,7 @@ def migrate_reeds(in_dir: str, out_dir: str) -> None:
|
||||
f.header('kgnr', 'rdnr', 'name')
|
||||
for r in utils.csv_parse_dict(f'{in_dir}/TRiede.csv'):
|
||||
name: str = r['Bezeichnung'].strip()
|
||||
if name.isupper():
|
||||
if name.isupper() or name.islower():
|
||||
name = name.title()
|
||||
|
||||
try:
|
||||
@ -447,21 +546,24 @@ def migrate_reeds(in_dir: str, out_dir: str) -> None:
|
||||
print(f'Invalid GNR {r["GNR"]} for reed {name}')
|
||||
continue
|
||||
|
||||
rdnr = max([n for k, n in REED_MAP.values() if k == kgnr] or [0]) + 1
|
||||
REED_MAP[r['RNR']] = (kgnr, rdnr)
|
||||
rdnr = max([n for k, n, _ in REED_MAP.values() if k == kgnr] or [0]) + 1
|
||||
REED_MAP[r['RNR']] = (kgnr, rdnr, name)
|
||||
f.row(kgnr, rdnr, name)
|
||||
|
||||
|
||||
def migrate_attributes(in_dir: str, out_dir: str) -> None:
|
||||
with utils.csv_open(f'{out_dir}/wine_attribute.csv') as f:
|
||||
f.header('attrid', 'name', 'kg_per_ha')
|
||||
f.header('attrid', 'name', 'max_kg_per_ha', 'active')
|
||||
for a in utils.csv_parse_dict(f'{in_dir}/TSortenAttribute.csv'):
|
||||
if a['SANR'] is None:
|
||||
continue
|
||||
f.row(a['SANR'], a['Attribut'], int(a['KgProHa']) if a['KgProHa'] is not None else None)
|
||||
f.row(a['SANR'], a['Attribut'], int(a['KgProHa']) if a['KgProHa'] is not None else None, True)
|
||||
if WG == 'MATZEN':
|
||||
f.row('M', 'Matzen', 10000)
|
||||
f.row('HU', 'Huber', 10000)
|
||||
f.row('M', 'Matzen', None, False)
|
||||
f.row('HU', 'Huber', None, False)
|
||||
elif WG == 'GWK':
|
||||
# TODO GWK attribute F?
|
||||
f.row('F', '?', None, False)
|
||||
|
||||
|
||||
def migrate_cultivations(in_dir: str, out_dir: str) -> None:
|
||||
@ -503,7 +605,7 @@ def migrate_members(in_dir: str, out_dir: str) -> None:
|
||||
f_tel.header('mgnr', 'nr', 'type', 'number', 'comment')
|
||||
|
||||
for m in members:
|
||||
# TODO handle * in GWK
|
||||
# TODO GWK handle * in member name
|
||||
mgnr: int = m['MGNR']
|
||||
family_name: str = m['Nachname']
|
||||
given_name: str = m['Vorname']
|
||||
@ -658,20 +760,23 @@ def migrate_members(in_dir: str, out_dir: str) -> None:
|
||||
address_old = address
|
||||
address = re.sub(r'([0-9]) ?([A-Z])\b', lambda a: a.group(1) + a.group(2).lower(),
|
||||
re.sub(r'\s+', ' ', address).strip().title())
|
||||
if address.startswith('Haus Nr.') or \
|
||||
address.startswith('Nr. ') or \
|
||||
address.startswith('Nr ') or \
|
||||
address.isdigit():
|
||||
address = ort.title() + ' ' + address.split(' ')[-1]
|
||||
address = address.replace('strasse', 'straße').replace('strassse', 'straße')\
|
||||
.replace('Strasse', 'Straße').replace('Str.', 'Straße')\
|
||||
.replace('Strasse', 'Straße').replace('Str.', 'Straße').replace('stasse', 'straße')\
|
||||
.replace('str.', 'straße').replace('ster.', 'straße').replace('g. ', 'gasse ')\
|
||||
.replace('Gross', 'Groß').replace('Bockfliess', 'Bockfließ').replace('Weiss', 'Weiß')\
|
||||
.replace('Preussen', 'Preußen').replace('Schloss', 'Schloß').replace('luss', 'luß')\
|
||||
.replace('Haupstraße', 'Hauptstraße')
|
||||
.replace('Haupstraße', 'Hauptstraße').replace('Russ', 'Ruß').replace('Ross', 'Roß')
|
||||
address = re.sub('([a-z])([0-9])', lambda a: a.group(1) + ' ' + a.group(2), address)
|
||||
if address.startswith('Nr. ') or address.startswith('Nr ') or address.isdigit():
|
||||
address = ort.title() + ' ' + address.split(' ')[-1]
|
||||
elif address.startswith('Ob. '):
|
||||
if address.startswith('Ob. '):
|
||||
address = address.replace('Ob. ', 'Obere ', 1)
|
||||
address = address.replace(' Nr. ', ' ')
|
||||
address = re.sub(r'([^0-9]+?)( [0-9])',
|
||||
lambda a: STREET_NAMES.get(a.group(1), a.group(1)) + a.group(2), address)
|
||||
address = re.sub(r'([^0-9]+?)( [0-9])', lambda a: fix_street_name(a.group(1)) + a.group(2), address)
|
||||
address = re.sub(r'\s+', ' ', address).strip()
|
||||
if address_old != address:
|
||||
convert(mgnr, 'Adresse', address_old, address)
|
||||
|
||||
@ -702,21 +807,20 @@ def migrate_members(in_dir: str, out_dir: str) -> None:
|
||||
if kgnr is None:
|
||||
invalid(mgnr, 'KGNr.', ort)
|
||||
elif kgnr not in [kg[0] for gem in GEM_MAP.values() for kg in gem]:
|
||||
glnr = list(GROSSLAGE_MAP.values())[0]
|
||||
print(f'New KG: {lookup_kg_name(kgnr)} ({kgnr}, GL {glnr})')
|
||||
f_kg.row(kgnr, glnr)
|
||||
if 9999 not in GEM_MAP:
|
||||
GEM_MAP[9999] = []
|
||||
GEM_MAP[9999].append((kgnr, 0))
|
||||
glnr = guess_glnr(kgnr)
|
||||
if glnr:
|
||||
new('KG', kgnr, lookup_kg_name(kgnr), f'GL {glnr}')
|
||||
f_kg.row(kgnr, glnr)
|
||||
if 9999 not in GEM_MAP:
|
||||
GEM_MAP[9999] = []
|
||||
GEM_MAP[9999].append((kgnr, 0))
|
||||
else:
|
||||
kgnr = None
|
||||
|
||||
if postal_dest is None:
|
||||
invalid(mgnr, 'PLZ', None)
|
||||
continue
|
||||
|
||||
if active and kgnr is None:
|
||||
print(m)
|
||||
raise RuntimeError('No default KgNr. set')
|
||||
|
||||
pred = m['MGNR-Vorgänger'] if m['MGNR-Vorgänger'] in mgnrs else None
|
||||
f_m.row(
|
||||
mgnr, pred, prefix, given_name, middle_names, family_name, suffix,
|
||||
@ -731,36 +835,67 @@ def migrate_members(in_dir: str, out_dir: str) -> None:
|
||||
phone_3: Optional[str] = m['Mobiltelefon']
|
||||
numbers = []
|
||||
|
||||
if phone_1:
|
||||
phone_1 = normalize_phone_nr(phone_1)
|
||||
if len(phone_1) <= 10 or phone_1[0] != '+':
|
||||
invalid(mgnr, 'Tel.Nr.', m['Telefon'])
|
||||
else:
|
||||
numbers.append(phone_1)
|
||||
if phone_1[4] == '6':
|
||||
f_tel.row(mgnr, len(numbers), 'mobile', phone_1, None)
|
||||
if WG == 'GWK':
|
||||
# Telefax (phone_2) not used
|
||||
numbers = {}
|
||||
if phone_1:
|
||||
pass # TODO GWK phone_1
|
||||
if phone_3:
|
||||
for nr in phone_3.split(','):
|
||||
nr = nr.strip()
|
||||
parts = nr.split(' ')
|
||||
comment = None
|
||||
if parts[-1].startswith('(') and parts[-1].endswith(')'):
|
||||
nr = nr[:nr.rindex(' ')].strip()
|
||||
comment = parts[-1][1:-1].strip()
|
||||
elif parts[-1].isalpha():
|
||||
nr = nr[:nr.rindex(' ')].strip()
|
||||
comment = parts[-1].strip()
|
||||
nr = normalize_phone_nr(nr)
|
||||
mob = nr[4] == '6'
|
||||
numbers[nr] = {'mobile': mob, 'landline': not mob, 'fax': False, 'comment': comment}
|
||||
count = 0
|
||||
for nr, data in numbers.items():
|
||||
if data['mobile']:
|
||||
count += 1
|
||||
f_tel.row(mgnr, count, 'mobile', nr, data['comment'])
|
||||
if data['landline']:
|
||||
count += 1
|
||||
f_tel.row(mgnr, count, 'landline', nr, data['comment'])
|
||||
if data['fax']:
|
||||
count += 1
|
||||
f_tel.row(mgnr, count, 'fax', nr, data['comment'])
|
||||
else:
|
||||
if phone_1:
|
||||
phone_1 = normalize_phone_nr(phone_1)
|
||||
if len(phone_1) <= 10 or phone_1[0] != '+':
|
||||
invalid(mgnr, 'Tel.Nr.', m['Telefon'])
|
||||
else:
|
||||
f_tel.row(mgnr, len(numbers), 'landline', phone_1, None)
|
||||
if phone_2:
|
||||
phone_2 = normalize_phone_nr(phone_2)
|
||||
if len(phone_2) <= 8 or phone_2[0] != '+':
|
||||
invalid(mgnr, 'Fax.Nr.', m['Telefax'])
|
||||
else:
|
||||
numbers.append(phone_2)
|
||||
if phone_2[4] == '6':
|
||||
f_tel.row(mgnr, len(numbers), 'mobile', phone_2, None)
|
||||
numbers.append(phone_1)
|
||||
if phone_1[4] == '6':
|
||||
f_tel.row(mgnr, len(numbers), 'mobile', phone_1, None)
|
||||
else:
|
||||
f_tel.row(mgnr, len(numbers), 'landline', phone_1, None)
|
||||
if phone_2:
|
||||
phone_2 = normalize_phone_nr(phone_2)
|
||||
if len(phone_2) <= 8 or phone_2[0] != '+':
|
||||
invalid(mgnr, 'Fax.Nr.', m['Telefax'])
|
||||
else:
|
||||
f_tel.row(mgnr, len(numbers), 'fax', phone_2, None)
|
||||
if phone_3:
|
||||
phone_3 = normalize_phone_nr(phone_3)
|
||||
if len(phone_3) <= 10 or phone_3[0] != '+':
|
||||
invalid(mgnr, 'Tel.Nr.', m['Mobiltelefon'])
|
||||
elif phone_3 not in numbers:
|
||||
numbers.append(phone_3)
|
||||
if phone_3[4] == '6':
|
||||
f_tel.row(mgnr, len(numbers), 'mobile', phone_3, None)
|
||||
else:
|
||||
f_tel.row(mgnr, len(numbers), 'landline', phone_3, None)
|
||||
numbers.append(phone_2)
|
||||
if phone_2[4] == '6':
|
||||
f_tel.row(mgnr, len(numbers), 'mobile', phone_2, None)
|
||||
else:
|
||||
f_tel.row(mgnr, len(numbers), 'fax', phone_2, None)
|
||||
if phone_3:
|
||||
phone_3 = normalize_phone_nr(phone_3)
|
||||
if len(phone_3) <= 10 or phone_3[0] != '+':
|
||||
invalid(mgnr, 'Tel.Nr.', m['Mobiltelefon'])
|
||||
elif phone_3 not in numbers:
|
||||
numbers.append(phone_3)
|
||||
if phone_3[4] == '6':
|
||||
f_tel.row(mgnr, len(numbers), 'mobile', phone_3, None)
|
||||
else:
|
||||
f_tel.row(mgnr, len(numbers), 'landline', phone_3, None)
|
||||
|
||||
MEMBER_MAP[mgnr] = {
|
||||
'default_kgnr': kgnr
|
||||
@ -862,8 +997,14 @@ def migrate_area_commitments(in_dir: str, out_dir: str) -> None:
|
||||
text = re.sub(r'([0-9]+(, |$)){3,}', lambda m: replace_nrs(m, ', '), text)
|
||||
return text
|
||||
|
||||
reeds: Dict[int, Dict[int, str]] = {k: {r: n
|
||||
for rk, r, n in REED_MAP.values() if rk == k}
|
||||
for k in set([k for k, _, _ in REED_MAP.values()])}
|
||||
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}/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',
|
||||
'year_from', 'year_to', 'comment')
|
||||
f_attr.header('fbnr', 'attrid')
|
||||
@ -875,28 +1016,59 @@ def migrate_area_commitments(in_dir: str, out_dir: str) -> None:
|
||||
fbnr: int = fb['FBNR']
|
||||
mgnr: int = fb['MGNR']
|
||||
gem = GEM_MAP[fb['GNR']]
|
||||
kgnr = gem[0][0]
|
||||
kgnrs = [kgnr for kgnr, gkz in gem]
|
||||
rnr = fb['RNR']
|
||||
rd_kgnr, rdnr, _ = REED_MAP.get(rnr, (None, None, None)) if rnr else (None, None, None)
|
||||
if mgnr not in MEMBER_MAP:
|
||||
continue
|
||||
|
||||
kgnr = None
|
||||
if rd_kgnr is None:
|
||||
kgnr = kgnrs[0]
|
||||
elif rd_kgnr in kgnrs:
|
||||
kgnr = rd_kgnr
|
||||
elif (kgnrs[0], rnr) in new_reeds:
|
||||
kgnr = kgnrs[0]
|
||||
rdnr = new_reeds[(kgnr, rnr)]
|
||||
else:
|
||||
rname = lookup_rnr_name(rnr)
|
||||
for k in kgnrs:
|
||||
if k not in reeds:
|
||||
continue
|
||||
try:
|
||||
pos = list(reeds[k].values()).index(rname)
|
||||
r = list(reeds[k].keys())[pos]
|
||||
kgnr = k
|
||||
rdnr = r
|
||||
new_reeds[(kgnr, rnr)] = rdnr
|
||||
break
|
||||
except ValueError:
|
||||
continue
|
||||
if kgnr is None:
|
||||
kgnr = kgnrs[0]
|
||||
rdnr = max([r for _, r, _ in REED_MAP.values() if k == kgnr] +
|
||||
[r for (k, _), r in new_reeds.items() if k == kgnr]) + 1
|
||||
f_rd.row(kgnr, rdnr, rname)
|
||||
new_reeds[(kgnr, rnr)] = rdnr
|
||||
new('Reed', (kgnr, rdnr), rname)
|
||||
|
||||
area = int(fb['Flaeche'])
|
||||
if WG == 'MATZEN':
|
||||
gstnrs = parse_gstnrs(parz, kgnr, fb['MGNR'])
|
||||
else:
|
||||
# TODO GstNrs GWK
|
||||
# TODO GWK GstNrs
|
||||
gstnrs = []
|
||||
comment, gstnr = None, None
|
||||
if parz is None or parz == '0000':
|
||||
invalid(mgnr, 'GstNr.', f'{kgnr or 0:05}-{parz}')
|
||||
invalid(mgnr, 'GstNr.', f'{lookup_kg_name(kgnr)} {kgnr or 0:05}-{parz}')
|
||||
gstnrs = []
|
||||
gstnr = '-'
|
||||
if len(gstnrs) == 0:
|
||||
comment = f'KG {kgnr:05}: {parz}'
|
||||
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)
|
||||
|
||||
rdnr = REED_MAP.get(fb['RNR'], (None, None))[1] if fb['RNR'] 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,
|
||||
kgnr, gstnr, rdnr, fb['Von'], to, comment)
|
||||
@ -931,12 +1103,18 @@ def fix_deliveries(deliveries: Iterable[Dict[str, Any]]) -> Iterable[Tuple[str,
|
||||
|
||||
lsnrs = {d[1] for d in deliveries}
|
||||
|
||||
for lnr, lsnr, date, zwstnr, mgnr in deliveries:
|
||||
for lnr, lsnr, date, zwstid, mgnr in deliveries:
|
||||
if len(lsnr) < 8:
|
||||
continue
|
||||
if lsnr.startswith('22'):
|
||||
lsnr = '20' + lsnr[2:]
|
||||
lsdate = datetime.date(int(lsnr[:4]), int(lsnr[4:6]), int(lsnr[6:8])) if not lsnr.startswith('9') \
|
||||
else datetime.date(1900 + int(lsnr[:2]), int(lsnr[2:4]), int(lsnr[4:6]))
|
||||
|
||||
lsnr_zwstid = lsnr[8]
|
||||
if lsnr_zwstid != zwstid and lsnr_zwstid in BRANCH_MAP.values():
|
||||
zwstid = lsnr_zwstid
|
||||
|
||||
if len(lsnr) == 12:
|
||||
if date != lsdate:
|
||||
if date.year == lsdate.year:
|
||||
@ -948,8 +1126,8 @@ def fix_deliveries(deliveries: Iterable[Dict[str, Any]]) -> Iterable[Tuple[str,
|
||||
else:
|
||||
date = datetime.date(lsdate.year, date.month, date.day)
|
||||
|
||||
if zwstnr not in last_dates or not date < last_dates[zwstnr]:
|
||||
last_dates[zwstnr] = date
|
||||
if zwstid not in last_dates or not date < last_dates[zwstid]:
|
||||
last_dates[zwstid] = date
|
||||
add(lsnr, lnr, date, unique=True)
|
||||
else:
|
||||
add(lsnr[:12], lnr, date)
|
||||
@ -977,6 +1155,7 @@ def migrate_deliveries(in_dir: str, out_dir: str) -> None:
|
||||
deliveries = list(utils.csv_parse_dict(f'{in_dir}/TLieferungen.csv'))
|
||||
delivery_dict = {d['LINR']: d for d in deliveries}
|
||||
fixed = fix_deliveries(deliveries)
|
||||
updated_varieties = {}
|
||||
|
||||
with utils.csv_open(f'{out_dir}/delivery.csv') as f_delivery, \
|
||||
utils.csv_open(f'{out_dir}/delivery_part.csv') as f_part, \
|
||||
@ -1002,13 +1181,20 @@ def migrate_deliveries(in_dir: str, out_dir: str) -> None:
|
||||
s['nr'] += 1
|
||||
snr = s['nr']
|
||||
|
||||
mgnr = delivery_dict[linrs[0]]['MGNR']
|
||||
znr = delivery_dict[linrs[0]]['ZNR']
|
||||
if znr not in branches:
|
||||
branches[znr] = {}
|
||||
if date not in branches[znr]:
|
||||
branches[znr][date] = 0
|
||||
branches[znr][date] += 1
|
||||
lnr = branches[znr][date]
|
||||
|
||||
zwstid = lsnr[8]
|
||||
if zwstid not in branches:
|
||||
branches[zwstid] = {}
|
||||
if date not in branches[zwstid]:
|
||||
branches[zwstid][date] = 0
|
||||
branches[zwstid][date] += 1
|
||||
lnr = branches[zwstid][date]
|
||||
|
||||
if BRANCH_MAP[znr] != zwstid:
|
||||
if zwstid not in BRANCH_MAP.values():
|
||||
zwstid = BRANCH_MAP[znr]
|
||||
|
||||
comments = []
|
||||
attributes = set()
|
||||
@ -1044,7 +1230,10 @@ def migrate_deliveries(in_dir: str, out_dir: str) -> None:
|
||||
attributes.remove('W')
|
||||
|
||||
if d['SNR'] != sortid:
|
||||
print(f'{d["SNR"]}/{d["SANR"]} -> {sortid}/{attributes}')
|
||||
line = f'{d["SNR"]}/{d["SANR"]} -> {sortid}/{",".join(list(attributes)) or None}'
|
||||
if line not in updated_varieties:
|
||||
updated_varieties[line] = 0
|
||||
updated_varieties[line] += 1
|
||||
|
||||
qualid = QUAL_MAP[d['QSNR']]
|
||||
kgnr, rdnr = None, None
|
||||
@ -1053,14 +1242,14 @@ def migrate_deliveries(in_dir: str, out_dir: str) -> None:
|
||||
if len(gem) == 1:
|
||||
kgnr = gem[0][0]
|
||||
if d['RNR']:
|
||||
kgnr, rdnr = REED_MAP[d['RNR']]
|
||||
kgnr, rdnr, _ = REED_MAP[d['RNR']]
|
||||
if kgnr is None:
|
||||
m = MEMBER_MAP[d['MGNR']]
|
||||
m = MEMBER_MAP[mgnr]
|
||||
kgnr = m['default_kgnr']
|
||||
if kgnr is None:
|
||||
warning_delivery(lsnr, d['MGNR'], 'KGNr.', None)
|
||||
pass
|
||||
elif kgnr not in [kg[0] for gem in GEM_MAP.values() for kg in gem]:
|
||||
warning_delivery(lsnr, d['MGNR'], 'KGNr.', kgnr)
|
||||
warning_delivery(lsnr, mgnr, 'KGNr.', kgnr)
|
||||
kgnr = None
|
||||
|
||||
hkid = lookup_hkid(kgnr, qualid)
|
||||
@ -1096,8 +1285,10 @@ def migrate_deliveries(in_dir: str, out_dir: str) -> None:
|
||||
)
|
||||
for attrid in attributes:
|
||||
f_attr.row(date.year, snr, dpnr, attrid)
|
||||
f_delivery.row(date.year, snr, date, d['Uhrzeit'], BRANCH_MAP[d['ZNR']], lnr, lsnr, d['MGNR'],
|
||||
f_delivery.row(date.year, snr, date, d['Uhrzeit'], zwstid, lnr, lsnr, mgnr,
|
||||
'; '.join(comments) or None)
|
||||
for k, v in updated_varieties.items():
|
||||
print(k + (f' ({v} times)' if v > 1 else ''))
|
||||
|
||||
with utils.csv_open(f'{out_dir}/delivery_part_modifier.csv') as f_part_mod:
|
||||
f_part_mod.header('year', 'did', 'dpnr', 'modid')
|
||||
@ -1116,7 +1307,7 @@ def migrate_deliveries(in_dir: str, out_dir: str) -> None:
|
||||
for m in modifiers.values():
|
||||
abs_v = int(m['AZAS'] * pow(10, s['precision'])) if m['AZAS'] is not None else None
|
||||
f_mod.row(y, m['id'], m['Bezeichnung'], abs_v, m['AZASProzent'],
|
||||
m.get('Standard', None), m['Schnellauswahl'])
|
||||
m.get('Standard', False), m['Schnellauswahl'])
|
||||
|
||||
|
||||
def migrate_payments(in_dir: str, out_dir: str) -> None:
|
||||
|
Reference in New Issue
Block a user