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.
2.1 KiB
WT6 — Sous-ressource Adresses (ticket 1.7 / ERP-159)
git fetch origin git worktree add ../sb-erp159-adresses -b feat/erp-159-carrier-addresses origin/develop cd ../sb-erp159-adresses && claudeBase :
origin/developaprès merge de WT3 (entitésCarrierAddress). Parallèle à WT5/WT7/WT8/WT9.
Prompt à coller
Projet Starseed (Symfony 8 / API Platform 4, DDD). Lis CLAUDE.md, .claude/rules/backend.md. Charge le skill backend-entity-conventions. Miroir : SupplierAddressProcessor.php (src/Module/Commercial/Infrastructure/ApiPlatform/State/Processor/).
Mission : opérations d'écriture sur les adresses transporteur.
Spec : spec-back.md § 4.5 + RG-4.05→4.07.
À livrer :
POST /api/carriers/{id}/addresses,PATCH/DELETE /api/carrier_addresses/{id}(securitymanage) — resource/processor dédiés àCarrierAddress, ne modifie pas l'ApiResourceCarrier.- RG-4.06 :
postalCodematche^[0-9]{4,5}$(autocomplete ville = front). Message FR. - RG-4.05 : si affrété → adresse obligatoire (Pays/CP/Ville/Adresse) — validation conditionnelle.
- RG-4.07 (bouton Valider masqué si QUALIMAT) = front ; côté back, accepter le PATCH normalement.
Tests à écrire : CP invalide → 422 ; adresse affrété incomplète → 422 ; PATCH/DELETE OK avec manage, 403 sans.
Scope STRICT : uniquement CarrierAddress (resource + processor + tests). NE TOUCHE PAS CarrierFixtures (WT10), l'entité Carrier, les autres sous-ressources. Messages de validation FR (EntityConstraintsHaveFrenchMessageTest).
Fini quand : make test vert + make php-cs-fixer-allow-risky. Commit (--no-verify si vert), puis ouvre la PR :
git push -u origin feat/erp-159-carrier-addresses
tea pr create --base develop --head feat/erp-159-carrier-addresses \
--title "feat(transport) : sous-ressource adresses transporteur (ERP-159)" \
--description "POST/PATCH/DELETE carrier_address + RG-4.05→4.07. Ticket ERP-159."
Puis labellise via l'API Gitea. Cible develop. Aucune mention IA.