コード例 #1
0
        public static retEnvEvento CarregarDeXmlString(this retEnvEvento retEnvEvento, string xmlRecebido, string xmlEnviado)
        {
            var tmp = XmlUtils.XmlStringParaClasse <retEnvEvento>(xmlRecebido);

            tmp.XmlEnviado  = xmlEnviado;
            tmp.XmlRecebido = xmlRecebido;
            return(tmp);
        }
コード例 #2
0
 public RetCancelar(retEnvEvento retorno, string xmlRecebido, int processadas, int rejeitadas, string xmlEnviado)
 {
     Retorno     = retorno;
     XmlRecebido = xmlRecebido;
     Processadas = processadas;
     Rejeitadas  = rejeitadas;
     XmlEnviado  = xmlEnviado;
 }
コード例 #3
0
        private async Task <retEnvEvento> Cancelar(List <evento> eventos, eModeloDocumento modeloDoc)
        {
            var pedEvento = new envEvento
            {
                versao = versao,
                idLote = 1,
                evento = eventos
            };

            foreach (var eventoTmp in eventos)
            {
                eventoTmp.infEvento.Id = "ID" + ((int)eventoTmp.infEvento.tpEvento) + eventoTmp.infEvento.chNFe +
                                         eventoTmp.infEvento.nSeqEvento.ToString().PadLeft(2, '0');

                var _certificado = ObterCertificado.Obter(cfgServico.ConfigCertificado);
                eventoTmp.Assinar(_certificado, cfgServico.ConfigCertificado.SignatureMethodSignedXml, cfgServico.ConfigCertificado.DigestMethodReference);
            }

            var xmlEvento = XmlUtils.ClasseParaXmlString <envEvento>(pedEvento);

            var arqEnv = Path.Combine("Logs", $"{DateTime.Now.Ticks}-ped-eve.xml");
            await storage.SaveAsync(arqEnv, xmlEvento);

            var sefazUrl = Fabrica.FabricarUrl.ObterUrl(eTipoServico.CancelarNFe, cfgServico.TipoAmbiente, modeloDoc, cfgServico.UF);
            var envelope = Fabrica.SoapEnvelopeFabrica.FabricarEnvelope(eTipoServico.CancelarNFe, xmlEvento);

            var retornoXmlString = await transmitir.TransmitirAsync(sefazUrl, envelope);

            var retornoXmlStringLimpa = Soap.LimparEnvelope(retornoXmlString, "retEnvEvento").OuterXml;

            var arqRet = Path.Combine("Logs", $"{DateTime.Now.Ticks}-ret-eve.xml");
            await storage.SaveAsync(arqRet, retornoXmlStringLimpa);

            var retEnvEvento = new retEnvEvento().CarregarDeXmlString(retornoXmlStringLimpa, xmlEvento);

            return(retEnvEvento);
        }
