From f888c02c8cfc038906f40babfe2d2502a4cfa903 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Thu, 17 Aug 2023 16:48:31 +0200 Subject: [PATCH] Update client parameters and change Ustid to UstIdNr --- sql/v01/10.create.sql | 12 +++---- wgmaster/migrate.py | 81 ++++++++++++++++++++++++------------------- 2 files changed, 51 insertions(+), 42 deletions(-) diff --git a/sql/v01/10.create.sql b/sql/v01/10.create.sql index dc8368c..3122531 100644 --- a/sql/v01/10.create.sql +++ b/sql/v01/10.create.sql @@ -297,12 +297,12 @@ CREATE TABLE member ( accounting_nr TEXT DEFAULT NULL, zwstid TEXT CHECK (NOT active OR zwstid IS NOT NULL), - lfbis_nr TEXT CHECK (lfbis_nr REGEXP '^[0-9]{7}$') DEFAULT NULL, - ustid TEXT CHECK (ustid REGEXP '^[A-Z]{2}[A-Z0-9]{2,12}$') DEFAULT NULL, - volllieferant INTEGER NOT NULL CHECK (volllieferant IN (TRUE, FALSE)) DEFAULT FALSE, - buchführend INTEGER NOT NULL CHECK (buchführend IN (TRUE, FALSE)) DEFAULT FALSE, - funktionär INTEGER NOT NULL CHECK (funktionär IN (TRUE, FALSE)) DEFAULT FALSE, - active INTEGER NOT NULL CHECK (active IN (TRUE, FALSE)) DEFAULT TRUE, + lfbis_nr TEXT CHECK (lfbis_nr REGEXP '^[0-9]{7}$') DEFAULT NULL, + ustid_nr TEXT CHECK (ustid_nr REGEXP '^[A-Z]{2}[A-Z0-9]{2,12}$') DEFAULT NULL, + volllieferant INTEGER NOT NULL CHECK (volllieferant IN (TRUE, FALSE)) DEFAULT FALSE, + buchführend INTEGER NOT NULL CHECK (buchführend IN (TRUE, FALSE)) DEFAULT FALSE, + funktionär INTEGER NOT NULL CHECK (funktionär IN (TRUE, FALSE)) DEFAULT FALSE, + active INTEGER NOT NULL CHECK (active IN (TRUE, FALSE)) DEFAULT TRUE, iban TEXT CHECK (iban REGEXP '^[A-Z]{2}[0-9]{2}[A-Z0-9]{8,30}$') DEFAULT NULL, bic TEXT CHECK (bic REGEXP '^[A-Z0-9]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$') DEFAULT NULL, diff --git a/wgmaster/migrate.py b/wgmaster/migrate.py index 3cf821c..852a40e 100755 --- a/wgmaster/migrate.py +++ b/wgmaster/migrate.py @@ -18,7 +18,7 @@ DB_CNX: Optional[sqlite3.Connection] = None QUIET: bool = False WG: Optional[str] = None -USTID_RE = re.compile(r'[A-Z]{2}[A-Z0-9]{2,12}') +USTID_NR_RE = re.compile(r'[A-Z]{2}[A-Z0-9]{2,12}') BIC_RE = re.compile(r'[A-Z0-9]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?') IBAN_RE = re.compile(r'[A-Z]{2}[0-9]{2}[A-Z0-9]{8,30}') EMAIL_RE = re.compile(r'[^@\s]+@([A-Za-z0-9_äöüß-]+\.)+[A-Za-z]{2,}') @@ -193,7 +193,7 @@ def check_lfbis_nr(nr: str) -> bool: return v == int(nr[-1]) -def check_ustid_at(nr: str) -> bool: +def check_ustid_nr_at(nr: str) -> bool: # http://www.pruefziffernberechnung.de/U/USt-IdNr.shtml if not nr.startswith('ATU') or len(nr) != 11 or not nr[3:].isdigit(): return False @@ -621,7 +621,7 @@ def migrate_members(in_dir: str, out_dir: str) -> None: f_m.header( 'mgnr', 'predecessor_mgnr', 'prefix', 'given_name', 'middle_names', 'family_name', 'suffix', 'birthday', 'entry_date', 'exit_date', 'business_shares', 'accounting_nr', 'zwstid', - 'lfbis_nr', 'ustid', 'volllieferant', 'buchführend', 'funktionär', 'active', 'iban', 'bic', + 'lfbis_nr', 'ustid_nr', 'volllieferant', 'buchführend', 'funktionär', 'active', 'iban', 'bic', 'country', 'postal_dest', 'address', 'email', 'default_kgnr', 'comment') f_mba.header('mgnr', 'name', 'country', 'postal_dest', 'address') @@ -718,20 +718,20 @@ def migrate_members(in_dir: str, out_dir: str) -> None: invalid(mgnr, 'BetriebsNr.', bnr) bnr = None - ustid: Optional[str] = m['UID'] - if ustid is not None: - ustid = ustid.replace(' ', '') - if len(ustid) == 8 and ustid.isdigit(): - ustid = 'ATU' + ustid - elif not USTID_RE.fullmatch(ustid): - invalid(mgnr, 'UID', ustid) - ustid = None - if ustid and not check_ustid_at(ustid): - if ustid == 'ATU11111111': - warning(mgnr, 'UID', ustid) + ustid_nr: Optional[str] = m['UID'] + if ustid_nr is not None: + ustid_nr = ustid_nr.replace(' ', '') + if len(ustid_nr) == 8 and ustid_nr.isdigit(): + ustid_nr = 'ATU' + ustid_nr + elif not USTID_NR_RE.fullmatch(ustid_nr): + invalid(mgnr, 'UID', ustid_nr) + ustid_nr = None + if ustid_nr and not check_ustid_nr_at(ustid_nr): + if ustid_nr == 'ATU11111111': + warning(mgnr, 'UID', ustid_nr) else: - invalid(mgnr, 'UID', ustid) - ustid = None + invalid(mgnr, 'UID', ustid_nr) + ustid_nr = None iban: Optional[str] = m['IBAN'] bic: Optional[str] = m['BIC'] @@ -850,7 +850,7 @@ def migrate_members(in_dir: str, out_dir: str) -> None: f_m.row( mgnr, pred, prefix, given_name, middle_names, family_name, suffix, m['Geburtsjahr'], m['Eintrittsdatum'], m['Austrittsdatum'], m['Geschäftsanteile1'] or 0, - m['BHKontonummer'], zwstid, bnr, ustid, + m['BHKontonummer'], zwstid, bnr, ustid_nr, m['Volllieferant'] or False, m['Buchführend'] or False, funktionaer, active, iban, bic, AUSTRIA, postal_dest, address or '-', email, kgnr, m['Anmerkung'] ) @@ -1557,31 +1557,40 @@ def migrate_payments(in_dir: str, out_dir: str) -> None: def migrate_parameters(in_dir: str, out_dir: str) -> None: params: Dict[str, str] = {p['Bezeichnung']: p['Wert'] for p in utils.csv_parse_dict(f'{in_dir}/TParameter.csv')} - name = params['MANDANTENNAME1'].title().replace('F.', 'für').replace('U.', 'und') - shortened = name.replace(' für ', ' f. ').replace(' und ', ' u. ') + name = params['MANDANTENNAME1'].title().replace('F.', 'für').replace('U.', 'und').replace(' Im ', 'im') + shortened = name.replace(' für ', ' f. ').replace(' und ', ' u. ').replace(' im ', ' i. ') suffix = params['MANDANTENNAME2'].lower().replace(' ', '').replace('.', '') - suffixes = { + types = { 'reggenmbh': 'reg. Gen.m.b.H.' } + tokens = { + 'MATZEN': ('WGM', 'WG Matzen'), + 'GWK': ('GWK', 'GWK') + }.get(WG, (None, None)) + ort = params['MANDANTENORT'].title() new_params: Dict[str, Optional[str]] = { - 'NAME_TOKEN': None, - 'NAME_SHORT': None, - 'NAME_SHORTENED': shortened, - 'NAME': name, - 'NAME_SUFFIX': suffixes[suffix], - 'PLZ': params['MANDANTENPLZ'], - 'ORT': params['MANDANTENORT'], - 'ADDRESS': params['MANDANTENSTRASSE'], + 'CLIENT_NAME_TOKEN': tokens[0], + 'CLIENT_NAME_SHORT': tokens[1], + 'CLIENT_NAME_SHORTENED': shortened, + 'CLIENT_NAME': name, + 'CLIENT_NAME_SUFFIX': None, + 'CLIENT_NAME_TYPE': types[suffix], + 'CLIENT_PLZ': params['MANDANTENPLZ'], + 'CLIENT_ORT': ort, + 'CLIENT_ADDRESS': params['MANDANTENSTRASSE'], + 'CLIENT_IBAN': None, + 'CLIENT_BIC': None, + 'CLIENT_USTIDNR': params['MANDANTENUID'].replace(' ', ''), + 'CLIENT_LFBISNR': params['MANDANTENBETRIEBSNUMMER'], + 'CLIENT_PHONE': normalize_phone_nr(params['MANDANTENTELEFON'], ort), + 'CLIENT_FAX': normalize_phone_nr(params['MANDANTENTELEFAX'], ort), + 'CLIENT_EMAIL': params['MANDANTENEMAIL'], + 'CLIENT_WEBSITE': params.get('MANDANTENHOMEPAGE', None), + 'DELIVERY_OBLIGATION': params.get('LIEFERPFLICHT/GA1', None), + 'DELIVERY_RIGHT': params.get('LIEFERRECHT/GA1', None), 'DOCUMENT_SENDER': params.get('ABSENDERTEXT2', None), - 'IBAN': None, - 'BIC': None, - 'USTID': params['MANDANTENUID'].replace(' ', ''), - 'LFBISNR': params['MANDANTENBETRIEBSNUMMER'], - 'PHONE': params['MANDANTENTELEFON'], - 'FAX': params['MANDANTENTELEFAX'], - 'EMAIL': params['MANDANTENEMAIL'], - 'WEBSITE': params.get('MANDANTENHOMEPAGE', None), + 'DELIVERY_NOTE_TEXT': params.get('LIEFERSCHEINTEXT', None).replace(' daß ', ' dass '), } with utils.csv_open(f'{out_dir}/client_parameter.csv') as f: