Start processing of request data. #686
This commit is contained in:
parent
89cd852db8
commit
c8a8bc53af
1 changed files with 214 additions and 134 deletions
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue