Files
Starseed/docs/specs/M4-transporteurs/prompts/WT2-rbac.md
T
Matthieu d9313dbec8 feat(transport) : schéma + entités Carrier + contrat lecture (ERP-155/157)
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.
2026-06-15 19:15:12 +02:00

2.4 KiB

WT2 — Permissions transport.carriers.* + sidebar (ticket 1.1 / ERP-153)

git fetch origin
git worktree add ../sb-erp153-rbac -b feat/erp-153-rbac origin/develop
cd ../sb-erp153-rbac && claude

Base : origin/develop après merge d'ERP-150 (le module Transport doit exister). Vérifie : ls src/Module/Transport/.


Prompt à coller

Projet Starseed (modular monolith DDD). Lis CLAUDE.md, .claude/rules/architecture.md et .claude/rules/testing.md avant de coder.

Mission : poser le socle RBAC du module Transport et son entrée de menu. TransportModule::permissions() renvoie [] aujourd'hui.

Spec : spec-back.md § 5 + spec-front.md § Accès.

À livrer :

  1. TransportModule::permissions() déclare transport.carriers.view, transport.carriers.manage, transport.carriers.archive. app:sync-permissions les enregistre.
  2. Matrice § 5.2 : Admin (view+manage+archive), Bureau (view+manage), Commerciale (view), Compta + Usine (aucune).
  3. RÈGLE ABSOLUE n°8 — les 3 sources RBAC dans le MÊME commit :
    • config/sidebar.php : section « Transport » + item /carriers + permission: transport.carriers.view,
    • frontend/tests/e2e/_fixtures/personas.ts : ajuster permissions + expectedAdminLinks des personas existants,
    • src/Module/Core/Infrastructure/Console/SeedE2ECommand.php : miroir back des mêmes personas.
  4. Item sidebar masqué pour Compta/Usine ; visible Admin/Bureau/Commerciale.

Pièges :

  • Ne touche QUE le RBAC/sidebar — pas d'entité, pas de migration.
  • Toute modif d'une seule des 3 sources sans les 2 autres = drift / test cassé.
  • Section « Transport » vs « Logistique » : prends « Transport » (cosmétique, alignable plus tard).

Tests à écrire/vérifier : app:sync-permissions OK ; cohérence personas (pas de drift). Lance make test.

Scope STRICT : RBAC + sidebar + 3 miroirs. Rien d'autre.

Fini quand : make test vert + make php-cs-fixer-allow-risky. Commit (--no-verify si test vert), puis ouvre la PR :

git push -u origin feat/erp-153-rbac
tea pr create --base develop --head feat/erp-153-rbac \
  --title "feat(transport) : permissions carriers + sidebar (ERP-153)" \
  --description "RBAC transport.carriers.* + 3 sources RBAC alignées. Ticket ERP-153."

Puis labellise via l'API Gitea. Cible develop. Aucune mention IA.