/// <summary>
        /// Retorna o caminho onde será salvo os CTes.
        /// </summary>
        /// <param name="data"></param>
        /// <param name="cnpj"></param>
        /// <param name="modelo"></param>
        /// <returns></returns>
        public string GetPathCTe(DateTime?data = null, string cnpj = "", ModeloCTe modelo = ModeloCTe.CTe)
        {
            string modeloDscr;

            switch (modelo)
            {
            case ModeloCTe.CTeOS:
                modeloDscr = "CTeOS";
                break;

            default:
                modeloDscr = "CTe";
                break;
            }

            return(GetPath(PathCTe, modeloDscr, cnpj, data, modeloDscr));
        }
        /// <summary>
        /// Salvar o arquivo xml do CTe no disco de acordo com as propriedades.
        /// </summary>
        /// <param name="conteudoArquivo"></param>
        /// <param name="nomeArquivo"></param>
        /// <param name="data"></param>
        /// <param name="cnpj"></param>
        /// <param name="modelo"></param>
        /// <exception cref="ArgumentOutOfRangeException"></exception>
        protected void GravarCTe(string conteudoArquivo, string nomeArquivo, DateTime data, string cnpj, ModeloCTe modelo)
        {
            if (!Configuracoes.Arquivos.Salvar)
            {
                return;
            }

            conteudoArquivo = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + conteudoArquivo.RemoverDeclaracaoXml();
            nomeArquivo     = Path.Combine(Configuracoes.Arquivos.GetPathCTe(data, cnpj, modelo), nomeArquivo);
            File.WriteAllText(nomeArquivo, conteudoArquivo, Encoding.UTF8);
        }
        public InutilizaoResposta Inutilizacao(string cnpj, string aJustificativa, int ano, ModeloCTe modelo, int serie, int numeroInicial, int numeroFinal)
        {
            Guard.Against <ArgumentNullException>(cnpj.IsEmpty(), "Informar o número do CNPJ");
            Guard.Against <ArgumentException>(!cnpj.IsCNPJ(), "CNPJ inválido.");
            Guard.Against <ArgumentNullException>(aJustificativa.IsEmpty(), "Informar uma Justificativa para Inutilização de numeração do Conhecimento Eletrônico.");
            Guard.Against <ArgumentException>(aJustificativa.Length < 15, "A Justificativa para Inutilização de numeração do Conhecimento Eletrônico deve ter no minimo 15 caracteres.");

            lock (serviceLock)
            {
                var idInutilizacao = $"ID{Configuracoes.WebServices.UF.GetDFeValue()}{cnpj.OnlyNumbers()}{modelo.GetDFeValue()}" +
                                     $"{serie.ZeroFill(3)}{numeroInicial.ZeroFill(9)}{numeroFinal.ZeroFill(9)}";

                var request = new StringBuilder();
                request.Append($"<inutCTe xmlns=\"http://www.portalfiscal.inf.br/cte\" versao=\"{Configuracoes.Geral.VersaoDFe.GetDescription()}\">");
                request.Append($"<infInut Id=\"{idInutilizacao}\">");
                request.Append($"<tpAmb>{Configuracoes.WebServices.Ambiente.GetDFeValue()}</tpAmb>");
                request.Append("<xServ>INUTILIZAR</xServ>");
                request.Append($"<cUF>{Configuracoes.WebServices.UF.GetDFeValue()}</cUF>");
                request.Append($"<ano>{ano}</ano>");
                request.Append($"<CNPJ>{cnpj}</CNPJ>");
                request.Append($"<mod>{modelo.GetDFeValue()}</mod>");
                request.Append($"<serie>{serie}</serie>");
                request.Append($"<nCTIni>{numeroInicial}</nCTIni>");
                request.Append($"<nCTFin>{numeroFinal}</nCTFin>");
                request.Append($"<xJust>{aJustificativa}</xJust>");
                request.Append("</infInut>");
                request.Append("</inutCTe>");

                var dadosMsg = request.ToString();
                dadosMsg = XmlSigning.AssinarXml(dadosMsg, "inutCTe", "infInut", ClientCredentials.ClientCertificate.Certificate);
                ValidateMessage(dadosMsg);

                GravarInutilizacao(dadosMsg, $"{idInutilizacao.OnlyNumbers()}-inut-cte-env.xml", DateTime.Now, cnpj);

                var xml = new XmlDocument();
                xml.LoadXml(dadosMsg);

                var inValue = new InutilizacaoRequest(DefineHeader(), xml);
                var retVal  = Channel.CTeInutilizacao(inValue);

                var retorno = new InutilizaoResposta(dadosMsg, retVal.Result.OuterXml, EnvelopeSoap, RetornoWS);
                GravarInutilizacao(retVal.Result.OuterXml, $"{idInutilizacao.OnlyNumbers()}-inut-cte-ret.xml", DateTime.Now, cnpj);
                return(retorno);
            }
        }