diff --git a/config/routes/rider_api.yaml b/config/routes/rider_api.yaml index 4cf98d93..2f61be21 100644 --- a/config/routes/rider_api.yaml +++ b/config/routes/rider_api.yaml @@ -39,3 +39,23 @@ rapi_payment: path: /rapi/payment controller: App\Controller\RAPIController::payment methods: [POST] + +rapi_promos: + path: /rapi/promos + controller: App\Controller\RAPIController::getPromos + methods: [GET] + +rapi_batteries: + path: /rapi/batteries + controller: App\Controller\RAPIController::getBatteries + methods: [GET] + +rapi_change_service: + path: /rapi/service + controller: App\Controller\RAPIController::changeService + methods: [POST] + +rapi_available: + path: /rapi/available + controller: App\Controller\RAPIController::available + methods: [POST] diff --git a/src/Controller/RAPIController.php b/src/Controller/RAPIController.php index 4dab01ff..2cd95f60 100644 --- a/src/Controller/RAPIController.php +++ b/src/Controller/RAPIController.php @@ -21,6 +21,7 @@ use App\Ramcar\WarrantyClass; use App\Ramcar\APIRiderStatus; use App\Ramcar\TransactionOrigin; use App\Ramcar\TradeInType; +use App\Ramcar\InvoiceStatus; use App\Service\InvoiceCreator; @@ -32,6 +33,8 @@ use App\Entity\CustomerVehicle; use App\Entity\JobOrder; use App\Entity\Promo; use App\Entity\Battery; +use App\Entity\BatteryModel; +use App\Entity\BatterySize; use App\Entity\RiderRating; use App\Entity\Rider; use App\Entity\User; @@ -62,13 +65,13 @@ class RAPIController extends Controller if ($req->getMethod() == 'GET') { $check = $req->query->get($param); - if (empty($check)) + if ($check == null) $missing[] = $param; } else if ($req->getMethod() == 'POST') { $check = $req->request->get($param); - if (empty($check)) + if ($check == null) $missing[] = $param; } else @@ -293,19 +296,44 @@ class RAPIController extends Controller $cv = $jo->getCustomerVehicle(); $v = $cv->getVehicle(); $inv = $jo->getInvoice(); + $promo = $inv->getPromo(); // invoice items $inv_items = []; foreach ($inv->getItems() as $item) { + $item_batt = $item->getBattery(); + if ($item_batt == null) + $batt_id = null; + else + $batt_id = $item_batt->getID(); + $inv_items[] = [ 'id' => $item->getID(), 'title' => $item->getTitle(), 'qty' => $item->getQuantity(), 'price' => $item->getPrice(), + 'batt_id' => $batt_id, ]; } + // promo + if ($promo != null) + { + $promo_data = [ + 'id' => $promo->getID(), + 'name' => $promo->getName(), + 'code' => $promo->getCode(), + 'discount_rate' => $promo->getDiscountRate(), + 'discount_apply' => $promo->getDiscountApply(), + ]; + } + else + { + $promo_data = null; + } + + $data = [ 'job_order' => [ 'id' => $jo->getID(), @@ -338,8 +366,7 @@ class RAPIController extends Controller 'items' => $inv_items, ], 'mode_of_payment' => $jo->getModeOfPayment(), - - + 'promo' => $promo_data, ] ]; } @@ -349,7 +376,7 @@ class RAPIController extends Controller return $res->getReturnResponse(); } - protected function checkJO(Request $req, $required_params) + protected function checkJO(Request $req, $required_params, &$jo = null) { // set jo status to in transit $em = $this->getDoctrine()->getManager(); @@ -390,7 +417,7 @@ class RAPIController extends Controller public function acceptJobOrder(Request $req) { $required_params = ['jo_id']; - $res = $this->checkJO($req, $required_params); + $res = $this->checkJO($req, $required_params, $jo); if ($res->isError()) return $res->getReturnResponse(); @@ -398,6 +425,7 @@ class RAPIController extends Controller // set jo status to in transit $jo->setStatus(JOStatus::IN_TRANSIT); + $em->flush(); // TODO: send mqtt event @@ -409,7 +437,7 @@ class RAPIController extends Controller public function cancelJobOrder(Request $req) { $required_params = ['jo_id']; - $res = $this->checkJO($req, $required_params); + $res = $this->checkJO($req, $required_params, $jo); if ($res->isError()) return $res->getReturnResponse(); @@ -417,6 +445,7 @@ class RAPIController extends Controller // set jo status to cancelled $jo->setStatus(JOStatus::CANCELLED); + $em->flush(); // TODO: send mqtt event @@ -428,7 +457,7 @@ class RAPIController extends Controller public function arrive(Request $req) { $required_params = ['jo_id']; - $res = $this->checkJO($req, $required_params); + $res = $this->checkJO($req, $required_params, $jo); if ($res->isError()) return $res->getReturnResponse(); @@ -436,6 +465,7 @@ class RAPIController extends Controller // set jo status to in progress $jo->setStatus(JOStatus::IN_PROGRESS); + $em->flush(); // TODO: send mqtt event @@ -446,8 +476,209 @@ class RAPIController extends Controller public function payment(Request $req) { + $em = $this->getDoctrine()->getManager(); + $required_params = ['jo_id']; + $res = $this->checkJO($req, $required_params, $jo); + if ($res->isError()) + return $res->getReturnResponse(); + // set invoice to paid + $jo->getInvoice()->setStatus(InvoiceStatus::PAID); // set jo status to fulfilled + $jo->setStatus(JOStatus::FULFILLED); + + $em->flush(); + + // TODO: add event + + return $res->getReturnResponse(); + } + + public function available(Request $req) + { + $em = $this->getDoctrine()->getManager(); + $required_params = []; + $res = $this->checkParamsAndKey($req, $em, $required_params); + if ($res->isError()) + return $res->getReturnResponse(); + + // make rider available + $this->session->getRider()->setAvailable(true); + + // TODO: log rider available + $em->flush(); + + return $res->getReturnResponse(); + } + + public function getPromos(Request $req) + { + $em = $this->getDoctrine()->getManager(); + $required_params = []; + $res = $this->checkParamsAndKey($req, $em, $required_params); + if ($res->isError()) + return $res->getReturnResponse(); + + $promos = $em->getRepository(Promo::class)->findAll(); + + $promo_data = []; + foreach ($promos as $promo) + { + $promo_data[] = [ + 'id' => $promo->getID(), + 'name' => $promo->getName(), + 'code' => $promo->getCode(), + ]; + } + + $data = [ + 'promos' => $promo_data, + ]; + $res->setData($data); + return $res->getReturnResponse(); + } + + public function getBatteries(Request $req) + { + // get batteries, models, and sizes + $em = $this->getDoctrine()->getManager(); + $required_params = []; + $res = $this->checkParamsAndKey($req, $em, $required_params); + if ($res->isError()) + return $res->getReturnResponse(); + + $batts = $em->getRepository(Battery::class)->findAll(); + $models = $em->getRepository(BatteryModel::class)->findAll(); + $sizes = $em->getRepository(BatterySize::class)->findAll(); + + $batt_data = []; + foreach ($batts as $batt) + { + $batt_data[] = [ + 'id' => $batt->getID(), + 'model_id' => $batt->getModel()->getID(), + 'size_id' => $batt->getSize()->getID(), + 'sell_price' => $batt->getSellingPrice(), + ]; + } + + $model_data = []; + foreach ($models as $model) + { + $model_data[] = [ + 'id' => $model->getID(), + 'name' => $model->getName(), + ]; + } + + $size_data = []; + foreach ($sizes as $size) + { + $size_data[] = [ + 'id' => $size->getID(), + 'name' => $size->getName(), + ]; + } + + $data = [ + 'batteries' => $batt_data, + 'models' => $model_data, + 'sizes' => $size_data, + ]; + + $res->setData($data); + return $res->getReturnResponse(); + } + + public function changeService(Request $req, InvoiceCreator $ic) + { + // allow rider to change service, promo, battery and trade-in options + $em = $this->getDoctrine()->getManager(); + $required_params = ['jo_id', 'stype_id', 'promo_id', 'batt_id', 'trade_in']; + $res = $this->checkJO($req, $required_params, $jo); + if ($res->isError()) + return $res->getReturnResponse(); + + // check service type + $stype_id = $req->request->get('stype_id'); + if (!ServiceType::validate($stype_id)) + { + $res->setError(true) + ->setErrorMessage('Invalid service type - ' . $stype_id); + return $res->getReturnResponse(); + } + + // check promo id + $promo_id = $req->request->get('promo_id'); + // no promo + if ($promo_id == 0) + $promo = null; + else + { + $promo = $em->getRepository(Promo::class)->find($promo_id); + if ($promo == null) + { + $res->setError(true) + ->setErrorMessage('Invalid promo id - ' . $promo_id); + return $res->getReturnResponse(); + } + } + + // check battery id + $batt_id = $req->request->get('batt_id'); + // no battery + if ($batt_id == 0) + $battery = null; + else + { + $battery = $em->getRepository(Battery::class)->find($batt_id); + if ($battery == null) + { + $res->setError(true) + ->setErrorMessage('Invalid battery id - ' . $batt_id); + return $res->getReturnResponse(); + } + } + + // check trade in + $trade_in = $req->request->get('trade_in'); + if (!TradeInType::validate($trade_in)) + $trade_in = null; + + // generate new invoice + $crit = new InvoiceCriteria(); + $crit->setServiceType($stype_id); + + if ($promo != null) + $crit->addPromo($promo); + + if ($battery != null) + { + $crit->addEntry($battery, $trade_in, 1); + error_log('adding entry for battery - ' . $battery->getID()); + } + + $invoice = $ic->processCriteria($crit); + $invoice->setStatus(InvoiceStatus::DRAFT); + + // remove previous invoice + $old_invoice = $jo->getInvoice(); + $em->remove($old_invoice); + $em->flush(); + + // save job order + $jo->setServiceType($stype_id); + + // save invoice + $jo->setInvoice($invoice); + $em->persist($invoice); + $em->flush(); + + // TODO: add event + + // TODO: send mqtt event (?) + + return $res->getReturnResponse(); } }