public static string GetDiretorioEmpresa(Declaracao declaracao, int mes)
        {
            string folderTipoDeclaracao = GetFolderTipoDeclaracao(declaracao, mes);

            return(Path.Combine(DownloadFolder, folderTipoDeclaracao,
                                empresaAutenticada.Codigo + "-" + empresaAutenticada.NIF));
        }
Exemple #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="ano"></param>
        /// <param name="mes"></param>
        /// <param name="linkAClicar">Trata-se do nome do link em que é para carregar, na lista de opções ("Obter comprovativo" ou "Obter documento de pagamento")</param>
        internal static void DownloadDMR(int ano, int mes, string linkAClicar, Declaracao declaracao, string estruturaFicheiro)
        {
            driver.Navigate().GoToUrl("https://www.portaldasfinancas.gov.pt/pt/external/oadmrsv/consultarDMR.action");

            //Selecionar ano e mes
            var selectMes = new SelectElement(driver.FindElement(By.Id("mes")));

            selectMes.SelectByValue(mes.ToString());
            var selectAno = new SelectElement(driver.FindElement(By.Id("ano")));

            selectAno.SelectByValue(ano.ToString());

            driver.FindElement(By.Id("pesquisar")).Click();
            Thread.Sleep(500);
            //Download
            var elementosLista = driver.FindElements(By.XPath("//*[@id=\"tab1\"]/div[1]/div[3]/div/ul/*/a"));

            foreach (var elemento in elementosLista)
            {
                if (elemento.GetAttribute("innerHTML").Contains(linkAClicar))
                {
                    ExpectDownload();
                    driver.Navigate().GoToUrl(elemento.GetAttribute("href"));

                    ClickButtonWaitForItToAppear(By.Id("obter-btn"));

                    WaitForDownloadFinish(GenNovoNomeFicheiro(estruturaFicheiro),
                                          declaracao, mes);
                }
            }
        }
 private static void LogError(Exception ex, Empresa empresa, Declaracao declaracao)
 {
     if (declaracao == null)
     {
         errors.Add(empresa.NIF + " erro: " + ex.Message);
     }
     else
     {
         errors.Add(empresa.NIF + " erro em " + declaracao.Nome + ": " + ex.Message);
     }
 }
        internal static void WaitForDownloadFinish(string newName, Declaracao declaracao, int mes)
        {
            //Espera que o download comece
            Util.WaitForFileCountToBeGreaterThan(DownloadFolder, numFilesInDownloadsFolder);

            //Espera que ele acabe
            Util.WaitForAllFilesToDownload(DownloadFolder);

            Thread.Sleep(500);

            //Espera que o ficheiro final esteja pronto
            Util.WaitForFileCountToBeGreaterThan(DownloadFolder, numFilesInDownloadsFolder);

            var diretorio = GetDiretorioEmpresa(declaracao, mes);

            Thread.Sleep(1000);
            //Muda o nome
            Util.RenameLastModifiedFileInFolder(DownloadFolder, newName, diretorio);
            numFilesInDownloadsFolder++;
        }
        internal static Declaracao[] MergeArrays(params Declaracao[][] declaracoesArray)
        {
            int totalLen = 0;

            //Aloca espaço para a array total
            foreach (Declaracao[] declacacoes in declaracoesArray)
            {
                totalLen += declacacoes.Length;
            }
            Declaracao[] mergedArray = new Declaracao[totalLen];

            int pos = 0;

            foreach (Declaracao[] declacacoes in declaracoesArray)
            {
                Array.Copy(declacacoes, 0, mergedArray, pos, declacacoes.Length);
                pos += declacacoes.Length;
            }

            return(mergedArray);
        }
        public static string GetFolderTipoDeclaracao(Declaracao declaracao, int mes)
        {
            if (declaracao.Tipo == Declaracao.TipoDeclaracao.Anual)
            {
                return("Anuais");
            }
            else if (declaracao.Tipo == Declaracao.TipoDeclaracao.Mensal)
            {
                return(mes.ToString());
            }
            else if (declaracao.Tipo == Declaracao.TipoDeclaracao.Lista)
            {
                return("Listas");
            }
            else if (declaracao.Tipo == Declaracao.TipoDeclaracao.Pedido)
            {
                return("Pedidos");
            }

            return("A");
        }
        internal static void Executar(Empresa[] empresas,
                                      Declaracao[] declaracoes,
                                      int ano, int mes,
                                      string downloadFolder,
                                      Action <int> reportProgress,
                                      bool headless)
        {
            Downloader.reportProgress = reportProgress;
            filesToRename             = new List <string>();
            logMessage = new StringBuilder();

            Ano = ano;
            Mes = mes;

            totalEmpresas = empresas.Length;
            //Para cada empresa
            for (int iEmpresa = 0; iEmpresa < totalEmpresas; iEmpresa++)
            {
                Empresa empresa = empresas[iEmpresa];
                //Cria a pasta, o driver e autentica essa empresa
                try
                {
                    DownloadFolder = Path.Combine(downloadFolder, ano.ToString());
                    Directory.CreateDirectory(DownloadFolder);
                    CriarDriver(DownloadFolder, headless);
                    Autenticar(empresa, declaracoes);
                }
                catch (Exception ex)
                {
                    LogError(ex, empresa, null);
                    break;
                }


                totalDeclaracoes = declaracoes.Length;
                //Para cada declaração executa o que tem a fazer
                for (int iDeclaracao = 0; iDeclaracao < declaracoes.Length; iDeclaracao++)
                {
                    numDeclaracaoAProcessar = iDeclaracao;
                    Declaracao declaracao = declaracoes[iDeclaracao];
                    try
                    {
                        if (declaracao.DownloadFunctionAnual != null)
                        {
                            declaracao.DownloadFunctionAnual.Invoke(ano);
                        }
                        else if (declaracao.DownloadFunctionMensal != null)
                        {
                            declaracao.DownloadFunctionMensal.Invoke(ano, mes);
                        }
                    }
                    catch (Exception ex)
                    {
                        //Se der erro regista-o mas prossegue
                        LogError(ex, empresa, declaracao);
                    }

                    CalcularProgresso();
                }

                //Fecha o chrome quanto todas as transferências terminarem (já não existirem ficheiros ".crdownload")
                try
                {
                    Thread.Sleep(2000);
                    Util.WaitForAllFilesToDownload(DownloadFolder);
                    FecharDriver();
                }
                catch (Exception ex)
                {
                    LogError(ex, empresa, null);
                    break;
                }

                filesToRename.Clear();
            }

            FecharDriver();
        }