From 8dd0e1678c428c5758d70f09facea2ee23f36302 Mon Sep 17 00:00:00 2001 From: Claude Agent Date: Sun, 28 Jun 2026 21:20:20 +0000 Subject: [PATCH] docs(prd): 5.16 tipografie+bugfix editare + 5.17 tipuri cont + mockup-uri MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PRD 5.16 (draft) — propagare design uniform peste aplicatie: - fonturi standard web (system font stack), scala uniforma --fs-* (carduri aerisite) - RAR online = dot in antet (datetime pe hover) + meniu burger; banda doar cand e blocat - antet branded "ROMFAST AUTOPASS" + nume service + badge plan (gate is_authenticated) - /login profesional (antet minimal pre-login), selector tema stil landing - bug-uri editare: denumiri in picker, adaugare operatie extra, fix save no-op, fix Renunta - dashboard compact: strip-less, contoare separate (mobil = bara numere), import colapsat, ordine carduri->import->tab-uri->lista, meniu cu separatoare - wizard import (4 pasi) + editare/corectie aliniate la design PRD 5.17 (draft) — tipuri de cont (Gratuit/Standard/Pro/Premium) + trial Pro 30 zile: - model accounts.tier + trial_until, app/plans.py sursa unica - enforcement DUR: limita Gratuit 60/luna (era 100) + API doar Pro+ - downgrade automat la expirare trial; aliniere landing (60, "Pro gratuit 30 zile") Mockup-uri vizuale (docs/mockups/prd-5.16-*.html): fonturi, header+login+tema, dashboard desktop+mobil, wizard import. Doar documentatie + mockup-uri; fara cod aplicatie. Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/mockups/prd-5.16-dashboard-mobil.html | 221 ++++++++ docs/mockups/prd-5.16-dashboard.html | 241 +++++++++ .../prd-5.16-fonturi-system-stack.html | 187 +++++++ docs/mockups/prd-5.16-header-login-tema.html | 173 ++++++ docs/mockups/prd-5.16-import-wizard.html | 275 ++++++++++ ...5.16-tipografie-uniforma-bugfix-editare.md | 498 ++++++++++++++++++ .../prd/prd-5.17-tipuri-cont-planuri-trial.md | 317 +++++++++++ 7 files changed, 1912 insertions(+) create mode 100644 docs/mockups/prd-5.16-dashboard-mobil.html create mode 100644 docs/mockups/prd-5.16-dashboard.html create mode 100644 docs/mockups/prd-5.16-fonturi-system-stack.html create mode 100644 docs/mockups/prd-5.16-header-login-tema.html create mode 100644 docs/mockups/prd-5.16-import-wizard.html create mode 100644 docs/prd/prd-5.16-tipografie-uniforma-bugfix-editare.md create mode 100644 docs/prd/prd-5.17-tipuri-cont-planuri-trial.md diff --git a/docs/mockups/prd-5.16-dashboard-mobil.html b/docs/mockups/prd-5.16-dashboard-mobil.html new file mode 100644 index 0000000..439e063 --- /dev/null +++ b/docs/mockups/prd-5.16-dashboard-mobil.html @@ -0,0 +1,221 @@ + + + + + +PRD 5.16 — Dashboard mobil 390px (RAR dot in antet + meniu) + + + +
+ + +
+
+
+ ROMFAST +
+
ROMFAST AUTOPASSPro
+
Service auto: Service Auto Vâlcea SRL
+
+
+ + + +
+
+
+
+
847
Total
+
124
Lună
+
9
Azi
+
12
Coadă
+
2
Corectat
+
+
+ + Importă fișier (XLSX / CSV) +
+
+ +
+
+ + + + +
+
WBA8E9...K7F2
Inspecție tehnică · 09:42
Trimis
+
WVWZZZ...3M1
Revizie periodică · 09:38
În coadă
+
VF1RFB...A88
Sistem frânare · 09:31
De corectat
+
ZAR937...C04
Schimb ulei · 09:24
Trimis
+
+
+
+
+
390px · Acasă — RAR online = dot în antet (dată/oră pe hover), filtre fără linie de scroll
+
+ + +
+
+
+ ROMFAST +
+
ROMFAST AUTOPASSPro
+
Service auto: Service Auto Vâlcea SRL
+
+
+ + + +
+
+
+ +
+
390px · Meniu burger — RAR online + Plan (Pro) + separatoare între secțiuni
+
+ + +
+
+ +
+
+
+
+
+
+
+
+ +
REVIZIE PERIODICĂ — la 15.000 km
REV2
+
SCHIMB PLĂCUȚE FRÂNĂ — lipsă cod
+ +
+
+
+
+
390px · Editare full-screen — trimitere nefinalizată (picker cod+denumire, Renunță)
+
+ +
+ + diff --git a/docs/mockups/prd-5.16-dashboard.html b/docs/mockups/prd-5.16-dashboard.html new file mode 100644 index 0000000..f8d1a8a --- /dev/null +++ b/docs/mockups/prd-5.16-dashboard.html @@ -0,0 +1,241 @@ + + + + + +PRD 5.16 — Dashboard aplicatie (compact, minimalist) + + + + +
+
ROMFAST
+
+
ROMFAST AUTOPASStestPro
+
Service auto: Service Auto Vâlcea SRL
+
+
+
RAR online
+ + v5.16 + +
+
+ +
+ + +
+
847
Total trimise
+
124
Luna asta
+
9
Azi
+
12
În coadă
+
2
De corectat
+
+ + +
+ + + Importă fișier (XLSX / CSV) + trage-l aici sau apasă pentru a deschide ▾ + +
+
Încarcă un fișier sau trage-l aici
Mapezi coloanele o singură dată — apoi trimitem la RAR automat.
+ +
+
+ + +
+ +
+
+ + + + +
+
WBA8E9...K7F2
Inspecție tehnică · 09:42
Trimis
+
WVWZZZ...3M1
Revizie periodică · 09:38
În coadă
+
VF1RFB...A88
Sistem frânare · 09:31
De corectat
+
ZAR937...C04
Schimb ulei · 09:24
Trimis
+
JTDBR...9920
Inspecție tehnică · 09:18
Trimis
+
+
+ + +
Stare BLOCAT — banda apare DOAR atunci (worker oprit / RAR inaccesibil)
+
+ Blocat: RAR inaccesibil — declarațiile NU pleacă + Ultima autentificare RAR: 28.06.2026 09:41 +
+ + +
Modal editare — la click pe o trimitere nefinalizată (needs_data / needs_mapping)
+
+
Corectează trimiterea
+
+
+
+
+
+
+
+
+ +
REVIZIE PERIODICĂ — la 15.000 kmREV2
+
SCHIMB PLĂCUȚE FRÂNĂ — lipsă cod
+
+
+
+
+
+
+ + + + diff --git a/docs/mockups/prd-5.16-fonturi-system-stack.html b/docs/mockups/prd-5.16-fonturi-system-stack.html new file mode 100644 index 0000000..65acfa8 --- /dev/null +++ b/docs/mockups/prd-5.16-fonturi-system-stack.html @@ -0,0 +1,187 @@ + + + + + +PRD 5.16 — Preview fonturi system-stack + scala tipografica + + + +
+
+ + Fonturi: system-ui, -apple-system, Segoe UI, Roboto… — zero fisiere descarcate. +
+ +

