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
2.9 KiB
TypeScript
73 lines
2.9 KiB
TypeScript
/**
|
|
* Pesée au pont bascule (M5, ERP-189) — déclenche une lecture de poids via
|
|
* `POST /api/weighbridge_readings` (spec-back § 4.2). Action autonome : le ticket
|
|
* n'existe pas encore quand on pèse depuis le formulaire principal.
|
|
*
|
|
* Deux modes :
|
|
* - AUTO (« Pesée bascule ») : le serveur résout le site courant, lit le poids
|
|
* (stub aléatoire au M5) et alloue le DSD. Peut échouer (RG-5.06 → 503) : le
|
|
* pont est indisponible, on invite l'utilisateur à passer en pesée manuelle.
|
|
* - MANUAL (« Pesée manuelle ») : poids + DSD saisis par l'opérateur ; le serveur
|
|
* les conserve tels quels — plus d'auto-incrément (ERP-193).
|
|
*
|
|
* Composable UI-agnostique : il appelle l'API (`useApi`, jamais `$fetch`) et
|
|
* renvoie la lecture, ou lève l'erreur — la gestion de la modal/de l'affichage
|
|
* reste à la charge de l'écran. `extractWeighbridgeError` factorise la lecture
|
|
* du message d'erreur 503 (RG-5.06) pour l'afficher dans la modal.
|
|
*/
|
|
|
|
/** Mode de pesée — miroir de l'enum back. */
|
|
export type WeighbridgeMode = 'AUTO' | 'MANUAL'
|
|
|
|
/** Lecture renvoyée par le pont bascule (spec-back § 4.2). */
|
|
export interface WeighbridgeReading {
|
|
weight: number
|
|
dsd: number
|
|
mode: WeighbridgeMode
|
|
}
|
|
|
|
export function useWeighbridge() {
|
|
const api = useApi()
|
|
const { t } = useI18n()
|
|
|
|
/**
|
|
* Pesée bascule (AUTO). Le site courant est résolu serveur — rien à envoyer.
|
|
* `toast: false` : l'erreur (RG-5.06) est affichée inline dans la modal, pas
|
|
* en toast global.
|
|
*/
|
|
async function triggerAuto(): Promise<WeighbridgeReading> {
|
|
return await api.post<WeighbridgeReading>(
|
|
'/weighbridge_readings',
|
|
{ mode: 'AUTO' },
|
|
{ toast: false },
|
|
)
|
|
}
|
|
|
|
/**
|
|
* Pesée manuelle (MANUAL). Le poids ET le DSD sont saisis par l'opérateur (le
|
|
* DSD = numéro du pont réellement utilisé) et conservés tels quels (ERP-193).
|
|
*/
|
|
async function triggerManual(weight: number, dsd: number): Promise<WeighbridgeReading> {
|
|
return await api.post<WeighbridgeReading>(
|
|
'/weighbridge_readings',
|
|
{ mode: 'MANUAL', weight, dsd },
|
|
{ toast: false },
|
|
)
|
|
}
|
|
|
|
/**
|
|
* Message d'erreur de pesée bascule (RG-5.06). Le back renvoie un 503
|
|
* `{ title, detail }` (« Pont bascule indisponible » / « Passez en pesée
|
|
* manuelle. ») — on privilégie le `detail`, puis le `title`, sinon un libellé
|
|
* générique invitant à la pesée manuelle.
|
|
*/
|
|
function extractWeighbridgeError(error: unknown): string {
|
|
const data = (error as { response?: { _data?: unknown } })?.response?._data as
|
|
| { detail?: string, title?: string }
|
|
| undefined
|
|
return data?.detail || data?.title || t('logistique.weighingTickets.form.weighbridge.unavailable')
|
|
}
|
|
|
|
return { triggerAuto, triggerManual, extractWeighbridgeError }
|
|
}
|