Create migration command for cmb legacy job order. #460
This commit is contained in:
parent
4bfbfbf995
commit
108d49ca5f
2 changed files with 348 additions and 1 deletions
342
src/Command/MigrateCMBLegacyJobOrderCommand.php
Normal file
342
src/Command/MigrateCMBLegacyJobOrderCommand.php
Normal file
|
|
@ -0,0 +1,342 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Command;
|
||||||
|
|
||||||
|
use Symfony\Component\Console\Command\Command;
|
||||||
|
use Symfony\Component\Console\Input\InputArgument;
|
||||||
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
|
|
||||||
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
|
||||||
|
use App\Entity\CMBLegacyJobOrder;
|
||||||
|
use App\Entity\JobOrder;
|
||||||
|
use App\Entity\VehicleManufacturer;
|
||||||
|
use App\Entity\Vehicle;
|
||||||
|
use App\Entity\BatteryManufacturer;
|
||||||
|
use App\Entity\BatteryModel;
|
||||||
|
use App\Entity\BatterySize;
|
||||||
|
use App\Entity\Battery;
|
||||||
|
use App\Entity\Customer;
|
||||||
|
use App\Entity\CustomerVehicle;
|
||||||
|
use App\Entity\Invoice;
|
||||||
|
use App\Entity\InvoiceItem;
|
||||||
|
|
||||||
|
class MigrateCMBLegacyJobOrderCommand extends Command
|
||||||
|
{
|
||||||
|
protected $em;
|
||||||
|
|
||||||
|
protected $bmanu_hash;
|
||||||
|
protected $bmodel_hash;
|
||||||
|
protected $bsize_hash;
|
||||||
|
protected $batt_hash;
|
||||||
|
|
||||||
|
protected $vmanu_hash;
|
||||||
|
protected $vmake_hash;
|
||||||
|
|
||||||
|
protected $cv_hash;
|
||||||
|
|
||||||
|
public function __construct(EntityManagerInterface $em)
|
||||||
|
{
|
||||||
|
$this->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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -41,7 +41,7 @@ class CMBLegacyJobOrder
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getData($id)
|
public function getDataById($id)
|
||||||
{
|
{
|
||||||
// return null if we don't have it
|
// return null if we don't have it
|
||||||
if (!isset($this->data[$id]))
|
if (!isset($this->data[$id]))
|
||||||
|
|
@ -49,4 +49,9 @@ class CMBLegacyJobOrder
|
||||||
|
|
||||||
return $this->data[$id];
|
return $this->data[$id];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getData()
|
||||||
|
{
|
||||||
|
return $this->data;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue