42 KiB
PRD ROAAUTO-1.0 — Transmitere operatii service la RAR AUTOPASS
Stare: aprobat (review /autoplan complet, 2026-07-09); revizuit 2026-07-09 —
eliminat orice tabel nou Oracle (decizia lui Marius): configurarea sta in tabelul standard
optiuni, iar situatia transmiterilor se citeste din gateway intr-un cursor temporar
(gateway-ul e singura sursa de adevar; ROAAUTO nu persista nimic local).
Feature ROAAUTO (VFP9/Oracle): buton/fereastra pentru transmiterea operatiilor de service din comenzile inchise (validate) si facturate intr-o perioada catre gateway-ul autopass.romfast.ro (
POST /v1/prezentari, authX-API-Key). Contract API (sursa de adevar): reporar-autopass—app/models.py(PrezentareIn),app/api/v1/router.py,docs/api-rar-contract.md. Maparea cod operatie ROAAUTO → cod prestatie RAR se face server-side in gateway (operations_mapping), NU in ROAAUTO.
1. Obiectiv
Legea 142/2023 + OM 210/2024 obliga service-urile sa declare la RAR, la finalul fiecarei lucrari, datele obligatorii (VIN, nr. inmatriculare, kilometraj, prestatii). ROAAUTO detine deja toate datele; livrabila adauga o fereastra cu filtru pe perioada (data facturii) care listeaza comenzile inchise+facturate si le transmite in lot la gateway-ul AUTOPASS. Gateway-ul preia validarea de continut, maparea codurilor, coada, retry, declararea efectiva la RAR si evidenta a ce s-a transmis — ROAAUTO ramane un client subtire, fara stocare locala.
Fereastra pe perioada are doua roluri: (a) stingerea backlog-ului — obligatia e activa din 01.12.2024, deci prima utilizare recupereaza lucrarile nedeclarate de la start; si (b) transmiterea periodica curenta, pana cand ROAAUTO-1.1 adauga transmiterea automata la inchiderea comenzii (fereastra ramane atunci UI de review/exceptii).
2. Non-Goals (anti scope-creep)
- NU se creeaza NICIUN tabel/secventa nou(a) in schema Oracle — configurarea sta in
tabelul standard
optiuni(mecanism existent), evidenta transmiterilor sta in gateway si se consulta prin API intr-un cursor temporar. Zero scripturi de instalare. - NU se apeleaza API-ul RAR direct — doar gateway-ul autopass.romfast.ro.
- NU se face maparea cod operatie → cod prestatie RAR in ROAAUTO (exista in gateway; operatiile nemapate se rezolva in dashboard-ul web AUTOPASS, tab Mapari).
- NU se implementeaza management de cont/credentiale RAR in ROAAUTO (se face pe web).
- NU se transmit piese/materiale — doar operatiile de manopera (
DEV_OPER). - NU se construieste transmitere automata pe timer in aceasta livrabila (poate deveni ROAAUTO-1.1 dupa ce fluxul manual e verificat in productie).
- NU se modifica fluxul de inchidere/facturare a comenzilor.
3. Date sursa (ROAAUTO / Oracle)
Filtru: validat = 1 AND facturat = 1 AND id_tip IN (1,2) AND datafact BETWEEN :d1 AND :d2
pe view-ul auto_istoric_comenzi (coloanele complete:
Programe\oproceduri_vizualizare.prg:447). Decis: TOATE comenzile facturate —
POST GARANTIE (ID_TIP=1) si GARANTIE (ID_TIP=2), conform nomenclatorului
DEV_TIP_DEVIZ (Scripturi_instalare\initializari.sql:199-208). REGIE (3),
PREGATIRE (4), REGIE 2 (5), PRODUCTIE si constatarile NU se transmit
(id_tip >= 3 exclus; oricum majoritatea nu au factura → cad la facturat=1).
| Camp payload AUTOPASS | Sursa ROAAUTO | Observatii |
|---|---|---|
vin |
auto_istoric_comenzi.SERIES |
VARCHAR2(17), serie sasiu |
nr_inmatriculare |
auto_istoric_comenzi.NRINMAT |
VARCHAR2(10) |
data_prestatie |
DATAORAVALID (data inchiderii/validarii) |
format YYYY-MM-DD; decis — perioada de filtrare ramane pe DATAFACT |
odometru_final |
DEV_ORDL.KMINT (km la primire, snapshot pe comanda) |
string numeric; decis — singura citire disponibila |
prestatii[] |
DEV_OPER (sters=0) JOIN DEV_NOM_NORME |
per operatie: {cod_op_service: CODOP, denumire: DENOP} |
obs |
NRORD + NRFACT (ex. Comanda 1234 / Factura 5678) |
cheia de corelare comanda ↔ prezentare in gateway (vezi US-005) |
Comenzile fara operatii (doar piese) nu se transmit (gateway respinge PRESTATII_GOALE).
4. Stories atomice
US-001: Configurare conexiune AUTOPASS (tabelul optiuni)
Ca administrator vreau sa configurez URL-ul gateway-ului, cheia API si mediul RAR
(test/prod) pentru ca transmiterea sa functioneze per societate, fara valori hardcodate
si fara tabele noi.
- Depinde de: —
- Fisiere:
Programe\oproceduri_autopass.prg(citire config); NIMIC inScripturi_instalare\ - Mecanism (existent, refolosit): tabelul
optiuni(varname/vartype/varvalue/vardesc/programe)- procedurile din
COMUN\programe\oinit_optiuni.prg:
- la pornirea aplicatiei,
optiuni_firmacreeaza variabilele globale dinoptiuni(CHARACTER → prefixgc, ex.gcAUTOPASS_URL); - la runtime,
citeste_optiune('<VARNAME>')citeste din cursorulcrsOptiuni(incarcat la pornire deactualizeaza_optiuni),scrie_optiune()scrie prinPACK_SESIUNE.SetOptiune(merge: randul se creeaza la prima scriere — deci NU e nevoie de niciun script de seed); - UI de configurare (decis): valorile se editeaza DIRECT din fereastra de
transmitere (US-004) — panou "Configurare" in aceeasi forma, un singur formular,
fara fereastra separata. (Fiind tot tabelul
optiuni, raman vizibile si in fereastra standard Optiuni, dar acela nu e fluxul principal.)
- procedurile din
- Optiuni noi (toate CHARACTER):
varname global continut AUTOPASS_URLgcAUTOPASS_URLURL gateway, implicit https://autopass.romfast.roAUTOPASS_KEYgcAUTOPASS_KEYcheia API ( X-API-Key)AUTOPASS_ENVgcAUTOPASS_ENVtest/prod/ gol = default cont - Acceptance criteria:
autopass_get_config()citeste cele 3 valori princiteste_optiune()(fallback pe variabilele globalegcAUTOPASS_*daca exista); la prima rulare, dacaAUTOPASS_URLlipseste, se scrie valoarea implicita cuscrie_optiune('AUTOPASS_URL', 'https://autopass.romfast.ro', 'URL gateway RAR AUTOPASS').autopass_salveaza_config(tcUrl, tcKey, tcEnv)scrie cele 3 valori prinscrie_optiune()— apelata de panoul Configurare din fereastra (US-004).- Panoul Configurare din fereastra de transmitere: URL gateway, cheie API
(textbox cu
PasswordChar+ buton arata/ascunde), mediu RAR (combo:Testare/Productie/implicit cont), butoanele Test conexiune si Salveaza. Test conexiune apeleazaGET /v1/pingsi afiseazamediu,autentificat_cu_cheie,are_creds_test/prod. AUTOPASS_KEYgoala → fereastra se deschide direct cu panoul Configurare extins + mesaj clar; gridul si Transmite raman dezactivate pana exista cheie salvata.- Dupa Salveaza: config-ul se reciteste, ping-ul se reia automat, badge-ul de mediu si starea butoanelor se actualizeaza fara a inchide fereastra.
- Verificare E2E: completare cheie in panou → Salveaza →
GET /v1/pingintoarceautentificat_cu_cheie: true; valorile apar in tabeluloptiuni.
US-002: Extragere comenzi + operatii pe perioada
Ca utilizator vreau lista comenzilor inchise si facturate in perioada aleasa, cu operatiile lor, pentru ca sa vad exact ce urmeaza sa se transmita.
- Depinde de: —
- Fisiere:
Programe\oproceduri_autopass.prg— proceduri cursor header + detaliu - Acceptance criteria:
- Cursor header din
auto_istoric_comenzi:id_ordl, nrord, dataoravalid, datafact, nrfact, nrinmat, series, kmint, nume, tip_comanda, filtratvalidat=1 AND facturat=1 AND id_tip IN (1,2) AND datafact BETWEEN d1 AND d2(+sters=0unde e cazul). - Cursor detaliu:
SELECT o.id_ordl, n.codop, n.denop FROM dev_oper o JOIN dev_nom_norme n ON o.id_norme=n.id_norme WHERE o.sters=0 AND o.id_ordl IN (…). - Pre-validare locala pe rand (aceleasi reguli ca
app/validation.py): VIN 17 caractere fara O/I/Q, NRINMAT ≤10 alfanumeric,data_prestatie ≥ 2024-12-01si ≤ azi, km numeric — randurile invalide se marcheaza vizual cu motivul si nu se pot bifa. CODOPgol/NULL inDEV_NOM_NORME→ operatia se marcheaza pe rand (motiv "operatie fara cod"); operatiile identice duplicate in aceeasi comanda se deduplica inainte de trimitere.
- Cursor header din
- Verificare E2E: perioada cu comenzi cunoscute → numarul de randuri corespunde cu istoricul comenzilor.
US-003: Client HTTP + serializare JSON (POST /v1/prezentari)
Ca sistem vreau o clasa VFP care construieste JSON-ul si face POST cu X-API-Key
pentru ca transmiterea sa fie robusta si raspunsul parsabil.
- Depinde de: US-001
- Fisiere:
Programe\oproceduri_autopass.prg(clasaAutopassClient); biblioteca JSONnfjsoncreate.prg/nfjsonread.prgdinCOMUN\utile\nfjson\ - Acceptance criteria:
- POST via
winHTTP.winHTTPrequest.5.1(patternD:\ROA\ems_trimite_facturi_spv.prg→SendeFactura), headereContent-Type: application/json+X-API-Key, body UTF-8. - Body:
{"prezentari": [...], "rar_env": <din config, optional>}— prestatii cucod_op_service+denumire(maparea ramane in gateway);raspunsimplicitminim. - Transmitere in loturi de max 50 prezentari per request; corelarea raspunsului
se face pe
indexper lot (index e relativ la cererea curenta, nu global) — clientul tine mapareaindex lot → id_ordlexplicit. - Encoding verificat empiric, nu presupus: intai se testeaza ce emite
nfjsoncreatepentru ă/â/î/ș/ț (escape\uXXXXASCII vs bytes locale). Daca escapeaza in ASCII → NU se aplica STRCONV (l-ar corupe); daca emite bytes cp1250 → conversie UTF-8 (STRCONV(...,9)) SAU Send pe byte-array cucharset=utf-8. Criteriu: round-trip pe mediul test cu diacritice, verificat in dashboard. - Datele Oracle (DATAORAVALID) →
YYYY-MM-DDconstruit explicit (STR(YEAR())+'-'+PADL(MONTH(),2,'0')+'-'+PADL(DAY(),2,'0')), NICIODATA DTOC/DTOS (depind de SET DATE). Valabil si pentru CSV (US-006). - Parametrii de perioada in SQL pass-through ca literali
TO_DATE('YYYY-MM-DD','YYYY-MM-DD')— elimina ambiguitatea DMY/MDY. - Timeout-uri explicite pe WinHTTP — semnatura reala e
SetTimeouts(resolve, connect, send, receive)in ms (ex. 30000 fiecare); FARA retry automat in client — retrimiterea e manuala si sigura (idempotenta server-side). Statusul/eroarea WinHTTP bruta intra in contextul logat (diagnoza proxy-uri client). DOEVENTS+ verificare Renunta/ESC intre loturi (Send e sincron si blocheaza UI-ul); peste ~200 comenzi bifate, dialog suplimentar de confirmare.- Cheia API nu se logheaza niciodata (nici header-ele complete); raspunsurile logate in LOG.txt contin VIN/nr. inmatriculare → se trateaza ca date personale (trunchiate la strictul necesar diagnosticului).
- Clientul ramane transport pur: primeste obiecte/cursoare si intoarce
{index, submission_id, status, motiv, id_prezentare}; corelarea cu id_ordl si actualizarea gridului raman in proceduri/forma → testabil dintr-un driver .prg fara forma. - Parsare raspuns minim per element:
index, submission_id, vehicul, status, motiv, id_prezentare; HTTP ≠ 200 (401/422/5xx) → mesaj cu detaliul din body, fara crash. - Erorile HTTP/parse se scriu si in
LOG.txt(logul runtime existent), cu context: actiune, lot, cod HTTP, primele 500 caractere din raspuns. - Retrimiterea aceluiasi continut e sigura (idempotenta server-side →
deduped); statusul intors se afiseaza onest (inclusivneeds_mapping/needs_data/held).
- POST via
- Verificare E2E: POST pe mediul RAR test cu o comanda reala →
status: queuedsi submission vizibil in dashboardul web.
US-004: Fereastra "Transmitere AUTOPASS" + buton
Ca utilizator vreau o fereastra cu perioada, grid cu bife si butonul Transmite la AUTOPASS pentru ca sa controlez ce se declara si sa vad rezultatul per comanda.
- Depinde de: US-002, US-003, US-005
- Fisiere:
Ferestre\frm_autopass.scx(forma noua, in VFP IDE), lansata din proceduratrimitere_autopassinoproceduri_autopass.prg; punct de intrare (decis): butonul existent "Export" —Clase\ofundal_dev.vcx, clasapg_meniu_princ,Page2.Cw8.do_actiune()(azi:DO export_comanda_xml IN oproceduri_devize.prg) devine meniu contextual, dupa pattern-ulPage5.Cw3.do_actiune:(lnOptiune = xmenu("Export \<xml;Export operatii facturate \<csv;\<Trimitere operatii facturate in autopass.romfast.ro") DO CASE CASE lnOptiune = 1 DO export_comanda_xml IN oproceduri_devize.prg CASE lnOptiune = 2 DO export_operatii_csv IN oproceduri_autopass.prg && US-006 CASE lnOptiune = 3 DO trimitere_autopass IN oproceduri_autopass.prg && fereastra US-004 ENDCASEofundal_dev.vcxe binar — modificarea se face in VFP IDE, apoi se regenereaza cache-ul text) - Layout (ierarhia informatiei — ce vede utilizatorul intai):
Un singur formular: configurarea (US-001) traieste in acelasi
+--------------------------------------------------------------------------+ | [MEDIU: PRODUCTIE ● rosu] Perioada: [01.07.2026]-[09.07.2026] [Actualiz.]| <- 1: unde trimit + ce perioada | [Configurare >>] | +- Configurare (panou pliabil, extins automat cand lipseste cheia) ---------+ | URL gateway: [https://autopass.romfast.ro ] | | Cheie API: [************************] [arata] | | Mediu RAR: [Testare v] [Test conexiune] [Salveaza] | +--------------------------------------------------------------------------+ | [x] | NrCmd | DataInch | Factura | NrInmat | VIN | Km | Client | Op | Status | Motiv | | x | 1234 | 02.07 | 5678 | B99XYZ | ... | .. | ... | 3 | sent | | <- 2: ce se trimite | | 1235 | 03.07 | 5679 | (gri — fara operatii / VIN invalid) | | +--------------------------------------------------------------------------+ | [Bifeaza tot] [Debifeaza] [Valideaza (dry-run)] [TRANSMITE] [Statusuri] | <- 3: actiuni | [Deschide dashboard AUTOPASS] n bifate / m total | +--------------------------------------------------------------------------+frm_autopass.scx, ca panou pliabil sub bara de perioada — implicit strans cand config-ul e valid, extins automat (cu focus pe cheie) candAUTOPASS_KEYlipseste sau ping-ul intoarce 401. Grid dens, limbaj utilitar (conventiile aplicatiei, patternfrm_istoric_comenzi); butonul TRANSMITE e cel mai proeminent, dar la dreapta actiunilor de verificare. - Acceptance criteria:
- Filtru perioada (implicit luna curenta) pe data facturii + buton Actualizeaza.
- Grid: bifa, nr. comanda, data inchidere, nr./data factura, nr. inmatriculare, VIN, km, client, nr. operatii, status transmitere (din situatia gateway-ului, US-005) + motiv.
- Bifeaza tot / debifeaza tot; comenzile regasite in situatia gateway-ului cu status ne-esuat (
queued/sent/deduped/held/needs_*) vin implicit nebifate. - Badge vizibil de mediu:
PRODUCTIE(rosu) /Testare(gri) — regula "rosu = real"; peprod, confirmare explicita inainte de trimitere cu numarul de comenzi. - Dupa trimitere, statusul si motivul se actualizeaza pe fiecare rand fara a inchide fereastra (din raspunsul POST, direct in cursorul gridului — nu se persista nimic).
- Butonul Transmite se dezactiveaza pe durata transmiterii (guard dubla-apasare); progres vizibil (ex. "lot 2/5...").
- Stare goala: perioada fara comenzi → mesaj clar in grid + buton Transmite dezactivat.
- Indicator de acoperire vizibil permanent: "Declarabile in perioada: N | Transmise (sent): M | Blocate/nedeclarabile: K" — singura metrica ce raspunde la "suntem conformi?"; K > 0 e evidentiat. (M/K calculate din situatia US-005 + pre-validarea US-002, la fiecare refresh.)
- Comenzile fara operatii apar in grid (gri, nebifabile) cu motivul "fara operatii de manopera" — vizibile, nu ascunse tacit.
- La deschiderea ferestrei se apeleaza
GET /v1/ping: mediul si starea creds RAR apar in bara de titlu/status; cheie lipsa/invalida → gridul si actiunile raman dezactivate, panoul Configurare se extinde automat cu mesaj (US-001) — utilizatorul corecteaza si salveaza fara sa inchida fereastra. - Schimbarea mediului RAR din panoul Configurare + Salveaza → badge-ul si situatia (US-005) se reincarca imediat (statusurile difera intre test si prod).
- Buton Valideaza (dry-run):
POST /v1/prezentari/valideazape selectie — arata verdictul per comanda (status_estimat, erori, coduri nemapate) FARA enqueue; recomandat inainte de prima trimitere pe Productie. - Buton/link Deschide dashboard AUTOPASS (browser, URL-ul din config).
- Vocabular statusuri (gateway → eticheta romaneasca + culoare + pasul urmator;
NU se afiseaza tokenii englezesti bruti):
| Gateway | Eticheta | Culoare | Pas urmator afisat |
|---|---|---|---|
|
queued| In asteptare la RAR | galben | se actualizeaza cu butonul Statusuri | |sent| Transmis | verde | — (afiseaza nr. prezentare) | |needs_mapping| Cod fara mapare RAR | portocaliu | rezolva in dashboardul AUTOPASS, tab Mapari | |needs_data| Date incomplete | portocaliu | corecteaza comanda si retrimite | |held| Retinut (Auto OFF) | rosu | elibereaza din dashboard sau activeaza Auto | |error| Eroare | rosu | vezi motivul; corecteaza si retrimite | |deduped| Deja transmis | gri | nimic de facut | | (negasit in situatie) | Netransmis | alb | bifeaza si transmite | - Fail-closed la deschidere: pana raspunde ping-ul, badge = "Se verifica mediul...", Transmite si Valideaza dezactivate; wait cursor pe apelurile sincrone.
- Badge-ul de mediu = banda plina in partea de sus a formei (nu doar title bar) + cuvantul PRODUCTIE/TESTARE si langa butonul Transmite; niciodata doar culoare. Dialogul de confirmare repeta cuvantul mediului + numarul de comenzi bifate valide.
- Verdictul dry-run se afiseaza pe canal separat (coloana "Verdict validare" + banner sumar "Validare: 12 OK, 2 coduri nemapate") — NU suprascrie coloana de status transmitere.
- Sumar la final de transmitere: dialog/linie "18 transmise, 3 in asteptare, 1 cod fara mapare — vezi randurile portocalii."
- Textbox read-only sub grid cu status+motiv complet al randului curent (motivele lungi nu incap in celula de grid).
- "Bifeaza tot" selecteaza DOAR randurile eligibile (valide si netransmise).
- Buton Renunta onorat intre loturi (WinHTTP e sincron — singurul punct de anulare).
- Nota implementare VFP: randuri invalide =
DynamicBackColor/DynamicForeColor+When() = .F.pe coloana de bifa (gridul VFP nu are readonly per celula).
- Verificare E2E: flux complet pe mediul test — filtrare, bifare, transmitere, statusuri corecte in grid.
US-005: Situatia prezentarilor din gateway (cursor temporar, FARA stocare locala)
Ca utilizator vreau sa vad, per comanda din perioada, ce s-a transmis deja si cu ce status pentru ca sa nu retransmit inutil si sa pot proba conformarea — fara ca ROAAUTO sa tina vreo evidenta locala.
- Depinde de: US-003
- Fisiere:
Programe\oproceduri_autopass.prg— proceduraautopass_situatie(d1, d2)→ cursor temporarcrs_autopass_situatie. NICIUN tabel, NICIO secventa, NICIUN script. - Principiu: gateway-ul este singura evidenta a transmiterilor (are deja submissions, statusuri, istoricul complet si dashboardul web). ROAAUTO doar interogheaza si coreleaza in memorie, la fiecare refresh; la inchiderea ferestrei totul dispare.
- Acceptance criteria:
autopass_situatie(d1, d2)apeleaza endpoint-ul de listare al gateway-ului (GET /v1/prezentari?data_de=YYYY-MM-DD&data_pana=YYYY-MM-DD, filtrat pedata_prestatiesi pe cheia API a societatii) si construieste cursorul temporarcrs_autopass_situatie:submission_id, vin, nr_inmatriculare, data_prestatie, status, motiv, id_prezentare, obs. Dependenta gateway: daca endpoint-ul de listare pe perioada nu exista inca inrar-autopass, se adauga INTAI acolo (produs propriu) — blocheaza US-005, nu se ocoleste cu stocare locala.- Corelare prezentare ↔ comanda: primar pe
obs(Comanda NRORD / Factura NRFACT— string determinist generat de ROAAUTO la trimitere); fallback pevin + data_prestatie. Rezultatul populeaza coloanele status/motiv din gridul US-004. - Comanda negasita in situatie = "Netransmis" (eligibila la bifare); comanda gasita cu orice status ne-esuat vine implicit nebifata (protectie la retransmitere, pe langa idempotenta server-side).
- Buton Actualizeaza statusuri = re-apeleaza
autopass_situatie()pe perioada afisata si reimprospateaza gridul (aducequeued→sent+id_prezentaredupa ce workerul gateway proceseaza). - Acelasi refresh ruleaza automat la deschiderea ferestrei (decizia 6, poarta /autoplan) si dupa fiecare transmitere, cu wait cursor.
- Situatia indisponibila (endpoint picat / eroare) → gridul afiseaza "Status necunoscut — situatia gateway indisponibila" pe toate randurile, transmiterea ramane posibila DOAR cu confirmare explicita (idempotenta face retrimiterea sigura); eroarea se logheaza in LOG.txt.
- Verificare E2E: dupa ce workerul gateway proceseaza, Actualizeaza statusuri aduce
sent+id_prezentarein grid; cazul 2 comenzi / acelasi VIN / aceeasi zi se coreleaza corect peobs(chei de idempotenta diferite prin NRORD).
US-006: Export operatii facturate CSV (canal alternativ + mod degradat oficial)
Ca utilizator vreau sa export operatiile facturate din perioada intr-un CSV compatibil cu importul web AUTOPASS pentru ca sa pot incarca manual lucrarile in dashboard cand prefer canalul de import — si ca fallback desemnat cand API-ul e indisponibil sau neconfigurat (exportul functioneaza si cu config-ul API gol; obligatia legala nu depinde de un singur canal).
- Depinde de: US-002
- Fisiere:
Programe\oproceduri_autopass.prg— proceduraexport_operatii_csv - Acceptance criteria:
- Cere perioada (data facturii), refoloseste cursoarele din US-002 (acelasi filtru
validat=1, facturat=1, id_tip IN (1,2)). - Format acceptat de
POST /v1/import/ upload web (vezirar-autopass/exemple/prezentari_test.csv): separator;, antetVIN;Numar inmatriculare;Data prestatie;Odometru initial;Odometru final;Operatie;Observatii, un rand per operatie (aceeasi comanda se repeta pe mai multe randuri — importul le grupeaza pe vehicul+data). Data prestatie=DATAORAVALIDin formatYYYY-MM-DD;Odometru final=KMINT;Operatie=CODOP(sauDENOP— coloanaOperatieaccepta text liber, maparea o face gateway-ul);Observatii=Comanda NRORD / Factura NRFACT.- Fisier salvat cu PUTFILE/GETDIR, encoding compatibil (diacriticele din denumiri nu sparg importul).
- Cere perioada (data facturii), refoloseste cursoarele din US-002 (acelasi filtru
- Verificare E2E: CSV-ul exportat se incarca in dashboardul web AUTOPASS si coloanele se auto-mapeaza corect.
5. Riscuri
- Calitatea datelor istorice (VIN gol/invalid, NRINMAT cu spatii/cratime, km 0):
mitigat prin pre-validarea din US-002 (randuri marcate, netransmisibile) + statusul onest
needs_dataintors de gateway. - Dubla declarare la RAR: mitigat dublu — idempotenta server-side (dedup pe continut) + situatia din gateway (US-005: comenzile regasite vin nebifate).
- Corelarea pe
obsdepinde de formatul fixComanda NRORD / Factura NRFACT: formatul se genereaza dintr-un singur loc (functie dedicata, folosita si la POST, si la corelare, si la CSV) — nu se construieste ad-hoc in doua locuri. - Trimitere accidentala pe Productie (ireversibila conform Legii 142): badge rosu + dialog de confirmare cu mediul si numarul de comenzi (US-004).
- Operatii nemapate in gateway: primele loturi vor produce
needs_mapping; se rezolva o singura data per cod in dashboardul web (sau bulk cutools/import_dbf.pydinlegacy-vfp/mapare_prestatii.DBF, care contine deja mapari ROAAUTO). - VFP + TLS:
winHTTPpe Windows vechi poate esua pe TLS 1.2; pattern-ul e deja folosit in productie pentru ANAF SPV (ems_trimite_facturi_spv.prg), deci riscul e cunoscut/mic. - Endpoint de listare in gateway: US-005 presupune
GET /v1/prezentaricu filtru pe perioada; daca lipseste, se implementeaza intai inrar-autopass(blocant asumat — NU se compenseaza cu tabel local).
6. Intrebari deschise
Se rezolva cu utilizatorul INAINTE de executie.
Decizii luate (fost intrebari 1-4):
-
DECIS —
data_prestatie=DATAORAVALID(data validarii/inchiderii comenzii); perioada de filtrare ramane peDATAFACT. -
DECIS (confirmat la poarta /autoplan, dupa contestarea ambelor voci independente) —
odometru_final=KMINT. Justificare asumata: e singura citire de bord existenta in date, e o citire reala a vehiculului in perioada lucrarii, iar contractul RAR cereodometruFinalobligatoriu (a trimite doarinitialar fi respins). Semantic, KMINT e km la primire — decizie documentata, de revizuit doar daca RAR o conteste. -
DECIS (revizuit la review-ul CEO) — TOATE comenzile facturate: post-garantie (
ID_TIP=1) si garantie (ID_TIP=2). Regie/pregatire/productie/constatare (id_tip >= 3) NU se transmit. -
DECIS — punct de intrare: butonul "Export" din
Clase\ofundal_dev.vcx(pg_meniu_princ.Page2.Cw8.do_actiune) devinexmenucu 3 optiuni: Export xml (existent) / Export operatii facturate csv (US-006) / Trimitere operatii facturate in autopass.romfast.ro (US-004). -
DECIS — o singura cheie API per baza de date (societate); optiunile
AUTOPASS_*din tabeluloptiunitin o singura configurare. Context (poarta /autoplan): clientii actuali au un singur service auto per firma; daca apar clienti cu mai multe service-uri/conturi RAR, config-ul se extinde atunci. -
DECIS (poarta /autoplan) — la deschiderea ferestrei, pe langa ping, se actualizeaza automat situatia prezentarilor (US-005) pentru perioada afisata; butonul "Actualizeaza statusuri" ramane pentru refresh manual.
-
DECIS (revizie 2026-07-09, Marius) — ZERO tabele noi: configurarea in tabelul
optiuni(mecanismul existentoinit_optiuni.prg), evidenta transmiterilor NUMAI in gateway, consultata prin API intr-un cursor temporar. FosteleAUTO_AUTOPASS_CONFIG,AUTO_AUTOPASS_TRIMITERI,SEQ_AUTOPASS_TRIMITERIsunt eliminate din plan (si revertate dinScripturi_instalare\). -
DECIS (revizie 2026-07-10, Marius) — un singur formular: URL-ul, cheia API si mediul RAR se editeaza direct din fereastra de transmitere (panou Configurare pliabil in
frm_autopass.scx), nu dintr-o fereastra separata; salvarea trece prinscrie_optiune()(autopass_salveaza_config). -
DECIS (revizie 2026-07-10, Marius) — normalizare NRINMAT aprobata: eliminarea spatiilor, cratimelor si punctelor din numarul de inmatriculare inainte de validare se aplica consecvent pe cele 3 canale: gateway
rar-autopass(validare + idempotency), clientul VFP (autopass_valideaza_randdinoproceduri_autopass.prg) si spike-ul SQL de calitate a datelor (docs\spike_calitate_date_autopass_v2.sql, versiune noua fata de spike-ul v1 rulat initial). Motivatie: spike-ul v1 a aratat doar 13,8% NRINMAT valide din cauza formatelor reale cu spatii/cratime (ex. "B 99 XYZ"), regula stricta anterioara (doar strip+upper) fiind prea restrictiva fata de datele istorice reale.
Nu mai exista intrebari deschise — PRD aprobat prin poarta /autoplan (2026-07-09), revizuit conform deciziilor 7-9 (decizia 9 e o completare post-aprobare, 2026-07-10).
7. Valuri de executie
Val 0: [SPIKE calitate date] ← un singur SQL, INAINTE de orice implementare:
din comenzile facturate (id_tip 1,2) de la 01.12.2024,
ce procent au VIN valid 17 car., NRINMAT si KMINT > 0?
Rezultatul calibreaza asteptarile si decide daca e
nevoie si de un proiect de remediere a datelor.
[VERIF gateway] ← exista GET /v1/prezentari (listare pe perioada)?
daca nu → se adauga intai in rar-autopass.
Val 1: [US-001] [US-002] ← independente, zone distincte → paralel
Val 2: [US-003] [US-005] [US-006]← US-003 dupa config; US-005 dupa client HTTP; US-006 dupa cursoare
Val 3: [US-004] ← forma finala + xmenu in ofundal_dev.vcx (VFP IDE)
Anexa review /autoplan (CEO + Design + Eng, 2026-07-09)
NOT in scope (considerat si amanat explicit)
- Transmitere automata la validarea comenzii (hook in
validare_comenzi) — ROAAUTO-1.1, dupa ce fluxul manual e verificat in productie. - Vizualizare/rezolvare mapari pending in ROAAUTO (
GET /v1/mapari/pending) — se face in dashboardul web AUTOPASS; duplicarea editorului in VFP nu aduce valoare. - Listare/tiparire jurnal transmiteri (raport FRX) — gridul + dashboardul web acopera nevoia; raport doar la cerere ulterioara.
- Actualizare automata a statusurilor pe timer — refresh-ul la deschidere + butonul manual "Actualizeaza statusuri" sunt suficiente in v1.0.
- Criptarea cheii API — cheia sta in clar in
optiuni.varvalue(AUTOPASS_KEY), ca restul configurarilor din schema; acces limitat la schema aplicatiei. Se poate cripta ulterior.
What already exists (refolosit, nu reconstruit)
auto_istoric_comenzi— view-ul cu tot header-ul necesar (comanda+factura+vehicul+km).DEV_OPER+DEV_NOM_NORME— operatiile cu CODOP/DENOP.- Tabelul
optiuni+oinit_optiuni.prg(optiuni_firma,citeste_optiune,scrie_optiune, fereastra standard Optiuni) — configurarea AUTOPASS fara tabele noi. D:\ROA\ems_trimite_facturi_spv.prg(SendeFactura) — pattern-ul WinHTTP + header auth, deja folosit in productie pentru ANAF SPV (inclusiv TLS pe Windows-urile clientilor).nfjsoncreate/nfjsonread— biblioteca JSON VFP (vendored din rar-autopass/legacy-vfp).- Gateway-ul insusi: validare continut, mapare coduri, idempotenta, coada, retry, dashboard si evidenta completa a transmiterilor (motivul pentru care ROAAUTO nu mai tine jurnal).
- Pattern-ul
xmenu+do_actiunedinofundal_dev.vcx(Page5.Cw3) pentru punctul de intrare.
Error & Rescue Registry (US-003 AutopassClient + fereastra)
| Codepath | Ce poate esua | Tratare | Utilizatorul vede |
|---|---|---|---|
| WinHTTP Send | timeout / DNS / TLS / gateway down | catch loEx, log LOG.txt, opreste lotul curent |
"Gateway indisponibil: . Reincearca mai tarziu." |
| HTTP 401 | cheie API invalida/lipsa | opreste tot, nu continua loturile; panoul Configurare se extinde | "Cheie API respinsa — corecteaza cheia in panoul Configurare." |
| HTTP 422 | mediu RAR indisponibil / limita plan / JSON invalid | afiseaza detail-ul din body per lot |
mesajul gateway-ului, netradus |
| HTTP 5xx | eroare interna gateway | log + mesaj, lotul se poate retrimite (idempotent) | "Eroare gateway (500). Retrimiterea e sigura." |
| Parse JSON raspuns | raspuns malformat/gol | catch nfjsonread, log body brut in LOG.txt | "Raspuns neasteptat de la gateway — vezi LOG.txt" |
| SQL pass-through Oracle | conexiune cazuta / view lipsa | pattern-ul standard al aplicatiei (verificare cursor) | eroarea standard a aplicatiei |
| GET situatie (US-005) | endpoint picat / raspuns invalid | statusuri "necunoscut" in grid, transmitere doar cu confirmare explicita; log | "Situatia gateway indisponibila — statusurile nu au putut fi citite" |
Rand needs_data/needs_mapping |
date incomplete / cod nemapat | status onest in grid, motiv afisat | motivul exact (ex. "Coduri fara mapare RAR: ...") |
Reguli: fara catch-all mut — orice Catch scrie context in LOG.txt; niciun esec nu e silentios (fiecare rand bifat primeste un status vizibil sau un motiv de esec).
Failure Modes Registry
| Codepath | Failure mode | Tratat? | Vizibil? |
|---|---|---|---|
| Transmitere lot | crash intre loturi (lot 2/5 trimis, 3 nu) | gateway-ul are submissions-urile trimise; refresh-ul situatiei (US-005) le arata; retrimiterea e idempotenta | DA — statusuri per rand la urmatorul refresh |
| Dubla transmitere | acelasi continut retrimis | dedup server-side → deduped |
DA — status "deja transmis" |
| KMINT=0 / VIN gol | date istorice proaste | pre-validare US-002 → rand marcat, nebifabil | DA — motiv pe rand |
| Diacritice corupte | encoding gresit in JSON | encoding verificat empiric (US-003) | test E2E cu denumiri cu diacritice |
| IN (...) > 1000 elemente | perioada mare, Oracle ORA-01795 | detaliul se citeste pe chunk-uri de max 500 id-uri | transparent |
| Situatie indisponibila | GET listare esueaza | statusuri necunoscute + confirmare explicita la transmitere | DA — mesaj pe grid |
| Trimitere pe prod din greseala | mediu gresit | badge rosu + dialog de confirmare cu mediu si numar | DA — confirmare explicita |
Decizii auto-luate (audit trail — principiile /autoplan)
| # | Faza | Decizie | Clasificare | Principiu |
|---|---|---|---|---|
| 1 | CEO 0C-bis | Client subtire → gateway (vs CSV-only vs API RAR direct in VFP) | mecanic | P1 completeness, P4 DRY |
| 2 | CEO 0D | Accept: buton "Deschide dashboard AUTOPASS" | auto-accept | P2 blast radius, S |
| 3 | CEO 0D | Accept: ping + badge mediu la deschiderea ferestrei | auto-accept | P2, era partial in US-004 |
| 4 | CEO 0D | Accept: buton Valideaza (dry-run) via /v1/prezentari/valideaza |
auto-accept | P1 — verificare fara efecte |
| 5 | CEO 0D | Defer: auto-send la validare, mapari pending, listare jurnal, timer statusuri | auto-defer | P3 — in afara blast radius |
| 6 | CEO S2 | Timeout-uri explicite + fara retry client (idempotenta server) | mecanic | P5 explicit |
| 7 | CEO S4 | Encoding UTF-8 verificat + test diacritice | mecanic | P1 |
| 8 | CEO S7 | Chunk-uri de max 500 id-uri la detaliul operatiilor | mecanic | corectitudine Oracle |
| 9 | Premise gate | Scope: toate comenzile facturate (id_tip 1,2), fara regie/productie | decizia utilizatorului | — |
| 10 | Design P2 | Tabel stari interactiune adaugat in US-004 (loading/empty/error/success) | mecanic | P1 |
| 11 | Eng S1 | Corelare index→id_ordl per lot, explicit in US-003 | mecanic | P5 |
| 12 | Design voice #1 | Vocabular statusuri RO (fara tokeni englezesti in grid) | mecanic | P1 — utilizatorul e consilier service, nu dev |
| 13 | Design voice #2/#3 | Banda de mediu + fail-closed pana la ping | mecanic | P1 — actiune ireversibila |
| 14 | Design voice #4 | Verdict dry-run pe canal separat de statusul real | mecanic | P5 — evita retrimiterile accidentale |
| 15 | Design voice #5-#9 | Sumar final, textbox motiv, Bifeaza-tot doar eligibile, Renunta intre loturi, nota DynamicBackColor | mecanic | P1/P5 |
| 16 | CEO voice #2 | Reframe: v1.0 = stingere backlog (obligatie din 01.12.2024) + transmitere curenta | mecanic | P6 |
| 17 | CEO voice #4 | Val 0: SPIKE SQL calitate date (procent comenzi declarabile) inainte de implementare | auto-accept | P1 — un singur SQL |
| 18 | CEO voice #5 | Indicator de acoperire (declarabile/transmise/blocate) in fereastra | auto-accept | P1 — metrica de conformare |
| 19 | CEO voice #7 | CSV US-006 desemnat mod degradat oficial (functioneaza fara config API) | mecanic | P3 |
| 20 | Eng voice #2 | Encoding verificat empiric (nfjsoncreate) inainte de STRCONV | mecanic | P5 — nu pe incredere |
| 21 | Eng voice #3/#12 | Date YYYY-MM-DD construite explicit + TO_DATE in SQL | mecanic | P5 |
| 22 | Eng voice #4 | DOEVENTS + Renunta intre loturi + prag confirmare 200 | mecanic | P1 |
| 23 | decizia utilizatorului | — | ||
| 24 | Eng voice #6-#9 | Dedup VIN+zi verificat in E2E, cheia API nelogata, CODOP gol marcat, client transport pur | mecanic | P1/P5 |
| 25 | Revizie Marius | Config in optiuni (mecanism existent), zero tabele noi, situatie in cursor temporar |
decizia utilizatorului | — |
| 26 | Revizie Marius | Un singur formular: panou Configurare (URL/cheie/mediu) direct in fereastra de transmitere | decizia utilizatorului | — |
Contestari NEauto-decise (poarta finala): C1 enqueue-on-close vs manual (CEO voice #1); C2 KMINT ca odometru_final (CEO #3 + Eng #1 — ambele voci independente); C3 multi-CUI (CEO #6); T1 auto-refresh statusuri la deschiderea ferestrei (taste).
Arhitectura (Eng S1, revizuita — zero tabele noi)
ofundal_dev.vcx (Page2.Cw8 xmenu)
|1 Export xml -> export_comanda_xml (existent, oproceduri_devize.prg)
|2 Export CSV -> export_operatii_csv \
|3 Trimitere AUTOPASS -> trimitere_autopass } oproceduri_autopass.prg (NOU)
|
frm_autopass.scx (NOU)
| |
cursoare Oracle AutopassClient (WinHTTP, JSON UTF-8)
(auto_istoric_comenzi, |
dev_oper+dev_nom_norme) +--> https://autopass.romfast.ro
| /v1/ping /v1/prezentari
config: tabel `optiuni` /v1/prezentari/valideaza
(AUTOPASS_URL/KEY/ENV via /v1/prezentari?perioada (situatie)
citeste_optiune/gc*) |
crs_autopass_situatie (cursor temporar,
corelat pe `obs` cu gridul — NU se
persista nimic local)
Cuplaj: fereastra depinde doar de procedurile din oproceduri_autopass.prg; clientul HTTP
nu stie de Oracle (primeste/intoarce cursoare/obiecte) → reutilizabil pentru auto-send 1.1.
Acoperire de test (Eng S3 — verificare manuala E2E, VFP nu are framework de teste)
CODEPATHS VERIFICARE
AUTOPASS_KEY goala -> panou Configurare extins E2E: goleste cheia, redeschide fereastra
salvare config din panou -> ping + badge E2E: schimba mediul test<->prod, Salveaza
GET /v1/ping ok/401 E2E: cheie buna / cheie gresita
cursor header (perioada cu/fara comenzi) E2E: 2 perioade cunoscute
pre-validare (VIN invalid, km 0, fara operatii)E2E: comenzi istorice reale
dry-run /valideaza E2E: verdictele = trimiterea reala
POST lot ok / 422 / 5xx E2E pe mediul RAR TEST
dedup (retrimitere aceleasi comenzi) E2E: a doua trimitere -> deduped
diacritice in DENOP E2E: comanda cu operatii cu s,t,a,i
situatie: corelare obs + refresh statusuri E2E: queued -> sent + id_prezentare in grid
situatie indisponibila E2E: URL gresit -> statusuri necunoscute + confirmare
CSV export -> import web E2E: upload in dashboard, automap coloane
xmenu (3 optiuni, Esc) E2E: fiecare ramura + anulare
driver .prg fara forma (1 comanda hand-built) E2E: acopera encoding/headers/timeouts izolat
2 comenzi, acelasi VIN, aceeasi zi E2E: corelare corecta pe obs (NRORD diferit)
Toate pe mediul RAR test inainte de orice trimitere pe prod.
Dream state delta
12 luni: declararea RAR e zero-touch — la validarea comenzii, transmiterea pleaca automat,
statusul apare pe comanda, iar utilizatorul intervine doar la needs_mapping/needs_data.
Planul v1.0 construieste exact fundatia reutilizabila (config in optiuni, client HTTP,
situatie din gateway, fereastra); 1.1 adauga hook-ul de auto-send. Nicio piesa din v1.0
nu se arunca.
Raport VERIFY
Se completeaza la faza VERIFY: PASS/FAIL per criteriu, cu dovezi (ping, POST pe RAR test, capturi grid + dashboard web). Lipseste pana la VERIFY.
GSTACK REVIEW REPORT
| Review | Trigger | Why | Runs | Status | Findings |
|---|---|---|---|---|---|
| CEO Review | /plan-ceo-review |
Scope & strategy | 1 | CLEAN (PLAN via /autoplan) | 6 propuneri, 3 acceptate, 4 amanate; contestarile C1-C3 rezolvate la poarta |
| Codex Review | /codex review |
Independent 2nd opinion | 0 | — (Codex neinstalat, voci = subagent-only) | — |
| Eng Review | /plan-eng-review |
Architecture & tests (required) | 1 | CLEAN (PLAN via /autoplan) | 12 constatari, 0 critical gaps, toate incorporate |
| Design Review | /plan-design-review |
UI/UX gaps | 1 | CLEAN (FULL via /autoplan) | scor 5/10 → 9/10, 9 decizii adaugate |
| DX Review | /plan-devex-review |
Developer experience gaps | 0 | SKIPPED | fara scope developer-facing |
- VERDICT: CEO + ENG + DESIGN CLEARED — gata de implementare. Decizii poarta finala: C1=A (manual v1.0, auto-send in 1.1), C2=A (KMINT ca odometru_final, documentat), C3=A (o cheie/BD; multi-service se revizuieste la nevoie), T1=A (auto-refresh la deschidere).
- Revizie post-aprobare (2026-07-09, Marius): decizia 7 — zero tabele noi; US-001
rescris pe tabelul
optiuni, US-005 rescris pe situatia din gateway (cursor temporar); scripturile SQL revertate. - Revizie post-aprobare (2026-07-10, Marius): decizia 9 — normalizare NRINMAT (strip spatii/cratime/puncte) aprobata pe cele 3 canale (gateway, client VFP, spike SQL v2); motivata de rata scazuta de valid (13,8%) gasita in spike-ul v1.
NO UNRESOLVED DECISIONS