feat(front) : écran modification d'un ticket de pesée + imprimer (ERP-190) #142
Reference in New Issue
Block a user
Delete Branch "feat/erp-190-ecran-modification-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-190 — Écran « Modification d'un ticket de pesée » (M5, front)
Écran de modification : identique à l'ajout, pré-rempli, avec bouton « Imprimer » (ouvre le PDF back).
Contenu
/weighing-tickets/{id}/edit(layerlogistique), gatéemanage.useWeighingTicket:GET /api/weighing_tickets/{id}(relations embarquées Hydra).useWeighingTicketForm.hydrate(detail): pré-remplit l'état (contrepartie, véhicule, 2 pesées) ; dates ISO datetime back ramenées àYYYY-MM-DDpour MalioDate ; champs null omis (skip_null_values) gérés avec défauts.buildUpdatePayload(): PATCH de tous les champs éditables (contrepartie + véhicule + 2 pesées) ; net recalculé serveur (RG-5.05).WeighingBlock(blocs vide/plein) + les modales pesée bascule/manuelle de l'écran Ajouter.window.open('/api/weighing_tickets/{id}/print.pdf')(PDF back via Twig, ERP-192) — aucun gabarit côté front.useFormErrors(mapping 422 inline) ; tout appel viauseApi().Vérifications
make nuxt-test: 647 tests verts (+7 :hydrate/buildUpdatePayload; page edit : pré-remplissage numéro/site + bascule des boutons Enregistrer/Imprimer + ouverture PDF + PATCH).fr.jsonvalide.Revue ERP-190 (écran Modifier).
useWeighingTicket+hydrate()+isoDateOnly()propres et tz-safe (à rétro-porter dans la liste ERP-188).printTicketsynchrone = bonne version. Principal point : duplication forte avecnew.vue(voir commentaire sur le bloc modales).@@ -140,0 +197,4 @@* site sont immuables (RG-5.09, ignorés par le back même si envoyés). Le net* est recalculé serveur (RG-5.05).*/function buildUpdatePayload(): Record<string, unknown> {🟢
buildUpdatePayload={ ...buildCreatePayload(), ...buildFullPayload() }:immatriculation/plateFreeFormatsont écrits deux fois (valeur identique, le spread full gagne), sans effet de bord. Lisible et bien testé. RAS.@@ -0,0 +126,4 @@</div></template><!-- ── Modal « Confirmation pesée bascule » (RG-5.06) ──────────────────-->🟡 Duplication massive avec
new.vue. Les 2 modales (AUTO/MANUAL), tout le bloc<template #counterparty>et la logiqueconfirmAuto/confirmManual/openAuto/openManual(~150 lignes) sont reproduits à l'identique entre les deux écrans.Reco : extraire (a) un composant
CounterpartyFields.vueet (b) un composableuseWeighingModals(form). Gain ~200 lignes et un seul point de correction (utile justement pour le fixwindow.openci-dessus). Non bloquant mais recommandé avant que d'autres écrans s'en inspirent.@@ -0,0 +203,4 @@const { can } = usePermissions()// Modification réservée à `manage` (Admin / Bureau / Usine) — sinon retour liste.if (!can('logistique.weighing_tickets.manage')) {🟡 Garde de permission sans
return(idemnew.vue:195). Préférer un middleware de page, oureturn await navigateTo(...).@@ -0,0 +229,4 @@: t('logistique.weighingTickets.edit.titleFallback'),)useHead({ title: t('logistique.weighingTickets.edit.titleFallback') })🟢 Titre d'onglet non réactif.
headerTitle(h1) est réactif au numéro, maisuseHeadreste figé sur le fallback. Reco (cosmétique) :useHead({ title: () => headerTitle.value })pour afficher « Ticket de pesée 86-TP-0001 » dans l'onglet.@@ -0,0 +366,4 @@* « Imprimer » : ouvre le bon de pesée PDF servi par le back (Twig, ERP-192).* Le front ne dessine AUCUN gabarit — il ouvre seulement l'URL (RG-5.08).*/function printTicket(): void {🟢👍 Bonne version : ouverture synchrone dans le handler de clic → pas de blocage popup. À répliquer dans
new.vue(ERP-189) oùwindow.openest appelé après unawaitet risque d'être bloqué.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