Ejemplo n.º 1
0
        public async Task <RetornoXMLValidacao> Validar(XmlDocument document)
        {
            XmlNodeList retificacao      = document.GetElementsByTagName("DeclarationNFe");
            var         retornoValidacao = new RetornoXMLValidacao();

            if (retificacao.Count > 0)
            {
                retornoValidacao = await ValidaRetificacao(retificacao, document);
            }

            XmlNodeList embarqueAntecipado = document.GetElementsByTagName("DeclarationNoNF");

            if (embarqueAntecipado.Count > 0)
            {
                retornoValidacao = await ValidaEmbarqueAntecipado(embarqueAntecipado, document);
            }


            // document.Save(path);
            return(retornoValidacao);
        }
Ejemplo n.º 2
0
        private async Task <RetornoXMLValidacao> ValidaEmbarqueAntecipado(XmlNodeList embarqueAntecipado, XmlDocument document)
        {
            string NumeroDUE        = string.Empty;
            var    retornoValidacao = new RetornoXMLValidacao();

            XmlNamespaceManager nsmgr = new XmlNamespaceManager(document.NameTable);

            nsmgr.AddNamespace("bk", "urn:wco:datamodel:WCO:GoodsDeclaration:1");

            foreach (XmlNode xmlEmbarqueAntecipado in embarqueAntecipado)
            {
                var GoodsShipment = document.SelectNodes("//bk:GoodsShipment", nsmgr);

                var ultimoGoodsShipment = GoodsShipment[GoodsShipment.Count - 1];

                var elementosUltimoGoodsShipment = ultimoGoodsShipment.ChildNodes;

                foreach (XmlNode elementoGoodsShipment in elementosUltimoGoodsShipment)
                {
                    if (elementoGoodsShipment.Name == "GovernmentAgencyGoodsItem")
                    {
                        XmlDocumentFragment xfrag = document.CreateDocumentFragment();

                        xfrag.InnerXml = @"
                            <AdditionalDocument xmlns=""" + xmlEmbarqueAntecipado.ParentNode.NamespaceURI + @""">
		                      <CategoryCode>LPCO</CategoryCode>
		                      <ID>MICROLED</ID>                                     
	                        </AdditionalDocument>"    ;

                        elementoGoodsShipment.AppendChild(xfrag);

                        var retorno = await EnviarXMLDUE("/due/api/ext/due/", document.InnerXml, string.Empty, ConfigurationManager.AppSettings["CpfCertificado"].ToString());

                        retornoValidacao.XmlRetorno = retorno.XmlRetorno;
                        retornoValidacao.Debug      = retorno.Debug;
                        if (retorno.Sucesso == false)
                        {
                            if (retorno.Criticas != null)
                            {
                                var erros = retorno.Criticas.Where(c => c.Code != "DUEX-ER0644" && c.Code != "DUEX-AL0018").ToList();

                                if (erros.Any())
                                {
                                    foreach (var erro in erros)
                                    {
                                        retornoValidacao.AdicionarMensagem("Siscomex: " + erro.Message);
                                    }

                                    retornoValidacao.Sucesso = false;
                                }
                                else
                                {
                                    retornoValidacao.Sucesso = true;
                                }
                            }
                            else
                            {
                                if (retorno.Code != "DUEX-ER0644" && retorno.Code != "DUEX-AL0018")
                                {
                                    retornoValidacao.AdicionarMensagem("Siscomex: " + retorno.Message);
                                    retornoValidacao.Sucesso = false;
                                }
                                else
                                {
                                    retornoValidacao.Sucesso = true;
                                }
                            }
                        }
                    }
                }
            }

            return(retornoValidacao);
        }
Ejemplo n.º 3
0
        private async Task <RetornoXMLValidacao> ValidaRetificacao(XmlNodeList retificacao, XmlDocument document)
        {
            string NumeroDUE        = string.Empty;
            bool   temNotasRemessa  = false;
            var    retornoValidacao = new RetornoXMLValidacao();

            XmlNamespaceManager nsmgr = new XmlNamespaceManager(document.NameTable);

            nsmgr.AddNamespace("bk", "urn:wco:datamodel:WCO:GoodsDeclaration:1");

            foreach (XmlNode xmlRetificacao in retificacao)
            {
                foreach (XmlNode dadosDUE in xmlRetificacao.FirstChild)
                {
                    if (dadosDUE.ParentNode.Name.Equals("ID"))
                    {
                        if (dadosDUE.Value.Contains("BR"))
                        {
                            NumeroDUE = dadosDUE.Value;
                        }
                    }
                }

                var GoodsShipment = document.SelectNodes("//bk:GoodsShipment", nsmgr);

                var ultimoGoodsShipment = GoodsShipment[GoodsShipment.Count - 1];

                var elementosUltimoGoodsShipment = ultimoGoodsShipment.ChildNodes;

                foreach (XmlNode elementoGoodsShipment in elementosUltimoGoodsShipment)
                {
                    if (elementoGoodsShipment.Name == "GovernmentAgencyGoodsItem")
                    {
                        var elementosGovernmentAgencyGoodsItem = elementoGoodsShipment.ChildNodes;

                        foreach (XmlNode elementoGovernmentAgencyGoodsItem in elementosGovernmentAgencyGoodsItem)
                        {
                            if (elementoGovernmentAgencyGoodsItem.Name == "Commodity")
                            {
                                var elementosCommodity = elementoGovernmentAgencyGoodsItem.ChildNodes;

                                foreach (XmlNode elementoCommodity in elementosCommodity)
                                {
                                    if (elementoCommodity.Name == "InvoiceLine")
                                    {
                                        var notasDeRemessa = elementoCommodity.ChildNodes;

                                        var ultimaNota = notasDeRemessa[notasDeRemessa.Count - 1];

                                        if (ultimaNota != null)
                                        {
                                            if (ultimaNota.Name == "ReferencedInvoiceLine")
                                            {
                                                temNotasRemessa = true;

                                                var goodsMeasure  = ultimaNota.SelectSingleNode("bk:GoodsMeasure", nsmgr);
                                                var quantidadeXml = goodsMeasure.SelectSingleNode("bk:TariffQuantity", nsmgr);

                                                var quantidade = Convert.ToDouble(quantidadeXml.InnerText, new System.Globalization.CultureInfo("en-US"));

                                                quantidade = quantidade - 1;

                                                quantidadeXml.InnerText = quantidade.ToString(new System.Globalization.CultureInfo("en-US"));

                                                var ultimaNotaClonada = ultimaNota.Clone();

                                                if (ultimaNotaClonada != null)
                                                {
                                                    goodsMeasure  = ultimaNotaClonada.SelectSingleNode("bk:GoodsMeasure", nsmgr);
                                                    quantidadeXml = goodsMeasure.SelectSingleNode("bk:TariffQuantity", nsmgr);

                                                    quantidadeXml.InnerText = "1.000";

                                                    XmlDocumentFragment xfrag = document.CreateDocumentFragment();

                                                    xfrag.InnerXml = ultimaNotaClonada.OuterXml;

                                                    elementoCommodity.AppendChild(xfrag);

                                                    var retorno = await EnviarXMLDUE(string.Format("/due/api/ext/due/{0}", NumeroDUE), document.InnerXml, NumeroDUE, ConfigurationManager.AppSettings["CpfCertificado"].ToString());

                                                    retornoValidacao.XmlRetorno = retorno.XmlRetorno;
                                                    retornoValidacao.NumeroDUE  = NumeroDUE;
                                                    if (retorno.Sucesso == false)
                                                    {
                                                        if (retorno.Criticas != null)
                                                        {
                                                            var erros = retorno.Criticas.Where(c => c.Code != "DUEX-ER0175").ToList();

                                                            if (erros.Any())
                                                            {
                                                                foreach (var erro in erros)
                                                                {
                                                                    retornoValidacao.AdicionarMensagem("Siscomex: " + erro.Message);
                                                                    retornoValidacao.Sucesso = false;
                                                                }
                                                            }
                                                            else
                                                            {
                                                                retornoValidacao.Sucesso = true;
                                                            }
                                                        }
                                                        else
                                                        {
                                                            if (retorno.Code != "DUEX-ER0175")
                                                            {
                                                                retornoValidacao.AdicionarMensagem("Siscomex: " + retorno.Message);
                                                                retornoValidacao.Sucesso = false;
                                                            }
                                                            else
                                                            {
                                                                retornoValidacao.Sucesso = true;
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            if (temNotasRemessa == false)
            {
                retornoValidacao.AdicionarMensagem("O XML não contém notas de remessas");
                retornoValidacao.Sucesso = false;
            }

            return(retornoValidacao);
        }