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
                });
            }
        }