Schéma BDD du répertoire transporteurs (M4) + entités + contrat de lecture (liste + détail), socle du front. - Migration Version20260615150000 : tables carrier / carrier_address / carrier_contact / carrier_price (FK cross-module, CHECK enum, index partiel uq_carrier_name_active, COMMENT ON COLUMN). uploaded_document et qualimat_carrier réutilisées (non recréées). - Entités Carrier* (#[Auditable], Timestampable/Blamable) + ApiResource LECTURE seule (GetCollection + Get via CarrierProvider, anti-N+1, exclusion archivés + ?includeArchived). Écriture (POST/PATCH + Processor) reportée WT4+. - QualimatCarrier : mapping ORM lecture seule sur la table référentielle existante (sortie du schema_filter, mapping aligné DDL ERP-39, schema:update no-op) + endpoint de recherche read-only (§ 4.7). - Relations cross-module des prix (Client/Supplier/adresses) via contrats Shared (ClientInterface, SupplierInterface, ClientAddressInterface, SupplierAddressInterface) + resolve_target_entities — sans import inter-module (règle n°1). Ajout du groupe supplier_address:read aux champs de SupplierAddress pour l'embed. - Garde-fous : ColumnCommentsCatalog (carrier* + qualimat_carrier), makefile test-db-setup (index partiel carrier), i18n audit (transport_carrier*), EntitiesAreTimestampableBlamableTest (QualimatCarrier whitelisté). - CarrierSerializationContractTest : contrat JSON liste + détail vérifié (embeds objet, booléens, enveloppe Hydra) ; JSON réel capturé dans spec-back § 4.0.bis. make db-reset OK, make test vert (731), make nuxt-test vert (480), php-cs-fixer OK.
23 KiB
M4 — Répertoire transporteurs · Découpe en tickets Lesstime
Statut : ✅ poussé dans Lesstime — TaskGroup #31 « M4 — Répertoire transporteurs » (projet STARSEED), 19 tickets ERP-153 → ERP-171 au statut Prêt à dev. Assignation : tickets Backend (1.1→1.11, ERP-153→163) → Matthieu · tickets Frontend (1.12→1.19, ERP-164→171) → Tristan.
Pos Ticket Réf 1.1 Permissions transport.carriers.* + sidebar ERP-153 1.2 Infra upload générique Shared ERP-154 1.3 Migration BDD M4 ERP-155 1.4 QualimatCarrier + endpoint recherche ERP-156 1.5 Entités Carrier* + ApiResource + Provider ERP-157 1.6 CarrierProcessor (RG-4.01/02/03 + LIOT) ERP-158 1.7 Sous-ressource Adresses ERP-159 1.8 Sous-ressource Contacts ERP-160 1.9 Sous-ressource Prix + branches ERP-161 1.10 Export XLSX ERP-162 1.11 Tests PHPUnit + contrat JSON ERP-163 1.12 Page Répertoire /carriers ERP-164 1.13 Page Ajouter (layout + formulaire) ERP-165 1.14 Saisie assistée QUALIMAT + conditionnels ERP-166 1.15 Onglet Adresses (BAN) ERP-167 1.16 Onglet Contacts ERP-168 1.17 Onglet Prix ERP-169 1.18 Consultation + Modification ERP-170 1.19 Upload front + i18n + audit ERP-171 Specs sources : spec-back.md·spec-front.md— validées (docx V0 du 27/05/2026).Maquette Figma : node 1132-45376(lien).
⚠️ Dépendance amont (socle Tristan — en cours de merge)
Le M4 s'appuie sur le module Transport et le référentiel QUALIMAT, livrés par les PR de Tristan en cours de merge dans develop :
- ERP-150 (PR #97) — module
Transport(TransportModule, layer front,config/modules.php). Requis par tout le M4. - ERP-39 (PR #99) — sync QUALIMAT (
qualimat_carrier+ commandeapp:qualimat:sync). Requis par la saisie assistée (ticket 1.4). - ERP-149 (PR #101) — sync IDTF (
idtf_product). NON requis par le M4 (référentiel autonome, hors écrans transporteurs).
Les 3 PR sont empilées (
develop → ERP-150 → ERP-39 → ERP-149). Démarrer le M4 une fois ERP-150 + ERP-39 dansdevelop(DoR des tickets 1.1 et 1.4). Brancher le M4 surdeveloppost-merge.
Vue d'ensemble (ordre d'exécution)
| # | Ticket | Tag | Effort | RG / dépend |
|---|---|---|---|---|
| 1.1 | Déclarer permissions transport.carriers.* + sidebar |
Backend | S | DoR : ERP-150 mergé |
| 1.2 | Créer l'infra d'upload générique Shared |
Backend | M | § 2.7 |
| 1.3 | Migrer le schéma BDD M4 (carrier + sous-tables) | Backend | M | § 3.2 |
| 1.4 | Exposer QualimatCarrier (lecture seule) + endpoint recherche |
Backend | S | RG-4.01 · DoR : ERP-39 mergé |
| 1.5 | Créer entités Carrier* + repos + ApiResource + CarrierProvider |
Backend | M | § 3.3 / 4.0 |
| 1.6 | Implémenter CarrierProcessor (RG-4.01/4.02/4.03 + LIOT + normalisation + archive) |
Backend | M | RG-4.01→4.03, 4.13, 4.14 |
| 1.7 | Sous-ressource Adresses (carrier_address) |
Backend | S | RG-4.05→4.07 |
| 1.8 | Sous-ressource Contacts (carrier_contact) |
Backend | S | RG-4.08 |
| 1.9 | Sous-ressource Prix (carrier_price) + RG branches |
Backend | M | RG-4.09→4.11 |
| 1.10 | Export XLSX (répertoire + onglet Prix regroupé) | Backend | M | § 4.6 |
| 1.11 | Tests PHPUnit RG-4.01→4.14 + capture contrat JSON (DoD) | Backend | M | § 4.0.bis / 8.1 |
| 1.12 | Page Répertoire /carriers (datatable, filtres, export) |
Frontend | M | RG-4.04 |
| 1.13 | Page Ajouter /carriers/new (layout, onglets, formulaire principal POST) |
Frontend | M | RG-4.12 |
| 1.14 | Saisie assistée QUALIMAT + champs conditionnels (Affréter / AUTRE→Décharge / LIOT) | Frontend | M | RG-4.01→4.03 |
| 1.15 | Onglet Adresses (autocomplete BAN) | Frontend | M | RG-4.05→4.07 |
| 1.16 | Onglet Contacts | Frontend | S | RG-4.08 |
| 1.17 | Onglet Prix (Client/Fournisseur, sites) | Frontend | M | RG-4.09→4.11 |
| 1.18 | Pages Consultation + Modification | Frontend | M | — |
| 1.19 | Upload front (useUpload) + i18n + libellés audit |
Frontend | S | § 2.8 |
Total : 19 tickets · ~11 back / 8 front · mini-MR de 1 à 4h.
Tickets — détail
1.1 — Déclarer permissions transport.carriers.* + sidebar
Position : 1.1 • Suit : — • Précède : Migrer le schéma BDD M4
Tag : Backend • Effort : S
Contexte : TransportModule::permissions() renvoie aujourd'hui []. Ce ticket pose le socle RBAC du module et son entrée de menu, prérequis de toute opération sécurisée.
Spec liée : spec-back.md § 5 · spec-front.md § Accès
Critères d'acceptation :
TransportModule::permissions()déclaretransport.carriers.view,transport.carriers.manage,transport.carriers.archive;app:sync-permissionsles enregistre.- Matrice § 5.2 : Admin (view+manage+archive), Bureau (view+manage), Commerciale (view), Compta + Usine (aucune).
- 3 sources RBAC alignées dans le même commit (règle ABSOLUE n°8) :
config/sidebar.php(section Transport + item/carriers+ permission),personas.ts,SeedE2ECommand.php. - Item sidebar masqué pour Compta/Usine ; visible Admin/Bureau/Commerciale. Tests à prévoir : permissions sync OK ; personas e2e cohérents (pas de drift). Tips : DoR — ERP-150 mergé (module Transport présent). Section sidebar « Transport » (ou « Logistique » — à trancher, cosmétique).
1.2 — Créer l'infra d'upload générique Shared
Position : 1.2 • Suit : permissions • Précède : Migration M4
Tag : Backend • Effort : M
Contexte : la « Décharge » (RG-4.02) est le 1er d'une série d'uploads à venir. On pose une infra réutilisable, pas un upload ad hoc.
Spec liée : spec-back.md § 2.7
Critères d'acceptation :
- Table
uploaded_document(original_filename,stored_path,mime_type,size_bytes,checksum,created_at,created_by) + COMMENT ON COLUMN. - Service
Shared\Infrastructure\Upload\FileUploader: validation MIME server-side via$file->getMimeType()(jamaisgetClientMimeType()), bornage taille, checksum sha256, écriture disque (var/uploads/{yyyy}/{mm}/). - Endpoint
POST /api/uploaded_documents(multipart) → renvoie l'IRI ; whitelist MIME explicite (PDF + images) ; hors whitelist → 422. Tests à prévoir : PHPUnit — MIME hors whitelist → 422 ; MIME valide → IRI + ligne persistée ; checksum calculé. Tips : générique et réutilisable (autres modules la consommeront). Antivirus / S3 / purge = HP (§ 9).
1.3 — Migrer le schéma BDD M4 (carrier + sous-tables)
Position : 1.3 • Suit : infra upload • Précède : QualimatCarrier
Tag : Backend • Effort : M
Contexte : créer le schéma du répertoire (entité éditable distincte du référentiel qualimat_carrier).
Spec liée : spec-back.md § 3.2
Critères d'acceptation :
- Migration namespace racine
DoctrineMigrations, postérieure àVersion20260612160000. - Tables
carrier,carrier_address,carrier_contact,carrier_price+ FK (qualimat_carrier,uploaded_document,client,client_address,supplier,supplier_address,site,user). certification_typenullable (null seulement en cas LIOT) + CHECK enum ; CHECKcontainer_type,direction,pricing_unit,price_state, branches Prix client/fournisseur.- Index partiel
uq_carrier_name_active(LOWER(name), WHERE non archivé & non supprimé). COMMENT ON COLUMNsur TOUTES les colonnes (règle n°12) + helper Timestampable/Blamable.ColumnsHaveSqlCommentTestvert.make db-resetpasse ; schéma conforme. Tests à prévoir :make db-resetOK ;ColumnsHaveSqlCommentTestvert ; index partiel présent. Tips : PKBIGINT(cohérence module Transport) — à confirmer vsINT.
1.4 — Exposer QualimatCarrier (lecture seule) + endpoint recherche
Position : 1.4 • Suit : migration • Précède : entités Carrier*
Tag : Backend • Effort : S
Contexte : la saisie assistée du nom (RG-4.01) a besoin d'un endpoint de recherche sur le référentiel QUALIMAT, aujourd'hui alimenté en console mais non exposé.
Spec liée : spec-back.md § 4.7 · RG-4.01
Critères d'acceptation :
- Entité
QualimatCarrier(lecture seule) mappée sur la table existantequalimat_carrier(aucune écriture exposée). GET /api/qualimat_carriers?search=: fuzzy surname(+siret), seulementis_active = true, triname, paginé (règle n°13).- Security
is_granted('transport.carriers.view'). Champs exposés :id, siret, name, address, postalCode, city, phone, department, status, validityDate, isActive. Tests à prévoir : PHPUnit — recherche ne renvoie que les actifs ; pagination Hydra ; 403 sans permission. Tips : DoR — ERP-39 mergé. Ne pas toucher la commande de sync.
1.5 — Créer entités Carrier* + repos + ApiResource + CarrierProvider
Position : 1.5 • Suit : QualimatCarrier • Précède : CarrierProcessor
Tag : Backend • Effort : M
Contexte : poser les entités, le contrat de sérialisation (groupes) et la lecture (liste + détail).
Spec liée : spec-back.md § 3.3 / 3.4 / 4.0 / 4.1 / 4.2
Critères d'acceptation :
- Entités
Carrier,CarrierAddress,CarrierContact,CarrierPrice(#[Auditable],TimestampableBlamableTrait), repos Doctrine. ApiResourceCarrier :GetCollection+Get+Post+Patchavecsecurity(§ 3.3) ; pas de Delete.- Groupes de sérialisation :
carrier:read,carrier:item:read,qualimat:read, embedclient:read/client_address:read/supplier:read/supplier_address:read/site:readau détail (3 maillons § 4.0 — ⚠ les adresses de l'onglet Prix sont des entitésClientAddress/SupplierAddressdistinctes). CarrierProviderpaginé (ApiPlatform\Doctrine\Orm\Paginator) ; liste sans cloisonnement site (§ 2.3) ; anti-N+1 (§ 2.11).- Piège booléen
isArchived:#[SerializedName('isArchived')]sur le getter. Tests à prévoir : liste exclut archivés par défaut ;?includeArchived=true; enveloppe Hydra ;isArchivedprésent dans le JSON. Tips : miroirSupplier/Provider. Pas d'onglet Comptabilité (≠ M2/M3).
1.6 — Implémenter CarrierProcessor
Position : 1.6 • Suit : entités • Précède : sous-ressource Adresses
Tag : Backend • Effort : M
Contexte : logique d'écriture du formulaire principal (POST/PATCH) : normalisation, champs conditionnels, archivage.
Spec liée : spec-back.md § 4.3 / 4.4 / 7
Critères d'acceptation :
- RG-4.01 : POST avec
qualimatCarrier→certificationType=QUALIMAT+ FK persistée ; cas LIOT :name='LIOT'⇒certificationTypenon requis,liotPlatesaccepté. - RG-4.02 :
certificationType='AUTRE'sansdischargeDocument→ 422 (#[Assert\Callback]). - RG-4.03 :
isChartered=truesansindexationRate/containerType/volumeM3→ 422. - RG-4.13 : normalisation (
nameUPPER, contacts Capitalize, phones digits, email lower,liotPlates). - RG-4.12 : doublon
name(actifs) → 409. - RG-4.14 : PATCH
isArchivedexigetransport.carriers.archive(Admin) ; mode strict (403 sinon). Tests à prévoir : PHPUnit sur chaque RG ci-dessus (cf. § 8.1). Tips :CarrierFieldNormalizermiroirSupplierFieldNormalizer.
1.7 — Sous-ressource Adresses (carrier_address)
Position : 1.7 • Suit : CarrierProcessor • Précède : Contacts
Tag : Backend • Effort : S
Spec liée : spec-back.md § 4.5 · RG-4.05→4.07
Critères d'acceptation :
POST /api/carriers/{id}/addresses,PATCH/DELETE /api/carrier_addresses/{id}(securitymanage).- RG-4.06 :
postalCodematche^[0-9]{4,5}$(autocomplete ville = front). - RG-4.05 : si affrété, adresse obligatoire (Pays/CP/Ville/Adresse) — validation conditionnelle. Tests à prévoir : PHPUnit — CP invalide → 422 ; adresse affrété incomplète → 422. Tips : RG-4.07 (bouton Valider masqué si QUALIMAT) = front, back accepte le PATCH.
1.8 — Sous-ressource Contacts (carrier_contact)
Position : 1.8 • Suit : Adresses • Précède : Prix
Tag : Backend • Effort : S
Spec liée : spec-back.md § 4.5 · RG-4.08
Critères d'acceptation :
POST /api/carriers/{id}/contacts,PATCH/DELETE /api/carrier_contacts/{id}(securitymanage).- RG-4.08 : bloc valide si ≥ 1 champ rempli (CHECK
chk_carrier_contact_filled+ Processor) ; max 2 téléphones. Tests à prévoir : PHPUnit — contact vide → 422 ; 1 champ → 200. Tips : miroir contacts M2/M3.
1.9 — Sous-ressource Prix (carrier_price) + RG branches
Position : 1.9 • Suit : Contacts • Précède : Export
Tag : Backend • Effort : M
Spec liée : spec-back.md § 4.5 / 7 · RG-4.09→4.11
Critères d'acceptation :
POST /api/carriers/{id}/prices,PATCH/DELETE /api/carrier_prices/{id}(securitymanage).- RG-4.10 (CLIENT) :
client,clientDeliveryAddress,departureSiterequis ;clientDeliveryAddressdoit appartenir auclient→ sinon 422. - RG-4.11 (FOURNISSEUR) :
supplier,supplierSupplyAddress,deliverySiterequis ;supplierSupplyAddressappartient ausupplier→ sinon 422. - Communs obligatoires :
containerType,pricingUnit,price,priceState; CHECK branches respectées. Tests à prévoir : PHPUnit — branche CLIENT/FOURNISSEUR incomplète → 422 ; adresse étrangère → 422. Tips : « Adresse départ/livraison 86/17/82 » =Site(FK) ; livraison client =ClientAddress, appro =SupplierAddress(relations ORM partagées).
1.10 — Export XLSX (répertoire + onglet Prix regroupé)
Position : 1.10 • Suit : Prix • Précède : Tests PHPUnit
Tag : Backend • Effort : M
Spec liée : spec-back.md § 4.6
Critères d'acceptation :
GET /api/carriers/export.xlsx: transporteurs affichés (mêmes filtres) ; colonnes § 4.6.GET /api/carriers/{id}/prices/export.xlsx: tableau Prix regroupé Benne / Fond Mouvant (colonnes docx p.10).- Controllers custom
#[Route(priority: 1)](conflit API Platform{id}) ;Content-Disposition. Tests à prévoir : PHPUnit — 200 + en-tête fichier ; respect des filtres. Tips : PhpSpreadsheet déjà présent.
1.11 — Tests PHPUnit RG-4.01→4.14 + capture contrat JSON (DoD)
Position : 1.11 • Suit : Export • Précède : Page Répertoire
Tag : Backend • Effort : M
Spec liée : spec-back.md § 4.0.bis / 8.1
Critères d'acceptation :
- Matrice RG-4.01→4.14 couverte (§ 8.1) + RBAC par rôle (Compta/Usine → 403).
CarrierSerializationContractTest: capture JSON réel liste + détail ;prices[].client/.supplier/sites embarqués (pas IRI) ;qualimatCarrierembarqué ;isArchivedprésent.- Anti-N+1 liste ; pagination Hydra ; audit (
entity_type='Carrier') ;AuditableEntitiesHaveI18nLabelTestvert. CarrierFixturesidempotent (§ 8.4) : transporteur QUALIMAT (validité passée), AUTRE+décharge, affrété, LIOT, complet (contacts/adresses/prix CLIENT+FOURNISSEUR), 1 archivé. Tests à prévoir : suite complètemake testverte. Tips : coller les JSON capturés dans § 4.0.bis (DoD avant front).
1.12 — Page Répertoire /carriers (datatable, filtres, export)
Position : 1.12 • Suit : Tests back • Précède : Page Ajouter
Tag : Frontend • Effort : M
Spec liée : spec-front.md § Datatable / Filtres · Figma 1132-45377
Critères d'acceptation :
<MalioDataTable>+usePaginatedList<Carrier>({url:'/carriers'}); colonnes Nom / Certification / Date de validité / Dernière activité.- RG-4.04 : date de validité QUALIMAT < aujourd'hui → fond rouge.
- Filtres (
search,certificationType,includeArchived) →setFilters(page 1) ; état 100 % local (règle n°6). - Boutons « + Ajouter » (si
manage) / « Filtrer » / « Exporter » (XLSX) ; clic ligne → Consultation. Tests à prévoir : Vitest —usePaginatedList(Hydra, exclusion archivés). Tips :useApi()obligatoire ; pas de persistance URL.
1.13 — Page Ajouter /carriers/new (layout, onglets, formulaire principal POST)
Position : 1.13 • Suit : Répertoire • Précède : Saisie assistée QUALIMAT
Tag : Frontend • Effort : M
Spec liée : spec-front.md § Écran Ajouter / Formulaire principal · Figma node 1132-45382 (Ajouter – Qualimat)
Critères d'acceptation :
- Layout + barre d'onglets
Qualimat · Adresses · Contacts · Prix; validation incrémentale (onglet suivant accessible après validation). - Formulaire principal (Nom, Liste certification, Affréter, …) →
POST /api/carriers; succès → bascule onglet + champs readonly. useFormErrors: mapping 422 inline par champ ;{ toast:false }. Tests à prévoir : Vitest —useCarrierForm(workflow par onglet, POST principal). Tips : miroiruseSupplierForm/useProviderForm.
1.14 — Saisie assistée QUALIMAT + champs conditionnels
Position : 1.14 • Suit : Page Ajouter • Précède : Onglet Adresses
Tag : Frontend • Effort : M
Spec liée : spec-front.md § Formulaire principal / Onglet Qualimat · RG-4.01→4.03 · Figma nodes 1132-50717 (Affréter), 1132-50982 (AUTRE→Décharge), 1132-45593 (LIOT)
Critères d'acceptation :
- RG-4.01 : saisie du nom →
GET /api/qualimat_carriers?search=→ modal « Êtes-vous sûr… » → copie Nom + certification (QUALIMAT, readonly) + adresse + FK conservée. - Cas LIOT : nom
LIOT→ champ immatriculations seul, autres masqués. - RG-4.02 : certification
AUTRE→ champ Décharge visible et obligatoire (upload). - RG-4.03 : « Affréter » coché → indexation / benne-fond mouvant / volume visibles et obligatoires.
Tests à prévoir : Vitest — affichage conditionnel (Affréter, AUTRE, LIOT) ; copie QUALIMAT.
Tips :
useQualimatSearch();useUpload()(ticket 1.19) pour la décharge.
1.15 — Onglet Adresses (autocomplete BAN)
Position : 1.15 • Suit : Saisie QUALIMAT • Précède : Onglet Contacts
Tag : Frontend • Effort : M
Spec liée : spec-front.md § Onglet Adresses · RG-4.05→4.07 · Figma node 1132-45670
Critères d'acceptation :
- Bloc adresse (Pays/CP/Ville/Adresse/complément) →
PATCH /api/carriers/{id}/addresses. - RG-4.06 :
useAddressAutocomplete()(BAN) — ville auto depuis CP, dégradé texte libre. - RG-4.05 : champs préremplis si QUALIMAT ; obligatoires si affrété. RG-4.07 : pas de bouton Valider si QUALIMAT.
Tests à prévoir : Vitest — autocomplete nominal + dégradé (réutilisation M1/M2/M3).
Tips : ne pas réécrire
useAddressAutocomplete().
1.16 — Onglet Contacts
Position : 1.16 • Suit : Adresses • Précède : Onglet Prix
Tag : Frontend • Effort : S
Spec liée : spec-front.md § Onglet Contacts · RG-4.08 · Figma node 1132-45756
Critères d'acceptation :
- Blocs contact (Nom/Prénom/Fonction/Téléphone x1-2/Email) →
PATCH /api/carriers/{id}/contacts. - RG-4.08 : « + Nouveau contact » bloqué tant que le bloc courant est vide ; suppression avec modal.
Tests à prévoir : Vitest — règle « ≥ 1 champ », max 2 téléphones.
Tips :
mapViolationsToRecordpar ligne (pattern collections M1/M2/M3).
1.17 — Onglet Prix (Client/Fournisseur, sites)
Position : 1.17 • Suit : Contacts • Précède : Consultation/Modification
Tag : Frontend • Effort : M
Spec liée : spec-front.md § Onglet Prix · RG-4.09→4.11 · Figma node 1132-45859
Critères d'acceptation :
- Radio
direction(Client/Fournisseur) → bascule des champs (RG-4.09). - RG-4.10 (Client) : Client + Adresse de livraison (du client) + Adresse de départ (86/17/82).
- RG-4.11 (Fournisseur) : Fournisseur + Adresse d'approvisionnement + Adresse de livraison (86/17/82).
- Communs : Benne/FM, Forfait/Tonne, Prix (
MalioInputAmount), État du prix →PATCH /api/carriers/{id}/prices. Tests à prévoir : Vitest — bascule Client/Fournisseur, champs requis. Tips : selects clients/fournisseurs/sites via endpoints existants (security élargie § 4.8).
1.18 — Pages Consultation + Modification
Position : 1.18 • Suit : Onglet Prix • Précède : Upload/i18n
Tag : Frontend • Effort : M
Spec liée : spec-front.md § Consultation / Modification
Critères d'acceptation :
- Consultation readonly (ouvre sur Adresses) ; flèche retour ; « Modifier » (si
manage) ; « Archiver » (Admin) → PATCHisArchived. - Onglet Prix consultation = tableau regroupé Benne/FM + bouton Exporter (XLSX).
- Modification = mêmes formulaires, champs pré-remplis, PATCH partiel par onglet.
Tests à prévoir : Vitest —
useCarrier(id)peuple les écrans depuis une seule réponse ; visibilité boutons par permission. Tips : « Restaurer » remplace « Archiver » sur un archivé.
1.19 — Upload front (useUpload) + i18n + libellés audit
Position : 1.19 • Suit : Consultation/Modification • Précède : —
Tag : Frontend • Effort : S
Spec liée : spec-back.md § 2.7 / 2.8 · spec-front.md § Composables
Critères d'acceptation :
- Composable
useUpload():POST /api/uploaded_documents(multipart) → IRI posée surcarrier.dischargeDocument(RG-4.02). - Clés i18n : libellés certification, sidebar (
sidebar.transport.*), libellés auditaudit.entity.transport_carrier/carrieraddress/carriercontact/carrierprice. <MalioInputUpload>(exception documentée si type non couvert). Tests à prévoir : Vitest —useUpload(succès + erreur MIME). Tips :AuditableEntitiesHaveI18nLabelTestexige les clés audit.
Actions Lesstime (à exécuter au feu vert de Matthieu)
create-groupprojectId 6, title « M4 — Répertoire transporteurs » → récupérer l'id.create-task×19 (statutPrêt à dev= 6, priorité Moyen=2, effort dans la description), dans l'ordre 1.1 → 1.19 :- Tickets 1.1 → 1.11 (Backend, tag
3) → assigné à Matthieu. - Tickets 1.12 → 1.19 (Frontend, tag
2) → assigné à Tristan.
- Tickets 1.1 → 1.11 (Backend, tag
- Mettre à jour le frontmatter des specs (
lesstime_taskgroup_id) + lien du groupe.
Au push : récupérer les
userIdvialist-users(Matthieu =5selon le référentiel ; Tristan à confirmer) pour renseigner l'assignation à la création.