Dateiname geändert: Kundenname auf 15 Zeichen limitiert und Datum durch Bearbeiternummer ersetzt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
dfuhrmann3 2026-07-29 11:51:25 +02:00
parent d217893dcb
commit 393d00d631
2 changed files with 31 additions and 8 deletions

View File

@ -458,14 +458,36 @@ def sanitize_filename_part(value):
return s.strip("-_") return s.strip("-_")
def build_export_basename(invoice_number, recipient_name, invoice_date): # Maximale Laenge des Empfaengernamens im Dateinamen - lange Kundennamen wuerden ihn sonst
"""Dateiname-Basis fuer die Exporte: '<Rechnungsnummer>_<Empfaenger>_<Rechnungsdatum>'. # unhandlich machen.
Leere Teile werden weggelassen (kein '__'); ist alles leer, bleibt 'Rechnung'.""" EXPORT_RECIPIENT_MAX_LEN = 15
date_norm = parse_to_strict_xml_date(invoice_date) or str(invoice_date or "").strip()
# Bearbeiter-Kopfzeile hat die Form '<Name> / <Nummer>', 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: '<Rechnungsnummer>_<Empfaenger>_<Bearbeiternummer>'.
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 = [ parts = [
sanitize_filename_part(invoice_number), sanitize_filename_part(invoice_number),
sanitize_filename_part(recipient_name), recipient,
sanitize_filename_part(date_norm), sanitize_filename_part(extract_bearbeiter_number(bearbeiter)),
] ]
base = "_".join(p for p in parts if p) base = "_".join(p for p in parts if p)
return base or "Rechnung" return base or "Rechnung"

View File

@ -602,8 +602,9 @@ with col2:
"fehlt. Eine echte E-Mail-Adresse des Empfängers ist deutlich besser " "fehlt. Eine echte E-Mail-Adresse des Empfängers ist deutlich besser "
"(sonst bemängeln strenge Validatoren PEPPOL-EN16931-R010).") "(sonst bemängeln strenge Validatoren PEPPOL-EN16931-R010).")
# Dateiname: <Rechnungsnummer>_<Empfaenger>_<Rechnungsdatum> (dateisicher aufbereitet). # Dateiname: <Rechnungsnummer>_<Empfaenger, max. 15 Zeichen>_<Bearbeiternummer>
export_basename = build_export_basename(inv_num, r_name, inv_date) # (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 # 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. # gelegt - ein Klick startet also sofort den Download, ohne separaten Zwischen-Button.