feat(front) : écran ajouter un ticket de pesée (ERP-189) #141
Reference in New Issue
Block a user
Delete Branch "feat/erp-189-ecran-ajouter-ticket-pesee"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
ERP-189 — Écran « Ajouter un ticket de pesée » (M5, front)
Écran de création : 2 blocs empilés (Poids à vide / Poids à plein), pesée bascule + manuelle, contrepartie conditionnelle, masque immatriculation connecté entre blocs.
Contenu
/weighing-tickets/new(layerlogistique), gatéemanage.useWeighingTicketForm: état partagé des 2 blocs ; contrepartie conditionnelle CLIENT/FOURNISSEUR/AUTRE (RG-5.03, purge des champs hors-sujet) ; immatriculation + « Tout format » partagés entre blocs (RG-5.01, refs uniques) ; payloads POST (pesée vide) / PATCH (pesée plein).useWeighbridge:POST /api/weighbridge_readingsAUTO/MANUAL ; extraction du message d'erreur 503 (RG-5.06).WeighingBlock.vue: bloc réutilisable (Date jour par défaut RG-5.07, Poids/DSD readonly, immat masqueXX-000-XXvia maska désactivé si « Tout format »).POST /weighing_tickets; « Valider » →PATCH /weighing_tickets/{id}puiswindow.open('/api/weighing_tickets/{id}/print.pdf')(PDF généré back, RG-5.08 ; gabarit = ERP-192).useFormErrors(mapping 422 inline par champ, propertyPathempty*/full*/contrepartie) ; tout appel viauseApi().Vérifications
make nuxt-test: 640 tests verts (dont 12 nouveaux :useWeighingTicketFormcontrepartie conditionnelle + immat partagée ;useWeighbridgeAUTO/MANUAL/erreur).fr.jsonvalide.Revue ERP-189 (écran Ajouter). Logique métier bien factorisée dans
useWeighingTicketForm(contrepartie exclusive RG-5.03, immat partagée RG-5.01, workflow create→validate),useWeighbridge/référentiels propres et testés. 1 point 🔴 fonctionnel (ouverture du PDF) + 2 points 🟡 ci-dessous.@@ -0,0 +108,4 @@<MalioButtonvariant="primary":label="t('logistique.weighingTickets.form.validate')":disabled="validating || form.ticketId.value === null"🟢 « Valider » sans garde sur la pesée à plein. Gardé seulement par
ticketId === null→ un PATCH sansfull.weightpartira et reviendra en 422 (mappée inline paruseFormErrors, donc acceptable). Optionnel : un tooltip/feedback sifull.weight === null(sans griser sans message, standard ERP-101).@@ -0,0 +192,4 @@useHead({ title: t('logistique.weighingTickets.form.addTitle') })// Création réservée à `manage` (Admin / Bureau / Usine) — sinon retour à la liste.if (!can('logistique.weighing_tickets.manage')) {🟡 Garde de permission sans
return. Aprèsawait navigateTo(...), le setup continue (composables instanciés,referentials.load()), et c'est un gate purement UX (l'autorité reste le back).Reco : préférer un middleware de page (
definePageMeta({ middleware })) ou au minimumreturn await navigateTo(...). Même remarque suredit.vue(ERP-190).@@ -0,0 +318,4 @@manualModal.open = false}catch (error) {manualModal.errors = { weight: weighbridge.extractWeighbridgeError(error) }🟡 Erreur de pesée accrochée au mauvais champ. L'erreur « pont indisponible » (RG-5.06) n'est pas une erreur du champ Poids ; l'accrocher à
errors.weightest trompeur et écrase une éventuelle erreur de saisie. La modale AUTO, elle, affiche correctement une ligne globale (autoModal.error).Reco : ajouter un
manualModal.error(ligne d'erreur globale de la modale) comme pour AUTO.@@ -0,0 +357,4 @@await api.patch(`/weighing_tickets/${form.ticketId.value}`, form.buildFullPayload(), { toast: false })// Bon de pesée = PDF généré côté back (Twig, ERP-192) — on l'ouvre, on ne// dessine aucun gabarit côté front (RG-5.08).window.open(`/api/weighing_tickets/${form.ticketId.value}/print.pdf`, '_blank')🔴
window.open(_blank)aprèsawait→ bloqué par le popup blocker. Appelé aprèsawait api.patch(...), l'ouverture n'est plus rattachée au geste de clic : la plupart des navigateurs la bloquent, le bon de pesée PDF (RG-5.08) ne s'ouvrira pas de façon fiable.Reco : ouvrir l'onglet avant l'await puis y poser l'URL (
const w = window.open('', '_blank'); … ; w.location = url), ou utiliser un téléchargement d'ancre (cf.triggerDownloadde ERP-188), ou laisser l'utilisateur cliquer (c'est exactement ce que faitprintTicketde l'écran 190, de façon synchrone — la bonne version).Consolidée dans la MR unique #144 (M5 — Tickets de pesée, ERP-188 → ERP-193). Fermeture de cette MR empilée.
Pull request closed