feat(editor): editor prestatii unificat in modal - un select, un rand de chips (PRD 5.23)

Inlocuieste cele 3 controale de asociere cod RAR cu un singur rand de chips
+ un singur select care adauga instant la change. Stare = un hidden chips_state
JSON versionat; post_form_chips redus la 2 actiuni (add/remove). Optgroup
Sugestii (fuzzy/k-NN) + optiune "Nu se declara la RAR" in select, cu tinta
implicita evidentiata si placeholder care o numeste. exclus persistat prin
payload_json (treapta noua de precedenta in resolve_prestatii, round-trip complet).

Siguranta: itemii exclusi sunt scosi din payload la momentul trimiterii
(worker split_prestatii_excluse inainte de build_rar_payload + filtru defensiv),
ca sa nu ajunga NICIODATA la RAR ca codPrestatie:null.

Suita: 1680 passed, 1 skipped.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-07-08 15:45:34 +00:00
parent 0bc618763e
commit 56ebe1f7cb
20 changed files with 2839 additions and 552 deletions

View File

@@ -266,11 +266,16 @@ def resolve_prestatii(
COD_PRESTATIE max 5 car.); un cod necunoscut da HTTP 500 si RECORD PARTIAL
la RAR (terminal) -> nu-l trimitem niciodata raw.
Precedenta (stricta): `cod_prestatie` direct valid > exclus de la declarare >
mapare exacta `cod_op_service` in `mapping` > reguli text > nemapat. Un cod ales
explicit pe rand (editor) bate regula de excludere; regula de excludere bate
regulile text. Regulile text se incearca DOAR cand nu exista cod valid SI op
nu e in `mapping`.
Precedenta (stricta): item-exclus EXPLICIT (`exclus=1` venit pe item, ex. din
editorul de chips) > `cod_prestatie` direct valid > exclus de la declarare
(regula de cont) > mapare exacta `cod_op_service` in `mapping` > reguli text >
nemapat. Un item marcat explicit `exclus` de utilizator (editor) domina TOT —
inclusiv un `cod_prestatie` deja valid pe rand — pentru ca alegerea explicita
"Nu se declara la RAR" e intentia cea mai recenta si trebuie sa supravietuiasca
re-rezolvarii (altfel un item exclus ar reveni needs_mapping sau, mai rau, ar fi
declarat la RAR). Restul precedentei (cod valid > exclus de cont > mapare >
reguli text) e NESCHIMBAT. Regulile text se incearca DOAR cand nu exista cod
valid SI op nu e in `mapping`.
`valid_codes` = setul de coduri RAR valide (uppercase) din nomenclator. Cand e
None, validarea e dezactivata (compat: comportamentul vechi „cod_prestatie trece
@@ -295,11 +300,21 @@ def resolve_prestatii(
# un cod_sursa/flag stale din payload -> telemetrie falsa + hold gresit.
it.pop("cod_sursa", None)
it.pop("regula_fara_autosend", None)
it.pop("exclus", None)
exclus_explicit = bool(it.pop("exclus", None))
cod = (it.get("cod_prestatie") or "").strip().upper()
op = (it.get("cod_op_service") or "").strip()
cod_valid = bool(cod) and (valid_codes is None or cod in valid_codes)
if cod_valid:
if exclus_explicit:
# Treapta noua (precedenta maxima): alegerea explicita "Nu se declara la
# RAR" (editor de chips) supravietuieste re-rezolvarii, chiar daca ramane
# (sau a ramas) un cod_prestatie valid pe rand.
if cod and not op:
op = cod
if op and not it.get("cod_op_service"):
it["cod_op_service"] = op
it["cod_prestatie"] = None
it["exclus"] = True
elif cod_valid:
it["cod_prestatie"] = cod
else:
# cod lipsa SAU necunoscut in nomenclator -> ruta de mapare.