Classe responsável por ler os diversos XML´s utilizados na nota fiscal eletrônica e dispor as informações em propriedades para facilitar a leitura.
Example #1
0
        /// <summary>
        /// Le o conteúdo do XML da NFe
        /// </summary>
        /// <param name="arquivo">Arquivo XML da NFe</param>
        /// <returns>Retorna o conteúdo do XML da NFe</returns>
        public DadosNFeClass LerXMLNFe(string arquivo)
        {
            LerXML oLerXML = new LerXML();

            switch (Servico)
            {
                case Servicos.MDFeAssinarValidarEnvioEmLote:
                case Servicos.MDFeMontarLoteVarios:
                case Servicos.MDFeMontarLoteUm:
                    oLerXML.Mdfe(arquivo);
                    break;

                case Servicos.CTeAssinarValidarEnvioEmLote:
                case Servicos.CTeMontarLoteVarios:
                case Servicos.CTeMontarLoteUm:
                    oLerXML.Cte(arquivo);
                    break;

                default:
                    oLerXML.Nfe(arquivo);
                    break;
            }

            return oLerXML.oDadosNfe;
        }
Example #2
0
        /// <summary>
        /// Envia o XML de consulta do cadastro do contribuinte para o web-service do sefaz
        /// </summary>
        /// <remark>
        /// Como retorno, o método atualiza a propriedade this.vNfeRetorno da classe 
        /// com o conteúdo do retorno do WebService.
        /// No caso do consultaCadastro se tudo estiver correto retorna um XML
        /// com o resultado da consulta
        /// Se der algum erro ele grava um arquivo txt com a extensão .ERR com o conteúdo do erro
        /// </remark>
        /// <example>
        /// oUniNfe.vUF = 51; //Setar o Estado que é para efetuar a consulta
        /// oUniNfe.vXmlNfeDadosMsg = "c:\00000000000000-cons-cad.xml";
        /// oUniNfe.ConsultaCadastro();
        /// this.textBox_xmlretorno.Text = oUniNfe.vNfeRetorno;
        /// //
        /// //O conteúdo de retorno vai ser algo mais ou menos assim:
        /// //
        /// //<retConsCad xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.01">
        /// //   <infCons>
        /// //      <verAplic>SP_NFE_PL_005c</verAplic>
        /// //      <cStat>111</cStat>
        /// //      <xMotivo>Consulta cadastro com uma ocorrência</xMotivo>
        /// //      <UF>SP</UF>
        /// //      <CNPJ>00000000000000</CNPJ>
        /// //      <dhCons>2009-01-29T10:36:33</dhCons>
        /// //      <cUF>35</cUF>
        /// //      <infCad>
        /// //         <IE>000000000000</IE>
        /// //         <CPF />
        /// //         <CNPJ>00000000000000</CNPJ>
        /// //         <UF>SP</UF>
        /// //         <cSit>1</cSit>
        /// //         <xNome>EMPRESA DE TESTE PARA AVALIACAO DO SERVICO</xNome>
        /// //      </infCad>
        /// //   </infCons>
        /// //</retConsCad>
        /// </example>
        /// <by>
        /// Wandrey Mundin Ferreira
        /// </by>
        /// <date>
        /// 15/01/2009
        /// </date>
        /// 
#if notused
        public override void ConsultaCadastro()
        {
            int emp = new FindEmpresaThread(Thread.CurrentThread).Index;

            //Definir o serviço que será executado para a classe
            Servico = Servicos.ConsultaCadastroContribuinte;

            try
            {
                //Ler o XML para pegar parâmetros de envio
                LerXML oLer = new LerXML();
                oLer.ConsCad(NomeArquivoXML);

                if (this.vXmlNfeDadosMsgEhXML)  //danasa 12-9-2009
                {
                    //Definir o objeto do WebService
                    WebServiceProxy wsProxy = ConfiguracaoApp.DefinirWS(Servicos.ConsultaCadastroContribuinte, emp, oLer.oDadosConsCad.cUF, oLer.oDadosConsCad.tpAmb, Propriedade.TipoEmissao.teNormal);

                    //Criar objetos das classes dos serviços dos webservices do SEFAZ
                    object oConsCad = wsProxy.CriarObjeto(NomeClasseWS(Servico, oLer.oDadosConsCad.cUF));
                    object oCabecMsg = wsProxy.CriarObjeto(NomeClasseCabecWS());

                    //Atribuir conteúdo para duas propriedades da classe nfeCabecMsg
                    wsProxy.SetProp(oCabecMsg, "cUF", oLer.oDadosConsCad.cUF.ToString());
                    wsProxy.SetProp(oCabecMsg, "versaoDados", ConfiguracaoApp.VersaoXMLConsCad);

                    //Invocar o método que envia o XML para o SEFAZ
                    oInvocarObj.Invocar(wsProxy, oConsCad, NomeMetodoWS(Servico, oLer.oDadosConsCad.cUF), oCabecMsg, this, "-cons-cad", "-ret-cons-cad");
                }
                else
                {
                    //Gerar o XML da consulta cadastro do contribuinte a partir do TXT gerado pelo ERP
                    oGerarXML.ConsultaCadastro(Path.GetFileNameWithoutExtension(NomeArquivoXML) + ".xml",
                                               oLer.oDadosConsCad.UF,
                                               oLer.oDadosConsCad.CNPJ,
                                               oLer.oDadosConsCad.IE,
                                               oLer.oDadosConsCad.CPF);
                }
            }
            catch (Exception ex)
            {
                string ExtRet = string.Empty;

                if (this.vXmlNfeDadosMsgEhXML) //Se for XML
                    ExtRet = Propriedade.ExtEnvio.ConsCad_XML;
                else //Se for TXT
                    ExtRet = Propriedade.ExtEnvio.ConsCad_TXT;

                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    GravarArqErroServico(NomeArquivoXML, ExtRet, Propriedade.ExtRetorno.ConsCad_ERR, ex);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 09/03/2010
                }
            }
            finally
            {
                try
                {
                    //Deletar o arquivo de solicitação do serviço
                    Functions.DeletarArquivo(NomeArquivoXML);
                }
                catch
                {
                    //Se falhou algo na hora de deletar o XML de solicitação do serviço, 
                    //infelizmente não posso fazer mais nada, o UniNFe vai tentar mandar 
                    //o arquivo novamente para o webservice
                    //Wandrey 09/03/2010
                }
            }
        }
Example #3
0
        /// <summary>
        /// Efetua a leitura do XML de retorno do processamento do lote de notas fiscais e 
        /// atualiza o arquivo de fluxo e envio de notas
        /// </summary>
        /// <by>Wandrey Mundin Ferreira</by>
        /// <date>20/04/2009</date>
        /// 
#if notused
        protected override void LerRetornoLoteNFe()
        {
            int emp = new FindEmpresaThread(Thread.CurrentThread).Index;
            var oLerXml = new LerXML();
            var msXml = Functions.StringXmlToStream(vStrXmlRetorno);

            var fluxoNFe = new FluxoNfe();

            try
            {
                var doc = new XmlDocument();
                doc.Load(msXml);

                var retConsReciNFeList = doc.GetElementsByTagName("retConsReciNFe");

                foreach (XmlNode retConsReciNFeNode in retConsReciNFeList)
                {
                    var retConsReciNFeElemento = (XmlElement)retConsReciNFeNode;

                    //Pegar o número do recibo do lote enviado
                    var nRec = string.Empty;
                    if (retConsReciNFeElemento.GetElementsByTagName("nRec")[0] != null)
                    {
                        nRec = retConsReciNFeElemento.GetElementsByTagName("nRec")[0].InnerText;
                    }

                    //Pegar o status de retorno do lote enviado
                    var cStatLote = string.Empty;
                    if (retConsReciNFeElemento.GetElementsByTagName("cStat")[0] != null)
                    {
                        cStatLote = retConsReciNFeElemento.GetElementsByTagName("cStat")[0].InnerText;
                    }

                    switch (cStatLote)
                    {
                        #region Rejeições do XML de consulta do recibo (Não é o lote que foi rejeitado e sim o XML de consulta do recibo)

                        #region Validação do certificado de transmissão
                        case "280":
                        case "281":
                        case "282":
                        case "283":
                        case "284":
                        case "285":
                        case "286":
                        #endregion

                        #region Validação inicial da mensagem no webservice
                        case "214":
                        case "243":
                        case "108":
                        case "109":
                        #endregion

                        #region Validação das informações de controle da chamada ao webservice
                        case "242":
                        case "409":
                        case "410":
                        case "411":
                        case "238":
                        case "239":
                        #endregion

                        #region Validação da forma da área de dados
                        case "215":
                        case "516":
                        case "517":
                        case "545":
                        case "587":
                        case "588":
                        case "404":
                        case "402":
                        #endregion

                        #region Validação das regras de negócio da consulta recibo
                        case "252":
                        case "248":
                        case "553":
                        case "105":
                        case "223":
                        #endregion
                            break;

                        #region Lote não foi localizado pelo recibo que está sendo consultado
                        case "106": //E-Verifica se o lote não está na fila de saída, nem na fila de entrada (Lote não encontrado)
                            //No caso do lote não encontrado através do recibo, o ERP vai ter que consultar a situação da NFe para encerrar ela
                            //Vou somente excluir ela do fluxo para não ficar consultando o recibo que não existe
                            if (nRec != string.Empty)
                            {
                                fluxoNFe.ExcluirNfeFluxoRec(nRec.Trim());
                            }
                            break;
                        #endregion

                        #endregion

                        #region Lote foi processado, agora tenho que tratar as notas fiscais dele
                        case "104": //Lote processado
                            var protNFeList = retConsReciNFeElemento.GetElementsByTagName("protNFe");

                            foreach (XmlNode protNFeNode in protNFeList)
                            {
                                var protNFeElemento = (XmlElement)protNFeNode;

                                var strProtNfe = protNFeElemento.OuterXml;

                                var infProtList = protNFeElemento.GetElementsByTagName("infProt");

                                foreach (XmlNode infProtNode in infProtList)
                                {
                                    bool tirarFluxo = true;
                                    var infProtElemento = (XmlElement)infProtNode;

                                    var strChaveNFe = string.Empty;
                                    var strStat = string.Empty;

                                    if (infProtElemento.GetElementsByTagName("chNFe")[0] != null)
                                    {
                                        strChaveNFe = "NFe" + infProtElemento.GetElementsByTagName("chNFe")[0].InnerText;
                                    }

                                    if (infProtElemento.GetElementsByTagName("cStat")[0] != null)
                                    {
                                        strStat = infProtElemento.GetElementsByTagName("cStat")[0].InnerText;
                                    }

                                    //Definir o nome do arquivo da NFe e seu caminho
                                    var strNomeArqNfe = fluxoNFe.LerTag(strChaveNFe, FluxoNfe.ElementoFixo.ArqNFe);

                                    // danasa 8-2009
                                    // se por algum motivo o XML não existir no "Fluxo", então o arquivo tem que existir
                                    // na pasta "EmProcessamento" assinada.
                                    if (string.IsNullOrEmpty(strNomeArqNfe))
                                    {
                                        if (string.IsNullOrEmpty(strChaveNFe))
                                            throw new Exception("LerRetornoLoteNFe(): Não pode obter o nome do arquivo");

                                        strNomeArqNfe = strChaveNFe.Substring(3) + Propriedade.ExtEnvio.Nfe;
                                    }
                                    var strArquivoNFe = Empresa.Configuracoes[emp].PastaEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + strNomeArqNfe;

                                    //Atualizar a Tag de status da NFe no fluxo para que se ocorrer alguma falha na exclusão eu tenha esta campo para ter uma referencia em futuras consultas
                                    fluxoNFe.AtualizarTag(strChaveNFe, FluxoNfe.ElementoEditavel.cStat, strStat);

                                    //Atualizar a tag da data e hora da ultima consulta do recibo
                                    fluxoNFe.AtualizarDPedRec(nRec, DateTime.Now);

                                    switch (strStat)
                                    {
                                        case "100": //NFe Autorizada
                                            if (File.Exists(strArquivoNFe))
                                            {
                                                //Juntar o protocolo com a NFE já copiando para a pasta de autorizadas
                                                var strArquivoNFeProc = Empresa.Configuracoes[emp].PastaEnviado + "\\" +
                                                                        PastaEnviados.EmProcessamento.ToString() + "\\" +
                                                                        Functions.ExtrairNomeArq(strNomeArqNfe, Propriedade.ExtEnvio.Nfe) + Propriedade.ExtRetorno.ProcNFe;

                                                //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s autorizados
                                                oLerXml.Nfe(strArquivoNFe);

                                                //Verificar se a -nfe.xml existe na pasta de autorizados
                                                bool NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Nfe);

                                                //Verificar se o -procNfe.xml existe na past de autorizados
                                                bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtRetorno.ProcNFe);

                                                //Se o XML de distribuição não estiver na pasta de autorizados
                                                if (!procNFeJaNaAutorizada)
                                                {
                                                    if (!File.Exists(strArquivoNFeProc))
                                                    {
                                                        oGerarXML.XmlDistNFe(strArquivoNFe, strProtNfe, Propriedade.ExtRetorno.ProcNFe);
                                                    }
                                                }

                                                if (!procNFeJaNaAutorizada)
                                                {
                                                    //Mover a nfePRoc da pasta de NFE em processamento para a NFe Autorizada
                                                    //Para envitar falhar, tenho que mover primeiro o XML de distribuição (-procnfe.xml) para
                                                    //depois mover o da nfe (-nfe.xml), pois se ocorrer algum erro, tenho como reconstruir o senário, 
                                                    //assim sendo não inverta as posições. Wandrey 08/10/2009
                                                    MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);

                                                    //Atualizar a situação para que eu só mova o arquivo com final -NFe.xml para a pasta autorizado se 
                                                    //a procnfe já estiver lá, ou vai ficar na pasta emProcessamento para tentar gerar novamente.
                                                    //Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012
                                                    procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtRetorno.ProcNFe);
                                                }

                                                if (!NFeJaNaAutorizada && procNFeJaNaAutorizada)
                                                {
                                                    //Mover a NFE da pasta de NFE em processamento para NFe Autorizada
                                                    //Para envitar falhar, tenho que mover primeiro o XML de distribuição (-procnfe.xml) para 
                                                    //depois mover o da nfe (-nfe.xml), pois se ocorrer algum erro, tenho como reconstruir o senário.
                                                    //assim sendo não inverta as posições. Wandrey 08/10/2009
                                                    MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);
                                                }

                                                //Disparar a geração/impressçao do UniDanfe. 03/02/2010 - Wandrey
                                                if (procNFeJaNaAutorizada)
                                                    ExecutaUniDanfe(strNomeArqNfe, oLerXml.oDadosNfe.dEmi);

                                                //Vou verificar se estão os dois arquivos na pasta Autorizados, se tiver eu tiro do fluxo caso contrário não. Wandrey 13/02/2012
                                                NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Nfe);
                                                procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtRetorno.ProcNFe);
                                                if (!procNFeJaNaAutorizada || !NFeJaNaAutorizada)
                                                {
                                                    tirarFluxo = false;
                                                }
                                            }
                                            break;

                                        case "110":
                                        case "205":
                                        case "301":
                                        case "302":
                                            ProcessaNotaDenegada(emp, oLerXml, strArquivoNFe, infProtElemento);
                                            /*
                                                                                        if (File.Exists(strArquivoNFe))
                                                                                        {
                                                                                            //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s Denegados
                                                                                            oLerXml.Nfe(strArquivoNFe);

                                                                                            //Mover a NFE da pasta de NFE em processamento para NFe Denegadas
                                                                                            oAux.MoverArquivo(strArquivoNFe, PastaEnviados.Denegados, oLerXml.oDadosNfe.dEmi);
                                                                                        }*/
                                            break;

                                        //case "302": //NFe Denegada - Problemas com o destinatário
                                        //    goto case "301";

                                        //case "110": //NFe Denegada - Não sei quando ocorre este, mas descobrir ele no manual então estou incluindo. Wandrey 20/10/2009
                                        //    goto case "301";

                                        default: //NFe foi rejeitada
                                            //O Status da NFe tem que ser maior que 1 ou deu algum erro na hora de ler o XML de retorno da consulta do recibo, sendo assim, vou mantar a nota no fluxo para consultar novamente.
                                            if (Convert.ToInt32(strStat) >= 1)
                                            {
                                                //Mover o XML da NFE a pasta de XML´s com erro
                                                oAux.MoveArqErro(strArquivoNFe);
                                            }
                                            else
                                                tirarFluxo = false;
                                            break;
                                    }

                                    //Deletar a NFE do arquivo de controle de fluxo
                                    if (tirarFluxo)
                                        fluxoNFe.ExcluirNfeFluxo(strChaveNFe);

                                    break;
                                }
                            }
                            break;
                        #endregion

                        #region Qualquer outro tipo de status que não for os acima relacionados, vai tirar a nota fiscal do fluxo.
                        default:
                            //Qualquer outro tipo de rejeião vou tirar todas as notas do lote do fluxo, pois se o lote foi rejeitado, todas as notas fiscais também foram
                            //De acordo com o manual de integração se o status do lote não for 104, tudo foi rejeitado. Wandrey 20/07/2010
                            if (Convert.ToInt32(cStatLote) >= 1)
                            {
                                //Vou retirar as notas do fluxo pelo recibo
                                if (nRec != string.Empty)
                                {
                                    fluxoNFe.ExcluirNfeFluxoRec(nRec.Trim());
                                }
                            }

                            break;
                        #endregion
                    }
                }
            }
            catch (Exception ex)
            {
                throw (ex);
            }
        }
Example #4
0
        /// <summary>
        /// Busca no WebService da NFe a situação da nota fiscal enviada
        /// </summary>
        /// <remarks>
        /// Atualiza a propriedade this.vNfeRetorno da classe com o conteúdo
        /// XML com o retorno que foi dado do serviço do WebService.
        /// No caso do RetRecepcao se tudo estiver correto retorna um XML
        /// dizendo que o lote foi processado ou não e se as notas foram 
        /// autorizadas ou não.
        /// Se der algum erro ele grava um arquivo txt com o erro em questão.
        /// </remarks>
        /// <example>
        /// oUniNfe.vXmlNfeDadosMsg = "c:\teste-ped-rec.xml";
        /// oUniNfe.RetRecepcao();
        /// this.textBox_xmlretorno.Text = oUniNfe.vNfeRetorno;
        /// //
        /// //
        /// //O conteúdo de retorno vai ser algo mais ou menos assim:
        /// //
        /// //<?xml version="1.0" encoding="UTF-8"?>
        /// //   <retEnviNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.10">
        /// //      <tpAmb>2</tpAmb>
        /// //      <verAplic>1.10</verAplic>
        /// //      <cStat>103</cStat>
        /// //      <xMotivo>Lote recebido com sucesso</xMotivo>
        /// //      <cUF>51</cUF>
        /// //      <infRec>
        /// //         <nRec>510000000106704</nRec>
        /// //         <dhRecbto>2008-06-12T10:49:30</dhRecbto>
        /// //         <tMed>2</tMed>
        /// //      </infRec>
        /// //   </retEnviNFe>
        /// </example>
        /// <by>Wandrey Mundin Ferreira</by>
        /// <date>04/06/2008</date>        
        /// 
#if notused
        public override void RetRecepcao()
        {
            int emp = new FindEmpresaThread(Thread.CurrentThread).Index;
            //Definir o serviço que será executado para a classe
            Servico = Servicos.PedidoSituacaoLoteNFe;

            try
            {
                #region Parte do código que envia o XML de pedido de consulta do recibo
                var oLer = new LerXML();
                oLer.PedRec(NomeArquivoXML);

                //Definir o objeto do WebService
                WebServiceProxy wsProxy = ConfiguracaoApp.DefinirWS(Servicos.PedidoSituacaoLoteNFe, emp, oLer.oDadosPedRec.cUF, oLer.oDadosPedRec.tpAmb, oLer.oDadosPedRec.tpEmis);

                //Criar objetos das classes dos serviços dos webservices do SEFAZ
                var oCancelamento = wsProxy.CriarObjeto(NomeClasseWS(Servico, oLer.oDadosPedRec.cUF));
                var oCabecMsg = wsProxy.CriarObjeto(NomeClasseCabecWS());

                //Atribuir conteúdo para duas propriedades da classe nfeCabecMsg
                wsProxy.SetProp(oCabecMsg, "cUF", oLer.oDadosPedRec.cUF.ToString());
                wsProxy.SetProp(oCabecMsg, "versaoDados", ConfiguracaoApp.VersaoXMLPedRec);

                //Invocar o método que envia o XML para o SEFAZ
                oInvocarObj.Invocar(wsProxy, oCancelamento, NomeMetodoWS(Servico, oLer.oDadosPedRec.cUF), oCabecMsg, this);
                #endregion

                #region Parte do código que trata o XML de retorno da consulta do recibo
                //Efetuar a leituras das notas do lote para ver se foi autorizada ou não
                switch (Propriedade.TipoAplicativo)
                {
                    case TipoAplicativo.Cte:
                        LerRetornoLoteCTe();
                        break;
                    case TipoAplicativo.Nfe:
                        LerRetornoLoteNFe();
                        break;
                    default:
                        break;
                }

                //Gravar o XML retornado pelo WebService do SEFAZ na pasta de retorno para o ERP
                //Tem que ser feito neste ponto, pois somente aqui terminamos todo o processo
                //Wandrey 18/06/2009
                oGerarXML.XmlRetorno(Propriedade.ExtEnvio.PedRec_XML, Propriedade.ExtRetorno.ProRec_XML, vStrXmlRetorno);
                #endregion
            }
            catch (Exception ex)
            {
                try
                {
                    GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.PedRec_XML, Propriedade.ExtRetorno.ProRec_ERR, ex);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Pois ocorreu algum erro de rede, hd, permissão das pastas, etc. Wandrey 22/03/2010
                }
            }
            finally
            {
                //Deletar o arquivo de solicitação do serviço
                Functions.DeletarArquivo(NomeArquivoXML);
            }
        }
Example #5
0
        /// <summary>
        /// Envia o XML de consulta do registro do DPEC para o SCE (Sistema de Contingência Eletronica)
        /// </summary>
        /// <remarks>
        /// Autor: Wandrey Mundin Ferreira
        /// Data: 19/10/2010
        /// </remarks>
        /// 
#if notused
        public override void ConsultaDPEC()
        {
            //           throw new NotImplementedException();
            int emp = new FindEmpresaThread(Thread.CurrentThread).Index;

            //Definir o serviço que será executado para a classe
            Servico = Servicos.ConsultarDPEC;

            try
            {
                //Ler o XML para pegar parâmetros de envio
                LerXML oLer = new LerXML();
                oLer.ConsDPEC(emp, NomeArquivoXML);

                if (vXmlNfeDadosMsgEhXML)  //danasa 12-9-2009
                {
                    //Definir o objeto do WebService
                    WebServiceProxy wsProxy = ConfiguracaoApp.DefinirWS(Servicos.ConsultarDPEC, emp, 0, oLer.dadosConsDPEC.tpAmb, oLer.dadosConsDPEC.tpEmis);

                    //Criar objetos das classes dos serviços dos webservices do SEFAZ
                    object oRecepcaoDPEC = wsProxy.CriarObjeto("SCEConsultaRFB");
                    object oCabecMsg = wsProxy.CriarObjeto("sceCabecMsg");

                    //Atribuir conteúdo para duas propriedades da classe nfeCabecMsg
                    wsProxy.SetProp(oCabecMsg, "versaoDados", ConfiguracaoApp.VersaoXMLConsDPEC);

                    //Invocar o método que envia o XML para o SEFAZ
                    oInvocarObj.Invocar(wsProxy, oRecepcaoDPEC, "sceConsultaDPEC", oCabecMsg, this);

                    //Ler o retorno
                    LerRetConsDPEC(emp);

                    //Gravar o XML retornado pelo WebService do SEFAZ na pasta de retorno para o ERP
                    //Tem que ser feito neste ponto, pois somente aqui terminamos todo o processo
                    oGerarXML.XmlRetorno(Propriedade.ExtEnvio.ConsDPEC_XML, Propriedade.ExtRetorno.retConsDPEC_XML, vStrXmlRetorno);
                }
                else
                {
                    // Gerar o XML de solicitacao de situacao do servico a partir do TXT gerado pelo ERP
                    oGerarXML.ConsultaDPEC(Path.GetFileNameWithoutExtension(NomeArquivoXML) + ".xml", oLer.dadosConsDPEC);
                }
            }
            catch (Exception ex)
            {
                var ExtRet = vXmlNfeDadosMsgEhXML ? Propriedade.ExtEnvio.ConsDPEC_XML : Propriedade.ExtEnvio.ConsDPEC_TXT;

                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    GravarArqErroServico(NomeArquivoXML, ExtRet, Propriedade.ExtRetorno.retConsDPEC_ERR, ex);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 09/03/2010
                }
            }
            finally
            {
                try
                {
                    Functions.DeletarArquivo(NomeArquivoXML);
                }
                catch
                {
                    //Se falhou algo na hora de deletar o XML de cancelamento de NFe, infelizmente
                    //não posso fazer mais nada, o UniNFe vai tentar mandar o arquivo novamente para o webservice, pois ainda não foi excluido.
                    //Wandrey 09/03/2010
                }
            }
        }
Example #6
0
        /// <summary>
        /// Ler o retorno da consulta situação da nota fiscal e de acordo com o status ele trata as notas enviadas se ainda não foram tratadas
        /// </summary>
        /// <param name="ChaveNFe">Chave da NFe que está sendo consultada</param>
        /// <remarks>
        /// Autor: Wandrey Mundin Ferreira
        /// Data: 16/06/2010
        /// </remarks>
        /// 
#if notused
        protected override void LerRetornoSitNFe(string ChaveNFe)
        {
            int emp = new FindEmpresaThread(Thread.CurrentThread).Index;

            LerXML oLerXml = new LerXML();
            MemoryStream msXml = Functions.StringXmlToStream(this.vStrXmlRetorno);

            FluxoNfe oFluxoNfe = new FluxoNfe();

            try
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(msXml);

                #region Distribuicao de Eventos

                oGerarXML.XmlDistEvento(emp, this.vStrXmlRetorno);    //<<<danasa 6-2011

                #endregion

                #region Cancelamento NFe
                new TaskCancelamento().GerarXmlDistCanc(ChaveNFe); //Wandrey 12/01/2012
                #endregion

                XmlNodeList retConsSitList = doc.GetElementsByTagName("retConsSitNFe");

                foreach (XmlNode retConsSitNode in retConsSitList)
                {
                    XmlElement retConsSitElemento = (XmlElement)retConsSitNode;

                    //Definir a chave da NFe a ser pesquisada
                    string strChaveNFe = "NFe" + ChaveNFe;

                    //Definir o nome do arquivo da NFe e seu caminho
                    string strNomeArqNfe = oFluxoNfe.LerTag(strChaveNFe, FluxoNfe.ElementoFixo.ArqNFe);

                    if (string.IsNullOrEmpty(strNomeArqNfe))
                    {
                        if (string.IsNullOrEmpty(strChaveNFe))
                            throw new Exception("LerRetornoSitNFe(): Não pode obter o nome do arquivo");

                        strNomeArqNfe = strChaveNFe.Substring(3) + Propriedade.ExtEnvio.Nfe;
                    }

                    string strArquivoNFe = Empresa.Configuracoes[emp].PastaEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + strNomeArqNfe;

                    //Pegar o status de retorno da NFe que está sendo consultada a situação
                    var cStatCons = string.Empty;
                    if (retConsSitElemento.GetElementsByTagName("cStat")[0] != null)
                    {
                        cStatCons = retConsSitElemento.GetElementsByTagName("cStat")[0].InnerText;
                    }

                    switch (cStatCons)
                    {
                        #region Rejeições do XML de consulta da situação da NFe (Não é a nfe que foi rejeitada e sim o XML de consulta da situação da nfe)

                        #region Validação do Certificado de Transmissão
                        case "280":
                        case "281":
                        case "283":
                        case "286":
                        case "284":
                        case "285":
                        case "282":
                        #endregion

                        #region Validação Inicial da Mensagem no WebService
                        case "214":
                        case "243":
                        case "108":
                        case "109":
                        #endregion

                        #region Validação das informações de controle da chamada ao WebService
                        case "242":
                        case "409":
                        case "410":
                        case "411":
                        case "238":
                        case "239":
                        #endregion

                        #region Validação da forma da área de dados
                        case "215":
                        case "516":
                        case "517":
                        case "545":
                        case "587":
                        case "588":
                        case "404":
                        case "402":
                        #endregion

                        #region Validação das regras de negócios da consulta a NF-e
                        case "252":
                        case "226":
                        case "236":
                        case "614":
                        case "615":
                        case "616":
                        case "617":
                        case "618":
                        case "619":
                        case "620":
                            break;
                        #endregion

                        #region Nota fiscal rejeitada
                        case "217": //J-NFe não existe na base de dados do SEFAZ
                            goto case "TirarFluxo";

                        case "562": //J-Verificar se o campo "Código Numérico" informado na chave de acesso é diferente do existente no BD
                            goto case "TirarFluxo";

                        case "561": //J-Verificar se campo MM (mês) informado na Chave de Acesso é diferente do existente no BD
                            goto case "TirarFluxo";
                        #endregion

                        #endregion

                        #region Nota fiscal autorizada
                        case "100": //Autorizado o uso da NFe
                            XmlNodeList infConsSitList = retConsSitElemento.GetElementsByTagName("infProt");
                            if (infConsSitList != null)
                            {
                                foreach (XmlNode infConsSitNode in infConsSitList)
                                {
                                    XmlElement infConsSitElemento = (XmlElement)infConsSitNode;

                                    //Pegar o Status do Retorno da consulta situação
                                    string strStat = Functions.LerTag(infConsSitElemento, "cStat").Replace(";", "");

                                    switch (strStat)
                                    {
                                        case "100":
                                            //O retorno da consulta situação a posição das tag´s é diferente do que vem 
                                            //na consulta do recibo, assim sendo tenho que montar esta parte do XML manualmente
                                            //para que fique um XML de distribuição válido. Wandrey 07/10/2009
                                            string strProtNfe = GeraStrProtNFe(infConsSitElemento);//danasa 11-4-2012

                                            //Definir o nome do arquivo -procNfe.xml                                               
                                            string strArquivoNFeProc = Empresa.Configuracoes[emp].PastaEnviado + "\\" +
                                                                        PastaEnviados.EmProcessamento.ToString() + "\\" +
                                                                        Functions/*oAux*/.ExtrairNomeArq(strArquivoNFe, Propriedade.ExtEnvio.Nfe) + Propriedade.ExtRetorno.ProcNFe;

                                            //Se existir o strArquivoNfe, tem como eu fazer alguma coisa, se ele não existir
                                            //Não tenho como fazer mais nada. Wandrey 08/10/2009
                                            if (File.Exists(strArquivoNFe))
                                            {
                                                //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s autorizados
                                                oLerXml.Nfe(strArquivoNFe);

                                                //Verificar se a -nfe.xml existe na pasta de autorizados
                                                bool NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Nfe);

                                                //Verificar se o -procNfe.xml existe na past de autorizados
                                                bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtRetorno.ProcNFe);

                                                //Se o XML de distribuição não estiver na pasta de autorizados
                                                if (!procNFeJaNaAutorizada)
                                                {
                                                    if (!File.Exists(strArquivoNFeProc))
                                                    {
                                                        oGerarXML.XmlDistNFe(strArquivoNFe, strProtNfe, Propriedade.ExtRetorno.ProcNFe);
                                                    }
                                                }

                                                //Se o XML de distribuição não estiver ainda na pasta de autorizados
                                                if (!procNFeJaNaAutorizada)
                                                {
                                                    //Move a nfeProc da pasta de NFE em processamento para a NFe Autorizada
                                                    MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);

                                                    //Atualizar a situação para que eu só mova o arquivo com final -NFe.xml para a pasta autorizado se 
                                                    //a procnfe já estiver lá, ou vai ficar na pasta emProcessamento para tentar gerar novamente.
                                                    //Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012
                                                    procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtRetorno.ProcNFe);
                                                }

                                                //Se a NFe não existir ainda na pasta de autorizados
                                                if (!NFeJaNaAutorizada)
                                                {
                                                    //1-Mover a NFE da pasta de NFE em processamento para NFe Autorizada
                                                    //2-Só vou mover o -nfe.xml para a pasta autorizados se já existir a -procnfe.xml, caso contrário vou manter na pasta EmProcessamento
                                                    //  para tentar gerar novamente o -procnfe.xml
                                                    //  Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012
                                                    if (procNFeJaNaAutorizada)
                                                        MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);
                                                }
                                                else
                                                {
                                                    //1-Se já estiver na pasta de autorizados, vou somente mover ela da pasta de XML´s em processamento
                                                    //2-Só vou mover o -nfe.xml da pasta EmProcessamento se também existir a -procnfe.xml na pasta autorizados, caso contrário vou manter na pasta EmProcessamento
                                                    //  para tentar gerar novamente o -procnfe.xml
                                                    //  Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012
                                                    if (procNFeJaNaAutorizada)
                                                        oAux.MoveArqErro(strArquivoNFe);
                                                    //oAux.DeletarArquivo(strArquivoNFe);
                                                }

                                                //Disparar a geração/impressão do UniDanfe. 03/02/2010 - Wandrey
                                                if (procNFeJaNaAutorizada)
                                                    ExecutaUniDanfe(strNomeArqNfe, oLerXml.oDadosNfe.dEmi);
                                            }

                                            if (File.Exists(strArquivoNFeProc))
                                            {
                                                //Se já estiver na pasta de autorizados, vou somente excluir ela da pasta de XML´s em processamento
                                                Functions.DeletarArquivo(strArquivoNFeProc);
                                            }

                                            break;

                                        //danasa 11-4-2012
                                        case "110": //Uso Denegado
                                        case "301":
                                        case "302":
                                            //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s Denegados
                                            //
                                            // NFe existe na pasta EmProcessamento?
                                            ProcessaNotaDenegada(emp, oLerXml, strArquivoNFe, infConsSitElemento);
                                            break;

                                        //case "302":
                                        //    goto case "301";

                                        //case "110": //Uso Denegado
                                        //    goto case "301";

                                        default:
                                            //Mover o XML da NFE a pasta de XML´s com erro
                                            oAux.MoveArqErro(strArquivoNFe);
                                            break;
                                    }

                                    //Deletar a NFE do arquivo de controle de fluxo
                                    oFluxoNfe.ExcluirNfeFluxo(strChaveNFe);
                                }
                            }
                            break;
                        #endregion

                        #region Nota fiscal cancelada
                        case "101": //Cancelamento Homologado ou Nfe Cancelada
                            goto case "100";
                        #endregion

                        #region Nota fiscal Denegada
                        case "110": //NFe Denegada
                            goto case "100";

                        case "301": //NFe Denegada
                            goto case "100";

                        case "302": //NFe Denegada
                            goto case "100";

                        case "205": //Nfe já está denegada na base do SEFAZ
                            goto case "100";    ///<<<<<<<<<< ??????????????????? >>>>>>>>>>>>
                        ///
                        //Ler o XML para pegar a data de emissão para criar a psta dos XML´s Denegados
                        /*
                        if (File.Exists(strArquivoNFe))
                        {
                            oLerXml.Nfe(strArquivoNFe);

                            //Move a NFE da pasta de NFE em processamento para NFe Denegadas
                            if (!oAux.EstaDenegada(strArquivoNFe, oLerXml.oDadosNfe.dEmi))
                            {
                                oAux.MoverArquivo(strArquivoNFe, PastaEnviados.Denegados, oLerXml.oDadosNfe.dEmi);
                            }
                        }
                        break;*/

                        #endregion

                        #region Conteúdo para retirar a nota fiscal do fluxo
                        case "TirarFluxo":
                            //Mover o XML da NFE a pasta de XML´s com erro
                            oAux.MoveArqErro(strArquivoNFe);

                            //Deletar a NFE do arquivo de controle de fluxo
                            oFluxoNfe.ExcluirNfeFluxo(strChaveNFe);
                            break;
                        #endregion

                        default:
                            break;
                    }
                }
            }
            catch (Exception ex)
            {
                throw (ex);
            }
        }
