From 393d00d631bd63925282e483b6b5cdd89d697e65 Mon Sep 17 00:00:00 2001 From: dfuhrmann3 Date: Wed, 29 Jul 2026 11:51:25 +0200 Subject: [PATCH] =?UTF-8?q?Dateiname=20ge=C3=A4ndert:=20Kundenname=20auf?= =?UTF-8?q?=2015=20Zeichen=20limitiert=20und=20Datum=20durch=20Bearbeitern?= =?UTF-8?q?ummer=20ersetzt.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5 --- invoice_logic.py | 34 ++++++++++++++++++++++++++++------ main.py | 5 +++-- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/invoice_logic.py b/invoice_logic.py index 99b6e47..b00d886 100644 --- a/invoice_logic.py +++ b/invoice_logic.py @@ -458,14 +458,36 @@ def sanitize_filename_part(value): return s.strip("-_") -def build_export_basename(invoice_number, recipient_name, invoice_date): - """Dateiname-Basis fuer die Exporte: '__'. - Leere Teile werden weggelassen (kein '__'); ist alles leer, bleibt 'Rechnung'.""" - date_norm = parse_to_strict_xml_date(invoice_date) or str(invoice_date or "").strip() +# Maximale Laenge des Empfaengernamens im Dateinamen - lange Kundennamen wuerden ihn sonst +# unhandlich machen. +EXPORT_RECIPIENT_MAX_LEN = 15 + +# Bearbeiter-Kopfzeile hat die Form ' / ', z.B. 'Ulrika Grossmann / 5634'. +_BEARBEITER_NUMBER_PATTERN = re.compile(r"/\s*([A-Za-z0-9][A-Za-z0-9\-.]*)\s*$") + + +def extract_bearbeiter_number(bearbeiter): + """Holt die Nummer hinter dem Bearbeiternamen ('Ulrika Grossmann / 5634' -> '5634'). + Steht im Feld nur eine Zahl, wird diese direkt genommen; ein Name ohne Nummer ergibt "", + damit kein Personenname im Dateinamen landet.""" + s = str(bearbeiter or "").strip() + if not s: + return "" + m = _BEARBEITER_NUMBER_PATTERN.search(s) + if m: + return m.group(1) + return s if s.isdigit() else "" + + +def build_export_basename(invoice_number, recipient_name, bearbeiter): + """Dateiname-Basis fuer die Exporte: '__'. + Der Empfaenger wird auf EXPORT_RECIPIENT_MAX_LEN Zeichen gekuerzt. Leere Teile werden + weggelassen (kein '__'); ist alles leer, bleibt 'Rechnung'.""" + recipient = sanitize_filename_part(recipient_name)[:EXPORT_RECIPIENT_MAX_LEN].strip("-_") parts = [ sanitize_filename_part(invoice_number), - sanitize_filename_part(recipient_name), - sanitize_filename_part(date_norm), + recipient, + sanitize_filename_part(extract_bearbeiter_number(bearbeiter)), ] base = "_".join(p for p in parts if p) return base or "Rechnung" diff --git a/main.py b/main.py index 0af8fc5..79f5e3b 100644 --- a/main.py +++ b/main.py @@ -602,8 +602,9 @@ with col2: "fehlt. Eine echte E-Mail-Adresse des Empfängers ist deutlich besser " "(sonst bemängeln strenge Validatoren PEPPOL-EN16931-R010).") - # Dateiname: __ (dateisicher aufbereitet). - export_basename = build_export_basename(inv_num, r_name, inv_date) + # Dateiname: __ + # (dateisicher aufbereitet). + export_basename = build_export_basename(inv_num, r_name, bearbeiter) # Ein-Klick-Export: die Exportdatei wird vorab erzeugt und direkt in den Download-Button # gelegt - ein Klick startet also sofort den Download, ohne separaten Zwischen-Button.