} // !generate() private InvoiceDescriptor _generateDescriptor() { InvoiceDescriptor desc = InvoiceDescriptor.CreateInvoice("R87654321012345", new DateTime(2013, 8, 6), CurrencyCodes.EUR); desc.IsTest = true; desc.AddNote("Es bestehen Rabatt- oder Bonusvereinbarungen.", SubjectCodes.AAK, ContentCodes.ST3); desc.AddNote("Der Verkäufer bleibt Eigentümer der Waren bis zu vollständigen Erfüllung der Kaufpreisforderung.", SubjectCodes.AAJ, ContentCodes.EEV); desc.AddNote("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", SubjectCodes.REG); desc.AddNote("Leergutwert: 46,50"); desc.SetSeller("MUSTERLIEFERANT GMBH", "99199", "MUSTERHAUSEN", "BAHNHOFSTRASSE 99", CountryCodes.DE, "549910", new GlobalID(GlobalID.SchemeID_GLN, "4333741000005")); desc.SetSellerContact("", emailAddress: "*****@*****.**", phoneno: "+49 932 431 500"); desc.AddSellerTaxRegistration("DE123456789", TaxRegistrationSchemeID.VA); desc.SetBuyer("MUSTER-KUNDE GMBH", "40235", "DUESSELDORF", "KUNDENWEG 88", CountryCodes.DE, "009420", new GlobalID(GlobalID.SchemeID_GLN, "4304171000002")); desc.SetBuyerOrderReferenceDocument("B123456789", new DateTime(2013, 08, 01)); desc.AdditionalReferencedDocument = new AdditionalReferencedDocument() { ID = "A456123", IssueDateTime = new DateTime(2013, 08, 02), ReferenceTypeCode = ReferenceTypeCodes.VN }; /// TODO: ApplicableSupplyChainTradeDelivery /// desc.addTradeLineCommentItem("Wichtige Information: Bei Bestellungen bis zum 19.12. ist die Auslieferung bis spätestens 23.12. garantiert."); TradeLineItem item = desc.addTradeLineItem("Zitronensäure 100ml", null, QuantityCodes.C62, null, 1, 1, 100, TaxTypes.VAT, TaxCategoryCodes.S, 19, null, new GlobalID("0088", "4123456000014"), "ZS997", "", "", null, "", null); item = desc.addTradeLineItem("Gelierzucker Extra 250g", null, QuantityCodes.C62, null, 1.5m, 1.45m, 50, TaxTypes.VAT, TaxCategoryCodes.S, 7, null, new GlobalID("0088", "4123456000021"), "GZ250", "", "", null, "", null); item.addTradeAllowanceCharge(true, CurrencyCodes.EUR, 1.5m, 0.03m, "Artikelrabatt 1"); item.addTradeAllowanceCharge(true, CurrencyCodes.EUR, 1m, 0.02m, "Artikelrabatt 2"); return(desc); } // !_generateDescriptor()
private static TradeLineItem ParseTradeLineItem(XmlNode tradeLineItem, XmlNamespaceManager nsmgr, ZugferdDialect zugferdDialect) { if (tradeLineItem == null) { return(null); } TradeLineItem item = new TradeLineItem { GlobalID = new GlobalID(NodeAsString(tradeLineItem, ".//ram:SpecifiedTradeProduct/ram:GlobalID/@schemeID", nsmgr), NodeAsString(tradeLineItem, ".//ram:SpecifiedTradeProduct/ram:GlobalID", nsmgr)), SellerAssignedID = NodeAsString(tradeLineItem, ".//ram:SpecifiedTradeProduct/ram:SellerAssignedID", nsmgr), BuyerAssignedID = NodeAsString(tradeLineItem, ".//ram:SpecifiedTradeProduct/ram:BuyerAssignedID", nsmgr), Name = NodeAsString(tradeLineItem, ".//ram:SpecifiedTradeProduct/ram:Name", nsmgr), Description = NodeAsString(tradeLineItem, ".//ram:SpecifiedTradeProduct/ram:Description", nsmgr), UnitQuantity = NodeAsDecimal(tradeLineItem, ".//ram:BasisQuantity", nsmgr, 1), BilledQuantity = NodeAsDecimal(tradeLineItem, ".//ram:BilledQuantity", nsmgr, 0).Value, LineTotalAmount = NodeAsDecimal(tradeLineItem, ".//ram:LineTotalAmount", nsmgr, 0), TaxCategoryCode = default(TaxCategoryCodes).FromString(NodeAsString(tradeLineItem, ".//ram:ApplicableTradeTax/ram:CategoryCode", nsmgr)), TaxType = default(TaxTypes).FromString(NodeAsString(tradeLineItem, ".//ram:ApplicableTradeTax/ram:TypeCode", nsmgr)), TaxPercent = NodeAsDecimal(tradeLineItem, $".//ram:ApplicableTradeTax/ram:{zugferdDialect.ApplicablePercent}", nsmgr, 0).Value, NetUnitPrice = NodeAsDecimal(tradeLineItem, ".//ram:NetPriceProductTradePrice/ram:ChargeAmount", nsmgr, 0).Value, GrossUnitPrice = NodeAsDecimal(tradeLineItem, ".//ram:GrossPriceProductTradePrice/ram:ChargeAmount", nsmgr, 0).Value, UnitCode = default(QuantityCodes).FromString(NodeAsString(tradeLineItem, ".//ram:BasisQuantity/@unitCode", nsmgr)) }; if (tradeLineItem.SelectSingleNode(".//ram:AssociatedDocumentLineDocument", nsmgr) != null) { item.AssociatedDocument = new AssociatedDocument { LineID = NodeAsInt(tradeLineItem, ".//ram:AssociatedDocumentLineDocument/ram:LineID", nsmgr, int.MaxValue) }; XmlNodeList noteNodes = tradeLineItem.SelectNodes(".//ram:AssociatedDocumentLineDocument/ram:IncludedNote", nsmgr); foreach (XmlNode noteNode in noteNodes) { item.AssociatedDocument.Notes.Add(new Note( content: NodeAsString(noteNode, ".//ram:Content", nsmgr), subjectCode: default(SubjectCodes).FromString(NodeAsString(noteNode, ".//ram:SubjectCode", nsmgr)), contentCode: ContentCodes.Unknown )); } if (item.AssociatedDocument.LineID == int.MaxValue) // a bit dirty, but works for now { item.AssociatedDocument.LineID = null; } } XmlNodeList appliedTradeAllowanceChargeNodes = tradeLineItem.SelectNodes($".//ram:{zugferdDialect.SpecifiedLineTradeAgreement}/ram:GrossPriceProductTradePrice/ram:AppliedTradeAllowanceCharge", nsmgr); foreach (XmlNode appliedTradeAllowanceChargeNode in appliedTradeAllowanceChargeNodes) { bool chargeIndicator = NodeAsBool(appliedTradeAllowanceChargeNode, "./ram:ChargeIndicator/udt:Indicator", nsmgr); decimal basisAmount = NodeAsDecimal(appliedTradeAllowanceChargeNode, "./ram:BasisAmount", nsmgr, 0).Value; string basisAmountCurrency = NodeAsString(appliedTradeAllowanceChargeNode, "./ram:BasisAmount/@currencyID", nsmgr); decimal actualAmount = NodeAsDecimal(appliedTradeAllowanceChargeNode, "./ram:ActualAmount", nsmgr, 0).Value; string actualAmountCurrency = NodeAsString(appliedTradeAllowanceChargeNode, "./ram:ActualAmount/@currencyID", nsmgr); string reason = NodeAsString(appliedTradeAllowanceChargeNode, "./ram:Reason", nsmgr); item.addTradeAllowanceCharge(!chargeIndicator, // wichtig: das not (!) beachten default(CurrencyCodes).FromString(basisAmountCurrency), basisAmount, actualAmount, reason); } if (item.UnitCode == QuantityCodes.Unknown) { // UnitCode alternativ aus BilledQuantity extrahieren item.UnitCode = default(QuantityCodes).FromString(NodeAsString(tradeLineItem, ".//ram:BilledQuantity/@unitCode", nsmgr)); } if (tradeLineItem.SelectSingleNode($".//ram:{zugferdDialect.SpecifiedLineTradeAgreement}/ram:BuyerOrderReferencedDocument/ram:ID", nsmgr) != null) { item.BuyerOrderReferencedDocument = new BuyerOrderReferencedDocument { ID = NodeAsString(tradeLineItem, $".//ram:{zugferdDialect.SpecifiedLineTradeAgreement}/ram:BuyerOrderReferencedDocument/ram:ID", nsmgr), IssueDateTime = NodeAsDateTime(tradeLineItem, $".//ram:{zugferdDialect.SpecifiedLineTradeAgreement}/ram:BuyerOrderReferencedDocument/ram:IssueDateTime", nsmgr) }; } if (tradeLineItem.SelectSingleNode($".//ram:{zugferdDialect.SpecifiedLineTradeDelivery}/ram:DeliveryNoteReferencedDocument/ram:ID", nsmgr) != null) { item.DeliveryNoteReferencedDocument = new DeliveryNoteReferencedDocument { ID = NodeAsString(tradeLineItem, $".//ram:{zugferdDialect.SpecifiedLineTradeDelivery}/ram:DeliveryNoteReferencedDocument/ram:ID", nsmgr), IssueDateTime = NodeAsDateTime(tradeLineItem, $".//ram:{zugferdDialect.SpecifiedLineTradeDelivery}/ram:DeliveryNoteReferencedDocument/ram:IssueDateTime", nsmgr) }; } if (tradeLineItem.SelectSingleNode($".//ram:{zugferdDialect.SpecifiedLineTradeDelivery}/ram:ActualDeliverySupplyChainEvent/ram:OccurrenceDateTime", nsmgr) != null) { item.ActualDeliveryDate = NodeAsDateTime(tradeLineItem, $".//ram:{zugferdDialect.SpecifiedLineTradeDelivery}/ram:ActualDeliverySupplyChainEvent/ram:OccurrenceDateTime/udt:DateTimeString", nsmgr); } if (tradeLineItem.SelectSingleNode($".//ram:{zugferdDialect.SpecifiedLineTradeAgreement}/ram:ContractReferencedDocument/ram:ID", nsmgr) != null) { item.ContractReferencedDocument = new ContractReferencedDocument { ID = NodeAsString(tradeLineItem, $".//ram:{zugferdDialect.SpecifiedLineTradeAgreement}/ram:ContractReferencedDocument/ram:ID", nsmgr), IssueDateTime = NodeAsDateTime(tradeLineItem, $".//ram:{zugferdDialect.SpecifiedLineTradeAgreement}/ram:ContractReferencedDocument/ram:IssueDateTime", nsmgr) }; } XmlNodeList referenceNodes = tradeLineItem.SelectNodes($".//ram:{zugferdDialect.SpecifiedLineTradeAgreement}/ram:AdditionalReferencedDocument", nsmgr); foreach (XmlNode referenceNode in referenceNodes) { string _code = NodeAsString(referenceNode, "ram:ReferenceTypeCode", nsmgr); item.addAdditionalReferencedDocument( id: NodeAsString(referenceNode, "ram:ID", nsmgr), date: NodeAsDateTime(referenceNode, "ram:IssueDateTim", nsmgr), code: default(ReferenceTypeCodes).FromString(_code) ); } if (tradeLineItem.SelectSingleNode($".//ram:{zugferdDialect.SpecifiedLineTradeAgreement}/ram:ContractReferencedDocument/ram:ID", nsmgr) != null) { item.ContractReferencedDocument = new ContractReferencedDocument { ID = NodeAsString(tradeLineItem, $".//ram:{zugferdDialect.SpecifiedLineTradeAgreement}/ram:ContractReferencedDocument/ram:ID", nsmgr), IssueDateTime = NodeAsDateTime(tradeLineItem, $".//ram:{zugferdDialect.SpecifiedLineTradeAgreement}/ram:ContractReferencedDocument/ram:IssueDateTime", nsmgr) }; } return(item); } // !ParseTradeLineItem()