From ce2b838ff743d09ac06cd8dd31c6bc2cede5b7b7 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 29 May 2020 07:20:00 +0000 Subject: [PATCH 01/21] Add RAPIController for CMB. #420 --- config/cmb.services.yaml | 19 +- config/packages/security.yaml | 4 + config/resq.services.yaml | 1 + config/routes/cmb_rider_api.yaml | 66 ++++++ src/Controller/CMBRAPIController.php | 303 +++++++++++++++++++++++++++ 5 files changed, 388 insertions(+), 5 deletions(-) create mode 100644 config/routes/cmb_rider_api.yaml create mode 100644 src/Controller/CMBRAPIController.php diff --git a/config/cmb.services.yaml b/config/cmb.services.yaml index 5f24e525..1f9a6dec 100644 --- a/config/cmb.services.yaml +++ b/config/cmb.services.yaml @@ -12,6 +12,7 @@ parameters: app_access_key: 'access_keys' cvu_brand_id: "%env(CVU_BRAND_ID)%" country_code: "%env(COUNTRY_CODE)%" + api_version: "%env(API_VERSION)%" services: # default configuration for services in *this* file @@ -73,6 +74,7 @@ services: $pass: "%env(RT_PASS)%" $usage_type: "%env(RT_USAGE_TYPE)%" $shortcode: "%env(RT_SHORTCODE)%" + $dr_url: "https://resqaws.jankstudio.com/sms/delivery_receipt" App\Service\MQTTClient: arguments: @@ -167,7 +169,7 @@ services: # job order generator App\Service\JobOrderHandler\CMBJobOrderHandler: arguments: - $country_code: "%env(COUNTRY_CODE)%" + $country_code: "%env(COUNTRY_CODE)%" #job order generator interface App\Service\JobOrderHandlerInterface: "@App\\Service\\JobOrderHandler\\CMBJobOrderHandler" @@ -187,13 +189,12 @@ services: App\Service\RiderAssignmentHandlerInterface: "@App\\Service\\RiderAssignmentHandler\\CMBRiderAssignmentHandler" # rider API service - App\Service\RiderAPIHandler\CMBRiderAPIHandler: + App\Service\RiderAPIHandler\CMBRiderAPIHandler: arguments: - $country_code: "%env(COUNTRY_CODE)%" + $country_code: "%env(COUNTRY_CODE)%" - # rider API interface App\Service\RiderAPIHandlerInterface: "@App\\Service\\RiderAPIHandler\\CMBRiderAPIHandler" - + # map manager #App\Service\GISManager\Bing: ~ App\Service\GISManager\OpenStreet: ~ @@ -229,6 +230,14 @@ services: $loc_key: "%env(LOCATION_RIDER_ACTIVE_KEY)%" $status_key: "%env(STATUS_RIDER_KEY)%" + # inventory manager + App\Service\InventoryManager: + arguments: + $api_url: "%env(INVENTORY_API_URL)%" + $api_ocp_key: "%env(INVENTORY_API_OCP)%" + $api_auth_prefix: "%env(INVENTORY_API_AUTH_TOKEN_PREFIX)%" + $api_auth_token: "%env(INVENTORY_API_AUTH_TOKEN)%" + # API logging App\EventSubscriber\LogSubscriber: arguments: diff --git a/config/packages/security.yaml b/config/packages/security.yaml index 4339eba4..86a9b1d7 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -46,6 +46,10 @@ security: provider: api_key_user_provider user_checker: Catalyst\AuthBundle\Service\UserChecker + cmb_rider_api: + pattern: ^\/cmbrapi\/ + security: false + main: provider: user_provider form_login: diff --git a/config/resq.services.yaml b/config/resq.services.yaml index 82eb4cc5..05fd3b1a 100644 --- a/config/resq.services.yaml +++ b/config/resq.services.yaml @@ -74,6 +74,7 @@ services: $pass: "%env(RT_PASS)%" $usage_type: "%env(RT_USAGE_TYPE)%" $shortcode: "%env(RT_SHORTCODE)%" + $dr_url: "https://resqaws.jankstudio.com/sms/delivery_receipt" App\Service\MQTTClient: arguments: diff --git a/config/routes/cmb_rider_api.yaml b/config/routes/cmb_rider_api.yaml new file mode 100644 index 00000000..6f479913 --- /dev/null +++ b/config/routes/cmb_rider_api.yaml @@ -0,0 +1,66 @@ +# rider app api + +cmb_rapi_register: + path: /cmbrapi/register + controller: App\Controller\CMBRAPIController::register + methods: [POST] + +cmb_rapi_login: + path: /cmbrapi/login + controller: App\Controller\CMBRAPIController::login + methods: [POST] + +cmb_rapi_logout: + path: /cmbrapi/logout + controller: App\Controller\CMBRAPIController::logout + methods: [POST] + +cmb_rapi_jo_get: + path: /cmbrapi/joborder + controller: App\Controller\CMBRAPIController::getJobOrder + methods: [GET] + +cmb_rapi_jo_accept: + path: /cmbrapi/accept + controller: App\Controller\CMBRAPIController::acceptJobOrder + methods: [POST] + +cmb_rapi_jo_cancel: + path: /cmbrapi/cancel + controller: App\Controller\CMBRAPIController::cancelJobOrder + methods: [POST] + +cmb_rapi_arrive: + path: /cmbrapi/arrive + controller: App\Controller\CMBRAPIController::arrive + methods: [POST] + +cmb_rapi_payment: + path: /cmbrapi/payment + controller: App\Controller\CMBRAPIController::payment + methods: [POST] + +cmb_rapi_hub_arrive: + path: /cmbrapi/hub_arrive + controller: App\Controller\CMBRAPIController::hubArrive + methods: [POST] + +cmb_rapi_promos: + path: /cmbrapi/promos + controller: App\Controller\CMBRAPIController::getPromos + methods: [GET] + +cmb_rapi_batteries: + path: /cmbrapi/batteries + controller: App\Controller\CMBRAPIController::getBatteries + methods: [GET] + +cmb_rapi_change_service: + path: /cmbrapi/service + controller: App\Controller\CMBRAPIController::changeService + methods: [POST] + +cmb_rapi_available: + path: /cmbrapi/available + controller: App\Controller\CMBRAPIController::available + methods: [POST] diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php new file mode 100644 index 00000000..94f51f17 --- /dev/null +++ b/src/Controller/CMBRAPIController.php @@ -0,0 +1,303 @@ +register($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function login(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->login($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function logout(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->logout($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function getJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->getJobOrder($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function acceptJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->acceptJobOrder($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function cancelJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->cancelJobOrder($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + + } + + public function arrive(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->arrive($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function hubArrive(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->hubArrive($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function payment(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->payment($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function available(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->available($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function getPromos(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->getPromos($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function getBatteries(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->getBatteries($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function changeService(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->changeService($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } +} From 2ea5bfe19333a25aa286ea0e418ee7aec9b0a787 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 1 Jun 2020 02:26:04 +0000 Subject: [PATCH 02/21] Add changes to CMB's rider API handler. #420 --- .../RiderAPIHandler/CMBRiderAPIHandler.php | 59 ++++++++++--------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 3c0236e1..d912635e 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -6,8 +6,8 @@ use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface; -use App\Ramcar\CMBServiceType; -use App\Ramcar\CMBTradeInType; +use App\Ramcar\ServiceType; +use App\Ramcar\TradeInType; use App\Ramcar\JOStatus; use App\Ramcar\JOEventType; use App\Ramcar\InvoiceStatus; @@ -30,7 +30,6 @@ use App\Entity\Promo; use App\Entity\Battery; use App\Entity\BatteryModel; use App\Entity\BatterySize; -use App\Entity\Warranty; use DateTime; @@ -484,7 +483,9 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } - // TODO: tag rider as available + // tag rider as available + $rider = $this->session->getRider(); + $rider->setAvailable(true); $this->em->flush(); @@ -516,7 +517,8 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface ->setRider($rider); $this->em->persist($event); - // TODO: tag rider as unavailable + // tag rider as unavailable + $rider->setAvailable(false); // save to customer vehicle battery record $this->jo_handler->updateVehicleBattery($jo); @@ -526,41 +528,40 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // create warranty if($this->jo_handler->checkIfNewBattery($jo)) { - $serial = $jo->getCustomerVehicle()->getWarrantyCode(); + $serial = null; $warranty_class = $jo->getWarrantyClass(); $first_name = $jo->getCustomer()->getFirstName(); $last_name = $jo->getCustomer()->getLastName(); $mobile_number = $jo->getCustomer()->getPhoneMobile(); // check if date fulfilled is null - if ($jo->getDateFulfill() == null) - $date_purchase = $jo->getDateCreate(); - else - $date_purchase = $jo->getDateFulfill(); + //if ($jo->getDateFulfill() == null) + // $date_purchase = $jo->getDateCreate(); + //else + // $date_purchase = $jo->getDateFulfill(); - // validate plate number - // $plate_number = $this->wh->cleanPlateNumber($jo->getCustomerVehicle()->getPlateNumber()); - $plate_number = Warranty::cleanPlateNumber($jo->getCustomerVehicle()->getPlateNumber()); - if ($plate_number != false) + // use date_schedule for warranty expiration computation + $date_purchase = $jo->getDateSchedule(); + + $plate_number = $this->wh->cleanPlateNumber($jo->getCustomerVehicle()->getPlateNumber()); + + $batt_list = array(); + $invoice = $jo->getInvoice(); + if (!empty($invoice)) { - $batt_list = array(); - $invoice = $jo->getInvoice(); - if (!empty($invoice)) + // get battery + $invoice_items = $invoice->getItems(); + foreach ($invoice_items as $item) { - // get battery - $invoice_items = $invoice->getItems(); - foreach ($invoice_items as $item) + $battery = $item->getBattery(); + if ($battery != null) { - $battery = $item->getBattery(); - if ($battery != null) - { - $batt_list[] = $item->getBattery(); - } + $batt_list[] = $item->getBattery(); } } - - $this->wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class); } + + $this->wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class); } // send mqtt event (fulfilled) @@ -685,7 +686,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // check service type $stype_id = $req->request->get('stype_id'); - if (!CMBServiceType::validate($stype_id)) + if (!ServiceType::validate($stype_id)) { $data = [ 'error' => 'Invalid service type - ' . $stype_id @@ -750,7 +751,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // check trade in $trade_in = $req->request->get('trade_in'); - if (!CMBTradeInType::validate($trade_in)) + if (!TradeInType::validate($trade_in)) $trade_in = null; // check mode of payment From 8730ab4ea3f5bed7d58a4f9ed4994ae75228a273 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 1 Jun 2020 04:37:12 +0000 Subject: [PATCH 03/21] Add viewJobOrderHistory API call to rider api. #420 --- config/routes/cmb_rider_api.yaml | 5 + src/Controller/CMBRAPIController.php | 23 +++ .../RiderAPIHandler/CMBRiderAPIHandler.php | 152 ++++++++++++++++++ 3 files changed, 180 insertions(+) diff --git a/config/routes/cmb_rider_api.yaml b/config/routes/cmb_rider_api.yaml index 6f479913..75380c9d 100644 --- a/config/routes/cmb_rider_api.yaml +++ b/config/routes/cmb_rider_api.yaml @@ -64,3 +64,8 @@ cmb_rapi_available: path: /cmbrapi/available controller: App\Controller\CMBRAPIController::available methods: [POST] + +cmb_rapi_jo_history_view: + path: /cmbrapi/joborderhistory + controller: App\Controller\CMBRAPIController::viewJobOrderHistory + methods: [GET] diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php index 94f51f17..57fa5977 100644 --- a/src/Controller/CMBRAPIController.php +++ b/src/Controller/CMBRAPIController.php @@ -300,4 +300,27 @@ class CMBRAPIController extends Controller // response return $res->getReturnResponse(); } + + public function viewJobOrderHistory(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->getJobOrderHistory($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + + } } diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index d912635e..14b9ca21 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -30,6 +30,7 @@ use App\Entity\Promo; use App\Entity\Battery; use App\Entity\BatteryModel; use App\Entity\BatterySize; +use App\Entity\JobOrder; use DateTime; @@ -243,6 +244,157 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + public function getJobOrderHistory(Request $req) + { + $required_params = []; + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + return $data; + + // are we logged in? + if (!$this->session->hasRider()) + { + $data = [ + 'error' => 'No logged in rider.' + ]; + return $data; + } + + $rider = $this->session->getRider(); + + // get JOs assigned to rider for the month given + // TODO: what date to use + // for now, using date_schedule + // setup start date and end dates + // get current year + $month = $req->query->get('month'); + + $current_date = new DateTime(); + $current_year = $current_date->format('Y'); + + // get number of days in month requested + $last_day = cal_days_in_month(CAL_GREGORIAN, $month, $current_year); + + $s_date = $current_year . '-' . $month . '-01 00:00:00'; + $e_date = $current_year . '-' . $month . '-' . $last_day . ' 23:59:59'; + + $qb = $this->em->getRepository(JobOrder::class)->createQueryBuilder('j'); + + $query = $qb->innerJoin('j.rider', 'r') + ->where('j.date_schedule >= :start') + ->andWhere('j.date_schedule <= :end') + ->andWhere('r.id = :rider_id') + ->setParameter('start', $s_date) + ->setParameter('end', $e_date) + ->setParameter('rider_id', $rider->getID()) + ->getQuery(); + + $jo_results = $query->getResult(); + + $jo_data = []; + + if (!(empty($jo_results))) + { + foreach ($jo_results as $jo) + { + $coord = $jo->getCoordinates(); + $cust = $jo->getCustomer(); + $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; + } + + $trade_in_type = $jo->getTradeInType(); + if (empty($trade_in_type)) + $trade_in_type = 'none'; + + $jo_data[] = [ + 'job_order' => [ + 'id' => $jo->getID(), + 'service_type' => $jo->getServiceType(), + 'date_schedule' => $jo->getDateSchedule()->format('Ymd H:i:s'), + 'longitude' => $coord->getLongitude(), + 'latitude' => $coord->getLatitude(), + 'status' => $jo->getStatus(), + 'customer' => [ + 'title' => $cust->getTitle(), + 'first_name' => $cust->getFirstName(), + 'last_name' => $cust->getLastName(), + 'phone_mobile' => $this->country_code . $cust->getPhoneMobile(), + ], + 'vehicle' => [ + 'manufacturer' => $v->getManufacturer()->getName(), + 'make' => $v->getMake(), + 'model' => $cv->getModelYear(), + 'plate_number' => $cv->getPlateNumber(), + 'color' => $cv->getColor(), + ], + 'or_num' => $jo->getORNum(), + 'or_name' => $jo->getORName(), + 'delivery_instructions' => $jo->getDeliveryInstructions(), + 'delivery_address' => $jo->getDeliveryAddress(), + 'landmark' => $jo->getLandmark(), + 'invoice' => [ + 'discount' => $inv->getDiscount(), + 'trade_in' => $inv->getTradeIn(), + 'total_price' => $inv->getTotalPrice(), + 'vat' => $inv->getVat(), + 'items' => $inv_items, + ], + 'mode_of_payment' => $jo->getModeOfPayment(), + 'trade_in_type' => $trade_in_type, + 'promo' => $promo_data, + // TODO: load the actual + 'has_warranty_doc' => false, + 'flag_coolant' => $jo->hasCoolant(), + 'has_motolite' => $cv->hasMotoliteBattery(), + ] + ]; + } + } + + $data = [ + 'jo_history' => $jo_data, + ]; + + return $data; + } + public function getJobOrder(Request $req) { // get the job order of the rider assigned to this session From 1842898c11ebcd3191297178fe2d7c2b591ffd5c Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 1 Jun 2020 06:29:11 +0000 Subject: [PATCH 04/21] Add viewActiveJobOrders API call. #420 --- config/routes/cmb_rider_api.yaml | 5 + src/Controller/CMBRAPIController.php | 24 ++++ .../RiderAPIHandler/CMBRiderAPIHandler.php | 133 ++++++++++++++++++ 3 files changed, 162 insertions(+) diff --git a/config/routes/cmb_rider_api.yaml b/config/routes/cmb_rider_api.yaml index 75380c9d..c57504db 100644 --- a/config/routes/cmb_rider_api.yaml +++ b/config/routes/cmb_rider_api.yaml @@ -69,3 +69,8 @@ cmb_rapi_jo_history_view: path: /cmbrapi/joborderhistory controller: App\Controller\CMBRAPIController::viewJobOrderHistory methods: [GET] + +cmb_rapi_active_jo_get: + path: /cmbrapi/activejoborders + controller: App\Controller\CMBRAPIController::viewActiveJobOrders + methods: [GET] diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php index 57fa5977..1aea2f9b 100644 --- a/src/Controller/CMBRAPIController.php +++ b/src/Controller/CMBRAPIController.php @@ -323,4 +323,28 @@ class CMBRAPIController extends Controller return $res->getReturnResponse(); } + + public function viewActiveJobOrders(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->getActiveJobOrders($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + + } + } diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 14b9ca21..c59308ca 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -395,6 +395,139 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + public function getActiveJobOrders(Request $req) + { + $required_params = []; + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + return $data; + + // are we logged in? + if (!$this->session->hasRider()) + { + $data = [ + 'error' => 'No logged in rider.' + ]; + return $data; + } + + $rider = $this->session->getRider(); + + $qb = $this->em->getRepository(JobOrder::class)->createQueryBuilder('j'); + + $query = $qb->innerJoin('j.rider', 'r') + ->andWhere('r.id = :rider_id') + ->andWhere('j.status = :status') + ->setParameter('rider_id', $rider->getID()) + ->setParameter('status', JOStatus::ASSIGNED) + ->getQuery(); + + $jo_results = $query->getResult(); + + $jo_data = []; + + if (!(empty($jo_results))) + { + foreach ($jo_results as $jo) + { + $coord = $jo->getCoordinates(); + $cust = $jo->getCustomer(); + $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; + } + + $trade_in_type = $jo->getTradeInType(); + if (empty($trade_in_type)) + $trade_in_type = 'none'; + + $jo_data[] = [ + 'job_order' => [ + 'id' => $jo->getID(), + 'service_type' => $jo->getServiceType(), + 'date_schedule' => $jo->getDateSchedule()->format('Ymd H:i:s'), + 'longitude' => $coord->getLongitude(), + 'latitude' => $coord->getLatitude(), + 'status' => $jo->getStatus(), + 'customer' => [ + 'title' => $cust->getTitle(), + 'first_name' => $cust->getFirstName(), + 'last_name' => $cust->getLastName(), + 'phone_mobile' => $this->country_code . $cust->getPhoneMobile(), + ], + 'vehicle' => [ + 'manufacturer' => $v->getManufacturer()->getName(), + 'make' => $v->getMake(), + 'model' => $cv->getModelYear(), + 'plate_number' => $cv->getPlateNumber(), + 'color' => $cv->getColor(), + ], + 'or_num' => $jo->getORNum(), + 'or_name' => $jo->getORName(), + 'delivery_instructions' => $jo->getDeliveryInstructions(), + 'delivery_address' => $jo->getDeliveryAddress(), + 'landmark' => $jo->getLandmark(), + 'invoice' => [ + 'discount' => $inv->getDiscount(), + 'trade_in' => $inv->getTradeIn(), + 'total_price' => $inv->getTotalPrice(), + 'vat' => $inv->getVat(), + 'items' => $inv_items, + ], + 'mode_of_payment' => $jo->getModeOfPayment(), + 'trade_in_type' => $trade_in_type, + 'promo' => $promo_data, + // TODO: load the actual + 'has_warranty_doc' => false, + 'flag_coolant' => $jo->hasCoolant(), + 'has_motolite' => $cv->hasMotoliteBattery(), + ] + ]; + } + } + + $data = [ + 'active_jos' => $jo_data, + ]; + + return $data; + } + public function getJobOrder(Request $req) { // get the job order of the rider assigned to this session From 2ea0111b1e9ee7389f03015e290625c3e15f5217 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 1 Jun 2020 09:15:05 +0000 Subject: [PATCH 05/21] Add generate invoice API call. #420 --- config/routes/cmb_rider_api.yaml | 10 ++ src/Controller/CMBRAPIController.php | 47 +++++++++ .../RiderAPIHandler/CMBRiderAPIHandler.php | 95 +++++++++++++++++++ 3 files changed, 152 insertions(+) diff --git a/config/routes/cmb_rider_api.yaml b/config/routes/cmb_rider_api.yaml index c57504db..9fc445d8 100644 --- a/config/routes/cmb_rider_api.yaml +++ b/config/routes/cmb_rider_api.yaml @@ -74,3 +74,13 @@ cmb_rapi_active_jo_get: path: /cmbrapi/activejoborders controller: App\Controller\CMBRAPIController::viewActiveJobOrders methods: [GET] + +cmb_rapi_jo_in_transit: + path: /cmbrapi/joborderintransit + controller: App\Controller\CMBRAPIController::setJobOrderInTransit + methods: [POST] + +cmb_rapi_invoice_generate: + path: /cmbrapi/generateinvoice + controller: App\Controller\CMBRAPIController::generateInvoice + methods: [GET] diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php index 1aea2f9b..25ee257b 100644 --- a/src/Controller/CMBRAPIController.php +++ b/src/Controller/CMBRAPIController.php @@ -346,5 +346,52 @@ class CMBRAPIController extends Controller return $res->getReturnResponse(); } + + public function setJobOrderInTransit(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->setJobOrderInTransit($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + + } + + public function generateInvoice(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->generateInvoice($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + + } + } diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index c59308ca..d05f8b78 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -268,6 +268,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // setup start date and end dates // get current year $month = $req->query->get('month'); + $year = $req->query->get('year'); $current_date = new DateTime(); $current_year = $current_date->format('Y'); @@ -678,6 +679,35 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + public function setJobOrderInTransit(Request $req) + { + $required_params = ['jo_id']; + $data = $this->checkJO($req, $required_params, $jo); + if (isset($data['error'])) + return $data; + + // TODO: it's the same status as acceptJobOrder + // do we add a new JOStatus? + // set jo status to in transit + $jo->setStatus(JOStatus::IN_TRANSIT); + + // TODO: send mqtt event (?) + + // add event log + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_ACCEPT) + ->setJobOrder($jo) + ->setRider($rider); + $this->em->persist($event); + + $this->em->flush(); + + return $data; + + } + public function cancelJobOrder(Request $req) { $required_params = ['jo_id']; @@ -1089,6 +1119,71 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + public function generateInvoice(Request $req) + { + $required_params = ['jo_id']; + $data = $this->checkJO($req, $required_params, $jo); + if (isset($data['error'])) + return $data; + + $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; + } + + $trade_in_type = $jo->getTradeInType(); + if (empty($trade_in_type)) + $trade_in_type = 'none'; + + $data = [ + 'invoice' => [ + 'id' => $inv->getID(), + 'discount' => $inv->getDiscount(), + 'trade_in' => $inv->getTradeIn(), + 'total_price' => $inv->getTotalPrice(), + 'vat' => $inv->getVat(), + 'items' => $inv_items, + 'trade_in_type' => $trade_in_type, + 'promo' => $promo_data, + ] + ]; + + return $data; + } + protected function checkMissingParameters(Request $req, $params = []) { $missing = []; From af9be59d8df2b12ad35049711ced70540bc8984a Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 1 Jun 2020 09:30:28 +0000 Subject: [PATCH 06/21] Change getActiveJobOrders to getAssignedJobOrders. #421 --- config/routes/cmb_rider_api.yaml | 6 +++--- src/Controller/CMBRAPIController.php | 4 ++-- src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/config/routes/cmb_rider_api.yaml b/config/routes/cmb_rider_api.yaml index 9fc445d8..44e01b79 100644 --- a/config/routes/cmb_rider_api.yaml +++ b/config/routes/cmb_rider_api.yaml @@ -70,9 +70,9 @@ cmb_rapi_jo_history_view: controller: App\Controller\CMBRAPIController::viewJobOrderHistory methods: [GET] -cmb_rapi_active_jo_get: - path: /cmbrapi/activejoborders - controller: App\Controller\CMBRAPIController::viewActiveJobOrders +cmb_rapi_assigned_jo_get: + path: /cmbrapi/assignedjoborders + controller: App\Controller\CMBRAPIController::getAssignedJobOrders methods: [GET] cmb_rapi_jo_in_transit: diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php index 25ee257b..c92f7d4c 100644 --- a/src/Controller/CMBRAPIController.php +++ b/src/Controller/CMBRAPIController.php @@ -324,11 +324,11 @@ class CMBRAPIController extends Controller } - public function viewActiveJobOrders(Request $req, RiderAPIHandlerInterface $rapi_handler) + public function getAssignedJobOrders(Request $req, RiderAPIHandlerInterface $rapi_handler) { $res = new APIResult(); - $data = $rapi_handler->getActiveJobOrders($req); + $data = $rapi_handler->getAssignedJobOrders($req); if (isset($data['error'])) { diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index d05f8b78..09982977 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -396,7 +396,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } - public function getActiveJobOrders(Request $req) + public function getAssignedJobOrders(Request $req) { $required_params = []; $data = $this->checkParamsAndKey($req, $required_params); @@ -523,7 +523,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface } $data = [ - 'active_jos' => $jo_data, + 'assigned_jos' => $jo_data, ]; return $data; From dbdde5cdde2f410ca5021da9f9a6b33dcd8ca420 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 2 Jun 2020 03:40:55 +0000 Subject: [PATCH 07/21] Change which flag is set when rider logs in and logs out. Add goOnline and goOffline API calls. #421 --- config/routes/cmb_rider_api.yaml | 11 +++++ src/Controller/CMBRAPIController.php | 43 +++++++++++++++++++ .../RiderAPIHandler/CMBRiderAPIHandler.php | 42 +++++++++++++++++- 3 files changed, 95 insertions(+), 1 deletion(-) diff --git a/config/routes/cmb_rider_api.yaml b/config/routes/cmb_rider_api.yaml index 44e01b79..4ea959ed 100644 --- a/config/routes/cmb_rider_api.yaml +++ b/config/routes/cmb_rider_api.yaml @@ -84,3 +84,14 @@ cmb_rapi_invoice_generate: path: /cmbrapi/generateinvoice controller: App\Controller\CMBRAPIController::generateInvoice methods: [GET] + +cmb_rapi_online: + path: /cmbrapi/online + controller: App\Controller\CMBRAPIController::goOnline + methods: [POST] + +cmb_rapi_offline: + path: /cmbrapi/offline + controller: App\Controller\CMBRAPIController::goOffline + methods: [POST] + diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php index c92f7d4c..adfe89a2 100644 --- a/src/Controller/CMBRAPIController.php +++ b/src/Controller/CMBRAPIController.php @@ -393,5 +393,48 @@ class CMBRAPIController extends Controller } + public function goOnline(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->goOnline($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function goOffline(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->goOffline($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } } diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 09982977..8b60e412 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -36,6 +36,8 @@ use DateTime; class CMBRiderAPIHandler implements RiderAPIHandlerInterface { + // NOTE: Rider's constructor sets flag_available and flag_active to true, by default. + protected $em; protected $redis; protected $ef; @@ -177,7 +179,8 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // assign rider to session $this->session->setRider($rider); - $rider->setAvailable(true); + //$rider->setAvailable(true); + $rider->setActive(true); $rider_id = $rider->getID(); // cache rider location (default to hub) @@ -229,7 +232,9 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // make rider unavailable $rider = $this->session->getRider(); + $rider->setAvailable(false); + $rider->setActive(false); // remove from cache $this->rcache->removeActiveRider($rider->getID()); @@ -244,6 +249,41 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + public function goOnline(Request $req) + { + $required_params = []; + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + return $data; + + // set rider to available to take on JOs + $rider = $this->session->getRider(); + + $rider->setAvailable(true); + + $this->em->flush(); + + return $data; + } + + public function goOffline(Request $req) + { + $required_params = []; + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + return $data; + + // set rider to unavailable to take on JOs + $rider = $this->session->getRider(); + + $rider->setAvailable(false); + + $this->em->flush(); + + return $data; + + } + public function getJobOrderHistory(Request $req) { $required_params = []; From e74d4061ba0ac8f4ff41fc61b80e8fe8d561c49e Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 2 Jun 2020 04:27:10 +0000 Subject: [PATCH 08/21] Add checking for assigned rider for JO for getJobOrder. #421 --- .../RiderAPIHandler/CMBRiderAPIHandler.php | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 8b60e412..7a506492 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -571,8 +571,9 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface public function getJobOrder(Request $req) { - // get the job order of the rider assigned to this session - $required_params = []; + $required_params = [ + 'jo_id' + ]; $data = $this->checkParamsAndKey($req, $required_params); if (isset($data['error'])) return $data; @@ -588,8 +589,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $rider = $this->session->getRider(); - // do we have a job order? - $jo = $rider->getActiveJobOrder(); + // get jo + $jo_id = $req->query->get('jo_id'); + + $jo = $this->em->getRepository(JobOrder::class)->find($jo_id); if ($jo == null) { $data = [ @@ -598,6 +601,23 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface } else { + if ($jo->getRider() == null) + { + $data = [ + 'error' => 'Job order selected has no rider assigned.' + ]; + return $data; + } + + // check if rider is assigned to JO + if ($rider->getID() != $jo->getRider()->getID()) + { + $data = [ + 'error' => 'Job order selected is not assigned to rider' + ]; + return $data; + } + $coord = $jo->getCoordinates(); $cust = $jo->getCustomer(); $cv = $jo->getCustomerVehicle(); @@ -615,7 +635,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface else $batt_id = $item_batt->getID(); - $inv_items[] = [ + $inv_items[] = [ 'id' => $item->getID(), 'title' => $item->getTitle(), 'qty' => $item->getQuantity(), From ce0240d0017c451b0dece34b296850ca3384e4a2 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 2 Jun 2020 06:35:31 +0000 Subject: [PATCH 09/21] Add event types for CMB. Add JO in transit API call. #421 --- src/Ramcar/CMBJOEventType.php | 32 +++++++++++++++++++ .../RiderAPIHandler/CMBRiderAPIHandler.php | 18 +++++------ 2 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 src/Ramcar/CMBJOEventType.php diff --git a/src/Ramcar/CMBJOEventType.php b/src/Ramcar/CMBJOEventType.php new file mode 100644 index 00000000..ba8126ac --- /dev/null +++ b/src/Ramcar/CMBJOEventType.php @@ -0,0 +1,32 @@ + 'Created', + 'hub_assign' => 'Assigned to Hub', + 'rider_assign' => 'Assigned Rider', + 'cancel' => 'Cancelled', + 'fulfill' => 'Fulfilled', + 'open_edit' => 'Open Edit', + 'requeue' => 'Requeue', + 'accept' => 'Rider Accept', + 'rider_in_transit' => 'Rider in Transit', + 'arrive' => 'Rider Arrive', + 'rider_edit' => 'Rider Edit', + ]; +} diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 7a506492..2e3bc064 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -9,7 +9,7 @@ use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface; use App\Ramcar\ServiceType; use App\Ramcar\TradeInType; use App\Ramcar\JOStatus; -use App\Ramcar\JOEventType; +use App\Ramcar\CMBJOEventType; use App\Ramcar\InvoiceStatus; use App\Ramcar\ModeOfPayment; use App\Ramcar\InvoiceCriteria; @@ -721,7 +721,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // TODO: refactor this into a jo handler class, so we don't have to repeat for control center // set jo status to in transit - $jo->setStatus(JOStatus::IN_TRANSIT); + //$jo->setStatus(JOStatus::IN_TRANSIT); // TODO: send mqtt event (?) @@ -729,7 +729,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $rider = $this->session->getRider(); $event = new JOEvent(); $event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::RIDER_ACCEPT) + ->setTypeID(CMBJOEventType::RIDER_ACCEPT) ->setJobOrder($jo) ->setRider($rider); $this->em->persist($event); @@ -746,8 +746,6 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface if (isset($data['error'])) return $data; - // TODO: it's the same status as acceptJobOrder - // do we add a new JOStatus? // set jo status to in transit $jo->setStatus(JOStatus::IN_TRANSIT); @@ -757,7 +755,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $rider = $this->session->getRider(); $event = new JOEvent(); $event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::RIDER_ACCEPT) + ->setTypeID(CMBJOEventType::RIDER_IN_TRANSIT) ->setJobOrder($jo) ->setRider($rider); $this->em->persist($event); @@ -783,7 +781,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $rider = $this->session->getRider(); $event = new JOEvent(); $event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::REQUEUE) + ->setTypeID(CMBJOEventType::REQUEUE) ->setJobOrder($jo) ->setRider($rider); $this->em->persist($event); @@ -817,7 +815,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $rider = $this->session->getRider(); $event = new JOEvent(); $event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::RIDER_ARRIVE) + ->setTypeID(CMBJOEventType::RIDER_ARRIVE) ->setJobOrder($jo) ->setRider($rider); $this->em->persist($event); @@ -887,7 +885,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $rider = $this->session->getRider(); $event = new JOEvent(); $event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::FULFILL) + ->setTypeID(CMBJOEventType::FULFILL) ->setJobOrder($jo) ->setRider($rider); $this->em->persist($event); @@ -1168,7 +1166,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $rider = $this->session->getRider(); $event = new JOEvent(); $event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::RIDER_EDIT) + ->setTypeID(CMBJOEventType::RIDER_EDIT) ->setJobOrder($jo) ->setRider($rider); $this->em->persist($event); From 22c1fab15ca28aaa5e56ea4985d5aa8d08a7129d Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 2 Jun 2020 07:41:47 +0000 Subject: [PATCH 10/21] Add generateInvoice API call. #421 --- .../RiderAPIHandler/CMBRiderAPIHandler.php | 87 +++++++++++-------- 1 file changed, 50 insertions(+), 37 deletions(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 2e3bc064..39314fd9 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -1180,54 +1180,66 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface public function generateInvoice(Request $req) { $required_params = ['jo_id']; - $data = $this->checkJO($req, $required_params, $jo); + $data = $this->checkParamsAndKey($req, $required_params); if (isset($data['error'])) return $data; - $inv = $jo->getInvoice(); - $promo = $inv->getPromo(); + // get jo + $jo_id = $req->query->get('jo_id'); - // invoice items - $inv_items = []; - foreach ($inv->getItems() as $item) + $jo = $this->em->getRepository(JobOrder::class)->find($jo_id); + if ($jo == null) { - $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(), + $data = [ + 'invoice' => null ]; } else { - $promo_data = null; - } + $inv = $jo->getInvoice(); + $promo = $inv->getPromo(); - $trade_in_type = $jo->getTradeInType(); - if (empty($trade_in_type)) - $trade_in_type = 'none'; + // 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(); - $data = [ - 'invoice' => [ + $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; + } + + $trade_in_type = $jo->getTradeInType(); + if (empty($trade_in_type)) + $trade_in_type = 'none'; + + $data = [ + 'invoice' => [ 'id' => $inv->getID(), 'discount' => $inv->getDiscount(), 'trade_in' => $inv->getTradeIn(), @@ -1238,6 +1250,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface 'promo' => $promo_data, ] ]; + } return $data; } From 79b19a61f6f84fa1a8261f9e25425fb9333896b9 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 2 Jun 2020 08:03:31 +0000 Subject: [PATCH 11/21] Add startJobOrder API call. Add RIDER_START event type. #421 --- config/routes/cmb_rider_api.yaml | 6 +++++ src/Controller/CMBRAPIController.php | 23 +++++++++++++++++++ src/Ramcar/CMBJOEventType.php | 2 ++ .../RiderAPIHandler/CMBRiderAPIHandler.php | 21 +++++++++++++++++ 4 files changed, 52 insertions(+) diff --git a/config/routes/cmb_rider_api.yaml b/config/routes/cmb_rider_api.yaml index 4ea959ed..8a6d6781 100644 --- a/config/routes/cmb_rider_api.yaml +++ b/config/routes/cmb_rider_api.yaml @@ -95,3 +95,9 @@ cmb_rapi_offline: controller: App\Controller\CMBRAPIController::goOffline methods: [POST] +cmb_rapi_jo_start: + path: /cmbrapi/joborderstart + controller: App\Controller\CMBRAPIController::startJobOrder + methods: [POST] + + diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php index adfe89a2..807af382 100644 --- a/src/Controller/CMBRAPIController.php +++ b/src/Controller/CMBRAPIController.php @@ -437,4 +437,27 @@ class CMBRAPIController extends Controller return $res->getReturnResponse(); } + public function startJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->startJobOrder($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + } diff --git a/src/Ramcar/CMBJOEventType.php b/src/Ramcar/CMBJOEventType.php index ba8126ac..63d48610 100644 --- a/src/Ramcar/CMBJOEventType.php +++ b/src/Ramcar/CMBJOEventType.php @@ -14,6 +14,7 @@ class CMBJOEventType extends NameValue const RIDER_ACCEPT = 'accept'; const RIDER_IN_TRANSIT = 'rider_in_transit'; const RIDER_ARRIVE = 'arrive'; + const RIDER_START = 'rider_start'; const RIDER_EDIT = 'rider_edit'; const COLLECTION = [ @@ -27,6 +28,7 @@ class CMBJOEventType extends NameValue 'accept' => 'Rider Accept', 'rider_in_transit' => 'Rider in Transit', 'arrive' => 'Rider Arrive', + 'start' => 'Rider Start', 'rider_edit' => 'Rider Edit', ]; } diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 39314fd9..d7cd6629 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -1255,6 +1255,27 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + public function startJobOrder(Request $req) + { + $required_params = ['jo_id']; + $data = $this->checkJO($req, $required_params, $jo); + if (isset($data['error'])) + return $data; + + // add event log + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(CMBJOEventType::RIDER_START) + ->setJobOrder($jo) + ->setRider($rider); + $this->em->persist($event); + + $this->em->flush(); + + return $data; + } + protected function checkMissingParameters(Request $req, $params = []) { $missing = []; From 0e69eb4943b79a080cb8c8149bfba095287c4993 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 2 Jun 2020 09:25:43 +0000 Subject: [PATCH 12/21] Add completeJobOrder and setActiveJobOrder API calls. #421 --- config/routes/cmb_rider_api.yaml | 8 ++ src/Controller/CMBRAPIController.php | 44 +++++++++++ src/Ramcar/CMBJOEventType.php | 6 +- .../RiderAPIHandler/CMBRiderAPIHandler.php | 79 +++++++++++++++++++ 4 files changed, 135 insertions(+), 2 deletions(-) diff --git a/config/routes/cmb_rider_api.yaml b/config/routes/cmb_rider_api.yaml index 8a6d6781..947134a5 100644 --- a/config/routes/cmb_rider_api.yaml +++ b/config/routes/cmb_rider_api.yaml @@ -100,4 +100,12 @@ cmb_rapi_jo_start: controller: App\Controller\CMBRAPIController::startJobOrder methods: [POST] +cmb_rapi_jo_complete: + path: /cmbrapi/jobordercomplete + controller: App\Controller\CMBRAPIController::completeJobOrder + methods: [POST] +cmb_rapi_jo_set_active: + path: /cmbrapi/joborderactive + controller: App\Controller\CMBRAPIController::setActiveJobOrder + methods: [POST] diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php index 807af382..f712361e 100644 --- a/src/Controller/CMBRAPIController.php +++ b/src/Controller/CMBRAPIController.php @@ -459,5 +459,49 @@ class CMBRAPIController extends Controller return $res->getReturnResponse(); } + public function completeJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->completeJobOrder($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function setActiveJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->setActiveJobOrder($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + } diff --git a/src/Ramcar/CMBJOEventType.php b/src/Ramcar/CMBJOEventType.php index 63d48610..b789ad08 100644 --- a/src/Ramcar/CMBJOEventType.php +++ b/src/Ramcar/CMBJOEventType.php @@ -14,7 +14,8 @@ class CMBJOEventType extends NameValue const RIDER_ACCEPT = 'accept'; const RIDER_IN_TRANSIT = 'rider_in_transit'; const RIDER_ARRIVE = 'arrive'; - const RIDER_START = 'rider_start'; + const RIDER_START = 'rider_start'; + const RIDER_COMPLETE = 'rider_complete'; const RIDER_EDIT = 'rider_edit'; const COLLECTION = [ @@ -28,7 +29,8 @@ class CMBJOEventType extends NameValue 'accept' => 'Rider Accept', 'rider_in_transit' => 'Rider in Transit', 'arrive' => 'Rider Arrive', - 'start' => 'Rider Start', + 'rider_start' => 'Rider Start', + 'rider_complete' => 'Rider Complete', 'rider_edit' => 'Rider Edit', ]; } diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index d7cd6629..34376d10 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -1276,6 +1276,85 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + public function completeJobOrder(Request $req) + { + $required_params = ['jo_id']; + $data = $this->checkJO($req, $required_params, $jo); + if (isset($data['error'])) + return $data; + + // add event log + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(CMBJOEventType::RIDER_COMPLETE) + ->setJobOrder($jo) + ->setRider($rider); + $this->em->persist($event); + + $this->em->flush(); + + return $data; + } + + public function setActiveJobOrder(Request $req) + { + $required_params = [ + 'jo_id' + ]; + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + return $data; + + // are we logged in? + if (!$this->session->hasRider()) + { + $data = [ + 'error' => 'No logged in rider.' + ]; + return $data; + } + + $rider = $this->session->getRider(); + + // get jo + $jo_id = $req->request->get('jo_id'); + + $jo = $this->em->getRepository(JobOrder::class)->find($jo_id); + if ($jo == null) + { + $data = [ + 'job_order' => null + ]; + } + else + { + if ($jo->getRider() == null) + { + $data = [ + 'error' => 'Job order selected has no rider assigned.' + ]; + return $data; + } + + // check if rider is assigned to JO + if ($rider->getID() != $jo->getRider()->getID()) + { + $data = [ + 'error' => 'Job order selected is not assigned to rider.' + ]; + return $data; + } + + $rider->setActiveJobOrder($jo); + + $this->em->persist($rider); + $this->em->flush(); + } + + return $data; + } + protected function checkMissingParameters(Request $req, $params = []) { $missing = []; From b6c54615ad272cafb479cc79ed5fe48bdb196e38 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 3 Jun 2020 10:34:56 +0000 Subject: [PATCH 13/21] Add api calls: payment, complete, cancel, reject for job orders. #421 --- config/routes/cmb_rider_api.yaml | 5 + src/Controller/CMBRAPIController.php | 21 + src/Ramcar/CMBJOEventType.php | 4 +- .../RiderAPIHandler/CMBRiderAPIHandler.php | 614 +++++++++--------- 4 files changed, 332 insertions(+), 312 deletions(-) diff --git a/config/routes/cmb_rider_api.yaml b/config/routes/cmb_rider_api.yaml index 947134a5..75f6261e 100644 --- a/config/routes/cmb_rider_api.yaml +++ b/config/routes/cmb_rider_api.yaml @@ -109,3 +109,8 @@ cmb_rapi_jo_set_active: path: /cmbrapi/joborderactive controller: App\Controller\CMBRAPIController::setActiveJobOrder methods: [POST] + +cmb_rapi_jo_reject: + path: /cmbrapi/joborderreject + controller: App\Controller\CMBRAPIController::rejectJobOrder + methods: [POST] diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php index f712361e..3158eaba 100644 --- a/src/Controller/CMBRAPIController.php +++ b/src/Controller/CMBRAPIController.php @@ -503,5 +503,26 @@ class CMBRAPIController extends Controller return $res->getReturnResponse(); } + public function rejectJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->rejectJobOrder($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } } diff --git a/src/Ramcar/CMBJOEventType.php b/src/Ramcar/CMBJOEventType.php index b789ad08..12dd0264 100644 --- a/src/Ramcar/CMBJOEventType.php +++ b/src/Ramcar/CMBJOEventType.php @@ -15,8 +15,8 @@ class CMBJOEventType extends NameValue const RIDER_IN_TRANSIT = 'rider_in_transit'; const RIDER_ARRIVE = 'arrive'; const RIDER_START = 'rider_start'; - const RIDER_COMPLETE = 'rider_complete'; const RIDER_EDIT = 'rider_edit'; + const PAID = 'paid'; const COLLECTION = [ 'create' => 'Created', @@ -30,7 +30,7 @@ class CMBJOEventType extends NameValue 'rider_in_transit' => 'Rider in Transit', 'arrive' => 'Rider Arrive', 'rider_start' => 'Rider Start', - 'rider_complete' => 'Rider Complete', 'rider_edit' => 'Rider Edit', + 'paid' => 'Paid', ]; } diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 34376d10..036e0419 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -284,6 +284,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface } + // TODO: this needs to be changed to get the JOs for this month and last month public function getJobOrderHistory(Request $req) { $required_params = []; @@ -574,157 +575,113 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $required_params = [ 'jo_id' ]; - $data = $this->checkParamsAndKey($req, $required_params); + $data = $this->checkJO($req, $required_params, $jo); if (isset($data['error'])) return $data; - // are we logged in? - if (!$this->session->hasRider()) + $coord = $jo->getCoordinates(); + $cust = $jo->getCustomer(); + $cv = $jo->getCustomerVehicle(); + $v = $cv->getVehicle(); + $inv = $jo->getInvoice(); + $promo = $inv->getPromo(); + + // invoice items + $inv_items = []; + foreach ($inv->getItems() as $item) { - $data = [ - 'error' => 'No logged in rider.' + $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, ]; - return $data; } - $rider = $this->session->getRider(); - - // get jo - $jo_id = $req->query->get('jo_id'); - - $jo = $this->em->getRepository(JobOrder::class)->find($jo_id); - if ($jo == null) + // promo + if ($promo != null) { - $data = [ - 'job_order' => null + $promo_data = [ + 'id' => $promo->getID(), + 'name' => $promo->getName(), + 'code' => $promo->getCode(), + 'discount_rate' => $promo->getDiscountRate(), + 'discount_apply' => $promo->getDiscountApply(), ]; } else { - if ($jo->getRider() == null) - { - $data = [ - 'error' => 'Job order selected has no rider assigned.' - ]; - return $data; - } - - // check if rider is assigned to JO - if ($rider->getID() != $jo->getRider()->getID()) - { - $data = [ - 'error' => 'Job order selected is not assigned to rider' - ]; - return $data; - } - - $coord = $jo->getCoordinates(); - $cust = $jo->getCustomer(); - $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; - } - - $trade_in_type = $jo->getTradeInType(); - if (empty($trade_in_type)) - $trade_in_type = 'none'; - - $data = [ - 'job_order' => [ - 'id' => $jo->getID(), - 'service_type' => $jo->getServiceType(), - 'date_schedule' => $jo->getDateSchedule()->format('Ymd H:i:s'), - 'longitude' => $coord->getLongitude(), - 'latitude' => $coord->getLatitude(), - 'status' => $jo->getStatus(), - 'customer' => [ - 'title' => $cust->getTitle(), - 'first_name' => $cust->getFirstName(), - 'last_name' => $cust->getLastName(), - 'phone_mobile' => $this->country_code . $cust->getPhoneMobile(), - ], - 'vehicle' => [ - 'manufacturer' => $v->getManufacturer()->getName(), - 'make' => $v->getMake(), - 'model' => $cv->getModelYear(), - 'plate_number' => $cv->getPlateNumber(), - 'color' => $cv->getColor(), - ], - 'or_num' => $jo->getORNum(), - 'or_name' => $jo->getORName(), - 'delivery_instructions' => $jo->getDeliveryInstructions(), - 'delivery_address' => $jo->getDeliveryAddress(), - 'landmark' => $jo->getLandmark(), - 'invoice' => [ - 'discount' => $inv->getDiscount(), - 'trade_in' => $inv->getTradeIn(), - 'total_price' => $inv->getTotalPrice(), - 'vat' => $inv->getVat(), - 'items' => $inv_items, - ], - 'mode_of_payment' => $jo->getModeOfPayment(), - 'trade_in_type' => $trade_in_type, - 'promo' => $promo_data, - // TODO: load the actual - 'has_warranty_doc' => false, - 'flag_coolant' => $jo->hasCoolant(), - 'has_motolite' => $cv->hasMotoliteBattery(), - ] - ]; + $promo_data = null; } + $trade_in_type = $jo->getTradeInType(); + if (empty($trade_in_type)) + $trade_in_type = 'none'; + + $data = [ + 'job_order' => [ + 'id' => $jo->getID(), + 'service_type' => $jo->getServiceType(), + 'date_schedule' => $jo->getDateSchedule()->format('Ymd H:i:s'), + 'longitude' => $coord->getLongitude(), + 'latitude' => $coord->getLatitude(), + 'status' => $jo->getStatus(), + 'customer' => [ + 'title' => $cust->getTitle(), + 'first_name' => $cust->getFirstName(), + 'last_name' => $cust->getLastName(), + 'phone_mobile' => $this->country_code . $cust->getPhoneMobile(), + ], + 'vehicle' => [ + 'manufacturer' => $v->getManufacturer()->getName(), + 'make' => $v->getMake(), + 'model' => $cv->getModelYear(), + 'plate_number' => $cv->getPlateNumber(), + 'color' => $cv->getColor(), + ], + 'or_num' => $jo->getORNum(), + 'or_name' => $jo->getORName(), + 'delivery_instructions' => $jo->getDeliveryInstructions(), + 'delivery_address' => $jo->getDeliveryAddress(), + 'landmark' => $jo->getLandmark(), + 'invoice' => [ + 'discount' => $inv->getDiscount(), + 'trade_in' => $inv->getTradeIn(), + 'total_price' => $inv->getTotalPrice(), + 'vat' => $inv->getVat(), + 'items' => $inv_items, + ], + 'mode_of_payment' => $jo->getModeOfPayment(), + 'trade_in_type' => $trade_in_type, + 'promo' => $promo_data, + // TODO: load the actual + 'has_warranty_doc' => false, + 'flag_coolant' => $jo->hasCoolant(), + 'has_motolite' => $cv->hasMotoliteBattery(), + ] + ]; + return $data; } public function acceptJobOrder(Request $req) { - $required_params = ['jo_id']; + $required_params = [ + 'jo_id' + ]; $data = $this->checkJO($req, $required_params, $jo); if (isset($data['error'])) return $data; // TODO: refactor this into a jo handler class, so we don't have to repeat for control center - - // set jo status to in transit - //$jo->setStatus(JOStatus::IN_TRANSIT); - // TODO: send mqtt event (?) - // add event log $rider = $this->session->getRider(); $event = new JOEvent(); @@ -742,7 +699,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface public function setJobOrderInTransit(Request $req) { $required_params = ['jo_id']; - $data = $this->checkJO($req, $required_params, $jo); + $data = $this->checkActiveJO($req, $required_params, $jo); if (isset($data['error'])) return $data; @@ -768,13 +725,41 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface public function cancelJobOrder(Request $req) { - $required_params = ['jo_id']; + $required_params = [ + 'jo_id', + 'cancel_reason' + ]; + $data = $this->checkJO($req, $required_params, $jo); + if (isset($data['error'])) + return $data; + + $cancel_reason = $req->request->get('cancel_reason'); + + $jo->cancel($cancel_reason); + + // add event log + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(CMBJOEventType::REQUEUE) + ->setJobOrder($jo) + ->setRider($rider); + $this->em->persist($event); + + $this->em->flush(); + + return $data; + } + + public function rejectJobOrder(Request $req) + { + $required_params = [ + 'jo_id' + ]; $data = $this->checkJO($req, $required_params, $jo); if (isset($data['error'])) return $data; - // $jo->cancel("rider cancelled"); - // requeue it, instead of cancelling it $jo->requeue(); // add event log @@ -802,7 +787,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface public function arrive(Request $req) { $required_params = ['jo_id']; - $data = $this->checkJO($req, $required_params, $jo); + $data = $this->checkActiveJO($req, $required_params, $jo); if (isset($data['error'])) return $data; @@ -868,90 +853,24 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface public function payment(Request $req) { $required_params = ['jo_id']; - $data = $this->checkJO($req, $required_params, $jo); + $data = $this->checkActiveJO($req, $required_params, $jo); if (isset($data['error'])) return $data; // set invoice to paid $jo->getInvoice()->setStatus(InvoiceStatus::PAID); - /* - // set jo status to fulfilled - $jo->setStatus(JOStatus::FULFILLED); - */ - $jo->fulfill(); - // add event log $rider = $this->session->getRider(); $event = new JOEvent(); $event->setDateHappen(new DateTime()) - ->setTypeID(CMBJOEventType::FULFILL) + ->setTypeID(CMBJOEventType::PAID) ->setJobOrder($jo) ->setRider($rider); $this->em->persist($event); - // tag rider as unavailable - $rider->setAvailable(false); - - // save to customer vehicle battery record - $this->jo_handler->updateVehicleBattery($jo); - $this->em->flush(); - // create warranty - if($this->jo_handler->checkIfNewBattery($jo)) - { - $serial = null; - $warranty_class = $jo->getWarrantyClass(); - $first_name = $jo->getCustomer()->getFirstName(); - $last_name = $jo->getCustomer()->getLastName(); - $mobile_number = $jo->getCustomer()->getPhoneMobile(); - - // check if date fulfilled is null - //if ($jo->getDateFulfill() == null) - // $date_purchase = $jo->getDateCreate(); - //else - // $date_purchase = $jo->getDateFulfill(); - - // use date_schedule for warranty expiration computation - $date_purchase = $jo->getDateSchedule(); - - $plate_number = $this->wh->cleanPlateNumber($jo->getCustomerVehicle()->getPlateNumber()); - - $batt_list = array(); - $invoice = $jo->getInvoice(); - if (!empty($invoice)) - { - // get battery - $invoice_items = $invoice->getItems(); - foreach ($invoice_items as $item) - { - $battery = $item->getBattery(); - if ($battery != null) - { - $batt_list[] = $item->getBattery(); - } - } - } - - $this->wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class); - } - - // send mqtt event (fulfilled) - $rider = $this->session->getRider(); - $image_url = $req->getScheme() . '://' . $req->getHttpHost() . $req->getBasePath() . '/assets/images/user.gif'; - if ($rider->getImageFile() != null) - $image_url = $req->getScheme() . '://' . $req->getHttpHost() . $req->getBasePath() . '/uploads/' . $rider->getImageFile(); - - $payload = [ - 'event' => 'fulfilled', - 'jo_id' => $jo->getID(), - 'driver_image' => $image_url, - 'driver_name' => $rider->getFullName(), - 'driver_id' => $rider->getID(), - ]; - $this->mclient->sendEvent($jo, $payload); - return $data; } @@ -1053,7 +972,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // allow rider to change service, promo, battery and trade-in options $required_params = ['jo_id', 'stype_id', 'promo_id']; - $data = $this->checkJO($req, $required_params, $jo); + $data = $this->checkActiveJO($req, $required_params, $jo); if (isset($data['error'])) return $data; @@ -1180,85 +1099,72 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface public function generateInvoice(Request $req) { $required_params = ['jo_id']; - $data = $this->checkParamsAndKey($req, $required_params); + $data = $this->checkActiveJO($req, $required_params, $jo); if (isset($data['error'])) return $data; - // get jo - $jo_id = $req->query->get('jo_id'); + $inv = $jo->getInvoice(); + $promo = $inv->getPromo(); - $jo = $this->em->getRepository(JobOrder::class)->find($jo_id); - if ($jo == null) + // invoice items + $inv_items = []; + foreach ($inv->getItems() as $item) { - $data = [ - 'invoice' => null + $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 { - $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; - } - - $trade_in_type = $jo->getTradeInType(); - if (empty($trade_in_type)) - $trade_in_type = 'none'; - - $data = [ - 'invoice' => [ - 'id' => $inv->getID(), - 'discount' => $inv->getDiscount(), - 'trade_in' => $inv->getTradeIn(), - 'total_price' => $inv->getTotalPrice(), - 'vat' => $inv->getVat(), - 'items' => $inv_items, - 'trade_in_type' => $trade_in_type, - 'promo' => $promo_data, - ] - ]; + $promo_data = null; } + $trade_in_type = $jo->getTradeInType(); + if (empty($trade_in_type)) + $trade_in_type = 'none'; + + $data = [ + 'invoice' => [ + 'id' => $inv->getID(), + 'discount' => $inv->getDiscount(), + 'trade_in' => $inv->getTradeIn(), + 'total_price' => $inv->getTotalPrice(), + 'vat' => $inv->getVat(), + 'items' => $inv_items, + 'trade_in_type' => $trade_in_type, + 'promo' => $promo_data, + ] + ]; + return $data; } public function startJobOrder(Request $req) { $required_params = ['jo_id']; - $data = $this->checkJO($req, $required_params, $jo); + $data = $this->checkActiveJO($req, $required_params, $jo); if (isset($data['error'])) return $data; @@ -1279,21 +1185,87 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface public function completeJobOrder(Request $req) { $required_params = ['jo_id']; - $data = $this->checkJO($req, $required_params, $jo); + $data = $this->checkActiveJO($req, $required_params, $jo); if (isset($data['error'])) return $data; + /* + // set jo status to fulfilled + $jo->setStatus(JOStatus::FULFILLED); + */ + $jo->fulfill(); + // add event log $rider = $this->session->getRider(); $event = new JOEvent(); $event->setDateHappen(new DateTime()) - ->setTypeID(CMBJOEventType::RIDER_COMPLETE) + ->setTypeID(CMBJOEventType::FULFILL) ->setJobOrder($jo) ->setRider($rider); $this->em->persist($event); + // tag rider as unavailable + $rider->setAvailable(false); + + // save to customer vehicle battery record + $this->jo_handler->updateVehicleBattery($jo); + $this->em->flush(); + // create warranty + if($this->jo_handler->checkIfNewBattery($jo)) + { + $serial = null; + $warranty_class = $jo->getWarrantyClass(); + $first_name = $jo->getCustomer()->getFirstName(); + $last_name = $jo->getCustomer()->getLastName(); + $mobile_number = $jo->getCustomer()->getPhoneMobile(); + + // check if date fulfilled is null + //if ($jo->getDateFulfill() == null) + // $date_purchase = $jo->getDateCreate(); + //else + // $date_purchase = $jo->getDateFulfill(); + + // use date_schedule for warranty expiration computation + $date_purchase = $jo->getDateSchedule(); + + $plate_number = $this->wh->cleanPlateNumber($jo->getCustomerVehicle()->getPlateNumber()); + + $batt_list = array(); + $invoice = $jo->getInvoice(); + if (!empty($invoice)) + { + // get battery + $invoice_items = $invoice->getItems(); + foreach ($invoice_items as $item) + { + $battery = $item->getBattery(); + if ($battery != null) + { + $batt_list[] = $item->getBattery(); + } + } + } + + $this->wh->createWarranty($serial, $plate_number, $first_name, $last_name, $mobile_number, $batt_list, $date_purchase, $warranty_class); + } + + // TODO: Need to verify if needed. + // send mqtt event (fulfilled) + $image_url = $req->getScheme() . '://' . $req->getHttpHost() . $req->getBasePath() . '/assets/images/user.gif'; + if ($rider->getImageFile() != null) + $image_url = $req->getScheme() . '://' . $req->getHttpHost() . $req->getBasePath() . '/uploads/' . $rider->getImageFile(); + + $payload = [ + 'event' => 'fulfilled', + 'jo_id' => $jo->getID(), + 'driver_image' => $image_url, + 'driver_name' => $rider->getFullName(), + 'driver_id' => $rider->getID(), + ]; + $this->mclient->sendEvent($jo, $payload); + return $data; } @@ -1302,55 +1274,15 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $required_params = [ 'jo_id' ]; - $data = $this->checkParamsAndKey($req, $required_params); + $data = $this->checkJO($req, $required_params, $jo); if (isset($data['error'])) return $data; - // are we logged in? - if (!$this->session->hasRider()) - { - $data = [ - 'error' => 'No logged in rider.' - ]; - return $data; - } - $rider = $this->session->getRider(); + $rider->setActiveJobOrder($jo); - // get jo - $jo_id = $req->request->get('jo_id'); - - $jo = $this->em->getRepository(JobOrder::class)->find($jo_id); - if ($jo == null) - { - $data = [ - 'job_order' => null - ]; - } - else - { - if ($jo->getRider() == null) - { - $data = [ - 'error' => 'Job order selected has no rider assigned.' - ]; - return $data; - } - - // check if rider is assigned to JO - if ($rider->getID() != $jo->getRider()->getID()) - { - $data = [ - 'error' => 'Job order selected is not assigned to rider.' - ]; - return $data; - } - - $rider->setActiveJobOrder($jo); - - $this->em->persist($rider); - $this->em->flush(); - } + $this->em->persist($rider); + $this->em->flush(); return $data; } @@ -1432,7 +1364,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $session; } - protected function checkJO(Request $req, $required_params, &$jo = null) + protected function checkActiveJO(Request $req, $required_params, &$jo = null) { // set jo status to in transit $data = $this->checkParamsAndKey($req, $required_params); @@ -1459,9 +1391,14 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface ]; return $data; } + $jo_id = ''; + if ($req->getMethod() == 'GET') + $jo_id = $req->query->get('jo_id'); + else + $jo_id = $req->request->get('jo_id'); // check if the jo_id sent is the same as our active jo - if ($req->request->get('jo_id') != $jo->getID()) + if ($jo_id != $jo->getID()) { $data = [ 'error' => 'Job order selected is not active job order.' @@ -1472,6 +1409,63 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + protected function checkJO(Request $req, $required_params, &$jo = null) + { + // set jo status to in transit + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + return $data; + + // are we logged in? + if (!$this->session->hasRider()) + { + $data = [ + 'error' => 'No logged in rider.' + ]; + return $data; + } + + $rider = $this->session->getRider(); + + // get jo + $jo_id = ''; + if ($req->getMethod() == 'GET') + $jo_id = $req->query->get('jo_id'); + else + $jo_id = $req->request->get('jo_id'); + + $jo = $this->em->getRepository(JobOrder::class)->find($jo_id); + if ($jo == null) + { + $data = [ + 'error' => 'No job order found.' + ]; + return $data; + + } + + // check if rider assigned to jo is our rider + if ($jo->getRider() == null) + { + $data = [ + 'error' => 'Job order selected has no rider assigned.' + ]; + return $data; + } + + // check if rider is assigned to JO + if ($rider->getID() != $jo->getRider()->getID()) + { + $data = [ + 'error' => 'Job order selected is not assigned to rider' + ]; + return $data; + } + + return $data; + } + + protected function debugRequest(Request $req) { $all = $req->request->all(); From a0ee7b32bcd5ff25380100864d26ef50fb8604d3 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 4 Jun 2020 03:32:05 +0000 Subject: [PATCH 14/21] Add setOdometer API call. Modify url routes for some calls for easier reading. #421 --- config/routes/cmb_rider_api.yaml | 25 +++++++++++-------- src/Controller/CMBRAPIController.php | 23 +++++++++++++++++ .../RiderAPIHandler/CMBRiderAPIHandler.php | 21 +++++++++++++++- 3 files changed, 58 insertions(+), 11 deletions(-) diff --git a/config/routes/cmb_rider_api.yaml b/config/routes/cmb_rider_api.yaml index 75f6261e..8ea54898 100644 --- a/config/routes/cmb_rider_api.yaml +++ b/config/routes/cmb_rider_api.yaml @@ -21,12 +21,12 @@ cmb_rapi_jo_get: methods: [GET] cmb_rapi_jo_accept: - path: /cmbrapi/accept + path: /cmbrapi/joaccept controller: App\Controller\CMBRAPIController::acceptJobOrder methods: [POST] cmb_rapi_jo_cancel: - path: /cmbrapi/cancel + path: /cmbrapi/jocancel controller: App\Controller\CMBRAPIController::cancelJobOrder methods: [POST] @@ -36,7 +36,7 @@ cmb_rapi_arrive: methods: [POST] cmb_rapi_payment: - path: /cmbrapi/payment + path: /cmbrapi/jopayment controller: App\Controller\CMBRAPIController::payment methods: [POST] @@ -66,17 +66,17 @@ cmb_rapi_available: methods: [POST] cmb_rapi_jo_history_view: - path: /cmbrapi/joborderhistory + path: /cmbrapi/johistory controller: App\Controller\CMBRAPIController::viewJobOrderHistory methods: [GET] cmb_rapi_assigned_jo_get: - path: /cmbrapi/assignedjoborders + path: /cmbrapi/assignedjos controller: App\Controller\CMBRAPIController::getAssignedJobOrders methods: [GET] cmb_rapi_jo_in_transit: - path: /cmbrapi/joborderintransit + path: /cmbrapi/jotransit controller: App\Controller\CMBRAPIController::setJobOrderInTransit methods: [POST] @@ -96,21 +96,26 @@ cmb_rapi_offline: methods: [POST] cmb_rapi_jo_start: - path: /cmbrapi/joborderstart + path: /cmbrapi/jostart controller: App\Controller\CMBRAPIController::startJobOrder methods: [POST] cmb_rapi_jo_complete: - path: /cmbrapi/jobordercomplete + path: /cmbrapi/jocomplete controller: App\Controller\CMBRAPIController::completeJobOrder methods: [POST] cmb_rapi_jo_set_active: - path: /cmbrapi/joborderactive + path: /cmbrapi/joactive controller: App\Controller\CMBRAPIController::setActiveJobOrder methods: [POST] cmb_rapi_jo_reject: - path: /cmbrapi/joborderreject + path: /cmbrapi/joreject controller: App\Controller\CMBRAPIController::rejectJobOrder methods: [POST] + +cmb_rapi_jo_odometer: + path: /cmbrapi/odometer + controller: App\Controller\CMBRAPIController::setOdometer + methods: [POST] diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php index 3158eaba..d9286ad9 100644 --- a/src/Controller/CMBRAPIController.php +++ b/src/Controller/CMBRAPIController.php @@ -525,4 +525,27 @@ class CMBRAPIController extends Controller return $res->getReturnResponse(); } + public function setOdometer(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->setOdometer($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + } diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 036e0419..4ef3557c 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -972,7 +972,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // allow rider to change service, promo, battery and trade-in options $required_params = ['jo_id', 'stype_id', 'promo_id']; - $data = $this->checkActiveJO($req, $required_params, $jo); + $data = $this->checkJO($req, $required_params, $jo); if (isset($data['error'])) return $data; @@ -1287,6 +1287,25 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + public function setOdometer(Request $req) + { + $required_params = [ + 'jo_id', + 'odometer' + ]; + $data = $this->checkActiveJO($req, $required_params, $jo); + if (isset($data['error'])) + return $data; + + $odometer_reading = $req->request->get('odometer'); + + $jo->addMeta('odometer', $odometer_reading); + + $this->em->flush(); + + return $data; + } + protected function checkMissingParameters(Request $req, $params = []) { $missing = []; From b41b5ea29bdfda474e487e4d44fa63f0c8293fa1 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 4 Jun 2020 06:02:53 +0000 Subject: [PATCH 15/21] Modify getJobOrderHistory. #421 --- config/routes/cmb_rider_api.yaml | 6 +++--- src/Controller/CMBRAPIController.php | 4 ++-- src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 13 +++++++++---- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/config/routes/cmb_rider_api.yaml b/config/routes/cmb_rider_api.yaml index 8ea54898..e044872a 100644 --- a/config/routes/cmb_rider_api.yaml +++ b/config/routes/cmb_rider_api.yaml @@ -65,9 +65,9 @@ cmb_rapi_available: controller: App\Controller\CMBRAPIController::available methods: [POST] -cmb_rapi_jo_history_view: - path: /cmbrapi/johistory - controller: App\Controller\CMBRAPIController::viewJobOrderHistory +cmb_rapi_jo_history: + path: /cmbrapi/johistory/{period} + controller: App\Controller\CMBRAPIController::getJobOrderHistory methods: [GET] cmb_rapi_assigned_jo_get: diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php index d9286ad9..4d9ab33b 100644 --- a/src/Controller/CMBRAPIController.php +++ b/src/Controller/CMBRAPIController.php @@ -301,11 +301,11 @@ class CMBRAPIController extends Controller return $res->getReturnResponse(); } - public function viewJobOrderHistory(Request $req, RiderAPIHandlerInterface $rapi_handler) + public function getJobOrderHistory(Request $req, $period, RiderAPIHandlerInterface $rapi_handler) { $res = new APIResult(); - $data = $rapi_handler->getJobOrderHistory($req); + $data = $rapi_handler->getJobOrderHistory($req, $period); if (isset($data['error'])) { diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 4ef3557c..82ec5c4e 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -284,8 +284,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface } - // TODO: this needs to be changed to get the JOs for this month and last month - public function getJobOrderHistory(Request $req) + public function getJobOrderHistory(Request $req, $period) { $required_params = []; $data = $this->checkParamsAndKey($req, $required_params); @@ -304,8 +303,6 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $rider = $this->session->getRider(); // get JOs assigned to rider for the month given - // TODO: what date to use - // for now, using date_schedule // setup start date and end dates // get current year $month = $req->query->get('month'); @@ -314,6 +311,14 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $current_date = new DateTime(); $current_year = $current_date->format('Y'); + if ($period == 'thismonth') + { + $month = $current_date->format('m'); + } + else + { + } + // get number of days in month requested $last_day = cal_days_in_month(CAL_GREGORIAN, $month, $current_year); From 760fa7acf3b216f7b3b564c34745f2deebb37874 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 4 Jun 2020 09:47:58 +0000 Subject: [PATCH 16/21] Add get job order history for this month and last month. #421 --- .../RiderAPIHandler/CMBRiderAPIHandler.php | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 82ec5c4e..6f4c6ddb 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -33,6 +33,7 @@ use App\Entity\BatterySize; use App\Entity\JobOrder; use DateTime; +use DateInterval; class CMBRiderAPIHandler implements RiderAPIHandlerInterface { @@ -305,25 +306,24 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // get JOs assigned to rider for the month given // setup start date and end dates // get current year - $month = $req->query->get('month'); - $year = $req->query->get('year'); - $current_date = new DateTime(); - $current_year = $current_date->format('Y'); - if ($period == 'thismonth') + if ($period == 'lastmonth') { - $month = $current_date->format('m'); + $date_interval = new DateInterval('P1M'); + $period_date = $current_date->sub($date_interval); } else - { - } + $period_date = $current_date; + + $period_year = $period_date->format('Y'); + $period_month = $period_date->format('m'); // get number of days in month requested - $last_day = cal_days_in_month(CAL_GREGORIAN, $month, $current_year); + $last_day = cal_days_in_month(CAL_GREGORIAN, $period_month, $period_year); - $s_date = $current_year . '-' . $month . '-01 00:00:00'; - $e_date = $current_year . '-' . $month . '-' . $last_day . ' 23:59:59'; + $s_date = $period_year . '-' . $period_month . '-01 00:00:00'; + $e_date = $period_year . '-' . $period_month . '-' . $last_day . ' 23:59:59'; $qb = $this->em->getRepository(JobOrder::class)->createQueryBuilder('j'); @@ -767,6 +767,8 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $jo->requeue(); + // TODO: do we leave JO as assigned to rider? + // add event log $rider = $this->session->getRider(); $event = new JOEvent(); From 8f108c18cb271e25558549b78e2da758b74a4b45 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 5 Jun 2020 09:52:23 +0000 Subject: [PATCH 17/21] Modify name of stype_id parameter to service_type for clarity. #421 --- src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 6f4c6ddb..a14ff160 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -978,17 +978,17 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $this->debugRequest($req); // allow rider to change service, promo, battery and trade-in options - $required_params = ['jo_id', 'stype_id', 'promo_id']; + $required_params = ['jo_id', 'service_type', 'promo_id']; $data = $this->checkJO($req, $required_params, $jo); if (isset($data['error'])) return $data; // check service type - $stype_id = $req->request->get('stype_id'); - if (!ServiceType::validate($stype_id)) + $service_type = $req->request->get('service_type'); + if (!ServiceType::validate($service_type)) { $data = [ - 'error' => 'Invalid service type - ' . $stype_id + 'error' => 'Invalid service type - ' . $service_type ]; return $data; } @@ -1061,7 +1061,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // generate new invoice $crit = new InvoiceCriteria(); - $crit->setServiceType($stype_id); + $crit->setServiceType($service_type); $crit->setCustomerVehicle($cv); $crit->setHasCoolant($jo->hasCoolant()); @@ -1082,7 +1082,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $this->em->flush(); // save job order - $jo->setServiceType($stype_id); + $jo->setServiceType($service_type); // save invoice $jo->setInvoice($invoice); From ce64a1b64d8b3a04086f0088adb75f17dbdc3022 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 8 Jun 2020 10:39:57 +0000 Subject: [PATCH 18/21] Add uploadArrivePhotos API call. #421 --- config/routes/cmb_rider_api.yaml | 10 ++ src/Controller/CMBRAPIController.php | 45 +++++++ src/Entity/JOExtra.php | 122 ++++++++++++++++++ src/Entity/JobOrder.php | 16 +++ .../RiderAPIHandler/CMBRiderAPIHandler.php | 85 +++++++++++- 5 files changed, 277 insertions(+), 1 deletion(-) create mode 100644 src/Entity/JOExtra.php diff --git a/config/routes/cmb_rider_api.yaml b/config/routes/cmb_rider_api.yaml index e044872a..eb4f2186 100644 --- a/config/routes/cmb_rider_api.yaml +++ b/config/routes/cmb_rider_api.yaml @@ -119,3 +119,13 @@ cmb_rapi_jo_odometer: path: /cmbrapi/odometer controller: App\Controller\CMBRAPIController::setOdometer methods: [POST] + +cmb_rapi_jo_arrive_photos_upload: + path: /cmbrapi/uploadarrivephotos + controller: App\Controller\CMBRAPIController::uploadArrivePhotos + methods: [POST] + +cmb_rapi_jo_finish_photos_upload: + path: /cmbrapi/uploadfinishphotos + controller: App\Controller\CMBRAPIController::uploadFinishPhotos + methods: [POST] diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php index 4d9ab33b..a1043c04 100644 --- a/src/Controller/CMBRAPIController.php +++ b/src/Controller/CMBRAPIController.php @@ -547,5 +547,50 @@ class CMBRAPIController extends Controller return $res->getReturnResponse(); } + public function uploadArrivePhotos(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->uploadArrivePhotos($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function uploadFinishPhotos(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->uploadFinishPhotos($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + } diff --git a/src/Entity/JOExtra.php b/src/Entity/JOExtra.php new file mode 100644 index 00000000..4f5d40b6 --- /dev/null +++ b/src/Entity/JOExtra.php @@ -0,0 +1,122 @@ +id; + } + + public function setBeforeSpeedImageFilename($image_filename) + { + $this->before_speed_image_filename = $image_filename; + return $this; + } + + public function getBeforeSpeedImageFilename($image_filename) + { + return $this->before_speed_image_filename; + } + + public function setBeforePlateNumImageFilename($image_filename) + { + $this->before_plate_num_image_filename = $image_filename; + return $this; + } + + public function getBeforePlateNumImageFilename($image_filename) + { + return $this->before_plate_num_image_filename; + } + + public function setBeforeBattImageFilename($image_filename) + { + $this->before_batt_image_filename = $image_filename; + return $this; + } + + public function getBeforeBattImageFilename($image_filename) + { + return $this->before_batt_image_filename; + } + public function setAfterSpeedImageFilename($image_filename) + { + $this->after_speed_image_filename = $image_filename; + return $this; + } + + public function getAfterSpeedImageFilename($image_filename) + { + return $this->after_speed_image_filename; + } + + public function setAfterPlateNumImageFilename($image_filename) + { + $this->after_plate_num_image_filename = $image_filename; + return $this; + } + + public function getAfterPlateNumImageFilename($image_filename) + { + return $this->after_plate_num_image_filename; + } + + public function setAfterBattImageFilename($image_filename) + { + $this->after_batt_image_filename = $image_filename; + return $this; + } + + public function getAfterBattImageFilename($image_filename) + { + return $this->after_batt_image_filename; + } + + +} diff --git a/src/Entity/JobOrder.php b/src/Entity/JobOrder.php index 8bcdbb77..a174fb96 100644 --- a/src/Entity/JobOrder.php +++ b/src/Entity/JobOrder.php @@ -334,6 +334,12 @@ class JobOrder */ protected $phone_mobile; + // link to JOExtra + /** + * @ORM\OneToOne(targetEntity="JOExtra") + */ + protected $jo_extra; + public function __construct() { $this->date_create = new DateTime(); @@ -962,5 +968,15 @@ class JobOrder return $this->phone_mobile; } + public function setJOExtra(JOExtra $jo_extra) + { + $this->jo_extra = $jo_extra; + return $this; + } + + public function getJOExtra() + { + return $this->jo_extra; + } } diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index a14ff160..75ccb4b7 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -31,6 +31,7 @@ use App\Entity\Battery; use App\Entity\BatteryModel; use App\Entity\BatterySize; use App\Entity\JobOrder; +use App\Entity\JOExtra; use DateTime; use DateInterval; @@ -49,12 +50,13 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface protected $jo_handler; protected $ic; protected $session; + protected $upload_dir; public function __construct(EntityManagerInterface $em, RedisClientProvider $redis, EncoderFactoryInterface $ef, RiderCache $rcache, string $country_code, MQTTClient $mclient, WarrantyHandler $wh, JobOrderHandlerInterface $jo_handler, - InvoiceGeneratorInterface $ic) + InvoiceGeneratorInterface $ic, string $upload_dir) { $this->em = $em; $this->redis = $redis; @@ -65,6 +67,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $this->wh = $wh; $this->jo_handler = $jo_handler; $this->ic = $ic; + $this->upload_dir = $upload_dir; // one device = one session, since we have control over the devices // when a rider logs in, we just change the rider assigned to the device @@ -1313,6 +1316,86 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + public function uploadArrivePhotos(Request $req) + { + $required_params = [ + 'jo_id', + ]; + $data = $this->checkActiveJO($req, $required_params, $jo); + if (isset($data['error'])) + return $data; + + $dest = $this->upload_dir; + + $speed_img_file = $req->files->get('speedomtr_img'); + $batt_img_file = $req->files->get('battery_img'); + $plate_num_img_file = $req->files->get('plate_number_img'); + + if ((empty($speed_img_file)) && + (empty($batt_img_file)) && + (empty($plate_num_img_file))) + { + $data = [ + 'error' => 'No image files received.' + ]; + return $data; + } + else + { + // save speedometer file + $orig_speed_filename = pathinfo($speed_img_file->getClientOriginalName(), PATHINFO_FILENAME); + $new_speed_filename = uniqid() . '-'. $orig_speed_filename . '.' . $speed_img_file->guessClientExtension(); + + // save battery file + $orig_batt_filename = pathinfo($batt_img_file->getClientOriginalName(), PATHINFO_FILENAME); + $new_batt_filename = uniqid() . '-' . $orig_batt_filename . '.' . $batt_img_file->guessClientExtension(); + + // save plate number file + $orig_plate_num_filename = pathinfo($plate_num_img_file->getClientOriginalName(), PATHINFO_FILENAME); + $new_plate_num_filename = uniqid() . '-' . $orig_plate_num_filename . '.' . $plate_num_img_file->guessClientExtension(); + + try + { + $speed_img_file->move($dest, $new_speed_filename); + $batt_img_file->move($dest, $new_batt_filename); + $plate_num_img_file->move($dest, $new_plate_num_filename); + } + catch (FileException $e) + { + $data = [ + 'error' => 'Error saving image files.' + ]; + return $data; + } + + // create JOExtra entity + $jo_extra = new JOExtra(); + + $jo_extra->setBeforeSpeedImageFilename($new_speed_filename); + $jo_extra->setBeforeBattImageFilename($new_batt_filename); + $jo_extra->setBeforePlateNumImageFilename($new_plate_num_filename); + + $jo->setJOExtra($jo_extra); + + $this->em->persist($jo_extra); + $this->em->flush(); + } + + return $data; + } + + public function uploadFinishPhotos(Request $req) + { + $required_params = [ + 'jo_id', + ]; + $data = $this->checkActiveJO($req, $required_params, $jo); + if (isset($data['error'])) + return $data; + + return $data; + } + protected function checkMissingParameters(Request $req, $params = []) { $missing = []; From 334b0f1c9909fae33c11db734c6a4a10afb742b4 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 9 Jun 2020 02:57:48 +0000 Subject: [PATCH 19/21] Add uploadFinishPhotos API call. #421 --- .../RiderAPIHandler/CMBRiderAPIHandler.php | 92 +++++++++++++++++-- 1 file changed, 85 insertions(+), 7 deletions(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 75ccb4b7..d17cced8 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -1368,16 +1368,27 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } - // create JOExtra entity - $jo_extra = new JOExtra(); + $jo_extra = $jo->getJOExtra(); + if ($jo_extra == null) + { + // create JOExtra entity + $jo_extra = new JOExtra(); - $jo_extra->setBeforeSpeedImageFilename($new_speed_filename); - $jo_extra->setBeforeBattImageFilename($new_batt_filename); - $jo_extra->setBeforePlateNumImageFilename($new_plate_num_filename); + $jo_extra->setBeforeSpeedImageFilename($new_speed_filename); + $jo_extra->setBeforeBattImageFilename($new_batt_filename); + $jo_extra->setBeforePlateNumImageFilename($new_plate_num_filename); - $jo->setJOExtra($jo_extra); + $jo->setJOExtra($jo_extra); + + $this->em->persist($jo_extra); + } + else + { + $jo_extra->setBeforeSpeedImageFilename($new_speed_filename); + $jo_extra->setBeforeBattImageFilename($new_batt_filename); + $jo_extra->setBeforePlateNumImageFilename($new_plate_num_filename); + } - $this->em->persist($jo_extra); $this->em->flush(); } @@ -1393,6 +1404,73 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface if (isset($data['error'])) return $data; + $dest = $this->upload_dir; + + $speed_img_file = $req->files->get('speedomtr_img'); + $batt_img_file = $req->files->get('battery_img'); + $plate_num_img_file = $req->files->get('plate_number_img'); + + if ((empty($speed_img_file)) && + (empty($batt_img_file)) && + (empty($plate_num_img_file))) + { + $data = [ + 'error' => 'No image files received.' + ]; + return $data; + } + else + { + // save speedometer file + $orig_speed_filename = pathinfo($speed_img_file->getClientOriginalName(), PATHINFO_FILENAME); + $new_speed_filename = uniqid() . '-'. $orig_speed_filename . '.' . $speed_img_file->guessClientExtension(); + + // save battery file + $orig_batt_filename = pathinfo($batt_img_file->getClientOriginalName(), PATHINFO_FILENAME); + $new_batt_filename = uniqid() . '-' . $orig_batt_filename . '.' . $batt_img_file->guessClientExtension(); + + // save plate number file + $orig_plate_num_filename = pathinfo($plate_num_img_file->getClientOriginalName(), PATHINFO_FILENAME); + $new_plate_num_filename = uniqid() . '-' . $orig_plate_num_filename . '.' . $plate_num_img_file->guessClientExtension(); + + try + { + $speed_img_file->move($dest, $new_speed_filename); + $batt_img_file->move($dest, $new_batt_filename); + $plate_num_img_file->move($dest, $new_plate_num_filename); + } + catch (FileException $e) + { + $data = [ + 'error' => 'Error saving image files.' + ]; + return $data; + } + + $jo_extra = $jo->getJOExtra(); + if ($jo_extra == null) + { + // create JOExtra entity + $jo_extra = new JOExtra(); + + $jo_extra->setAfterSpeedImageFilename($new_speed_filename); + $jo_extra->setAfterBattImageFilename($new_batt_filename); + $jo_extra->setAfterPlateNumImageFilename($new_plate_num_filename); + + $jo->setJOExtra($jo_extra); + + $this->em->persist($jo_extra); + } + else + { + $jo_extra->setAfterSpeedImageFilename($new_speed_filename); + $jo_extra->setAfterBattImageFilename($new_batt_filename); + $jo_extra->setAfterPlateNumImageFilename($new_plate_num_filename); + } + + $this->em->flush(); + } + return $data; } From 027c1ead396129a5e3486a8092b9c86bde34ea83 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 9 Jun 2020 06:05:16 +0000 Subject: [PATCH 20/21] Add upload directory for photos. #421 --- config/cmb.services.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config/cmb.services.yaml b/config/cmb.services.yaml index 1f9a6dec..3d9fd7a3 100644 --- a/config/cmb.services.yaml +++ b/config/cmb.services.yaml @@ -5,6 +5,7 @@ parameters: latitude: 14.6091 longitude: 121.0223 image_upload_directory: '%kernel.project_dir%/public/uploads' + jo_extra_upload_directory: '%kernel.project_dir%/public/uploads/jo_extra' job_order_refresh_interval: 300000 api_acl_file: 'api_acl.yaml' api_access_key: 'api_access_keys' @@ -191,7 +192,8 @@ services: # rider API service App\Service\RiderAPIHandler\CMBRiderAPIHandler: arguments: - $country_code: "%env(COUNTRY_CODE)%" + $country_code: "%env(COUNTRY_CODE)%" + $upload_dir: "%jo_extra_upload_directory%" App\Service\RiderAPIHandlerInterface: "@App\\Service\\RiderAPIHandler\\CMBRiderAPIHandler" From 18081d0903a25262bd8f76f88c1ef5d7b5a976c2 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 12 Jun 2020 10:35:20 +0000 Subject: [PATCH 21/21] Add title field to error object. #421 --- src/Controller/CMBRAPIController.php | 109 ++++++--- src/Ramcar/NewAPIResult.php | 92 +++++++ .../RiderAPIHandler/CMBRiderAPIHandler.php | 229 +++++++++++++++--- 3 files changed, 360 insertions(+), 70 deletions(-) create mode 100644 src/Ramcar/NewAPIResult.php diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php index a1043c04..2d503831 100644 --- a/src/Controller/CMBRAPIController.php +++ b/src/Controller/CMBRAPIController.php @@ -7,7 +7,7 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\JsonResponse; -use App\Ramcar\APIResult; +use App\Ramcar\NewAPIResult; use App\Service\RiderAPIHandlerInterface; @@ -16,15 +16,17 @@ class CMBRAPIController extends Controller { public function register(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->register($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -38,15 +40,17 @@ class CMBRAPIController extends Controller public function login(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->login($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -60,15 +64,17 @@ class CMBRAPIController extends Controller public function logout(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->logout($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -82,15 +88,17 @@ class CMBRAPIController extends Controller public function getJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->getJobOrder($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -104,15 +112,17 @@ class CMBRAPIController extends Controller public function acceptJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->acceptJobOrder($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -126,15 +136,17 @@ class CMBRAPIController extends Controller public function cancelJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->cancelJobOrder($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -149,15 +161,17 @@ class CMBRAPIController extends Controller public function arrive(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->arrive($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -171,15 +185,17 @@ class CMBRAPIController extends Controller public function hubArrive(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->hubArrive($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -193,15 +209,17 @@ class CMBRAPIController extends Controller public function payment(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->payment($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -215,15 +233,17 @@ class CMBRAPIController extends Controller public function available(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->available($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -237,15 +257,17 @@ class CMBRAPIController extends Controller public function getPromos(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->getPromos($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -259,15 +281,17 @@ class CMBRAPIController extends Controller public function getBatteries(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->getBatteries($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -281,15 +305,17 @@ class CMBRAPIController extends Controller public function changeService(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->changeService($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -303,15 +329,17 @@ class CMBRAPIController extends Controller public function getJobOrderHistory(Request $req, $period, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->getJobOrderHistory($req, $period); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -326,15 +354,17 @@ class CMBRAPIController extends Controller public function getAssignedJobOrders(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->getAssignedJobOrders($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -349,15 +379,17 @@ class CMBRAPIController extends Controller public function setJobOrderInTransit(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->setJobOrderInTransit($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -372,15 +404,17 @@ class CMBRAPIController extends Controller public function generateInvoice(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->generateInvoice($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -395,15 +429,17 @@ class CMBRAPIController extends Controller public function goOnline(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->goOnline($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -417,15 +453,17 @@ class CMBRAPIController extends Controller public function goOffline(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->goOffline($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -439,15 +477,17 @@ class CMBRAPIController extends Controller public function startJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->startJobOrder($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -461,15 +501,17 @@ class CMBRAPIController extends Controller public function completeJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->completeJobOrder($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -483,15 +525,17 @@ class CMBRAPIController extends Controller public function setActiveJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->setActiveJobOrder($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -505,15 +549,17 @@ class CMBRAPIController extends Controller public function rejectJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->rejectJobOrder($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -527,15 +573,17 @@ class CMBRAPIController extends Controller public function setOdometer(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->setOdometer($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -549,15 +597,17 @@ class CMBRAPIController extends Controller public function uploadArrivePhotos(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->uploadArrivePhotos($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -571,15 +621,17 @@ class CMBRAPIController extends Controller public function uploadFinishPhotos(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new APIResult(); + $res = new NewAPIResult(); $data = $rapi_handler->uploadFinishPhotos($req); if (isset($data['error'])) { $message = $data['error']; + $title = $data['title']; $res->setError(true) + ->setErrorTitle($title) ->setErrorMessage($message); } else @@ -590,7 +642,4 @@ class CMBRAPIController extends Controller // response return $res->getReturnResponse(); } - - - } diff --git a/src/Ramcar/NewAPIResult.php b/src/Ramcar/NewAPIResult.php new file mode 100644 index 00000000..5c46bc21 --- /dev/null +++ b/src/Ramcar/NewAPIResult.php @@ -0,0 +1,92 @@ +err_title = ''; + $this->err_flag = false; + $this->err_message = ''; + $this->data = []; + } + + public function setError($flag = true) + { + $this->err_flag = $flag; + return $this; + } + + public function isError() + { + return $this->err_flag; + } + + public function setErrorMessage($message) + { + $this->err_message = $message; + return $this; + } + + public function getErrorMessage() + { + return $this->err_message; + } + + public function setData($data) + { + $this->data = $data; + return $this; + } + + public function getData() + { + return $this->data; + } + + public function setErrorTitle($title) + { + $this->err_title = $title; + return $this; + } + + public function getErrorTitle() + { + return $this->err_title; + } + + + public function getReturnResponse() + { + if ($this->isError()) + $status = 'error'; + else + $status = 'success'; + + if (count($this->data) == 0) + $this->data = new \stdClass(); + + $return_data = [ + 'error' => [ + 'title' => $this->err_title, + 'status' => $status, + 'message' => $this->err_message + ], + 'data' => $this->data + ]; + + // $json_data = json_encode($return_data, JSON_NUMERIC_CHECK); + $json_data = json_encode($return_data); + $json = new Response($json_data); + + return $json; + } +} diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index d17cced8..91737484 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -88,6 +88,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface { $params = implode(', ', $missing); $data = [ + 'title' => 'Failed Registration', 'error' => 'Missing parameter(s): ' . $params ]; return $data; @@ -149,12 +150,16 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface ]; $data = $this->checkParamsAndKey($req, $required_params); if (isset($data['error'])) + { + $data['title'] = 'Failed Login'; return $data; + } // check if session has a rider already if ($this->session->hasRider()) { $data = [ + 'title' => 'Failed Login', 'error' => 'Another rider is already logged in. Please logout first.' ]; return $data; @@ -165,6 +170,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface if ($rider == null) { $data = [ + 'title' => 'Failed Login', 'error' => 'Invalid username or password.' ]; return $data; @@ -175,6 +181,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface if (!$encoder->isPasswordValid($rider->getPassword(), $req->request->get('pass'), '')) { $data = [ + 'title' => 'Failed Login', 'error' => 'Invalid username or password.' ]; return $data; @@ -232,7 +239,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $required_params = []; $data = $this->checkParamsAndKey($req, $required_params); if (isset($data['error'])) + { + $data['title'] = 'Failed Logout'; return $data; + } // make rider unavailable $rider = $this->session->getRider(); @@ -258,7 +268,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $required_params = []; $data = $this->checkParamsAndKey($req, $required_params); if (isset($data['error'])) + { + $data['title'] = 'Failed Go Online'; return $data; + } // set rider to available to take on JOs $rider = $this->session->getRider(); @@ -275,7 +288,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $required_params = []; $data = $this->checkParamsAndKey($req, $required_params); if (isset($data['error'])) + { + $data['title'] = 'Failed Go Offline'; return $data; + } // set rider to unavailable to take on JOs $rider = $this->session->getRider(); @@ -293,12 +309,16 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $required_params = []; $data = $this->checkParamsAndKey($req, $required_params); if (isset($data['error'])) + { + $data['title'] = 'Failed Get Job Order History'; return $data; + } // are we logged in? if (!$this->session->hasRider()) { $data = [ + 'title' => 'Failed Get Job Order History', 'error' => 'No logged in rider.' ]; return $data; @@ -450,12 +470,16 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $required_params = []; $data = $this->checkParamsAndKey($req, $required_params); if (isset($data['error'])) + { + $data['title'] = 'Failed Get Assigned Job Orders'; return $data; + } // are we logged in? if (!$this->session->hasRider()) { $data = [ + 'title' => 'Failed Get Assigned Job Orders', 'error' => 'No logged in rider.' ]; return $data; @@ -585,7 +609,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface ]; $data = $this->checkJO($req, $required_params, $jo); if (isset($data['error'])) + { + $data['title'] = 'Failed Get Job Order'; return $data; + } $coord = $jo->getCoordinates(); $cust = $jo->getCustomer(); @@ -686,7 +713,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface ]; $data = $this->checkJO($req, $required_params, $jo); if (isset($data['error'])) + { + $data['title'] = 'Failed Accept Job Order'; return $data; + } // TODO: refactor this into a jo handler class, so we don't have to repeat for control center // TODO: send mqtt event (?) @@ -709,7 +739,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $required_params = ['jo_id']; $data = $this->checkActiveJO($req, $required_params, $jo); if (isset($data['error'])) + { + $data['title'] = 'Failed Set Job Order in Transit'; return $data; + } // set jo status to in transit $jo->setStatus(JOStatus::IN_TRANSIT); @@ -739,7 +772,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface ]; $data = $this->checkJO($req, $required_params, $jo); if (isset($data['error'])) + { + $data['title'] = 'Failed Job Order Cancellation'; return $data; + } $cancel_reason = $req->request->get('cancel_reason'); @@ -766,7 +802,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface ]; $data = $this->checkJO($req, $required_params, $jo); if (isset($data['error'])) + { + $data['title'] = 'Failed Job Order Rejection'; return $data; + } $jo->requeue(); @@ -799,7 +838,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $required_params = ['jo_id']; $data = $this->checkActiveJO($req, $required_params, $jo); if (isset($data['error'])) + { + $data['title'] = 'Failed Arrive'; return $data; + } // TODO: refactor this into a jo handler class, so we don't have to repeat for control center @@ -865,7 +907,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $required_params = ['jo_id']; $data = $this->checkActiveJO($req, $required_params, $jo); if (isset($data['error'])) + { + $data['title'] = 'Failed Payment'; return $data; + } // set invoice to paid $jo->getInvoice()->setStatus(InvoiceStatus::PAID); @@ -889,7 +934,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $required_params = []; $data = $this->checkParamsAndKey($req, $required_params); if (isset($data['error'])) + { + $data['title'] = 'Failed Available Rider'; return $data; + } // make rider available $this->session->getRider()->setAvailable(true); @@ -905,7 +953,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $required_params = []; $data = $this->checkParamsAndKey($req, $required_params); if (isset($data['error'])) + { + $data['title'] = 'Failed Get Promos'; return $data; + } $promos = $this->em->getRepository(Promo::class)->findAll(); @@ -932,7 +983,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $required_params = []; $data = $this->checkParamsAndKey($req, $required_params); if (isset($data['error'])) + { + $data['title'] = 'Failed Get Batteries'; return $data; + } $batts = $this->em->getRepository(Battery::class)->findAll(); $models = $this->em->getRepository(BatteryModel::class)->findAll(); @@ -984,13 +1038,17 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $required_params = ['jo_id', 'service_type', 'promo_id']; $data = $this->checkJO($req, $required_params, $jo); if (isset($data['error'])) + { + $data['title'] = 'Failed Service Change'; return $data; + } // check service type $service_type = $req->request->get('service_type'); if (!ServiceType::validate($service_type)) { $data = [ + 'title' => 'Failed Service Change', 'error' => 'Invalid service type - ' . $service_type ]; return $data; @@ -1007,6 +1065,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface if ($promo == null) { $data = [ + 'title' => 'Failed Service Change', 'error' => 'Invalid promo id - ' . $promo_id ]; return $data; @@ -1045,6 +1104,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface if ($battery == null) { $data = [ + 'title' => 'Failed Service Change', 'error' => 'Invalid battery id - ' . $batt_id ]; return $data; @@ -1111,7 +1171,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $required_params = ['jo_id']; $data = $this->checkActiveJO($req, $required_params, $jo); if (isset($data['error'])) + { + $data['title'] = 'Failed Invoice Generation'; return $data; + } $inv = $jo->getInvoice(); $promo = $inv->getPromo(); @@ -1176,7 +1239,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $required_params = ['jo_id']; $data = $this->checkActiveJO($req, $required_params, $jo); if (isset($data['error'])) + { + $data['title'] = 'Failed Job Order Start'; return $data; + } // add event log $rider = $this->session->getRider(); @@ -1197,7 +1263,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $required_params = ['jo_id']; $data = $this->checkActiveJO($req, $required_params, $jo); if (isset($data['error'])) + { + $data['title'] = 'Failed Job Order Completion'; return $data; + } /* // set jo status to fulfilled @@ -1286,7 +1355,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface ]; $data = $this->checkJO($req, $required_params, $jo); if (isset($data['error'])) + { + $data['title'] = 'Failed Set Active Job Order'; return $data; + } $rider = $this->session->getRider(); $rider->setActiveJobOrder($jo); @@ -1305,7 +1377,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface ]; $data = $this->checkActiveJO($req, $required_params, $jo); if (isset($data['error'])) + { + $data['title'] = 'Failed Set Odometer'; return $data; + } $odometer_reading = $req->request->get('odometer'); @@ -1323,7 +1398,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface ]; $data = $this->checkActiveJO($req, $required_params, $jo); if (isset($data['error'])) + { + $data['title'] = 'Failed Upload Arrive Photos'; return $data; + } $dest = $this->upload_dir; @@ -1336,36 +1414,70 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface (empty($plate_num_img_file))) { $data = [ + 'title' => 'Failed Upload Arrive Photos', 'error' => 'No image files received.' ]; return $data; } else { - // save speedometer file - $orig_speed_filename = pathinfo($speed_img_file->getClientOriginalName(), PATHINFO_FILENAME); - $new_speed_filename = uniqid() . '-'. $orig_speed_filename . '.' . $speed_img_file->guessClientExtension(); - - // save battery file - $orig_batt_filename = pathinfo($batt_img_file->getClientOriginalName(), PATHINFO_FILENAME); - $new_batt_filename = uniqid() . '-' . $orig_batt_filename . '.' . $batt_img_file->guessClientExtension(); + $new_speed_filename = ''; + $new_batt_filename = ''; + $new_plate_num_filename = ''; - // save plate number file - $orig_plate_num_filename = pathinfo($plate_num_img_file->getClientOriginalName(), PATHINFO_FILENAME); - $new_plate_num_filename = uniqid() . '-' . $orig_plate_num_filename . '.' . $plate_num_img_file->guessClientExtension(); - - try + if (!empty($speed_img_file)) { - $speed_img_file->move($dest, $new_speed_filename); - $batt_img_file->move($dest, $new_batt_filename); - $plate_num_img_file->move($dest, $new_plate_num_filename); + // save speedometer file + $orig_speed_filename = pathinfo($speed_img_file->getClientOriginalName(), PATHINFO_FILENAME); + $new_speed_filename = uniqid() . '-'. $orig_speed_filename . '.' . $speed_img_file->guessClientExtension(); + + try + { + $speed_img_file->move($dest, $new_speed_filename); + } + catch (FileException $e) + { + $data = [ + 'error' => 'Error saving image files.' + ]; + return $data; + } } - catch (FileException $e) + if (!empty($batt_img_file)) + { + // save battery file + $orig_batt_filename = pathinfo($batt_img_file->getClientOriginalName(), PATHINFO_FILENAME); + $new_batt_filename = uniqid() . '-' . $orig_batt_filename . '.' . $batt_img_file->guessClientExtension(); + + try + { + $batt_img_file->move($dest, $new_batt_filename); + } + catch (FileException $e) + { + $data = [ + 'error' => 'Error saving image files.' + ]; + return $data; + } + } + if (!empty($plate_num_img_file)) { - $data = [ - 'error' => 'Error saving image files.' - ]; - return $data; + // save plate number file + $orig_plate_num_filename = pathinfo($plate_num_img_file->getClientOriginalName(), PATHINFO_FILENAME); + $new_plate_num_filename = uniqid() . '-' . $orig_plate_num_filename . '.' . $plate_num_img_file->guessClientExtension(); + + try + { + $plate_num_img_file->move($dest, $new_plate_num_filename); + } + catch (FileException $e) + { + $data = [ + 'error' => 'Error saving image files.' + ]; + return $data; + } } $jo_extra = $jo->getJOExtra(); @@ -1402,7 +1514,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface ]; $data = $this->checkActiveJO($req, $required_params, $jo); if (isset($data['error'])) + { + $data['title'] = 'Failed Upload Finish Photos'; return $data; + } $dest = $this->upload_dir; @@ -1415,36 +1530,70 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface (empty($plate_num_img_file))) { $data = [ + 'title' => 'Failed Upload Arrive Photos', 'error' => 'No image files received.' ]; return $data; } else { - // save speedometer file - $orig_speed_filename = pathinfo($speed_img_file->getClientOriginalName(), PATHINFO_FILENAME); - $new_speed_filename = uniqid() . '-'. $orig_speed_filename . '.' . $speed_img_file->guessClientExtension(); + $new_speed_filename = ''; + $new_batt_filename = ''; + $new_plate_num_filename = ''; - // save battery file - $orig_batt_filename = pathinfo($batt_img_file->getClientOriginalName(), PATHINFO_FILENAME); - $new_batt_filename = uniqid() . '-' . $orig_batt_filename . '.' . $batt_img_file->guessClientExtension(); - - // save plate number file - $orig_plate_num_filename = pathinfo($plate_num_img_file->getClientOriginalName(), PATHINFO_FILENAME); - $new_plate_num_filename = uniqid() . '-' . $orig_plate_num_filename . '.' . $plate_num_img_file->guessClientExtension(); - - try + if (!empty($speed_img_file)) { - $speed_img_file->move($dest, $new_speed_filename); - $batt_img_file->move($dest, $new_batt_filename); - $plate_num_img_file->move($dest, $new_plate_num_filename); + // save speedometer file + $orig_speed_filename = pathinfo($speed_img_file->getClientOriginalName(), PATHINFO_FILENAME); + $new_speed_filename = uniqid() . '-'. $orig_speed_filename . '.' . $speed_img_file->guessClientExtension(); + + try + { + $speed_img_file->move($dest, $new_speed_filename); + } + catch (FileException $e) + { + $data = [ + 'error' => 'Error saving image files.' + ]; + return $data; + } } - catch (FileException $e) + if (!empty($batt_img_file)) { - $data = [ - 'error' => 'Error saving image files.' - ]; - return $data; + // save battery file + $orig_batt_filename = pathinfo($batt_img_file->getClientOriginalName(), PATHINFO_FILENAME); + $new_batt_filename = uniqid() . '-' . $orig_batt_filename . '.' . $batt_img_file->guessClientExtension(); + + try + { + $batt_img_file->move($dest, $new_batt_filename); + } + catch (FileException $e) + { + $data = [ + 'error' => 'Error saving image files.' + ]; + return $data; + } + } + if (!empty($plate_num_img_file)) + { + // save plate number file + $orig_plate_num_filename = pathinfo($plate_num_img_file->getClientOriginalName(), PATHINFO_FILENAME); + $new_plate_num_filename = uniqid() . '-' . $orig_plate_num_filename . '.' . $plate_num_img_file->guessClientExtension(); + + try + { + $plate_num_img_file->move($dest, $new_plate_num_filename); + } + catch (FileException $e) + { + $data = [ + 'error' => 'Error saving image files.' + ]; + return $data; + } } $jo_extra = $jo->getJOExtra();