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