Example #7
0
        /// <summary>
        /// Ler o retorno da consulta situação da nota fiscal e de acordo com o status ele trata as notas enviadas se ainda não foram tratadas
        /// </summary>
        /// <param name="ChaveNFe">Chave da NFe que está sendo consultada</param>
        /// <remarks>
        /// Autor: Wandrey Mundin Ferreira
        /// Data: 16/06/2010
        /// </remarks>
        protected override void LerRetornoSitCTe(string ChaveNFe)
        {
            int emp = new FindEmpresaThread(Thread.CurrentThread).Index;

            LerXML oLerXml = new LerXML();
            MemoryStream msXml = Functions.StringXmlToStream(this.vStrXmlRetorno);

            FluxoNfe oFluxoNfe = new FluxoNfe();

            try
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(msXml);

                XmlNodeList retConsSitList = doc.GetElementsByTagName("retConsSitCTe");

                foreach (XmlNode retConsSitNode in retConsSitList)
                {
                    XmlElement retConsSitElemento = (XmlElement)retConsSitNode;

                    //Definir a chave da NFe a ser pesquisada
                    string strChaveNFe = "CTe" + ChaveNFe;

                    //Definir o nome do arquivo da NFe e seu caminho
                    string strNomeArqNfe = oFluxoNfe.LerTag(strChaveNFe, FluxoNfe.ElementoFixo.ArqNFe);

                    if (string.IsNullOrEmpty(strNomeArqNfe))
                    {
                        if (string.IsNullOrEmpty(strChaveNFe))
                            throw new Exception("LerRetornoSitCTe(): Não pode obter o nome do arquivo");

                        strNomeArqNfe = strChaveNFe.Substring(3) + Propriedade.ExtEnvio.Nfe;
                    }

                    string strArquivoNFe = Empresa.Configuracoes[emp].PastaEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + strNomeArqNfe;

                    //Pegar o status de retorno da NFe que está sendo consultada a situação
                    var cStatCons = string.Empty;
                    if (retConsSitElemento.GetElementsByTagName("cStat")[0] != null)
                    {
                        cStatCons = retConsSitElemento.GetElementsByTagName("cStat")[0].InnerText;
                    }

                    switch (cStatCons)
                    {
                        #region Rejeições do XML de consulta do recibo (Não é o lote que foi rejeitado e sim o XML de consulta do recibo)
                        case "280": //A-Certificado transmissor inválido
                        case "281": //A-Validade do certificado
                        case "283": //A-Verifica a cadeia de Certificação
                        case "286": //A-LCR do certificado de Transmissor
                        case "284": //A-Certificado do Transmissor revogado
                        case "285": //A-Certificado Raiz difere da "IPC-Brasil"
                        case "282": //A-Falta a extensão de CNPJ no Certificado
                        case "214": //B-Tamanho do XML de dados superior a 500 Kbytes
                        case "243": //B-XML de dados mal formatado
                        case "108": //B-Verifica se o Serviço está paralisado momentaneamente
                        case "109": //B-Verifica se o serviço está paralisado sem previsão
                        case "242": //C-Elemento nfeCabecMsg inexistente no SOAP Header
                        case "409": //C-Campo cUF inexistente no elemento nfeCabecMsg do SOAP Header
                        case "410": //C-Campo versaoDados inexistente no elemento nfeCabecMsg do SOAP
                        case "411": //C-Campo versaoDados inexistente no elemento nfeCabecMsg do SOAP
                        case "238": //C-Versão dos Dados informada é superior à versão vigente
                        case "239": //C-Versão dos Dados não suportada
                        case "215": //D-Verifica schema XML da área de dados
                        case "404": //D-Verifica o uso de prefixo no namespace
                        case "402": //D-XML utiliza codificação diferente de UTF-8
                        case "252": //E-Tipo do ambiente da NF-e difere do ambiente do web service
                        case "226": //E-UF da Chave de Acesso difere da UF do Web Service
                        case "236": //E-Valida DV da Chave de Acesso
                        case "216": //E-Verificar se campo "Codigo Numerico"
                            break;
                        #endregion

                        #region Nota fiscal rejeitada
                        case "217": //J-NFe não existe na base de dados do SEFAZ
                            goto case "TirarFluxo";
                        #endregion

                        #region Nota fiscal autorizada
                        case "100": //Autorizado o uso da NFe
                            XmlNodeList infConsSitList = retConsSitElemento.GetElementsByTagName("infProt");
                            if (infConsSitList != null)
                            {
                                foreach (XmlNode infConsSitNode in infConsSitList)
                                {
                                    XmlElement infConsSitElemento = (XmlElement)infConsSitNode;

                                    //Pegar o Status do Retorno da consulta situação
                                    string strStat = Functions.LerTag(infConsSitElemento, "cStat").Replace(";", "");

                                    switch (strStat)
                                    {
                                        case "100":
                                            //O retorno da consulta situação a posição das tag´s é diferente do que vem 
                                            //na consulta do recibo, assim sendo tenho que montar esta parte do XML manualmente
                                            //para que fique um XML de distribuição válido. Wandrey 07/10/2009
                                            string atributoId = string.Empty;
                                            if (infConsSitElemento.GetAttribute("Id").Length != 0)
                                            {
                                                atributoId = " Id=\"" + infConsSitElemento.GetAttribute("Id") + "\"";
                                            }

                                            string strProtNfe = "<protCTe versao=\"" + ConfiguracaoApp.VersaoXMLNFe + "\">" +
                                                "<infProt" + atributoId + ">" +
                                                "<tpAmb>" + Functions.LerTag(infConsSitElemento, "tpAmb", false) + "</tpAmb>" +
                                                "<verAplic>" + Functions.LerTag(infConsSitElemento, "verAplic", false) + "</verAplic>" +
                                                "<chCTe>" + Functions.LerTag(infConsSitElemento, "chCTe", false) + "</chCTe>" +
                                                "<dhRecbto>" + Functions.LerTag(infConsSitElemento, "dhRecbto", false) + "</dhRecbto>" +
                                                "<nProt>" + Functions.LerTag(infConsSitElemento, "nProt", false) + "</nProt>" +
                                                "<digVal>" + Functions.LerTag(infConsSitElemento, "digVal", false) + "</digVal>" +
                                                "<cStat>" + Functions.LerTag(infConsSitElemento, "cStat", false) + "</cStat>" +
                                                "<xMotivo>" + Functions.LerTag(infConsSitElemento, "xMotivo", false) + "</xMotivo>" +
                                                "</infProt>" +
                                                "</protCTe>";

                                            //Definir o nome do arquivo -procNfe.xml                                               
                                            string strArquivoNFeProc = Empresa.Configuracoes[emp].PastaEnviado + "\\" +
                                                                        PastaEnviados.EmProcessamento.ToString() + "\\" +
                                                                        Functions/*oAux*/.ExtrairNomeArq(strArquivoNFe, Propriedade.ExtEnvio.Nfe) + Propriedade.ExtRetorno.ProcNFe;

                                            //Se existir o strArquivoNfe, tem como eu fazer alguma coisa, se ele não existir
                                            //Não tenho como fazer mais nada. Wandrey 08/10/2009
                                            if (File.Exists(strArquivoNFe))
                                            {
                                                //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s autorizados
                                                oLerXml.Nfe(strArquivoNFe);

                                                //Verificar se a -nfe.xml existe na pasta de autorizados
                                                bool NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Nfe);

                                                //Verificar se o -procNfe.xml existe na past de autorizados
                                                bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtRetorno.ProcNFe);

                                                //Se o XML de distribuição não estiver na pasta de autorizados
                                                if (!procNFeJaNaAutorizada)
                                                {
                                                    if (!File.Exists(strArquivoNFeProc))
                                                    {
                                                        oGerarXML.XmlDistNFe(strArquivoNFe, strProtNfe, Propriedade.ExtRetorno.ProcNFe);
                                                    }
                                                }

                                                //Se o XML de distribuição não estiver ainda na pasta de autorizados
                                                if (!procNFeJaNaAutorizada)
                                                {
                                                    //Move a nfeProc da pasta de NFE em processamento para a NFe Autorizada
                                                    MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);
                                                }

                                                //Se a NFe não existir ainda na pasta de autorizados
                                                if (!NFeJaNaAutorizada)
                                                {
                                                    //Mover a NFE da pasta de NFE em processamento para NFe Autorizada
                                                    MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);
                                                }
                                                else
                                                {
                                                    //Se já estiver na pasta de autorizados, vou somente excluir ela da pasta de XML´s em processamento
                                                    Functions.DeletarArquivo(strArquivoNFe);
                                                }

                                                //Disparar a geração/impressçao do UniDanfe. 03/02/2010 - Wandrey
                                                //ExecutaUniDanfe(strNomeArqNfe, oLerXml.oDadosNfe.dEmi);
                                            }

                                            if (File.Exists(strArquivoNFeProc))
                                            {
                                                //Se já estiver na pasta de autorizados, vou somente excluir ela da pasta de XML´s em processamento
                                                Functions.DeletarArquivo(strArquivoNFeProc);
                                            }

                                            break;

                                        case "301":
                                            //Ler o XML para pegar a data de emissão para criar a psta dos XML´s Denegados
                                            if (File.Exists(strArquivoNFe))
                                            {
                                                oLerXml.Nfe(strArquivoNFe);

                                                //Move a NFE da pasta de NFE em processamento para NFe Denegadas
                                                if (!oAux.EstaDenegada(strArquivoNFe, oLerXml.oDadosNfe.dEmi))
                                                {
                                                    MoverArquivo(strArquivoNFe, PastaEnviados.Denegados, oLerXml.oDadosNfe.dEmi);
                                                }
                                            }

                                            break;

                                        case "302":
                                            goto case "301";

                                        case "303":
                                            goto case "301";

                                        case "304":
                                            goto case "301";

                                        case "305":
                                            goto case "301";

                                        case "306":
                                            goto case "301";

                                        case "110": //Uso Denegado
                                            goto case "301";

                                        default:
                                            //Mover o XML da NFE a pasta de XML´s com erro
                                            oAux.MoveArqErro(strArquivoNFe);
                                            break;
                                    }

                                    //Deletar a NFE do arquivo de controle de fluxo
                                    oFluxoNfe.ExcluirNfeFluxo(strChaveNFe);
                                }
                            }
                            break;
                        #endregion

                        #region Nota fiscal cancelada
                        case "101": //Cancelamento Homologado ou Nfe Cancelada
                            goto case "100";
                        #endregion

                        #region Nota fiscal Denegada
                        case "110": //NFe Denegada
                            goto case "100";

                        case "301": //NFe Denegada
                            goto case "100";

                        case "302": //NFe Denegada
                            goto case "100";

                        case "303": //NFe Denegada
                            goto case "100";

                        case "304": //NFe Denegada
                            goto case "100";

                        case "305": //NFe Denegada
                            goto case "100";

                        case "306": //NFe Denegada
                            goto case "100";
                        #endregion

                        #region Conteúdo para retirar a nota fiscal do fluxo
                        case "TirarFluxo":
                            //Mover o XML da NFE a pasta de XML´s com erro
                            oAux.MoveArqErro(strArquivoNFe);

                            //Deletar a NFE do arquivo de controle de fluxo
                            oFluxoNfe.ExcluirNfeFluxo(strChaveNFe);
                            break;
                        #endregion

                        default:
                            break;
                    }
                }
            }
            catch (Exception ex)
            {
                throw (ex);
            }
        }
Example #8
0
        /// <summary>
        /// Efetua a leitura do XML de retorno do processamento do lote de notas fiscais e
        /// atualiza o arquivo de fluxo e envio de notas
        /// </summary>
        /// <by>Wandrey Mundin Ferreira</by>
        /// <date>20/04/2009</date>
        private void LerRetornoLoteCTe()
        {
            int emp      = Empresas.FindEmpresaByThread();
            var oLerXml  = new LerXML();
            var msXml    = Functions.StringXmlToStream(vStrXmlRetorno);
            var fluxoNFe = new FluxoNfe();

            var doc = new System.Xml.XmlDocument();

            doc.Load(msXml);

            var retConsReciNFeList = doc.GetElementsByTagName("retConsReciCTe");

            foreach (System.Xml.XmlNode retConsReciNFeNode in retConsReciNFeList)
            {
                var retConsReciNFeElemento = (System.Xml.XmlElement)retConsReciNFeNode;

                //Pegar o número do recibo do lote enviado
                var nRec = string.Empty;
                if (retConsReciNFeElemento.GetElementsByTagName(TpcnResources.nRec.ToString())[0] != null)
                {
                    nRec = retConsReciNFeElemento.GetElementsByTagName(TpcnResources.nRec.ToString())[0].InnerText;
                }

                //Pegar o status de retorno do lote enviado
                var cStatLote = string.Empty;
                if (retConsReciNFeElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null)
                {
                    cStatLote = retConsReciNFeElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0].InnerText;
                }

                switch (cStatLote)
                {
                    #region Rejeições do XML de consulta do recibo (Não é o lote que foi rejeitado e sim o XML de consulta do recibo)
                case "280":     //A-Certificado transmissor inválido
                case "281":     //A-Validade do certificado
                case "283":     //A-Verifica a cadeia de Certificação
                case "286":     //A-LCR do certificado de Transmissor
                case "284":     //A-Certificado do Transmissor revogado
                case "285":     //A-Certificado Raiz difere da "IPC-Brasil"
                case "282":     //A-Falta a extensão de CNPJ no Certificado
                case "214":     //B-Tamanho do XML de dados superior a 500 Kbytes
                case "243":     //B-XML de dados mal formatado
                case "108":     //B-Verifica se o Serviço está paralisado momentaneamente
                case "109":     //B-Verifica se o serviço está paralisado sem previsão
                case "242":     //C-Elemento nfeCabecMsg inexistente no SOAP Header
                case "409":     //C-Campo cUF inexistente no elemento nfeCabecMsg do SOAP Header
                case "410":     //C-Campo versaoDados inexistente no elemento nfeCabecMsg do SOAP
                case "411":     //C-Campo versaoDados inexistente no elemento nfeCabecMsg do SOAP
                case "238":     //C-Versão dos Dados informada é superior à versão vigente
                case "239":     //C-Versão dos Dados não suportada
                case "215":     //D-Verifica schema XML da área de dados
                case "404":     //D-Verifica o uso de prefixo no namespace
                case "402":     //D-XML utiliza codificação diferente de UTF-8
                case "252":     //E-Tipo do ambiente da NF-e difere do ambiente do web service
                case "226":     //E-UF da Chave de Acesso difere da UF do Web Service
                case "236":     //E-Valida DV da Chave de Acesso
                case "217":     //E-Acesso BD CTE
                case "216":     //E-Verificar se campo "Codigo Numerico"
                    break;
                    #endregion

                    #region Lote ainda está sendo processado
                case "105":     //E-Verifica se o lote não está na fila de resposta, mas está na fila de entrada (Lote em processamento)
                    //Ok vou aguardar o ERP gerar uma nova consulta para encerrar o fluxo da nota
                    break;
                    #endregion

                    #region Lote não foi localizado pelo recibo que está sendo consultado
                case "106":     //E-Verifica se o lote não está na fila de saída, nem na fila de entrada (Lote não encontrado)
                    //No caso do lote não encontrado através do recibo, o ERP vai ter que consultar a situação da NFe para encerrar ela
                    //Vou somente excluir ela do fluxo para não ficar consultando o recibo que não existe
                    if (nRec != string.Empty)
                    {
                        fluxoNFe.ExcluirNfeFluxoRec(nRec.Trim());
                    }
                    break;
                    #endregion

                    #region Lote foi processado, agora tenho que tratar as notas fiscais dele
                case "104":     //Lote processado
                    var protNFeList = retConsReciNFeElemento.GetElementsByTagName("protCTe");

                    foreach (System.Xml.XmlNode protNFeNode in protNFeList)
                    {
                        var protNFeElemento = (System.Xml.XmlElement)protNFeNode;

                        var strProtNfe = protNFeElemento.OuterXml;

                        var infProtList = protNFeElemento.GetElementsByTagName("infProt");

                        foreach (System.Xml.XmlNode infProtNode in infProtList)
                        {
                            var infProtElemento = (System.Xml.XmlElement)infProtNode;

                            var strChaveNFe = string.Empty;
                            var strStat     = string.Empty;

                            if (infProtElemento.GetElementsByTagName(TpcnResources.chCTe.ToString())[0] != null)
                            {
                                strChaveNFe = "CTe" + infProtElemento.GetElementsByTagName(TpcnResources.chCTe.ToString())[0].InnerText;
                            }

                            if (infProtElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null)
                            {
                                strStat = infProtElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0].InnerText;
                            }

                            //Definir o nome do arquivo da NFe e seu caminho
                            var strNomeArqNfe = fluxoNFe.LerTag(strChaveNFe, FluxoNfe.ElementoFixo.ArqNFe);

                            // se por algum motivo o XML não existir no "Fluxo", então o arquivo tem que existir
                            // na pasta "EmProcessamento" assinada.
                            if (string.IsNullOrEmpty(strNomeArqNfe))
                            {
                                if (string.IsNullOrEmpty(strChaveNFe))
                                {
                                    throw new Exception("LerRetornoLoteCTe(): Não pode obter o nome do arquivo");
                                }

                                strNomeArqNfe = strChaveNFe.Substring(3) + Propriedade.ExtEnvio.Cte;
                            }
                            var strArquivoNFe = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + strNomeArqNfe;

                            //Atualizar a Tag de status da NFe no fluxo para que se ocorrer alguma falha na exclusão eu tenha esta campo para ter uma referencia em futuras consultas
                            fluxoNFe.AtualizarTag(strChaveNFe, FluxoNfe.ElementoEditavel.cStat, strStat);

                            //Atualizar a tag da data e hora da ultima consulta do recibo
                            fluxoNFe.AtualizarDPedRec(nRec, DateTime.Now);

                            switch (strStat)
                            {
                            case "100":         //NFe Autorizada
                                if (File.Exists(strArquivoNFe))
                                {
                                    //Juntar o protocolo com a NFE já copiando para a pasta em processamento
                                    var strArquivoNFeProc = oGerarXML.XmlDistCTe(strArquivoNFe, strProtNfe);

                                    //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s autorizados
                                    oLerXml.Cte(strArquivoNFe);

                                    //Mover a cteProc da pasta de CTe em processamento para a NFe Autorizada
                                    //Para envitar falhar, tenho que mover primeiro o XML de distribuição (-procCTe.xml) para
                                    //depois mover o da nfe (-cte.xml), pois se ocorrer algum erro, tenho como reconstruir o senário,
                                    //assim sendo não inverta as posições. Wandrey 08/10/2009
                                    TFunctions.MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);

                                    //Mover a CTe da pasta de CTe em processamento para CTe Autorizada
                                    //Para envitar falhar, tenho que mover primeiro o XML de distribuição (-procCTe.xml) para
                                    //depois mover o da nfe (-cte.xml), pois se ocorrer algum erro, tenho como reconstruir o cenário.
                                    //assim sendo não inverta as posições. Wandrey 08/10/2009
                                    TFunctions.MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);

                                    //Disparar a geração/impressao do UniDanfe. 03/02/2010 - Wandrey
                                    try
                                    {
                                        var strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                             PastaEnviados.Autorizados.ToString() + "\\" +
                                                             Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) +
                                                             Path.GetFileName(strArquivoNFeProc);

                                        TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]);
                                    }
                                    catch (Exception ex)
                                    {
                                        Auxiliar.WriteLog("TaskCTeRetRecepcao: " + ex.Message, false);
                                    }
                                }
                                break;

                            case "301":         //NFe Denegada - Irregularidade fiscal do emitente
                                if (File.Exists(strArquivoNFe))
                                {
                                    //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s Denegados
                                    oLerXml.Cte(strArquivoNFe);

                                    //Mover a NFE da pasta de NFE em processamento para NFe Denegadas
                                    TFunctions.MoverArquivo(strArquivoNFe, PastaEnviados.Denegados, oLerXml.oDadosNfe.dEmi);
                                    ///
                                    /// existe DACTE de CTe denegado???
                                    ///
                                    try
                                    {
                                        var strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                             PastaEnviados.Denegados.ToString() + "\\" +
                                                             Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) +
                                                             Functions.ExtrairNomeArq(strArquivoNFe, Propriedade.ExtEnvio.Cte) + Propriedade.ExtRetorno.Den;

                                        TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]);
                                    }
                                    catch (Exception ex)
                                    {
                                        Auxiliar.WriteLog("TaskCTeRetRecepcao: " + ex.Message, false);
                                    }
                                }
                                break;

                            case "302":         //NFe Denegada - Irregularidade fiscal do remetente
                                goto case "301";

                            case "303":         //NFe Denegada - Irregularidade fiscal do destinatário
                                goto case "301";

                            case "304":         //NFe Denegada - Irregularidade fiscal do expedidor
                                goto case "301";

                            case "305":         //NFe Denegada - Irregularidade fiscal do recebedor
                                goto case "301";

                            case "306":         //NFe Denegada - Irregularidade fiscal do tomador
                                goto case "301";

                            case "110":         //NFe Denegada - Não sei quando ocorre este, mas descobrir ele no manual então estou incluindo. Wandrey 20/10/2009
                                goto case "301";

                            default:         //NFe foi rejeitada
                                //Mover o XML da NFE a pasta de XML´s com erro
                                oAux.MoveArqErro(strArquivoNFe);
                                break;
                            }

                            //Deletar a NFE do arquivo de controle de fluxo
                            fluxoNFe.ExcluirNfeFluxo(strChaveNFe);
                            break;
                        }
                    }
                    break;
                    #endregion

                    #region Qualquer outro tipo de status que não for os acima relacionados, vai tirar a nota fiscal do fluxo.
                default:
                    //Qualquer outro tipo de rejeião vou tirar todas as notas do lote do fluxo, pois se o lote foi rejeitado, todas as notas fiscais também foram
                    //De acordo com o manual de integração se o status do lote não for 104, tudo foi rejeitado. Wandrey 20/07/2010

                    //Vou retirar as notas do fluxo pelo recibo
                    if (nRec != string.Empty)
                    {
                        fluxoNFe.ExcluirNfeFluxoRec(nRec.Trim());
                    }

                    break;
                    #endregion
                }
            }
        }
        /// <summary>
        /// Faz a leitura do XML de pedido de consulta da situação da NFe
        /// </summary>
        /// <param name="arquivoXML">Nome do XML a ser lido</param>
        /// <param name="emp">Código da empresa</param>

        /*private void PedSit(int emp, string arquivoXML)
         * {
         *  this.dadosPedSit.tpAmb = Empresas.Configuracoes[emp].AmbienteCodigo;
         *  this.dadosPedSit.chNFe = string.Empty;
         *
         *  XmlDocument doc = new XmlDocument();
         *  doc.Load(arquivoXML);
         *
         *  XmlNodeList consSitNFeList = doc.GetElementsByTagName("consSitCTe");
         *
         *  foreach (XmlNode consSitNFeNode in consSitNFeList)
         *  {
         *      XmlElement consSitNFeElemento = (XmlElement)consSitNFeNode;
         *
         *      dadosPedSit.tpAmb = Convert.ToInt32("0" + consSitNFeElemento.GetElementsByTagName(TpcnResources.tpAmb.ToString())[0].InnerText);
         *      dadosPedSit.chNFe = consSitNFeElemento.GetElementsByTagName(TpcnResources.chCTe.ToString())[0].InnerText;
         *
         *      if (consSitNFeElemento.GetElementsByTagName(TpcnResources.tpEmis.ToString()).Count != 0)
         *      {
         *          this.dadosPedSit.tpEmis = Convert.ToInt16(consSitNFeElemento.GetElementsByTagName(TpcnResources.tpEmis.ToString())[0].InnerText);
         *          /// para que o validador não rejeite, excluo a tag <tpEmis>
         *          doc.DocumentElement.RemoveChild(consSitNFeElemento.GetElementsByTagName(TpcnResources.tpEmis.ToString())[0]);
         *          /// salvo o arquivo modificado
         *          doc.Save(arquivoXML);
         *      }
         *  }
         * }*/
        #endregion

        #region LerRetornoSitCTe()
        /// <summary>
        /// Ler o retorno da consulta situação da nota fiscal e de acordo com o status ele trata as notas enviadas se ainda não foram tratadas
        /// </summary>
        /// <param name="ChaveCTe">Chave da NFe que está sendo consultada</param>
        /// <remarks>
        /// Autor: Wandrey Mundin Ferreira
        /// Data: 16/06/2010
        /// </remarks>
        private void LerRetornoSitCTe(string ChaveCTe)
        {
            int emp = Empresas.FindEmpresaByThread();

            oGerarXML.XmlDistEventoCTe(emp, this.vStrXmlRetorno);  //<<<danasa 6-2011


            LerXML       oLerXml = new LerXML();
            MemoryStream msXml   = Functions.StringXmlToStream(vStrXmlRetorno);

            FluxoNfe oFluxoNfe = new FluxoNfe();

            XmlDocument doc = new XmlDocument();

            doc.Load(msXml);

            XmlNodeList retConsSitList = doc.GetElementsByTagName("retConsSitCTe");

            foreach (XmlNode retConsSitNode in retConsSitList)
            {
                XmlElement retConsSitElemento = (XmlElement)retConsSitNode;

                //Definir a chave da NFe a ser pesquisada
                string strChaveCTe = "CTe" + ChaveCTe;

                //Definir o nome do arquivo da NFe e seu caminho
                string strNomeArqCTe = oFluxoNfe.LerTag(strChaveCTe, FluxoNfe.ElementoFixo.ArqNFe);

                if (string.IsNullOrEmpty(strNomeArqCTe))
                {
                    strNomeArqCTe = strChaveCTe.Substring(3) + Propriedade.ExtEnvio.Cte;
                }

                string strArquivoCTe = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + strNomeArqCTe;

                #region CNPJ da chave não é de uma empresa Uninfe
                bool notDaEmpresa = (ChaveCTe.Substring(6, 14) != Empresas.Configuracoes[emp].CNPJ ||
                                     ChaveCTe.Substring(0, 2) != Empresas.Configuracoes[emp].UnidadeFederativaCodigo.ToString());

                if (!File.Exists(strArquivoCTe) && notDaEmpresa)
                {
                    return;
                }
                #endregion

                //Pegar o status de retorno da NFe que está sendo consultada a situação
                var cStatCons = string.Empty;
                if (retConsSitElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null)
                {
                    cStatCons = retConsSitElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0].InnerText;
                }

                switch (cStatCons)
                {
                    #region Rejeições do XML de consulta do recibo (Não é o lote que foi rejeitado e sim o XML de consulta do recibo)
                case "280":     //A-Certificado transmissor inválido
                case "281":     //A-Validade do certificado
                case "283":     //A-Verifica a cadeia de Certificação
                case "286":     //A-LCR do certificado de Transmissor
                case "284":     //A-Certificado do Transmissor revogado
                case "285":     //A-Certificado Raiz difere da "IPC-Brasil"
                case "282":     //A-Falta a extensão de CNPJ no Certificado
                case "214":     //B-Tamanho do XML de dados superior a 500 Kbytes
                case "243":     //B-XML de dados mal formatado
                case "108":     //B-Verifica se o Serviço está paralisado momentaneamente
                case "109":     //B-Verifica se o serviço está paralisado sem previsão
                case "242":     //C-Elemento nfeCabecMsg inexistente no SOAP Header
                case "409":     //C-Campo cUF inexistente no elemento nfeCabecMsg do SOAP Header
                case "410":     //C-Campo versaoDados inexistente no elemento nfeCabecMsg do SOAP
                case "411":     //C-Campo versaoDados inexistente no elemento nfeCabecMsg do SOAP
                case "238":     //C-Versão dos Dados informada é superior à versão vigente
                case "239":     //C-Versão dos Dados não suportada
                case "215":     //D-Verifica schema XML da área de dados
                case "404":     //D-Verifica o uso de prefixo no namespace
                case "402":     //D-XML utiliza codificação diferente de UTF-8
                case "252":     //E-Tipo do ambiente da NF-e difere do ambiente do web service
                case "226":     //E-UF da Chave de Acesso difere da UF do Web Service
                case "236":     //E-Valida DV da Chave de Acesso
                case "216":     //E-Verificar se campo "Codigo Numerico"
                    break;
                    #endregion

                    #region Nota fiscal rejeitada
                case "217":     //J-NFe não existe na base de dados do SEFAZ
                    goto case "TirarFluxo";
                    #endregion

                    #region Nota fiscal autorizada
                case "100":     //Autorizado o uso da NFe
                case "150":
                    XmlNodeList infConsSitList = retConsSitElemento.GetElementsByTagName("infProt");
                    if (infConsSitList != null)
                    {
                        foreach (XmlNode infConsSitNode in infConsSitList)
                        {
                            XmlElement infConsSitElemento = (XmlElement)infConsSitNode;

                            //Pegar o Status do Retorno da consulta situação
                            string strStat = Functions.LerTag(infConsSitElemento, TpcnResources.cStat.ToString()).Replace(";", "");

                            switch (strStat)
                            {
                            case "100":
                            case "150":
                                var strProtNfe = retConsSitElemento.GetElementsByTagName("protCTe")[0].OuterXml;

                                //Definir o nome do arquivo -procNfe.xml
                                string strArquivoNFeProc = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                           PastaEnviados.EmProcessamento.ToString() + "\\" +
                                                           Functions.ExtrairNomeArq(strArquivoCTe, Propriedade.ExtEnvio.Cte) + Propriedade.ExtRetorno.ProcCTe;

                                //Se existir o strArquivoNfe, tem como eu fazer alguma coisa, se ele não existir
                                //Não tenho como fazer mais nada. Wandrey 08/10/2009
                                if (File.Exists(strArquivoCTe))
                                {
                                    //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s autorizados
                                    oLerXml.Cte(strArquivoCTe);

                                    //Verificar se a -nfe.xml existe na pasta de autorizados
                                    bool NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoCTe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Cte, Propriedade.ExtEnvio.Cte);

                                    //Verificar se o -procNfe.xml existe na past de autorizados
                                    bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoCTe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Cte, Propriedade.ExtRetorno.ProcCTe);

                                    //Se o XML de distribuição não estiver na pasta em processamento
                                    if (!procNFeJaNaAutorizada && !File.Exists(strArquivoNFeProc))
                                    {
                                        oGerarXML.XmlDistCTe(strArquivoCTe, strProtNfe);
                                    }

                                    //Se o XML de distribuição não estiver ainda na pasta de autorizados
                                    if (!(procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoCTe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Cte, Propriedade.ExtRetorno.ProcCTe)))
                                    {
                                        //Move a nfeProc da pasta de NFE em processamento para a NFe Autorizada
                                        TFunctions.MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);
                                    }

                                    //Se a NFe não existir ainda na pasta de autorizados
                                    if (!(NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoCTe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Cte, Propriedade.ExtEnvio.Cte)))
                                    {
                                        //Mover a NFE da pasta de NFE em processamento para NFe Autorizada
                                        TFunctions.MoverArquivo(strArquivoCTe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);
                                    }
                                    else
                                    {
                                        //Se já estiver na pasta de autorizados, vou somente excluir ela da pasta de XML´s em processamento
                                        Functions.DeletarArquivo(strArquivoCTe);
                                    }

                                    //Disparar a geração/impressao do UniDanfe. 03/02/2010 - Wandrey
                                    if (procNFeJaNaAutorizada)
                                    {
                                        try
                                        {
                                            var strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                                 PastaEnviados.Autorizados.ToString() + "\\" +
                                                                 Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) +
                                                                 Path.GetFileName(strArquivoNFeProc);
                                            TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]);
                                        }
                                        catch (Exception ex)
                                        {
                                            Auxiliar.WriteLog("TaskCTeConsultaSituacao: " + ex.Message, false);
                                        }
                                    }
                                }

                                if (File.Exists(strArquivoNFeProc))
                                {
                                    //Se já estiver na pasta de autorizados, vou somente excluir ela da pasta de XML´s em processamento
                                    Functions.DeletarArquivo(strArquivoNFeProc);
                                }

                                break;

                            case "301":
                                //Ler o XML para pegar a data de emissão para criar a psta dos XML´s Denegados
                                if (File.Exists(strArquivoCTe))
                                {
                                    oLerXml.Cte(strArquivoCTe);

                                    //Move a NFE da pasta de NFE em processamento para NFe Denegadas
                                    if (!oAux.EstaDenegada(strArquivoCTe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Cte, Propriedade.ExtRetorno.Den))
                                    {
                                        TFunctions.MoverArquivo(strArquivoCTe, PastaEnviados.Denegados, oLerXml.oDadosNfe.dEmi);
                                        ///
                                        /// existe DACTE de CTe denegado???
                                        ///
                                        try
                                        {
                                            var strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                                 PastaEnviados.Denegados.ToString() + "\\" +
                                                                 Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) +
                                                                 Functions.ExtrairNomeArq(strArquivoCTe, Propriedade.ExtEnvio.Cte) + Propriedade.ExtRetorno.Den;

                                            TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]);
                                        }
                                        catch (Exception ex)
                                        {
                                            Auxiliar.WriteLog("TaskCTeConsultaSituacao: " + ex.Message, false);
                                        }
                                    }
                                }

                                break;

                            case "302":
                                goto case "301";

                            case "303":
                                goto case "301";

                            case "304":
                                goto case "301";

                            case "305":
                                goto case "301";

                            case "306":
                                goto case "301";

                            case "110":         //Uso Denegado
                                goto case "301";

                            default:
                                //Mover o XML da NFE a pasta de XML´s com erro
                                oAux.MoveArqErro(strArquivoCTe);
                                break;
                            }

                            //Deletar a NFE do arquivo de controle de fluxo
                            oFluxoNfe.ExcluirNfeFluxo(strChaveCTe);
                        }
                    }
                    break;
                    #endregion

                    #region Nota fiscal cancelada
                case "101":     //Cancelamento Homologado ou Nfe Cancelada
                    goto case "100";
                    #endregion

                    #region Nota fiscal Denegada
                case "110":     //NFe Denegada
                    goto case "100";

                case "301":     //NFe Denegada
                    goto case "100";

                case "302":     //NFe Denegada
                    goto case "100";

                case "303":     //NFe Denegada
                    goto case "100";

                case "304":     //NFe Denegada
                    goto case "100";

                case "305":     //NFe Denegada
                    goto case "100";

                case "306":     //NFe Denegada
                    goto case "100";
                    #endregion

                    #region Conteúdo para retirar a nota fiscal do fluxo
                case "TirarFluxo":
                    //Mover o XML da NFE a pasta de XML´s com erro
                    oAux.MoveArqErro(strArquivoCTe);

                    //Deletar a NFE do arquivo de controle de fluxo
                    oFluxoNfe.ExcluirNfeFluxo(strChaveCTe);
                    break;
                    #endregion

                default:
                    break;
                }
            }
        }
