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)
This commit is contained in:
Claude VM
2026-05-13 00:10:32 +03:00
commit a6c03a091e
352 changed files with 75295 additions and 0 deletions
+158
View File
@@ -0,0 +1,158 @@
# AAAS — Autoritatea pentru Administrarea Activelor Statului
**Status:** ingest portfolio MVP livrat 2026-05-10. Schema + scraper + cron deployed.
**Sursa:** https://www.aaas.gov.ro/ (HTML scraping; nicio sursă Excel / JSON / API publică).
## Context AAAS
AAAS administrează cota reziduală a statului în firme privatizate plus
recuperează creanțe post-privatizare. A taga o firmă cu **"statul deține
acțiuni"** / **"datorează bani statului"** / **"obligație investițională
post-privatizare"** este un semnal **rar și puternic** la nivel național
— ~500-1000 CUI-uri totale.
Conform comunicatelor instituției: ~400 firme active monitorizate,
~2.000 contracte post-priv, ~550 în insolvență, ~11.5 mld RON datorii
de recuperat. **Doar 12 firme (active_holding) sunt publicate online
structurat astăzi**; restul rămâne în PDF-uri istorice / portal cu login.
## Sursele identificate
| URL | Conținut | Stare astăzi | Acțiune |
|-----|----------|--------------|---------|
| `/despre-aaas/.../1-9-3-companii-sub-autoritatea-aaas/` | 12 firme active_holding cu subpagină proprie | **STRUCTURAT** — CUI / J / adresă / participație % | **Ingerat** |
| `/4-oferta-a-a-a-s/4-2-vanzari-actiuni/` | Oferte vânzare acțiuni | "SECȚIUNE ÎN CONSTRUCȚIE" — doar EXPO PARC SRL Iași teaser PDF | Probă logată; recheck cron |
| `/4-oferta-a-a-a-s/4-3-valorificare-creante/` | Lista creanțe de vândut | "SECȚIUNE ÎN CONSTRUCȚIE" | Probă logată; recheck cron |
| `gwp.aaas.gov.ro/Directia-creante` | Portal servicii electronice | Login required, nu există API public anonim | Defer (ar necesita cont AAAS) |
| `aaas.gov.ro/upload_files/.../ANEXA%20LA%20ORDINUL%20278_18.02.2005_en.pdf` | ~800 firme × 41 județe (snapshot 2005) | PDF-only, istoric — referință | Defer (PDF parser pe sesiune ulterioară) |
| `aaas.gov.ro/upload/FNI_Judet_*.pdf` | Despăgubiri FNI persoane fizice | PDF-only, **persoane fizice (CNP)** — nu CUI | Out of scope pentru aaas.firme |
## Schema livrată — `services/seap-scraper/sql/032_aaas.sql`
```
aaas.firme -- PK = cui; one row per AAAS-monitored CUI
-- aaas_status ∈ {active_holding, post_priv_debt, insolventa,
-- recuperare, vanzare_actiuni, vanzare_creante}
-- state_share_pct, debt_to_state_lei, raw jsonb
aaas.scrape_log -- per-run audit trail (mirror anre.scrape_log)
aaas.mv_per_cui -- materialized rollup pentru join uniform
-- REFRESH MATERIALIZED VIEW CONCURRENTLY aaas.mv_per_cui
```
## Scraper — `services/seap-scraper/src/scrape-aaas.ts`
- Walk index `1-9-3-companii-sub-autoritatea-aaas/` → extrage 12 anchors `1-9-3-*/`.
- Pentru fiecare subpagină: `htmlToText` + ancorează pe `CUI: NNN / Jxx`,
apoi extrage Adresa / Telefon / Site / Email / Participație AAAS.
- Tratează caz curat de double-render al titlului ("BLUE AIR TEHNIC SA BLUE
AIR TEHNIC S.A." → "BLUE AIR TEHNIC S.A.").
- UPSERT pe `cui`, `aaas_status='active_holding'`, `cui_match_method='aaas_published'`
(CUI-ul vine direct de la AAAS, deci scor 1.000).
- Probează și paginile `vanzari_actiuni` / `vanzari_creante` — astăzi loghează
`section_under_construction`. Re-rularea le va detecta când AAAS publică conținut.
- Refresh MV + raport match rate la final.
## Cron wrapper — `services/seap-scraper/cron/scrape-aaas.sh`
Mirror `scrape-anre.sh`: Infisical Machine Identity → env-file → `docker run --env-file`.
Idempotent (UPSERT). Recomandare cadența: **săptămânal** (sursa nu se schimbă des).
```
sudo /opt/vreaudigital/services/seap-scraper/cron/scrape-aaas.sh
sudo LIMIT=3 .../scrape-aaas.sh # smoke test
```
## Rezultate ingest (2026-05-10)
```
12 subpages found 11 inserted 1 skipped (CRIZANTEMA COM — pagină goală încă)
match_cui_pct: 100.0% (11/11 față de firms.entities)
breakdown: active_holding = 11
```
| CUI | Nume AAAS | Participație | Match firms.entities |
|---|---|---|---|
| 16695222 | RADIOACTIV MINERAL MAGURELE S.A. | 100.000% | RADIOACTIV MINERAL MAGURELE SA |
| 31029694 | ACTIVE CONEXE | 100.000% | ACTIVE CONEXE S.A. |
| 11369861 | ARCADIA 2000 | 100.000% | ARCADIA 2000 SA |
| 42790517 | BLUE AIR TEHNIC S.A. | 100.000% | BLUE AIR TECHNIC S.R.L. |
| 8359779 | SOCIETATEA DE STRATEGIE PENTRU PIATA DE GROS | 100.000% | SOCIETATEA DE STRATEGIE PENTRU PIATA DE GROS SRL |
| 1960487 | TRIMEC | 98.500% | TRIMEC SA |
| 7638244 | AGROMEC ICLOD | 92.800% | AGROMEC ICLOD SA |
| 360557 | EUROTEST S.A. | 70.000% | EUROTEST SA |
| 1973568 | RECONS | 66.000% | RECONS SA |
| 1074251 | AGROMEC MOLDOVA NOUA | 58.600% | AGROMEC MOLDOVA NOUA SA |
| 1384767 | COMALEX | 53.600% | COMALEX SA |
## Cross-source value — recipe SQL drafted
### Recipe 1: "Firme AAAS-monitorizate care câștigă contracte SEAP"
Companii în portofoliul activ AAAS care câștigă mai multe contracte de stat
— state-owned firms taking state procurement money.
```sql
SELECT
a.cui,
a.name AS firma_aaas,
a.state_share_pct,
COUNT(ann.notice_id_internal) AS nr_contracte_seap,
SUM(ann.awarded_value) AS total_castigat_lei,
array_agg(DISTINCT ann.authority_name) FILTER (WHERE ann.authority_name IS NOT NULL)
AS autoritati_contractante
FROM aaas.firme a
LEFT JOIN seap.announcements ann ON ann.supplier_cui = a.cui
GROUP BY a.cui, a.name, a.state_share_pct
ORDER BY total_castigat_lei DESC NULLS LAST;
```
**Smoke test (azi):** RADIOACTIV MINERAL MAGURELE (100% AAAS) are 5 contracte
SEAP, top 279.700 RON de la **Compania Națională a Uraniului S.A.** (firmă
de stat) — circuit complet stat→stat documentat.
### Recipe 2: "Firme AAAS-monitorizate care figurează la ANAF datornici"
Firme cu acționariat de stat care își datorează propriile taxe statului.
```sql
SELECT a.cui, a.name, a.state_share_pct, d.suma_totala
FROM aaas.firme a
JOIN anaf.datornici d USING (cui)
ORDER BY d.suma_totala DESC;
```
### Recipe 3: "Performanța portofoliului rezidual de stat"
Cum performează firmele în care statul mai are acțiuni — utilizat pentru
KPI / red-flag pe profil.
```sql
SELECT a.cui, a.name, a.state_share_pct,
f.cifra_afaceri, f.profit_brut, f.an
FROM aaas.firme a
LEFT JOIN firms.financials f USING (cui)
WHERE f.an = (SELECT MAX(an) FROM firms.financials WHERE cui = a.cui)
ORDER BY f.cifra_afaceri DESC NULLS LAST;
```
## Next steps (sesiuni viitoare)
1. **PDF parser pentru ORDIN 278/2005** (~800 firme × 41 județe, snapshot 2005)
— ar putea da ~500-700 CUI-uri istorice tagate ca `aaas_legacy_portfolio`.
Format: PDF tabular, OCR nu e necesar (text extractabil cu `pdftotext`).
2. **Recheck cron** pentru `4-2-vanzari-actiuni` / `4-3-valorificare-creante`
— când AAAS publică conținut, scraperul deja loghează stare. Adaugă parser
când stare ≠ `section_under_construction`.
3. **Insolvențe AAAS** — căutare în arhiva BPI (Buletinul Procedurilor de
Insolvență) după CUI-urile din `aaas.firme` ar produce automat tag-uri
`insolventa` pentru cele ~550 raportate de AAAS.
4. **Recipe în `lib/recipes.ts`** — adaugă "Firme aflate sub autoritatea AAAS"
ca secțiune dedicată (3 recipes: portofoliu, contracte, datorii).
5. **Profile badge**`firms.entities.cui``aaas.firme.cui` ⇒ afișează
chip "Stat deține X% (AAAS)" pe profilul firmei.
## Notițe operaționale
- Sursa AAAS este **fragilă** (WordPress + Brizy editor, pagini cu boilerplate
"dummy text" în loc de date reale, secțiuni "în construcție" persistente).
Parserul este intentat conservativ — anchor strict pe `CUI: NNN / Jxx`.
- Nu există rate limiting agresiv; 350ms între cereri e conservator.
- Volumul total e mic (12 pagini) — runtime 6-7 secunde end-to-end.
- **Replicabilitate 5/5**: doar AAAS publică această taxonomie. Rar și valoros.