/// <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 }
/// <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 = Conversao.VersaoServicoParaString(servicoEvento, _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 }