Example #10
0
        public override void Execute()
        {
            int emp = Empresas.FindEmpresaByThread();

            try
            {
                dadosRec = new DadosRecClass();
                FluxoNfe fluxoNfe = new FluxoNfe();
                LerXML   lerXml   = new LerXML();

                #region Parte que envia o lote
                //Ler o XML de Lote para pegar o número do lote que está sendo enviado
                lerXml.Mdfe(NomeArquivoXML);
                string idLote = lerXml.oDadosNfe.idLote;

                //if (lerXml.oDadosNfe.mod == "58" && Empresas.Configuracoes[emp].Servico != TipoAplicativo.MDFe)
                //    throw new Exception("A empresa não está configurada como MDF-e");

                //Definir o objeto do WebService
                WebServiceProxy wsProxy = ConfiguracaoApp.DefinirWS(Servico, emp, Convert.ToInt32(lerXml.oDadosNfe.cUF), Convert.ToInt32(lerXml.oDadosNfe.tpAmb), Convert.ToInt32(lerXml.oDadosNfe.tpEmis));

                //Criar objetos das classes dos serviços dos webservices do SEFAZ
                object oRecepcao = wsProxy.CriarObjeto(wsProxy.NomeClasseWS);//NomeClasseWS(Servico, Convert.ToInt32(lerXml.oDadosNfe.cUF)));
                var    oCabecMsg = wsProxy.CriarObjeto(NomeClasseCabecWS(Convert.ToInt32(lerXml.oDadosNfe.cUF), Servico));

                //Atribuir conteúdo para duas propriedades da classe nfeCabecMsg
                wsProxy.SetProp(oCabecMsg, NFe.Components.TpcnResources.cUF.ToString(), lerXml.oDadosNfe.cUF);
                wsProxy.SetProp(oCabecMsg, NFe.Components.TpcnResources.versaoDados.ToString(), NFe.ConvertTxt.versoes.VersaoXMLMDFe);

                //
                //XML neste ponto a NFe já está assinada, pois foi assinada, validada e montado o lote para envio por outro serviço.
                //Fica aqui somente este lembrete. Wandrey 16/03/2010
                //

                //Invocar o método que envia o XML para o SEFAZ
                oInvocarObj.Invocar(wsProxy,
                                    oRecepcao,
                                    wsProxy.NomeMetodoWS[0],//NomeMetodoWS(Servico, Convert.ToInt32(lerXml.oDadosNfe.cUF)),
                                    oCabecMsg, this, "-env-lot", "-rec");
                #endregion

                #region Parte que trata o retorno do lote, ou seja, o número do recibo
                Recibo(vStrXmlRetorno);

                if (dadosRec.cStat == "103") //Lote recebido com sucesso
                {
                    //Atualizar o número do recibo no XML de controle do fluxo de notas enviadas
                    fluxoNfe.AtualizarTag(lerXml.oDadosNfe.chavenfe, FluxoNfe.ElementoEditavel.tMed, dadosRec.tMed.ToString());
                    fluxoNfe.AtualizarTagRec(idLote, dadosRec.nRec);
                }
                else if (Convert.ToInt32(dadosRec.cStat) > 200 ||
                         Convert.ToInt32(dadosRec.cStat) == 108 || //Verifica se o servidor de processamento está paralisado momentaneamente. Wandrey 13/04/2012
                         Convert.ToInt32(dadosRec.cStat) == 109)   //Verifica se o servidor de processamento está paralisado sem previsão. Wandrey 13/04/2012
                {
                    //Se o status do retorno do lote for maior que 200 ou for igual a 108 ou 109,
                    //vamos ter que excluir a nota do fluxo, porque ela foi rejeitada pelo SEFAZ
                    //Primeiro vamos mover o xml da nota da pasta EmProcessamento para pasta de XML´s com erro e depois tira ela do fluxo
                    //Wandrey 30/04/2009
                    oAux.MoveArqErro(Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + fluxoNfe.LerTag(lerXml.oDadosNfe.chavenfe, FluxoNfe.ElementoFixo.ArqNFe));
                    fluxoNfe.ExcluirNfeFluxo(lerXml.oDadosNfe.chavenfe);
                }

                //Deleta o arquivo de lote
                Functions.DeletarArquivo(NomeArquivoXML);
                #endregion
            }
            catch (ExceptionEnvioXML ex)
            {
                //Ocorreu algum erro no exato momento em que tentou enviar o XML para o SEFAZ, vou ter que tratar
                //para ver se o XML chegou lá ou não, se eu consegui pegar o número do recibo de volta ou não, etc.
                //E ver se vamos tirar o XML do Fluxo ou finalizar ele com a consulta situação da NFe

                //TODO: V3.0 - Tratar o problema de não conseguir pegar o recibo exatamente neste ponto

                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.Rec_ERR, ex);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 16/03/2010
                }
            }
            catch (ExceptionSemInternet ex)
            {
                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.Rec_ERR, ex, false);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 16/03/2010
                }
            }
            catch (Exception ex)
            {
                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.Rec_ERR, ex);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 16/03/2010
                }
            }
        }
        /// <summary>
        /// Faz a leitura do XML de pedido de consulta da situação da NFe
        /// </summary>
        /// <param name="arquivoXML">Nome do XML a ser lido</param>
        /// <param name="emp">Código da empresa</param>
        /*
        private void PedSit(int emp, string arquivoXML)
        {
            this.dadosPedSit.tpAmb = Empresas.Configuracoes[emp].AmbienteCodigo;
            this.dadosPedSit.chNFe = string.Empty;

            XmlDocument doc = new XmlDocument();
            doc.Load(arquivoXML);

            XmlNodeList consSitNFeList = doc.GetElementsByTagName("consSitMDFe");

            foreach (XmlNode consSitNFeNode in consSitNFeList)
            {
                XmlElement consSitNFeElemento = (XmlElement)consSitNFeNode;

                dadosPedSit.tpAmb = Convert.ToInt32("0" + consSitNFeElemento.GetElementsByTagName(NFe.Components.TpcnResources.tpAmb.ToString())[0].InnerText);
                dadosPedSit.chNFe = consSitNFeElemento.GetElementsByTagName(TpcnResources.chMDFe.ToString())[0].InnerText;

                if (consSitNFeElemento.GetElementsByTagName(NFe.Components.TpcnResources.tpEmis.ToString()).Count != 0)
                {
                    this.dadosPedSit.tpEmis = Convert.ToInt16(consSitNFeElemento.GetElementsByTagName(NFe.Components.TpcnResources.tpEmis.ToString())[0].InnerText);
                    /// para que o validador não rejeite, excluo a tag <tpEmis>
                    doc.DocumentElement.RemoveChild(consSitNFeElemento.GetElementsByTagName(NFe.Components.TpcnResources.tpEmis.ToString())[0]);
                    /// salvo o arquivo modificado
                    doc.Save(arquivoXML);
                }
            }
        }*/
        #endregion

        #region LerRetornoSitMDFe()
        /// <summary>
        /// Ler o retorno da consulta situação da nota fiscal e de acordo com o status ele trata as notas enviadas se ainda não foram tratadas
        /// </summary>
        /// <param name="ChaveMDFe">Chave da NFe que está sendo consultada</param>
        /// <remarks>
        /// Autor: Wandrey Mundin Ferreira
        /// Data: 16/06/2010
        /// </remarks>
        private void LerRetornoSitMDFe(string ChaveMDFe)
        {
            int emp = Empresas.FindEmpresaByThread();

            oGerarXML.XmlDistEventoMDFe(emp, this.vStrXmlRetorno);


            LerXML oLerXml = new LerXML();
            MemoryStream msXml = Functions.StringXmlToStreamUTF8(this.vStrXmlRetorno);

            FluxoNfe oFluxoNfe = new FluxoNfe();

            XmlDocument doc = new XmlDocument();
            doc.Load(msXml);

            XmlNodeList retConsSitList = doc.GetElementsByTagName("retConsSitMDFe");

            foreach (XmlNode retConsSitNode in retConsSitList)
            {
                XmlElement retConsSitElemento = (XmlElement)retConsSitNode;

                //Definir a chave da NFe a ser pesquisada
                string strChaveNFe = "MDFe" + ChaveMDFe;

                //Definir o nome do arquivo da NFe e seu caminho
                string strNomeArqNfe = oFluxoNfe.LerTag(strChaveNFe, FluxoNfe.ElementoFixo.ArqNFe);

                if (string.IsNullOrEmpty(strNomeArqNfe))
                {

                    strNomeArqNfe = strChaveNFe.Substring(4) + Propriedade.ExtEnvio.MDFe;
                }

                string strArquivoNFe = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + strNomeArqNfe;

                #region CNPJ da chave não é de uma empresa Uninfe
                bool notDaEmpresa = (ChaveMDFe.Substring(6, 14) != Empresas.Configuracoes[emp].CNPJ ||
                                    ChaveMDFe.Substring(0, 2) != Empresas.Configuracoes[emp].UnidadeFederativaCodigo.ToString());

                if (!File.Exists(strArquivoNFe) && notDaEmpresa)
                    return;
                #endregion

                //Pegar o status de retorno da NFe que está sendo consultada a situação
                var cStatCons = string.Empty;
                if (retConsSitElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null)
                {
                    cStatCons = retConsSitElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0].InnerText;
                }

                switch (cStatCons)
                {
                    #region Rejeições do XML de consulta da situação da NFe (Não é a nfe que foi rejeitada e sim o XML de consulta da situação da nfe)

                    #region Validação do Certificado de Transmissão
                    case "280":
                    case "281":
                    case "283":
                    case "286":
                    case "284":
                    case "285":
                    case "282":
                    #endregion

                    #region Validação Inicial da Mensagem no WebService
                    case "214":
                    case "243":
                    case "108":
                    case "109":
                    #endregion

                    #region Validação das informações de controle da chamada ao WebService
                    case "242":
                    case "409":
                    case "410":
                    case "411":
                    case "238":
                    case "239":
                    #endregion

                    #region Validação da forma da área de dados
                    case "215":
                    case "598":
                    case "599":
                    case "404":
                    case "402":
                    #endregion

                    #region Validação das regras de negócios da consulta a NF-e
                    case "252":
                    case "226":
                    case "494":
                    case "227":
                    case "253":
                        break;
                    #endregion

                    #region Nota fiscal rejeitada
                    case "217": //J-NFe não existe na base de dados do SEFAZ
                        goto case "TirarFluxo";
                    #endregion

                    #endregion

                    #region Nota fiscal autorizada
                    case "100": //Autorizado o uso da NFe
                        XmlNodeList infConsSitList = retConsSitElemento.GetElementsByTagName("infProt");
                        if (infConsSitList != null)
                        {
                            foreach (XmlNode infConsSitNode in infConsSitList)
                            {
                                XmlElement infConsSitElemento = (XmlElement)infConsSitNode;

                                //Pegar o Status do Retorno da consulta situação
                                string strStat = Functions.LerTag(infConsSitElemento, NFe.Components.TpcnResources.cStat.ToString()).Replace(";", "");

                                switch (strStat)
                                {
                                    case "100":
                                        var strProtNfe = retConsSitElemento.GetElementsByTagName("protMDFe")[0].OuterXml;

                                        //Definir o nome do arquivo -procNfe.xml                                               
                                        string strArquivoNFeProc = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                                    PastaEnviados.EmProcessamento.ToString() + "\\" +
                                                                    Functions.ExtrairNomeArq(strArquivoNFe, Propriedade.ExtEnvio.MDFe) + Propriedade.ExtRetorno.ProcMDFe;

                                        //Se existir o strArquivoNfe, tem como eu fazer alguma coisa, se ele não existir
                                        //Não tenho como fazer mais nada. Wandrey 08/10/2009
                                        if (File.Exists(strArquivoNFe))
                                        {
                                            //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s autorizados
                                            oLerXml.Mdfe(strArquivoNFe);

                                            //Verificar se a -nfe.xml existe na pasta de autorizados
                                            bool NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.MDFe, Propriedade.ExtEnvio.MDFe);

                                            //Verificar se o -procNfe.xml existe na past de autorizados
                                            bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.MDFe, Propriedade.ExtRetorno.ProcMDFe);

                                            //Se o XML de distribuição não estiver na pasta de autorizados
                                            if (!procNFeJaNaAutorizada)
                                            {
                                                if (!File.Exists(strArquivoNFeProc))
                                                {
                                                    oGerarXML.XmlDistMDFe(strArquivoNFe, strProtNfe, Propriedade.ExtRetorno.ProcMDFe);
                                                }
                                            }

                                            //Se o XML de distribuição não estiver ainda na pasta de autorizados
                                            if (!(procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.MDFe, Propriedade.ExtRetorno.ProcMDFe)))
                                            {
                                                //Move a nfeProc da pasta de NFE em processamento para a NFe Autorizada
                                                TFunctions.MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);

                                                //Atualizar a situação para que eu só mova o arquivo com final -NFe.xml para a pasta autorizado se 
                                                //a procnfe já estiver lá, ou vai ficar na pasta emProcessamento para tentar gerar novamente.
                                                //Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012
                                                procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.MDFe, Propriedade.ExtRetorno.ProcMDFe);
                                            }

                                            //Se a NFe não existir ainda na pasta de autorizados
                                            if (!(NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.MDFe, Propriedade.ExtEnvio.MDFe)))
                                            {
                                                //1-Mover a NFE da pasta de NFE em processamento para NFe Autorizada
                                                //2-Só vou mover o -nfe.xml para a pasta autorizados se já existir a -procnfe.xml, caso contrário vou manter na pasta EmProcessamento
                                                //  para tentar gerar novamente o -procnfe.xml
                                                //  Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012
                                                if (procNFeJaNaAutorizada)
                                                    TFunctions.MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);
                                            }
                                            else
                                            {
                                                //1-Se já estiver na pasta de autorizados, vou somente mover ela da pasta de XML´s em processamento
                                                //2-Só vou mover o -nfe.xml da pasta EmProcessamento se também existir a -procnfe.xml na pasta autorizados, caso contrário vou manter na pasta EmProcessamento
                                                //  para tentar gerar novamente o -procnfe.xml
                                                //  Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012
                                                if (procNFeJaNaAutorizada)
                                                    oAux.MoveArqErro(strArquivoNFe);
                                                //oAux.DeletarArquivo(strArquivoNFe);
                                            }

                                            //Disparar a geração/impressão do UniDanfe. 03/02/2010 - Wandrey
                                            if (procNFeJaNaAutorizada)
                                            {
                                                string strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                                            PastaEnviados.Autorizados.ToString() + "\\" +
                                                                            Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) +
                                                                            Functions.ExtrairNomeArq(strArquivoNFe, Propriedade.ExtEnvio.MDFe) + Propriedade.ExtRetorno.ProcMDFe;
                                                try
                                                {
                                                    TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]);
                                                }
                                                catch (Exception ex)
                                                {
                                                    Auxiliar.WriteLog("TaskMDFeConsultaSituacao: " + ex.Message, false);
                                                }
                                            }
                                        }

                                        if (File.Exists(strArquivoNFeProc))
                                        {
                                            //Se já estiver na pasta de autorizados, vou somente excluir ela da pasta de XML´s em processamento
                                            Functions.DeletarArquivo(strArquivoNFeProc);
                                        }

                                        break;

                                    default:
                                        //Mover o XML da NFE a pasta de XML´s com erro
                                        oAux.MoveArqErro(strArquivoNFe);
                                        break;
                                }

                                //Deletar a NFE do arquivo de controle de fluxo
                                oFluxoNfe.ExcluirNfeFluxo(strChaveNFe);
                            }
                        }
                        break;
                    #endregion

                    #region Nota fiscal cancelada
                    case "101": //Cancelamento Homologado ou Nfe Cancelada
                        goto case "100";
                    #endregion

                    #region Conteúdo para retirar a nota fiscal do fluxo
                    case "TirarFluxo":
                        //Mover o XML da NFE a pasta de XML´s com erro
                        oAux.MoveArqErro(strArquivoNFe);

                        //Deletar a NFE do arquivo de controle de fluxo
                        oFluxoNfe.ExcluirNfeFluxo(strChaveNFe);
                        break;
                    #endregion

                    default:
                        break;
                }
            }
        }
Example #12
0
        public override void Execute()
        {
            int emp = Empresas.FindEmpresaByThread();

            try
            {
                dadosRec = new DadosRecClass();
                FluxoNfe oFluxoNfe = new FluxoNfe();
                LerXML   oLer      = new LerXML();

                //Ler o XML de Lote para pegar o número do lote que está sendo enviado
                oLer.Nfe(NomeArquivoXML);

                if (oLer.oDadosNfe.versao != "2.00")
                {
                    Servico = Servicos.NFeEnviarLote2;
                }

                var idLote = oLer.oDadosNfe.idLote;

                //Definir o objeto do WebService
                WebServiceProxy wsProxy = ConfiguracaoApp.DefinirWS(Servico, emp,
                                                                    Convert.ToInt32(oLer.oDadosNfe.cUF),
                                                                    Convert.ToInt32(oLer.oDadosNfe.tpAmb),
                                                                    Convert.ToInt32(oLer.oDadosNfe.tpEmis),
                                                                    oLer.oDadosNfe.versao,
                                                                    oLer.oDadosNfe.mod);

                if (Empresas.Configuracoes[emp].CompactarNfe && oLer.oDadosNfe.versao != "2.00" && wsProxy.NomeMetodoWS.Length == 2)
                {
                    Servico = Servicos.NFeEnviarLoteZip2;
                }

                //Criar objetos das classes dos serviços dos webservices do SEFAZ
                object oRecepcao = wsProxy.CriarObjeto(wsProxy.NomeClasseWS);// NomeClasseWS(Servico, Convert.ToInt32(oLer.oDadosNfe.cUF)));
                var    oCabecMsg = wsProxy.CriarObjeto(NomeClasseCabecWS(Convert.ToInt32(oLer.oDadosNfe.cUF), Servico));

                //Atribuir conteúdo para duas propriedades da classe nfeCabecMsg
                wsProxy.SetProp(oCabecMsg, NFe.Components.TpcnResources.cUF.ToString(), oLer.oDadosNfe.cUF);
                wsProxy.SetProp(oCabecMsg, NFe.Components.TpcnResources.versaoDados.ToString(), oLer.oDadosNfe.versao);

                //XML neste ponto a NFe já está assinada, pois foi assinada, validada e montado o lote para envio por outro serviço.
                //Fica aqui somente este lembrete. Wandrey 16/03/2010


                // Envio de NFe Compactada - Renan 29/04/2014
                if (Servico == Servicos.NFeEnviarLoteZip2)//Empresas.Configuracoes[emp].CompactarNfe && oLer.oDadosNfe.versao != "2.00")
                {
                    FileInfo dadosArquivo = new FileInfo(NomeArquivoXML);
                    TFunctions.CompressXML(dadosArquivo);
                }

                string nOperacao = wsProxy.NomeMetodoWS[(Servico == Servicos.NFeEnviarLoteZip2) ? 1 : 0];

                //Invocar o método que envia o XML para o SEFAZ
                if (Empresas.Configuracoes[emp].IndSinc && oLer.oDadosNfe.versao != "2.00")
                {
                    oInvocarObj.Invocar(wsProxy,
                                        oRecepcao,
                                        nOperacao,//NomeMetodoWS(Servico, Convert.ToInt32(oLer.oDadosNfe.cUF), oLer.oDadosNfe.versao),
                                        oCabecMsg, this);

                    Protocolo(vStrXmlRetorno);
                }
                else
                {
                    oInvocarObj.Invocar(wsProxy,
                                        oRecepcao,
                                        nOperacao,//NomeMetodoWS(Servico, Convert.ToInt32(oLer.oDadosNfe.cUF), oLer.oDadosNfe.versao),
                                        oCabecMsg, this, "-env-lot", "-rec");

                    Recibo(vStrXmlRetorno);
                }

                if (dadosRec.cStat == "104") //Lote processado - Processo da NFe Síncrono - Wandrey 13/03/2014
                {
                    FinalizarNFeSincrono(vStrXmlRetorno, emp);

                    oGerarXML.XmlRetorno(Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.ProRec_XML, vStrXmlRetorno);
                }
                else if (dadosRec.cStat == "103") //Lote recebido com sucesso - Processo da NFe Assíncrono
                {
                    //Atualizar o número do recibo no XML de controle do fluxo de notas enviadas
                    oFluxoNfe.AtualizarTag(oLer.oDadosNfe.chavenfe, FluxoNfe.ElementoEditavel.tMed, /*oLerRecibo.*/ dadosRec.tMed.ToString());
                    oFluxoNfe.AtualizarTagRec(idLote, /*oLerRecibo.*/ dadosRec.nRec);
                }
                else if (Convert.ToInt32(dadosRec.cStat) > 200 ||
                         Convert.ToInt32(dadosRec.cStat) == 108 || //Verifica se o servidor de processamento está paralisado momentaneamente. Wandrey 13/04/2012
                         Convert.ToInt32(dadosRec.cStat) == 109)   //Verifica se o servidor de processamento está paralisado sem previsão. Wandrey 13/04/2012
                {
                    //Se o status do retorno do lote for maior que 200 ou for igual a 108 ou 109,
                    //vamos ter que excluir a nota do fluxo, porque ela foi rejeitada pelo SEFAZ
                    //Primeiro vamos mover o xml da nota da pasta EmProcessamento para pasta de XML´s com erro e depois tira ela do fluxo
                    //Wandrey 30/04/2009
                    oAux.MoveArqErro(Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + oFluxoNfe.LerTag(oLer.oDadosNfe.chavenfe, FluxoNfe.ElementoFixo.ArqNFe));
                    oFluxoNfe.ExcluirNfeFluxo(oLer.oDadosNfe.chavenfe);
                }

                //Deleta o arquivo de lote
                Functions.DeletarArquivo(NomeArquivoXML);

                // Envio de NFe Compactada - Renan 29/04/2014
                if (Servico == Servicos.NFeEnviarLoteZip2)//Empresas.Configuracoes[emp].CompactarNfe && oLer.oDadosNfe.versao != "2.00")
                {
                    Functions.DeletarArquivo(NomeArquivoXML + ".gz");
                }
            }
            catch (ExceptionEnvioXML ex)
            {
                //Ocorreu algum erro no exato momento em que tentou enviar o XML para o SEFAZ, vou ter que tratar
                //para ver se o XML chegou lá ou não, se eu consegui pegar o número do recibo de volta ou não, etc.
                //E ver se vamos tirar o XML do Fluxo ou finalizar ele com a consulta situação da NFe

                //TODO: V3.0 - Tratar o problema de não conseguir pegar o recibo exatamente neste ponto

                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.Rec_ERR, ex);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 16/03/2010
                }
            }
            catch (ExceptionSemInternet ex)
            {
                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.Rec_ERR, ex, false);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 16/03/2010
                }
            }
            catch (Exception ex)
            {
                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.Rec_ERR, ex);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 16/03/2010
                }
            }
        }
Example #13
0
        public override void Execute()
        {
            int emp = Empresas.FindEmpresaByThread();

            FluxoNfe oFluxoNfe = new FluxoNfe();
            LerXML   oLer      = new LerXML();

            try
            {
                dadosRec = new DadosRecClass();

                //Ler o XML de Lote para pegar o número do lote que está sendo enviado
                oLer.Nfe(ConteudoXML);

                var idLote = oLer.oDadosNfe.idLote;

                //Definir o objeto do WebService
                WebServiceProxy wsProxy = ConfiguracaoApp.DefinirWS(Servico, emp,
                                                                    Convert.ToInt32(oLer.oDadosNfe.cUF),
                                                                    Convert.ToInt32(oLer.oDadosNfe.tpAmb),
                                                                    Convert.ToInt32(oLer.oDadosNfe.tpEmis),
                                                                    oLer.oDadosNfe.versao,
                                                                    oLer.oDadosNfe.mod,
                                                                    0);

                System.Net.SecurityProtocolType securityProtocolType = WebServiceProxy.DefinirProtocoloSeguranca(Convert.ToInt32(oLer.oDadosNfe.cUF), Convert.ToInt32(oLer.oDadosNfe.tpAmb), Convert.ToInt32(oLer.oDadosNfe.tpEmis), Servico);

                //Criar objetos das classes dos serviços dos webservices do SEFAZ
                object oRecepcao = wsProxy.CriarObjeto(wsProxy.NomeClasseWS);

                object oCabecMsg = null;
                if (oLer.oDadosNfe.versao != "4.00")
                {
                    oCabecMsg = wsProxy.CriarObjeto(NomeClasseCabecWS(Convert.ToInt32(oLer.oDadosNfe.cUF), Servico));
                    wsProxy.SetProp(oCabecMsg, TpcnResources.cUF.ToString(), oLer.oDadosNfe.cUF);
                    wsProxy.SetProp(oCabecMsg, TpcnResources.versaoDados.ToString(), oLer.oDadosNfe.versao);
                }

                //Invocar o método que envia o XML para o SEFAZ
                if (Empresas.Configuracoes[emp].IndSinc && oLer.oDadosNfe.indSinc)
                {
                    //Não posso gerar o arquivo na pasta de retorno através do método Invocar, por isso não estou colocando os dois ultimos parâmetros com a definição dos prefixos dos arquivos. O arquivo de retorno no processo síncrono deve acontecer somente depois de finalizado o processo da nota, ou gera problemas. Wandrey 11/06/2015
                    oInvocarObj.Invocar(wsProxy,
                                        oRecepcao,
                                        wsProxy.NomeMetodoWS[0],
                                        oCabecMsg,
                                        this,
                                        Propriedade.Extensao(Propriedade.TipoEnvio.EnvLot).EnvioXML,
                                        Propriedade.Extensao(Propriedade.TipoEnvio.PedRec).RetornoXML,
                                        false,
                                        securityProtocolType);

                    Protocolo(vStrXmlRetorno);
                }
                else
                {
                    oInvocarObj.Invocar(wsProxy,
                                        oRecepcao,
                                        wsProxy.NomeMetodoWS[0],
                                        oCabecMsg,
                                        this,
                                        Propriedade.Extensao(Propriedade.TipoEnvio.EnvLot).EnvioXML,
                                        Propriedade.ExtRetorno.Rec,
                                        true,
                                        securityProtocolType);

                    Recibo(vStrXmlRetorno, emp);
                }

                if (dadosRec.cStat == "104") //Lote processado - Processo da NFe Síncrono - Wandrey 13/03/2014
                {
                    FinalizarNFeSincrono(vStrXmlRetorno, emp, oLer.oDadosNfe.chavenfe);

                    oGerarXML.XmlRetorno(Propriedade.Extensao(Propriedade.TipoEnvio.EnvLot).EnvioXML, Propriedade.Extensao(Propriedade.TipoEnvio.PedRec).RetornoXML, vStrXmlRetorno);
                }
                else if (dadosRec.cStat == "103") //Lote recebido com sucesso - Processo da NFe Assíncrono
                {
                    if (dadosRec.tMed > 0)
                    {
                        Thread.Sleep(dadosRec.tMed * 1000);
                    }

                    //Atualizar o número do recibo no XML de controle do fluxo de notas enviadas
                    oFluxoNfe.AtualizarTag(oLer.oDadosNfe.chavenfe, FluxoNfe.ElementoEditavel.tMed, dadosRec.tMed.ToString());
                    oFluxoNfe.AtualizarTagRec(idLote, dadosRec.nRec);

                    XmlDocument        xmlPedRec      = oGerarXML.XmlPedRecNFe(dadosRec.nRec, oLer.oDadosNfe.versao, oLer.oDadosNfe.mod, emp);
                    TaskNFeRetRecepcao nfeRetRecepcao = new TaskNFeRetRecepcao(xmlPedRec);
                    nfeRetRecepcao.chNFe = oLer.oDadosNfe.chavenfe;
                    nfeRetRecepcao.Execute();
                }
                else if (Convert.ToInt32(dadosRec.cStat) > 200 ||
                         Convert.ToInt32(dadosRec.cStat) == 108 || //Verifica se o servidor de processamento está paralisado momentaneamente. Wandrey 13/04/2012
                         Convert.ToInt32(dadosRec.cStat) == 109)   //Verifica se o servidor de processamento está paralisado sem previsão. Wandrey 13/04/2012
                {
                    if (Empresas.Configuracoes[emp].IndSinc && oLer.oDadosNfe.indSinc)
                    {
                        // OPS!!! Processo sincrono rejeição da SEFAZ, temos que gravar o XML para o ERP, pois no processo síncrono isso não pode ser feito dentro do método Invocar
                        oGerarXML.XmlRetorno(Propriedade.Extensao(Propriedade.TipoEnvio.EnvLot).EnvioXML, Propriedade.Extensao(Propriedade.TipoEnvio.PedRec).RetornoXML /*.ExtRetorno.ProRec_XML*/, vStrXmlRetorno);
                    }
                    //Se o status do retorno do lote for maior que 200 ou for igual a 108 ou 109,
                    //vamos ter que excluir a nota do fluxo, porque ela foi rejeitada pelo SEFAZ
                    //Primeiro vamos mover o xml da nota da pasta EmProcessamento para pasta de XML´s com erro e depois a tira do fluxo
                    //Wandrey 30/04/2009
                    oAux.MoveArqErro(Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + oFluxoNfe.LerTag(oLer.oDadosNfe.chavenfe, FluxoNfe.ElementoFixo.ArqNFe));
                    oFluxoNfe.ExcluirNfeFluxo(oLer.oDadosNfe.chavenfe);
                }

                //Deleta o arquivo de lote
                Functions.DeletarArquivo(NomeArquivoXML);
            }
            catch (ExceptionEnvioXML ex)
            {
                TrataException(emp, ex, oLer.oDadosNfe.chavenfe);
            }
            catch (ExceptionSemInternet ex)
            {
                TrataException(emp, ex, oLer.oDadosNfe.chavenfe);
            }
            catch (Exception ex)
            {
                TrataException(emp, ex, oLer.oDadosNfe.chavenfe);
            }
        }
