u/mruizdiaz64

Falsa Competencia: Grafo de (posible) fraude en licitaciones públicas
▲ 337 r/devsarg

Falsa Competencia: Grafo de (posible) fraude en licitaciones públicas

Hola! Soy el pibe de Reporté errores y me llamaron del Senado : r/devsarg y ¿Qué dijo? - Senadores. Hoy hice Falsa Competencia

En las últimas tres semanas estuve scrappeando la página de COMPR.AR que contiene las compras de la Administración Pública Nacional (esto es el Poder Ejecutivo, sin contar obras públicas) y el BOLETIN OFICIAL REPUBLICA ARGENTINA, particularmente su buscador de sociedades, que contiene los cambios en los directorios de las empresas argentinas. El objetivo era armar un grafo que relacione personas->empresas->licitaciones públicas de forma que se pueda detectar cuándo una misma persona hace ofertas desde empresas distintas, por ejemplo

https://preview.redd.it/f2i7b2anu8bh1.png?width=1456&format=png&auto=webp&s=e7b9988475c90ca554609de624a1388cd3652978

Este esquema de falsa competencia es el cuadro delictivo en causas como Vialidad u Odebrecht. Como emerge del gráfico, el patrón que estamos buscando son ciclos Persona-Empresa-Compra en un grafo direccionado, por lo que la idea inicial fue scrappear distintas fuentes, recolectar estos datos, armar el grafo y proyectar los datos en Neo4j con una query cypher para armar el grafo.

https://preview.redd.it/cnmpm5lqu8bh1.png?width=1612&format=png&auto=webp&s=0ea453478644341a20dc1550b124eb0ee6f83da4

https://preview.redd.it/vze9qj6yu8bh1.png?width=1291&format=png&auto=webp&s=b57caefb0f85aa67df53af720cd165076a6bd462

https://preview.redd.it/g44tld34v8bh1.png?width=1625&format=png&auto=webp&s=14b1e51b875ca2c675a2bac83f4f51cb1b4e92f4

El grafo final que contiene todas las relaciones (sospechosas y no sospechosas) es de unos 180k nodos con 550k relaciones, por lo que no es posible visualizarlo en tiempo real.

También agregué algunas estadísticas que me parecieron interesantes, como proporción de Licitaciones Públicas vs Privadas vs Contrataciones Directas, o el gasto acumulado por Ministerio

https://preview.redd.it/v5a26z13v8bh1.png?width=1603&format=png&auto=webp&s=60b89d18368581aa8af38890aabf17bed1a40c4d

Algo que no me esperaba de estas estadísticas fue que el Correo Argentino sea el proveedor que más dinero recibe, y que la mayoría de procesos de compra son por Contratación Directa; es decir, a dedo.

https://preview.redd.it/d203tki1v8bh1.png?width=1640&format=png&auto=webp&s=010da17e441b43fb02bd92047ea72bc75cff984b

Finalmente hay un "ágora" donde se muestra evidencia de posible falsa competencia con links a las fuentes oficiales (la licitación, el cuadro de oferta con los pliegos, las actas en el bora) y el usuario puede votar si considera que podría haber existido falsa competencia.

https://preview.redd.it/zhe2kvq5v8bh1.png?width=1620&format=png&auto=webp&s=e22697b5acb840b3d6546c053919088c94ae3dc1

