fix(web): detaliul trimiterii arata toate codurile RAR cand prima prestatie e exclusa
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 <noreply@anthropic.com>
This commit is contained in:
@@ -126,8 +126,11 @@ def prezentare_din_payload(payload: str | dict | None) -> dict[str, Any]:
|
|||||||
denumire = _clean_str(item.get("denumire"))
|
denumire = _clean_str(item.get("denumire"))
|
||||||
operatie = denumire or cod
|
operatie = denumire or cod
|
||||||
|
|
||||||
# cod_rar: exclusiv din cod_prestatie (NU fallback la cod_op_service); uppercase + strip ".0"
|
# cod_rar: primul cod_prestatie din TOATE prestatiile (NU doar primul item si NU
|
||||||
cod_rar = _clean_cod_rar(item.get("cod_prestatie"))
|
# 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),
|
# Operatia de service originala (codul intern + denumire venita prin API/import),
|
||||||
# distincta de operatia RAR mapata (cod_rar).
|
# 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,
|
"cod_rar": cod_rar or EMPTY,
|
||||||
# Lista ordonata, fara duplicate, a codurilor RAR din TOATE prestatiile
|
# Lista ordonata, fara duplicate, a codurilor RAR din TOATE prestatiile
|
||||||
# (goala cand nimic nu e mapat). Randul compact afiseaza primul + "+N".
|
# (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
|
# Chei cu conventie goala "" (nu EMPTY) — vezi comentariu de mai sus
|
||||||
"op_service_cod": op_service_cod,
|
"op_service_cod": op_service_cod,
|
||||||
"op_service_denumire": op_service_denumire,
|
"op_service_denumire": op_service_denumire,
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
{% import '_macros.html' as ui %}
|
{% import '_macros.html' as ui %}
|
||||||
{# Detaliu editabil in-place. Fragmentul se swap-uieste in corpul modalului global
|
{# 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.
|
(#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`
|
Operatie + coduri RAR rezolvate apar IMPREUNA, read-only, folosind `prez.coduri_rar`
|
||||||
(fallback „nemapat"), fara eticheta separata „Cod RAR". #}
|
(toate codurile, fallback „nemapat"), fara eticheta separata „Cod RAR". #}
|
||||||
{% set cod_afis = prez.cod_rar if (prez.cod_rar and prez.cod_rar != '—') else 'nemapat' %}
|
{% set cod_afis = prez.coduri_rar | join(', ') if prez.coduri_rar else 'nemapat' %}
|
||||||
<div class="card" id="detaliu-card-{{ id }}" style="border:none; padding:0; margin:0;">
|
<div class="card" id="detaliu-card-{{ id }}" style="border:none; padding:0; margin:0;">
|
||||||
|
|
||||||
{# === Header — #id + pill stare + badge mediu RAR + motiv === #}
|
{# === Header — #id + pill stare + badge mediu RAR + motiv === #}
|
||||||
|
|||||||
@@ -123,6 +123,28 @@ def test_cod_rar_gol_cand_nemapat():
|
|||||||
assert d3["cod_rar"] == EMPTY
|
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():
|
def test_operatie_ramane_denumire_sau_op():
|
||||||
"""operatie si cod raman neschimbate (compatibilitate cu apelantii existenti)."""
|
"""operatie si cod raman neschimbate (compatibilitate cu apelantii existenti)."""
|
||||||
# cu ambele coduri -> operatie=denumire, cod=cod_prestatie (neschimbat)
|
# cu ambele coduri -> operatie=denumire, cod=cod_prestatie (neschimbat)
|
||||||
|
|||||||
@@ -214,6 +214,34 @@ def test_detaliu_trimitere(client):
|
|||||||
assert "99001" in html # nr prezentare RAR
|
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,
|
# Tabel trimiteri — eticheta umana sub pill, fara chevron,
|
||||||
# cod RAR simplu (fara prefix), randul declanseaza modalul. Teste de randare.
|
# cod RAR simplu (fara prefix), randul declanseaza modalul. Teste de randare.
|
||||||
|
|||||||
Reference in New Issue
Block a user