Gateway RAR AUTOPASS

+

Preview tipografie 5.16 — font stack nativ + scala uniforma, carduri aerisite, text mai mare.

+ +
Scala tipografica unica (tokeni)
+ + + + + + +
--fs-xs 12pxMeta, hint-uri, sub-linii mono (azi 10px — prea mic)
--fs-sm 13.5pxLabel-uri formular, pill-uri de stare (azi 11px)
--fs-base 15pxText body implicit pe toate paginile
--fs-md 16pxInput-uri, VIN mono, text de card (azi 13px)
--fs-2xl 28pxCifra contor (azi 22px)
+ +
Dashboard — strip sanatate (DOT, nu bifa) + carduri-contor
+
+ RAR online · declaratiile curg normal + Ultima autentificare RAR: 28.06.2026 09:41 +
+
+
847
Trimise (total)
luna 124 · azi 9
+
12
In coada
+
0
De corectat
+
+ +
Lista trimiteri — rand slim
+
+
WBA8E9...K7F2
Inspectie tehnica · 09:42
Trimis
+
WVWZZZ...3M1
Revizie periodica · 09:38
In coada
+
VF1RFB...A88
Sistem franare · 09:31
De corectat
+
+ +
Formular editare — denumiri operatii in picker + adaugare operatie
+
+
+
+
+
+
+
+ +
+ +
+ REVIZIE PERIODICA — revizie la 15.000 km + REV2 +
+
+ SCHIMB PLACUTE FRANA — lipsa cod + +
+
+

Picker-ul arata cod + denumire (FRN1 — Sistem de franare), nu doar codul.

+
+ +
+ + +
+
+ +

Nota: tema/culorile sunt doar context. Subiectul acestui preview e fontul (system-ui) si scala (dimensiuni mai mari, uniforme). Deschide pe Windows si pe Mac ca sa vezi cum cade fontul nativ pe fiecare.

