252 lines
8.2 KiB
PHP
252 lines
8.2 KiB
PHP
<?php
|
|
|
|
namespace App\Controller\CAPI;
|
|
|
|
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
|
|
use Doctrine\ORM\Query;
|
|
use Doctrine\ORM\EntityManagerInterface;
|
|
|
|
use Catalyst\ApiBundle\Controller\ApiController;
|
|
use Catalyst\ApiBundle\Component\Response as APIResponse;
|
|
|
|
use App\Entity\Customer;
|
|
use App\Entity\CustomerVehicle;
|
|
use App\Entity\Vehicle;
|
|
|
|
use App\Service\HashGenerator;
|
|
|
|
use Catalyst\AuthBundle\Service\ACLGenerator as ACLGenerator;
|
|
|
|
class CustomerController extends ApiController
|
|
{
|
|
protected $acl_gen;
|
|
|
|
public function __construct(ACLGenerator $acl_gen)
|
|
{
|
|
$this->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_<insert name of api user here>
|
|
$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));
|
|
}
|
|
|
|
}
|