acl_gen = $acl_gen; } public function register(Request $req, EntityManagerInterface $em) { $this->denyAccessUnlessGranted('customer.register', null, 'No access.'); // required parameters $params = [ 'first_name', 'last_name', 'mobile_number', 'v_make_id', 'v_model_year', 'v_plate_number', 'v_color', 'v_condition', 'v_fuel_type', ]; $msg = $this->checkRequiredParameters($req, $params); // error_log('msg - ' . $msg); if ($msg) return new APIResponse(false, $msg); $first_name = $req->request->get('first_name'); $last_name = $req->request->get('last_name'); $mobile_number = $req->request->get('mobile_number'); $make_id = $req->request->get('v_make_id'); $model_year = $req->request->get('v_model_year'); $plate_number = $this->cleanPlateNumber($req->request->get('v_plate_number')); $color = $req->request->get('v_color'); $condition = $req->request->get('v_condition'); $fuel_type = $req->request->get('v_fuel_type'); // check if vehicle exists $vehicle = $em->getRepository(Vehicle::class)->find($make_id); if ($vehicle == null) return new APIResponse(false, 'Invalid vehicle make.'); // clean up mobile number // does it fit our 09XXXXXXXXX pattern? if (preg_match('/^09[0-9]{9}$/', $mobile_number)) { // remove first '0' $mobile_number = substr($mobile_number, 1); // error_log("CONVERTED TO $mobile_number"); } // does it fit our 9XXXXXXXXX pattern? if (!preg_match('/^9[0-9]{9}$/', $mobile_number)) return new APIResponse(false, 'Invalid mobile number.'); /* // min length 2 // TODO: we need to check proper phone number format // format should be '9XXXXXXXXX' // TODO: if format doesn't fit and there's a 0 or 63 prefix, we should be able to detect and convert if (strlen($mobile_number <= 2)) continue; */ $data = []; $message = ''; // check if customer already exists $customers = $em->getRepository(Customer::class)->findBy(['phone_mobile' => $mobile_number]); if (!empty($customers)) { foreach($customers as $customer) { // get customer vehicles for customer $c_vehicles = $customer->getVehicles(); $cv_found = false; if (!empty($c_vehicles)) { // check if plate number of customer vehicle matches plate number foreach($c_vehicles as $c_vehicle) { $clean_cv_plate = $this->cleanPlateNumber($c_vehicle->getPlateNumber()); // check if it's already there if ($clean_cv_plate == $plate_number) { // customer and customer vehicle already exists $cv_found = true; break; } } } // if there is a customer vehicle matched if ($cv_found) { // vehicle found, do nothing $message = 'Customer found.'; } else { // customer already exists but not customer vehicle // add customer vehicle $new_cv = new CustomerVehicle(); $new_cv->setCustomer($customer) ->setPlateNumber($plate_number) ->setStatusCondition($condition) ->setModelYear($model_year) ->setColor($color) ->setFuelType($fuel_type) ->setHasMotoliteBattery(true) ->setVehicle($vehicle); $em->persist($new_cv); $message = 'Vehicle added.'; $data[] = [ 'make_id' => $make_id, 'model_year' => $model_year, 'plate_number' => $plate_number, 'color' => $color, 'condition' => $condition, 'fuel_type' => $fuel_type, ]; } } } else { // customer not found // get the api_user that made the call so that it gets added to the source // source becomes CAPI_USER_ $user_id = $_SERVER['HTTP_X_CATA_API_KEY']; $username = $this->getUser()->getName(); $source = 'CAPI_USER_' . $username; $new_cust = new Customer(); $new_cust->setFirstName($first_name) ->setLastName($last_name) ->setPhoneMobile($mobile_number) ->setCreateSource($source); $em->persist($new_cust); // add customer vehicle $new_cv = new CustomerVehicle(); $new_cv->setCustomer($new_cust) ->setPlateNumber($plate_number) ->setStatusCondition($condition) ->setModelYear($model_year) ->setColor($color) ->setFuelType($fuel_type) ->setHasMotoliteBattery(true) ->setVehicle($vehicle); $em->persist($new_cv); $message = 'Customer and vehicle added.'; $data[] = [ 'first_name' => $first_name, 'last_name' => $last_name, 'mobile_number' => $mobile_number, 'make_id' => $make_id, 'model_year' => $model_year, 'plate_number' => $plate_number, 'color' => $color, 'condition' => $condition, 'fuel_type' => $fuel_type, ]; } $em->flush(); $em->clear(); return new APIResponse(true, $message, $data); } public function verifyCustomer($customer_hash, EntityManagerInterface $em, HashGenerator $hash) { $this->denyAccessUnlessGranted('customer.verify', null, 'No access.'); // get customer id from customer_hash $cust_id = $hash->getID($customer_hash); if ($cust_id == null) return new APIResponse(false, 'Invalid customer hash.'); // find customer using id $customer = $em->getRepository(Customer::class)->find($cust_id); $data = []; $message = ''; if ($customer == null) { $message = 'Customer not found.'; $data[] = [ 'is_customer' => false, 'first_name' => '', 'last_name' => '', 'mobile_number' => '', ]; } else { $message = 'Customer found.'; $data[] = [ 'is_customer' => true, 'first_name' => $customer->getFirstName(), 'last_name' => $customer->getLastName(), 'mobile_number' => $customer->getPhoneMobile(), ]; } return new APIResponse(true, $message, $data); } protected function cleanPlateNumber($plate) { // remove spaces and make upper case return strtoupper(str_replace(' ', '', $plate)); } }