From fa977594eb3a72e44c70c1fda598f582832133b1 Mon Sep 17 00:00:00 2001 From: dfuhrmann3 Date: Tue, 7 Jul 2026 10:23:51 +0200 Subject: [PATCH] Test --- main.py | 88 ++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 52 insertions(+), 36 deletions(-) diff --git a/main.py b/main.py index 7ae6f23..659855d 100644 --- a/main.py +++ b/main.py @@ -94,6 +94,22 @@ class InvoiceMetadata(BaseModel): # Zentrale Geschäftskonstanten - hier zentral pflegen statt an mehreren Stellen im Code. VERKAEUFER_IBAN = "DE06120700240456207000" +# Verkäufer-Stammdaten (SCITECH). Werte bleiben fest hinterlegt, sind aber an EINER Stelle +# gepflegt und werden in beiden XML-Generatoren sowie in der UI referenziert - so bleibt bei +# einer Adress-/Kontaktänderung nichts inkonsistent zurück. +VERKAEUFER = { + "name": "scitech it solutions GmbH", # BT-27 (Firmenname) + "email": "office@scitech-gmbh.de", # BT-34 (elektronische Adresse) / Kontakt + "phone": "+49 3302 4940537", # BT-42 (Kontakttelefon) + "contact_name": "Geschäftsführung", # BG-6 (Ansprechpartner) + "street": "Hermann-Schumann-Str. 4", # BT-35 + "zip": "16761", # BT-38 + "city": "Hennigsdorf", # BT-37 + "country": "DE", # BT-40 + "vat_id": "DE218436692", # BT-31 (Umsatzsteuer-ID) + "register_id": "HRB 6058 NP", # BT-30 (Handelsregisternummer, NICHT die USt-ID) +} + def berechne_faelligkeit(invoice_date_str, term_days): """Fälligkeitsdatum = Rechnungsdatum + term_days. Gibt 'YYYY-MM-DD' zurück, oder leer, @@ -281,29 +297,29 @@ def generate_compliant_xrechnung(data): # --- SENDER (SCITECH) --- supplier = ET.SubElement(root, f"{{{CAC}}}AccountingSupplierParty") party_supp = ET.SubElement(supplier, f"{{{CAC}}}Party") - ET.SubElement(party_supp, f"{{{CBC}}}EndpointID", {"schemeID": "EM"}).text = "office@scitech-gmbh.de" - + ET.SubElement(party_supp, f"{{{CBC}}}EndpointID", {"schemeID": "EM"}).text = VERKAEUFER["email"] + addr_supp = ET.SubElement(party_supp, f"{{{CAC}}}PostalAddress") - ET.SubElement(addr_supp, f"{{{CBC}}}StreetName").text = "Hermann-Schumann-Str. 4" - ET.SubElement(addr_supp, f"{{{CBC}}}CityName").text = "Hennigsdorf" - ET.SubElement(addr_supp, f"{{{CBC}}}PostalZone").text = "16761" + ET.SubElement(addr_supp, f"{{{CBC}}}StreetName").text = VERKAEUFER["street"] + ET.SubElement(addr_supp, f"{{{CBC}}}CityName").text = VERKAEUFER["city"] + ET.SubElement(addr_supp, f"{{{CBC}}}PostalZone").text = VERKAEUFER["zip"] country_supp = ET.SubElement(addr_supp, f"{{{CAC}}}Country") - ET.SubElement(country_supp, f"{{{CBC}}}IdentificationCode").text = "DE" - + ET.SubElement(country_supp, f"{{{CBC}}}IdentificationCode").text = VERKAEUFER["country"] + tax_scheme_supp = ET.SubElement(party_supp, f"{{{CAC}}}PartyTaxScheme") - ET.SubElement(tax_scheme_supp, f"{{{CBC}}}CompanyID").text = "DE218436692" + ET.SubElement(tax_scheme_supp, f"{{{CBC}}}CompanyID").text = VERKAEUFER["vat_id"] scheme_supp = ET.SubElement(tax_scheme_supp, f"{{{CAC}}}TaxScheme") ET.SubElement(scheme_supp, f"{{{CBC}}}ID").text = "VAT" - + legal_supp = ET.SubElement(party_supp, f"{{{CAC}}}PartyLegalEntity") - ET.SubElement(legal_supp, f"{{{CBC}}}RegistrationName").text = "scitech it solutions GmbH" + ET.SubElement(legal_supp, f"{{{CBC}}}RegistrationName").text = VERKAEUFER["name"] # BT-30 Registernummer (Handelsregister) - NICHT identisch mit der Umsatzsteuer-ID (BT-31)! - ET.SubElement(legal_supp, f"{{{CBC}}}CompanyID").text = "HRB 6058 NP" - + ET.SubElement(legal_supp, f"{{{CBC}}}CompanyID").text = VERKAEUFER["register_id"] + contact_supp = ET.SubElement(party_supp, f"{{{CAC}}}Contact") - ET.SubElement(contact_supp, f"{{{CBC}}}Name").text = "Geschäftsführung" - ET.SubElement(contact_supp, f"{{{CBC}}}Telephone").text = "+49 3302 4940537" - ET.SubElement(contact_supp, f"{{{CBC}}}ElectronicMail").text = "office@scitech-gmbh.de" + ET.SubElement(contact_supp, f"{{{CBC}}}Name").text = VERKAEUFER["contact_name"] + ET.SubElement(contact_supp, f"{{{CBC}}}Telephone").text = VERKAEUFER["phone"] + ET.SubElement(contact_supp, f"{{{CBC}}}ElectronicMail").text = VERKAEUFER["email"] # --- Empfänger --- customer = ET.SubElement(root, f"{{{CAC}}}AccountingCustomerParty") @@ -461,35 +477,35 @@ def generate_compliant_zugferd_cii(data): ET.SubElement(header_agree, f"{{{RAM}}}BuyerReference").text = str(data["customer_number"]).strip() supplier_party = ET.SubElement(header_agree, f"{{{RAM}}}SellerTradeParty") - ET.SubElement(supplier_party, f"{{{RAM}}}Name").text = "scitech it solutions GmbH" - + ET.SubElement(supplier_party, f"{{{RAM}}}Name").text = VERKAEUFER["name"] + supp_legal = ET.SubElement(supplier_party, f"{{{RAM}}}SpecifiedLegalOrganization") # BT-30 Registernummer (Handelsregister) - NICHT identisch mit der Umsatzsteuer-ID (BT-31)! # Fest eingetragen, analog zu den übrigen fixen Verkäufer-Stammdaten. - ET.SubElement(supp_legal, f"{{{RAM}}}ID").text = "HRB 6058 NP" + ET.SubElement(supp_legal, f"{{{RAM}}}ID").text = VERKAEUFER["register_id"] # BG-6 SELLER CONTACT (BR-DE-2 Pflicht für XRechnung). Muss laut XSD nach # SpecifiedLegalOrganization und vor PostalTradeAddress stehen. supp_contact = ET.SubElement(supplier_party, f"{{{RAM}}}DefinedTradeContact") - ET.SubElement(supp_contact, f"{{{RAM}}}PersonName").text = "Geschäftsführung" + ET.SubElement(supp_contact, f"{{{RAM}}}PersonName").text = VERKAEUFER["contact_name"] supp_contact_tel = ET.SubElement(supp_contact, f"{{{RAM}}}TelephoneUniversalCommunication") - ET.SubElement(supp_contact_tel, f"{{{RAM}}}CompleteNumber").text = "+49 3302 4940537" + ET.SubElement(supp_contact_tel, f"{{{RAM}}}CompleteNumber").text = VERKAEUFER["phone"] supp_contact_mail = ET.SubElement(supp_contact, f"{{{RAM}}}EmailURIUniversalCommunication") - ET.SubElement(supp_contact_mail, f"{{{RAM}}}URIID").text = "office@scitech-gmbh.de" + ET.SubElement(supp_contact_mail, f"{{{RAM}}}URIID").text = VERKAEUFER["email"] supp_addr = ET.SubElement(supplier_party, f"{{{RAM}}}PostalTradeAddress") - ET.SubElement(supp_addr, f"{{{RAM}}}PostcodeCode").text = "16761" - ET.SubElement(supp_addr, f"{{{RAM}}}LineOne").text = "Hermann-Schumann-Str. 4" - ET.SubElement(supp_addr, f"{{{RAM}}}CityName").text = "Hennigsdorf" - ET.SubElement(supp_addr, f"{{{RAM}}}CountryID").text = "DE" + ET.SubElement(supp_addr, f"{{{RAM}}}PostcodeCode").text = VERKAEUFER["zip"] + ET.SubElement(supp_addr, f"{{{RAM}}}LineOne").text = VERKAEUFER["street"] + ET.SubElement(supp_addr, f"{{{RAM}}}CityName").text = VERKAEUFER["city"] + ET.SubElement(supp_addr, f"{{{RAM}}}CountryID").text = VERKAEUFER["country"] # BT-34 Elektronische Adresse des Verkäufers (PEPPOL-EN16931-R020 Pflicht). Muss laut # XSD nach PostalTradeAddress und vor SpecifiedTaxRegistration stehen. supp_uri = ET.SubElement(supplier_party, f"{{{RAM}}}URIUniversalCommunication") - ET.SubElement(supp_uri, f"{{{RAM}}}URIID", {"schemeID": "EM"}).text = "office@scitech-gmbh.de" + ET.SubElement(supp_uri, f"{{{RAM}}}URIID", {"schemeID": "EM"}).text = VERKAEUFER["email"] supp_tax = ET.SubElement(supplier_party, f"{{{RAM}}}SpecifiedTaxRegistration") - ET.SubElement(supp_tax, f"{{{RAM}}}ID", {"schemeID": "VA"}).text = "DE218436692" + ET.SubElement(supp_tax, f"{{{RAM}}}ID", {"schemeID": "VA"}).text = VERKAEUFER["vat_id"] customer_party = ET.SubElement(header_agree, f"{{{RAM}}}BuyerTradeParty") ET.SubElement(customer_party, f"{{{RAM}}}Name").text = str(data["recipient_name"]) @@ -743,7 +759,7 @@ with col2: st.code(res_meta_text) st.stop() - if final_data.get("recipient_email") == "office@scitech-gmbh.de": + if final_data.get("recipient_email") == VERKAEUFER["email"]: final_data["recipient_email"] = "" final_data["items"] = extract_invoice_items_pure_python(pdf_text) @@ -808,14 +824,14 @@ with col2: c_s, c_r = st.columns(2) with c_s: st.markdown("**Absender (Verkäufer):**") - st.text_input("Firma (BT-27)", value="scitech it solutions GmbH", disabled=True) - st.text_input("E-Mail (BT-34)", value="office@scitech-gmbh.de", disabled=True) - st.text_input("Telefon (BT-42)", value="+49 3302 4940537", disabled=True) - st.text_input("Straße (BT-35)", value="Hermann-Schumann-Str. 4", disabled=True) - st.text_input("PLZ (BT-38)", value="16761", disabled=True) - st.text_input("Stadt (BT-37)", value="Hennigsdorf", disabled=True) - st.text_input("Umsatzsteuer-ID (BT-31)", value="DE218436692", disabled=True) - st.text_input("Registernummer (BT-30)", value="HRB 6058 NP", disabled=True) + st.text_input("Firma (BT-27)", value=VERKAEUFER["name"], disabled=True) + st.text_input("E-Mail (BT-34)", value=VERKAEUFER["email"], disabled=True) + st.text_input("Telefon (BT-42)", value=VERKAEUFER["phone"], disabled=True) + st.text_input("Straße (BT-35)", value=VERKAEUFER["street"], disabled=True) + st.text_input("PLZ (BT-38)", value=VERKAEUFER["zip"], disabled=True) + st.text_input("Stadt (BT-37)", value=VERKAEUFER["city"], disabled=True) + st.text_input("Umsatzsteuer-ID (BT-31)", value=VERKAEUFER["vat_id"], disabled=True) + st.text_input("Registernummer (BT-30)", value=VERKAEUFER["register_id"], disabled=True) st.text_input("IBAN (BT-84)", value=VERKAEUFER_IBAN, disabled=True) with c_r: st.markdown("**Empfänger (Kunde):**")