Algunos de los problemas que me encontré en el camino

  • La página de COMPR.AR está hecha de forma adrede para que sea difícil de scrappear. Todas las requests usan un query string cifrado cuya clave de cifrado se arma según las páginas anteriormente visitadas. Por ejemplo VistaPreviaPliegoCiudadano.aspx?qs=BQoBko.... (string cifrado de cientos de caracteres)|BoX(...otro string...). Esto previene enumerar la base de datos y obliga a hacer un headless browser que manualmente clickee los links, dado que estos se calculan en tiempo de ejecución. Si bien esto hace un poco más difícil el scrapping, no es imposible porque el cifrado es estable, por lo que la misma sucesión de links generan siempre el mismo query string para todos los usuarios. A efectos prácticos se comporta igual que cualquier otro path traversal con el efecto de que nunca sabes que parte del path representa qué cosa, pero sí obliga a hacer N requests por proceso donde N es el link depth hasta ese recurso.
  • La página del BORA contiene los extractos de las actas, pero para actas anteriores a 2011 se suben PDFs sobre los cuales habría que hacer OCR; sin embargo esos pdfs son de cientos de páginas. Por esta razón excluí el período anterior a 2011
  • La fecha de las Actas no es representativa del cambio de directorio, las empresas suelen anunciar sus cambios de directorios un año después de que realmente sucedieron. Si bien esto es ilegal, es la normal porque la multa es muy baja. Esto implica que es necesario procesar el texto del acta que en algún lugar indica la fecha en la cual se designó una autoridad. Para esto usé GPT-5mini de forma que extrajera el movimiento (designación/cese/renuncia), cargo (gerente, director, suplente; etc), persona involucrada por cuit/dni/nombre y fecha del movimiento.
  • El grafo final es muy denso, puesto que considera todos los movimientos de todas las empresas que en algún momento hubieran hecho alguna oferta al Estado. Hay empresas como Telecom o Telmex que tienen más de 600 personas nombradas en el período 2011-2026. Esto hizo que Neo4J no responda a la velocidad que me gustaría, por lo que precalculé la el grafo de "casos sospechosos". Para esto implementé un multi-point BFS que terminó en un tiempo razonable. Este grafo se recalcula en cada build. Para filtros específicos (por ejemplo, los nodos de Movistar) se sigue usando Neo4J.
  • La página COMPR.AR parece tener un límite duro/hardcodeado de responder como mínimo en 0.1 segundos al mismo cliente, lo que implicó hacer el scrapping a lo largo de 1 semana con aproximadamente 100 hilos, aunque este tiempo seguro se puede reducir si se tienen varias IPs distintas

El stack es

  • Neo4j para los grafos
  • selectolax para parsear el html y headless browser
  • PostgreSQL para la bdd de proveedores, procesos de compra, personas y votaciones
  • RabbitMQ para encolar votaciones en el ágora
  • Vite para el front, altamente vibecodeado porque no soy UI/UX

Para casos "sospechosos" de falsa competencia se considera

  • Dos o más empresas participan en un proceso de compra
  • Hay una o más personas en común entre estas empresas
    • Dicha persona NO es el escribano del acta del BORA (es común que se compartan, hay pocos y no necesariamente forman parte de la empresa)
    • Se excluyen Actas históricas por estar en PDF y requerir OCR de baja fiabilidad
    • Se excluyen relaciones de hace más de 4 años de antigüedad. Las empresas suelen tener cargos temporales que se renuevan y generan un acta nueva
    • Se excluyen movimientos de personas posteriores a la oferta/compra
  • Sólo "ofertas confirmadas" por el gobierno, no necesariamente compradas/aceptadas aunque hay un filtro opcional para ello

Con esos filtros se encontraron 241 casos sospechados de los cuales hay al menos 26 que tienen Órdenes de Compra asociados (es decir, el Estado compró a una de las empresas sospechadas), esto es una vara baja porque hay órdenes de compra que no se suben sino que se adjuntan en pdfs anexados que por su complejidad quedó fuera de análisis.

Si se incluyen movimientos de personas posteriores a la oferta/compra el grafo aumenta a 2753 casos, lo que muestra un flujo alto de mismas personas entre empresas que trabajan con el Estado a lo largo del tiempo.

reddit.com
u/mruizdiaz64 — 1 day ago
▲ 963 r/devsarg

Reporté errores y me llamaron del Senado

Hola! Soy el pibe de Quedijo.ar: ¿Qué dicen los Senadores en el Congreso?

