dc75945f3e
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.
46 lines
2.4 KiB
Markdown
46 lines
2.4 KiB
Markdown
# WT2 — Permissions `transport.carriers.*` + sidebar (ticket 1.1 / ERP-153)
|
|
|
|
> ```bash
|
|
> 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** :
|
|
```bash
|
|
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.
|