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

@@ -86,8 +86,8 @@ def test_submissions_coloane_umane(client):
resp = client.get("/_fragments/submissions")
assert resp.status_code == 200
html = resp.text
# Antete romanesti
for antet in ("Stare", "Vehicul", "Operatie", "Data prestatie", "Nr. prezentare RAR", "Motiv"):
# Antete romanesti (Motiv a iesit din tabel in PRD 5.8 US-007 -> traieste in detaliu)
for antet in ("Stare", "Vehicul", "Operatie", "Data prestatie", "Nr. prezentare RAR"):
assert antet in html, f"Lipseste antetul '{antet}'"
# "HTTP RAR" NU mai e antet principal de coloana
assert "<th>HTTP RAR</th>" not in html
@@ -112,18 +112,75 @@ def test_tab_eticheta_trimiteri(client):
def test_motiv_needs_data_afisat(client):
"""Pentru needs_data, coloana Motiv arata motivul (nu gol cand exista rar_error)."""
"""Pentru needs_data, motivul apare in detaliu (PRD 5.8 US-007: Motiv a iesit din tabel)."""
acct = _create_account_user("motiv@test.com")
_insert_submission(
sid = _insert_submission(
acct, "needs_data",
rar_error=json.dumps([{"field": "odometru_final", "message": "lipsa odometru"}]),
)
_login(client, "motiv@test.com")
resp = client.get("/_fragments/submissions")
resp = client.get(f"/_fragments/trimitere/{sid}")
assert resp.status_code == 200
assert "lipsa odometru" in resp.text
def test_tabel_nu_are_coloana_motiv(client):
"""PRD 5.8 US-007: coloana Motiv eliminata din thead/tbody (e in detaliu)."""
acct = _create_account_user("nomotiv@test.com")
_insert_submission(
acct, "needs_data",
rar_error=json.dumps([{"field": "odometru_final", "message": "lipsa odometru xyz"}]),
)
_login(client, "nomotiv@test.com")
resp = client.get("/_fragments/submissions")
assert resp.status_code == 200
html = resp.text
assert "<th>Motiv</th>" not in html
# continutul Motiv nu mai apare in tabel (a fost mutat in detaliu)
assert "lipsa odometru xyz" not in html
def test_operatie_contine_cod_rar(client):
"""PRD 5.8 US-007: coloana Operatie arata 'cod RAR: XXX' cand mapat, 'nemapat' cand nu."""
acct = _create_account_user("codrar@test.com")
# mapat: are cod_prestatie -> cod RAR vizibil
_insert_submission(acct, "sent", payload={
"vin": "WVWZZZ1JZXW000111",
"nr_inmatriculare": "B111AAA",
"data_prestatie": "2026-06-18",
"odometru_final": "10000",
"prestatii": [{"cod_prestatie": "OE-2", "denumire": "Verificare X"}],
})
# nemapat: doar cod_op_service -> "nemapat"
_insert_submission(acct, "needs_mapping", payload={
"vin": "WVWZZZ1JZXW000222",
"nr_inmatriculare": "B222BBB",
"data_prestatie": "2026-06-18",
"odometru_final": "20000",
"prestatii": [{"cod_op_service": "INTERN9", "denumire": "Spalare auto"}],
})
_login(client, "codrar@test.com")
resp = client.get("/_fragments/submissions")
assert resp.status_code == 200
html = resp.text
assert "cod RAR: OE-2" in html
assert "nemapat" in html
def test_pill_eticheta_scurta(client):
"""PRD 5.8 US-007/US-006: pill-ul de Stare foloseste eticheta scurta; textul lung in title."""
acct = _create_account_user("pill@test.com")
_insert_submission(acct, "sent", id_prezentare=70001)
_login(client, "pill@test.com")
resp = client.get("/_fragments/submissions")
assert resp.status_code == 200
html = resp.text
# eticheta scurta in pill
assert ">Finalizat<" in html
# textul lung pastrat ca tooltip (title)
assert 'title="Declarate la RAR' in html
def test_detaliu_trimitere(client):
"""/_fragments/trimitere/{id} intoarce detaliul complet scoped pe cont."""
acct = _create_account_user("det@test.com")