Example #14
0
        public override void Execute()
        {
            int emp = Empresas.FindEmpresaByThread();

            try
            {
                dadosRec = new DadosRecClass();
                FluxoNfe fluxoNfe = new FluxoNfe();
                LerXML   lerXml   = new LerXML();

                //Ler o XML de Lote para pegar o número do lote que está sendo enviado
                lerXml.Cte(ConteudoXML);

                var idLote = lerXml.oDadosNfe.idLote;

                //Definir o objeto do WebService
                WebServiceProxy wsProxy = ConfiguracaoApp.DefinirWS(
                    Servico,
                    emp,
                    Convert.ToInt32(lerXml.oDadosNfe.cUF),
                    Convert.ToInt32(lerXml.oDadosNfe.tpAmb),
                    Convert.ToInt32(lerXml.oDadosNfe.tpEmis),
                    0);
                System.Net.SecurityProtocolType securityProtocolType = WebServiceProxy.DefinirProtocoloSeguranca(Convert.ToInt32(lerXml.oDadosNfe.cUF), Convert.ToInt32(lerXml.oDadosNfe.tpAmb), Convert.ToInt32(lerXml.oDadosNfe.tpEmis), Servico);

                //Criar objetos das classes dos serviços dos webservices do SEFAZ
                object oRecepcao = wsProxy.CriarObjeto(wsProxy.NomeClasseWS);
                var    oCabecMsg = wsProxy.CriarObjeto(NomeClasseCabecWS(Convert.ToInt32(lerXml.oDadosNfe.cUF), Servico));

                //Atribuir conteúdo para duas propriedades da classe nfeCabecMsg
                wsProxy.SetProp(oCabecMsg, TpcnResources.cUF.ToString(), lerXml.oDadosNfe.cUF);
                wsProxy.SetProp(oCabecMsg, TpcnResources.versaoDados.ToString(), lerXml.oDadosNfe.versao);

                //Criar objeto da classe de assinatura digita
                AssinaturaDigital oAD = new AssinaturaDigital();

                //Assinar o XML
                oAD.Assinar(ConteudoXML, emp, Convert.ToInt32(lerXml.oDadosNfe.cUF));

                //Mover o arquivo para a pasta em processamento
                Empresas.Configuracoes[emp].CriarSubPastaEnviado();
                string       arqEmProcessamento = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + Path.GetFileName(NomeArquivoXML);
                StreamWriter sw = File.CreateText(arqEmProcessamento);
                sw.Write(ConteudoXML.OuterXml);
                sw.Close();

                if (File.Exists(arqEmProcessamento))
                {
                    File.Delete(NomeArquivoXML);
                    NomeArquivoXML = arqEmProcessamento;
                }

                NumeroLote = oGerarXML.GerarLoteCTeOS(NomeArquivoXML);

                //Invocar o método que envia o XML para o SEFAZ
                oInvocarObj.Invocar(wsProxy,
                                    oRecepcao,
                                    wsProxy.NomeMetodoWS[0],
                                    oCabecMsg, this,
                                    Propriedade.Extensao(Propriedade.TipoEnvio.CTeOS).EnvioXML,
                                    Propriedade.Extensao(Propriedade.TipoEnvio.PedRec).RetornoXML,
                                    false,
                                    securityProtocolType);

                #region Parte que trata o retorno do lote, ou seja, o número do recibo

                LerRetorno(emp);

                //Gravar o XML retornado pelo WebService do SEFAZ na pasta de retorno para o ERP
                //Tem que ser feito neste ponto, pois somente aqui terminamos todo o processo
                oGerarXML.XmlRetorno(Propriedade.Extensao(Propriedade.TipoEnvio.CTeOS).EnvioXML,
                                     Propriedade.Extensao(Propriedade.TipoEnvio.PedRec).RetornoXML,
                                     vStrXmlRetorno,
                                     Empresas.Configuracoes[emp].PastaXmlRetorno,
                                     NumeroLote.ToString("000000000000000") + Propriedade.Extensao(Propriedade.TipoEnvio.CTeOS).EnvioXML);

                #endregion Parte que trata o retorno do lote, ou seja, o número do recibo
            }
            catch (ExceptionEnvioXML ex)
            {
                //Ocorreu algum erro no exato momento em que tentou enviar o XML para o SEFAZ, vou ter que tratar
                //para ver se o XML chegou lá ou não, se eu consegui pegar o número do recibo de volta ou não, etc.
                //E ver se vamos tirar o XML do Fluxo ou finalizar ele com a consulta situação da NFe
                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.Extensao(Propriedade.TipoEnvio.CTeOS).EnvioXML, Propriedade.ExtRetorno.ProRec_ERR, ex, NumeroLote.ToString("000000000000000") + Propriedade.Extensao(Propriedade.TipoEnvio.CTeOS).EnvioXML);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 16/03/2010
                }
            }
            catch (ExceptionSemInternet ex)
            {
                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.Extensao(Propriedade.TipoEnvio.CTeOS).EnvioXML, Propriedade.ExtRetorno.ProRec_ERR, ex, NumeroLote.ToString("000000000000000") + Propriedade.Extensao(Propriedade.TipoEnvio.CTeOS).EnvioXML);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 16/03/2010
                }
            }
            catch (Exception ex)
            {
                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.Extensao(Propriedade.TipoEnvio.CTeOS).EnvioXML, Propriedade.ExtRetorno.ProRec_ERR, ex, NumeroLote.ToString("000000000000000") + Propriedade.Extensao(Propriedade.TipoEnvio.CTeOS).EnvioXML);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 16/03/2010
                }
            }
        }
Example #15
0
        public override void Execute()
        {
            int emp = Empresas.FindEmpresaByThread();

            try
            {
                dadosRec = new DadosRecClass();
                FluxoNfe fluxoNfe = new FluxoNfe();
                LerXML lerXml = new LerXML();

                #region Parte que envia o lote
                //Ler o XML de Lote para pegar o número do lote que está sendo enviado
                lerXml.Cte(NomeArquivoXML);
                string idLote = lerXml.oDadosNfe.idLote;

                //Definir o objeto do WebService
                WebServiceProxy wsProxy = ConfiguracaoApp.DefinirWS(Servico, emp, Convert.ToInt32(lerXml.oDadosNfe.cUF), Convert.ToInt32(lerXml.oDadosNfe.tpAmb), Convert.ToInt32(lerXml.oDadosNfe.tpEmis));

                //Criar objetos das classes dos serviços dos webservices do SEFAZ
                object oRecepcao = wsProxy.CriarObjeto(wsProxy.NomeClasseWS);//(Servico, Convert.ToInt32(lerXml.oDadosNfe.cUF)));
                var oCabecMsg = wsProxy.CriarObjeto(NomeClasseCabecWS(Convert.ToInt32(lerXml.oDadosNfe.cUF), Servico));

                //Atribuir conteúdo para duas propriedades da classe nfeCabecMsg
                wsProxy.SetProp(oCabecMsg, NFe.Components.TpcnResources.cUF.ToString(), lerXml.oDadosNfe.cUF);
                wsProxy.SetProp(oCabecMsg, NFe.Components.TpcnResources.versaoDados.ToString(), NFe.ConvertTxt.versoes.VersaoXMLCTe);

                //
                //XML neste ponto a NFe já está assinada, pois foi assinada, validada e montado o lote para envio por outro serviço. 
                //Fica aqui somente este lembrete. Wandrey 16/03/2010
                //

                //Invocar o método que envia o XML para o SEFAZ
                oInvocarObj.Invocar(wsProxy,
                                    oRecepcao,
                                    wsProxy.NomeMetodoWS[0],//NomeMetodoWS(Servico, Convert.ToInt32(lerXml.oDadosNfe.cUF)), 
                                    oCabecMsg, this, "-env-lot", "-rec");
                #endregion

                #region Parte que trata o retorno do lote, ou seja, o número do recibo
                Recibo(vStrXmlRetorno);

                if (dadosRec.cStat == "103") //Lote recebido com sucesso
                {
                    //Atualizar o número do recibo no XML de controle do fluxo de notas enviadas
                    fluxoNfe.AtualizarTag(lerXml.oDadosNfe.chavenfe, FluxoNfe.ElementoEditavel.tMed, dadosRec.tMed.ToString());
                    fluxoNfe.AtualizarTagRec(idLote, dadosRec.nRec);
                }
                else if (Convert.ToInt32(dadosRec.cStat) > 200 ||
                         Convert.ToInt32(dadosRec.cStat) == 108 || //Verifica se o servidor de processamento está paralisado momentaneamente. Wandrey 13/04/2012
                         Convert.ToInt32(dadosRec.cStat) == 109) //Verifica se o servidor de processamento está paralisado sem previsão. Wandrey 13/04/2012              
                {
                    //Se o status do retorno do lote for maior que 200 ou for igual a 108 ou 109, 
                    //vamos ter que excluir a nota do fluxo, porque ela foi rejeitada pelo SEFAZ
                    //Primeiro vamos mover o xml da nota da pasta EmProcessamento para pasta de XML´s com erro e depois tira ela do fluxo
                    //Wandrey 30/04/2009
                    oAux.MoveArqErro(Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + fluxoNfe.LerTag(lerXml.oDadosNfe.chavenfe, FluxoNfe.ElementoFixo.ArqNFe));
                    fluxoNfe.ExcluirNfeFluxo(lerXml.oDadosNfe.chavenfe);
                }

                //Deleta o arquivo de lote
                Functions.DeletarArquivo(NomeArquivoXML);
                #endregion
            }
            catch (ExceptionEnvioXML ex)
            {
                //Ocorreu algum erro no exato momento em que tentou enviar o XML para o SEFAZ, vou ter que tratar
                //para ver se o XML chegou lá ou não, se eu consegui pegar o número do recibo de volta ou não, etc.
                //E ver se vamos tirar o XML do Fluxo ou finalizar ele com a consulta situação da NFe

                //TODO: V3.0 - Tratar o problema de não conseguir pegar o recibo exatamente neste ponto

                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.Rec_ERR, ex);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 16/03/2010
                }
            }
            catch (ExceptionSemInternet ex)
            {
                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.Rec_ERR, ex, false);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 16/03/2010
                }
            }
            catch (Exception ex)
            {
                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.Rec_ERR, ex);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 16/03/2010
                }
            }
        }
Example #16
0
        private const int _Minutos = 12;  //12 minutos para atender o consumo indevido da SEFAZ

        public void Analisar()
        {
            int emp = Empresas.FindEmpresaByThread();

            this.oAux = new Auxiliar();

            try
            {
                // le todos os arquivos que estão na pasta em processamento
                //                string[] files = Directory.GetFiles(Empresas.Configuracoes[emp].PastaEnviado + "\\" + PastaEnviados.EmProcessamento.ToString(),
                //                                                "*" + Propriedade.ExtEnvio.Nfe,
                //                                                SearchOption.TopDirectoryOnly);

                string[] files = Directory.GetFiles(Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString()).Where(w => w.EndsWith(Propriedade.ExtEnvio.Nfe, StringComparison.InvariantCultureIgnoreCase) ||
                                                                                                                                                         w.EndsWith(Propriedade.ExtEnvio.Cte, StringComparison.InvariantCultureIgnoreCase) ||
                                                                                                                                                         w.EndsWith(Propriedade.ExtEnvio.MDFe, StringComparison.InvariantCultureIgnoreCase)).ToArray <string>();

                // considera os arquivos em que a data do ultimo acesso é superior a 5 minutos
                DateTime UltimaData = DateTime.Now.AddMinutes(-_Minutos);

                foreach (string file in files)
                {
                    if (!Functions.FileInUse(file))
                    {
                        FileInfo fi = new FileInfo(file);

                        //usar a última data de acesso, e não a data de criação
                        if (fi.LastWriteTime <= UltimaData)
                        {
                            if (this.oLerXml == null)
                            {
                                this.oLerXml   = new LerXML();
                                this.oGerarXml = new GerarXML(emp);
                                this.fluxo     = new FluxoNfe(emp);
                            }

                            try
                            {
                                XmlDocument doc = new XmlDocument();
                                doc.Load(file);

                                TipoAplicativo tipoArquivo = TipoAplicativo.Nfe;
                                string         extNFe      = Propriedade.ExtEnvio.Nfe;
                                string         extProcNFe  = Propriedade.ExtRetorno.ProcNFe;
                                string         arquivoSit  = string.Empty;
                                string         chNFe       = string.Empty;

                                switch (doc.DocumentElement.Name)
                                {
                                case "MDFe":
                                    tipoArquivo = TipoAplicativo.MDFe;
                                    extNFe      = Propriedade.ExtEnvio.MDFe;
                                    extProcNFe  = Propriedade.ExtRetorno.ProcMDFe;

                                    oLerXml.Mdfe(file);
                                    arquivoSit = oLerXml.oDadosNfe.chavenfe.Substring(4);
                                    chNFe      = oLerXml.oDadosNfe.chavenfe.Substring(4);
                                    break;

                                case "NFe":
                                    tipoArquivo = TipoAplicativo.Nfe;
                                    extNFe      = Propriedade.ExtEnvio.Nfe;
                                    extProcNFe  = Propriedade.ExtRetorno.ProcNFe;

                                    oLerXml.Nfe(file);
                                    arquivoSit = oLerXml.oDadosNfe.chavenfe.Substring(3);
                                    chNFe      = oLerXml.oDadosNfe.chavenfe.Substring(3);
                                    break;

                                case "CTe":
                                    tipoArquivo = TipoAplicativo.Cte;
                                    extNFe      = Propriedade.ExtEnvio.Cte;
                                    extProcNFe  = Propriedade.ExtRetorno.ProcCTe;

                                    oLerXml.Cte(file);
                                    arquivoSit = oLerXml.oDadosNfe.chavenfe.Substring(3);
                                    chNFe      = oLerXml.oDadosNfe.chavenfe.Substring(3);
                                    break;
                                }

                                //Ler a NFe

                                //Verificar se o -nfe.xml existe na pasta de autorizados
                                bool NFeJaNaAutorizada = oAux.EstaAutorizada(file, oLerXml.oDadosNfe.dEmi, extNFe, extNFe);

                                //Verificar se o -procNfe.xml existe na past de autorizados
                                bool procNFeJaNaAutorizada = oAux.EstaAutorizada(file, oLerXml.oDadosNfe.dEmi, extNFe, extProcNFe);

                                //Se um dos XML´s não estiver na pasta de autorizadas ele força finalizar o processo da NFe.
                                if (!NFeJaNaAutorizada || !procNFeJaNaAutorizada)
                                {
                                    //Verificar se a NFe está no fluxo, se não estiver vamos incluir ela para que funcione
                                    //a rotina de gerar o -procNFe.xml corretamente. Wandrey 21/10/2009
                                    if (!fluxo.NfeExiste(oLerXml.oDadosNfe.chavenfe))
                                    {
                                        fluxo.InserirNfeFluxo(oLerXml.oDadosNfe.chavenfe, oLerXml.oDadosNfe.mod, file);
                                    }

                                    //gera um -ped-sit.xml mesmo sendo autorizada ou denegada, pois assim sendo, o ERP precisaria dele
                                    oGerarXml.Consulta(tipoArquivo, arquivoSit + Propriedade.ExtEnvio.PedSit_XML,
                                                       Convert.ToInt32(oLerXml.oDadosNfe.tpAmb),
                                                       Convert.ToInt32(oLerXml.oDadosNfe.tpEmis),
                                                       chNFe,
                                                       oLerXml.oDadosNfe.versao);
                                }
                                else
                                {
                                    //Move o XML da pasta em processamento para a pasta de XML´s com erro (-nfe.xml)
                                    oAux.MoveArqErro(file);

                                    //Move o XML da pasta em processamento para a pasta de XML´s com erro (-procNFe.xml)
                                    oAux.MoveArqErro(Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + Functions.ExtrairNomeArq(file, extNFe) + extProcNFe);

                                    //Tirar a nota fiscal do fluxo
                                    fluxo.ExcluirNfeFluxo(oLerXml.oDadosNfe.chavenfe);
                                }
                            }
                            catch (Exception ex)
                            {
                                try
                                {
                                    // grava o arquivo com extensao .ERR
                                    oAux.GravarArqErroERP(Path.GetFileNameWithoutExtension(file) + ".err", ex.Message);
                                }
                                catch
                                {
                                    //Se deu erro na hora de gravar o erro para o ERP, infelizmente não posso fazer mais nada. Wandrey 28/04/2011
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                try
                {
                    // grava o arquivo generico
                    oAux.GravarArqErroERP(string.Format(Propriedade.NomeArqERRUniNFe, DateTime.Now.ToString("yyyyMMddTHHmmss")), ex.Message);
                }
                catch
                {
                    //Se deu erro na hora de gravar o erro para o ERP, infelizmente não posso fazer mais nada. Wandrey 28/04/2011
                }
            }
            finally
            {
                Thread.CurrentThread.Abort();
            }
        }
Example #17
0
        private void LerRetorno(int emp)
        {
            /*
             * vStrXmlRetorno = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
             *  "<retCTeOS versao=\"3.00\" xmlns=\"http://www.portalfiscal.inf.br/cte\"><tpAmb>2</tpAmb><cUF>35</cUF><verAplic>SP-CTe-23-06-2017</verAplic><cStat>100</cStat><xMotivo>Autorizado o uso do CT-e</xMotivo><protCTe versao=\"3.00\"><infProt><tpAmb>2</tpAmb><verAplic>SP-CTe-23-06-2017</verAplic><chCTe>35170746014122000138670000000000061860795141</chCTe><dhRecbto>2017-07-21T09:52:19-03:00</dhRecbto><nProt>135170008578938</nProt><digVal>iYpkun2Ovm+sp+eMkzDtX6gtkzI=</digVal><cStat>100</cStat><xMotivo>Autorizado o uso do CT-e</xMotivo></infProt></protCTe></retCTeOS>";
             */

            /*
             * vStrXmlRetorno = "<retCTeOS versao=\"3.00\" xmlns=\"http://www.portalfiscal.inf.br/cte\"><tpAmb>2</tpAmb><cUF>35</cUF><verAplic>SP-CTe-23-06-2017</verAplic><cStat>100</cStat><xMotivo>Autorizado o uso do CT-e</xMotivo><protCTe versao=\"3.00\"><infProt><tpAmb>2</tpAmb><verAplic>SP-CTe-23-06-2017</verAplic><chCTe>35170746014122000138670000000000261309301440</chCTe><dhRecbto>2017-07-26T11:47:48-03:00</dhRecbto><nProt>135170008595733</nProt><digVal>XTkEEwjNnoYasDYz/VJ7HuZVUEo=</digVal><cStat>100</cStat><xMotivo>Autorizado o uso do CT-e</xMotivo></infProt></protCTe></retCTeOS>";
             */

            var oLerXml = new LerXML();

            var doc = new XmlDocument();

            doc.Load(Functions.StringXmlToStreamUTF8(vStrXmlRetorno));

            var retConsReciNFeList = doc.GetElementsByTagName("retCTeOS");

            foreach (XmlNode retConsReciNFeNode in retConsReciNFeList)
            {
                var retConsReciNFeElemento = (XmlElement)retConsReciNFeNode;

                //Pegar o número do recibo do lote enviado
                var nRec = string.Empty;
                if (retConsReciNFeElemento.GetElementsByTagName(TpcnResources.nRec.ToString())[0] != null)
                {
                    nRec = retConsReciNFeElemento.GetElementsByTagName(TpcnResources.nRec.ToString())[0].InnerText;
                }

                //Pegar o status de retorno do lote enviado
                var cStatLote = string.Empty;
                if (retConsReciNFeElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null)
                {
                    cStatLote = retConsReciNFeElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0].InnerText;
                }

                switch (cStatLote)
                {
                    #region Rejeições do XML de consulta do recibo (Não é o lote que foi rejeitado e sim o XML de consulta do recibo)

                case "280":     //A-Certificado transmissor inválido
                case "281":     //A-Validade do certificado
                case "283":     //A-Verifica a cadeia de Certificação
                case "286":     //A-LCR do certificado de Transmissor
                case "284":     //A-Certificado do Transmissor revogado
                case "285":     //A-Certificado Raiz difere da "IPC-Brasil"
                case "282":     //A-Falta a extensão de CNPJ no Certificado
                case "214":     //B-Tamanho do XML de dados superior a 500 Kbytes
                case "243":     //B-XML de dados mal formatado
                case "108":     //B-Verifica se o Serviço está paralisado momentaneamente
                case "109":     //B-Verifica se o serviço está paralisado sem previsão
                case "242":     //C-Elemento nfeCabecMsg inexistente no SOAP Header
                case "409":     //C-Campo cUF inexistente no elemento nfeCabecMsg do SOAP Header
                case "410":     //C-Campo versaoDados inexistente no elemento nfeCabecMsg do SOAP
                case "411":     //C-Campo versaoDados inexistente no elemento nfeCabecMsg do SOAP
                case "238":     //C-Versão dos Dados informada é superior à versão vigente
                case "239":     //C-Versão dos Dados não suportada
                case "215":     //D-Verifica schema XML da área de dados
                case "404":     //D-Verifica o uso de prefixo no namespace
                case "402":     //D-XML utiliza codificação diferente de UTF-8
                case "252":     //E-Tipo do ambiente da NF-e difere do ambiente do web service
                case "226":     //E-UF da Chave de Acesso difere da UF do Web Service
                case "236":     //E-Valida DV da Chave de Acesso
                case "217":     //E-Acesso BD CTE
                case "216":     //E-Verificar se campo "Codigo Numerico"
                    break;

                    #endregion Rejeições do XML de consulta do recibo (Não é o lote que foi rejeitado e sim o XML de consulta do recibo)

                    #region Lote ainda está sendo processado

                case "105":     //E-Verifica se o lote não está na fila de resposta, mas está na fila de entrada (Lote em processamento)
                    //Ok vou aguardar o ERP gerar uma nova consulta para encerrar o fluxo da nota
                    break;

                    #endregion Lote ainda está sendo processado

                    #region Lote foi processado, agora tenho que tratar as notas fiscais dele

                case "104":     //Lote processado
                case "100":     //Processo sincrono já retorna como 100
                    var protNFeList = retConsReciNFeElemento.GetElementsByTagName("protCTe");

                    foreach (XmlNode protNFeNode in protNFeList)
                    {
                        var protNFeElemento = (XmlElement)protNFeNode;

                        var strProtNfe = protNFeElemento.OuterXml;

                        var infProtList = protNFeElemento.GetElementsByTagName("infProt");

                        foreach (XmlNode infProtNode in infProtList)
                        {
                            var infProtElemento = (XmlElement)infProtNode;

                            var strStat = string.Empty;

                            if (infProtElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null)
                            {
                                strStat = infProtElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0].InnerText;
                            }

                            //Definir o nome do arquivo da NFe e seu caminho
                            var strArquivoNFe = NomeArquivoXML;

                            switch (strStat)
                            {
                            case "100":         //NFe Autorizada
                                if (File.Exists(strArquivoNFe))
                                {
                                    //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s autorizados
                                    XmlDocument conteudoXMLCTe = new XmlDocument();
                                    conteudoXMLCTe.Load(strArquivoNFe);
                                    oLerXml.Cte(conteudoXMLCTe);

                                    //Juntar o protocolo com a NFE já copiando para a pasta em processamento
                                    var strArquivoNFeProc = oGerarXML.XmlDistCTeOS(strArquivoNFe, strProtNfe, oLerXml.oDadosNfe.versao);

                                    //Mover a cteProc da pasta de CTe em processamento para a NFe Autorizada
                                    //Para envitar falhar, tenho que mover primeiro o XML de distribuição (-procCTe.xml) para
                                    //depois mover o da nfe (-cte.xml), pois se ocorrer algum erro, tenho como reconstruir o senário,
                                    //assim sendo não inverta as posições. Wandrey 08/10/2009
                                    TFunctions.MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);

                                    //Mover a CTe da pasta de CTe em processamento para CTe Autorizada
                                    //Para envitar falhar, tenho que mover primeiro o XML de distribuição (-procCTe.xml) para
                                    //depois mover o da nfe (-cte.xml), pois se ocorrer algum erro, tenho como reconstruir o cenário.
                                    //assim sendo não inverta as posições. Wandrey 08/10/2009
                                    TFunctions.MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);

                                    //Disparar a geração/impressao do UniDanfe. 03/02/2010 - Wandrey
                                    try
                                    {
                                        var strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                             PastaEnviados.Autorizados.ToString() + "\\" +
                                                             Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) +
                                                             Path.GetFileName(strArquivoNFeProc);

                                        TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]);
                                    }
                                    catch (Exception ex)
                                    {
                                        Auxiliar.WriteLog("TaskCTeRetRecepcao: " + ex.Message, false);
                                    }
                                }
                                break;

                            case "301":         //NFe Denegada - Irregularidade fiscal do emitente
                                if (File.Exists(strArquivoNFe))
                                {
                                    //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s Denegados
                                    XmlDocument conteudoXMLCTe = new XmlDocument();
                                    conteudoXMLCTe.Load(strArquivoNFe);
                                    oLerXml.Cte(conteudoXMLCTe);

                                    //Mover a NFE da pasta de NFE em processamento para NFe Denegadas
                                    TFunctions.MoverArquivo(strArquivoNFe, PastaEnviados.Denegados, oLerXml.oDadosNfe.dEmi);
                                    ///
                                    /// existe DACTE de CTe denegado???
                                    ///
                                    try
                                    {
                                        var strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                             PastaEnviados.Denegados.ToString() + "\\" +
                                                             Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) +
                                                             Functions.ExtrairNomeArq(strArquivoNFe, Propriedade.Extensao(Propriedade.TipoEnvio.CTe).EnvioXML) + Propriedade.ExtRetorno.Den;

                                        TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]);
                                    }
                                    catch (Exception ex)
                                    {
                                        Auxiliar.WriteLog("TaskCTeRecepcaoOS: " + ex.Message, false);
                                    }
                                }
                                break;

                            case "302":         //NFe Denegada - Irregularidade fiscal do remetente
                                goto case "301";

                            case "303":         //NFe Denegada - Irregularidade fiscal do destinatário
                                goto case "301";

                            case "304":         //NFe Denegada - Irregularidade fiscal do expedidor
                                goto case "301";

                            case "305":         //NFe Denegada - Irregularidade fiscal do recebedor
                                goto case "301";

                            case "306":         //NFe Denegada - Irregularidade fiscal do tomador
                                goto case "301";

                            case "110":         //NFe Denegada - Não sei quando ocorre este, mas descobrir ele no manual então estou incluindo. Wandrey 20/10/2009
                                goto case "301";

                            default:         //NFe foi rejeitada
                                //Mover o XML da NFE a pasta de XML´s com erro
                                oAux.MoveArqErro(strArquivoNFe);
                                break;
                            }

                            break;
                        }
                    }
                    break;

                    #endregion Lote foi processado, agora tenho que tratar as notas fiscais dele

                    #region Qualquer outro tipo de status que não for os acima relacionados, vai tirar a nota fiscal do fluxo.

                default:
                    //Qualquer outro tipo de rejeião vou tirar todas as notas do lote do fluxo, pois se o lote foi rejeitado, todas as notas fiscais também foram
                    //De acordo com o manual de integração se o status do lote não for 104, tudo foi rejeitado. Wandrey 20/07/2010
                    TFunctions.MoveArqErro(NomeArquivoXML);
                    break;

                    #endregion Qualquer outro tipo de status que não for os acima relacionados, vai tirar a nota fiscal do fluxo.
                }
            }
        }
        /// <summary>
        /// Ler o retorno da consulta situação da nota fiscal e de acordo com o status ele trata as notas enviadas se ainda não foram tratadas
        /// </summary>
        /// <param name="ChaveNFe">Chave da NFe que está sendo consultada</param>
        /// <remarks>
        /// Autor: Wandrey Mundin Ferreira
        /// Data: 16/06/2010
        /// </remarks>
        private void LerRetornoSitMDFe(string ChaveNFe)
        {
            int emp = Empresas.FindEmpresaByThread();

            oGerarXML.XmlDistEventoMDFe(emp, this.vStrXmlRetorno);

            ///
            /// CNPJ da chave não é de uma empresa Uninfe
            ///
            if (ChaveNFe.Substring(6, 14) != Empresas.Configuracoes[emp].CNPJ ||
                ChaveNFe.Substring(0, 2) != Empresas.Configuracoes[emp].UnidadeFederativaCodigo.ToString())
            {
                return;
            }

            LerXML       oLerXml = new LerXML();
            MemoryStream msXml   = Functions.StringXmlToStreamUTF8(this.vStrXmlRetorno);

            FluxoNfe oFluxoNfe = new FluxoNfe();

            XmlDocument doc = new XmlDocument();

            doc.Load(msXml);

            XmlNodeList retConsSitList = doc.GetElementsByTagName("retConsSitMDFe");

            foreach (XmlNode retConsSitNode in retConsSitList)
            {
                XmlElement retConsSitElemento = (XmlElement)retConsSitNode;

                //Definir a chave da NFe a ser pesquisada
                string strChaveNFe = "MDFe" + ChaveNFe;

                //Definir o nome do arquivo da NFe e seu caminho
                string strNomeArqNfe = oFluxoNfe.LerTag(strChaveNFe, FluxoNfe.ElementoFixo.ArqNFe);

                if (string.IsNullOrEmpty(strNomeArqNfe))
                {
                    if (string.IsNullOrEmpty(strChaveNFe))
                    {
                        throw new Exception("LerRetornoSitMDFe(): Não pode obter o nome do arquivo");
                    }

                    strNomeArqNfe = strChaveNFe.Substring(4) + Propriedade.ExtEnvio.MDFe;
                }

                string strArquivoNFe = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + strNomeArqNfe;

                //Pegar o status de retorno da NFe que está sendo consultada a situação
                var cStatCons = string.Empty;
                if (retConsSitElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null)
                {
                    cStatCons = retConsSitElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0].InnerText;
                }

                switch (cStatCons)
                {
                    #region Rejeições do XML de consulta da situação da NFe (Não é a nfe que foi rejeitada e sim o XML de consulta da situação da nfe)

                    #region Validação do Certificado de Transmissão
                case "280":
                case "281":
                case "283":
                case "286":
                case "284":
                case "285":
                case "282":
                    #endregion

                    #region Validação Inicial da Mensagem no WebService
                case "214":
                case "243":
                case "108":
                case "109":
                    #endregion

                    #region Validação das informações de controle da chamada ao WebService
                case "242":
                case "409":
                case "410":
                case "411":
                case "238":
                case "239":
                    #endregion

                    #region Validação da forma da área de dados
                case "215":
                case "598":
                case "599":
                case "404":
                case "402":
                    #endregion

                    #region Validação das regras de negócios da consulta a NF-e
                case "252":
                case "226":
                case "494":
                case "227":
                case "253":
                    break;
                    #endregion

                    #region Nota fiscal rejeitada
                case "217":     //J-NFe não existe na base de dados do SEFAZ
                    goto case "TirarFluxo";
                    #endregion

                    #endregion

                    #region Nota fiscal autorizada
                case "100":     //Autorizado o uso da NFe
                    XmlNodeList infConsSitList = retConsSitElemento.GetElementsByTagName("infProt");
                    if (infConsSitList != null)
                    {
                        foreach (XmlNode infConsSitNode in infConsSitList)
                        {
                            XmlElement infConsSitElemento = (XmlElement)infConsSitNode;

                            //Pegar o Status do Retorno da consulta situação
                            string strStat = Functions.LerTag(infConsSitElemento, NFe.Components.TpcnResources.cStat.ToString()).Replace(";", "");

                            switch (strStat)
                            {
                            case "100":
                                var strProtNfe = retConsSitElemento.GetElementsByTagName("protMDFe")[0].OuterXml;

                                //Definir o nome do arquivo -procNfe.xml
                                string strArquivoNFeProc = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                           PastaEnviados.EmProcessamento.ToString() + "\\" +
                                                           Functions.ExtrairNomeArq(strArquivoNFe, Propriedade.ExtEnvio.MDFe) + Propriedade.ExtRetorno.ProcMDFe;

                                //Se existir o strArquivoNfe, tem como eu fazer alguma coisa, se ele não existir
                                //Não tenho como fazer mais nada. Wandrey 08/10/2009
                                if (File.Exists(strArquivoNFe))
                                {
                                    //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s autorizados
                                    oLerXml.Mdfe(strArquivoNFe);

                                    //Verificar se a -nfe.xml existe na pasta de autorizados
                                    bool NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.MDFe, Propriedade.ExtEnvio.MDFe);

                                    //Verificar se o -procNfe.xml existe na past de autorizados
                                    bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.MDFe, Propriedade.ExtRetorno.ProcMDFe);

                                    //Se o XML de distribuição não estiver na pasta de autorizados
                                    if (!procNFeJaNaAutorizada)
                                    {
                                        if (!File.Exists(strArquivoNFeProc))
                                        {
                                            oGerarXML.XmlDistMDFe(strArquivoNFe, strProtNfe, Propriedade.ExtRetorno.ProcMDFe);
                                        }
                                    }

                                    //Se o XML de distribuição não estiver ainda na pasta de autorizados
                                    if (!(procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.MDFe, Propriedade.ExtRetorno.ProcMDFe)))
                                    {
                                        //Move a nfeProc da pasta de NFE em processamento para a NFe Autorizada
                                        TFunctions.MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);

                                        //Atualizar a situação para que eu só mova o arquivo com final -NFe.xml para a pasta autorizado se
                                        //a procnfe já estiver lá, ou vai ficar na pasta emProcessamento para tentar gerar novamente.
                                        //Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012
                                        procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.MDFe, Propriedade.ExtRetorno.ProcMDFe);
                                    }

                                    //Se a NFe não existir ainda na pasta de autorizados
                                    if (!(NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.MDFe, Propriedade.ExtEnvio.MDFe)))
                                    {
                                        //1-Mover a NFE da pasta de NFE em processamento para NFe Autorizada
                                        //2-Só vou mover o -nfe.xml para a pasta autorizados se já existir a -procnfe.xml, caso contrário vou manter na pasta EmProcessamento
                                        //  para tentar gerar novamente o -procnfe.xml
                                        //  Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012
                                        if (procNFeJaNaAutorizada)
                                        {
                                            TFunctions.MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);
                                        }
                                    }
                                    else
                                    {
                                        //1-Se já estiver na pasta de autorizados, vou somente mover ela da pasta de XML´s em processamento
                                        //2-Só vou mover o -nfe.xml da pasta EmProcessamento se também existir a -procnfe.xml na pasta autorizados, caso contrário vou manter na pasta EmProcessamento
                                        //  para tentar gerar novamente o -procnfe.xml
                                        //  Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012
                                        if (procNFeJaNaAutorizada)
                                        {
                                            oAux.MoveArqErro(strArquivoNFe);
                                        }
                                        //oAux.DeletarArquivo(strArquivoNFe);
                                    }

                                    //Disparar a geração/impressão do UniDanfe. 03/02/2010 - Wandrey
                                    if (procNFeJaNaAutorizada)
                                    {
                                        string strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                                PastaEnviados.Autorizados.ToString() + "\\" +
                                                                Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) +
                                                                Functions.ExtrairNomeArq(strArquivoNFe, Propriedade.ExtEnvio.MDFe) + Propriedade.ExtRetorno.ProcMDFe;
                                        try
                                        {
                                            TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]);
                                        }
                                        catch (Exception ex)
                                        {
                                            Auxiliar.WriteLog("TaskMDFeConsultaSituacao: " + ex.Message, false);
                                        }
                                    }
                                }

                                if (File.Exists(strArquivoNFeProc))
                                {
                                    //Se já estiver na pasta de autorizados, vou somente excluir ela da pasta de XML´s em processamento
                                    Functions.DeletarArquivo(strArquivoNFeProc);
                                }

                                break;

                            default:
                                //Mover o XML da NFE a pasta de XML´s com erro
                                oAux.MoveArqErro(strArquivoNFe);
                                break;
                            }

                            //Deletar a NFE do arquivo de controle de fluxo
                            oFluxoNfe.ExcluirNfeFluxo(strChaveNFe);
                        }
                    }
                    break;
                    #endregion

                    #region Nota fiscal cancelada
                case "101":     //Cancelamento Homologado ou Nfe Cancelada
                    goto case "100";
                    #endregion

                    #region Conteúdo para retirar a nota fiscal do fluxo
                case "TirarFluxo":
                    //Mover o XML da NFE a pasta de XML´s com erro
                    oAux.MoveArqErro(strArquivoNFe);

                    //Deletar a NFE do arquivo de controle de fluxo
                    oFluxoNfe.ExcluirNfeFluxo(strChaveNFe);
                    break;
                    #endregion

                default:
                    break;
                }
            }
        }
