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>
54 lines
2.0 KiB
TypeScript
54 lines
2.0 KiB
TypeScript
import type { WeighbridgeMode } from '~/modules/logistique/composables/useWeighbridge'
|
|
import type { CounterpartyType, WeighingTicketStatus } from '~/modules/logistique/composables/useWeighingTicketForm'
|
|
|
|
/**
|
|
* Détail d'un ticket de pesée (`GET /api/weighing_tickets/{id}`, spec-back
|
|
* § 4.0.bis). Champs null OMIS du JSON (`skip_null_values`) → tous optionnels,
|
|
* lus avec un défaut côté hydratation du formulaire.
|
|
*/
|
|
export interface WeighingTicketDetail {
|
|
id: number
|
|
/** Cycle de vie (DRAFT/VALIDATED, ERP-193). */
|
|
status?: WeighingTicketStatus
|
|
/** Numéro `{siteCode}-TP-{NNNN}` — null tant que brouillon, immuable ensuite (RG-5.09). */
|
|
number?: string | null
|
|
/** Site rattaché (embarqué) — immuable (RG-5.09). */
|
|
site?: { id: number, name: string, code: string } | null
|
|
counterpartyType?: CounterpartyType | null
|
|
client?: { '@id': string, companyName: string } | null
|
|
supplier?: { '@id': string, companyName: string } | null
|
|
otherLabel?: string | null
|
|
immatriculation?: string | null
|
|
plateFreeFormat?: boolean
|
|
// Pesée à vide
|
|
emptyDate?: string | null
|
|
emptyWeight?: number | null
|
|
emptyDsd?: number | null
|
|
emptyMode?: WeighbridgeMode | null
|
|
// Pesée à plein
|
|
fullDate?: string | null
|
|
fullWeight?: number | null
|
|
fullDsd?: number | null
|
|
fullMode?: WeighbridgeMode | null
|
|
netWeight?: number | null
|
|
}
|
|
|
|
/**
|
|
* Charge le détail d'un ticket de pesée pour l'écran de modification (M5,
|
|
* ERP-190). `Accept: application/ld+json` impose l'enveloppe Hydra (relations
|
|
* embarquées : client/supplier/site). Appel via `useApi()` (jamais `$fetch`).
|
|
*/
|
|
export function useWeighingTicket() {
|
|
const api = useApi()
|
|
|
|
async function fetchTicket(id: number | string): Promise<WeighingTicketDetail> {
|
|
return await api.get<WeighingTicketDetail>(
|
|
`/weighing_tickets/${id}`,
|
|
{},
|
|
{ headers: { Accept: 'application/ld+json' }, toast: false },
|
|
)
|
|
}
|
|
|
|
return { fetchTicket }
|
|
}
|