예제 #1
0
        public FileResult BuscaPdf(string fileName, int ano)
        {
            if (fileName == null && ano == 0)
            {
                throw new Exception("Parâmetros inválidos");
            }

            var consulta = new ConsultaInformeColaboradorQueryHandler();
            var filtro   = new InformeColaboradorFiltro {
                AnoExercicio = ano, CPFCNPJ = fileName
            };

            var arquivo = consulta.Execute(filtro).FirstOrDefault();

            var caminhoDir      = arquivo.CaminhoDiretorio;
            var nomeServer      = ConfigurationManager.AppSettings["NomeServer"].RemoveContraBarra();
            var diretorioServer = ConfigurationManager.AppSettings["DiretorioServer"].RemoveContraBarra();
            var raizPathInformesColaboradores = String.Format(@"\\{0}\{1}", nomeServer, diretorioServer);

            while (Path.IsPathRooted(caminhoDir))
            {
                caminhoDir = caminhoDir.Remove(0, 1);
            }

            var path = Path.Combine(raizPathInformesColaboradores, caminhoDir, fileName +
                                    arquivo.ExtensaoArquivo);

            var servico = new ArquivoServico();

            try
            {
                using (servico.Conexao = RedeUtil.RecuperarConexaoRede(servico.CaminhoDiretorio, servico.Usuario))
                {
                    FileStream file = new FileStream(path, FileMode.Open);
                    return(File(file, "application/pdf", fileName + ".pdf"));
                }
            }
            catch (Exception e)
            {
                servico.Conexao.Dispose();

                throw new Exception("Erro ao tentar baixar arquivo " + arquivo.CPFCNPJ + " " + e.Message, e.InnerException);
            }
        }
예제 #2
0
        public static void Main(string[] args)
        {
            //Variáveis de configurações
            _arquivoServico = new ArquivoServico();
            _gir            = new GIRServico();
            Ano             = 2018;

            LoteDTO lote;

            using (_arquivoServico.Conexao = RedeUtil.RecuperarConexaoRede(_arquivoServico.CaminhoDiretorio, _arquivoServico.Usuario))
            {
                Console.WriteLine("==========Teste de performance em arquivos==========");
                Console.WriteLine("Digite SIM para processamento individual");
                Console.WriteLine("Digite NÂO para processamento em lote");
                lote = GerarLote();
                var frase = Console.ReadLine();

                if (!string.IsNullOrEmpty(frase) && frase.ToLower() == "sim")
                {
                    lote.Individual = true;
                }
                else
                {
                    lote.ContribuintesArquivoTxt = _arquivoServico.LerDirfTxt(lote);
                }

                var tarefas = new List <Task>();

                //Para cada arquivo importado (upload) cria-se task para fazer a divisão desses arquivos
                foreach (var arquivo in lote.ArquivosImportados.Where(a => a.ExtensaoArquivo == ".pdf"))
                {
                    var tarefa = new Task(() => { Rotina(arquivo, lote); });
                    tarefas.Add(tarefa);
                    tarefa.Start();
                }

                //Depois que as tarefas terminarem de ser executadas. Verifica-se por ultimo, se houver erro ou não.
                var continuation = Task.Factory.ContinueWhenAll(tarefas.ToArray(), (antecedents) =>
                {
                    if (antecedents.All(a => a.Exception == null))
                    {
                        try
                        {
                            RenomearArquivos(lote);
                            lote.TipoSituacao = TipoSituacao.Processado;
                            _gir.GravarRotina(lote);
                        }
                        catch (DbEntityValidationException)
                        {
                            throw;
                        }
                        catch (Exception e)
                        {
                            //Caso falha a renomeacao dos arquivos ou merge
                            lote.ContribuintesArquivoTxt.ForEach(c =>
                            {
                                if (c.Arquivo.CaminhoArquivo != null)
                                {
                                    c.Status       = StatusContribuinte.FalhaArquivo;
                                    c.TipoSituacao = TipoSituacao.Erro;
                                }
                            });
                            lote.ContribuinteIndividual.Status       = StatusContribuinte.FalhaArquivo;
                            lote.ContribuinteIndividual.TipoSituacao = TipoSituacao.Erro;

                            var exception = e.InnerException ?? e;
                            var w32ex     = exception as Win32Exception;

                            lote.TipoSituacao = TipoSituacao.Erro;
                            lote.CodigoErro   = (w32ex != null ? w32ex.ErrorCode : 0);
                            lote.MensagemErro = exception.Message;

                            _gir.GravarRotina(lote);

                            throw e;
                        }

                        Console.WriteLine("Todas as tarefas foram concluídas com sucesso!");
                        Debug.WriteLine("Todas as tarefas foram concluídas com sucesso!");
                    }
                    //Se houver qualquer exceção lançada em uma task, trataremos aqui esta exceção, neste bloco de codigo
                    else
                    {
                        var task = antecedents.FirstOrDefault(a => a.Exception.GetType() == typeof(NegocioException));
                        if (task != null)
                        {
                            var ex = task.Exception;
                            if (ex != null)
                            {
                                throw new NegocioException(ex.Message, ex.InnerException);
                            }
                        }

                        //Seta falha no arquivo pois não foi feito a renomeacao e nem o merge
                        lote.ContribuintesArquivoTxt.ForEach(c =>
                        {
                            if (c.Arquivo.CaminhoArquivo != null)
                            {
                                c.Status       = StatusContribuinte.FalhaArquivo;
                                c.TipoSituacao = TipoSituacao.Erro;
                            }
                        });
                        lote.ContribuinteIndividual.Status       = StatusContribuinte.FalhaArquivo;
                        lote.ContribuinteIndividual.TipoSituacao = TipoSituacao.Erro;

                        task = (antecedents.FirstOrDefault(a => a.Exception != null));

                        var exception = task.Exception.InnerException ?? task.Exception;
                        var w32ex     = exception as Win32Exception;

                        lote.TipoSituacao = TipoSituacao.Erro;
                        lote.CodigoErro   = (w32ex != null ? w32ex.ErrorCode : 0);
                        lote.MensagemErro = exception.Message;

                        _gir.GravarRotina(lote);

                        var exceptions = antecedents.Where(a => a.Exception != null).Select(a => a.Exception).ToList();
                        var excecoes   = new List <Exception>();

                        foreach (var excep in exceptions)
                        {
                            excecoes.Add(new Exception(excep.InnerException.Message, excep.InnerException));
                        }

                        AggregateException e = new AggregateException(excecoes);

                        Console.WriteLine("Ocorreu falhas no processamento - Split pdf falhou!");
                        Debug.WriteLine("Ocorreu falhas no processamento - Split pdf falhou!");

                        throw e;
                    }
                });

                continuation.Wait();
                Console.Read();
            }
        }
