NFe.Settings.ConfiguracaoApp.ValidarConfig C# (CSharp) Method

ValidarConfig() public method

Verifica se algumas das informações das configurações tem algum problema ou falha
public ValidarConfig ( bool validarCertificado, Empresa empresaValidada ) : void
validarCertificado bool Se valida se tem certificado informado ou não nas configurações
empresaValidada Empresa
return void
        public void ValidarConfig(bool validarCertificado, Empresa empresaValidada)
        {
            string erro = string.Empty;
            bool validou = true;

            _folders = new Dictionary<string, int>();

            foreach (Empresa emp in Empresas.Configuracoes)
            {

                #region Remover End Slash
                emp.RemoveEndSlash();
                #endregion

                #region Verificar a duplicação de nome de pastas que não pode existir
                if ((erro = this.AddEmpresaNaLista(emp.PastaXmlEnvio)) == "")
                    if ((erro = this.AddEmpresaNaLista(emp.PastaXmlRetorno)) == "")
                        if ((erro = this.AddEmpresaNaLista(emp.PastaXmlErro)) == "")
                            if ((erro = this.AddEmpresaNaLista(emp.PastaValidar)) == "")
                                if (emp.Servico != TipoAplicativo.Nfse)
                                    if ((erro = this.AddEmpresaNaLista(emp.PastaXmlEnviado)) == "")
                                        if ((erro = this.AddEmpresaNaLista(emp.PastaXmlEmLote)) == "")
                                            if ((erro = this.AddEmpresaNaLista(emp.PastaBackup)) == "")
                                                erro = this.AddEmpresaNaLista(emp.PastaDownloadNFeDest);

                if (erro != "")
                {
                    erro += "\r\nNa empresa: " + emp.Nome + "\r\n" + emp.CNPJ;
                    validou = false;
                    break;
                }
                #endregion
            }

            //substitui pq para debugar dava muito trabalho
#if f

            #region Verificar a duplicação de nome de pastas que não pode existir
            List<FolderCompare> fc = new List<FolderCompare>();

            for (int i = 0; i < Empresas.Configuracoes.Count; i++)
            {
                AddEmpresaNaListaDeComparacao(fc, i, Empresas.Configuracoes[i]);
            }

            foreach (FolderCompare fc1 in fc)
            {
                if (string.IsNullOrEmpty(fc1.folder))
                    continue;

                var fCount = fc.Count(fc2 => fc2.id != fc1.id && fc1.folder.ToLower().Equals(fc2.folder.ToLower()));
                if (fCount > 0)
                {
                    erro = "Não é permitido a utilização de pasta idênticas na mesma ou entre empresas. \r\nPasta utilizada: \r\n" + fc1.folder.Trim();
                    validou = false;
                    break;
                }
                /*

                foreach (FolderCompare fc2 in fc)
                {
                    if (fc1.id != fc2.id)
                    {
                        if (fc1.folder.ToLower().Equals(fc2.folder.ToLower()))
                        {
                            erro = "Não é permitido a utilização de pasta idênticas na mesma ou entre empresas. \r\nPasta utilizada: \r\n" + fc1.folder.Trim();
                            validou = false;
                            break;
                        }
                    }
                }*/
                if (!validou)
                    break;
            }
            #endregion
#endif

            if (validou)
            {
                int empFrom = 0;
                int empTo = Empresas.Configuracoes.Count;

                if (empresaValidada != null)
                {
                    ///
                    /// quando alterada uma configuracao pelo visual, valida apenas a empresa sendo alterada
                    /// 
                    empFrom = empTo = Empresas.FindConfEmpresaIndex(empresaValidada.CNPJ, empresaValidada.Servico);
                    if (empFrom == -1)
                        throw new Exception("Não foi possivel encontrar a empresa para validação");

                    ++empTo;
                }

                if (empresaValidada.Servico == TipoAplicativo.NFCe)
                {
                    if (!string.IsNullOrEmpty(empresaValidada.IndentificadorCSC) && string.IsNullOrEmpty(empresaValidada.TokenCSC))
                    {
                        throw new Exception("É obrigatório informar o IDToken quando informado o CSC.");
                    }
                    else if (string.IsNullOrEmpty(empresaValidada.IndentificadorCSC) && ! string.IsNullOrEmpty(empresaValidada.TokenCSC))
                    {
                        throw new Exception("É obrigatório informar o CSC quando informado o IDToken.");
                    }
                }

                for (int i = empFrom; i < empTo; i++)
                {
                    Empresa empresa = Empresas.Configuracoes[i];

                    string xNomeCNPJ = "\r\n" + empresa.Nome + "\r\n" + empresa.CNPJ;

                    #region Verificar se tem alguma pasta em branco
                    List<xValid> _xValids = new List<xValid>();
                    _xValids.Add(new xValid(empresa.PastaXmlEnvio, "Informe a pasta de envio dos arquivos XML.", "A pasta de envio dos arquivos XML informada não existe.", true));
                    _xValids.Add(new xValid(empresa.PastaXmlRetorno, "Informe a pasta de envio dos arquivos XML.", "A pasta de retorno dos arquivos XML informada não existe.", true));
                    _xValids.Add(new xValid(empresa.PastaXmlErro, "Informe a pasta para arquivamento temporário dos arquivos XML que apresentaram erros.", "A pasta para arquivamento temporário dos arquivos XML com erro informada não existe.", true));
                    _xValids.Add(new xValid(empresa.PastaValidar, "Informe a pasta onde será gravado os arquivos XML somente para ser validado pela aplicação.", "A pasta para validação de XML´s informada não existe.", true));
                    if (empresa.Servico != TipoAplicativo.Nfse)
                    {
                        _xValids.Add(new xValid(empresa.PastaXmlEmLote, "Informe a pasta de envio dos arquivos XML em lote.", "A pasta de envio das notas fiscais eletrônicas em lote informada não existe.", true));
                        _xValids.Add(new xValid(empresa.PastaXmlEnviado, "Informe a pasta para arquivamento dos arquivos XML enviados.", "A pasta para arquivamento dos arquivos XML enviados informada não existe.", true));

                        _xValids.Add(new xValid(empresa.PastaBackup, "", "A pasta para backup dos XML enviados informada não existe.", false));
                        _xValids.Add(new xValid(empresa.PastaDownloadNFeDest, "", "A pasta para arquivamento das NFe de destinatários informada não existe.", false));
                        _xValids.Add(new xValid(empresa.PastaDanfeMon, "", "A pasta informada para gravação do XML da NFe para o DANFeMon não existe.", false));
                        _xValids.Add(new xValid(empresa.PastaExeUniDanfe, "", "A pasta do executável do UniDANFe informada não existe.", false));
                        _xValids.Add(new xValid(empresa.PastaConfigUniDanfe, "", "A pasta do arquivo de configurações do UniDANFe informada não existe.", false));
                    }
                    foreach (var val in _xValids)
                    {
                        if (val.valid && string.IsNullOrEmpty(val.folder))
                        {
                            erro = val.msg1 + xNomeCNPJ;
                            validou = false;
                            break;
                        }
                        else
                            if (!string.IsNullOrEmpty(val.folder))
                                if (!Directory.Exists(val.folder))
                                    if (empresa.CriaPastasAutomaticamente)
                                    {
                                        Directory.CreateDirectory(val.folder);
                                    }
                                    else
                                    {
                                        erro = val.msg2 + xNomeCNPJ;
                                        validou = false;
                                        break;
                                    }
                    }

#if f
                    List<string> diretorios = new List<string>();
                    List<string> mensagens = new List<string>();

                    diretorios.Add(empresa.PastaXmlEnvio); mensagens.Add("Informe a pasta de envio dos arquivos XML.");
                    diretorios.Add(empresa.PastaXmlRetorno); mensagens.Add("Informe a pasta de retorno dos arquivos XML.");
                    diretorios.Add(empresa.PastaXmlErro); mensagens.Add("Informe a pasta para arquivamento temporário dos arquivos XML que apresentaram erros.");
                    diretorios.Add(empresa.PastaValidar); mensagens.Add("Informe a pasta onde será gravado os arquivos XML somente para ser validado pela Aplicação.");
                    if (empresa.Servico != TipoAplicativo.Nfse)
                    {
                        diretorios.Add(empresa.PastaXmlEmLote); mensagens.Add("Informe a pasta de envio dos arquivos XML em lote.");
                        diretorios.Add(empresa.PastaXmlEnviado); mensagens.Add("Informe a pasta para arquivamento dos arquivos XML enviados.");
                    }

                    for (int b = 0; b < diretorios.Count; b++)
                    {
                        if (diretorios[b].Equals(string.Empty))
                        {
                            erro = mensagens[b] + xNomeCNPJ;
                            validou = false;
                            break;
                        }
                    }
#endif
                    ///
                    /// informacoes do FTP
                    /// danasa 7/7/2011
                    if (empresa.FTPIsAlive && validou)
                    {
                        if (empresa.Servico != TipoAplicativo.Nfse)
                        {
                            if (string.IsNullOrEmpty(empresa.FTPPastaAutorizados))
                            {
                                erro = "Informe a pasta do FTP de destino dos autorizados" + xNomeCNPJ;
                                validou = false;
                            }
                        }
                        else
                            if (string.IsNullOrEmpty(empresa.FTPPastaRetornos))
                            {
                                erro = "Informe a pasta do FTP de destino dos retornos" + xNomeCNPJ;
                                validou = false;
                            }
                    }
                    #endregion

                    #region Verificar se o certificado foi informado
                    if (validarCertificado && empresa.UsaCertificado && validou)
                    {
                        if (empresa.CertificadoInstalado && empresa.CertificadoDigitalThumbPrint.Equals(string.Empty))
                        {
                            erro = "Selecione o certificado digital a ser utilizado na autenticação dos serviços." + xNomeCNPJ;
                            validou = false;
                        }
                        if (!empresa.CertificadoInstalado && validou)
                        {
                            if (empresa.CertificadoArquivo.Equals(string.Empty))
                            {
                                erro = "Informe o local de armazenamento do certificado digital a ser utilizado na autenticação dos serviços." + xNomeCNPJ;
                                validou = false;
                            }
                            else if (!File.Exists(empresa.CertificadoArquivo))
                            {
                                erro = "Arquivo do certificado digital a ser utilizado na autenticação dos serviços não foi encontrado." + xNomeCNPJ;
                                validou = false;
                            }
                            else if (empresa.CertificadoSenha.Equals(string.Empty))
                            {
                                erro = "Informe a senha do certificado digital a ser utilizado na autenticação dos serviços." + xNomeCNPJ;
                                validou = false;
                            }
                            else
                            {
                                try
                                {
                                    using (FileStream fs = new FileStream(empresa.CertificadoArquivo, FileMode.Open, FileAccess.Read))
                                    {
                                        byte[] buffer = new byte[fs.Length];
                                        fs.Read(buffer, 0, buffer.Length);
                                        empresa.X509Certificado = new X509Certificate2(buffer, empresa.CertificadoSenha);
                                    }
                                }
                                catch (System.Security.Cryptography.CryptographicException ex)
                                {
                                    erro = ex.Message + "." + xNomeCNPJ;
                                    validou = false;
                                }
                                catch (Exception ex)
                                {
                                    erro = ex.Message + "." + xNomeCNPJ;
                                    validou = false;
                                }
                            }
                        }
                    }
                    #endregion

                    #region Verificar se as pastas informadas existem
                    if (validou)
                    {
                        //Fazer um pequeno ajuste na pasta de configuração do unidanfe antes de verificar sua existência
                        if (empresa.PastaConfigUniDanfe.Trim() != string.Empty)
                        {
                            if (!string.IsNullOrEmpty(empresa.PastaConfigUniDanfe))
                            {
                                while (empresa.PastaConfigUniDanfe.Substring(empresa.PastaConfigUniDanfe.Length - 6, 6).ToLower() == @"\dados" &&
                                    !string.IsNullOrEmpty(empresa.PastaConfigUniDanfe))
                                {
                                    empresa.PastaConfigUniDanfe = empresa.PastaConfigUniDanfe.Substring(0, empresa.PastaConfigUniDanfe.Length - 6);
                                }
                            }
                            empresa.PastaConfigUniDanfe = empresa.PastaConfigUniDanfe.Replace("\r\n", "").Trim();
                            //empresa.PastaConfigUniDanfe = empresa.PastaConfigUniDanfe;
                        }

                        if (empresa.PastaXmlEnvio.ToLower().EndsWith("geral"))
                        {
                            erro = "Pasta de envio não pode terminar com a subpasta 'geral'." + xNomeCNPJ;
                            validou = false;
                        }
                        else
                            if (empresa.PastaXmlEmLote.ToLower().EndsWith("geral"))
                            {
                                erro = "Pasta de envio em lote não pode terminar com a subpasta 'geral'." + xNomeCNPJ;
                                validou = false;
                            }
                            else
                                if (empresa.PastaValidar.ToLower().EndsWith("geral"))
                                {
                                    erro = "Pasta de validação não pode terminar com a subpasta 'geral'." + xNomeCNPJ;
                                    validou = false;
                                }
                                else
                                    if (empresa.PastaXmlEnvio.ToLower().EndsWith("temp"))
                                    {
                                        erro = "Pasta de envio não pode terminar com a subpasta 'temp'." + xNomeCNPJ;
                                        validou = false;
                                    }
                                    else
                                        if (empresa.PastaXmlEmLote.ToLower().EndsWith("temp"))
                                        {
                                            erro = "Pasta de envio em lote não pode terminar com a subpasta 'temp'." + xNomeCNPJ;
                                            validou = false;
                                        }
                                        else
                                            if (empresa.PastaValidar.ToLower().EndsWith("temp"))
                                            {
                                                erro = "Pasta de validação não pode terminar com a subpasta 'temp'." + xNomeCNPJ;
                                                validou = false;
                                            }
                                            else
                                                if (empresa.PastaXmlErro.ToLower().EndsWith("temp"))
                                                {
                                                    erro = "Pasta de XML's com erro na tentativa de envio não pode terminar com a subpasta 'temp'." + xNomeCNPJ;
                                                    validou = false;
                                                }

#if f

                        if (validou)
                        {
                            diretorios.Clear(); mensagens.Clear();
                            diretorios.Add(empresa.PastaXmlEnvio.Trim()); mensagens.Add("A pasta de envio dos arquivos XML informada não existe.");
                            diretorios.Add(empresa.PastaXmlRetorno.Trim()); mensagens.Add("A pasta de retorno dos arquivos XML informada não existe.");
                            diretorios.Add(empresa.PastaXmlErro.Trim()); mensagens.Add("A pasta para arquivamento temporário dos arquivos XML com erro informada não existe.");
                            diretorios.Add(empresa.PastaValidar.Trim()); mensagens.Add("A pasta para validação de XML´s informada não existe.");
                            if (empresa.Servico != TipoAplicativo.Nfse)
                            {
                                diretorios.Add(empresa.PastaXmlEnviado.Trim()); mensagens.Add("A pasta para arquivamento dos arquivos XML enviados informada não existe.");
                                diretorios.Add(empresa.PastaBackup.Trim()); mensagens.Add("A pasta para backup dos XML enviados informada não existe.");
                                diretorios.Add(empresa.PastaDownloadNFeDest.Trim()); mensagens.Add("A pasta para arquivamento das NFe de destinatários informada não existe.");
                                diretorios.Add(empresa.PastaXmlEmLote.Trim()); mensagens.Add("A pasta de envio das notas fiscais eletrônicas em lote informada não existe.");
                                diretorios.Add(empresa.PastaDanfeMon.Trim()); mensagens.Add("A pasta informada para gravação do XML da NFe para o DANFeMon não existe.");
                                diretorios.Add(empresa.PastaExeUniDanfe.Trim()); mensagens.Add("A pasta do executável do UniDANFe informada não existe.");
                                diretorios.Add(empresa.PastaConfigUniDanfe.Trim()); mensagens.Add("A pasta do arquivo de configurações do UniDANFe informada não existe.");
                            }

                            for (int b = 0; b < diretorios.Count; b++)
                            {
                                if (!string.IsNullOrEmpty(diretorios[b]))
                                {
                                    if (!Directory.Exists(diretorios[b]))
                                    {
                                        if (empresa.CriaPastasAutomaticamente)
                                        {
                                            Directory.CreateDirectory(diretorios[b]);
                                        }
                                        else
                                        {
                                            erro = mensagens[b].Trim() + xNomeCNPJ;
                                            validou = false;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
#endif

                        #region Criar pasta Temp dentro da pasta de envio, envio em lote e validar
                        //Criar pasta Temp dentro da pasta de envio, envio em Lote e Validar. Wandrey 03/08/2011
                        if (validou)
                        {
                            if (Directory.Exists(empresa.PastaXmlEnvio.Trim()))
                            {
                                if (!Directory.Exists(empresa.PastaXmlEnvio.Trim() + "\\Temp"))
                                {
                                    Directory.CreateDirectory(empresa.PastaXmlEnvio.Trim() + "\\Temp");
                                }
                            }

                            if (Directory.Exists(empresa.PastaXmlEmLote.Trim()) && Propriedade.TipoAplicativo != TipoAplicativo.Nfse)
                            {
                                if (!Directory.Exists(empresa.PastaXmlEmLote.Trim() + "\\Temp"))
                                {
                                    Directory.CreateDirectory(empresa.PastaXmlEmLote.Trim() + "\\Temp");
                                }
                            }

                            if (Directory.Exists(empresa.PastaValidar.Trim()))
                            {
                                if (!Directory.Exists(empresa.PastaValidar.Trim() + "\\Temp"))
                                {
                                    Directory.CreateDirectory(empresa.PastaValidar.Trim() + "\\Temp");
                                }
                            }
                        }
                        #endregion
                    }
                    #endregion

                    #region Verificar se as pastas configuradas do unidanfe estão corretas
                    if (empresa.Servico != TipoAplicativo.Nfse && validou)
                    {
                        if (empresa.PastaExeUniDanfe.Trim() != string.Empty)
                        {
                            if (!File.Exists(empresa.PastaExeUniDanfe + "\\unidanfe.exe"))
                            {
                                erro = "O executável do UniDANFe não foi localizado na pasta informada." + xNomeCNPJ;
                                validou = false;
                            }
                        }

                        if (validou && empresa.PastaConfigUniDanfe.Trim() != string.Empty)
                        {
                            //Verificar a existência o arquivo de configuração
                            if (!File.Exists(empresa.PastaConfigUniDanfe + "\\dados\\config.tps"))
                            {
                                erro = "O arquivo de configuração do UniDANFe não foi localizado na pasta informada." + xNomeCNPJ;
                                validou = false;
                            }
                        }
                    }
                    #endregion

                    #region Verificar se o IDToken informado é menor que 6 caracteres
                    if (!string.IsNullOrEmpty(empresa.TokenCSC) && empresa.TokenCSC.Length < 6)
                    {
                        erro = "O IDToken deve ter 6 caracteres." + xNomeCNPJ;
                        validou = false;
                    }
                    #endregion
                }
            }

            #region Ticket: #110
            /* Validar se já existe uma instancia utilizando estes diretórios
             * Marcelo
             * 03/06/2013
             */
            if (validou)
            {
                //Se encontrar algum arquivo de lock nos diretórios, não permitir que seja executado
                try
                {
                    Empresas.CanRun();
                }
                catch (NFe.Components.Exceptions.AppJaExecutando ex)
                {
                    erro = ex.Message;
                }

                validou = String.IsNullOrEmpty(erro);
            }
            #endregion

            if (!validou)
                throw new Exception(erro);
        }
        #endregion