Example #19
0
        private void ProcessaNotaDenegada(int emp, LerXML oLerXml, string strArquivoNFe, XmlElement infConsSitElemento)
        {
            string strProtNfe;

            if (File.Exists(strArquivoNFe))
            {
                oLerXml.Nfe(strArquivoNFe);

                string nomePastaEnviado = Empresa.Configuracoes[emp].PastaEnviado + "\\" +
                                            PastaEnviados.Denegados.ToString() + "\\" +
                                            Empresa.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi);
                string dArquivo = Path.Combine(nomePastaEnviado, Path.GetFileName(strArquivoNFe).Replace(Propriedade.ExtEnvio.Nfe, "-den.xml"));

                //danasa 11-4-2012
                bool addNFeDen = true;
                if (File.Exists(dArquivo))
                {
                    // verifica se a NFe já tem protocolo gravado
                    // só para atualizar notas denegadas que ainda não tem o protocolo atualizado 
                    // e que já estao na pasta de notas denegadas.
                    // Para futuras notas denegadas esta propriedade sempre será false
                    if (File.ReadAllText(dArquivo).IndexOf("<protNFe>") > 0)
                        addNFeDen = false;
                }
                if (addNFeDen)
                {
                    ///
                    /// monta o XML de denegacao
                    strProtNfe = this.GeraStrProtNFe(infConsSitElemento);
                    ///
                    /// gera o arquivo de denegacao na pasta EmProcessamento
                    string strNomeArqDenegadaNFe = oGerarXML.XmlDistNFe(strArquivoNFe, strProtNfe, "-den.xml");
                    ///
                    /// exclui o XML denegado, se existir
                    //string destinoArquivo = Path.Combine(nomePastaEnviado, Path.GetFileName(strNomeArqDenegadaNFe));
                    Functions.DeletarArquivo(dArquivo);
                    ///
                    /// Move a NFE-denegada da pasta em processamento para NFe Denegadas
                    MoverArquivo(strNomeArqDenegadaNFe, PastaEnviados.Denegados, oLerXml.oDadosNfe.dEmi);
                    ///
                    /// verifica se o arquivo da NFe já existe na pasta denegadas
                    dArquivo = Path.Combine(nomePastaEnviado, Path.GetFileName(strArquivoNFe));
                    if (!File.Exists(dArquivo))
                    {
                        if (Empresa.Configuracoes[emp].PastaBackup.Trim() != "")
                        {
                            //Criar Pasta do Mês para gravar arquivos enviados
                            string nomePastaBackup = Empresa.Configuracoes[emp].PastaBackup + "\\" +
                                                        PastaEnviados.Denegados + "\\" +
                                                        Empresa.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi);
                            if (!Directory.Exists(nomePastaBackup))
                                System.IO.Directory.CreateDirectory(nomePastaBackup);

                            //Se conseguiu criar a pasta ele move o arquivo, caso contrário
                            if (Directory.Exists(nomePastaBackup))
                            {
                                //Mover o arquivo da nota fiscal para a pasta de backup
                                string destinoBackup = Path.Combine(nomePastaBackup, Path.GetFileName(strArquivoNFe));
                                Functions.DeletarArquivo(destinoBackup);
                                File.Copy(strArquivoNFe, destinoBackup);
                            }
                            else
                            {
                                //throw new Exception("Pasta de backup informada nas configurações não existe. (Pasta: " + nomePastaBackup + ")");
                            }
                        }
                        ///
                        /// move o arquivo NFe para a pasta Denegada
                        File.Move(strArquivoNFe, dArquivo);
                    }
                }
                //Move a NFE da pasta de NFE em processamento para NFe Denegadas
                //if (!oAux.EstaDenegada(strArquivoNFe, oLerXml.oDadosNfe.dEmi))
                //{
                //    oAux.MoverArquivo(strArquivoNFe, PastaEnviados.Denegados, oLerXml.oDadosNfe.dEmi);
                //}
            }
            //return strProtNfe;
        }
Example #20
0
        public override void Execute()
        {
            int emp = Empresas.FindEmpresaByThread();

            try
            {
                dadosRec = new DadosRecClass();
                FluxoNfe oFluxoNfe = new FluxoNfe();
                LerXML oLer = new LerXML();

                //Ler o XML de Lote para pegar o número do lote que está sendo enviado
                oLer.Nfe(NomeArquivoXML);

                if (oLer.oDadosNfe.versao != "2.00")
                {
                    Servico = Servicos.NFeEnviarLote2;
                }

                var idLote = oLer.oDadosNfe.idLote;

                //Definir o objeto do WebService
                WebServiceProxy wsProxy = ConfiguracaoApp.DefinirWS(Servico, emp,
                    Convert.ToInt32(oLer.oDadosNfe.cUF),
                    Convert.ToInt32(oLer.oDadosNfe.tpAmb),
                    Convert.ToInt32(oLer.oDadosNfe.tpEmis),
                    oLer.oDadosNfe.versao,
                    oLer.oDadosNfe.mod);

                if (Empresas.Configuracoes[emp].CompactarNfe && oLer.oDadosNfe.versao != "2.00" && wsProxy.NomeMetodoWS.Length == 2)
                    Servico = Servicos.NFeEnviarLoteZip2;

                //Criar objetos das classes dos serviços dos webservices do SEFAZ
                object oRecepcao = wsProxy.CriarObjeto(wsProxy.NomeClasseWS);
                var oCabecMsg = wsProxy.CriarObjeto(NomeClasseCabecWS(Convert.ToInt32(oLer.oDadosNfe.cUF), Servico));

                //Atribuir conteúdo para duas propriedades da classe nfeCabecMsg
                wsProxy.SetProp(oCabecMsg, NFe.Components.TpcnResources.cUF.ToString(), oLer.oDadosNfe.cUF);
                wsProxy.SetProp(oCabecMsg, NFe.Components.TpcnResources.versaoDados.ToString(), oLer.oDadosNfe.versao);

                //XML neste ponto a NFe já está assinada, pois foi assinada, validada e montado o lote para envio por outro serviço. 
                //Fica aqui somente este lembrete. Wandrey 16/03/2010


                // Envio de NFe Compactada - Renan 29/04/2014
                if (Servico == Servicos.NFeEnviarLoteZip2)
                {
                    FileInfo dadosArquivo = new FileInfo(NomeArquivoXML);
                    TFunctions.CompressXML(dadosArquivo);
                }

                string nOperacao = wsProxy.NomeMetodoWS[(Servico == Servicos.NFeEnviarLoteZip2) ? 1 : 0];

                //Invocar o método que envia o XML para o SEFAZ
                if (Empresas.Configuracoes[emp].IndSinc && oLer.oDadosNfe.versao != "2.00")
                {
                    //Não posso gerar o arquivo na pasta de retorno através do método Invocar, por isso não estou colocando os dois ultimos parâmetros com a definição dos prefixos dos arquivos. O arquivo de retorno no processo síncrono deve acontecer somente depois de finalizado o processo da nota, ou gera problemas. Wandrey 11/06/2015
                    oInvocarObj.Invocar(wsProxy,
                                        oRecepcao,
                                        nOperacao,
                                        oCabecMsg,
                                        this); 

                    Protocolo(vStrXmlRetorno);
                }
                else
                {
                    oInvocarObj.Invocar(wsProxy, 
                                        oRecepcao, 
                                        nOperacao,
                                        oCabecMsg, 
                                        this, 
                                        "-env-lot", 
                                        "-rec");

                    Recibo(vStrXmlRetorno);
                }

                if (dadosRec.cStat == "104") //Lote processado - Processo da NFe Síncrono - Wandrey 13/03/2014
                {
                    FinalizarNFeSincrono(vStrXmlRetorno, emp);

                    oGerarXML.XmlRetorno(Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.ProRec_XML, vStrXmlRetorno);
                }
                else if (dadosRec.cStat == "103") //Lote recebido com sucesso - Processo da NFe Assíncrono
                {
                    //Atualizar o número do recibo no XML de controle do fluxo de notas enviadas
                    oFluxoNfe.AtualizarTag(oLer.oDadosNfe.chavenfe, FluxoNfe.ElementoEditavel.tMed, dadosRec.tMed.ToString());
                    oFluxoNfe.AtualizarTagRec(idLote, dadosRec.nRec);
                }
                else if (Convert.ToInt32(dadosRec.cStat) > 200 ||
                         Convert.ToInt32(dadosRec.cStat) == 108 || //Verifica se o servidor de processamento está paralisado momentaneamente. Wandrey 13/04/2012
                         Convert.ToInt32(dadosRec.cStat) == 109) //Verifica se o servidor de processamento está paralisado sem previsão. Wandrey 13/04/2012              
                {
                    if (Empresas.Configuracoes[emp].IndSinc && oLer.oDadosNfe.versao != "2.00")
                    {
                        // OPS!!! Processo sincrono rejeição da SEFAZ, temos que gravar o XML para o ERP, pois no processo síncrono isso não pode ser feito dentro do método Invocar
                        oGerarXML.XmlRetorno(Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.ProRec_XML, vStrXmlRetorno);
                    }
                    //Se o status do retorno do lote for maior que 200 ou for igual a 108 ou 109, 
                    //vamos ter que excluir a nota do fluxo, porque ela foi rejeitada pelo SEFAZ
                    //Primeiro vamos mover o xml da nota da pasta EmProcessamento para pasta de XML´s com erro e depois a tira do fluxo
                    //Wandrey 30/04/2009
                    oAux.MoveArqErro(Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + oFluxoNfe.LerTag(oLer.oDadosNfe.chavenfe, FluxoNfe.ElementoFixo.ArqNFe));
                    oFluxoNfe.ExcluirNfeFluxo(oLer.oDadosNfe.chavenfe);
                }

                //Deleta o arquivo de lote
                Functions.DeletarArquivo(NomeArquivoXML);

                // Envio de NFe Compactada - Renan 29/04/2014
                if (Servico == Servicos.NFeEnviarLoteZip2)
                    Functions.DeletarArquivo(NomeArquivoXML + ".gz");
            }
            catch (ExceptionEnvioXML ex)
            {
                //Ocorreu algum erro no exato momento em que tentou enviar o XML para o SEFAZ, vou ter que tratar
                //para ver se o XML chegou lá ou não, se eu consegui pegar o número do recibo de volta ou não, etc.
                //E ver se vamos tirar o XML do Fluxo ou finalizar ele com a consulta situação da NFe

                //TODO: V3.0 - Tratar o problema de não conseguir pegar o recibo exatamente neste ponto

                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.Rec_ERR, ex);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 16/03/2010
                }
            }
            catch (ExceptionSemInternet ex)
            {
                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.Rec_ERR, ex, false);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 16/03/2010
                }
            }
            catch (Exception ex)
            {
                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.ExtEnvio.EnvLot, Propriedade.ExtRetorno.Rec_ERR, ex);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 16/03/2010
                }
            }
        }
Example #21
0
        /// <summary>
        /// Envia o XML de consulta da situação da nota fiscal
        /// </summary>
        /// <remarks>
        /// Atualiza a propriedade this.vNfeRetorno da classe com o conteúdo
        /// XML com o retorno que foi dado do serviço do WebService.
        /// No caso da Consulta se tudo estiver correto retorna um XML
        /// com a situação da nota fiscal (Se autorizada ou não).
        /// Se der algum erro ele grava um arquivo txt com o erro em questão.
        /// </remarks>
        /// <example>
        /// oUniNfe.vXmlNfeDadosMsg = "c:\teste-ped-sit.xml";
        /// oUniNfe.Consulta();
        /// this.textBox_xmlretorno.Text = oUniNfe.vNfeRetorno;
        /// //
        /// //
        /// //O conteúdo de retorno vai ser algo mais ou menos assim:
        /// //
        /// //<?xml version="1.0" encoding="UTF-8" ?>
        /// //   <retConsSitNFe versao="1.07" xmlns="http://www.portalfiscal.inf.br/nfe">
        /// //      <infProt>
        /// //         <tpAmb>2</tpAmb>
        /// //         <verAplic>1.10</verAplic>
        /// //         <cStat>100</cStat>
        /// //         <xMotivo>Autorizado o uso da NF-e</xMotivo>
        /// //         <cUF>51</cUF>
        /// //         <chNFe>51080612345678901234550010000001041671821888</chNFe>
        /// //         <dhRecbto>2008-06-27T15:01:48</dhRecbto>
        /// //         <nProt>151080000194296</nProt>
        /// //         <digVal>WHM/TzTvF+LrdUwtwvk26qgsko0=</digVal>
        /// //      </infProt>
        /// //   </retConsSitNFe>
        /// </example>
        /// <by>Wandrey Mundin Ferreira</by>
        /// <date>04/06/2008</date>
        public override void Consulta()
        {
            int emp = new FindEmpresaThread(Thread.CurrentThread).Index;

            //Definir o serviço que será executado para a classe
            Servico = Servicos.PedidoConsultaSituacaoNFe;

            try
            {
                //Ler o XML para pegar parâmetros de envio
                LerXML oLer = new LerXML();
                oLer.PedSit(NomeArquivoXML);

                if (vXmlNfeDadosMsgEhXML)
                {
                    //Definir o objeto do WebService
                    WebServiceProxy wsProxy = null;
                    switch (Propriedade.TipoAplicativo)
                    {
                        case TipoAplicativo.Cte:
                            wsProxy = ConfiguracaoApp.DefinirWS(Servicos.PedidoConsultaSituacaoNFe, emp, oLer.oDadosPedSit.cUF, oLer.oDadosPedSit.tpAmb, oLer.oDadosPedSit.tpEmis);
                            break;
                        case TipoAplicativo.Nfe:
                            wsProxy = ConfiguracaoApp.DefinirWS(Servicos.PedidoConsultaSituacaoNFe, emp, oLer.oDadosPedSit.cUF, oLer.oDadosPedSit.tpAmb, oLer.oDadosPedSit.tpEmis, oLer.oDadosPedSit.versaoNFe);
                            break;
                        default:
                            break;
                    }

                    //Criar objetos das classes dos serviços dos webservices do SEFAZ
                    if (oLer.oDadosPedSit.versaoNFe == 1 && Propriedade.TipoAplicativo == TipoAplicativo.Nfe)
                    {
                        object oConsulta = null;
                        if (oLer.oDadosPedSit.cUF == 41)
                            oConsulta = wsProxy.CriarObjeto("NfeConsultaService");
                        else
                            oConsulta = wsProxy.CriarObjeto("NfeConsulta");

                        //Invocar o método que envia o XML para o SEFAZ
                        oInvocarObj.Invocar(wsProxy, oConsulta, "nfeConsultaNF", this);
                    }
                    else
                    {
                        object oConsulta = wsProxy.CriarObjeto(NomeClasseWS(Servico, oLer.oDadosPedSit.cUF));
                        object oCabecMsg = wsProxy.CriarObjeto(NomeClasseCabecWS());

                        //Atribuir conteúdo para duas propriedades da classe nfeCabecMsg
                        wsProxy.SetProp(oCabecMsg, "cUF", oLer.oDadosPedSit.cUF.ToString());
                        switch (Propriedade.TipoAplicativo)
                        {
                            case TipoAplicativo.Cte:
                                wsProxy.SetProp(oCabecMsg, "versaoDados", ConfiguracaoApp.VersaoXMLPedSit);
                                break;
                            case TipoAplicativo.Nfe:
                                wsProxy.SetProp(oCabecMsg, "versaoDados", oLer.oDadosPedSit.versaoNFe == 201 ? "2.01" : ConfiguracaoApp.VersaoXMLPedSit);
                                break;
                            default:
                                break;
                        }

                        //Invocar o método que envia o XML para o SEFAZ
                        oInvocarObj.Invocar(wsProxy, oConsulta, NomeMetodoWS(Servico, oLer.oDadosPedSit.cUF), oCabecMsg, this);
                    }

                    //Efetuar a leitura do retorno da situação para ver se foi autorizada ou não
                    //Na versão 1 não posso gerar o -procNfe, ou vou ter que tratar a estrutura do XML de acordo com a versão, a consulta na versão 1 é somente para obter o resultado mesmo.
                    switch (Propriedade.TipoAplicativo)
                    {
                        case TipoAplicativo.Cte:
                            LerRetornoSitCTe(oLer.oDadosPedSit.chNFe);
                            break;
                        case TipoAplicativo.Nfe:
                            if (oLer.oDadosPedSit.versaoNFe != 1)
                                LerRetornoSitNFe(oLer.oDadosPedSit.chNFe);
                            break;
                        default:
                            break;
                    }

                    //Gerar o retorno para o ERP
                    oGerarXML.XmlRetorno(Propriedade.ExtEnvio.PedSit_XML, Propriedade.ExtRetorno.Sit_XML, this.vStrXmlRetorno);
                }
                else
                {
                    oGerarXML.Consulta(Path.GetFileNameWithoutExtension(NomeArquivoXML) + ".xml",
                                        oLer.oDadosPedSit.tpAmb,
                                        oLer.oDadosPedSit.tpEmis,
                                        oLer.oDadosPedSit.chNFe);
                }
            }
            catch (Exception ex)
            {
                string ExtRet = string.Empty;

                if (this.vXmlNfeDadosMsgEhXML) //Se for XML
                    ExtRet = Propriedade.ExtEnvio.PedSit_XML;
                else //Se for TXT
                    ExtRet = Propriedade.ExtEnvio.PedSit_TXT;

                try
                {
                    GravarArqErroServico(NomeArquivoXML, ExtRet, Propriedade.ExtRetorno.Sit_ERR, ex);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 09/03/2010
                }
            }
            finally
            {
                try
                {
                    Functions.DeletarArquivo(NomeArquivoXML);
                }
                catch
                {
                    //Se falhou algo na hora de deletar o XML de pedido da consulta da situação da NFe, infelizmente
                    //não posso fazser mais nada, o UniNFe vai tentar mantar o arquivo novamente para o webservice, pois ainda não foi excluido.
                    //Wandrey 22/03/2010
                }
            }
        }
