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)
14 KiB
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ă:
- ANI declarații avere/interese × SEAP — "ce oficial deține firme care au câștigat contracte?" — federated PDF crawl per instituție
- AEP donații politice × SEAP — "ai donat partidului X, ai luat contractul Y" — XLS per partid prin finantarepartide.ro
- ANPC sancțiuni consumatori × SEAP — "furnizor amendat care vinde la stat" — WP REST API verified working
- 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.csvcu 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
- INS Tempo dump (gov2-ro/tempo-ins-dump) — A
- Recensământ 2021 — B
- ANI declarații (gov2-ro existing) — C
- ANPC sancțiuni WP REST — D
- EEA E-PRTR + SEVESO — H, I, Z (combinate)
- AFIR + FTS + CORDIS — E, F, G
Săptămâna 2 — Photon optimization + license registries
- Photon address-bias optimization (improve housenumber rate)
- ANRE energie + ANCOM telecom + ASF + ANRSC scrape — V
- Industrial parks MDLPA — J
- SITUR turism — T
- EUIPO trademark API — X
Săptămâna 3 — investigative joins
- AEP donații politice (finantarepartide.ro) — P
- EBRD/EIB/IFC project lists — W
- data.gov.ro proiecte-contractate (fonduri EU) — R
- CKAN poller generic — S
- ANSVSA food sector — U
Săptămâna 4 — civic + transit overlay
- Code4Romania romanian-elections-data ingest — Q
- cdep.ro voting (fork cdep-live) — NN
- GTFS feeds — HH
- UEFISCDI BrainMap+ERRIS — GG
- 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:
- EEA E-PRTR loaded (~700 RO facilities cu CUI + emisii)
- JOIN seap.announcements pe supplier_cui
- Output: "Top 50 polluters care au câștigat >X RON contracte publice"
- Per facility: link la profil firmă cu emisii + contracte
- 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:
- ANI declarații (oficiali → firme deținute)
- AEP donații (donatori → partide)
- SEAP contracte (firme → autorități)
- Triple JOIN: oficiali ai partidului X care dețin firme care au câștigat contracte de la autorități controlate de partidul X
- 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.