コード例 #1
0
        /// <summary>
        /// Determines whether [is valid erb invoice] [the specified erb invoice].
        /// </summary>
        /// <param name="erbInvoice">The erb invoice.</param>
        /// <returns>Eine <see cref="EbInterfaceResult"/> Instanz</returns>
        public static EbInterfaceResult IsValidErbInvoice(string erbInvoice)
        {
            var inv = (InvoiceModel)InvoiceFactory.LoadXml(erbInvoice);
            EbInterfaceResult result = inv.IsValidErbInvoice();

            return(result);
        }
コード例 #2
0
        public void TaxItemTest(string inputFile, string outputFile, Models.EbIVersion ebIVersion)
        {
            var invoice = InvoiceFactory.LoadTemplate(inputFile);

            invoice.PrintDump();
            EbInterfaceResult result = invoice.Save(outputFile, ebIVersion);

            Assert.That(result.ResultType == ResultType.IsValid);
            var inputXml = XDocument.Load(inputFile);
            var savedXml = XDocument.Load(outputFile);
            var inResult = inputXml.Descendants()
                           .Where(p1 => p1.Descendants().Count() == 0)
                           .Select(p => new NodeList
            {
                NodePath = p.GetPath(),
                Value    = p.Value
            }).Distinct().OrderBy(n => n.NodePath).ToList();
            var outResult = savedXml.Descendants().Where(p1 => p1.Descendants().Count() == 0).Select(p => new NodeList
            {
                NodePath = p.GetPath(),
                Value    = p.Value
            }).Distinct().OrderBy(n => n.NodePath).ToList();

            Console.WriteLine("Nodes not in Output -----------------------");
            var notInOut = inResult.Where(p => !outResult.Any(p2 => p2.NodePath == p.NodePath)).ToList();

            PrintDiff(notInOut);
            Console.WriteLine("Nodes not in Input -----------------------");

            var notInIn = outResult.Where(p => !inResult.Any(p2 => p2.NodePath == p.NodePath)).ToList();

            PrintDiff(notInIn);
            Console.WriteLine("Value different -----------------------");
            var valDif = inResult.Where(p => outResult.Any(p2 => p2.NodePath == p.NodePath && p2.Value != p.Value));
        }
コード例 #3
0
        public override EbInterfaceResult IsValidInvoice()
        {
            XmlDocument xDoc = ToXmlDocument(this);

            EbInterfaceResult result = IsValidInvoice(xDoc);

            return(result);
        }
コード例 #4
0
        public void SaveInvoiceTest(string inputFile, string outputFile, Models.EbIVersion ebIVersion, string expectedAttr)
        {
            var invoice = InvoiceFactory.LoadTemplate(inputFile);
            //invoice.PrintDump();
            EbInterfaceResult result = invoice.Save(outputFile, ebIVersion);

            result.PrintDump();
            Assert.That(result.ResultType == ResultType.IsValid, $"Validation Error: {outputFile} ");
            XDocument xInv  = XDocument.Load(outputFile);
            var       attrs = xInv.Root.Attributes().Where(p => p.IsNamespaceDeclaration == true).FirstOrDefault(x => x.Name.LocalName == "eb");

            Assert.IsNotNull(attrs);
            Assert.AreEqual(expectedAttr, attrs.Value);
        }
コード例 #5
0
        //public EbInterfaceResult Save(string filename)
        //{
        //    throw new NotImplementedException();
        //}

        public EbInterfaceResult Save(string filename, EbIVersion version)
        {
            Log.LogWrite(CallerInfo.Create(), Log.LogPriority.Medium, $"Save Invoice Version {version.ToString()}");
            var invoice = (IInvoiceBase)Mapping.MapInvoice.MapToEbInterface(this, version);
            // var result = invoice.Save(filename);
            EbInterfaceResult result = null;

            switch (version)
            {
            case EbIVersion.V4P0:
                result = ((ebIModels.Schema.ebInterface4p0.InvoiceType)invoice).Save(filename);
                break;

            case EbIVersion.V4P1:
                result = ((ebIModels.Schema.ebInterface4p1.InvoiceType)invoice).Save(filename);
                break;

            case EbIVersion.V4P2:
                result = ((ebIModels.Schema.ebInterface4p2.InvoiceType)invoice).Save(filename);

                break;

            case EbIVersion.V4P3:
                result = ((ebIModels.Schema.ebInterface4p3.InvoiceType)invoice).Save(filename);

                break;

            case EbIVersion.V5P0:
                result = ((ebIModels.Schema.ebInterface5p0.InvoiceType)invoice).Save(filename);

                break;

            default:
                break;
            }
            return(result);
        }
