6.4 KiB
Context proiect — Gateway RAR AutoPass (migrare ROAAUTO din VFP în Web API)
Fișier de continuitate între sesiuni. Citește-l înainte de a relua lucrul. Ultima actualizare: 2026-06-14.
Reluare pe alt calculator (portabil)
Tot ce ai nevoie pentru a continua e în acest repo (acest fișier + docs/plans/).
git clone git@gitea.romfast.ro:romfast/rar-autopass.git
Remote-ul Gitea (org romfast) merge prin SSH: git@gitea.romfast.ro:romfast/<repo>.git.
Push-to-create e activ (un git push -u origin main creează repo-ul automat).
După clonare: copiază settings.xml.example → settings.xml și completează credențialele
(NU se comite). Apoi citește mai jos.
Ce este acest repo
Arhiva bazei Visual FoxPro existente (clasa RarAutoPass, ROAAUTO) care declară
prestațiile de service la RAR AUTOPASS (Legea 142/2023, OM 210/2024), plus
planurile pentru rescrierea ca Web API central (Python / FastAPI).
Codul VFP de aici este punctul de plecare / sursa de adevăr de contract pentru versiunea web. Nu se mai dezvoltă; se portează.
Stare actuală (iunie 2026)
- Integrarea VFP funcționează și e testată pe endpoint-ul de test RAR, dar nu e pusă la clienți încă.
- Comunică direct cu RAR prin
MSXML2.ServerXMLHTTPdinrar_autopass.prg/rar-forms.prg. - Maparea operație→
codPrestatieînmapare_prestatii.DBF; nomenclator înprestatii_rar.DBF; jurnal înrar_log.DBF; credențiale (în clar) însettings.xml. - ⚠️
settings.xmlconținea o parolă de test reală (marius.mutu@romfast.ro). E exclus din git (.gitignore) și înlocuit cusettings.xml.example. De rotit parola — a fost expusă în istoricul SVN vechi.
Fișiere-cheie (VFP) și ce reutilizăm
| Fișier | Rol | Se portează în |
|---|---|---|
rar_autopass.prg |
clasa RarAutoPass: login+JWT, nomenclator, postPrezentare, cancel |
app/rar_client.py |
rar-forms.prg |
UI + timer auto-process (OnAutoProcessTimer) |
logica → worker; timer → re-push ROAAUTO |
export_comenzi.prg |
citește comenzi/operații, construiește payload | client subțire: POST /v1/prezentari |
rar_advanced.prg |
export Excel (oglindă pentru treapta 2) | referință import xlsx/csv |
mapare_prestatii.DBF |
cod_op_service → codPrestatie | operations_mapping (via tools/import_dbf.py) |
prestatii_rar.DBF |
nomenclator {codPrestatie, numePrestatie} | nomenclator_rar (via tools/import_dbf.py) |
Documentatie Serviciu AutoPass_Final.txt, Document informativ RAR- Autopass.txt |
spec oficial RAR | contract API |
Planurile (în docs/plans/)
plan-design-review.md— designul produsului/arhitecturii (output/office-hours). Problemă ISV, topologie gateway central pass-through credențiale, zero stocare parole, privacy-first, teză SaaS pe trepte.plan-eng-review.md— planul de implementare (review CEO, SELECTIVE EXPANSION peste design). Decizii blocate, constatări din spec, mașina de stări submission, securitate, verificare E2E.
Continuă cu plan-eng-review și plan-design-review — acestea sunt cele două documente de reluat în următoarea sesiune.
Arhitectura țintă (rezumat)
ROAAUTO (VFP, client subțire) ──HTTPS──▶ Gateway FastAPI (central, 1 container)
trimite comanda + creds RAR API: validare → mapare op→cod → enqueue (PII criptat)
◀── {submissionId, status} ─────────────┘
WORKER (proces separat): claim atomic → login RAR → postPrezentare → retry
Dashboard (Jinja2+HTMX): monitorizare live din RAR + stare coadă + editor mapări
ROAAUTO (timer) ──▶ GET /v1/prezentari?status=error → re-push (durabilitate pene lungi)
Stack: Python/FastAPI + SQLite (WAL) + httpx. Deploy: LXC Proxmox + Cloudflare Tunnel (start) → VPS (~5€/lună). Open-source pe github.com/romfast, AGPL-3.0 (⚠️ decide CLA din ziua 1 dacă vrei dual-license).
⚠️ Următorul pas BLOCANT — „The Assignment" (spike, ~1h, ÎNAINTE de cod)
Pe endpoint-ul de test RAR, măsoară:
- Durata de viață a JWT-ului (
/public/login→postPrezentarela intervale crescătoare până la 401) → dimensionează fereastra de retry autonom din worker. - Dacă
postPrezentaretrece fărăb64Image(poză odometru) și fărăodometruInitial→ decide dacă poza e obligatorie în prod și dacă ROAAUTO trebuie s-o atașeze. - Valorile acceptate pentru
tipPrestatie/sistemReparat(enum nedocumentat).
Rezultatul decide robustețea cozii și scopul real al ROAAUTO. Nu porni worker-ul înainte.
De făcut după spike (din plan-eng-review, secțiunea Verificare)
tools/import_dbf.py --dry-runpemapare_prestatii.DBF+prestatii_rar.DBF(raport întâi, apoi import).- Schelet repo:
app/api/v1,app/rar_client.py,app/worker,app/web, SQLite (WAL),docker compose up,/healthzverde. POST /v1/prezentaricu o comandă reală (test) → worker trimite →FINALIZATAla RAR + în dashboard.- Test idempotency (re-trimitere identică → același
submissionId, fără dublu la RAR). needs_mapping/needs_data(nu se trimite incomplet);error+ re-push.- Verifică: SQLite fără câmp parolă; după
sentPII criptat +purge_after; loguri fără parole. - Teste: unit (mapare, hash idempotency, validare odometru), integration (claim atomic, retry), E2E test RAR.
Decizii deja blocate (nu le re-deschide fără motiv)
- Idempotency = hash de conținut pe server, UNIQUE (RAR n-are câmp nr. comandă, acceptă duplicate).
- Reținere temporară 90 zile a payload-ului criptat, apoi purjare (defensibilitate vs privacy).
- Odometru repair: strict + stare
needs_data(nu trimite incomplet). - Cherry-picks în v1: alertă submission-uri blocate,
/healthz+/metrics, sugestie fuzzy mapare, export audit CSV. - URL-urile RAR: sursa de adevăr = VFP testat, NU spec-ul (are typo-uri de copy/paste).
Open questions rămase
- Sursa pozei odometrului în fluxul ROAAUTO (dacă spike confirmă
b64Imageobligatoriu). tipPrestatie— valori acceptate (de probat la spike).- Un singur user RAR per agent economic sau mai mulți (afectează
idUser/ filtrare monitorizare). - Monetizare/direcție SaaS — de reluat după ce prima prezentare reală merge la primul client.