Files
vreau-digital/services/seap-scraper/STRATEGIC-PLAN.md
T
Claude VM a6c03a091e initial: split from gov-agreg — vreau.digital standalone platform
Moved from gov-agreg/src/pages/achizitii/* to root (drop prefix).
- 22 pages migrated, 127 files total
- All internal links: /achizitii/X → /X (176 occurrences fixed)
- AchizitiiLayout subnav rewritten: /X paths, top-right link to vreaudigital.ro hub
- BaseLayout new (vreau.digital branding, OG tags, site URL)
- astro.config.mjs: site https://vreau.digital, server output (was static)
- docker-compose: port 5096 (vreaudigital is 5095), container vreau-digital
- deploy.sh: paths /opt/vreau-digital, log /var/log/vreau-digital-deploy.log

Backend shared with gov-agreg:
- PostgreSQL satra (same schemas: seap, firms, anaf, anre, ...)
- Photon, Martin tiles
- Infisical /vreaudigital path (DATABASE_URL etc. shared)

build: PASS (npx astro check 0 errors, npm run build 5s vite + 10s server)
2026-05-13 00:10:32 +03:00

14 KiB
Raw Blame History

Strategic plan — vreaudigital.ro firms+procurement DB

Sintetizat 2026-05-08 din 9 research agents paraleli.

Acest document e plan de implementare pentru extinderea bazei de date de la "firmă + financiale + SEAP + ANAF" (curent live) la "cea mai completă bază publică pentru analize, investigații, urbanism, transparență, competitivitate".

Stare curentă (recap)

Asset Coverage
firms.entities 3.97M firme RO (ONRC bulk + ANAF v9)
firms.financials 3.86M records WEB_UU + 250K WEB_BL_BS_SL (5 ani)
firms.financials_ong 250-300K NGO firm-years (în populare)
firms.financials_banks ~100 bank firm-years (în populare)
firms.reprezentanti_if 122,956 reprezentanți întreprinderi familiale
firms.sucursale_ue 235 sucursale RO în 20 state UE
GIS lat/lng 70.5% (postal+UAT) + Photon overnight la housenumber
seap.announcements 642K contracte SEAP/TED/datagov
Cron timers daily ANAF, weekly ONRC, nightly MV refresh

Cele 4 join-uri unice anti-corupție (CEL MAI MARE UNLOCK)

Combinația de 4 surse adăugate peste ce avem dă vreaudigital.ro un poziționare unică în RO civic-tech — niciun alt proiect (Demoanaf, Banipartide, Expert Forum, Funky Citizens) nu le are pe toate 4 împreună:

  1. ANI declarații avere/interese × SEAP — "ce oficial deține firme care au câștigat contracte?" — federated PDF crawl per instituție
  2. AEP donații politice × SEAP — "ai donat partidului X, ai luat contractul Y" — XLS per partid prin finantarepartide.ro
  3. ANPC sancțiuni consumatori × SEAP — "furnizor amendat care vinde la stat" — WP REST API verified working
  4. EU funds (SMIS/AFIR/FTS) × SEAP — "double-dippers" UE + national — data.gov.ro CKAN bulk

Plus killer feature urbanism: E-PRTR polluters × SEAP — "poluatori care vând la stat" prin EEA bulk download.


TIER 1 — Quick wins (1-2 zile total per item)

Ordinea = impact × ușurință. Toate au format bulk + license deschisă.

A. INS Tempo per-UAT (gov2-ro/tempo-ins-dump) — IMPACT MAXIM

  • Repo deja construit cu 3,706 Parquet files, FastAPI + DuckDB
  • Pull populație, salariu mediu, șomaj, învățământ per UAT × an
  • Killer use: color the map with population/income/education metrics
  • 1 zi — clone + adapt pentru PG ingest

B. Recensământ 2021 per UAT

  • XLSX direct de la recensamantromania.ro (rezultate definitive)
  • Etnie, educație, locuințe, vârstă per UAT
  • Combinat cu A → "spending pe școli vs % populație <18 ani"
  • 1 zi

C. ANI declarații (gov2-ro/declaratii-integritate)

  • Existing scraper, deja popolat
  • Per oficial: shareholdings + administrator positions + salarii
  • Activates anti-corruption join #1
  • 1-2 zile pentru integrare

D. ANPC sancțiuni (WP REST API)

  • https://anpc.ro/wp-json/wp/v2/posts?search=...&per_page=100&page=N
  • Verified working — JSON paginated
  • Regex extract S.R.L./S.A. names → fuzzy match la firms.entities
  • Activates join #3
  • 2 zile

E. AFIR FEGA/FEADR beneficiari (CAP funds per CUI)

  • XLSX per an la afir.ro/rapoarte/beneficiari-de-fonduri-europene/
  • 600K+ ferme/agri-firme/an
  • 1 zi

F. EU FTS (Financial Transparency System)

  • 18 annual XLSX, filter Country=Romania
  • Horizon, LIFE, Erasmus+, CEF beneficiaries
  • Match by name (no CUI) — fuzzy
  • Activates join #4
  • 1 zi

G. CORDIS Horizon EU R&D

  • CSV bulk separat organization.csv cu filter country=RO
  • ~2.5K RO orgs, <50MB
  • Signal "real R&D player"
  • 1 zi

H. EEA E-PRTR (poluatori facility-level)

  • MS Access + CSV bulk de la eea.europa.eu
  • ~700 RO facilități cu CUI (NationalID field)
  • Activates "polluter ↔ public money" killer story
  • 1 zi

I. EEA Natura 2000 + SEVESO shapefile

  • ~600 RO Natura sites + ~280 SEVESO amplasamente
  • Geo overlay cu firms — "construcții în zone protejate"
  • 1 zi

J. Industrial parks (MDLPA)

  • 100 parks, 1518 operatori, 76K angajați
  • HTML table → CSV → geocode
  • Map vizual instant
  • 0.5 zi

K. ONRC missing CSVs (REPREZENTANTI_IF + SUCURSALE_UE)

  • DONE 2026-05-08

L. WEB_BL_BS_SL financials

  • DONE 2026-05-08 (5 ani, ~250K records)

M. ONG + bank financials separate tables

  • în populare 2026-05-08 (~300K total)

N. Geocoding postal + UAT centroid + Photon

  • DONE postal/UAT
  • Photon JAR running, 70%+ housenumber overnight

TIER 2 — Medium effort (3-7 zile per item)

O. ANI declarații federated crawler (per-instituție)

  • Per-instituție config (URL pattern, PDF list selector)
  • Start: Parlament + 41 Consilii Județene + top 100 primării
  • Camelot/pdfplumber pentru tabele declarații
  • 1-2 săptămâni
  • Datasetul cel mai valoros pentru transparency — bridges officials → firms

P. AEP financing parser

  • finantarepartide.ro XLS per partid-an
  • Donori >25K RON itemized
  • 1 săptămână
  • Activates join #2

Q. Code4Romania romanian-elections-data

  • Direct git ingest, BEC results per polling station back to 1992
  • 1 zi setup, then incremental
  • "Candidat X câștigat Sector 3 → Mayor X semnat contract Y la 60 zile"

R. data.gov.ro proiecte-contractate (fonduri EU 2014-2024)

  • 114 XLSX per OP × snapshot, 108MB total
  • Dedup by latest snapshot per OP
  • 1 zi

S. CKAN poller generic (data.gov.ro)

  • Walks package_search?q=* paginated
  • Daily cron, dedup by (dataset_id, resource_id, mtime)
  • Unblocks ~150 datasets care touch firms
  • 1 zi

T. SITUR — turism (cazare, agenții, ghizi, pârtii)

  • 4 datasets, refresh zilnic, ~30K cazare + 3K agenții
  • 1 zi

U. ANSVSA — registre sanitar-veterinar per județ

  • 42 județe × multiple categorii → CUI per autorizație food sector
  • 1 săptămână (county aggregation)

V. License registries scrape (ANRE, ANCOM, ASF, ANRSC, etc.)

  • Per regulator: tabel paginat HTML
  • ~50K firme cu flag "licență X"
  • 3-5 zile

W. EBRD + EIB + IFC project lists

  • 3 separate CSV/HTML scrapes
  • ~500 RO projects total cu nume + sumă
  • Fuzzy match name → CUI
  • 2 zile

X. EUIPO Trademark API (RO TM holders)

  • REST JSON + sandbox
  • Filter applicant country=RO
  • 1-2 zile

Y. ANOFM vacancies (real-time labor demand)

  • 5-day legal disclosure → ~8K vacancies live
  • Daily snapshot + diff
  • 1 săptămână

Z. SEVESO XLSX consolidat per județ ANPM

  • 42 PDFs/XLSX → consolidat
  • 2 zile

AA. ANRE licențe scrape (centrale regenerabile)

  • Singurul registru centralizat producători energie
  • ~5000 entries
  • 1-2 zile

BB. CNCD discrimination decisions

  • 14K decisions HTML+PDF
  • Sancțiuni angajatori
  • 3 zile

CC. ASF sancțiuni (PDF per decision)

  • ~500/an
  • 2 zile

DD. ANSPDCP GDPR fines

  • WP REST sau scrape
  • 2 zile

EE. INS Tempo dump (gov2-ro existing)

  • (Deja în Tier 1 dar reluat: 1700 indicatori, integrare instantă)

FF. ANP penitenciare (statistici lunare)

  • 34 unități, locații publice, populații
  • 1 zi

GG. UEFISCDI BrainMap + ERRIS

  • 17K cercetători + 1.4K research infrastructures
  • PDF lists per call PCE/PD/TE
  • 1 săptămână (PDF heavy)

HH. GTFS feeds (TPBI + Tranzy.app)

  • VERDE — București + Cluj + Iași + Timișoara + Botoșani
  • Live transit overlay 20s refresh
  • 1 zi

II. ANRSC operatori apă-canal/salubrizare per UAT

  • HTML scrape per județ
  • 3 zile

JJ. CFR + drumuri OSM

  • Filter PBF Romania pentru railway/highway
  • 1 zi

KK. CIMEC muzee + RAN situri arheologice

  • 840 muzee + 25K situri
  • 2 zile

LL. portal.just.ro instanțe locații

  • Lista completă scrape + geocodare
  • 1 zi

TIER 3 — Heavy effort (1+ săptămâni) sau valoare scăzută

MM. HCL POC (top UATs)

  • Cluj-Napoca + 3 sectoare București + Timișoara + Iași
  • PDF OCR + Tesseract + unstructured layout
  • 80h per pattern
  • Total 4-6 săptămâni pentru POC
  • Justified pentru "Mayor approves contract for connected firm" thesis

NN. cdep.ro voting + legislative pipeline

  • Fork cristian-sima/cdep-live
  • 4 săptămâni pentru ingest complet
  • "Cine a votat ce" — payoff analitic mare

OO. Curtea de Conturi PDF crawl

  • 14K rapoarte audit IDs sequential
  • OCR + LLM extraction
  • 3-5 zile minimum
  • Defer until use case clarifies

PP. CNSC contestații

  • 16K decizii PDF
  • Heavy parsing
  • 1 săptămână

QQ. SUMAL wood traceability

  • Per-firm flow data NOT bulk public (police-controlled)
  • Defer until MMAP publishes 2025 transparency datasets

RR. portal.just.ro ECRIS per-CUI scrape

  • ~3h batch pentru top 50K firme cu SEAP
  • Dossier metadata only (no decision text)
  • 2 zile coding

SS. ROLII / REJUST per-CUI

  • ROLII mort 2022, REJUST anonimizat — IMPOSSIBLE
  • Skip

TT. BPI insolvency

  • Paywalled (~$30K/year subscription via ONRC RECOM)
  • Skip until commercial deal

UU. ONRC UBO registry

  • Paywall + e-signature per query
  • Use rep_legali (administrators) ca proxy

VV. ONRC puncte de lucru

  • Nu există bulk
  • Cerere oficială Lege 544/2001 (incertă)

WW. ANAF Inactivi/Lista Albă/Datornici

  • Captcha pe TOATE 3 (verified 2026-05-08)
  • Skip until OCR captcha service justificat

XX. portal.just.ro decision text per case

  • Există dossier metadata, dar text decizii anonimizat
  • Skip

YY. DGAF / DNA / Vamă per-firmă

  • Doar agregate sau prose press releases
  • Defer (LLM extraction cost-benefit incert)

ZZ. RoTLD .ro domains per CUI

  • WHOIS redactat persoane fizice; PJ vizibile dar nu bulk
  • Multi-week scrape, semnal slab
  • Skip

Roadmap recomandat 4 săptămâni

Săptămâna 1 — backbone macro + 2 corruption joins

  1. INS Tempo dump (gov2-ro/tempo-ins-dump) — A
  2. Recensământ 2021 — B
  3. ANI declarații (gov2-ro existing) — C
  4. ANPC sancțiuni WP REST — D
  5. EEA E-PRTR + SEVESO — H, I, Z (combinate)
  6. AFIR + FTS + CORDIS — E, F, G

Săptămâna 2 — Photon optimization + license registries

  1. Photon address-bias optimization (improve housenumber rate)
  2. ANRE energie + ANCOM telecom + ASF + ANRSC scrape — V
  3. Industrial parks MDLPA — J
  4. SITUR turism — T
  5. EUIPO trademark API — X

Săptămâna 3 — investigative joins

  1. AEP donații politice (finantarepartide.ro) — P
  2. EBRD/EIB/IFC project lists — W
  3. data.gov.ro proiecte-contractate (fonduri EU) — R
  4. CKAN poller generic — S
  5. ANSVSA food sector — U

Săptămâna 4 — civic + transit overlay

  1. Code4Romania romanian-elections-data ingest — Q
  2. cdep.ro voting (fork cdep-live) — NN
  3. GTFS feeds — HH
  4. UEFISCDI BrainMap+ERRIS — GG
  5. ANI federated crawler MVP (Cluj + 4 București sectoare) — O

Săptămâna 5+ — long tail

  • ANRE renewable producers
  • ANP penitenciare
  • CIMEC muzee
  • portal.just.ro instanțe + ECRIS
  • HCL POC (Cluj + 4 sectoare București)
  • CNCD/ASF/ANSPDCP sanctions

Structură DB nouă (propusă)

Adoptăm convention: nou schema per categorie majoră, table per source.

firms.*           — DEJA: entities, financials, financials_ong, financials_banks,
                            reprezentanti_if, sucursale_ue, postal_codes
seap.*            — DEJA: announcements + 9 MVs
external.*        — NOU: tabele per dataset CKAN (fonduri EU, AFIR, etc.)
ani.*             — NOU: declaratii_avere, declaratii_interese, oficiali
political.*       — NOU: donatii, partide, candidati, alegeri
sanctions.*       — NOU: anpc, cncd, asf, anspdcp, consiliul_concurentei
licenses.*        — NOU: anre, ancom, ansvsa, anrsc, anmdmr, etc. (per regulator)
research.*        — NOU: cordis, uefiscdi, brainmap, erris, euipo
fonduri.*         — NOU: smis, fts, afir, ebrd, eib, ifc
geo.*             — NOU: osm_*, anp_penitenciare, cimec_muzee, lmi, parcuri_industriale
env.*             — NOU: eprtr, seveso, natura2000, calitateaer
demografic.*      — NOU: tempo_*, recensamant_*
transit.*         — NOU: gtfs_* per oraș

Fiecare tabelă păstrează source + fetched_at + foreign key implicit pe cui (text) sau siruta (text) sau geom (PostGIS) către firms/seap.

Composite "real player" score

După Săptămâna 1+2, putem calcula un scor per firmă:

real_player_score = 
  (anaf_active_vat ? 1 : 0) * 1.0 +
  (financials_filed_recent ? 1 : 0) * 1.5 +
  (seap_contracts_count > 0 ? 1 : 0) * 1.0 +
  (afir_beneficiar ? 1 : 0) * 1.0 +
  (ebrd_eib_ifc_borrower ? 1 : 0) * 2.0 +
  (cordis_participant ? 1 : 0) * 1.5 +
  (euipo_trademark_holder ? 1 : 0) * 0.5 +
  (any_regulator_license ? 1 : 0) * 1.0 +
  (anofm_recent_vacancies ? 1 : 0) * 1.0

Score 0 = paper company / dormant (justified red flag for procurement audit). Score >5 = real economic player.

"Pollue ↔ Public Money" — first killer story

Combo Săptămâna 1:

  1. EEA E-PRTR loaded (~700 RO facilities cu CUI + emisii)
  2. JOIN seap.announcements pe supplier_cui
  3. Output: "Top 50 polluters care au câștigat >X RON contracte publice"
  4. Per facility: link la profil firmă cu emisii + contracte
  5. Mapă cu pin-uri (Photon already done): poluatori scalați după emisii

Deliver-able în 3 zile cu data deja accesibilă.

"Bani și voturi" — second killer story

Combo Săptămâna 1+3:

  1. ANI declarații (oficiali → firme deținute)
  2. AEP donații (donatori → partide)
  3. SEAP contracte (firme → autorități)
  4. Triple JOIN: oficiali ai partidului X care dețin firme care au câștigat contracte de la autorități controlate de partidul X
  5. Per oficial: dashboard cu firmele lor + contracte + donații date

Memorie + automatizare

  • Cron daily: ANAF delta (deja live), CKAN poller (S), ANPC poll (D), AEP poll (P), GTFS-RT (HH)
  • Cron weekly: ONRC bulk (deja live), ANI declarații, license registries, ANSVSA per județ
  • Cron monthly: Recensământ check (deși static), Tempo refresh, EEA mirror

Surse de respect/skip

Nu pierde timp pe:

  • BPI (paywalled)
  • ROLII/REJUST (mort/anonimizat)
  • ONRC UBO (paywalled)
  • ANAF Inactivi/Lista Albă/Datornici (captcha)
  • OSIM patente (DB națională broken)
  • Per-supplier actual payments (ForexeBug nu publică)
  • imobiliare.ro / olx (ToS interzic, GDPR risk)
  • WHOIS bulk RoTLD (GDPR redaction)

Excelent dar deja făcut de alții — fork sau parteneriate:

  • gov2-ro/tempo-ins-dump (INS)
  • gov2-ro/declaratii-integritate (ANI)
  • code4romania/romanian-elections-data (BEC/AEP)
  • code4romania/czl-scrape (legislative)
  • expertforum.ro/banipartide.ro (AEP donații curate)
  • hcl.usr.ro (HCL aggregator — partner)
  • funky.ong/banipublici.ro (budget viz — partner)
  • Tranzy.app (GTFS-RT 5 orașe)

Sursa de adevăr a planului

Acest fișier = STRATEGIC-PLAN.md. Update după fiecare iterație.

PROMPTS.md §0a referențiază acest plan pentru next-session context.

Memory project_firms_registry.md urmează roadmap-ul aici.