em = $em; $this->populateMfgIndex(); $this->populateVehicleIndex(); parent::__construct(); } protected function configure() { $this->setName('customer:import') ->setDescription('Import a CSV file with customers.') ->setHelp('Creates customers based on imported CSV.') ->addArgument('file', InputArgument::REQUIRED, 'Path to the CSV file.'); } protected function populateMfgIndex() { $mfgs = $this->em->getRepository(VehicleManufacturer::class)->findAll(); $this->mfg_index = []; foreach ($mfgs as $mfg) { $name = $mfg->getName(); $this->mfg_index[$name] = $mfg; // exceptions and special cases switch ($name) { case 'PROTON': $this->mfg_index['PROTON WIRA'] = $mfg; break; case 'OWNER TYPE JEEP': $this->mfg_index['UNKNOWN'] = $mfg; break; case 'GOLF CART': $this->mfg_index['YAMAHA'] = $mfg; break; } } } protected function populateVehicleIndex() { $vs = $this->em->getRepository(Vehicle::class)->findAll(); $this->vehicle_index = []; foreach ($vs as $v) { $make = strtoupper($v->getMake()); $mfg_id = $v->getManufacturer()->getID(); $model = $v->getModelYearFormatted(); $this->vehicle_index[$mfg_id][$make][$model] = $v; // exceptions and special cases for makes switch ($make) { case 'ALMERA': $this->vehicle_index[$mfg_id]['ALMIRA'][$model] = $v; break; case 'TRAILBLAZER': $this->vehicle_index[$mfg_id]['TRAILBLAZER 2013 LOW'][$model] = $v; $this->vehicle_index[$mfg_id]['TRAILBLAZER 2014'][$model] = $v; break; case 'INNOVA (E-TYPE)': $this->vehicle_index[$mfg_id]['INNOVA GAS E'][$model] = $v; break; case 'INNOVA (G-TYPE)': $this->vehicle_index[$mfg_id]['INNOVA GAS G'][$model] = $v; break; case 'INNOVA (V-TYPE)': $this->vehicle_index[$mfg_id]['INNOVA GAS V'][$model] = $v; break; case 'INNOVA (J-TYPE)': $this->vehicle_index[$mfg_id]['INNOVA GAS J'][$model] = $v; break; case 'RAV 4': $this->vehicle_index[$mfg_id]['RAV-4'][$model] = $v; break; case 'GOLFCART': $this->vehicle_index[$mfg_id]['GOLF CART'][$model] = $v; break; case 'FORESTER 2.5': $this->vehicle_index[$mfg_id]['FORESTER 2.0 AND 2.5'][$model] = $v; break; case 'MU-X 2.5LI 4X2/3.0LI 4X4': $this->vehicle_index[$mfg_id]['MUX'][$model] = $v; break; case 'ADVENTURE GLX': $this->vehicle_index[$mfg_id]['ADVENTURE GAS'][$model] = $v; break; case 'CIVIC 1.8': $this->vehicle_index[$mfg_id]['NEW CIVIC 1.8 V AT'][$model] = $v; $this->vehicle_index[$mfg_id]['NEW CIVIC 1.8 V MT'][$model] = $v; break; case 'LAND CRUISER / PRADO (GASOLINE)': $this->vehicle_index[$mfg_id]['PRADO'][$model] = $v; break; case 'MAZDA 3 / 2 / 6 ISTOP': $this->vehicle_index[$mfg_id]['MAZADA 3 / 2 / 6 ISTOP'][$model] = $v; break; case 'SORENTO': $this->vehicle_index[$mfg_id]['SORENTO 7-SEATER AT'][$model] = $v; break; case 'CX5': $this->vehicle_index[$mfg_id]['CX-5'][$model] = $v; break; case 'ACCORD 3.5 S - V AT V6': $this->vehicle_index[$mfg_id]['ACCORD 3.5 S - V AT V6 (BRILLIANT WHITE PEARL)'][$model] = $v; break; case 'POLO NOTCH 1.6 MPI AT (GAS)': $this->vehicle_index[$mfg_id]['POLO HATCH 1.6 MPI AT (GAS)'][$model] = $v; break; case 'BB': $this->vehicle_index[$mfg_id]['TOYOTA BB'][$model] = $v; break; case 'BRIO AMAZE': $this->vehicle_index[$mfg_id]['BRIO-AMAZE'][$model] = $v; break; case 'CRV': $this->vehicle_index[$mfg_id]['CR-V 1.5 I-DTEC'][$model] = $v; break; } // special cases for models switch ($make) { case 'CIVIC': if ($model == '1991 - 2000') $this->vehicle_index[$mfg_id][$make]['2000 - down'] = $v; if ($model == '2001 - 2005') $this->vehicle_index[$mfg_id][$make]['2002 - 2006'] = $v; if ($model == '2006 - 2018') $this->vehicle_index[$mfg_id][$make]['2006*'] = $v; break; case 'MONTERO SPORTS': if ($model == '-') $this->vehicle_index[$mfg_id][$make]['2010 AND 2014'] = $v; break; case 'FOCUS': if ($model == '2005 - 2013') $this->vehicle_index[$mfg_id][$make]['2013 - down'] = $v; if ($model == '2014 - 2018') $this->vehicle_index[$mfg_id][$make]['2005 - 2018'] = $v; break; case 'RANGER': if ($model == '1999 - 2014') $this->vehicle_index[$mfg_id][$make]['1999 - 2018'] = $v; break; case 'LANCER MX*': if ($model == '2000 - 2018') $this->vehicle_index[$mfg_id][$make]['2010'] = $v; break; case 'VIOS': if ($model == '2006') $this->vehicle_index[$mfg_id][$make]['2006 - down'] = $v; break; case 'RAV 4': if ($model == '2007 - 2018') $this->vehicle_index[$mfg_id]['RAV-4']['2007'] = $v; if ($model == '1996 - 2018') $this->vehicle_index[$mfg_id]['RAV-4']['2002 - 2006'] = $v; $this->vehicle_index[$mfg_id]['RAV-4']['2001 - down'] = $v; break; case 'ACCENT GL 1.5 CRDI MT': if ($model == '2004 - 2013') $this->vehicle_index[$mfg_id][$make]['2004 - 2018'] = $v; if ($model == '2014 - 2018') $this->vehicle_index[$mfg_id][$make]['2013 to Present'] = $v; break; case 'TUCSON CRDI DSL 4X2 AT': if ($model == '2004 - 2011') $this->vehicle_index[$mfg_id][$make]['2004 - 2018'] = $v; break; case 'FORTUNER (DIESEL)': if ($model == '2005 - 2016') $this->vehicle_index[$mfg_id][$make]['2005 - 2018'] = $v; if ($model == '2016 - 2018') $this->vehicle_index[$mfg_id][$make]['2016'] = $v; break; case 'CAMRY': if ($model == '2007 - 2018') $this->vehicle_index[$mfg_id][$make]['2007 - 0n'] = $v; break; case 'GRAND VITARA': if ($model == '2007 - 2018') $this->vehicle_index[$mfg_id][$make]['2007 - 0n'] = $v; break; } // exceptions and special cases for model } } protected function findVehicle($output, $row) { $output->writeln('[0] find vehicle'); // search for manufacturer $mfg_name = trim($row[self::F_V_BRAND]); $make = strtoupper(trim($row[self::F_V_MAKE])); $model = trim($row[self::F_V_MODEL]); $output->writeln('[5] checking mfg'); if (!isset($this->mfg_index[$mfg_name])) { $output->writeln('manufacturer not found: ' . $mfg_name . ' - ' . $make . ' - ' . $model); return null; } $mfg = $this->mfg_index[$mfg_name]; $mfg_id = $mfg->getID(); $output->writeln('[5] checking make'); // check if empty make if (empty($make)) { // check if the manufacturer has only one make anyway if (count($this->vehicle_index[$mfg_id]) == 1) { // get first make $first_make = reset($this->vehicle_index[$mfg_id]); $first_model = reset($first_make); if ($first_model == null) $output->writeln('first_model null'); return $first_model; } $output->writeln('no make specified: ' . $mfg_name); return null; } // get year from and to from model if (empty($model)) $model = 'NONE'; if ($model == 'NONE') { $year_from = 0; $year_to = 0; $model_index = '-'; } else { $ex_model = explode('-', $model); $year_from = trim($ex_model[0]); if (isset($ex_model[1])) { $year_to = strtolower(trim($ex_model[1])); if ($year_to == 'on' || $year_to == 'up') $year_to = '2018'; $model_index = $year_from . ' - ' . $year_to; } else { $year_to = 0; $model_index = $year_from; } } // search for make and model from index if (!isset($this->vehicle_index[$mfg_id][$make][$model_index])) { // check if we match make but not model if (isset($this->vehicle_index[$mfg_id][$make])) { // is there only one entry in the index? that's the one! if (count($this->vehicle_index[$mfg_id][$make]) == 1) { $vehicle = reset($this->vehicle_index[$mfg_id][$make]); if ($vehicle == null) $output->writeln('vehicle[1] null'); return $vehicle; } // handle blank model year if ($model_index == '-') { $vehicle = reset($this->vehicle_index[$mfg_id][$make]); if ($vehicle == null) $output->writeln('vehicle[2] null'); return $vehicle; } } $output->writeln("vehicle make and model not found: $mfg_name - $make ($model_index)"); return null; } return $this->vehicle_index[$mfg_id][$make][$model_index]; } protected function execute(InputInterface $input, OutputInterface $output) { $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.'); } // get entity manager $em = $this->em; $row_num = 1; $save_counter = 0; $cust_file = fopen('/root/www/ramcar/data/customer_import.csv', 'w'); $cv_file = fopen('/root/www/ramcar/data/cv_import.csv', 'w'); while (($fields = fgetcsv($fh)) !== false) { // $output->writeln("Parsing row " . $row_num . "..."); // ignore first row if ($row_num == 1) { $row_num++; continue; } $id = trim($fields[self::F_ID]); $fname = trim($fields[self::F_FIRST_NAME]); $lname = trim($fields[self::F_LAST_NAME]); $title = trim($fields[self::F_TITLE]); $plate_num = strtoupper(trim($fields[self::F_PLATE_NUMBER])); $color = trim($fields[self::F_V_COLOR]); // NOTE: we have to export this to csv then load data infile // because doctrine is eating up 100% cpu /* // customer $cust = new Customer(); $cust->setTitle($title) ->setFirstName($fname) ->setLastName($lname) ->setCustomerNotes($fields[self::F_NOTES]) ->setPhoneMobile($fields[self::F_MOBILE_PHONE]) ->setPhoneLandline($fields[self::F_LANDLINE]) ->setPhoneOffice($fields[self::F_OFFICE_PHONE]) ->setPhoneFax($fields[self::F_FAX]) ->setEmail($fields[self::F_EMAIL]); $this->em->persist($cust); */ $cust_fields = [ $id, $fname, $lname, 0, '', 0, $title, 1, $fields[self::F_MOBILE_PHONE], $fields[self::F_LANDLINE], $fields[self::F_OFFICE_PHONE], $fields[self::F_FAX], $fields[self::F_EMAIL], isset($fields[self::F_NOTES]) ? $fields[self::F_NOTES] : '', 'CMB_ImportCustomerCommand' ]; $cust_row = str_replace('\\', '\\\\', implode('|', $cust_fields)) . "\n"; fputs($cust_file, $cust_row); // $output->writeln($id . ' - ' . $fname . ' ' . $lname); // get vehicle object $vehicle = $this->findVehicle($output, $fields); if ($vehicle != null) { $output->writeln('[1] vehicle found'); /* // customer vehicle $cv = new CustomerVehicle(); $cv->setName('') ->setCustomer($cust) ->setVehicle($vehicle) ->setPlateNumber($plate_num) ->setModelYear(0) ->setColor($color) ->setStatusCondition(VehicleStatusCondition::BRAND_NEW) ->setFuelType(FuelTYpe::GAS) ->setHasMotoliteBattery(false); $this->em->persist($cv); */ $cv_fields = [ $id, $vehicle->getID(), '', $plate_num, 0, VehicleStatusCondition::BRAND_NEW, FuelType::GAS, 0, 1, $color ]; $cv_row = str_replace('\\', '\\\\', implode('|', $cv_fields)) . "\n"; fputs($cv_file, $cv_row); } else { $output->writeln('[2] vehicle not found'); } $row_num++; /* $save_counter++; // flush every 100 if ($save_counter >= 100000) { $this->em->flush(); $save_counter = 0; } */ } fclose($cust_file); fclose($cv_file); return 0; } }