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 = "" }); } }
internal MensagemRetornoInutilizacao InutilizarNotaFiscal(string ufEmitente, CodigoUfIbge codigoUf, Ambiente ambiente, string cnpjEmitente, Modelo modeloNota, string serie, string numeroInicial, string numeroFinal) { var inutNFe = new Envio.TInutNFe(); inutNFe.versao = "4.00"; var infInut = new Envio.TInutNFeInfInut(); infInut.tpAmb = (Envio.TAmb)(int) ambiente; infInut.xServ = Envio.TInutNFeInfInutXServ.INUTILIZAR; infInut.cUF = (Envio.TCodUfIBGE)(int) UfToTCOrgaoIBGEConversor.GetTCOrgaoIBGE(ufEmitente); infInut.ano = DateTime.Now.ToString("yy"); infInut.CNPJ = cnpjEmitente; infInut.mod = (Envio.TMod)(int) modeloNota; infInut.serie = serie; infInut.nNFIni = numeroInicial; infInut.nNFFin = numeroFinal; infInut.xJust = "Não usada, quebra de sequência."; var cUF = infInut.cUF.ToString().Replace("Item", string.Empty); var modelo = modeloNota.ToString().Replace("Modelo", string.Empty); infInut.Id = "ID" + cUF + infInut.ano + cnpjEmitente + modelo + int.Parse(serie).ToString("D3") + int.Parse(numeroInicial).ToString("D9") + int.Parse(numeroFinal).ToString("D9"); inutNFe.infInut = infInut; var xml = XmlUtil.Serialize(inutNFe, "http://www.portalfiscal.inf.br/nfe"); var certificado = _certificadoService.GetX509Certificate2(); var node = AssinaturaDigital.AssinarInutilizacao(xml, "#" + infInut.Id, certificado); var servico = _serviceFactory.GetService(modeloNota, ambiente, Servico.INUTILIZACAO, codigoUf, certificado); var client = (NFeInutilizacao4SoapClient)servico.SoapClient; var result = client.nfeInutilizacaoNF(node); var retorno = (Retorno.TRetInutNFe)XmlUtil.Deserialize <Retorno.TRetInutNFe>(result.OuterXml); if (retorno.infInut.cStat.Equals("102")) { var procInut = new Retorno.ProcInut.TProcInutNFe(); var procSerialized = "<?xml version=\"1.0\" encoding=\"utf-8\"?><ProcInutNFe versao=\"4.00\" xmlns=\"http://www.portalfiscal.inf.br/nfe\">" + node.OuterXml.Replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>", string.Empty) + result.OuterXml.Replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>", string.Empty) + "</ProcInutNFe>"; return(new MensagemRetornoInutilizacao() { IdInutilizacao = infInut.Id, Status = Status.SUCESSO, Mensagem = retorno.infInut.xMotivo, DataInutilizacao = retorno.infInut.dhRecbto, MotivoInutilizacao = infInut.xJust, ProtocoloInutilizacao = retorno.infInut.nProt, Xml = procSerialized }); } else { return(new MensagemRetornoInutilizacao() { Status = Status.ERRO, Mensagem = retorno.infInut.xMotivo }); } }