Example #22
0
        private const int _Minutos = 12;  //12 minutos para atender o consumo indevido da SEFAZ

        public void Analisar(int emp)
        {
            this.oAux = new Auxiliar();

            try
            {
                // le todos os arquivos que estão na pasta em processamento
                //                string[] files = Directory.GetFiles(Empresas.Configuracoes[emp].PastaEnviado + "\\" + PastaEnviados.EmProcessamento.ToString(),
                //                                                "*" + Propriedade.ExtEnvio.Nfe,
                //                                                SearchOption.TopDirectoryOnly);

                string[] files = Directory.GetFiles(Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString()).Where(w => w.EndsWith(Propriedade.ExtEnvio.Nfe, StringComparison.InvariantCultureIgnoreCase) ||
                                                                                                                                                          w.EndsWith(Propriedade.ExtEnvio.Cte, StringComparison.InvariantCultureIgnoreCase) ||
                                                                                                                                                          w.EndsWith(Propriedade.ExtEnvio.MDFe, StringComparison.InvariantCultureIgnoreCase)).ToArray<string>();

                // considera os arquivos em que a data do ultimo acesso é superior a 5 minutos
                DateTime UltimaData = DateTime.Now.AddMinutes(-_Minutos);

                foreach (string file in files)
                {
                    if (!Functions.FileInUse(file))
                    {
                        FileInfo fi = new FileInfo(file);

                        //usar a última data de acesso, e não a data de criação
                        if (fi.LastWriteTime <= UltimaData)
                        {
                            if (this.oLerXml == null)
                            {
                                this.oLerXml = new LerXML();
                                this.oGerarXml = new GerarXML(emp);
                                this.fluxo = new FluxoNfe(emp);
                            }

                            try
                            {
                                XmlDocument doc = new XmlDocument();
                                doc.Load(file);

                                TipoAplicativo tipoArquivo = TipoAplicativo.Nfe;
                                string extNFe = Propriedade.ExtEnvio.Nfe;
                                string extProcNFe = Propriedade.ExtRetorno.ProcNFe;
                                string arquivoSit = string.Empty;
                                string chNFe = string.Empty;

                                switch (doc.DocumentElement.Name)
                                {
                                    case "MDFe":
                                        tipoArquivo = TipoAplicativo.MDFe;
                                        extNFe = Propriedade.ExtEnvio.MDFe;
                                        extProcNFe = Propriedade.ExtRetorno.ProcMDFe;

                                        oLerXml.Mdfe(file);
                                        arquivoSit = oLerXml.oDadosNfe.chavenfe.Substring(4);
                                        chNFe = oLerXml.oDadosNfe.chavenfe.Substring(4);
                                        break;

                                    case "NFe":
                                        tipoArquivo = TipoAplicativo.Nfe;
                                        extNFe = Propriedade.ExtEnvio.Nfe;
                                        extProcNFe = Propriedade.ExtRetorno.ProcNFe;

                                        oLerXml.Nfe(file);
                                        arquivoSit = oLerXml.oDadosNfe.chavenfe.Substring(3);
                                        chNFe = oLerXml.oDadosNfe.chavenfe.Substring(3);
                                        break;

                                    case "CTe":
                                        tipoArquivo = TipoAplicativo.Cte;
                                        extNFe = Propriedade.ExtEnvio.Cte;
                                        extProcNFe = Propriedade.ExtRetorno.ProcCTe;

                                        oLerXml.Cte(file);
                                        arquivoSit = oLerXml.oDadosNfe.chavenfe.Substring(3);
                                        chNFe = oLerXml.oDadosNfe.chavenfe.Substring(3);
                                        break;
                                }

                                //Ler a NFe

                                //Verificar se o -nfe.xml existe na pasta de autorizados
                                bool NFeJaNaAutorizada = oAux.EstaAutorizada(file, oLerXml.oDadosNfe.dEmi, extNFe, extNFe);

                                //Verificar se o -procNfe.xml existe na past de autorizados
                                bool procNFeJaNaAutorizada = oAux.EstaAutorizada(file, oLerXml.oDadosNfe.dEmi, extNFe, extProcNFe);

                                //Se um dos XML´s não estiver na pasta de autorizadas ele força finalizar o processo da NFe.
                                if (!NFeJaNaAutorizada || !procNFeJaNaAutorizada)
                                {
                                    //Verificar se a NFe está no fluxo, se não estiver vamos incluir ela para que funcione
                                    //a rotina de gerar o -procNFe.xml corretamente. Wandrey 21/10/2009
                                    if (!fluxo.NfeExiste(oLerXml.oDadosNfe.chavenfe))
                                    {
                                        fluxo.InserirNfeFluxo(oLerXml.oDadosNfe.chavenfe, oLerXml.oDadosNfe.mod, file);
                                    }

                                    //gera um -ped-sit.xml mesmo sendo autorizada ou denegada, pois assim sendo, o ERP precisaria dele
                                    oGerarXml.Consulta(tipoArquivo, arquivoSit + Propriedade.ExtEnvio.PedSit_XML,
                                        Convert.ToInt32(oLerXml.oDadosNfe.tpAmb),
                                        Convert.ToInt32(oLerXml.oDadosNfe.tpEmis),
                                        chNFe,
                                        oLerXml.oDadosNfe.versao);
                                }
                                else
                                {
                                    //Move o XML da pasta em processamento para a pasta de XML´s com erro (-nfe.xml)
                                    oAux.MoveArqErro(file);

                                    //Move o XML da pasta em processamento para a pasta de XML´s com erro (-procNFe.xml)
                                    oAux.MoveArqErro(Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + Functions.ExtrairNomeArq(file, extNFe) + extProcNFe);

                                    //Tirar a nota fiscal do fluxo
                                    fluxo.ExcluirNfeFluxo(oLerXml.oDadosNfe.chavenfe);
                                }
                            }
                            catch (Exception ex)
                            {
                                try
                                {
                                    // grava o arquivo com extensao .ERR 
                                    oAux.GravarArqErroERP(Path.GetFileNameWithoutExtension(file) + ".err", ex.Message);
                                }
                                catch
                                {
                                    //Se deu erro na hora de gravar o erro para o ERP, infelizmente não posso fazer mais nada. Wandrey 28/04/2011
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                try
                {
                    // grava o arquivo generico 
                    oAux.GravarArqErroERP(string.Format(Propriedade.NomeArqERRUniNFe, DateTime.Now.ToString("yyyyMMddTHHmmss")), ex.Message);
                }
                catch
                {
                    //Se deu erro na hora de gravar o erro para o ERP, infelizmente não posso fazer mais nada. Wandrey 28/04/2011
                }
            }
        }
Example #23
0
        /// <summary>
        /// Verificar o status do Serviço da NFe do SEFAZ em questão
        /// </summary>
        /// <remark>
        /// Como retorno, o método atualiza a propriedade this.vNfeRetorno da classe 
        /// com o conteúdo do retorno do WebService.
        /// No caso do StatusServico se tudo estiver correto retorna um XML
        /// dizendo que o serviço está em operação
        /// Se der algum erro ele grava um arquivo txt com a extensão .ERR com o conteúdo do erro
        /// </remark>
        /// <example>
        /// oUniNfe.vUF = 51; //Setar o Estado que é para ser verificado o status do serviço
        /// oUniNfe.vXmlNfeDadosMsg = "c:\pedstatus.xml";
        /// oUniNfe.StatusServico();
        /// this.textBox_xmlretorno.Text = oUniNfe.vNfeRetorno;
        /// //
        /// //O conteúdo de retorno vai ser algo mais ou menos assim:
        /// //
        /// // <?xml version="1.0" encoding="UTF-8"?>
        /// //   <retConsStatServ xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.07">
        /// //      <tpAmb>2</tpAmb>
        /// //      <verAplic>1.10</verAplic>
        /// //      <cStat>107</cStat>
        /// //      <xMotivo>Servico em Operacao</xMotivo>
        /// //      <cUF>51</cUF>
        /// //      <dhRecbto>2008-06-12T11:16:55</dhRecbto>
        /// //      <tMed>2</tMed>
        /// //   </retConsStatServ>
        /// </example>
        /// <by>
        /// Wandrey Mundin Ferreira
        /// </by>
        /// <date>
        /// 01/04/2008
        /// </date>
#if unsed
        public override void StatusServico()
        {
            int emp = new FindEmpresaThread(Thread.CurrentThread).Index;

            //Definir o serviço que será executado para a classe
            Servico = Servicos.PedidoConsultaStatusServicoNFe;

            try
            {
                //Ler o XML para pegar parâmetros de envio
                var oLer = new LerXML();
                oLer.PedSta(NomeArquivoXML);

                if (vXmlNfeDadosMsgEhXML)  //danasa 12-9-2009
                {
                    //Definir o objeto do WebService
                    WebServiceProxy wsProxy = ConfiguracaoApp.DefinirWS(Servicos.PedidoConsultaStatusServicoNFe, emp, oLer.oDadosPedSta.cUF, oLer.oDadosPedSta.tpAmb, oLer.oDadosPedSta.tpEmis);

                    //Criar objetos das classes dos serviços dos webservices do SEFAZ
                    var oStatusServico = wsProxy.CriarObjeto(NomeClasseWS(Servico, oLer.oDadosPedSta.cUF));
                    var oCabecMsg = wsProxy.CriarObjeto(NomeClasseCabecWS());

                    //Atribuir conteúdo para duas propriedades da classe nfeCabecMsg
                    wsProxy.SetProp(oCabecMsg, "cUF", oLer.oDadosPedSta.cUF.ToString());
                    wsProxy.SetProp(oCabecMsg, "versaoDados", ConfiguracaoApp.VersaoXMLStatusServico);

                    //Invocar o método que envia o XML para o SEFAZ
                    oInvocarObj.Invocar(wsProxy, oStatusServico, NomeMetodoWS(Servico, oLer.oDadosPedSta.cUF), oCabecMsg, this, "-ped-sta", "-sta");
                }
                else
                {
                    // Gerar o XML de solicitacao de situacao do servico a partir do TXT gerado pelo ERP
                    oGerarXML.StatusServico(Path.GetFileNameWithoutExtension(NomeArquivoXML) + ".xml",
                                            oLer.oDadosPedSta.tpAmb,
                                            oLer.oDadosPedSta.tpEmis,
                                            oLer.oDadosPedSta.cUF);
                }
            }
            catch (Exception ex)
            {
                var extRet = vXmlNfeDadosMsgEhXML ? Propriedade.ExtEnvio.PedSta_XML : Propriedade.ExtEnvio.PedSta_TXT;

                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    GravarArqErroServico(NomeArquivoXML, extRet, Propriedade.ExtRetorno.Sta_ERR, ex);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 09/03/2010
                }
            }
            finally
            {
                try
                {
                    //Deletar o arquivo de solicitação do serviço
                    Functions.DeletarArquivo(NomeArquivoXML);
                }
                catch
                {
                    //Se falhou algo na hora de deletar o XML de solicitação do serviço, 
                    //infelizmente não posso fazer mais nada, o UniNFe vai tentar mandar 
                    //o arquivo novamente para o webservice
                    //Wandrey 09/03/2010
                }
            }
        }
Example #24
0
        /// <summary>
        /// Finalizar o envio da NFe
        /// </summary>
        public void FinalizarNFe(XmlNodeList protNFeList, FluxoNfe fluxoNFe, int emp, XmlDocument conteudoXMLLote)
        {
            var oLerXml = new LerXML();

            foreach (XmlNode protNFeNode in protNFeList)
            {
                var    protNFeElemento = (XmlElement)protNFeNode;
                string versao          = protNFeElemento.GetAttribute(TpcnResources.versao.ToString());

                var strProtNfe = protNFeElemento.OuterXml;

                var infProtList = protNFeElemento.GetElementsByTagName("infProt");

                foreach (XmlNode infProtNode in infProtList)
                {
                    bool tirarFluxo      = true;
                    var  infProtElemento = (XmlElement)infProtNode;

                    var strChaveNFe = string.Empty;
                    var strStat     = string.Empty;

                    if (infProtElemento.GetElementsByTagName(TpcnResources.chNFe.ToString())[0] != null)
                    {
                        strChaveNFe = "NFe" + infProtElemento.GetElementsByTagName(NFe.Components.TpcnResources.chNFe.ToString())[0].InnerText;
                    }

                    if (infProtElemento.GetElementsByTagName(NFe.Components.TpcnResources.cStat.ToString())[0] != null)
                    {
                        strStat = infProtElemento.GetElementsByTagName(NFe.Components.TpcnResources.cStat.ToString())[0].InnerText;
                    }

                    //Definir o nome do arquivo da NFe e seu caminho
                    var strNomeArqNfe = fluxoNFe.LerTag(strChaveNFe, FluxoNfe.ElementoFixo.ArqNFe);

                    var CLASSE_NFe = Propriedade.Extensao(Propriedade.TipoEnvio.NFe);

                    // danasa 8-2009
                    // se por algum motivo o XML não existir no "Fluxo", então o arquivo tem que existir
                    // na pasta "EmProcessamento" assinada.
                    if (string.IsNullOrEmpty(strNomeArqNfe))
                    {
                        if (string.IsNullOrEmpty(strChaveNFe))
                        {
                            throw new Exception("LerRetornoLoteNFe(): Não pode obter o nome do arquivo");
                        }

                        strNomeArqNfe = strChaveNFe.Substring(3) + CLASSE_NFe.EnvioXML;
                    }
                    var strArquivoNFe = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                        PastaEnviados.EmProcessamento.ToString() + "\\" +
                                        strNomeArqNfe;

                    //Atualizar a Tag de status da NFe no fluxo para que se ocorrer alguma falha na exclusão eu tenha esta campo para ter uma referencia em futuras consultas
                    fluxoNFe.AtualizarTag(strChaveNFe, FluxoNfe.ElementoEditavel.cStat, strStat);

                    switch (strStat)
                    {
                    case "100":     //NFe Autorizada
                    case "150":     //NFe Autorizada fora do prazo
                        if (File.Exists(strArquivoNFe))
                        {
                            //Juntar o protocolo com a NFE já copiando para a pasta de autorizadas
                            var strArquivoNFeProc = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                    PastaEnviados.EmProcessamento.ToString() + "\\" +
                                                    Functions.ExtrairNomeArq(strNomeArqNfe, CLASSE_NFe.EnvioXML) +
                                                    Propriedade.ExtRetorno.ProcNFe;

                            //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s autorizados
                            if (conteudoXMLLote == null)
                            {
                                conteudoXMLLote = new XmlDocument();
                                conteudoXMLLote.Load(strArquivoNFe);
                            }
                            oLerXml.Nfe(conteudoXMLLote);

                            //Verificar se a -nfe.xml existe na pasta de autorizados
                            bool NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, CLASSE_NFe.EnvioXML, CLASSE_NFe.EnvioXML);

                            //Verificar se o -procNfe.xml existe na pasta de autorizados
                            bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, CLASSE_NFe.EnvioXML, Propriedade.ExtRetorno.ProcNFe);

                            //Se o XML de distribuição não estiver na pasta de autorizados
                            if (!procNFeJaNaAutorizada)
                            {
                                if (!File.Exists(strArquivoNFeProc))
                                {
                                    Auxiliar.WriteLog("TaskNFeRetRecepcao: Gerou o arquivo de distribuição através da consulta recibo.", false);
                                    oGerarXML.XmlDistNFe(strArquivoNFe, strProtNfe, Propriedade.ExtRetorno.ProcNFe, versao);
                                }
                            }

                            if (!(procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, CLASSE_NFe.EnvioXML, Propriedade.ExtRetorno.ProcNFe)))
                            {
                                //Mover a nfePRoc da pasta de NFE em processamento para a NFe Autorizada
                                //Para enviar falhar, tenho que mover primeiro o XML de distribuição (-procnfe.xml) para
                                //depois mover o da nfe (-nfe.xml), pois se ocorrer algum erro, tenho como reconstruir o senário,
                                //assim sendo não inverta as posições. Wandrey 08/10/2009
                                TFunctions.MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);

                                //Atualizar a situação para que eu só mova o arquivo com final -NFe.xml para a pasta autorizado se
                                //a procnfe já estiver lá, ou vai ficar na pasta emProcessamento para tentar gerar novamente.
                                //Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012
                                procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, CLASSE_NFe.EnvioXML, Propriedade.ExtRetorno.ProcNFe);
                            }

                            if (!NFeJaNaAutorizada && procNFeJaNaAutorizada)
                            {
                                //Mover a NFE da pasta de NFE em processamento para NFe Autorizada
                                //Para enviar falhar, tenho que mover primeiro o XML de distribuição (-procnfe.xml) para
                                //depois mover o da nfe (-nfe.xml), pois se ocorrer algum erro, tenho como reconstruir o senário.
                                //assim sendo não inverta as posições. Wandrey 08/10/2009
                                TFunctions.MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);
                            }

                            //Disparar a geração/impressão do UniDanfe. 03/02/2010 - Wandrey
                            if (procNFeJaNaAutorizada)
                            {
                                ///
                                /// tem que passar o arquivo de distribuicao da nfe
                                ///
                                string strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                        PastaEnviados.Autorizados.ToString() + "\\" +
                                                        Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) +
                                                        Path.GetFileName(strArquivoNFeProc);
                                try
                                {
                                    TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]);
                                }
                                catch (Exception ex)
                                {
                                    Auxiliar.WriteLog("TaskRecepcao: (Falha na execução do UniDANFe) " + ex.Message, false);
                                }
                            }
                            //Vou verificar se estão os dois arquivos na pasta Autorizados, se tiver eu tiro do fluxo caso contrário não. Wandrey 13/02/2012
                            NFeJaNaAutorizada     = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, CLASSE_NFe.EnvioXML, CLASSE_NFe.EnvioXML);
                            procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, CLASSE_NFe.EnvioXML, Propriedade.ExtRetorno.ProcNFe);
                            if (!procNFeJaNaAutorizada || !NFeJaNaAutorizada)
                            {
                                tirarFluxo = false;
                            }

                            ///
                            /// se o -nfe.xml já existe na pasta de autorizados e ele está na pasta em processamento,
                            /// o exclui da pasta em processamento
                            if (NFeJaNaAutorizada && File.Exists(strArquivoNFe))
                            {
                                File.Delete(strArquivoNFe);
                            }
                        }
                        else
                        {
                            Auxiliar.WriteLog("TaskRetRecepcao: (Foi efetuada uma consulta recibo e não foi localizado o arquivo da NFe ( " + strNomeArqNfe + ") na pasta EmProcessamento) ", false);
                        }

                        break;

                    case "110":
                    case "205":
                    case "301":
                    case "302":
                    case "303":
                        ProcessaNFeDenegada(emp, oLerXml, strArquivoNFe, conteudoXMLLote, protNFeElemento.OuterXml, versao);
                        break;

                    default:     //NFe foi rejeitada
                        //O Status da NFe tem que ser maior que 1 ou deu algum erro na hora de ler o XML de retorno da consulta do recibo, sendo assim, vou mantar a nota no fluxo para consultar novamente.
                        if (Convert.ToInt32(strStat) >= 1)
                        {
                            Auxiliar.WriteLog("Arquivo: " + strNomeArqNfe + " codigo de retorno: " + strStat, false);
                            //Mover o XML da NFE a pasta de XML´s com erro
                            oAux.MoveArqErro(strArquivoNFe);
                        }
                        else
                        {
                            tirarFluxo = false;
                        }
                        break;
                    }

                    //Deletar a NFE do arquivo de controle de fluxo
                    if (tirarFluxo)
                    {
                        fluxoNFe.ExcluirNfeFluxo(strChaveNFe);
                    }

                    break;
                }
            }
        }
Example #25
0
        /// <summary>
        /// RecepcaoEvento
        /// </summary>
        public override void RecepcaoEvento()   //<<<danasa 6-2011
        {
            int emp = new FindEmpresaThread(Thread.CurrentThread).Index;

            //Definir o serviço que será executado para a classe
            if (NomeArquivoXML.ToLower().EndsWith(Propriedade.ExtEnvio.EnvCCe_XML) || NomeArquivoXML.ToLower().EndsWith(Propriedade.ExtEnvio.EnvCCe_TXT))
                Servico = Servicos.EnviarCCe;
            else
                if (NomeArquivoXML.ToLower().EndsWith(Propriedade.ExtEnvio.EnvManifestacao_XML) || NomeArquivoXML.ToLower().EndsWith(Propriedade.ExtEnvio.EnvManifestacao_TXT))
                    Servico = Servicos.EnviarManifestacao;
                else
                    if (NomeArquivoXML.ToLower().EndsWith(Propriedade.ExtEnvio.EnvCancelamento_XML) || NomeArquivoXML.ToLower().EndsWith(Propriedade.ExtEnvio.EnvCancelamento_TXT))
                        Servico = Servicos.EnviarEventoCancelamento;

            try
            {
                //Ler o XML para pegar parâmetros de envio
                LerXML oLer = new LerXML();
                oLer.EnvEvento(emp, NomeArquivoXML);

                if (vXmlNfeDadosMsgEhXML)
                {
                    int currentEvento = Convert.ToInt32(oLer.oDadosEnvEvento.eventos[0].tpEvento);
                    foreach (Evento item in oLer.oDadosEnvEvento.eventos)
                        if (currentEvento != Convert.ToInt32(item.tpEvento))
                            throw new Exception(string.Format("Não é possivel mesclar tipos de eventos dentro de um mesmo xml de eventos. O tipo de evento neste xml é {0}", currentEvento));

                    int cOrgao = oLer.oDadosEnvEvento.eventos[0].cOrgao;
                    if (cOrgao == 90 || cOrgao == 91)   //Amb.Nacional
                        cOrgao = Convert.ToInt32(oLer.oDadosEnvEvento.eventos[0].chNFe.Substring(0, 2));//<<< 7/2012

                    //Definir o objeto do WebService
                    WebServiceProxy wsProxy = ConfiguracaoApp.DefinirWS(
                        Servico,
                        emp,
                        cOrgao,
                        oLer.oDadosEnvEvento.eventos[0].tpAmb,
                        1);

                    //Criar objetos das classes dos serviços dos webservices do SEFAZ
                    object oRecepcaoEvento;
                    if (oLer.oDadosEnvEvento.eventos[0].cOrgao == 52)
                    {
                        oRecepcaoEvento = wsProxy.CriarObjeto("NfeRecepcaoEvento");
                    }
                    else
                    {
                        oRecepcaoEvento = wsProxy.CriarObjeto("RecepcaoEvento");
                    }
                    object oCabecMsg = wsProxy.CriarObjeto(NomeClasseCabecWS());

                    //Atribuir conteúdo para duas propriedades da classe nfeCabecMsg
                    wsProxy.SetProp(oCabecMsg, "cUF", cOrgao.ToString());
                    switch (Servico)
                    {
                        case Servicos.EnviarCCe:
                            wsProxy.SetProp(oCabecMsg, "versaoDados", ConfiguracaoApp.VersaoXMLEnvCCe);
                            break;
                        case Servicos.EnviarEventoCancelamento:
                            wsProxy.SetProp(oCabecMsg, "versaoDados", ConfiguracaoApp.VersaoXMLEnvCancelamento);
                            break;
                        default:
                            wsProxy.SetProp(oCabecMsg, "versaoDados", ConfiguracaoApp.VersaoXMLEnvManifestacao);
                            break;
                    }

                    //Criar objeto da classe de assinatura digital
                    AssinaturaDigital oAD = new AssinaturaDigital();

                    //Assinar o XML
                    oAD.Assinar(NomeArquivoXML, emp, cOrgao);//Convert.ToInt32(oLer.oDadosEnvEvento.eventos[0].cOrgao));

                    //Invocar o método que envia o XML para o SEFAZ
                    string xmlExtEnvio = string.Empty;
                    string xmlExtRetorno = string.Empty;
                    switch (Servico)
                    {
                        case Servicos.EnviarCCe:
                            xmlExtEnvio = Propriedade.ExtEnvio.EnvCCe_XML.Replace(".xml", "");
                            xmlExtRetorno = Propriedade.ExtRetorno.retEnvCCe_XML.Replace(".xml", "");
                            break;
                        case Servicos.EnviarEventoCancelamento:
                            xmlExtEnvio = Propriedade.ExtEnvio.EnvCancelamento_XML.Replace(".xml", "");
                            xmlExtRetorno = Propriedade.ExtRetorno.retCancelamento_XML.Replace(".xml", "");
                            break;
                        default:
                            xmlExtEnvio = Propriedade.ExtEnvio.EnvManifestacao_XML.Replace(".xml", "");
                            xmlExtRetorno = Propriedade.ExtRetorno.retManifestacao_XML.Replace(".xml", "");
                            break;
                    }
                    oInvocarObj.Invocar(wsProxy, oRecepcaoEvento, "nfeRecepcaoEvento", oCabecMsg, this, xmlExtEnvio, xmlExtRetorno);

                    //Ler o retorno
                    if (Servico == Servicos.EnviarManifestacao)
                        LerRetornoManifestacao(emp);
                    else
                        LerRetornoEvento(emp);
                }
                else
                {
                    // Gerar o XML de eventos a partir do TXT gerado pelo ERP
                    string xmlFileExt = string.Empty;
                    string xmlFileExtTXT = string.Empty;
                    switch (Servico)
                    {
                        case Servicos.EnviarCCe:
                            xmlFileExt = Propriedade.ExtEnvio.EnvCCe_XML;
                            xmlFileExtTXT = Propriedade.ExtEnvio.EnvCCe_TXT;
                            break;
                        case Servicos.EnviarEventoCancelamento:
                            xmlFileExt = Propriedade.ExtEnvio.EnvCancelamento_XML;
                            xmlFileExtTXT = Propriedade.ExtEnvio.EnvCancelamento_TXT;
                            break;
                        default:
                            xmlFileExt = Propriedade.ExtEnvio.EnvManifestacao_XML;
                            xmlFileExtTXT = Propriedade.ExtEnvio.EnvManifestacao_TXT;
                            break;
                    }
                    oGerarXML.EnvioEvento(Functions.ExtrairNomeArq(NomeArquivoXML, xmlFileExtTXT) + xmlFileExt, oLer.oDadosEnvEvento);
                }
            }
            catch (Exception ex)
            {
                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    string ExtRet = string.Empty;
                    string ExtRetorno = string.Empty;

                    switch (Servico)
                    {
                        case Servicos.EnviarCCe:
                            ExtRet = vXmlNfeDadosMsgEhXML ? Propriedade.ExtEnvio.EnvCCe_XML : Propriedade.ExtEnvio.EnvCCe_TXT;
                            ExtRetorno = Propriedade.ExtRetorno.retEnvCCe_ERR;
                            break;
                        case Servicos.EnviarEventoCancelamento:
                            ExtRet = vXmlNfeDadosMsgEhXML ? Propriedade.ExtEnvio.EnvCancelamento_XML : Propriedade.ExtEnvio.EnvCancelamento_TXT;
                            ExtRetorno = Propriedade.ExtRetorno.retCancelamento_ERR;
                            break;
                        default:
                            ExtRet = vXmlNfeDadosMsgEhXML ? Propriedade.ExtEnvio.EnvManifestacao_XML : Propriedade.ExtEnvio.EnvManifestacao_TXT;
                            ExtRetorno = Propriedade.ExtRetorno.retManifestacao_ERR;
                            break;
                    }
                    if (ExtRetorno != string.Empty)
                        GravarArqErroServico(NomeArquivoXML, ExtRet, ExtRetorno, ex);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 09/03/2010
                }
            }
            finally
            {
                try
                {
                    Functions.DeletarArquivo(NomeArquivoXML);
                }
                catch
                {
                    //Se falhou algo na hora de deletar o XML de evento, infelizmente
                    //não posso fazer mais nada, o UniNFe vai tentar mandar o arquivo novamente para o webservice, pois ainda não foi excluido.
                    //Wandrey 09/03/2010
                }
            }
        }
        public override void Execute()
        {
            int emp = Empresas.FindEmpresaByThread();

            try
            {
                dadosRec = new DadosRecClass();
                FluxoNfe fluxoNfe = new FluxoNfe();
                LerXML   lerXml   = new LerXML();

                //Ler o XML de Lote para pegar o número do lote que está sendo enviado
                lerXml.Mdfe(ConteudoXML);

                string idLote = lerXml.oDadosNfe.idLote;

                //Definir o objeto do WebService
                WebServiceProxy wsProxy = ConfiguracaoApp.DefinirWS(Servico, emp, Convert.ToInt32(lerXml.oDadosNfe.cUF), Convert.ToInt32(lerXml.oDadosNfe.tpAmb), Convert.ToInt32(lerXml.oDadosNfe.tpEmis), 0);
                System.Net.SecurityProtocolType securityProtocolType = WebServiceProxy.DefinirProtocoloSeguranca(Convert.ToInt32(lerXml.oDadosNfe.cUF), Convert.ToInt32(lerXml.oDadosNfe.tpAmb), Convert.ToInt32(lerXml.oDadosNfe.tpEmis), Servico);

                //Criar objetos das classes dos serviços dos webservices do SEFAZ
                object oRecepcao = wsProxy.CriarObjeto(wsProxy.NomeClasseWS);
                object oCabecMsg = null;

                if (Servico == Servicos.MDFeEnviarLote)
                {
                    oCabecMsg = wsProxy.CriarObjeto(NomeClasseCabecWS(Convert.ToInt32(lerXml.oDadosNfe.cUF), Servico));

                    //Atribuir conteúdo para duas propriedades da classe nfeCabecMsg
                    wsProxy.SetProp(oCabecMsg, TpcnResources.cUF.ToString(), lerXml.oDadosNfe.cUF);
                    wsProxy.SetProp(oCabecMsg, TpcnResources.versaoDados.ToString(), lerXml.oDadosNfe.versao);
                }

                //Invocar o método que envia o XML para o SEFAZ
                oInvocarObj.Invocar(wsProxy,
                                    oRecepcao,
                                    wsProxy.NomeMetodoWS[0],
                                    oCabecMsg, this,
                                    Propriedade.Extensao(Propriedade.TipoEnvio.EnvLot).EnvioXML,
                                    Propriedade.ExtRetorno.Rec,
                                    true,
                                    securityProtocolType);

                if (Servico == Servicos.MDFeEnviarLoteSinc)
                {
                    Protocolo(vStrXmlRetorno);
                }
                else
                {
                    Recibo(vStrXmlRetorno, emp);
                }

                if (dadosRec.cStat == "104") //Lote processado - Envio Síncrono
                {
                    FinalizarNFeSincrono(vStrXmlRetorno, emp, lerXml.oDadosNfe.chavenfe);

                    oGerarXML.XmlRetorno(Propriedade.Extensao(Propriedade.TipoEnvio.EnvLot).EnvioXML, Propriedade.Extensao(Propriedade.TipoEnvio.PedRec).RetornoXML, vStrXmlRetorno);
                }
                else if (dadosRec.cStat == "103") //Lote recebido com sucesso
                {
                    if (dadosRec.tMed > 0)
                    {
                        Thread.Sleep(dadosRec.tMed * 1000);
                    }

                    //Atualizar o número do recibo no XML de controle do fluxo de notas enviadas
                    fluxoNfe.AtualizarTag(lerXml.oDadosNfe.chavenfe, FluxoNfe.ElementoEditavel.tMed, (dadosRec.tMed + 2).ToString());
                    fluxoNfe.AtualizarTagRec(idLote, dadosRec.nRec);
                    XmlDocument         xmlPedRec       = oGerarXML.XmlPedRecMDFe(dadosRec.nRec, dadosRec.versao, emp);
                    TaskMDFeRetRecepcao mdfeRetRecepcao = new TaskMDFeRetRecepcao(xmlPedRec);
                    mdfeRetRecepcao.Execute();
                }
                else if (Convert.ToInt32(dadosRec.cStat) > 200 ||
                         Convert.ToInt32(dadosRec.cStat) == 108 || //Verifica se o servidor de processamento está paralisado momentaneamente. Wandrey 13/04/2012
                         Convert.ToInt32(dadosRec.cStat) == 109)   //Verifica se o servidor de processamento está paralisado sem previsão. Wandrey 13/04/2012
                {
                    //Se o status do retorno do lote for maior que 200 ou for igual a 108 ou 109,
                    //vamos ter que excluir a nota do fluxo, porque ela foi rejeitada pelo SEFAZ
                    //Primeiro vamos mover o xml da nota da pasta EmProcessamento para pasta de XML´s com erro e depois tira ela do fluxo
                    //Wandrey 30/04/2009
                    oAux.MoveArqErro(Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + fluxoNfe.LerTag(lerXml.oDadosNfe.chavenfe, FluxoNfe.ElementoFixo.ArqNFe));
                    fluxoNfe.ExcluirNfeFluxo(lerXml.oDadosNfe.chavenfe);
                }

                //Deleta o arquivo de lote
                Functions.DeletarArquivo(NomeArquivoXML);
            }
            catch (ExceptionEnvioXML ex)
            {
                //Ocorreu algum erro no exato momento em que tentou enviar o XML para o SEFAZ, vou ter que tratar
                //para ver se o XML chegou lá ou não, se eu consegui pegar o número do recibo de volta ou não, etc.
                //E ver se vamos tirar o XML do Fluxo ou finalizar ele com a consulta situação da NFe

                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.Extensao(Propriedade.TipoEnvio.EnvLot).EnvioXML, Propriedade.ExtRetorno.Rec_ERR, ex);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 16/03/2010
                }
            }
            catch (ExceptionSemInternet ex)
            {
                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.Extensao(Propriedade.TipoEnvio.EnvLot).EnvioXML, Propriedade.ExtRetorno.Rec_ERR, ex, false);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 16/03/2010
                }
            }
            catch (Exception ex)
            {
                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    TFunctions.GravarArqErroServico(NomeArquivoXML, Propriedade.Extensao(Propriedade.TipoEnvio.EnvLot).EnvioXML, Propriedade.ExtRetorno.Rec_ERR, ex);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 16/03/2010
                }
            }
        }
Example #27
0
        /// <summary>
        /// Envia o XML de inutilização de numeração de notas fiscais
        /// </summary>
        /// <remarks>
        /// Atualiza a propriedade this.vNfeRetorno da classe com o conteúdo
        /// XML com o retorno que foi dado do serviço do WebService.
        /// No caso da Inutilização se tudo estiver correto retorna um XML
        /// dizendo se foi inutilizado corretamente ou não.
        /// Se der algum erro ele grava um arquivo txt com o erro em questão.
        /// </remarks>
        /// <example>
        /// oUniNfe.vXmlNfeDadosMsg = "c:\teste-ped-sit.xml";
        /// oUniNfe.Inutilizacao();
        /// this.textBox_xmlretorno.Text = oUniNfe.vNfeRetorno;
        /// //
        /// //
        /// //O conteúdo de retorno vai ser algo mais ou menos assim:
        /// //
        /// //<?xml version="1.0" encoding="UTF-8" ?> 
        /// //<retInutNFe xmlns="http://www.portalfiscal.inf.br/nfe" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.portalfiscal.inf.br/nfe retInutNFe_v1.07.xsd" versao="1.07">
        /// //   <infInut>
        /// //      <tpAmb>2</tpAmb> 
        /// //      <verAplic>1.10</verAplic> 
        /// //      <cStat>102</cStat> 
        /// //      <xMotivo>Inutilizacao de numero homologado</xMotivo> 
        /// //      <cUF>51</cUF> 
        /// //      <ano>08</ano> 
        /// //      <CNPJ>12345678901234</CNPJ> 
        /// //      <mod>55</mod> 
        /// //      <serie>1</serie> 
        /// //      <nNFIni>101</nNFIni> 
        /// //      <nNFFin>101</nNFFin> 
        /// //      <dhRecbto>2008-07-01T16:47:11</dhRecbto> 
        /// //      <nProt>151080000197712</nProt> 
        /// //   </infInut>
        /// //</retInutNFe>
        /// </example>
        /// <by>Wandrey Mundin Ferreira</by>
        /// <date>03/04/2009</date>
      
#if notused
        public override void Inutilizacao()
        {
            int emp = new FindEmpresaThread(Thread.CurrentThread).Index;

            //Definir o serviço que será executado para a classe
            Servico = Servicos.InutilizarNumerosNFe;

            try
            {
                //Ler o XML para pegar parâmetros de envio
                LerXML oLer = new LerXML();
                oLer.PedInut(NomeArquivoXML);

                if (this.vXmlNfeDadosMsgEhXML)  //danasa 12-9-2009
                {
                    //Definir o objeto do WebService
                    WebServiceProxy wsProxy = ConfiguracaoApp.DefinirWS(Servicos.InutilizarNumerosNFe, emp, oLer.oDadosPedInut.cUF, oLer.oDadosPedInut.tpAmb, oLer.oDadosPedInut.tpEmis);

                    //Criar objetos das classes dos serviços dos webservices do SEFAZ
                    object oInutilizacao = wsProxy.CriarObjeto(NomeClasseWS(Servico, oLer.oDadosPedInut.cUF));
                    object oCabecMsg = wsProxy.CriarObjeto(NomeClasseCabecWS());

                    //Atribuir conteúdo para duas propriedades da classe nfeCabecMsg
                    wsProxy.SetProp(oCabecMsg, "cUF", oLer.oDadosPedInut.cUF.ToString());
                    wsProxy.SetProp(oCabecMsg, "versaoDados", ConfiguracaoApp.VersaoXMLInut);

                    //Criar objeto da classe de assinatura digita
                    AssinaturaDigital oAD = new AssinaturaDigital();

                    //Assinar o XML
                    oAD.Assinar(NomeArquivoXML, emp, Convert.ToInt32(oLer.oDadosPedInut.cUF));

                    //Invocar o método que envia o XML para o SEFAZ
                    oInvocarObj.Invocar(wsProxy, oInutilizacao, NomeMetodoWS(Servico, oLer.oDadosPedInut.cUF), oCabecMsg, this, "-ped-inu", "-inu");

                    //Ler o retorno do webservice
                    this.LerRetornoInut();
                }
                else
                {
                    oGerarXML.Inutilizacao(Path.GetFileNameWithoutExtension(NomeArquivoXML) + ".xml",
                        oLer.oDadosPedInut.tpAmb,
                        oLer.oDadosPedInut.tpEmis,
                        oLer.oDadosPedInut.cUF,
                        oLer.oDadosPedInut.ano,
                        oLer.oDadosPedInut.CNPJ,
                        oLer.oDadosPedInut.mod,
                        oLer.oDadosPedInut.serie,
                        oLer.oDadosPedInut.nNFIni,
                        oLer.oDadosPedInut.nNFFin,
                        oLer.oDadosPedInut.xJust);
                }

            }
            catch (Exception ex)
            {
                string ExtRet = string.Empty;

                if (this.vXmlNfeDadosMsgEhXML) //Se for XML
                    ExtRet = Propriedade.ExtEnvio.PedInu_XML;
                else //Se for TXT
                    ExtRet = Propriedade.ExtEnvio.PedInu_TXT;

                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    GravarArqErroServico(NomeArquivoXML, ExtRet, Propriedade.ExtRetorno.Inu_ERR, ex);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 09/03/2010
                }
            }
            finally
            {
                try
                {
                    if (!this.vXmlNfeDadosMsgEhXML) //Se for o TXT para ser transformado em XML, vamos excluir o TXT depois de gerado o XML
                        Functions.DeletarArquivo(NomeArquivoXML);
                }
                catch
                {
                    //Se falhou algo na hora de deletar o XML de inutilização, infelizmente não posso 
                    //fazer mais nada. Com certeza o uninfe sendo restabelecido novamente vai tentar enviar o mesmo 
                    //xml de inutilização para o SEFAZ. Este erro pode ocorrer por falha no HD, rede, Permissão de pastas, etc. Wandrey 23/03/2010
                }
            }
        }
