feat(5.8): reguli mapare pe text (substring/cont) + UX tabel trimiteri (detaliu inline, fara scroll, cod RAR)

Reguli text per cont (operation_text_rules), resolve_prestatii cu param aditiv
text_rules + precedenta stricta, threadat pe toate cele 6 callsite-uri + valid_codes
+ seam classify_prezentare. UI Mapari: sectiune reguli + preview pre-salvare + overlap
+ telemetrie text_rule_hit. UX tabel: cod_rar sub operatie, pill eticheta scurta, fara
scroll orizontal (scopat .tabel-trimiteri + carduri <768px), detaliu inline expandabil
(a11y + pauza poll). code-review: reparat regula auto_send=0 care trimitea automat la RAR
in loc sa tina randul pentru review. 814 passed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-06-24 12:47:37 +00:00
parent c80c79462c
commit 51dc504f1d
28 changed files with 3023 additions and 61 deletions

View File

@@ -108,6 +108,78 @@ def test_resolve_fara_valid_codes_e_backcompat():
assert unmapped == []
# --------------------------------------------------------------------------- #
# US-002: reguli text (substring) dupa maparea exacta #
# --------------------------------------------------------------------------- #
def test_regula_text_contains_rezolva():
"""O operatie nemapata al carei text CONTINE pattern-ul primeste codul regulii."""
text_rules = [{"pattern": "verificare", "cod_prestatie": "OE-2", "auto_send": 0, "priority": 0}]
resolved, unmapped = resolve_prestatii(
[{"cod_op_service": "OP1", "denumire": "Verificare faruri"}],
{},
valid_codes={"OE-2"},
text_rules=text_rules,
)
assert resolved[0]["cod_prestatie"] == "OE-2"
assert unmapped == []
def test_mapare_exacta_bate_regula_text():
"""Maparea exacta cod_op_service->cod are precedenta peste regula text."""
text_rules = [{"pattern": "verificare", "cod_prestatie": "OE-2", "auto_send": 0, "priority": 0}]
resolved, unmapped = resolve_prestatii(
[{"cod_op_service": "OP1", "denumire": "Verificare faruri"}],
{"OP1": "OE-1"},
valid_codes={"OE-1", "OE-2"},
text_rules=text_rules,
)
assert resolved[0]["cod_prestatie"] == "OE-1" # maparea exacta castiga
assert unmapped == []
def test_regula_text_insensibila_diacritice_caz():
"""Match-ul e insensibil la diacritice si majuscule (ambele parti normalizate)."""
text_rules = [{"pattern": "Verificări", "cod_prestatie": "OE-2", "auto_send": 0, "priority": 0}]
resolved, unmapped = resolve_prestatii(
[{"cod_op_service": "OP1", "denumire": "VERIFICARI complete auto"}],
{},
valid_codes={"OE-2"},
text_rules=text_rules,
)
assert resolved[0]["cod_prestatie"] == "OE-2"
assert unmapped == []
def test_regula_text_cod_invalid_in_nomenclator_ramane_nemapat():
"""Regula da match dar codul ei nu e in nomenclator -> operatia ramane nemapata."""
text_rules = [{"pattern": "verificare", "cod_prestatie": "ZZZ", "auto_send": 0, "priority": 0}]
resolved, unmapped = resolve_prestatii(
[{"cod_op_service": "OP1", "denumire": "Verificare faruri"}],
{},
valid_codes={"OE-2"},
text_rules=text_rules,
)
assert resolved[0]["cod_prestatie"] is None
assert unmapped == [{"cod_op_service": "OP1", "denumire": "Verificare faruri"}]
def test_prima_regula_dupa_priority_castiga():
"""La match multiplu castiga prima regula in ordinea listei (priority, id)."""
text_rules = [
{"pattern": "verificare faruri", "cod_prestatie": "OE-3", "auto_send": 0, "priority": 0},
{"pattern": "verificare", "cod_prestatie": "OE-2", "auto_send": 0, "priority": 1},
]
resolved, unmapped = resolve_prestatii(
[{"cod_op_service": "OP1", "denumire": "Verificare faruri"}],
{},
valid_codes={"OE-2", "OE-3"},
text_rules=text_rules,
)
assert resolved[0]["cod_prestatie"] == "OE-3" # prima din lista
assert unmapped == []
# --------------------------------------------------------------------------- #
# Flux complet (API) #
# --------------------------------------------------------------------------- #