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

448 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.