コード例 #4
0
        /// <summary>
        ///     Envia um evento genérico
        /// </summary>
        /// <param name="idlote"></param>
        /// <param name="eventos"></param>
        /// <param name="tipoRecepcaoEvento"></param>
        /// <returns>Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento</returns>
        private RetornoRecepcaoEvento RecepcaoEvento(int idlote, List <evento> eventos, TipoRecepcaoEvento tipoRecepcaoEvento)
        {
            var versaoServico = Auxiliar.VersaoServicoParaString(ServicoNFe.RecepcaoEvento, _cFgServico.VersaoRecepcaoEvento);

            #region Cria o objeto wdsl para consulta

            var ws = CriarServico(ServicoNFe.RecepcaoEvento, tipoRecepcaoEvento);

            ws.nfeCabecMsg = new nfeCabecMsg
            {
                cUF         = _cFgServico.cUF,
                versaoDados = versaoServico
            };

            #endregion

            #region Cria o objeto envEvento

            var pedEvento = new envEvento
            {
                versao = versaoServico,
                idLote = idlote,
                evento = eventos
            };

            foreach (var evento in eventos)
            {
                evento.infEvento.Id = "ID" + evento.infEvento.tpEvento + evento.infEvento.chNFe + evento.infEvento.nSeqEvento.ToString().PadLeft(2, '0');
                evento.Assina();
            }

            #endregion

            #region Valida, Envia os dados e obtém a resposta

            var xmlEvento = pedEvento.ObterXmlString();
            Validador.Valida(ServicoNFe.RecepcaoEvento, tipoRecepcaoEvento, _cFgServico.VersaoRecepcaoEvento, xmlEvento);
            var dadosEvento = new XmlDocument();
            dadosEvento.LoadXml(xmlEvento);

            SalvarArquivoXml(idlote + "-ped-eve.xml", xmlEvento);

            var retorno          = ws.Execute(dadosEvento);
            var retornoXmlString = retorno.OuterXml;
            var retEnvEvento     = new retEnvEvento().CarregarDeXmlString(retornoXmlString);

            SalvarArquivoXml(idlote + "-eve.xml", retornoXmlString);

            #region Obtém um procEventoNFe de cada evento e salva em arquivo

            var listprocEventoNFe = new List <procEventoNFe>();

            foreach (var evento in eventos)
            {
                var eve   = evento;
                var query = (from retevento in retEnvEvento.retEvento
                             where retevento.infEvento.chNFe == eve.infEvento.chNFe && retevento.infEvento.tpEvento == eve.infEvento.tpEvento
                             select retevento).SingleOrDefault();

                var procevento = new procEventoNFe {
                    evento = eve, versao = eve.versao, retEvento = new List <retEvento> {
                        query
                    }
                };
                listprocEventoNFe.Add(procevento);
                if (!_cFgServico.SalvarXmlServicos)
                {
                    continue;
                }
                var proceventoXmlString = procevento.ObterXmlString();
                SalvarArquivoXml(procevento.evento.infEvento.Id.Substring(2) + "-procEventoNFe.xml", proceventoXmlString);
            }

            #endregion

            return(new RetornoRecepcaoEvento(pedEvento.ObterXmlString(), retEnvEvento.ObterXmlString(), retornoXmlString, retEnvEvento, listprocEventoNFe));

            #endregion
        }
