diff --git a/src/Controller/APIController.php b/src/Controller/APIController.php index 356be3db..0d7331ca 100644 --- a/src/Controller/APIController.php +++ b/src/Controller/APIController.php @@ -14,6 +14,9 @@ use App\Ramcar\APIResult; use App\Entity\MobileSession; use App\Entity\Customer; +use App\Entity\VehicleManufacturer; +use App\Entity\Vehicle; +use App\Entity\CustomerVehicle; use DateTime; @@ -321,39 +324,318 @@ class APIController extends Controller return $res->getReturnResponse(); } - public function listVehicleManufacturers() + public function listVehicleManufacturers(Request $req) { + // check required parameters and api key + $required_params = []; + $em = $this->getDoctrine()->getManager(); + $res = $this->checkParamsAndKey($req, $em, $required_params); + if ($res->isError()) + return $res->getReturnResponse(); + + // get manufacturer list + $mfgs = $em->getRepository(VehicleManufacturer::class)->findBy([], ['name' => 'asc']); + $mfg_list = []; + foreach ($mfgs as $mfg) + { + $mfg_list[] = [ + 'id' => $mfg->getID(), + 'name' => $mfg->getName(), + ]; + } + + $data = [ + 'manufacturers' => $mfg_list + ]; + $res->setData($data); + + return $res->getReturnResponse(); } - public function listVehicleMakes($mfg_id) + public function listVehicleMakes(Request $req, $mfg_id) { + // check required parameters and api key + $required_params = []; + $em = $this->getDoctrine()->getManager(); + $res = $this->checkParamsAndKey($req, $em, $required_params); + if ($res->isError()) + return $res->getReturnResponse(); + + // get manufacturer + $mfg = $em->getRepository(VehicleManufacturer::class)->find($mfg_id); + if ($mfg == null) + { + $res->setError(true) + ->setErrorMessage('Invalid vehicle manufacturer id'); + return $res->getReturnResponse(); + } + + // get makes + $vehicles = $mfg->getVehicles(); + $vlist = []; + foreach ($vehicles as $v) + { + $vlist[] = [ + 'id' => $v->getID(), + 'make' => $v->getMake() . ' ' . $v->getModelYearFrom() . '-' . $v->getModelYearTo(), + ]; + } + + $data = [ + 'manufacturer' => [ + 'id' => $mfg->getID(), + 'name' => $mfg->getName(), + ], + 'makes' => $vlist, + ]; + + $res->setData($data); + + return $res->getReturnResponse(); + } + + protected function checkVehicleRequirements(Request $req) + { + // check required parameters and api key + $required_params = [ + 'make_id', + 'name', + 'plate_num', + 'model_year', + 'color', + 'condition', + 'fuel_type', + ]; + $em = $this->getDoctrine()->getManager(); + $res = $this->checkParamsAndKey($req, $em, $required_params); + if ($res->isError()) + return $res; + + // TODO: check valid plate number + // TODO: check valid fuel type (gas / diesel) + // TODO: check current battery id + // TODO: check condition (brand new / second-hand) + // TODO: check is_motolite and is_active (1 or 0) + // TODO: check warranty expiration date (YYYY-MM-DD) + // TODO: check model year coverage if it fits in between + + return $res; + } + + protected function setCustomerVehicleObject(Request $req, APIResult $res, CustomerVehicle $cv) + { + $em = $this->getDoctrine()->getManager(); + + // check customer + $cust = $this->session->getCustomer(); + if ($cust == null) + { + $res->setError(true) + ->setErrorMessage('No customer information found'); + return $res; + } + + // get vehicle + $vehicle = $em->getRepository(Vehicle::class)->find($req->request->get('make_id')); + if ($vehicle == null) + { + $res->setError(true) + ->setErrorMessage('Invalid vehicle make id'); + return $res; + } + + $cv->setCustomer($cust) + ->setVehicle($vehicle) + ->setName($req->request->get('name')) + ->setPlateNumber($req->request->get('plate_num')) + ->setModelYear($req->request->get('model_year')) + ->setColor($req->request->get('color')) + ->setFuelType($req->request->get('fuel_type')) + ->setStatusCondition($req->request->get('condition')); + + // set warranty code and expiration + // TODO: check warranty requirements + if (!empty($req->request->get('wty_code'))) + $cv->setWarrantyCode($req->request->get('wty_code')); + if (!empty($req->request->get('wty_expire'))) + $cv->setWarrantyExpiration(new DateTime($req->request->get('wty_expire'))); + + // TODO: get current battery + + // is motolite + if ($req->request->get('is_motolite') == 0) + $cv->setHasMotoliteBattery(false); + else + $cv->setHasMotoliteBattery(true); + + // is active + if ($req->request->get('is_active') == 0) + $cv->setActive(false); + else + $cv->setActive(true); + + // save + $em->persist($cv); + $em->flush(); + + // data + $data = [ + 'cv_id' => $cv->getID() + ]; + $res->setData($data); + + return $res; } public function addVehicle(Request $req) { + // check requirements + $res = $this->checkVehicleRequirements($req); + if ($res->isError()) + return $res->getReturnResponse(); + + // customer vehicle + $cv = new CustomerVehicle(); + + $res = $this->setCustomerVehicleObject($req, $res, $cv); + + return $res->getReturnResponse(); } public function updateVehicle(Request $req, $id) { + // check requirements + $res = $this->checkVehicleRequirements($req); + if ($res->isError()) + return $res->getReturnResponse(); + + // get customer vehicle + $em = $this->getDoctrine()->getManager(); + $cv = $em->getRepository(CustomerVehicle::class)->find($id); + + // check if it exists + if ($cv == null) + { + $res->setError(true) + ->setErrorMessage('Vehicle does not exist'); + return $res->getReturnResponse(); + } + + // check if it's owned by customer + if ($cv->getCustomer()->getID() != $this->session->getCustomer()->getID()) + { + $res->setError(true) + ->setErrorMessage('Invalid vehicle'); + return $res->getReturnResponse(); + } + + $res = $this->setCustomerVehicleObject($req, $res, $cv); + + return $res->getReturnResponse(); } - public function listVehicles() + public function listVehicles(Request $req) { + // check required parameters and api key + $required_params = []; + $em = $this->getDoctrine()->getManager(); + $res = $this->checkParamsAndKey($req, $em, $required_params); + if ($res->isError()) + return $res->getReturnResponse(); + + // customer + $cust = $this->session->getCustomer(); + if ($cust == null) + { + $res->setError(true) + ->setErrorMessage('No customer information found'); + return $res->getReturnResponse(); + } + + // vehicles + $cv_list = []; + $cvs = $cust->getVehicles(); + foreach ($cvs as $cv) + { + $battery_id = null; + if ($cv->getCurrentBattery() != null) + $battery_id = $cv->getCurrentBattery()->getID(); + + $wty_ex = null; + if ($cv->getWarrantyExpiration() != null) + $wty_ex = $cv->getWarrantyExpiration()->format('Y-m-d'); + + $cv_list[] = [ + 'mfg_id' => $cv->getVehicle()->getManufacturer()->getID(), + 'make_id' => $cv->getVehicle()->getID(), + 'name' => $cv->getName(), + 'plate_num' => $cv->getPlateNumber(), + 'model_year' => $cv->getModelYear(), + 'color' => $cv->getColor(), + 'condition' => $cv->getStatusCondition(), + 'fuel_type' => $cv->getFuelType(), + 'wty_code' => $cv->getWarrantyCode(), + 'wty_expire' => $wty_ex, + 'curr_batt_id' => $battery_id, + 'is_motolite' => $cv->hasMotoliteBattery() ? 1 : 0, + 'is_active' => $cv->isActive() ? 1 : 0, + ]; + } + + // data + $data = [ + 'vehicles' => $cv_list + ]; + $res->setData($data); + + return $res->getReturnResponse(); } - public function listPromos() + public function listPromos(Request $req) { + // check required parameters and api key + $required_params = []; + $em = $this->getDoctrine()->getManager(); + $res = $this->checkParamsAndKey($req, $em, $required_params); + if ($res->isError()) + return $res->getReturnResponse(); + + return $res->getReturnResponse(); } public function getCompatibleBatteries(Request $req, $vid) { + // check required parameters and api key + $required_params = []; + $em = $this->getDoctrine()->getManager(); + $res = $this->checkParamsAndKey($req, $em, $required_params); + if ($res->isError()) + return $res->getReturnResponse(); + + return $res->getReturnResponse(); } public function requestJobOrder(Request $req) { + // check required parameters and api key + $required_params = []; + $em = $this->getDoctrine()->getManager(); + $res = $this->checkParamsAndKey($req, $em, $required_params); + if ($res->isError()) + return $res->getReturnResponse(); + + return $res->getReturnResponse(); } public function getEstimate(Request $req) { + // check required parameters and api key + $required_params = []; + $em = $this->getDoctrine()->getManager(); + $res = $this->checkParamsAndKey($req, $em, $required_params); + if ($res->isError()) + return $res->getReturnResponse(); + + return $res->getReturnResponse(); } } diff --git a/src/Entity/CustomerVehicle.php b/src/Entity/CustomerVehicle.php index 9e12d2a4..75cd76d1 100644 --- a/src/Entity/CustomerVehicle.php +++ b/src/Entity/CustomerVehicle.php @@ -95,7 +95,7 @@ class CustomerVehicle // link to current battery /** * @ORM\ManyToOne(targetEntity="Battery", inversedBy="cust_vehicles") - * @ORM\JoinColumn(name="battery_id", referencedColumnName="id") + * @ORM\JoinColumn(name="battery_id", referencedColumnName="id", nullable=true) */ protected $curr_battery; diff --git a/src/Ramcar/APIResult.php b/src/Ramcar/APIResult.php index e1fea610..33eb407b 100644 --- a/src/Ramcar/APIResult.php +++ b/src/Ramcar/APIResult.php @@ -57,6 +57,9 @@ class APIResult else $status = 'success'; + if (count($this->data) == 0) + $this->data = new \stdClass(); + $return_data = [ 'error' => [ 'status' => $status, @@ -66,7 +69,6 @@ class APIResult ]; $json = new JsonResponse($return_data); - $json->setEncodingOptions(JsonResponse::DEFAULT_ENCODING_OPTIONS | JSON_FORCE_OBJECT); return $json; } diff --git a/templates/customer/form.html.twig b/templates/customer/form.html.twig index 13790b3e..cfb91216 100644 --- a/templates/customer/form.html.twig +++ b/templates/customer/form.html.twig @@ -189,8 +189,8 @@
@@ -198,8 +198,8 @@