# Research roadmap — surse publice de date pentru firms registry

Sintetizat 2026-05-08 din 4 research agents paraleli. Pentru context complet
vezi PROMPTS.md §0a.

Stare de bază:
- 3.97M firme ONRC, 3.86M financials WEB_UU 2020-2024, 3.21M ANAF v9 enriched,
  2.8M lat/lng (postal+UAT centroid). Cron live pentru ANAF daily + ONRC weekly.

## A. GIS — pin precision de la centroide la housenumber

### A1. Photon 0.5.0 JAR nativ (DONE 2026-05-08)
- Install: `cron/install-photon.sh` (apt openjdk-21-jre-headless + 38MB JAR)
- Run: `cron/vreaudigital-photon.service` (systemd, -Xmx8G, port 2322)
- Format extract: ES (Elasticsearch 5.6.16) — Photon 0.6+ folosește OS și e
  incompatibil. 0.5.0 e ultima versiune ES.
- Throughput verificat: ~50-100 req/s (CONCURRENCY=20 în geocode-photon.ts)
- Rezultat estimat: 35-50% din firme prin housenumber match (limitat de
  acoperirea OSM RO addr:* tags ~1M obiecte vs 3M+ housenumber-ed firme)

### A2. osm2pgsql RO în PostGIS (TODO, 1h setup)
```bash
sudo apt install osm2pgsql
curl -fL -o /tmp/ro.osm.pbf https://download.geofabrik.de/europe/romania-latest.osm.pbf
osm2pgsql -d architools_db --schema=osm --slim --drop --cache 4000 \
  --number-processes 8 --hstore /tmp/ro.osm.pbf
# disk: ~8-12GB, 15-30 min import
```
SQL pattern: JOIN firms cu osm.planet_osm_point WHERE addr:housenumber match,
fuzzy similarity pe addr:street. Bonus: reusable pentru POI display, validare UAT.

### A3. Bucharest Infocod refinement (TODO, 1 zi)
- data.gov.ro "Infocod Sept 2016 cu SIRUTA" — postal codes 010xxx-067xxx, ~9000 codes
- Refinează ~250K firme București de la postal-area centroid (~500m) la
  street-cluster (~50-150m)

### A4. ANAF v9 backfill pentru cele 1.17M unpinned firms (TODO)
- Lansa enrich-anaf cu filtru `WHERE adr_cod_postal IS NULL OR siruta IS NULL`
- Multe firme vor primi cod_postal de la ANAF, declanșând geocoding postal

## B. Date financiare — categorii lipsă peste WEB_UU

### B1. 13 categorii non-WEB_UU pe data.gov.ro (TODO, 1-2 zile)
Toate la slug `situatii_financiare_<YEAR>` (sau `situatii_financiare2023` pentru 2023):
- web_bl_bs_sl_an<YEAR>.txt (~9MB) — bilanț scurt/lichidare. **Alliance Healthcare e aici.**
- web_ong_an<YEAR>.txt (~8MB) — asociații/fundații
- web_instit_de_credit_an<YEAR>.txt — bănci (~30 records, IFRS schema)
- web_ifn<YEAR>.txt — instituții financiare nebancare
- web_ip_ieme<YEAR>.txt — instituții de plată
- webasig<YEAR>.txt — asigurători
- webbrok<YEAR>.txt — brokeri asigurări
- web_sif<YEAR>.txt — fonduri de investiții
- web_pensii<YEAR>.txt — fonduri de pensii
- web_vs_<YEAR>.txt — S.S.I.F.
- web_vm_an<YEAR>.txt — valori mobiliare
- web_ir_an<YEAR>.txt — instituții religioase
- web_fond_garantare<YEAR>.txt — fonduri garantare

Total ~17MB/an extra. CSV sidecar = column spec per categorie. Reuse importer
existent, parametrizare schema per file.

### B2. Backfill 2015-2019 (TODO, one-shot)
Slug `situatii_financiare_2021` e megadump cu toți anii 2012-2021. Adaugă 5 ani
istorice pentru trend charts.

### B3. ANAF Bilanț webservice (TODO, on-demand)
- Endpoint: `https://webservicesp.anaf.ro/bilant?an=<YYYY>&cui=<CUI>`
- Returnează JSON per-CUI bilanț (verified: BCR 2023, OMV Petrom 2023)
- Coverage: 2015-2023 only (2024+2014 = empty `i:[]`)
- Use: cache-miss fallback când userul deschide profil firmă fără financials

### B4. Watch slug `situatii_financiare_2025` (TODO, daily check)
Așteptăm publicare ~iunie 2026 (pattern istoric: an+1 mai-iunie).

## C. ONRC + ANAF datasets neimportate

### C1. 3 ONRC CSVs lipsă (TODO, ~1h)
Same dataset firme-DD-MM-YYYY:
- `OD_REPREZENTANTI_LEGALI.CSV` — DEJA importat (rep_legali JSONB)
- `OD_REPREZENTANTI_IF.CSV` — întreprinderi familiale (small)
- `OD_SUCURSALE_ALTE_STATE_MEMBRE.CSV` — sucursale UE (very small ~19KB)

### C2. ANAF Inactivi (TODO)
- URL: `https://www.anaf.ro/inactivi/rezultatInactivi.jsp` (HTML scrape) sau
  serviciu web async
- Diferit de `is_active_anaf` din v9 (acela = activ fiscal; inactivi = declarat
  oficial inactiv conform art. 92 CPF, blocheaza deductibilitate TVA)
- Adaugă coloană `anaf_inactiv_oficial`

### C3. ANAF Lista Albă (TODO)
- URL: `https://www.anaf.ro/restante/listaalba.xhtml` (XHTML scrape)
- Boolean `lista_alba_anaf` — fără obligații restante
- Util ca "scor încredere" la public

### C4. ANAF Datornici (TODO, FOARTE VALOROS)
- URL: `https://www.anaf.ro/restante/` (publicat trimestrial din 2026)
- Sume datorate per CUI. Semnal financiar real, lucrabil în recipe-uri:
  "firme datoare la stat care au câștigat contracte recente"

### C5. ONRC Puncte de Lucru (NO BULK — defer)
- Confirmat: nu există export bulk. Doar lookup web per CUI.
- Opțiuni: scrape controlled 1 req/s (3.97M / an), sau cerere oficială
  Lege 544/2001 către ONRC pentru bulk (proiect civic poate fi accepted)
- Defer until justified

## D. License/regulator registries (TODO, 3-5 zile pentru mai multe)

Per categorie: PDF/web tabel, scraping necesar. Total ~50K firme cu flag-uri
suplimentare per regulator:

| Regulator | URL | Format | Volum aprox |
|-----------|-----|--------|-------------|
| ANRE (energie) | portal.anre.ro/PublicLists/LicenteAutorizatii (TLS expirat, --insecure) | tabel paginat | mii licențe |
| ANCOM (telecom) | ancom.ro/furnizori-comunicatii-electronice_133 | web list paginat | ~3000 |
| ASF (asigurări/finanțe) | asfromania.ro/ro/c/54/registrul-entitatilor-din-piata-asigurarilor | Excel/PDF | mii |
| ANRSC (utilități publice) | anrsc.ro evidenta-licente PDF lunar | PDF parsabil | sute |
| ANMDMR (medicamente) | portal.anm.ro | tabele paginate | mii |
| ASPAAS (auditori) | aspaas.gov.ro + cafr.ro PDF | PDF | mii |
| CECCAR (contabili) | ceccar.ro/?page_id=97 | PDF anual | mii |
| ANEVAR (evaluatori) | anevar.ro/cautare + PDF lunar per categorie | PDF | corporativi cu CUI |
| OAR (arhitecți) | oar.archi + Monitor Oficial PI | PDF anual | toți cu CUI |

## E. Procurement-adjacent

### E1. data.gov.ro proiecte-contractate (fonduri EU) (TODO, 1 zi)
- URL: `https://data.gov.ro/dataset/proiecte-contractate` (XLSX bulk, OGL-ROU-1.0)
- Coverage: POIM, POC, POAT, POCU, POR, POCA, POAD 2018-2024
- Beneficiari + suma per proiect, link la firms.entities prin CUI
- Recipe nouă: "firme cu fonduri EU mari" + dependență per program

### E2. Consiliul Concurenței blacklist trucări (TODO, 2 zile)
- ~100 decizii cartel/bid-rigging, ~35 firme distincte
- URL: `consiliulconcurentei.ro/documente-oficiale/concurenta/decizii/serviciul-carteluri/`
- PDF crawl + extracție nume firmă + sumă + decizie
- IMPACT REPUTATIONAL ENORM pe profile firmă: "Acest furnizor a fost amendat
  pentru cartel" + link la PDF

### E3. ANAF datorii bugetul de stat (TODO, conditional)
- Verifică dacă anaf.ro/restante are downloadable files (sau doar XHTML scrape)
- Snapshot 1× / lună
- Recipe: "datornici care câștigă contracte"

### E4. Curtea de Conturi audit reports (TODO, 3-5 zile)
- URL: `curteadeconturi.ro/rapoarte-audit/downloads/<NNN>` (sequential IDs ~14000)
- Numai PDFs, fără API. Crawl + OCR/text extraction necesar
- Începe cu rapoartele anuale publice (10 PDFs 2014-2024) pentru search full-text
- Per-instituție audit: defer la v2

### E5. PNRR ORDS dashboard (TODO, 1-day spike)
- `pnrr.fonduri-ue.ro/ords/pnrr/r/dashboard-status-pnrr/`
- Reverse-engineer Oracle ORDS endpoints din JS
- Dacă accesibile bulk → INGEST IMEDIAT (highest-stakes spend RO acum)

### E6. CNSC contestații (TODO, 1 săptămână)
- `portal.cnsc.ro/decizii.html`, ~16,000+ decizii PDF
- Heavy parsing, but: "care autorități pierd contestații cel mai mult" e o
  întrebare jurnalistică deep-value
- Park la Q3

## F. NU SE POATE — gap-uri publice

### F1. Per-supplier actual payments
Nu există. ForexeBug are date intern dar nu publică per-supplier. **Gap-ul cel
mai mare** pentru "follow the money".

### F2. Per-CUI court decisions
- ROLII e mort din martie 2022 (anonimizare GDPR + dizolvare fundație)
- REJUST e replacement dar ANONIMIZAT (nu poți face per-firmă lookup)
- portal.just.ro web service — limitat la 1000 results/query, nu CUI parameter
- Per-CUI civil action history NU EXISTĂ ca open data RO

### F3. BPI insolvency procedural acts
- ONRC charges subscription (~paywall)
- Toate API/wrapper-uri terțe (DateBPI, termene.ro, Coface) sunt paid
- Defer fără deal comercial

### F4. OSIM patente/mărci
- DB națională OSIM e broken oficial
- Espacenet (EPO) + EUIPO eSearch nu au per-CUI bulk dump

### F5. Email-uri firme
- Niciun registru public obligatoriu
- Pragmatic: derive `info@<domain>` din coloana `web` (acoperire ~20-30%) sau
  scrape websiteul firmei (regex email pe homepage + /contact). Legal-OK doar
  pentru emailuri generice (info@/contact@/office@), respectând robots.txt

## Ranking implementare next sprint

1. **Now (running)**: Photon geocoding pe 1.17M firme fără pin (49 min ETA)
2. **Săptămâna asta** (~2 zile):
   - 13 categorii MFP non-WEB_UU (1-2 zile)
   - 3 ONRC CSVs lipsă (1h)
   - data.gov.ro proiecte-contractate fonduri EU (1 zi)
   - ANAF Inactivi + Lista Albă + Datornici scrape (1 zi)
3. **Sprint următor** (~1 săptămână):
   - osm2pgsql RO PostGIS load
   - License registries (ANRE, ANCOM, ASF, ANRSC, ANMDMR, ASPAAS, ANEVAR, OAR)
   - Consiliul Concurenței blacklist (2 zile)
   - PNRR ORDS spike (1 zi) → ingest dacă accesibil
4. **Q3-Q4**:
   - Curtea de Conturi audit PDF crawl
   - CNSC contestații PDF scrape
   - ANAF Bilanț webservice cache-miss fallback
