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:
@@ -19,9 +19,25 @@ from __future__ import annotations
|
||||
|
||||
import hashlib
|
||||
import json
|
||||
import re
|
||||
from typing import Any
|
||||
|
||||
|
||||
NRINM_STRIP_RE = re.compile(r"[\s\-.]+")
|
||||
|
||||
|
||||
def normalize_nr_inmatriculare(value: object) -> str:
|
||||
"""Normalizare canonica nr. inmatriculare: strip, upper, elimina spatii/cratime/puncte.
|
||||
|
||||
Formate reale ("B 99 XYZ", "B-99-XYZ") nu treceau NRINM_RE (app.validation) fara
|
||||
aceasta curatare (spike SQL: doar 13.8% din numerele istorice treceau strict
|
||||
^[A-Z0-9]{1,10}$). Folosita consecvent in models.PrezentareIn, validation._norm
|
||||
si canonicalize_row de mai jos ca sa nu diverga validarea de cheia de dedup.
|
||||
"""
|
||||
s = str(value or "").strip().upper()
|
||||
return NRINM_STRIP_RE.sub("", s)
|
||||
|
||||
|
||||
def _op_identity(p: Any) -> str:
|
||||
"""Cod RAR (normalizat) daca exista, altfel codul intern ROAAUTO."""
|
||||
get = p.get if isinstance(p, dict) else (lambda k, d=None: getattr(p, k, d))
|
||||
@@ -41,7 +57,7 @@ def canonicalize_row(raw: dict[str, Any]) -> dict[str, Any]:
|
||||
- prestatii: pastrate ca-atare (rezolvarea e in resolve_prestatii).
|
||||
"""
|
||||
vin = (raw.get("vin") or "").strip().upper()
|
||||
nr = (raw.get("nr_inmatriculare") or "").strip().upper()
|
||||
nr = normalize_nr_inmatriculare(raw.get("nr_inmatriculare"))
|
||||
|
||||
# Odometru: strip ".0" Excel float coercion
|
||||
odo_raw = raw.get("odometru_final")
|
||||
|
||||
Reference in New Issue
Block a user