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.6 KiB
WT4 — CarrierProcessor (ticket 1.6 / ERP-158)
git fetch origin git worktree add ../sb-erp158-processor -b feat/erp-158-carrier-processor origin/develop cd ../sb-erp158-processor && claudeBase :
origin/developaprès merge de WT3 (entités Carrier) et WT1 (upload, pour la décharge).
Prompt à coller
Projet Starseed (Symfony 8 / API Platform 4, DDD). Lis CLAUDE.md, .claude/rules/backend.md. Charge le skill backend-entity-conventions.
Mission : logique d'écriture du formulaire principal Carrier (POST/PATCH) — normalisation, champs conditionnels, archivage. Miroir : src/Module/Commercial/Infrastructure/ApiPlatform/State/Processor/SupplierProcessor.php + Application/Service/SupplierFieldNormalizer.php.
Spec : spec-back.md § 4.3 / 4.4 / 7.
Règles métier à implémenter (un test PHPUnit par RG) :
- 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 via
CarrierFieldNormalizer(miroir Supplier) —nameUPPER, contacts Capitalize, phones digits-only, email lower,liotPlates(;-split/trim/UPPER). - RG-4.12 : doublon
name(parmi actifs) → 409 +setErrorciblé. - RG-4.14 : PATCH
isArchivedexigetransport.carriers.archive(Admin) ; mode strict → 403 sinon.
Pièges :
- Messages de validation FR explicites sur chaque contrainte (
EntityConstraintsHaveFrenchMessageTest). - Le back renvoie toutes les violations d'un coup avec
propertyPathaligné sur les champs front.
Scope STRICT : CarrierProcessor + CarrierFieldNormalizer + contraintes sur l'entité Carrier (formulaire principal). NE TOUCHE PAS : les sous-ressources adresses/contacts/prix (WT6/7/8), CarrierFixtures (WT10), l'export (WT9). Ajoute tes contraintes sur Carrier sans réécrire l'ApiResource posée par WT3.
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-158-carrier-processor
tea pr create --base develop --head feat/erp-158-carrier-processor \
--title "feat(transport) : CarrierProcessor (RG-4.01→4.03/4.12→4.14) (ERP-158)" \
--description "Normalisation + champs conditionnels + archive. Ticket ERP-158."
Puis labellise via l'API Gitea. Cible develop. Aucune mention IA.