diff --git a/src/Controller/TAPI/JobOrderController.php b/src/Controller/TAPI/JobOrderController.php index 7519889a..55f65d46 100644 --- a/src/Controller/TAPI/JobOrderController.php +++ b/src/Controller/TAPI/JobOrderController.php @@ -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); - } + // geofence + $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); - } + // 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) { - - return $data; + $r = $req->request; + + // 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; + } + + // 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; } - // TODO: add function to clean plate number - // TODO: add function to normalize strings (lowercase them since the types are lowercase) + 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)); + } }