Files
Starseed/frontend/modules/transport/composables/useCarriersRepository.ts
T
tristan 5e15c1f69f
Auto Tag Develop / tag (push) Successful in 11s
fix : retours métier ERP-193 (4 répertoires) (#139)
Lot de retours métier **ERP-193** (« Fix tous les retours starseed »), transverse aux 4 répertoires (clients, fournisseurs, prestataires, transporteurs).

## Contenu

- **Pagination** : défaut à 25 items/page sur les 4 répertoires.
- **Libellé** : colonne « Dernière activité » → « Dernière modification ».
- **Consultation** : masquage des onglets vides (coquilles « à venir » + onglets de données sans donnée).
- **Chiffre d'affaires** : plafonné à 999 999 999 999,99 (clamp front + `Assert\LessThanOrEqual` back).
- **Date de création** : interdiction des dates futures (`:max` MalioDate + `Assert\LessThanOrEqual('today')` back).
- **Caractères spéciaux** : blocage des caractères parasites (`²³§~#|…`) dans les champs texte via une allow-list par profil (nom de personne / texte libre / adresse / code alphanumérique) — filtrage front à la frappe + `Assert\Regex` back autoritaire. Email/IBAN/BIC/TVA conservent leurs validateurs de format.
- **UI** : champs en consultation et onglets validés grisés (`readonly` → `disabled`).
- **UI** : boutons « Archiver » en rouge (variant `danger`).

## Tests

- Back : nouveaux tests RG (plafond CA, dates futures, caractères spéciaux) + garde-fou contraintes — suite complète verte (813 tests).
- Front : nouveaux tests unitaires (sanitizers, helpers date/montant) — 615 tests verts, eslint clean.

---------

Co-authored-by: THOLOT DECHENE Matthieu <matthieu@yuno.malio.fr>
Reviewed-on: #139
Co-authored-by: tristan <tristan@yuno.malio.fr>
Co-committed-by: tristan <tristan@yuno.malio.fr>
2026-06-22 09:40:40 +00:00

72 lines
3.2 KiB
TypeScript

import { usePaginatedList } from '~/shared/composables/usePaginatedList'
/**
* Vue MINIMALE du referentiel QUALIMAT embarque (groupe `qualimat:read`) dans la
* LISTE des transporteurs. Seuls les champs consommes par le Repertoire sont
* types : `validityDate` alimente la colonne « Date de validité » (fond rouge si
* perimee — RG-4.04). L'id QUALIMAT est une chaine (colonne BIGINT cote back).
*/
export interface CarrierQualimat {
id: string
name: string | null
/** Date ISO de validite de l'agrement QUALIMAT (date_immutable) — RG-4.04. */
validityDate: string | null
status: string | null
}
/**
* Vue MINIMALE d'un transporteur pour le Repertoire (datatable). Volontairement
* partielle : seuls les champs des colonnes + l'id (navigation) sont types ici.
* Le detail complet (onglets Adresses / Contacts / Prix) est hors perimetre de
* cet ecran (ERP-164, ticket #9).
*
* `certificationType` : QUALIMAT | GMP_PLUS | OVOCOM | COMPTE_PROPRE | AUTRE, ou
* `null` dans le cas LIOT (compte-propre interne sans certification — RG-4.01).
* Le libelle affiche est resolu cote front (cle i18n `transport.carriers.certification.*`).
*/
export interface Carrier {
id: number
name: string | null
certificationType: string | null
/** Lien editable vers le referentiel QUALIMAT (null si transporteur non QUALIMAT). */
qualimatCarrier: CarrierQualimat | null
/** Date ISO de derniere modification (default:read) — colonne « Dernière activité ». */
updatedAt: string | null
isArchived: boolean
}
/**
* Filtres du Repertoire transporteurs, branches sur les query params de
* `GET /api/carriers` (spec-back § 4.1). Pilotes par la page via `setFilters` :
* - `search` : recherche fuzzy sur le nom ;
* - `certificationType[]` : multi-valeurs (OR cote back) ;
* - `archivedOnly` : n'affiche QUE les archives (toggle « Voir les archivés »,
* aligne sur les autres repertoires M1/M2/M3).
*/
export interface CarrierFilters {
search?: string
'certificationType[]'?: string[]
archivedOnly?: boolean
}
/**
* Repertoire transporteurs (M4, ERP-164) — simple enveloppe de
* `usePaginatedList<Carrier>` sur la ressource `/carriers` (regle ABSOLUE n°13 :
* pagination serveur obligatoire ; jamais de chargement integral en memoire).
* Miroir de `useSuppliersRepository` (M2) / `useProvidersRepository` (M3).
*
* Les filtres (recherche, certifications, archives) sont pilotes par la page via
* `setFilters` du composable partage — la remise en page 1 est garantie. Par
* defaut AUCUN `archivedOnly` n'est envoye : le back masque alors les archives
* (§ 2.4). Cocher « Voir les archivés » envoie `archivedOnly=true` (seules les
* archives sont listees, aligne sur Client / Fournisseur / Prestataire).
*
* Volontairement PAR INSTANCE (pas de singleton module-level) : l'etat tableau
* est propre a l'ecran Repertoire et meurt avec lui, comme tout consommateur de
* `usePaginatedList`. Aucun reset au logout a gerer.
*/
export function useCarriersRepository() {
// Pagination par defaut a 25 sur le repertoire (retour metier ERP-193).
return usePaginatedList<Carrier, CarrierFilters>({ url: '/carriers', defaultItemsPerPage: 25 })
}