+
+ + diff --git a/docs/mockups/prd-5.16-header-login-tema.html b/docs/mockups/prd-5.16-header-login-tema.html new file mode 100644 index 0000000..95dada1 --- /dev/null +++ b/docs/mockups/prd-5.16-header-login-tema.html @@ -0,0 +1,173 @@ + + + + + +PRD 5.16 — Header profesional + /login + selector tema stil landing + + + + +
+
+ Comuta tema cu butonul de tema (stil landing: icon + eticheta). +
+ + +
Antet aplicatie — LOGAT (branded)
+
+
+ ROMFAST + (in app: PNG logo real) +
+
+
ROMFAST AUTOPASStestPro
+
Service auto: Service Auto Vâlcea SRL
+
+
+
RAR online
+ + v5.16 + +
+
+

Doar cand esti LOGAT: titlu ROMFAST AUTOPASS + badge plan + (accounts.tier) + sub titlu numele service-ului (accounts.name); + dreapta dot RAR online + selector tema + meniu cont. Toate gate-uite pe + is_authenticated.

+ + +
Pagina /login — NEAUTENTIFICAT (antet minimal)
+ + + +

Antetul de /login NU are dot RAR, nume service sau badge plan — + utilizatorul nu e logat inca. Doar logo + titlu ROMFAST AUTOPASS + selector tema. + (RAR/service/plan/meniu apar abia dupa autentificare.)

+ +
Landing — butonul „Autentificare" duce la /login
+

Pe landing, „Autentificare" (azi deschide modalul de register din landing pe tab-ul + login) devine un link real către /login (pagina de mai sus). „Creează cont" + rămâne neschimbat. Selectorul de teme din landing e exact modelul pe care îl preia aplicația.

+
+ + + + diff --git a/docs/mockups/prd-5.16-import-wizard.html b/docs/mockups/prd-5.16-import-wizard.html new file mode 100644 index 0000000..cbc9c21 --- /dev/null +++ b/docs/mockups/prd-5.16-import-wizard.html @@ -0,0 +1,275 @@ + + + + + +PRD 5.16 — Wizard import fișier (4 pași) + editare/corecție + + + + +
+ ROMFAST +
+
ROMFAST AUTOPASStestPro
+
Service auto: Service Auto Vâlcea SRL
+
+
+
RAR online
+ + +
+
+ +
+ + +
Pas 1 — Încarcă fișier
+
+
1Încarcă
+
2Potrivește
+
3Verifică
+
4Confirmă
+
+
+

Încarcă fișierul cu prestații

Trage un fișier xlsx/csv aici sau folosește butonul de alegere.

+
+
+
+
Trage fișierul aici
+
sau apasă pentru a alege de pe calculator · max 5 MB
+ +
.xlsx.csv.xls
+
+
+
+ + +
Pas 2 — Potrivește coloanele
+
+
Încarcă
+
2Potrivește
+
3Verifică
+
4Confirmă
+
+
+

Potrivește coloanele fișierului cu câmpurile RAR

Spune-ne ce coloană din fișier corespunde cu ce câmp RAR. prestatii-iunie.xlsx · 38 rânduri.

+
+
Format recunoscut — am reaplicat maparea salvată pentru aceste coloane.
+ + + + + + + + + + +
Coloană din fișierExempluCâmp RAR
SASIUWBA8E9C5K7F20143
DATA22.06.2026
NR_AUTOCT88NOE
KM142500
OPERATIERevizie periodică
PRET350 lei
+
+
+ +
+
+
+ + +
Pas 3 — Verifică (cu editare/corecție rând)
+
+
Încarcă
+
Potrivește
+
3Verifică
+
4Confirmă
+
+
+

Verifică rândurile înainte să le trimiți la RAR

Corectează rândurile marcate. Restul sunt gata de trimis.

+
+
+ 33 gata + 2 Cod RAR lipsă + 1 Date incomplete + 1 Duplicat în fișier + 1 Deja trimis +
+ + + + + + + + + + +
VINOperațieDataStare
WBA8E9...K7F2Inspecție tehnică22.06.2026Gata
VF1RFB...A88Schimb plăcuțe frână22.06.2026Cod RAR lipsă
+
+
Corectează rândul — VF1RFB...A88
+
+
+
+
+
+
+
+ +
+ SCHIMB PLĂCUȚE FRÂNĂ — lipsă cod + + + +
+
+ + +
+
+
+
+
ZAR937...C04Schimb ulei21.06.2026Date incomplete
WVWZZZ...3M1Revizie periodică22.06.2026Duplicat în fișier
+
+
+ 3 rânduri de corectat înainte de trimitere +
+
+
+ + +
Pas 4 — Confirmă trimiterea
+
+
Încarcă
+
Potrivește
+
Verifică
+
4Confirmă
+
+
+

