422 * par le Processor). En « Tout format » (anciennes plaques, etranger, engins), * seul le trim + UPPER s'applique. * - otherLabel (RG-5.03) : trim ; une chaine vide apres trim devient null (evite * de persister "" dans une colonne nullable). * * Methodes null-safe : une entree null ressort null (l'obligation eventuelle est * portee par les Assert de l'entite / la coherence contrepartie, pas ici). */ final class WeighingTicketFieldNormalizer { /** * Plaque SIV « nue » (sans separateurs) : 2 lettres, 3 chiffres, 2 lettres. * Les lettres interdites du SIV (I, O, U + SS) ne sont pas filtrees ici : le * masque de saisie reste volontairement simple (le metier accepte ces cas via * « Tout format » si besoin). */ private const string SIV_BARE_PATTERN = '/^[A-Z]{2}[0-9]{3}[A-Z]{2}$/'; /** * Normalise l'immatriculation (RG-5.01 / RG-5.10). * * @param bool $freeFormat « Tout format » coche -> masque SIV desactive * * @throws InvalidImmatriculationException si !freeFormat et la plaque ne * respecte pas le masque XX-000-XX */ public function normalizeImmatriculation(?string $value, bool $freeFormat): ?string { if (null === $value) { return null; } $value = mb_strtoupper(trim($value), 'UTF-8'); if ('' === $value) { return null; } // « Tout format » : aucune contrainte de masque (RG-5.01). if ($freeFormat) { return $value; } // Masque SIV : on ignore tout ce qui n'est pas alphanumerique (l'operateur // peut saisir « ab123cd », « AB 123 CD » ou « AB-123-CD ») puis on valide // le squelette 2-3-2 et on repose les separateurs canoniques. $bare = preg_replace('/[^A-Z0-9]/', '', $value) ?? ''; if (1 !== preg_match(self::SIV_BARE_PATTERN, $bare)) { throw new InvalidImmatriculationException( 'Format d\'immatriculation invalide : attendu XX-000-XX (cochez « Tout format » pour une plaque libre).', ); } return sprintf('%s-%s-%s', substr($bare, 0, 2), substr($bare, 2, 3), substr($bare, 5, 2)); } /** * Trim du libelle « Autre » (RG-5.03). Une chaine vide apres trim devient null. */ public function normalizeOtherLabel(?string $value): ?string { if (null === $value) { return null; } $value = trim($value); return '' === $value ? null : $value; } }