feat(front) : page liste des tickets de pesée + export (ERP-188) #140
Reference in New Issue
Block a user
Delete Branch "feat/erp-188-liste-tickets-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-188 — Page liste
/weighing-tickets+ export (M5, front)Page d'entrée du module Logistique : datatable paginée des tickets de pesée + export XLSX.
Contenu
/weighing-ticketsdans le layerlogistique(URL API en snake_case/weighing_tickets).<MalioDataTable>branché surusePaginatedList<WeighingTicket>(pagination serveur 10/25/50, défaut 10 ; état 100 % local, jamais dans l'URL — règle ABSOLUE n°6).JJ-MM-AAAA), Poids (7 150 Kg). Mapping calé sur le contrat JSON réel (spec-back § 4.0.bis)./weighing-tickets/{id}/edit; + Ajouter (gatedmanage) →/weighing-tickets/new.view) →GET /api/weighing_tickets/export.xlsx(blob).usePermissions()masque les boutons ; liste cloisonnée par site courant côté back.mdi:truck-outline.Vérifications
make nuxt-test: 628 tests verts (dont 8 nouveaux : mappingdisplayDate/netWeight, contrepartie, permissions, navigation, export).fr.jsonvalide,php -lsidebar OK.Revue ERP-188 (liste + export). Bon usage de
usePaginatedList/useApi, état 100% local, tests Vitest solides. 3 remarques en ligne ci-dessous (1 latente sur le fuseau horaire), aucune bloquante.🟢
config/sidebar.php: section Logistique gatée parlogistique.weighing_tickets.view+module: 'logistique', OK. Penser à aligner les 3 miroirs RBAC (sidebar.php / personas.ts / SeedE2ECommand) simanageest une nouvelle permission testée.@@ -0,0 +86,4 @@netWeight: formatWeight(ticket.netWeight),})))const columns = [🟢 3 colonnes contrepartie mutuellement exclusives (RG-5.03).
client/supplier/otherLabelne sont jamais renseignées ensemble → 2 colonnes vides sur 3 par ligne, table large.Reco : envisager une colonne unique « Contrepartie » (
client ?? supplier ?? otherLabel), éventuellement avec un badge de type. À ignorer si la maquette docx impose les 3 colonnes.@@ -0,0 +100,4 @@if (!value) {return ''}const date = new Date(value)🔴 Décalage de fuseau possible (off-by-one).
displayDateest un datetime (fullDate ?? emptyDate), pas une date nue.new Date(...).getDate()réinterprète l'instant dans le fuseau du runtime : pour un ticket horodaté en début de nuit (ex.00:30+02:00=22:30Zla veille), un runtime en UTC affichera le jour précédent. Le test passe car09:12+02:00reste le 17 en UTC, mais le bug est latent.Reco : extraire la partie date de la chaîne ISO (
value.slice(0, 10)puis reformat), commeisoDateOnly()côté formulaire (ERP-190), cohérent avec la philosophie deshared/utils/date.ts(« jamais passer par UTC pour une date métier »).@@ -0,0 +145,4 @@// useApi type ses options en JSON ; l'export renvoie un binaire, donc on// force responseType:'blob' (transmis tel quel a ofetch au runtime). Cast// contenu faute d'overload blob sur le client partage (meme pattern M2/M3/M4).const blob = await api.get<Blob>('/weighing_tickets/export.xlsx', {}, {🟢 Cast blob
as unknown as Parameters<…>[2]. Acceptable et assumé (« même pattern M2/M3/M4 »), dette commune. Reco non bloquante : à terme, ajouter une surcharge typéeresponseType:'blob'suruseApi().getpour supprimer ce cast dans tous les modules d'un coup.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