コード例 #6
0
        /// <summary>
        /// Prüft ob Rechnung erb.gv.at. konform ist:
        /// </summary>
        /// <returns>Eine <see cref="EbInterfaceResult"/> Instanz</returns>
        /// <remarks>
        /// Folgende Prüfungen werden durchgeführt
        /// <list type="bullet">
        ///  <item>Es werden nur Rechnungen  oder Gutschriften akzeptiert <see cref="DocumentType"/></item>
        ///  <item>eine Rechnung darf sich nur auf eine Bestellung beziehen</item>
        ///  <item>Bestellposition muss angegeben sein</item>
        ///  <item>CancelledOriginalDocument darf nicht angegeben sein</item>
        ///  <item>OrderID muss angegeben sein
        /// <para>Regeln:
        /// <list type="bullet">
        /// <item>3-stellig alphanumerisch oder</item>
        /// <item>3-stellig alphanumerisch ":" Irgendwas (Gesamtlänge maximal 35 Stellen)</item>
        /// <item>10-stellig numerisch</item>
        /// </list>
        /// </para>
        /// </item>
        ///  <item>Biller E-Mail verpflichtend</item>
        ///  <item>Max. 999 Rechnungszeilen</item>
        ///  <item>Skonto &gt; 0 und &lt; 100</item>
        ///  <item>Max. 2 Discount Elemente</item>
        ///  <item>Nur ein Benificiary Account</item>
        ///  <item>IBAN und BIC</item>
        ///  <item>Kein NoPayment</item>
        ///  <item>OrderId in ListLineItem darf nicht leer sein</item>
        ///  <item>GLN Optional</item>
        ///  <item>Invoice/Biller/InvoiceRecipientsBillerID 10 Stell. alphanumerisch</item>
        /// </list>
        /// </remarks>
        public EbInterfaceResult IsValidErbInvoice()
        {
            EbInterfaceResult result = new EbInterfaceResult();

            Schema.ebInterface5p0.InvoiceType invoice = Mapping.V5p0.MapInvoice.MapModelToV5p0(this);

            if (result.ResultType != ResultType.IsValid)
            {
                return(result);
            }
            if ((DocumentType != DocumentTypeType.Invoice) && (DocumentType != DocumentTypeType.CreditMemo))
            {
                result.ResultMessages.Add(new ResultMessage()
                {
                    Field    = "DocumentType",
                    Severity = MessageType.Error,
                    Message  = "Das Feld muss entweder DocumentTypeType.Invoice oder DocumentTypeType.CreditMemo enthalten"
                });
            }

            // A04 OrderID muss angegeben sein
            if ((InvoiceRecipient.OrderReference == null) || (InvoiceRecipient.OrderReference.OrderID == null))
            {
                result.ResultMessages.Add(new ResultMessage()
                {
                    Field    = "InvoiceRecipient.OrderReference.OrderID",
                    Severity = MessageType.Error,
                    Message  = "Das Feld InvoiceRecipient.OrderReference.OrderID darf nicht leer sein"
                });
                result.ResultType = ResultType.ErbValidationIssue;
                return(result);
            }
            if (string.IsNullOrWhiteSpace(InvoiceRecipient.OrderReference.OrderID))
            {
                result.ResultMessages.Add(new ResultMessage()
                {
                    Field    = "InvoiceRecipient.OrderReference.OrderID",
                    Severity = MessageType.Error,
                    Message  = "Das Feld InvoiceRecipient.OrderReference.OrderID darf nicht leer sein"
                });
            }

            //Regeln:
            // 3-stellig alphanumerisch oder
            // 3-stellig alphanumerisch „:“ Irgendwas (Gesamtlänge maximal 35 Stellen)
            // 10-stellig numerisch

            string msg = null;

            msg = IsValidOrderIdBund(InvoiceRecipient.OrderReference.OrderID, out OrderIdTypeType orderIdType);
            if (msg != null)
            {
                result.ResultMessages.Add(new ResultMessage()
                {
                    Field    = "InvoiceRecipient.OrderReference.OrderID",
                    Severity = MessageType.Error,
                    Message  = msg
                });
            }

            // A01 eine Rechnung = eine Bestellung
            // A02 Bestellposition muss angegeben sein
            // A12 OrderId in ListLineItem <> leer

            int n = 0;

            foreach (ItemListType itemListType in Details.ItemList)
            {
                int i = 0;
                foreach (ListLineItemType lineItem in itemListType.ListLineItem)
                {
                    if (orderIdType != OrderIdTypeType.EKGR) // Bei Einkäufergruppe muss keine Positionsnummer angegeben werden
                    {
                        if ((lineItem.InvoiceRecipientsOrderReference == null) ||
                            (lineItem.InvoiceRecipientsOrderReference.OrderPositionNumber == null) ||
                            (string.IsNullOrWhiteSpace(lineItem.InvoiceRecipientsOrderReference.OrderPositionNumber)))
                        {
                            result.ResultMessages.Add(new ResultMessage()
                            {
                                Field =
                                    string.Format(
                                        "Details.Itemlist[{0}].ListLineItem[{1}].InvoiceRecipientsOrderReference.OrderPositionNumber",
                                        n, i),
                                Severity = MessageType.Error,
                                Message  = string.Format("Das Feld darf nicht leer sein.")
                            });
                        }
                    }
                    else
                    {
                        if (InvoiceRecipient.OrderReference.OrderID != lineItem.InvoiceRecipientsOrderReference.OrderID)
                        {
                            result.ResultMessages.Add(new ResultMessage()
                            {
                                Field =
                                    string.Format(
                                        "Details.Itemlist[{0}].ListLineItem[{1}].InvoiceRecipientsOrderReference.OrderID", n, i),
                                Message =
                                    string.Format(
                                        "Das Feld muss gleich InvoiceRecipient.OrderReference.OrderID sein und darf nicht leer sein und soll mit InvoiceRecipient.OrderReference.OrderID übereinstimmen.",
                                        i)
                            });
                        }
                    }
                    i = i + 1;
                }
            }


            // A03 CancelledOriginalDocument darf nicht angegeben sein
            //if (!string.IsNullOrWhiteSpace(CancelledOriginalDocument))
            //{
            //    result.ResultMessages.Add(new ResultMessage()
            //    {
            //        Field = "CancelledOriginalDocument",
            //        Severity = MessageType.High,
            //        Message = "Das Feld muss leer sein"
            //    });

            //}


            // A05 Biller E-Mail verpflichtend
            if (Biller.Address.Email.Count() < 1)
            {
                result.ResultMessages.Add(new ResultMessage()
                {
                    Field    = "Biller.Address.Email",
                    Severity = MessageType.Error,
                    Message  = "Feld darf nicht leer sein und muss eine gültige E-Mail Adresse enthalten"
                });
            }
            // A06 Max. 999 Rechnungszeilen
            if (Details.ItemList[0].ListLineItem.Count() > 999)
            {
                result.ResultMessages.Add(new ResultMessage()
                {
                    Field    = "Details.ItemList[0].ListLineItem.Count()",
                    Severity = MessageType.Error,
                    Message  = "Es dürfen max. 999 Rechnungszeilen angegeben werden."
                });
            }
            // A08 Max. 2 Discount Elemente
            if (PaymentConditions.Discount != null)
            {
                if (PaymentConditions.Discount.Count() > 2)
                {
                    result.ResultMessages.Add(new ResultMessage()
                    {
                        Field    = "PaymentConditions.Discount.Count())",
                        Severity = MessageType.Error,
                        Message  = "Es dürfen max. 2 Discount Items angegeben werden."
                    });
                }

                // A07 Skonto >0 und < 100
                int i = 0;
                foreach (var discountType in PaymentConditions.Discount)
                {
                    if (!((discountType.Percentage > 0) && (discountType.Percentage < 100)))
                    {
                        result.ResultMessages.Add(new ResultMessage()
                        {
                            Field    = string.Format(" PaymentConditions.Discount[{0}].Percentage", i),
                            Severity = MessageType.Error,
                            Message  = "Der Wert muss > 0 und < 100 sein."
                        });
                    }
                    i = i + 1;
                }
            }
            // A09 Nur ein Benificiary Account
            //if (PaymentMethod is UniversalBankTransactionType)
            //{
            //    var benficiaryAccount = PaymentMethod as UniversalBankTransactionType;
            //    if (benficiaryAccount.BeneficiaryAccount.Count() > 1)
            //    {
            //        result.ResultMessages.Add(new ResultMessage()
            //        {
            //            Field = "PaymentMethod.BeneficiaryAccount.Count()",
            //            Severity = MessageType.High,
            //            Message = "Es darf nur ein BeneficiaryAccount angegeben werden"
            //        });
            //    }
            //    // A10 IBAN und BIC
            //    if (string.IsNullOrWhiteSpace(benficiaryAccount.BeneficiaryAccount[0].IBAN))
            //    {
            //        result.ResultMessages.Add(new ResultMessage()
            //        {
            //            Field = "PaymentMethod.BeneficiaryAccount.IBAN",
            //            Severity = MessageType.High,
            //            Message = "Das Feld darf nicht leer sein"
            //        });

            //    }
            //    if (string.IsNullOrWhiteSpace(benficiaryAccount.BeneficiaryAccount[0].BIC))
            //    {
            //        result.ResultMessages.Add(new ResultMessage()
            //        {
            //            Field = "PaymentMethod.BeneficiaryAccount.BIC",
            //            Severity = MessageType.High,
            //            Message = "Das Feld darf nicht leer sein"
            //        });

            //    }
            //}

            // A11 Kein NoPayment
            //if (PaymentMethod is NoPaymentType)
            //{
            //    result.ResultMessages.Add(new ResultMessage()
            //    {
            //        Field = "PaymentMethod",
            //        Severity = MessageType.High,
            //        Message = "Der Type darf nicht NoPaymentType sein"
            //    });

            //}

            // A14 GLN Optional
            if (Biller.InvoiceRecipientsBillerID != null)
            {
                // A14 Invoice/Biller/InvoiceRecipientsBillerID 10 Stell. alpha
                if (!((Biller.InvoiceRecipientsBillerID.Length <= 10) && (Biller.InvoiceRecipientsBillerID.Length >= 1)))
                {
                    result.ResultMessages.Add(new ResultMessage()
                    {
                        Field    = "Biller.InvoiceRecipientsBillerID",
                        Severity = MessageType.Error,
                        Message  = "Das Feld muss max. 10 Stell. lang sein"
                    });
                }
                else
                {
                    if (!Biller.InvoiceRecipientsBillerID.IsAlphaNum())
                    {
                        result.ResultMessages.Add(new ResultMessage()
                        {
                            Field    = "Biller.InvoiceRecipientsBillerID",
                            Severity = MessageType.Error,
                            Message  = "Das Feld darf nur  alphanumerische Zeichen enthalten."
                        });
                    }
                }
            }
            else
            {
                result.ResultMessages.Add(new ResultMessage()
                {
                    Field    = "Biller.InvoiceRecipientsBillerID",
                    Severity = MessageType.Error,
                    Message  = "Das Feld darf nicht null sein."
                });
            }
            if (result.ResultMessages.Count > 0)
            {
                result.ResultType = ResultType.ErbValidationIssue;
            }
            else
            {
                result.ResultType = ResultType.IsValid;
            }
            return(result);
        }
コード例 #7
0
        /// <summary>
        /// Determines whether [is valid erb invoice] [the specified erb invoice].
        /// </summary>
        /// <param name="erbInvoice">The erb invoice.</param>
        /// <returns>Eine <see cref="EbInterfaceResult"/> Instanz</returns>
        public static EbInterfaceResult IsValidErbInvoice(XmlDocument erbInvoice)
        {
            EbInterfaceResult result = IsValidErbInvoice(erbInvoice.InnerXml);

            return(result);
        }