コード例 #5
0
        /// <summary>
        ///     Envia um evento genérico
        /// </summary>
        /// <param name="idlote"></param>
        /// <param name="eventos"></param>
        /// <param name="servicoEvento">Tipo de serviço do evento: valores válidos: RecepcaoEventoCancelmento, RecepcaoEventoCartaCorrecao, RecepcaoEventoEpec e RecepcaoEventoManifestacaoDestinatario</param>
        /// <returns>Retorna um objeto da classe RetornoRecepcaoEvento com o retorno do serviço RecepcaoEvento</returns>
        private RetornoRecepcaoEvento RecepcaoEvento(int idlote, List <evento> eventos, ServicoNFe servicoEvento)
        {
            var listaEventos = new List <ServicoNFe>
            {
                ServicoNFe.RecepcaoEventoCartaCorrecao,
                ServicoNFe.RecepcaoEventoCancelmento,
                ServicoNFe.RecepcaoEventoEpec,
                ServicoNFe.RecepcaoEventoManifestacaoDestinatario
            };

            if (
                !listaEventos.Contains(servicoEvento))
            {
                throw new Exception(string.Format("Serviço {0} é inválido para o método {1}!\nServiços válidos: \n • {2}", servicoEvento,
                                                  MethodBase.GetCurrentMethod().Name, string.Join("\n • ", listaEventos.ToArray())));
            }

            var versaoServico = servicoEvento.VersaoServicoParaString(_cFgServico.VersaoRecepcaoEventoCceCancelamento);

            #region Cria o objeto wdsl para consulta

            var ws = CriarServico(servicoEvento);

            ws.nfeCabecMsg = new nfeCabecMsg
            {
                cUF         = _cFgServico.cUF,
                versaoDados = versaoServico
            };

            #endregion

            #region Cria o objeto envEvento

            var pedEvento = new envEvento
            {
                versao = versaoServico,
                idLote = idlote,
                evento = eventos
            };

            foreach (var evento in eventos)
            {
                evento.infEvento.Id = "ID" + evento.infEvento.tpEvento + evento.infEvento.chNFe + evento.infEvento.nSeqEvento.ToString().PadLeft(2, '0');
                evento.Assina();
            }

            #endregion

            #region Valida, Envia os dados e obtém a resposta

            var xmlEvento = pedEvento.ObterXmlString();
            Validador.Valida(servicoEvento, _cFgServico.VersaoRecepcaoEventoCceCancelamento, xmlEvento);
            var dadosEvento = new XmlDocument();
            dadosEvento.LoadXml(xmlEvento);

            SalvarArquivoXml(idlote + "-ped-eve.xml", xmlEvento);

            var retorno          = ws.Execute(dadosEvento);
            var retornoXmlString = retorno.OuterXml;
            var retEnvEvento     = new retEnvEvento().CarregarDeXmlString(retornoXmlString);

            SalvarArquivoXml(idlote + "-eve.xml", retornoXmlString);

            #region Obtém um procEventoNFe de cada evento e salva em arquivo

            var listprocEventoNFe = new List <procEventoNFe>();

            foreach (var evento in eventos)
            {
                var eve   = evento;
                var query = (from retevento in retEnvEvento.retEvento
                             where retevento.infEvento.chNFe == eve.infEvento.chNFe && retevento.infEvento.tpEvento == eve.infEvento.tpEvento
                             select retevento).SingleOrDefault();

                var procevento = new procEventoNFe {
                    evento = eve, versao = eve.versao, retEvento = new List <retEvento> {
                        query
                    }
                };
                listprocEventoNFe.Add(procevento);
                if (!_cFgServico.SalvarXmlServicos)
                {
                    continue;
                }
                var proceventoXmlString = procevento.ObterXmlString();
                SalvarArquivoXml(procevento.evento.infEvento.Id.Substring(2) + "-procEventoNFe.xml", proceventoXmlString);
            }

            #endregion

            return(new RetornoRecepcaoEvento(pedEvento.ObterXmlString(), retEnvEvento.ObterXmlString(), retornoXmlString, retEnvEvento, listprocEventoNFe));

            #endregion
        }
コード例 #6
0
 public RetornoRecepcaoEvento(string envioStr, string retornoStr, string retornoCompletaStr, retEnvEvento retorno)
     : base(envioStr, retornoStr, retornoCompletaStr, retorno)
 {
     Retorno = retorno;
 }
コード例 #7
0
 /// <summary>
 ///     Converte um objeto do tipo retEnvEvento para uma string no formato XML com os dados do objeto
 /// </summary>
 /// <param name="retEnvEvento"></param>
 /// <returns>Retorna uma string no formato XML com os dados do objeto retEnvEvento</returns>
 public static string ObterXmlString(this retEnvEvento retEnvEvento)
 {
     return(FuncoesXml.ClasseParaXmlString(retEnvEvento));
 }
コード例 #8
0
 /// <summary>
 ///     Carrega um objeto do tipo retEnvEvento a partir de uma string no formato XML
 /// </summary>
 /// <param name="retEnvEvento"></param>
 /// <param name="xmlString"></param>
 /// <returns>Retorna um objeto retEnvEvento com as informações da string XML</returns>
 public static retEnvEvento CarregarDeXmlString(this retEnvEvento retEnvEvento, string xmlString)
 {
     return(FuncoesXml.XmlStringParaClasse <retEnvEvento>(xmlString));
 }
コード例 #9
0
 public RetornoRecepcaoEvento(string envioStr, string retornoStr, string retornoCompletaStr, retEnvEvento retorno, List <procEventoNFe> procEventosNFe)
     : base(envioStr, retornoStr, retornoCompletaStr, retorno)
 {
     Retorno        = retorno;
     ProcEventosNFe = procEventosNFe;
 }
