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>
63 lines
2.1 KiB
TypeScript
63 lines
2.1 KiB
TypeScript
import { ref } from 'vue'
|
|
|
|
/**
|
|
* Référentiels alimentant les selects de contrepartie de l'écran « Ticket de
|
|
* pesée » (M5, ERP-189) : liste des clients (M1) et des fournisseurs (M2).
|
|
*
|
|
* Collections récupérées en entier via l'échappatoire `?pagination=false`
|
|
* (référentiels de quelques dizaines d'entrées), avec l'en-tête
|
|
* `Accept: application/ld+json` imposé par API Platform 4 pour obtenir
|
|
* l'enveloppe Hydra (`member`). La valeur d'option est l'IRI Hydra (`@id`) —
|
|
* renvoyée telle quelle dans le payload POST/PATCH (relation ManyToOne).
|
|
*
|
|
* Miroir de `useClientReferentials` (M1). État 100 % local à l'instance.
|
|
*/
|
|
|
|
/** Option au format attendu par MalioSelect ({ label, value }). */
|
|
export interface RefOption {
|
|
value: string
|
|
label: string
|
|
}
|
|
|
|
interface PartyMember {
|
|
'@id': string
|
|
companyName: string
|
|
}
|
|
|
|
const LD_JSON_HEADERS = { Accept: 'application/ld+json' }
|
|
|
|
export function useWeighingTicketReferentials() {
|
|
const api = useApi()
|
|
|
|
const clients = ref<RefOption[]>([])
|
|
const suppliers = ref<RefOption[]>([])
|
|
|
|
/** Récupère une collection complète (pagination désactivée) en Hydra. */
|
|
async function fetchAll(url: string): Promise<PartyMember[]> {
|
|
const res = await api.get<{ member?: PartyMember[] }>(
|
|
url,
|
|
{ pagination: 'false' },
|
|
{ headers: LD_JSON_HEADERS, toast: false },
|
|
)
|
|
return res.member ?? []
|
|
}
|
|
|
|
/**
|
|
* Charge en parallèle clients + fournisseurs (résilient : un référentiel en
|
|
* échec — ex. 403 selon le rôle — laisse simplement son select vide sans
|
|
* faire échouer l'autre).
|
|
*/
|
|
async function load(): Promise<void> {
|
|
await Promise.allSettled([
|
|
fetchAll('/clients').then((list) => {
|
|
clients.value = list.map(c => ({ value: c['@id'], label: c.companyName }))
|
|
}),
|
|
fetchAll('/suppliers').then((list) => {
|
|
suppliers.value = list.map(s => ({ value: s['@id'], label: s.companyName }))
|
|
}),
|
|
])
|
|
}
|
|
|
|
return { clients, suppliers, load }
|
|
}
|