Example #28
0
        /// <summary>
        /// Ler o retorno da consulta situação da nota fiscal e de acordo com o status ele trata as notas enviadas se ainda não foram tratadas
        /// </summary>
        /// <param name="ChaveNFe">Chave da NFe que está sendo consultada</param>
        /// <remarks>
        /// Autor: Wandrey Mundin Ferreira
        /// Data: 16/06/2010
        /// </remarks>
        private void LerRetornoSitNFe(string ChaveNFe)
        {
            int emp = Empresas.FindEmpresaByThread();

            oGerarXML.XmlDistEvento(emp, vStrXmlRetorno);

            LerXML   oLerXml   = new LerXML();
            FluxoNfe oFluxoNfe = new FluxoNfe();

            XmlDocument doc = new XmlDocument();

            doc.Load(Functions.StringXmlToStreamUTF8(vStrXmlRetorno));

            XmlNodeList retConsSitList = doc.GetElementsByTagName("retConsSitNFe");

            foreach (XmlNode retConsSitNode in retConsSitList)
            {
                XmlElement retConsSitElemento = (XmlElement)retConsSitNode;

                //Definir a chave da NFe a ser pesquisada
                string strChaveNFe = "NFe" + ChaveNFe;

                //Definir o nome do arquivo da NFe e seu caminho
                string strNomeArqNfe = oFluxoNfe.LerTag(strChaveNFe, FluxoNfe.ElementoFixo.ArqNFe);

                if (string.IsNullOrEmpty(strNomeArqNfe))
                {
                    strNomeArqNfe = strChaveNFe.Substring(3) + Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML;
                }
                string strArquivoNFe = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + strNomeArqNfe;

                #region CNPJ da chave não é de uma empresa Uninfe

                bool notDaEmpresa = (ChaveNFe.Substring(6, 14) != Empresas.Configuracoes[emp].CNPJ ||
                                     ChaveNFe.Substring(0, 2) != Empresas.Configuracoes[emp].UnidadeFederativaCodigo.ToString());

                if (!File.Exists(strArquivoNFe))
                {
                    if (notDaEmpresa)
                    {
                        return;
                    }

                    var arquivos = Directory.GetFiles(Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString(), "*-nfe.*");

                    foreach (var arquivo in arquivos)
                    {
                        XmlDocument arqXML = new XmlDocument();
                        arqXML.Load(arquivo);

                        string chave = ((XmlElement)arqXML.GetElementsByTagName("infNFe")[0]).GetAttribute("Id").Substring(3);

                        if (chave.Equals(ChaveNFe))
                        {
                            strNomeArqNfe = Path.GetFileName(arquivo);
                            strArquivoNFe = arquivo;
                            break;
                        }
                    }
                }

                #endregion CNPJ da chave não é de uma empresa Uninfe

                //Pegar o status de retorno da NFe que está sendo consultada a situação
                var cStatCons = string.Empty;
                if (retConsSitElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null)
                {
                    cStatCons = retConsSitElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0].InnerText;
                }

                switch (cStatCons)
                {
                    #region Rejeições do XML de consulta da situação da NFe (Não é a nfe que foi rejeitada e sim o XML de consulta da situação da nfe)

                    #region Validação do Certificado de Transmissão

                case "280":
                case "281":
                case "283":
                case "286":
                case "284":
                case "285":
                case "282":

                    #endregion Validação do Certificado de Transmissão

                    #region Validação Inicial da Mensagem no WebService

                case "214":
                case "243":
                case "108":
                case "109":

                    #endregion Validação Inicial da Mensagem no WebService

                    #region Validação das informações de controle da chamada ao WebService

                case "242":
                case "409":
                case "410":
                case "411":
                case "238":
                case "239":

                    #endregion Validação das informações de controle da chamada ao WebService

                    #region Validação da forma da área de dados

                case "215":
                case "516":
                case "517":
                case "545":
                case "587":
                case "588":
                case "404":
                case "402":

                    #endregion Validação da forma da área de dados

                    #region Validação das regras de negócios da consulta a NF-e

                case "252":
                case "226":
                case "236":
                case "614":
                case "615":
                case "616":
                case "617":
                case "618":
                case "619":
                case "620":
                    break;

                    #endregion Validação das regras de negócios da consulta a NF-e

                    #region Nota fiscal rejeitada

                case "217":     //J-NFe não existe na base de dados do SEFAZ
                    goto case "TirarFluxo";

                case "562":     //J-Verificar se o campo "Código Numérico" informado na chave de acesso é diferente do existente no BD
                    goto case "TirarFluxo";

                case "561":     //J-Verificar se campo MM (mês) informado na Chave de Acesso é diferente do existente no BD
                    goto case "TirarFluxo";

                    #endregion Nota fiscal rejeitada

                    #endregion Rejeições do XML de consulta da situação da NFe (Não é a nfe que foi rejeitada e sim o XML de consulta da situação da nfe)

                    #region Nota fiscal autorizada

                case "100":     //Autorizado o uso da NFe
                case "150":     //Autorizado o uso da NFe fora do prazo
                    XmlNodeList infConsSitList = retConsSitElemento.GetElementsByTagName("infProt");
                    if (infConsSitList != null)
                    {
                        foreach (XmlNode infConsSitNode in infConsSitList)
                        {
                            XmlElement infConsSitElemento = (XmlElement)infConsSitNode;

                            //Pegar o Status do Retorno da consulta situação
                            string strStat = Functions.LerTag(infConsSitElemento, TpcnResources.cStat.ToString(), false);

                            //Pegar a versão do XML
                            var    protNFeElemento = (XmlElement)retConsSitElemento.GetElementsByTagName("protNFe")[0];
                            string versao          = protNFeElemento.GetAttribute(TpcnResources.versao.ToString());

                            switch (strStat)
                            {
                            case "100":         //NFe Autorizada
                            case "150":         //NFe Autorizada fora do prazo
                                string strProtNfe = retConsSitElemento.GetElementsByTagName("protNFe")[0].OuterXml;

                                //Definir o nome do arquivo -procNfe.xml
                                string strArquivoNFeProc = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                           PastaEnviados.EmProcessamento.ToString() + "\\" +
                                                           Functions.ExtrairNomeArq(strArquivoNFe, Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML) + Propriedade.ExtRetorno.ProcNFe;

                                //Se existir o strArquivoNfe, tem como eu fazer alguma coisa, se ele não existir
                                //Não tenho como fazer mais nada. Wandrey 08/10/2009
                                if (File.Exists(strArquivoNFe))
                                {
                                    //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s autorizados
                                    XmlDocument conteudoXML = new XmlDocument();
                                    conteudoXML.Load(strArquivoNFe);
                                    oLerXml.Nfe(conteudoXML);

                                    if (Empresas.Configuracoes[emp].CompararDigestValueDFeRetornadoSEFAZ)
                                    {
                                        var digestValueConsultaSituacao = infConsSitElemento.GetElementsByTagName("digVal")[0].InnerText;
                                        var digestValueNota             = conteudoXML.GetElementsByTagName("DigestValue")[0].InnerText;

                                        if (!string.IsNullOrEmpty(digestValueConsultaSituacao) && !string.IsNullOrEmpty(digestValueNota))
                                        {
                                            if (!digestValueConsultaSituacao.Equals(digestValueNota))
                                            {
                                                oAux.MoveArqErro(strArquivoNFe);
                                                throw new Exception("O valor do DigestValue da consulta situação é diferente do DigestValue da NFe ou NFCe.");
                                            }
                                        }
                                    }

                                    //Verificar se a -nfe.xml existe na pasta de autorizados
                                    bool NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML, Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML);

                                    //Verificar se o -procNfe.xml existe na past de autorizados
                                    bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML, Propriedade.ExtRetorno.ProcNFe);

                                    //Se o XML de distribuição não estiver na pasta de autorizados
                                    if (!procNFeJaNaAutorizada)
                                    {
                                        if (!File.Exists(strArquivoNFeProc))
                                        {
                                            Auxiliar.WriteLog("TaskNFeConsultaSituacao: Gerou o arquivo de distribuição através da consulta situação da NFe.", false);
                                            oGerarXML.XmlDistNFe(strArquivoNFe, strProtNfe, Propriedade.ExtRetorno.ProcNFe, oLerXml.oDadosNfe.versao);
                                        }
                                    }

                                    //Se o XML de distribuição não estiver ainda na pasta de autorizados
                                    if (!(procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML, Propriedade.ExtRetorno.ProcNFe)))
                                    {
                                        //Move a nfeProc da pasta de NFE em processamento para a NFe Autorizada
                                        TFunctions.MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);

                                        //Atualizar a situação para que eu só mova o arquivo com final -NFe.xml para a pasta autorizado se
                                        //a procnfe já estiver lá, ou vai ficar na pasta emProcessamento para tentar gerar novamente.
                                        //Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012
                                        procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML, Propriedade.ExtRetorno.ProcNFe);
                                    }

                                    //Se a NFe não existir ainda na pasta de autorizados
                                    if (!(NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML, Propriedade.Extensao(Propriedade.TipoEnvio.NFe).EnvioXML)))
                                    {
                                        //1-Mover a NFE da pasta de NFE em processamento para NFe Autorizada
                                        //2-Só vou mover o -nfe.xml para a pasta autorizados se já existir a -procnfe.xml, caso contrário vou manter na pasta EmProcessamento
                                        //  para tentar gerar novamente o -procnfe.xml
                                        //  Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012
                                        if (procNFeJaNaAutorizada)
                                        {
                                            if (!Empresas.Configuracoes[emp].SalvarSomenteXMLDistribuicao)
                                            {
                                                TFunctions.MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);
                                            }
                                            else
                                            {
                                                TFunctions.MoverArquivo(strArquivoNFe, PastaEnviados.Originais, oLerXml.oDadosNfe.dEmi);
                                            }
                                        }
                                    }
                                    else
                                    {
                                        //1-Se já estiver na pasta de autorizados, vou somente mover ela da pasta de XML´s em processamento
                                        //2-Só vou mover o -nfe.xml da pasta EmProcessamento se também existir a -procnfe.xml na pasta autorizados, caso contrário vou manter na pasta EmProcessamento
                                        //  para tentar gerar novamente o -procnfe.xml
                                        //  Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012
                                        if (procNFeJaNaAutorizada)
                                        {
                                            oAux.MoveArqErro(strArquivoNFe);
                                        }
                                        //oAux.DeletarArquivo(strArquivoNFe);
                                    }

                                    //Disparar a geração/impressão do UniDanfe. 03/02/2010 - Wandrey
                                    if (procNFeJaNaAutorizada)
                                    {
                                        try
                                        {
                                            string strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                                    PastaEnviados.Autorizados.ToString() + "\\" +
                                                                    Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) +
                                                                    Path.GetFileName(strArquivoNFe);

                                            TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]);
                                        }
                                        catch (Exception ex)
                                        {
                                            Auxiliar.WriteLog("TaskNFeConsultaSituacao:  (Falha na execução do UniDANFe) " + ex.Message, false);
                                        }
                                    }
                                }

                                if (File.Exists(strArquivoNFeProc))
                                {
                                    //Se já estiver na pasta de autorizados, vou somente excluir ela da pasta de XML´s em processamento
                                    Functions.DeletarArquivo(strArquivoNFeProc);
                                }

                                break;

                            //danasa 11-4-2012
                            case "110":         //Uso Denegado
                            case "301":
                            case "302":
                            case "303":
                                if (File.Exists(strArquivoNFe))
                                {
                                    ///
                                    /// se o ERP copiou o arquivo da NFe para a pasta em Processamento, o Uninfe irá montar o XML de distribuicao, caso nao exista,
                                    /// e imprimir o DANFE
                                    ///
                                    ProcessaNFeDenegada(emp, oLerXml, strArquivoNFe, null, protNFeElemento.OuterXml);
                                }
                                //ProcessaNFeDenegada(emp, oLerXml, strArquivoNFe, retConsSitElemento.GetElementsByTagName("protNFe")[0].OuterXml, versao);
                                break;

                            default:
                                //Mover o XML da NFE a pasta de XML´s com erro
                                oAux.MoveArqErro(strArquivoNFe);
                                break;
                            }

                            //Deletar a NFE do arquivo de controle de fluxo
                            oFluxoNfe.ExcluirNfeFluxo(strChaveNFe);
                        }
                    }
                    break;

                    #endregion Nota fiscal autorizada

                    #region Nota fiscal cancelada

                case "101":     //Cancelamento Homologado ou Nfe Cancelada
                    goto case "100";

                    #endregion Nota fiscal cancelada

                    #region Nota fiscal Denegada

                case "110":     //NFe Denegada
                    goto case "100";

                case "301":     //NFe Denegada
                    goto case "100";

                case "302":     //NFe Denegada
                    goto case "100";

                case "205":     //Nfe já está denegada na base do SEFAZ
                    goto case "100";

                    #endregion Nota fiscal Denegada

                    #region Conteúdo para retirar a nota fiscal do fluxo

                case "TirarFluxo":
                    //Mover o XML da NFE a pasta de XML´s com erro
                    oAux.MoveArqErro(strArquivoNFe);

                    //Deletar a NFE do arquivo de controle de fluxo
                    oFluxoNfe.ExcluirNfeFluxo(strChaveNFe);
                    break;

                    #endregion Conteúdo para retirar a nota fiscal do fluxo

                default:
                    goto case "TirarFluxo";
                }
            }
        }
Example #29
0
        /// <summary>
        /// Envia o XML de cancelamento de nota fiscal
        /// </summary>
        /// <remarks>
        /// Atualiza a propriedade this.vNfeRetorno da classe com o conteúdo
        /// XML com o retorno que foi dado do serviço do WebService.
        /// No caso do Cancelamento se tudo estiver correto retorna um XML
        /// dizendo se foi cancelado corretamente ou não.
        /// Se der algum erro ele grava um arquivo txt com o erro em questão.
        /// </remarks>
        /// <example>
        /// oUniNfe.vXmlNfeDadosMsg = "c:\teste-ped-sit.xml";
        /// oUniNfe.Consulta();//
        /// this.textBox_xmlretorno.Text = oUniNfe.vNfeRetorno;
        /// //
        /// //O conteúdo de retorno vai ser algo mais ou menos assim:
        /// //
        /// //<?xml version="1.0" encoding="UTF-8" ?> 
        /// //<retCancNFe xmlns="http://www.portalfiscal.inf.br/nfe" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.portalfiscal.inf.br/nfe retCancNFe_v1.07.xsd" versao="1.07">
        /// //   <infCanc>
        /// //      <tpAmb>2</tpAmb> 
        /// //      <verAplic>1.10</verAplic> 
        /// //      <cStat>101</cStat> 
        /// //      <xMotivo>Cancelamento de NF-e homologado</xMotivo> 
        /// //      <cUF>51</cUF> 
        /// //      <chNFe>51080612345678901234550010000001041671821888</chNFe> 
        /// //      <dhRecbto>2008-07-01T16:37:22</dhRecbto> 
        /// //      <nProt>151080000197648</nProt> 
        /// //   </infCanc>
        /// //</retCancNFe>
        /// </example>
        /// <by>Wandrey Mundin Ferreira</by>
        /// <date>01/07/2008</date>
        public override void Cancelamento()
        {
            int emp = new FindEmpresaThread(Thread.CurrentThread).Index;

            //Definir o serviço que será executado para a classe
            Servico = Servicos.CancelarNFe;

            try
            {
                //Ler o XML para pegar parâmetros de envio
                LerXML oLer = new LerXML();
                oLer.PedCanc(NomeArquivoXML);

                if (this.vXmlNfeDadosMsgEhXML)
                {
                    //Definir o objeto do WebService
                    WebServiceProxy wsProxy = ConfiguracaoApp.DefinirWS(Servicos.CancelarNFe, emp, oLer.oDadosPedCanc.cUF, oLer.oDadosPedCanc.tpAmb, oLer.oDadosPedCanc.tpEmis);

                    //Criar objetos das classes dos serviços dos webservices do SEFAZ
                    object oCancelamento = wsProxy.CriarObjeto(NomeClasseWS(Servico, oLer.oDadosPedCanc.cUF));
                    object oCabecMsg = wsProxy.CriarObjeto(NomeClasseCabecWS());

                    //Atribuir conteúdo para duas propriedades da classe nfeCabecMsg
                    wsProxy.SetProp(oCabecMsg, "cUF", oLer.oDadosPedCanc.cUF.ToString());
                    wsProxy.SetProp(oCabecMsg, "versaoDados", ConfiguracaoApp.VersaoXMLCanc);

                    //Criar objeto da classe de assinatura digita
                    AssinaturaDigital oAD = new AssinaturaDigital();

                    //Assinar o XML
                    oAD.Assinar(NomeArquivoXML, emp, Convert.ToInt32(oLer.oDadosPedCanc.cUF));

                    //Invocar o método que envia o XML para o SEFAZ
                    oInvocarObj.Invocar(wsProxy, oCancelamento, NomeMetodoWS(Servico, oLer.oDadosPedCanc.cUF), oCabecMsg, this, "-ped-can", "-can");

                    //Ler o retorno do webservice
                    LerRetornoCanc(NomeArquivoXML);
                }
                else
                {
                    //Gerar o XML de solicitação de cancelamento de uma NFe a partir do TXT Gerado pelo ERP
                    oGerarXML.Cancelamento(Path.GetFileNameWithoutExtension(NomeArquivoXML) + ".xml",
                        oLer.oDadosPedCanc.tpAmb,
                        oLer.oDadosPedCanc.tpEmis,
                        oLer.oDadosPedCanc.chNFe,
                        oLer.oDadosPedCanc.nProt,
                        oLer.oDadosPedCanc.xJust);
                }
            }
            catch (Exception ex)
            {
                string ExtRet = string.Empty;

                if (this.vXmlNfeDadosMsgEhXML) //Se for XML
                    ExtRet = Propriedade.ExtEnvio.PedCan_XML;
                else //Se for TXT
                    ExtRet = Propriedade.ExtEnvio.PedCan_TXT;

                try
                {
                    //Gravar o arquivo de erro de retorno para o ERP, caso ocorra
                    GravarArqErroServico(NomeArquivoXML, ExtRet, Propriedade.ExtRetorno.Can_ERR, ex);
                }
                catch
                {
                    //Se falhou algo na hora de gravar o retorno .ERR (de erro) para o ERP, infelizmente não posso fazer mais nada.
                    //Wandrey 09/03/2010
                }
            }
            finally
            {
                try
                {
                    if (!this.vXmlNfeDadosMsgEhXML) //Se for o TXT para ser transformado em XML, vamos excluir o TXT depois de gerado o XML
                        Functions.DeletarArquivo(NomeArquivoXML);
                }
                catch
                {
                    //Se falhou algo na hora de deletar o XML de cancelamento de NFe, infelizmente
                    //não posso fazer mais nada, o UniNFe vai tentar mandar o arquivo novamente para o webservice, pois ainda não foi excluido.
                    //Wandrey 09/03/2010
                }
            }
        }
        /// <summary>
        /// Faz a leitura do XML de pedido de consulta da situação da NFe
        /// </summary>
        /// <param name="arquivoXML">Nome do XML a ser lido</param>
        /// <param name="emp">Código da empresa</param>
        /*private void PedSit(int emp, string arquivoXML)
        {
            this.dadosPedSit.tpAmb = Empresas.Configuracoes[emp].AmbienteCodigo;
            this.dadosPedSit.chNFe = string.Empty;

            XmlDocument doc = new XmlDocument();
            doc.Load(arquivoXML);

            XmlNodeList consSitNFeList = doc.GetElementsByTagName("consSitCTe");

            foreach (XmlNode consSitNFeNode in consSitNFeList)
            {
                XmlElement consSitNFeElemento = (XmlElement)consSitNFeNode;

                dadosPedSit.tpAmb = Convert.ToInt32("0" + consSitNFeElemento.GetElementsByTagName(TpcnResources.tpAmb.ToString())[0].InnerText);
                dadosPedSit.chNFe = consSitNFeElemento.GetElementsByTagName(TpcnResources.chCTe.ToString())[0].InnerText;

                if (consSitNFeElemento.GetElementsByTagName(TpcnResources.tpEmis.ToString()).Count != 0)
                {
                    this.dadosPedSit.tpEmis = Convert.ToInt16(consSitNFeElemento.GetElementsByTagName(TpcnResources.tpEmis.ToString())[0].InnerText);
                    /// para que o validador não rejeite, excluo a tag <tpEmis>
                    doc.DocumentElement.RemoveChild(consSitNFeElemento.GetElementsByTagName(TpcnResources.tpEmis.ToString())[0]);
                    /// salvo o arquivo modificado
                    doc.Save(arquivoXML);
                }
            }
        }*/
        #endregion

        #region LerRetornoSitCTe()
        /// <summary>
        /// Ler o retorno da consulta situação da nota fiscal e de acordo com o status ele trata as notas enviadas se ainda não foram tratadas
        /// </summary>
        /// <param name="ChaveCTe">Chave da NFe que está sendo consultada</param>
        /// <remarks>
        /// Autor: Wandrey Mundin Ferreira
        /// Data: 16/06/2010
        /// </remarks>
        private void LerRetornoSitCTe(string ChaveCTe)
        {
            int emp = Empresas.FindEmpresaByThread();

            oGerarXML.XmlDistEventoCTe(emp, this.vStrXmlRetorno);  //<<<danasa 6-2011


            LerXML oLerXml = new LerXML();
            MemoryStream msXml = Functions.StringXmlToStream(vStrXmlRetorno);

            FluxoNfe oFluxoNfe = new FluxoNfe();

            XmlDocument doc = new XmlDocument();
            doc.Load(msXml);

            XmlNodeList retConsSitList = doc.GetElementsByTagName("retConsSitCTe");

            foreach (XmlNode retConsSitNode in retConsSitList)
            {
                XmlElement retConsSitElemento = (XmlElement)retConsSitNode;

                //Definir a chave da NFe a ser pesquisada
                string strChaveCTe = "CTe" + ChaveCTe;

                //Definir o nome do arquivo da NFe e seu caminho
                string strNomeArqCTe = oFluxoNfe.LerTag(strChaveCTe, FluxoNfe.ElementoFixo.ArqNFe);

                if (string.IsNullOrEmpty(strNomeArqCTe))
                {
                    strNomeArqCTe = strChaveCTe.Substring(3) + Propriedade.ExtEnvio.Cte;
                }

                string strArquivoCTe = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + strNomeArqCTe;

                #region CNPJ da chave não é de uma empresa Uninfe
                bool notDaEmpresa = (ChaveCTe.Substring(6, 14) != Empresas.Configuracoes[emp].CNPJ ||
                                    ChaveCTe.Substring(0, 2) != Empresas.Configuracoes[emp].UnidadeFederativaCodigo.ToString());

                if (!File.Exists(strArquivoCTe) && notDaEmpresa)
                    return;
                #endregion

                //Pegar o status de retorno da NFe que está sendo consultada a situação
                var cStatCons = string.Empty;
                if (retConsSitElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null)
                {
                    cStatCons = retConsSitElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0].InnerText;
                }

                switch (cStatCons)
                {
                    #region Rejeições do XML de consulta do recibo (Não é o lote que foi rejeitado e sim o XML de consulta do recibo)
                    case "280": //A-Certificado transmissor inválido
                    case "281": //A-Validade do certificado
                    case "283": //A-Verifica a cadeia de Certificação
                    case "286": //A-LCR do certificado de Transmissor
                    case "284": //A-Certificado do Transmissor revogado
                    case "285": //A-Certificado Raiz difere da "IPC-Brasil"
                    case "282": //A-Falta a extensão de CNPJ no Certificado
                    case "214": //B-Tamanho do XML de dados superior a 500 Kbytes
                    case "243": //B-XML de dados mal formatado
                    case "108": //B-Verifica se o Serviço está paralisado momentaneamente
                    case "109": //B-Verifica se o serviço está paralisado sem previsão
                    case "242": //C-Elemento nfeCabecMsg inexistente no SOAP Header
                    case "409": //C-Campo cUF inexistente no elemento nfeCabecMsg do SOAP Header
                    case "410": //C-Campo versaoDados inexistente no elemento nfeCabecMsg do SOAP
                    case "411": //C-Campo versaoDados inexistente no elemento nfeCabecMsg do SOAP
                    case "238": //C-Versão dos Dados informada é superior à versão vigente
                    case "239": //C-Versão dos Dados não suportada
                    case "215": //D-Verifica schema XML da área de dados
                    case "404": //D-Verifica o uso de prefixo no namespace
                    case "402": //D-XML utiliza codificação diferente de UTF-8
                    case "252": //E-Tipo do ambiente da NF-e difere do ambiente do web service
                    case "226": //E-UF da Chave de Acesso difere da UF do Web Service
                    case "236": //E-Valida DV da Chave de Acesso
                    case "216": //E-Verificar se campo "Codigo Numerico"
                        break;
                    #endregion

                    #region Nota fiscal rejeitada
                    case "217": //J-NFe não existe na base de dados do SEFAZ
                        goto case "TirarFluxo";
                    #endregion

                    #region Nota fiscal autorizada
                    case "100": //Autorizado o uso da NFe
                    case "150":
                        XmlNodeList infConsSitList = retConsSitElemento.GetElementsByTagName("infProt");
                        if (infConsSitList != null)
                        {
                            foreach (XmlNode infConsSitNode in infConsSitList)
                            {
                                XmlElement infConsSitElemento = (XmlElement)infConsSitNode;

                                //Pegar o Status do Retorno da consulta situação
                                string strStat = Functions.LerTag(infConsSitElemento, TpcnResources.cStat.ToString()).Replace(";", "");

                                switch (strStat)
                                {
                                    case "100":
                                    case "150":
                                        var strProtNfe = retConsSitElemento.GetElementsByTagName("protCTe")[0].OuterXml;

                                        //Definir o nome do arquivo -procNfe.xml                                               
                                        string strArquivoNFeProc = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                                    PastaEnviados.EmProcessamento.ToString() + "\\" +
                                                                    Functions.ExtrairNomeArq(strArquivoCTe, Propriedade.ExtEnvio.Cte) + Propriedade.ExtRetorno.ProcCTe;

                                        //Se existir o strArquivoNfe, tem como eu fazer alguma coisa, se ele não existir
                                        //Não tenho como fazer mais nada. Wandrey 08/10/2009
                                        if (File.Exists(strArquivoCTe))
                                        {
                                            //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s autorizados
                                            oLerXml.Cte(strArquivoCTe);

                                            //Verificar se a -nfe.xml existe na pasta de autorizados
                                            bool NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoCTe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Cte, Propriedade.ExtEnvio.Cte);

                                            //Verificar se o -procNfe.xml existe na past de autorizados
                                            bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoCTe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Cte, Propriedade.ExtRetorno.ProcCTe);

                                            //Se o XML de distribuição não estiver na pasta em processamento
                                            if (!procNFeJaNaAutorizada && !File.Exists(strArquivoNFeProc))
                                            {
                                                oGerarXML.XmlDistCTe(strArquivoCTe, strProtNfe);
                                            }

                                            //Se o XML de distribuição não estiver ainda na pasta de autorizados
                                            if (!(procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoCTe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Cte, Propriedade.ExtRetorno.ProcCTe)))
                                            {
                                                //Move a nfeProc da pasta de NFE em processamento para a NFe Autorizada
                                                TFunctions.MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);
                                            }

                                            //Se a NFe não existir ainda na pasta de autorizados
                                            if (!(NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoCTe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Cte, Propriedade.ExtEnvio.Cte)))
                                            {
                                                //Mover a NFE da pasta de NFE em processamento para NFe Autorizada
                                                TFunctions.MoverArquivo(strArquivoCTe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);
                                            }
                                            else
                                            {
                                                //Se já estiver na pasta de autorizados, vou somente excluir ela da pasta de XML´s em processamento
                                                Functions.DeletarArquivo(strArquivoCTe);
                                            }

                                            //Disparar a geração/impressao do UniDanfe. 03/02/2010 - Wandrey
                                            if (procNFeJaNaAutorizada)
                                                try
                                                {
                                                    var strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                                            PastaEnviados.Autorizados.ToString() + "\\" +
                                                                            Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) +
                                                                            Path.GetFileName(strArquivoNFeProc);
                                                    TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]);
                                                }
                                                catch (Exception ex)
                                                {
                                                    Auxiliar.WriteLog("TaskCTeConsultaSituacao: " + ex.Message, false);
                                                }
                                        }

                                        if (File.Exists(strArquivoNFeProc))
                                        {
                                            //Se já estiver na pasta de autorizados, vou somente excluir ela da pasta de XML´s em processamento
                                            Functions.DeletarArquivo(strArquivoNFeProc);
                                        }

                                        break;

                                    case "301":
                                        //Ler o XML para pegar a data de emissão para criar a psta dos XML´s Denegados
                                        if (File.Exists(strArquivoCTe))
                                        {
                                            oLerXml.Cte(strArquivoCTe);

                                            //Move a NFE da pasta de NFE em processamento para NFe Denegadas
                                            if (!oAux.EstaDenegada(strArquivoCTe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Cte, Propriedade.ExtRetorno.Den))
                                            {
                                                TFunctions.MoverArquivo(strArquivoCTe, PastaEnviados.Denegados, oLerXml.oDadosNfe.dEmi);
                                                ///
                                                /// existe DACTE de CTe denegado???
                                                /// 
                                                try
                                                {
                                                    var strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                                            PastaEnviados.Denegados.ToString() + "\\" +
                                                                            Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) +
                                                                            Functions.ExtrairNomeArq(strArquivoCTe, Propriedade.ExtEnvio.Cte) + Propriedade.ExtRetorno.Den;

                                                    TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]);
                                                }
                                                catch (Exception ex)
                                                {
                                                    Auxiliar.WriteLog("TaskCTeConsultaSituacao: " + ex.Message, false);
                                                }
                                            }
                                        }

                                        break;

                                    case "302":
                                        goto case "301";

                                    case "303":
                                        goto case "301";

                                    case "304":
                                        goto case "301";

                                    case "305":
                                        goto case "301";

                                    case "306":
                                        goto case "301";

                                    case "110": //Uso Denegado
                                        goto case "301";

                                    default:
                                        //Mover o XML da NFE a pasta de XML´s com erro
                                        oAux.MoveArqErro(strArquivoCTe);
                                        break;
                                }

                                //Deletar a NFE do arquivo de controle de fluxo
                                oFluxoNfe.ExcluirNfeFluxo(strChaveCTe);
                            }
                        }
                        break;
                    #endregion

                    #region Nota fiscal cancelada
                    case "101": //Cancelamento Homologado ou Nfe Cancelada
                        goto case "100";
                    #endregion

                    #region Nota fiscal Denegada
                    case "110": //NFe Denegada
                        goto case "100";

                    case "301": //NFe Denegada
                        goto case "100";

                    case "302": //NFe Denegada
                        goto case "100";

                    case "303": //NFe Denegada
                        goto case "100";

                    case "304": //NFe Denegada
                        goto case "100";

                    case "305": //NFe Denegada
                        goto case "100";

                    case "306": //NFe Denegada
                        goto case "100";
                    #endregion

                    #region Conteúdo para retirar a nota fiscal do fluxo
                    case "TirarFluxo":
                        //Mover o XML da NFE a pasta de XML´s com erro
                        oAux.MoveArqErro(strArquivoCTe);

                        //Deletar a NFE do arquivo de controle de fluxo
                        oFluxoNfe.ExcluirNfeFluxo(strChaveCTe);
                        break;
                    #endregion

                    default:
                        break;
                }
            }

        }
