d9313dbec8
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.
5.2 KiB
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 dansWT*.md.
Principe
- 1 worktree = 1 branche partant de
origin/develop(à jour des deps). - 1 ticket = 1 PR atomique vers
develop(jamaismain). - Commit autorisé sur la branche du worktree (ces prompts SONT la demande explicite) ;
git commit --no-verifyOK simake testest déjà vert (le hook relance toute la suite). - Chaque worktree ouvre SA PR vers
developen 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 adddesWT*.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-fixerOK 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/(miroirtests/Module/Commercial/Api/). declare(strict_types=1);partout ; commentaires FR, code EN.make test+make php-cs-fixer-allow-riskyavant de dire « fini ».- Ne jamais mentionner Claude/IA dans commit/PR.