referentiels et les tests * RG-1.12/1.13. Le seed migration couvre la prod (ou les fixtures ne tournent * pas) ; cette fixture re-aligne dev et test. Memes valeurs des deux cotes. * * Idempotence : lookup par `code` avant insertion (sur le modele de * CategoryTypeFixtures). Rejouable sans doublon meme si le purger est desactive. */ class CommercialReferentialFixtures extends Fixture { /** * Source unique des referentiels : classe d'entite => [code => [label, position]]. * Doit rester aligne sur le seed de la migration Version20260601000000. * * @var array> */ private const REFERENTIALS = [ TvaMode::class => [ 'FRANCE_VENTES' => ['France (ventes)', 10], 'EXPORT_VENTES' => ['Export (ventes)', 20], 'INTRACOM_VENTES' => ['Intracom (ventes)', 30], ], PaymentDelay::class => [ 'J15' => ['15 jours', 10], 'J30' => ['30 jours', 20], 'A_RECEPTION' => ['À réception', 30], ], PaymentType::class => [ 'VIREMENT' => ['Virement', 10], 'LCR' => ['LCR', 20], 'NON_SOUMISE' => ['Non soumise', 30], 'CHEQUE' => ['Chèque', 40], ], Bank::class => [ 'SG' => ['Société Générale', 10], 'CIC' => ['CIC', 20], 'CA' => ['Crédit Agricole', 30], ], ]; public function load(ObjectManager $manager): void { foreach (self::REFERENTIALS as $entityClass => $rows) { $this->seedReferential($manager, $entityClass, $rows); } $manager->flush(); } /** * Upsert idempotent d'un referentiel : indexe l'existant par code puis * cree/met a jour chaque entree. Les 4 entites partagent le meme contrat * setCode/setLabel/setPosition. * * @param class-string $entityClass * @param array $rows */ private function seedReferential(ObjectManager $manager, string $entityClass, array $rows): void { $existingByCode = []; foreach ($manager->getRepository($entityClass)->findAll() as $entity) { $existingByCode[$entity->getCode()] = $entity; } foreach ($rows as $code => [$label, $position]) { $entity = $existingByCode[$code] ?? new $entityClass(); $entity->setCode($code); $entity->setLabel($label); $entity->setPosition($position); $manager->persist($entity); } } }