//Tipo: Prestador e Adquirente
        internal static void DownloadRecibosVerdesEmitidosWintouch(int ano, int mes, TipoReciboVerdePrestOUAdquir tipo)
        {
            List <string> detailsURLs = new List <string>();

            //Vai à lista de recibos verdes, para obter o URL de detalhes de cada um
            RecibosVerdesEmitidosNavegarPorCadaRecibo(ano, mes, tipo, (string downloadURL, string numRecibo, string nomeCliente) =>
            {
                //Para cada recibo, regista o URL para obter os detalhes
                string detailsUrl = downloadURL.Replace("/imprimir/", "/detalhe/").Replace("/normal", "");
                detailsURLs.Add(detailsUrl);
            });

            //Para contar os totais por tipo de recibo
            RecibosVerdesValores totaisTipoPagamento             = new RecibosVerdesValores();
            RecibosVerdesValores totaisTipoAdiantamento          = new RecibosVerdesValores();
            RecibosVerdesValores totaisTipoAdiantamentoPagamento = new RecibosVerdesValores();
            RecibosVerdesValores totaisAnulados = new RecibosVerdesValores();

            List <ReciboVerde> recibosVerdes = new List <ReciboVerde>(detailsURLs.Count);

            //List<ReciboVerde> recibosVerdes = (List<ReciboVerde>)new BinaryFormatter().Deserialize(new FileStream(@"C:\users\miguel\desktop\a.txt", FileMode.Open, FileAccess.Read));//TEMP

            //Depois de obtidos os URLs, navegar até à pagina de detalhes de cada um
            foreach (string detailsUrl in detailsURLs)
            {
                //Obtem os dados do recibo verde, navegado até à página de detalhes
                ReciboVerde reciboVerde = ObterDadosReciboVerde(detailsUrl, tipo);
                recibosVerdes.Add(reciboVerde);

                //Soma os valores para obter um total por tipo de recibo verde
                if (!reciboVerde.anulado)
                {
                    if (reciboVerde.tipoReciboVerde == TipoReciboVerde.Pagamento)
                    {
                        totaisTipoPagamento += reciboVerde.valores;
                    }
                    if (reciboVerde.tipoReciboVerde == TipoReciboVerde.Adiantamento)
                    {
                        totaisTipoAdiantamento += reciboVerde.valores;
                    }
                    if (reciboVerde.tipoReciboVerde == TipoReciboVerde.AdiantamentoPagamento)
                    {
                        totaisTipoAdiantamentoPagamento += reciboVerde.valores;
                    }
                }
                else
                {
                    totaisAnulados += reciboVerde.valores;
                }
            }

            //new BinaryFormatter().Serialize(new FileStream(@"c:\users\miguel\desktop\b.txt", FileMode.Create), recibosVerdes);
            GeraTabelaTxtTotais(totaisTipoPagamento, totaisTipoAdiantamento, totaisTipoAdiantamentoPagamento, totaisAnulados, mes, tipo);
            ExportarFicheiroWintouch(recibosVerdes, mes, tipo);
        }
        /// <summary>
        /// Escreve uma linha no ficheiro do wintouch, caso o valor não seja zero, na conta especificada
        /// Return: Devolve se escreveu alguma coisa ou não
        /// </summary>
        private static bool WintouchExportarLinha(StreamWriter fileStream, ReciboVerde reciboVerde, DefinicoesExportTipoReciboVerde definicoesExportTipoReciboVerde,
                                                  decimal valor, string codigoConta, char natureza, ref int numLinha)
        {
            if (valor == 0)
            {
                return(false); //Se o valor for 0 não escreve a linha
            }
            string codigoDiario    = definicoesExportTipoReciboVerde.diario;
            string codigoDocumento = definicoesExportTipoReciboVerde.tipoDoc;
            int    serie           = 1;

            string descricao = reciboVerde.descricao.Length > 50 ? reciboVerde.descricao.Substring(0, 50) : reciboVerde.descricao;

            int dia = reciboVerde.dataEmissao.Day;
            int mes = reciboVerde.dataEmissao.Month;

            string contibuinte;
            string nomeEntidade;

            if (reciboVerde.tipo == TipoReciboVerdePrestOUAdquir.Adquirente)
            {
                contibuinte  = reciboVerde.nifTransmitente;
                nomeEntidade = reciboVerde.nomeTrasmitente;
            }
            else
            {
                contibuinte  = reciboVerde.nifAdquirente;
                nomeEntidade = reciboVerde.nomeAdquirente;
            }
            nomeEntidade = nomeEntidade.Length > 50 ? nomeEntidade.Substring(0, 50) : nomeEntidade;

            int anulado = reciboVerde.anulado ? 1 : 0;

            string valorStr = String.Format("{0,18:F2}", valor).Replace(",", ".");
            //                            diario            serie             descric       nat  dia     mes      contrib       numLinha     nomeenti anulado
            string linha = String.Format("{0,10}{1,20}{2,20}{3,4}{4,10}{5,-20}{6,-50}{7,18}{8,1}{9,2:D2}{10,2:D2}{11,-20}F{12,20}{13,1}{14,5}{15,20}{16,-50}{17,1}",
                                         -1, codigoDiario, codigoDocumento,       //2
                                         serie, reciboVerde.numDoc, codigoConta,  //5
                                         descricao, valorStr, natureza, dia, mes, //10
                                         contibuinte, "", "C", numLinha, "",      //14
                                         nomeEntidade, anulado);

            fileStream.WriteLine(linha);
            numLinha++;
            return(true);
        }
        /// <summary>
        /// Exporta o recibo, escrevendo várias linhas no ficheiro
        /// </summary>
        /// <param name="fileStream"></param>
        /// <param name="reciboVerde"></param>
        /// <returns></returns>
        private static bool WintouchExportarRecibo(StreamWriter fileStream, ReciboVerde reciboVerde)
        {
            //As definiões de exportação indicam para que conta cada valor deve ir, etc.. Porque para tipos de documento (fatura-recibo, etc.)
            // e tipos de recibo (Pagamento, Adiantamento, etc.) são diferentes
            DefinicoesExportTipoReciboVerde definicoesExportTipoReciboVerde = ObterDefinicoesExportacaoRecibo(reciboVerde);

            int numLinha = 1;

            //Exporta uma linha para cada valor (valor base, iva, etc.)

            //A conta para qual o valor base vai depende se o valor de IVA é 0 ou não
            if (reciboVerde.valores.valorIvaContinente > 0)
            {
                WintouchExportarLinha(fileStream, reciboVerde, definicoesExportTipoReciboVerde,
                                      reciboVerde.valores.valorBase, definicoesExportTipoReciboVerde.contaValBase, 'C', ref numLinha);
            }
            else
            {
                WintouchExportarLinha(fileStream, reciboVerde, definicoesExportTipoReciboVerde,
                                      reciboVerde.valores.valorBase, definicoesExportTipoReciboVerde.contaValBaseIsento, 'C', ref numLinha);
            }

            WintouchExportarLinha(fileStream, reciboVerde, definicoesExportTipoReciboVerde,
                                  reciboVerde.valores.valorIvaContinente, definicoesExportTipoReciboVerde.contaIVA, 'C', ref numLinha);

            WintouchExportarLinha(fileStream, reciboVerde, definicoesExportTipoReciboVerde,
                                  reciboVerde.valores.impostoSelo, definicoesExportTipoReciboVerde.contaSelo, 'C', ref numLinha);

            WintouchExportarLinha(fileStream, reciboVerde, definicoesExportTipoReciboVerde,
                                  reciboVerde.valores.irsSemRetencao, definicoesExportTipoReciboVerde.contaIRS, 'D', ref numLinha);

            WintouchExportarLinha(fileStream, reciboVerde, definicoesExportTipoReciboVerde,
                                  reciboVerde.valores.importanciaRecebida, definicoesExportTipoReciboVerde.contaValRecebida, 'D', ref numLinha);


            return(true);
        }
        /**
         * Obtem os recibos verdes e coloca num excel
         */
        internal static void DownloadRecibosVerdesEmitidosExcelAnual(int ano)
        {
            List <string> detailsURLs = new List <string>();

            var tipo = TipoReciboVerdePrestOUAdquir.Prestador;

            //Vai à lista de recibos verdes, para obter o URL de detalhes de cada um
            RecibosVerdesEmitidosNavegarPorCadaRecibo(ano, -1, tipo, (string downloadURL, string numRecibo, string nomeCliente) =>
            {
                //Para cada recibo, regista o URL para obter os detalhes
                string detailsUrl = downloadURL.Replace("/imprimir/", "/detalhe/").Replace("/normal", "");
                detailsURLs.Add(detailsUrl);
            });

            List <ReciboVerde> recibosVerdes = new List <ReciboVerde>(detailsURLs.Count);

            //List<ReciboVerde> recibosVerdes = (List<ReciboVerde>)new BinaryFormatter().Deserialize(new FileStream(@"C:\users\miguel\desktop\a.txt", FileMode.Open, FileAccess.Read));//TEMP

            //Depois de obtidos os URLs, navegar até à pagina de detalhes de cada um
            foreach (string detailsUrl in detailsURLs)
            {
                //Obtem os dados do recibo verde, navegado até à página de detalhes
                ReciboVerde reciboVerde = ObterDadosReciboVerde(detailsUrl, tipo);
                recibosVerdes.Add(reciboVerde);
            }

            //Cria o excel
            XSSFWorkbook workbook = new XSSFWorkbook();
            ISheet       sheet    = workbook.CreateSheet("Recibos verdes");

            //Formato para celulas com data
            var newDataFormat = workbook.CreateDataFormat();
            var dateCellStyle = workbook.CreateCellStyle();

            dateCellStyle.BorderBottom = BorderStyle.None;
            dateCellStyle.BorderLeft   = BorderStyle.None;
            dateCellStyle.BorderTop    = BorderStyle.None;
            dateCellStyle.BorderRight  = BorderStyle.None;
            dateCellStyle.DataFormat   = newDataFormat.GetFormat("dd/MM/yyyy");


            var headerRow = sheet.CreateRow(0);

            string[] headers = new string[] { "Data", "Data de transmissao",
                                              "Estado", "Tipodoc.", "Nº", "NIF", "Nome", "País", "Recebia a título de ",
                                              "Descrição", "Base", "IVA", "Selo", "IRS", "Importancia recebida" };

            for (int i = 0; i < headers.Length; i++)
            {
                var dataCell = headerRow.CreateCell(i);
                dataCell.SetCellValue(headers[i]);
            }


            for (int i = 0; i < recibosVerdes.Count; i++)
            {
                ReciboVerde recibo = recibosVerdes[i];
                var         row    = sheet.CreateRow(i + 1);

                var dataCell = row.CreateCell(0);
                dataCell.SetCellValue(recibo.dataEmissao);
                dataCell.CellStyle = dateCellStyle;
                var dataTransmissaoCell = row.CreateCell(1);
                dataTransmissaoCell.SetCellValue(recibo.dataTransmissao);
                dataTransmissaoCell.CellStyle = dateCellStyle;
                row.CreateCell(2).SetCellValue(recibo.anulado ? "Anulado" : "Emitido");
                row.CreateCell(3).SetCellValue(recibo.tipoDoc);
                row.CreateCell(4).SetCellValue(recibo.numDoc);
                row.CreateCell(5).SetCellValue(recibo.nifAdquirente);
                row.CreateCell(6).SetCellValue(recibo.nomeAdquirente);
                row.CreateCell(7).SetCellValue(recibo.paisAdquirente);
                row.CreateCell(8).SetCellValue(GetReciboTipoString(recibo.tipoReciboVerde));
                row.CreateCell(9).SetCellValue(recibo.descricao);
                row.CreateCell(10).SetCellValue((double)recibo.valores.valorBase);
                row.CreateCell(11).SetCellValue((double)recibo.valores.valorIvaContinente);
                row.CreateCell(12).SetCellValue((double)recibo.valores.impostoSelo);
                row.CreateCell(13).SetCellValue((double)recibo.valores.irsSemRetencao);
                row.CreateCell(14).SetCellValue((double)recibo.valores.importanciaRecebida);
            }

            //Redimensiona as colunas
            for (int col = 0; col < headers.Length; col++)
            {
                sheet.AutoSizeColumn(col);
            }


            //Escreve o ficheiro
            string filePath = Path.Combine(GetDiretorioEmpresa(Declaracao.AT_LISTA_RECIBOS_VERDES_PARA_EXCEL_PRESTADOS, -1), "Lista recibos verdes.xlsx");

            new System.IO.FileInfo(filePath).Directory.Create();

            using (var fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
            {
                workbook.Write(fs);
            }
        }
        /**
         * Esta função navega até à pagina de detalhes, e obtem os dados do recibo,
         * tipo: Prestador ou Adquirente
         **/
        private static ReciboVerde ObterDadosReciboVerde(string detailsUrl, TipoReciboVerdePrestOUAdquir tipo)
        {
            driver.Navigate().GoToUrl(detailsUrl);

            ReciboVerde reciboVerde = new ReciboVerde();

            reciboVerde.detailsUrl = detailsUrl;
            reciboVerde.tipo       = tipo; // Prestador ou Adquirente

            //Obter dados
            string[] doc = driver.FindElement(By.XPath("/html/body/div/main/div/div[2]/div/section/div[2]/div/div/div[1]/div[1]/h1")).Text.Split(' ');
            reciboVerde.tipoDoc = doc[0];
            reciboVerde.numDoc  = doc[2];

            string estado = driver.FindElement(By.XPath("/html/body/div/main/div/div[2]/div/section/div[2]/div/div/div[1]/div[1]/h1/span")).Text;

            reciboVerde.anulado = estado.ToLower() == "anulado";

            string dataEmissao = driver.FindElement(By.XPath("/html/body/div/main/div/div[2]/div/section/div[2]/div/div/div[2]/div/legend/small"))
                                 .Text.Replace("Emitida a ", "");
            string dataTransmissao = driver.FindElement(By.XPath("/html/body/div/main/div/div[2]/div/section/div[5]/div[2]/div/div[2]/dl/dd")).Text;

            reciboVerde.dataEmissao     = DateTime.ParseExact(dataEmissao, "yyyy-MM-dd", CultureInfo.InvariantCulture);
            reciboVerde.dataTransmissao = DateTime.ParseExact(dataTransmissao, "yyyy-MM-dd", CultureInfo.InvariantCulture);

            reciboVerde.nifTransmitente = driver.FindElement(By.XPath("/html/body/div/main/div/div[2]/div/section/div[3]/div[2]/div/div[1]/dl/dd")).Text;
            reciboVerde.nifAdquirente   = driver.FindElement(By.XPath("/html/body/div/main/div/div[2]/div/section/div[4]/div[2]/div[1]/div[1]/dl/dd")).Text;
            reciboVerde.descricao       = driver.FindElement(By.XPath("/html/body/div/main/div/div[2]/div/section/div[5]/div[2]/div/div[3]/dl/dd")).Text;
            reciboVerde.nomeAdquirente  = driver.FindElement(By.XPath("/html/body/div/main/div/div[2]/div/section/div[4]/div[2]/div[1]/div[2]/dl/dd")).Text;
            reciboVerde.nomeTrasmitente = driver.FindElement(By.XPath("/html/body/div/main/div/div[2]/div/section/div[3]/div[2]/div/div[2]/dl/dd")).Text;
            reciboVerde.paisAdquirente  = driver.FindElement(By.XPath("/html/body/div/main/div/div[2]/div/section/div[4]/div[2]/div[2]/div/dl/dd")).Text;

            //Obtem as string que têm os valores
            string valorBaseStr           = driver.FindElement(By.XPath("/html/body/div/main/div/div[2]/div/section/div[5]/div[2]/div/div[4]/dl/div[2]/dd")).Text;
            string valorIvaContinenteStr  = driver.FindElement(By.XPath("/html/body/div/main/div/div[2]/div/section/div[5]/div[2]/div/div[4]/dl/div[4]/dd")).Text;
            string impostoSeloStr         = driver.FindElement(By.XPath("/html/body/div/main/div/div[2]/div/section/div[5]/div[2]/div/div[4]/dl/div[6]/dd")).Text;
            string irsSemRetencaoStr      = driver.FindElement(By.XPath("/html/body/div/main/div/div[2]/div/section/div[5]/div[2]/div/div[4]/dl/div[8]/dd")).Text;
            string importanciaRecebidaStr = driver.FindElement(By.XPath("/html/body/div/main/div/div[2]/div/section/div[5]/div[2]/div/div[4]/dl/div[10]/dd")).Text;

            //Converte os valores para decimal
            reciboVerde.valores                     = new RecibosVerdesValores();
            reciboVerde.valores.valorBase           = Convert.ToDecimal(valorBaseStr.Remove(valorBaseStr.Length - 2), culture);
            reciboVerde.valores.valorIvaContinente  = Convert.ToDecimal(valorIvaContinenteStr.Remove(valorIvaContinenteStr.Length - 2), culture);
            reciboVerde.valores.impostoSelo         = Convert.ToDecimal(impostoSeloStr.Remove(impostoSeloStr.Length - 2), culture);
            reciboVerde.valores.irsSemRetencao      = Convert.ToDecimal(irsSemRetencaoStr.Remove(irsSemRetencaoStr.Length - 2), culture);
            reciboVerde.valores.importanciaRecebida = Convert.ToDecimal(importanciaRecebidaStr.Remove(importanciaRecebidaStr.Length - 2), culture);

            //Obtem o tipo de recibo verde, vendo qual checkbox est]a checked
            IWebElement checkboxTipoPagamento         = driver.FindElement(By.XPath("/html/body/div/main/div/div[2]/div/section/div[5]/div[2]/div/div[1]/dl/dt[2]/div/div[1]/label/input"));
            IWebElement checkboxTipoAdiantamento      = driver.FindElement(By.XPath("/html/body/div/main/div/div[2]/div/section/div[5]/div[2]/div/div[1]/dl/dt[2]/div/div[2]/label/input"));
            IWebElement checkboxTipoAdiantamentoPagam = driver.FindElement(By.XPath("/html/body/div/main/div/div[2]/div/section/div[5]/div[2]/div/div[1]/dl/dt[2]/div/div[3]/label/input"));


            if (checkboxTipoPagamento.Selected)
            {
                reciboVerde.tipoReciboVerde = TipoReciboVerde.Pagamento;
            }
            else if (checkboxTipoAdiantamento.Selected)
            {
                reciboVerde.tipoReciboVerde = TipoReciboVerde.Adiantamento;
            }
            else
            {
                reciboVerde.tipoReciboVerde = TipoReciboVerde.AdiantamentoPagamento;
            }

            return(reciboVerde);
        }
        /// <summary>
        /// Obtem as definiões de exportação para o recibo verde, que indicam para que conta cada valor deve ir, etc..
        /// Porque para tipos de documento (fatura-recibo, etc.) e tipos de recibo (Pagamento, Adiantamento, etc.) são diferentes
        /// </summary>
        /// <param name="reciboVerde"></param>
        /// <returns></returns>
        private static DefinicoesExportTipoReciboVerde ObterDefinicoesExportacaoRecibo(ReciboVerde reciboVerde)
        {
            //Seleciona se usa as definicoes de Prestador ou Adquirente
            DefinicoesExportacao definicoesExportacaoTipo;

            if (reciboVerde.tipo == TipoReciboVerdePrestOUAdquir.Prestador)
            {
                definicoesExportacaoTipo = Definicoes.definicoesExportacaoPrestador;
            }
            else
            {
                definicoesExportacaoTipo = Definicoes.definicoesExportacaoAdquirente;
            }

            //Obtem para que conta cada valor deve ir, etc.
            //Seleciona consoante o tipo de documento (fatura-recibo, etc.)
            DefinicoesExportTipoDoc defExportFaturaRecibo;

            switch (reciboVerde.tipoDoc)
            {
            case "Fatura-Recibo":
                defExportFaturaRecibo = definicoesExportacaoTipo.defExportFaturaRecibo;
                break;

            case "Fatura":
                defExportFaturaRecibo = definicoesExportacaoTipo.defExportFatura;
                break;

            case "Recibo":
                defExportFaturaRecibo = definicoesExportacaoTipo.defExportRecibo;
                break;

            default:
                throw new Exception(String.Format("Não está previsto o tipo documento {0}", reciboVerde.tipoDoc));
            }

            //Seleciona consoante o tipo de Recibo Verde (Pagamento, Adiantamento, etc.)
            DefinicoesExportTipoReciboVerde definicoesExportTipoReciboVerde = new DefinicoesExportTipoReciboVerde();

            switch (reciboVerde.tipoReciboVerde)
            {
            case TipoReciboVerde.Pagamento:
                definicoesExportTipoReciboVerde = defExportFaturaRecibo.defExportTipoPagamento;
                break;

            case TipoReciboVerde.Adiantamento:
                definicoesExportTipoReciboVerde = defExportFaturaRecibo.defExportTipoAdiantamento;
                break;

            case TipoReciboVerde.AdiantamentoPagamento:
                definicoesExportTipoReciboVerde = defExportFaturaRecibo.defExportTipoAdiantamentoPagamento;
                break;
            }
            return(definicoesExportTipoReciboVerde);
        }