/*Busca arquivos de edital para licitações antigas que tenham data de abertura maior do que o dia corrente.*/ private static void HistoricFiles() { RService.Log("(HistoricFiles) " + Historic + ": Buscando licitações..." + " at {0}", Path.GetTempPath() + Historic + ".txt"); try { DateTime dataLimite = DateTime.Today.AddDays(-90); /*Busca licitações com a data de abertura anterior a 90 dias, ou que ainda não aconteceu*/ List <Licitacao> licitacoes = LicitacaoController.FindByRangeHistoric(Constants.CN_HOST, dataLimite); RService.Log("(HistoricFiles) " + Historic + ": " + licitacoes.Count + " licitacões encontradas at {0}", Path.GetTempPath() + Historic + ".txt"); licitacoesHistorico = new List <string>(); foreach (Licitacao licitacao in licitacoes) { RService.Log("(HistoricFiles) " + Historic + ": Consultando ata e histórico da licitação " + licitacao.IdLicitacaoFonte + " at {0}", Path.GetTempPath() + Historic + ".txt"); ConsultaAtaPregao(licitacao); GetHistoricos(licitacao, Historic); } } catch (Exception e) { RService.Log("Exception (HistoricFiles) " + Historic + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Historic + ".txt"); } }
/*Busca arquivos de edital para licitações antigas que tenham data de abertura maior do que o dia corrente.*/ private static void RemainingFiles() { RService.Log("(RemainingFiles) " + Name + ": Buscando arquivos de licitações antigas..." + " at {0}", Path.GetTempPath() + Name + ".txt"); try { /*Busca licitações com a data de abertura maior do que o dia corrente*/ List <Licitacao> licitacoes = LicitacaoController.GetAberturaGratherThan(DateTime.Today, Constants.BB_HOST); TryReload = true; foreach (Licitacao lic in licitacoes) { //if (lic.DigitacaoData.HasValue) //{ /*Verifica e baixa os arquivos que ainda não foram coletados*/ DownloadEdAndCreatLicArq(lic.IdLicitacaoFonte.ToString(), lic); //} } } catch (Exception e) { RService.Log("Exception (RemainingFiles) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } finally { if (web != null) { web.Close(); } } }
private static void UpdateLicitacoes() { try { /*Inicia navegador fantasma para atualização de licitações*/ if (web != null) { web.Quit(); } var driver = ChromeDriverService.CreateDefaultService(); driver.HideCommandPromptWindow = true; var op = new ChromeOptions(); op.AddUserProfilePreference("download.default_directory", PathEditais); web = new ChromeDriver(driver, new ChromeOptions(), TimeSpan.FromSeconds(300)); web.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(300); wait = new WebDriverWait(web, TimeSpan.FromSeconds(300)); List <Licitacao> licitacoes = LicitacaoController.FindBySituationBB(); foreach (var licitacao in licitacoes) { web.Navigate().GoToUrl(licitacao.LinkEdital); HandleReCaptcha(); var situacaoDiv = web.FindElement(By.XPath("//*[@id=\"divConsultarDetalhesLicitacao\"]/fieldset/div[11]")); if (situacaoDiv != null) { string situacao = web.FindElement(By.XPath("//*[@id=\"divConsultarDetalhesLicitacao\"]/fieldset/div[11]")).Text.TrimStart().TrimEnd(); if (!string.IsNullOrEmpty(situacao) && situacao != licitacao.Situacao) { licitacao.Situacao = situacao; Repo.Update(licitacao); RService.Log("(UpdateLicitacoes) " + Name + ": Situação da licitação " + licitacao.Id + " atualizada para " + situacao + " at {0}", Path.GetTempPath() + Name + ".txt"); } } } } catch (Exception e) { RService.Log("Exception (UpdateLicitacoes) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } finally { if (web != null) { web.Close(); } } }
/**Cria uma nova licitação*/ private static Licitacao CreateLicitacao(HtmlDocument htmlDocument, string linkEdital) { RService.Log("(CreateLicitacao) " + Name + ": Criando licitação... " + Id + " at {0}", Path.GetTempPath() + Name + ".txt"); try { IEnumerable <HtmlNode> spanNodes = htmlDocument.DocumentNode.Descendants("span"); Licitacao licitacao = new Licitacao(); licitacao.Lote = Lote; licitacao.Num = Id; licitacao.IdLicitacaoFonte = long.Parse(Id); string modalidade = spanNodes.SingleOrDefault(x => x.Attributes.Contains("id") && x.Attributes["id"].Value.Contains("procedimentoContratacao")).InnerText; licitacao.Modalidade = modalidade.Contains("eletr") ? Modalidades[0] : Modalidades[1]; licitacao.LinkSite = Constants.CMG_HOST; licitacao.Orgao = Orgao; licitacao.IdFonte = 506; licitacao.Excluido = 0; licitacao.SegmentoAguardandoEdital = 0; licitacao.DigitacaoUsuario = 43; //Robo licitacao.LinkEdital = linkEdital; licitacao.CidadeFonte = 2754; licitacao.Cidade = Constants.CMG_CIDADE; licitacao.EstadoFonte = Constants.CMG_UF; licitacao.Estado = Constants.CMG_ESTADO; licitacao.Observacoes = "ENDERECO NAO DIVULGADO."; licitacao.Situacao = Situacao; //licitacao.DigitacaoData = null; //licitacao.ProcessamentoData = null; string departamento = spanNodes.SingleOrDefault(x => x.Attributes.Contains("id") && x.Attributes["id"].Value.Contains("unidadeCompra")).InnerText; licitacao.Departamento = departamento.Trim() + " SECRETARIA: " + Secretaria; string data = spanNodes.SingleOrDefault(x => x.Attributes.Contains("id") && x.Attributes["id"].Value.Contains("dataInicioSessaoPregao")).InnerText; string hora = spanNodes.SingleOrDefault(x => x.Attributes.Contains("id") && x.Attributes["id"].Value.Contains("horaInicioSessaoPregao")).InnerText; DateTime?aberturaEntrega = DateHandle.Parse(data.Trim() + " " + hora.Trim(), "dd/MM/yyyy hh:mm:ss"); licitacao.AberturaData = aberturaEntrega; licitacao.EntregaData = aberturaEntrega; licitacao.Objeto = spanNodes.SingleOrDefault(x => x.Attributes.Contains("id") && x.Attributes["id"].Value.Contains("objetoLicitacao")).InnerText; return(LicitacaoController.IsValid(licitacao, out mensagemErro) ? licitacao : null); } catch (Exception e) { RService.Log("Exception " + Name + ": (CreateLicitacao)" + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); return(null); } }
/*Cria os objetos Licitacao, Lote e LicitacaoArquivo fazendo as verificações necessárias.*/ private static void HandleCreate(HtmlDocument htmlDoc, string ocnum, string situacao) { try { Regex regex = new Regex("\\d{4}OC"); string ocn = ocnum; ocnum = "1" + regex.Replace(ocnum, DateTime.Now.ToString("yy")); /*Verifica se a oc já não esta na base de dados, cria um novo lote se for preciso*/ //if (!string.IsNullOrEmpty(ocnum) && !AlreadyInserted.Contains(long.Parse(ocnum)) && AguardandoPropostasEditalPub(htmlDoc) && !AlreadyColected.Contains(long.Parse(ocnum))) if (!string.IsNullOrEmpty(ocn) && !LicitacaoController.ExistsBEC(ocn)) { //AlreadyColected.Add(long.Parse(ocnum)); //Preenche os dados da licitação e retorna para inserir na lista Licitacao licitacao = CreateLicitacao(htmlDoc, ocnum, situacao); if (licitacao != null && !string.IsNullOrEmpty(licitacao.LinkEdital)) { licitacao.Observacoes = ocn; Repo.Insert(licitacao); //licitacoes.Add(licitacao); HtmlDocument htmlEditais = WebHandle.GetHtmlDocOfPage(licitacao.LinkEdital); int numeroArquivo = 2; //Faz o download de todos os arquivos do edital foreach (HtmlNode editais in htmlEditais.DocumentNode.Descendants("a").Where(x => x.Attributes.Contains("href") && x.Attributes["href"].Value.Contains("ctl00$conteudo$WUC_Documento1$dgDocumento"))) { DownloadEditais(licitacao.LinkEdital, GetFormParametersEdital(htmlEditais, numeroArquivo)); } CreateLicitacaoArquivo(licitacao); NumLicitacoes++; } else { RService.Log("Exception (HandleCreate) " + Name + ": A licitação não foi salva - Motivo(s): " + mensagemErro + " at {0}", Path.GetTempPath() + Name + ".txt"); } } else if (!string.IsNullOrEmpty(ocn) && LicitacaoController.ExistsBEC(ocn) && LicitacaoController.SituacaoAlteradaBEC(ocn, situacao)) { int id = LicitacaoController.GetIdByObservacoes(ocn); LicitacaoController.UpdateSituacaoByIdLicitacao(id, situacao); } } catch (Exception e) { RService.Log("Exception (HandleCreate) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } }
private static Licitacao GetLicitacao() { Licitacao licitacao = new Licitacao(); licitacao.Lote = Lote; licitacao.IdFonte = Constants.CRJ_ID_FONTE; var x = web.FindElement(By.Id("idLicitacao")).GetAttribute("value"); licitacao.IdLicitacaoFonte = long.Parse(x); licitacao.LinkSite = Constants.CRJ_HOST; licitacao.LinkEdital = Constants.CRJ_LINK_LICITACAO; licitacao.EstadoFonte = Constants.CRJ_ESTADO_FONTE; licitacao.Estado = Constants.CRJ_ESTADO; licitacao.DigitacaoUsuario = 43; var title = web.FindElement(By.XPath("//*[@id=\"panelId\"]/div[1]/div/div/p")).Text.Trim(); var dept = web.FindElement(By.XPath("//*[@id=\"panelId\"]/div[2]/div/div/p[1]")).Text.Trim(); var situation = web.FindElement(By.XPath("//*[@id=\"panelId\"]/div[3]/div[1]/div/p")).Text.Trim(); var modal = web.FindElement(By.XPath("//*[@id=\"panelId\"]/div[3]/div[2]/div/p")).Text.Trim(); var publish = web.FindElement(By.XPath("//*[@id=\"panelId\"]/div[4]/div[1]/div/p")).Text.Trim(); var opening = web.FindElement(By.XPath("//*[@id=\"panelId\"]/div[4]/div[2]/div/p")).Text.Trim(); licitacao.Num = title.Split('-')[0].Trim(); licitacao.Processo = title.Split('-')[0].Trim(); licitacao.Objeto = title + " Obs.: Os arquivos do edital podem ser obtidos no site do Compras Rio de Janeiro."; licitacao.Departamento = dept; licitacao.Situacao = situation; licitacao.Modalidade = NameToModalidade.ContainsKey(StringHandle.RemoveAccent(modal.ToUpper())) ? NameToModalidade[StringHandle.RemoveAccent(modal.ToUpper())] : null; if (licitacao.Modalidade == null && licitacao.Processo.Contains("PE")) { licitacao.Modalidade = NameToModalidade["PREGAO ELETRONICO"]; } var orgao = dept.Split('-')[1].Trim(); licitacao.Orgao = Orgaos.Exists(o => o.Nome == orgao) ? Orgaos.First(o => o.Nome == orgao) : OrgaoRepository.CreateOrgao(orgao, Constants.CRJ_ESTADO_FONTE); licitacao.EntregaData = DateHandle.Parse(publish, "dd/MM/yyyy-hh:mm"); licitacao.AberturaData = DateHandle.Parse(opening, "dd/MM/yyyy-hh:mm"); licitacao.Cidade = Constants.CRJ_ESTADO; licitacao.CidadeFonte = Constants.CRJ_CIDADE_FONTE; return(LicitacaoController.IsValid(licitacao, out mensagemErro) ? licitacao : null); }
/*Cria os objetos Licitacao, Lote e LicitacaoArquivo fazendo as verificações necessárias.*/ private static void HandleCreate(HtmlDocument htmlDoc, string ocnum, string situacao) { try { Regex regex = new Regex("\\d{4}OC"); string ocn = ocnum; ocnum = "1" + regex.Replace(ocnum, DateTime.Now.ToString("yy")); //Criar um novo lote se for preciso, verifica o status da oc e também se já esta salva no bd if (!string.IsNullOrEmpty(ocn) && !LicitacaoController.ExistsBEC(ocn)) { //Preenche os dados da licitação e retorna para inserir na lista Licitacao licitacao = CreateLicitacao(htmlDoc, ocnum, situacao); if (licitacao != null && LicitacaoController.IsValid(licitacao, out mensagemErro)) { licitacao.Observacoes = ocn; licitacao.LinkEdital = href.Replace("OC_Item", "Edital"); Repo = new LicitacaoRepository(); Repo.Insert(licitacao); //licitacoes.Add(licitacao); RService.Log("(HandleCreate) " + Name + ": inserida com sucesso at {0}", Path.GetTempPath() + Name + ".txt"); CreateLicitacaoArquivo(licitacao, licitacao.LinkEdital); NumLicitacoes++; } else { RService.Log("Exception (HandleCreate) " + Name + ": A licitação não foi salva - Motivo(s): " + mensagemErro + " at {0}", Path.GetTempPath() + Name + ".txt"); } } else if (!string.IsNullOrEmpty(ocn) && LicitacaoController.ExistsBEC(ocn) && LicitacaoController.SituacaoAlteradaBEC(ocn, situacao)) { int id = LicitacaoController.GetIdByObservacoes(ocn); LicitacaoController.UpdateSituacaoByIdLicitacao(id, situacao); } } catch (Exception e) { RService.Log("Exception (HandleCreate)" + Name + ":" + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } }
private static void HandleCreate(HtmlNode lic) { try { string link = string.Format(Constants.TCMCE_HOST + lic.ChildNodes[1].ChildNodes[0].GetAttributeValue("href", "").ToString()); string[] licParts = link.Split('/'); string licNum = licParts[7] + licParts[9]; HtmlDocument licPage = WebHandle.GetHtmlDocOfPage(link, Encoding.GetEncoding("UTF-8")); string situacao = Regex.Replace(StringHandle.GetMatches(licPage.DocumentNode.InnerHtml, @"Situação:( *)<b>(.*)</b")[0].ToString(), @"Situação:|<b>|</b", "").Trim(); if (!string.IsNullOrEmpty(licNum) && !LicitacaoController.Exists(licNum)) { Licitacao l = CreateLicitacao(licPage, link, licNum, situacao); if (l != null) { repo = new LicitacaoRepository(); repo.Insert(l); RService.Log("(HandleCreate) " + Name + ": Licitação nº" + licNum + " inserida com sucesso at {0}", Path.GetTempPath() + Name + ".txt"); NumLicitacoes++; GetEditalAndArquivos(licPage, l); } else { RService.Log("Exception (HandleCreate) " + Name + ": Licitação não salva. Motivo: " + mensagemErro + " at {0}", Path.GetTempPath() + Name + ".txt"); } } else if (!string.IsNullOrEmpty(licNum) && LicitacaoController.Exists(licNum) && LicitacaoController.SituacaoAlterada(licNum, situacao)) { Licitacao licitacao = LicitacaoController.GetByIdLicitacaoFonte(licNum); licitacao.Situacao = situacao; repo = new LicitacaoRepository(); repo.Update(licitacao); } } catch (Exception e) { RService.Log("Exception (HandleCreate) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } }
private static void Init() { RService.Log(name + ": Começando o processamento... at {0}", logPath); try { //Inicializa as listas e variáveis que serão usadas pelo robô currentPage = 1; lote = LoteController.CreateLote(43, 1442); Cidades = CidadeController.GetNameToCidade(Constants.TCEPI_UF); NameToOrgao = OrgaoController.GetNomeUfToOrgao(); NameToModalidade = ModalidadeController.GetNameToModalidade(); alreadyInserted = LicitacaoController.GetAlreadyInserted(1442, DateTime.Today.AddMonths(-3)); GetLicitacoes(); } catch (Exception e) { RService.Log("Exception (Init) " + name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", logPath); } }
/*Cria os objetos Licitacao, Lote e LicitacaoArquivo*/ private static void HandleCreate(HtmlDocument htmlDocument) { try { string linkEdital = Constants.CMG_SITE + Constants.CMG_LINK_EDITAL + htmlDocument.DocumentNode.Descendants("a").SingleOrDefault(x => x.Attributes.Contains("id") && x.Attributes["id"].Value.Contains("arquivoDoEdital")).Attributes["href"].Value; /*Verifica se o pregão já não esta na base de dados*/ if (!string.IsNullOrEmpty(Id) && !LicitacaoController.Exists(Id)) { Licitacao licitacao = CreateLicitacao(htmlDocument, linkEdital); if (licitacao != null) { Repo.Insert(licitacao); RService.Log("(HandleCreate) " + Name + ": Licitação " + licitacao.IdLicitacaoFonte + " inserida com sucesso at {0}", Path.GetTempPath() + Name + ".txt"); CreateLicitacaoArquivo(licitacao, linkEdital); //SegmentarLicitacao(licitacao); NumLicitacoes++; } else { RService.Log("Exception (HandleCreate) " + Name + ": A licitação não foi salva - Motivo(s): " + mensagemErro + " at {0}", Path.GetTempPath() + Name + ".txt"); } } else if (!string.IsNullOrEmpty(Id) && LicitacaoController.Exists(Id) && LicitacaoController.SituacaoAlterada(Id, Situacao)) { Licitacao licitacao = LicitacaoController.GetByIdLicitacaoFonte(Id); licitacao.Situacao = Situacao; LicitacaoRepository repo = new LicitacaoRepository(); repo.Update(licitacao); } } catch (Exception e) { RService.Log("Exception (HandleCreate)" + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } }
private static void Init() { RService.Log("(Init) " + Name + ": Buscando licitações homologadas..." + " at {0}", LogPath); try { DateTime dataLimite = DateTime.Today.AddDays(-90); repo = new PrecoRepository(); /*Busca licitações com a data de abertura anterior a 90 dias, ou que ainda não aconteceu*/ List <Licitacao> licitacoes = LicitacaoController.FindByRangeHistoric(Constants.CN_HOST, dataLimite); RService.Log("(Init) " + Name + ": " + licitacoes.Count + " licitacões encontradas at {0}", LogPath); foreach (Licitacao licitacao in licitacoes) { RService.Log("(Init) " + Name + ": Consultando ata e histórico da licitação " + licitacao.IdLicitacaoFonte + " at {0}", LogPath); ConsultaAtaPregao(licitacao); } } catch (Exception e) { RService.Log("Exception (Init) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", LogPath); } }
//Pega as licitações da modalidade Dispensa de Licitação private static void GetDispensas(string uri) { RService.Log("(GetDispensas) " + Name + ": Começando o processamento de licitações da modalidade Dispensa de Licitação " + "at {0}", Path.GetTempPath() + Name + ".txt"); try { int index = 2; List <string> listaOC = new List <string>(); //LoadWebDriver(); LoadDriver(); //Acessa a página uma primeira vez para pegar a lista de licitações e salva os números numa lista de strings web.Navigate().GoToUrl(uri); Thread.Sleep(5000); web.FindElement(By.XPath("//*[@id=\"lblLoginFornecedor\"]/a")).Click(); Thread.Sleep(5000); web.FindElement(By.Id("ctl00_c_area_conteudo_bt33022_Pesquisa")).Click(); var OCs = web.FindElements(By.TagName("tr")).Where(x => x.GetAttribute("class").Contains("ItemStylePregao") || x.GetAttribute("class").Contains("AlternatingPregao")).ToList(); foreach (var oc in OCs) { var linkOC = oc.FindElement(By.TagName("a")); if (linkOC.Text.Contains("OC") && !linkOC.Text.Contains("X9")) { string numOC = linkOC.Text + ";1" + linkOC.Text.Replace(DateTime.Today.Year.ToString() + "OC", DateTime.Today.Year.ToString().Remove(0, 2)); listaOC.Add(numOC); } } //Com base na lista de strings, analisa cada uma para ver se ela existe ou não no banco foreach (var dispensa in listaOC) { try { if (web == null) { LoadDriver(); } if (!LicitacaoController.ExistsBEC(dispensa.Split(';')[0])) { web.Navigate().GoToUrl(uri); web.FindElement(By.Id("ctl00_c_area_conteudo_bt33022_Pesquisa")).Click(); Thread.Sleep(3000); var rows = web.FindElements(By.TagName("tr")).Where(x => x.GetAttribute("class").Contains("ItemStylePregao") || x.GetAttribute("class").Contains("AlternatingPregao")).ToList(); foreach (var row in rows) { var link = row.FindElement(By.TagName("a")); /*Dependendo do valor do index, segue uma das duas opções, pois a estrutura da ID * que puxa o municipio e o objeto muda de acordo com o valor do index da licitação*/ if (link.Text == dispensa.Split(';')[0] && index < 10 && !LicitacaoController.ExistsBEC(dispensa.Split(';')[0])) { string municipio = row.FindElement(By.Id(string.Format("ctl00_c_area_conteudo_grdvOC_publico_ctl0{0}_lbl_municipio", index))).GetAttribute("innerText").ToString(); string objeto = row.FindElement(By.Id(string.Format("ctl00_c_area_conteudo_grdvOC_publico_ctl0{0}_lbl_natureza_despesa", index))).GetAttribute("innerText").ToString(); string situacao = row.FindElement(By.Id(string.Format("ctl00_c_area_conteudo_grdvOC_publico_ctl0{0}_lbl_status", index))).GetAttribute("innerText").ToString(); link.Click(); Thread.Sleep(2000); HandleCreate(web, dispensa.Split(';')[0], municipio, objeto, situacao); break; } else if (link.Text == dispensa.Split(';')[0] && index > 9 && !LicitacaoController.ExistsBEC(dispensa.Split(';')[0])) { string municipio = row.FindElement(By.Id(string.Format("ctl00_c_area_conteudo_grdvOC_publico_ctl{0}_lbl_municipio", index))).GetAttribute("innerText").ToString(); string objeto = row.FindElement(By.Id(string.Format("ctl00_c_area_conteudo_grdvOC_publico_ctl{0}_lbl_natureza_despesa", index))).GetAttribute("innerText").ToString(); string situacao = row.FindElement(By.Id(string.Format("ctl00_c_area_conteudo_grdvOC_publico_ctl{0}_lbl_status", index))).GetAttribute("innerText").ToString(); link.Click(); Thread.Sleep(2000); HandleCreate(web, dispensa.Split(';')[0], municipio, objeto, situacao); break; } index++; } index = 2; } } catch (Exception e) { RService.Log("Exception (GetDispensas) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); if (web != null) { web.Close(); //web = null; } } } } catch (Exception e) { RService.Log("Exception (GetDispensas) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } }
/*Criando a licitação com as informações da página*/ private static Licitacao CreateLicitacao(string numUf) { RService.Log("(CreateLicitacao) " + Name + ": Criando licitação... " + numUf.Split(':')[0] + " at {0}", Path.GetTempPath() + Name + ".txt"); Licitacao licitacao = new Licitacao(); try { if (web != null) { web.Quit(); } var driver = ChromeDriverService.CreateDefaultService(); driver.HideCommandPromptWindow = true; var op = new ChromeOptions(); op.AddUserProfilePreference("download.default_directory", PathEditais); web = new ChromeDriver(driver, new ChromeOptions(), TimeSpan.FromSeconds(300)); web.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(300); wait = new WebDriverWait(web, TimeSpan.FromSeconds(300)); web.Navigate().GoToUrl(Constants.BB_HOST); web.Navigate().GoToUrl(string.Format(Constants.BB_LINK_LICITACAO, numUf.Split(':')[0])); Thread.Sleep(2000); HandleReCaptcha(); MatchCollection helper; licitacao.IdLicitacaoFonte = long.Parse(numUf.Split(':')[0]); licitacao.EstadoFonte = numUf.Split(':')[1]; licitacao.Lote = Lote; licitacao.LinkSite = Constants.BB_HOST; licitacao.LinkEdital = string.Format(Constants.BB_LINK_LICITACAO, numUf.Split(':')[0]); licitacao.IdFonte = IdFonte; licitacao.Excluido = 0; licitacao.SegmentoAguardandoEdital = 0; licitacao.DigitacaoUsuario = 43; //Robo licitacao.Estado = numUf.Split(':')[1]; IWebElement div = web.FindElement(By.Id("conteudo")); string innerHtml = Regex.Replace(HttpUtility.HtmlDecode(div.GetAttribute("innerHTML")).Trim(), @"\s+", " "); helper = StringHandle.GetMatches(innerHtml, "(?i)>\\s{0,1}Resumo da licit.*?\">(.*?)</div>"); licitacao.Objeto = helper != null ? helper[0].Groups[1].Value.Trim() : null; helper = StringHandle.GetMatches(innerHtml, "(?i)>\\s{0,1}Edital.*?\">(.*?)</div>"); licitacao.Num = helper != null ? helper[0].Groups[1].Value.Trim() : null; helper = StringHandle.GetMatches(innerHtml, "(?i)>\\s{0,1}Processo.*?\">(.*?)</div>"); licitacao.Processo = helper != null ? helper[0].Groups[1].Value.Trim() : null; helper = StringHandle.GetMatches(innerHtml, "(?i)>\\s{0,1}Modalidade/tipo.*?\">(.*?)</div>"); string modalidade = StringHandle.RemoveAccent(innerHtml != null ? helper[0].Groups[1].Value.Trim() : "").ToUpper(); if (modalidade == "LRE") { modalidade = "Licitacao"; } licitacao.Modalidade = NameToModalidade.ContainsKey(modalidade.ToUpper()) ? NameToModalidade[modalidade.ToUpper()] : null; if (licitacao.Modalidade.Modalidades == "Pregão") { licitacao.Modalidade.Modalidades = "Pregão Eletrônico"; licitacao.Modalidade.Id = 24; } helper = StringHandle.GetMatches(innerHtml, "(?i)>\\s{0,1}Situa.*?o da licita.*?o.*?\">(.*?)</div>"); licitacao.Situacao = helper != null ? helper[0].Groups[1].Value.Trim() : null; helper = StringHandle.GetMatches(innerHtml, "(?i)>\\s{0,1}Abertura das propostas.*?\">(.*?)</div>"); licitacao.AberturaData = DateHandle.Parse(helper != null ? helper[0].Groups[1].Value.Trim() : null, "dd/MM/yyyy-hh:mm"); helper = StringHandle.GetMatches(innerHtml, "(?i)>\\s{0,1}Início acolhimento de propostas.*?\">(.*?)</div>"); licitacao.EntregaData = DateHandle.Parse(helper != null ? helper[0].Groups[1].Value.Trim() : null, "dd/MM/yyyy-hh:mm"); helper = StringHandle.GetMatches(innerHtml, "(?i)>\\s{0,1}Cliente.*?\">(.*?)</div>"); string orgaoDepartamento = helper != null ? helper[0].Groups[1].Value.Trim() : null; helper = StringHandle.GetMatches(orgaoDepartamento, "/(.*)"); licitacao.Departamento = helper != null ? helper[0].Groups[1].Value.Trim() : null; helper = StringHandle.GetMatches(orgaoDepartamento, "(.*?)/"); string orgao = helper != null ? helper[0].Groups[1].Value.Trim() : null; if (orgao != null) { licitacao.Orgao = OrgaoController.GetOrgaoByNameAndUf(orgao.Trim().ToUpper() + ":" + numUf.Split(':')[1].Trim().ToUpper(), NameToOrgao); } else { licitacao.Orgao = OrgaoController.FindById(390);//NÃO ESPECIFICADO } HandleCidade(licitacao, orgao); } catch (Exception e) { RService.Log("Exception (CreateLicitacao) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } finally { if (web != null) { web.Close(); } } return(LicitacaoController.IsValid(licitacao, out mensagemErro) ? licitacao : null); }
/*Metodo que inicia o processamento de dados*/ private static void Init() { RService.Log("(Init) " + Name + ": Começando o processamento... " + "at {0}", Path.GetTempPath() + Name + ".txt"); try { Repo = new LicitacaoRepository(); /*Realiza a atualização das situações das licitações já inseridas*/ //UpdateLicitacoes(); /*Inicia listas e dictionary's com informações necessárias*/ NameToOrgao = OrgaoController.GetNomeUfToOrgao(); NameToModalidade = ModalidadeController.GetNameToModalidade(); UfToCapital = CityUtil.GetUfToCapital(); UfToNomeCidadeToIdCidade = CidadeController.GetUfToNameCidadeToIdCidade(); Lote = LoteController.CreateLote(43, IdFonte); TryReload = true; if (DoSearch()) { /*Percorre cada licitação encontrada*/ foreach (var numUf in numUFs) { /*Acessa a página da licitação*/ try { if (!LicitacaoController.Exists(numUf.Split(':')[0])) { /*Cria o objeto licitação com as informações da página*/ Licitacao licitacao = CreateLicitacao(numUf); if (licitacao != null) { Repo.Insert(licitacao); NumLicitacoes++; RService.Log("(Init) " + Name + ": Licitação inserida com sucesso at {0}", Path.GetTempPath() + Name + ".txt"); /*Segmenta a licitação recém criada*/ //SegmentarLicitacao(licitacao); DownloadEdAndCreatLicArq(licitacao); } else { if (licitacao != null && licitacao.Orgao != null) { RService.Log("Exception (CreateLicitacao) " + Name + ": A licitação de nº " + licitacao.Num + " e órgão " + licitacao.Orgao.Nome + " - " + licitacao.Orgao.Estado + " não foi salva - Motivo(s): " + mensagemErro + " at {0}", Path.GetTempPath() + Name + ".txt"); } else { RService.Log("Exception (CreateLicitacao) " + Name + ": A licitação de nº " + numUf.Split(':')[0] + " não foi salva - Motivo(s): " + mensagemErro + " at {0}", Path.GetTempPath() + Name + ".txt"); } } } } catch (Exception e) { RService.Log("Exception (Init - CreateLicitacao) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } } } } catch (Exception e) { RService.Log("Exception (Init) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } }
/*Cria uma nova licitacao e o lote se for necessário*/ public static bool CreateLicitacao() { try { string entidadeExecutora = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbnmExecutor")).GetAttribute("value"); string objeto = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbdsObjeto")).GetAttribute("value"); string numLicitacao = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbnrProcessoEdital")).GetAttribute("value"); string preco = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbvlReferencia")).GetAttribute("value"); string dotacao = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbnrDotacaoOrcamentaria")).GetAttribute("value"); string modalidade = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbdsModalidadeLicitacao")).GetAttribute("value"); string numProcesso = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbnrEditalOrigem")).GetAttribute("value"); string dataLancamento = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbdtLancamentoPublicacao")).GetAttribute("value"); string precoMax = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbvlReferencia")).GetAttribute("value"); string dataAberturaEntrega = ""; if (CidadeAtual == "Diamante do Oeste") { CidadeAtual = "Diamante d'Oeste"; } if (Regex.IsMatch(web.PageSource, @"ctl00_ContentPlaceHolder1_tbdtAberturaLicitacao", RegexOptions.IgnoreCase)) { dataAberturaEntrega = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbdtAberturaLicitacao")).GetAttribute("value"); //Caso a licitação tenha o campo NOVA Data Abertura preenchido if (Regex.IsMatch(web.PageSource, @"ctl00_ContentPlaceHolder1_tbdtAberturaNova", RegexOptions.IgnoreCase)) { string dataNovaAberturaEntrega = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbdtAberturaNova")).GetAttribute("value"); if (!string.IsNullOrEmpty(dataNovaAberturaEntrega)) { dataAberturaEntrega = dataNovaAberturaEntrega; } } string cod = GenerateCod(entidadeExecutora, dataLancamento, numProcesso, preco); string scod = cod.ToString().Substring(0, 19); long numLong = 0; long numScod = long.TryParse(scod, out numLong) ? numLong : 0; if (!string.IsNullOrEmpty(scod) && !LicitacaoController.Exists(scod)) { if (!LicitacaoController.Exists(objeto, preco, "Dotação Orçamentária: " + dotacao, numLicitacao, numProcesso, Constants.TCEPR_HOST)) { RService.Log("(CreateLicitacao) " + Name + ": Criando licitação num... " + scod + " at {0}", Path.GetTempPath() + Name + ".txt"); Licitacao licitacao = new Licitacao(); licitacao.Objeto = objeto; licitacao.Processo = numProcesso; licitacao.IdLicitacaoFonte = numScod; licitacao.IdFonte = 510; licitacao.Excluido = 0; licitacao.SegmentoAguardandoEdital = 0; licitacao.DigitacaoUsuario = 43; //Robo licitacao.Lote = Lote; //licitacao.DigitacaoData = null; //licitacao.ProcessamentoData = null; licitacao.Observacoes = "Dotação Orçamentária: " + dotacao + " / Data de lançamento do edital pela entidade executora: " + dataLancamento; licitacao.LinkSite = Constants.TCEPR_HOST; licitacao.Cidade = CidadeAtual; licitacao.CidadeFonte = CidadeController.GetIdCidade(CidadeAtual, Constants.TCEPR_UF); licitacao.EstadoFonte = Constants.TCEPR_UF; licitacao.Estado = Constants.TCEPR_ESTADO; licitacao.Modalidade = NameToModalidade.ContainsKey(StringHandle.RemoveAccent(modalidade).ToUpper()) ? NameToModalidade[StringHandle.RemoveAccent(modalidade).ToUpper()] : null; licitacao.Num = numLicitacao; licitacao.AberturaData = DateHandle.Parse(dataAberturaEntrega, "dd/MM/yyyy"); licitacao.EntregaData = DateHandle.Parse(dataAberturaEntrega, "dd/MM/yyyy"); licitacao.ValorMax = precoMax; licitacao.Orgao = OrgaoController.GetOrgaoByNameAndUf(entidadeExecutora.Trim() + ":PR", NameToOrgao); if (LicitacaoController.IsValid(licitacao, out mensagemErro)) { Repo.Insert(licitacao); //licitacoes.Add(licitacao); RService.Log("Licitacao salva com sucesso at {0}", Path.GetTempPath() + Name + ".txt"); TotalLic++; } else { if (licitacao.Orgao != null) { RService.Log("Exception (CreateLicitacao) " + Name + ": A licitação de nº " + licitacao.Num + " e órgão " + licitacao.Orgao.Nome + " - " + licitacao.Orgao.Estado + " não foi salva - Motivo(s): " + mensagemErro + " at {0}", Path.GetTempPath() + Name + ".txt"); } else { RService.Log("Exception (CreateLicitacao) " + Name + ": A licitação de nº " + licitacao.Num + " não foi salva - Motivo(s): " + mensagemErro + " at {0}", Path.GetTempPath() + Name + ".txt"); } } } } } } catch (Exception e) { RService.Log("Exception (CreateLicitacao) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } return(true); }
//Método para pegar as licitações do site do TCE-PI private static void GetLicitacoes() { try { //var webdriver = WebDriverChrome.LoadWebDriver(name); //var webdriver = WebDriverPhantomJS.LoadWebDriver(name, web); //web = webdriver.Item1; //wait = webdriver.Item2; if (web != null) { web.Quit(); } var driver = ChromeDriverService.CreateDefaultService(); driver.HideCommandPromptWindow = true; var op = new ChromeOptions(); op.AddUserProfilePreference("download.default_directory", TCEPIController.pathEditais); web = new ChromeDriver(driver, op, TimeSpan.FromSeconds(300)); web.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(300); wait = new WebDriverWait(web, TimeSpan.FromSeconds(300)); web.Navigate().GoToUrl(Constants.TCEPI_SITE); wait.Until(ExpectedConditions.ElementExists(By.XPath("//*[@id=\"formMural:btnPesquisar\"]/span[2]"))); web.FindElement(By.XPath("//*[@id=\"formMural:btnPesquisar\"]/span[2]")).Click(); Thread.Sleep(3000); /*Laço que se repete até o fim das licitações. O fim é demarcado pela quantidade de licitações na lista licitNums: * em cada página o número é 50, menos na última página. Quando o número for diferente de 50, ele termina*/ do { licitNums = new List <string>(); RService.Log("(GetLicitacoes) " + name + ": Acessando página " + currentPage + " at {0}", logPath); string pageHtml = web.PageSource.ToString(); var licits = StringHandle.GetMatches(pageHtml, @"\?id=\d{6}"); //Pega os números das licitações da página em questão foreach (var licit in licits) { string licNum = licit.ToString().Replace("?id=", ""); licitNums.Add(licNum); } RService.Log("(GetLicitacoes) " + name + ": Acessando licitações da página " + currentPage + " at {0}", logPath); foreach (string lic in licitNums) { if (!alreadyInserted.Contains(Int64.Parse(lic))) { Licitacao licitacao = CreateLicitacao(lic); if (licitacao != null && !LicitacaoController.Exists(licitacao.IdLicitacaoFonte.ToString())) { repo = new LicitacaoRepository(); try { repo.Insert(licitacao); RService.Log("(GetLicitacoes) " + name + ": Licitação " + licitacao.IdLicitacaoFonte + " inserida com sucesso at {0}", logPath); numLicitacoes++; GetFiles(licitacao); } catch (Exception e) { RService.Log("Exception (GetLicitacoes) " + name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " / Mensagem de erro: " + mensagemErro + " at {0}", logPath); } } } } //webdriver = WebDriverChrome.LoadWebDriver(name); //web = webdriver.Item1; //wait = webdriver.Item2; web = new ChromeDriver(driver, op, TimeSpan.FromSeconds(300)); web.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(300); wait = new WebDriverWait(web, TimeSpan.FromSeconds(300)); web.Navigate().GoToUrl(Constants.TCEPI_SITE); web.FindElement(By.XPath("//*[@id=\"formMural:btnPesquisar\"]/span[2]")).Click(); for (int i = 0; i < currentPage; i++) { wait.Until(ExpectedConditions.ElementExists(By.XPath("//*[@id=\"formListaLic:listaLic_paginator_top\"]/a[3]"))); web.FindElement(By.XPath("//*[@id=\"formListaLic:listaLic_paginator_top\"]/a[3]")).Click(); Thread.Sleep(10000); } currentPage++; } while (licitNums.Count() == 10); } catch (Exception e) { StackTrace st = new StackTrace(e, true); var frame = st.GetFrame(st.FrameCount - 1); var line = frame.GetFileLineNumber(); RService.Log("Exception (GetLicitacoes) " + name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at line " + line + " at {0}", logPath); } }
//Cria a licitação em questão com os respectivos dados private static Licitacao CreateLicitacao(string lic) { Licitacao licitacao = new Licitacao(); try { licitacao.DigitacaoUsuario = 43; licitacao.Estado = Constants.TCEPI_ESTADO; licitacao.EstadoFonte = Constants.TCEPI_UF; licitacao.IdLicitacaoFonte = Convert.ToInt64(lic); licitacao.IdFonte = 1442; licitacao.LinkEdital = string.Format(Constants.TCEPI_LICIT, lic); licitacao.LinkSite = Constants.TCEPI_HOST; licitacao.Lote = lote; web.Navigate().GoToUrl(licitacao.LinkEdital); string licitacaoHtmlText = web.PageSource.ToString(); var helper = StringHandle.GetMatches(licitacaoHtmlText, "negrito\">(.|\n)*?</span"); licitacao.Processo = helper[1].ToString().Replace("negrito\">", "").Replace("</span", "").Replace("Pregão ", ""); licitacao.Observacoes = null; licitacao.AberturaData = Convert.ToDateTime(helper[2].ToString().Replace("negrito\">", "").Replace("</span", "")); licitacao.EntregaData = Convert.ToDateTime(helper[7].ToString().Replace("negrito\">", "").Replace("</span", "")); licitacao.ValorMax = helper[4].ToString().Replace("negrito\">", "").Replace("</span", ""); var num = web.FindElement(By.XPath("//*[@id=\"j_idt23_content\"]/div[1]/div[2]/span")); licitacao.Num = num.Text.Split('º')[1].Trim(); var modalidade = num.Text.Split('º')[0].Replace(" N", "").Trim(); licitacao.Modalidade = NameToModalidade.ContainsKey(StringHandle.RemoveAccent(modalidade.ToUpper())) ? NameToModalidade[StringHandle.RemoveAccent(modalidade.ToUpper())] : null; if (licitacao.Modalidade == null) { licitacao.Modalidade = NameToModalidade["PREGAO"]; } var objeto = web.FindElement(By.XPath("//*[@id=\"j_idt23_content\"]/div[4]/div[2]/label")); licitacao.Objeto = objeto.Text.Trim(); var depto = web.FindElement(By.XPath("//*[@id=\"j_idt20_content\"]/div/div[2]/h2")); licitacao.Departamento = depto.Text.Trim(); licitacao.Orgao = OrgaoController.GetOrgaoByNameAndUf(licitacao.Departamento + ":PI", NameToOrgao); if (licitacao.Departamento.Contains("P. M. DE ")) { var textInfo = new CultureInfo("pt-BR").TextInfo; string cidade = licitacao.Departamento.Remove(0, 9); licitacao.Cidade = textInfo.ToTitleCase(cidade); licitacao.CidadeFonte = Cidades.ContainsKey(cidade) ? Cidades[licitacao.Cidade.ToUpper()] : CityUtil.GetCidadeFonte(licitacao.Cidade, Cidades); } else { foreach (var cid in Cidades) { if (licitacao.Objeto.Contains(cid.Key)) { licitacao.Cidade = cid.Key; licitacao.CidadeFonte = cid.Value; } } if (string.IsNullOrEmpty(licitacao.Cidade)) { licitacao.Cidade = "Teresina"; licitacao.CidadeFonte = 5721; } } } catch (Exception e) { RService.Log("Exception (CreateLicitacao) " + name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", logPath); } return(LicitacaoController.IsValid(licitacao, out mensagemErro) ? licitacao : null); }
/*Cria uma nova licitacao.*/ private static Licitacao CreateLicitacao(HtmlDocument htmDoc, string ocnum, string situacao) { RService.Log("(CreateLicitacao) " + Name + ": Criando licitação.. " + ocnum + " at {0}", Path.GetTempPath() + Name + ".txt"); Licitacao licitacao = new Licitacao(); try { licitacao.Lote = Lote; licitacao.LinkSite = Constants.BEC_SITE; licitacao.Modalidade = Modalidade; licitacao.IdFonte = 507; licitacao.EstadoFonte = Constants.BEC_UF; licitacao.CidadeFonte = 9668; licitacao.Orgao = Orgao; licitacao.Cidade = Constants.BEC_CIDADE; licitacao.Estado = Constants.BEC_ESTADO; licitacao.Excluido = 0; licitacao.SegmentoAguardandoEdital = 0; licitacao.DigitacaoUsuario = 43; //Robo licitacao.Situacao = situacao; //licitacao.DigitacaoData = null; //licitacao.ProcessamentoData = null; licitacao.Num = ocnum; licitacao.IdLicitacaoFonte = long.Parse(ocnum); licitacao.Departamento = htmDoc.DocumentNode.Descendants("span").SingleOrDefault(x => x.Attributes.Contains("id") && x.Attributes["id"].Value.Contains("ctl00_wucOcFicha_txtNomUge")).InnerText.Trim(); int count; string city = htmDoc.DocumentNode.Descendants("span").SingleOrDefault(x => x.Attributes.Contains("id") && x.Attributes["id"].Value.Contains("ctl00_wucOcFicha_txtDescricaoEnteFederativo")).InnerText.Trim(); if (city != "GOVERNO DO ESTADO DE SÃO PAULO") { city = StringHandle.RemoveAccent(city); foreach (var cidade in Cidades) { if (city.Contains(cidade.Key)) { licitacao.Cidade = cidade.Key; licitacao.CidadeFonte = cidade.Value; break; } } } /*Percorre os links da OC para montar o objeto licitação*/ bool findFirstEditalLink = false; bool findFirstOcLink = false; foreach (HtmlNode htmNode in htmDoc.DocumentNode.Descendants("li")) { /*Link onde ficam os arquivos do edital*/ HtmlNode htmlNodeInNode = htmNode.SelectSingleNode("a"); if (htmlNodeInNode != null) { if (htmlNodeInNode.Attributes.Contains("href") && htmlNodeInNode.Attributes["href"].Value.Contains("bec_pregao_UI/Edital") && !findFirstEditalLink) { licitacao.LinkEdital = htmlNodeInNode.Attributes["href"].Value.Trim(); findFirstEditalLink = true; } /*Link para a pag onde ficam as datas*/ if (htmlNodeInNode.Attributes.Contains("href") && htmlNodeInNode.Attributes["href"].Value.Contains("bec_pregao_UI/Agendamento")) { /*Html da pág onde ficam as datas*/ HtmlDocument htmDocAgendamento = WebHandle.GetHtmlDocOfPage(htmlNodeInNode.Attributes["href"].Value); /*Tabela de datas, agendamentos*/ HtmlNode table = htmDocAgendamento.DocumentNode.Descendants("table").SingleOrDefault(x => x.Attributes.Contains("id") && x.Attributes["id"].Value.Contains("ctl00_conteudo_grd")); /*Cada célula da tabela*/ List <HtmlNode> tds = table.Descendants("td").ToList(); count = 0; foreach (HtmlNode inf in tds) { /*Célula com o label ENTREGA DE PROPOSTA, na célula seguinte ficam as datas*/ if (inf.InnerText.ToUpper().Trim().Contains("ENTREGA DE PROPOSTA")) { MatchCollection matches = StringHandle.GetMatches(tds[count + 1].InnerText.Trim(), @"(\d{2}\/\d{2}\/\d{4}\s+\d{2}:\d{2})"); licitacao.EntregaData = DateHandle.Parse(matches[0].Groups[1].Value, "dd/MM/yyyy hh:mm"); licitacao.AberturaData = DateHandle.Parse(matches[1].Groups[1].Value, "dd/MM/yyyy hh:mm"); break; } count++; } } /*Link com dados da OC*/ if (htmlNodeInNode.Attributes.Contains("href") && htmlNodeInNode.Attributes["href"].Value.Contains("bec_pregao_UI/OC") && !findFirstOcLink) { HtmlDocument htmDocFasePrep = WebHandle.GetHtmlDocOfPage(htmlNodeInNode.Attributes["href"].Value); licitacao.Endereco = Regex.Replace(htmDocFasePrep.DocumentNode.Descendants("span").SingleOrDefault(x => x.Attributes.Contains("id") && x.Attributes["id"].Value.Contains("ctl00_conteudo_Wuc_OC_Ficha2_txtEndUge")).InnerText.Trim(), @"\s+", " "); licitacao.Objeto = "Contratação de " + Regex.Replace(htmDocFasePrep.DocumentNode.Descendants("span").SingleOrDefault(x => x.Attributes.Contains("id") && x.Attributes["id"].Value.Contains("ctl00_conteudo_Wuc_OC_Ficha2_txtNaturezaJuridica")).InnerText.Trim(), @"\s+", " "); findFirstOcLink = true; } } } licitacao.ItensLicitacao = licitacao.ItensLicitacao ?? new List <ItemLicitacao>(); CreateItensLicitacao(htmDoc, licitacao); } catch (Exception e) { RService.Log("Exception (CreateLicitacao) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } return(LicitacaoController.IsValid(licitacao, out mensagemErro) ? licitacao : null); }
/*Cria uma nova licitação para a modalidade Carta Convite*/ private static Licitacao CreateLicitacao(HtmlDocument htmDoc, string ocnum, string situacao) { RService.Log("(CreateLicitacao) " + Name + ": Criando licitação.. " + ocnum + " at {0}", Path.GetTempPath() + Name + ".txt"); Licitacao licitacao = new Licitacao(); try { licitacao.Lote = Lote; licitacao.Num = ocnum; licitacao.IdLicitacaoFonte = long.Parse(ocnum); licitacao.SegmentoAguardandoEdital = 0; licitacao.DigitacaoUsuario = 43; //Robo licitacao.Modalidade = Modalidades[0]; licitacao.LinkSite = Constants.BEC_SITE; licitacao.Orgao = Orgao; licitacao.IdFonte = 507; licitacao.Excluido = 0; licitacao.Situacao = situacao; int count = 0; /*Tabela com as informações da OC*/ var dadosOc = htmDoc.DocumentNode.Descendants().SingleOrDefault(x => x.Id == "ctl00_DetalhesOfertaCompra1_UpdatePanel1"); /*Percorre todas as colunas de todas as linhas dessa tabela*/ List <HtmlNode> inf = dadosOc.Descendants("td").ToList(); foreach (var data in inf) { if (data.InnerText.Trim().Contains("Proposta")) { MatchCollection matches = StringHandle.GetMatches(data.InnerText.Trim(), @"(\d{2}\/\d{2}\/\d{4}\s+\d{2}:\d{2}:\d{2})"); if (matches != null) { licitacao.EntregaData = DateHandle.Parse(matches[0].Groups[1].Value, "dd/MM/yyyy hh:mm:ss"); licitacao.AberturaData = DateHandle.Parse(matches[1].Groups[1].Value, "dd/MM/yyyy hh:mm:ss"); if (licitacao.AberturaData < DateTime.Today) { return(null); } } } else if (data.InnerText.Trim().Contains("UC")) { licitacao.Departamento = data.InnerText.Split(':')[1].Trim(); } count++; } var dadosUC = htmDoc.DocumentNode.Descendants().FirstOrDefault(x => x.Id == "formulario"); /*Percorre todas as colunas de todas as linhas dessa tabela*/ List <HtmlNode> infUC = dadosUC.Descendants("span").ToList(); foreach (var info in infUC) { if (info.Id.Equals("ctl00_c_area_conteudo_wuc_dados_oc1_txt_endereco_uge")) { licitacao.Endereco = info.InnerText.Trim(); } else if (info.Id.Equals("ctl00_c_area_conteudo_wuc_dados_oc1_txt_local_entrega")) { string localidade = info.InnerText.Split('-').Last().ToString(); string[] cidadeEstado = localidade.Split('/'); string cidade = cidadeEstado.Last().ToString().ToLower().Trim(); //CultureInfo para poder tornar apenas as iniciais maiúsculas var textInfo = new CultureInfo("pt-BR").TextInfo; licitacao.Cidade = textInfo.ToTitleCase(cidade).ToString(); licitacao.Estado = Constants.BEC_ESTADO; licitacao.EstadoFonte = Constants.BEC_UF; cidade = licitacao.Cidade.ToString(); licitacao.CidadeFonte = Cidades.ContainsKey(cidade) ? Cidades[cidade] : CityUtil.GetCidadeFonte(cidade, Cidades); } else if (info.Id.Equals("ctl00_c_area_conteudo_wuc_dados_oc1_txt_natureza_despesa")) { licitacao.Objeto = "Contratação de " + info.InnerText.ToString().Trim(); } } NameValueCollection formData = new NameValueCollection(); href = href.Replace("Fornecedores_Dados_OC", "OC_Item"); var htmItens = WebHandle.GetHtmlDocOfPageDefaultEncoding(href, formData); licitacao.ItensLicitacao = licitacao.ItensLicitacao ?? new List <ItemLicitacao>(); /*Contador das linhas da tabela*/ CreateItensLicitacao(htmItens, licitacao); } catch (Exception e) { RService.Log("Exception (CreateLicitacao)" + Name + ":" + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } return(LicitacaoController.IsValid(licitacao, out mensagemErro) ? licitacao : null); }
private static Licitacao CreateLicitacao(string licitLink, int index) { ChromeDriver webLicit = null; if (web != null) { web.Quit(); } var driver = ChromeDriverService.CreateDefaultService(); driver.HideCommandPromptWindow = true; var op = new ChromeOptions(); webLicit = new ChromeDriver(driver, new ChromeOptions(), TimeSpan.FromSeconds(300)); webLicit.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(300); wait = new WebDriverWait(web, TimeSpan.FromSeconds(300)); Licitacao licitacao = new Licitacao(); licitacao.IdLicitacaoFonte = Convert.ToInt64(licitLink.Split('=')[1].Split('&')[0]); licitacao.IdFonte = 1250; licitacao.Estado = Constants.TCESE_ESTADO; licitacao.EstadoFonte = Constants.TCESE_UF; licitacao.LinkEdital = licitLink; licitacao.LinkSite = Constants.TCESE_HOST; licitacao.DigitacaoUsuario = 43; licitacao.Lote = Lote; //licitacao.DigitacaoData = null; //licitacao.ProcessamentoData = null; try { webLicit.Navigate().GoToUrl(licitLink); string licitText = webLicit.FindElement(By.XPath("//*[@id=\"aspnetForm\"]/table[3]/tbody/tr/td[2]")).Text; var textInfo = new CultureInfo("pt-BR").TextInfo; string dataAb = webLicit.FindElement(By.Id("ctl00_ContentPlaceHolder1_lblCte_DtLicitacaoMIA")).Text; licitacao.AberturaData = Convert.ToDateTime(StringHandle.GetMatches(dataAb, @"\d+/\d+/\d+")[0].ToString()); string dataEnt = webLicit.FindElement(By.Id("ctl00_ContentPlaceHolder1_lblCto_DtModificacaoMIA")).Text; licitacao.EntregaData = Convert.ToDateTime(dataEnt); licitacao.Cidade = Constants.TCESE_MUN_NAME[index].Replace("PREFEITURA MUNICIPAL DE ", ""); licitacao.CidadeFonte = Cidades.ContainsKey(licitacao.Cidade) ? Cidades[licitacao.Cidade] : CityUtil.GetCidadeFonte(licitacao.Cidade, Cidades); licitacao.Departamento = Constants.TCESE_MUN_NAME[index]; licitacao.Endereco = webLicit.FindElement(By.Id("ctl00_ContentPlaceHolder1_lblCte_LocalMIA")).Text; string modal = StringHandle.GetMatches(licitText, @"Modalidade:(.*?)Número")[0].ToString().Split(':')[1].Replace(" Número", "").Trim(); licitacao.Modalidade = NameToModalidade.ContainsKey(StringHandle.RemoveAccent(modal.ToUpper())) ? NameToModalidade[StringHandle.RemoveAccent(modal.ToUpper())] : null; licitacao.Num = StringHandle.GetMatches(licitText, "Ano:(.*)")[0].ToString().Replace("Ano:", "").Replace("\r", ""); licitacao.Objeto = webLicit.FindElement(By.Id("ctl00_ContentPlaceHolder1_lblCto_ResumoMIA")).Text; licitacao.Observacoes = webLicit.FindElement(By.Id("ctl00_ContentPlaceHolder1_lblCto_ConteudoMIA")).Text; licitacao.Orgao = OrgaoController.GetOrgaoByNameAndUf(textInfo.ToTitleCase(licitacao.Departamento) + ":SE", NameToOrgao); } catch (Exception e) { RService.Log("Exception (CreateLicitacao) " + name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", logPath); } finally { if (webLicit != null) { webLicit.Close(); } } return(LicitacaoController.IsValid(licitacao, out mensagemErro) ? licitacao : null); }
private static void HandleLicitacoes(int index) { RService.Log("(HandleLicitacoes) " + name + ": Consultando licitações da " + Constants.TCESE_MUN_NAME[index] + " at {0}", logPath); //LoadWebDriver(); LoadDriver(); try { string urlMunicipio = string.Format(Constants.TCESE_MUN_PAGE, Constants.TCESE_MUN_CODE[index], Constants.TCESE_MUN_NAME[index].Replace(" ", "%20")); temLicitacao = false; web.Navigate().GoToUrl(urlMunicipio); var licits = web.FindElements(By.TagName("a")).Where(x => x.GetAttribute("innerText").Contains("Ano/Número:")); repo = new LicitacaoRepository(); foreach (var licit in licits) { var dates = StringHandle.GetMatches(licit.Text, @"\d+/\d+/\d+"); if (Convert.ToDateTime(dates[0].Value) > DateTime.Today) { temLicitacao = true; var licitLink = licit.GetAttribute("href"); Licitacao licitacao = CreateLicitacao(licitLink, index); if (licitacao != null) { if (!LicitacaoController.Exists(licitacao.IdLicitacaoFonte.ToString())) { repo.Insert(licitacao); //licitacoes.Add(licitacao); RService.Log("(HandleLicitacoes) " + name + ": Licitação Nº" + licitacao.IdLicitacaoFonte + " inserida com sucesso at {0}", logPath); numLicitacoes++; } } else { RService.Log("Exception (CreateLicitacao) " + name + ": Licitação não salva. Motivo: " + mensagemErro + " at {0}", logPath); } } } if (!temLicitacao) { RService.Log("(HandleLicitacoes) " + name + ": " + Constants.TCESE_MUN_NAME[index] + " não possui licitações novas at {0}", logPath); } } catch (Exception e) { RService.Log("Exception (HandleLicitacoes) " + name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", logPath); } finally { if (web != null) { web.Close(); } } }
private static void GetLicitacoes(List <string> licitLinks) { foreach (var link in licitLinks) { try { if (web != null) { web.Quit(); } var driver = ChromeDriverService.CreateDefaultService(); driver.HideCommandPromptWindow = true; var op = new ChromeOptions(); op.AddUserProfilePreference("download.default_directory", PathEditais); web = new ChromeDriver(driver, new ChromeOptions(), TimeSpan.FromSeconds(300)); web.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(300); wait = new WebDriverWait(web, TimeSpan.FromSeconds(300)); web.Navigate().GoToUrl(link); CheckReCaptcha(web.PageSource); var situacao = web.FindElement(By.XPath("//*[@id=\"report_38717872527149671_catch\"]/dl/dd[4]")).Text; var andamento = web.FindElement(By.XPath("//*[@id=\"L38976648273068799\"]/div/span[2]")); if (!situacao.Contains("Encerrada") || !andamento.Text.Contains("Ativo")) { Licitacao licitacao = CreateLicitacao(link, situacao); try { if (LicitacaoController.IsValid(licitacao, out mensagemErro) && !LicitacaoController.ExistsTCERS(licitacao.IdLicitacaoFonte, Constants.TCERS_ID_FONTE) /*!AlreadyInserted.Contains(licitacao.IdLicitacaoFonte)*/) { repo.Insert(licitacao); NumLicitacoes++; RService.Log("(GetLicitacoes) " + Name + ": Licitação nº" + licitacao.Num + " salva com sucesso at {0}", LogPath); //GetArquivos(licitacao); } else if (!string.IsNullOrEmpty(mensagemErro)) { RService.Log("Exception (GetLicitacoes - Insert) " + Name + ": " + mensagemErro + " at {0}", LogPath); } else { RService.Log("Exception (GetLicitacoes - Insert) " + Name + ": Licitação já capturada anteriormente at {0}", LogPath); } } catch (Exception e) { RService.Log("Exception (GetLicitacoes - Insert) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", LogPath); } } } catch (Exception e) { if (web.FindElement(By.Id("g-recaptcha-response")) != null) { RService.Log("Exception (GetLicitacoes) " + Name + ": Encontrado recaptcha! at {0}", LogPath); } RService.Log("Exception (GetLicitacoes) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", LogPath); } } }
/*Cria uma nova licitação para a modalidade Dispensa de Licitação.*/ private static Licitacao CreateLicitacao(ChromeDriver web, string ocnum, string municipio, string objeto, string situacao) { RService.Log("(CreateLicitacao) " + Name + ": Criando licitação.. " + ocnum + " at {0}", Path.GetTempPath() + Name + ".txt"); Licitacao licitacao = new Licitacao(); try { licitacao.Lote = Lote; licitacao.Num = ocnum; licitacao.IdLicitacaoFonte = long.Parse(ocnum); licitacao.SegmentoAguardandoEdital = 0; licitacao.DigitacaoUsuario = 43; //Robo licitacao.Modalidade = Modalidades[1]; licitacao.LinkSite = Constants.BEC_SITE; licitacao.Orgao = Orgao; licitacao.IdFonte = 507; licitacao.Excluido = 0; licitacao.Situacao = situacao; licitacao.Departamento = web.FindElement(By.Id("ctl00_DetalhesOfertaCompra1_txtNomUge")).Text; //Busca as datas dentro da página da licitação string dates = web.FindElement(By.Id("ctl00_DetalhesOfertaCompra1_txtPerCotEletronica")).Text.Replace(" às", "").Replace(" a", ""); MatchCollection matches = StringHandle.GetMatches(dates, @"(\d{2}\/\d{2}\/\d{4}\s+\d{2}:\d{2}:\d{2})"); if (matches != null) { licitacao.EntregaData = DateHandle.Parse(matches[0].Groups[1].Value, "dd/MM/yyyy hh:mm:ss"); licitacao.AberturaData = DateHandle.Parse(matches[1].Groups[1].Value, "dd/MM/yyyy hh:mm:ss"); if (licitacao.AberturaData < DateTime.Today) { return(null); } } //CultureInfo para tratar o nome do município var textInfo = new CultureInfo("pt-BR").TextInfo; municipio = municipio.ToLower(); licitacao.Cidade = textInfo.ToTitleCase(municipio).ToString(); licitacao.Estado = Constants.BEC_ESTADO; licitacao.EstadoFonte = Constants.BEC_UF; licitacao.CidadeFonte = Cidades.ContainsKey(licitacao.Cidade) ? Cidades[licitacao.Cidade] : CityUtil.GetCidadeFonte(licitacao.Cidade, Cidades); licitacao.Objeto = "Contratação de " + objeto; //Acessa a página com os itens da licitação web.FindElement(By.XPath("//*[@id=\"topMenu\"]/li[2]/a")).Click(); Thread.Sleep(3000); licitacao.ItensLicitacao = licitacao.ItensLicitacao ?? new List <ItemLicitacao>(); CreateItensLicitacao(web, licitacao); } catch (Exception e) { RService.Log("Exception (CreateLicitacao)" + Name + ":" + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } return(LicitacaoController.IsValid(licitacao, out mensagemErro) ? licitacao : null); }
private static void HandleCreate(HtmlDocument htmlDoc, HtmlNode row) { try { if (row.InnerHtml.Contains("href")) { string situacao; string quoteLink = row.ChildNodes[3].ChildNodes["a"].Attributes["href"].Value.ToString(); HtmlDocument htmlQuote = WebHandle.GetHtmlDocOfPage(string.Format(Constants.CN_COTACAO_LINK, quoteLink), Encoding.GetEncoding("ISO-8859-1")); Licitacao l = CreateQuote(htmlQuote, quoteLink, out situacao); //RandomSleep(); if (l != null && !repo.Exists(l.IdLicitacaoFonte.ToString())) { repo.Insert(l); numCotacoes++; RService.Log("Cotação " + l.IdLicitacaoFonte + " inserida com sucesso" + " at {0}", Path.GetTempPath() + Name + ".txt"); //SegmentarCotacao(l); } else if (l != null && repo.Exists(l.IdLicitacaoFonte.ToString()) && LicitacaoController.SituacaoAlterada(l.IdLicitacaoFonte.ToString(), situacao)) { l = repo.GetByIdLicitacaoFonte(l.IdLicitacaoFonte.ToString()); l.Situacao = situacao; repo.Update(l); } } } catch (Exception e) { RService.Log("Exception (HandleCreate) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } }
private static Licitacao CreateLicitacao(HtmlDocument licPage, string link, string num, string situacao) { RService.Log("(CreateLicitacao) " + Name + ": Criando licitação " + num + " at {0}", Path.GetTempPath() + Name + ".txt"); Licitacao licitacao = new Licitacao(); try { licitacao.IdLicitacaoFonte = Convert.ToInt64(num); licitacao.IdFonte = 1249; licitacao.Estado = Constants.TCMCE_ESTADO; licitacao.EstadoFonte = Constants.TCMCE_UF; licitacao.LinkEdital = link; licitacao.LinkSite = Constants.TCMCE_HOST; licitacao.Lote = Lote; var licInfo = licPage.DocumentNode.ChildNodes[2].ChildNodes[5].ChildNodes[5].InnerHtml; string city = Regex.Replace(StringHandle.GetMatches(licInfo, @"h2>(.*)\|")[0].ToString(), @"h2>|\|", "").Trim(); string orgao = Regex.Replace(StringHandle.GetMatches(licInfo, @"\|(.*)<")[0].ToString(), @"(\|)|<", "").Trim(); string numero = Regex.Replace(StringHandle.GetMatches(licInfo, @"h1>(.*)</h1")[0].ToString(), @"h1>Licitação:|</h1", "").Trim(); string obj = Regex.Replace(StringHandle.GetMatches(licInfo, @"Objeto:( *)<b>(.|\n)*?</b>")[0].ToString(), @"Objeto:|<b>|</b>", "").Trim(); string modal = Regex.Replace(StringHandle.GetMatches(licInfo, @"Modalidade:( *)<b>(.*)</b>")[0].ToString(), @"Modalidade:|<b>|</b>", "").Split('|')[0].Trim(); if (modal == "Concorrência Pública") { modal = "Concorrência"; } string dataAb = Regex.Replace(StringHandle.GetMatches(licInfo, @"Data( *)de( *)Abertura:( *)<b>(.*)</b>")[0].ToString(), @"Data( *)de( *)Abertura:|<b>|</b>", "").Split('|')[0].Trim(); string horaAb = Regex.Replace(StringHandle.GetMatches(licInfo, @"Hora( *)da( *)Abertura:( *)<b>(.*)</b>")[0].ToString(), @"Hora( *)da( *)Abertura:|<b>|</b>", "").Trim(); string endereco = Regex.Replace(StringHandle.GetMatches(licInfo, @"Local:( *)<b>(.*)</b>")[0].ToString(), @"Local:|<b>|</b>", "").Trim(); string processo = Regex.Replace(StringHandle.GetMatches(licInfo, @"Administrativo:( *)<b>(.*)<")[0].ToString(), @"Administrativo:|<b>|<", "").Trim(); string dpto = ""; if (Regex.IsMatch(licInfo, @"Órgãos</b>", RegexOptions.IgnoreCase)) { dpto = Regex.Replace(StringHandle.GetMatches(licInfo, @"Órgãos</b>(.|\n)*?</li")[0].ToString(), @"Órgãos|</b>|<ul>|<li>|</li", "").Trim(); } string obs = Regex.Replace(StringHandle.GetMatches(licInfo, @"Objeto/Lote/Item(.|\n)*?</b")[0].ToString(), @"Objeto/Lote/Item:|<b>|</b", "").Trim(); city = city.ToLower(); var textInfo = new CultureInfo("pt-BR").TextInfo; licitacao.Cidade = textInfo.ToTitleCase(city).ToString(); licitacao.CidadeFonte = Cidades.ContainsKey(licitacao.Cidade.ToUpper()) ? Cidades[licitacao.Cidade.ToUpper()] : CityUtil.GetCidadeFonte(licitacao.Cidade, Cidades); licitacao.Departamento = dpto; licitacao.Orgao = OrgaoController.GetOrgaoByNameAndUf(orgao + ":CE", NameToOrgao); if (licitacao.Orgao.Nome == "Prefeitura Municipal") { licitacao.Orgao.Nome = "Prefeitura Municipal de " + licitacao.Cidade; } licitacao.Num = numero; licitacao.Processo = processo; licitacao.AberturaData = DateHandle.Parse(dataAb + " " + horaAb, "dd/MM/yyyy hh:mm:ss"); licitacao.EntregaData = licitacao.AberturaData; licitacao.Modalidade = NameToModalidade.ContainsKey(StringHandle.RemoveAccent(modal.ToUpper())) ? NameToModalidade[StringHandle.RemoveAccent(modal.ToUpper())] : null; licitacao.Situacao = situacao; licitacao.Objeto = obj; licitacao.Observacoes = obs; licitacao.Endereco = endereco; licitacao.DigitacaoUsuario = 43; //Id do Robô no sistema LM //licitacao.DigitacaoData = null; //licitacao.ProcessamentoData = null; } catch (Exception e) { RService.Log("Exception (CreateLicitacao) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } return(LicitacaoController.IsValid(licitacao, out mensagemErro) ? licitacao : null); }
private static Licitacao CreateQuote(HtmlDocument htmlQuote, string quoteLink, out string situacao) { Licitacao l = new Licitacao(); int count = 0; situacao = null; try { l.IdFonte = 508; l.LinkEdital = string.Format(Constants.CN_COTACAO_LINK, quoteLink); l.LinkSite = Constants.CN_HOST; l.Excluido = 0; l.SegmentoAguardandoEdital = 0; l.DigitacaoUsuario = 43; //Robo l.Lote = lote; l.Modalidade = nameToModalidade.ContainsKey("COTACAO ELETRONICA") ? nameToModalidade["COTACAO ELETRONICA"] : null; l.ItensLicitacao = l.ItensLicitacao ?? new List <ItemLicitacao>(); foreach (var row in htmlQuote.DocumentNode.Descendants("tr").Where(x => x.Attributes.Contains("height"))) { switch (count) { case 0: string uasg = row.InnerText.Split('-')[0].TrimEnd().Replace("UASG: ", ""); string departamento = string.Empty; if (row.InnerText.Split('-').Count() > 2) { for (int i = 1; i < row.InnerText.Split('-').Count(); i++) { if (i != 1) { departamento = departamento + "-" + row.InnerText.Split('-')[i].TrimStart(); } else { departamento = row.InnerText.Split('-')[i].TrimStart(); } } } else { departamento = row.InnerText.Split('-')[1].TrimStart(); } l.Uasg = uasg; l.Departamento = departamento; break; case 1: string numero = row.InnerText.Split(':')[1].TrimStart(); l.Num = numero; break; case 2: string objeto = row.InnerText.Replace("Objeto: ", string.Empty); l.Objeto = objeto; break; case 3: string dataEntrega = row.InnerText.Split(':')[1].TrimStart(); l.EntregaData = Convert.ToDateTime(dataEntrega); break; case 4: string obsLink = row.ChildNodes[0].ChildNodes[1].Attributes["href"].Value.ToString().Remove(0, 8); HtmlDocument htmlObs = WebHandle.GetHtmlDocOfPage(string.Format(Constants.CN_COTACAO_LINK, obsLink), Encoding.GetEncoding("ISO-8859-1")); string obs = Regex.Replace(htmlObs.DocumentNode.InnerHtml.ToString(), "<.*?>", string.Empty) .Replace("\n\n\n\n \tCOMPRASNET - O Portal de Compras do Governo Federal :: Observações Gerais da Cotação Eletrônica.\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\n\n function erroLogin(){\n window.opener.erroLogin();\n window.close();\n }\n\n\n\n function popup(ev, elA, features) {\n var url, target;\n url = elA.getAttribute(\"href\");\n target = elA.getAttribute(\"target\");\n window.open(url, target, features);\n\n if (ev.cancelBubble != undefined) { //IE\n ev.cancelBubble = true; \n ev.returnValue = false;\n }\n if (ev.preventDefault) ev.preventDefault(); //Outros\n }\n\n\n\n\n\n\nAguarde!\n\n\nObservações Gerais da Cotação Eletrônica\n\r\n ", string.Empty) .Replace(" ", string.Empty); if (icms) { l.Observacoes = "ICMS: Sim\n\n" + obs; } else { l.Observacoes = "ICMS: Não\n\n" + obs; } break; case 5: situacao = Regex.Replace(StringHandle.GetMatches(row.InnerHtml, @"Situação:( *)</b><span(.*?)>(.*?)</span")[0].ToString(), @"Situação:|</b><span(.*?)>|</span", "").Trim(); l.Situacao = situacao; break; case 6: string dataAbertura = row.InnerText.Split(':')[1].TrimStart().Split('(')[0].Replace('h', ':'); l.AberturaData = DateHandle.Parse(dataAbertura, "dd/MM/yyyy hh:mm"); break; case 7: string valor = row.InnerText.Split(':')[1].TrimStart(); l.ValorMax = valor; break; } count++; } l.IdLicitacaoFonte = Convert.ToInt64(l.Uasg + l.Num.ToString()); Licitacao oldLic = LicitacaoRepository.FindByUASG(l.Uasg); if (oldLic != null) { l.Orgao = oldLic.Orgao; l.EstadoFonte = oldLic.EstadoFonte; l.CidadeFonte = oldLic.CidadeFonte; l.Endereco = oldLic.Endereco; l.Cidade = oldLic.Cidade; l.Estado = oldLic.Estado; } else { l.Orgao = OrgaoRepository.FindOrgao(l.Departamento); if (l.Orgao == null) { Orgao org = OrgaoRepository.CreateOrgao(l.Departamento, l.Observacoes); OrgaoRepository repo = new OrgaoRepository(); repo.Insert(org); l.Orgao = org; } l.Estado = l.Orgao.Estado; l.EstadoFonte = l.Orgao.Estado; l.Cidade = ufToCapital.ContainsKey(l.EstadoFonte) ? ufToCapital[l.EstadoFonte] : null; Dictionary <string, int?> ufToCidade = ufToNomeCidadeToIdCidade.ContainsKey(l.EstadoFonte) ? ufToNomeCidadeToIdCidade[l.EstadoFonte] : null; l.CidadeFonte = ufToCidade != null?ufToCidade.ContainsKey(StringHandle.RemoveAccent(l.Cidade.ToUpper())) ? ufToCidade[StringHandle.RemoveAccent(l.Cidade.ToUpper())] : CityUtil.GetCidadeFonte(l.Cidade, ufToCidade) : CityUtil.GetCidadeFonte(l.Cidade, ufToCidade); l.Endereco = null; } GetItens(htmlQuote, l); return(LicitacaoController.IsValid(l, out mensagemErro) ? l : null); } catch (Exception e) { if (l.Orgao == null) { RService.Log("Exception (CreateQuote) " + Name + ": Órgão não foi localizado - ver log do serviço RService" + " at {0}", Path.GetTempPath() + Name + ".txt"); } else { RService.Log("Exception (CreateQuote) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } return(null); } }