From 5a964a1a8dd64eda97daf3e4c80cc2044a819eba Mon Sep 17 00:00:00 2001 From: Claude Agent Date: Thu, 25 Jun 2026 20:20:58 +0000 Subject: [PATCH] feat(5.10): UX trimiteri (pill filtre, paginare, editare) + Mapari in meniu + branding ROMFAST 14 stories TDD prin echipa de workeri (lead orchestreaza, 3 teammates pe valuri cu fisiere disjuncte; routes.py + base.html serializate ca fisiere fierbinti). - US-001 fix filtrare data (_iso_date_prefix pe garda+comparatie, prinde timestamp cu ora) - US-002/007 operatie service distincta in payload_view + afisare in detaliu - US-003 pill-uri categorii (button/aria-pressed; needs_mapping --warn, needs_data/error --err); fara lista ID-uri/dropdown - US-004 paginare numerotata 25/pag (total ramificat SQL-COUNT vs fetch-all+slice, clamp page, poll pastreaza pagina) - US-005 VIN block-level sub nr - US-006/006b editare cod RAR + validare nomenclator + recalcul idempotency (needs_data/needs_mapping via /corecteaza, error via /repune) - US-008 card eroare 3-niveluri doar pe read-only + rezumat top-of-form - US-009 Mapari in meniu hamburger; scoatere tab-bar + role=tablist orfan - US-010/011 pagina Mapari consolidata + butoane icon SVG + dirty-state (fara kebab/emoji) - US-012/012b header centrat + logo ROMFAST (/static/romfast_logo.png) in header - US-013 paleta azur ROMFAST (#2E74D6/#1F66C9) + IBM Plex Sans/Mono self-host (woff2 reale) - US-014 selector tema ciclic Light/Dark/Petrol/Auto + anti-FOUC pe 4 stari Backend trimitere (worker/masina stari/idempotenta/mapping) + schema NEATINSE (UI/UX pur + 1 fix de filtrare). VERIFY context curat PASS; /code-review high: 1 finding material reparat (US-006b). Regresie 896 passed, 1 skipped, 0 failed. Co-Authored-By: Claude Opus 4.8 (1M context) --- DESIGN.md | 150 ++++++ app/payload_view.py | 13 + app/web/routes.py | 354 ++++++++++---- .../fonts/IBMPlexMono-Regular-latin-ext.woff2 | Bin 0 -> 13272 bytes .../fonts/IBMPlexMono-Regular-latin.woff2 | Bin 0 -> 14812 bytes .../fonts/IBMPlexSans-Bold-latin-ext.woff2 | Bin 0 -> 15872 bytes .../static/fonts/IBMPlexSans-Bold-latin.woff2 | Bin 0 -> 19440 bytes .../fonts/IBMPlexSans-Medium-latin-ext.woff2 | Bin 0 -> 15996 bytes .../fonts/IBMPlexSans-Medium-latin.woff2 | Bin 0 -> 20064 bytes .../fonts/IBMPlexSans-Regular-latin-ext.woff2 | Bin 0 -> 15724 bytes .../fonts/IBMPlexSans-Regular-latin.woff2 | Bin 0 -> 19156 bytes app/web/static/romfast_logo.png | Bin 0 -> 26884 bytes app/web/templates/_coada.html | 22 +- app/web/templates/_mapari.html | 196 ++++---- app/web/templates/_status.html | 81 ++-- app/web/templates/_submissions.html | 109 ++++- app/web/templates/_trimitere_detaliu.html | 68 ++- app/web/templates/base.html | 216 +++++++-- app/web/templates/dashboard.html | 83 +--- docs/ROADMAP.md | 3 +- ...10-ux-filtre-pill-paginare-mapari-meniu.md | 430 ++++++++++++++++++ docs/romfast_logo.png | Bin 0 -> 26884 bytes tests/test_acasa_trimiteri.py | 8 +- tests/test_payload_view.py | 66 +++ tests/test_tema.py | 8 +- tests/test_web_badge.py | 14 +- tests/test_web_dashboard.py | 4 +- tests/test_web_detaliu_eroare_simpla.py | 207 +++++++++ tests/test_web_detaliu_op_service.py | 191 ++++++++ tests/test_web_editare_op_rar.py | 359 +++++++++++++++ tests/test_web_filtre_submissions.py | 148 ++++++ tests/test_web_header_branding.py | 175 +++++++ tests/test_web_mapari_actiuni.py | 141 ++++++ tests/test_web_mapari_layout.py | 135 ++++++ tests/test_web_mapari_meniu.py | 150 ++++++ tests/test_web_paginare_submissions.py | 182 ++++++++ tests/test_web_pill_filtre.py | 172 +++++++ tests/test_web_selector_tema.py | 163 +++++++ tests/test_web_status_fragment.py | 44 +- tests/test_web_submissions_layout.py | 151 ++++++ tests/test_web_tabs.py | 59 ++- tests/test_web_tema_culori.py | 256 +++++++++++ tests/test_web_uniformizare.py | 5 +- 43 files changed, 3949 insertions(+), 414 deletions(-) create mode 100644 DESIGN.md create mode 100644 app/web/static/fonts/IBMPlexMono-Regular-latin-ext.woff2 create mode 100644 app/web/static/fonts/IBMPlexMono-Regular-latin.woff2 create mode 100644 app/web/static/fonts/IBMPlexSans-Bold-latin-ext.woff2 create mode 100644 app/web/static/fonts/IBMPlexSans-Bold-latin.woff2 create mode 100644 app/web/static/fonts/IBMPlexSans-Medium-latin-ext.woff2 create mode 100644 app/web/static/fonts/IBMPlexSans-Medium-latin.woff2 create mode 100644 app/web/static/fonts/IBMPlexSans-Regular-latin-ext.woff2 create mode 100644 app/web/static/fonts/IBMPlexSans-Regular-latin.woff2 create mode 100644 app/web/static/romfast_logo.png create mode 100644 docs/prd/prd-5.10-ux-filtre-pill-paginare-mapari-meniu.md create mode 100644 docs/romfast_logo.png create mode 100644 tests/test_web_detaliu_eroare_simpla.py create mode 100644 tests/test_web_detaliu_op_service.py create mode 100644 tests/test_web_editare_op_rar.py create mode 100644 tests/test_web_filtre_submissions.py create mode 100644 tests/test_web_header_branding.py create mode 100644 tests/test_web_mapari_actiuni.py create mode 100644 tests/test_web_mapari_layout.py create mode 100644 tests/test_web_mapari_meniu.py create mode 100644 tests/test_web_paginare_submissions.py create mode 100644 tests/test_web_pill_filtre.py create mode 100644 tests/test_web_selector_tema.py create mode 100644 tests/test_web_submissions_layout.py create mode 100644 tests/test_web_tema_culori.py diff --git a/DESIGN.md b/DESIGN.md new file mode 100644 index 0000000..bd34ec8 --- /dev/null +++ b/DESIGN.md @@ -0,0 +1,150 @@ +# DESIGN.md — Sistem de design AutoPass (by ROMFAST) + +> Sursa de adevar pentru identitatea vizuala a dashboard-ului. Implementarea concreta sta in +> `app/web/templates/base.html` (variabile CSS `:root` + `[data-theme="light"]`). Acest fisier +> spune *ce* si *de ce*; base.html spune *cum*. + +## Lucrul de retinut + +> „Software serios pentru o obligatie legala serioasa — dar parte din familia ROMFAST/ROA, nu un +> tool anonim." Operatorul de service trebuie sa simta ca declara la stat printr-un instrument de +> incredere, cu identitatea producatorului (ROMFAST) prezenta discret, nu griul generic de azi. + +## Context produs + +Gateway web care declara prezentari de service-auto la RAR AUTOPASS (L.142/2023). Utilizatori: +operatori de service-auto si integratori ROAAUTO. Face parte din familia **ROA — Romfast +Applications** (ERP romanesc, modul Service Auto). Referinta de brand: **romfast.ro** — alb curat, +accent albastru azur, pill-uri rotunjite, comutator de tema, logo rosu+albastru. + +## Decizie cromatica + +Accentul functional = **albastrul ROMFAST** (acelasi cu „FAST" din logo si cu accentul de pe +romfast.ro), nu albastrul generic SaaS de pana acum. Rosul apare DOAR in wordmark-ul „ROM" — nu ca +accent de UI, fiindca rosul e rezervat starilor de eroare. Un singur accent, restul neutre, ca +sistemul sa ramana discret. + +### Paleta — Dark (default) + +``` +--bg: #0f1218 fundal aplicatie +--card: #181c24 suprafete (carduri, modal, inputuri pe fundal) +--ink: #e6e9ef text principal +--muted: #8b93a7 text secundar (label-uri, coduri, „by") +--line: #262b36 borduri, separatoare +--accent:#2E74D6 azur ROMFAST — butoane primare, pill activ, linkuri, focus +--ok: #2FBF8F sent / succes +--warn: #E0A93B sending / atentie / Lipsa cod +--err: #E05D5D error / needs_data / Date incomplete +``` + +### Paleta — Light (`[data-theme="light"]`) + +``` +--bg: #f5f7fa fundal (alb-rece ca romfast.ro) +--card: #ffffff suprafete +--ink: #1a1d24 text principal +--muted: #5c6473 text secundar +--line: #e2e5ea borduri +--accent:#1F66C9 azur, variantă mai inchisa pentru contrast AA pe alb +--ok: #15803d verde AA pe alb +--warn: #b45309 chihlimbar AA pe alb +--err: #dc2626 rosu AA pe alb +``` + +### Paleta — Petrol (`[data-theme="petrol"]`, tema selectabila) + +Tema intunecata alternativa, cu accent petrol-teal (directia initiala aleasa, pastrata ca optiune). +Aceleasi neutre-calde inchise; doar accentul difera de azur. + +``` +--bg: #0e1416 fundal petrol-inchis +--card: #161e20 suprafete +--ink: #e6e9ef text principal +--muted: #8b93a7 text secundar +--line: #232c2e borduri +--accent:#0E7C7B teal petrol — butoane, pill activ, linkuri, focus +--ok: #2FBF8F sent +--warn: #E0A93B atentie +--err: #E05D5D eroare +``` + +### Culori de brand (doar wordmark, NU variabile de UI) + +``` +ROM: #D1342F rosu logo +FAST: #2E74D6 albastru logo (= accentul de UI in dark) +``` + +Contrast: textul principal pe fundal ramane AA in ambele teme; accentul pe alb foloseste varianta +mai inchisa (`#1F66C9`) ca text/linkul sa treaca AA. + +## Tipografie + +- **UI / titluri**: **IBM Plex Sans** — sans-serif cu caracter ingineresc, open-source, potrivit + pentru „software serios", parte din limbajul vizual tehnic. Fallback: `system-ui, sans-serif`. +- **Coduri / monospace**: **IBM Plex Mono** — pentru coduri RAR (REV2), VIN, numar inmatriculare, + detalii tehnice. Inlocuieste `ui-monospace/Menlo` actual cu o familie coerenta cu UI-ul. +- **Incarcare**: self-host `woff2` (subset latin + latin-ext pentru diacritice romanesti) in + `app/web/static/fonts/`, `font-display: swap`. Fara CDN extern (gateway intern, fara dependente + de retea la runtime). Pana la self-host, fallback la stiva de sistem nu strica layout-ul. + +## Header & branding + +- Titlul „Gateway RAR AUTOPASS" **centrat** pe header. +- Sub titlu, mic: **logo-ul ROMFAST** (`/static/romfast_logo.png`, ~28px inaltime). Decizie user + (2026-06-25, US-012b): se foloseste PNG-ul real al logo-ului (ROM rosu + FAST albastru, fundal + transparent — lizibil pe light/dark/petrol), NU wordmark-ul text. Wordmark-ul text (`by ROM FAST` + cu `ROM #D1342F` / `FAST #2E74D6`) ramane documentat ca alternativa, dar livrabila finala + foloseste imaginea. +- Controalele (comutator tema, versiune, hamburger ☰) raman la **dreapta**, fara a strica + centrarea optica a titlului (ex. grila 3 coloane: stanga goala/echilibru, centru titlu, dreapta + controale). +- Responsiv: pe mobil, wordmark-ul ramane sub titlu; controalele nu se suprapun (degrada elegant, + eventual titlu mai mic). + +## Selector de tema + +Inlocuieste comutatorul binar soare/luna cu un **buton ciclic** (pattern ca demoanaf.ro): un +singur buton care roteste la fiecare click prin setul de teme, cu iconita + tooltip/`aria-label` +care arata tema curenta („Tema: Light" etc.). + +Ordinea ciclului: **Light → Dark → Petrol → Auto → (inapoi la Light)**. + +- `Light` → `data-theme="light"` (azur pe alb) +- `Dark` → `data-theme="dark"` (azur pe inchis, comportamentul implicit actual) +- `Petrol` → `data-theme="petrol"` (teal pe petrol-inchis) +- `Auto` → urmeaza `prefers-color-scheme`; rezolva la Light azur sau Dark azur in functie de OS + (nu seteaza `data-theme` fix, ci il deriva la paint). + +Persistenta: preferinta explicita (inclusiv „Auto") in `localStorage`, doar la click. Scriptul +anti-FOUC din `` trebuie sa rezolve „Auto"→light/dark inainte de primul paint (fara blink). +Iconite: ☀ Light, ☾ Dark, ◐ Petrol, ◉ Auto. Default la prima vizita = Auto (OS-aware), ca azi. + +## Componente — note de aplicare + +- **Pill-uri de stare/filtru**: rotunjite (`border-radius:99px`), ca badge-ul „ROA" de pe + romfast.ro. Pill activ = fundal accent discret (`color-mix(in srgb, var(--accent) ...)`), text + pe accent. Categoriile de problema isi pastreaza registrul: Date incomplete/Eroare = `--err`, + Lipsa cod = `--warn`. +- **Butoane primare**: fundal `--accent`, text alb (neschimbat ca structura, doar culoarea noua). +- **Linkuri / sugestii**: `--accent`. +- **Focus**: `outline:2px solid var(--accent)` (deja folosit pe randuri). +- **Suprafete de stare** (banner, flash, eroare-3n): raman pe `color-mix` peste `--err/--warn/--ok`, + deci se adapteaza automat la noua paleta si la light/dark. + +## Ce NU schimbam + +- Mecanismul light/dark existent (anti-FOUC, persistenta `localStorage`, comutator) — il pastram, + doar reimprospatam variabilele. +- Nu introducem rosu ca accent de UI (conflict cu eroare). +- ~~Nu folosim PNG-ul logo cu efect 3D in interfata (wordmark redat ca text).~~ REVIZUIT + (decizie user 2026-06-25): logo-ul PNG real e folosit in header (US-012b). Fundal transparent + + culori proprii il fac lizibil pe toate temele; nu aplicam filtre. +- Nu adaugam un al doilea accent — sistemul ramane monocrom-accent + neutre. + +## Legatura cu implementarea (PRD 5.10) + +US-012 (header „by ROMFAST" + titlu centrat) si US-013 (paleta) din +`docs/prd/prd-5.10-ux-filtre-pill-paginare-mapari-meniu.md` implementeaza acest sistem. Valorile de +mai sus sunt sursa pentru variabilele din `base.html`. diff --git a/app/payload_view.py b/app/payload_view.py index 592c090..403f720 100644 --- a/app/payload_view.py +++ b/app/payload_view.py @@ -115,6 +115,16 @@ def prezentare_din_payload(payload: str | dict | None) -> dict[str, str]: # cod_rar: exclusiv din cod_prestatie (NU fallback la cod_op_service); uppercase + strip ".0" cod_rar = _clean_cod_rar(item.get("cod_prestatie")) + # US-002: operatia de service originala (codul intern + denumire venita prin API/import), + # distincta de operatia RAR mapata (cod_rar). + # Conventie goala: aceste campuri NOI intorc "" (string gol) cand lipsesc — NU EMPTY="—". + # Motivul: US-007 decide sa nu afiseze randul deloc (vs afisaj gol), testând `!= ""`. + # Campurile vechi (vehicul_nr, vin, operatie etc.) pastreaza conventia EMPTY="—". + op_service_cod = _clean_str(item.get("cod_op_service")) + # op_service_denumire e relevant doar cand exista un cod de operatie de service; + # altfel ar expune denumirea RAR drept op. de service, ceea ce e semantic incorect. + op_service_denumire = _clean_str(item.get("denumire")) if op_service_cod else "" + return { "vehicul_nr": nr or EMPTY, "vin": vin or EMPTY, @@ -124,4 +134,7 @@ def prezentare_din_payload(payload: str | dict | None) -> dict[str, str]: "odometru": odo or EMPTY, "cod": cod or EMPTY, "cod_rar": cod_rar or EMPTY, + # US-002: chei noi cu conventie goala "" (nu EMPTY) — vezi comentariu de mai sus + "op_service_cod": op_service_cod, + "op_service_denumire": op_service_denumire, } diff --git a/app/web/routes.py b/app/web/routes.py index df4678a..d2a16c8 100644 --- a/app/web/routes.py +++ b/app/web/routes.py @@ -13,6 +13,7 @@ from __future__ import annotations import hashlib import json +import math import sqlite3 from datetime import datetime, timezone from pathlib import Path @@ -555,43 +556,26 @@ def _blocate_defalcat(counts: dict[str, int]) -> list[tuple]: return rezultat -# Cate randuri blocate identificam nominal sub fiecare categorie din banner (US-014). -_BLOCATE_SAMPLE = 3 +def _pills_categorii(counts: dict[str, int]) -> list[dict]: + """Pill-uri pentru starile cu problema (US-003 PRD 5.10). - -def _blocate_actionabil(conn, account_id: int) -> list[dict]: - """Categorii blocate cu identificatorii primelor randuri + deep-link (US-014). - - Pentru fiecare stare blocata cu n>0: eticheta umana, contorul, primii N identificatori - (VIN partial + nr inmatriculare + #id — PII doar partial, ca jurnalul) si cati raman. - Scoped pe cont (regula NULL->1). Lista goala -> banner-ul nu se randeaza (se stinge). + Inlocuieste _blocate_actionabil (care incarca PII/VIN per rand). + Reutilizeaza contoarele deja calculate din _status_counts. + Returneza lista goala daca nu exista nicio stare blocata. """ - from ..security import vin_partial - scope_sql, scope_params = account_scope_clause(account_id) - out: list[dict] = [] - for status in ("needs_mapping", "needs_data", "error"): - rows = conn.execute( - f"SELECT id, payload_json FROM submissions WHERE {scope_sql} AND status=? ORDER BY id DESC", - scope_params + [status], - ).fetchall() - if not rows: - continue - sample = [] - for r in rows[:_BLOCATE_SAMPLE]: - prez = prezentare_din_payload(r["payload_json"]) - sample.append({ - "id": r["id"], - "vin": vin_partial(prez.get("vin") or ""), - "nr": prez.get("vehicul_nr") or "", - }) - out.append({ - "status": status, - "eticheta": eticheta_stare(status), - "n": len(rows), - "randuri": sample, - "rest": max(0, len(rows) - len(sample)), - }) - return out + # DESIGN.md §Componente: Lipsa cod = --warn (chihlimbar), celelalte categorii = --err (rosu). + # Culoarea e CSS variable name (nu clasa), injectata direct in style tag al pill-ului, + # pentru ca s-needs_mapping in base.html e tot --err (incorect pentru pill). + PILL_DEFS = [ + ("needs_mapping", "Lipsa cod", "--warn"), + ("needs_data", "Date incomplete", "--err"), + ("error", "Eroare", "--err"), + ] + return [ + {"status": status, "label": label, "color_var": color_var, "n": counts.get(status, 0)} + for status, label, color_var in PILL_DEFS + if counts.get(status, 0) > 0 + ] @router.get("/_fragments/status", response_class=HTMLResponse) @@ -630,23 +614,31 @@ def fragment_status(request: Request) -> HTMLResponse: "counts_sent": counts.get("sent", 0), "blocate_total": blocate_total, "blocate_defalcat": _blocate_defalcat(counts), - "blocate_actionabil": _blocate_actionabil(conn, account_id), + "pills_categorii": _pills_categorii(counts), "account_active": _account_active(conn, account_id), }) finally: conn.close() -def _is_iso_date(value: object) -> bool: - """True daca `value` e o data ISO YYYY-MM-DD (comparabila lexicografic corect).""" +def _iso_date_prefix(value: object) -> str | None: + """Intoarce primele 10 caractere (YYYY-MM-DD) daca incep cu o data ISO valida, altfel None. + + Permite filtrarea dupa data_prestatie chiar daca valoarea contine ora/minut/secunda + (ex. '2026-06-20 14:35:07' sau '2026-06-20T14:35:07') — extrage portiunea de data + fara a exclude timestamp-urile (bug-ul fix US-001: _is_iso_date cerea len==10). + Valori care nu incep cu o data ISO valida (ex. '05.12.2024') intorc None si + sunt excluse din filtru — comportament actual pastrat. + """ s = str(value or "").strip() - if len(s) != 10: - return False + if len(s) < 10: + return None + prefix = s[:10] try: - datetime.strptime(s, "%Y-%m-%d") - return True + datetime.strptime(prefix, "%Y-%m-%d") + return prefix except (ValueError, TypeError): - return False + return None # Stari care semnaleaza o problema ce necesita atentia operatorului. Eticheta umana @@ -693,6 +685,9 @@ def _submission_row_view(r) -> dict: } +_PAGE_SIZE = 25 # Marime pagina fixa (US-004 PRD 5.10) + + @router.get("/_fragments/submissions", response_class=HTMLResponse) def fragment_submissions( request: Request, @@ -700,12 +695,14 @@ def fragment_submissions( vehicul: str | None = None, data_de: str | None = None, data_pana: str | None = None, + page: int = 1, ) -> HTMLResponse: - """Tabel Trimiteri, scoped pe cont, cu filtre optionale (US-009). + """Tabel Trimiteri, scoped pe cont, cu filtre optionale si paginare (US-009, US-004). - Filtrarea pe stare se face in SQL (foloseste idx_submissions_account_status); - filtrarea pe vehicul (nr/VIN, case-insensitive) si pe interval data_prestatie - se face dupa parsarea payload_json in Python (plafon perf notat — eng review). + US-004 H1: totalul se calculeaza DIFERIT dupa tipul de filtru: + - FARA filtru Python (status-only / niciun filtru): SQL COUNT(*) + LIMIT/OFFSET + - CU filtru vehicul/data activ: fetch-all -> filtreaza Python -> total=len -> slice + SQL COUNT/LIMIT pe calea cu filtru Python ar da total gresit (taie inainte de filtru). """ account_id = require_login(request) status = (status or "").strip() or None @@ -713,6 +710,9 @@ def fragment_submissions( data_de = (data_de or "").strip() or None data_pana = (data_pana or "").strip() or None filtru_activ = bool(status or vehicul_q or data_de or data_pana) + filtru_python = bool(vehicul_q or data_de or data_pana) # filtru care necesita Python + + page = max(1, page) # pre-clamp >= 1 conn = get_connection() try: @@ -722,45 +722,79 @@ def fragment_submissions( if status: where.append("status=?") params.append(status) - # Filtrarea pe vehicul/data se face in Python (dupa parsarea payload). Daca am - # taia la LIMIT inainte de filtru, am rata silentios randuri mai vechi care - # potrivesc. Cand un filtru text/data e activ, scoatem LIMIT-ul din SQL si plafonam - # afisarea dupa filtrare (OK la scara actuala — plafon perf notat, eng review). - limit_sql = "" if (vehicul_q or data_de or data_pana) else " LIMIT 200" - rows = conn.execute( - "SELECT id, status, id_prezentare, rar_status_code, rar_error, retry_count, " - "updated_at, payload_json FROM submissions " - f"WHERE {' AND '.join(where)} ORDER BY id DESC{limit_sql}", - params, - ).fetchall() + where_sql = " AND ".join(where) - view = [] - for r in rows: - v = _submission_row_view(r) - prez = v["prez"] - if vehicul_q: - hay = f"{prez['vehicul_nr']} {prez['vin']}".upper() - if vehicul_q not in hay: - continue - if data_de or data_pana: - d = prez["data_prestatie"] - # Comparam doar date in format ISO (YYYY-MM-DD); altfel comparatia de string - # ar fi gresita (ex. "05.12.2024"). Valori ne-ISO sunt excluse din filtru. - if not _is_iso_date(d): - continue - if data_de and d < data_de: - continue - if data_pana and d > data_pana: - continue - view.append(v) - if len(view) >= 200: - break + if filtru_python: + # Calea B: fetch-all, filtreaza in Python, slice (US-004 H1) + # FARA LIMIT — altfel paginile >8 ar disparea silentios (bug PRD H1) + rows_db = conn.execute( + "SELECT id, status, id_prezentare, rar_status_code, rar_error, retry_count, " + f"updated_at, payload_json FROM submissions WHERE {where_sql} ORDER BY id DESC", + params, + ).fetchall() + + view_all: list[dict] = [] + for r in rows_db: + v = _submission_row_view(r) + prez = v["prez"] + if vehicul_q: + hay = f"{prez['vehicul_nr']} {prez['vin']}".upper() + if vehicul_q not in hay: + continue + if data_de or data_pana: + # Extragem portiunea YYYY-MM-DD (US-001 fix). + d_prefix = _iso_date_prefix(prez["data_prestatie"]) + if d_prefix is None: + continue + if data_de and d_prefix < data_de: + continue + if data_pana and d_prefix > data_pana: + continue + view_all.append(v) + + total = len(view_all) + pages = max(1, math.ceil(total / _PAGE_SIZE)) if total > 0 else 1 + page = max(1, min(page, pages)) # clamp H2 + offset = (page - 1) * _PAGE_SIZE + view = view_all[offset:offset + _PAGE_SIZE] + + else: + # Calea A: SQL COUNT(*) + LIMIT/OFFSET (eficient, fara filtru Python activ) + total = conn.execute( + f"SELECT COUNT(*) FROM submissions WHERE {where_sql}", params + ).fetchone()[0] + + pages = max(1, math.ceil(total / _PAGE_SIZE)) if total > 0 else 1 + page = max(1, min(page, pages)) # clamp H2 + offset = (page - 1) * _PAGE_SIZE + + rows_db = conn.execute( + "SELECT id, status, id_prezentare, rar_status_code, rar_error, retry_count, " + f"updated_at, payload_json FROM submissions WHERE {where_sql} ORDER BY id DESC " + "LIMIT ? OFFSET ?", + params + [_PAGE_SIZE, offset], + ).fetchall() + view = [_submission_row_view(r) for r in rows_db] + + page_start = (page - 1) * _PAGE_SIZE + 1 if total > 0 else 0 + page_end = min(page * _PAGE_SIZE, total) return templates.TemplateResponse("_submissions.html", { "request": request, "rows": view, "filtru_activ": filtru_activ, "csrf_token": get_csrf_token(request), + # Paginare (US-004) + "total": total, + "page": page, + "pages": pages, + "page_start": page_start, + "page_end": page_end, + # Filtre curente pentru linkurile de paginare (pastreaza filtrele, H2) + "f_status": status or "", + "f_vehicul": vehicul_q or "", + "f_data_de": data_de or "", + "f_data_pana": data_pana or "", }) finally: conn.close() @@ -768,6 +802,9 @@ def fragment_submissions( # Stari ne-trimise blocate pe care le putem corecta inline (US-010). _CORECTABILE = ("needs_data", "needs_mapping") +# US-006b: stari cu select editabil cod_prestatie (superset al _CORECTABILE: error +# primeste select in formularul /repune, nu in /corecteaza — fara schimbare de vehicle fields). +_EDITABILE_OP = ("needs_data", "needs_mapping", "error") # Stari gestionabile prin lifecycle web (US-011): sterge / re-pune in coada. _GESTIONABILE_WEB = ("error", "needs_data", "needs_mapping") @@ -851,12 +888,31 @@ def _detaliu_ctx(request: Request, row, *, message: str | None = None, eticheta = eticheta_stare(row["status"]) nemapate_inline: list[dict] = [] nomenclator: list[dict] = [] + # Variabila interna: nomenclatorul complet (incarcat pentru needs_mapping, refolosit pt US-006) + _nomenclator_complet: list[dict] = [] if conn is not None and row["status"] == "needs_mapping": # Un singur SELECT pe nomenclator: il refolosim si pentru sugestii si pentru dropdown. - nomenclator = load_nomenclator(conn) - nemapate_inline = _nemapate_pentru_submission(row, nomenclator) - if not nemapate_inline: - nomenclator = [] # nu expunem dropdown-ul cand nu exista operatii de mapat + _nomenclator_complet = load_nomenclator(conn) + nemapate_inline = _nemapate_pentru_submission(row, _nomenclator_complet) + nomenclator = _nomenclator_complet if nemapate_inline else [] + + # US-006/US-006b: nomenclator pentru selectul cod_prestatie — needs_data/needs_mapping (in + # formularul /corecteaza) + error (in formularul /repune). Refoloseste _nomenclator_complet + # daca e deja incarcat (needs_mapping), altfel incarca fresh. + nomenclator_rar: list[dict] = [] + if conn is not None and row["status"] in _EDITABILE_OP: + nomenclator_rar = _nomenclator_complet if _nomenclator_complet else load_nomenclator(conn) + + # US-006: cod_prestatie curent din prima prestatie (pentru pre-selectare in select) + cod_prestatie_curent = "" + try: + _pd = json.loads(row["payload_json"] or "{}") + _prestatii = (_pd.get("prestatii") or []) if isinstance(_pd, dict) else [] + if _prestatii and isinstance(_prestatii[0], dict): + cod_prestatie_curent = (_prestatii[0].get("cod_prestatie") or "").strip().upper() + except (ValueError, TypeError): + pass + ctx = { "request": request, "csrf_token": get_csrf_token(request), @@ -882,6 +938,9 @@ def _detaliu_ctx(request: Request, row, *, message: str | None = None, # PRD 5.7: mapare inline (operatii nemapate ale acestui rand + nomenclator) "nemapate_inline": nemapate_inline, "nomenclator": nomenclator, + # US-006: select cod_prestatie pentru stari editabile + "nomenclator_rar": nomenclator_rar, + "cod_prestatie_curent": cod_prestatie_curent, "corectie_msg": message, "corectie_error": error, "corectie_errors": corectie_errors or [], @@ -1011,6 +1070,31 @@ async def post_corectie_trimitere(request: Request, submission_id: int) -> HTMLR if isinstance(val, str) and val.strip() != "": content[camp] = val.strip() + # US-006: injectare cod_prestatie din form INAINTE de resolve_prestatii. + # Oglindeste validarea din post_mapeaza_inline (nomenclator check). Codul nou + # e injectat in prima prestatie (index 0); build_key il include in hash (CLAUDE.md + # invariant "build_key hashuieste cod_prestatie, idempotency.py:34"). + _cod_raw = form.get("cod_prestatie") + cod_prestatie_form = (_cod_raw.strip().upper() if isinstance(_cod_raw, str) else "") + if cod_prestatie_form: + exists_nom = conn.execute( + "SELECT 1 FROM nomenclator_rar WHERE cod_prestatie=?", (cod_prestatie_form,) + ).fetchone() + if not exists_nom: + return templates.TemplateResponse( + "_trimitere_detaliu.html", + _detaliu_ctx( + request, row, conn=conn, account_id=account_id, error=True, + message=f"Cod RAR necunoscut in nomenclator: {cod_prestatie_form}. " + "Alege un cod valid din lista.", + ), + ) + prestatii_form = content.get("prestatii") + if isinstance(prestatii_form, list) and prestatii_form: + p0 = dict(prestatii_form[0]) + p0["cod_prestatie"] = cod_prestatie_form + content["prestatii"] = [p0] + list(prestatii_form[1:]) + # Re-rezolva prestatiile cu maparea curenta (ca reresolve_account): NU re-pune # niciodata in coada un cod nemapat (codPrestatie null) — FINALIZATA e ireversibil # la RAR. Corectia campurilor de continut nu poate deebloca o operatie nemapata. @@ -1133,14 +1217,114 @@ async def post_corectie_trimitere(request: Request, submission_id: int) -> HTMLR async def post_repune_trimitere(request: Request, submission_id: int) -> HTMLResponse: """Re-pune in coada un rand blocat (error/needs_data/needs_mapping) din dashboard. - Scoped pe sesiune (404 cross-account/inexistent, 409 sent/sending). Re-randeaza - panoul de detaliu cu starea noua + nudge `trimiteriChanged` pentru lista. + US-006b: daca randul e in starea `error` si formularul contine `cod_prestatie`, + actualizeaza codul in payload, recalculeaza cheia de idempotency si re-pun in coada + direct (fara `requeue_submission`, care nu actualizeaza cheia). Scoped pe sesiune + (404 cross-account/inexistent, 409 sent/sending). Re-randeaza panoul de detaliu cu + starea noua + nudge `trimiteriChanged` pentru lista. """ account_id = require_login(request) form = await request.form() verify_csrf(request, str(form.get("csrf_token") or "")) conn = get_connection() try: + # US-006b: prelucrare cod_prestatie pentru starea error (inaintea requeue_submission + # standard, care nu actualizeaza cheia de idempotency). + _cod_raw = form.get("cod_prestatie") + cod_prestatie_form = (_cod_raw.strip().upper() if isinstance(_cod_raw, str) else "") + + if cod_prestatie_form: + row = _fetch_submission_scoped(conn, account_id, submission_id) + if not row: + raise HTTPException(status_code=404, detail="trimitere inexistenta") + if row["status"] != "error": + # cod_prestatie acceptat DOAR pentru starea error prin /repune + raise HTTPException( + status_code=409, + detail="modificarea cod_prestatie prin repune e valida doar pentru starea error", + ) + # Valideaza cod-ul fata de nomenclator + exists_nom = conn.execute( + "SELECT 1 FROM nomenclator_rar WHERE cod_prestatie=?", (cod_prestatie_form,) + ).fetchone() + if not exists_nom: + return templates.TemplateResponse( + "_trimitere_detaliu.html", + _detaliu_ctx( + request, row, conn=conn, account_id=account_id, + error=True, + message=f"Cod RAR necunoscut: {cod_prestatie_form}. Alege un cod valid.", + ), + ) + # Parseaza payload si injecteaza cod_prestatie + try: + content = json.loads(row["payload_json"]) if row["payload_json"] else {} + if not isinstance(content, dict): + content = {} + except (ValueError, TypeError): + content = {} + prestatii = content.get("prestatii") or [] + if isinstance(prestatii, list) and prestatii: + p0 = dict(prestatii[0]) + p0["cod_prestatie"] = cod_prestatie_form + # sterge cod_op_service/denumire daca exista (codul direct preia prioritate) + p0.pop("cod_op_service", None) + content["prestatii"] = [p0] + list(prestatii[1:]) + # Re-rezolva prestatii cu noul cod + mapping_meta = load_mapping_meta(conn, account_id) + mapping = {op: m["cod_prestatie"] for op, m in mapping_meta.items()} + valid_codes = load_nomenclator_codes(conn) or None + text_rules = load_text_rules(conn, account_id) + resolved, _unmapped = resolve_prestatii(content.get("prestatii"), mapping, valid_codes, text_rules) + content["prestatii"] = resolved + # Canonicalize + rebuild idempotency key + canon = canonicalize_row(content) + payload_json = json.dumps(content, ensure_ascii=False) + new_key = build_key(account_id, canon) + # Verifica coliziune (numai daca cheia s-a schimbat) + if new_key != row["idempotency_key"]: + dup = conn.execute( + "SELECT id FROM submissions WHERE idempotency_key=? AND id<>?", + (new_key, row["id"]), + ).fetchone() + if dup: + return templates.TemplateResponse( + "_trimitere_detaliu.html", + _detaliu_ctx( + request, row, conn=conn, account_id=account_id, + error=True, + message=f"Exista deja o trimitere identica (rand #{dup['id']}).", + ), + ) + try: + conn.execute( + "UPDATE submissions SET idempotency_key=?, status='queued', payload_json=?, " + "rar_error=NULL, retry_count=0, next_attempt_at=datetime('now'), " + "updated_at=datetime('now') WHERE id=? AND account_id=?", + (new_key, payload_json, row["id"], account_id), + ) + conn.commit() + except sqlite3.IntegrityError: + return templates.TemplateResponse( + "_trimitere_detaliu.html", + _detaliu_ctx( + request, row, conn=conn, account_id=account_id, + error=True, + message="Exista deja o trimitere identica. Operatia a fost oprita.", + ), + ) + row2 = _fetch_submission_scoped(conn, account_id, submission_id) + resp = templates.TemplateResponse( + "_trimitere_detaliu.html", + _detaliu_ctx( + request, row2, conn=conn, account_id=account_id, + message="Cod actualizat — randul a fost re-pus in coada.", + ), + ) + resp.headers["HX-Trigger"] = "trimiteriChanged" + return resp + + # Cale normala: fara cod_prestatie → delega la requeue_submission try: requeue_submission(conn, account_id, submission_id) except SubmissionNotFound: diff --git a/app/web/static/fonts/IBMPlexMono-Regular-latin-ext.woff2 b/app/web/static/fonts/IBMPlexMono-Regular-latin-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..53fb6e51ed3e0c7bc14bda6f850911daab395558 GIT binary patch literal 13272 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

18$hA3$S>^7l_Ij3~t~k_`22>&JtZDz3k&O zEw#M7YFR;4@NJi?+1VodT`74h2R@?uQF6x>wP#ujy=XpdA1BIPE^<%ZdbupZH@p2m zxo3vnSE$BMdLvRyih8j?_y2;Xl%n*}E10Jy2H7x%%s~&rR=u~9W9)rV+a%?othHu;$Vavs+5)6x5f;Ba%kNkZL ztG64M9WsLTbi-RE{EA_KGyzF+EG8iIFUil>M?$QR2M#0S0i1a)!Xd`MAW6GhLvSR) zfdEtc3MggrP^7ZYBZ!@=64R zT5iCXP2D_vya5+T&?HPAL-$-8>;cs%3H$k4Yk>^uM30h{nz0gY)>}%O+Zk@f>UzJ> z`YtI$!SlQfE6-Kq0&9T;^dnMK^HaqL5GY!}qKA7fsk)R2gOM9Jq9R+V!rT#pPql#q%2eZ(_}?SAYUp+DUDlE{Qss zszt172`8Ft)23nb`oEi23|>8fa9wN0w%^2hvw2wbIKap4xc;7bdc41ZF=*iC3Xmj# zg#?R=j0}^KloXqqoE)Q}rX-(;$#Y|Z{4?!4?2Bny$`&n^l_7wnz~lfWLG>Gm5Fn@@ z=qJo)!WMk{vu~nYV{liL|2`IpVzEPChsGYU|2j(a={C1>4h5dNpwEx@pnpnDTjR;z3*P2yYAjlDE$?>f+B`mpj(TF~IQgXqQYhh( z1x)4O$VqW(SeunkL7bgBM>T?`*`N=g{@UBZ(=R|5*RweUsoX5{Q5oBcaf56-R7)6p zW*;XKpYYxb-b&zdnIKKNbyDsO^qOPBn3L75jGQL39$SekAD;NS(P3;nQsm)cr1gzU zf_xZ$P4e}cHazS9GT?J3FZCum=^%0OS%_*dL8MQ3P;!Gv0oL{^ zv^DD;5q_$>CLqr;H-CtP$5t9W%{lPE_FH?)eB+;O07onv^a74uk&OfZLLA!V(E%#g#evtiezfrlHk_ zp=~(gb8s^?o>uDJ)<++dFz+v(gD$K$-;u`7P9|ASyCi{Ofx#jDdDA(hye+ecj8kb_ zgPAk}Tfz0Ic%6lRi&$4L8)kPe8ZjP+HdN)=&#KGL_};0}0}8@4$$re((DWLJnCig{ zxs}8Z1uOXs!Hql85fpQ48S<%g^Jf2}bRdEevYX z-m)3Q+-8>?o&TEi>4_B+KQ~ZxEkwqVejd%Qc9)0HHhvDK>t1SdjycIPJpWUS!7R~{@nqF;QtePP`Q!<{zj$SN8HWgIY0<|IAcn413!r3u_6`?i$)vZ)EU)B U>m9}0ueuO<8`!@7Z|wX30Qo?H$p8QV literal 0 HcmV?d00001 diff --git a/app/web/static/fonts/IBMPlexSans-Bold-latin.woff2 b/app/web/static/fonts/IBMPlexSans-Bold-latin.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..da7d57ff9d66d7b35ec0820bd9196dbd0e64cdff GIT binary patch literal 19440 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 HX(&+u@yjHC literal 0 HcmV?d00001 diff --git a/app/web/static/fonts/IBMPlexSans-Medium-latin-ext.woff2 b/app/web/static/fonts/IBMPlexSans-Medium-latin-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d24a8a3281367dd996a0f4e624700c24c6ca8fe1 GIT binary patch literal 15996 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

bSC0BqlDN4!IU=t_)Sg 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 H(dOW7VZMUH literal 0 HcmV?d00001 diff --git a/app/web/static/fonts/IBMPlexSans-Regular-latin-ext.woff2 b/app/web/static/fonts/IBMPlexSans-Regular-latin-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..24f5f3a3a9520d69e424a1a88d3cd82923d29b66 GIT binary patch literal 15724 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 literal 0 HcmV?d00001 diff --git a/app/web/static/fonts/IBMPlexSans-Regular-latin.woff2 b/app/web/static/fonts/IBMPlexSans-Regular-latin.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..93bcd6430c8ac016e88aa259017395fef162b673 GIT binary patch literal 19156 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�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 -

+ {# US-003 (PRD 5.10): dropdown status eliminat — inlocuit cu pill-uri in bara de status. + Filtrul de stare vine de la pill-uri (/_fragments/submissions?status=X direct). + Camp hidden permite reset stare la submit manual din form (Filtreaza). #} + + {# US-004 (PRD 5.10): pagina curenta — actualizata prin OOB swap din _submissions.html. + Poll-ul (hx-include="#filtre-trimiteri") include automat pagina curenta (L2 PRD). #} +
diff --git a/app/web/templates/_mapari.html b/app/web/templates/_mapari.html index 31c02ac..0ada958 100644 --- a/app/web/templates/_mapari.html +++ b/app/web/templates/_mapari.html @@ -21,26 +21,11 @@ {# US-005 (5.5): antet standard + link Ajutor ca
nativ (fara JS). Toata proza care inainte se repeta inline (scopul maparilor, Auto/Manual) traieste acum AICI, o singura data, ascunsa implicit. #} + {# US-010: sectiunea de ajutor (details.ajutor-mapari) eliminata. + Empty-state „Nicio operatie nemapata" eliminat — sectiunea ramane goala (fara text). #}

De rezolvat

-
- Ajutor -
- Maparile leaga o operatie din softul tau (cod intern ROAAUTO) de un cod RAR oficial. - Operatiile necunoscute raman blocate in needs_mapping - si NU pleaca la RAR pana le mapezi. Sugestiile (%) vin din potrivire fuzzy pe denumire — - verifica-le inainte sa salvezi. In coada: Auto = la - urmatoarele fisiere cu aceasta operatie randurile intra automat in coada; - Manual = raman pentru verificare, nimic nu pleaca la RAR pana confirmi. - La schimbarea unui cod, submission-urile blocate pe acea operatie se re-rezolva automat. -
-
- {% if not pending %} -
- {% else %} + {% if pending %}
- {# Salveaza/Sterge in meniu contextual (kebab) — randul ramane ingust. Butoanele se - leaga prin form= de cele doua form-uri hx-post definite in prima celula a randului. #} -
- -
- - -
-
+ {# US-011: butoane icon mereu vizibile (fara kebab). SVG aria-hidden; aria-label pe buton. + data-dirty-form e citit de JS din base.html: la schimbarea select-ului din acelasi rand, + JS adauga clasa "dirty" pe butonul de salvare (fundal --accent = modificari nesalvate). #} + + {% endfor %} @@ -187,79 +181,8 @@
- - -
-

Formate de coloane salvate

- - {% if not column_formats %} -
- Niciun format de coloane salvat inca. La primul import, maparea coloanelor fisierului - se retine aici si se reaplica automat la fisierele cu acelasi antet. -
- {% else %} -

- Antetele de fisier recunoscute. Un fisier cu alte coloane = format nou separat. -

- -
-
- -
-
- - - - - - - - - {% for f in column_formats %} - - - - - - - {% endfor %} - -
ColoaneMapari (coloana → camp)Format data
- {{ f.columns | length }} coloane - - {% for col, camp in f.mappings.items() %} - {{ col }} → {{ camp }}{% if not loop.last %}; {% endif %} - {% endfor %} - -
- - - - -
-
-
- - - -
-
-
- -
-
- {% endif %} -
- - - + +

Reguli automate (text)

@@ -354,4 +277,77 @@
+ + + + +
+

Formate de coloane salvate

+ + {% if not column_formats %} +
+ Niciun format de coloane salvat inca. La primul import, maparea coloanelor fisierului + se retine aici si se reaplica automat la fisierele cu acelasi antet. +
+ {% else %} +

+ Antetele de fisier recunoscute. Un fisier cu alte coloane = format nou separat. +

+ +
+
+ +
+
+ + + + + + + + + {% for f in column_formats %} + + + + + + + {% endfor %} + +
ColoaneMapari (coloana → camp)Format data
+ {{ f.columns | length }} coloane + + {% for col, camp in f.mappings.items() %} + {{ col }} → {{ camp }}{% if not loop.last %}; {% endif %} + {% endfor %} + +
+ + + + +
+
+
+ + + +
+
+
+ +
+
+ {% endif %} +
+
diff --git a/app/web/templates/_status.html b/app/web/templates/_status.html index 35749a9..7249d09 100644 --- a/app/web/templates/_status.html +++ b/app/web/templates/_status.html @@ -1,3 +1,15 @@ +
- - {% if blocate_actionabil %} + + {% if pills_categorii %}
-
Necesita atentia ta
-
- {% for cat in blocate_actionabil %} -
- {# Link: filtreaza lista Trimiteri pe aceasta stare (HTMX in-place) cu fallback - deep-link server-side (?tab=acasa&status=...). #} - - {{ cat.eticheta[0] }} ({{ cat.n }}) › - -
    - {% for r in cat.randuri %} -
  • - #{{ r.id }} {{ r.vin }}{% if r.nr %} / {{ r.nr }}{% endif %} -
  • - {% endfor %} - {% if cat.rest %} -
  • …si inca {{ cat.rest }}
  • - {% endif %} -
-
+
+ Necesita atentie: + {% for pill in pills_categorii %} + {% endfor %} + {# Buton "Toate" — reseteaza filtrul de categorie #} +
{% endif %} diff --git a/app/web/templates/_submissions.html b/app/web/templates/_submissions.html index bf54f4e..0744ac8 100644 --- a/app/web/templates/_submissions.html +++ b/app/web/templates/_submissions.html @@ -1,3 +1,10 @@ +{# + OOB: actualizeaza inputul id="f-page" din #filtre-trimiteri (US-004 L2). + Poll-ul de 15s (hx-include="#filtre-trimiteri") preia automat pagina curenta. + Elementul OOB e extras din continutul normal de HTMX inainte de swap in #submissions-wrap. +#} + + {% if rows %} {# US-011: form de stergere bulk. Selectia opereaza DOAR pe randuri blocate (gestionabil); sent/sending/queued nu au checkbox (read-only). #} @@ -61,7 +68,8 @@ {{ r.prez.vehicul_nr }} {% if r.prez.vin_scurt and r.prez.vin_scurt != '—' %} - {{ r.prez.vin_scurt }} + {# US-005: VIN pe rand separat sub nr (element block, nu span inline) #} +
{{ r.prez.vin_scurt }}
{% endif %} @@ -83,6 +91,105 @@
+ +{# + Paginare numerotata (US-004 PRD 5.10). + Afisata doar cand exista mai mult de o pagina. + Fiecare link pastreaza filtrele curente (status, vehicul, data_de, data_pana). + Pagina curenta: aria-current="page" (semantic). +#} +{% if total is defined %} +
+ {% if total == 0 %} + 0 trimiteri + {% else %} + {{ page_start }}–{{ page_end }} din {{ total }} + {% endif %} +
+{% endif %} + +{% if pages is defined and pages > 1 %} +{# + Construim param-string pentru filtrele curente (fara page) — refolosit in fiecare link. + Filtrul status vine din pill-uri (nu din form); il pastram in URL. +#} +{% set pq = "" %} +{% if f_status %}{% set pq = pq + "&status=" + f_status %}{% endif %} +{% if f_vehicul %}{% set pq = pq + "&vehicul=" + f_vehicul %}{% endif %} +{% if f_data_de %}{% set pq = pq + "&data_de=" + f_data_de %}{% endif %} +{% if f_data_pana %}{% set pq = pq + "&data_pana=" + f_data_pana %}{% endif %} + + +{% endif %} + {% elif filtru_activ %}
Nimic pe filtrul curent. diff --git a/app/web/templates/_trimitere_detaliu.html b/app/web/templates/_trimitere_detaliu.html index aafbc81..3fb31c1 100644 --- a/app/web/templates/_trimitere_detaliu.html +++ b/app/web/templates/_trimitere_detaliu.html @@ -19,8 +19,10 @@

{{ stare_subtext }}

{% endif %} - {# === R10 (2): bloc eroare blocanta cand exista === #} - {% if erori_3n %} + {# === R10 (2): bloc eroare blocanta — DOAR in read-only (US-008). + In editare, cardul 3-niveluri e inlocuit cu: erori per-camp in macro `camp` + (text simplu .s-error) + rezumat top-of-form pentru erori fara camp (mai jos). === #} + {% if not editabil and erori_3n %}
{{ card_erori(erori_3n) }}
@@ -88,6 +90,13 @@ {% if corectie_error %}role="alert"{% endif %}>{{ corectie_msg }}
{% endif %} + {# US-008 (M6): erori fara camp (field None) nu dispar silentios in editare — + cardul 3n e ascuns, deci adaugam un rezumat simplu top-of-form. + Erori cu camp raman afisate per-camp de macro-ul `camp` de mai jos. #} + {% for e in erori_3n if not e.field %} + + {% endfor %} + {% macro camp(nume, eticheta, valoare, tip='text') %}
@@ -105,11 +114,40 @@ hx-disabled-elt="find button"> + {# US-006: select cod RAR pe stari editabile (needs_data/needs_mapping), cu nomenclator. + Read-only pe sent/sending/queued/error (nomenclator_rar gol → ramura else). #} + {% if nomenclator_rar %} +
+ + {% if prez.operatie and prez.operatie != '—' %} +
{{ prez.operatie }}
+ {% endif %} + +
+ {% else %} {# Operatie + cod RAR read-only deasupra campurilor (R9, fara eticheta „Cod RAR"). #}
Operatie
{{ prez.operatie }} · {{ cod_afis }}
+ {% endif %} + + {# US-007: operatie service (cod intern + denumire venita prin API/import), distinct de + operatia RAR mapata. Conventie US-002: op_service_cod="" cand lipseste → randul absent. #} + {% if prez.op_service_cod %} +
+
Operatie service
+
{{ prez.op_service_cod }}{% if prez.op_service_denumire %} — {{ prez.op_service_denumire }}{% endif %}
+
+ {% endif %} {# Nr. inmatriculare pe rand propriu, VIN dedesubt — ambele latime plina. #} {{ camp('nr_inmatriculare', 'Numar inmatriculare', form_nr) }} @@ -139,6 +177,12 @@
{{ prez.vin }}
Operatie
{{ prez.operatie }} · {{ cod_afis }}
+ {# US-007: operatie service (cod intern + denumire), distinct de operatia RAR. + Conventie US-002: op_service_cod="" cand lipseste → randul absent (fara "—"). #} + {% if prez.op_service_cod %} +
Operatie service
+
{{ prez.op_service_cod }}{% if prez.op_service_denumire %} — {{ prez.op_service_denumire }}{% endif %}
+ {% endif %}
Data prestatie
{{ prez.data_prestatie }}
Odometru final
{{ prez.odometru }}
@@ -147,12 +191,30 @@ {# === R10 (5): actiuni de jos — primar Re-pune (doar error) + Sterge pe RAND SEPARAT (R2/R11) === #} {% if status == 'error' or gestionabil %}
- {# R2: error -> buton primar „Re-pune in coada" pe /repune (error nu e editabil). #} + {# R2: error -> buton primar „Re-pune in coada" pe /repune (error nu e editabil pentru #} + {# campuri vehicul, dar US-006b permite schimbarea cod_prestatie prin acelasi formular). #} {% if status == 'error' %}
+ {# US-006b: select cod_prestatie optional in formularul /repune (doar pentru error). #} + {% if nomenclator_rar %} + + + {% endif %}
{% endif %} diff --git a/app/web/templates/base.html b/app/web/templates/base.html index 81ec918..131809c 100644 --- a/app/web/templates/base.html +++ b/app/web/templates/base.html @@ -14,12 +14,16 @@ htmx.config.useTemplateFragments = true; + {# US-012 (PRD 5.10): grila 3 coloane — stanga (env badge) | centru (titlu+wordmark) | dreapta (controale). #}
-

Gateway RAR AUTOPASS

- {{ rar_env }} -
+ {# Celula stanga: badge env (test/prod) — echilibru optic fata de controalele din dreapta #} +
+ {{ rar_env }} +
+ {# Celula centru: titlu + wordmark 'by ROMFAST' #} +
+

Gateway RAR AUTOPASS

+ {# US-012b (decizie user): logo PNG real in loc de wordmark text. + 288x175 RGBA fundal transparent — lizibil pe light/dark/petrol fara filtre. #} + +
+ {# Celula dreapta: comutator tema + versiune + meniu cont #} +
@@ -331,6 +439,10 @@ aria-haspopup="true" aria-expanded="false" aria-controls="cont-menu" aria-label="Meniu cont" title="Meniu cont">☰
+ {# aria-live pentru anuntarea schimbarilor de tema (US-014, accesibilitate) #} +
{% block content %}{% endblock %}
{# Modal detaliu trimitere (PRD 5.9 US-003): container global, SIBLING al
(nu descendent), ca `inert`+`aria-hidden` pe
sa nu-l prinda si pe el (R7). @@ -360,36 +475,46 @@
@@ -470,6 +595,19 @@ window.addEventListener('resize', function() { closeAll(null); }); })(); + - {% endblock %} diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 492d031..62c6ad2 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -48,7 +48,7 @@ Reguli de contract (detalii in `docs/api-rar-contract.md`): `FINALIZATA` e termi > PRD-uri (`docs/prd/prd-X.Y-*.md`), linkate in coloana Detalii. La fiecare livrabila terminata: > schimba statusul + data + linkul PRD si actualizeaza "Ultima actualizare". -**Ultima actualizare**: 2026-06-24 — 5.8 LIVRAT (UX tabel trimiteri + reguli mapare pe text). 11 stories/4 valuri, TDD prin echipa de workeri (lead orchestreaza, nu scrie cod). Reguli text per cont (`operation_text_rules`, substring insensibil diacritice/caz): `resolve_prestatii` capata param aditiv `text_rules` cu precedenta stricta (cod direct > mapare exacta > regula text > nemapat), threadat pe TOATE cele 6 callsite-uri + `valid_codes` + seam `classify_prezentare` (dry-run = trimitere reala); UI Mapari sectiune noua + preview pre-salvare + avertizare overlap + telemetrie `text_rule_hit` in jurnal. UX tabel: `cod_rar` sub operatie, `eticheta_scurta` pill, fara scroll orizontal (scopat `.tabel-trimiteri` + carduri <768px), detaliu INLINE rand-sibling expandabil (chevron+fundal+a11y, pauza poll 15s). VERIFY context curat: **814 passed, 1 skipped** (live opt-in); E2E functional TestClient (browser pixel-level + live RAR neprobate — sandbox/login/lipsa creds). **`/code-review high`: 1 bug critic reparat** — regula text `auto_send=0` (DEFAULT, decizia CEO siguranta) trimitea automat la RAR in loc sa TINA randul pentru review (`has_no_auto_send` ignora regula text care a rezolvat itemul); reparat TDD + curatare adnotari stale (repara si o telemetrie falsa latenta). Backend trimitere + schema-send NEATINSE (schema pur aditiv). PRD: [prd-5.8](prd/prd-5.8-ux-tabel-trimiteri-reguli-text.md). | 2026-06-24 — 5.8 PLAN: eng + CEO review rulate (6 decizii incorporate, 11 stories/4 valuri). | 2026-06-23 — 5.7 LIVRAT (raspuns API onest la blocaje + mapare inline din detaliu). Raportat din client VFP: `POST /v1/prezentari` intorcea `submission_id`+`status` FARA motiv pe randuri blocate (`erori` se popula doar pe ramura `on_unmapped_error=True`) → un `needs_data`/`needs_mapping` parea succes ("raspuns fara erori"). Reparat ADITIV: `SubmissionResult` += `nemapate` + `motiv`; `create_prezentari` populeaza `erori` (validare continut, 3 niveluri) / `nemapate` (coduri fara mapare, COD_NEMAPAT) / `motiv` (rezumat uman) pe TOATE caile non-`queued` — enqueue, respins (`on_unmapped_error=True`) si reactivare dedup peste `error`. UI: mapare inline in panoul de detaliu trimitere (`POST /trimitere/{id}/mapeaza`, reuse EXACT `save_mapping`+`reresolve_account`, scoped sesiune + CSRF, re-rezolva pe `batch_id`-ul randului → deblocheaza si randurile-frate; apare doar pe operatii nemapate reale, nu pe auto_send=0) — fara drum prin tab-ul Mapari. `/code-review high`: 2 buguri reale reparate (reactivarea omitea `erori`/`nemapate`/`motiv`; dublu `load_nomenclator` in `_detaliu_ctx`), restul candidatilor infirmati la verify (parse `auto_send` corect via `or ""`; lipsa `conn/account_id` pe ramuri de corectie nereachable cu needs_mapping+unmapped). `pytest -q` **765 passed, 0 failed** (+1 skipped live). **PROBA LIVE `--send` (2026-06-23): mapare inline E2E pe RAR test** — `POST /v1/prezentari` cu operatie nemapata → `needs_mapping` (raspuns onest cu `nemapate`+`motiv`) → mapare inline din panoul de detaliu in browser (Playwright) → `queued` → worker login RAR + `postPrezentare` → `sent idPrezentare=68827`, confirmat independent in finalizate RAR + jurnal `app_events` (`rar_login ok` → `submission_sent`). Automatizat ca test live opt-in `tests/test_live_rar.py` (skip implicit; `AUTOPASS_LIVE_RAR=1` + creds test reproduc tot lantul → `idPrezentare=68828`). PRD: [prd-5.7](prd/prd-5.7-raspuns-onest-mapare-inline.md). | ISTORIC: FIX out-of-process (raportat din client VFP): `cod_prestatie` necunoscut in nomenclator era trimis raw la RAR → **HTTP 500** (`ORA-12899`, coloana `COD_PRESTATIE` max 5 car.) + record PARTIAL `FINALIZATA` (RAR ne-tranzactional) pe care reconcilierea il marca fals `sent`. Reparat: validare `cod_prestatie` fata de nomenclator la ingestie (cod necunoscut → tratat ca operatie de mapat, nu se mai trimite raw) + optiune boolean `on_unmapped_error` (`false` default → needs_mapping | `true` → respinge) per-cerere cu default per-cont `accounts.on_unmapped_error_default` (migrare aditiva). Confirmat live raspunsul RAR (500 pe cod intern vs 200 pe `OE-1`). Inclus si in `c842e33`: fix lease orfan worker (nepotrivire format data sending_since vs cutoff → orice rand `sending` parea expirat) + guard anti-dublu-POST + fix UI `hx-confirm` mostenit pe randuri (alerta de stergere la click pe rand). Teste: **748 passed** (cele 2 esecuri pre-existente fara legatura). Contract + CLAUDE.md actualizate. | 5.6 IMPLEMENTAT + VERIFY PASS (asteapta commit). Cele 14 stories din PRD 5.6 livrate TDD (RED->GREEN), `pytest -q` **741 passed, 0 failed**. Lifecycle trimiteri blocate (Val A primul, decizie #18): `app/submissions_admin.py` (sterge/repune scoped, 404-before-409); reactivare dedup peste `error` cu CAS + invalidare sesiune worker la creds noi (T1) + propagare `accounts.rar_creds_enc` (#17) + camp aditiv `reactivated:true` (#19); retentie randuri blocate 30z + `purge_after` curatat la reactivare/requeue (T2); API `DELETE`/`/repune` (200+JSON, #20); UI butoane + bulk + banner "Necesita atentia ta" actionabil cu deep-link. Observabilitate: `app/observ.py log_event` (dublu canal `app_events` DB + `RotatingFileHandler` per-proces, redactare creds/PII la scriere via `app/security.redact_pii`/`vin_partial`), `request_id` middleware + `X-Request-ID` pe toate raspunsurile (T8), handler global excepții -> 500 envelope 6-chei + request_id (T7), audit cerere API (`api_prezentari`/`api_auth_esuat`) + audit worker (`rar_login`/tranzitii), tab "Jurnal" filtrabil scoped (non-admin doar contul sau), retentie jurnal 90z. Live RAR `--send` NEPROBAT in sesiune (recomandat la deploy: confirma `rar_login` ok + `submission_sent` in jurnal). PRD actualizat cu raport VERIFY; contract actualizat cu endpointurile noi (T10). | ISTORIC: HOTFIX livrat + 5.6 APROBAT. Hotfix 500 pe `POST /v1/prezentari` (raportat din client Visual FoxPro): `AUTOPASS_CREDS_KEY` din `.env` nu respecta formatul Fernet (32 bytes url-safe base64) → `ValueError` la primul `encrypt_creds` → 500 brut. Reparat: cheie Fernet valida in `.env` + `crypto.validate_creds_key()` apelata in `main.lifespan` (fail-fast la startup, mesaj clar in loc de 500 la primul POST). Confirmat live: POST VFP → 200 `queued`; trimitere reala pe RAR test → `sent idPrezentare=68818` (verificat independent in finalizate). Corectat si mesajul fals din dashboard pentru starea `error` in `labels.py` ("se reincearca automat" → starea e terminala, NU se reincearca). Investigatia a expus 3 goluri structurale (500 brut fara traducere 3 niveluri; lipsa jurnal de aplicatie la nivel de eveniment; lacune de lifecycle — randuri blocate permanente, dedup blocat de un rand `error`, banner "Necesita atentia ta" neactionabil) → **PRD 5.6 APROBAT** (14 stories; decizii §5 rezolvate cu user). PRD: [prd-5.6](prd/prd-5.6-observabilitate-jurnal.md). | ISTORIC: 5.5 LIVRAT (uniformizare/standardizare UI/UX: tabele la grila Trimiteri, meniu hamburger + tab-bar redus Acasa/Mapari, sterge Ajutor de pe Acasa, panou admin cu selectie+bulk pe model nou `accounts.status`. 9 stories in 3 valuri, UI pur cu o singura exceptie backend = stare cont; stergere soft cu purjare PII imediata GDPR. VERIFY 671 teste + E2E browser (2 bug-uri prinse) + `/code-review high` (2 bug-uri reale reparate). Commit `1fbd894`, vezi randul 5.5). | ISTORIC: 5.4 LIVRAT (Erori pe 3 niveluri problema+cauza+fix pe API si UI: catalog central pur `app/errors.py` ca SINGURA sursa de adevar cod→{problema,fix}, consumat de API+UI+worker — face imposibila divergenta intre canale, acelasi invariant ca 5.2. 8 stories in 5 valuri. Tot ADITIV: `field`/`message`/`error` pastrate la octet, adaugam `cod/problema/cauza/fix`; `rar_error` stocat = SUPERSET (chei vechi intacte → `labels.py` nu se rupe intre valuri, zero migrare). Scope = fluxul de declarare; login/signup/CSRF neatinse. UI progresiv: lista compacta, 3 niveluri complete in detaliu/preview, AA light+dark. VERIFY context curat PASS 628 teste (byte-compat+superset verificate direct, E2E API+web; live RAR neprobat — lipsa creds key). `/code-review high`: 2 bug-uri reale reparate in `labels.py` (`motiv_uman` fara ramura 3-niveluri → 401 creds garbled in coloana Motiv; `parse_erori` element gol pe `{}`). 631 teste. Backend trimitere + schema NEATINSE. PRD: [prd-5.4](prd/prd-5.4-erori-3-niveluri.md)). | ISTORIC: 5.3 LIVRAT (Light/Dark mode: tema light ca bloc `[data-theme="light"]` peste variabilele `:root` — dark NESCHIMBAT la octet; comutator soare/luna in header pe toate paginile, default OS-aware cu fallback dark, persistenta `localStorage` doar la comutare explicita, script anti-FOUC in `` pre-paint; suprafetele de stare hardcodate convertite la `color-mix` in `base.html` + 7 fragmente. Zero backend — pur frontend. VERIFY 2 runde: r1 FAIL a prins literalii dark ramasi in 7 fragmente HTMX (text invizibil in light, test vacuu pe doar base.html) → fix US-003 + test care scaneaza fragmentele; r2 PASS E2E browser (banner light ~13:1 contrast, toggle instant+persista+anti-FOUC, dark identic). `/code-review` high: 1 finding reparat (light `--ok` green sub AA ca text → green-700, ~5.0:1). 584 teste. PRD: [prd-5.3](prd/prd-5.3-light-dark-mode.md)). | ISTORIC: 5.2 LIVRAT (Endpoint dry-run `POST /v1/prezentari/valideaza`: valideaza payload + mapare si intoarce verdictul real — `status_estimat` queued/needs_data/needs_mapping + erori `[{field,message}]` + coduri nemapate + prestatii rezolvate — FARA enqueue, FARA creds, zero scriere DB). 1 story TDD. Cheia de design: helper pur partajat `classify_prezentare` folosit de AMBELE rute, ca dry-run-ul sa nu poata diverge de trimiterea reala (invariant de corectitudine); `create_prezentari` refactorizat pe el cu comportament identic. Scope minim per decizie user: doar validare+mapare (fara idempotency/duplicat, `idempotency.py` neatins), hub `/integrare` amanat ca follow-up (descoperibilitate). VERIFY context curat PASS (577 teste; E2E API cu cele 3 verdicte + COUNT(*)=0 dupa dry-run + fara leak creds in raspuns; regresia de aur verde; live RAR `FINALIZATA` neprobat — lipsa creds key, endpoint read-only nu atinge worker/coada/schema). `/code-review` high: 0 findings (refactor faithful, mutable-default Pydantic-safe, import local necesar anti-circular). PRD: [prd-5.2](prd/prd-5.2-dryrun-valideaza.md). | ISTORIC: 5.1 LIVRAT (Hub de integrare `/integrare`: exemple cod multi-limbaj + retetar VFP cu 2 dialecte + `GET /v1/ping` readiness + export Postman/OpenAPI + "Testeaza conexiunea"). 4 stories in 2 valuri (Val 1 = US-001/US-002/US-004 paralel pe fisiere disjuncte via Agent team; Val 2 = US-003 UI). Atentie operationala: US-003 a rulat intr-un worktree branched din ultimul commit (FARA modificarile necomise ale US-004 din working-tree) si la "copiere manuala" a SUPRASCRIS `routes.py`, stergand ruta `POST /integrare/test-cheie` (8 teste 404) — reparat prin re-aplicarea rutei de catre autorul US-004 pe `routes.py` curent. Lectie: stories care ating acelasi fisier in valuri diferite + worktree = clobber daca worktree-ul nu vede working-tree-ul; foloseste fisiere disjuncte SAU merge atent de catre lead. VERIFY context curat PASS (568 teste) + E2E browser Playwright (deep-link server-side, IA pe 2 niveluri, VFP cu 3 niveluri de tab comuta corect, copy, htmx test-cheie → fragment eroare, 0 erori consola) + enqueue live (`POST /v1/prezentari` → queued); live RAR `FINALIZATA` NEPROBAT in sesiune (lipsa `AUTOPASS_CREDS_KEY`/creds RAR test) — risc minim, backend trimitere NEATINS. `/code-review` high a prins 4 bug-uri reale (toate in suprafata noua, reparate + lock-uite cu teste): snippet C# JSON multi-linie nevalid (CS1010), snippet VFP `json.dumps(indent=0)` inca cu newline-uri → string literal rupt in ambele dialecte, snippet Node `node:buffer` nu exporta FormData → TypeError, script `_integrare.html` ne-scoped acumuland event-listeneri pe tab-bar-ul principal la fiecare swap htmx (scoped pe `#integrare-section`). Notat ca cleanup viitor (nereparat): `_render_integrare` dubleaza SQL `are_creds`/`are_cheie`, `ping` cu 2 conexiuni DB + `account_for_key` de 2 ori, `_campuri_obligatorii` necache-uit, panouri limbaj copy-paste (candidat macro Jinja2). Backend trimitere (worker/masina stari/idempotenta/mapping) si schema NEATINSE. PRD: [prd-5.1](prd/prd-5.1-hub-integrare.md). | ISTORIC: 3.6 INCHIS (editare celule in preview + Acasa unificata). CLOSE: `/code-review` high a prins 1 bug real (decriptare `override_json` neprotejata de try/except in ambele cai de preview — 500 pe tot batch-ul la rotatie cheie Fernet vs. `raw_json` care degrada gratios), reparat in `import_router.preview_import` + `routes._web_compute_preview`; duplicarea `_override_of`/canonicalize notata ca cleanup viitor. 523 teste pass. 7 stories in 3 valuri, executate de 2 echipe in paralel (TeamCreate) pe fisiere disjuncte (core: routes/import/templates; mapari: `_mapari.html`) + US-007 secvential. Livrate: tab "Trimiteri" eliminat→sectiune "Trimiterile tale" sub upload pe Acasa (US-003); upload bara slim accentuata cu hero la first-run (US-004); editare de celule in preview prin `import_rows.override_json` (Approach B, Fernet, patch canonic aplicat ULTIMUL in `_resolve_row_for_preview`+`commit_import` — completeaza inclusiv coloane ABSENTE din fisier), mutatie pura cu status rederivat (US-001); buton Editeaza pe rand cu swap pe ``+OOB contoare (nu pe sectiune), form propriu, mutual-exclusion, reuse grila `_trimitere_detaliu.html` (US-002); Mapari + formate de coloane ca tabele `.tablewrap`, H4 auto_send stocat (US-005/006); bifa "auto-send"→comutator etichetat pe COADA ("Pune automat in coada"/"Tine pentru verificare"), scoped pe operatie, `name=auto_send` pastrat (zero backend) (US-007). 523 teste pass. **VERIFY**: E2E browser pe `/` (Acasa unificata, upload slim, editare rand needs_data→ok cu swap pe rand + contoare OOB, Mapari tabelar + comutator) + LIVE pe RAR test — import fara coloana data → editarea completeaza data (override) → commit → worker login RAR test → `postPrezentare` → `sent` cu `idPrezentare=68696`, confirmat independent in lista finalizate RAR. 3 bug-uri JS (htmx 1.9.12) prinse DOAR la E2E in browser (invizibile la TestClient) si reparate: `useTemplateFragments=true` (raspunsul ``+OOB era parsat in context de tabel → `swapError` + contoare pierdute), re-activare `confirm-btn` deferita pe tick (race `editing=true` tranzitoriu), `n-hint` ok-count actualizat de `updateN`. Backend trimitere (worker, masina stari, idempotenta-logica, mapping-rezolvare) NEATINS — singura atingere de schema: 1 coloana nullable `override_json` cu migrare defensiva. PRD: [prd-3.6](prd/prd-3.6-editare-preview-acasa-unificata.md). | ISTORIC: 3.5 LIVRAT (dashboard compact). 11 stories in 4 valuri, TDD. US-001 bara status compacta pe 2 randuri cu bife accesibile (glife ✓/✗ + text, nu doar culoare) + `format_data_rar` (dd.mm.yyyy hh24:mi:ss, helper pur). US-002 Acasa = ecranul de import (upload dominant inline, tab Import scos, `?tab=import`→Acasa fara 404). US-003 helper pur partajat `app/payload_view.py` (payload→campuri afisabile, defensiv, coercion Excel) refolosit si de `GET /v1/prezentari` (DRY). US-004 "Coada"→"Trimiteri": coloane RO + stare umana + detaliu complet la click in panou dedicat `#trimitere-detaliu` (nu inline — poll 10s), scoped 404 cross-account. US-005/006 CRUD mapari operatii + formate coloane salvate (scoped, re-rezolvare auto la edit cod). US-007 "Mapari" 3 sectiuni (de rezolvat / op salvate / formate coloane), "Cont" doar cheie+creds. US-008 motiv (mesaj validare) pe randuri needs_data in preview. US-009 filtre Trimiteri (stare SQL / vehicul+data Python) scoped + "sterge filtrele". US-010 corectie inline needs_data→queued cu payload+idempotency recalculate, sent read-only (403), coliziune idempotency prinsa pre-UPDATE. US-011 badge contoare pe tab-uri (Mapari/Trimiteri), scoped, aria-label. VERIFY context curat PASS (483 teste; E2E browser/RAR LIVE neprobat — recomandata probare manuala `--send`). `/code-review` high a prins 4 findings reale, toate reparate: corectie needs_mapping re-rezolva prestatiile (nu mai poate trimite cod nul la RAR), filtru fara LIMIT silentios, coliziune idempotency atomica (try/except IntegrityError), comparatie data doar ISO. Backend trimitere (worker, masina stari, idempotenta-logica, mapping-rezolvare, schema) NEATINS. PRD: [prd-3.5](prd/prd-3.5-dashboard-compact-trimiteri-mapari.md). Urmeaza Etapa 4 (4.1 mapare AI/MCP). +**Ultima actualizare**: 2026-06-25 — 5.10 LIVRAT (UX trimiteri: pill filtre + paginare + detaliu; Mapari in meniu; branding ROMFAST + teme). 14 stories TDD prin echipa de workeri (lead orchestreaza, 3 teammates Sonnet pe valuri cu fisiere disjuncte; routes.py si base.html serializate ca fisiere fierbinti). US-001 fix filtrare data (`_iso_date_prefix` pe garda+comparatie). US-002 op service in `payload_view` (chei distincte `op_service_cod/denumire`, conventie goala `""`). US-003 pill-uri categorii `