Estuve agregando algunas actualizaciones a la página ¿Qué dijo? cuando encontré medio de casualidad una discrepancia entre un Acta de Votación y la página del Senado. Esto es lo que mostraba la página del Senado para una de las votaciones

https://preview.redd.it/sfxz7fz4o45h1.png?width=1738&format=png&auto=webp&s=5c15e89b68894179e0e5b656143f366238cb9c86

Y esto es lo que estaba en la transcripción oficial de la Secretaría de Taquígrafos

https://preview.redd.it/be4yjtv6o45h1.png?width=737&format=png&auto=webp&s=735f1d71195a31dd72185ab4322b902716f4099e

Como parte del pipeline de la página que hice mapea la transcripción oficial como la transcripción del directo de YouTube, pude también validar con el directo para ver cual de las dos era la correcta

https://preview.redd.it/5bo6fy68o45h1.png?width=918&format=png&auto=webp&s=903c316218affec2d6ea99e2394c84c5c3dc7058

Entonces me surgió la duda de cuántos casos más así habrá, de modo que hice un script que junte las discrepancias, las cuales asumí no habría ninguna. El acta de votación en la transcripción es una imagen, por lo que use OCR para tratar de parsearla pero el resultado fue horrible asi que terminé usando GPT5-mini para transcribir la tabla.

Dado que ya guardo todas las actas de votación cuando proceso los directos, sus taquigráficas y scrapeo al Senado, fue cuestión de cruzar un par de jsons y ver en dónde no había match.

Entre 2025 y 2026 hubieron unas 49 leyes debatidas con unas 130 votaciones, de las cuales 2 tienen discrepancias con lo que se indica en la página del Senado. En ambos casos, la taquigráfica tenía la versión correcta y la página del Senado estaba errada.

Reporté el error al Senado usando la sección de "Contacto" del Senado, indicando ambas votaciones. Al día siguiente me llamaron a mi celular personal y pidiéndome que lo reporte de vuelta pero a la "Secretaría Parlamentaria" y agradeciéndome por el reporte.

https://preview.redd.it/1i0yukkao45h1.png?width=1763&format=png&auto=webp&s=3366b04ed1f1d280c0569b369fecdb33ecf3faf7

La "Secretaría Parlamentaria" no está listada como contacto en la página del Senado https://www.senado.gob.ar/micrositios/Dependencias por lo que simplemente me tiré al lance con lo que parecía más cercano "Dirección General de Secretaría" y les mandé un mail. Al día siguiente me respondieron

https://preview.redd.it/ekjcohvco45h1.png?width=957&format=png&auto=webp&s=ad202f9e710ebe504f63b7bcb4ad309513bc0ec8

Al día subsiguiente lo arreglaron Honorable Senado de la Nación Argentina

https://preview.redd.it/2dzwnpneo45h1.png?width=1273&format=png&auto=webp&s=ca0568ed08385a0f846df525204c8262dfdabe05

Por el momento sólo procesé 2025 y 2026, el finde trataré de ir más atrás con los años a ver si hay más discrepancias.

reddit.com
u/mruizdiaz64 — 1 month ago

Alquilar en España bajo visa PAC?

Hola!
Estoy en proceso de visado para mudarme a Barcelona bajo la visa de Profesional Altamente Cualificado. Estoy mirando pisos en spotahome, spacest, idealista; etc.

Veo que todos piden "avalistas" que entiendo es el equivalente a un "garante" o "seguro de caución" en Argentina. Mi problema es que no conozco a nadie en España para que me salga de garante, y por lo que leo la alternativa es un avalista bancario pero eso es imposible de obtener sin nóminas y antigüedad crediticia en España.

Hay avalistas privados/seguros de caución que se puedan contratar siendo extranjero para poder presentar en estas plataformas?

Hay en la práctica otras alternativas (como por ejemplo, adelantar meses de alquiler) para compensar la falta de avalista?

Mi contrato es a tiempo indefinido con 6 meses de prueba.

reddit.com
u/mruizdiaz64 — 2 months ago