em = $em; $this->vmfg_index = []; $this->v_index = []; $this->b_index = []; parent::__construct(); } protected function configure() { $this->setName('vehicle:import_old') ->setDescription('Import a CSV file with vehicles and batteries.') ->setHelp('Creates vehicles and batteries based on imported CSV.') ->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: 0 - brandh 1 - make 2 - model 3 - recommended battery 4 - alternative battery 5 - ignore */ // attempt to open file try { $fh = fopen($csv_file, "r"); } catch (Exception $e) { throw new Exception('The file "' . $csv_file . '" could be read.'); } // get entity manager $em = $this->em; $vbrands = []; $batteries = []; $bmodels = []; // loop through rows $row_num = 1; while (($fields = fgetcsv($fh)) !== false) { $output->writeln("Parsing row " . $row_num . "..."); // ignore first row if ($row_num == 1) { $row_num++; continue; } // parse it $brand = trim($fields[0]); if (!isset($vbrands[$brand])) { // build array $vbrands[$brand] = [ 'vehicles' => [], ]; } $make = trim($fields[1]); $model = trim($fields[2]); if (empty($model)) $model = 'NONE'; $vbrands[$brand]['vehicles'][$row_num] = [ 'make' => $make, 'model' => $model, ]; // battery $this->handleBatteryData($batteries, $b_models, $fields[3], $row_num); $this->handleBatteryData($batteries, $b_models, $fields[4], $row_num); $row_num++; } // print_r($b_models); // print_r($batteries); // save to db // vehicles $vehicle_index = []; foreach ($vbrands as $brand_name => $vbrand) { // 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) { $model = $vdata['model']; if ($model == 'NONE') { $m_year_from = 0; $m_year_to = 0; } else { $ex_model = explode('-', $model); $m_year_from = trim($ex_model[0]); if (isset($ex_model[1])) $m_year_to = trim($ex_model[1]); else $m_year_to = 0; } 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; } $em->flush(); } // battery models foreach ($b_models as $b_model => $throw_away) { 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; } // batteries $bmfg = $em->getRepository(BatteryManufacturer::class)->find(1); foreach ($batteries as $b_size => $batt_models) { 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]; 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); } else $battery = $this->b_index[$bsize->getName() . '|' . $bmodel->getName()]; // link to vehicles foreach ($vehicle_rows as $row_num) { $vehicle = $vehicle_index[$row_num]; $battery->addVehicle($vehicle); } } } $em->flush(); return 0; } }