예제 #1
0
        public MensagemRetornoEventoCancelamento CancelarNotaFiscal(string ufEmitente, CodigoUfIbge codigoUf, Ambiente ambiente, string cnpjEmitente, string chaveNFe,
                                                                    string protocoloAutorizacao, Modelo modeloNota, string justificativa)
        {
            try
            {
                var infEvento = new TEventoInfEvento();
                infEvento.cOrgao          = UfToTCOrgaoIBGEConversor.GetTCOrgaoIBGE(ufEmitente);
                infEvento.tpAmb           = (XmlSchemas.NfeRecepcaoEvento.Cancelamento.Envio.TAmb)(int) ambiente;
                infEvento.Item            = cnpjEmitente;
                infEvento.ItemElementName = XmlSchemas.NfeRecepcaoEvento.Cancelamento.Envio.ItemChoiceType.CNPJ;
                infEvento.chNFe           = chaveNFe;
                infEvento.dhEvento        = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:sszzz");
                infEvento.tpEvento        = TEventoInfEventoTpEvento.Item110111;
                infEvento.nSeqEvento      = "1";
                infEvento.verEvento       = TEventoInfEventoVerEvento.Item100;

                infEvento.detEvento            = new TEventoInfEventoDetEvento();
                infEvento.detEvento.versao     = TEventoInfEventoDetEventoVersao.Item100;
                infEvento.detEvento.descEvento = TEventoInfEventoDetEventoDescEvento.Cancelamento;
                infEvento.detEvento.nProt      = protocoloAutorizacao;
                infEvento.detEvento.xJust      = justificativa;
                infEvento.Id = "ID110111" + chaveNFe + "01";

                var evento = new TEvento();
                evento.versao    = "1.00";
                evento.infEvento = infEvento;

                var envioEvento = new TEnvEvento();
                envioEvento.versao = "1.00";
                envioEvento.idLote = "1";
                envioEvento.evento = new TEvento[] { evento };

                var xml = XmlUtil.Serialize(envioEvento, "http://www.portalfiscal.inf.br/nfe");

                var certificado = _certificadoService.GetX509Certificate2();

                XmlNode node = AssinaturaDigital.AssinarEvento(xml, "#" + infEvento.Id, certificado);

                //var resultadoValidacao = ValidadorXml.ValidarXml(node.OuterXml, "envEventoCancNFe_v1.00.xsd");

                var servico = _serviceFactory.GetService(modeloNota, ambiente,
                                                         Servico.CANCELAMENTO, codigoUf, certificado);

                var client = (NFeRecepcaoEvento4SoapClient)servico.SoapClient;

                var result = client.nfeRecepcaoEvento(node);

                var retorno = (TRetEnvEvento)XmlUtil.Deserialize <TRetEnvEvento>(result.OuterXml);

                if (retorno.cStat.Equals("128"))
                {
                    var retEvento = retorno.retEvento;

                    if (retEvento.Count() > 0)
                    {
                        var retInfEvento = retEvento[0].infEvento;

                        if (retInfEvento.cStat.Equals("135"))
                        {
                            var procEvento = new Proc.TProcEvento();

                            TEnvEvento envEvento        = (TEnvEvento)XmlUtil.Deserialize <TEnvEvento>(node.OuterXml);
                            var        eventoSerialized = XmlUtil.Serialize(envEvento.evento[0], "");
                            procEvento.evento = (Proc.TEvento)XmlUtil.Deserialize <Proc.TEvento>(eventoSerialized);

                            var retEventoSerialized = XmlUtil.Serialize(retEvento[0], "");
                            procEvento.retEvento = (Proc.TRetEvento)XmlUtil.Deserialize <Proc.TRetEvento>(retEventoSerialized);

                            procEvento.versao = "1.00";
                            var procSerialized = XmlUtil.Serialize(procEvento, "http://www.portalfiscal.inf.br/nfe");

                            return(new MensagemRetornoEventoCancelamento()
                            {
                                Status = StatusEvento.SUCESSO,
                                DataEvento = retInfEvento.dhRegEvento,
                                TipoEvento = retInfEvento.tpEvento,
                                Mensagem = retInfEvento.xMotivo,
                                Xml = procSerialized,
                                IdEvento = infEvento.Id,
                                MotivoCancelamento = justificativa,
                                ProtocoloCancelamento = retInfEvento.nProt
                            });
                        }
                        else
                        {
                            return(new MensagemRetornoEventoCancelamento()
                            {
                                Status = StatusEvento.ERRO,
                                Mensagem = retInfEvento.xMotivo,
                            });
                        }
                    }
                }

                return(new MensagemRetornoEventoCancelamento()
                {
                    Status = StatusEvento.ERRO,
                    Mensagem = "Erro desconhecido. Foi gerado um registro com o erro. Contate o suporte.",
                    Xml = ""
                });
            }
            catch (Exception e)
            {
                log.Error(e);
                string sDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "EmissorNFeDir");

                if (!Directory.Exists(sDirectory))
                {
                    Directory.CreateDirectory(sDirectory);
                }

                using (FileStream stream = File.Create(Path.Combine(sDirectory, "cancelarNotaErro.txt")))
                {
                    using (StreamWriter writer = new StreamWriter(stream))
                    {
                        writer.WriteLine(e.ToString());
                    }
                }

                return(new MensagemRetornoEventoCancelamento()
                {
                    Status = StatusEvento.ERRO,
                    Mensagem = "Erro ao tentar contactar SEFAZ. Verifique sua conexão.",
                    Xml = ""
                });
            }
        }