public IRetorno CartaCorrecao(CartaCorrecao cartaCorrecao) { var tpEvento = "110110"; var id = "ID" + tpEvento + cartaCorrecao.NotaChaveAcesso + "01"; var xmlString = new StringBuilder(); xmlString.Append("<evento xmlns=\"http://www.portalfiscal.inf.br/nfe\" versao=\"" + "1.00" + "\">"); xmlString.Append(" <infEvento Id=\"" + id + "\">"); xmlString.Append(" <cOrgao>" + cartaCorrecao.CodigoUF + "</cOrgao>"); xmlString.Append(" <tpAmb>" + (NFeContexto.Producao ? "1" : "2") + "</tpAmb>"); xmlString.Append(" <CNPJ>" + cartaCorrecao.CNPJ + "</CNPJ>"); xmlString.Append(" <chNFe>" + cartaCorrecao.NotaChaveAcesso + "</chNFe>"); xmlString.Append(" <dhEvento>" + DateTime.Now.ToString("s") + "-03:00" + "</dhEvento>"); xmlString.Append(" <tpEvento>" + tpEvento + "</tpEvento>"); xmlString.Append(" <nSeqEvento>" + "1" + "</nSeqEvento>"); xmlString.Append(" <verEvento>" + "1.00" + "</verEvento>"); xmlString.Append(" <detEvento versao=\"" + "1.00" + "\">"); xmlString.Append(" <descEvento>" + "Carta de Correcao" + "</descEvento>"); xmlString.Append(" <xCorrecao>" + cartaCorrecao.Correcao + "</xCorrecao>"); xmlString.Append( " <xCondUso>A Carta de Correcao e disciplinada pelo paragrafo 1o-A do art. 7o do Convenio S/N, de 15 de dezembro de 1970 e pode ser utilizada para regularizacao de erro ocorrido na emissao de documento fiscal, desde que o erro nao esteja relacionado com: I - as variaveis que determinam o valor do imposto tais como: base de calculo, aliquota, diferenca de preco, quantidade, valor da operacao ou da prestacao; II - a correcao de dados cadastrais que implique mudanca do remetente ou do destinatario; III - a data de emissao ou de saida.</xCondUso>"); xmlString.Append(" </detEvento>"); xmlString.Append(" </infEvento>"); xmlString.Append("</evento>"); var arquivoTemporario = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\temp.xml"; return(EnviarEvento(xmlString, id, arquivoTemporario, "envCCe_v1.00.xsd")); }
public static string ToPDFCartaCorrecao(TNfeProc nota, CartaCorrecao.TProcEvento evento, ConfiguracaoHiperNFe config) { try { var arquivoPDF = evento.NomeArquivo.Replace(".xml", ".pdf"); var danfe = Print.CartaCorrecao(nota, evento, config); danfe.ExportToDisk(ExportFormatType.PortableDocFormat, arquivoPDF); return arquivoPDF; } catch (Exception ex) { throw new Exception("Erro ao gerar o arquivo do DANFE: " + ex.Message); } }
public static string EnviaCCe(XmlDocument xmlCce, uint idCarta) { var retorno = string.Empty; CartaCorrecao carta = CartaCorrecaoDAO.Instance.GetElement(idCarta); NotaFiscal nf = NotaFiscalDAO.Instance.GetElement(carta.IdNf); try { // Monta o lote XmlDocument xmlLote = CriaLoteCce(xmlCce); #region Envia XML // Instancia xml de retorno XmlNode xmlRetorno = null; // Salva o callback padrão do WebService System.Net.Security.RemoteCertificateValidationCallback callback = System.Net.ServicePointManager.ServerCertificateValidationCallback; // Realiza 3 tentativas de envio, se não funcionar, gera mensagem de erro for (int i = 0; i < 3; i++) { try { // Altera o callback de validação do WebService System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors error) { // Verifica se a data do certificado é válida DateTime beginDate = DateTime.Parse(cert.GetEffectiveDateString()); DateTime endDate = DateTime.Parse(cert.GetExpirationDateString()); bool isDateValid = (DateTime.Now >= beginDate) && (DateTime.Now <= endDate); // Retorna o resultado da função return(isDateValid); }; if (ConfigNFe.TipoAmbiente != ConfigNFe.TipoAmbienteNfe.Producao) { throw new Exception("A carta de correção está implementada somente para o ambiente de produção."); } // Envia o arquivo e recebe o retorno. xmlRetorno = ObterXmlRecepcaoEventoNFe(nf, xmlLote); break; } catch (Exception ex) { if (i == 2) { LogNfDAO.Instance.NewLog(carta.IdNf, "Recepção Evento", 1, Glass.MensagemAlerta.FormatErrorMsg("Falha ao enviar carta de correção.", ex)); return("Falha ao enviar carta de correção. " + ex.Message); } } finally { // Restaura o callback padrão para o WebService System.Net.ServicePointManager.ServerCertificateValidationCallback = callback; } } #endregion #region Lê Xml de retorno do envio do lote try { // Verifica se o Xml de Retorno é válido if (xmlRetorno == null) { LogNfDAO.Instance.NewLog(carta.IdNf, "Recepção Evento", 2, "Falha ao enviar carta de correção. Retorno de envio de carta de correção inválido."); return("Falha ao enviar carta de correção. Retorno de envio de carta de correção inválido."); } // Lê Xml de retorno do envio do lote var status = xmlRetorno?["cStat"]?.InnerText; var resposta = xmlRetorno?["xMotivo"]?.InnerText; var statusProcessamento = (xmlRetorno?["retEvento"]?["infEvento"]?["cStat"]?.InnerText?.StrParaInt() ?? status?.StrParaInt()).GetValueOrDefault(); var respostaProcessamento = xmlRetorno?["retEvento"]?["infEvento"]?["xMotivo"]?.InnerText ?? resposta; // Salva o retorno apenas se tiver sido aceito if (statusProcessamento == 135 || statusProcessamento == 136) { XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlRetorno.OuterXml); var fileName = $"{ Utils.GetCartaCorrecaoXmlPath }{ idCarta.ToString().PadLeft(9, '0') }-cce.xml"; if (System.IO.File.Exists(fileName)) { System.IO.File.Delete(fileName); } doc.Save(fileName); } switch (statusProcessamento) { //Somente os casos 135 e 136 são aceitos case 135: { LogNfDAO.Instance.NewLog(carta.IdNf, "Recepção Evento", statusProcessamento, respostaProcessamento); // Salva o protocolo CartaCorrecaoDAO.Instance.SalvaProtocolo(carta.IdCarta, xmlRetorno?["retEvento"]?["infEvento"]?["nProt"]?.InnerXml); CartaCorrecaoDAO.Instance.AtualizaSituacao(carta.IdCarta, (uint)CartaCorrecao.SituacaoEnum.Registrada); break; } case 136: { LogNfDAO.Instance.NewLog(carta.IdNf, "Recepção Evento", statusProcessamento, respostaProcessamento); // Salva o protocolo CartaCorrecaoDAO.Instance.SalvaProtocolo(carta.IdCarta, xmlRetorno?["retEvento"]?["infEvento"]?["nProt"]?.InnerXml); CartaCorrecaoDAO.Instance.AtualizaSituacao(carta.IdCarta, (uint)CartaCorrecao.SituacaoEnum.Registrada); break; } default: { LogNfDAO.Instance.NewLog(carta.IdNf, "Recepção Evento", statusProcessamento, respostaProcessamento); // Se a rejeição for por causa do código 594, exclui a carta, uma vez que para este caso é isso que o usuário deveria fazer. if (statusProcessamento != 594) { CartaCorrecaoDAO.Instance.AtualizaSituacao(carta.IdCarta, (uint)CartaCorrecao.SituacaoEnum.Recusada); } else { CartaCorrecaoDAO.Instance.DeleteByPrimaryKey(carta.IdCarta); } break; } } retorno = respostaProcessamento; } catch (Exception ex) { throw new Exception(Glass.MensagemAlerta.FormatErrorMsg("Falha ao salvar xml de retorno.", ex)); } #endregion } catch (Exception ex) { LogNfDAO.Instance.NewLog(carta.IdNf, "Emissão", 1, $"Falha ao enviar lote. { ex.Message }"); return(Glass.MensagemAlerta.FormatErrorMsg("Falha ao enviar lote.", ex)); } return(retorno); }
public static ReportDocument CartaCorrecao(TNfeProc nfe, CartaCorrecao.TProcEvento evento, ConfiguracaoHiperNFe config) { var doc = XDocument.Load(evento.NomeArquivo); var dataSet = new DataSet(); dataSet.ReadXml(doc.CreateReader()); var cartaCorrecao = new ImpressaoCartaCorrecao.CartaCorrecao(); cartaCorrecao.Load(Path.Combine(Environment.CurrentDirectory, "CartaCorrecao.rpt"), OpenReportMethod.OpenReportByDefault); var imageds = new ImpressaoCartaCorrecao.ImageDataSet(); imageds.Images.AddImagesRow(Logo.ToBytes(config), Barras.ToArray(evento.retEvento.infEvento.chNFe), config.Site); var row = ((ImpressaoCartaCorrecao.ImageDataSet.CartaCorrecaoRow)(imageds.CartaCorrecao.NewRow())); #region Nota Fiscal Eletrônica row.Modelo = Funcoes.ConvertEnumToString(nfe.NFe.infNFe.ide.mod); row.Serie = nfe.NFe.infNFe.ide.serie; row.Numero = nfe.NFe.infNFe.ide.nNF; row.MesAnoEmissao = nfe.NFe.infNFe.ide.dEmi.Substring(5, 2) + "/" + nfe.NFe.infNFe.ide.dEmi.Substring(2, 2); row.ChaveAcesso = nfe.protNFe.infProt.chNFe; #endregion Nota Fiscal Eletrônica #region Carta de Correção Eletrônica row.Orgao = Funcoes.ConvertEnumToString(evento.evento.infEvento.cOrgao); row.Ambiente = Funcoes.ConvertEnumToString(evento.evento.infEvento.tpAmb); row.DataHoraEvento = evento.evento.infEvento.dhEvento; row.Evento = Funcoes.ConvertEnumToString(evento.evento.infEvento.tpEvento); row.DescricaoEvento = Funcoes.ConvertEnumToString(evento.evento.infEvento.detEvento.descEvento); row.SequenciaEvento = evento.evento.infEvento.nSeqEvento; row.VersaoEvento = Funcoes.ConvertEnumToString(evento.evento.infEvento.verEvento); row.Status = evento.retEvento.infEvento.cStat + " - " + evento.retEvento.infEvento.xMotivo; row.Protocolo = evento.retEvento.infEvento.nProt; row.DataHoraRegistro = evento.retEvento.infEvento.dhRegEvento; #endregion Carta de Correção Eletrônica #region Emitente row.RazaoSocial_Emit = nfe.NFe.infNFe.emit.xNome; row.CNPJCPF_Emit = nfe.NFe.infNFe.emit.Item; row.Endereco_Emit = nfe.NFe.infNFe.emit.enderEmit.xLgr + " " + nfe.NFe.infNFe.emit.enderEmit.nro + " " + nfe.NFe.infNFe.emit.enderEmit.xCpl; row.Bairro_Emit = nfe.NFe.infNFe.emit.enderEmit.xBairro; row.CEP_Emit = nfe.NFe.infNFe.emit.enderEmit.CEP; row.Municipio_Emit = nfe.NFe.infNFe.emit.enderEmit.xMun; row.FoneFax_Emit = nfe.NFe.infNFe.emit.enderEmit.fone; row.Estado_Emit = nfe.NFe.infNFe.emit.enderEmit.UF.ToString(); row.IE_Emit = nfe.NFe.infNFe.emit.IE; #endregion Emitente #region Destinatário / Remetente row.RazaoSocial_Dest = nfe.NFe.infNFe.dest.xNome; row.CNPJCPF_Dest = nfe.NFe.infNFe.dest.Item; row.Endereco_Dest = nfe.NFe.infNFe.dest.enderDest.xLgr + " " + nfe.NFe.infNFe.dest.enderDest.nro + " " + nfe.NFe.infNFe.dest.enderDest.xCpl; row.Bairro_Dest = nfe.NFe.infNFe.dest.enderDest.xBairro; row.CEP_Dest = nfe.NFe.infNFe.dest.enderDest.CEP; row.Municipio_Dest = nfe.NFe.infNFe.dest.enderDest.xMun; row.FoneFax_Dest = nfe.NFe.infNFe.dest.enderDest.fone; row.Estado_Dest = nfe.NFe.infNFe.dest.enderDest.UF.ToString(); row.IE_Dest = nfe.NFe.infNFe.dest.IE; #endregion Destinatário / Remetente row.CondicoesUso = Funcoes.ConvertEnumToString(evento.evento.infEvento.detEvento.xCondUso); row.Correcao = evento.evento.infEvento.detEvento.xCorrecao; imageds.CartaCorrecao.AddCartaCorrecaoRow(row); cartaCorrecao.SetDataSource(dataSet); cartaCorrecao.Database.Tables["Images"].SetDataSource(imageds); return cartaCorrecao; }
public void SalvarEventoCorrecao(ref CartaCorrecao.TProcEvento procEvento, string dataEmissao) { procEvento.NomeArquivo = GetFileNameEventoCorrecao(procEvento.evento.infEvento, dataEmissao); procEvento.ArquivoXML = SaveXml(procEvento.Serialize(), procEvento.NomeArquivo); }
public string GetFileNameEventoCorrecao(CartaCorrecao.TEventoInfEvento infEvento, string dataEmissao) { var cnpjEmpresa = infEvento.Item; var tipoEvento = Funcoes.ConvertEnumToString(infEvento.tpEvento); var chaveEvento = infEvento.chNFe; var seqEvento = infEvento.nSeqEvento; return GetFileNameEvento(cnpjEmpresa, tipoEvento, chaveEvento, seqEvento, dataEmissao); }
private void EnviaMensagemEmailCartaCorrecao(TNfeProc nota, CartaCorrecao.TProcEvento evento, string destinatario, string bcc, string cc, string assunto, string corpo) { if (string.IsNullOrEmpty(Configuracao.ConfiguracaoMail.SMTPServer)) { throw new Exception("É necessário preencher a propriedade ConfiguracaoEmail para enviar email"); //return; } var mMailMessage = new MailMessage { From = new MailAddress(Configuracao.ConfiguracaoMail.Remetente) }; var arrDestinatarios = destinatario.Split(';'); foreach (var email in arrDestinatarios.Where(email => !String.IsNullOrEmpty(email))) { mMailMessage.To.Add(new MailAddress(email.Trim())); } if ((bcc != null) & bcc != string.Empty) { mMailMessage.Bcc.Add(new MailAddress(bcc)); } if ((cc != null) & cc != string.Empty) { mMailMessage.CC.Add(new MailAddress(cc)); } mMailMessage.Subject = assunto; mMailMessage.Body = corpo; mMailMessage.IsBodyHtml = Configuracao.ConfiguracaoMail.CorpoHtml; mMailMessage.Priority = MailPriority.Normal; var servidorSMTP = Configuracao.ConfiguracaoMail.SMTPServer; var mSmtpClient = new SmtpClient(servidorSMTP) { Port = Configuracao.ConfiguracaoMail.Port, EnableSsl = Configuracao.ConfiguracaoMail.HabilitaSSL }; //Configurar a conta de envio var usuario = Configuracao.ConfiguracaoMail.Usuario; var senha = Configuracao.ConfiguracaoMail.Senha; mSmtpClient.Credentials = new System.Net.NetworkCredential(usuario, senha); //mSmtpClient.UseDefaultCredentials = True mMailMessage.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess; //Anexa o XML var anexo = new Attachment(evento.NomeArquivo); mMailMessage.Attachments.Add(anexo); //Anexa o PDF var arquivoPDF = NfeConvert.ToPDFCartaCorrecao(nota, evento, Configuracao); var anexoPDF = new Attachment(arquivoPDF); mMailMessage.Attachments.Add(anexoPDF); //Enviar email try { mSmtpClient.Send(mMailMessage); } catch (Exception ex) { throw new Exception("Erro ao enviar o email do evento: " + evento.retEvento.infEvento.chNFe + " para: " + destinatario + ". Motivo: " + ex.Message); } //File.Delete(arquivoPDF); }
public void EnviarEmailCartaCorrecao(string destinatario, CartaCorrecao.TProcEvento evento) { if (String.IsNullOrWhiteSpace(Configuracao.MensagemEmail)) { throw new Exception("Erro ao enviar o email. Motivo: Corpo de email não configurado"); } foreach (var nota in NotasFiscais) { EnviaMensagemEmailCartaCorrecao(nota, evento, destinatario, "", "", Configuracao.AssuntoEmail, String.Format(Configuracao.MensagemEmail, nota.NFe.infNFe.ide.nNF)); } }
public CartaCorrecao.TRetEnvEvento CartaCorrecao(string correcao, int numLote, int nSequencia, out CartaCorrecao.TProcEvento procCorrecao) { if (NotasFiscais.Count > 1) { throw new InvalidOperationException("Só é possível corrigir uma nota por vez."); } var nota = NotasFiscais[0]; correcao = Funcoes.RemoverAcentos(correcao.Trim()); var ws = new C_WebService(Configuracao.PastaLog); var retCorrecao = ws.CartaCorrecao(nota, correcao, Certificado, numLote, nSequencia, Configuracao.Ambiente, out procCorrecao); if (retCorrecao.retEvento[0].infEvento.cStat == "135") { SalvarEventoCorrecao(ref procCorrecao, nota.NFe.infNFe.ide.dEmi); } return retCorrecao; }