Arhiva clasei RarAutoPass (VFP) care declara prestatiile la RAR AUTOPASS, ca baza pentru rescrierea ca gateway central Python/FastAPI. Include: - sursa VFP (.prg) + datele necesare migrarii (mapare_prestatii, prestatii_rar) - spec-ul oficial RAR (txt) - docs/plans/: plan-design-review + plan-eng-review - docs/CONTEXT.md: handoff pentru continuarea in alta sesiune - .gitignore specific Visual FoxPro (ignora artefacte compilate + credentiale) settings.xml (cu parola de test in clar) EXCLUS; vezi settings.xml.example. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5.9 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.
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.