From 8c32792c386591af72b2941126958cc5ef3c11d2 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 2 Sep 2020 11:34:50 +0000 Subject: [PATCH] Create command to add vehicle manufacturers, vehicles and their compatible batteries. #460 --- ...tCMBBatteryVehicleCompatibilityCommand.php | 373 ++++++++++++++++++ 1 file changed, 373 insertions(+) create mode 100644 src/Command/ImportCMBBatteryVehicleCompatibilityCommand.php diff --git a/src/Command/ImportCMBBatteryVehicleCompatibilityCommand.php b/src/Command/ImportCMBBatteryVehicleCompatibilityCommand.php new file mode 100644 index 00000000..202b1c78 --- /dev/null +++ b/src/Command/ImportCMBBatteryVehicleCompatibilityCommand.php @@ -0,0 +1,373 @@ +em = $om; + + // load existing battery data + $this->loadBatteryManufacturers(); + $this->loadBatteryModels(); + $this->loadBatterySizes(); + $this->loadBatteries(); + + // load existing vehicle data + $this->loadVehicleManufacturers(); + $this->loadVehicleMakes(); + + parent::__construct(); + } + + protected function configure() + { + $this->setName('cmbbatteryvehiclecompatibility:import') + ->setDescription('Retrieve from a CSV file vehicle and battery compatibility information.') + ->setHelp('Creates vehicles and their compatible batteries based on data from imported CSV.') + ->addArgument('file', InputArgument::REQUIRED, 'Path to the CSV file.') + ->addArgument('output_file', InputArgument::REQUIRED, 'Path to output file for vehicles not added.'); + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + // get the sizes, vehicles, battery prices from the csv file + $csv_file = $input->getArgument('file'); + + // attempt to open file + try + { + $fh = fopen($csv_file, "r"); + } + catch (Exception $e) + { + throw new Exception('The file "' . $csv_file . '" could be read.'); + } + + $output_file = $input->getArgument('output_file'); + + // attempt to open file + try + { + $output_fh = fopen($output_file, "w"); + } + catch (Exception $e) + { + throw new Exception('The file "' . $output_file . '" could be read.'); + } + + + // get entity manager + $em = $this->em; + + $row_num = 0; + error_log('Processing vehicle and battery compatibility file...'); + while (($fields = fgetcsv($fh)) !== false) + { + $comp_batteries = []; + if ($row_num < 2) + { + $row_num++; + continue; + } + + // get vehicle info from file + $manufacturer = trim(strtolower($fields[self::F_VEHICLE_MANUFACTURER])); + $make = trim(strtolower($fields[self::F_VEHICLE_MAKE])); + $year = trim($fields[self::F_VEHICLE_YEAR]); + + // get battery info from file + $marathoner_size = $this->normalizeName(trim($fields[self::F_BATT_MARATHONER_SIZE])); + $marathoner_price = trim($fields[self::F_BATT_MARATHONER_PRICE]); + $marathoner_tradein_price = trim($fields[self::F_BATT_MARATHONER_TRADEIN_PRICE]); + + $classic_size = $this->normalizeName(trim($fields[self::F_BATT_CLASSIC_SIZE])); + $classic_price = trim($fields[self::F_BATT_CLASSIC_PRICE]); + $classic_tradein_price = trim($fields[self::F_BATT_CLASSIC_TRADEIN_PRICE]); + + $excel_size = $this->normalizeName(trim($fields[self::F_BATT_EXCEL_SIZE])); + $excel_price = trim($fields[self::F_BATT_EXCEL_PRICE]); + $excel_tradein_price = trim($fields[self::F_BATT_EXCEL_TRADEIN_PRICE]); + + $sdfc_size = $this->normalizeName(trim($fields[self::F_BATT_SDFC_SIZE])); + $sdfc_price = trim($fields[self::F_BATT_SDFC_PRICE]); + $sdfc_tradein_price = trim($fields[self::F_BATT_SDFC_TRADEIN_PRICE]); + + // get the compatible batteries + // get marathoner battery + if (strlen($marathoner_size) > 0) + { + // check if battery in system + if (isset($this->batt_hash[self::STR_CENTURY][self::STR_MARATHONER][$marathoner_size])) + $comp_batteries[] = $this->batt_hash[self::STR_CENTURY][self::STR_MARATHONER][$marathoner_size]; + } + + // get classic battery + if (strlen($classic_size) > 0) + { + // check if battery in system + if (isset($this->batt_hash[self::STR_MOTOLITE][self::STR_CLASSIC][$classic_size])) + $comp_batteries[] = $this->batt_hash[self::STR_MOTOLITE][self::STR_CLASSIC][$classic_size]; + } + + // get excel battery + if (strlen($excel_size) > 0) + { + // check if battery in system + if (isset($this->batt_hash[self::STR_CENTURY][self::STR_EXCEL][$excel_size])) + $comp_batteries[] = $this->batt_hash[self::STR_CENTURY][self::STR_EXCEL][$excel_size]; + } + + // get sdfc battery + if (strlen($sdfc_size) > 0) + { + // check if battery in system + if (isset($this->batt_hash[self::STR_CENTURY][self::STR_SDFC][$sdfc_size])) + $comp_batteries[] = $this->batt_hash[self::STR_CENTURY][self::STR_SDFC][$sdfc_size]; + } + + // check if vehicle manufacturer has been added + if (!isset($this->vmanu_hash[$manufacturer])) + $this->addVehicleManufacturer($manufacturer); + + // check if vehicle make has been added + if (!isset($this->vmake_hash[$manufacturer][$make])) + { + $this->addVehicleMake($manufacturer, $make, $year, $comp_batteries); + } + + $row_num++; + } + + $em->flush(); + } + + protected function addVehicleManufacturer($name) + { + // save to db + $vehicle_manufacturer = new VehicleManufacturer(); + + $vehicle_manufacturer->setName(strtoupper($name)); + + $this->em->persist($vehicle_manufacturer); + $this->em->flush(); + + // add to hash + $this->vmanu_hash[$name] = $vehicle_manufacturer; + } + + protected function addVehicleMake($manufacturer, $make, $year, $batteries) + { + // save to db + $vehicle = new Vehicle(); + + $vmanu = $this->vmanu_hash[$manufacturer]; + + // parse year from and year to + $year_from = ''; + $year_to = ''; + + if (!empty($year)) + { + $model_years = explode('-', $year); + $year_from = $model_years[0]; + if (!empty($year_to)) + $year_to = $model_years[1]; + + // check if $year_to is the string "Present" + // if so, set to 0, for now + if ($year_to == self::STR_PRESENT) + $year_to = 0; + } + + $vehicle->setManufacturer($vmanu) + ->setMake(strtoupper($make)) + ->setModelYearFrom($year_from) + ->setModelYearTo($year_to); + + // add vehicle to battery + foreach ($batteries as $battery) + { + $battery->addVehicle($vehicle); + $this->em->persist($battery); + } + + // add vehicle to manufacturer + $vmanu->addVehicle($vehicle); + + $this->em->persist($vmanu); + $this->em->persist($vehicle); + $this->em->flush(); + + // add to hash + $this->vmake_hash[$manufacturer][$make] = $vehicle; + } + + protected function loadBatteryManufacturers() + { + $this->bmanu_hash = []; + + $batt_manufacturers = $this->em->getRepository(BatteryManufacturer::class)->findAll(); + foreach ($batt_manufacturers as $batt_manu) + { + $name = $this->normalizeName($batt_manu->getName()); + $this->bmanu_hash[$name] = $batt_manu; + } + } + + protected function loadBatteryModels() + { + $this->bmodel_hash = []; + + $batt_models = $this->em->getRepository(BatteryModel::class)->findAll(); + foreach ($batt_models as $batt_model) + { + $name = $this->normalizeName($batt_model->getName()); + $this->bmodel_hash[$name] = $batt_model; + } + } + + protected function loadBatterySizes() + { + $this->bsize_hash = []; + + $batt_sizes = $this->em->getRepository(BatterySize::class)->findAll(); + foreach ($batt_sizes as $batt_size) + { + $name = $this->normalizeName($batt_size->getName()); + $this->bsize_hash[$name] = $batt_size; + } + } + + protected function loadBatteries() + { + $this->batt_hash = []; + + $batts = $this->em->getRepository(Battery::class)->findAll(); + foreach ($batts as $batt) + { + $brand = $this->normalizeName($batt->getManufacturer()->getName()); + $model = $this->normalizeName($batt->getModel()->getName()); + $size = $this->normalizeName($batt->getSize()->getName()); + + $this->batt_hash[$brand][$model][$size] = $batt; + } + } + + protected function loadVehicleManufacturers() + { + $this->vmanu_hash = []; + + $vmanus = $this->em->getRepository(VehicleManufacturer::class)->findAll(); + foreach ($vmanus as $vmanu) + { + $name = $this->normalizeName($vmanu->getName()); + $this->vmanu_hash[$name] = $vmanu; + } + } + + protected function loadVehicleMakes() + { + $this->vmake_hash = []; + + $vmakes = $this->em->getRepository(Vehicle::class)->findAll(); + foreach ($vmakes as $vmake) + { + $manufacturer = $vmake->getManufacturer()->getName(); + $make = $this->normalizeName($vmake->getMake()); + + $this->vmake_hash[$manufacturer][$make] = $vmake; + } + } + + protected function normalizeName($name) + { + // check if name contains M-42. Need to convert to M42 + if (strpos($name, self::STR_M_42) !== false) + { + // contains M-42 + $changed_name = str_replace(self::STR_M_42, self::STR_M42, $name); + $normalized_key = strtolower($changed_name); + } + else + { + $normalized_key = trim(strtolower($name)); + } + + $normalized_key = trim(strtolower($name)); + + return $normalized_key; + } +}