fix(import): persista chips prestatii la salvarea din modalul de editare rand

Editorul de rand din preview afisa chips-urile operatie<->cod RAR dar salvarea
extragea doar EDIT_FIELDS — codurile alese se pierdeau si randul ramanea
needs_mapping. Starea chips se reconstruieste din form (conventia /form-chips),
se valideaza fata de nomenclator si se persista in override_json.

Caile de commit (API + web) aplica acum override-ul INAINTE de resolve_prestatii,
ca in preview — altfel prestatiile editate ajungeau nerezolvate in payload.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-07-07 17:20:01 +00:00
parent 5a2c976d46
commit c6e29aa65d
3 changed files with 262 additions and 29 deletions

View File

@@ -266,8 +266,9 @@ def _build_idempotency_key(account_id: int | None, resolved: dict[str, Any], rar
return build_key(account_id, canon, rar_env)
# Campuri de continut editabile in preview. Operatia/codul RAR NU se editeaza
# aici (raman in panoul de mapare). obs = text liber, se trateaza ca non-canonic
# Campuri de continut editabile in preview. Prestatiile (chips operatie<->cod RAR)
# se editeaza tot in modal, dar se persista separat (param `prestatii` din
# apply_row_override), nu prin EDIT_FIELDS. obs = text liber, se trateaza ca non-canonic
# (doar .strip(), fara canonicalize_row) — urmeaza ramura `else` din _merge_override.
EDIT_FIELDS = ("vin", "nr_inmatriculare", "data_prestatie", "odometru_initial", "odometru_final", "obs")
@@ -318,9 +319,13 @@ def apply_row_override(
account_id: int | None,
row_index: int,
fields: dict[str, str | None],
prestatii: list[dict[str, str]] | None = None,
) -> dict[str, Any]:
"""Persista override-ul canonic pentru un rand de preview (mutatie PURA de stocare).
`prestatii`: None = neatins; lista = inlocuieste integral prestatiile randului
(chips editate in modal, deja validate fata de nomenclator de apelant).
NU recalculeaza statusul si NU atinge `submissions` — preview-ul rederiva statusul
prin `_resolve_row_for_preview` (un singur clasificator, fara drift).
@@ -358,6 +363,8 @@ def apply_row_override(
current = dec
new_override = _merge_override(current, fields)
if prestatii is not None:
new_override["prestatii"] = prestatii
enc = encrypt_creds(new_override) if new_override else None
# Resetam reviewed=0 la orice schimbare de valoare — operatorul
# trebuie sa reconfirme dupa editare. NU conditionam pe reviewed curent: orice override
@@ -1167,12 +1174,21 @@ def commit_import(
obs_denumire = str(denumire_val).strip() if denumire_val not in (None, "") else str(operatie_val)
mapped["obs"] = obs_denumire
# Override editat in preview — aplicat INAINTE de resolve_prestatii,
# ca in _resolve_row_for_preview: prestatiile din override (chips
# editate in modal) trec prin ACELASI resolve, altfel raman raw si
# hash-ul/telemetria ar folosi prestatiile pre-editare.
override = ok_row.get("override") or {}
if override:
mapped.update(override)
# Rezolva prestatii INAINTE de canonicalizare (altfel cheia difera de cea din preview)
prestatii = mapped.get("prestatii") or []
resolved, _ = resolve_prestatii(prestatii, mapping, valid_codes, text_rules)
mapped["prestatii"] = resolved
# Canonicalizare (dupa rezolvare prestatii -> cod_prestatie inclus in cheie)
# Canonicalizare (dupa rezolvare prestatii -> cod_prestatie inclus in cheie;
# cheia IDENTICA cu preview: _build_idempotency_key = canonicalize_row + build_key).
canon = canonicalize_row(mapped)
mapped.update({
"vin": canon["vin"],
@@ -1180,19 +1196,6 @@ def commit_import(
"odometru_final": canon["odometru_final"],
})
# Override editat in preview — aplicat ULTIMUL, ca in resolver.
override = ok_row.get("override") or {}
if override:
mapped.update(override)
# Re-canonicalizeaza pentru a obtine cheia IDENTICA cu cea din preview
# (_build_idempotency_key = canonicalize_row + build_key peste mapped).
canon = canonicalize_row(mapped)
mapped.update({
"vin": canon["vin"],
"nr_inmatriculare": canon["nr_inmatriculare"],
"odometru_final": canon["odometru_final"],
})
# Cheia de idempotenta (identica cu cheia din preview — aceeasi ordine + env)
key = build_key(account_id, canon, env)