Redo the command to fulfill all open job orders. #654

This commit is contained in:
Korina Cordero 2022-05-11 10:08:41 +00:00
parent 1a7d53ca01
commit d9de5cd519

View file

@ -22,20 +22,16 @@ use App\Ramcar\WarrantyClass;
use App\Ramcar\ServiceType; use App\Ramcar\ServiceType;
use App\Ramcar\WarrantySource; use App\Ramcar\WarrantySource;
use App\Service\WarrantyHandler;
use DateTime; use DateTime;
use DateInterval; use DateInterval;
class FulfillOpenJobOrderCommand extends Command class FulfillOpenJobOrderCommand extends Command
{ {
protected $em; protected $em;
protected $wh;
public function __construct(EntityManagerInterface $em, WarrantyHandler $wh) public function __construct(EntityManagerInterface $em)
{ {
$this->em = $em; $this->em = $em;
$this->wh = $wh;
parent::__construct(); parent::__construct();
} }
@ -50,140 +46,244 @@ class FulfillOpenJobOrderCommand extends Command
protected function execute(InputInterface $input, OutputInterface $output) protected function execute(InputInterface $input, OutputInterface $output)
{ {
/*
$sap_code = 'WSLMF9BR-RV100-L';
error_log($sap_code);
$conn = $this->em->getConnection();
$sql = 'SELECT sap.id FROM sap_battery sap WHERE sap.id = :id';
$stmt = $conn->prepare($sql);
$stmt->execute(array('id' => $sap_code));
$query_results = $stmt->fetchColumn();
error_log($query_results);
return 0;
*/
// get the input date // get the input date
$str_date_end = $input->getArgument('end_date'); $str_date_end = $input->getArgument('end_date');
// append the 23:59:59 to end date // append the 23:59:59 to end date
$str_date_end = $str_date_end . ' ' . '23:59:59'; $str_date_end = $str_date_end . ' ' . '23:59:59';
// retrieve job orders that are open and have not been fulfilled starting from input date and before.
// starting time to count is date schedule // starting time to count is date schedule
$date_end = new DateTime($str_date_end); $date_end = new DateTime($str_date_end);
error_log('mogol ' . $date_end->format('Y-m-d H:i:s')); // get current date and convert to string
$current_date = new DateTime();
$str_current_date = $current_date->format('Y-m-d H:i:s');
/* // find all open job orders starting from input date and before
$query = $this->em->createQuery('SELECT jo FROM App\Entity\JobOrder jo // need to get customer id, customer vehicle id, service type, warranty class
WHERE (jo.status = :pending_status $conn = $this->em->getConnection();
OR jo.status = :rider_assign_status
OR jo.status = :assigned_status
OR jo.status = :in_progress_status
OR jo.status = :in_transit_status)
AND jo.date_schedule <= :date_end
AND jo.service_type = :stype');
$query->setParameters([ $jo_sql = 'SELECT jo.id AS jo_id, c.id AS c_id, cv.id AS cv_id, i
'pending_status' => JOStatus::PENDING, jo.service_type, jo.warranty_class, jo.rider_id, jo.date_schedule
'rider_assign_status' => JOStatus::RIDER_ASSIGN, FROM job_order jo, customer c, customer_vehicle cv
'assigned_status' => JOStatus::ASSIGNED, WHERE jo.customer_id = c.id AND jo.cvehicle_id = cv.id
'in_progress_status' => JOStatus::IN_PROGRESS, AND (jo.status != :cancelled
'in_transit_status' => JOStatus::IN_TRANSIT, OR jo.status != :fulfilled)
'date_end' => $date_end, AND jo.date_schedule <= :date_end';
'stype' => ServiceType::BATTERY_REPLACEMENT_NEW, $stmt = $conn->prepare($jo_sql);
])->setMaxResults(1); $stmt->execute(['cancelled' => JOStatus::CANCELLED,
'fulfilled' => JOStatus::FULFILLED,
'date_end' => $str_date_end]);
$jo_results = $query->getResult(); $jo_results = $stmt->fetchAll();
error_log('Found job orders ' . count($jo_results)); error_log('JOs found ' . count($jo_results));
// get user. Use the admin user. foreach ($jo_results as $jo_row)
$user = $this->em->getRepository(User::class)->find(1);
foreach ($jo_results as $jo)
{ {
error_log('Fulfilling job order ' . $jo->getID()); // get the data first
$jo_id = $jo_row['jo_id'];
$cust_id = $jo_row['c_id'];
$cv_id = $jo_row['cv_id'];
$service_type = $jo_row['service_type'];
$warranty_class = $jo_row['warranty_class'];
$rider_id = $jo_row['rider_id'];
$date_schedule = $jo_row['date_schedule'];
//$jo->fulfill(); // fulfill JO, create job order event
$this->processJOAndJOEvent($conn, $jo_id, $str_current_date, $rider_id);
// set delivery status // check service type
//$jo->setDeliveryStatus(DeliveryStatus::FULFILLED); if ($service_type == ServiceType::BATTERY_REPLACEMENT_NEW)
// create JO event
//$event = new JOEvent();
//$event->setDateHappen(new DateTime())
// ->setTypeID(JOEventType::FULFILL)
// ->setJobOrder($jo)
// ->setUser($user);
//$this->em->persist($event);
// check if new battery
// if yes, create warranty
if ($this->checkIfNewBattery($jo))
{ {
$this->createWarranty($jo, $user); // new battery so we need to create warranty so we need to get battery information
$batt_info = $this->getBatteryInformation($jo_id);
$this->createWarrantyForJO($str_current_date, $date_schedule, $cust_id, $cv_id, $warranty_class, $batt_info);
} }
} }
$this->em->flush();
*/
return 0; return 0;
} }
protected function checkIfNewBattery(JobOrder $jo) protected function processJOAndJOEvent($conn, $jo_id, $str_current_date, $rider_id)
{ {
if ($jo->getServiceType() == ServiceType::BATTERY_REPLACEMENT_NEW) $fulfill_jo_sql = 'UPDATE job_order SET status = :fulfilled WHERE id = :jo_id';
return true; $fulfill_jo_stmt = $conn->prepare($fulfill_jo_sql);
// TODO: don't forget to uncomment this when testing the whole thing
//$fulfill_jo_stmt->execute([
// 'fulfilled' => JOStatus::FULFILLED,
// 'jo_id' => $jo_id,
//]);
return false; // create jo event
// set user to admin that has id of 1
$user_id = 1;
$jo_event_values = '(' . $user_id . ',' . $jo_id . ',\'' . $str_current_date . '\',\'' . $str_current_date . '\',\'' . JOEventType::FULFILL . '\',' . $rider_id . ')';
$create_jo_event_sql = 'INSERT into `jo_event` (create_user_id, job_order_id, date_create, date_happen, type_id, rider_id) VALUES ' . $jo_event_values . ';' . "\n";
// error_log($create_jo_event_sql);
$create_jo_event_stmt = $conn->prepare($create_jo_event_sql);
// TODO: don't forget to uncomment this when testing the whole thing
// $create_jo_event_stmt->execute();
} }
protected function createWarranty(JobOrder $jo, User $user) protected function getBatteryInformation($jo_id)
{ {
$serial = null; $batt_info = [];
$warranty_class = $jo->getWarrantyClass();
$first_name = $jo->getCustomer()->getFirstName();
$last_name = $jo->getCustomer()->getLastName();
$mobile_number = $jo->getCustomer()->getPhoneMobile();
// use date_schedule for warranty expiration computation // get the battery id from invoice item
$date_purchase = $jo->getDateSchedule(); $ii_sql = 'SELECT ii.id, ii.battery_id FROM invoice i, invoice_item ii
WHERE i.job_order_id = :jo_id
AND ii.invoice_id = i.id
AND ii.battery_id IS NOT NULL';
$ii_stmt = $conn->prepare($ii_sql);
$ii_stmt->execute([
'jo_id' => $jo_id,
]);
// validate plate number $ii_result = $ii_stmt->fetch();
$plate_number = Warranty::cleanPlateNumber($jo->getCustomerVehicle()->getPlateNumber());
if ($plate_number != false)
{
$batt_list = array();
$invoice = $jo->getInvoice();
if (!empty($invoice))
{
// get battery
$invoice_items = $invoice->getItems();
foreach ($invoice_items as $item)
{
$battery = $item->getBattery();
if ($battery != null)
{
$batt_list[] = $item->getBattery();
}
}
}
$user_id = $user->getUsername(); $batt_id = $ii_result['battery_id'];
$source = WarrantySource::ADMIN_PANEL;
$this->wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class, $user_id, $source, $jo->getCustomer(), $jo->getCustomerVehicle()->getVehicle()); // for battery, we need model id, size id, sap_code, warr_private, warr_commercial, warr_tnv
} $batt_sql = 'SELECT b.model_id, b.size_id, b.sap_code, b.warr_private, b.warr_commercial, b.warr_tnv
else FROM battery b
{ WHERE b.id = :batt_id';
error_log('Invalid plate number for warranty. Plate number = ' . $jo->getCustomerVehicle()->getPlateNumber()); $batt_stmt = $conn->prepare($batt_sql);
} $batt_stmt->execute([
'batt_id' => $batt_id,
]);
$batt_result = $batt_stmt->fetch();
$batt_info[] = [
'model_id' => $batt_result['model_id'],
'size_id' => $batt_result['size_id'],
'sap_code' => $batt_result['sap_code'],
'warr_private' => $batt_result['warr_private'],
'warr_commercial' => $batt_result['warr_commercial'],
'warr_tnv' => $batt_result['warr_tnv'],
];
return $batt_info;
} }
protected function createWarrantyForJO($str_current_date, $date_schedule, $cust_id, $cv_id, $warranty_class, $batt_info)
{
$conn = $this->em->getConnection();
// prepare warranty info
// convert date schedule to string since we use this for date_purchase
$str_date_purchase = $date_schedule->format('Y-m-d H:i:s');
// get the warranty period based on warranty class from batt_info
$warranty_period = $this->getWarrantyPeriod($batt_info, $warranty_class);
// compute date expiry
$date_expire = $this->computeDateExpire($date_schedule, $warranty_period);
// convert to string the expiry date
$str_date_expire = $date_expire->format('Y-m-d H:i:s');
// get customer
$cust_info = $this->getCustomerInfo($conn, $cust_id);
// get customer vehicle
$cv_info = $this->getCustomerVehicleInfo($conn, $cv_id);
// TODO: prep sql_values for the insert warranty statement
$sql_statement = 'INSERT INTO `warranty` (bty_model_id,bty_size_id,sap_bty_id,warranty_class,plate_number,status,date_create,date_purchase,date_expire,first_name,last_name,mobile_number,flag_activated,vehicle_id,customer_id, create_source) VALUES ' . $sql_values . ';' . "\n";
}
protected function getCustomerInfo($conn, $id)
{
$cust_info = [];
$cust_sql = 'SELECT c.first_name, c.last_name, c.phone_mobile
FROM customer c
WHERE c.id = :id';
$cust_stmt = $conn->prepare($cust_sql);
$cust_stmt->execute([
'id' => $id,
]);
$cust_result = $cust_stmt->fetch();
$cust_info[] = [
'first_name' => $cust_result['first_name'],
'last_name' => $cust_result['last_name'],
'mobile' => $cust_result['phone_mobile'],
];
return $cust_info;
}
protected function getCustomerVehicleInfo($conn, $id)
{
$cv_info = [];
$cv_sql = 'SELECT cv.plate_number
FROM customer_vechicle cv
WHERE cv.id = :id';
$cv_stmt = $conn->prepare($cv_sql);
$cv_stmt->execute([
'id' => $id,
]);
$cv_result = $cv_stmt->fetch();
$plate_number = $cv_result['plate_number'];
$clean_plate = $this->cleanPlateNumber($plate_number);
$cv_info[] = [
'plate_number' => $clean_plate,
];
return $cv_info;
}
protected function getWarrantyPeriod($batt_info, $warranty_class)
{
// set default period to that of private
$period = $batt_info['warr_private'] ;
if ($warranty_class == WarrantyClass::WTY_PRIVATE)
{
$period = $batt_info['warr_private'];
return $period;
}
if ($warranty_class == WarrantyClass::WTY_COMMERCIAL)
{
$period = $batt_info['warr_commercial'];
return $period;
}
if ($warranty_class == WarrantyClass::WTY_TNV)
{
$period = $batt_info['warr_tnv'];
return $period;
}
return $period;
}
protected function computeDateExpire($purchase_date, $warranty_period)
{
$expire_date = clone $purchase_date;
$expire_date->add(new DateInterval('P'.$warranty_period.'M'));
return $expire_date;
}
protected function cleanPlateNumber($plate)
{
return strtoupper(str_replace(' ', '', $plate));
}
} }