diff --git a/src/Command/ImportVehicleBatteryCommand.php b/src/Command/ImportVehicleBatteryCommand.php index 4a6e83e6..f7ce69b5 100644 --- a/src/Command/ImportVehicleBatteryCommand.php +++ b/src/Command/ImportVehicleBatteryCommand.php @@ -22,10 +22,18 @@ use App\Entity\BatterySize; class ImportVehicleBatteryCommand extends Command { protected $em; + protected $vmfg_index; + protected $v_index; + protected $bmodel_index; + protected $bsize_index; + protected $b_index; public function __construct(ObjectManager $om) { $this->em = $om; + $this->vmfg_index = []; + $this->v_index = []; + $this->b_index = []; parent::__construct(); } @@ -38,9 +46,81 @@ class ImportVehicleBatteryCommand extends Command ->addArgument('file', InputArgument::REQUIRED, 'Path to the CSV file.'); } + protected function populateVehicleIndex() + { + $vs = $this->em->getRepository(Vehicle::class)->findAll(); + + $this->v_index = []; + $this->vmfg_index = []; + foreach ($vs as $v) + { + $mfg_name = $v->getManufacturer()->getName(); + $this->vmfg_index[$mfg_name] = $v->getManufacturer(); + if (!isset($this->v_index[$mfg_name])) + $this->v_index[$mfg_name] = []; + + $this->v_index[$mfg_name][$v->getMake() . '|' . $v->getModelYearFrom() . '|' . $v->getModelYearTo()] = $v; + } + } + + protected function populateBatteryIndex() + { + $bs = $this->em->getRepository(Battery::class)->findAll(); + + $this->b_index = []; + $this->bmodel_index = []; + $this->bsize_index = []; + foreach ($bs as $b) + { + $this->bsize_index[$b->getSize()->getName()] = $b->getSize(); + $this->bmodel_index[$b->getModel()->getName()] = $b->getModel(); + $this->b_index[$b->getSize()->getName() . '|' . $b->getModel()->getName()] = $b; + } + } + + protected function handleBatteryData(&$batteries, &$b_models, $batt_field, $row_num) + { + // split battery into parts + $batt = trim($batt_field); + if ($batt == 'AGM') + { + $b_model = 'AGM'; + $b_size = 'AGM'; + } + else + { + $res = preg_match_all("/(.*)(GOLD|EXCEL|ENDURO|TRUCKMASTER|EFB)(.*)/", $batt, $matches); + + if ($res) + { + $b_size = trim($matches[1][0]); + $b_model = trim(trim($matches[2][0]) . ' ' . trim($matches[3][0])); + } + else + { + $b_size = $batt; + $b_model = ''; + } + + // print_r($b_size); + // print_r($b_model); + } + + // link battery to row num for vehicle matching later + if (!isset($batteries[$b_size])) + $batteries[$b_size] = []; + if (!isset($batteries[$b_size][$b_model])) + $batteries[$b_size][$b_model] = []; + + $batteries[$b_size][$b_model][] = $row_num; + $b_models[$b_model] = null; + } + protected function execute(InputInterface $input, OutputInterface $output) { $csv_file = $input->getArgument('file'); + $this->populateVehicleIndex(); + $this->populateBatteryIndex(); /* CSV column order: @@ -103,44 +183,14 @@ class ImportVehicleBatteryCommand extends Command 'model' => $model, ]; - // split battery into parts - $batt = trim($fields[3]); - if ($batt == 'AGM') - { - $b_model = 'AGM'; - $b_size = 'AGM'; - } - else - { - $res = preg_match_all("/(.*)(GOLD|EXCEL|TRUCKMASTER)(.*)/", $batt, $matches); + // battery + $this->handleBatteryData($batteries, $b_models, $fields[3], $row_num); + $this->handleBatteryData($batteries, $b_models, $fields[4], $row_num); - if ($res) - { - $b_size = trim($matches[1][0]); - $b_model = trim(trim($matches[2][0]) . ' ' . trim($matches[3][0])); - } - else - { - $b_size = $batt; - $b_model = ''; - } - - // print_r($b_size); - // print_r($b_model); - } - - // link battery to row num for vehicle matching later - if (!isset($batteries[$b_size])) - $batteries[$b_size] = []; - if (!isset($batteries[$b_size][$b_model])) - $batteries[$b_size][$b_model] = []; - - $batteries[$b_size][$b_model][] = $row_num; - $b_models[$b_model] = null; $row_num++; } - + // print_r($b_models); // print_r($batteries); // save to db @@ -149,10 +199,18 @@ class ImportVehicleBatteryCommand extends Command $vehicle_index = []; foreach ($vbrands as $brand_name => $vbrand) { - // manufacturer - $mfg = new VehicleManufacturer(); - $mfg->setName($brand_name); - $em->persist($mfg); + // get manufacturer or make one + if (!isset($this->vmfg_index[$brand_name])) + { + // manufacturer + $mfg = new VehicleManufacturer(); + $mfg->setName($brand_name); + $em->persist($mfg); + } + else + { + $mfg = $this->vmfg_index[$brand_name]; + } // vehicles foreach ($vbrand['vehicles'] as $row_num => $vdata) @@ -174,14 +232,23 @@ class ImportVehicleBatteryCommand extends Command $m_year_to = 0; } - // vehicle - $vehicle = new Vehicle(); - $vehicle->setManufacturer($mfg) - ->setMake($vdata['make']) - ->setModelYearFrom($m_year_from) - ->setModelYearTo($m_year_to); - - $em->persist($vehicle); + if (!isset($this->v_index[$brand_name][$vdata['make'] . '|' . intval($m_year_from) . '|' . intval($m_year_to)])) + { + echo "NO MATCH "; + echo $vdata['make'] . '|' . intval($m_year_from) . '|' . intval($m_year_to) + 0; + echo "\n"; + // vehicle + $vehicle = new Vehicle(); + $vehicle->setManufacturer($mfg) + ->setMake($vdata['make']) + ->setModelYearFrom($m_year_from) + ->setModelYearTo($m_year_to); + $em->persist($vehicle); + } + else + { + $vehicle = $this->v_index[$brand_name][$vdata['make'] . '|' . intval($m_year_from) . '|' . intval($m_year_to)]; + } // update our data for battery linking $vehicle_index[$row_num] = $vehicle; @@ -193,9 +260,14 @@ class ImportVehicleBatteryCommand extends Command // battery models foreach ($b_models as $b_model => $throw_away) { - $bmodel = new BatteryModel(); - $bmodel->setName($b_model); - $em->persist($bmodel); + if (!isset($this->bmodel_index[$b_model])) + { + $bmodel = new BatteryModel(); + $bmodel->setName($b_model); + $em->persist($bmodel); + } + else + $bmodel = $this->bmodel_index[$b_model]; $b_models[$b_model] = $bmodel; } @@ -204,25 +276,35 @@ class ImportVehicleBatteryCommand extends Command $bmfg = $em->getRepository(BatteryManufacturer::class)->find(1); foreach ($batteries as $b_size => $batt_models) { - $bsize = new BatterySize(); - $bsize->setName($b_size); - $em->persist($bsize); + if (!isset($this->bsize_index[$b_size])) + { + $bsize = new BatterySize(); + $bsize->setName($b_size); + $em->persist($bsize); + } + else + $bsize = $this->bsize_index[$b_size]; foreach ($batt_models as $b_model => $vehicle_rows) { $bmodel = $b_models[$b_model]; - $battery = new Battery(); - $battery->setManufacturer($bmfg) - ->setModel($bmodel) - ->setSize($bsize) - ->setProductCode('') - ->setSAPCode('') - ->setWarrantyPrivate(21) - ->setWarrantyCommercial(6) - ->setSellingPrice(5000); + if (!isset($this->b_index[$bsize->getName() . '|' . $bmodel->getName()])) + { + $battery = new Battery(); + $battery->setManufacturer($bmfg) + ->setModel($bmodel) + ->setSize($bsize) + ->setProductCode('') + ->setSAPCode('') + ->setWarrantyPrivate(21) + ->setWarrantyCommercial(6) + ->setSellingPrice(5000); - $em->persist($battery); + $em->persist($battery); + } + else + $battery = $this->b_index[$bsize->getName() . '|' . $bmodel->getName()]; // link to vehicles foreach ($vehicle_rows as $row_num) diff --git a/src/Entity/Battery.php b/src/Entity/Battery.php index c7062ad6..4ace13cf 100644 --- a/src/Entity/Battery.php +++ b/src/Entity/Battery.php @@ -47,7 +47,7 @@ class Battery // vehicle /** - * @ORM\ManyToMany(targetEntity="Vehicle", inversedBy="batteries") + * @ORM\ManyToMany(targetEntity="Vehicle", inversedBy="batteries", indexBy="id") * @ORM\JoinTable(name="battery_vehicle") */ protected $vehicles; @@ -181,7 +181,7 @@ class Battery public function addVehicle(Vehicle $vehicle) { - $this->vehicles->add($vehicle); + $this->vehicles[$vehicle->getID()] = $vehicle; return $this; }