Confirmă trimiterea la RAR

Acțiunea e ireversibilă — prestațiile pleacă la RAR AUTOPASS.

+
+
36
prestații gata de trimis
+
+ 36 vor pleca + 1 sărit (duplicat) + 1 deja trimis +
+ +
O prestație finalizată la RAR nu mai poate fi anulată sau corectată prin aplicație.
+
+
+ + +
+
+ +
+ + diff --git a/docs/prd/prd-5.16-tipografie-uniforma-bugfix-editare.md b/docs/prd/prd-5.16-tipografie-uniforma-bugfix-editare.md new file mode 100644 index 0000000..bf5d81c --- /dev/null +++ b/docs/prd/prd-5.16-tipografie-uniforma-bugfix-editare.md @@ -0,0 +1,498 @@ +# PRD 5.16 — Tipografie uniforma (fonturi standard web) + bug-fix formular editare + E2E + +**Stare**: draft + +> Proces complet: `docs/ROADMAP.md` §5. Contract RAR (sursa de adevar): `docs/api-rar-contract.md`. +> Sistemul de design: `DESIGN.md` + `app/web/templates/base.html`. Landing: `app/web/templates/landing.html`. +> Mockup tipografie (REFERINTA VIZUALA): `docs/mockups/prd-5.16-fonturi-system-stack.html` +> — system font stack, scala uniforma, DOT pentru RAR online, denumiri in picker, buton Renunta. +> Mockup header + login + selector tema (REFERINTA VIZUALA): `docs/mockups/prd-5.16-header-login-tema.html` +> — antet branded "ROMFAST AUTOPASS" + nume service, pagina /login profesionala, selector tema stil landing. +> Mockup dashboard COMPLET (REFERINTA VIZUALA): `docs/mockups/prd-5.16-dashboard.html` +> — pagina Acasa cu antet branded, selector tema landing, strip DOT, contoare SEPARATE +> (Total/Luna/Azi/In coada/De corectat), lista slim, modal editare cu picker+denumiri+Renunta. +> Mockup dashboard MOBIL 390px (REFERINTA VIZUALA): `docs/mockups/prd-5.16-dashboard-mobil.html` +> — Acasa + editare full-screen pe telefon: antet compact (tema doar iconita <=560px ca pe landing), +> contoare separate (Total prominent + 2x2), strip DOT cu text pe 2 linii, butoane full-width. +> Mockup WIZARD import + editare/corectie (REFERINTA VIZUALA): `docs/mockups/prd-5.16-import-wizard.html` +> — cei 4 pasi (1 Incarca · 2 Potriveste coloanele · 3 Verifica · 4 Confirma), import colapsat, +> preview cu stari (Cod RAR lipsa/Date incomplete/Duplicat/Deja trimis) + editare/corectie rand +> inline (picker cod+denumire, + adauga operatie, salveaza regula, Renunta). +> Continua si finalizeaza propagarea de design inceputa in 5.15 (`docs/prd/prd-5.15-propagare-design-dashboard-editare.md`). +> Starea trece: `draft -> aprobat -> in-executie -> verify-pass -> inchis`. + +## 1. Introducere + +PRD 5.15 a propagat sistemul de design al landing-ului in aplicatie (carduri-contor, lista slim, +formular slim cu chips, 7 teme). La folosire reala userul a constatat ca rezultatul NU respecta inca +claritatea exemplelor din landing: **fonturile sunt prea mici si neuniforme** intre pagini si +formulare, **cardurile au textul inghesuit**, iar in formularul de editare au ramas patru +**bug-uri functionale** care fac corectia trimiterilor frustranta sau imposibila. In plus userul vrea +**fonturi standard web** (fara fisiere de font instalate), aceleasi in aplicatie SI in landing. + +5.16 finalizeaza propagarea de design pe doua planuri: +1. **Tipografie**: o singura scala uniforma, lizibila, mai mare, pe fonturi de sistem (system font + stack) — atat in aplicatie cat si in landing — eliminand IBM Plex self-hostat. +2. **Bug-fix + ergonomie formular editare**: cele 4 probleme reale + indicatorul RAR online ca DOT. + +Plus o trecere E2E in browser pe toate paginile, conforme cu `DESIGN.md` si spiritul landing-ului. + +## 2. Obiective + +### Obiectiv principal +Aplicatia sa para acelasi produs ca landing-ul comercial: tipografie clara, uniforma, lizibila, fara +text inghesuit; iar formularul de editare sa functioneze corect (salveaza, se inchide, permite +adaugarea de operatii cu denumiri citibile). + +### Obiective secundare +- Zero fisiere de font in runtime (gateway intern) — fonturi 100% native. +- Sursa unica de adevar pentru dimensiunile de text (tokeni de scala), nu valori ad-hoc per template. +- Indicator de stare RAR online consistent cu landing-ul (dot pulsant, nu bifa). + +### Metrici de succes +- Un esantion de 5 pagini (Acasa, Trimiteri, detaliu/editare, Mapari, Integrare) folosesc ACELEASI + dimensiuni de text pentru acelasi rol (label, body, cifra) — verificabil prin tokeni. +- Cele 4 bug-uri din §3 (US-004..US-007) reproductibile inainte, ne-reproductibile dupa (teste lock). +- E2E browser: zero overflow orizontal, fonturi native incarcate (fara request la `/static/fonts/`). + +## 3. User Stories + +> Backend + UI pentru acelasi comportament = stories separate. `base.html` e fisier FIERBINTE +> (serializat — un singur autor pe val). Toate UI verificate pe un esantion de teme (o luminoasa + +> una intunecata) si pe 390/1280. + +### US-001: Fonturi standard web (system font stack) — eliminam IBM Plex self-hostat +**Ca** operator **vreau** fonturi web standard, lizibile, fara sa instalez nimic **pentru ca** vreau +text clar si uniform, fara dependente de fisiere de font. + +- **Depinde de**: — +- **Fisiere**: `app/web/templates/base.html` (`--font-ui`/`--font-mono` + `font-family` body), + `app/web/templates/landing.html` (sterge cele 9 `@font-face` IBM Plex + `font:... 'IBM Plex Sans'`), + `DESIGN.md` (sectiunea Tipografie rescrisa), `tests/test_tema.py` / `tests/test_web_responsive.py` + (~4 fisiere) +- **Test intai (RED)**: `test_font_stack_system_in_base`, `test_landing_fara_font_face_ibm_plex`, + `test_zero_referinte_static_fonts` +- **Acceptance criteria**: + - [ ] `base.html` defineste doi tokeni sursa-de-adevar in `:root`: + `--font-ui: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;` + si `--font-mono: ui-monospace, "SF Mono", "Cascadia Code", "Segoe UI Mono", "Roboto Mono", + Menlo, Consolas, monospace;`. `body` foloseste `var(--font-ui)`; codurile/VIN folosesc + `var(--font-mono)` prin clasa existenta (`.camp-mono`/`.slim-vin` etc.). + - [ ] `landing.html`: cele 9 reguli `@font-face` IBM Plex Sans/Mono ELIMINATE; toate aparitiile + `font: ... 'IBM Plex Sans'` / `'IBM Plex Mono'` inlocuite cu `var(--font-ui)` / `var(--font-mono)` + (sau un fallback explicit identic cu app-ul). Landing si app folosesc ACELASI stack. + - [ ] **Zero referinte la `/static/fonts/`** raman in template-uri (grep negativ in test). Fisierele + woff2 din `app/web/static/fonts/` pot ramane pe disc (curatare = follow-up optional, non-blocant), + dar nu mai sunt referite. + - [ ] Diacriticele romanesti (ă/â/î/ș/ț) se randeaza corect pe stack-ul nativ (acoperite de fonturile + de sistem — verificat vizual in E2E). + - [ ] `DESIGN.md` §Tipografie rescrisa: motiveaza system font stack (zero dependente runtime, + nativ pe fiecare OS), documenteaza cele doua stive, noteaza tradeoff-ul (aspect usor diferit + Windows/Mac/Linux) ca decizie acceptata de user. +- **Verificare E2E**: DevTools Network pe `/` si pe landing — niciun request catre `/static/fonts/`; + text lizibil pe Windows (Segoe UI) verificat de operator la deploy. + +### US-002: Scala tipografica uniforma (tokeni `--fs-*`) + carduri aerisite +**Ca** operator **vreau** dimensiuni de text uniforme si mai mari, fara text inghesuit **pentru ca** +azi fonturile sunt ad-hoc (10/11/13px) si difera de la pagina la pagina. + +- **Depinde de**: US-001 (acelasi val, `base.html`) +- **Fisiere**: `app/web/templates/base.html` (tokeni `--fs-*` + clasele slim/contor/camp consumandu-i), + `DESIGN.md`, `tests/test_web_responsive.py` (~3 fisiere) +- **Test intai (RED)**: `test_tokeni_scala_fs_definiti`, `test_componente_slim_folosesc_fs_tokeni`, + `test_fara_font_size_sub_12px_in_componente_noi` +- **Acceptance criteria**: + - [ ] `base.html` defineste o scala unica in `:root` (sursa de adevar): `--fs-xs:12px`, `--fs-sm:13.5px`, + `--fs-base:15px`, `--fs-md:16px`, `--fs-lg:18px`, `--fs-xl:20px`, `--fs-2xl:28px`, `--fs-3xl:34px` + (+ `--lh-tight`/`--lh-body`). Valorile finale pot fi ajustate la executie, dar DEFINITE ca tokeni. + Referinta vizuala: `docs/mockups/prd-5.16-fonturi-system-stack.html`. + - [ ] Componentele slim din 5.15 (`.contor-cifra`, `.contor-label`, `.contor-sub`, `.slim-vin`, + `.slim-meta`, `.camp-slim label/input`, `.chip`, `.op-row-name`, pill-uri) sunt RECABLATE pe + tokenii `--fs-*` (NU mai au px hardcodat sub 12px). Minim crestere fata de azi: + label-uri 11→13.5px, sub-linii 10→12px, cifra contor 22→28px, input 13→16px. + - [ ] **Carduri aerisite**: `.contor-card` si randurile slim cresc padding-ul (contor ~18px, + rand slim ~14px) ca textul mai mare sa nu para inghesuit; fara overflow pe 390px. + - [ ] **Contoare separate (NU inghesuite)**: statisticile "Trimise" se afiseaza ca **carduri + distincte** — `Total`, `Luna asta`, `Azi` fiecare cu eticheta proprie, pe langa `In coada` si + `De corectat` (5 in total). NU se mai inghesuie `luna`/`azi` ca sub-linie mono sub cifra "Total" + (asa cum era in 5.15/D4). Pe **desktop**: 5 carduri pe un rand, FARA titlu/eticheta de grup + deasupra (minimalist — userul nu vrea subtitlu de sectiune). Referinta: + `docs/mockups/prd-5.16-dashboard.html`. + **Nota**: REVIZUIESTE framing-ul D4/US-003 din 5.15 (cifra mare all-time + sub-linie `luna · azi`). + Sursa de timp/bucketare RO ramane cea din 5.15/US-003 (`sent_today`/`sent_month`, timp local RO + E7); doar PREZENTAREA se schimba. + - [ ] **Mobil: contoare COMPACTE (doar numere)**: pe 390px contoarele NU mai sunt 5 carduri mari, ci + o **bara compacta de statistici pe un singur rand** — cifra mare + eticheta scurta (`Total`/`Lună`/ + `Azi`/`Coadă`/`Corectat`), separatoare subtiri, inaltime mica, fara a ocupa jumatate de ecran. + Referinta: `docs/mockups/prd-5.16-dashboard-mobil.html`. + - [ ] **Ordine dashboard (compact, minimalist)**: pe Acasa, ordinea verticala e **(1) carduri-contor + → (2) import colapsat → (3) tab-uri Trimiteri/Mapari → (4) lista**. Indicatorul RAR online NU mai + ocupa o banda in corp — sta ca dot in antet (US-003). Tab-urile Trimiteri/Mapari stau imediat + deasupra listei (nu sub antet). Atat pe desktop cat si pe mobil. + - [ ] **Fara duplicare / fara subtitlu de sectiune**: numele service-ului apare DOAR in antet + (US-010), NU se mai repeta intr-un meta "Service Auto … · data" deasupra listei. Se ELIMINA + titlul de sectiune "Trimiteri RAR AUTOPASS" + linia meta de sub el (ocupau spatiu pe desktop si + mobil) — lista incepe direct sub tab-uri/filtre. + - [ ] `body` are `font-size:var(--fs-base)` si `line-height:var(--lh-body)` (azi implicit de browser). + - [ ] Zero regresie vizuala pe componentele existente non-slim (`.card/.pill/.act/.tabel-trimiteri`): + crestem unde e prea mic, fara a sparge layout-ul tabelului desktop. + - [ ] `DESIGN.md` §Tipografie + §Componente slim actualizat cu scala in tokeni. +- **Verificare E2E**: browser pe Acasa + Trimiteri + editare, esantion de teme + 390/1280 — text mai + mare, uniform, fara inghesuire, fara overflow. + +### US-003: RAR online — dot compact in antet (nu banda) + in meniul burger; banda DOAR cand e blocat +**Ca** operator **vreau** ca "RAR online" sa fie un dot mic in antet (cu data/ora pe hover) si in meniul +burger, NU o banda care ocupa un rand intreg **pentru ca** cand totul e ok nu vreau sa-mi fure spatiu — +dar cand e blocat trebuie sa fie imposibil de ratat. + +- **Depinde de**: US-002, US-011 (antet/selector tema) +- **Fisiere**: `app/web/templates/base.html` (antet + meniu burger), `app/web/templates/_status.html` + (banda doar pe blocat + dot), `app/web/routes.py` (context sanatate in layout, nu doar fragment), + `DESIGN.md`, `tests/test_web_status.py`, `tests/test_web_status_fragment.py` (~6 fisiere) +- **Test intai (RED)**: `test_rar_dot_in_antet_ok`, `test_rar_in_meniu_burger`, + `test_banda_apare_doar_cand_blocat`, `test_dot_title_datetime`, `test_blocat_text_accesibil` +- **Acceptance criteria**: + - [ ] **Stare OK (online)**: indicatorul RAR e un **dot/pill compact in antet**, langa selectorul de + tema (ex. dot verde + "RAR online"), stilat ca pill-ul "Live" din landing (`landing.html:117`). + Data/ora ultimei autentificari RAR apare pe **`title`/hover** (`title="Ultima autentificare RAR: + 28.06.2026 09:41"`), NU pe un rand separat. NU mai exista banda full-width in corpul paginii in + starea OK. Referinta: `docs/mockups/prd-5.16-dashboard.html`. + - [ ] **Si in meniul burger**: starea RAR (dot + "RAR online" + ora ultimei autentificari) apare ca + prima intrare in meniul de cont, pentru cazul in care antetul e ingust (mobil) — vezi + `docs/mockups/prd-5.16-dashboard-mobil.html`. + - [ ] **Stare BLOCAT (worker oprit / RAR inaccesibil)**: ATUNCI (si numai atunci) reapare **banda + rosie full-width**, loud, in corp ("Blocat: RAR inaccesibil — declaratiile NU pleaca"), iar + dot-ul din antet devine rosu. Invariant zero-silent-failures (D6/5.15) PASTRAT: blocajul e + imposibil de ratat; doar starea OK se comprima la un dot. + - [ ] **Accesibilitate**: sensul NU depinde de culoare — `title`/`aria-label` pe dot ("RAR online" / + "RAR blocat") + textul explicit al benzii pe blocat poarta sensul pentru screen-reader/daltonisti. + Se inlocuieste glifa bifa/X (`✓/✗`) cu dot + text. + - [ ] `DESIGN.md` §Header & branding + §Componente actualizat: dot de stare in antet + banda doar pe + blocat documentate. +- **Verificare E2E**: browser pe `/` — worker viu → dot verde in antet (+ in meniu), fara banda, ora pe + hover; worker oprit → dot rosu + banda rosie in corp; screen-reader confirma sensul fara culoare. + +### US-004: Bug — picker prestatii arata DENUMIREA, nu doar codul +**Ca** operator **vreau** sa vad denumirea operatiei/codului RAR cand aleg din picker **pentru ca** +nu imi dau seama ce e doar din cod (ex. "REV2"). + +- **Depinde de**: — (independent; UI-only in template chips) +- **Fisiere**: `app/web/templates/_chips_prestatii.html`, `tests/test_web_mapare_din_chip.py` SAU + `tests/test_web_corectie_prestatii.py` (~2 fisiere) +- **Test intai (RED)**: `test_picker_flat_arata_cod_si_denumire`, `test_picker_op_arata_denumire` +- **Acceptance criteria**: + - [ ] In **modul plat** (corectie pura, fara `op_service`), picker-ul `chips_add_cod_flat` + (`_chips_prestatii.html:146-148`) afiseaza `{{ cod }} — {{ nume_prestatie }}` pentru fiecare + optiune (azi arata DOAR `cod_prestatie`). Acelasi format ca modul operatii (`:101`). + - [ ] Optiunea placeholder ramane lizibila ("+ cod RAR" sau "— alege cod RAR —"); latimea + selectului creste cat sa incapa denumirea fara a sparge layout-ul chips. + - [ ] Consistenta: ORICE select de cod RAR din formularul de editare (plat + per-operatie) arata + cod + denumire. Niciun loc nu mai arata cod gol. +- **Verificare E2E**: editez o trimitere fara cod (corectie pura) → deschid picker-ul → optiunile arata + "FRN1 — Sistem de franare", nu doar "FRN1". + +### US-005: Bug — adaugare de operatii/coduri RAR suplimentare la editare +**Ca** operator **vreau** sa pot adauga ALTE operatii/coduri RAR pe o trimitere cu probleme **pentru ca** +azi, cand trimiterea are deja operatii, nu pot adauga un cod RAR in plus. + +- **Depinde de**: US-004 (acelasi template) +- **Fisiere**: `app/web/templates/_chips_prestatii.html`, `app/web/routes.py` (`post_form_chips`, + `routes.py:1867-1957` — actiune noua `add_extra`), `tests/test_web_corectie_prestatii.py` (~3 fisiere) +- **Test intai (RED)**: `test_adauga_cod_extra_in_mod_operatii`, `test_extra_cod_persistat_la_salvare`, + `test_extra_cod_validat_nomenclator` +- **Acceptance criteria**: + - [ ] In **modul operatii** (`_has_ops`), sub lista de operatii apare un control "**+ Adauga alta + operatie / cod RAR**" (picker cod+denumire + buton), care adauga un chip de cod RAR liber + (fara `op_service`) la lista — pe langa codurile per-operatie existente. Azi acest control + exista DOAR in modul plat; il aducem si in modul operatii. + - [ ] `post_form_chips` primeste o actiune noua (`chips_action=add_extra`) care valideaza codul fata + de nomenclator (invariant ORA-12899) si il adauga ca item `{cod_prestatie, cod_op_service:"", + denumire:""}`. Re-randeaza partial-ul chips. + - [ ] Codul extra adaugat SE PERSISTA la salvare: e emis ca hidden `cod_prestatie` (paralel cu + `chip_op_service`/`chip_denumire` goale) si cules de `post_corectie_trimitere` + (`routes.py:1334 getlist`). Lista finala `prestatii` contine si codurile per-operatie SI + codurile extra (dedup per-item E4 din 5.15 pastrat). + - [ ] Stergere simetrica: chip-ul extra are `×` (reuse `remove`/`remove_flat`). +- **Verificare E2E**: editez o trimitere cu o operatie mapata → adaug un cod RAR extra → salvez → + `prestatii` contine ambele coduri (verificat in detaliu / payload). + +### US-006: Bug — salvarea codului ales pe o trimitere fara cod nu facea nimic +**Ca** operator **vreau** ca atunci cand aleg un cod RAR si salvez, sa se aplice **pentru ca** azi, +la o trimitere care nu avea cod operatie, aleg codul dar la salvare nu se intampla nimic. + +- **Depinde de**: US-004, US-005 +- **Fisiere**: `app/web/templates/_chips_prestatii.html`, `app/web/routes.py` + (`post_corectie_trimitere` / `post_form_chips`), `tests/test_web_corectie_prestatii.py` (~3 fisiere) +- **Test intai (RED)**: `test_cod_ales_in_picker_se_salveaza_fara_buton_add`, + `test_salvare_fara_chip_explicit_nu_e_no_op` +- **Acceptance criteria**: + - [ ] **Reproducere (RED)**: o trimitere fara `cod_prestatie` (mod plat, ZERO chips). Userul alege + un cod in picker-ul `chips_add_cod_flat` si apasa direct "Salveaza" (FARA sa apese "+" intai). + Azi: `getlist("cod_prestatie")` e gol → submission ramane `needs_mapping` → "nu se intampla + nimic". Cauza confirmata: selectul `chips_add_cod_flat` NU e citit de `post_corectie_trimitere`. + - [ ] **Fix**: `post_corectie_trimitere` (si `/repune`, `/editeaza`) culeg si codul nesubmis din + picker (`chips_add_cod_flat` + `chips_add_cod_{i}` per-operatie) ca un add implicit la salvare, + SAU formularul promoveaza automat selectia in curs intr-un chip inainte de submit (progressive + enhancement JS + fallback server). Rezultat: codul ales se aplica chiar fara click pe "+". + Decizie de implementare (la executie): preferinta pe calea SERVER (citeste picker-ul la submit), + ca sa functioneze si fara JS — aliniat cu E6 server-driven din 5.15. + - [ ] Codul ales e validat fata de nomenclator; cod necunoscut → mesaj, nu trimitere raw. + - [ ] Nu rupe fluxul existent "+ apoi Salveaza" (ramane valid; nu se dubleaza codul — dedup per-item). +- **Verificare E2E**: editez o trimitere needs_mapping fara cod → aleg un cod in picker → Salveaza + (fara "+") → submission devine `queued` cu codul ales. + +### US-007: Bug — butonul Renunta/Anuleaza inchide formularul +**Ca** operator **vreau** ca butonul Renunta sa inchida modalul **pentru ca** azi nu il inchide si +raman blocat in formular. + +- **Depinde de**: — +- **Fisiere**: `app/web/templates/base.html` (handler `data-modal-close`, `base.html:1131-1133`), + `tests/test_web_corectie.py` SAU un test JS/markup nou (~2 fisiere) +- **Test intai (RED)**: `test_anuleaza_are_data_modal_close`, + `test_modal_close_pe_element_interior` (markup: butonul Anuleaza contine ``/icon → tinta de + click e copilul) +- **Acceptance criteria**: + - [ ] **Cauza confirmata**: handler-ul `overlay.addEventListener('click', ...)` (`base.html:1132`) + verifica `e.target.hasAttribute('data-modal-close')`. Butonul Anuleaza/Renunta + (`_form_editare.html:106`) are atributul pe `