diff --git a/app/api/v1/router.py b/app/api/v1/router.py index dd1576e..fd44b7f 100644 --- a/app/api/v1/router.py +++ b/app/api/v1/router.py @@ -556,6 +556,8 @@ AUDIT_COLUMNS = [ "odometru_final", "prestatii", "rar_status_code", + # US-010 (PRD 5.20): mediul RAR tinta per trimitere. + "rar_env", "created_at", "updated_at", "purge_after", @@ -571,7 +573,7 @@ def _audit_rows(conn, date_from: str | None, date_to: str | None, status: str, a scope_sql, scope_params = account_scope_clause(account_id) sql = ( "SELECT id, status, id_prezentare, account_id, payload_json, rar_status_code, " - "created_at, updated_at, purge_after FROM submissions" + "rar_env, created_at, updated_at, purge_after FROM submissions" ) where = [scope_sql] params: list = list(scope_params) @@ -609,6 +611,8 @@ def _audit_rows(conn, date_from: str | None, date_to: str | None, status: str, a "odometru_final": p.get("odometru_final") or "", "prestatii": codes, "rar_status_code": r["rar_status_code"] or "", + # US-010 (PRD 5.20): mediul RAR tinta — coloana audit. + "rar_env": r["rar_env"] or "", "created_at": r["created_at"], "updated_at": r["updated_at"], "purge_after": r["purge_after"] or "", diff --git a/app/web/labels.py b/app/web/labels.py index daf9efc..9c7c060 100644 --- a/app/web/labels.py +++ b/app/web/labels.py @@ -401,6 +401,31 @@ def nota_umana_preview(status: str, errors: list, flags: list) -> str: return "" +# --------------------------------------------------------------------------- +# Etichete mediu RAR (Test / Productie) — US-010 PRD 5.20 +# +# Conventia de culori (semantica risc L.142): +# prod = env-badge-prod (fill atentie, text alb) — declaratie REALA, ireversibila. +# test = env-badge-test (outline discret, --muted) — mediu de proba. +# --------------------------------------------------------------------------- + +ETICHETE_ENV: dict[str, tuple[str, str]] = { + "prod": ("PRODUCȚIE", "env-badge-prod"), + "test": ("Testare", "env-badge-test"), +} + + +def eticheta_env(env: object) -> tuple[str, str]: + """Returneaza (text, css_class) pentru mediul RAR. + + Fallback sigur: env necunoscut sau None -> ('Testare', 'env-badge-test'). + Nu arunca niciodata. + """ + if not env: + return ("Testare", "env-badge-test") + return ETICHETE_ENV.get(str(env), ("Testare", "env-badge-test")) + + # --------------------------------------------------------------------------- # Constante auxiliare (microcopy fix, fara logica) # --------------------------------------------------------------------------- diff --git a/app/web/routes.py b/app/web/routes.py index 6a6223b..7060c9f 100644 --- a/app/web/routes.py +++ b/app/web/routes.py @@ -32,6 +32,7 @@ from ..web.csrf import get_csrf_token, verify_csrf from .labels import ( ETICHETA_ULTIMA_AUTENTIFICARE_RAR, STARI_PREVIEW, + eticheta_env, eticheta_rar, eticheta_scurta, eticheta_stare, @@ -110,8 +111,9 @@ def _import_env_ctx(conn, account_id: int) -> dict: router = APIRouter(tags=["web"]) templates = Jinja2Templates(directory=str(Path(__file__).resolve().parent / "templates")) -# Expune parse_erori in toate template-urile +# Expune parse_erori si eticheta_env in toate template-urile templates.env.globals["parse_erori"] = parse_erori +templates.env.globals["eticheta_env"] = eticheta_env _BLOCKED = ("error", "needs_data", "needs_mapping") @@ -528,6 +530,8 @@ def _jurnal_context( "has_more": has_more, "prev_page": page - 1 if page > 0 else None, "next_page": page + 1 if has_more else None, + # US-010 (PRD 5.20): mediul implicit al contului pentru badge de sectiune. + "env_default": rar_env_efectiv_cont(conn, account_id) or "test", } @@ -1042,6 +1046,8 @@ def _submission_row_view(r) -> dict: # randurile blocate (error/needs_data/needs_mapping) sunt selectabile pentru # stergere bulk; sent/sending/queued raman read-only (fara checkbox). "gestionabil": r["status"] in _GESTIONABILE_WEB, + # US-010 (PRD 5.20): mediul RAR tinta — badge in lista. + "rar_env": r["rar_env"] if "rar_env" in r.keys() else None, } @@ -1089,7 +1095,7 @@ def fragment_submissions( # FARA LIMIT — altfel paginile >8 ar disparea silentios. 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", + f"updated_at, payload_json, rar_env FROM submissions WHERE {where_sql} ORDER BY id DESC", params, ).fetchall() @@ -1130,7 +1136,7 @@ def fragment_submissions( 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 " + f"updated_at, payload_json, rar_env FROM submissions WHERE {where_sql} ORDER BY id DESC " "LIMIT ? OFFSET ?", params + [_PAGE_SIZE, offset], ).fetchall() @@ -1352,6 +1358,8 @@ def _detaliu_ctx(request: Request, row, *, message: str | None = None, "editabil": row["status"] in _CORECTABILE, # error/needs_data/needs_mapping pot fi sterse / re-puse in coada "gestionabil": row["status"] in _GESTIONABILE_WEB, + # US-010 (PRD 5.20): mediul RAR tinta — badge in detaliu. + "rar_env": row["rar_env"] if "rar_env" in row.keys() else None, # mapare inline (operatii nemapate ale acestui rand + nomenclator) "nemapate_inline": nemapate_inline, "nomenclator": nomenclator, diff --git a/app/web/templates/_jurnal.html b/app/web/templates/_jurnal.html index 5f2ccba..fbc5fba 100644 --- a/app/web/templates/_jurnal.html +++ b/app/web/templates/_jurnal.html @@ -10,6 +10,11 @@ {% else %} doar evenimentele contului tau {% endif %} + {# Badge mediu RAR activ (US-010 PRD 5.20) — mediul implicit al contului #} + {% if env_default | default('') %} + {% set _eb = eticheta_env(env_default) %} + {{ _eb[0] }} + {% endif %}