Update client parameters and change Ustid to UstIdNr

This commit is contained in:
2023-08-17 16:48:31 +02:00
parent a506c225aa
commit f888c02c8c
2 changed files with 51 additions and 42 deletions

View File

@ -298,7 +298,7 @@ CREATE TABLE member (
zwstid TEXT CHECK (NOT active OR zwstid IS NOT NULL), zwstid TEXT CHECK (NOT active OR zwstid IS NOT NULL),
lfbis_nr TEXT CHECK (lfbis_nr REGEXP '^[0-9]{7}$') DEFAULT 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, 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, volllieferant INTEGER NOT NULL CHECK (volllieferant IN (TRUE, FALSE)) DEFAULT FALSE,
buchführend INTEGER NOT NULL CHECK (buchführend 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, funktionär INTEGER NOT NULL CHECK (funktionär IN (TRUE, FALSE)) DEFAULT FALSE,

View File

@ -18,7 +18,7 @@ DB_CNX: Optional[sqlite3.Connection] = None
QUIET: bool = False QUIET: bool = False
WG: Optional[str] = None 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})?') 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}') 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,}') 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]) 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 # http://www.pruefziffernberechnung.de/U/USt-IdNr.shtml
if not nr.startswith('ATU') or len(nr) != 11 or not nr[3:].isdigit(): if not nr.startswith('ATU') or len(nr) != 11 or not nr[3:].isdigit():
return False return False
@ -621,7 +621,7 @@ def migrate_members(in_dir: str, out_dir: str) -> None:
f_m.header( f_m.header(
'mgnr', 'predecessor_mgnr', 'prefix', 'given_name', 'middle_names', 'family_name', 'suffix', 'mgnr', 'predecessor_mgnr', 'prefix', 'given_name', 'middle_names', 'family_name', 'suffix',
'birthday', 'entry_date', 'exit_date', 'business_shares', 'accounting_nr', 'zwstid', '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', 'country', 'postal_dest', 'address',
'email', 'default_kgnr', 'comment') 'email', 'default_kgnr', 'comment')
f_mba.header('mgnr', 'name', 'country', 'postal_dest', 'address') 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) invalid(mgnr, 'BetriebsNr.', bnr)
bnr = None bnr = None
ustid: Optional[str] = m['UID'] ustid_nr: Optional[str] = m['UID']
if ustid is not None: if ustid_nr is not None:
ustid = ustid.replace(' ', '') ustid_nr = ustid_nr.replace(' ', '')
if len(ustid) == 8 and ustid.isdigit(): if len(ustid_nr) == 8 and ustid_nr.isdigit():
ustid = 'ATU' + ustid ustid_nr = 'ATU' + ustid_nr
elif not USTID_RE.fullmatch(ustid): elif not USTID_NR_RE.fullmatch(ustid_nr):
invalid(mgnr, 'UID', ustid) invalid(mgnr, 'UID', ustid_nr)
ustid = None ustid_nr = None
if ustid and not check_ustid_at(ustid): if ustid_nr and not check_ustid_nr_at(ustid_nr):
if ustid == 'ATU11111111': if ustid_nr == 'ATU11111111':
warning(mgnr, 'UID', ustid) warning(mgnr, 'UID', ustid_nr)
else: else:
invalid(mgnr, 'UID', ustid) invalid(mgnr, 'UID', ustid_nr)
ustid = None ustid_nr = None
iban: Optional[str] = m['IBAN'] iban: Optional[str] = m['IBAN']
bic: Optional[str] = m['BIC'] bic: Optional[str] = m['BIC']
@ -850,7 +850,7 @@ def migrate_members(in_dir: str, out_dir: str) -> None:
f_m.row( f_m.row(
mgnr, pred, prefix, given_name, middle_names, family_name, suffix, mgnr, pred, prefix, given_name, middle_names, family_name, suffix,
m['Geburtsjahr'], m['Eintrittsdatum'], m['Austrittsdatum'], m['Geschäftsanteile1'] or 0, 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, m['Volllieferant'] or False, m['Buchführend'] or False, funktionaer, active,
iban, bic, AUSTRIA, postal_dest, address or '-', email, kgnr, m['Anmerkung'] 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: 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')} 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') name = params['MANDANTENNAME1'].title().replace('F.', 'für').replace('U.', 'und').replace(' Im ', 'im')
shortened = name.replace(' für ', ' f. ').replace(' und ', ' u. ') shortened = name.replace(' für ', ' f. ').replace(' und ', ' u. ').replace(' im ', ' i. ')
suffix = params['MANDANTENNAME2'].lower().replace(' ', '').replace('.', '') suffix = params['MANDANTENNAME2'].lower().replace(' ', '').replace('.', '')
suffixes = { types = {
'reggenmbh': 'reg. Gen.m.b.H.' '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]] = { new_params: Dict[str, Optional[str]] = {
'NAME_TOKEN': None, 'CLIENT_NAME_TOKEN': tokens[0],
'NAME_SHORT': None, 'CLIENT_NAME_SHORT': tokens[1],
'NAME_SHORTENED': shortened, 'CLIENT_NAME_SHORTENED': shortened,
'NAME': name, 'CLIENT_NAME': name,
'NAME_SUFFIX': suffixes[suffix], 'CLIENT_NAME_SUFFIX': None,
'PLZ': params['MANDANTENPLZ'], 'CLIENT_NAME_TYPE': types[suffix],
'ORT': params['MANDANTENORT'], 'CLIENT_PLZ': params['MANDANTENPLZ'],
'ADDRESS': params['MANDANTENSTRASSE'], '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), 'DOCUMENT_SENDER': params.get('ABSENDERTEXT2', None),
'IBAN': None, 'DELIVERY_NOTE_TEXT': params.get('LIEFERSCHEINTEXT', None).replace(' daß ', ' dass '),
'BIC': None,
'USTID': params['MANDANTENUID'].replace(' ', ''),
'LFBISNR': params['MANDANTENBETRIEBSNUMMER'],
'PHONE': params['MANDANTENTELEFON'],
'FAX': params['MANDANTENTELEFAX'],
'EMAIL': params['MANDANTENEMAIL'],
'WEBSITE': params.get('MANDANTENHOMEPAGE', None),
} }
with utils.csv_open(f'{out_dir}/client_parameter.csv') as f: with utils.csv_open(f'{out_dir}/client_parameter.csv') as f: