refactor: comentarii strict functionale, fara referinte PRD/stories

Curatare globala a comentariilor si docstring-urilor (app, tools, teste,
scripturi): eliminate referintele la PRD-uri, US-xxx, task-uri istorice si
review-uri; pastrata doar informatia functionala, formulata scurt. Regula
adaugata in CLAUDE.md (sectiunea Stil). Fara modificari de cod sau comportament.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-07-06 13:48:38 +00:00
parent 86408887e5
commit 44f261e269
226 changed files with 1313 additions and 1760 deletions

View File

@@ -1,16 +1,14 @@
"""Teste US-006 (PRD 5.15): prestatii multi-cod (lista) la editare/corectie.
"""Prestatii multi-cod (lista) la editare/corectie.
AC-uri verificate:
Verifica:
- Handler-ele accepta LISTA de cod_prestatie (form.getlist) -> prestatii cu mai multe coduri.
- cod_op_service/denumire RAMAN pe item (invariant D7, E1 IRON RULE).
- cod_op_service/denumire RAMAN pe item.
- Cod invalid -> respins cu mesaj; cod necunoscut NU ajunge la RAR (ORA-12899).
- Lista goala -> ramane needs_mapping.
- Dedup per-item: (op_service, cod) unic, NU cod unic (doua ops diferite cu acelasi cod ok).
- Recalcul idempotenta dupa editare.
- odometruInitial obligatoriu cand cod_prestatie contine R-ODO/I-ODO.
- REGRESIE E1 (IRON RULE): op_service supravietuieste /repune cu cod.
TDD: toate testele sunt scrise INAINTE de implementare (RED -> GREEN).
- op_service supravietuieste /repune cu cod.
"""
from __future__ import annotations
@@ -145,10 +143,7 @@ def _payload_cu_ops(vin: str, ops: list[tuple[str, str]]) -> dict:
# --------------------------------------------------------------------------- #
def test_mai_multe_coduri_acceptate(client):
"""US-006 AC1: LISTA de cod_prestatie -> prestatii cu N itemi, fiecare cu cod setat.
RED: form.get("cod_prestatie") intoarce doar primul cod; form.getlist necesar.
"""
"""LISTA de cod_prestatie -> prestatii cu N itemi, fiecare cu cod setat."""
acct = _create_account_user("multi.cod@test.com")
_login(client, "multi.cod@test.com")
_seed_cod("OE-1", "Schimb ulei")
@@ -179,11 +174,7 @@ def test_mai_multe_coduri_acceptate(client):
def test_cod_op_service_pastrat_dupa_corecteaza(client):
"""E1/D7: cod_op_service si denumire RAMAN pe item dupa /corecteaza cu cod direct.
RED: implementarea veche injecta in prestatii[0] fara sa afecteze op_service
(intr-adevar in /corecteaza nu se facea pop), dar testul confirma explicit invariantul.
"""
"""cod_op_service si denumire RAMAN pe item dupa /corecteaza cu cod direct."""
acct = _create_account_user("op.pastrat@test.com")
_login(client, "op.pastrat@test.com")
_seed_cod("OE-1")
@@ -209,10 +200,7 @@ def test_cod_op_service_pastrat_dupa_corecteaza(client):
def test_cod_invalid_respins(client):
"""US-006 AC3: cod necunoscut in nomenclator -> respins cu mesaj, status neschimbat.
RED: validarea fata de nomenclator nu e aplicata per-cod la multi-select.
"""
"""Cod necunoscut in nomenclator -> respins cu mesaj, status neschimbat."""
acct = _create_account_user("cod.invalid@test.com")
_login(client, "cod.invalid@test.com")
# NU seed-uim "XX-99" -> cod necunoscut
@@ -240,11 +228,7 @@ def test_cod_invalid_respins(client):
def test_lista_goala_needs_mapping(client):
"""US-006 AC4: nicio cod_prestatie trimis -> submission ramane needs_mapping.
RED: cu multi-select, lista goala nu injecteaza nimic; resolve_prestatii
gaseste inca operatii nemapate -> trebuie sa ramana needs_mapping.
"""
"""Nicio cod_prestatie trimis -> submission ramane needs_mapping."""
acct = _create_account_user("goala.nemap@test.com")
_login(client, "goala.nemap@test.com")
# NU seed-uim nicio mapare -> operatia ramane nemapata
@@ -267,11 +251,7 @@ def test_lista_goala_needs_mapping(client):
def test_idempotency_recalculat(client):
"""US-006 AC6: dupa setarea de coduri noi, cheia de idempotenta e recalculata.
RED: single-cod injecta in prestatii[0] si recalcula cheia; cu multi-cod
acelasi mecanism se aplica tuturor itemilor.
"""
"""Dupa setarea de coduri noi, cheia de idempotenta e recalculata."""
acct = _create_account_user("ido.recalc@test.com")
_login(client, "ido.recalc@test.com")
_seed_cod("OE-1")
@@ -296,12 +276,8 @@ def test_idempotency_recalculat(client):
def test_odometru_initial_conditionat_R_ODO(client):
"""US-006 AC7: cod_prestatie=R-ODO fara odometruInitial -> validate_prezentare
intoarce eroare -> submission ramane needs_data (NU queued).
RED: validarea R-ODO e deja in validate_prezentare; testul confirma ca
multi-cod nu bypass-eaza aceasta regula.
"""
"""cod_prestatie=R-ODO fara odometruInitial -> validate_prezentare
intoarce eroare -> submission ramane needs_data (NU queued)."""
acct = _create_account_user("odo.rodo@test.com")
_login(client, "odo.rodo@test.com")
_seed_cod("R-ODO", "Revizie odometru")
@@ -334,12 +310,10 @@ def test_odometru_initial_conditionat_R_ODO(client):
def test_dedup_per_item_nu_dupa_cod(client):
"""US-006 AC5 (E4): doua operatii DIFERITE cu ACELASI cod RAR ambele supravietuiesc.
"""Doua operatii DIFERITE cu ACELASI cod RAR ambele supravietuiesc.
Dedup = (op_service, cod) identice, NU cod singur. Doua ops distincte pot
mapa legitim la acelasi cod RAR fara sa fie sterse de dedup.
RED: dedupare naiva dupa cod ar sterge a doua operatie (op-B cu acelasi OE-1).
"""
acct = _create_account_user("dedup.ops@test.com")
_login(client, "dedup.ops@test.com")
@@ -371,17 +345,14 @@ def test_dedup_per_item_nu_dupa_cod(client):
# --------------------------------------------------------------------------- #
# Test de regresie E1 (IRON RULE): op_service supravietuieste /repune cu cod #
# op_service supravietuieste /repune cu cod #
# --------------------------------------------------------------------------- #
def test_op_service_supravietuieste_repune_cu_cod(client):
"""E1 IRON RULE: dupa /repune cu cod_prestatie, cod_op_service/denumire RAMAN pe item.
"""Dupa /repune cu cod_prestatie, cod_op_service/denumire RAMAN pe item.
RED: routes.py:1371 face `p0.pop("cod_op_service", None)` — sterge operatia
cand se seteaza un cod direct prin /repune. US-006 ELIMINA acel pop.
Aceasta regresie e CRITICA: sterge contextul op->cod necesar pentru US-009
(salvare mapare din chip) si rupe invariantul D7.
Fara acest invariant se pierde contextul op->cod necesar pentru salvarea
maparii din chip.
"""
acct = _create_account_user("e1.repune@test.com")
_login(client, "e1.repune@test.com")
@@ -429,15 +400,12 @@ def test_op_service_supravietuieste_repune_cu_cod(client):
def test_repune_nu_trunchiaza_prestatii_multiple(client):
"""Bug fix (code-review 5.15): /repune NU pierde prestatii[1:].
"""/repune nu pierde prestatii[1:].
Formularul /repune trimite UN SINGUR select cod_prestatie. Implementarea veche
itera `enumerate(codes)` -> pastra doar len(codes) itemi, deci un rand error cu
2+ prestatii pierdea toate prestatiile dupa prima -> declaratie INCOMPLETA la RAR
(FINALIZATA ireversibil). Fix: iteram peste `existing`, aplicam codes pozitional,
pastram toate prestatiile.
RED inainte de fix: len(prestatii) == 1 (a doua prestatie pierduta).
Formularul /repune trimite UN SINGUR select cod_prestatie; codul se aplica
pozitional peste toate prestatiile existente, care raman toate (altfel un
rand error cu 2+ prestatii ar pierde restul -> declaratie INCOMPLETA la RAR,
FINALIZATA ireversibil).
"""
acct = _create_account_user("repune.multi@test.com")
_login(client, "repune.multi@test.com")
@@ -479,14 +447,10 @@ def test_repune_nu_trunchiaza_prestatii_multiple(client):
def test_corectie_eroare_validare_pastreaza_picker(client):
"""Bug fix (code-review 5.15): re-render-ul de eroare validare pastreaza optiunile pickerului.
"""Re-render-ul de eroare validare pastreaza optiunile pickerului.
post_corectie_trimitere re-randa _trimitere_detaliu pe ramura erori-validare FARA
`conn`/`account_id` -> `nomenclator_rar=[]` -> picker-ul chips randa ZERO optiuni ->
userul nu mai poate alege cod RAR fara sa inchida+redeschida modalul. Fix: pasam
`conn`+`account_id` la _detaliu_ctx pe TOATE ramurile de re-render.
RED inainte de fix: codul de picker "PK-1" lipseste din re-render.
_detaliu_ctx primeste `conn`+`account_id` pe toate ramurile de re-render;
altfel `nomenclator_rar=[]` si picker-ul chips randeaza zero optiuni.
"""
acct = _create_account_user("corectie.picker@test.com")
_login(client, "corectie.picker@test.com")
@@ -517,11 +481,7 @@ def test_corectie_eroare_validare_pastreaza_picker(client):
def test_repune_select_afiseaza_denumirea(client):
"""Bug fix (code-review 5.15): selectul /repune afiseaza denumirea operatiei.
Template-ul folosea cheia gresita `item.nome_prestatie` (typo) -> optiunile
apareau ca "AAA — " fara denumire. Cheia corecta e `nume_prestatie`.
"""
"""Selectul /repune afiseaza denumirea operatiei, nu doar codul gol."""
acct = _create_account_user("repune.denumire@test.com")
_login(client, "repune.denumire@test.com")
_seed_cod("AAA", "Schimb ulei motor")
@@ -547,16 +507,11 @@ def test_repune_select_afiseaza_denumirea(client):
# ============================================================================= #
# Teste noi 5.16: US-004 (denumiri picker), US-005 (add_extra), #
# US-006 (save picker fara buton), T-E3 (by-index), T-D1/T-E5, T-C1/T-E4 #
# Picker: denumiri, cod extra, salvare fara buton, aliniere by-index #
# ============================================================================= #
def test_picker_flat_arata_cod_si_denumire(client):
"""US-004 (5.16): picker plat afiseaza 'cod — denumire', nu doar codul.
RED: _chips_prestatii.html:147 afiseaza doar {{ n.cod_prestatie }};
modul operatii (:101) afiseaza deja 'cod — nume'. Fix: uniformizare.
"""
"""Picker plat afiseaza 'cod — denumire', nu doar codul."""
acct = _create_account_user("picker.flat.denu@test.com")
_login(client, "picker.flat.denu@test.com")
_seed_cod("FRN1", "Sistem de franare")
@@ -580,10 +535,7 @@ def test_picker_flat_arata_cod_si_denumire(client):
def test_adauga_cod_extra_in_mod_operatii(client):
"""US-005 (5.16): in mod operatii, actiunea add_extra adauga un cod RAR liber.
RED: post_form_chips nu are actiunea 'add_extra' -> chips_action ignorata.
"""
"""In mod operatii, actiunea add_extra adauga un cod RAR liber."""
acct = _create_account_user("add.extra.ops@test.com")
_login(client, "add.extra.ops@test.com")
_seed_cod("OE-1", "Schimb ulei motor")
@@ -612,7 +564,7 @@ def test_adauga_cod_extra_in_mod_operatii(client):
def test_extra_cod_persistat_la_salvare(client):
"""US-005 (5.16): codul extra adaugat via form-chips e salvat la /corecteaza.
"""Codul extra adaugat via form-chips e salvat la /corecteaza.
Simulam starea form dupa add_extra: hidden inputs pentru op mapata (OE-1)
+ hidden inputs pentru chip extra flat (FRN1, fara op_service).
@@ -649,10 +601,7 @@ def test_extra_cod_persistat_la_salvare(client):
def test_extra_cod_validat_nomenclator(client):
"""US-005 (5.16): add_extra respinge cod necunoscut in nomenclator (invariant ORA-12899).
RED: actiunea add_extra nu exista; dupa fix, cod invalid nu se adauga.
"""
"""add_extra respinge cod necunoscut in nomenclator (invariant ORA-12899)."""
acct = _create_account_user("extra.valid@test.com")
_login(client, "extra.valid@test.com")
_seed_cod("OE-1", "Schimb ulei")
@@ -681,12 +630,7 @@ def test_extra_cod_validat_nomenclator(client):
def test_cod_ales_in_picker_se_salveaza_fara_buton_add(client):
"""US-006 (5.16): codul ales in picker flat se aplica la /corecteaza fara a apasa '+'.
RED: post_corectie_trimitere citeste form.getlist('cod_prestatie') (hidden inputs)
dar ignora 'chips_add_cod_flat' (picker neselectat ca chip) → submission ramane
needs_mapping desi codul e ales.
"""
"""Codul ales in picker flat se aplica la /corecteaza fara a apasa '+'."""
acct = _create_account_user("picker.save.nobutton@test.com")
_login(client, "picker.save.nobutton@test.com")
_seed_cod("OE-1", "Schimb ulei motor")
@@ -723,7 +667,7 @@ def test_cod_ales_in_picker_se_salveaza_fara_buton_add(client):
def test_salvare_fara_chip_explicit_nu_e_no_op(client):
"""US-006 (5.16): o trimitere needs_mapping cu cod ales in picker nu ramane no-op.
"""O trimitere needs_mapping cu cod ales in picker nu ramane no-op.
Complementar cu test_cod_ales_in_picker_se_salveaza_fara_buton_add: verifica
explicit ca statusul se schimba (nu ramane needs_mapping).
@@ -759,7 +703,7 @@ def test_salvare_fara_chip_explicit_nu_e_no_op(client):
def test_picker_by_index_op2_nu_op1(client):
"""T-E3 (5.16): codul ales pe picker-ul op#2 aterizeaza pe op#2, NU pe op#1.
"""Codul ales pe picker-ul op#2 aterizeaza pe op#2, NU pe op#1.
Verifica alinierea by-index in modul operatii: chips_add_op_index=1 + chips_add_cod_1
actualizeaza chips[1] (op#2), nu chips[0] (op#1).
@@ -799,11 +743,10 @@ def test_picker_by_index_op2_nu_op1(client):
def test_empty_state_picker_nomenclator_gol(client):
"""T-D1/T-E5 (5.16): empty-state vizibil cand nomenclatorul e gol.
"""Empty-state vizibil cand nomenclatorul e gol.
RED: {% if nomenclator_rar %} fara {% else %} -> silentios; un rand needs_mapping
fara nomenclator nu are nicio cale de a adauga cod (nereparabil silentios).
GREEN: div.chips-nom-gol vizibil.
Un rand needs_mapping fara nomenclator randeaza div.chips-nom-gol,
altfel nu are nicio cale de a adauga cod.
"""
acct = _create_account_user("empty.nom@test.com")
_login(client, "empty.nom@test.com")
@@ -831,10 +774,9 @@ def test_empty_state_picker_nomenclator_gol(client):
def test_add_extra_semnal_vizibil_cod_invalid(client):
"""T-C1/T-E4 (5.16): add_extra cu cod invalid da semnal vizibil (nu esua silentios).
"""add_extra cu cod invalid da semnal vizibil (nu esua silentios).
RED: actiunea add_extra nu exista → nu exista niciun semnal.
GREEN: div.chips-extra-error vizibil cand codul e invalid sau selectul e gol.
div.chips-extra-error vizibil cand codul e invalid sau selectul e gol.
"""
acct = _create_account_user("extra.err.signal@test.com")
_login(client, "extra.err.signal@test.com")