コード例 #10
0
        public async Task <retEnvEvento> TransmitirCorrecao(IList <InfoCartaCorrecao> infos)
        {
            if (infos == null || infos.Count <= 0)
            {
                throw new Exception("Informações da NFe não encontrada");
            }

            if (infos.Count > 20)
            {
                throw new Exception("No máximo 20 NFes podem ser Corrigidas");
            }


            List <evento> eventos = new List <evento>();

            foreach (var item in infos)
            {
                var chave      = item.ChaveAcesso;
                var correcao   = item.Correcao;
                var nSeqEvento = item.nSeqEvento;
                chave = chave.Replace("NFe", "");
                eModeloDocumento _modeloDocumento = chave.Substring(20, 2).ModeloDocumento();

                if (item.Correcao.Length < 15 || item.Correcao.Length > 1000)
                {
                    throw new FalhaValidacaoException("A descrição da correção deve conter entre 15 e 1000 caracteres");
                }

                if (_modeloDocumento != eModeloDocumento.NFe)
                {
                    throw new FalhaValidacaoException("Somente NFe pode ter Carta Correção");
                }

                var infEvento = new infEventoEnv
                {
                    chNFe      = chave,
                    CNPJ       = cfgServico.Emitente.CNPJ,
                    CPF        = cfgServico.Emitente.CPF,
                    cOrgao     = cfgServico.UF,
                    dhEvento   = DateTime.Now,
                    nSeqEvento = nSeqEvento,
                    tpAmb      = cfgServico.TipoAmbiente,
                    tpEvento   = eTipoEventoNFe.NFeCartaCorrecao,
                    verEvento  = _versao,
                    detEvento  = new detEvento()
                    {
                        versao     = _versao,
                        descEvento = "Carta de Correção",
                        xCorrecao  = correcao
                    }
                };
                var evento = new evento {
                    versao = _versao, infEvento = infEvento
                };
                eventos.Add(evento);
            }

            foreach (var eventoTmp in eventos)
            {
                eventoTmp.infEvento.Id = "ID" + ((int)eventoTmp.infEvento.tpEvento) + eventoTmp.infEvento.chNFe +
                                         eventoTmp.infEvento.nSeqEvento.ToString().PadLeft(2, '0');

                var _certificado = ObterCertificado.Obter(cfgServico.ConfigCertificado);
                eventoTmp.Assinar(_certificado, cfgServico.ConfigCertificado.SignatureMethodSignedXml, cfgServico.ConfigCertificado.DigestMethodReference);
            }

            var pedEvento = new envEvento
            {
                versao = _versao,
                idLote = 1,
                evento = eventos
            };

            var xmlEvento = XmlUtils.ClasseParaXmlString <envEvento>(pedEvento);

            var arqEnv = Path.Combine("Logs", Arquivo.MontarNomeArquivo("ped-eve.xml", cfgServico));
            await storage.SaveAsync(arqEnv, xmlEvento);

            var sefazUrl = Fabrica.FabricarUrl.ObterUrl(eTipoServico.CartaCorrecao, cfgServico.TipoAmbiente, eModeloDocumento.NFe, cfgServico.UF);
            var envelope = Fabrica.SoapEnvelopeFabrica.FabricarEnvelope(eTipoServico.CartaCorrecao, xmlEvento);

            var retornoXmlString = await transmitir.TransmitirAsync(sefazUrl, envelope);

            var retornoXmlStringLimpa = Soap.LimparEnvelope(retornoXmlString, "retEnvEvento").OuterXml;

            var arqRet = Path.Combine("Logs", Arquivo.MontarNomeArquivo("ret-eve.xml", cfgServico));
            await storage.SaveAsync(arqRet, retornoXmlStringLimpa);

            var retorno = new retEnvEvento().CarregarDeXmlString(retornoXmlStringLimpa, xmlEvento);

            return(retorno);
        }