From c2beede084ad9607fac91ae41b6c12c49706a2a1 Mon Sep 17 00:00:00 2001 From: Claude Agent Date: Wed, 8 Jul 2026 19:42:25 +0000 Subject: [PATCH] fix(web): detaliul trimiterii arata toate codurile RAR cand prima prestatie e exclusa MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cod_rar se deriva acum din toate prestatiile (primul cod mapat), nu doar din primul item; modalul afiseaza lista completa de coduri. Randurile importate editate pastreaza operatia originala ca item 0 exclus fara cod, iar codurile adaugate sunt itemii urmatori — modalul afisa fals "nemapat". Co-Authored-By: Claude Fable 5 --- app/payload_view.py | 9 +++++--- app/web/templates/_trimitere_detaliu.html | 6 ++--- tests/test_payload_view.py | 22 ++++++++++++++++++ tests/test_web_submissions.py | 28 +++++++++++++++++++++++ 4 files changed, 59 insertions(+), 6 deletions(-) diff --git a/app/payload_view.py b/app/payload_view.py index cf64781..dc77dbd 100644 --- a/app/payload_view.py +++ b/app/payload_view.py @@ -126,8 +126,11 @@ def prezentare_din_payload(payload: str | dict | None) -> dict[str, Any]: denumire = _clean_str(item.get("denumire")) operatie = denumire or cod - # cod_rar: exclusiv din cod_prestatie (NU fallback la cod_op_service); uppercase + strip ".0" - cod_rar = _clean_cod_rar(item.get("cod_prestatie")) + # cod_rar: primul cod_prestatie din TOATE prestatiile (NU doar primul item si NU + # fallback la cod_op_service). Primul item poate fi operatia originala exclusa + # (cod_prestatie null), cu codurile declarate pe itemii urmatori. + coduri_rar = _coduri_rar(data.get("prestatii")) + cod_rar = coduri_rar[0] if coduri_rar else "" # Operatia de service originala (codul intern + denumire venita prin API/import), # distincta de operatia RAR mapata (cod_rar). @@ -154,7 +157,7 @@ def prezentare_din_payload(payload: str | dict | None) -> dict[str, Any]: "cod_rar": cod_rar or EMPTY, # Lista ordonata, fara duplicate, a codurilor RAR din TOATE prestatiile # (goala cand nimic nu e mapat). Randul compact afiseaza primul + "+N". - "coduri_rar": _coduri_rar(data.get("prestatii")), + "coduri_rar": coduri_rar, # Chei 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/templates/_trimitere_detaliu.html b/app/web/templates/_trimitere_detaliu.html index 618f5c8..be4f447 100644 --- a/app/web/templates/_trimitere_detaliu.html +++ b/app/web/templates/_trimitere_detaliu.html @@ -2,9 +2,9 @@ {% import '_macros.html' as ui %} {# Detaliu editabil in-place. Fragmentul se swap-uieste in corpul modalului global (#detaliu-modal-body). Heading-ul poarta id-ul folosit de aria-labelledby al dialogului. - Operatie + cod RAR rezolvat apar IMPREUNA, read-only, folosind `prez.cod_rar` - (fallback „nemapat"), fara eticheta separata „Cod RAR". #} -{% set cod_afis = prez.cod_rar if (prez.cod_rar and prez.cod_rar != '—') else 'nemapat' %} + Operatie + coduri RAR rezolvate apar IMPREUNA, read-only, folosind `prez.coduri_rar` + (toate codurile, fallback „nemapat"), fara eticheta separata „Cod RAR". #} +{% set cod_afis = prez.coduri_rar | join(', ') if prez.coduri_rar else 'nemapat' %}
{# === Header — #id + pill stare + badge mediu RAR + motiv === #} diff --git a/tests/test_payload_view.py b/tests/test_payload_view.py index caa05fa..ed8ebb8 100644 --- a/tests/test_payload_view.py +++ b/tests/test_payload_view.py @@ -123,6 +123,28 @@ def test_cod_rar_gol_cand_nemapat(): assert d3["cod_rar"] == EMPTY +def test_cod_rar_din_toate_prestatiile_cand_prima_e_exclusa(): + """Prima prestatie exclusa (fara cod) nu ascunde codurile de pe itemii urmatori. + + Rand importat editat: operatia originala ramane item 0 cu exclus=True si + cod_prestatie null, codurile adaugate sunt itemii 1..N. + """ + d = prezentare_din_payload({ + "prestatii": [ + {"cod_prestatie": None, "cod_op_service": "OP-ITP", + "denumire": "Inspectie Tehnica Periodica", "exclus": True}, + {"cod_prestatie": "OE-2"}, + {"cod_prestatie": "OE-4"}, + {"cod_prestatie": "OE-8"}, + ] + }) + assert d["cod_rar"] == "OE-2" + assert d["coduri_rar"] == ["OE-2", "OE-4", "OE-8"] + # operatia si op. de service raman derivate din primul item (descrierea originala) + assert d["operatie"] == "Inspectie Tehnica Periodica" + assert d["op_service_cod"] == "OP-ITP" + + def test_operatie_ramane_denumire_sau_op(): """operatie si cod raman neschimbate (compatibilitate cu apelantii existenti).""" # cu ambele coduri -> operatie=denumire, cod=cod_prestatie (neschimbat) diff --git a/tests/test_web_submissions.py b/tests/test_web_submissions.py index cf2809b..725a3da 100644 --- a/tests/test_web_submissions.py +++ b/tests/test_web_submissions.py @@ -214,6 +214,34 @@ def test_detaliu_trimitere(client): assert "99001" in html # nr prezentare RAR +def test_detaliu_arata_toate_codurile_cand_prima_prestatie_e_exclusa(client): + """Modalul arata codurile declarate cand operatia originala e exclusa (item 0). + + Rand importat editat: item 0 = operatia originala cu exclus=True, fara cod; + codurile adaugate sunt itemii urmatori. Detaliul nu trebuie sa afiseze 'nemapat'. + """ + acct = _create_account_user("codmulti@test.com") + sid = _insert_submission(acct, "sent", id_prezentare=99002, payload={ + "vin": "WVWZZZ3CZ9E123456", + "nr_inmatriculare": "TM789BC", + "data_prestatie": "2026-05-15", + "odometru_final": "82500", + "prestatii": [ + {"cod_prestatie": None, "cod_op_service": "OP-ITP", + "denumire": "Inspectie Tehnica Periodica", "exclus": True}, + {"cod_prestatie": "OE-2"}, + {"cod_prestatie": "OE-4"}, + {"cod_prestatie": "OE-8"}, + ], + }) + _login(client, "codmulti@test.com") + resp = client.get(f"/_fragments/trimitere/{sid}") + assert resp.status_code == 200 + html = resp.text + assert "OE-2, OE-4, OE-8" in html + assert "nemapat" not in html + + # --------------------------------------------------------------------------- # Tabel trimiteri — eticheta umana sub pill, fara chevron, # cod RAR simplu (fara prefix), randul declanseaza modalul. Teste de randare.