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

@@ -18,6 +18,7 @@ from datetime import date
from zoneinfo import ZoneInfo
from app.errors import eroare as _eroare
from app.idempotency import normalize_nr_inmatriculare
# VIN: 17 caractere, majuscule, fara O/I/Q (plan §2 + contract).
VIN_RE = re.compile(r"^[A-HJ-NPR-Z0-9]{17}$")
@@ -73,7 +74,7 @@ def validate_prezentare(content: dict) -> list[dict]:
))
# --- nrInmatriculare ---
nrinm = _norm(content.get("nr_inmatriculare"))
nrinm = normalize_nr_inmatriculare(content.get("nr_inmatriculare"))
if not NRINM_RE.match(nrinm):
errors.append(_eroare(
"NR_INMATRICULARE_FORMAT",