From: Raphael Michel Date: Mon, 15 Oct 2018 22:55:39 +0000 (+0200) Subject: Make all official samples pass X-Git-Tag: 1.0.0~17 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9e64c0ae7004a2a705363aa12854ddd0ef5e60f6;p=thirdparty%2Fpython-drafthorse.git Make all official samples pass --- diff --git a/drafthorse/models/accounting.py b/drafthorse/models/accounting.py index 4ce17b7..0d8320a 100644 --- a/drafthorse/models/accounting.py +++ b/drafthorse/models/accounting.py @@ -1,7 +1,7 @@ from . import BASIC, COMFORT, EXTENDED, NS_RAM from .elements import Element from .fields import (CurrencyField, DateTimeField, DecimalField, - IndicatorField, MultiField, StringField) + IndicatorField, MultiField, StringField, QuantityField) class LineApplicableTradeTax(Element): @@ -51,7 +51,15 @@ class AccountingAccount(Element): class Meta: namespace = NS_RAM - tag = "ReceivableSpecifiedTradeAccount" + tag = "SpecifiedTradeAccountingAccount" + + +class ReceivableAccountingAccount(Element): + id = StringField(NS_RAM, "ID", required=True, profile=EXTENDED, _d="Buchungsreferenz") + + class Meta: + namespace = NS_RAM + tag = "ReceivableSpecifiedTradeAccountingAccount" class MonetarySummation(Element): @@ -112,7 +120,7 @@ class TradeAllowanceCharge(Element): _d="Rabatt in Prozent") basis_amount = CurrencyField(NS_RAM, "BasisAmount", required=False, profile=EXTENDED, _d="Basisbetrag des Rabatts") - basis_quantity = CurrencyField(NS_RAM, "BasisQuantity", required=False, + basis_quantity = QuantityField(NS_RAM, "BasisQuantity", required=False, profile=EXTENDED, _d="Basismenge des Rabatts") actual_amount = CurrencyField(NS_RAM, "ActualAmount", required=True, profile=COMFORT, _d="Betrag des Zu-/Abschlags") diff --git a/drafthorse/models/elements.py b/drafthorse/models/elements.py index 16c5b44..7c5a2da 100644 --- a/drafthorse/models/elements.py +++ b/drafthorse/models/elements.py @@ -26,6 +26,7 @@ class BaseElementMeta(type): class Element(metaclass=BaseElementMeta): def __init__(self, **kwargs): + self.required = kwargs.get('required', False) self._data = OrderedDict([ (f.name, f.initialize() if f.default else None) for f in self._fields ]) @@ -49,9 +50,9 @@ class Element(metaclass=BaseElementMeta): def get_tag(self): return "{%s}%s" % (self.Meta.namespace, self.Meta.tag) - def append_to(self, node, required=False): + def append_to(self, node): el = self.to_etree() - if required or list(el) or el.text: + if self.required or list(el) or el.text: node.append(el) def serialize(self): @@ -66,6 +67,8 @@ class Element(metaclass=BaseElementMeta): element = getattr(self, field.name) field_index[element.get_tag()] = (field.name, element) for child in root: + if child.tag == ET.Comment: + continue if child.tag in field_index: name, childel = field_index[child.tag] if isinstance(getattr(self, name), Container): @@ -73,6 +76,7 @@ class Element(metaclass=BaseElementMeta): else: getattr(self, name).from_etree(child) else: + print(root, field_index) raise TypeError("Unknown element {}".format(child.tag)) return self @@ -203,7 +207,7 @@ class AgencyIDElement(StringElement): return node def from_etree(self, root): - self.text = Decimal(root.text) + self.text = root.text self.scheme_id = root.attrib['schemeAgencyID'] return self @@ -241,9 +245,13 @@ class DateTimeElement(StringElement): def to_etree(self): t = self._etree_node() node = ET.Element("{%s}%s" % (NS_UDT, "DateTimeString")) - node.text = self.value.strftime("%Y%m%d") - node.attrib['format'] = self.format - t.append(node) + if self.value: + if self.format == '102': + node.text = self.value.strftime("%Y%m%d") + elif self.format == '616': + node.text = self.value.strftime("%G%V") + node.attrib['format'] = self.format + t.append(node) return t def from_etree(self, root): @@ -251,10 +259,33 @@ class DateTimeElement(StringElement): raise TypeError("Date containers should have one child") if root[0].tag != "{%s}%s" % (NS_UDT, "DateTimeString"): raise TypeError("Tag %s not recognized" % root[0].tag) - if root[0].attrib['format'] != '102': - raise TypeError("Date format %s cannot be parsed" % root[0].attrib['format']) - self.value = datetime.strptime(root[0].text, '%Y%m%d').date() self.format = root[0].attrib['format'] + if self.format == '102': + self.value = datetime.strptime(root[0].text, '%Y%m%d').date() + elif self.format == '616': + self.value = datetime.strptime(root[0].text + '1', '%G%V%u').date() + else: + raise TypeError("Date format %s cannot be parsed" % root[0].attrib['format']) + return self + + def __str__(self): + return "{}".format(self.value) + + +class DirectDateTimeElement(StringElement): + def __init__(self, namespace, tag, value=None): + super().__init__(namespace, tag) + self.value = value + self.format = format + + def to_etree(self): + t = self._etree_node() + if self.value: + t.text = self.value.strftime("%Y-%m-%dT%H:%M:%S") + return t + + def from_etree(self, root): + self.value = datetime.strptime(root.text, '%Y-%m-%dT%H:%M:%S').date() return self def __str__(self): @@ -262,7 +293,7 @@ class DateTimeElement(StringElement): class IndicatorElement(StringElement): - def __init__(self, namespace, tag, value=False): + def __init__(self, namespace, tag, value=None): super().__init__(namespace, tag) self.value = value @@ -271,6 +302,8 @@ class IndicatorElement(StringElement): def to_etree(self): t = self._etree_node() + if self.value is None: + return t node = ET.Element("{%s}%s" % (NS_UDT, "Indicator")) node.text = str(self.value).lower() t.append(node) @@ -278,3 +311,11 @@ class IndicatorElement(StringElement): def __str__(self): return "{}".format(self.value) + + def from_etree(self, root): + if len(root) != 1: + raise TypeError("Indicator containers should have one child") + if root[0].tag != "{%s}%s" % (NS_UDT, "Indicator"): + raise TypeError("Tag %s not recognized" % root[0].tag) + self.value = root[0].text == 'true' + return self diff --git a/drafthorse/models/fields.py b/drafthorse/models/fields.py index c50d8a3..5b10b38 100644 --- a/drafthorse/models/fields.py +++ b/drafthorse/models/fields.py @@ -13,7 +13,7 @@ class Field: super().__init__() def initialize(self): - return self.cls() + return self.cls(required=self.required) def __get__(self, instance, objtype): if instance._data.get(self.name, None) is None: @@ -190,6 +190,22 @@ class DateTimeField(Field): return self.cls(self.namespace, self.tag) +class DirectDateTimeField(Field): + def __init__(self, namespace, tag, default=False, required=False, profile=BASIC, _d=None): + from .elements import DirectDateTimeElement + super().__init__(DirectDateTimeElement, default, required, profile, _d) + self.namespace = namespace + self.tag = tag + + def __set__(self, instance, value): + if instance._data.get(self.name, None) is None: + instance._data[self.name] = self.initialize() + instance._data[self.name].value = value + + def initialize(self): + return self.cls(self.namespace, self.tag) + + class MultiField(Field): def __init__(self, inner_type, default=False, required=False, profile=BASIC, _d=None): super().__init__(Container, default, required, profile, _d) diff --git a/drafthorse/models/note.py b/drafthorse/models/note.py index 997a632..559945a 100644 --- a/drafthorse/models/note.py +++ b/drafthorse/models/note.py @@ -4,10 +4,10 @@ from .fields import MultiStringField, StringField class IncludedNote(Element): - content = MultiStringField(NS_RAM, "Content", required=False, - profile=BASIC) content_code = StringField(NS_RAM, "ContentCode", required=False, profile=EXTENDED) + content = MultiStringField(NS_RAM, "Content", required=False, + profile=BASIC) subject_code = StringField(NS_RAM, "SubjectCode", required=False, profile=COMFORT) diff --git a/drafthorse/models/party.py b/drafthorse/models/party.py index b037339..b4d4e2f 100644 --- a/drafthorse/models/party.py +++ b/drafthorse/models/party.py @@ -47,7 +47,7 @@ class EmailURI(Element): class Meta: namespace = NS_RAM - tag = "EmailURICommunication" + tag = "EmailURIUniversalCommunication" class TradeContact(Element): diff --git a/drafthorse/models/payment.py b/drafthorse/models/payment.py index bb6bcc6..9dfb7d9 100644 --- a/drafthorse/models/payment.py +++ b/drafthorse/models/payment.py @@ -2,7 +2,7 @@ from . import BASIC, COMFORT, EXTENDED, NS_RAM from .elements import Element from .fields import (CurrencyField, DateTimeField, DecimalField, Field, IDField, MultiCurrencyField, MultiStringField, - StringField) + StringField, AgencyIDField, QuantityField) class PayerFinancialAccount(Element): @@ -47,7 +47,7 @@ class PayeeFinancialInstitution(Element): class PaymentMeans(Element): type_code = StringField(NS_RAM, "TypeCode", required=False, profile=COMFORT) information = MultiStringField(NS_RAM, "Information", required=False, profile=COMFORT) - id = IDField(NS_RAM, "ID", required=False, profile=BASIC) + id = AgencyIDField(NS_RAM, "ID", required=False, profile=BASIC) payer_account = Field(PayerFinancialAccount) payer_institution = Field(PayerFinancialInstitution) payee_account = Field(PayeeFinancialAccount) @@ -61,8 +61,8 @@ class PaymentMeans(Element): class PaymentPenaltyTerms(Element): basis_date_time = DateTimeField(NS_RAM, "BasisDateTime", required=False, profile=EXTENDED, _d="Bezugsdatum der Fälligkeit") - basis_period_measure = StringField(NS_RAM, "BasisPeriodMeasure", required=False, - profile=EXTENDED, _d="Fälligkeitszeitraum") + basis_period_measure = QuantityField(NS_RAM, "BasisPeriodMeasure", required=False, + profile=EXTENDED, _d="Fälligkeitszeitraum") basis_amount = CurrencyField(NS_RAM, "BasisAmount", required=False, profile=EXTENDED, _d="Basisbetrag des Zahlungszuschlags") calculation_percent = DecimalField(NS_RAM, "CalculationPercent", required=False, @@ -78,8 +78,8 @@ class PaymentPenaltyTerms(Element): class PaymentDiscountTerms(Element): basis_date_time = DateTimeField(NS_RAM, "BasisDateTime", required=False, profile=EXTENDED, _d="Bezugsdatum der Fälligkeit") - basis_period_measure = StringField(NS_RAM, "BasisPeriodMeasure", required=False, - profile=EXTENDED, _d="Fälligkeitszeitraum") + basis_period_measure = QuantityField(NS_RAM, "BasisPeriodMeasure", required=False, + profile=EXTENDED, _d="Fälligkeitszeitraum") basis_amount = CurrencyField(NS_RAM, "BasisAmount", required=False, profile=EXTENDED, _d="Basisbetrag des Zahlungsabschlags") calculation_percent = DecimalField(NS_RAM, "CalculationPercent", required=False, diff --git a/drafthorse/models/product.py b/drafthorse/models/product.py index 1617c0e..d153794 100644 --- a/drafthorse/models/product.py +++ b/drafthorse/models/product.py @@ -37,13 +37,13 @@ class OriginCountry(Element): class ReferencedProduct(Element): - name = StringField(NS_RAM, "Name", required=False, profile=EXTENDED) - description = StringField(NS_RAM, "Description", required=False, profile=EXTENDED) global_id = IDField(NS_RAM, "GlobalID", required=False, profile=EXTENDED) seller_assigned_id = StringField(NS_RAM, "SellerAssignedID", required=False, profile=EXTENDED) buyer_assigned_id = StringField(NS_RAM, "BuyerAssignedID", required=False, profile=EXTENDED) + name = StringField(NS_RAM, "Name", required=False, profile=EXTENDED) + description = StringField(NS_RAM, "Description", required=False, profile=EXTENDED) unit_quantity = QuantityField(NS_RAM, "UnitQuantity", required=False, profile=EXTENDED) diff --git a/drafthorse/models/references.py b/drafthorse/models/references.py index b9a09a3..025ce65 100644 --- a/drafthorse/models/references.py +++ b/drafthorse/models/references.py @@ -1,11 +1,11 @@ from . import COMFORT, EXTENDED, NS_RAM from .elements import Element -from .fields import DateTimeField, StringField +from .fields import StringField, DirectDateTimeField class ReferencedDocument(Element): - issue_date_time = DateTimeField(NS_RAM, "IssueDateTime", required=False, - profile=COMFORT) + issue_date_time = DirectDateTimeField(NS_RAM, "IssueDateTime", required=False, + profile=COMFORT) id = StringField(NS_RAM, "ID", required=False, profile=COMFORT) @@ -22,8 +22,12 @@ class ContractReferencedDocument(ReferencedDocument): tag = "ContractReferencedDocument" -class AdditionalReferencedDocument(ReferencedDocument): - type_code = StringField(NS_RAM, "ReferenceTypeCode", profile=EXTENDED, required=True) +class AdditionalReferencedDocument(Element): + issue_date_time = DirectDateTimeField(NS_RAM, "IssueDateTime", required=False, + profile=COMFORT) + type_code = StringField(NS_RAM, "TypeCode", profile=EXTENDED, required=True) + id = StringField(NS_RAM, "ID", required=False, + profile=COMFORT) class Meta: namespace = NS_RAM @@ -82,9 +86,13 @@ class LineReceivingAdviceReferencedDocument(ReferencedDocument): tag = "ReceivingAdviceReferencedDocument" -class LineAdditionalReferencedDocument(ReferencedDocument): +class LineAdditionalReferencedDocument(Element): line_id = StringField(NS_RAM, "LineID", required=False, profile=EXTENDED) - type_code = StringField(NS_RAM, "ReferenceTypeCode", profile=EXTENDED, required=True) + issue_date_time = DirectDateTimeField(NS_RAM, "IssueDateTime", required=False, + profile=COMFORT) + type_code = StringField(NS_RAM, "TypeCode", profile=EXTENDED, required=True) + id = StringField(NS_RAM, "ID", required=False, + profile=COMFORT) class Meta: namespace = NS_RAM @@ -100,4 +108,4 @@ class DeliveryNoteReferencedDocument(ReferencedDocument): class LineDeliveryNoteReferencedDocument(ReferencedDocument): class Meta: namespace = NS_RAM - tag = "LineDeliveryNoteReferencedDocument" + tag = "DeliveryNoteReferencedDocument" diff --git a/drafthorse/models/trade.py b/drafthorse/models/trade.py index 1860d72..42c197e 100644 --- a/drafthorse/models/trade.py +++ b/drafthorse/models/trade.py @@ -1,7 +1,7 @@ from . import BASIC, COMFORT, EXTENDED, NS_RAM, NS_FERD_1p0 -from .accounting import (AccountingAccount, ApplicableTradeTax, +from .accounting import (ApplicableTradeTax, BillingSpecifiedPeriod, MonetarySummation, - TradeAllowanceCharge) + TradeAllowanceCharge, AppliedTradeTax, ReceivableAccountingAccount) from .delivery import TradeDelivery from .elements import Element from .fields import CurrencyField, Field, MultiField, StringField @@ -15,17 +15,25 @@ from .references import (AdditionalReferencedDocument, from .tradelines import LineItem +class DeliveryTerms(Element): + type_code = StringField(NS_RAM, "DeliveryTypeCode", required=False, + profile=EXTENDED, _d="Lieferbedingung (Code)") + + class Meta: + namespace = NS_RAM + tag = "ApplicableTradeDeliveryTerms" + + class TradeAgreement(Element): buyer_reference = StringField(NS_RAM, "BuyerReference", required=False, profile=COMFORT, _d="Referenz des Käufers") seller = Field(SellerTradeParty, required=True, _d="Detailinformationen zum Verkäufer") buyer = Field(BuyerTradeParty, required=True) end_user = Field(EndUserTradeParty, required=False, _d="Abweichender Endverbraucher") - delivery_type_code = StringField(NS_RAM, "DeliveryTypeCode", required=False, - profile=EXTENDED, _d="Lieferbedingung (Code)") - buyer_order = BuyerOrderReferencedDocument(required=False, profile=COMFORT) - customer_order = CustomerOrderReferencedDocument(required=False, profile=COMFORT) - contract = ContractReferencedDocument(required=False, profile=COMFORT) + delivery_terms = Field(DeliveryTerms, required=False, profile=EXTENDED) + buyer_order = Field(BuyerOrderReferencedDocument, required=False, profile=COMFORT) + customer_order = Field(CustomerOrderReferencedDocument, required=False, profile=COMFORT) + contract = Field(ContractReferencedDocument, required=False, profile=COMFORT) additional_references = MultiField(AdditionalReferencedDocument, required=False, profile=COMFORT) @@ -39,7 +47,7 @@ class LogisticsServiceCharge(Element): _d="Identifikation der Servicegebühr") applied_amount = CurrencyField(NS_RAM, "AppliedAmount", required=True, profile=COMFORT, _d="Betrag der Servicegebühr") - trade_tax = MultiField(ApplicableTradeTax, required=False, profile=COMFORT) + trade_tax = MultiField(AppliedTradeTax, required=False, profile=COMFORT) class Meta: namespace = NS_RAM @@ -62,7 +70,7 @@ class TradeSettlement(Element): terms = MultiField(PaymentTerms, required=False, profile=COMFORT) money_summation = Field(MonetarySummation, required=True, profile=BASIC, _d="Detailinformation zu Belegsummen") - accounting_account = Field(AccountingAccount, required=False, profile=EXTENDED, + accounting_account = Field(ReceivableAccountingAccount, required=False, profile=EXTENDED, _d="Detailinformationen zur Buchungsreferenz") class Meta: diff --git a/drafthorse/models/tradelines.py b/drafthorse/models/tradelines.py index b60e1a0..b4082a7 100644 --- a/drafthorse/models/tradelines.py +++ b/drafthorse/models/tradelines.py @@ -28,7 +28,7 @@ class GrossPrice(Element): _d="Bruttopreis") basis_quantity = QuantityField(NS_RAM, "BasisQuantity", required=False, profile=COMFORT, _d="Preisbasismenge") - charge = Field(AllowanceCharge, required=False, profile=COMFORT) + charge = MultiField(AllowanceCharge, required=False, profile=COMFORT) class Meta: namespace = NS_RAM @@ -73,7 +73,7 @@ class LineDelivery(Element): profile=BASIC, _d="Menge, berechnet") charge_free_quantity = QuantityField(NS_RAM, "ChargeFreeQuantity", required=False, profile=EXTENDED, _d="Menge, ohne Berechnung") - package_quantity = QuantityField(NS_RAM, "ChargeFreeQuantity", required=False, + package_quantity = QuantityField(NS_RAM, "PackageQuantity", required=False, profile=EXTENDED, _d="Anzahl Packstücke") ship_to = Field(ShipToTradeParty, required=False, profile=EXTENDED) ultimate_ship_to = Field(UltimateShipToTradeParty, required=False, profile=EXTENDED) @@ -118,7 +118,7 @@ class LineItem(Element): document = Field(LineDocument, required=True) agreement = Field(LineAgreement) delivery = Field(LineDelivery) - settlement = Field(LineSettlement) + settlement = Field(LineSettlement, required=True) product = Field(TradeProduct) class Meta: diff --git a/drafthorse/utils.py b/drafthorse/utils.py index 085ea2f..9bf8aa3 100644 --- a/drafthorse/utils.py +++ b/drafthorse/utils.py @@ -14,14 +14,14 @@ def minify(xml): return xml -def prettify(xml): +def prettify(xml, **kwargs): try: from lxml import etree except ImportError: reparsed = minidom.parseString(xml) return reparsed.toprettyxml(indent="\t") else: - parser = etree.XMLParser(remove_blank_text=True) + parser = etree.XMLParser(remove_blank_text=True, **kwargs) return b"" + etree.tostring( etree.fromstring(xml, parser), pretty_print=True ) diff --git a/tests/samples/ZUGFeRD_1p0_BASIC_Einfach.xml b/tests/samples/ZUGFeRD_1p0_BASIC_Einfach.xml new file mode 100644 index 0000000..b9f86d2 --- /dev/null +++ b/tests/samples/ZUGFeRD_1p0_BASIC_Einfach.xml @@ -0,0 +1,160 @@ + + + + + true + + urn:ferd:CrossIndustryDocument:invoice:1p0:basic + + + + 471102 + RECHNUNG + 380 + 20130305 + + Rechnung gemäß Bestellung vom 01.03.2013. + + + Lieferant GmbH +Lieferantenstraße 20 +80333 München +Deutschland +Geschäftsführer: Hans Muster +Handelsregisternummer: H A 123 + + + + Unsere GLN: 4000001123452 +Ihre GLN: 4000001987658 +Ihre Kundennummer: GE2020211 + + +Zahlbar innerhalb 30 Tagen netto bis 04.04.2013, 3% Skonto innerhalb 10 Tagen bis 15.03.2013. + + + + + + Lieferant GmbH + + 80333 + Lieferantenstraße 20 + München + DE + + + 201/113/40209 + + + DE123456789 + + + + Kunden AG Mitte + + 69876 + Hans Muster + Kundenstraße 15 + Frankfurt + DE + + + + + + 20130305 + + + + 2013-471102 + EUR + + + DE08700901001234567890 + + + GENODEF1M04 + + + + 37.62 + VAT + 198.00 + 19.00 + + + 198.00 + 0.00 + 0.00 + 198.00 + 37.62 + 235.62 + + + + + + 20.0000 + + + + 198.00 + + + + 4012345001235 + TB100A4 + GTIN: 4012345001235 +Unsere Art.-Nr.: TB100A4 +Trennblätter A4 + + + + \ No newline at end of file diff --git a/tests/samples/ZUGFeRD_1p0_BASIC_Rechnungskorrektur.xml b/tests/samples/ZUGFeRD_1p0_BASIC_Rechnungskorrektur.xml new file mode 100644 index 0000000..93e95b7 --- /dev/null +++ b/tests/samples/ZUGFeRD_1p0_BASIC_Rechnungskorrektur.xml @@ -0,0 +1,232 @@ + + + + + + true + + + + urn:ferd:CrossIndustryDocument:invoice:1p0:basic + + + + RK21012345 + RECHNUNGS-KORREKTUR + 380 + + 20130916 + + + Es bestehen Rabatt- oder Bonusvereinbarungen. + + + MUSTERLIEFERANT GMBH +BAHNHOFSTRASSE 99 +99199 MUSTERHAUSEN +Geschäftsführung: +Max Mustermann +USt-IdNr: DE123456789 +Telefon: +49 932 431 0 +www.musterlieferant.de +HRB Nr. 372876 +Amtsgericht Musterstadt +GLN 4304171000002 + + + Bei Rückfragen: +Telefon: +49 932 431 500 +E-Mail : max.muster@musterlieferant.de + + + Warenempfänger +GLN 430417088093 +MUSTER-MARKT + +HAUPTSTRASSE 44 +31157 SARSTEDT + +Abteilung : 8211 + + + Bestell-Nr : B123456789 +Bestell-Datum : 01.08.2013 + +Lieferschein-Nr : L87654321012345 +Lieferschein-Datum : 05.08.2013 +Ursprungsbeleg-Nr : R87654321012345 +Reklamationsnummer : REKLA-2013-235 + + + Rechnungsempfänger +GLN 4304171000002 +MUSTER-KUNDE GMBH + +KUNDENWEG 88 +40235 DUESSELDORF +Kunden-Nr. : 009420 + + + Rechnungsrabatt 1 -2,00% Basisbetrag: -5,00, MwSt.-% 19,0, Rabattbetrag: 0,10 +Basisbetrag: -2,90, MwSt.-% 7,0, Rabattbetrag: 0,06 +Rechnungsrabatt 2 Basisbetrag: -5,00, MwSt.-% 19,0, Rabattbetrag: 0,05 +Basisbetrag: -2,90, MwSt.-% 7,0, Rabattbetrag: 0,02 + + + + + + GLN 4333741000005 +Lief-Nr: 549910 +MUSTERLIEFERANT GMBH + + 99199 + BAHNHOFSTRASSE 99 + MUSTERHAUSEN + DE + + + DE123456789 + + + + GLN 4304171000002 +Kunden-Nr. : 009420 +MUSTER-KUNDE GMBH + + 40235 + KUNDENWEG 88 + DUESSELDORF + DE + + + + + + + 20130805 + + + + + EUR + + -0.92 + VAT + -4.85 + 19.00 + + + -0.20 + VAT + -2.82 + 7.00 + + + -7.90 + 0.00 + -0.23 + -7.67 + -1.12 + -8.79 + + + + + + Gemäß Ihres Reklamationsschreibens vom 10.09.2013 und unseres Telefonats vom 12.09.2013 erhalten Sie die +nachfolgenden Leistungen gutgeschrieben. + + + + + + + + -5.0000 + + + + 19.00 + + + -5.00 + + + + GTIN 4123456000014 +Art-Nr-Lieferant ZS9997 +Zitronensäure 100ml +Verpackung: Flasche +VKE/Geb: 1 + + + + + + -2.0000 + + + + 7.00 + + + -2.90 + + + + GTIN 4123456000021 +Art-Nr-Lieferant GZ250 +Gelierzucker Extra 250g +Verpackung: Karton +VKE/Geb: 1 + + + + diff --git a/tests/samples/ZUGFeRD_1p0_COMFORT_Einfach.xml b/tests/samples/ZUGFeRD_1p0_COMFORT_Einfach.xml new file mode 100644 index 0000000..2730d10 --- /dev/null +++ b/tests/samples/ZUGFeRD_1p0_COMFORT_Einfach.xml @@ -0,0 +1,218 @@ + + + + + true + + urn:ferd:CrossIndustryDocument:invoice:1p0:comfort + + + + 471102 + RECHNUNG + 380 + 20130305 + + Rechnung gemäß Bestellung vom 01.03.2013. + + + Lieferant GmbH +Lieferantenstraße 20 +80333 München +Deutschland +Geschäftsführer: Hans Muster +Handelsregisternummer: H A 123 + +REG + + + + + + 4000001123452 + Lieferant GmbH + + 80333 + Lieferantenstraße 20 + München + DE + + + 201/113/40209 + + + DE123456789 + + + + GE2020211 + 4000001987658 + Kunden AG Mitte + + Hans Muster + + + 69876 + Kundenstraße 15 + Frankfurt + DE + + + + + + 20130305 + + + + 2013-471102 + EUR + + 31 + Überweisung + + DE08700901001234567890 + + + GENODEF1M04 + + + + 19.25 + VAT + 275.00 + S + 7.00 + + + 37.62 + VAT + 198.00 + S + 19.00 + + + Zahlbar innerhalb 30 Tagen netto bis 04.04.2013, 3% Skonto innerhalb 10 Tagen bis 15.03.2013 + 20130404 + + + 473.00 + 0.00 + 0.00 + 473.00 + 56.87 + 529.87 + 0.00 + 529.87 + + + + + 1 + + + + 9.9000 + + + 9.9000 + + + + 20.0000 + + + + VAT + S + 19.00 + + + 198.00 + + + + 4012345001235 + TB100A4 + Trennblätter A4 + + + + + 2 + + + + 5.5000 + + + 5.5000 + + + + 50.0000 + + + + VAT + S + 7.00 + + + 275.00 + + + + 4000050986428 + ARNR2 + Joghurt Banane + + + + \ No newline at end of file diff --git a/tests/samples/ZUGFeRD_1p0_COMFORT_Haftpflichtversicherung_Versicherungssteuer.xml b/tests/samples/ZUGFeRD_1p0_COMFORT_Haftpflichtversicherung_Versicherungssteuer.xml new file mode 100644 index 0000000..40299e4 --- /dev/null +++ b/tests/samples/ZUGFeRD_1p0_COMFORT_Haftpflichtversicherung_Versicherungssteuer.xml @@ -0,0 +1,241 @@ + + + + + true + + urn:ferd:CrossIndustryDocument:invoice:1p0:comfort + + + + 01.234.567.8-2014-1 + Beitragsrechnung + 380 + 20140124 + + Allgemeine Haftpflichtversicherung VSNR: 01.234.567.8 +(Bei Schriftwechsel und Zahlung bitte angeben.) + + + MVM Musterhafter +Versicherungsverein Musterstadt a.G. +Versicherungsbüro +Muster +Musterstr. 12 +12345 Musterstadt +Tel.: 0123/45678 +Fax.: 01231/99 45678 +Mo.-Fr. 08.30 - 12.30 Uhr +Mo.-Fr. 14.00 - 17.00 Uhr +Mo-Fr 8.00-20.00 Uhr, Sa 8.00-14.00 Uhr + + REG + + + + + 01.234.567.8 + + MVM Musterhafter +Versicherungsverein Musterstadt a.G. + + 12345 + Musterstr. 12 + Musterstadt + DE + + + + Herrn +Max Mustermann + + 12346 + Musterstr. 11 + Bad Musterhausen + DE + + + + + + 20141206 + + + + 01.234.567.8 + EUR + + 42 + Überweisung + + DE75123456780000001234 + + + WELADED1MST + Sparkasse Musterstadt Ost + + + + 9.50 + ZF_INSURANCE_TAX + 50.00 + S + 19.00 + + + 20131206 + + + 20141206 + + + Einen zu zahlenden Beitrag überweisen Sie bitte auf folgende Bankverbindung: IBAN DE75123456780000001234, BIC WELADED1MST, Sparkasse Musterstadt Ost. +Einfacher für Sie ist es, wenn Sie uns ein SEPA-Lastschriftmandat erteilen. Wir würden dann zu der Fälligkeit 06.12.2013 den Beitrag von dem uns bekannten Konto abbuchen. In diesem Fall würden Sie, sofern sich keine Beitragsänderung ergibt, zukünftig keine Zwischenrechnung erhalten. + +Beitragsgutschriften aus Ihrem Vertrag erstatten wir per Scheck. + + 20131206 + + + 50.00 + 0.00 + 0.00 + 50.00 + 9.50 + 59.50 + 0.00 + 59.50 + + + + + + Sehr geehrter Herr Mustermann, +zu Ihrer Haftpflichtversicherung wird der Beitrag für den Zeitraum vom 06.12.2013 bis zum 06.12.2014 am 06.12.2013 +fällig. + + +Folgende Risiken sind versichert: + + + + + + + + + 50.0000 + + + 50.0000 + + + + 1.0000 + + + + ZF_INSURANCE_TAX + S + 19.00 + + + 50.00 + + + + Privathaftpflicht + + + + + + + 0.0000 + + + 0.0000 + + + + 1.0000 + + + + ZF_INSURANCE_TAX + S + 19.00 + + + 0.00 + + + + Lebensgefährte/in zur Privathaftpflicht + + + + + + Der Beitrag hat sich auf Grund einer Beitragsangleichung gem. § 8 III AHB gegenüber dem Vorjahr erhöht. Auf Ihr Kündigungsrecht innerhalb eines Monats nach Zugang dieser Mitteilung weisen wir hin. +Denken Sie bitte daran, dass neu eingetretene Haftpflichtrisiken innerhalb eines Monats nach Erhalt dieser Aufforderung angemeldet werden müssen, da ansonsten der Versicherungsschutz hierfür rückwirkend entfällt (§ 2 Ziff. 1 AHB). +Innerhalb der gleichen Frist sind zwischenzeitlich eingetretene Erhöhungen und Erweiterungen des versicherten Haftpflichtrisikos gemäß § 8 Ziff. II AHB anzuzeigen. + +Nähere Angaben zu den versicherten Risiken entnehmen Sie bitte Ihrem Versicherungsschein/Nachtrag. + +Dieses Dokument dient auch zur Vorlage beim Finanzamt. + + +Freundliche Grüße + + + + + + \ No newline at end of file diff --git a/tests/samples/ZUGFeRD_1p0_COMFORT_Kraftfahrversicherung_Bruttopreise.xml b/tests/samples/ZUGFeRD_1p0_COMFORT_Kraftfahrversicherung_Bruttopreise.xml new file mode 100644 index 0000000..b041637 --- /dev/null +++ b/tests/samples/ZUGFeRD_1p0_COMFORT_Kraftfahrversicherung_Bruttopreise.xml @@ -0,0 +1,241 @@ + + + + + true + + urn:ferd:CrossIndustryDocument:invoice:1p0:comfort + + + + 00.123.456.7-2014-1 + Beitragsrechnung + 380 + 20140311 + + Beitragsrechnung zur Kraftfahrtversicherung Nr. 00.123.456.7 + + + MVM Musterhafter +Versicherungsverein Musterstadt a.G. +Versicherungsbüro +Muster +Musterstr. 12 +12345 Musterstadt +Tel.: 0123/45678 +Fax.: 01231/99 45678 +Mo.-Fr. 08.30 - 12.30 Uhr +Mo.-Fr. 14.00 - 17.00 Uhr +Mo-Fr 8.00-20.00 Uhr, Sa 8.00-14.00 Uhr + + REG + + + + + 00.123.456.7 + + MVM Musterhafter +Versicherungsverein Musterstadt a.G. + + 12345 + Musterstr. 12 + Musterstadt + DE + + + + Herrn +Max Mustermann + + 12346 + Musterstr. 11 + Bad Musterhausen + DE + + + + + + 20140630 + + + + 00.123.456.7 + EUR + + 42 + Überweisung + + DE75123456780000001234 + + + WELADED1MST + Sparkasse Musterstadt Ost + + + + 35.13 + ZF_INSURANCE_TAX + 184.87 + S + 19.00 + + + 20140401 + + + 20140630 + + + Einen zu zahlenden Beitrag überweisen Sie bitte auf folgende Bankverbindung: +DE75123456780000001234, BIC WELADED1MST, Sparkasse Musterstadt Ost. Einfacher für Sie ist es, wenn Sie uns ein SEPA-Lastschriftmandat erteilen. Wir würden dann zu den Fälligkeiten 01.07.2014, 01.10.2014 den jeweiligen Beitrag von dem uns bekannten Konto abbuchen. In diesem Fall würden Sie, sofern sich keine Beitragsänderung ergibt, zukünftig keine Zwischenrechnung erhalten. +Beitragsgutschriften aus Ihrem Vertrag erstatten wir per Scheck. +Rabattservice: Wenn Sie im laufenden Kalenderjahr nur einen Kfz-Haftpflichtschaden oder nur einen Vollkaskoschaden melden, gilt für Sie der Rabattretter. + + 20140401 + + + 184.87 + 0.00 + 0.00 + 184.87 + 35.13 + 220.00 + -220.00 + 440.00 + + + + + + Bei Ausstellung der Beitragsrechnung wurde der bekannte Vertragsstand (Zahlungen, Vertragsänderungen) bis zum 04.03.2014 berücksichtigt. Lösen Sie die Beitragsrechnung bitte auch bei Änderungen (z.B. Fahrzeugwechsel) ein. Die Zahlung werden wir verrechnen. + +Amtliches Kennzeichen: MS xx zzzz +Fahrzeug: PKW + +Versicherungsumfang: +Kfz-Haftpflicht: Deckung 100 Mio. € pausch/12 Mio. € pro Pers./Umweltschadengesetz: +5 Mio. € je Schadenereignis, max. 10 Mio. € pro Jahr +Vollkasko mit 300 € Selbstbeteiligung inkl. Teilkasko ohne Selbstbeteiligung + + + + + + + + + 67.2269 + + + 67.2269 + + + + 1.0000 + + + + ZF_INSURANCE_TAX + S + 19.00 + + + 67.23 + + + + Kfz-Haftpflicht SF25 (30 %) Typkl. 18 Regio R9 + + + + + + + 117.6471 + + + 117.6471 + + + + 1.0000 + + + + ZF_INSURANCE_TAX + S + 19.00 + + + 117.65 + + + + Vollkasko SF25 (30 %) Typkl. 21 Regio R4 + + + + + + Beitrag bei vierteljährlicher Zahlung + +Ausstehende Forderungen am Ausstellungstag (Stand 04.03.2014) betragen 220,00 € + +Diese Rechnung wird auch als Beitragsnachweis vom Finanzamt anerkannt. + + +Freundliche Grüße + + + + + + \ No newline at end of file diff --git a/tests/samples/ZUGFeRD_1p0_COMFORT_Rabatte.xml b/tests/samples/ZUGFeRD_1p0_COMFORT_Rabatte.xml new file mode 100644 index 0000000..fdc785a --- /dev/null +++ b/tests/samples/ZUGFeRD_1p0_COMFORT_Rabatte.xml @@ -0,0 +1,381 @@ + + + + + + true + + + + urn:ferd:CrossIndustryDocument:invoice:1p0:comfort + + + + 471102 + RECHNUNG + 380 + + 20130605 + + + +Rechnung gemäß Bestellung Nr. 2013-471331 vom 01.03.2013. + + + + +Es bestehen Rabatt- und Bonusvereinbarungen. + + AAK + + + Lieferant GmbH +Lieferantenstraße 20 +80333 München +Deutschland +Geschäftsführer: Hans Muster +Handelsregisternummer: H A 123 + + REG + + + + + AB-312 + + 4000001123452 + Lieferant GmbH + + 80333 + Lieferantenstraße 20 + München + DE + + + 201/113/40209 + + + DE123456789 + + + + GE2020211 + 4000001987658 + Kunden AG Mitte + + Hans Muster + + + 69876 + Kundenstraße 15 + Frankfurt + DE + + + DE234567890 + + + + 2013-03-01T00:00:00 + 2013-471331 + + + + + + 20130603 + + + + 2013-06-03T00:00:00 + 2013-51112 + + + + GE2020211-471102 + EUR + + 42 + Überweisung + + DE08700901001234567890 + 1234567890 + + + GENODEF1M04 + 70090100 + Hausbank München + + + + 9.06 + VAT + 129.37 + S + 7.00 + + + 12.25 + VAT + 64.46 + S + 19.00 + + + + false + + 10.00 + 1.00 + Sondernachlass + + VAT + S + 19.00 + + + + + false + + 137.30 + 13.73 + Sondernachlass + + VAT + S + 7.00 + + + + Versandkosten + 5.80 + + VAT + S + 7.00 + + + + Zahlbar innerhalb 30 Tagen netto bis 04.07.2013, 3% Skonto innerhalb 10 Tagen bis 15.06.2013 + + 20130704 + + + + 202.76 + 5.80 + 14.73 + 193.83 + 21.31 + 215.14 + 50.00 + 165.14 + + + + + + Wir erlauben uns Ihnen folgende Positionen aus der Lieferung Nr. 2013-51112 in Rechnung zu stellen: + + + + + + + 1 + + + + 4.0000 + 1.0000 + + + false + + 0.6667 + Rabatt + + + + 3.3333 + 1 + + + + 3.0000 + + + + VAT + S + 19.00 + + + 10.00 + + + + 4012345001235 + KR3M + 55T01 + Kunstrasen grün 3m breit + 300cm x 100 cm + + + + + 2 + + + + 5.5000 + 1.0000 + + + 5.5000 + 1.0000 + + + + 5.0000 + + + + VAT + S + 7.00 + + + 27.50 + + + + 4000050986428 + SFK5 + 55T02 + Schweinesteak + aus Deutschland + + + + + 3 + + + + 5.4900 + 1.0000 + + + 5.4900 + 1.0000 + + + + 20.0000 + + + + VAT + S + 7.00 + + + 109.80 + + + + 4000001234561 + GTRWA5 + 55T03 + Mineralwasser Medium +12 x 1,0l PET + + + + + 4 + + nicht rabattierfähig + PRF + + + + + 2.7700 + 1.0000 + + + 2.7700 + 1 + + + + 20.0000 + + + + VAT + S + 19.00 + + + 55.46 + + + + 4000001234578 + PFA5 + 55T04 + Pfand + + + + diff --git a/tests/samples/ZUGFeRD_1p0_COMFORT_Rechnungskorrektur.xml b/tests/samples/ZUGFeRD_1p0_COMFORT_Rechnungskorrektur.xml new file mode 100644 index 0000000..293ecdd --- /dev/null +++ b/tests/samples/ZUGFeRD_1p0_COMFORT_Rechnungskorrektur.xml @@ -0,0 +1,306 @@ + + + + + + true + + urn:ferd:CrossIndustryDocument:invoice:1p0:comfort + + + + RK21012345 + RECHNUNGS-KORREKTUR + 380 + + 20130916 + + + Es bestehen Rabatt- oder Bonusvereinbarungen. + AAK + + + MUSTERLIEFERANT GMBH +BAHNHOFSTRASSE 99 +99199 MUSTERHAUSEN +Geschäftsführung: +Max Mustermann +USt-IdNr: DE123456789 +Telefon: +49 932 431 0 +www.musterlieferant.de +HRB Nr. 372876 +Amtsgericht Musterstadt +GLN 4304171000002 + REG + + + Bei Rückfragen: +Telefon: +49 932 431 500 +E-Mail : max.muster@musterlieferant.de + + + Ursprungsbeleg-Nr : R87654321012345 +Reklamationsnummer : REKLA-2013-235 + + + Warenempfänger +GLN 430417088093 +MUSTER-MARKT + +HAUPTSTRASSE 44 +31157 SARSTEDT + +Abteilung : 8211 + + + + + + 549910 + 4333741000005 + MUSTERLIEFERANT GMBH + + 99199 + BAHNHOFSTRASSE 99 + MUSTERHAUSEN + DE + + + DE123456789 + + + + 009420 + 4304171000002 + MUSTER-KUNDE GMBH + + 40235 + KUNDENWEG 88 + DUESSELDORF + DE + + + + 2013-08-01T00:00:00 + B123456789 + + + + + + 20130805 + + + + 2013-08-05T00:00:00 + L87654321012345 + + + + EUR + + 009420 + 4304171000002 + MUSTER-KUNDE GMBH + + 40235 + KUNDENWEG 88 + DUESSELDORF + DE + + + + -0.92 + VAT + -4.85 + S + 19.00 + + + -0.20 + VAT + -2.82 + S + 7.00 + + + false + 0.10 + Rechnungsrabatt 1 -2,00% Basisbetrag: -5,00, MwSt.-% 19,0 + + VAT + S + 19.00 + + + + false + 0.06 + Rechnungsrabatt 1 -2,00% Basisbetrag: -2,90, MwSt.-% 7,0 + + VAT + S + 7.00 + + + + false + 0.05 + Rechnungsrabatt 2 Basisbetrag: -5,00, MwSt.-% 19,0 + + VAT + S + 19.00 + + + + false + 0.02 + Rechnungsrabatt 2 Basisbetrag: -2,90, MwSt.-% 7,0 + + VAT + S + 7.00 + + + + -7.90 + 0.00 + -0.23 + -7.67 + -1.12 + -8.79 + 0.00 + 0.00 + + + + + + Gemäß Ihres Reklamationsschreibens vom 10.09.2013 und unseres Telefonats vom 12.09.2013 erhalten Sie die +nachfolgenden Leistungen gutgeschrieben. + + + + + + + + + 1.0000 + + + 1.0000 + + + + -5.0000 + + + + VAT + S + 19.00 + + + -5.00 + + + + 4123456000014 + ZS997 + Zitronensäure 100ml + Verpackung: Flasche +VKE/Geb: 1 + + + + + + + 1.5000 + + false + 0.0300 + Artikelrabatt 1: -2,00% Basis: -1,500 € Rabatt: 0,03 € + + + false + 0.0200 + Artikelrabatt 2: Basis: Rabatt: 0,02 €/Stk. + + + + 1.4500 + + + + -2.0000 + + + + VAT + S + 7.00 + + + -2.90 + + + + 4123456000021 + GZ250 + Gelierzucker Extra 250g + Verpackung: Karton +VKE/Geb: 1 + + + + + diff --git a/tests/samples/ZUGFeRD_1p0_COMFORT_SEPA_Prenotification.xml b/tests/samples/ZUGFeRD_1p0_COMFORT_SEPA_Prenotification.xml new file mode 100644 index 0000000..5735df8 --- /dev/null +++ b/tests/samples/ZUGFeRD_1p0_COMFORT_SEPA_Prenotification.xml @@ -0,0 +1,226 @@ + + + + + true + + urn:ferd:CrossIndustryDocument:invoice:1p0:comfort + + + + 471102 + RECHNUNG + 380 + 20140305 + + Rechnung gemäß Bestellung Nr. 2014-471331 vom 01.03.2014. + + + Es bestehen Rabatt- und Bonusvereinbarungen. + AAK + + + Lieferant GmbH +Lieferantenstraße 20 +80333 München +Deutschland +Geschäftsführer: Hans Muster +Handelsregisternummer: H A 123 + +REG + + + + + + 4000001123452 + Lieferant GmbH + + 80333 + Lieferantenstraße 20 + München + DE + + + 201/113/40209 + + + DE123456789 + + + + GE2020211 + 4000001987658 + Kunden AG Mitte + + Hans Muster + + + 69876 + Kundenstraße 15 + Frankfurt + DE + + + + + + 20130305 + + + + 2013-471102 + EUR + + 49 + SEPA-Lastschrift + REF A-123 + + DE21860000000086001055 + + + MARKDEF1860 + Deutsche Bundesbank -Filiale Leipzig- + + + + 19.25 + VAT + 275.00 + S + 7.00 + + + 37.62 + VAT + 198.00 + S + 19.00 + + + Der Betrag in Höhe von EUR 529,87 wird am 20.03.2014 von Ihrem Konto mit IBAN DE21860000000086001055 +und BIC MARKDEF1860, Deutsche Bundesbank -Filiale Leipzig- per SEPA-Lastschrift eingezogen. +Mandatsreferenz: REF A-123, Gläubiger-Identifikationsnummer: DE98ZZZ09999999999 + 20140320 + + + 473.00 + 0.00 + 0.00 + 473.00 + 56.87 + 529.87 + 0.00 + 529.87 + + + + + 1 + + + + 9.9000 + + + 9.9000 + + + + 20.0000 + + + + VAT + S + 19.00 + + + 198.00 + + + + 4012345001235 + TB100A4 + Trennblätter A4 + + + + + 2 + + + + 5.5000 + + + 5.5000 + + + + 50.0000 + + + + VAT + S + 7.00 + + + 275.00 + + + + 4000050986428 + ARNR2 + Joghurt Banane + + + + \ No newline at end of file diff --git a/tests/samples/ZUGFeRD_1p0_COMFORT_Sachversicherung_berechneter_Steuersatz.xml b/tests/samples/ZUGFeRD_1p0_COMFORT_Sachversicherung_berechneter_Steuersatz.xml new file mode 100644 index 0000000..d94b4c7 --- /dev/null +++ b/tests/samples/ZUGFeRD_1p0_COMFORT_Sachversicherung_berechneter_Steuersatz.xml @@ -0,0 +1,220 @@ + + + + + true + + urn:ferd:CrossIndustryDocument:invoice:1p0:comfort + + + + 00.123.456.7-2014-1 + Beitragsrechnung + 380 + 20140418 + + Sachversicherungsvertrag Nr: 00.123.456.7 +(Bei Schriftwechsel und Zahlung bitte angeben.) + + + MVM Musterhafter +Versicherungsverein Musterstadt a.G. +Versicherungsbüro +Muster +Musterstr. 12 +12345 Musterstadt +Tel.: 0123/45678 +Fax.: 01231/99 45678 +Mo.-Fr. 08.30 - 12.30 Uhr +Mo.-Fr. 14.00 - 17.00 Uhr +Mo-Fr 8.00-20.00 Uhr, Sa 8.00-14.00 Uhr + + REG + + + + + 00.123.456.7 + + MVM Musterhafter +Versicherungsverein Musterstadt a.G. + + 12345 + Musterstr. 12 + Musterstadt + DE + + + + Herrn +Max Mustermann + + 12346 + Musterstr. 11 + Bad Musterhausen + DE + + + + + + 20150521 + + + + 00.123.456.7 + EUR + + 42 + Überweisung + + DE75123456780000001234 + + + WELADED1MST + Sparkasse Musterstadt Ost + + + + 163.40 + ZF_INSURANCE_TAX + 1000.00 + S + 16.34 + + + 20140521 + + + 20150521 + + + Einen zu zahlenden Beitrag überweisen Sie bitte auf folgende Bankverbindung: IBAN DE75123456780000001234, BIC WELADED1MST, Sparkasse Musterstadt Ost. +Einfacher für Sie ist es, wenn Sie uns ein SEPA-Lastschriftmandat erteilen. Wir würden dann zu der Fälligkeit 21.05.2014 den Beitrag von dem uns bekannten Konto abbuchen. In diesem Fall würden Sie, sofern sich keine Beitragsänderung ergibt, zukünftig keine Zwischenrechnung erhalten. +Beitragsgutschriften aus Ihrem Vertrag erstatten wir per Scheck. + + 20140521 + + + 1000.00 + 0.00 + 0.00 + 1000.00 + 163.40 + 1163.40 + 0.00 + 1163.40 + + + + + + Sehr geehrter Herr Mustermann, +zu Ihrer Verbundenen Wohngebäudeversicherung berechnen wir Ihnen für den Zeitraum vom 21.05.2014 bis +21.05.2015 nachstehenden Beitrag: +Versicherungsort: Muster Str. 11, 12345 Bad Musterhausen +- Weisen Sie uns bitte auf eine Änderung Ihrer Anschrift und/oder Ihres Versicherungsgrundstückes hin - + +Vereinbarter Versicherungsschutz: + + + + + + + + + 1000.0000 + + + 1000.0000 + + + + 1.0000 + + + + ZF_INSURANCE_TAX + S + 16.34 + + + 1000.00 + + + + Verbundene Wohngebäudeversicherung + - Feuerversicherung - Teil A § 2 62.000 MK1914 +- Leitungswasserversicherung - Teil A § 3 62.000 MK1914 +- Sturm- und Hagelversicherung - Teil A § 4 Ziff. 2 62.000 MK1914 +- WohngebäudePlus und zusätzliche Einschlüsse gemäß Antrag +- Weitere Elementargefahren - Teil A § 4 Ziff. 3 62.000 MK1914 + + + + + + + Der Versicherungsteuerbetrag in der Verbundenen Wohngebäudeversicherung berechnet sich mit dem Versicherungsteuersatz von 19 % von 86 % des Versicherungsentgelts (Nettobeitrag). + +Bitte lösen Sie diese Rechnung auch bei beantragten Vertragsänderungen ein. Die Zahlung wird verrechnet. +Durch die Baupreisentwicklung hat sich der Gleitende Neuwertfaktor erhöht auf 16,6 (Teil A §12 VGB2011). Die Haftung, die Leistung des Versicherers und der Beitrag wurden entsprechend geändert. +Sofern sich der Wert Ihres Gebäudes während der laufenden Versicherungsperiode durch Um-, An- oder Ausbauten erhöht hat, sprechen Sie bitte unbedingt mit Ihrer Vertrauensfrau / Ihrem Vertrauensmann! Die Versicherungssumme für Ihr Gebäude muss angepasst werden. +Dieses Dokument dient auch zur Vorlage beim Finanzamt. + + + +Freundliche Grüße + + + + + + \ No newline at end of file diff --git a/tests/samples/ZUGFeRD_1p0_EXTENDED_Kostenrechnung.xml b/tests/samples/ZUGFeRD_1p0_EXTENDED_Kostenrechnung.xml new file mode 100644 index 0000000..5315747 --- /dev/null +++ b/tests/samples/ZUGFeRD_1p0_EXTENDED_Kostenrechnung.xml @@ -0,0 +1,478 @@ + + + + + + true + + urn:ferd:CrossIndustryDocument:invoice:1p0:extended + + + + KR87654321012 + KOSTENRECHNUNG + 380 + + 20131006 + + + ST3 + Es bestehen Rabatt- oder Bonusvereinbarungen. + AAK + + + EEV + Der Verkäufer bleibt Eigentümer der Waren bis zur vollständigen Erfüllung der Kaufpreisforderung. + AAJ + + + MUSTERLIEFERANT GMBH +BAHNHOFSTRASSE 99 +99199 MUSTERHAUSEN +Geschäftsführung: +Max Mustermann +USt-IdNr: DE123456789 +Telefon: +49 932 431 0 +www.musterlieferant.de +HRB Nr. 372876 +Amtsgericht Musterstadt +GLN 4304171000002 + REG + + + + + + 549910 + 4333741000005 + MUSTERLIEFERANT GMBH + + + +49 932 431 500 + + + max.mustermann@musterlieferant.de + + + + 99199 + BAHNHOFSTRASSE 99 + MUSTERHAUSEN + DE + + + 5133081508159 + + + + 339420 + 4304171000002 + MUSTER-KUNDE GMBH + + 40235 + KUNDENWEG 88 + DUESSELDORF + DE + + + + 2013-04-01T00:00:00 + V88456789 + + + 2014-04-02T00:00:00 + VN + A777123 + + + + + 4304171088093 + MUSTER-MARKT + + 7322 + + + 31157 + HAUPTSTRASSE 44 + SARSTEDT + DE + + + + 4333741002207 + KOSTENLIEFERANT GMBH + + 99199 + Werk 3 + Hauptstr. 1 + MUSTERHAUSEN + DE + + + + + 20130930 + + + + 2013-09-30T00:00:00 + L87654321012 + + + + EUR + + 339420 + 4304171000002 + MUSTER-KUNDE GMBH + + 40235 + KUNDENWEG 88 + DUESSELDORF + DE + + + + 200.65 + VAT + 1056.05 + 1062.60 + -6.55 + S + 19.00 + + + + 20130102 + + + 20130930 + + + + false + 1077.60 + -21.55 + EAB + Skonto sofort + + VAT + S + 19.00 + + + + Transportkosten: Frachbetrag + 15.00 + + VAT + S + 19.00 + + + + Skontovereinbarung: 2% bei Zahlung innerhalb 10 Tagen nach Rechnungsdatum + + + 20131006 + + 10 + 2.00 + + + + 1062.60 + 15.00 + 21.55 + 1056.05 + 200.65 + 1256.70 + 0.00 + 1256.70 + + + 4430-MG-100 + + + + + + Wichtige Information: Bei Bestellungen bis zum 19.12. ist die Auslieferung bis spätestens 23.12. garantiert. + + + + + + + + + 0.0520 + + + 0.0520 + + + + 10000.0000 + + + + VAT + S + 19.00 + + + + 20130901 + + + 20130930 + + + + 520.00 + + + + 4123456000014 + WA997 + Wirkarbeit HT + + METER_LOCATION + Zählpunkt + DE0001346484600000000000000100038 + + + + + + + + 0.0205 + + + 0.0205 + + + + 10000.0000 + + + + VAT + S + 19.00 + + + + 201338 + + + 201338 + + + + 205.00 + + + + 4123456000021 + ÖST250 + Ökosteuer Lieferant + + + + + + + 15.0000 + + false + 30.00 + 15.0000 + 4.5000 + Artikelrabatt 1 + + + + 10.5000 + + + + 27.5000 + + + + VAT + S + 19.00 + + + + 201336 + + + 201336 + + + + 5465-8876 + + + 288.75 + + + + 4260331811362 + K6521 + Kommissionierer 1250032 D. Muster + Besteller: Hr. Mayer, Personalnr. 4488 + + + + + + + B61006152350010 + + + 0.0105 + + + 0.0105 + + + + 3500.0000 + + L87654321011 + + + + + VAT + S + 19.00 + + + 36.75 + + + + 2001015001325 + FB05 + K4322 + FALTENBEUTEL 16x6x28 CM + + + + + + + B610061523500010 + + + 0.0100 + + + 0.0100 + + + + 1210.0000 + + Mustermarkt + + Sekretariat-2 + + + 31157 + Hauptstr. 46 + Sarstedt + DE + + + + + + VAT + S + 19.00 + + + + 20130915 + + + 20130930 + + + + 4430-MG-002 + + + 12.10 + + + + 4123456000038 + KOP05 + K4322 + Kopierpapier A4 + Zählerstand von-bis: 543210 - 544420 + + METER_NUMBER + Zähler-Nr. + MG-X79318 + + + + + diff --git a/tests/samples/ZUGFeRD_1p0_EXTENDED_Rechnungskorrektur.xml b/tests/samples/ZUGFeRD_1p0_EXTENDED_Rechnungskorrektur.xml new file mode 100644 index 0000000..91f0be9 --- /dev/null +++ b/tests/samples/ZUGFeRD_1p0_EXTENDED_Rechnungskorrektur.xml @@ -0,0 +1,329 @@ + + + + + + true + + urn:ferd:CrossIndustryDocument:invoice:1p0:extended + + + + RK21012345 + RECHNUNGS-KORREKTUR + 380 + + 20130916 + + + ST3 + Es bestehen Rabatt- oder Bonusvereinbarungen. + AAK + + + MUSTERLIEFERANT GMBH +BAHNHOFSTRASSE 99 +99199 MUSTERHAUSEN +Geschäftsführung: +Max Mustermann +USt-IdNr: DE123456789 +Telefon: +49 932 431 0 +www.musterlieferant.de +HRB Nr. 372876 +Amtsgericht Musterstadt +GLN 4304171000002 + REG + + + + + + 549910 + 4333741000005 + MUSTERLIEFERANT GMBH + + + +49 932 431 500 + + + max.mustermann@musterlieferant.de + + + + 99199 + BAHNHOFSTRASSE 99 + MUSTERHAUSEN + DE + + + DE123456789 + + + + 009420 + 4304171000002 + MUSTER-KUNDE GMBH + + 40235 + KUNDENWEG 88 + DUESSELDORF + DE + + + + 2013-08-01T00:00:00 + B123456789 + + + AGG + REKLA-2013-235 + + + OI + R87654321012345 + + + + + 4304171088093 + MUSTER-MARKT + + 8211 + + + 31157 + HAUPTSTRASSE 44 + SARSTEDT + DE + + + + + 20130805 + + + + 2013-08-05T00:00:00 + L87654321012345 + + + + EUR + + 009420 + 4304171000002 + MUSTER-KUNDE GMBH + + 40235 + KUNDENWEG 88 + DUESSELDORF + DE + + + + -0.92 + VAT + -4.85 + -5.00 + 0.15 + S + 19.00 + + + -0.20 + VAT + -2.82 + -2.90 + 0.08 + S + 7.00 + + + false + -2.00 + -5.00 + 0.10 + Rechnungsrabatt 1 + + VAT + S + 19.00 + + + + false + -2.00 + -2.90 + 0.06 + Rechnungsrabatt 1 + + VAT + S + 7.00 + + + + false + -5.00 + 1 + 0.05 + Rechnungsrabatt 2 + + VAT + S + 19.00 + + + + false + -2.90 + 1 + 0.02 + Rechnungsrabatt 2 + + VAT + S + 7.00 + + + + -7.90 + 0.00 + -0.23 + -7.67 + -1.12 + -8.79 + 0.00 + 0.00 + + + + + + Gemäß Ihres Reklamationsschreibens vom 10.09.2013 und unseres Telefonats vom 12.09.2013 erhalten Sie die +nachfolgenden Leistungen gutgeschrieben. + + + + + + + + + 1.0000 + + + 1.0000 + + + + -5.0000 + 1.0000 + + + + VAT + S + 19.00 + + + -5.00 + + + + 4123456000014 + ZS997 + Zitronensäure 100ml + + + + + + + 1.5000 + + false + -2.00 + -1.5000 + 0.0300 + Artikelrabatt 1 + + + false + 1 + 0.0200 + Artikelrabatt 2 + + + + 1.4500 + + + + -2.0000 + 1.0000 + + + + VAT + S + 7.00 + + + -2.90 + + + + 4123456000021 + GZ250 + Gelierzucker Extra 250g + + + + diff --git a/tests/samples/ZUGFeRD_1p0_EXTENDED_Warenrechnung.xml b/tests/samples/ZUGFeRD_1p0_EXTENDED_Warenrechnung.xml new file mode 100644 index 0000000..071dbd2 --- /dev/null +++ b/tests/samples/ZUGFeRD_1p0_EXTENDED_Warenrechnung.xml @@ -0,0 +1,522 @@ + + + + + + true + + urn:ferd:CrossIndustryDocument:invoice:1p0:extended + + + + R87654321012345 + WARENRECHNUNG + 380 + + 20130806 + + + ST3 + Es bestehen Rabatt- oder Bonusvereinbarungen. + AAK + + + EEV + Der Verkäufer bleibt Eigentümer der Waren bis zu vollständigen Erfüllung der Kaufpreisforderung. + AAJ + + + MUSTERLIEFERANT GMBH +BAHNHOFSTRASSE 99 +99199 MUSTERHAUSEN +Geschäftsführung: +Max Mustermann +USt-IdNr: DE123456789 +Telefon: +49 932 431 0 +www.musterlieferant.de +HRB Nr. 372876 +Amtsgericht Musterstadt +GLN 4304171000002 +WEEE-Reg-Nr.: DE87654321 + REG + + + Leergutwert: 46,50 + + + + + + 549910 + 4333741000005 + MUSTERLIEFERANT GMBH + + + +49 932 431 500 + + + max.mustermann@musterlieferant.de + + + + 99199 + BAHNHOFSTRASSE 99 + MUSTERHAUSEN + DE + + + DE123456789 + + + + 009420 + 4304171000002 + MUSTER-KUNDE GMBH + + 40235 + KUNDENWEG 88 + DUESSELDORF + DE + + + + 2013-08-01T00:00:00 + B123456789 + + + 2013-08-02T00:00:00 + VN + A456123 + + + + + 4304171088093 + MUSTER-MARKT + + 8211 + + + 31157 + HAUPTSTRASSE 44 + SARSTEDT + DE + + + + + 20130805 + + + + 2013-08-05T00:00:00 + L87654321012345 + + + + EUR + + 009420 + 4304171000002 + MUSTER-KUNDE GMBH + + 40235 + KUNDENWEG 88 + DUESSELDORF + DE + + + + 61.07 + VAT + 321.40 + 326.50 + -5.10 + S + 19.00 + + + 8.93 + VAT + 127.59 + 130.70 + -3.11 + S + 7.00 + + + false + 2.00 + 280.00 + 5.60 + Rechnungsrabatt 1 + + VAT + S + 19.00 + + + + false + 2.00 + 130.70 + 2.61 + Rechnungsrabatt 1 + + VAT + S + 7.00 + + + + false + 280.00 + 2.50 + Rechnungsrabatt 2 + + VAT + S + 19.00 + + + + false + 130.70 + 0.50 + Rechnungsrabatt 2 + + VAT + S + 7.00 + + + + Transportkosten + 3.00 + + VAT + S + 19.00 + + + + Bei Zahlung innerhalb 14 Tagen gewähren wir 2,0% Skonto. + + 14 + 2.00 + + + + 457.20 + 3.00 + 11.21 + 448.99 + 70.00 + 518.99 + 0.00 + 518.99 + + + + + + Wichtige Information: Bei Bestellungen bis zum 19.12. ist die Auslieferung bis spätestens 23.12. garantiert. + + + + + + + + + 1.0000 + + + 1.0000 + + + + 100.0000 + 4.0000 + + + + VAT + S + 19.00 + + + 100.00 + + + + 4123456000014 + ZS997 + Zitronensäure 100ml + + PACKAGING_TYPE + Verpackungsart + BO + + + + + + + + 1.5000 + + false + 2.00 + 1.5000 + 0.0300 + Artikelrabatt 1 + + + false + 1 + 0.0200 + Artikelrabatt 2 + + + + 1.4500 + + + + 50.0000 + 1.0000 + + + + VAT + S + 7.00 + + + 72.50 + + + + 4123456000021 + GZ250 + Gelierzucker Extra 250g + + + + + + + 0.0000 + + + 0.0000 + + + + 10.0000 + 1.0000 + + + + VAT + S + 7.00 + + + 0.00 + + + + 4123456000021 + GZ250 + Gelierzucker Extra 250g + Artikel wie vereinbart ohne Berechnung + + + + + + Öko-Kontroll-Nr.: DE-BW-006-987654321054 + AAY + + + + + 12.0000 + + + 12.0000 + + + + 15.0000 + 20.0000 + + + + VAT + S + 19.00 + + + 180.00 + + + + 4100130013294 + 2031 + K4321 + Bierbrau Pils 20/0500 + EAN-VKE: 4100130913297 + + PACKAGING_MATERIAL + Verpackung + Kiste + + + + + + + + 3.1000 + + + 3.1000 + + + + 15.0000 + 1.0000 + + + + VAT + S + 19.00 + + + 46.50 + + + + 2001015001325 + 1805 + K4322 + Leergutpfand 20 x 0,5l + + PACKAGING_MATERIAL + Verpackung + unverpackt + + + + + + + + 30.0000 + + false + 3.00 + 30.0000 + 0.9000 + Artikelrabatt 1 + + + + 29.1000 + + + + 2.0000 + 1.0000 + + + + VAT + S + 7.00 + + + 58.20 + + + + 4123456000038 + MP107 + Mischpalette Joghurt Karton 3 x 20 + + PACKAGING_MATERIAL + Verpackung + Karton + + + 4123456001035 + JOG103 + Erdbeer 20 x 150g Becher + 20.0000 + + + 4123456002032 + JOG203 + Banane 20 x 150g Becher + 20.0000 + + + 4123456003039 + JOG303 + Schoko 20 x 150g Becher + 20.0000 + + + + + diff --git a/tests/test_roundtrip.py b/tests/test_roundtrip.py index e358e93..751260a 100644 --- a/tests/test_roundtrip.py +++ b/tests/test_roundtrip.py @@ -7,12 +7,27 @@ from drafthorse.utils import prettify samples = [ 'easybill_sample.xml', + 'ZUGFeRD_1p0_BASIC_Einfach.xml', + 'ZUGFeRD_1p0_BASIC_Rechnungskorrektur.xml', + 'ZUGFeRD_1p0_COMFORT_Einfach.xml', + 'ZUGFeRD_1p0_COMFORT_Haftpflichtversicherung_Versicherungssteuer.xml', + 'ZUGFeRD_1p0_COMFORT_Kraftfahrversicherung_Bruttopreise.xml', + 'ZUGFeRD_1p0_COMFORT_Rabatte.xml', + 'ZUGFeRD_1p0_COMFORT_Rechnungskorrektur.xml', + 'ZUGFeRD_1p0_COMFORT_Sachversicherung_berechneter_Steuersatz.xml', + 'ZUGFeRD_1p0_COMFORT_SEPA_Prenotification.xml', + 'ZUGFeRD_1p0_EXTENDED_Kostenrechnung.xml', + 'ZUGFeRD_1p0_EXTENDED_Rechnungskorrektur.xml', + 'ZUGFeRD_1p0_EXTENDED_Warenrechnung.xml', ] @pytest.mark.parametrize("filename", samples) def test_sample_roundtrip(filename): - origxml = prettify(open(os.path.join(os.path.dirname(__file__), 'samples', filename), 'r').read()) + origxml = prettify( + open(os.path.join(os.path.dirname(__file__), 'samples', filename), 'rb').read(), + remove_comments=True + ) doc = Document.parse(origxml) generatedxml = prettify(doc.serialize()) - assert generatedxml.decode().strip() == origxml.decode().strip() + assert origxml.decode().strip() == generatedxml.decode().strip()