4.4 KiB
Références Fournisseur par Item — Design Spec
Date : 2026-03-31 Statut : Validé
Contexte
Chaque entité (Machine, Pièce, Composant, Produit) a un champ reference générique et une relation ManyToMany avec Constructeur. Il n'existe aucun moyen de stocker une référence spécifique par fournisseur — si un item est vendu par 3 fournisseurs avec 3 références différentes, on ne peut en stocker qu'une seule.
Objectif
Permettre de stocker une référence fournisseur (supplierReference) par couple (item, constructeur). Le champ reference existant reste inchangé comme référence interne. Le champ supplierPrice sur Product reste inchangé.
Design
Approche retenue : conversion ManyToMany → entités pivot
Remplacer les 4 tables de jointure simples (_MachineConstructeurs, _PieceConstructeurs, _ComposantConstructeurs, _ProductConstructeurs) par de vraies entités Doctrine Link, suivant le pattern existant (MachinePieceLink, MachineComponentLink, etc.).
Nouvelles entités
| Entité | Table | FK item | FK constructeur | Champs extra |
|---|---|---|---|---|
MachineConstructeurLink |
machine_constructeur_links |
machineId → Machine |
constructeurId → Constructeur |
supplierReference (string 255, nullable) |
PieceConstructeurLink |
piece_constructeur_links |
pieceId → Piece |
constructeurId → Constructeur |
supplierReference (string 255, nullable) |
ComposantConstructeurLink |
composant_constructeur_links |
composantId → Composant |
constructeurId → Constructeur |
supplierReference (string 255, nullable) |
ProductConstructeurLink |
product_constructeur_links |
productId → Product |
constructeurId → Constructeur |
supplierReference (string 255, nullable) |
Structure de chaque entité
Chaque entité suit le pattern MachinePieceLink :
CuidEntityTraitpour l'ID (string, 36 chars)#[ORM\HasLifecycleCallbacks]aveccreatedAt/updatedAt- Contrainte unique sur
(item_id, constructeur_id)via#[ORM\UniqueConstraint] #[ApiResource]avec opérations CRUD complètes- Sécurité :
ROLE_VIEWERpour lecture,ROLE_GESTIONNAIREpour écriture ManyToOnevers l'item (onDelete CASCADE)ManyToOneversConstructeur(onDelete CASCADE)- Champ
supplierReference(string 255, nullable)
Modifications sur les entités existantes
Machine, Pièce, Composant, Produit
- Supprimer la propriété
ManyToManyconstructeurset ses getters/setters/add/remove - Ajouter une propriété
OneToManyconstructeurLinksvers le Link correspondant - Getter
getConstructeurLinks(): Collection
Constructeur
- Supprimer les 4 propriétés
ManyToMany(machines,composants,pieces,products) et leurs getters/setters - Ajouter 4 propriétés
OneToManyvers les Links correspondants
Migration SQL
- Créer les 4 nouvelles tables avec colonnes
id,machineId/pieceId/etc.,constructeurId,supplierReference,createdAt,updatedAt - Ajouter les contraintes uniques
- Migrer les données des anciennes tables de jointure vers les nouvelles (génération CUID pour chaque ligne,
supplierReference= NULL) - Supprimer les anciennes tables de jointure (
_MachineConstructeurs,_PieceConstructeurs,_ComposantConstructeurs,_ProductConstructeurs)
API
Endpoints API Platform auto-générés pour chaque Link :
GET /api/machine_constructeur_links— liste (filtrable par machine, constructeur)GET /api/machine_constructeur_links/{id}— détailPOST /api/machine_constructeur_links— créer un lien avec référencePATCH /api/machine_constructeur_links/{id}— modifier la référenceDELETE /api/machine_constructeur_links/{id}— supprimer le lien
Idem pour les 3 autres types.
Frontend
Les pages détail/édition qui affichent les constructeurs devront être adaptées pour :
- Afficher la
supplierReferenceà côté de chaque constructeur - Permettre l'édition de la référence fournisseur lors de l'ajout/modification d'un constructeur
- Utiliser les endpoints
*ConstructeurLinkau lieu de la collectionconstructeurs
Hors périmètre
- Migration de
supplierPricede Product vers le Link (explicitement exclu) - Modification du champ
referenceexistant sur les entités - Référence auto (
referenceAuto) sur Pièce/Composant — non impactée