예제 #1
0
        } // !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()