예제 #3
0
        public static IEnumerable <ArquivoVM> ArmazenarArquivosParaProcessamento(IEnumerable <HttpPostedFileBase> arquivos, ArquivoServico servico)
        {
            var arquivosArmazenados = new List <ArquivoVM>();
            var caminho             = String.Format(@"{0}\{1}", servico.CaminhoDiretorio, ArquivoServico.PastaTempUpload);
            var dto = new ArquivoVM();

            try
            {
                using (servico.Conexao = RedeUtil.RecuperarConexaoRede(servico.CaminhoDiretorio, servico.Usuario))
                {
                    Directory.CreateDirectory(caminho);

                    foreach (var item in arquivos)
                    {
                        var nomeArquivo = ValidaNomeArquivoParaUpload(item.FileName);
                        var path        = String.Format(@"{0}\{1}", caminho, nomeArquivo);

                        dto = new ArquivoVM()
                        {
                            CaminhoArquivo = path,
                            NomeArquivo    = nomeArquivo
                        };

                        /*
                         * Utilizando filestream ao invés do método SaveAs do HttpPostedFileBase
                         * devido ao um bug de envio de arquivo pdf corrompido
                         */
                        using (FileStream arquivo = new FileStream(path, FileMode.Create))
                        {
                            item.InputStream.CopyTo(arquivo);
                        }

                        dto.ExtensaoArquivo = Path.GetExtension(path).ToLower();

                        arquivosArmazenados.Add(dto);
                    }
                }
            }
            catch (Exception e)
            {
                servico.Conexao.Dispose();

                if (!String.IsNullOrEmpty(dto.CaminhoArquivo))
                {
                    dto.ArquivoFalhouAoImportar = true;
                    arquivosArmazenados.Add(dto);
                }
                else
                {
                    throw new Exception("Erro ao tentar importar arquivos" + e.Message, e.InnerException);
                }
            }

            return(arquivosArmazenados);
        }
예제 #4
0
        public static void ValidaEnvioArquivosDuplicados(List <ArquivoVM> arquivosUpload, List <HttpPostedFileBase> arquivosEnviados, ArquivoServico arquivoServico)
        {
            //Verificar se o usuário mandou outro arquivo txt
            if (arquivosUpload.Any(a => a.ExtensaoArquivo == ".txt") &&
                arquivosEnviados.Any(a => a.ContentType == "text/plain"))
            {
                //Remoção do arquivo na lista e diretório para efetuar upload novamente
                var txt = arquivosUpload.FirstOrDefault(a => a.ExtensaoArquivo == ".txt");
                arquivoServico.DeletarArquivo(txt.CaminhoArquivo);
                arquivosUpload.Remove(txt);
            }

            //Verifica com base no nome do arquivo se já foi feito upload
            for (int i = arquivosEnviados.Count - 1; i >= 0; i--)
            {
                var file = arquivosUpload.FirstOrDefault(a => a.NomeArquivo == arquivosEnviados[i].FileName);
                if (file != null)
                {
                    if (file.ArquivoFalhouAoImportar)
                    {
                        //Remoção da lista para efetuar upload novamente
                        arquivosUpload.Remove(file);
                    }
                    else
                    {
                        //Remoção para não duplicar e não processar arquivo novamente
                        arquivosEnviados.RemoveAt(i);
                    }
                }
            }
        }
예제 #5
0
 public ProcessamentoController()
 {
     _arquivoServico = new ArquivoServico();
     _repositorio    = new RepositorioTempData(TempData);
 }