faafd99ef8
Auto Tag Develop / tag (push) Successful in 8s
MR unique regroupant tout le module M5 « Tickets de pesée » (remplace les MR empilées #140/#141/#142/#143).
## Périmètre
- **ERP-188** — Page liste des tickets de pesée + export XLSX (colonnes Fournisseur/Client/Autre + Statut).
- **ERP-189** — Écran « Ajouter » (4 champs en haut, 2 blocs de pesée, pesée bascule/manuelle, date+heure horodatée à la validation).
- **ERP-190** — Écran « Modifier » + bouton Imprimer.
- **ERP-191** — i18n + libellés + branchement site courant.
- **ERP-192** — Bon de pesée PDF généré côté back (template Twig → Dompdf), endpoint `GET /api/weighing_tickets/{id}/print.pdf`.
- **ERP-193** — Cycle de vie brouillon/validé (status DRAFT/VALIDATED, numéro attribué à la validation), DSD saisi conservé en pesée manuelle, retours métier design.
## Vérifications
- Back : tests Logistique + architecture verts, php-cs-fixer propre, migrations appliquées (dev + test).
- Front : suite Vitest complète verte, ESLint propre.
Base : `develop` — contient les 16 commits du M5 (rien d'autre).
Reviewed-on: #144
Co-authored-by: tristan <tristan@yuno.malio.fr>
Co-committed-by: tristan <tristan@yuno.malio.fr>
73 lines
3.3 KiB
TypeScript
73 lines
3.3 KiB
TypeScript
import { usePaginatedList } from '~/shared/composables/usePaginatedList'
|
||
import type { WeighingTicketStatus } from '~/modules/logistique/composables/useWeighingTicketForm'
|
||
|
||
/**
|
||
* Vue MINIMALE d'une contrepartie embarquee (Client M1 ou Fournisseur M2) dans la
|
||
* LISTE des tickets de pesee. Seul `companyName` alimente les colonnes
|
||
* « Client » / « Fournisseur » ; l'objet sort embarque (`client:read` /
|
||
* `supplier:read`) ou est carrement absent du JSON quand null (`skip_null_values`,
|
||
* spec-back § 4.0.bis) — d'ou le `?? null` systematique cote page.
|
||
*/
|
||
export interface WeighingTicketParty {
|
||
id: number
|
||
companyName: string | null
|
||
}
|
||
|
||
/**
|
||
* Vue MINIMALE d'un ticket de pesee pour la datatable (M5, ERP-188). Volontairement
|
||
* partielle : seuls les champs des colonnes (docx p.3) + l'id (navigation) sont
|
||
* types. Le detail complet (pesees vide/plein, immatriculation, site, DSD) releve
|
||
* de l'ecran Modification (ERP-190) — hors perimetre de cet ecran.
|
||
*
|
||
* Contrepartie mutuellement exclusive (RG-5.03) : un seul de `client` / `supplier`
|
||
* / `otherLabel` est renseigne ; les deux autres sont omis du JSON (null).
|
||
* `displayDate` = getter serveur `fullDate ?? emptyDate` (spec-back § 4.0).
|
||
* `netWeight` = plein − vide en kg (RG-5.05).
|
||
*/
|
||
export interface WeighingTicket {
|
||
id: number
|
||
/** Cycle de vie : DRAFT (« En attente ») ou VALIDATED (« Terminée ») — ERP-193. */
|
||
status: WeighingTicketStatus
|
||
/** Numero metier `{siteCode}-TP-{NNNN}` — null tant que brouillon (RG-5.02). */
|
||
number: string | null
|
||
/** Embarque uniquement si contrepartie = Client (RG-5.03), sinon absent. */
|
||
client: WeighingTicketParty | null
|
||
/** Embarque uniquement si contrepartie = Fournisseur (RG-5.03), sinon absent. */
|
||
supplier: WeighingTicketParty | null
|
||
/** Libelle libre si contrepartie = Autre (RG-5.03), sinon absent. */
|
||
otherLabel: string | null
|
||
/** Date ISO du ticket (`fullDate ?? emptyDate`) — colonne « Date ». */
|
||
displayDate: string | null
|
||
/** Poids net en kg (= plein − vide, RG-5.05) — colonne « Poids ». */
|
||
netWeight: number | null
|
||
}
|
||
|
||
/**
|
||
* Filtres de la liste des tickets de pesee, branches sur les query params de
|
||
* `GET /api/weighing_tickets` (spec-back § 4.1). La liste est par ailleurs
|
||
* cloisonnee par site courant cote back (`SiteScopedQueryExtension`, § 2.3) — le
|
||
* front n'a pas a envoyer le site.
|
||
*/
|
||
export interface WeighingTicketFilters {
|
||
search?: string
|
||
}
|
||
|
||
/**
|
||
* Liste des tickets de pesee (M5, ERP-188) — simple enveloppe de
|
||
* `usePaginatedList<WeighingTicket>` sur la ressource `/weighing_tickets`
|
||
* (URL API en snake_case ; la route Nuxt reste `/weighing-tickets`). Pagination
|
||
* serveur obligatoire (regle ABSOLUE n°13), etat 100 % local (regle ABSOLUE n°6).
|
||
*
|
||
* Miroir de `useCarriersRepository` (M4). Volontairement PAR INSTANCE (pas de
|
||
* singleton) : l'etat tableau est propre a l'ecran et meurt avec lui.
|
||
*/
|
||
export function useWeighingTicketsRepository() {
|
||
// Defaut 25 items/page (au lieu de 10) : la liste des tickets de pesee est
|
||
// consultee en volume. 25 fait partie des options [10, 25, 50] et reste sous le
|
||
// max serveur (50). L'utilisateur peut toujours basculer via le selecteur.
|
||
return usePaginatedList<WeighingTicket, WeighingTicketFilters>({
|
||
url: '/weighing_tickets',
|
||
defaultItemsPerPage: 25,
|
||
})
|
||
}
|