diff --git a/src/Command/MigrateCMBLegacyJobOrderCommand.php b/src/Command/MigrateCMBLegacyJobOrderCommand.php new file mode 100644 index 00000000..4be27570 --- /dev/null +++ b/src/Command/MigrateCMBLegacyJobOrderCommand.php @@ -0,0 +1,342 @@ +em = $em; + + // load existing battery data + $this->loadBatteryManufacturers(); + $this->loadBatteryModels(); + $this->loadBatterySizes(); + $this->loadBatteries(); + + // load existing vehicle data + $this->loadVehicleManufacturers(); + $this->loadVehicleMakes(); + + parent::__construct(); + } + + public function configure() + { + $this->setName('cmblegacyjoborderdata:migrate') + ->setDescription('Retrieve database cmb legacy job orders and insert into job order.') + ->setHelp('Creates job orders based on data from imported CSV.'); + } + + public function execute(InputInterface $input, OutputInterface $output) + { + // get all legacy job orders + $query = $this->em->createQuery('SELECT legacy_jo FROM App\Entity\CMBLegacyJobOrder legacy_jo'); + $result = $query->iterate(); + + $invalid_entries = []; + foreach ($result as $row) + { + $entry = $row[0]; + $jo_entry = $entry->getData(); + + // get the entry information + $entry_num = $jo_entry['entry_num']; + $date_created = $jo_entry['created_date']; + $case_number = $jo_entry['case_number']; + $insurer = $jo_entry['insurer']; + $plate_number = $this->cleanPlateNumber($jo_entry['vehicle_number']); + $car_model = $jo_entry['car_model']; + $nature_of_call = $jo_entry['nature_of_call']; + $service_needed = $jo_entry['service_needed']; + $location = $jo_entry['location']; + $state = $jo_entry['state']; + $driver = $jo_entry['driver']; + $truck = $jo_entry['truck']; + $workshop_arrival_time = $jo_entry['workshop_arrival_time']; + $status = $jo_entry['status']; + $customer_name = $jo_entry['customer_name']; + $customer_mobile = $jo_entry['customer_phone_number']; + $reference = $jo_entry['reference']; + $odometer = $jo_entry['odometer']; + $batt_model = $jo_entry['batt_model']; + $batt_size = $jo_entry['batt_size']; + $batt_trade_in = $jo_entry['batt_trade_in']; + $replaced_by = $jo_entry['replaced_by']; + $remark = $jo_entry['remark']; + $satisfaction = $jo_entry['satisfaction']; + + // check vehicle info if valid + $v_status = $this->processVehicleInfo($car_model); + if ($v_status != null) + { + error_log($v_status . ' ' . $car_model); + $invalid_entries[] = $this->addInvalidEntry($entry_num, $date_create, $case_number, $insurer, $vehicle_number, $car_model, + $nature_of_call, $service_needed, $location, $state, $driver, $truck, $workshop_arrival_time, + $status, $customer_name, $customer_mobile, $reference, $odometer, $batt_model, $batt_size, + $trade_in, $replaced_by, $remark, $satisfaction, $v_status); + + // move to next entry + continue; + } + + // check battery info if valid + $batt_status = $this->processBatteryInfo($batt_model, $batt_size); + if ($batt_status != null) + { + error_log($batt_status); + $invalid_entries[] = $this->addInvalidEntry($entry_num, $date_create, $case_number, $insurer, $vehicle_number, $car_model, + $nature_of_call, $service_needed, $location, $state, $driver, $truck, $workshop_arrival_time, + $status, $customer_name, $customer_mobile, $reference, $odometer, $batt_model, $batt_size, + $trade_in, $replaced_by, $remark, $satisfaction, $batt_status); + + // move to next entry + continue; + } + + // create job order + $new_jo = new JobOrder(); + + // add to metadata + // case number, nature of call, workshop arrival time, reference, odometer, replaced by, satisfaction + $new_jo->addMeta('case_number', $case_number); + $new_jo->addMeta('nature_of_call', $nature_of_call); + $new_jo->addMeta('workshop_arrival_time', $workshop_arrival_time); + $new_jo->addMeta('reference', $reference); + $new_jo->addMeta('odometer', $odometer); + $new_jo->addMeta('replaced_by', $replaced_by); + $new_jo->addMeta('satisfaction', $satisfaction); + + // date_create + $created_date = DateTime::createFromFormat('d-m-Y H:i', $date_create); + $new_jo->setDateCreate($created_date); + + // insurer == responsible_party + $new_jo->setResponsibleParty($insurer); + + // delivery address = location + state + $delivery_address = $location . ', ' . $state; + $new_jo->setDeliveryAddress($delivery_address); + + // remarks == tier 1 notes + $new_jo->setTier1Notes($remark); + + // service_needed = service type + // check service needed: + // Battery == Battery Sales + // Battery Warranty Claim == Warranty Claim + // Battery Warranty Replacement == Warranty Replacement + $service = $this->normalizeName($service_needed); + switch ($service) + { + case 'battery': + $new_jo->setServiceType(CMBServiceType::BATTERY_REPLACEMENT_NEW); + break; + case 'battery warranty claim': + $new_jo->setServiceType(CMBServiceType::WARRANTY_CLAIM); + break; + case 'battery warranty replacement': + $new_jo->setServiceType(CMBServiceType::BATTERY_REPLACEMENT_WARRANTY); + break; + } + + // status set everything to fulfilled + // store old status to metadata + $new_jo->setStatus(JOStatus::FULFILLED); + $new_jo->addMeta('status', $status); + + // plate number == vehicle_number. Use as key to cv_hash + $clean_plate = $this->cleanPlateNumber($vehicle_number); + //error_log($clean_plate . ' ' . $new_jo->getServiceType()); + + // check if plate number has been added + if (!isset($this->cv_hash[$clean_plate])) + { + $cust = $this->addCustomer($customer_name, $customer_mobile); + $cv = $this->addCustomerVehicle($clean_plate, $car_model, $cust); + } + else + { + // get customer vehicle from hash + $cv = $this->cv_hash[$clean_plate]; + $cust = $cv->getCustomer(); + } + + $new_jo->setCustomer($cust) + ->setCustomerVehicle($cv); + + // create the invoice + + $this->em->persist($new_jo); + + $this->em->detach($row[0]); + } + + $this->em->flush(); + $this->em->clear(); + + return 0; + } + + protected function processVehicleInfo($car_model) + { + // vehicle manufacturer is the first entry + // vehicle model is the 2nd entry + whatever follows + $v_array = explode(' ', $car_model); + + // manufacturer + $v_manufacturer = trim($v_array[0]); + + // get model + $model_info = ''; + $v_model = ''; + for ($i = 1; $i < count($v_array); $i++) + { + $model_info = $model_info . ' ' . trim($v_array[$i]); + } + + $v_model = trim($model_info); + //error_log($v_manufacturer . ' ' . $v_model); + + // check if manufacturer is in hash + if (!isset($this->vmanu_hash[$v_manufacturer])) + { + //error_log($v_manufacturer . ' invalid.'); + return 'Vehicle manufacturer not in system.'; + } + + // check if manufacturer and make is in hash + if (!isset($this->vmake_hash[$v_manufacturer][$v_model])) + { + //error_log($v_model . ' invalid.'); + return 'Vehicle model not in system.'; + } + // car model info valid + return null; + } + + 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 = $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 = $vmake->getMake(); + + $this->vmake_hash[$manufacturer][$make] = $vmake; + } + } + + protected function normalizeName($name) + { + $normalized_key = trim(strtolower($name)); + + return $normalized_key; + } + + protected function cleanPlateNumber($plate_number) + { + // remove spaces and make upper case + $clean_plate_number = strtoupper(str_replace(' ' , '', $plate_number)); + + return $clean_plate_number; + } + +} diff --git a/src/Entity/CMBLegacyJobOrder.php b/src/Entity/CMBLegacyJobOrder.php index 603706be..38aea6a0 100644 --- a/src/Entity/CMBLegacyJobOrder.php +++ b/src/Entity/CMBLegacyJobOrder.php @@ -41,7 +41,7 @@ class CMBLegacyJobOrder return $this; } - public function getData($id) + public function getDataById($id) { // return null if we don't have it if (!isset($this->data[$id])) @@ -49,4 +49,9 @@ class CMBLegacyJobOrder return $this->data[$id]; } + + public function getData() + { + return $this->data; + } }