From 37b7986831e0aa95ce6d147d9388ddddfcba2799 Mon Sep 17 00:00:00 2001 From: dfuhrmann3 Date: Mon, 6 Jul 2026 11:12:39 +0200 Subject: [PATCH] Test --- main.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/main.py b/main.py index 11419bc..0e5149c 100644 --- a/main.py +++ b/main.py @@ -347,12 +347,17 @@ def generate_compliant_zugferd_cii(data): RSM = "urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100" RAM = "urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100" UDT = "urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100" + QDT = "urn:un:unece:uncefact:data:standard:QualifiedDataType:100" ET.register_namespace('rsm', RSM) ET.register_namespace('ram', RAM) ET.register_namespace('udt', UDT) + ET.register_namespace('qdt', QDT) root = ET.Element(f"{{{RSM}}}CrossIndustryInvoice") + # VD-Valitool-14: Der qdt-Namespace wird in dieser Instanz nicht benötigt, soll aber laut + # Spezifikation trotzdem am Root-Element deklariert werden. + root.set("xmlns:qdt", QDT) ex_doc_ctx = ET.SubElement(root, f"{{{RSM}}}ExchangedDocumentContext") @@ -484,7 +489,10 @@ def generate_compliant_zugferd_cii(data): ET.SubElement(header_settle, f"{{{RAM}}}InvoiceCurrencyCode").text = "EUR" pay_means = ET.SubElement(header_settle, f"{{{RAM}}}SpecifiedTradeSettlementPaymentMeans") - ET.SubElement(pay_means, f"{{{RAM}}}TypeCode").text = "30" + # BT-81 Zahlungsart: Code 58 = SEPA-Überweisung. Code 30 ist für Überweisungen AUSSERHALB + # des SEPA-Raums gedacht (VD-Valitool-169-Hinweis) - da hier immer eine IBAN verwendet wird, + # ist 58 der korrekte Code. + ET.SubElement(pay_means, f"{{{RAM}}}TypeCode").text = "58" payee_acc = ET.SubElement(pay_means, f"{{{RAM}}}PayeePartyCreditorFinancialAccount") ET.SubElement(payee_acc, f"{{{RAM}}}IBANID").text = str(data["iban"]).replace(" ", "") @@ -570,7 +578,7 @@ def fix_xrechnung_xmp_conformance(pdf_bytes: bytes) -> bytes: Die factur-x-Bibliothek schreibt standardmäßig fx:ConformanceLevel = 'EN 16931' und fx:Version = '1.0' in die XMP-Metadaten (generischer Factur-X-Standard). Da unsere CII-XML aber explizit das KoSIT-XRechnung-Profil deklariert (GuidelineID .../xrechnung_3.0), erwarten - Validatoren hier stattdessen 'XRECHNUNG' und '3.0.2' - sonst schlagen z. B. + Validatoren hier stattdessen 'XRECHNUNG' und '3.0' - sonst schlagen z. B. VD-Valitool-H-022/H-024 fehl, weil PDF-Metadaten und eingebettetes XML nicht zusammenpassen. """ pdf = pikepdf.open(io.BytesIO(pdf_bytes)) @@ -583,7 +591,7 @@ def fix_xrechnung_xmp_conformance(pdf_bytes: bytes) -> bytes: "XRECHNUNG", ).replace( "1.0", - "3.0.2", + "3.0", ) pdf.Root.Metadata.write(xmp_str.encode("utf-8")) buf = io.BytesIO()