fix(nrinmatriculare): normalizeaza spatii/cratime/puncte consecvent pe toate canalele

Doar 13.8% din numerele de inmatriculare istorice treceau validarea stricta
^[A-Z0-9]{1,10}$ (spike SQL), majoritatea din cauza formatelor reale cu
spatii/cratime ("B 99 XYZ", "B-99-XYZ") pe care normalizarea actuala
(strip+upper) nu le curata.

Adauga normalize_nr_inmatriculare() in app.idempotency (deja punctul comun
API+import pentru canonicalize_row) si o foloseste consecvent in:
- models.PrezentareIn (validare shape / normalizare API)
- validation.validate_prezentare (validare continut)
- idempotency.canonicalize_row (cheia de dedup)

Fara aceasta consecventa, validarea si idempotency ar diverge pe acelasi
numar de inmatriculare in formate echivalente.
This commit is contained in:
Claude Agent
2026-07-10 13:43:37 +00:00
parent 1091745789
commit 37172ae2f9
5 changed files with 82 additions and 8 deletions

View File

@@ -63,10 +63,28 @@ def test_nrinmatriculare_prea_lung():
def test_nrinmatriculare_caracter_special():
errors = validate_prezentare(_base(nr_inmatriculare="B-99"))
errors = validate_prezentare(_base(nr_inmatriculare="B_99"))
assert "nr_inmatriculare" in _fields(errors)
def test_nrinmatriculare_normalizeaza_spatii():
c = _base(nr_inmatriculare="B 99 XYZ")
assert c["nr_inmatriculare"] == "B99XYZ"
assert validate_prezentare(c) == []
def test_nrinmatriculare_normalizeaza_cratime():
c = _base(nr_inmatriculare="B-99-XYZ")
assert c["nr_inmatriculare"] == "B99XYZ"
assert validate_prezentare(c) == []
def test_nrinmatriculare_normalizeaza_puncte():
c = _base(nr_inmatriculare="B.99.XYZ")
assert c["nr_inmatriculare"] == "B99XYZ"
assert validate_prezentare(c) == []
def test_data_prea_veche():
errors = validate_prezentare(_base(data_prestatie="2024-11-30"))
assert "data_prestatie" in _fields(errors)
@@ -135,7 +153,7 @@ def test_b64image_valid_ok():
def test_erori_multiple_cumulate():
errors = validate_prezentare(_base(vin="BAD", nr_inmatriculare="X-Y", data_prestatie="2024-01-01"))
errors = validate_prezentare(_base(vin="BAD", nr_inmatriculare="X_Y", data_prestatie="2024-01-01"))
assert {"vin", "nr_inmatriculare", "data_prestatie"} <= _fields(errors)
@@ -215,7 +233,7 @@ def test_back_compat_field_message():
"""Fiecare eroare are inca field + message (forma veche)."""
errs = validate_prezentare(_base(
vin="BAD",
nr_inmatriculare="X-Y",
nr_inmatriculare="X_Y",
data_prestatie="2024-01-01",
odometru_final="abc",
prestatii=[],
@@ -232,7 +250,7 @@ def test_toate_codurile_in_catalog():
cazuri = [
_base(vin="WVWZZZ1OZAW000123"), # VIN_FORMAT
_base(nr_inmatriculare="X-Y"), # NR_INMATRICULARE_FORMAT
_base(nr_inmatriculare="X_Y"), # NR_INMATRICULARE_FORMAT
_base(data_prestatie="15-06-2026"), # DATA_FORMAT
_base(data_prestatie="2024-11-30"), # DATA_PREA_VECHE
_base(data_prestatie=(today_bucuresti() + timedelta(days=1)).isoformat()), # DATA_VIITOR