//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); }