Start processing of request data. #686

This commit is contained in:
Korina Cordero 2022-06-17 08:47:55 +00:00
parent 89cd852db8
commit c8a8bc53af

View file

@ -92,51 +92,15 @@ class JobOrderController extends APIController
return $res->getReturnResponse();
// get data from request
$data = $this->getJobOrderRequestInfo($req);
$data = [];
$data = $this->getJobOrderRequestInfo($req, $data);
// process customer and vehicle information
$this->processCustomerAndVehicleInformation();
// trade in type
$trade_in = $req->request->get('trade_in');
// address
$address = $req->request->get('delivery_address', 'Set by mobile application');
// instructions
$instructions = $req->request->get('delivery_instructions', '');
// landmark
$landmark = $req->request->get('landmark', ' ');
// longitude and latitude
$long = $req->request->get('long');
$lat = $req->request->get('lat');
// NOTE: had to move this up so we can check for promo before geofence
// customer
// TODO: need to modify how to get customer
$cust = $this->session->getCustomer();
if ($cust == null)
{
$res->setError(true)
->setErrorMessage('No customer information found');
return $res->getReturnResponse();
}
$this->processCustomerAndVehicleInformation($data, $em);
$is_covered = false;
// check if customer still has promo
if (($cust->getCustomerTag('TAG_CAR_CLUB_OFFICER_PROMO')) ||
($cust->getCustomerTag('TAG_CAR_CLUB_MEMBER_PROMO')))
{
// if has customer tag, customer has not availed of promo
$is_covered = true;
}
else
{
// geofence
$is_covered = $geo->isCovered($long, $lat);
}
$is_covered = $geo->isCovered($data['long'], $data['lat']);
if (!$is_covered)
{
@ -146,43 +110,6 @@ class JobOrderController extends APIController
return $res->getReturnResponse();
}
$hub = null;
$hub_id = $req->request->get('hub_id');
// check if hub_id is -1 which means user clicked Book Now before 5 PM
// but confirmed the order after 5 PM
if ($hub_id == -1)
{
$res->setError(true)
->setErrorMessage('Book Now no longer available.');
return $res->getReturnResponse();
}
if (strlen($hub_id) > 0)
$hub = $em->getRepository(Hub::class)->find($hub_id);
$schedule_date = $req->request->get('date_schedule');
$slot_id = $req->request->get('slot_id');
// process the jo date schedule
$date_schedule = null;
if ((strlen($schedule_date) > 0) && (strlen($slot_id) > 0))
{
$time_schedule = $this->getTimeFromSlot($slot_id);
if (!empty($time_schedule))
{
$s_date = $schedule_date . ' ' . $time_schedule;
$date_schedule = DateTime::createFromFormat('Y-m-d H:i', $s_date);
// error_log($date_schedule->format('Y-m-d H:i'));
}
}
$advance_order = $req->request->get('flag_advance_order');
// check for 'false' text
if ($advance_order === false || $advance_order === 0 || $advance_order === '0' || $advance_order == 'false')
$flag_advance_order = false;
else
$flag_advance_order = true;
// $flag_advance_order = $advance_order ? true : false;
$jo = new JobOrder();
$jo->setSource(TransactionOrigin::MOBILE_APP)
->setStatus(JOStatus::PENDING)
@ -193,33 +120,13 @@ class JobOrderController extends APIController
->setTradeInType($trade_in)
->setDeliveryInstructions($instructions)
// TODO: error check for valid mode of payment
->setModeOfPayment($req->request->get('mode_of_payment'))
->setAdvanceOrder($flag_advance_order)
->setModeOfPayment($data['payment_mode'])
->setAdvanceOrder($data['is_advance_order'])
->setStatusAutoAssign(AutoAssignStatus::NOT_ASSIGNED)
->setLandmark($landmark);
$jo->setCustomer($cust);
// validate service type
$stype = $req->request->get('service_type');
if (!ServiceType::validate($stype))
{
$res->setError(true)
->setErrorMessage('Invalid service type');
return $res->getReturnResponse();
}
$jo->setServiceType($stype);
// validate warranty
$warr = $req->request->get('warranty');
if (!WarrantyClass::validate($warr))
{
$res->setError(true)
->setErrorMessage('Invalid warranty class');
return $res->getReturnResponse();
}
$jo->setWarrantyClass($warr);
// set coordinates
$point = new Point($long, $lat);
$jo->setCoordinates($point);
@ -228,21 +135,10 @@ class JobOrderController extends APIController
$icrit = new InvoiceCriteria();
$icrit->setServiceType($stype);
// TODO add promo to criteria if any
// check promo
$promo_id = $req->request->get('promo_id');
if (!empty($promo_id))
{
$promo = $em->getRepository(Promo::class)->find($promo_id);
if ($promo == null)
{
$res->setError(true)
->setErrorMessage('Invalid promo id');
return $res->getReturnResponse();
}
// put in criteria
$icrit->addPromo($promo);
}
// check customer vehicle
$cv = $em->getRepository(CustomerVehicle::class)->find($req->request->get('cv_id'));
@ -263,21 +159,6 @@ class JobOrderController extends APIController
return $res->getReturnResponse();
}
// check battery
$batt_id = $req->request->get('batt_id');
if ($batt_id != null)
{
$batt = $em->getRepository(Battery::class)->find($batt_id);
if ($batt == null)
{
$res->setError(true)
->setErrorMessage('Invalid battery id');
return $res->getReturnResponse();
}
}
else
$batt = null;
switch ($trade_in)
{
case TradeInType::MOTOLITE:
@ -1645,13 +1526,212 @@ class JobOrderController extends APIController
return $file_path;
}
protected function getJobOrderRequestInfo(Request $req)
protected function getJobOrderRequestInfo(Request $req, EntityManagerInterface $em, &$data)
{
$r = $req->request;
return $data;
// trade-in type
$trade_in_type = $this->cleanText($r->get('trade_in_type'));
if (!TradeInType::validate($trade_in_type))
{
$message = 'Invalid trade in type';
return $message;
}
// TODO: add function to clean plate number
// TODO: add function to normalize strings (lowercase them since the types are lowercase)
// address
$address = $r->get('delivery_address', 'Set by third party API');
// instructions
$instructions = $r->get('delivery_instructions', '');
// landmark
$landmark = $r->get('landmark', ' ');
// longitude and latitude
$long = $r->get('longitude');
$lat = $r->get('latitude');
// validate service type
$stype = $this->cleanText($r->get('service_type'));
if (!ServiceType::validate($stype))
{
$message = 'Invalid service type';
return $message;
}
// get mode of payment
// TODO: do we need to validate this?
$payment_mode = $this->clean($r->get('mode_of_payment'));
if (!ModeOfPayment::validate($payment_mode))
{
$message = 'Invalid mode of payment';
return $message;
}
$advance_order = $r->get('flag_advance_order');
// check for 'false' text
if ($advance_order === false || $advance_order === 0 || $advance_order === '0' || $advance_order == 'false')
$flag_advance_order = false;
else
$flag_advance_order = true;
$hub = null;
$hub_id = $r->get('hub_id');
if (strlen($hub_id) > 0)
$hub = $em->getRepository(Hub::class)->find($hub_id);
$schedule_date = $r->get('date_schedule');
$slot_id = $r->get('slot_id');
// process the jo date schedule
$date_schedule = null;
if ((strlen($schedule_date) > 0) && (strlen($slot_id) > 0))
{
$time_schedule = $this->getTimeFromSlot($slot_id);
if (!empty($time_schedule))
{
$s_date = $schedule_date . ' ' . $time_schedule;
$date_schedule = DateTime::createFromFormat('Y-m-d H:i', $s_date);
// error_log($date_schedule->format('Y-m-d H:i'));
}
}
// check promo
$promo = null;
$promo_id = $r->get('promo_id');
if (!empty($promo_id))
{
$promo = $em->getRepository(Promo::class)->find($promo_id);
if ($promo == null)
{
$message = 'Invalid promo id';
return $message;
}
}
// check battery
$batt = null;
$batt_id = $req->request->get('batt_id');
if ($batt_id != null)
{
$batt = $em->getRepository(Battery::class)->find($batt_id);
if ($batt == null)
{
$message = 'Invalid battery id';
return $message;
}
}
// get customer and vehicle info
$fname = $r->get('first_name', '');
$lname = $r->get('last_name', '');
$mobile = $r->get('mobile_number', '');
// validate mobile number
$clean_mobile = $this->cleanPhoneNumber($mobile);
if ($clean_mobile == false)
{
$message = 'Invalid mobile number.';
return $message;
}
$vmanu = $r->get('vehicle_manufacturer', '');
$vmodel = $r->get('vehicle_model', '');
$plate_number = $r->get('plate_number');
// clean plate number
$clean_plate = $this->cleanPlateNumber($plate_number);
$data = [
'trade_in_type' => $trade_in_type,
'service_type' => $stype,
'long' => $long,
'lat' => $lat,
'payment_mode' => $payment_mode,
'first_name' => $fname,
'last_name' => $lname,
'mobile' => $clean_mobile,
'vmanu' => $vmanu,
'vmodel' => $model,
'plate_number' => $clean_plate,
'address' => $address,
'instructions' => $instructions,
'landmark' => $landmark,
'is_advance_order' => $flag_advance_order,
'hub' => $hub,
'date_schedule' => $date_schedule,
'promo' => $promo,
'batt' => $batt,
];
return null;
}
protected function processCustomerAndVehicleInformation($data, EntityManagerInterface $em)
{
// retrieve customer info
$fname = $data['first_name'];
$lname = $data['last_name'];
$vmanu = $data['vmanu'];
$vmodel = $data['vmodel'];
$plate_number = $data['plate_number'];
$mobile = $data['mobile'];
// find customer given phone number
$cust = $em->getRepository(Customer::class)->findOneBy(['phone_mobile' => $mobile]);
if ($cust == null)
{
// create new customer and customer vehicle
}
else
{
// find customer vehicle using plate number
$cv = $em->getRepository(CustomerVehicle::class)->findOneBy(['plate_number' => $plate_number]);
if ($cv == null)
{
// create customer vehicle
}
}
return $cust;
}
protected function cleanPhoneNumber($mobile)
{
// remove any non digit character from string
$clean_number = preg_replace('~\D~', '', $mobile);
// does it fit our 09XXXXXXXXX pattern?
if (preg_match('/^09[0-9]{9}$/', $clean_number))
{
return $clean_number;
}
// does it fit our 9XXXXXXXXX pattern?
else if (preg_match('/^9[0-9]{9}$/', $clean_number))
{
return $clean_number;
}
// does it fit our 63XXXXXXXXXX pattern?
else if (preg_match('/^63[0-9]{10}$/', $clean_number))
{
// strip the 63 since we don't save the country code
$c_number = substr($clean_number, 0, 2);
return $c_number;
}
return false;
}
protected function cleanPlateNumber($plate)
{
// remove spaces and make upper case
return strtoupper(str_replace(' ', '', $plate));
}
protected function cleanText($name)
{
return strtolower(trim($name));
}
}