9e2206a7d6
En pesée manuelle, le serveur incrémentait automatiquement le DSD et ignorait la saisie de l'opérateur. Désormais l'opérateur saisit le poids ET le DSD (le numéro du pont réellement utilisé), conservés tels quels — plus d'auto-incrément. Le champ « Numéro de pesée » séparé (manualNumber) est supprimé : pour le client c'est la même chose que le DSD. Pas de contrainte d'unicité sur le DSD (doublons autorisés). Colonnes empty_manual_number/full_manual_number droppées.
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 }
|
|
}
|