5e15c1f69f
Auto Tag Develop / tag (push) Successful in 11s
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>
72 lines
3.2 KiB
TypeScript
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 })
|
|
}
|