Une pesée (bascule ou manuelle) s'enregistre désormais dès la validation de sa
modale, sans exiger la contrepartie ni l'immatriculation : le ticket naît
« brouillon » (status DRAFT, sans numéro). Le bouton « Valider » finalise quand
les 3 champs du haut (contrepartie + champ associé + immatriculation) ET les 2
pesées sont renseignés : attribution du numéro {siteCode}-TP-{NNNN} et passage
en VALIDATED, puis ouverture du bon de pesée PDF.
Back : counterparty_type/immatriculation/number nullables + colonne status
(migration racine), contraintes strictes déplacées en groupe de validation
finalize, opération PATCH /weighing_tickets/{id}/validate, numéro attribué à la
validation. Front : 4 champs en haut hors blocs, persistance immédiate des
pesées, écrans Ajouter/Modifier refondus, colonne Statut dans la liste, form à
plat pleine largeur. Tests back (lifecycle brouillon/validate) + front à jour.
Le champ Date des blocs de pesée passe de MalioDate (date seule, heure perdue
-> 00:00:00 en base) à MalioDateTime (date + heure). Défaut = instant courant
(nowIsoDateTime) et ré-horodatage à la validation d'une pesée (bascule ou
manuelle) via applyReading : la date du ticket reflète le moment réel de la
pesée. L'hydratation en modification conserve l'heure du back (TIMESTAMP).
- Modale « Pesée manuelle » : champ Poids passé en MalioInputText verrouillé sur
les chiffres (NUMERIC_MASK), comme le formulaire.
- Masques de pesée factorisés dans utils/weighingMasks (NUMERIC / PLATE / FREE_PLATE).
- Écran Modification : suppression des champs lecture seule « Numéro » et « Site »
en tête (le numéro reste rappelé dans le titre de l'écran).
« Tout format » n'est plus un champ libre total : masque maska charset
(lettres/chiffres/espace/tiret, MAJ, longueur libre) pour les plaques anciennes
ou étrangères, filtrant accents/ponctuation/symboles. Format autoritaire côté serveur.
- Poids/DSD en champs texte verrouillés sur les chiffres et désactivés.
- Boutons de pesée : icône mdi:weight à gauche + gap-8.
- Bloc « Poids à vide » réagencé en 3 lignes (contrepartie / Date-Poids-DSD-Immat / Tout format).
- Omission des clés null dans les payloads (compact) : requis vides → message NotBlank métier au lieu d'une erreur de type.
- Pesée obligatoire (RG-5.07) signalée inline sous Poids/DSD ; toutes les violations affichées d'un seul aller-retour.
- Erreur d'immatriculation affichée uniquement sur le bloc « Poids à vide » (plus de doublon sur le bloc plein).