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
393d00d631
commit
b41554f1f1
|
|
@ -14,13 +14,13 @@ from pydantic import BaseModel, Field
|
||||||
# 2. METADATEN SCHREIBSCHEMA
|
# 2. METADATEN SCHREIBSCHEMA
|
||||||
# ==========================================
|
# ==========================================
|
||||||
class InvoiceMetadata(BaseModel):
|
class InvoiceMetadata(BaseModel):
|
||||||
invoice_number: str = Field(description="Die Rechnungsnummer nach 'Nummer:' (z.B. R26-219)")
|
invoice_number: str = Field(description="Die Rechnungsnummer nach 'Nummer:' (z.B. R00-000)")
|
||||||
invoice_date: str = Field(description="Das Rechnungsdatum nach 'Datum:' im Format YYYY-MM-DD")
|
invoice_date: str = Field(description="Das Rechnungsdatum nach 'Datum:' im Format YYYY-MM-DD")
|
||||||
delivery_date: str = Field(description="Das Lieferdatum nach 'Lieferdatum:' im Format YYYY-MM-DD")
|
delivery_date: str = Field(description="Das Lieferdatum nach 'Lieferdatum:' im Format YYYY-MM-DD")
|
||||||
customer_number: str = Field(default="", description="Kundennummer (BT-46), unter der der Kunde beim Verkäufer geführt wird (z.B. der exakte Wert nach 'Kunden-Nr:'). Falls im Text keine Kundennummer erkennbar ist: leer lassen.")
|
customer_number: str = Field(default="", description="Kundennummer (BT-46), unter der der Kunde beim Verkäufer geführt wird (z.B. der exakte Wert nach 'Kunden-Nr:'). Falls im Text keine Kundennummer erkennbar ist: leer lassen.")
|
||||||
leitweg_id: str = Field(default="", description="Leitweg-ID (BT-10) - NUR bei Rechnungen an Behörden (B2G), z.B. '04011000-1234-56'. Ist im Text keine Leitweg-ID erkennbar: leer lassen (NICHT die Kundennummer hier eintragen).")
|
leitweg_id: str = Field(default="", description="Leitweg-ID (BT-10) - NUR bei Rechnungen an Behörden (B2G), z.B. '04011000-1234-56'. Ist im Text keine Leitweg-ID erkennbar: leer lassen (NICHT die Kundennummer hier eintragen).")
|
||||||
buyer_reference: str = Field(default="", description="Bestellnummer des KÄUFERS für diesen Auftrag (BT-13): der exakte Wert nach 'Ihr Auftrag:' o.ä. (z.B. 05.06.2026-Herr.Knospe). NICHT die Kundennummer (die gehört in customer_number) und NICHT unsere eigene Auftragsbestätigungsnummer (die gehört in order_id). Wenn im Text keine solche Käufer-Bestellnummer erkennbar ist: leer lassen.")
|
buyer_reference: str = Field(default="", description="Bestellnummer des KÄUFERS für diesen Auftrag (BT-13): der exakte Wert nach 'Ihr Auftrag:' o.ä. (z.B. 05.06.2026-Herr.Mustermann). NICHT die Kundennummer (die gehört in customer_number) und NICHT unsere eigene Auftragsbestätigungsnummer (die gehört in order_id). Wenn im Text keine solche Käufer-Bestellnummer erkennbar ist: leer lassen.")
|
||||||
recipient_name: str = Field(description="Vollständige Firma des Kunden/Empfängers (z.B. Stadtwerke Hennigsdorf GmbH)")
|
recipient_name: str = Field(description="Vollständige Firma des Kunden/Empfängers (z.B. Musterfirma GmbH)")
|
||||||
recipient_street: str = Field(description="Straße und Hausnummer des Kunden")
|
recipient_street: str = Field(description="Straße und Hausnummer des Kunden")
|
||||||
recipient_zip: str = Field(description="Postleitzahl (PLZ) des Kunden")
|
recipient_zip: str = Field(description="Postleitzahl (PLZ) des Kunden")
|
||||||
recipient_city: str = Field(description="Stadt des Kunden")
|
recipient_city: str = Field(description="Stadt des Kunden")
|
||||||
|
|
@ -339,7 +339,7 @@ def _address_from_block(block):
|
||||||
def extract_delivery_address(text):
|
def extract_delivery_address(text):
|
||||||
"""Zerlegt den 'Lieferadresse:'-Block (falls vorhanden) in ein Dict mit name/street/zip/city
|
"""Zerlegt den 'Lieferadresse:'-Block (falls vorhanden) in ein Dict mit name/street/zip/city
|
||||||
(BG-15 Lieferadresse). Der Block steht zwischen der 'Lieferadresse:'-Zeile und der ersten
|
(BG-15 Lieferadresse). Der Block steht zwischen der 'Lieferadresse:'-Zeile und der ersten
|
||||||
'RECHNUNG'-Zeile; E-Mail-Zeilen (z.B. bei degewo) werden ignoriert. Gibt None zurueck, wenn
|
'RECHNUNG'-Zeile; E-Mail-Zeilen (bei manchen Kunden vorhanden) werden ignoriert. Gibt None zurueck, wenn
|
||||||
keine Lieferadresse vorhanden ist oder der Block keine 'PLZ Ort'-Zeile enthaelt."""
|
keine Lieferadresse vorhanden ist oder der Block keine 'PLZ Ort'-Zeile enthaelt."""
|
||||||
lines = text.split("\n")
|
lines = text.split("\n")
|
||||||
start = next((i for i, ln in enumerate(lines) if ln.strip().lower().startswith("lieferadresse")), None)
|
start = next((i for i, ln in enumerate(lines) if ln.strip().lower().startswith("lieferadresse")), None)
|
||||||
|
|
@ -462,12 +462,12 @@ def sanitize_filename_part(value):
|
||||||
# unhandlich machen.
|
# unhandlich machen.
|
||||||
EXPORT_RECIPIENT_MAX_LEN = 15
|
EXPORT_RECIPIENT_MAX_LEN = 15
|
||||||
|
|
||||||
# Bearbeiter-Kopfzeile hat die Form '<Name> / <Nummer>', z.B. 'Ulrika Grossmann / 5634'.
|
# Bearbeiter-Kopfzeile hat die Form '<Name> / <Nummer>', z.B. 'Max Mustermann / 1234'.
|
||||||
_BEARBEITER_NUMBER_PATTERN = re.compile(r"/\s*([A-Za-z0-9][A-Za-z0-9\-.]*)\s*$")
|
_BEARBEITER_NUMBER_PATTERN = re.compile(r"/\s*([A-Za-z0-9][A-Za-z0-9\-.]*)\s*$")
|
||||||
|
|
||||||
|
|
||||||
def extract_bearbeiter_number(bearbeiter):
|
def extract_bearbeiter_number(bearbeiter):
|
||||||
"""Holt die Nummer hinter dem Bearbeiternamen ('Ulrika Grossmann / 5634' -> '5634').
|
"""Holt die Nummer hinter dem Bearbeiternamen ('Max Mustermann / 1234' -> '1234').
|
||||||
Steht im Feld nur eine Zahl, wird diese direkt genommen; ein Name ohne Nummer ergibt "",
|
Steht im Feld nur eine Zahl, wird diese direkt genommen; ein Name ohne Nummer ergibt "",
|
||||||
damit kein Personenname im Dateinamen landet."""
|
damit kein Personenname im Dateinamen landet."""
|
||||||
s = str(bearbeiter or "").strip()
|
s = str(bearbeiter or "").strip()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue