Files
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

7.7 KiB
Raw Permalink Blame History

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.

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.

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.

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 badgefirms.entities.cuiaaas.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.