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->entityManager->flush(); $this->seedBuildingInfrastructure(); $this->entityManager->flush(); $this->seedBovines($io); $this->seedReceptionTypes(); $this->seedBovineTypes(); $this->seedShipmentTypes(); $this->seedSuppliers(); $this->entityManager->flush(); $this->seedCustomers($io); $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', 'Plateau', 'Remorque', 'Benne']; $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'], ['label' => 'Autres', 'code' => 'AUTRES'], ]; 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 seedBuildingInfrastructure(): void { $statusByCode = []; $statusRows = [ ['label' => 'Libre', 'code' => 'LB', 'color' => '#A3B18A'], ['label' => 'Occupé', 'code' => 'OC', 'color' => '#3A506B'], ['label' => 'Malade', 'code' => 'ML', 'color' => '#E07A5F'], ]; foreach ($statusRows as $statusRow) { /** @var Statut $status */ $status = $this->upsertByCode(Statut::class, $statusRow['code'], static function (Statut $entity) use ($statusRow) { $entity ->setLabel($statusRow['label']) ->setCode($statusRow['code']) ->setColor($statusRow['color']) ; }); $statusByCode[$statusRow['code']] = $status; } $buildingRepo = $this->entityManager->getRepository(Building::class); $layoutByBuildingCode = []; $layoutRows = [ ['buildingCode' => 'B1', 'name' => 'plan1', 'columns' => 23, 'rows' => 2], ['buildingCode' => 'B2', 'name' => 'plan2', 'columns' => 23, 'rows' => 2], ['buildingCode' => 'B3', 'name' => 'plan3', 'columns' => 23, 'rows' => 2], ]; foreach ($layoutRows as $layoutRow) { $building = $buildingRepo->findOneBy(['code' => $layoutRow['buildingCode']]); if (!$building instanceof Building) { continue; } /** @var BuildingLayout $layout */ $layout = $this->upsertByName(BuildingLayout::class, $layoutRow['name'], static function (BuildingLayout $entity) use ($layoutRow, $building) { $entity ->setName($layoutRow['name']) ->setColumns($layoutRow['columns']) ->setRows($layoutRow['rows']) ->setIdBuilding($building) ; }); $layoutByBuildingCode[$layoutRow['buildingCode']] = $layout; } $caseRows = [ ['buildingCode' => 'B1', 'from' => 1, 'to' => 12, 'status' => 'LB'], ['buildingCode' => 'B1', 'from' => 13, 'to' => 24, 'status' => 'OC'], ['buildingCode' => 'B1', 'from' => 25, 'to' => 32, 'status' => 'ML'], ['buildingCode' => 'B1', 'from' => 33, 'to' => 44, 'status' => 'LB'], ['buildingCode' => 'B2', 'from' => 1, 'to' => 10, 'status' => 'OC'], ['buildingCode' => 'B2', 'from' => 11, 'to' => 22, 'status' => 'LB'], ['buildingCode' => 'B2', 'from' => 23, 'to' => 30, 'status' => 'ML'], ['buildingCode' => 'B2', 'from' => 31, 'to' => 44, 'status' => 'OC'], ['buildingCode' => 'B3', 'from' => 1, 'to' => 8, 'status' => 'ML'], ['buildingCode' => 'B3', 'from' => 9, 'to' => 20, 'status' => 'LB'], ['buildingCode' => 'B3', 'from' => 21, 'to' => 34, 'status' => 'OC'], ['buildingCode' => 'B3', 'from' => 35, 'to' => 44, 'status' => 'ML'], ]; $caseByCode = []; foreach ($caseRows as $caseRow) { $building = $buildingRepo->findOneBy(['code' => $caseRow['buildingCode']]); $status = $statusByCode[$caseRow['status']] ?? null; if (!$building instanceof Building || !$status instanceof Statut) { continue; } for ($caseNumber = $caseRow['from']; $caseNumber <= $caseRow['to']; ++$caseNumber) { $code = sprintf('%s-C%d', $caseRow['buildingCode'], $caseNumber); /** @var BuildingCase $buildingCase */ $buildingCase = $this->upsertByCode(BuildingCase::class, $code, static function (BuildingCase $entity) use ($code, $caseNumber, $building, $status) { $entity ->setCode($code) ->setCaseNumber($caseNumber) ->setCapacity(15) ->setIdBuilding($building) ->setStatut($status) ; }); $caseByCode[$code] = $buildingCase; } } $slots = $this->buildSlotMap(); $positionRepo = $this->entityManager->getRepository(BuildingCasePosition::class); foreach (['B1' => 'plan1', 'B2' => 'plan2', 'B3' => 'plan3'] as $buildingCode => $layoutName) { $layout = $layoutByBuildingCode[$buildingCode] ?? null; if (!$layout instanceof BuildingLayout || $layout->getName() !== $layoutName) { continue; } foreach ($slots as $slot) { $caseCode = sprintf('%s-C%d', $buildingCode, $slot['caseNumber']); $buildingCase = $caseByCode[$caseCode] ?? null; if (!$buildingCase instanceof BuildingCase) { continue; } $position = $positionRepo->findOneBy([ 'buildingLayout' => $layout, 'buildingCase' => $buildingCase, 'x' => $slot['x'], 'y' => $slot['y'], ]); if ($position instanceof BuildingCasePosition) { ++$this->updated; continue; } $position = new BuildingCasePosition(); $position ->setX($slot['x']) ->setY($slot['y']) ->setW($slot['w']) ->setH($slot['h']) ->setRenderOrder((string) $slot['renderOrder']) ->setBuildingLayout($layout) ->setBuildingCase($buildingCase) ; ++$this->created; $this->entityManager->persist($position); } } } 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 seedBovines(SymfonyStyle $io): void { $rows = [ [1, 15, '7979580026', 390, '2026-02-25'], [5, 113, '4405604924', 397, '2025-05-22'], [4, 113, '4405604944', 375, '2025-05-22'], [2, 113, '4963291114', 319, '2025-05-22'], [3, 113, '4405604922', 386, '2025-05-22'], [6, 126, '4415811026', 367, '2025-07-02'], [7, 126, '4950971149', 398, '2025-07-02'], [8, 126, '4950971170', 386, '2025-07-02'], [9, 126, '4489751630', 408, '2025-07-02'], [10, 126, '8551323003', 478, '2025-07-02'], [11, 126, '8503833703', 378, '2025-07-02'], [12, 126, '4402104572', 379, '2025-07-02'], [13, 126, '4402104580', 465, '2025-07-02'], [14, 126, '4402104607', 381, '2025-07-02'], [15, 126, '8504059581', 446, '2025-07-02'], [16, 124, '4950971161', 382, '2025-07-02'], [17, 124, '5652911499', 376, '2025-07-02'], [18, 124, '8551323029', 414, '2025-07-02'], [19, 124, '4402104590', 474, '2025-07-02'], [20, 124, '4402104594', 408, '2025-07-02'], [21, 124, '4402104595', 399, '2025-07-02'], [22, 124, '4402104604', 374, '2025-07-02'], [23, 124, '8504059579', 403, '2025-07-02'], [24, 124, '8504059590', 398, '2025-07-02'], [25, 123, '8551782070', 395, '2025-07-02'], [26, 123, '8551782080', 443, '2025-07-02'], [27, 123, '8551782084', 394, '2025-07-02'], [28, 123, '8551782090', 378, '2025-07-02'], [29, 123, '8551782092', 424, '2025-07-02'], [30, 123, '8551782094', 389, '2025-07-02'], [31, 123, '8551782099', 411, '2025-07-02'], [32, 123, '8551323020', 392, '2025-07-02'], [33, 123, '8551323051', 371, '2025-07-02'], [34, 123, '7947673148', 378, '2025-07-02'], [39, 114, '1731177447', 395, '2025-06-19'], [42, 114, '1726167608', 299, '2025-06-19'], [38, 114, '1731177442', 343, '2025-06-19'], [40, 114, '1731177448', 362, '2025-06-19'], [41, 114, '1731177458', 359, '2025-06-19'], [35, 114, '7946282100', 291, '2025-06-19'], [43, 114, '1726167613', 339, '2025-06-19'], [37, 114, '1731177427', 375, '2025-06-19'], [36, 114, '7946282103', 354, '2025-06-19'], ]; $bovineRepo = $this->entityManager->getRepository(Bovine::class); $caseRepo = $this->entityManager->getRepository(BuildingCase::class); foreach ($rows as [, $legacyCaseId, $nationalNumber, $receivedWeight, $arrivalDate]) { $buildingCase = $this->resolveBuildingCaseByLegacyId((int) $legacyCaseId); if (!$buildingCase instanceof BuildingCase) { $buildingCase = $caseRepo->find((int) $legacyCaseId); } if (!$buildingCase instanceof BuildingCase) { $io->warning(sprintf( 'Bovine %s skipped: building_case token %d not found.', $nationalNumber, $legacyCaseId )); continue; } $bovine = $bovineRepo->findOneBy(['nationalNumber' => $nationalNumber]); if (!$bovine instanceof Bovine) { $bovine = new Bovine(); ++$this->created; } else { ++$this->updated; } $bovine ->setNationalNumber((string) $nationalNumber) ->setBuildingCase($buildingCase) ->setReceivedWeight((int) $receivedWeight) ->setArrivalDate(new DateTimeImmutable((string) $arrivalDate)) ; $this->entityManager->persist($bovine); } } /** * @return array */ private function buildSlotMap(): array { $slots = []; for ($column = 1; $column <= 12; ++$column) { $slots[] = ['x' => $column, 'y' => 1, 'w' => 1, 'h' => 1, 'renderOrder' => $column, 'caseNumber' => $column + 12]; } for ($column = 14; $column <= 23; ++$column) { $slots[] = ['x' => $column, 'y' => 1, 'w' => 1, 'h' => 1, 'renderOrder' => $column - 1, 'caseNumber' => $column + 11]; } for ($column = 1; $column <= 12; ++$column) { $slots[] = ['x' => $column, 'y' => 2, 'w' => 1, 'h' => 1, 'renderOrder' => 22 + $column, 'caseNumber' => 13 - $column]; } for ($column = 14; $column <= 23; ++$column) { $slots[] = ['x' => $column, 'y' => 2, 'w' => 1, 'h' => 1, 'renderOrder' => 21 + $column, 'caseNumber' => 58 - $column]; } return $slots; } private function resolveBuildingCaseByLegacyId(int $legacyCaseId): ?BuildingCase { if ($legacyCaseId < 1) { return null; } $buildingNumber = intdiv($legacyCaseId - 1, 44) + 1; $caseNumber = (($legacyCaseId - 1) % 44) + 1; if ($buildingNumber < 1 || $buildingNumber > 3) { return null; } $code = sprintf('B%d-C%d', $buildingNumber, $caseNumber); $buildingCase = $this->entityManager->getRepository(BuildingCase::class)->findOneBy(['code' => $code]); return $buildingCase instanceof BuildingCase ? $buildingCase : null; } private function seedBovineTypes(): void { $bovineTypes = [ ['label' => 'Limousine', 'code' => '34'], ['label' => 'Charolaise', 'code' => '38'], ['label' => 'Parthenaise', 'code' => '71'], ]; foreach ($bovineTypes as $type) { $this->upsertByCode(BovineType::class, $type['code'], static function (BovineType $entity) use ($type) { $entity ->setLabel($type['label']) ->setCode($type['code']) ; }); } } private function seedShipmentTypes(): void { $shipmentTypes = [ ['label' => 'Boucherie', 'code' => 'BDB'], ['label' => 'Équarrissage', 'code' => 'BE'], ]; foreach ($shipmentTypes as $type) { $this->upsertByCode(ShipmentType::class, $type['code'], static function (ShipmentType $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 seedCustomers(SymfonyStyle $io): void { $addressRepo = $this->entityManager->getRepository(Address::class); $customers = [ [ 'name' => 'ARNAULT EURL', 'phone' => '05.49.02.65.27', 'email' => 'eurl.arnault86@orange.fr', 'addresses' => [ [ 'label' => 'ARNAULT EURL', 'street' => 'Moulin du Guéret', 'street2' => 'B.P 30425', 'postalCode' => '86100', 'city' => 'Antran', 'countryCode' => 'FR', ], ], ], [ 'name' => 'COVILIM', 'phone' => '05.55.30.03.10', 'email' => 'sandra.robineaux@covilim.com', 'addresses' => [ [ 'label' => 'COVILIM', 'street' => 'Rue de Nexon', 'street2' => null, 'postalCode' => '87000', 'city' => 'LIMOGES', 'countryCode' => 'FR', ], ], ], [ 'name' => 'Les producteurs de la marche (LPM)', 'phone' => '05.55.63.04.53', 'email' => 'f.legalliard@lpmcoop.fr', 'addresses' => [ [ 'label' => 'Les producteurs de la marche (LPM)', 'street' => 'Malonze', 'street2' => null, 'postalCode' => '23300', 'city' => 'LA SOUTERRAINE', 'countryCode' => 'FR', ], ], ], [ 'name' => 'LORTHOLARY BETAIL', 'phone' => '05.49.52.77.10', 'email' => 'contact86@lortholarybetail.com', 'addresses' => [ [ 'label' => 'LORTHOLARY BETAIL', 'street' => 'FERME DE GENIEC', 'street2' => null, 'postalCode' => '86550', 'city' => 'MIGNALOUX BEAUVOIR', 'countryCode' => 'FR', ], ], ], [ 'name' => 'TERRENA', 'phone' => '02.40.98.90.00', 'email' => 'scouillaud@terrena.fr', 'addresses' => [ [ 'label' => 'TERRENA', 'street' => 'LA NOELLE', 'street2' => 'BP 20199', 'postalCode' => '44155', 'city' => 'ANCENIS CEDEX', 'countryCode' => 'FR', ], ], ], ]; foreach ($customers as $customerData) { $customerName = $customerData['name'] ?? $customerData['label'] ?? null; if (!$customerName) { $io->warning('Customer skipped: missing "name".'); continue; } $customer = $this->upsertByName(Customer::class, $customerName, static function (Customer $customer) use ($customerData, $customerName) { $customer ->setName($customerName) ->setPhone($customerData['phone'] ?? null) ->setEmail($customerData['email'] ?? null) ; }); $addresses = []; if (isset($customerData['addresses']) && is_array($customerData['addresses'])) { foreach ($customerData['addresses'] as $addressData) { $addresses[] = $this->upsertAddress($addressData); } } else { // Backward compatibility for older seed format with address ids. $addressIds = $customerData['addressIds'] ?? (isset($customerData['addressId']) ? [$customerData['addressId']] : []); foreach ($addressIds as $addressId) { $address = $addressRepo->find($addressId); if (!$address instanceof Address) { $io->warning(sprintf( 'Customer "%s" skipped address id %d: not found.', $customerName, $addressId )); continue; } $addresses[] = $address; } } $customer->setAddresses($addresses); $this->entityManager->persist($customer); } } 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; } }