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); }
public RetCancelar(retEnvEvento retorno, string xmlRecebido, int processadas, int rejeitadas, string xmlEnviado) { Retorno = retorno; XmlRecebido = xmlRecebido; Processadas = processadas; Rejeitadas = rejeitadas; XmlEnviado = xmlEnviado; }
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); }
/// <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 = 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 }
public RetornoRecepcaoEvento(string envioStr, string retornoStr, string retornoCompletaStr, retEnvEvento retorno) : base(envioStr, retornoStr, retornoCompletaStr, retorno) { Retorno = retorno; }
/// <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)); }
/// <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)); }
public RetornoRecepcaoEvento(string envioStr, string retornoStr, string retornoCompletaStr, retEnvEvento retorno, List <procEventoNFe> procEventosNFe) : base(envioStr, retornoStr, retornoCompletaStr, retorno) { Retorno = retorno; ProcEventosNFe = procEventosNFe; }
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); }