From fc52b570c63806a65a7b7b65eac0fe8f4a42ab7b Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 30 Nov 2020 18:39:42 +0100 Subject: [PATCH] Validate against new schema --- drafthorse/models/accounting.py | 8 +++++--- drafthorse/models/elements.py | 4 ++-- drafthorse/models/trade.py | 2 +- drafthorse/models/tradelines.py | 4 ++-- tests/test_roundtrip.py | 3 ++- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/drafthorse/models/accounting.py b/drafthorse/models/accounting.py index 1b44ad1..8cadcbe 100644 --- a/drafthorse/models/accounting.py +++ b/drafthorse/models/accounting.py @@ -30,6 +30,8 @@ class ApplicableTradeTax(Element): _d="Steuerart (Code)") exemption_reason = StringField(NS_RAM, "ExemptionReason", required=False, profile=COMFORT, _d="Grund der Steuerbefreiung (Freitext)") + exemption_reason_code = StringField(NS_RAM, "ExemptionReasonCode", required=False, + profile=EXTENDED, _d="Grund der Steuerbefreiung (Code)") basis_amount = CurrencyField(NS_RAM, "BasisAmount", required=True, profile=BASIC, _d="Basisbetrag der Steuerberechnung") line_total_basis_amount = CurrencyField(NS_RAM, "LineTotalBasisAmount", @@ -40,8 +42,8 @@ class ApplicableTradeTax(Element): _d="Gesamtbetrag Zu- und Abschläge des Steuersatzes") category_code = StringField(NS_RAM, "CategoryCode", required=False, profile=COMFORT, _d="Steuerkategorie (Wert)") - applicable_percent = DecimalField(NS_RAM, "ApplicablePercent", - required=True, profile=BASIC) + rate_applicable_percent = DecimalField(NS_RAM, "RateApplicablePercent", + required=True, profile=BASIC) class Meta: namespace = NS_RAM @@ -84,7 +86,7 @@ class MonetarySummation(Element): class Meta: namespace = NS_RAM - tag = "SpecifiedTradeSettlementMonetarySummation" + tag = "SpecifiedTradeSettlementHeaderMonetarySummation" class BillingSpecifiedPeriod(Element): diff --git a/drafthorse/models/elements.py b/drafthorse/models/elements.py index 7960ff8..249d738 100644 --- a/drafthorse/models/elements.py +++ b/drafthorse/models/elements.py @@ -60,9 +60,9 @@ class Element(metaclass=BaseElementMeta): if self.required or list(el) or el.text: node.append(el) - def serialize(self): + def serialize(self, schema="FACTUR-X_BASIC"): xml = b"" + ET.tostring(self.to_etree(), "utf-8") - return validate_xml(xmlout=xml, schema="ZUGFeRD1p0") + return validate_xml(xmlout=xml, schema=schema) def from_etree(self, root): if hasattr(self, 'Meta') and hasattr(self.Meta, 'namespace') and root.tag != "{%s}%s" % ( diff --git a/drafthorse/models/trade.py b/drafthorse/models/trade.py index 52bad82..6e48aae 100644 --- a/drafthorse/models/trade.py +++ b/drafthorse/models/trade.py @@ -81,10 +81,10 @@ class TradeSettlement(Element): class TradeTransaction(Element): + items = MultiField(LineItem, required=True) agreement = Field(TradeAgreement, required=True) delivery = Field(TradeDelivery, required=True) settlement = Field(TradeSettlement, required=True) - items = MultiField(LineItem, required=True) class Meta: namespace = NS_RSM diff --git a/drafthorse/models/tradelines.py b/drafthorse/models/tradelines.py index 632bff1..82b0d7a 100644 --- a/drafthorse/models/tradelines.py +++ b/drafthorse/models/tradelines.py @@ -101,7 +101,7 @@ class LineSummation(Element): class Meta: namespace = NS_RAM - tag = "SpecifiedTradeSettlementMonetarySummation" + tag = "SpecifiedTradeSettlementLineMonetarySummation" class LineSettlement(Element): @@ -118,10 +118,10 @@ class LineSettlement(Element): class LineItem(Element): document = Field(LineDocument, required=True) + product = Field(TradeProduct) agreement = Field(LineAgreement) delivery = Field(LineDelivery) settlement = Field(LineSettlement, required=True) - product = Field(TradeProduct) class Meta: namespace = NS_RAM diff --git a/tests/test_roundtrip.py b/tests/test_roundtrip.py index 863822c..520882c 100644 --- a/tests/test_roundtrip.py +++ b/tests/test_roundtrip.py @@ -14,6 +14,7 @@ def test_sample_roundtrip(filename): open(os.path.join(os.path.dirname(__file__), 'samples', filename), 'rb').read(), remove_comments=True ) + schema = 'FACTUR-X_' + filename.split('_')[2] doc = Invoice.parse(origxml) - generatedxml = prettify(doc.serialize()) + generatedxml = prettify(doc.serialize(schema)) assert origxml.decode().strip() == generatedxml.decode().strip() -- 2.47.3