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:
parent
d217893dcb
commit
393d00d631
|
|
@ -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"
|
||||||
|
|
|
||||||
5
main.py
5
main.py
|
|
@ -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.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue