Example #1
0
        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"));
        }
Example #2
0
 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);
     }
 }
Example #3
0
        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);
        }
Example #4
0
        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;
        }        
Example #5
0
 public void SalvarEventoCorrecao(ref CartaCorrecao.TProcEvento procEvento, string dataEmissao)
 {
     procEvento.NomeArquivo = GetFileNameEventoCorrecao(procEvento.evento.infEvento, dataEmissao);
     procEvento.ArquivoXML = SaveXml(procEvento.Serialize(), procEvento.NomeArquivo);
 }
Example #6
0
 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);
 }
Example #7
0
        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);
        }
Example #8
0
        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));
            }
        }
Example #9
0
 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;
 }