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
@@ -0,0 +1,103 @@
#!/usr/bin/env python3
"""
AFIR FEGA CSV importer — produces pipe-TSV ingestible by the same SQL
loader as the FEADR XLSX path. Schema is identical to FEADR (15 columns):
beneficiar, last_name, mama_cui, localitate, cod_masura, obiectiv,
data_start, data_end, fega_op, fega_total, feadr_op, feadr_total,
op_amount, cofinantare, ue_total.
FEGA CSV from AFIR portal uses:
- comma-separated columns (English decimal, e.g. "4802.43")
- CSV header row: DenumireBeneficiar,NumeFamilie,Cui,Localicate,Masura,
ObiectivSpecific,DataIncepere,DataSfarsit,CuantumOperationeFEGA,
CuantumTotalFega,CuantumOperatiuneFEADR,CuantumtotalFEADR,
CuantumAferentOperatiune,CuantumTotalCofinantareBeneficiar,
CuantumtotalUEBenefeciar
"""
from __future__ import annotations
import csv
import re
import sys
def norm_num(v):
if v is None:
return ""
s = str(v).strip()
if not s:
return ""
# FEGA uses English format already ("4802.43") — comma swap unnecessary
# but tolerate Romanian-style as defensive measure.
if "," in s and "." not in s:
s = s.replace(",", ".")
elif "," in s and "." in s:
s = s.replace(".", "").replace(",", ".")
return s.replace("|", "/")
def norm_text(v):
if v is None:
return ""
s = str(v).strip()
if not s:
return ""
s = s.replace("|", "/").replace("\t", " ").replace("\r", " ").replace("\n", " ")
s = re.sub(r"\s+", " ", s)
s = s.replace("\\", "\\\\")
return s
def main():
if len(sys.argv) != 3:
print("usage: import-afir-fega-csv.py INPUT.csv OUTPUT.tsv", file=sys.stderr)
sys.exit(2)
in_path, out_path = sys.argv[1], sys.argv[2]
n_data = 0
n_skipped = 0
# FEGA CSV files include 1+ header rows. Auto-skip until we see a
# row that doesn't start with "DenumireBeneficiar".
with open(in_path, "r", encoding="utf-8-sig", errors="replace", newline="") as fin, \
open(out_path, "w", encoding="utf-8") as fout:
reader = csv.reader(fin)
for r in reader:
if not r:
continue
# Skip header row(s)
if r[0].strip().lower().startswith("denumirebeneficiar"):
continue
# Pad to 15 columns
cells = r + [""] * (15 - len(r))
beneficiar = norm_text(cells[0])
if not beneficiar:
n_skipped += 1
continue
out = [
beneficiar,
norm_text(cells[1]), # last_name
norm_text(cells[2]), # mama_cui (FEGA Cui)
norm_text(cells[3]), # localitate (Localicate typo in source)
norm_text(cells[4]), # cod_masura (Masura)
norm_text(cells[5]), # obiectiv (ObiectivSpecific)
norm_text(cells[6]), # data_start (DataIncepere)
norm_text(cells[7]), # data_end (DataSfarsit)
norm_num(cells[8]), # fega_op
norm_num(cells[9]), # fega_total
norm_num(cells[10]), # feadr_op
norm_num(cells[11]), # feadr_total
norm_num(cells[12]), # op_amount (CuantumAferentOperatiune)
norm_num(cells[13]), # cofinantare (CuantumTotalCofinantareBeneficiar)
norm_num(cells[14]), # ue_total (CuantumtotalUEBenefeciar)
]
fout.write("|".join(out) + "\n")
n_data += 1
if n_data % 100000 == 0:
print(f"[afir-fega-import] wrote {n_data} rows", file=sys.stderr)
print(f"[afir-fega-import] done: {n_data} rows · {n_skipped} skipped", file=sys.stderr)
if __name__ == "__main__":
main()