Example #31
0
        protected void ProcessaNFeDenegada(int emp, LerXML oLerXml, string strArquivoNFe, string protNFe, string versao)
        {
            string strProtNfe;

            if (!File.Exists(strArquivoNFe))
                throw new Exception("Arquivo \"" + strArquivoNFe + "\" não encontrado");

            oLerXml.Nfe(strArquivoNFe);
            string nomePastaEnviado = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                        PastaEnviados.Denegados.ToString() + "\\" +
                                        Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi);
            string dArquivo = Path.Combine(nomePastaEnviado, Path.GetFileName(strArquivoNFe).Replace(Propriedade.ExtEnvio.Nfe, Propriedade.ExtRetorno.Den));
            string strNomeArqDenegadaNFe = dArquivo;
            string arqDen = dArquivo;

            //danasa 11-4-2012
            bool addNFeDen = true;
            if (File.Exists(dArquivo))
            {
                // verifica se a NFe já tem protocolo gravado
                // só para atualizar notas denegadas que ainda não tem o protocolo atualizado 
                // e que já estao na pasta de notas denegadas.
                // Para futuras notas denegadas esta propriedade sempre será false
                if (File.ReadAllText(dArquivo).IndexOf("<protNFe>") > 0)
                    addNFeDen = false;
            }
            if (addNFeDen)
            {
                ///
                /// monta o XML de denegacao
                strProtNfe = protNFe;
                ///
                /// gera o arquivo de denegacao na pasta EmProcessamento
                strNomeArqDenegadaNFe = oGerarXML.XmlDistNFe(strArquivoNFe, strProtNfe, Propriedade.ExtRetorno.Den, versao);
                if (string.IsNullOrEmpty(strNomeArqDenegadaNFe))
                    throw new Exception("Erro de criação do arquivo de distribuição da nota denegada");

                ///
                /// exclui o XML denegado, se existir
                Functions.DeletarArquivo(dArquivo);
                ///
                /// Move a NFE-denegada da pasta em processamento para NFe Denegadas
                TFunctions.MoverArquivo(strNomeArqDenegadaNFe, PastaEnviados.Denegados, oLerXml.oDadosNfe.dEmi);
                ///
                /// verifica se o arquivo da NFe já existe na pasta denegadas
                dArquivo = Path.Combine(nomePastaEnviado, Path.GetFileName(strArquivoNFe));

                if (!File.Exists(dArquivo))
                {
                    if (!string.IsNullOrEmpty(Empresas.Configuracoes[emp].PastaBackup))
                    {
                        //Criar Pasta do Mês para gravar arquivos enviados
                        string nomePastaBackup = Empresas.Configuracoes[emp].PastaBackup + "\\" +
                                                    PastaEnviados.Denegados + "\\" +
                                                    Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi);
                        if (!Directory.Exists(nomePastaBackup))
                            System.IO.Directory.CreateDirectory(nomePastaBackup);

                        //Se conseguiu criar a pasta ele move o arquivo, caso contrário
                        if (Directory.Exists(nomePastaBackup))
                        {
                            //Mover o arquivo da nota fiscal para a pasta de backup
                            string destinoBackup = Path.Combine(nomePastaBackup, Path.GetFileName(strArquivoNFe));
                            Functions.DeletarArquivo(destinoBackup);
                            File.Copy(strArquivoNFe, destinoBackup);
                        }
                        else
                        {
                            //throw new Exception("Pasta de backup informada nas configurações não existe. (Pasta: " + nomePastaBackup + ")");
                        }
                    }
                    // move o arquivo NFe para a pasta Denegada
                    File.Move(strArquivoNFe, dArquivo);
                }
            }
            try
            {
                TFunctions.ExecutaUniDanfe(arqDen, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]);
            }
            catch (Exception ex)
            {
                Auxiliar.WriteLog("ProcessaDenegada: " + ex.Message, false);
            }
        }
Example #32
0
        /// <summary>
        /// Efetua a leitura do XML de retorno do processamento do lote de notas fiscais e 
        /// atualiza o arquivo de fluxo e envio de notas
        /// </summary>
        /// <by>Wandrey Mundin Ferreira</by>
        /// <date>20/04/2009</date>
        /// 
#if notused
        protected override void LerRetornoLoteCTe()
        {
            int emp = new FindEmpresaThread(Thread.CurrentThread).Index;
            var oLerXml = new LerXML();
            var msXml = Functions.StringXmlToStream(vStrXmlRetorno);

            var fluxoNFe = new FluxoNfe();

            try
            {
                var doc = new XmlDocument();
                doc.Load(msXml);

                var retConsReciNFeList = doc.GetElementsByTagName("retConsReciCTe");

                foreach (XmlNode retConsReciNFeNode in retConsReciNFeList)
                {
                    var retConsReciNFeElemento = (XmlElement)retConsReciNFeNode;

                    //Pegar o número do recibo do lote enviado
                    var nRec = string.Empty;
                    if (retConsReciNFeElemento.GetElementsByTagName("nRec")[0] != null)
                    {
                        nRec = retConsReciNFeElemento.GetElementsByTagName("nRec")[0].InnerText;
                    }

                    //Pegar o status de retorno do lote enviado
                    var cStatLote = string.Empty;
                    if (retConsReciNFeElemento.GetElementsByTagName("cStat")[0] != null)
                    {
                        cStatLote = retConsReciNFeElemento.GetElementsByTagName("cStat")[0].InnerText;
                    }

                    switch (cStatLote)
                    {
                        #region Rejeições do XML de consulta do recibo (Não é o lote que foi rejeitado e sim o XML de consulta do recibo)
                        case "280": //A-Certificado transmissor inválido
                        case "281": //A-Validade do certificado
                        case "283": //A-Verifica a cadeia de Certificação
                        case "286": //A-LCR do certificado de Transmissor
                        case "284": //A-Certificado do Transmissor revogado
                        case "285": //A-Certificado Raiz difere da "IPC-Brasil"
                        case "282": //A-Falta a extensão de CNPJ no Certificado
                        case "214": //B-Tamanho do XML de dados superior a 500 Kbytes
                        case "243": //B-XML de dados mal formatado
                        case "108": //B-Verifica se o Serviço está paralisado momentaneamente
                        case "109": //B-Verifica se o serviço está paralisado sem previsão
                        case "242": //C-Elemento nfeCabecMsg inexistente no SOAP Header
                        case "409": //C-Campo cUF inexistente no elemento nfeCabecMsg do SOAP Header
                        case "410": //C-Campo versaoDados inexistente no elemento nfeCabecMsg do SOAP
                        case "411": //C-Campo versaoDados inexistente no elemento nfeCabecMsg do SOAP
                        case "238": //C-Versão dos Dados informada é superior à versão vigente
                        case "239": //C-Versão dos Dados não suportada
                        case "215": //D-Verifica schema XML da área de dados
                        case "404": //D-Verifica o uso de prefixo no namespace
                        case "402": //D-XML utiliza codificação diferente de UTF-8
                        case "252": //E-Tipo do ambiente da NF-e difere do ambiente do web service
                        case "226": //E-UF da Chave de Acesso difere da UF do Web Service
                        case "236": //E-Valida DV da Chave de Acesso
                        case "217": //E-Acesso BD CTE
                        case "216": //E-Verificar se campo "Codigo Numerico"
                            break;
                        #endregion

                        #region Lote ainda está sendo processado
                        case "105": //E-Verifica se o lote não está na fila de resposta, mas está na fila de entrada (Lote em processamento)
                            //Ok vou aguardar o ERP gerar uma nova consulta para encerrar o fluxo da nota
                            break;
                        #endregion

                        #region Lote não foi localizado pelo recibo que está sendo consultado
                        case "106": //E-Verifica se o lote não está na fila de saída, nem na fila de entrada (Lote não encontrado)
                            //No caso do lote não encontrado através do recibo, o ERP vai ter que consultar a situação da NFe para encerrar ela
                            //Vou somente excluir ela do fluxo para não ficar consultando o recibo que não existe
                            if (nRec != string.Empty)
                            {
                                fluxoNFe.ExcluirNfeFluxoRec(nRec.Trim());
                            }
                            break;
                        #endregion

                        #region Lote foi processado, agora tenho que tratar as notas fiscais dele
                        case "104": //Lote processado
                            var protNFeList = retConsReciNFeElemento.GetElementsByTagName("protCTe");

                            foreach (XmlNode protNFeNode in protNFeList)
                            {
                                var protNFeElemento = (XmlElement)protNFeNode;

                                var strProtNfe = protNFeElemento.OuterXml;

                                var infProtList = protNFeElemento.GetElementsByTagName("infProt");

                                foreach (XmlNode infProtNode in infProtList)
                                {
                                    var infProtElemento = (XmlElement)infProtNode;

                                    var strChaveNFe = string.Empty;
                                    var strStat = string.Empty;

                                    if (infProtElemento.GetElementsByTagName("chCTe")[0] != null)
                                    {
                                        strChaveNFe = "CTe" + infProtElemento.GetElementsByTagName("chCTe")[0].InnerText;
                                    }

                                    if (infProtElemento.GetElementsByTagName("cStat")[0] != null)
                                    {
                                        strStat = infProtElemento.GetElementsByTagName("cStat")[0].InnerText;
                                    }

                                    //Definir o nome do arquivo da NFe e seu caminho
                                    var strNomeArqNfe = fluxoNFe.LerTag(strChaveNFe, FluxoNfe.ElementoFixo.ArqNFe);

                                    // danasa 8-2009
                                    // se por algum motivo o XML não existir no "Fluxo", então o arquivo tem que existir
                                    // na pasta "EmProcessamento" assinada.
                                    if (string.IsNullOrEmpty(strNomeArqNfe))
                                    {
                                        if (string.IsNullOrEmpty(strChaveNFe))
                                            throw new Exception("LerRetornoLoteCTe(): Não pode obter o nome do arquivo");

                                        strNomeArqNfe = strChaveNFe.Substring(3) + Propriedade.ExtEnvio.Nfe;
                                    }
                                    var strArquivoNFe = Empresa.Configuracoes[emp].PastaEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + strNomeArqNfe;

                                    //Atualizar a Tag de status da NFe no fluxo para que se ocorrer alguma falha na exclusão eu tenha esta campo para ter uma referencia em futuras consultas
                                    fluxoNFe.AtualizarTag(strChaveNFe, FluxoNfe.ElementoEditavel.cStat, strStat);

                                    //Atualizar a tag da data e hora da ultima consulta do recibo
                                    fluxoNFe.AtualizarDPedRec(nRec, DateTime.Now);

                                    switch (strStat)
                                    {
                                        case "100": //NFe Autorizada
                                            if (File.Exists(strArquivoNFe))
                                            {
                                                //Juntar o protocolo com a NFE já copiando para a pasta de autorizadas
                                                oGerarXML.XmlDistNFe(strArquivoNFe, strProtNfe, Propriedade.ExtRetorno.ProcNFe);
                                                var strArquivoNFeProc = Empresa.Configuracoes[emp].PastaEnviado + "\\" +
                                                                        PastaEnviados.EmProcessamento.ToString() + "\\" +
                                                                        Functions/*oAux*/.ExtrairNomeArq(strNomeArqNfe, Propriedade.ExtEnvio.Nfe) + Propriedade.ExtRetorno.ProcNFe;

                                                //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s autorizados
                                                oLerXml.Nfe(strArquivoNFe);

                                                //Mover a nfePRoc da pasta de NFE em processamento para a NFe Autorizada
                                                //Para envitar falhar, tenho que mover primeiro o XML de distribuição (-procnfe.xml) para
                                                //depois mover o da nfe (-nfe.xml), pois se ocorrer algum erro, tenho como reconstruir o senário, 
                                                //assim sendo não inverta as posições. Wandrey 08/10/2009
                                                MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);

                                                //Mover a NFE da pasta de NFE em processamento para NFe Autorizada
                                                //Para envitar falhar, tenho que mover primeiro o XML de distribuição (-procnfe.xml) para 
                                                //depois mover o da nfe (-nfe.xml), pois se ocorrer algum erro, tenho como reconstruir o senário.
                                                //assim sendo não inverta as posições. Wandrey 08/10/2009
                                                MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);

                                                //Disparar a geração/impressçao do UniDanfe. 03/02/2010 - Wandrey
                                                //ExecutaUniDanfe(strNomeArqNfe, oLerXml.oDadosNfe.dEmi);
                                            }
                                            break;

                                        case "301": //NFe Denegada - Irregularidade fiscal do emitente
                                            if (File.Exists(strArquivoNFe))
                                            {
                                                //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s Denegados
                                                oLerXml.Nfe(strArquivoNFe);

                                                //Mover a NFE da pasta de NFE em processamento para NFe Denegadas
                                                MoverArquivo(strArquivoNFe, PastaEnviados.Denegados, oLerXml.oDadosNfe.dEmi);
                                            }
                                            break;

                                        case "302": //NFe Denegada - Irregularidade fiscal do remetente
                                            goto case "301";

                                        case "303": //NFe Denegada - Irregularidade fiscal do destinatário
                                            goto case "301";

                                        case "304": //NFe Denegada - Irregularidade fiscal do expedidor
                                            goto case "301";

                                        case "305": //NFe Denegada - Irregularidade fiscal do recebedor
                                            goto case "301";

                                        case "306": //NFe Denegada - Irregularidade fiscal do tomador
                                            goto case "301";

                                        case "110": //NFe Denegada - Não sei quando ocorre este, mas descobrir ele no manual então estou incluindo. Wandrey 20/10/2009
                                            goto case "301";

                                        default: //NFe foi rejeitada
                                            //Mover o XML da NFE a pasta de XML´s com erro
                                            oAux.MoveArqErro(strArquivoNFe);
                                            break;
                                    }

                                    //Deletar a NFE do arquivo de controle de fluxo
                                    fluxoNFe.ExcluirNfeFluxo(strChaveNFe);
                                    break;
                                }
                            }
                            break;
                        #endregion

                        #region Qualquer outro tipo de status que não for os acima relacionados, vai tirar a nota fiscal do fluxo.
                        default:
                            //Qualquer outro tipo de rejeião vou tirar todas as notas do lote do fluxo, pois se o lote foi rejeitado, todas as notas fiscais também foram
                            //De acordo com o manual de integração se o status do lote não for 104, tudo foi rejeitado. Wandrey 20/07/2010

                            //Vou retirar as notas do fluxo pelo recibo
                            if (nRec != string.Empty)
                            {
                                fluxoNFe.ExcluirNfeFluxoRec(nRec.Trim());
                            }

                            break;
                        #endregion
                    }
                }
            }
            catch (Exception ex)
            {
                throw (ex);
            }
        }
Example #33
0
        /// <summary>
        /// Finalizar o envio da NFe
        /// </summary>
        public void FinalizarNFe(XmlNodeList protNFeList, FluxoNfe fluxoNFe, int emp)
        {
            var oLerXml = new LerXML();

            foreach (XmlNode protNFeNode in protNFeList)
            {
                var protNFeElemento = (XmlElement)protNFeNode;
                string versao = protNFeElemento.GetAttribute(NFe.Components.TpcnResources.versao.ToString());

                var strProtNfe = protNFeElemento.OuterXml;

                var infProtList = protNFeElemento.GetElementsByTagName("infProt");

                foreach (XmlNode infProtNode in infProtList)
                {
                    bool tirarFluxo = true;
                    var infProtElemento = (XmlElement)infProtNode;

                    var strChaveNFe = string.Empty;
                    var strStat = string.Empty;

                    if (infProtElemento.GetElementsByTagName(NFe.Components.TpcnResources.chNFe.ToString())[0] != null)
                    {
                        strChaveNFe = "NFe" + infProtElemento.GetElementsByTagName(NFe.Components.TpcnResources.chNFe.ToString())[0].InnerText;
                    }

                    if (infProtElemento.GetElementsByTagName(NFe.Components.TpcnResources.cStat.ToString())[0] != null)
                    {
                        strStat = infProtElemento.GetElementsByTagName(NFe.Components.TpcnResources.cStat.ToString())[0].InnerText;
                    }

                    //Definir o nome do arquivo da NFe e seu caminho
                    var strNomeArqNfe = fluxoNFe.LerTag(strChaveNFe, FluxoNfe.ElementoFixo.ArqNFe);

                    // danasa 8-2009
                    // se por algum motivo o XML não existir no "Fluxo", então o arquivo tem que existir
                    // na pasta "EmProcessamento" assinada.
                    if (string.IsNullOrEmpty(strNomeArqNfe))
                    {
                        if (string.IsNullOrEmpty(strChaveNFe))
                            throw new Exception("LerRetornoLoteNFe(): Não pode obter o nome do arquivo");

                        strNomeArqNfe = strChaveNFe.Substring(3) + Propriedade.ExtEnvio.Nfe;
                    }
                    var strArquivoNFe = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                        PastaEnviados.EmProcessamento.ToString() + "\\" +
                        strNomeArqNfe;

                    //Atualizar a Tag de status da NFe no fluxo para que se ocorrer alguma falha na exclusão eu tenha esta campo para ter uma referencia em futuras consultas
                    fluxoNFe.AtualizarTag(strChaveNFe, FluxoNfe.ElementoEditavel.cStat, strStat);

                    switch (strStat)
                    {
                        case "100": //NFe Autorizada
                        case "150": //NFe Autorizada fora do prazo
                            if (File.Exists(strArquivoNFe))
                            {
                                //Juntar o protocolo com a NFE já copiando para a pasta de autorizadas
                                var strArquivoNFeProc = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                        PastaEnviados.EmProcessamento.ToString() + "\\" +
                                                        Functions.ExtrairNomeArq(strNomeArqNfe, Propriedade.ExtEnvio.Nfe) +
                                                        Propriedade.ExtRetorno.ProcNFe;

                                //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s autorizados
                                oLerXml.Nfe(strArquivoNFe);

                                //Verificar se a -nfe.xml existe na pasta de autorizados
                                bool NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Nfe, Propriedade.ExtEnvio.Nfe);

                                //Verificar se o -procNfe.xml existe na pasta de autorizados
                                bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Nfe, Propriedade.ExtRetorno.ProcNFe);

                                //Se o XML de distribuição não estiver na pasta de autorizados
                                if (!procNFeJaNaAutorizada)
                                {
                                    if (!File.Exists(strArquivoNFeProc))
                                    {
                                        Auxiliar.WriteLog("TaskNFeRetRecepcao: Gerou o arquivo de distribuição através da consulta recibo.", false);
                                        oGerarXML.XmlDistNFe(strArquivoNFe, strProtNfe, Propriedade.ExtRetorno.ProcNFe, versao);
                                    }
                                }

                                if (!(procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Nfe, Propriedade.ExtRetorno.ProcNFe)))
                                {
                                    //Mover a nfePRoc da pasta de NFE em processamento para a NFe Autorizada
                                    //Para enviar falhar, tenho que mover primeiro o XML de distribuição (-procnfe.xml) para
                                    //depois mover o da nfe (-nfe.xml), pois se ocorrer algum erro, tenho como reconstruir o senário, 
                                    //assim sendo não inverta as posições. Wandrey 08/10/2009
                                    TFunctions.MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);

                                    //Atualizar a situação para que eu só mova o arquivo com final -NFe.xml para a pasta autorizado se 
                                    //a procnfe já estiver lá, ou vai ficar na pasta emProcessamento para tentar gerar novamente.
                                    //Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012
                                    procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Nfe, Propriedade.ExtRetorno.ProcNFe);
                                }

                                if (!NFeJaNaAutorizada && procNFeJaNaAutorizada)
                                {
                                    //Mover a NFE da pasta de NFE em processamento para NFe Autorizada
                                    //Para enviar falhar, tenho que mover primeiro o XML de distribuição (-procnfe.xml) para 
                                    //depois mover o da nfe (-nfe.xml), pois se ocorrer algum erro, tenho como reconstruir o senário.
                                    //assim sendo não inverta as posições. Wandrey 08/10/2009
                                    TFunctions.MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);
                                }

                                //Disparar a geração/impressão do UniDanfe. 03/02/2010 - Wandrey
                                if (procNFeJaNaAutorizada)
                                {
                                    ///
                                    /// tem que passar o arquivo de distribuicao da nfe
                                    /// 
                                    string strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                                    PastaEnviados.Autorizados.ToString() + "\\" +
                                                                    Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) +
                                                                    Path.GetFileName(strArquivoNFeProc);
                                    try
                                    {
                                        TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]);
                                    }
                                    catch (Exception ex)
                                    {
                                        Auxiliar.WriteLog("TaskRecepcao: (Falha na execução do UniDANFe) " + ex.Message, false);
                                    }
                                }
                                //Vou verificar se estão os dois arquivos na pasta Autorizados, se tiver eu tiro do fluxo caso contrário não. Wandrey 13/02/2012
                                NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Nfe, Propriedade.ExtEnvio.Nfe);
                                procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.ExtEnvio.Nfe, Propriedade.ExtRetorno.ProcNFe);
                                if (!procNFeJaNaAutorizada || !NFeJaNaAutorizada)
                                {
                                    tirarFluxo = false;
                                }

                                ///
                                /// se o -nfe.xml já existe na pasta de autorizados e ele está na pasta em processamento, 
                                /// o exclui da pasta em processamento
                                if (NFeJaNaAutorizada && File.Exists(strArquivoNFe))
                                    File.Delete(strArquivoNFe);
                            }
                            else
                                Auxiliar.WriteLog("TaskRetRecepcao: (Foi efetuada uma consulta recibo e não foi localizado o arquivo da NFe ( " + strNomeArqNfe + ") na pasta EmProcessamento) ", false);

                            break;

                        case "110":
                        case "205":
                        case "301":
                        case "302":
                        case "303":
                            ProcessaNFeDenegada(emp, oLerXml, strArquivoNFe, protNFeElemento.OuterXml, versao);
                            break;

                        default: //NFe foi rejeitada
                            //O Status da NFe tem que ser maior que 1 ou deu algum erro na hora de ler o XML de retorno da consulta do recibo, sendo assim, vou mantar a nota no fluxo para consultar novamente.
                            if (Convert.ToInt32(strStat) >= 1)
                            {
                                Auxiliar.WriteLog("Arquivo: " + strNomeArqNfe + " codigo de retorno: " + strStat, false);
                                //Mover o XML da NFE a pasta de XML´s com erro
                                oAux.MoveArqErro(strArquivoNFe);
                            }
                            else
                                tirarFluxo = false;
                            break;
                    }

                    //Deletar a NFE do arquivo de controle de fluxo
                    if (tirarFluxo)
                        fluxoNFe.ExcluirNfeFluxo(strChaveNFe);

                    break;
                }
            }
        }
Example #34
0
        /// <summary>
        /// Efetua a leitura do XML de retorno do processamento do lote de notas fiscais e
        /// atualiza o arquivo de fluxo e envio de notas
        /// </summary>
        /// <by>Wandrey Mundin Ferreira</by>
        /// <date>20/04/2009</date>
        private void LerRetornoLoteMDFe()
        {
            int emp      = Empresas.FindEmpresaByThread();
            var oLerXml  = new LerXML();
            var msXml    = Functions.StringXmlToStreamUTF8(vStrXmlRetorno);
            var fluxoNFe = new FluxoNfe();

            var doc = new XmlDocument();

            doc.Load(msXml);

            var retConsReciNFeList = doc.GetElementsByTagName("retConsReciMDFe");

            foreach (XmlNode retConsReciNFeNode in retConsReciNFeList)
            {
                var retConsReciNFeElemento = (XmlElement)retConsReciNFeNode;

                //Pegar o número do recibo do lote enviado
                var nRec = string.Empty;
                if (retConsReciNFeElemento.GetElementsByTagName(TpcnResources.nRec.ToString())[0] != null)
                {
                    nRec = retConsReciNFeElemento.GetElementsByTagName(TpcnResources.nRec.ToString())[0].InnerText;
                }

                //Pegar o status de retorno do lote enviado
                var cStatLote = string.Empty;
                if (retConsReciNFeElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0] != null)
                {
                    cStatLote = retConsReciNFeElemento.GetElementsByTagName(TpcnResources.cStat.ToString())[0].InnerText;
                }

                switch (cStatLote)
                {
                    #region Rejeições do XML de consulta do recibo (Não é o lote que foi rejeitado e sim o XML de consulta do recibo)

                    #region Validação do certificado de transmissão
                case "280":
                case "281":
                case "282":
                case "283":
                case "284":
                case "285":
                case "286":
                    #endregion

                    #region Validação inicial da mensagem no webservice
                case "214":
                case "243":
                case "108":
                case "109":
                    #endregion

                    #region Validação das informações de controle da chamada ao webservice
                case "242":
                case "409":
                case "410":
                case "411":
                case "238":
                case "239":
                    #endregion

                    #region Validação da forma da área de dados
                case "215":
                case "598":
                case "599":
                case "404":
                case "402":
                    #endregion

                    #region Validação das regras de negócio da consulta recibo
                case "252":
                case "226":
                case "247":
                case "494":
                case "227":
                case "253":
                    #endregion
                    break;

                    #region Lote não foi localizado pelo recibo que está sendo consultado
                case "106":     //E-Verifica se o lote não está na fila de saída, nem na fila de entrada (Lote não encontrado)
                    //No caso do lote não encontrado através do recibo, o ERP vai ter que consultar a situação da NFe para encerrar ela
                    //Vou somente excluir ela do fluxo para não ficar consultando o recibo que não existe
                    if (nRec != string.Empty)
                    {
                        fluxoNFe.ExcluirNfeFluxoRec(nRec.Trim());
                    }
                    break;
                    #endregion

                    #endregion

                    #region Lote foi processado, agora tenho que tratar as notas fiscais dele
                case "104":     //Lote processado
                    var protNFeList = retConsReciNFeElemento.GetElementsByTagName("protMDFe");

                    foreach (XmlNode protNFeNode in protNFeList)
                    {
                        var protNFeElemento = (XmlElement)protNFeNode;

                        var strProtNfe = protNFeElemento.OuterXml;

                        var infProtList = protNFeElemento.GetElementsByTagName("infProt");

                        foreach (XmlNode infProtNode in infProtList)
                        {
                            bool tirarFluxo      = true;
                            var  infProtElemento = (XmlElement)infProtNode;

                            var strChaveNFe = string.Empty;
                            var strStat     = string.Empty;

                            if (infProtElemento.GetElementsByTagName(TpcnResources.chMDFe.ToString())[0] != null)
                            {
                                strChaveNFe = "MDFe" + infProtElemento.GetElementsByTagName(TpcnResources.chMDFe.ToString())[0].InnerText;
                            }

                            if (infProtElemento.GetElementsByTagName(NFe.Components.TpcnResources.cStat.ToString())[0] != null)
                            {
                                strStat = infProtElemento.GetElementsByTagName(NFe.Components.TpcnResources.cStat.ToString())[0].InnerText;
                            }

                            //Definir o nome do arquivo da NFe e seu caminho
                            var strNomeArqNfe = fluxoNFe.LerTag(strChaveNFe, FluxoNfe.ElementoFixo.ArqNFe);

                            // se por algum motivo o XML não existir no "Fluxo", então o arquivo tem que existir
                            // na pasta "EmProcessamento" assinada.
                            if (string.IsNullOrEmpty(strNomeArqNfe))
                            {
                                if (string.IsNullOrEmpty(strChaveNFe))
                                {
                                    throw new Exception("LerRetornoLoteMDFe(): Não pode obter o nome do arquivo");
                                }

                                strNomeArqNfe = strChaveNFe.Substring(4) + Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML;
                            }
                            var strArquivoNFe = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" + PastaEnviados.EmProcessamento.ToString() + "\\" + strNomeArqNfe;

                            //Atualizar a Tag de status da NFe no fluxo para que se ocorrer alguma falha na exclusão eu tenha esta campo para ter uma referencia em futuras consultas
                            fluxoNFe.AtualizarTag(strChaveNFe, FluxoNfe.ElementoEditavel.cStat, strStat);

                            //Atualizar a tag da data e hora da ultima consulta do recibo
                            fluxoNFe.AtualizarDPedRec(nRec, DateTime.Now);

                            switch (strStat)
                            {
                            case "100":         //MDFe Autorizado
                                if (File.Exists(strArquivoNFe))
                                {
                                    //Juntar o protocolo com a NFE já copiando para a pasta de autorizadas
                                    var strArquivoNFeProc = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                            PastaEnviados.EmProcessamento.ToString() + "\\" +
                                                            Functions.ExtrairNomeArq(strNomeArqNfe, Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML) + Propriedade.ExtRetorno.ProcMDFe;

                                    //Ler o XML para pegar a data de emissão para criar a pasta dos XML´s autorizados
                                    oLerXml.Mdfe(strArquivoNFe);

                                    //Verificar se a -nfe.xml existe na pasta de autorizados
                                    bool NFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML, Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML);

                                    //Verificar se o -procNfe.xml existe na past de autorizados
                                    bool procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML, Propriedade.ExtRetorno.ProcMDFe);

                                    //Se o XML de distribuição não estiver na pasta de autorizados
                                    if (!procNFeJaNaAutorizada)
                                    {
                                        if (!File.Exists(strArquivoNFeProc))
                                        {
                                            oGerarXML.XmlDistMDFe(strArquivoNFe, strProtNfe, Propriedade.ExtRetorno.ProcMDFe);
                                        }
                                    }

                                    if (!(procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML, Propriedade.ExtRetorno.ProcMDFe)))
                                    {
                                        //Mover a nfePRoc da pasta de NFE em processamento para a NFe Autorizada
                                        //Para envitar falhar, tenho que mover primeiro o XML de distribuição (-procnfe.xml) para
                                        //depois mover o da nfe (-nfe.xml), pois se ocorrer algum erro, tenho como reconstruir o senário,
                                        //assim sendo não inverta as posições. Wandrey 08/10/2009
                                        TFunctions.MoverArquivo(strArquivoNFeProc, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);

                                        //Atualizar a situação para que eu só mova o arquivo com final -NFe.xml para a pasta autorizado se
                                        //a procnfe já estiver lá, ou vai ficar na pasta emProcessamento para tentar gerar novamente.
                                        //Isso vai dar uma maior segurança para não deixar sem gerar o -procnfe.xml. Wandrey 13/12/2012
                                        procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML, Propriedade.ExtRetorno.ProcMDFe);
                                    }

                                    if (!NFeJaNaAutorizada && procNFeJaNaAutorizada)
                                    {
                                        //Mover a NFE da pasta de NFE em processamento para NFe Autorizada
                                        //Para envitar falhar, tenho que mover primeiro o XML de distribuição (-procnfe.xml) para
                                        //depois mover o da nfe (-nfe.xml), pois se ocorrer algum erro, tenho como reconstruir o senário.
                                        //assim sendo não inverta as posições. Wandrey 08/10/2009
                                        TFunctions.MoverArquivo(strArquivoNFe, PastaEnviados.Autorizados, oLerXml.oDadosNfe.dEmi);
                                    }

                                    //Disparar a geração/impressao do UniDanfe. 03/02/2010 - Wandrey
                                    if (procNFeJaNaAutorizada)
                                    {
                                        try
                                        {
                                            var strArquivoDist = Empresas.Configuracoes[emp].PastaXmlEnviado + "\\" +
                                                                 PastaEnviados.Autorizados.ToString() + "\\" +
                                                                 Empresas.Configuracoes[emp].DiretorioSalvarComo.ToString(oLerXml.oDadosNfe.dEmi) +
                                                                 Path.GetFileName(strArquivoNFeProc);
                                            TFunctions.ExecutaUniDanfe(strArquivoDist, oLerXml.oDadosNfe.dEmi, Empresas.Configuracoes[emp]);
                                        }
                                        catch (Exception ex)
                                        {
                                            Auxiliar.WriteLog("TaskMDFeRetRecepcao: " + ex.Message, false);
                                        }
                                    }
                                    //Vou verificar se estão os dois arquivos na pasta Autorizados, se tiver eu tiro do fluxo caso contrário não. Wandrey 13/02/2012
                                    NFeJaNaAutorizada     = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML, Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML);
                                    procNFeJaNaAutorizada = oAux.EstaAutorizada(strArquivoNFe, oLerXml.oDadosNfe.dEmi, Propriedade.Extensao(Propriedade.TipoEnvio.MDFe).EnvioXML, Propriedade.ExtRetorno.ProcMDFe);
                                    if (!procNFeJaNaAutorizada || !NFeJaNaAutorizada)
                                    {
                                        tirarFluxo = false;
                                    }
                                }
                                break;

                            default:         //NFe foi rejeitada
                                //O Status da NFe tem que ser maior que 1 ou deu algum erro na hora de ler o XML de retorno da consulta do recibo, sendo assim, vou mantar a nota no fluxo para consultar novamente.
                                if (Convert.ToInt32(strStat) >= 1)
                                {
                                    //Mover o XML da NFE a pasta de XML´s com erro
                                    oAux.MoveArqErro(strArquivoNFe);
                                }
                                else
                                {
                                    tirarFluxo = false;
                                }
                                break;
                            }

                            //Deletar a NFE do arquivo de controle de fluxo
                            if (tirarFluxo)
                            {
                                fluxoNFe.ExcluirNfeFluxo(strChaveNFe);
                            }

                            break;
                        }
                    }
                    break;
                    #endregion

                    #region Qualquer outro tipo de status que não for os acima relacionados, vai tirar a nota fiscal do fluxo.
                default:
                    //Qualquer outro tipo de rejeião vou tirar todas as notas do lote do fluxo, pois se o lote foi rejeitado, todas as notas fiscais também foram
                    //De acordo com o manual de integração se o status do lote não for 104, tudo foi rejeitado. Wandrey 20/07/2010
                    if (Convert.ToInt32(cStatLote) >= 1)
                    {
                        //Vou retirar as notas do fluxo pelo recibo
                        if (nRec != string.Empty)
                        {
                            fluxoNFe.ExcluirNfeFluxoRec(nRec.Trim());
                        }
                    }

                    break;
                    #endregion
                }
            }
        }