created = 0; $this->updated = 0; $trucks = $this->seedTrucks(); $carriers = $this->seedCarriers(); $this->seedDriversAndVehicles($carriers['liot'] ?? null, $trucks['citerne'] ?? null, $trucks['porteur'] ?? null, $io); $this->seedMerchandiseTypes(); $this->seedPelletTypes(); $this->seedBuildings(); $this->seedReceptionTypes(); $this->seedSuppliers(); $this->entityManager->flush(); $io->success(sprintf('Seed completed: %d created, %d updated.', $this->created, $this->updated)); return Command::SUCCESS; } private function seedTrucks(): array { $trucks = ['Citerne', 'Porteur']; $citerne = null; $porteur = null; foreach ($trucks as $name) { $truck = $this->upsertByName(Truck::class, $name, static fn (Truck $truck) => $truck->setName($name)); if ('Citerne' === $name) { $citerne = $truck; } if ('Porteur' === $name) { $porteur = $truck; } } return [ 'citerne' => $citerne, 'porteur' => $porteur, ]; } private function seedCarriers(): array { $carriers = [ ['name' => 'LIOT', 'code' => 'LIOT'], ['name' => 'LUI-MEME', 'code' => 'LUI-MEME'], ]; $liot = null; foreach ($carriers as $carrierData) { $carrier = $this->upsertByCode(Carrier::class, $carrierData['code'], static function (Carrier $carrier) use ($carrierData) { $carrier ->setName($carrierData['name']) ->setCode($carrierData['code']) ; }); if ('LIOT' === $carrierData['code']) { $liot = $carrier; } } return [ 'liot' => $liot, ]; } private function seedDriversAndVehicles(?Carrier $liot, ?Truck $citerne, ?Truck $porteur, SymfonyStyle $io): void { if (!$liot || !$citerne || !$porteur) { $io->warning('Transport data not fully available; drivers/vehicles skipped.'); return; } $driverRepo = $this->entityManager->getRepository(Driver::class); $vehicleRepo = $this->entityManager->getRepository(Vehicle::class); $drivers = ['Eddy', 'Jean-Christophe', 'Etienne', 'Hersand']; foreach ($drivers as $name) { $driver = $driverRepo->findOneBy(['name' => $name, 'carrier' => $liot]); if (!$driver) { $driver = new Driver(); ++$this->created; } else { ++$this->updated; } $driver ->setName($name) ->setCarrier($liot) ; $this->entityManager->persist($driver); } $vehicles = [ ['plate' => 'GH-684-VZ', 'truck' => $citerne], ['plate' => 'FW-363-EC', 'truck' => $porteur], ['plate' => 'FW-370-EC', 'truck' => $porteur], ['plate' => 'FW-375-EC', 'truck' => $porteur], ['plate' => 'FY-952-HS', 'truck' => $porteur], ]; foreach ($vehicles as $vehicleData) { $vehicle = $vehicleRepo->findOneBy(['plate' => $vehicleData['plate']]); if (!$vehicle) { $vehicle = new Vehicle(); ++$this->created; } else { ++$this->updated; } $vehicle ->setPlate($vehicleData['plate']) ->setCarrier($liot) ->setTruck($vehicleData['truck']) ; $this->entityManager->persist($vehicle); } } private function seedMerchandiseTypes(): void { $merchandiseTypes = [ ['label' => 'Foin', 'code' => 'FOIN'], ['label' => 'Paille', 'code' => 'PAILLE'], ['label' => 'Granule', 'code' => 'GRANULE'], ]; foreach ($merchandiseTypes as $type) { $this->upsertByCode(MerchandiseType::class, $type['code'], static function (MerchandiseType $entity) use ($type) { $entity ->setLabel($type['label']) ->setCode($type['code']) ; }); } } private function seedPelletTypes(): void { $pelletTypes = [ ['label' => 'JB croissance', 'code' => 'K750'], ['label' => 'Genisse herbe', 'code' => 'K500'], ['label' => 'Bovistart melasse ferme', 'code' => 'K130'], ['label' => 'Bovin mise en forme', 'code' => 'K400'], ]; foreach ($pelletTypes as $type) { $this->upsertByCode(PelletType::class, $type['code'], static function (PelletType $entity) use ($type) { $entity ->setLabel($type['label']) ->setCode($type['code']) ; }); } } private function seedBuildings(): void { $buildings = [ ['label' => 'Bâtiment 1', 'code' => 'B1'], ['label' => 'Bâtiment 2', 'code' => 'B2'], ['label' => 'Bâtiment 3', 'code' => 'B3'], ]; foreach ($buildings as $buildingData) { $this->upsertByCode(Building::class, $buildingData['code'], static function (Building $entity) use ($buildingData) { $entity ->setLabel($buildingData['label']) ->setCode($buildingData['code']) ; }); } } private function seedReceptionTypes(): void { $receptionTypes = [ ['label' => 'Marchandises', 'code' => 'MARCHANDISES'], ['label' => 'Bovins', 'code' => 'BOVINS'], ]; foreach ($receptionTypes as $type) { $this->upsertByCode(ReceptionType::class, $type['code'], static function (ReceptionType $entity) use ($type) { $entity ->setLabel($type['label']) ->setCode($type['code']) ; }); } } private function seedSuppliers(): void { $suppliers = [ [ 'name' => 'LIOT', 'email' => 'lpc.contacts@lpc-liot.fr', 'phone' => '05.49.20.09.10', 'addresses' => [ [ 'label' => 'LIOT CHATELLERAULT', 'street' => "14 Allée d'Argenson", 'street2' => 'ZI Nord', 'postalCode' => '86100', 'city' => 'CHATELLERAULT', 'countryCode' => 'FR', ], ], ], [ 'name' => 'ARNAULT EURL', 'email' => 'eurl.arnault86@orange.fr', 'phone' => '05.49.02.65.27', 'addresses' => [ [ 'label' => 'ARNAULT EURL', 'street' => 'Moulin du Guéret', 'street2' => 'B.P 30425', 'postalCode' => '86100', 'city' => 'Antran', 'countryCode' => 'FR', ], ], ], [ 'name' => 'EARL DES GONNIERES', 'email' => null, 'phone' => '06.80.14.18.82', 'addresses' => [ [ 'label' => 'EARL DES GONNIERES', 'street' => "27 Route d'Ingrandes", 'street2' => 'Les Gonnières', 'postalCode' => '86220', 'city' => 'OYRE', 'countryCode' => 'FR', ], ], ], [ 'name' => 'EARL LESIGNY BABY', 'email' => null, 'phone' => '05.49.86.17.95', 'addresses' => [ [ 'label' => 'EARL LESIGNY BABY', 'street' => '2 Lieu Dit Les Bouquins', 'street2' => null, 'postalCode' => '86270', 'city' => 'LESIGNY', 'countryCode' => 'FR', ], ], ], [ 'name' => 'FEDER', 'email' => 'contact@uco-feder.fr', 'phone' => '03.85.24.25.50', 'addresses' => [ [ 'label' => 'FEDER', 'street' => 'Molaise', 'street2' => null, 'postalCode' => '71120', 'city' => 'CHAROLLES', 'countryCode' => 'FR', ], ], ], [ 'name' => "GAEC DE L'ESPOIR", 'email' => 'contact@uco-feder.fr', 'phone' => '05.49.86.57.24', 'addresses' => [ [ 'label' => "GAEC DE L'ESPOIR", 'street' => 'La Moujonnerie', 'street2' => null, 'postalCode' => '86450', 'city' => 'PLEUMARTIN', 'countryCode' => 'FR', ], ], ], [ 'name' => 'GRAVELEAU', 'email' => 'contact@graveleau-sarl.fr', 'phone' => '05.49.23.51.66', 'addresses' => [ [ 'label' => 'GRAVELEAU', 'street' => '3, Le Jeu', 'street2' => null, 'postalCode' => '86220', 'city' => 'INGRANDES', 'countryCode' => 'FR', ], ], ], [ 'name' => 'LORTHOLARY', 'email' => 'contact86@lortholarybetail.com', 'phone' => '05.49.52.77.10', 'addresses' => [ [ 'label' => 'LORTHOLARY', 'street' => 'Ferme de Geniec', 'street2' => null, 'postalCode' => '86550', 'city' => 'MIGNALOUX BEAUVOIR', 'countryCode' => 'FR', ], ], ], [ 'name' => 'NATERA', 'email' => 'contact86@lortholarybetail.com', 'phone' => '05.65.67.89.46', 'addresses' => [ [ 'label' => 'NATERA', 'street' => 'Bd des Balquières', 'street2' => 'BP 3220', 'postalCode' => '12032', 'city' => 'RODEZ CEDEX 9', 'countryCode' => 'FR', ], ], ], [ 'name' => 'SCEA des Bariollières', 'email' => 'elisregnier@gmail.com', 'phone' => '06.09.37.65.61', 'addresses' => [ [ 'label' => 'SCEA des Bariollières', 'street' => '2 rue des Barriollières', 'street2' => null, 'postalCode' => '86220', 'city' => 'INGRANDES', 'countryCode' => 'FR', ], ], ], [ 'name' => 'SCEA SENE', 'email' => null, 'phone' => null, 'addresses' => [ [ 'label' => 'SCEA SENE', 'street' => '3 Route de la Roche Posay', 'street2' => 'Les Girouettes', 'postalCode' => '86100', 'city' => 'CHATELLERAULT', 'countryCode' => 'FR', ], ], ], [ 'name' => 'TERRENA', 'email' => null, 'phone' => '02.51.67.17.98', 'addresses' => [ [ 'label' => 'TERRENA', 'street' => 'La Blanchardière', 'street2' => null, 'postalCode' => '44522', 'city' => 'MESANGER', 'countryCode' => 'FR', ], ], ], [ 'name' => 'TRICHERIE COOPERATIVE', 'email' => 'contact@cooptricherie.fr', 'phone' => '05.49.19.44.33', 'addresses' => [ [ 'label' => 'TRICHERIE COOPERATIVE', 'street' => 'B.P n°2', 'street2' => null, 'postalCode' => '86490', 'city' => 'BEAUMONT', 'countryCode' => 'FR', ], ], ], [ 'name' => 'TURPAULT Muriel', 'email' => null, 'phone' => null, 'addresses' => [ [ 'label' => 'TURPAULT Muriel', 'street' => '23Bis Rue Marcel Pagnol', 'street2' => null, 'postalCode' => '86100', 'city' => 'TARGE', 'countryCode' => 'FR', ], ], ], ]; foreach ($suppliers as $supplierData) { $supplier = $this->upsertByName(Supplier::class, $supplierData['name'], static function (Supplier $supplier) use ($supplierData) { $supplier ->setName($supplierData['name']) ->setEmail($supplierData['email']) ->setPhone($supplierData['phone']) ; }); foreach ($supplierData['addresses'] as $addressData) { $address = $this->upsertAddress($addressData); if (!$supplier->getAddresses()->contains($address)) { $supplier->getAddresses()->add($address); } } $this->entityManager->persist($supplier); } } private function upsertByCode(string $entityClass, string $code, callable $apply): object { $repo = $this->entityManager->getRepository($entityClass); $entity = $repo->findOneBy(['code' => $code]); if (!$entity) { $entity = new $entityClass(); ++$this->created; } else { ++$this->updated; } $apply($entity); $this->entityManager->persist($entity); return $entity; } private function upsertByName(string $entityClass, string $name, callable $apply): object { $repo = $this->entityManager->getRepository($entityClass); $entity = $repo->findOneBy(['name' => $name]); if (!$entity) { $entity = new $entityClass(); ++$this->created; } else { ++$this->updated; } $apply($entity); $this->entityManager->persist($entity); return $entity; } private function upsertAddress(array $addressData): Address { $addressRepo = $this->entityManager->getRepository(Address::class); $address = $addressRepo->findOneBy([ 'label' => $addressData['label'], 'postalCode' => $addressData['postalCode'], ]); if (!$address) { $address = new Address(); ++$this->created; } else { ++$this->updated; } $address ->setLabel($addressData['label']) ->setStreet($addressData['street']) ->setStreet2($addressData['street2']) ->setPostalCode($addressData['postalCode']) ->setCity($addressData['city']) ->setCountryCode($addressData['countryCode']) ; $this->entityManager->persist($address); return $address; } }