private static void SegmentarLicitacao(Licitacao licitacao) { List <Segmento> segmentos = SegmentoController.CreateListaSegmentos(licitacao); foreach (Segmento segmento in segmentos) { int matchCount = 0; var palavrasChave = segmento.PalavrasChave.Split(';'); foreach (var palavrachave in palavrasChave) { if (licitacao.Objeto.ToUpper().Contains(palavrachave)) { matchCount++; } } if (matchCount >= 4) { LicitacaoSegmento licSeg = new LicitacaoSegmento() { IdLicitacao = licitacao.Id, IdSegmento = segmento.IdSegmento }; LicitacaoSegmentoRepository repoLS = new LicitacaoSegmentoRepository(); repoLS.Insert(licSeg); } } }
private static void GetPrecos(HtmlNode grupo, Licitacao licitacao) { try { var itens = grupo.ChildNodes.Where(i => i.InnerText.Contains("Item")).ToList(); for (int i = 0; i < itens.Count; i += 2) { int j = i + 1; if (itens[i].InnerText.Contains("Homologado")) { Preco preco = CreatePreco(itens[i], itens[j], licitacao.Id); if (preco != null && !repo.Exists(preco)) { repo.Insert(preco); NumPrecos++; RService.Log("(GetPrecos) " + Name + ": Preço obtido com sucesso para licitacao " + licitacao.Id + " at {0}", LogPath); } } } } catch (Exception e) { RService.Log("Exception (GetPrecos) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", LogPath); } }
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 void ConsultaAtaPregao(Licitacao licitacao) { RService.Log("(ConsultaAtaPregao) " + Name + ": Buscando ata do pregão at {0}", LogPath); try { if (!string.IsNullOrEmpty(licitacao.Uasg) && !string.IsNullOrEmpty(licitacao.NumPregao)) { List <LicitacaoHistorico> itens = new List <LicitacaoHistorico>(); string _num = Regex.Replace(licitacao.NumPregao, @"[^\d+]", ""); string _url = string.Format(Constants.CN_ATA_PREGAO, licitacao.Uasg, _num); HtmlDocument htmlDoc = WebHandle.GetHtmlDocOfPage(_url, Encoding.GetEncoding("ISO-8859-1")); var licitInfo = FindLicitInfo(htmlDoc.DocumentNode.InnerHtml); if (!string.IsNullOrEmpty(licitInfo)) { HandleTermoHomologacao(licitInfo, licitacao); } } } catch (Exception e) { RService.Log("Exception (ConsultaAtaPregao) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", LogPath); } }
public IEnumerable <Licitacao> Fetch(Licitacao entity) { return(DataHelper.List <Licitacao>("PR_LICITACAO_CONSULTAR", new SqlParameter("@id_licitacao", entity.Id), new SqlParameter("@ds_licitacao", entity.Descricao) )); }
private static void HandleModalidade(Licitacao licitacao, string modalidade) { Modalidade modal = NameToModalidade.ContainsKey(StringHandle.RemoveAccent(modalidade.ToUpper())) ? NameToModalidade[StringHandle.RemoveAccent(modalidade.ToUpper())] : null; if (modal == null) { switch (modalidade.Trim()) { case "Processo de Dispensa Eletrônica": modal = NameToModalidade["DISPENSA DE LICITACAO"]; break; case "Licitação Lei ./ Presencial": modal = NameToModalidade["PREGAO PRESENCIAL"]; break; case "Licitação Lei ./ Eletrônico": modal = NameToModalidade["PREGAO ELETRONICO"]; break; default: modal = NameToModalidade["Licitação"]; break; } } licitacao.Modalidade = modal; }
internal static List <Segmento> CreateListaSegmentos(Licitacao licitacao) { List <Segmento> segmentos = new List <Segmento>(); if (licitacao.Modalidade.Modalidades == "Leilão") { segmentos = SegmentoController.GetSegmentosLeilao(); } else if (licitacao.Objeto.ToUpper().Contains("VETERINÁR") || licitacao.Objeto.ToUpper().Contains("VETERINAR")) { segmentos = SegmentoController.GetSegmentosVeterinaria(); } else if (licitacao.Objeto.ToUpper().Contains("CONCESSÃO") || licitacao.Objeto.ToUpper().Contains("CONCESSAO") || licitacao.Objeto.ToUpper().Contains("OUTORGA") || licitacao.Objeto.ToUpper().Contains("PERMISSÃO DE USO") || licitacao.Objeto.ToUpper().Contains("PERMISSAO DE USO") || licitacao.Objeto.ToUpper().Contains("EXPLORAÇÃO") || licitacao.Objeto.ToUpper().Contains("EXPLORACAO")) { segmentos = SegmentoController.GetSegmentosConcessao(); } else { segmentos = SegmentoController.GetSegmentosHumanos(); } return(segmentos); }
private static void HandleCidade(Licitacao licitacao, string orgao) { Dictionary <string, int?> ufToCidade = UfToNomeCidadeToIdCidade.ContainsKey(licitacao.EstadoFonte) ? UfToNomeCidadeToIdCidade[licitacao.EstadoFonte] : null; List <Cidade> cities = new CidadeRepository().FindByUf(licitacao.EstadoFonte); string cidadeEstado = CityUtil.FindCity(licitacao); string cityMatch = GetCityMatch(ufToCidade, orgao); if (orgao.Contains("MUNICIPIO")) { licitacao.Cidade = orgao.Replace("MUNICIPIO DE ", "").Replace("MUNICIPIO DA ", ""); licitacao.CidadeFonte = ufToCidade.ContainsKey(StringHandle.RemoveAccent(licitacao.Cidade.ToUpper())) ? ufToCidade[StringHandle.RemoveAccent(licitacao.Cidade.ToUpper())] : CityUtil.GetCidadeFonte(licitacao.Cidade, ufToCidade); return; } if (orgao.Contains("PREFEITURA MUNICIPAL")) { licitacao.Cidade = orgao.Replace("PREFEITURA MUNICIPAL DE ", "").Replace("PREFEITURA MUNICIPAL DA ", ""); licitacao.CidadeFonte = ufToCidade.ContainsKey(StringHandle.RemoveAccent(licitacao.Cidade.ToUpper())) ? ufToCidade[StringHandle.RemoveAccent(licitacao.Cidade.ToUpper())] : CityUtil.GetCidadeFonte(licitacao.Cidade, ufToCidade); return; } if (!string.IsNullOrEmpty(cidadeEstado)) { licitacao.Cidade = cidadeEstado.Split('/')[0]; licitacao.CidadeFonte = Convert.ToInt16(cidadeEstado.Split('/')[2]); return; } if (!string.IsNullOrEmpty(cityMatch)) { licitacao.Cidade = cityMatch.ToUpper(); licitacao.CidadeFonte = ufToCidade.ContainsKey(StringHandle.RemoveAccent(cityMatch.ToUpper())) ? ufToCidade[StringHandle.RemoveAccent(cityMatch.ToUpper())] : CityUtil.GetCidadeFonte(licitacao.Cidade, ufToCidade); return; } if (licitacao.Cidade == null || licitacao.CidadeFonte == null) { if (UfToCapital.ContainsKey(licitacao.EstadoFonte)) { licitacao.Cidade = UfToCapital[licitacao.EstadoFonte]; licitacao.CidadeFonte = ufToCidade != null?ufToCidade.ContainsKey(StringHandle.RemoveAccent(licitacao.Cidade.ToUpper())) ? ufToCidade[StringHandle.RemoveAccent(licitacao.Cidade.ToUpper())] : null : null; } else { Orgao orgaoDb = OrgaoRepository.FindOrgao(licitacao.Departamento); if (orgaoDb != null) { licitacao.Cidade = UfToCapital.ContainsKey(orgaoDb.Estado) ? UfToCapital[orgaoDb.Estado] : null; licitacao.CidadeFonte = ufToCidade != null? ufToCidade.ContainsKey(StringHandle.RemoveAccent(licitacao.Cidade.ToUpper())) ? ufToCidade[StringHandle.RemoveAccent(licitacao.Cidade.ToUpper())] : null : null; } } } }
//Métodos que controlam o envio de arquivos para o Amazon Simple Storage Service (S3) internal static bool SendObject(Licitacao l, string pathEditais, string fileName) { bool segundaTentativa = false; try { do { //cria o bucket no cliente caso o bucket não exista if (!AmazonS3Util.DoesS3BucketExist(s3Client, bucketName)) { CreateABucket(s3Client); } //Reúne os dados necessários do arquivo PutObjectRequest putRequest = new PutObjectRequest { BucketName = bucketName + "/licitacoes", Key = fileName, FilePath = pathEditais + fileName, Grants = new List <S3Grant> { new S3Grant { Grantee = new S3Grantee { URI = "http://acs.amazonaws.com/groups/global/AllUsers" }, Permission = S3Permission.READ } }/*, * TagSet = new List<Tag> * { * new Tag {Key = "IdLicitacao", Value = l.Id.ToString() }, * new Tag {Key = "Lote", Value = l.Lote.Id.ToString() }, * new Tag {Key = "Fonte", Value = l.LinkSite } * }*/ }; //Envia o arquivo para o bucket PutObjectResponse putResponse = s3Client.PutObject(putRequest); return(true); } while (segundaTentativa); } catch (Exception e) { RService.Log("RService Exception AWS (SendObject): " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " / " + e.InnerException + " / " + e.InnerException + " at {0}", Path.GetTempPath() + "RSERVICE" + ".txt"); //Faz uma segunda tentativa de envio segundaTentativa = !segundaTentativa; if (segundaTentativa) { RService.Log("AWS (SendObject): Segunda tentativa de envio... at {0}", Path.GetTempPath() + "RSERVICE" + ".txt"); Thread.Sleep(5000); } else { return(false); } } return(false); }
private static void GetArquivos(Licitacao licitacao) { if (!Directory.Exists(PathEditais)) { Directory.CreateDirectory(PathEditais); } 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(licitacao.LinkEdital); try { var fileLinks = web.FindElements(By.TagName("td")) .Where(l => l.GetAttribute("headers") == "DOWNLOAD2") .ToList(); if (fileLinks.Count > 0) { int count = 1; foreach (var fileLink in fileLinks) { fileLink.Click(); //if (IsElementPresent(web, By.XPath("//*[@id=\"apex_dialog_" + count + "\"]/iframe"))) //{ // fileLink.Click(); //} string captchaToken = GetCaptchaToken(Constants.TCERS_DOCUMENTSITEKEY, web.Url); web.SwitchTo().Frame(web.FindElement(By.XPath("//*[@id=\"apex_dialog_" + count + "\"]/iframe"))); string fileName = web.FindElement(By.XPath("//*[@id=\"P100_NM_ARQUIVO_DISPLAY\"]")).Text.Split('(')[0].Trim(); ((IJavaScriptExecutor)web).ExecuteScript(string.Format("document.getElementById('g-recaptcha-response').value='{0}'", captchaToken)); web.FindElement(By.XPath("//*[@id=\"P100_DOWNLOAD\"]")).Click(); Thread.Sleep(10000); CreateArquivo(licitacao, fileName); count++; web.FindElement(By.TagName("html")).SendKeys(Keys.Escape); } } } catch (Exception e) { RService.Log("Exception (GetArquivos) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", LogPath); } }
private static void CreateItensLicitacao(HtmlDocument htmDoc, Licitacao licitacao) { RService.Log("(CreateItensLicitacao) " + Name + ": Criando itens do objeto da licitação num.. " + licitacao.IdLicitacaoFonte + " at {0}", Path.GetTempPath() + Name + ".txt"); int count; HtmlNode dadosOc; int rows = 1; /*Pega o html da table com o id dgItensOc pra essa OC*/ dadosOc = htmDoc.DocumentNode.Descendants().FirstOrDefault(x => x.Id == "ctl00_c_area_conteudo_grdv_item"); /*Percorre as linhas da tabela exceto o Header que tem o atributo class HeaderStyle*/ foreach (var row in dadosOc.Descendants("tr") /*.Where(x => x.Attributes.Contains("class") && !x.Attributes["class"].Value.Contains("HeaderSt"))*/) { if (!row.InnerHtml.Contains("th scope=")) { ItemLicitacao item = new ItemLicitacao(); /*Contador usado para as colunas da tabela*/ count = 0; /*Percorre cada coluna de uma linha da tabela Intes da Oferta de Compra*/ foreach (var data in row.Descendants("td")) { /*A terceira coluna da tabela de Itens da Oferta de Compra contém a descrição do Item.*/ switch (count) { case 0: break; case 1: item.Numero = int.Parse(data.InnerText.Trim()); break; case 2: item.Codigo = data.InnerText.Trim(); break; case 3: string desc = data.InnerText.Trim(); item.DescricaoDetalhada = desc; item.Descricao = desc.Length > 50 ? desc.Substring(0, 50) + "..." : desc; break; case 4: item.Quantidade = int.Parse(data.InnerText.Trim()); break; case 5: item.Unidade = data.InnerText.Trim(); break; } count++; } item.MargemPreferencia = "0"; item.Decreto7174 = "0"; licitacao.ItensLicitacao.Add(item); rows++; } } }
/*Baixa os arquivos de edital*/ private static void DownloadEditais(List <string> editais, Licitacao licitacao, MatchCollection linkForm) { try { RService.Log("(DownloadEditais) " + Name + ": Consultando arquivos de edital, licitação... " + licitacao.IdLicitacaoFonte + " at {0}", Path.GetTempPath() + Name + ".txt"); if (!Directory.Exists(PathEditais)) { Directory.CreateDirectory(PathEditais); } for (int i = 0; i < editais.Count; i++) { //Busca os arquivos da licitação LicitacaoArquivoRepository repoArq = new LicitacaoArquivoRepository(); List <LicitacaoArquivo> arquivosAntigos = repoArq.FindByLicitacao(licitacao.Id); var edital = editais[i]; bool isExist = false; string nameFile = Regex.Replace(edital.Split('/')[edital.Split('/').Length - 1], string.Format("[{0}]", Regex.Escape( new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars()))), ""); while (nameFile.Contains("%1A")) { nameFile = Regex.Replace(nameFile, "%1A", "_"); } foreach (var arquivoAntigo in arquivosAntigos) { /*Verifica se o arquivo já existe*/ if (nameFile.Equals(arquivoAntigo.NomeArquivoFonte)) { isExist = true; break; } } if (!isExist) { Thread.Sleep(5000); FillForm(linkForm[i].Value); if (LicitacaoArquivoController.CreateLicitacaoArquivo(Name, licitacao, edital, PathEditais, nameFile, web.Manage().Cookies.AllCookies)) { NumArquivosLicitacao++; } } } } catch (Exception e) { RService.Log("Exception (DownloadEditais) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } }
private static void SegmentarCotacao(Licitacao l) { List <Segmento> segmentos = SegmentoController.CreateListaSegmentos(l); foreach (Segmento segmento in segmentos) { int objMatch = 0, segmentoCount = 0; bool itemMatch = false; var palavrasChave = segmento.PalavrasChave.Split(';'); if (palavrasChave.Length > 0) { foreach (var palavrachave in palavrasChave) { if (l.Objeto.ToUpper().Contains(palavrachave)) { objMatch++; } foreach (var item in l.ItensLicitacao) { if (item.Descricao.ToUpper().Contains(palavrachave) || item.DescricaoDetalhada.ToUpper().Contains(palavrachave)) { itemMatch = true; } } } if (objMatch >= 2 && itemMatch == true) { LicitacaoSegmento licSeg = new LicitacaoSegmento() { IdLicitacao = l.Id, IdSegmento = segmento.IdSegmento }; segmentoCount++; LicitacaoSegmentoRepository repoLS = new LicitacaoSegmentoRepository(); repoLS.Insert(licSeg); } } if (segmentoCount > 0) { RService.Log("(SegmentarLicitacao) " + Name + ": Licitação " + l.IdLicitacaoFonte + " foi segmentada em " + segmentoCount + " segmentos at {0}", Path.GetTempPath() + Name + ".txt"); } else { RService.Log("(SegmentarLicitacao) " + Name + ": Licitação " + l.IdLicitacaoFonte + " não foi segmentada at {0}", Path.GetTempPath() + Name + ".txt"); } } }
private static void CreateItensLicitacao(ChromeDriver web, Licitacao licitacao) { RService.Log("(CreateItensLicitacao) " + Name + ": Criando itens do objeto da licitação num.. " + licitacao.IdLicitacaoFonte + " at {0}", Path.GetTempPath() + Name + ".txt"); int count; var itens = web.FindElements(By.TagName("tr")); //Percorre cada linha da tabela com os itens, cria cada registro no banco e os adiciona à licitação foreach (var row in itens) { var text = row.GetAttribute("style").ToString(); if (row.GetAttribute("style").Contains("background-color: ") && !row.GetAttribute("style").Contains("color: white; background-color: rgb(107, 105, 107); font-weight: bold;")) { count = 0; ItemLicitacao item = new ItemLicitacao(); foreach (var td in row.FindElements(By.TagName("td"))) { switch (count) { case 0: break; case 1: item.Numero = int.Parse(td.Text); break; case 2: item.Codigo = td.Text; break; case 3: item.DescricaoDetalhada = td.Text; item.Descricao = item.DescricaoDetalhada.Length > 50 ? item.DescricaoDetalhada.Substring(0, 50) + "..." : item.DescricaoDetalhada; break; case 4: item.Quantidade = int.Parse(td.Text); break; case 5: item.Unidade = td.Text; break; } count++; } item.MargemPreferencia = "0"; item.Decreto7174 = "0"; licitacao.ItensLicitacao.Add(item); } } }
/**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); } }
private static void GetItens(HtmlDocument htmlQuote, Licitacao l) { try { foreach (var row in htmlQuote.DocumentNode.Descendants("tr").Where(x => !x.Attributes.Contains("height") && x.Attributes.Contains("class") && x.Attributes["class"].Value.Equals("tex3"))) { ItemLicitacao item = new ItemLicitacao(); int count = 0; foreach (var cell in row.ChildNodes.Where(x => x.Name.Equals("td"))) { switch (count) { case 0: item.Numero = Convert.ToInt32(cell.InnerText); break; case 1: item.Descricao = cell.InnerText.Replace("\");\r\n \">", ""); string itemLink = cell.ChildNodes[0].Attributes["href"].Value.ToString().Split('/')[2]; HtmlDocument itemDetail = WebHandle.GetHtmlDocOfPage(string.Format(Constants.CN_COTACAO_LINK, itemLink), Encoding.GetEncoding("ISO-8859-1")); string descDetail = Regex.Replace(itemDetail.DocumentNode.InnerHtml.ToString().Replace("<br>", "\n"), "<.*?>", String.Empty) .Replace("\n\n\n\n \tCOMPRASNET - O Portal de Compras do Governo Federal :: DESCRIÇÃO COMPLEMENTAR.\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\nDESCRIÇÃO COMPLEMENTAR\n\r\n\r\n", "") .Replace("\r\n\r\n\r\n", "\n") .Replace(" ", ""); item.DescricaoDetalhada = descDetail; break; case 2: item.Quantidade = Convert.ToInt32(cell.InnerText); break; case 3: item.Unidade = cell.InnerText; break; } count++; } item.Decreto7174 = "0"; item.MargemPreferencia = "0"; l.ItensLicitacao.Add(item); } } catch (Exception e) { RService.Log("Exception (GetItens) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } }
/*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); }
private static void CreateItensAlternateId(HtmlDocument htmDoc, Licitacao licitacao, ref int count, ref int rows) { HtmlNode dadosOc = htmDoc.DocumentNode.Descendants().SingleOrDefault(x => x.Id == "ctl00_conteudo_loteGridItens_grdLote"); foreach (var row in dadosOc.Descendants("tr")) { if (row.Attributes.Contains("class") && row.Attributes["class"].Value.Contains("HeaderStyle")) { continue; } ItemLicitacao item = new ItemLicitacao(); /*Contador usado para as colunas da tabela*/ count = 0; /*Percorre cada coluna de uma linha da tabela Intes da Oferta de Compra*/ foreach (var data in row.Descendants("td")) { /*A quarta coluna da tabela de Itens da Oferta de Compra contém a descrição do Item.*/ switch (count) { case 2: item.Numero = int.Parse(data.InnerText.Trim()); break; case 3: string desc = data.InnerText.Trim(); item.Descricao = desc.Length > 50 ? desc.Substring(0, 50) + "..." : desc; item.DescricaoDetalhada = desc; break; case 4: item.Quantidade = int.Parse(data.InnerText.Trim().Replace(".", "")); break; case 1: item.Unidade = "GRUPO"; break; } count++; } licitacao.ItensLicitacao.Add(item); rows++; } }
/*Baixa os arquivos de edital*/ private static void DownloadEditais(List <string> editais, Licitacao licitacao, MatchCollection linkForm) { try { RService.Log("(DownloadEditais) " + GetNameRobot() + ": Consultando arquivos de edital, licitação... " + licitacao.IdLicitacaoFonte + " at {0}", Path.GetTempPath() + GetNameRobot() + ".txt"); if (!Directory.Exists(PathEditais)) { Directory.CreateDirectory(PathEditais); } for (int i = 0; i < editais.Count; i++) { //Busca os arquivos da licitação LicitacaoArquivoRepository repoArq = new LicitacaoArquivoRepository(); List <LicitacaoArquivo> arquivosAntigos = repoArq.FindByLicitacao(licitacao.Id); var edital = editais[i]; bool isExist = false; string nameFile = string.Format("Anexo{0}Licitacao{1}", i, licitacao.Id); foreach (var arquivoAntigo in arquivosAntigos) { /*Verifica se o arquivo já existe*/ if (nameFile.Equals(arquivoAntigo.NomeArquivoFonte)) { isExist = true; break; } } if (!isExist) { if (LicitacaoArquivoController.CreateLicitacaoArquivo(GetNameRobot(), licitacao, edital, PathEditais, nameFile, web.Manage().Cookies.AllCookies)) { NumArquivosLicitacao++; } } } } catch (Exception e) { RService.Log("Exception (DownloadEditais) " + GetNameRobot() + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + GetNameRobot() + ".txt"); } }
private static Licitacao CreateLicitacao(string link) { Licitacao licitacao = new Licitacao(); try { web.Navigate().GoToUrl(Constants.CRJ_HOST + link); licitacao.Lote = Lote; licitacao.IdFonte = Constants.CRJ_ID_FONTE; licitacao.IdLicitacaoFonte = long.Parse(link.Split('=')[2]); licitacao.LinkSite = Constants.CRJ_HOST; licitacao.LinkEdital = Constants.CRJ_HOST + link; licitacao.EstadoFonte = Constants.CRJ_ESTADO_FONTE; licitacao.Estado = Constants.CRJ_ESTADO; licitacao.DigitacaoUsuario = 43; var licitInfo = web.FindElements(By.ClassName("cx_clara")); licitacao.Num = licitInfo[0].Text.Split('-')[0].Trim(); licitacao.Processo = licitInfo[0].Text.Split('-')[0].Trim(); licitacao.Objeto = licitInfo[0].Text.Split('-')[2].Trim() + " Obs.: Os arquivos do edital podem ser obtidos no site do Compras Rio de Janeiro."; licitacao.Modalidade = NameToModalidade.ContainsKey(StringHandle.RemoveAccent(licitInfo[1].Text.ToUpper())) ? NameToModalidade[StringHandle.RemoveAccent(licitInfo[1].Text.ToUpper())] : null; if (licitacao.Modalidade == null && licitacao.Processo.Contains("PE")) { licitacao.Modalidade = NameToModalidade["PREGAO ELETRONICO"]; } licitacao.Departamento = licitInfo[2].Text.Trim(); var orgao = licitInfo[2].Text.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(licitInfo[3].Text.Replace("De ", "").Remove(19, 24), "dd/MM/yyyy-hh:mm"); licitacao.AberturaData = DateHandle.Parse(licitInfo[4].Text, "dd/MM/yyyy-hh:mm"); licitacao.Situacao = licitInfo[5].Text.Trim(); licitacao.Cidade = Constants.CRJ_ESTADO; licitacao.CidadeFonte = Constants.CRJ_CIDADE_FONTE; } catch (Exception e) { RService.Log("Exception (CreateLicitacoes) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", LogPath); } return(licitacao); }
private static void CreateItens(Licitacao licitacao, ref int count, ref int rows, HtmlNode dadosOc) { foreach (var row in dadosOc.Descendants("tr")) { if (row.Attributes.Contains("class") && row.Attributes["class"].Value.Contains("HeaderStyle")) { continue; } ItemLicitacao item = new ItemLicitacao(); /*Contador usado para as colunas da tabela*/ count = 0; /*Percorre cada coluna de uma linha da tabela Intes da Oferta de Compra*/ foreach (var data in row.Descendants("td")) { /*A quarta coluna da tabela de Itens da Oferta de Compra contém a descrição do Item.*/ switch (count) { case 2: item.Numero = int.Parse(data.InnerText.Trim()); break; case 4: string desc = data.InnerText.Trim(); item.Descricao = desc.Length > 50 ? desc.Substring(0, 50) + "..." : desc; item.DescricaoDetalhada = desc; break; case 5: item.Quantidade = int.Parse(data.InnerText.Trim().Replace(".", "")); break; case 6: item.Unidade = data.InnerText.Trim(); break; } count++; } licitacao.ItensLicitacao.Add(item); rows++; } }
/*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 CreateItensLicitacao(HtmlDocument htmDoc, Licitacao licitacao) { RService.Log("(CreateItensLicitacao) " + Name + ": Criando itens da licitação .. " + licitacao.IdLicitacaoFonte + " at {0}", Path.GetTempPath() + Name + ".txt"); int count = 0; /*Contador das linhas da tabela*/ int rows = 1; /*Pega o html da table com o id dgItensOc pra essa OC*/ var dadosOc = htmDoc.DocumentNode.Descendants().SingleOrDefault(x => x.Id == "ctl00_conteudo_dg"); /*Percorre as linhas da tabela exceto o Header que tem o atributo class HeaderStyle*/ if (dadosOc != null) { CreateItens(licitacao, ref count, ref rows, dadosOc); } else { CreateItensAlternateId(htmDoc, licitacao, ref count, ref rows); } }
private static void HandleTermoHomologacao(string licitInfo, Licitacao licitacao) { try { var nums = HandleLicitInfo(licitInfo); var termoHomologacaoUrl = string.Format(Constants.CN_TERMOHOMOLOGACAO, nums[0], nums[1], nums[2]); HtmlDocument homologDoc = WebHandle.GetHtmlDocOfPage(termoHomologacaoUrl, Encoding.GetEncoding("ISO-8859-1")); var grupos = homologDoc.DocumentNode.ChildNodes[0].ChildNodes[3].ChildNodes.Where(g => g.InnerText.Contains("GRUPO")).ToList(); foreach (var grupo in grupos) { GetPrecos(grupo, licitacao); } } catch (Exception e) { RService.Log("Exception (HandleTermoHomologacao) " + 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 GetFiles(Licitacao licitacao) { try { if (!Directory.Exists(PathEditais)) { Directory.CreateDirectory(PathEditais); } web.FindElement(By.Id("showEdital")).Click(); Thread.Sleep(3000); var html = web.PageSource; var fileRx = new Regex(Constants.CRJ_FILELINK_REGEX); if (fileRx.IsMatch(html)) { var matches = fileRx.Matches(html); var fileLinks = HandleMatchedContent(matches); foreach (var link in fileLinks) { var fileName = link.Split('/')[9]; WebHandle.DownloadFileWebRequest(link, PathEditais, fileName); if (LicitacaoArquivoController.CreateLicitacaoArquivo(Name, licitacao, PathEditais, fileName, web.Manage().Cookies.AllCookies)) { RService.Log("(GetFiles) " + Name + ": Arquivo " + fileName + " inserido com sucesso para licitação " + licitacao.IdLicitacaoFonte + " at {0}", LogPath); } } } } catch (Exception e) { RService.Log("Exception (GetFiles) " + Name + ": " + e.Message + " / " + e.StackTrace + " at {0}", LogPath); } }
private static void CreateArquivo(Licitacao licitacao, string filename) { try { if (File.Exists(PathEditais + filename)) { if (LicitacaoArquivoController.CreateLicitacaoArquivo(Name, licitacao, PathEditais, filename, web.Manage().Cookies.AllCookies)) { RService.Log("(CreateArquivo) " + Name + ": Arquivo inserido com sucesso para licitação " + licitacao.Num + " at {0}", LogPath); } File.Delete(PathEditais + filename); } else { RService.Log("Exception (CreateArquivo) " + Name + ": Download do arquivo " + filename + " não foi concluído com sucesso at {0}", LogPath); } } catch (Exception e) { RService.Log("Exception (CreateArquivo) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", LogPath); } }
private static void GetEditalAndArquivos(HtmlDocument licPage, Licitacao l) { try { int fileCount = 0; string files = licPage.DocumentNode.ChildNodes[2].ChildNodes[5].ChildNodes[5].ChildNodes[9].ChildNodes[3].ChildNodes[3].ChildNodes[5].InnerHtml; MatchCollection fileLinks = StringHandle.GetMatches(files, @"/down(.*)>"); foreach (var file in fileLinks) { string fileUrl = l.LinkEdital.Replace("detalhes", "baixarArquivo") + file.ToString().Split('\"')[0]; //l.Observacoes = "Link para download de arquivo referente ao edital: " + fileUrl + "\n"; //repo = new LicitacaoRepository(); //repo.Update(l); GetFile(l, fileUrl, files, fileCount); fileCount++; } } catch (Exception e) { RService.Log("Exception (GetEditalAndArquivos) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } }