[ERP-54] Créer les entités Client + sous-entités + référentiels #29
Reference in New Issue
Block a user
Delete Branch "feature/ERP-54-creer-entites-client-m1"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Contexte
Ticket Lesstime #54 (1.1 / Backend / M) — spec
docs/specs/M1-clients/spec-back.md§ 3.4 / § 3.5.Contenu
9 entités (
src/Module/Commercial/Domain/Entity/) :Client,ClientContact,ClientAddress,ClientRib—#[Auditable]+ Timestampable/Blamable.TvaMode,PaymentDelay,PaymentType,Bank— whitelistés dansEntitiesAreTimestampableBlamableTest::EXCLUDED.8 repositories interfaces (
Domain/Repository/) + impl Doctrine (Infrastructure/Doctrine/).Décisions
#[ApiResource]dans ce ticket : le bloc ApiResource duClient(§ 3.4) référenceClientProvider/ClientProcessor= périmètre ERP-55. L'inclure casseraitcache:clear/make test/schema:validate. Les entités sont des entités Doctrine pures (ORM + Assert + Groups). Endpoints lecture seule des référentiels → ticket dédié.Clientsans#[ORM\UniqueConstraint]— unicité du nom de société portée par l'index partiel Postgresuq_client_company_name_active(inexprimable en attribut ORM).#[AuditIgnore]surClientRib.iban/bic(tous champs audités, audit admin-only).Categoryvia le contratShared\Domain\Contract\CategoryInterface+resolve_target_entities(pas d'import direct Catalog→Commercial) ;ClientAddress.sitesviaSiteInterfaceexistant.Infra nécessaire (découvert pendant le dev)
doctrine.yaml: mapping ORM du moduleCommercial(mappings explicites par module) + résolutionCategoryInterface → Category.CommercialReferentialFixturescréée (n'existait pas — ERP-53 avait seedé les CategoryType côté Catalog) : re-seed idempotent des 4 référentiels, sinon vidés audb-reset(désormais tables mappées).ColumnCommentsCatalogétendu (colonnes M1) pour le cheminschema:update/test — sinonColumnsHaveSqlCommentTest(garde-fou n°12) échoue.Version20260528120000(ERP-67) rendue résiliente ($schema->hasTable()) : elle rejouait tout le catalogue mais s'exécute avant la création des tables M1 →relation tva_mode does not exist. Conforme à son docblock (« les futures migrations posent leurs propres COMMENT »).makefile test-db-setup: recréation de l'index partieluq_client_company_name_active(analogue de la ligne existante pourcategory).Vérifications
make php-cs-fixer-allow-risky✓make db-reset✓ (bout en bout ; 4 référentiels + 4 CategoryType présents, 2 index partiels créés)make test✓ 312/312 (Architecture vert, 0 régression M0)doctrine:schema:validate: Mapping OK ; « not in sync » = bruit cosmétique pré-existant du projet (clear COMMENT hors-ORM, drop index partiels, renommages d'index). Seul diff introduit : renommage cosmétique de l'index M2Midx_client_category_category(même colonne) — aucun écart de type/colonne/FK vs migration ERP-53.Revue de code ERP-54 (entités Client + sous-entités + référentiels comptables), stackée sur ERP-53.
Très bon travail, mapping ORM cohérent et bien documenté. Points vérifiés OK :
resolve_target_entities:CategoryInterfaceajouté,SiteInterfacedéjà présent → les M2MClient.categories/ClientAddress.{sites,categories}résolvent bien (règle n°1 respectée, pas d'import inter-modules).Category::getName(): ?stringmatche le contrat.cascade+orphanRemovalcorrects, FKonDeletealignés sur la migration ERP-53.EntitiesAreTimestampableBlamableTest: découverte par Finder → les 4 entités client (Timestampable/Blamable) passent, les 4 référentiels statiques sont whitelistés à juste titre. Aucun test n'enforce#[Auditable], donc référentiels non-audités OK.ColumnCommentsCatalogcomplété pour TOUTES les colonnes des nouvelles tables → aprèsschema:update(qui drop les COMMENT des tables désormais mappées),app:apply-column-commentsles restaure →ColumnsHaveSqlCommentTestreste vert. Le fix du filtrehasTable()dans la migration retrofit 0528 est nécessaire et correct.#[AuditIgnore]: décision explicite (docblock + spec § 6.1), conforme (rule n°3 ne vise que password/token/secret).3 remarques mineures / vérification ci-dessous. Aucun bug bloquant.
@@ -69,0 +74,4 @@# les tables (client, sous-collections, referentiels comptables) creees# par la migration M1 (Version20260601000000) doivent etre connues de# l'ORM. L'activation fonctionnelle passe par config/modules.php.Commercial:Vérifier que
schema:updateest bien un no-op sur les nouvelles tables.Contexte : les entités sont mappées à la main pour coller à une migration déjà écrite (ERP-53). Toute la correction du schéma dev/test repose sur le fait que
doctrine:schema:update --force(étape 2 detest-db-setup) ne génère aucun diff destructif surclient+ sous-tables + tables de jointure M2M.Cause : si un attribut ORM diverge de la DDL (type, longueur,
onDelete, nom de FK de jointure),schema:updatepeut émettre des ALTER silencieux sur la base de test — et comme il n'y a pas encore de test fonctionnel en ERP-54, une divergence ne serait visible qu'en ERP-55. Les CHECK (chk_client_*) et l'index partieluq_client_company_name_activene sont pas exprimables en ORM : le 1er survit (non géré par Doctrine), le 2nd est bien recréé par le makefile — mais c'est précisément le signe que le diff n'est pas vide.Recommandation : lancer
php bin/console doctrine:schema:update --env=test --dump-sqlaprèsmigrations:migrateet confirmer qu'il ne reste QUE les drops attendus (index partiel + COMMENT), rien sur les colonnes/FK. À documenter dans la description de MR pour ERP-55.@@ -43,0 +46,4 @@// leur migration dediee (regle ABSOLUE n°12). Garde-fou indispensable,// sinon l'ajout d'un module au catalogue casse ce retrofit avec un// "relation X does not exist".$existingTables = array_values(array_filter(Édition d'une migration déjà livrée — OK ici, mais à acter.
Contexte : on modifie le corps d'une migration historique (retrofit ERP-67) pour filtrer sur
$schema->hasTable(), car le catalogue partagé liste maintenant des tables (client…) qui n'existent pas encore à l'instant T de cette migration.Cause : en principe une migration appliquée est immuable. Ici c'est sans risque car le filtre ne change le comportement que pour des tables absentes à ce stade (elles n'auraient de toute façon pas pu être commentées) — une prod déjà passée par 0528 ne rejoue pas, et un
db-resetrepart proprement. Sans ce garde-fou, l'ajout du module au catalogue casserait le retrofit avec « relation client does not exist ».Recommandation : rien à changer, le fix est correct et nécessaire. Juste s'assurer qu'aucun environnement n'a une version partielle du catalogue figée ; le commentaire ajouté documente déjà bien le pourquoi.
@@ -0,0 +35,4 @@** @var array<class-string, array<string, array{string, int}>>*/private const REFERENTIALS = [Triple source de vérité pour les valeurs des 4 référentiels.
Contexte : les couples code/label/position sont désormais déclarés à 3 endroits — l'
INSERTde la migrationVersion20260601000000(ERP-53, sert la prod), ceconst REFERENTIALS(sert dev/test), et les libellés deColumnCommentsCatalogcôté commentaires.Cause : ces littéraux doivent rester strictement alignés. Un changement de label (ex. « À réception ») ou un nouveau code dans un seul endroit crée une divergence silencieuse prod ↔ dev/test, non détectée par les tests actuels. Le docblock le reconnaît déjà (« Doit rester aligné sur le seed de la migration »).
Recommandation : acceptable vu le découpage prod/dev assumé (même pattern que
CategoryTypeFixtures). Pour éliminer le risque, on pourrait centraliser code/label/position dans une constante partagée consommée par la migration ET la fixture. Mineur, à arbitrer.Suite review (merci) — pas de changement de code requis, ces 3 points sont des confirmations :
schema:updateno-op : ✅ vérifié.make db-reset(migrations puisschema:update --forceen test) ne génère aucun diff destructif surclient+ sous-tables + jointures M2M ; la suite complète (370 tests) passe sur base fraîche.ColumnCommentsCatalog(commentaires) doivent rester alignés — documenté, pas de factorisation au M1.Version20260528120000, retrofit ERP-67) : 🟢 acté. Le filtre$schema->hasTable()est sans risque ici (table absente à l'instant T) ; on note l'entorse au principe d'immuabilité.(Branche rebasée sur ERP-53 corrigé → nouveau SHA, pas de changement de contenu propre à ERP-54.)