Files
Starseed/docs/specs/M4-transporteurs/prompts/00-PLAN-MAITRE.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

5.2 KiB

M4 — Plan maître worktrees (back, Matthieu)

Rôle de ce fichier : vue d'ensemble que la conversation maître tient à jour. Chaque worktree = une conversation Claude isolée + une branche + une PR vers develop. Les prompts à coller sont dans WT*.md.

Principe

  • 1 worktree = 1 branche partant de origin/develop (à jour des deps).
  • 1 ticket = 1 PR atomique vers develop (jamais main).
  • Commit autorisé sur la branche du worktree (ces prompts SONT la demande explicite) ; git commit --no-verify OK si make test est déjà vert (le hook relance toute la suite).
  • Chaque worktree ouvre SA PR vers develop en fin de tâche (cf. bloc PR ci-dessous).

Bloc PR standard (repris dans chaque prompt)

git push -u origin <branche>
tea pr create --base develop --head <branche> \
  --title "<type>(<scope>) : <titre>" \
  --description "Résumé + lien ticket Lesstime ERP-XXX"

Puis labelliser la PR via l'API Gitea (tea ne pose pas les labels en CLI — gitea.malio.fr). Cible develop, jamais main. Aucune mention de Claude/IA dans titre ou description.

Vagues & ordre de merge

VAGUE 0  (en parallèle, dès maintenant)
  WT1  1.2 upload Shared      base: origin/develop            ──┐
  WT2  1.1 RBAC + sidebar     base: origin/develop (≥ERP-150) ──┤ indépendants
                                                                 │
VAGUE 1  (critique, séquentiel)                                  │
  WT3  1.3 migration + 1.5 entités/resource/provider + i18n audit
       base: origin/develop APRÈS merge WT1  (FK uploaded_document)
       ⭐ livre le CONTRAT JSON liste+détail → débloque le front (Tristan)

VAGUE 2  (fan-out, tous en parallèle dès WT3 mergé)
  WT4  1.6 processor          base: develop ≥ WT3
  WT5  1.4 qualimat endpoint  base: develop ≥ WT2 (perm) + ERP-39   (indépendant de WT3)
  WT6  1.7 adresses           base: develop ≥ WT3
  WT7  1.8 contacts           base: develop ≥ WT3
  WT8  1.9 prix               base: develop ≥ WT3
  WT9  1.10 export XLSX        base: develop ≥ WT3

VAGUE 3  (final)
  WT10 1.11 tests + fixtures + contrat  base: develop ≥ TOUT

Parallélisme réel : 2 worktrees en V0, puis 1 goulot (WT3), puis jusqu'à 6 en V2, puis 1 (WT10).

Règle anti-conflit worktree (IMPORTANT)

Pour que WT4→WT9 tournent en parallèle sans conflit de merge :

Fichier partagé Qui le touche Les autres
CarrierFixtures WT10 uniquement interdit (WT3 met un fixture minimal, WT6-9 n'y touchent pas)
Entité Carrier (ApiResource) WT3 crée, WT4 ajoute le Processor WT6-9 créent des resources/processors dédiés par sous-entité, ne modifient pas Carrier
ColumnCommentsCatalog WT1 (uploaded_document), WT3 (carrier*) personne d'autre
fr.json (clés audit) WT3 (clés audit.entity.transport_*) personne d'autre côté back
migrations/ WT1 puis WT3 (ordre timestamp) aucune autre migration

Mode retenu : STACK séquentiel, SANS worktree (repo principal)

Matthieu empile les MR, un ticket à la fois, directement dans /home/matthieu/dev_malio/Starseed (pas de worktree).

  • Ignorer les blocs git worktree add des WT*.md → remplacés par une branche normale :
    git fetch origin
    git checkout -b feat/erp-XXX-... origin/<branche-précédente>
    
  • WT1 hors pile (déjà mergé). Pile M4 — chaque branche basée sur la précédente : WT2 → WT3 → WT4 → WT5 → WT6 → WT7 → WT8 → WT9 → WT10
  • PR de chaque maillon : --base <branche-précédente> (bas de pile WT2 = develop). Au merge, les MR du dessus se recible auto.
  • Docker tourne sur le repo principal → make test/php-cs-fixer OK sans rebind (le piège worktree-vs-mount ne s'applique plus).
  • Worktrees créés pour WT1/WT2 à nettoyer : git worktree remove ../sb-erp154-upload ../sb-erp153-rbac.
  • Garder les MR basses propres ; merger dans l'ordre.

Suivi (tenu par la conv maître)

WT Ticket ERP État PR Notes
WT1 1.2 upload 154 MERGÉ #108 migration Version20260615130000
WT2 1.1 RBAC 153 PR ouverte #111 bas de pile (cible develop)
WT3 1.3+1.5 155+157 ▶️ À LANCER stack sur feat/erp-153-rbac ; gate contrat front
WT4 1.6 proc 158 bloqué par WT3
WT5 1.4 qualimat 156 bloqué par WT2+ERP-39
WT6 1.7 adresses 159 bloqué par WT3
WT7 1.8 contacts 160 bloqué par WT3
WT8 1.9 prix 161 bloqué par WT3
WT9 1.10 export 162 bloqué par WT3
WT10 1.11 tests 163 bloqué par tout

Cadre commun à tous les prompts (rappels projet)

  • Carrier vit dans src/Module/Transport/ (créé par ERP-150). Miroir = src/Module/Commercial/ (Supplier).
  • Tests sous tests/Module/Transport/Api/ (miroir tests/Module/Commercial/Api/).
  • declare(strict_types=1); partout ; commentaires FR, code EN.
  • make test + make php-cs-fixer-allow-risky avant de dire « fini ».
  • Ne jamais mentionner Claude/IA dans commit/PR.