From ce2b838ff743d09ac06cd8dd31c6bc2cede5b7b7 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 29 May 2020 07:20:00 +0000 Subject: [PATCH 001/138] 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 002/138] 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 003/138] 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 004/138] 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 005/138] 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 006/138] 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 007/138] 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 008/138] 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 009/138] 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 010/138] 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 011/138] 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 012/138] 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 013/138] 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 014/138] 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 015/138] 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 016/138] 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 017/138] 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 018/138] 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 019/138] 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 020/138] 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 021/138] 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(); From 661e048206287b5622a3c3c92e6ee0c9124c77b2 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 16 Jun 2020 03:58:39 +0000 Subject: [PATCH 022/138] Add checking for rider availability when saving JO. #422 --- src/Service/JobOrderHandler/CMBJobOrderHandler.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 862d431b..03f84e44 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -544,6 +544,10 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface if (empty($rider)) { $error_array['rider'] = 'Invalid rider specified.'; + } else { + // check if rider is still available + if (!($rider->isAvailable())) + $error_array['rider'] = 'Selected rider is unavailable.'; } } } From 753c77773dab90f80933aa33b18e8ffaf102aded Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 17 Jun 2020 02:03:50 +0000 Subject: [PATCH 023/138] Use CMBServiceType to check service type. #425 --- .../RiderAPIHandler/CMBRiderAPIHandler.php | 1256 ++++++++++++++--- 1 file changed, 1069 insertions(+), 187 deletions(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 3c0236e1..8231d2ac 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -7,9 +7,9 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface; use App\Ramcar\CMBServiceType; -use App\Ramcar\CMBTradeInType; +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; @@ -30,12 +30,16 @@ use App\Entity\Promo; use App\Entity\Battery; use App\Entity\BatteryModel; use App\Entity\BatterySize; -use App\Entity\Warranty; +use App\Entity\JobOrder; +use App\Entity\JOExtra; use DateTime; +use DateInterval; class CMBRiderAPIHandler implements RiderAPIHandlerInterface { + // NOTE: Rider's constructor sets flag_available and flag_active to true, by default. + protected $em; protected $redis; protected $ef; @@ -46,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; @@ -62,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 @@ -82,6 +88,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface { $params = implode(', ', $missing); $data = [ + 'title' => 'Failed Registration', 'error' => 'Missing parameter(s): ' . $params ]; return $data; @@ -143,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; @@ -159,6 +170,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface if ($rider == null) { $data = [ + 'title' => 'Failed Login', 'error' => 'Invalid username or password.' ]; return $data; @@ -169,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; @@ -177,7 +190,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) @@ -225,11 +239,16 @@ 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(); + $rider->setAvailable(false); + $rider->setActive(false); // remove from cache $this->rcache->removeActiveRider($rider->getID()); @@ -244,18 +263,62 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } - public function getJobOrder(Request $req) + public function goOnline(Request $req) { - // get the job order of the rider assigned to this session $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(); + + $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'])) + { + $data['title'] = 'Failed Go Offline'; + 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, $period) + { + $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; @@ -263,117 +326,423 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $rider = $this->session->getRider(); - // do we have a job order? - $jo = $rider->getActiveJobOrder(); - if ($jo == null) + // get JOs assigned to rider for the month given + // setup start date and end dates + // get current year + $current_date = new DateTime(); + + if ($period == 'lastmonth') + { + $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, $period_month, $period_year); + + $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'); + + $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 getAssignedJobOrders(Request $req) + { + $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 = [ - 'job_order' => null + 'title' => 'Failed Get Assigned Job Orders', + '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 = [ + 'assigned_jos' => $jo_data, + ]; + + return $data; + } + + public function getJobOrder(Request $req) + { + $required_params = [ + 'jo_id' + ]; + $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(); + $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 { - $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'])) + { + $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 (?) + // add event log + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(CMBJOEventType::RIDER_ACCEPT) + ->setJobOrder($jo) + ->setRider($rider); + $this->em->persist($event); + + $this->em->flush(); + + return $data; + } + + public function setJobOrderInTransit(Request $req) + { + $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); @@ -384,7 +753,39 @@ 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); + + $this->em->flush(); + + return $data; + + } + + public function cancelJobOrder(Request $req) + { + $required_params = [ + 'jo_id', + 'cancel_reason' + ]; + $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'); + + $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); @@ -394,22 +795,27 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } - public function cancelJobOrder(Request $req) + public function rejectJobOrder(Request $req) { - $required_params = ['jo_id']; + $required_params = [ + 'jo_id' + ]; $data = $this->checkJO($req, $required_params, $jo); if (isset($data['error'])) + { + $data['title'] = 'Failed Job Order Rejection'; return $data; + } - // $jo->cancel("rider cancelled"); - // requeue it, instead of cancelling it $jo->requeue(); + // TODO: do we leave JO as assigned to rider? + // add event log $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); @@ -430,9 +836,12 @@ 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'])) + { + $data['title'] = 'Failed Arrive'; return $data; + } // TODO: refactor this into a jo handler class, so we don't have to repeat for control center @@ -443,7 +852,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); @@ -484,7 +893,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(); @@ -494,90 +905,27 @@ 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'])) + { + $data['title'] = 'Failed Payment'; 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(JOEventType::FULFILL) + ->setTypeID(CMBJOEventType::PAID) ->setJobOrder($jo) ->setRider($rider); $this->em->persist($event); - // TODO: tag rider as unavailable - - // save to customer vehicle battery record - $this->jo_handler->updateVehicleBattery($jo); - $this->em->flush(); - // create warranty - if($this->jo_handler->checkIfNewBattery($jo)) - { - $serial = $jo->getCustomerVehicle()->getWarrantyCode(); - $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(); - - // validate plate number - // $plate_number = $this->wh->cleanPlateNumber($jo->getCustomerVehicle()->getPlateNumber()); - $plate_number = Warranty::cleanPlateNumber($jo->getCustomerVehicle()->getPlateNumber()); - if ($plate_number != false) - { - $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; } @@ -586,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); @@ -602,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(); @@ -629,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(); @@ -678,17 +1035,21 @@ 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'])) + { + $data['title'] = 'Failed Service Change'; return $data; + } // check service type - $stype_id = $req->request->get('stype_id'); - if (!CMBServiceType::validate($stype_id)) + $service_type = $req->request->get('service_type'); + if (!CMBServiceType::validate($service_type)) { $data = [ - 'error' => 'Invalid service type - ' . $stype_id + 'title' => 'Failed Service Change', + 'error' => 'Invalid service type - ' . $service_type ]; return $data; } @@ -704,6 +1065,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface if ($promo == null) { $data = [ + 'title' => 'Failed Service Change', 'error' => 'Invalid promo id - ' . $promo_id ]; return $data; @@ -742,6 +1104,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface if ($battery == null) { $data = [ + 'title' => 'Failed Service Change', 'error' => 'Invalid battery id - ' . $batt_id ]; return $data; @@ -750,7 +1113,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 @@ -761,7 +1124,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()); @@ -782,7 +1145,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $this->em->flush(); // save job order - $jo->setServiceType($stype_id); + $jo->setServiceType($service_type); // save invoice $jo->setInvoice($invoice); @@ -792,7 +1155,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); @@ -803,6 +1166,463 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + public function generateInvoice(Request $req) + { + $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(); + + // 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; + } + + public function startJobOrder(Request $req) + { + $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(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(CMBJOEventType::RIDER_START) + ->setJobOrder($jo) + ->setRider($rider); + $this->em->persist($event); + + $this->em->flush(); + + return $data; + } + + public function completeJobOrder(Request $req) + { + $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 + $jo->setStatus(JOStatus::FULFILLED); + */ + $jo->fulfill(); + + // add event log + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->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; + } + + public function setActiveJobOrder(Request $req) + { + $required_params = [ + 'jo_id' + ]; + $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); + + $this->em->persist($rider); + $this->em->flush(); + + return $data; + } + + public function setOdometer(Request $req) + { + $required_params = [ + 'jo_id', + 'odometer' + ]; + $data = $this->checkActiveJO($req, $required_params, $jo); + if (isset($data['error'])) + { + $data['title'] = 'Failed Set Odometer'; + return $data; + } + + $odometer_reading = $req->request->get('odometer'); + + $jo->addMeta('odometer', $odometer_reading); + + $this->em->flush(); + + return $data; + } + + public function uploadArrivePhotos(Request $req) + { + $required_params = [ + 'jo_id', + ]; + $data = $this->checkActiveJO($req, $required_params, $jo); + if (isset($data['error'])) + { + $data['title'] = 'Failed Upload Arrive Photos'; + 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 = [ + 'title' => 'Failed Upload Arrive Photos', + 'error' => 'No image files received.' + ]; + return $data; + } + else + { + $new_speed_filename = ''; + $new_batt_filename = ''; + $new_plate_num_filename = ''; + + if (!empty($speed_img_file)) + { + // 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; + } + } + 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)) + { + // 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(); + 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->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->flush(); + } + + return $data; + } + + public function uploadFinishPhotos(Request $req) + { + $required_params = [ + 'jo_id', + ]; + $data = $this->checkActiveJO($req, $required_params, $jo); + if (isset($data['error'])) + { + $data['title'] = 'Failed Upload Finish Photos'; + 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 = [ + 'title' => 'Failed Upload Arrive Photos', + 'error' => 'No image files received.' + ]; + return $data; + } + else + { + $new_speed_filename = ''; + $new_batt_filename = ''; + $new_plate_num_filename = ''; + + if (!empty($speed_img_file)) + { + // 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; + } + } + 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)) + { + // 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(); + 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; + } + protected function checkMissingParameters(Request $req, $params = []) { $missing = []; @@ -880,7 +1700,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); @@ -907,9 +1727,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.' @@ -920,6 +1745,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 0a06a7ad31b9b17f93dcefb622813ade74064267 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 17 Jun 2020 08:49:52 +0000 Subject: [PATCH 024/138] Add command to copy the config and messages files. #426 --- composer.lock | 14 +- resq_settings/cmb/menu.yaml | 179 +++++++++++++++++++ resq_settings/cmb/messages.en.yaml | 27 +++ resq_settings/cmb/services.yaml | 246 +++++++++++++++++++++++++++ resq_settings/resq/menu.yaml | 186 ++++++++++++++++++++ resq_settings/resq/messages.en.yaml | 27 +++ resq_settings/resq/services.yaml | 244 ++++++++++++++++++++++++++ src/Command/ConfigureResqCommand.php | 55 ++++++ 8 files changed, 971 insertions(+), 7 deletions(-) create mode 100644 resq_settings/cmb/menu.yaml create mode 100644 resq_settings/cmb/messages.en.yaml create mode 100644 resq_settings/cmb/services.yaml create mode 100644 resq_settings/resq/menu.yaml create mode 100644 resq_settings/resq/messages.en.yaml create mode 100644 resq_settings/resq/services.yaml create mode 100644 src/Command/ConfigureResqCommand.php diff --git a/composer.lock b/composer.lock index 1e76e914..3d02c0bb 100644 --- a/composer.lock +++ b/composer.lock @@ -1,7 +1,7 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], "content-hash": "f03b92d48946e8b2ee19466f931c826f", @@ -3214,20 +3214,20 @@ }, { "name": "symfony/filesystem", - "version": "v4.4.4", + "version": "v4.4.10", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "266c9540b475f26122b61ef8b23dd9198f5d1cfd" + "reference": "b27f491309db5757816db672b256ea2e03677d30" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/266c9540b475f26122b61ef8b23dd9198f5d1cfd", - "reference": "266c9540b475f26122b61ef8b23dd9198f5d1cfd", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b27f491309db5757816db672b256ea2e03677d30", + "reference": "b27f491309db5757816db672b256ea2e03677d30", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/polyfill-ctype": "~1.8" }, "type": "library", @@ -3260,7 +3260,7 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2020-01-21T08:20:44+00:00" + "time": "2020-05-30T18:50:54+00:00" }, { "name": "symfony/finder", diff --git a/resq_settings/cmb/menu.yaml b/resq_settings/cmb/menu.yaml new file mode 100644 index 00000000..9f28b315 --- /dev/null +++ b/resq_settings/cmb/menu.yaml @@ -0,0 +1,179 @@ +main_menu: + - id: home + acl: dashboard.menu + label: Dashboard + icon: flaticon-line-graph + - id: user + acl: user.menu + label: User + icon: flaticon-users + - id: user_list + acl: user.list + label: Users + parent: user + - id: role_list + acl: role.list + label: Roles + parent: user + + - id: apiuser + acl: apiuser.menu + label: API User + icon: flaticon-users + - id: api_user_list + acl: apiuser.list + label: API Users + parent: apiuser + - id: api_role_list + acl: apirole.list + label: API Roles + parent: apiuser + + - id: logistics + acl: logistics.menu + label: Logistics + icon: fa fa-truck + - id: rider_list + acl: rider.list + label: Riders + parent: logistics + - id: service_charge_list + acl: service_charge.list + label: Service Charges + parent: logistics + + - id: battery + acl: battery.menu + label: Battery + icon: fa fa-battery-3 + - id: battery_list + acl: battery.list + label: Batteries + parent: battery + - id: bmfg_list + acl: bmfg.list + label: Manufacturers + parent: battery + - id: bmodel_list + acl: bmodel.list + label: Models + parent: battery + - id: bsize_list + acl: bsize.list + label: Sizes + parent: battery + - id: promo_list + acl: promo.list + label: Promos + parent: battery + + - id: vehicle + acl: vehicle.menu + label: Vehicle + icon: fa fa-car + - id: vehicle_list + acl: vehicle.list + label: Vehicles + parent: vehicle + - id: vmfg_list + acl: vmfg.list + label: Manufacturers + parent: vehicle + + - id: location + acl: location.menu + label: Location + icon: fa fa-home + - id: outlet_list + acl: outlet.menu + label: Outlet + parent: location + - id: hub_list + acl: hub.menu + label: Hub + parent: location + - id: geofence_list + acl: geofence.menu + label: Geofence + parent: location + + + - id: joborder + acl: joborder.menu + label: Job Order + icon: flaticon-calendar-3 + - id: jo_onestep_form + acl: jo_onestep.form + label: One-step Process + parent: joborder + - id: jo_walkin_form + acl: jo_walkin.form + label: Walk-in + parent: joborder + - id: jo_open + acl: jo_open.list + label: Open + parent: joborder + - id: jo_all + acl: jo_all.list + label: View All + parent: joborder + + - id: support + acl: support.menu + label: Customer Support + icon: flaticon-support + - id: customer_list + acl: customer.list + label: Customers + parent: support + - id: ticket_list + acl: ticket.list + label: Tickets + parent: support + - id: general_search + acl: general.search + label: Search + parent: support + - id: warranty_search + acl: warranty.search + label: Customer Battery Search + parent: support + - id: privacy_policy_list + acl: privacy_policy.list + label: Privacy Policy + parent: support + - id: warranty_list + acl: warranty.list + label: Warranty + parent: support + - id: warranty_upload + acl: warranty.upload + label: Warranty Upload + parent: support + - id: static_content_list + acl: static_content.list + label: Static Content + parent: support + + - id: service + acl: service.menu + label: Other Services + icon: flaticon-squares + - id: service_list + acl: service.list + label: Services + parent: service + + - id: partner + acl: partner.menu + label: Partners + icon: flaticon-network + - id: partner_list + acl: partner.list + label: Partners + parent: partner + - id: review_list + acl: review.list + label: Reviews + parent: partner diff --git a/resq_settings/cmb/messages.en.yaml b/resq_settings/cmb/messages.en.yaml new file mode 100644 index 00000000..3e12543b --- /dev/null +++ b/resq_settings/cmb/messages.en.yaml @@ -0,0 +1,27 @@ +# text +title_login: Res-Q for CMB | Login +block_title: Res-Q for CMB +control_panel_sign_in: Sign-in to Control Panel +alt_image_logo_login: Res-Q for CMB +alt_image_dashboard: Res-Q for CMB +copyright: Res-Q for CMB +battery_size_tradein_brand: Trade-in Motolite +battery_size_tradein_premium: Trade-in Premium +battery_size_tradein_other: Trade-in Other +add_cust_vehicle_battery_info: This vehicle is using a Motolite battery +jo_title_pdf: Res-Q for CMB Job Order +country_code_prefix: '+60' +delivery_instructions_label: 'CarFix Details' + +# images +image_logo_login: /assets/images/black-text-logo-01.png +icon_login: /assets/images/battery-assist-bm-logo-32x32.png +icon_base_32x32: /assets/images/black-text-logo-01-32x32.png +icon_base_16x16: /assets/images/black-text-logo-01-16x16.png +image_dashboard: /assets/images/century_logo.png +image_jo_pdf: /public/assets/images/black-text-logo-01-115x115.png + +# default point for maps +default_lat: 3.084216 +default_long: 101.6129996 +default_region: my diff --git a/resq_settings/cmb/services.yaml b/resq_settings/cmb/services.yaml new file mode 100644 index 00000000..3d9fd7a3 --- /dev/null +++ b/resq_settings/cmb/services.yaml @@ -0,0 +1,246 @@ +# Put parameters here that don't need to change on each machine where the app is deployed +# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration +parameters: + map_default: + 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' + app_acl_file: 'acl.yaml' + 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 + _defaults: + autowire: true # Automatically injects dependencies in your services. + autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. + public: false # Allows optimizing the container by removing unused services; this also means + # fetching services directly from the container via $container->get() won't work. + # The best practice is to be explicit about your dependencies anyway. + + # makes classes in src/ available to be used as services + # this creates a service per class whose id is the fully-qualified class name + App\: + resource: '../src/*' + exclude: '../src/{Entity,Migrations,Tests,Menu,Access}' + + # controllers are imported separately to make sure services can be injected + # as action arguments even if you don't extend any base controller class + App\Controller\: + resource: '../src/Controller' + tags: ['controller.service_arguments'] + + # add more service definitions when explicit configuration is needed + # please note that last definitions always *replace* previous ones + App\Menu\Generator: + arguments: + $router: "@router.default" + $cache_dir: "%kernel.cache_dir%" + $config_dir: "%kernel.root_dir%/../config" + + Catalyst\AuthBundle\Service\ACLGenerator: + arguments: + $router: "@router.default" + $cache_dir: "%kernel.cache_dir%" + $config_dir: "%kernel.root_dir%/../config" + $acl_file: "%app_acl_file%" + + Catalyst\AuthBundle\Service\ACLVoter: + arguments: + $user_class: "App\\Entity\\User" + tags: ['security.voter'] + + Catalyst\AuthBundle\Service\UserChecker: + + App\Service\FileUploader: + arguments: + $target_dir: '%image_upload_directory%' + + App\Service\MapTools: + arguments: + $em: "@doctrine.orm.entity_manager" + $gmaps_api_key: "%env(GMAPS_API_KEY)%" + $cust_dist_limit: "%env(CUST_DISTANCE_LIMIT)%" + + App\Service\RisingTideGateway: + arguments: + $em: "@doctrine.orm.entity_manager" + $user: "%env(RT_USER)%" + $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: + $redis_client: "@App\\Service\\RedisClientProvider" + $key: "mqtt_events" + + App\Service\APNSClient: + arguments: + $redis_client: "@App\\Service\\RedisClientProvider" + + App\Service\RedisClientProvider: + arguments: + $scheme: "%env(REDIS_CLIENT_SCHEME)%" + $host: "%env(REDIS_CLIENT_HOST)%" + $port: "%env(REDIS_CLIENT_PORT)%" + $password: "%env(REDIS_CLIENT_PASSWORD)%" + + App\Service\GeofenceTracker: + arguments: + $geofence_flag: "%env(GEOFENCE_ENABLE)%" + + App\Service\WarrantyHandler: + arguments: + $em: "@doctrine.orm.entity_manager" + + App\Command\SetCustomerPrivacyPolicyCommand: + arguments: + $policy_promo: "%env(POLICY_PROMO)%" + $policy_third_party: "%env(POLICY_THIRD_PARTY)%" + $policy_mobile: "%env(POLICY_MOBILE)%" + + App\Command\CreateCustomerFromWarrantyCommand: + arguments: + $cvu_mfg_id: "%env(CVU_MFG_ID)%" + $cvu_brand_id: "%env(CVU_BRAND_ID)%" + + # rider tracker service + App\Service\RiderTracker: + arguments: + $redis_client: "@App\\Service\\RedisClientProvider" + + Catalyst\APIBundle\Security\APIKeyUserProvider: + arguments: + $em: "@doctrine.orm.entity_manager" + + Catalyst\APIBundle\Security\APIKeyAuthenticator: + arguments: + $em: "@doctrine.orm.entity_manager" + + Catalyst\APIBundle\Command\UserCreateCommand: + arguments: + $em: "@doctrine.orm.entity_manager" + tags: ['console.command'] + + Catalyst\APIBundle\Command\TestCommand: + tags: ['console.command'] + + Catalyst\APIBundle\Command\TestAPICommand: + tags: ['console.command'] + + Catalyst\APIBundle\Access\Voter: + arguments: + $acl_gen: "@Catalyst\\APIBundle\\Access\\Generator" + $user_class: "Catalyst\\APIBundle\\Entity\\User" + tags: ['security.voter'] + + Catalyst\APIBundle\Access\Generator: + arguments: + $router: "@router.default" + $cache_dir: "%kernel.cache_dir%" + $config_dir: "%kernel.root_dir%/../config" + $acl_file: "%api_acl_file%" + + Catalyst\MenuBundle\Menu\Generator: + arguments: + $router: "@router.default" + $cache_dir: "%kernel.cache_dir%" + $config_dir: "%kernel.root_dir%/../config" + + Catalyst\MenuBundle\Listener\MenuAnnotationListener: + arguments: + $menu_name: "main_menu" + tags: + - { name: kernel.event_listener, event: kernel.controller, method: onKernelController } + + # invoice generator + App\Service\InvoiceGenerator\CMBInvoiceGenerator: ~ + + # invoice generator interface + App\Service\InvoiceGeneratorInterface: "@App\\Service\\InvoiceGenerator\\CMBInvoiceGenerator" + + # job order generator + App\Service\JobOrderHandler\CMBJobOrderHandler: + arguments: + $country_code: "%env(COUNTRY_CODE)%" + + #job order generator interface + App\Service\JobOrderHandlerInterface: "@App\\Service\\JobOrderHandler\\CMBJobOrderHandler" + + # customer generator + App\Service\CustomerHandler\CMBCustomerHandler: + arguments: + $country_code: "%env(COUNTRY_CODE)%" + + # customer generator interface + App\Service\CustomerHandlerInterface: "@App\\Service\\CustomerHandler\\CMBCustomerHandler" + + # rider assignment + App\Service\RiderAssignmentHandler\CMBRiderAssignmentHandler: ~ + + # rider assignment interface + App\Service\RiderAssignmentHandlerInterface: "@App\\Service\\RiderAssignmentHandler\\CMBRiderAssignmentHandler" + + # rider API service + App\Service\RiderAPIHandler\CMBRiderAPIHandler: + arguments: + $country_code: "%env(COUNTRY_CODE)%" + $upload_dir: "%jo_extra_upload_directory%" + + App\Service\RiderAPIHandlerInterface: "@App\\Service\\RiderAPIHandler\\CMBRiderAPIHandler" + + # map manager + #App\Service\GISManager\Bing: ~ + App\Service\GISManager\OpenStreet: ~ + #App\Service\GISManager\Google: ~ + + #App\Service\GISManagerInterface: "@App\\Service\\GISManager\\Bing" + App\Service\GISManagerInterface: "@App\\Service\\GISManager\\OpenStreet" + #App\Service\GISManagerInterface: "@App\\Service\\GISManager\\Google" + + App\EventListener\JobOrderActiveCacheListener: + arguments: + $jo_cache: "@App\\Service\\JobOrderCache" + $mqtt: "@App\\Service\\MQTTClient" + tags: + - name: 'doctrine.orm.entity_listener' + event: 'postUpdate' + entity: 'App\Entity\JobOrder' + - name: 'doctrine.orm.entity_listener' + event: 'postRemove' + entity: 'App\Entity\JobOrder' + - name: 'doctrine.orm.entity_listener' + event: 'postPersist' + entity: 'App\Entity\JobOrder' + + App\Service\JobOrderCache: + arguments: + $redis_prov: "@App\\Service\\RedisClientProvider" + $active_jo_key: "%env(LOCATION_JO_ACTIVE_KEY)%" + + App\Service\RiderCache: + arguments: + $redis_prov: "@App\\Service\\RedisClientProvider" + $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: + $api_log_flag: "%env(API_LOGGING)%" diff --git a/resq_settings/resq/menu.yaml b/resq_settings/resq/menu.yaml new file mode 100644 index 00000000..69f0b806 --- /dev/null +++ b/resq_settings/resq/menu.yaml @@ -0,0 +1,186 @@ +main_menu: + - id: home + acl: dashboard.menu + label: Dashboard + icon: flaticon-line-graph + - id: user + acl: user.menu + label: User + icon: flaticon-users + - id: user_list + acl: user.list + label: Users + parent: user + - id: role_list + acl: role.list + label: Roles + parent: user + + - id: apiuser + acl: apiuser.menu + label: API User + icon: flaticon-users + - id: api_user_list + acl: apiuser.list + label: API Users + parent: apiuser + - id: api_role_list + acl: apirole.list + label: API Roles + parent: apiuser + + - id: logistics + acl: logistics.menu + label: Logistics + icon: fa fa-truck + - id: rider_list + acl: rider.list + label: Riders + parent: logistics + + - id: battery + acl: battery.menu + label: Battery + icon: fa fa-battery-3 + - id: battery_list + acl: battery.list + label: Batteries + parent: battery + - id: bmfg_list + acl: bmfg.list + label: Manufacturers + parent: battery + - id: bmodel_list + acl: bmodel.list + label: Models + parent: battery + - id: bsize_list + acl: bsize.list + label: Sizes + parent: battery + - id: promo_list + acl: promo.list + label: Promos + parent: battery + + - id: vehicle + acl: vehicle.menu + label: Vehicle + icon: fa fa-car + - id: vehicle_list + acl: vehicle.list + label: Vehicles + parent: vehicle + - id: vmfg_list + acl: vmfg.list + label: Manufacturers + parent: vehicle + + - id: location + acl: location.menu + label: Location + icon: fa fa-home + - id: outlet_list + acl: outlet.menu + label: Outlet + parent: location + - id: hub_list + acl: hub.menu + label: Hub + parent: location + - id: geofence_list + acl: geofence.menu + label: Geofence + parent: location + + + - id: joborder + acl: joborder.menu + label: Job Order + icon: flaticon-calendar-3 + - id: jo_in + acl: jo_in.list + label: Incoming + parent: joborder + - id: jo_proc + acl: jo_proc.list + label: Dispatch + parent: joborder + - id: jo_assign + acl: jo_assign.list + label: Rider Assignment + parent: joborder + - id: jo_fulfill + acl: jo_fulfill.list + label: Fulfillment + parent: joborder + - id: jo_open + acl: jo_open.list + label: Open + parent: joborder + - id: jo_all + acl: jo_all.list + label: View All + parent: joborder + - id: jo_hub.view + label: Hub View + parent: joborder + + - id: support + acl: support.menu + label: Customer Support + icon: flaticon-support + - id: customer_list + acl: customer.list + label: Customers + parent: support + - id: ticket_list + acl: ticket.list + label: Tickets + parent: support + - id: general_search + acl: general.search + label: Search + parent: support + - id: warranty_search + acl: warranty.search + label: Customer Battery Search + parent: support + - id: privacy_policy_list + acl: privacy_policy.list + label: Privacy Policy + parent: support + - id: warranty_list + acl: warranty.list + label: Warranty + parent: support + - id: warranty_upload + acl: warranty.upload + label: Warranty Upload + parent: support + - id: static_content_list + acl: static_content.list + label: Static Content + parent: support + + - id: service + acl: service.menu + label: Other Services + icon: flaticon-squares + - id: service_list + acl: service.list + label: Services + parent: service + + - id: partner + acl: partner.menu + label: Partners + icon: flaticon-network + - id: partner_list + acl: partner.list + label: Partners + parent: partner + - id: review_list + acl: review.list + label: Reviews + parent: partner diff --git a/resq_settings/resq/messages.en.yaml b/resq_settings/resq/messages.en.yaml new file mode 100644 index 00000000..c0fb8ca1 --- /dev/null +++ b/resq_settings/resq/messages.en.yaml @@ -0,0 +1,27 @@ +# text +title_login: Motolite Res-Q | Login +block_title: Motolite Res-Q +control_panel_sign_in: Sign-in to Control Panel +alt_image_logo_login: Res-Q +alt_image_dashboard: Motolite +copyright: Motolite Res-Q +battery_size_tradein_brand: Trade-in Motolite +battery_size_tradein_premium: Trade-in Premium +battery_size_tradein_other: Trade-in Other +add_cust_vehicle_battery_info: This vehicle is using a Motolite battery +jo_title_pdf: Motolite Res-Q Job Order +country_code_prefix: '+63' +delivery_instructions_label: Delivery Instructions + +# images +image_logo_login: /assets/images/logo-resq.png +icon_login: /assets/demo/default/media/img/logo/favicon.ico +icon_base_32x32: /assets/images/favicon/favicon-32x32.png +icon_base_16x16: /assets/images/favicon/favicon-16x16.png +image_dashboard: /assets/images/logo-motolite.png +image_jo_pdf: /public/assets/images/logo-resq.png + +# default point for maps +default_lat: 14.6091 +default_long: 121.0223 +default_region: ph diff --git a/resq_settings/resq/services.yaml b/resq_settings/resq/services.yaml new file mode 100644 index 00000000..7f568033 --- /dev/null +++ b/resq_settings/resq/services.yaml @@ -0,0 +1,244 @@ +# Put parameters here that don't need to change on each machine where the app is deployed +# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration +parameters: + map_default: + latitude: 14.6091 + longitude: 121.0223 + image_upload_directory: '%kernel.project_dir%/public/uploads' + job_order_refresh_interval: 300000 + api_acl_file: 'api_acl.yaml' + api_access_key: 'api_access_keys' + app_acl_file: 'acl.yaml' + 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 + _defaults: + autowire: true # Automatically injects dependencies in your services. + autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. + public: false # Allows optimizing the container by removing unused services; this also means + # fetching services directly from the container via $container->get() won't work. + # The best practice is to be explicit about your dependencies anyway. + + # makes classes in src/ available to be used as services + # this creates a service per class whose id is the fully-qualified class name + App\: + resource: '../src/*' + exclude: '../src/{Entity,Migrations,Tests,Menu,Access}' + + # controllers are imported separately to make sure services can be injected + # as action arguments even if you don't extend any base controller class + App\Controller\: + resource: '../src/Controller' + tags: ['controller.service_arguments'] + + # add more service definitions when explicit configuration is needed + # please note that last definitions always *replace* previous ones + App\Menu\Generator: + arguments: + $router: "@router.default" + $cache_dir: "%kernel.cache_dir%" + $config_dir: "%kernel.root_dir%/../config" + + Catalyst\AuthBundle\Service\ACLGenerator: + arguments: + $router: "@router.default" + $cache_dir: "%kernel.cache_dir%" + $config_dir: "%kernel.root_dir%/../config" + $acl_file: "%app_acl_file%" + + Catalyst\AuthBundle\Service\ACLVoter: + arguments: + $user_class: "App\\Entity\\User" + tags: ['security.voter'] + + Catalyst\AuthBundle\Service\UserChecker: + + App\Service\FileUploader: + arguments: + $target_dir: '%image_upload_directory%' + + App\Service\MapTools: + arguments: + $em: "@doctrine.orm.entity_manager" + $gmaps_api_key: "%env(GMAPS_API_KEY)%" + $cust_dist_limit: "%env(CUST_DISTANCE_LIMIT)%" + + App\Service\RisingTideGateway: + arguments: + $em: "@doctrine.orm.entity_manager" + $user: "%env(RT_USER)%" + $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: + $redis_client: "@App\\Service\\RedisClientProvider" + $key: "mqtt_events" + + App\Service\APNSClient: + arguments: + $redis_client: "@App\\Service\\RedisClientProvider" + + App\Service\RedisClientProvider: + arguments: + $scheme: "%env(REDIS_CLIENT_SCHEME)%" + $host: "%env(REDIS_CLIENT_HOST)%" + $port: "%env(REDIS_CLIENT_PORT)%" + $password: "%env(REDIS_CLIENT_PASSWORD)%" + + App\Service\GeofenceTracker: + arguments: + $geofence_flag: "%env(GEOFENCE_ENABLE)%" + + App\Service\WarrantyHandler: + arguments: + $em: "@doctrine.orm.entity_manager" + + App\Command\SetCustomerPrivacyPolicyCommand: + arguments: + $policy_promo: "%env(POLICY_PROMO)%" + $policy_third_party: "%env(POLICY_THIRD_PARTY)%" + $policy_mobile: "%env(POLICY_MOBILE)%" + + App\Command\CreateCustomerFromWarrantyCommand: + arguments: + $cvu_mfg_id: "%env(CVU_MFG_ID)%" + $cvu_brand_id: "%env(CVU_BRAND_ID)%" + + # rider tracker service + App\Service\RiderTracker: + arguments: + $redis_client: "@App\\Service\\RedisClientProvider" + + Catalyst\APIBundle\Security\APIKeyUserProvider: + arguments: + $em: "@doctrine.orm.entity_manager" + + Catalyst\APIBundle\Security\APIKeyAuthenticator: + arguments: + $em: "@doctrine.orm.entity_manager" + + Catalyst\APIBundle\Command\UserCreateCommand: + arguments: + $em: "@doctrine.orm.entity_manager" + tags: ['console.command'] + + Catalyst\APIBundle\Command\TestCommand: + tags: ['console.command'] + + Catalyst\APIBundle\Command\TestAPICommand: + tags: ['console.command'] + + Catalyst\APIBundle\Access\Voter: + arguments: + $acl_gen: "@Catalyst\\APIBundle\\Access\\Generator" + $user_class: "Catalyst\\APIBundle\\Entity\\User" + tags: ['security.voter'] + + Catalyst\APIBundle\Access\Generator: + arguments: + $router: "@router.default" + $cache_dir: "%kernel.cache_dir%" + $config_dir: "%kernel.root_dir%/../config" + $acl_file: "%api_acl_file%" + + Catalyst\MenuBundle\Menu\Generator: + arguments: + $router: "@router.default" + $cache_dir: "%kernel.cache_dir%" + $config_dir: "%kernel.root_dir%/../config" + + Catalyst\MenuBundle\Listener\MenuAnnotationListener: + arguments: + $menu_name: "main_menu" + tags: + - { name: kernel.event_listener, event: kernel.controller, method: onKernelController } + + # invoice generator + App\Service\InvoiceGenerator\ResqInvoiceGenerator: ~ + + # invoice generator interface + App\Service\InvoiceGeneratorInterface: "@App\\Service\\InvoiceGenerator\\ResqInvoiceGenerator" + + # job order generator + App\Service\JobOrderHandler\ResqJobOrderHandler: + arguments: + $country_code: "%env(COUNTRY_CODE)%" + + #job order generator interface + App\Service\JobOrderHandlerInterface: "@App\\Service\\JobOrderHandler\\ResqJobOrderHandler" + + # customer generator + App\Service\CustomerHandler\ResqCustomerHandler: + arguments: + $country_code: "%env(COUNTRY_CODE)%" + + # customer generator interface + App\Service\CustomerHandlerInterface: "@App\\Service\\CustomerHandler\\ResqCustomerHandler" + + # rider assignment + App\Service\RiderAssignmentHandler\ResqRiderAssignmentHandler: ~ + + # rider assignment interface + App\Service\RiderAssignmentHandlerInterface: "@App\\Service\\RiderAssignmentHandler\\ResqRiderAssignmentHandler" + + # rider API service + App\Service\RiderAPIHandler\ResqRiderAPIHandler: + arguments: + $country_code: "%env(COUNTRY_CODE)%" + + App\Service\RiderAPIHandlerInterface: "@App\\Service\\RiderAPIHandler\\ResqRiderAPIHandler" + + # map manager + #App\Service\GISManager\Bing: ~ + App\Service\GISManager\OpenStreet: ~ + #App\Service\GISManager\Google: ~ + + #App\Service\GISManagerInterface: "@App\\Service\\GISManager\\Bing" + App\Service\GISManagerInterface: "@App\\Service\\GISManager\\OpenStreet" + #App\Service\GISManagerInterface: "@App\\Service\\GISManager\\Google" + + App\EventListener\JobOrderActiveCacheListener: + arguments: + $jo_cache: "@App\\Service\\JobOrderCache" + $mqtt: "@App\\Service\\MQTTClient" + tags: + - name: 'doctrine.orm.entity_listener' + event: 'postUpdate' + entity: 'App\Entity\JobOrder' + - name: 'doctrine.orm.entity_listener' + event: 'postRemove' + entity: 'App\Entity\JobOrder' + - name: 'doctrine.orm.entity_listener' + event: 'postPersist' + entity: 'App\Entity\JobOrder' + + App\Service\JobOrderCache: + arguments: + $redis_prov: "@App\\Service\\RedisClientProvider" + $active_jo_key: "%env(LOCATION_JO_ACTIVE_KEY)%" + + App\Service\RiderCache: + arguments: + $redis_prov: "@App\\Service\\RedisClientProvider" + $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: + $api_log_flag: "%env(API_LOGGING)%" diff --git a/src/Command/ConfigureResqCommand.php b/src/Command/ConfigureResqCommand.php new file mode 100644 index 00000000..f4316056 --- /dev/null +++ b/src/Command/ConfigureResqCommand.php @@ -0,0 +1,55 @@ +setName('resq:configure') + ->setDescription('Copies the configuration files, depending on environment.') + ->setHelp('Copies the configuration files, depending on environment.') + ->addArgument('dir_name', InputArgument::REQUIRED, 'Name of source subdirectory.'); + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $dir_name = $input->getArgument('dir_name'); + + $filesystem = new Filesystem(); + $current_dir = getcwd(); + + $source_dir = $current_dir . '/resq_settings/' . $dir_name . '/'; + $config_dir = $current_dir . '/config/'; + $translations_dir = $current_dir . '/translations/'; + + // copy services.yaml file + error_log('Copying services.yaml file...'); + $filesystem->copy($source_dir . 'services.yaml', $config_dir . 'services.yaml', true); + + // copy menu.yaml file + error_log('Copying menu.yaml file...'); + $filesystem->copy($source_dir . 'menu.yaml', $config_dir . 'menu.yaml', true); + + // copy messages.en.yaml file + error_log('Copying messages.en.yaml file...'); + $filesystem->copy($source_dir . 'messages.en.yaml', $translations_dir . 'messages.en.yaml', true); + + error_log('Done copying files.'); + + return 0; + } +} From 9833a2709afdd1b30742317289c183ac3e0759e1 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 18 Jun 2020 03:47:46 +0000 Subject: [PATCH 025/138] Add command to add test JO data --- src/Command/CreateJOTestDataCommand.php | 137 ++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 src/Command/CreateJOTestDataCommand.php diff --git a/src/Command/CreateJOTestDataCommand.php b/src/Command/CreateJOTestDataCommand.php new file mode 100644 index 00000000..196edd51 --- /dev/null +++ b/src/Command/CreateJOTestDataCommand.php @@ -0,0 +1,137 @@ +em = $em; + + parent::__construct(); + } + + protected function configure() + { + $this->setName('joborder:create_testdata') + ->setDescription('Create JO test data, given a rider id.') + ->setHelp('Create JO test data, given a rider id.') + ->addArgument('rider_id', InputArgument::REQUIRED, 'Rider id.'); + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $rider_id = $input->getArgument('rider_id'); + + $rider = $this->em->getRepository(Rider::class)->find($rider_id); + + // get customer vehicles where plate number is not null + $cv_query = $this->em->createQuery('SELECT cv FROM App\Entity\CustomerVehicle cv WHERE cv.plate_number is not null'); + $cv_results = $cv_query->getResult(); + + // get the first customer vehicle + $cv = current($cv_results); + + // get batteries + $battery_results = $this->em->getRepository(Battery::class)->findAll(); + + // get the first battery + $battery = current($battery_results); + + error_log($cv->getPlateNumber()); + error_log($battery->getID()); + + if (empty($rider)) + { + error_log('Rider not found.'); + } + else + { + // get current date + $current_date = new DateTime(); + + $date_interval = new DateInterval('P1M'); + $period_date = $current_date->sub($date_interval); + + $period_year = $period_date->format('Y'); + $period_month = $period_date->format('m'); + + // insert 15 JOs for last month + for ($i = 1; $i <= 15; $i++) + { + $jo = new JobOrder(); + + // set customer data + $jo->setCustomerVehicle($cv); + $jo->setCustomer($cv->getCustomer()); + + // set hub and rider data + $jo->setRider($rider); + $jo->setHub($rider->getHub()); + + // set JO details + $point = new Point(121.0223, 14.6091); + $type = CMBServiceType::BATTERY_REPLACEMENT_NEW; + $source = TransactionOrigin::CALL; + $advance_order = true; + $warranty_class = WarrantyClass::WTY_PRIVATE; + $status = JOStatus::ASSIGNED; + $delivery_address = '#1234 Moogle Lane'; + $mode_of_payment = ModeOfPayment::CASH; + + // set invoice details + $invoice = new Invoice(); + $invoice_item = new InvoiceItem(); + + // set invoice item details + $invoice_item->setBattery($battery) + ->setTitle($battery->getModel()->getName() - ' ' . $battery->getSize()->getName()) + ->setQuantity(1) + ->setPrice($battery->getSellingPrice()) + ->setInvoice($invoice); + + $invoice->addItem($invoice_item); + + // set invoice details + $invoice->setTotalPrice($battery->getSellingPrice()) + ->setStatus(InvoiceStatus::DRAFT) + ->setVATExclusivePrice($battery->getSellingPrice()) + ->setDiscount(0.0) + ->setTradeIn(0.0) + ->setVAT(0.00) + + $jo->setInvoice($invoice); + + $date_schedule = DateTime::createFromFormat("d M Y h:i A", + + } + } + + return 0; + } +} From 0f06ca7339ecf5d4fd5da75e6eaaf5110ab4fde9 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 18 Jun 2020 04:38:08 +0000 Subject: [PATCH 026/138] Add saving of JOs. #427 --- src/Command/CreateJOTestDataCommand.php | 138 +++++++++++++++--------- 1 file changed, 87 insertions(+), 51 deletions(-) diff --git a/src/Command/CreateJOTestDataCommand.php b/src/Command/CreateJOTestDataCommand.php index 196edd51..7aafe444 100644 --- a/src/Command/CreateJOTestDataCommand.php +++ b/src/Command/CreateJOTestDataCommand.php @@ -10,7 +10,9 @@ use Symfony\Component\Console\Output\OutputInterface; use Doctrine\ORM\EntityManagerInterface; use CrEOF\Spatial\PHP\Types\Geometry\Point; + use DateTime; +use DateInterval; use App\Entity\JobOrder; use App\Entity\Rider; @@ -24,6 +26,7 @@ use App\Ramcar\TransactionOrigin; use App\Ramcar\WarrantyClass; use App\Ramcar\ModeOfPayment; use App\Ramcar\JOStatus; +use App\Ramcar\InvoiceStatus; class CreateJOTestDataCommand extends Command { @@ -75,63 +78,96 @@ class CreateJOTestDataCommand extends Command // get current date $current_date = new DateTime(); + // for this month JO + $current_year = $current_date->format('Y'); + $current_month = $current_date->format('M'); + + // for last month JO $date_interval = new DateInterval('P1M'); - $period_date = $current_date->sub($date_interval); + $last_month_date = $current_date->sub($date_interval); - $period_year = $period_date->format('Y'); - $period_month = $period_date->format('m'); - - // insert 15 JOs for last month - for ($i = 1; $i <= 15; $i++) - { - $jo = new JobOrder(); + $last_month_year = $last_month_date->format('Y'); + $last_month_month = $last_month_date->format('M'); - // set customer data - $jo->setCustomerVehicle($cv); - $jo->setCustomer($cv->getCustomer()); + $time_schedule = $current_date->format('h:i A'); - // set hub and rider data - $jo->setRider($rider); - $jo->setHub($rider->getHub()); - - // set JO details - $point = new Point(121.0223, 14.6091); - $type = CMBServiceType::BATTERY_REPLACEMENT_NEW; - $source = TransactionOrigin::CALL; - $advance_order = true; - $warranty_class = WarrantyClass::WTY_PRIVATE; - $status = JOStatus::ASSIGNED; - $delivery_address = '#1234 Moogle Lane'; - $mode_of_payment = ModeOfPayment::CASH; - - // set invoice details - $invoice = new Invoice(); - $invoice_item = new InvoiceItem(); - - // set invoice item details - $invoice_item->setBattery($battery) - ->setTitle($battery->getModel()->getName() - ' ' . $battery->getSize()->getName()) - ->setQuantity(1) - ->setPrice($battery->getSellingPrice()) - ->setInvoice($invoice); - - $invoice->addItem($invoice_item); - - // set invoice details - $invoice->setTotalPrice($battery->getSellingPrice()) - ->setStatus(InvoiceStatus::DRAFT) - ->setVATExclusivePrice($battery->getSellingPrice()) - ->setDiscount(0.0) - ->setTradeIn(0.0) - ->setVAT(0.00) - - $jo->setInvoice($invoice); - - $date_schedule = DateTime::createFromFormat("d M Y h:i A", - - } + $this->createJobOrders($rider, $cv, $battery, $last_month_year, $last_month_month, $time_schedule); + $this->createJobOrders($rider, $cv, $battery, $current_year, $current_month, $time_schedule); } return 0; } + + protected function createJobOrders(Rider $rider, CustomerVehicle $cv, Battery $battery, $year, $month, $time) + { + // insert 15 JOs for last month + for ($i = 1; $i <= 15; $i++) + { + $jo = new JobOrder(); + + // set customer data + $jo->setCustomerVehicle($cv); + $jo->setCustomer($cv->getCustomer()); + + // set hub and rider data + $jo->setRider($rider); + $jo->setHub($rider->getHub()); + + // set JO details + $point = new Point(121.0223, 14.6091); + $s_type = CMBServiceType::BATTERY_REPLACEMENT_NEW; + $source = TransactionOrigin::CALL; + $advance_order = true; + $warranty_class = WarrantyClass::WTY_PRIVATE; + $status = JOStatus::FULFILLED; + $delivery_address = '#1234 Moogle Lane'; + $mode_of_payment = ModeOfPayment::CASH; + + // set invoice details + $invoice = new Invoice(); + $invoice_item = new InvoiceItem(); + + // set invoice item details + $invoice_item->setBattery($battery) + ->setTitle($battery->getModel()->getName() . ' ' . $battery->getSize()->getName()) + ->setQuantity(1) + ->setPrice($battery->getSellingPrice()) + ->setInvoice($invoice); + + $invoice->addItem($invoice_item); + + $this->em->persist($invoice_item); + + // set invoice details + $invoice->setTotalPrice($battery->getSellingPrice()) + ->setStatus(InvoiceStatus::DRAFT) + ->setVATExclusivePrice($battery->getSellingPrice()) + ->setDiscount(0.0) + ->setTradeIn(0.0) + ->setVAT(0.00); + + $this->em->persist($invoice); + + $jo->setInvoice($invoice); + + // for last month + $date_schedule_date = $i . ' ' . $month . ' ' . $year . ' ' . $time; + error_log('Adding JO with date schedule ' . $date_schedule_date); + $date_schedule = DateTime::createFromFormat("d M Y h:i A", $date_schedule_date); + + $jo->setDateSchedule($date_schedule) + ->setCoordinates($point) + ->setAdvanceOrder($advance_order) + ->setServiceType($s_type) + ->setWarrantyClass($warranty_class) + ->setSource($source) + ->setStatus($status) + ->setDeliveryAddress($delivery_address); + + $this->em->persist($jo); + } + + $this->em->flush(); + + } } From 7a2996d4e585cb22d9077dec6ff84ce858782d03 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 19 Jun 2020 04:16:45 +0000 Subject: [PATCH 027/138] Add getStatus to rider API. #428 --- config/routes/cmb_rider_api.yaml | 5 ++++ src/Controller/CMBRAPIController.php | 25 +++++++++++++++++++ .../RiderAPIHandler/CMBRiderAPIHandler.php | 25 +++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/config/routes/cmb_rider_api.yaml b/config/routes/cmb_rider_api.yaml index eb4f2186..03e89f5b 100644 --- a/config/routes/cmb_rider_api.yaml +++ b/config/routes/cmb_rider_api.yaml @@ -129,3 +129,8 @@ cmb_rapi_jo_finish_photos_upload: path: /cmbrapi/uploadfinishphotos controller: App\Controller\CMBRAPIController::uploadFinishPhotos methods: [POST] + +cmb_rapi_status: + path: /cmbrapi/status + controller: App\Controller\CMBRAPIController::getStatus + methods: [GET] diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php index 2d503831..ce5868c5 100644 --- a/src/Controller/CMBRAPIController.php +++ b/src/Controller/CMBRAPIController.php @@ -642,4 +642,29 @@ class CMBRAPIController extends Controller // response return $res->getReturnResponse(); } + + public function getStatus(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new NewAPIResult(); + + $data = $rapi_handler->getStatus($req); + + if (isset($data['error'])) + { + $message = $data['error']; + $title = $data['title']; + + $res->setError(true) + ->setErrorTitle($title) + ->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 8231d2ac..14da1e6e 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -1623,6 +1623,31 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + public function getStatus(Request $req) + { + $required_params = []; + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + { + $data['title'] = 'Failed Get Status'; + return $data; + } + + $rider = $this->session->getRider(); + + $rider_status = $rider->isAvailable(); + + $status = 'Offline'; + if ($rider_status) + $status = 'Online'; + + $data = [ + 'status' => $status, + ]; + + return $data; + } + protected function checkMissingParameters(Request $req, $params = []) { $missing = []; From 332f9687a28527009b7c5c5cfa0e6a35a206b03f Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 19 Jun 2020 06:19:11 +0000 Subject: [PATCH 028/138] Add getOngoingJobOrder to rider API. #428 --- config/routes/cmb_rider_api.yaml | 5 + src/Controller/CMBRAPIController.php | 24 ++++ src/Entity/Rider.php | 5 + .../RiderAPIHandler/CMBRiderAPIHandler.php | 132 +++++++++++++++++- 4 files changed, 165 insertions(+), 1 deletion(-) diff --git a/config/routes/cmb_rider_api.yaml b/config/routes/cmb_rider_api.yaml index 03e89f5b..cb291bef 100644 --- a/config/routes/cmb_rider_api.yaml +++ b/config/routes/cmb_rider_api.yaml @@ -134,3 +134,8 @@ cmb_rapi_status: path: /cmbrapi/status controller: App\Controller\CMBRAPIController::getStatus methods: [GET] + +cmb_rapi_jo_ongoing: + path: /cmbrapi/joongoing + controller: App\Controller\CMBRAPIController::getOngoingJobOrder + methods: [GET] diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php index ce5868c5..30d70ed0 100644 --- a/src/Controller/CMBRAPIController.php +++ b/src/Controller/CMBRAPIController.php @@ -667,4 +667,28 @@ class CMBRAPIController extends Controller return $res->getReturnResponse(); } + public function getOngoingJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new NewAPIResult(); + + $data = $rapi_handler->getOngoingJobOrder($req); + + if (isset($data['error'])) + { + $message = $data['error']; + $title = $data['title']; + + $res->setError(true) + ->setErrorTitle($title) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + } diff --git a/src/Entity/Rider.php b/src/Entity/Rider.php index 502d93bc..6416a443 100644 --- a/src/Entity/Rider.php +++ b/src/Entity/Rider.php @@ -347,6 +347,11 @@ class Rider return $this->job_orders->matching($criteria)[0]; } + public function getRiderActiveJobOrder() + { + return $this->active_job_order; + } + public function getOpenJobOrders() { $active_status = [ diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 14da1e6e..22d3dc34 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -718,6 +718,8 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // TODO: put JO in job queue + // TODO: refactor this into a jo handler class, so we don't have to repeat for control center // TODO: send mqtt event (?) // add event log @@ -1244,6 +1246,9 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // set jo status to in progress + $jo->setStatus(JOStatus::IN_PROGRESS); + // add event log $rider = $this->session->getRider(); $event = new JOEvent(); @@ -1648,6 +1653,131 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + public function getOngoingJobOrder(Request $req) + { + $required_params = []; + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + { + $data['title'] = 'Failed Get Ongoing Job Order'; + return $data; + } + + // are we logged in? + if (!$this->session->hasRider()) + { + $data = [ + 'title' => 'Failed Get Ongoing Job Order', + 'error' => 'No logged in rider.' + ]; + return $data; + } + + $rider = $this->session->getRider(); + + // check if we have an active JO + $jo = $rider->getRiderActiveJobOrder(); + if ($jo == null) + { + $data = [ + 'title' => 'Failed Get Ongoing Job Order', + 'error' => 'No active job order.' + ]; + 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(), + ] + ]; + + return $data; + } + protected function checkMissingParameters(Request $req, $params = []) { $missing = []; @@ -1744,7 +1874,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $rider = $this->session->getRider(); // check if we have an active JO - $jo = $rider->getActiveJobOrder(); + $jo = $rider->getRiderActiveJobOrder(); if ($jo == null) { $data = [ From 6473c2e344cef84d09ae254f067fcfc131080be8 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 19 Jun 2020 07:14:12 +0000 Subject: [PATCH 029/138] Add getPaymentMethods and getCancelReason API calls to rider API. Add phone_landline to the JO responses. #428 --- config/routes/cmb_rider_api.yaml | 10 ++++ src/Controller/CMBRAPIController.php | 48 +++++++++++++++++++ src/Ramcar/CMBCancelReason.php | 22 +++++++++ .../RiderAPIHandler/CMBRiderAPIHandler.php | 47 ++++++++++++++++-- 4 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 src/Ramcar/CMBCancelReason.php diff --git a/config/routes/cmb_rider_api.yaml b/config/routes/cmb_rider_api.yaml index cb291bef..77942ca2 100644 --- a/config/routes/cmb_rider_api.yaml +++ b/config/routes/cmb_rider_api.yaml @@ -139,3 +139,13 @@ cmb_rapi_jo_ongoing: path: /cmbrapi/joongoing controller: App\Controller\CMBRAPIController::getOngoingJobOrder methods: [GET] + +cmb_rapi_payment_methods: + path: /cmbrapi/paymentmethods + controller: App\Controller\CMBRAPIController::getPaymentMethods + methods: [GET] + +cmb_rapi_cancel_reasons: + path: /cmbrapi/cancelreasons + controller: App\Controller\CMBRAPIController::getCancelReasons + methods: [GET] diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php index 30d70ed0..328b7952 100644 --- a/src/Controller/CMBRAPIController.php +++ b/src/Controller/CMBRAPIController.php @@ -691,4 +691,52 @@ class CMBRAPIController extends Controller return $res->getReturnResponse(); } + public function getPaymentMethods(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new NewAPIResult(); + + $data = $rapi_handler->getPaymentMethods($req); + + if (isset($data['error'])) + { + $message = $data['error']; + $title = $data['title']; + + $res->setError(true) + ->setErrorTitle($title) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function getCancelReasons(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new NewAPIResult(); + + $data = $rapi_handler->getCancelReasons($req); + + if (isset($data['error'])) + { + $message = $data['error']; + $title = $data['title']; + + $res->setError(true) + ->setErrorTitle($title) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + } diff --git a/src/Ramcar/CMBCancelReason.php b/src/Ramcar/CMBCancelReason.php new file mode 100644 index 00000000..b681a40a --- /dev/null +++ b/src/Ramcar/CMBCancelReason.php @@ -0,0 +1,22 @@ + 'Accident', + 'breakdown' => 'Breakdown', + 'fuel_runout' => 'Fuel Runout', + 'wrong_battery_size' => 'Wrong Battery Size', + 'customer_cancel' => 'Cancelled by Customer', + 'others' => 'Others' + ]; +} diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 22d3dc34..f82b6198 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -11,8 +11,9 @@ use App\Ramcar\TradeInType; use App\Ramcar\JOStatus; use App\Ramcar\CMBJOEventType; use App\Ramcar\InvoiceStatus; -use App\Ramcar\ModeOfPayment; +use App\Ramcar\CMBModeOfPayment; use App\Ramcar\InvoiceCriteria; +use App\Ramcar\CMBCancelReason; use App\Service\RiderAPIHandlerInterface; use App\Service\RedisClientProvider; @@ -426,6 +427,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface 'first_name' => $cust->getFirstName(), 'last_name' => $cust->getLastName(), 'phone_mobile' => $this->country_code . $cust->getPhoneMobile(), + 'phone_landline' => $this->country_code . $cust->getPhoneLandline(), ], 'vehicle' => [ 'manufacturer' => $v->getManufacturer()->getName(), @@ -563,6 +565,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface 'first_name' => $cust->getFirstName(), 'last_name' => $cust->getLastName(), 'phone_mobile' => $this->country_code . $cust->getPhoneMobile(), + 'phone_landline' => $this->country_code . $cust->getPhoneLandline(), ], 'vehicle' => [ 'manufacturer' => $v->getManufacturer()->getName(), @@ -673,6 +676,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface 'first_name' => $cust->getFirstName(), 'last_name' => $cust->getLastName(), 'phone_mobile' => $this->country_code . $cust->getPhoneMobile(), + 'phone_landline' => $this->country_code . $cust->getPhoneLandline(), ], 'vehicle' => [ 'manufacturer' => $v->getManufacturer()->getName(), @@ -1120,8 +1124,8 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // check mode of payment $mode = $req->request->get('mode_of_payment'); - if (!ModeOfPayment::validate($mode)) - $mode = ModeOfPayment::CASH; + if (!CMBModeOfPayment::validate($mode)) + $mode = CMBModeOfPayment::CASH; $jo->setModeOfPayment($mode); // generate new invoice @@ -1745,6 +1749,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface 'first_name' => $cust->getFirstName(), 'last_name' => $cust->getLastName(), 'phone_mobile' => $this->country_code . $cust->getPhoneMobile(), + 'phone_landline' => $this->country_code . $cust->getPhoneLandline(), ], 'vehicle' => [ 'manufacturer' => $v->getManufacturer()->getName(), @@ -1778,6 +1783,42 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + public function getPaymentMethods(Request $req) + { + $required_params = []; + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + { + $data['title'] = 'Failed Get Payment Methods'; + return $data; + } + + $data = [ + 'payment_methods' => CMBModeOfPayment::getCollection(), + ]; + + return $data; + + } + + public function getCancelReasons(Request $req) + { + $required_params = []; + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + { + $data['title'] = 'Failed Get Cancel Reasons'; + return $data; + } + + $data = [ + 'cancel_reasons' => CMBCancelReason::getCollection(), + ]; + + return $data; + + } + protected function checkMissingParameters(Request $req, $params = []) { $missing = []; From 5b96e03557dcdee5d45360b4859d3767e0531c69 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 19 Jun 2020 11:33:49 +0000 Subject: [PATCH 030/138] Add other_images parameter to upload photos API calls. #428 --- src/Entity/JOExtra.php | 74 ++++++++++++-- .../RiderAPIHandler/CMBRiderAPIHandler.php | 97 ++++++++++++++++++- 2 files changed, 163 insertions(+), 8 deletions(-) diff --git a/src/Entity/JOExtra.php b/src/Entity/JOExtra.php index 4f5d40b6..cefc6434 100644 --- a/src/Entity/JOExtra.php +++ b/src/Entity/JOExtra.php @@ -3,6 +3,7 @@ namespace App\Entity; use Doctrine\ORM\Mapping as ORM; +use Doctrine\Common\Collections\ArrayCollection; /** * @ORM\Entity @@ -48,6 +49,22 @@ class JOExtra */ protected $after_batt_image_filename; + /** + * @ORM\Column(type="array", nullable=true) + */ + protected $before_other_images; + + /** + * @ORM\Column(type="array", nullable=true) + */ + protected $after_other_images; + + public function __construct() + { + $this->before_other_images = new ArrayCollection(); + $this->after_other_images = new ArrayCollection(); + } + public function getID() { return $this->id; @@ -59,7 +76,7 @@ class JOExtra return $this; } - public function getBeforeSpeedImageFilename($image_filename) + public function getBeforeSpeedImageFilename() { return $this->before_speed_image_filename; } @@ -70,7 +87,7 @@ class JOExtra return $this; } - public function getBeforePlateNumImageFilename($image_filename) + public function getBeforePlateNumImageFilename() { return $this->before_plate_num_image_filename; } @@ -81,7 +98,7 @@ class JOExtra return $this; } - public function getBeforeBattImageFilename($image_filename) + public function getBeforeBattImageFilename() { return $this->before_batt_image_filename; } @@ -91,7 +108,7 @@ class JOExtra return $this; } - public function getAfterSpeedImageFilename($image_filename) + public function getAfterSpeedImageFilename() { return $this->after_speed_image_filename; } @@ -102,7 +119,7 @@ class JOExtra return $this; } - public function getAfterPlateNumImageFilename($image_filename) + public function getAfterPlateNumImageFilename() { return $this->after_plate_num_image_filename; } @@ -113,10 +130,55 @@ class JOExtra return $this; } - public function getAfterBattImageFilename($image_filename) + public function getAfterBattImageFilename() { return $this->after_batt_image_filename; } + public function getBeforeOtherImages() + { + return $this->before_other_images; + } + + public function setBeforeOtherImages(array $images) + { + $this->before_other_images = new ArrayCollection(); + + foreach ($images as $image_filename) + { + $this->before_other_images->add($image_filename); + } + + return $this; + } + + public function clearBeforeOtherImages() + { + $this->before_other_images = new ArrayCollection(); + return $this; + } + + public function getAfterOtherImages() + { + return $this->after_other_images; + } + + public function setAfterOtherImages(array $images) + { + $this->after_other_images = new ArrayCollection(); + + foreach ($images as $image_filename) + { + $this->after_other_images->add($image_filename); + } + + return $this; + } + + public function clearAfterOtherImages() + { + $this->after_other_images = new ArrayCollection(); + return $this; + } } diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index f82b6198..b5ccdfdd 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -1417,6 +1417,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $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'); + $other_img_files[]= $req->files->get('other_images'); if ((empty($speed_img_file)) && (empty($batt_img_file)) && @@ -1433,6 +1434,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $new_speed_filename = ''; $new_batt_filename = ''; $new_plate_num_filename = ''; + $other_filenames = []; if (!empty($speed_img_file)) { @@ -1489,6 +1491,32 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface } } + foreach ($other_img_files as $other_img_file) + { + if (!(empty($other_img_file))) + { + foreach($other_img_file as $other_img) + { + $orig_other_filename = pathinfo($other_img->getClientOriginalName(), PATHINFO_FILENAME); + $new_other_filename = uniqid() . '-'. $orig_other_filename . '.' . $other_img->guessClientExtension(); + + $other_filenames[] = $new_other_filename; + + try + { + $other_img->move($dest, $new_other_filename); + } + catch (FileException $e) + { + $data = [ + 'error' => 'Error saving image files.' + ]; + return $data; + } + } + } + } + $jo_extra = $jo->getJOExtra(); if ($jo_extra == null) { @@ -1499,6 +1527,15 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $jo_extra->setBeforeBattImageFilename($new_batt_filename); $jo_extra->setBeforePlateNumImageFilename($new_plate_num_filename); + if (empty($other_filenames)) + { + $jo_extra->clearBeforeOtherImages(); + } + else + { + $jo_extra->setBeforeOtherImages($other_filenames); + } + $jo->setJOExtra($jo_extra); $this->em->persist($jo_extra); @@ -1508,10 +1545,20 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $jo_extra->setBeforeSpeedImageFilename($new_speed_filename); $jo_extra->setBeforeBattImageFilename($new_batt_filename); $jo_extra->setBeforePlateNumImageFilename($new_plate_num_filename); + + if (empty($other_filenames)) + { + $jo_extra->clearBeforeOtherImages(); + + } + else + { + $jo_extra->setBeforeOtherImages($other_filenames); + } } - $this->em->flush(); - } + $this->em->flush(); + } return $data; } @@ -1533,6 +1580,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $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'); + $other_img_files[]= $req->files->get('other_images'); if ((empty($speed_img_file)) && (empty($batt_img_file)) && @@ -1549,6 +1597,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $new_speed_filename = ''; $new_batt_filename = ''; $new_plate_num_filename = ''; + $other_filenames = []; if (!empty($speed_img_file)) { @@ -1605,6 +1654,32 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface } } + foreach ($other_img_files as $other_img_file) + { + if (!(empty($other_img_file))) + { + foreach($other_img_file as $other_img) + { + $orig_other_filename = pathinfo($other_img->getClientOriginalName(), PATHINFO_FILENAME); + $new_other_filename = uniqid() . '-'. $orig_other_filename . '.' . $other_img->guessClientExtension(); + + $other_filenames[] = $new_other_filename; + + try + { + $other_img->move($dest, $new_other_filename); + } + catch (FileException $e) + { + $data = [ + 'error' => 'Error saving image files.' + ]; + return $data; + } + } + } + } + $jo_extra = $jo->getJOExtra(); if ($jo_extra == null) { @@ -1615,6 +1690,15 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $jo_extra->setAfterBattImageFilename($new_batt_filename); $jo_extra->setAfterPlateNumImageFilename($new_plate_num_filename); + if (empty($other_filenames)) + { + $jo_extra->clearAfterOtherImages(); + } + else + { + $jo_extra->setAfterOtherImages($other_filenames); + } + $jo->setJOExtra($jo_extra); $this->em->persist($jo_extra); @@ -1624,6 +1708,15 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $jo_extra->setAfterSpeedImageFilename($new_speed_filename); $jo_extra->setAfterBattImageFilename($new_batt_filename); $jo_extra->setAfterPlateNumImageFilename($new_plate_num_filename); + + if (empty($other_filenames)) + { + $jo_extra->clearAfterOtherImages(); + } + else + { + $jo_extra->setAfterOtherImages($other_filenames); + } } $this->em->flush(); From 943c01e5d9846f77bb45b9a4bfe79e9d3729f77e Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sat, 20 Jun 2020 16:38:08 +0800 Subject: [PATCH 031/138] Add jo perform rider api call for CMB #424 --- config/routes/cmb_rider_api.yaml | 5 ++++ src/Controller/CMBRAPIController.php | 29 +++++++++++++++++++ src/Entity/JobOrder.php | 5 ++++ src/Ramcar/JOStatus.php | 18 +++++++----- .../RiderAPIHandler/CMBRiderAPIHandler.php | 22 ++++++++++++++ 5 files changed, 72 insertions(+), 7 deletions(-) diff --git a/config/routes/cmb_rider_api.yaml b/config/routes/cmb_rider_api.yaml index 77942ca2..24b2e63d 100644 --- a/config/routes/cmb_rider_api.yaml +++ b/config/routes/cmb_rider_api.yaml @@ -35,6 +35,11 @@ cmb_rapi_arrive: controller: App\Controller\CMBRAPIController::arrive methods: [POST] +cmb_rapi_performed: + path: /cmbrapi/joperform + controller: App\Controller\CMBRAPIController::performJobOrder + methods: [POST] + cmb_rapi_payment: path: /cmbrapi/jopayment controller: App\Controller\CMBRAPIController::payment diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php index 328b7952..e7dba85a 100644 --- a/src/Controller/CMBRAPIController.php +++ b/src/Controller/CMBRAPIController.php @@ -134,6 +134,26 @@ class CMBRAPIController extends Controller return $res->getReturnResponse(); } + protected function generateResultFromHandler($data) + { + $res = new NewAPIResult(); + + if (isset($data['error'])) + { + $message = $data['error']; + $title = $data['title']; + + $res->setError(true) + ->setErrorTitle($title) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + + return $res; + } + public function cancelJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) { $res = new NewAPIResult(); @@ -183,6 +203,15 @@ class CMBRAPIController extends Controller return $res->getReturnResponse(); } + public function performJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $data = $rapi_handler->performJobOrder($req); + + $res = $this->generateResultFromHandler($data); + + return $res->getReturnResponse(); + } + public function hubArrive(Request $req, RiderAPIHandlerInterface $rapi_handler) { $res = new NewAPIResult(); diff --git a/src/Entity/JobOrder.php b/src/Entity/JobOrder.php index a174fb96..4793571d 100644 --- a/src/Entity/JobOrder.php +++ b/src/Entity/JobOrder.php @@ -802,6 +802,11 @@ class JobOrder $this->makeRiderAvailable(); } + public function perform() + { + $this->setStatus(JOStatus::PERFORM) + } + public function fulfill() { $this->setStatus(JOStatus::FULFILLED) diff --git a/src/Ramcar/JOStatus.php b/src/Ramcar/JOStatus.php index 5ba8f5d1..14574845 100644 --- a/src/Ramcar/JOStatus.php +++ b/src/Ramcar/JOStatus.php @@ -4,13 +4,15 @@ namespace App\Ramcar; class JOStatus extends NameValue { - const PENDING = 'pending'; // NOTE: JO has no hub assigned - const RIDER_ASSIGN = 'rider_assign'; // NOTE: JO has hub assigned but no rider assigned - const ASSIGNED = 'assigned'; // NOTE: JO has hub and rider assigned - const IN_TRANSIT = 'in_transit'; // NOTE: JO's rider is on his way - const IN_PROGRESS = 'in_progress'; // NOTE: JO fulfillment in progress - const CANCELLED = 'cancelled'; // NOTE: JO is cancelled - const FULFILLED = 'fulfilled'; // NOTE: JO is fulfilled + const PENDING = 'pending'; // JO has no hub assigned + const RIDER_ASSIGN = 'rider_assign'; // JO has hub assigned but no rider assigned + const ASSIGNED = 'assigned'; // JO has hub and rider assigned + const IN_TRANSIT = 'in_transit'; // JO's rider is on his way + const IN_PROGRESS = 'in_progress'; // JO fulfillment in progress + const PERFORMED = 'performed'; // Rider has finished performing JO task / service + const PAID = 'paid'; // Rider has finished collecting payment for JO + const CANCELLED = 'cancelled'; // JO is cancelled + const FULFILLED = 'fulfilled'; // JO is fulfilled const COLLECTION = [ 'pending' => 'For Dispatch', @@ -18,6 +20,8 @@ class JOStatus extends NameValue 'assigned' => 'Assigned', 'in_transit' => 'In Transit', 'in_progress' => 'In Progress', + 'performed' => 'Service Performed', + 'paid' => 'Customer Paid', 'cancelled' => 'Cancelled', 'fulfilled' => 'Completed', ]; diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index b5ccdfdd..267f3849 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -801,6 +801,28 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + public function performJobOrder(Request $req) + { + $required_params = [ + 'jo_id', + ]; + + $data = $this->checkJO($req, $required_params, $jo); + if (isset($data['error'])) + { + $data['title'] = 'Failed Job Order Perform'; + return $data; + } + + $jo->perform() + + // TODO: make event for this? + + $this->em->flush(); + + return $data; + } + public function rejectJobOrder(Request $req) { $required_params = [ From b61860584991b4fd2b929f37555b7cb95b8b98e3 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sat, 20 Jun 2020 16:43:14 +0800 Subject: [PATCH 032/138] Fix syntax error #424 --- src/Controller/CMBRAPIController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php index e7dba85a..19f4d8e9 100644 --- a/src/Controller/CMBRAPIController.php +++ b/src/Controller/CMBRAPIController.php @@ -150,6 +150,7 @@ class CMBRAPIController extends Controller else { $res->setData($data); + } return $res; } @@ -176,7 +177,6 @@ class CMBRAPIController extends Controller // response return $res->getReturnResponse(); - } public function arrive(Request $req, RiderAPIHandlerInterface $rapi_handler) From ef7e362c7dcefc5287ebbb8ddd869d377ba2087f Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sat, 20 Jun 2020 16:46:00 +0800 Subject: [PATCH 033/138] Fix syntax bugs #424 --- src/Entity/JobOrder.php | 2 +- src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Entity/JobOrder.php b/src/Entity/JobOrder.php index 4793571d..e45d86e0 100644 --- a/src/Entity/JobOrder.php +++ b/src/Entity/JobOrder.php @@ -804,7 +804,7 @@ class JobOrder public function perform() { - $this->setStatus(JOStatus::PERFORM) + $this->setStatus(JOStatus::PERFORM); } public function fulfill() diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 267f3849..671b6fc7 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -814,7 +814,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } - $jo->perform() + $jo->perform(); // TODO: make event for this? From 0d89cab165b8fd54a9b82e650236110fdc524403 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sat, 20 Jun 2020 21:19:56 +0800 Subject: [PATCH 034/138] Add date_status_change for job order entity and refactor rider api job order data generation #424 --- src/Controller/CMBRAPIController.php | 59 ++++----- src/Entity/JobOrder.php | 12 ++ src/Ramcar/JOStatus.php | 4 +- .../RiderAPIHandler/CMBRiderAPIHandler.php | 113 ++++++++++-------- 4 files changed, 97 insertions(+), 91 deletions(-) diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php index 19f4d8e9..99eabe6d 100644 --- a/src/Controller/CMBRAPIController.php +++ b/src/Controller/CMBRAPIController.php @@ -88,25 +88,10 @@ class CMBRAPIController extends Controller public function getJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->getJobOrder($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } @@ -134,27 +119,6 @@ class CMBRAPIController extends Controller return $res->getReturnResponse(); } - protected function generateResultFromHandler($data) - { - $res = new NewAPIResult(); - - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; - - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - return $res; - } - public function cancelJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) { $res = new NewAPIResult(); @@ -768,4 +732,25 @@ class CMBRAPIController extends Controller return $res->getReturnResponse(); } + protected function generateResultFromHandler($data) + { + $res = new NewAPIResult(); + + if (isset($data['error'])) + { + $message = $data['error']; + $title = $data['title']; + + $res->setError(true) + ->setErrorTitle($title) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + return $res; + } + } diff --git a/src/Entity/JobOrder.php b/src/Entity/JobOrder.php index e45d86e0..9e79a92b 100644 --- a/src/Entity/JobOrder.php +++ b/src/Entity/JobOrder.php @@ -340,6 +340,12 @@ class JobOrder */ protected $jo_extra; + // date that the status last changed + /** + * @ORM\Column(type="datetime", nullable=true) + */ + protected $date_status_change; + public function __construct() { $this->date_create = new DateTime(); @@ -589,6 +595,7 @@ class JobOrder { // TODO: validate status $this->status = $status; + $this->date_status_change = new DateTime(); return $this; } @@ -602,6 +609,11 @@ class JobOrder return JOStatus::getName($this->status); } + public function getDateStatusChange() + { + return $this->date_status_change; + } + public function setDeliveryInstructions($delivery_instructions) { $this->delivery_instructions = $delivery_instructions; diff --git a/src/Ramcar/JOStatus.php b/src/Ramcar/JOStatus.php index 14574845..08177198 100644 --- a/src/Ramcar/JOStatus.php +++ b/src/Ramcar/JOStatus.php @@ -7,8 +7,8 @@ class JOStatus extends NameValue const PENDING = 'pending'; // JO has no hub assigned const RIDER_ASSIGN = 'rider_assign'; // JO has hub assigned but no rider assigned const ASSIGNED = 'assigned'; // JO has hub and rider assigned - const IN_TRANSIT = 'in_transit'; // JO's rider is on his way - const IN_PROGRESS = 'in_progress'; // JO fulfillment in progress + const IN_TRANSIT = 'in_transit'; // Rider is on his way + const IN_PROGRESS = 'in_progress'; // Rider has arrived at customer's location and fulfillment is in progress const PERFORMED = 'performed'; // Rider has finished performing JO task / service const PAID = 'paid'; // Rider has finished collecting payment for JO const CANCELLED = 'cancelled'; // JO is cancelled diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 671b6fc7..4190aa52 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -605,18 +605,8 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } - public function getJobOrder(Request $req) + protected function formatJobOrderData($jo) { - $required_params = [ - 'jo_id' - ]; - $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(); $cv = $jo->getCustomerVehicle(); @@ -664,47 +654,66 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $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(), - 'phone_landline' => $this->country_code . $cust->getPhoneLandline(), - ], - '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(), - ] + '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(), + 'phone_landline' => $this->country_code . $cust->getPhoneLandline(), + ], + '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 getJobOrder(Request $req) + { + $required_params = [ + 'jo_id' + ]; + $data = $this->checkJO($req, $required_params, $jo); + if (isset($data['error'])) + { + $data['title'] = 'Failed Get Job Order'; + return $data; + } + + $jo_data = $this->formatJobOrderData($jo); + + $data = [ + 'job_order' => $jo_data ]; return $data; From 5e756084027e58a6c2308160ccfc535379925c7b Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sat, 20 Jun 2020 21:41:21 +0800 Subject: [PATCH 035/138] Add date_status_change to job order data in rider api #424 --- src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 4190aa52..e3cd75dc 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -1868,6 +1868,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface 'longitude' => $coord->getLongitude(), 'latitude' => $coord->getLatitude(), 'status' => $jo->getStatus(), + 'date_status_change' => $jo->getDateStatusChange()->format('Ymd H:i:s'), 'customer' => [ 'title' => $cust->getTitle(), 'first_name' => $cust->getFirstName(), From 59e6e9eb5c4677ed98839db9cda08d5427653768 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sat, 20 Jun 2020 21:49:35 +0800 Subject: [PATCH 036/138] Support null date_status_change for rider api #424 --- .../RiderAPIHandler/CMBRiderAPIHandler.php | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index e3cd75dc..2b225daf 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -653,6 +653,11 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface if (empty($trade_in_type)) $trade_in_type = 'none'; + if ($jo->getDateStatusChange() == null) + $date_status_change = null; + else + $date_status_change = $jo->getDateStatusChange()->format('Ymd H:i:s'); + $data = [ 'id' => $jo->getID(), 'service_type' => $jo->getServiceType(), @@ -660,6 +665,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface 'longitude' => $coord->getLongitude(), 'latitude' => $coord->getLatitude(), 'status' => $jo->getStatus(), + 'date_status_change' => $date_status_change, 'customer' => [ 'title' => $cust->getTitle(), 'first_name' => $cust->getFirstName(), @@ -1814,6 +1820,15 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + $jo_data = $this->formatJobOrderData($jo); + + $data = [ + 'job_order' => $jo_data + ]; + + return $data; + + /* $coord = $jo->getCoordinates(); $cust = $jo->getCustomer(); $cv = $jo->getCustomerVehicle(); @@ -1904,8 +1919,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface 'has_motolite' => $cv->hasMotoliteBattery(), ] ]; - - return $data; + */ } public function getPaymentMethods(Request $req) From 391909c49350109370b8dcd505ee7e56bed919c6 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sun, 21 Jun 2020 10:27:24 +0800 Subject: [PATCH 037/138] Fix typo in job order status constant #424 --- src/Entity/JobOrder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Entity/JobOrder.php b/src/Entity/JobOrder.php index 9e79a92b..718c70ee 100644 --- a/src/Entity/JobOrder.php +++ b/src/Entity/JobOrder.php @@ -816,7 +816,7 @@ class JobOrder public function perform() { - $this->setStatus(JOStatus::PERFORM); + $this->setStatus(JOStatus::PERFORMED); } public function fulfill() From ce9a2f42b957a4d5359d2c1abfaec9fbad96930a Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sun, 21 Jun 2020 14:44:10 +0800 Subject: [PATCH 038/138] Add images and odometer to JO info #424 --- .../RiderAPIHandler/CMBRiderAPIHandler.php | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 2b225daf..ea42b772 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -653,11 +653,60 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface if (empty($trade_in_type)) $trade_in_type = 'none'; + // get date of status last change if ($jo->getDateStatusChange() == null) $date_status_change = null; else $date_status_change = $jo->getDateStatusChange()->format('Ymd H:i:s'); + // get odometer reading + $odo = $jo->getMeta('odometer'); + if ($odo <= 0) + $odo = 0; + + // get before images + $before_images = [ + 'speedomtr' => null, + 'plate_number' => null, + 'battery' => null, + 'others' => [], + ]; + $after_images = [ + 'speedomtr' => null, + 'plate_number' => null, + 'battery' => null, + 'others' => [], + ]; + $jo_extra = $jo->getJOExtra(); + if ($jo_extra != null) + { + // before images + $before_images['speedomtr'] = $this->getURLExtraImage($jo_extra->getBeforeSpeedImageFilename()); + $before_images['plate_number'] = $this->getURLExtraImage($jo_extra->getBeforePlateNumImageFilename()); + $before_images['battery'] = $this->getURLExtraImage($jo_extra->getBeforeBattImageFilename()); + + // other images + $other_images = []; + foreach ($jo_extra->getBeforeOtherImages() as $others) + { + $other_images[] = $this->getURLExtraImage($others); + } + $before_images['others'] = $other_images; + + // after images + $after_images['speedomtr'] = $this->getURLExtraImage($jo_extra->getAfterSpeedImageFilename()); + $after_images['plate_number'] = $this->getURLExtraImage($jo_extra->getAfterPlateNumImageFilename()); + $after_images['battery'] = $this->getURLExtraImage($jo_extra->getAfterBattImageFilename()); + + // other images + $other_images = []; + foreach ($jo_extra->getAfterOtherImages() as $others) + { + $other_images[] = $this->getURLExtraImage($others); + } + $after_images['others'] = $other_images; + } + $data = [ 'id' => $jo->getID(), 'service_type' => $jo->getServiceType(), @@ -699,6 +748,17 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface 'has_warranty_doc' => false, 'flag_coolant' => $jo->hasCoolant(), 'has_motolite' => $cv->hasMotoliteBattery(), + + // BEGIN: cmb specific details + + // odometer + 'odometer' => $odo, + + // images + 'arrive_photos' => $before_images, + 'finish_photos' => $after_images, + + // END: cmb speicifc details ]; return $data; @@ -2142,4 +2202,9 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $all = $req->request->all(); error_log(print_r($all, true)); } + + protected function getURLExtraImage(Request $req, $filename) + { + return $req->getScheme() . '://' . $req->getHttpHost() . $req->getBasePath() . '/uploads/jo_extra/' . $filename; + } } From 60323acce33c1d107b718f207f89a631687250e5 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sun, 21 Jun 2020 14:48:27 +0800 Subject: [PATCH 039/138] Add request to URL extra image generation #424 --- .../RiderAPIHandler/CMBRiderAPIHandler.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index ea42b772..833c274f 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -681,28 +681,28 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface if ($jo_extra != null) { // before images - $before_images['speedomtr'] = $this->getURLExtraImage($jo_extra->getBeforeSpeedImageFilename()); - $before_images['plate_number'] = $this->getURLExtraImage($jo_extra->getBeforePlateNumImageFilename()); - $before_images['battery'] = $this->getURLExtraImage($jo_extra->getBeforeBattImageFilename()); + $before_images['speedomtr'] = $this->getURLExtraImage($req, $jo_extra->getBeforeSpeedImageFilename()); + $before_images['plate_number'] = $this->getURLExtraImage($req, $jo_extra->getBeforePlateNumImageFilename()); + $before_images['battery'] = $this->getURLExtraImage($req, $jo_extra->getBeforeBattImageFilename()); // other images $other_images = []; foreach ($jo_extra->getBeforeOtherImages() as $others) { - $other_images[] = $this->getURLExtraImage($others); + $other_images[] = $this->getURLExtraImage($req, $others); } $before_images['others'] = $other_images; // after images - $after_images['speedomtr'] = $this->getURLExtraImage($jo_extra->getAfterSpeedImageFilename()); - $after_images['plate_number'] = $this->getURLExtraImage($jo_extra->getAfterPlateNumImageFilename()); - $after_images['battery'] = $this->getURLExtraImage($jo_extra->getAfterBattImageFilename()); + $after_images['speedomtr'] = $this->getURLExtraImage($req, $jo_extra->getAfterSpeedImageFilename()); + $after_images['plate_number'] = $this->getURLExtraImage($req, $jo_extra->getAfterPlateNumImageFilename()); + $after_images['battery'] = $this->getURLExtraImage($req, $jo_extra->getAfterBattImageFilename()); // other images $other_images = []; foreach ($jo_extra->getAfterOtherImages() as $others) { - $other_images[] = $this->getURLExtraImage($others); + $other_images[] = $this->getURLExtraImage($req, $others); } $after_images['others'] = $other_images; } From fe363e1df6c2e24b900955fb849d6d85343741e1 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sun, 21 Jun 2020 14:49:31 +0800 Subject: [PATCH 040/138] Add request object to format job order data method #424 --- src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 833c274f..d14eac69 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -605,7 +605,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } - protected function formatJobOrderData($jo) + protected function formatJobOrderData($req, $jo) { $coord = $jo->getCoordinates(); $cust = $jo->getCustomer(); @@ -776,7 +776,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } - $jo_data = $this->formatJobOrderData($jo); + $jo_data = $this->formatJobOrderData($req, $jo); $data = [ 'job_order' => $jo_data @@ -1880,7 +1880,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } - $jo_data = $this->formatJobOrderData($jo); + $jo_data = $this->formatJobOrderData($req, $jo); $data = [ 'job_order' => $jo_data From 4ec5ddd993fb4b0c0de0297093151bb33a5acd0e Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sun, 21 Jun 2020 15:52:34 +0800 Subject: [PATCH 041/138] Add mode of payment to payment in rider api #424 --- src/Ramcar/CMBModeOfPayment.php | 10 ++++++---- src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 10 +++++++++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/Ramcar/CMBModeOfPayment.php b/src/Ramcar/CMBModeOfPayment.php index c7ae9908..a6a8db4e 100644 --- a/src/Ramcar/CMBModeOfPayment.php +++ b/src/Ramcar/CMBModeOfPayment.php @@ -4,13 +4,15 @@ namespace App\Ramcar; class CMBModeOfPayment extends NameValue { - const CASH = 'cash'; + const SHOPEE = 'shopee'; + const LAZADA = 'lazada'; const CREDIT_CARD = 'credit_card'; - const BANK_TRANSFER = 'bank_transfer'; + const ONLINE_TRANSFER = 'online_transfer'; const COLLECTION = [ - 'cash' => 'Cash', + 'shopee' => 'Shopee', + 'lazada' => 'Lazada', 'credit_card' => 'Credit Card', - 'bank_transfer' => 'Bank Transfer', + 'online_transfer' => 'Online Transfer', ]; } diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index d14eac69..c299b12e 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -1007,7 +1007,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface public function payment(Request $req) { - $required_params = ['jo_id']; + $required_params = [ + 'jo_id', + 'mode_of_payment', + ]; $data = $this->checkActiveJO($req, $required_params, $jo); if (isset($data['error'])) { @@ -1015,6 +1018,11 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // add mode of payment + $mode = $req->request->get('mode_of_payment'); + $jo->setModeOfPayment($mode); + + // set invoice to paid $jo->getInvoice()->setStatus(InvoiceStatus::PAID); From d59174d7216b085ecf3fb81b540ed09b1611de73 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sun, 21 Jun 2020 16:26:10 +0800 Subject: [PATCH 042/138] Replace speedomtr with speedometer #424 --- 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 c299b12e..3291a6a1 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -666,13 +666,13 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // get before images $before_images = [ - 'speedomtr' => null, + 'speedometer' => null, 'plate_number' => null, 'battery' => null, 'others' => [], ]; $after_images = [ - 'speedomtr' => null, + 'speedometer' => null, 'plate_number' => null, 'battery' => null, 'others' => [], @@ -681,7 +681,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface if ($jo_extra != null) { // before images - $before_images['speedomtr'] = $this->getURLExtraImage($req, $jo_extra->getBeforeSpeedImageFilename()); + $before_images['speedometer'] = $this->getURLExtraImage($req, $jo_extra->getBeforeSpeedImageFilename()); $before_images['plate_number'] = $this->getURLExtraImage($req, $jo_extra->getBeforePlateNumImageFilename()); $before_images['battery'] = $this->getURLExtraImage($req, $jo_extra->getBeforeBattImageFilename()); @@ -694,7 +694,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $before_images['others'] = $other_images; // after images - $after_images['speedomtr'] = $this->getURLExtraImage($req, $jo_extra->getAfterSpeedImageFilename()); + $after_images['speedometer'] = $this->getURLExtraImage($req, $jo_extra->getAfterSpeedImageFilename()); $after_images['plate_number'] = $this->getURLExtraImage($req, $jo_extra->getAfterPlateNumImageFilename()); $after_images['battery'] = $this->getURLExtraImage($req, $jo_extra->getAfterBattImageFilename()); @@ -1519,7 +1519,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $dest = $this->upload_dir; - $speed_img_file = $req->files->get('speedomtr_img'); + $speed_img_file = $req->files->get('speedometer_img'); $batt_img_file = $req->files->get('battery_img'); $plate_num_img_file = $req->files->get('plate_number_img'); $other_img_files[]= $req->files->get('other_images'); @@ -1682,7 +1682,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $dest = $this->upload_dir; - $speed_img_file = $req->files->get('speedomtr_img'); + $speed_img_file = $req->files->get('speedometer_img'); $batt_img_file = $req->files->get('battery_img'); $plate_num_img_file = $req->files->get('plate_number_img'); $other_img_files[]= $req->files->get('other_images'); From 1e3b621a919930e11be79ed598d7bb4e1cf37a4d Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sun, 21 Jun 2020 16:27:43 +0800 Subject: [PATCH 043/138] Send null for extra images if blank for rider api #424 --- src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 3291a6a1..abbb7dde 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -2213,6 +2213,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface protected function getURLExtraImage(Request $req, $filename) { + // return null if blank filename + if (strlen(trim($filename)) <= 0) + return null; + return $req->getScheme() . '://' . $req->getHttpHost() . $req->getBasePath() . '/uploads/jo_extra/' . $filename; } } From f519ec01dc1dc60c6ab8002515a3d5d085d614cb Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sun, 21 Jun 2020 16:46:11 +0800 Subject: [PATCH 044/138] Set paid status in payment call in rider api #424 --- src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index abbb7dde..c76d88b5 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -1022,6 +1022,9 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $mode = $req->request->get('mode_of_payment'); $jo->setModeOfPayment($mode); + // set status to paid + $jo->setStatus(JOStatus::PAID); + // set invoice to paid $jo->getInvoice()->setStatus(InvoiceStatus::PAID); From 2b13adffa06c3d4b6f43380cb0dc6590017c5b38 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sun, 21 Jun 2020 17:04:41 +0800 Subject: [PATCH 045/138] Add customer email to jo details in rider api #424 --- src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index c76d88b5..2755a804 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -707,6 +707,12 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $after_images['others'] = $other_images; } + // customer email + if ($jo->getMeta('customer_email') == null) + $cust_email = ''; + else + $cust_email = $jo->getMeta('customer_email'); + $data = [ 'id' => $jo->getID(), 'service_type' => $jo->getServiceType(), @@ -758,6 +764,9 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface 'arrive_photos' => $before_images, 'finish_photos' => $after_images, + // customer email + 'customer_email' => $cust_email, + // END: cmb speicifc details ]; From eb2d173ea716b15a48a3f8c1c38e5f95d69933bc Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sun, 21 Jun 2020 19:14:30 +0800 Subject: [PATCH 046/138] Add email and customer signature to complete call in rider api #424 --- src/Entity/JOExtra.php | 16 ++++++++ .../RiderAPIHandler/CMBRiderAPIHandler.php | 37 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/src/Entity/JOExtra.php b/src/Entity/JOExtra.php index cefc6434..4784c629 100644 --- a/src/Entity/JOExtra.php +++ b/src/Entity/JOExtra.php @@ -59,6 +59,12 @@ class JOExtra */ protected $after_other_images; + /** + * @ORM\Column(type="string", nullable=true) + */ + protected $cust_signature; + + public function __construct() { $this->before_other_images = new ArrayCollection(); @@ -181,4 +187,14 @@ class JOExtra return $this; } + public function setCustomerSignature($sig_file) + { + $this->cust_signature($sig_file); + return $this; + } + + public function getCustomerSignature() + { + return $this->cust_signature; + } } diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 2755a804..6f7b646a 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -1394,6 +1394,17 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // set customer signature + $jo_extra = $jo->getJOExtra(); + $sig_file = $this->handleFileUpload($req, 'signature'); + if ($sig_file) + $jo_extra->setCustomerSignature($sig_file); + + // set email + $cust_email = $req->request->get('customer_email', ''); + $jo->addMeta('customer_email', $cust_email); + + /* // set jo status to fulfilled $jo->setStatus(JOStatus::FULFILLED); @@ -1517,6 +1528,32 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + protected function handleFileUpload($req, $name) + { + $file = $req->files->get($name); + if (empty($file)) + return false; + + $orig_filename = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME); + + // generate prefix to assure uniqueness + $prefix = uniqid() . '_'; + $new_filename = $prefix . $orig_filename . '.' . $file->guessClientExtension(); + + // move to our upload dir + $dest = $this->upload_dir; + try + { + $file->move($dest, $new_filename); + } + catch (FileException $e) + { + return false; + } + + return $new_filename; + } + public function uploadArrivePhotos(Request $req) { $required_params = [ From cbaf1ed6a62cd8cbc14268420dbf98a2335c2651 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sun, 21 Jun 2020 20:08:27 +0800 Subject: [PATCH 047/138] Fix customer signature issue #424 --- src/Entity/JOExtra.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Entity/JOExtra.php b/src/Entity/JOExtra.php index 4784c629..b93b1e25 100644 --- a/src/Entity/JOExtra.php +++ b/src/Entity/JOExtra.php @@ -189,7 +189,7 @@ class JOExtra public function setCustomerSignature($sig_file) { - $this->cust_signature($sig_file); + $this->cust_signature = $sig_file; return $this; } From 3abb6f0efb9760d2d895bdd872bea2acd1a8d830 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 22 Jun 2020 03:13:41 +0000 Subject: [PATCH 048/138] Add verifyJobOrder API call. #424 --- config/routes/cmb_rider_api.yaml | 5 +++ src/Controller/CMBRAPIController.php | 11 +++++++ .../RiderAPIHandler/CMBRiderAPIHandler.php | 32 +++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/config/routes/cmb_rider_api.yaml b/config/routes/cmb_rider_api.yaml index 24b2e63d..93f65d1a 100644 --- a/config/routes/cmb_rider_api.yaml +++ b/config/routes/cmb_rider_api.yaml @@ -154,3 +154,8 @@ cmb_rapi_cancel_reasons: path: /cmbrapi/cancelreasons controller: App\Controller\CMBRAPIController::getCancelReasons methods: [GET] + +cmb_rapi_jo_verify: + path: /cmbrapi/joverify + controller: App\Controller\CMBRAPIController::verifyJobOrder + methods: [GET] diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php index 99eabe6d..87ab9cc1 100644 --- a/src/Controller/CMBRAPIController.php +++ b/src/Controller/CMBRAPIController.php @@ -12,6 +12,8 @@ use App\Ramcar\NewAPIResult; use App\Service\RiderAPIHandlerInterface; // Rider API controller for CMB +// TODO: refactor the other functions to use generateResultFromHandler + class CMBRAPIController extends Controller { public function register(Request $req, RiderAPIHandlerInterface $rapi_handler) @@ -732,6 +734,15 @@ class CMBRAPIController extends Controller return $res->getReturnResponse(); } + public function verifyJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $data = $rapi_handler->verifyJobOrder($req); + + $res = $this->generateResultFromHandler($data); + + return $res->getReturnResponse(); + } + protected function generateResultFromHandler($data) { $res = new NewAPIResult(); diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 6f7b646a..ec508a32 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -2075,6 +2075,38 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface } + public function verifyJobOrder(Request $req) + { + $required_params = [ + 'jo_id' + ]; + $data = $this->checkJO($req, $required_params, $jo); + if (isset($data['error'])) + { + $data['title'] = 'Failed Verify Job Order'; + return $data; + } + + // check if JO status is not fulfilled and not cancelled + if (($jo->getStatus() == JOStatus::FULFILLED) || + ($jo->getStatus() == JOStatus::CANCELLED)) + { + $data = [ + 'title' => 'Failed Verify Job Order', + 'error' => 'Job order has been fulfilled or cancelled.' + ]; + return $data; + } + + $jo_data = $this->formatJobOrderData($req, $jo); + + $data = [ + 'job_order' => $jo_data + ]; + + return $data; + } + protected function checkMissingParameters(Request $req, $params = []) { $missing = []; From 2f8dca3dbcdb1b93a0b0552a2ffae845f67cba42 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 22 Jun 2020 03:45:50 +0000 Subject: [PATCH 049/138] Fix responses for verifyJobOrder. #424 --- src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index ec508a32..39b99a56 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -2083,7 +2083,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $data = $this->checkJO($req, $required_params, $jo); if (isset($data['error'])) { - $data['title'] = 'Failed Verify Job Order'; + $data = [ + 'assigned' => false, + 'available' => false, + ]; return $data; } @@ -2092,16 +2095,15 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface ($jo->getStatus() == JOStatus::CANCELLED)) { $data = [ - 'title' => 'Failed Verify Job Order', - 'error' => 'Job order has been fulfilled or cancelled.' + 'assigned' => 'true', + 'available' => 'false' ]; return $data; } - $jo_data = $this->formatJobOrderData($req, $jo); - $data = [ - 'job_order' => $jo_data + 'assigned' => true, + 'available' => true, ]; return $data; From db4ab726ab0cfc0ff63c36e12815f311b83bb8cf Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 22 Jun 2020 04:00:08 +0000 Subject: [PATCH 050/138] Fix bug in completeJobOrder. #424 --- src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 39b99a56..2aadf6ed 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -1420,9 +1420,6 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface ->setRider($rider); $this->em->persist($event); - // tag rider as unavailable - $rider->setAvailable(false); - // save to customer vehicle battery record $this->jo_handler->updateVehicleBattery($jo); From 0f0169cff413352a64c486b092483d625b449db6 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 22 Jun 2020 04:32:58 +0000 Subject: [PATCH 051/138] Fix return value for verifyJobOrder. #424 --- src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 2aadf6ed..e1ca9026 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -2092,8 +2092,8 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface ($jo->getStatus() == JOStatus::CANCELLED)) { $data = [ - 'assigned' => 'true', - 'available' => 'false' + 'assigned' => true, + 'available' => false ]; return $data; } From a3cf1572f1adf8ff3629c650d5b13d9c06b3cb21 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 22 Jun 2020 06:41:24 +0000 Subject: [PATCH 052/138] Refactor the controller for the API response. #424 --- src/Controller/CMBRAPIController.php | 499 ++------------------------- 1 file changed, 29 insertions(+), 470 deletions(-) diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php index 87ab9cc1..efdd0177 100644 --- a/src/Controller/CMBRAPIController.php +++ b/src/Controller/CMBRAPIController.php @@ -12,79 +12,32 @@ use App\Ramcar\NewAPIResult; use App\Service\RiderAPIHandlerInterface; // Rider API controller for CMB -// TODO: refactor the other functions to use generateResultFromHandler - class CMBRAPIController extends Controller { public function register(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->register($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function login(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->login($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function logout(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->logout($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } @@ -99,73 +52,28 @@ class CMBRAPIController extends Controller public function acceptJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->acceptJobOrder($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function cancelJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->cancelJobOrder($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function arrive(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->arrive($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } @@ -180,557 +88,208 @@ class CMBRAPIController extends Controller public function hubArrive(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->hubArrive($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function payment(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->payment($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function available(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->available($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function getPromos(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->getPromos($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function getBatteries(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->getBatteries($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function changeService(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->changeService($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function getJobOrderHistory(Request $req, $period, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->getJobOrderHistory($req, $period); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); - } public function getAssignedJobOrders(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->getAssignedJobOrders($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); - } public function setJobOrderInTransit(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->setJobOrderInTransit($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); - } public function generateInvoice(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->generateInvoice($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); - } public function goOnline(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->goOnline($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function goOffline(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->goOffline($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function startJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->startJobOrder($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function completeJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->completeJobOrder($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function setActiveJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->setActiveJobOrder($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function rejectJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->rejectJobOrder($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function setOdometer(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->setOdometer($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function uploadArrivePhotos(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->uploadArrivePhotos($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function uploadFinishPhotos(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->uploadFinishPhotos($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function getStatus(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->getStatus($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function getOngoingJobOrder(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->getOngoingJobOrder($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function getPaymentMethods(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->getPaymentMethods($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } public function getCancelReasons(Request $req, RiderAPIHandlerInterface $rapi_handler) { - $res = new NewAPIResult(); - $data = $rapi_handler->getCancelReasons($req); - if (isset($data['error'])) - { - $message = $data['error']; - $title = $data['title']; + $res = $this->generateResultFromHandler($data); - $res->setError(true) - ->setErrorTitle($title) - ->setErrorMessage($message); - } - else - { - $res->setData($data); - } - - // response return $res->getReturnResponse(); } From 42d086ff5d06b9f067eed38a346276e880a64569 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 22 Jun 2020 10:05:01 +0000 Subject: [PATCH 053/138] Add sending of mqtt event when JO is assigned to rider. #424 --- src/Controller/JobOrderController.php | 8 ++++---- .../JobOrderHandler/CMBJobOrderHandler.php | 20 ++++++++++++++++++- src/Service/JobOrderHandlerInterface.php | 2 +- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php index f23fc73c..cb84e113 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -867,14 +867,14 @@ class JobOrderController extends Controller return $this->render($template, $params); } - public function oneStepSubmit(Request $req, JobOrderHandlerInterface $jo_handler) + public function oneStepSubmit(Request $req, JobOrderHandlerInterface $jo_handler, MQTTClient $mclient) { $this->denyAccessUnlessGranted('jo_onestep.form', null, 'No access.'); // initialize error list $error_array = []; $id = -1; - $error_array = $jo_handler->processOneStepJobOrder($req, $id); + $error_array = $jo_handler->processOneStepJobOrder($req, $id, $mclient); // check if any errors were found if (!empty($error_array)) { @@ -913,12 +913,12 @@ class JobOrderController extends Controller return $this->render($template, $params); } - public function oneStepEditSubmit(Request $req, JobOrderHandlerInterface $jo_handler, $id) + public function oneStepEditSubmit(Request $req, JobOrderHandlerInterface $jo_handler, $id, MQTTClient $mclient) { $this->denyAccessUnlessGranted('jo_onestep.edit', null, 'No access.'); $error_array = []; - $error_array = $jo_handler->processOneStepJobOrder($req, $id); + $error_array = $jo_handler->processOneStepJobOrder($req, $id, $mclient); // check if any errors were found if (!empty($error_array)) { diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 03f84e44..339f64cd 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -416,7 +416,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface return $error_array; } - public function processOneStepJobOrder(Request $req, $id) + public function processOneStepJobOrder(Request $req, $id, MQTTClient $mclient) { // initialize error list $error_array = []; @@ -424,11 +424,16 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $em = $this->em; $jo = $em->getRepository(JobOrder::class)->find($id); + $old_rider = null; if (empty($jo)) { // new job order $jo = new JobOrder(); } + else + { + $old_rider = $jo->getRider(); + } // check if lat and lng are provided if (empty($req->request->get('coord_lng')) || empty($req->request->get('coord_lat'))) { @@ -665,6 +670,19 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $em->persist($event); $em->flush(); + + // check if JO has been reassigned + if ($old_rider != $rider) + { + // TODO: refactor later + $channel = '/rider/' . $rider->getID() . '/events'; + $payload = [ + 'event' => 'new_jo', + 'jo_id' => $jo->getID(), + ]; + + $mclient->publish($channel, json_encode($payload)); + } } } diff --git a/src/Service/JobOrderHandlerInterface.php b/src/Service/JobOrderHandlerInterface.php index 590a0926..22320c18 100644 --- a/src/Service/JobOrderHandlerInterface.php +++ b/src/Service/JobOrderHandlerInterface.php @@ -25,7 +25,7 @@ interface JobOrderHandlerInterface public function generateJobOrder(Request $req, int $id); // process one step job order - public function processOneStepJobOrder(Request $req, int $id); + //public function processOneStepJobOrder(Request $req, int $id, MQTTClient $mclient); // dispatch job order public function dispatchJobOrder(Request $req, int $id, MQTTClient $mclient); From 47eaa6488f2d801f89d917be78fa69f0ac396f53 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 22 Jun 2020 10:56:41 +0000 Subject: [PATCH 054/138] Add display name for payment method in rider API JO data. #424 --- src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index e1ca9026..f884a7ac 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -449,6 +449,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface 'items' => $inv_items, ], 'mode_of_payment' => $jo->getModeOfPayment(), + 'mode_of_payment_display' => CMBModeOfPayment::getName($jo->getModeOfPayment()), 'trade_in_type' => $trade_in_type, 'promo' => $promo_data, // TODO: load the actual @@ -587,6 +588,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface 'items' => $inv_items, ], 'mode_of_payment' => $jo->getModeOfPayment(), + 'mode_of_payment_display' => CMBModeOfPayment::getName($jo->getModeOfPayment()), 'trade_in_type' => $trade_in_type, 'promo' => $promo_data, // TODO: load the actual @@ -747,7 +749,8 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface 'vat' => $inv->getVat(), 'items' => $inv_items, ], - 'mode_of_payment' => $jo->getModeOfPayment(), + 'mode_of_payment' => $jo->getModeOfPayment(), + 'mode_of_payment_display' => CMBModeOfPayment::getName($jo->getModeOfPayment()), 'trade_in_type' => $trade_in_type, 'promo' => $promo_data, // TODO: load the actual From 9d41ecb228ee06e6c17f1131e7fff75952dfb224 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 22 Jun 2020 11:39:58 +0000 Subject: [PATCH 055/138] Add fix for security checking for verifyJobOrder. #424 --- .../RiderAPIHandler/CMBRiderAPIHandler.php | 77 +++++++++++++++++-- 1 file changed, 72 insertions(+), 5 deletions(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index f884a7ac..a9929c16 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -2080,16 +2080,27 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $required_params = [ 'jo_id' ]; - $data = $this->checkJO($req, $required_params, $jo); + $data = $this->checkJOForVerify($req, $required_params, $jo); if (isset($data['error'])) { - $data = [ - 'assigned' => false, - 'available' => false, - ]; + $data['title'] = 'Failed Verify Job Order'; return $data; } + $rider = $this->session->getRider(); + // check if rider is assigned to JO + if ($jo->getRider() != null) + { + if ($rider->getID() != $jo->getRider()->getID()) + { + $data = [ + 'assigned' => false, + 'available' => false, + ]; + return $data; + } + } + // check if JO status is not fulfilled and not cancelled if (($jo->getStatus() == JOStatus::FULFILLED) || ($jo->getStatus() == JOStatus::CANCELLED)) @@ -2287,6 +2298,62 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + protected function checkJOForVerify(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) { From 16b136b0d329149bd2aacef487e1fb8508516ac5 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Tue, 23 Jun 2020 00:10:08 +0800 Subject: [PATCH 056/138] Make sure blank job_order is in data for get ongoing job order rider api call #424 --- src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index a9929c16..d41ebc8f 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -1911,6 +1911,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface if (isset($data['error'])) { $data['title'] = 'Failed Get Ongoing Job Order'; + $data['job_order'] = null; return $data; } @@ -1919,7 +1920,8 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface { $data = [ 'title' => 'Failed Get Ongoing Job Order', - 'error' => 'No logged in rider.' + 'error' => 'No logged in rider.', + 'job_order' => null, ]; return $data; } @@ -1932,7 +1934,8 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface { $data = [ 'title' => 'Failed Get Ongoing Job Order', - 'error' => 'No active job order.' + 'error' => 'No active job order.', + 'job_order' => null, ]; return $data; } From 093a24968934935fa5eff2aa0b4152d2c7c33b6f Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 23 Jun 2020 02:33:24 +0000 Subject: [PATCH 057/138] Add JO status checking for getOngoingJobOrder. #424 --- .../RiderAPIHandler/CMBRiderAPIHandler.php | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index d41ebc8f..597869c4 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -840,6 +840,9 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // set jo status to in transit $jo->setStatus(JOStatus::IN_TRANSIT); + // set rider's active JO + + // TODO: send mqtt event (?) // add event log @@ -1940,7 +1943,17 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } - $jo_data = $this->formatJobOrderData($req, $jo); + $jo_data = []; + // check if JO status is in_progress, in_transit, performed, paid + switch($jo->getStatus()) + { + case JOStatus::IN_TRANSIT: + case JOStatus::IN_PROGRESS: + case JOStatus::PERFORMED: + case JOStatus::PAID: + $jo_data = $this->formatJobOrderData($req, $jo); + break; + } $data = [ 'job_order' => $jo_data From 21ae94c5b69e9e2af359dd4b758421a66cfbbac2 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 23 Jun 2020 06:06:15 +0000 Subject: [PATCH 058/138] Change default mode of payment to credit card. #424 --- src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 597869c4..2dbb4465 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -1246,9 +1246,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $trade_in = null; // check mode of payment + // TODO: defaulting to credit_card for now if mode of payment is invalid $mode = $req->request->get('mode_of_payment'); if (!CMBModeOfPayment::validate($mode)) - $mode = CMBModeOfPayment::CASH; + $mode = CMBModeOfPayment::CREDIT_CARD; $jo->setModeOfPayment($mode); // generate new invoice From 0f5bf2e8d63812ac2589b19e46b232fe8cc155f9 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 23 Jun 2020 09:40:39 +0000 Subject: [PATCH 059/138] Fix error when rider is not selected. #424 --- .../JobOrderHandler/CMBJobOrderHandler.php | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 339f64cd..2dd355d5 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -558,19 +558,6 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface } } - // set priority based on rider's existing open job orders - $rider_jos = $rider->getOpenJobOrders(); - - // get maximum priority then add 1 - // NOTE: this can be a bit buggy due to concurrency issues - // ideally have to lock jo table, but that isn't feasible right now - $priority = 0; - foreach ($rider_jos as $rider_jo) - { - if ($priority < $rider_jo->getPriority()) - $priority = $rider_jo->getPriority() + 1; - } - // get discount and set to meta $discount = $req->request->get('invoice_discount', []); @@ -583,6 +570,19 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface if (empty($error_array)) { + // set priority based on rider's existing open job orders + $rider_jos = $rider->getOpenJobOrders(); + + // get maximum priority then add 1 + // NOTE: this can be a bit buggy due to concurrency issues + // ideally have to lock jo table, but that isn't feasible right now + $priority = 0; + foreach ($rider_jos as $rider_jo) + { + if ($priority < $rider_jo->getPriority()) + $priority = $rider_jo->getPriority() + 1; + } + // get current user $user = $this->security->getUser(); From 5822ea84a6041b4374e3b8615786cf937320a77e Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 23 Jun 2020 09:54:50 +0000 Subject: [PATCH 060/138] Add fix for rider being unavailable after completing a JO. #424 --- src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 2dbb4465..c8feade0 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -1416,7 +1416,9 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // set jo status to fulfilled $jo->setStatus(JOStatus::FULFILLED); */ - $jo->fulfill(); + //$jo->fulfill(); + $jo->setStatus(JOStatus::FULFILLED) + ->setDateFulfill(new DateTime()); // add event log $rider = $this->session->getRider(); From 4de9a0094271ccb2e50da29b4d80c7670a93beb5 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 24 Jun 2020 07:10:45 +0000 Subject: [PATCH 061/138] Add config variable for ssl. #424 --- .env.dist | 3 +++ config/packages/twig.yaml | 1 + public/assets/js/map_mqtt.js | 5 +++-- templates/home.html.twig | 12 +++++++++--- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/.env.dist b/.env.dist index bd82f980..11794311 100644 --- a/.env.dist +++ b/.env.dist @@ -74,3 +74,6 @@ MAPTILER_API_KEY=map_tiler_api_key # API version API_VERSION=insert_api_version_here + +# SSL +SSL_ENABLE=true_or_false diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml index 1c848030..ade96bcc 100644 --- a/config/packages/twig.yaml +++ b/config/packages/twig.yaml @@ -8,3 +8,4 @@ twig: mqtt_host: "%env(MQTT_WS_HOST)%" mqtt_port: "%env(MQTT_WS_PORT)%" dashboard_enable: "%env(DASHBOARD_ENABLE)%" + ssl_enable: "%env(SSL_ENABLE)%" diff --git a/public/assets/js/map_mqtt.js b/public/assets/js/map_mqtt.js index 0e6bdb31..250e00c6 100644 --- a/public/assets/js/map_mqtt.js +++ b/public/assets/js/map_mqtt.js @@ -1,7 +1,8 @@ class MapEventHandler { - constructor(options, dashmap) { + constructor(options, dashmap, ssl) { this.options = options; this.dashmap = dashmap; + this.ssl = ssl; } connect(user_id, host, port) { @@ -11,7 +12,7 @@ class MapEventHandler { this.mqtt = new Paho.MQTT.Client(host, port, client_id); var options = { - // useSSL: true, + useSSL: this.ssl, timeout: 3, invocationContext: this, onSuccess: this.onConnect.bind(this), diff --git a/templates/home.html.twig b/templates/home.html.twig index 69cb59c0..837afcdf 100644 --- a/templates/home.html.twig +++ b/templates/home.html.twig @@ -45,7 +45,7 @@ function initMap(r_markers, c_markers, icons) { return dashmap; } -function initEventHandler(dashmap) { +function initEventHandler(dashmap, icons, ssl) { var options = { 'track_jo': true, 'track_rider': true, @@ -58,7 +58,8 @@ function initEventHandler(dashmap) { }, }; - var event_handler = new MapEventHandler(options, dashmap); + console.log(ssl); + var event_handler = new MapEventHandler(options, dashmap, ssl); event_handler.connect('{{ app.user.getID }}', '{{ mqtt_host }}', {{ mqtt_port }}); } @@ -94,8 +95,13 @@ var icons = { var r_markers = {}; var c_markers = {}; + var ssl = false; + {% if ssl_enable == 'true' %} + ssl = true; + {% endif %} + var dashmap = initMap(r_markers, c_markers, icons); - initEventHandler(dashmap, icons); + initEventHandler(dashmap, icons, ssl); {% endif %} From 47a52782f7fc31a3bcf25ec172909e7766eec6d7 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 24 Jun 2020 07:55:50 +0000 Subject: [PATCH 062/138] Remove prefix from channel. #424 --- src/Service/JobOrderHandler/CMBJobOrderHandler.php | 2 +- templates/home.html.twig | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 2dd355d5..ffad7334 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -675,7 +675,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface if ($old_rider != $rider) { // TODO: refactor later - $channel = '/rider/' . $rider->getID() . '/events'; + $channel = 'rider/' . $rider->getID() . '/events'; $payload = [ 'event' => 'new_jo', 'jo_id' => $jo->getID(), diff --git a/templates/home.html.twig b/templates/home.html.twig index 837afcdf..ebe8cff3 100644 --- a/templates/home.html.twig +++ b/templates/home.html.twig @@ -58,7 +58,6 @@ function initEventHandler(dashmap, icons, ssl) { }, }; - console.log(ssl); var event_handler = new MapEventHandler(options, dashmap, ssl); event_handler.connect('{{ app.user.getID }}', '{{ mqtt_host }}', {{ mqtt_port }}); } From 5ad416df1d0160170f31eb15a3e66b9e8f8342a2 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 24 Jun 2020 09:05:35 +0000 Subject: [PATCH 063/138] Set yaml files for cmb. #424 --- config/menu.yaml | 37 ++++++++++------------------------- config/services.yaml | 24 ++++++++++++----------- translations/messages.en.yaml | 34 ++++++++++++++++---------------- 3 files changed, 40 insertions(+), 55 deletions(-) diff --git a/config/menu.yaml b/config/menu.yaml index 246eda01..9f28b315 100644 --- a/config/menu.yaml +++ b/config/menu.yaml @@ -37,6 +37,10 @@ main_menu: acl: rider.list label: Riders parent: logistics + - id: service_charge_list + acl: service_charge.list + label: Service Charges + parent: logistics - id: battery acl: battery.menu @@ -98,21 +102,13 @@ main_menu: acl: joborder.menu label: Job Order icon: flaticon-calendar-3 - - id: jo_in - acl: jo_in.list - label: Incoming + - id: jo_onestep_form + acl: jo_onestep.form + label: One-step Process parent: joborder - - id: jo_proc - acl: jo_proc.list - label: Dispatch - parent: joborder - - id: jo_assign - acl: jo_assign.list - label: Rider Assignment - parent: joborder - - id: jo_fulfill - acl: jo_fulfill.list - label: Fulfillment + - id: jo_walkin_form + acl: jo_walkin.form + label: Walk-in parent: joborder - id: jo_open acl: jo_open.list @@ -122,10 +118,6 @@ main_menu: acl: jo_all.list label: View All parent: joborder - - id: jo_hub_view - acl: jo_hub.list - label: Hub View - parent: joborder - id: support acl: support.menu @@ -185,12 +177,3 @@ main_menu: acl: review.list label: Reviews parent: partner - - - id: analytics - acl: analytics.menu - label: Analytics - icon: flaticon-graphic - - id: analytics_forecast_form - acl: analytics.forecast - label: Forecasting - parent: analytics diff --git a/config/services.yaml b/config/services.yaml index 05fd3b1a..3d9fd7a3 100644 --- a/config/services.yaml +++ b/config/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' @@ -161,39 +162,40 @@ services: - { name: kernel.event_listener, event: kernel.controller, method: onKernelController } # invoice generator - App\Service\InvoiceGenerator\ResqInvoiceGenerator: ~ + App\Service\InvoiceGenerator\CMBInvoiceGenerator: ~ # invoice generator interface - App\Service\InvoiceGeneratorInterface: "@App\\Service\\InvoiceGenerator\\ResqInvoiceGenerator" + App\Service\InvoiceGeneratorInterface: "@App\\Service\\InvoiceGenerator\\CMBInvoiceGenerator" # job order generator - App\Service\JobOrderHandler\ResqJobOrderHandler: + App\Service\JobOrderHandler\CMBJobOrderHandler: arguments: $country_code: "%env(COUNTRY_CODE)%" #job order generator interface - App\Service\JobOrderHandlerInterface: "@App\\Service\\JobOrderHandler\\ResqJobOrderHandler" + App\Service\JobOrderHandlerInterface: "@App\\Service\\JobOrderHandler\\CMBJobOrderHandler" # customer generator - App\Service\CustomerHandler\ResqCustomerHandler: + App\Service\CustomerHandler\CMBCustomerHandler: arguments: $country_code: "%env(COUNTRY_CODE)%" # customer generator interface - App\Service\CustomerHandlerInterface: "@App\\Service\\CustomerHandler\\ResqCustomerHandler" + App\Service\CustomerHandlerInterface: "@App\\Service\\CustomerHandler\\CMBCustomerHandler" # rider assignment - App\Service\RiderAssignmentHandler\ResqRiderAssignmentHandler: ~ + App\Service\RiderAssignmentHandler\CMBRiderAssignmentHandler: ~ # rider assignment interface - App\Service\RiderAssignmentHandlerInterface: "@App\\Service\\RiderAssignmentHandler\\ResqRiderAssignmentHandler" + App\Service\RiderAssignmentHandlerInterface: "@App\\Service\\RiderAssignmentHandler\\CMBRiderAssignmentHandler" # rider API service - App\Service\RiderAPIHandler\ResqRiderAPIHandler: + 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\\ResqRiderAPIHandler" + App\Service\RiderAPIHandlerInterface: "@App\\Service\\RiderAPIHandler\\CMBRiderAPIHandler" # map manager #App\Service\GISManager\Bing: ~ diff --git a/translations/messages.en.yaml b/translations/messages.en.yaml index c0fb8ca1..3e12543b 100644 --- a/translations/messages.en.yaml +++ b/translations/messages.en.yaml @@ -1,27 +1,27 @@ # text -title_login: Motolite Res-Q | Login -block_title: Motolite Res-Q +title_login: Res-Q for CMB | Login +block_title: Res-Q for CMB control_panel_sign_in: Sign-in to Control Panel -alt_image_logo_login: Res-Q -alt_image_dashboard: Motolite -copyright: Motolite Res-Q +alt_image_logo_login: Res-Q for CMB +alt_image_dashboard: Res-Q for CMB +copyright: Res-Q for CMB battery_size_tradein_brand: Trade-in Motolite battery_size_tradein_premium: Trade-in Premium battery_size_tradein_other: Trade-in Other add_cust_vehicle_battery_info: This vehicle is using a Motolite battery -jo_title_pdf: Motolite Res-Q Job Order -country_code_prefix: '+63' -delivery_instructions_label: Delivery Instructions +jo_title_pdf: Res-Q for CMB Job Order +country_code_prefix: '+60' +delivery_instructions_label: 'CarFix Details' # images -image_logo_login: /assets/images/logo-resq.png -icon_login: /assets/demo/default/media/img/logo/favicon.ico -icon_base_32x32: /assets/images/favicon/favicon-32x32.png -icon_base_16x16: /assets/images/favicon/favicon-16x16.png -image_dashboard: /assets/images/logo-motolite.png -image_jo_pdf: /public/assets/images/logo-resq.png +image_logo_login: /assets/images/black-text-logo-01.png +icon_login: /assets/images/battery-assist-bm-logo-32x32.png +icon_base_32x32: /assets/images/black-text-logo-01-32x32.png +icon_base_16x16: /assets/images/black-text-logo-01-16x16.png +image_dashboard: /assets/images/century_logo.png +image_jo_pdf: /public/assets/images/black-text-logo-01-115x115.png # default point for maps -default_lat: 14.6091 -default_long: 121.0223 -default_region: ph +default_lat: 3.084216 +default_long: 101.6129996 +default_region: my From a1a60100f5470c4b355f64bd24d75f3764ea1eac Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 25 Jun 2020 03:11:08 +0000 Subject: [PATCH 064/138] Add new event type for perform. Add event creation when JO is performed. #424 --- src/Ramcar/CMBJOEventType.php | 2 ++ src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Ramcar/CMBJOEventType.php b/src/Ramcar/CMBJOEventType.php index 12dd0264..e6a14482 100644 --- a/src/Ramcar/CMBJOEventType.php +++ b/src/Ramcar/CMBJOEventType.php @@ -17,6 +17,7 @@ class CMBJOEventType extends NameValue const RIDER_START = 'rider_start'; const RIDER_EDIT = 'rider_edit'; const PAID = 'paid'; + const PERFORM = 'perform'; const COLLECTION = [ 'create' => 'Created', @@ -32,5 +33,6 @@ class CMBJOEventType extends NameValue 'rider_start' => 'Rider Start', 'rider_edit' => 'Rider Edit', 'paid' => 'Paid', + 'perform' => 'Perform', ]; } diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index c8feade0..d2d1f5e0 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -906,7 +906,14 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $jo->perform(); - // TODO: make event for this? + // add event log + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(CMBJOEventType::PERFORM) + ->setJobOrder($jo) + ->setRider($rider); + $this->em->persist($event); $this->em->flush(); From c3b4e1219b857e7a5fff5e2f8cdad074ad749980 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 25 Jun 2020 04:43:00 +0000 Subject: [PATCH 065/138] Add trim when getting plate number when adding a customer vehicle. #424 --- src/Service/CustomerHandler/CMBCustomerHandler.php | 2 +- src/Service/JobOrderHandler/CMBJobOrderHandler.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Service/CustomerHandler/CMBCustomerHandler.php b/src/Service/CustomerHandler/CMBCustomerHandler.php index 371f674b..49f07044 100644 --- a/src/Service/CustomerHandler/CMBCustomerHandler.php +++ b/src/Service/CustomerHandler/CMBCustomerHandler.php @@ -189,7 +189,7 @@ class CMBCustomerHandler implements CustomerHandlerInterface $cust_vehicle = new CustomerVehicle(); $cust_vehicle->setName($vehicle->name) ->setVehicle($vobj) - ->setPlateNumber($vehicle->plate_number) + ->setPlateNumber(trim($vehicle->plate_number)) ->setModelYear($vehicle->model_year) ->setColor('') ->setStatusCondition('') diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index ffad7334..23d08d6b 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -454,7 +454,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $error_array['customer_phone_mobile'] = 'Invalid mobile phone number.'; // check if plate number is in request - if (empty($req->request->get('cv_plate'))) + if (empty(trim($req->request->get('cv_plate')))) $error_array['cv_plate'] = 'Plate number is required.'; // find the vehicle using vid From a65211a709904775ee73242ed881ba43ff98b268 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 25 Jun 2020 08:24:09 +0000 Subject: [PATCH 066/138] Remove the Action and Distance in KM from walkin form. Remove the Action columns in one step form. #424 --- src/Service/JobOrderHandler/CMBJobOrderHandler.php | 6 +++--- templates/job-order/cmb.form.onestep.html.twig | 9 +-------- templates/job-order/cmb.form.walkin.html.twig | 6 ------ 3 files changed, 4 insertions(+), 17 deletions(-) diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 23d08d6b..899ba83e 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -479,7 +479,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $new_cv->setCustomer($new_cust) ->setVehicle($new_vehicle) - ->setPlateNumber($req->request->get('cv_plate')) + ->setPlateNumber(trim($req->request->get('cv_plate'))) ->setModelYear($req->request->get('cv_year')) ->setColor('') ->setStatusCondition('') @@ -2490,7 +2490,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $error_array['customer_phone_mobile'] = 'Invalid mobile phone number.'; // check if plate number is in request - if (empty($req->request->get('cv_plate'))) + if (empty(trim($req->request->get('cv_plate')))) $error_array['cv_plate'] = 'Plate number is required.'; // find the vehicle using vid @@ -2516,7 +2516,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $new_cv->setCustomer($new_cust) ->setVehicle($new_vehicle) - ->setPlateNumber($req->request->get('cv_plate')) + ->setPlateNumber(trim($req->request->get('cv_plate'))) ->setModelYear($req->request->get('cv_year')) ->setColor('') ->setStatusCondition('') diff --git a/templates/job-order/cmb.form.onestep.html.twig b/templates/job-order/cmb.form.onestep.html.twig index 7d2344f2..c3ad623f 100644 --- a/templates/job-order/cmb.form.onestep.html.twig +++ b/templates/job-order/cmb.form.onestep.html.twig @@ -415,7 +415,6 @@ Branch Contact Numbers Distance in KM - Action @@ -425,7 +424,6 @@ {{ hub.hub.getName }} {{ hub.hub.getBranch }} {{ hub.hub.getContactNumbers }} - {% endfor %} {% endif %} --> @@ -462,14 +460,13 @@ Last Name Contact No. Plate Number - Action {% if mode in ['onestep-edit', 'view-all', 'update-fulfillment'] %} {% set avail_riders = obj.getHub.getAvailableRiders|default([]) %} - + No riders available. @@ -765,7 +762,6 @@ $(function() { hub_table += '' + hub['branch'] + ''; hub_table += '' + hub['cnum'] + ''; hub_table += '' + hub['distance'] + ''; - hub_table += ''; hub_table += ''; } @@ -794,7 +790,6 @@ $(function() { hub_table += '' + hub['branch'] + ''; hub_table += '' + hub['cnum'] + ''; hub_table += '' + hub['distance'] + ''; - hub_table += ''; hub_table += ''; } @@ -820,7 +815,6 @@ $(function() { hub_table += '' + hub['branch'] + ''; hub_table += '' + hub['cnum'] + ''; hub_table += '' + hub['distance'] + ''; - hub_table += ''; hub_table += ''; } } @@ -931,7 +925,6 @@ $(function() { rider_table += '' + rider['last_name'] + ''; rider_table += '' + rider['contact_num'] + ''; rider_table += '' + rider['plate_num'] + ''; - rider_table += ''; rider_table += ''; } diff --git a/templates/job-order/cmb.form.walkin.html.twig b/templates/job-order/cmb.form.walkin.html.twig index e628d93b..fa9104af 100644 --- a/templates/job-order/cmb.form.walkin.html.twig +++ b/templates/job-order/cmb.form.walkin.html.twig @@ -357,8 +357,6 @@ Hub Branch Contact Numbers - Distance in KM - Action @@ -367,16 +365,12 @@ {{ obj.getHub.getName }} {{ obj.getHub.getBranch }} {{ obj.getHub.getContactNumbers }} - - {% else %} {% for hub in hubs %} {{ hub.getName }} {{ hub.getBranch }} {{ hub.getContactNumbers }} - - {% endfor %} {% endif %} From be52d089d2528740391b714b86bde30c7aa9953b Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 25 Jun 2020 08:50:08 +0000 Subject: [PATCH 067/138] Fix JO saving when plate number is blank. #424 --- src/Service/JobOrderHandler/CMBJobOrderHandler.php | 14 ++++++++------ templates/job-order/cmb.form.onestep.html.twig | 6 +++--- templates/job-order/cmb.form.walkin.html.twig | 8 +++++--- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 899ba83e..cb12cf00 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -454,8 +454,8 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $error_array['customer_phone_mobile'] = 'Invalid mobile phone number.'; // check if plate number is in request - if (empty(trim($req->request->get('cv_plate')))) - $error_array['cv_plate'] = 'Plate number is required.'; + if (empty(trim($req->request->get('plate_number')))) + $error_array['plate_number'] = 'Plate number is required.'; // find the vehicle using vid $new_vehicle = $em->getRepository(Vehicle::class)->find($req->request->get('vid')); @@ -479,7 +479,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $new_cv->setCustomer($new_cust) ->setVehicle($new_vehicle) - ->setPlateNumber(trim($req->request->get('cv_plate'))) + ->setPlateNumber(trim($req->request->get('plate_number'))) ->setModelYear($req->request->get('cv_year')) ->setColor('') ->setStatusCondition('') @@ -648,6 +648,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface // add errors to list foreach ($errors as $error) { + error_log($error->getPropertyPath()); $error_array[$error->getPropertyPath()] = $error->getMessage(); } @@ -2490,8 +2491,8 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $error_array['customer_phone_mobile'] = 'Invalid mobile phone number.'; // check if plate number is in request - if (empty(trim($req->request->get('cv_plate')))) - $error_array['cv_plate'] = 'Plate number is required.'; + if (empty(trim($req->request->get('plate_number')))) + $error_array['plate_number'] = 'Plate number is required.'; // find the vehicle using vid $new_vehicle = $em->getRepository(Vehicle::class)->find($req->request->get('vid')); @@ -2516,7 +2517,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $new_cv->setCustomer($new_cust) ->setVehicle($new_vehicle) - ->setPlateNumber(trim($req->request->get('cv_plate'))) + ->setPlateNumber(trim($req->request->get('plate_number'))) ->setModelYear($req->request->get('cv_year')) ->setColor('') ->setStatusCondition('') @@ -2650,6 +2651,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface // add errors to list foreach ($errors as $error) { + error_log($error->getPropertyPath()); $error_array[$error->getPropertyPath()] = $error->getMessage(); } diff --git a/templates/job-order/cmb.form.onestep.html.twig b/templates/job-order/cmb.form.onestep.html.twig index c3ad623f..e10d0add 100644 --- a/templates/job-order/cmb.form.onestep.html.twig +++ b/templates/job-order/cmb.form.onestep.html.twig @@ -184,11 +184,11 @@
-
diff --git a/templates/job-order/cmb.form.walkin.html.twig b/templates/job-order/cmb.form.walkin.html.twig index 4fe7f5b2..80409b06 100644 --- a/templates/job-order/cmb.form.walkin.html.twig +++ b/templates/job-order/cmb.form.walkin.html.twig @@ -392,11 +392,13 @@
+
From ada02f46a7fe04f014af2d84d222fd9e02c39255 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 1 Jul 2020 09:17:34 +0000 Subject: [PATCH 080/138] Comment saving of promo information. #434 --- src/Service/JobOrderHandler/CMBJobOrderHandler.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 7c02bac1..556fdfbd 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -350,7 +350,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface ->setTier2Notes($req->request->get('tier2_notes')) ->setDeliveryAddress($req->request->get('delivery_address')) ->setORName($req->request->get('or_name')) - ->setPromoDetail($req->request->get('promo_detail')) + //->setPromoDetail($req->request->get('promo_detail')) ->setModeOfPayment($req->request->get('mode_of_payment')) ->setLandmark($req->request->get('landmark')); @@ -599,7 +599,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface ->setTier2Notes($req->request->get('tier2_notes')) ->setDeliveryAddress($req->request->get('delivery_address')) ->setORName($req->request->get('or_name')) - ->setPromoDetail($req->request->get('promo_detail')) + //->setPromoDetail($req->request->get('promo_detail')) ->setModeOfPayment($req->request->get('mode_of_payment')) ->setLandmark($req->request->get('landmark')) ->setHub($hub) @@ -2629,8 +2629,8 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface // get discount and set to meta $discount = $req->request->get('invoice_discount'); - // check if discount is greater than 50 or negative number - if (($discount > 50) || ($discount < 0)) + // check if discount is greater than 60 or negative number + if (($discount > 60) || ($discount < 0)) $error_array['invoice_discount'] = 'Invalid discount specified'; if (empty($error_array)) @@ -2650,7 +2650,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface ->setTier1Notes($req->request->get('tier1_notes')) ->setTier2Notes($req->request->get('tier2_notes')) ->setORName($req->request->get('or_name')) - ->setPromoDetail($req->request->get('promo_detail')) + //->setPromoDetail($req->request->get('promo_detail')) ->setModeOfPayment($req->request->get('mode_of_payment')) ->setLandmark($req->request->get('landmark')) ->setDeliveryAddress('Walk-in') From 2cf55420377b9bd93a1a3cd1d886fa750fed74f7 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 1 Jul 2020 09:21:41 +0000 Subject: [PATCH 081/138] Adjust max value for discount to 60. #434 --- templates/job-order/cmb.form.onestep.html.twig | 4 ++-- templates/job-order/cmb.form.walkin.html.twig | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/templates/job-order/cmb.form.onestep.html.twig b/templates/job-order/cmb.form.onestep.html.twig index 13d28e5b..3a52b019 100644 --- a/templates/job-order/cmb.form.onestep.html.twig +++ b/templates/job-order/cmb.form.onestep.html.twig @@ -656,10 +656,10 @@
{% if ftags.invoice_edit %} - + {% else %} - + {% endif %}
diff --git a/templates/job-order/cmb.form.walkin.html.twig b/templates/job-order/cmb.form.walkin.html.twig index 80409b06..35ef6053 100644 --- a/templates/job-order/cmb.form.walkin.html.twig +++ b/templates/job-order/cmb.form.walkin.html.twig @@ -404,10 +404,10 @@
{% if ftags.invoice_edit %} - + {% else %} - + {% endif %}
From 473e7a8e51a31b6409c90dcacf46dcb271884a37 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 1 Jul 2020 09:40:01 +0000 Subject: [PATCH 082/138] Return list of years for model year until current year. #434 --- src/Service/CustomerHandler/CMBCustomerHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Service/CustomerHandler/CMBCustomerHandler.php b/src/Service/CustomerHandler/CMBCustomerHandler.php index 49f07044..242ee284 100644 --- a/src/Service/CustomerHandler/CMBCustomerHandler.php +++ b/src/Service/CustomerHandler/CMBCustomerHandler.php @@ -594,7 +594,7 @@ class CMBCustomerHandler implements CustomerHandlerInterface protected function generateYearOptions() { $start_year = 1950; - return range($start_year, date("Y") + 1); + return range($start_year, date("Y")); } From 9bb8380ca4a7342f203dd58c966bd91221072d26 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 2 Jul 2020 02:59:23 +0000 Subject: [PATCH 083/138] Add 45 minutes to date_schedule. #434 --- .../JobOrderHandler/CMBJobOrderHandler.php | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 556fdfbd..dbcef5b9 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -1442,7 +1442,16 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface public function initializeOneStepForm() { - $params['obj'] = new JobOrder(); + $new_jo = new JobOrder(); + + // set time schedule + $date_schedule = new DateTime(); + + // add 45 minutes to time + $date_schedule->add(new DateInterval('PT45M')); + $new_jo->setDateSchedule($date_schedule); + + $params['obj'] = $new_jo; $params['mode'] = 'onestep'; $params['jo_service_charges'] = []; @@ -2498,7 +2507,16 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface public function initializeWalkinForm() { - $params['obj'] = new JobOrder(); + $new_jo = new JobOrder(); + + // set time schedule + $date_schedule = new DateTime(); + + // add 45 minutes to time + $date_schedule->add(new DateInterval('PT45M')); + $new_jo->setDateSchedule($date_schedule); + + $params['obj'] = $new_jo; $params['mode'] = 'walk-in'; $this->fillDropdownParameters($params); From 6e07e24e93e22bfa71655afd671c77765751710d Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 2 Jul 2020 11:53:14 +0000 Subject: [PATCH 084/138] Made discount a dropdown. #434 --- .../JobOrderHandler/CMBJobOrderHandler.php | 12 +++++ .../job-order/cmb.form.onestep.html.twig | 50 +++++++++++++++++-- templates/job-order/cmb.form.walkin.html.twig | 22 +++++++- 3 files changed, 77 insertions(+), 7 deletions(-) diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index dbcef5b9..2bbb614d 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -1454,6 +1454,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $params['obj'] = $new_jo; $params['mode'] = 'onestep'; $params['jo_service_charges'] = []; + $params['discounts'] = $this->generateDiscountOptions(); $this->fillDropdownParameters($params); $this->fillFormTags($params); @@ -1474,6 +1475,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $params['mode'] = 'onestep-edit'; $params['cvid'] = $obj->getCustomerVehicle()->getID(); $params['vid'] = $obj->getCustomerVehicle()->getVehicle()->getID(); + $params['discounts'] = $this->generateDiscountOptions(); // get service charges $sc_array = []; @@ -1504,6 +1506,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface // get images if any $jo_extra = $obj->getJOExtra(); $pic_array = []; + $params['signature'] = null; if ($jo_extra != null) { $b_speed_img = $jo_extra->getBeforeSpeedImageFilename(); @@ -1605,6 +1608,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $params['mode'] = 'open_edit'; $params['cvid'] = $jo->getCustomerVehicle()->getID(); $params['vid'] = $jo->getCustomerVehicle()->getVehicle()->getID(); + $params['discounts'] = $this->generateDiscountOptions(); $this->fillDropdownParameters($params); $this->fillFormTags($params); @@ -2518,6 +2522,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $params['obj'] = $new_jo; $params['mode'] = 'walk-in'; + $params['discounts'] = $this->generateDiscountOptions(); $this->fillDropdownParameters($params); $this->fillFormTags($params); @@ -2803,6 +2808,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $params['mode'] = 'walk-in-edit'; $params['cvid'] = $obj->getCustomerVehicle()->getID(); $params['vid'] = $obj->getCustomerVehicle()->getVehicle()->getID(); + $params['discounts'] = $this->generateDiscountOptions(); $this->fillDropdownParameters($params); $this->fillFormTags($params); @@ -3131,4 +3137,10 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface else return 'jo_onestep_edit_form'; } + + protected function generateDiscountOptions() + { + $discount_start = 0; + return range($discount_start, 60); + } } diff --git a/templates/job-order/cmb.form.onestep.html.twig b/templates/job-order/cmb.form.onestep.html.twig index 3a52b019..92a13711 100644 --- a/templates/job-order/cmb.form.onestep.html.twig +++ b/templates/job-order/cmb.form.onestep.html.twig @@ -278,7 +278,7 @@
- + @@ -288,7 +288,7 @@
- + @@ -656,10 +656,28 @@
{% if ftags.invoice_edit %} - + {% else %} - + {% endif %}
@@ -1162,6 +1180,28 @@ $(function() { return false; } + // check date schedule if it's earlier + // if so, show an alert to let user know + var date_time = $('#date-schedule-date').val() + ' ' + $('#date-schedule-time').val() + var date_schedule = new Date(date_time); + var current_date = new Date(); + + if (date_schedule < current_date) + { + //swal({ + // title: 'Warning!', + // text: 'Schedule date and time is after today\'s date and time. Continue submission?', + // type: 'warning', + // showCancelButton: true, + //}).then(function(isConfirm) { + // if (isConfirm) { + // return true; + // } else { + // return false; + // } + //}); + } + form_in_process = true; var form = $(this); @@ -1542,7 +1582,7 @@ $(function() { // update invoice when promo is changed $("#invoice-discount").change(function() { - generateInvoice(); + generateInvoice(); }); // trigger update when service type is changed diff --git a/templates/job-order/cmb.form.walkin.html.twig b/templates/job-order/cmb.form.walkin.html.twig index 35ef6053..81de36c1 100644 --- a/templates/job-order/cmb.form.walkin.html.twig +++ b/templates/job-order/cmb.form.walkin.html.twig @@ -404,10 +404,28 @@
{% if ftags.invoice_edit %} - + {% else %} - + {% endif %}
From c3487358f1bc4a88ade6895d44e417f1476fdfb5 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 3 Jul 2020 07:29:47 +0000 Subject: [PATCH 085/138] Autopopulate the OR Name field with the customer name. #434 --- .../JobOrderHandler/CMBJobOrderHandler.php | 15 ++++++++------- templates/job-order/cmb.form.onestep.html.twig | 17 ++++++++++++----- templates/job-order/cmb.form.walkin.html.twig | 12 +++++++++--- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 2bbb614d..c45bd787 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -350,7 +350,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface ->setTier2Notes($req->request->get('tier2_notes')) ->setDeliveryAddress($req->request->get('delivery_address')) ->setORName($req->request->get('or_name')) - //->setPromoDetail($req->request->get('promo_detail')) + ->setPromoDetail($req->request->get('promo_detail', '')) ->setModeOfPayment($req->request->get('mode_of_payment')) ->setLandmark($req->request->get('landmark')); @@ -554,11 +554,12 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface } // get discount and set to meta - $discount = $req->request->get('invoice_discount', []); - - // check if discount is greater than 50 or negative number - if (($discount > 50) || ($discount < 0)) + $discount = $req->request->get('invoice_discount'); + + if (($discount > 60) || ($discount < 0)) + { $error_array['invoice_discount'] = 'Invalid discount specified'; + } // get list of service charges $service_charges = $req->request->get('service_charges', []); @@ -599,7 +600,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface ->setTier2Notes($req->request->get('tier2_notes')) ->setDeliveryAddress($req->request->get('delivery_address')) ->setORName($req->request->get('or_name')) - //->setPromoDetail($req->request->get('promo_detail')) + ->setPromoDetail($req->request->get('promo_detail', '')) ->setModeOfPayment($req->request->get('mode_of_payment')) ->setLandmark($req->request->get('landmark')) ->setHub($hub) @@ -2673,7 +2674,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface ->setTier1Notes($req->request->get('tier1_notes')) ->setTier2Notes($req->request->get('tier2_notes')) ->setORName($req->request->get('or_name')) - //->setPromoDetail($req->request->get('promo_detail')) + ->setPromoDetail($req->request->get('promo_detail', '')) ->setModeOfPayment($req->request->get('mode_of_payment')) ->setLandmark($req->request->get('landmark')) ->setDeliveryAddress('Walk-in') diff --git a/templates/job-order/cmb.form.onestep.html.twig b/templates/job-order/cmb.form.onestep.html.twig index 92a13711..83e866c5 100644 --- a/templates/job-order/cmb.form.onestep.html.twig +++ b/templates/job-order/cmb.form.onestep.html.twig @@ -644,13 +644,11 @@
-
@@ -660,7 +658,7 @@ {% for discount in discounts %} {% if obj.getInvoice %} - + {% else %} {% endif %} @@ -672,12 +670,13 @@ {% for discount in discounts %} {% if obj.getInvoice %} - + {% else %} {% endif %} {% endfor %} + {% endif %}
@@ -1359,6 +1358,7 @@ $(function() { } else { $("#current-battery, #warranty-expiration").val("No current battery").css('color', '#f4516c'); } + $("#or_name").val(vdata.customer.first_name + ' ' + vdata.customer.last_name); }) }).focus(); {% endif %} @@ -1582,6 +1582,7 @@ $(function() { // update invoice when promo is changed $("#invoice-discount").change(function() { + console.log('discount ' + $("#invoice-discount").val()); generateInvoice(); }); @@ -1926,6 +1927,12 @@ $(function() { generateInvoice(); }); + $("#customer-first-name, #customer-last-name").change(function() { + // autopopulate OR name with customer name + var cust_name = $("#customer-first-name").val() + ' ' + $("#customer-last-name").val(); + $("#or_name").val(cust_name); + }); + }); {% endblock %} diff --git a/templates/job-order/cmb.form.walkin.html.twig b/templates/job-order/cmb.form.walkin.html.twig index 81de36c1..63fe6b82 100644 --- a/templates/job-order/cmb.form.walkin.html.twig +++ b/templates/job-order/cmb.form.walkin.html.twig @@ -392,13 +392,11 @@
-
@@ -741,6 +739,8 @@ var vdata = false; } else { $("#current-battery, #warranty-expiration").val("No current battery").css('color', '#f4516c'); } + + $("#or_name").val(vdata.customer.first_name + ' ' + vdata.customer.last_name); }) }).focus(); {% endif %} @@ -1107,6 +1107,12 @@ var vdata = false; }); }); }); + + $("#customer-first-name, #customer-last-name").change(function() { + // autopopulate OR name with customer name + var cust_name = $("#customer-first-name").val() + ' ' + $("#customer-last-name").val(); + $("#or_name").val(cust_name); + }); }); {% endblock %} From 27f37de489afbcd98157a3eef068ee084524e921 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 3 Jul 2020 08:14:12 +0000 Subject: [PATCH 086/138] Fix discount issues. #434 --- src/Controller/JobOrderController.php | 5 ++++- src/Service/InvoiceGenerator/CMBInvoiceGenerator.php | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php index cb84e113..58650d47 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -764,7 +764,10 @@ class JobOrderController extends Controller // use invoice object values in a json friendly array $invoice = [ - 'discount' => number_format($iobj->getDiscount(), 2), + // TODO: CMB needs to have no decimal places for discount. + // Resq requires the two decimal places since discount is computed. + //'discount' => number_format($iobj->getDiscount(), 2), + 'discount' => number_format($iobj->getDiscount(), 0), 'trade_in' => number_format($iobj->getTradeIn(), 2), // TODO: computations not done yet for this on invoice creator 'price' => number_format($iobj->getVATExclusivePrice(), 2), 'vat' => number_format($iobj->getVAT(), 2), diff --git a/src/Service/InvoiceGenerator/CMBInvoiceGenerator.php b/src/Service/InvoiceGenerator/CMBInvoiceGenerator.php index 534600fb..c0425f31 100644 --- a/src/Service/InvoiceGenerator/CMBInvoiceGenerator.php +++ b/src/Service/InvoiceGenerator/CMBInvoiceGenerator.php @@ -270,7 +270,7 @@ class CMBInvoiceGenerator implements InvoiceGeneratorInterface } // check if discount is greater than 50 or negative number - if (($discount > 50) || ($discount < 0)) + if (($discount > 60) || ($discount < 0)) return 'Invalid discount specified'; $criteria->setDiscount($discount); From 3de8b8762f458f01f20281d6223e2f8e5883964a Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 6 Jul 2020 07:51:26 +0000 Subject: [PATCH 087/138] Add checking if scheduled date and time are before the current date and time. #434 --- .../JobOrderHandler/CMBJobOrderHandler.php | 2 + .../job-order/cmb.form.onestep.html.twig | 64 ++++++++++++------- templates/job-order/cmb.form.walkin.html.twig | 46 ++++++++++++- 3 files changed, 88 insertions(+), 24 deletions(-) diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index c45bd787..43e21a0e 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -1456,6 +1456,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $params['mode'] = 'onestep'; $params['jo_service_charges'] = []; $params['discounts'] = $this->generateDiscountOptions(); + $params['current_date'] = new DateTime(); $this->fillDropdownParameters($params); $this->fillFormTags($params); @@ -2524,6 +2525,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $params['obj'] = $new_jo; $params['mode'] = 'walk-in'; $params['discounts'] = $this->generateDiscountOptions(); + $params['current_date'] = new DateTime(); $this->fillDropdownParameters($params); $this->fillFormTags($params); diff --git a/templates/job-order/cmb.form.onestep.html.twig b/templates/job-order/cmb.form.onestep.html.twig index 83e866c5..35846621 100644 --- a/templates/job-order/cmb.form.onestep.html.twig +++ b/templates/job-order/cmb.form.onestep.html.twig @@ -1174,33 +1174,12 @@ $(function() { {% endif %} $("#row-form").submit(function(e) { + e.preventDefault(); if (form_in_process) { alert("Cannot submit form twice. First submission still in progress."); return false; } - // check date schedule if it's earlier - // if so, show an alert to let user know - var date_time = $('#date-schedule-date').val() + ' ' + $('#date-schedule-time').val() - var date_schedule = new Date(date_time); - var current_date = new Date(); - - if (date_schedule < current_date) - { - //swal({ - // title: 'Warning!', - // text: 'Schedule date and time is after today\'s date and time. Continue submission?', - // type: 'warning', - // showCancelButton: true, - //}).then(function(isConfirm) { - // if (isConfirm) { - // return true; - // } else { - // return false; - // } - //}); - } - form_in_process = true; var form = $(this); @@ -1933,6 +1912,47 @@ $(function() { $("#or_name").val(cust_name); }); + $('.dp').on('changeDate', function() { + // check date schedule if it's earlier + // if so, show an alert to let user know + var date_time = $('#date-schedule-date').val() + ' ' + $('#date-schedule-time').val() + var date_schedule = new Date(date_time); + var current_date = new Date('{{ current_date|date('Y-m-d g:i A') }}'); + + // check if date is earlier than current + if (date_schedule < current_date) + { + swal({ + title: 'Warning!', + text: 'Schedule date and time is before today\'s date and time.', + type: 'warning', + }); + } + }); + + $('.tp').on('changeTime.timepicker', function(e) { + // set the schedule time what the user selects + $('#date-schedule-time').val(e.time.value); + }); + + $('.tp').on('hide.timepicker', function(e) { + // check time schedule along with date if it's earlier than current date + var date_time = $('#date-schedule-date').val() + ' ' + $('#date-schedule-time').val() + var date_schedule = new Date(date_time); + var current_date = new Date('{{ current_date|date('Y-m-d g:i A') }}'); + + // check if date is earlier than current + if (date_schedule < current_date) + { + swal({ + title: 'Warning!', + text: 'Schedule date and time is before today\'s date and time.', + type: 'warning', + }); + } + + }); + }); {% endblock %} diff --git a/templates/job-order/cmb.form.walkin.html.twig b/templates/job-order/cmb.form.walkin.html.twig index 63fe6b82..9c34a357 100644 --- a/templates/job-order/cmb.form.walkin.html.twig +++ b/templates/job-order/cmb.form.walkin.html.twig @@ -278,7 +278,7 @@
- + @@ -288,7 +288,7 @@
- + @@ -1113,6 +1113,48 @@ var vdata = false; var cust_name = $("#customer-first-name").val() + ' ' + $("#customer-last-name").val(); $("#or_name").val(cust_name); }); + + $('.dp').on('changeDate', function() { + // check date schedule if it's earlier + // if so, show an alert to let user know + var date_time = $('#date-schedule-date').val() + ' ' + $('#date-schedule-time').val() + var date_schedule = new Date(date_time); + var current_date = new Date('{{ current_date|date('Y-m-d g:i A') }}'); + + // check if date is earlier than current + if (date_schedule < current_date) + { + swal({ + title: 'Warning!', + text: 'Schedule date and time is before today\'s date and time.', + type: 'warning', + }); + } + }); + + $('.tp').on('changeTime.timepicker', function(e) { + // set the schedule time what the user selects + $('#date-schedule-time').val(e.time.value); + }); + + $('.tp').on('hide.timepicker', function(e) { + // check time schedule along with date if it's earlier than current date + var date_time = $('#date-schedule-date').val() + ' ' + $('#date-schedule-time').val() + var date_schedule = new Date(date_time); + var current_date = new Date('{{ current_date|date('Y-m-d g:i A') }}'); + + // check if date is earlier than current + if (date_schedule < current_date) + { + swal({ + title: 'Warning!', + text: 'Schedule date and time is before today\'s date and time.', + type: 'warning', + }); + } + + }); + }); {% endblock %} From 9c2c1e5895f54190db0585533297d538ce061885 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 6 Jul 2020 09:10:33 +0000 Subject: [PATCH 088/138] Remove before pictures from job order. Also remove uploadArrive endpoint. #434 --- config/routes/cmb_rider_api.yaml | 5 - src/Controller/CMBRAPIController.php | 9 - src/Entity/JOExtra.php | 76 -------- .../JobOrderHandler/CMBJobOrderHandler.php | 16 +- .../RiderAPIHandler/CMBRiderAPIHandler.php | 184 ------------------ .../job-order/cmb.form.onestep.html.twig | 41 +--- 6 files changed, 3 insertions(+), 328 deletions(-) diff --git a/config/routes/cmb_rider_api.yaml b/config/routes/cmb_rider_api.yaml index 93f65d1a..805d898d 100644 --- a/config/routes/cmb_rider_api.yaml +++ b/config/routes/cmb_rider_api.yaml @@ -125,11 +125,6 @@ cmb_rapi_jo_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 diff --git a/src/Controller/CMBRAPIController.php b/src/Controller/CMBRAPIController.php index efdd0177..6ddf842e 100644 --- a/src/Controller/CMBRAPIController.php +++ b/src/Controller/CMBRAPIController.php @@ -239,15 +239,6 @@ class CMBRAPIController extends Controller return $res->getReturnResponse(); } - public function uploadArrivePhotos(Request $req, RiderAPIHandlerInterface $rapi_handler) - { - $data = $rapi_handler->uploadArrivePhotos($req); - - $res = $this->generateResultFromHandler($data); - - return $res->getReturnResponse(); - } - public function uploadFinishPhotos(Request $req, RiderAPIHandlerInterface $rapi_handler) { $data = $rapi_handler->uploadFinishPhotos($req); diff --git a/src/Entity/JOExtra.php b/src/Entity/JOExtra.php index b93b1e25..12974b33 100644 --- a/src/Entity/JOExtra.php +++ b/src/Entity/JOExtra.php @@ -19,21 +19,6 @@ class JOExtra */ protected $id; - /** - * @ORM\Column(type="string", nullable=true) - */ - protected $before_speed_image_filename; - - /** - * @ORM\Column(type="string", nullable=true) - */ - protected $before_plate_num_image_filename; - - /** - * @ORM\Column(type="string", nullable=true) - */ - protected $before_batt_image_filename; - /** * @ORM\Column(type="string", nullable=true) */ @@ -49,11 +34,6 @@ class JOExtra */ protected $after_batt_image_filename; - /** - * @ORM\Column(type="array", nullable=true) - */ - protected $before_other_images; - /** * @ORM\Column(type="array", nullable=true) */ @@ -67,7 +47,6 @@ class JOExtra public function __construct() { - $this->before_other_images = new ArrayCollection(); $this->after_other_images = new ArrayCollection(); } @@ -76,38 +55,6 @@ class JOExtra return $this->id; } - public function setBeforeSpeedImageFilename($image_filename) - { - $this->before_speed_image_filename = $image_filename; - return $this; - } - - public function getBeforeSpeedImageFilename() - { - return $this->before_speed_image_filename; - } - - public function setBeforePlateNumImageFilename($image_filename) - { - $this->before_plate_num_image_filename = $image_filename; - return $this; - } - - public function getBeforePlateNumImageFilename() - { - return $this->before_plate_num_image_filename; - } - - public function setBeforeBattImageFilename($image_filename) - { - $this->before_batt_image_filename = $image_filename; - return $this; - } - - public function getBeforeBattImageFilename() - { - return $this->before_batt_image_filename; - } public function setAfterSpeedImageFilename($image_filename) { $this->after_speed_image_filename = $image_filename; @@ -141,29 +88,6 @@ class JOExtra return $this->after_batt_image_filename; } - public function getBeforeOtherImages() - { - return $this->before_other_images; - } - - public function setBeforeOtherImages(array $images) - { - $this->before_other_images = new ArrayCollection(); - - foreach ($images as $image_filename) - { - $this->before_other_images->add($image_filename); - } - - return $this; - } - - public function clearBeforeOtherImages() - { - $this->before_other_images = new ArrayCollection(); - return $this; - } - public function getAfterOtherImages() { return $this->after_other_images; diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 43e21a0e..0ae32a73 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -1478,6 +1478,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $params['cvid'] = $obj->getCustomerVehicle()->getID(); $params['vid'] = $obj->getCustomerVehicle()->getVehicle()->getID(); $params['discounts'] = $this->generateDiscountOptions(); + $params['current_date'] = new DateTime(); // get service charges $sc_array = []; @@ -1511,35 +1512,21 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $params['signature'] = null; if ($jo_extra != null) { - $b_speed_img = $jo_extra->getBeforeSpeedImageFilename(); $a_speed_img = $jo_extra->getAfterSpeedImageFilename(); - $b_plate_img = $jo_extra->getBeforePlateNumImageFilename(); $a_plate_img = $jo_extra->getAfterPlateNumImageFilename(); - $b_batt_img = $jo_extra->getBeforeBattImageFilename(); $a_batt_img = $jo_extra->getAfterBattImageFilename(); - $b_other_images = $jo_extra->getBeforeOtherImages(); $a_other_images = $jo_extra->getAfterOtherImages(); $cust_signature = $jo_extra->getCustomerSignature(); - if ($b_speed_img != null) - $pic_array['before_speed_img'] = $b_speed_img; if ($a_speed_img != null) $pic_array['after_speed_img'] = $a_speed_img; - if ($b_plate_img != null) - $pic_array['before_plate_img'] = $b_plate_img; if ($a_plate_img != null) $pic_array['after_plate_img'] = $a_plate_img; - if ($b_batt_img != null) - $pic_array['before_batt_img'] = $b_batt_img; if ($a_batt_img != null) $pic_array['after_batt_img'] = $a_batt_img; - foreach($b_other_images as $b_img) - { - $pic_array['b_other_images'][] = $b_img; - } foreach ($a_other_images as $a_img) { $pic_array['a_other_images'][] = $a_img; @@ -2812,6 +2799,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $params['cvid'] = $obj->getCustomerVehicle()->getID(); $params['vid'] = $obj->getCustomerVehicle()->getVehicle()->getID(); $params['discounts'] = $this->generateDiscountOptions(); + $params['current_date'] = new DateTime(); $this->fillDropdownParameters($params); $this->fillFormTags($params); diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 25b13034..bd723ab4 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -666,13 +666,6 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface if ($odo <= 0) $odo = 0; - // get before images - $before_images = [ - 'speedometer' => null, - 'plate_number' => null, - 'battery' => null, - 'others' => [], - ]; $after_images = [ 'speedometer' => null, 'plate_number' => null, @@ -682,19 +675,6 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $jo_extra = $jo->getJOExtra(); if ($jo_extra != null) { - // before images - $before_images['speedometer'] = $this->getURLExtraImage($req, $jo_extra->getBeforeSpeedImageFilename()); - $before_images['plate_number'] = $this->getURLExtraImage($req, $jo_extra->getBeforePlateNumImageFilename()); - $before_images['battery'] = $this->getURLExtraImage($req, $jo_extra->getBeforeBattImageFilename()); - - // other images - $other_images = []; - foreach ($jo_extra->getBeforeOtherImages() as $others) - { - $other_images[] = $this->getURLExtraImage($req, $others); - } - $before_images['others'] = $other_images; - // after images $after_images['speedometer'] = $this->getURLExtraImage($req, $jo_extra->getAfterSpeedImageFilename()); $after_images['plate_number'] = $this->getURLExtraImage($req, $jo_extra->getAfterPlateNumImageFilename()); @@ -764,7 +744,6 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface 'odometer' => $odo, // images - 'arrive_photos' => $before_images, 'finish_photos' => $after_images, // customer email @@ -1576,169 +1555,6 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $new_filename; } - public function uploadArrivePhotos(Request $req) - { - $required_params = [ - 'jo_id', - ]; - $data = $this->checkActiveJO($req, $required_params, $jo); - if (isset($data['error'])) - { - $data['title'] = 'Failed Upload Arrive Photos'; - return $data; - } - - $dest = $this->upload_dir; - - $speed_img_file = $req->files->get('speedometer_img'); - $batt_img_file = $req->files->get('battery_img'); - $plate_num_img_file = $req->files->get('plate_number_img'); - $other_img_files[]= $req->files->get('other_images'); - - if ((empty($speed_img_file)) && - (empty($batt_img_file)) && - (empty($plate_num_img_file))) - { - $data = [ - 'title' => 'Failed Upload Arrive Photos', - 'error' => 'No image files received.' - ]; - return $data; - } - else - { - $new_speed_filename = ''; - $new_batt_filename = ''; - $new_plate_num_filename = ''; - $other_filenames = []; - - if (!empty($speed_img_file)) - { - // 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; - } - } - 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)) - { - // 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; - } - } - - foreach ($other_img_files as $other_img_file) - { - if (!(empty($other_img_file))) - { - foreach($other_img_file as $other_img) - { - $orig_other_filename = pathinfo($other_img->getClientOriginalName(), PATHINFO_FILENAME); - $new_other_filename = uniqid() . '-'. $orig_other_filename . '.' . $other_img->guessClientExtension(); - - $other_filenames[] = $new_other_filename; - - try - { - $other_img->move($dest, $new_other_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->setBeforeSpeedImageFilename($new_speed_filename); - $jo_extra->setBeforeBattImageFilename($new_batt_filename); - $jo_extra->setBeforePlateNumImageFilename($new_plate_num_filename); - - if (empty($other_filenames)) - { - $jo_extra->clearBeforeOtherImages(); - } - else - { - $jo_extra->setBeforeOtherImages($other_filenames); - } - - $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); - - if (empty($other_filenames)) - { - $jo_extra->clearBeforeOtherImages(); - - } - else - { - $jo_extra->setBeforeOtherImages($other_filenames); - } - } - - $this->em->flush(); - } - - return $data; - } - public function uploadFinishPhotos(Request $req) { $required_params = [ diff --git a/templates/job-order/cmb.form.onestep.html.twig b/templates/job-order/cmb.form.onestep.html.twig index 35846621..60fb87c4 100644 --- a/templates/job-order/cmb.form.onestep.html.twig +++ b/templates/job-order/cmb.form.onestep.html.twig @@ -511,48 +511,9 @@
-
+
-
-
- -
- {% for key, picture in jo_pictures %} - {% if key == 'before_speed_img' %} -
- -
-
- {% endif %} - {% if key == 'before_plate_img' %} -
- -
-
- {% endif %} - {% if key == 'before_batt_img' %} -
- -
-
- {% endif %} - {% endfor %} -
-
-
- -
- {% for key, picture in jo_pictures %} - {% if key == 'b_other_images' %} - {% for pic in jo_pictures['b_other_images'] %} -
-
-
- {% endfor %} - {% endif %} - {% endfor %} -
From 3fcb3d31b5d2063fdce5a696932f40aead7be34e Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 7 Jul 2020 07:34:43 +0000 Subject: [PATCH 089/138] Limit customer vehicles to 2 per customer. #434 --- templates/customer/cmb.form.html.twig | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/templates/customer/cmb.form.html.twig b/templates/customer/cmb.form.html.twig index e417f3bb..c979b7d7 100644 --- a/templates/customer/cmb.form.html.twig +++ b/templates/customer/cmb.form.html.twig @@ -663,9 +663,18 @@ // display create vehicle form $("#add-vehicle").click(function() { - $("#vehicle-form").data('mode', 'create'); - $("#vehicle-form-title").html("Add Vehicle"); - $("#vehicle-form-modal").modal('show'); + // check if there are already 2 vehicles in list + if (vehicleRows.length == 2) + { + swal({ + text: 'Customer is limited to only 2 vehicles..', + type: 'info', + }); + } else { + $("#vehicle-form").data('mode', 'create'); + $("#vehicle-form-title").html("Add Vehicle"); + $("#vehicle-form-modal").modal('show'); + } }); // find vehicle row by index From a448177a1c7daa8743602d3c58b680556cd31976 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 8 Jul 2020 04:21:17 +0000 Subject: [PATCH 090/138] Made the model year field a dropdown. #434 --- src/Service/JobOrderHandler/CMBJobOrderHandler.php | 13 +++++++++---- templates/job-order/cmb.form.onestep.html.twig | 11 ++++++++++- templates/job-order/cmb.form.walkin.html.twig | 11 ++++++++++- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 0ae32a73..30fa965f 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -1455,7 +1455,6 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $params['obj'] = $new_jo; $params['mode'] = 'onestep'; $params['jo_service_charges'] = []; - $params['discounts'] = $this->generateDiscountOptions(); $params['current_date'] = new DateTime(); $this->fillDropdownParameters($params); @@ -1477,7 +1476,6 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $params['mode'] = 'onestep-edit'; $params['cvid'] = $obj->getCustomerVehicle()->getID(); $params['vid'] = $obj->getCustomerVehicle()->getVehicle()->getID(); - $params['discounts'] = $this->generateDiscountOptions(); $params['current_date'] = new DateTime(); // get service charges @@ -1597,7 +1595,6 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $params['mode'] = 'open_edit'; $params['cvid'] = $jo->getCustomerVehicle()->getID(); $params['vid'] = $jo->getCustomerVehicle()->getVehicle()->getID(); - $params['discounts'] = $this->generateDiscountOptions(); $this->fillDropdownParameters($params); $this->fillFormTags($params); @@ -2798,7 +2795,6 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $params['mode'] = 'walk-in-edit'; $params['cvid'] = $obj->getCustomerVehicle()->getID(); $params['vid'] = $obj->getCustomerVehicle()->getVehicle()->getID(); - $params['discounts'] = $this->generateDiscountOptions(); $params['current_date'] = new DateTime(); $this->fillDropdownParameters($params); @@ -2838,6 +2834,9 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $params['facilitated_types'] = FacilitatedType::getCollection(); $params['facilitated_hubs'] = $fac_hubs; $params['sources'] = CMBTransactionOrigin::getCollection(); + + $params['model_years'] = $this->generateYearOptions(); + $params['discounts'] = $this->generateDiscountOptions(); } protected function initFormTags(&$params) @@ -3134,4 +3133,10 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $discount_start = 0; return range($discount_start, 60); } + + protected function generateYearOptions() + { + $start_year = 1950; + return range($start_year, date("Y")); + } } diff --git a/templates/job-order/cmb.form.onestep.html.twig b/templates/job-order/cmb.form.onestep.html.twig index 60fb87c4..6e53cf9e 100644 --- a/templates/job-order/cmb.form.onestep.html.twig +++ b/templates/job-order/cmb.form.onestep.html.twig @@ -178,7 +178,16 @@
- +
diff --git a/templates/job-order/cmb.form.walkin.html.twig b/templates/job-order/cmb.form.walkin.html.twig index 9c34a357..58b52900 100644 --- a/templates/job-order/cmb.form.walkin.html.twig +++ b/templates/job-order/cmb.form.walkin.html.twig @@ -178,7 +178,16 @@
- +
From c82a7a388d55a9870ba5b6d419b8c88766d154ce Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 8 Jul 2020 09:12:35 +0000 Subject: [PATCH 091/138] Modify checking for JO reassignment. #434 --- src/Service/JobOrderHandler/CMBJobOrderHandler.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 30fa965f..34c48a2b 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -432,7 +432,8 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface } else { - $old_rider = $jo->getRider(); + //$old_rider = $jo->getRider(); + $old_jo_status = $jo->getStatus(); } // check if lat and lng are provided @@ -668,8 +669,10 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $em->flush(); // check if JO has been reassigned - if ($old_rider != $rider) + //if ($old_rider != $rider) + if ($old_jo_status != $jo->getStatus()) { + //error_log('JO has been reassigned'); // TODO: refactor later $channel = 'rider/' . $rider->getID() . '/events'; $payload = [ From 7d19cfa1ebb64adaa41ed392bc181fd45ff15cf2 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 8 Jul 2020 10:41:28 +0000 Subject: [PATCH 092/138] Fix bug when assigning rider to JO. #434 --- src/Service/JobOrderHandler/CMBJobOrderHandler.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 34c48a2b..1a3a6487 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -424,7 +424,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $em = $this->em; $jo = $em->getRepository(JobOrder::class)->find($id); - $old_rider = null; + $old_jo_status = null; if (empty($jo)) { // new job order @@ -672,7 +672,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface //if ($old_rider != $rider) if ($old_jo_status != $jo->getStatus()) { - //error_log('JO has been reassigned'); + error_log('JO has been reassigned'); // TODO: refactor later $channel = 'rider/' . $rider->getID() . '/events'; $payload = [ From c61e3ac39ec5114941da25d410209c15b9d3d95a Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 13 Jul 2020 03:48:05 +0000 Subject: [PATCH 093/138] Set colors for assigned and in progress job orders in View All and View Open JO lists. #436 --- public/assets/css/style.css | 25 ++++++++++++++++++++- templates/job-order/cmb.list.all.html.twig | 8 +++++-- templates/job-order/cmb.list.open.html.twig | 8 +++---- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/public/assets/css/style.css b/public/assets/css/style.css index 140966da..4b69c445 100644 --- a/public/assets/css/style.css +++ b/public/assets/css/style.css @@ -155,6 +155,29 @@ span.has-danger, color: #fff !important; } +.m-table__row--is_in_progress td { + background-color: #FFA500 !important; + color: #fff !important; +} + +.m-table__row--is_in_progress td > span, +.m-table__row--is_in_progress td > span a, +.m-table__row--is_in_progress td > span a i { + color: #fff !important; +} + +.m-table__row--is_assigned td { + background-color: #0000ff !important; + color: #fff !important; +} + +.m-table__row--is_assigned td > span, +.m-table__row--is_assigned td > span a, +.m-table__row--is_assigned td > span a i { + color: #fff !important; +} + + .m-datatable.m-datatable--default > .m-datatable__table { min-height: 0 !important; } @@ -358,4 +381,4 @@ span.has-danger, .map-info .m-badge { border-radius: 0; -} \ No newline at end of file +} diff --git a/templates/job-order/cmb.list.all.html.twig b/templates/job-order/cmb.list.all.html.twig index 1e8b6511..ae0cc4c7 100644 --- a/templates/job-order/cmb.list.all.html.twig +++ b/templates/job-order/cmb.list.all.html.twig @@ -94,8 +94,12 @@ }, rows: { beforeTemplate: function (row, data, index) { - if (data.flag_advance) { - $(row).addClass('m-table__row--danger'); + if (data.status == 'In Progress') { + $(row).addClass('m-table__row--is_in_progress'); + } + + if (data.status == 'Assigned') { + $(row).addClass('m-table__row--is_assigned'); } } }, diff --git a/templates/job-order/cmb.list.open.html.twig b/templates/job-order/cmb.list.open.html.twig index a575e645..f7b96452 100644 --- a/templates/job-order/cmb.list.open.html.twig +++ b/templates/job-order/cmb.list.open.html.twig @@ -93,12 +93,12 @@ }, rows: { beforeTemplate: function (row, data, index) { - if (data.flag_advance) { - $(row).addClass('m-table__row--danger'); + if (data.status == 'In Progress') { + $(row).addClass('m-table__row--is_in_progress'); } - if (data.is_mobile) { - $(row).addClass('m-table__row--is_mobile'); + if (data.status == 'Assigned') { + $(row).addClass('m-table__row--is_assigned'); } } }, From 6cb3f1be668a0e80bc8614352591696ede8f2699 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 13 Jul 2020 09:38:47 +0000 Subject: [PATCH 094/138] Fix the quantity in invoice when user orders more than one battery of the same type. #436 --- src/Service/InvoiceGenerator/CMBInvoiceGenerator.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Service/InvoiceGenerator/CMBInvoiceGenerator.php b/src/Service/InvoiceGenerator/CMBInvoiceGenerator.php index c0425f31..69b4e55a 100644 --- a/src/Service/InvoiceGenerator/CMBInvoiceGenerator.php +++ b/src/Service/InvoiceGenerator/CMBInvoiceGenerator.php @@ -363,9 +363,10 @@ class CMBInvoiceGenerator implements InvoiceGeneratorInterface if (!isset($con_batts[$batt_id])) $con_batts[$batt->getID()] = [ 'batt' => $batt, - 'qty' => 0 + 'qty' => $qty ]; - $con_batts[$batt_id]['qty']++; + else + $con_batts[$batt_id]['qty'] += $qty; // no trade-in From 1a6ed417bfb6bbaaddcb608cd0e063c4d2b1fa39 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 14 Jul 2020 03:15:51 +0000 Subject: [PATCH 095/138] Split invoice items with quantity more than 1. #436 --- .../RiderAPIHandler/CMBRiderAPIHandler.php | 211 ++++++------------ 1 file changed, 70 insertions(+), 141 deletions(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index bd723ab4..7ec2f592 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -368,6 +368,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface { foreach ($jo_results as $jo) { + // TODO: refactor this to call formatJobOrderData $coord = $jo->getCoordinates(); $cust = $jo->getCustomer(); $cv = $jo->getCustomerVehicle(); @@ -379,19 +380,24 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $inv_items = []; foreach ($inv->getItems() as $item) { - $item_batt = $item->getBattery(); - if ($item_batt == null) - $batt_id = null; - else - $batt_id = $item_batt->getID(); + // if more than 1, split it into one of each of the same item + $item_qty = $item->getQuantity(); + for ($i = 0; $i < $item_qty; $i++) + { + $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, - ]; + $inv_items[] = [ + 'id' => $item->getID(), + 'title' => $item->getTitle(), + 'qty' => 1, + 'price' => $item->getPrice(), + 'batt_id' => $batt_id, + ]; + } } // promo @@ -507,6 +513,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface { foreach ($jo_results as $jo) { + // TODO: refactor this to call formatJobOrderData $coord = $jo->getCoordinates(); $cust = $jo->getCustomer(); $cv = $jo->getCustomerVehicle(); @@ -518,19 +525,24 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $inv_items = []; foreach ($inv->getItems() as $item) { - $item_batt = $item->getBattery(); - if ($item_batt == null) - $batt_id = null; - else - $batt_id = $item_batt->getID(); + // if more than 1, split it into one of each of the same item + $item_qty = $item->getQuantity(); + for ($i = 0; $i < $item_qty; $i++) + { + $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, - ]; + $inv_items[] = [ + 'id' => $item->getID(), + 'title' => $item->getTitle(), + 'qty' => 1, + 'price' => $item->getPrice(), + 'batt_id' => $batt_id, + ]; + } } // promo @@ -620,19 +632,24 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $inv_items = []; foreach ($inv->getItems() as $item) { - $item_batt = $item->getBattery(); - if ($item_batt == null) - $batt_id = null; - else - $batt_id = $item_batt->getID(); + // if more than 1, split it into one of each of the same item + $item_qty = $item->getQuantity(); + for ($i = 0; $i < $item_qty; $i++) + { + $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, - ]; + $inv_items[] = [ + 'id' => $item->getID(), + 'title' => $item->getTitle(), + 'qty' => 1, + 'price' => $item->getPrice(), + 'batt_id' => $batt_id, + ]; + } } // promo @@ -1299,19 +1316,24 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $inv_items = []; foreach ($inv->getItems() as $item) { - $item_batt = $item->getBattery(); - if ($item_batt == null) - $batt_id = null; - else - $batt_id = $item_batt->getID(); + // if more than 1, split it into one of each of the same item + $item_qty = $item->getQuantity(); + for ($i = 0; $i < $item_qty; $i++) + { + $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, - ]; + $inv_items[] = [ + 'id' => $item->getID(), + 'title' => $item->getTitle(), + 'qty' => 1, + 'price' => $item->getPrice(), + 'batt_id' => $batt_id, + ]; + } } // promo @@ -1795,99 +1817,6 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface ]; 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(), - 'date_status_change' => $jo->getDateStatusChange()->format('Ymd H:i:s'), - 'customer' => [ - 'title' => $cust->getTitle(), - 'first_name' => $cust->getFirstName(), - 'last_name' => $cust->getLastName(), - 'phone_mobile' => $this->country_code . $cust->getPhoneMobile(), - 'phone_landline' => $this->country_code . $cust->getPhoneLandline(), - ], - '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(), - ] - ]; - */ } public function getPaymentMethods(Request $req) From 340344729d6ade147b9a856cb31f716e76fe3896 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 15 Jul 2020 03:37:49 +0000 Subject: [PATCH 096/138] Add label to rider icons. #436 --- public/assets/js/dashboard_map.js | 45 +++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/public/assets/js/dashboard_map.js b/public/assets/js/dashboard_map.js index 3f02d1f4..51e43b4c 100644 --- a/public/assets/js/dashboard_map.js +++ b/public/assets/js/dashboard_map.js @@ -146,6 +146,47 @@ class DashboardMap { } } + putMarkerWithLabel(id, lat, lng, markers, icon, layer_group, popup_url) { + var my = this; + // existing marker + if (markers.hasOwnProperty(id)) { + markers[id].setLatLng(L.latLng(lat, lng)); + return; + } + + // new marker + // add label + markers[id] = L.marker( + [lat, lng], + { icon: icon } + ); + + markers[id].bindTooltip(id, + { + permanent: true, + direction: 'right' + } + ); + + markers[id].addTo(layer_group); + + if (my.options.enable_popup) { + markers[id].bindPopup('Loading...'); + + // bind ajax for popup + markers[id].on('click', function(e) { + var popup = e.target.getPopup(); + var url = popup_url.replace('[id]', id); + console.log(url); + $.get(url).done(function(data) { + popup.setContent(data); + popup.update(); + }); + }); + } + } + + putCustomerMarker(id, lat, lng) { this.putMarker( id, @@ -185,7 +226,7 @@ class DashboardMap { } putRiderAvailableMarker(id, lat, lng) { - this.putMarker( + this.putMarkerWithLabel( id, lat, lng, @@ -197,7 +238,7 @@ class DashboardMap { } putRiderActiveJOMarker(id, lat, lng) { - this.putMarker( + this.putMarkerWithLabel( id, lat, lng, From 4c8ea2f69b9105c710f5e5f756a5802bf9d4bbdb Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 15 Jul 2020 08:40:30 +0000 Subject: [PATCH 097/138] Add list of job orders behind schedule. #436 --- config/acl.yaml | 2 + config/cmb.menu.yaml | 4 ++ config/menu.yaml | 4 ++ config/routes/job_order.yaml | 11 ++++ src/Controller/JobOrderController.php | 20 +++++++ .../JobOrderHandler/CMBJobOrderHandler.php | 56 +++++++++++++++++++ 6 files changed, 97 insertions(+) diff --git a/config/acl.yaml b/config/acl.yaml index abd73118..1d1a0c74 100644 --- a/config/acl.yaml +++ b/config/acl.yaml @@ -270,6 +270,8 @@ access_keys: label: Autoassign Test - id: jo_hub.list label: Hub View + - id: jo_behind_schedule.list + label: View Behind Schedule - id: support label: Customer Support Access diff --git a/config/cmb.menu.yaml b/config/cmb.menu.yaml index 9f28b315..ca756046 100644 --- a/config/cmb.menu.yaml +++ b/config/cmb.menu.yaml @@ -118,6 +118,10 @@ main_menu: acl: jo_all.list label: View All parent: joborder + - id: jo_behind_schedule + acl: jo_behind_schedule.list + label: View Behind Schedule + parent: joborder - id: support acl: support.menu diff --git a/config/menu.yaml b/config/menu.yaml index 9f28b315..ca756046 100644 --- a/config/menu.yaml +++ b/config/menu.yaml @@ -118,6 +118,10 @@ main_menu: acl: jo_all.list label: View All parent: joborder + - id: jo_behind_schedule + acl: jo_behind_schedule.list + label: View Behind Schedule + parent: joborder - id: support acl: support.menu diff --git a/config/routes/job_order.yaml b/config/routes/job_order.yaml index 586ed81f..4ec4279e 100644 --- a/config/routes/job_order.yaml +++ b/config/routes/job_order.yaml @@ -253,3 +253,14 @@ jo_hub_view_form: controller: App\Controller\JobOrderController::hubViewForm methods: [GET] +jo_behind_schedule: + path: /job-order/behind-schedule + controller: App\Controller\JobOrderController::listBehindSchedule + methods: [GET] + +jo_behind_schedule_rows: + path: /job-order/behind-schedule-rows + controller: App\Controller\JobOrderController::getRows + methods: [POST] + defaults: + tier: "behind_schedule" diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php index 58650d47..1b7a451f 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -286,6 +286,11 @@ class JobOrderController extends Controller $rows[$key]['meta']['edit_url'] = $this->generateUrl($jo_handler->getEditRoute($jo_id, $tier_params['edit_route']), ['id' => $jo_id]); $rows[$key]['meta']['onestep_edit_url'] = $this->generateUrl('jo_onestep_edit_form', ['id' => $jo_id]); } + else if ($tier == 'behind_schedule') + { + $rows[$key]['meta']['edit_url'] = $this->generateUrl($jo_handler->getEditRoute($jo_id, $tier_params['edit_route']), ['id' => $jo_id]); + $rows[$key]['meta']['onestep_edit_url'] = $this->generateUrl('jo_onestep_edit_form', ['id' => $jo_id]); + } else { // $rows[$key]['meta']['update_url'] = $this->generateUrl($tier_params['edit_route'], ['id' => $jo_id]); @@ -1212,6 +1217,21 @@ class JobOrderController extends Controller } + /** + * @Menu(selected="jo_behind_schedule") + */ + public function listBehindSchedule(JobOrderHandlerInterface $jo_handler) + { + $this->denyAccessUnlessGranted('jo_behind_schedule.list', null, 'No access.'); + + $template = $jo_handler->getTwigTemplate('jo_behind_schedule'); + + $params = $jo_handler->getOtherParameters(); + $params['table_refresh_rate'] = $this->container->getParameter('job_order_refresh_interval'); + + return $this->render($template, $params); + } + protected function autoAssignHubAndRider($jo, EntityManagerInterface $em, MapTools $map_tools, InventoryManager $im) { diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 1a3a6487..d19587a0 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -2926,6 +2926,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $this->template_hash['jo_walkin_form'] = 'job-order/cmb.form.walkin.html.twig'; $this->template_hash['jo_walkin_edit_form'] = 'job-order/cmb.form.walkin.html.twig'; $this->template_hash['jo_popup'] = 'job-order/cmb.popup.html.twig'; + $this->template_hash['jo_behind_schedule'] = 'job-order/cmb.list.behindschedule.html.twig'; } protected function checkTier($tier) @@ -2981,6 +2982,14 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $unlock_route = ''; $jo_status = ''; break; + case 'behind_schedule': + $tier_key = 'jo_behind_schedule'; + $tier_name = 'Behind Schedule'; + $rows_route = 'jo_behind_schedule_rows'; + $edit_route = ''; + $unlock_route = ''; + $jo_status = JOStatus::ASSIGNED; + break; default: throw new AccessDeniedHttpException('No access.'); } @@ -3111,6 +3120,53 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface ->setParameter('date_start', $date_start) ->setParameter('date_end', $date_end); } + break; + case 'behind_schedule': + if (isset($datatable['query']['data-rows-search'])) + { + $query->innerJoin('q.cus_vehicle', 'cv') + ->innerJoin('q.customer', 'c') + ->where('cv.plate_number like :filter') + ->orWhere('c.phone_mobile like :filter') + ->orWhere('c.first_name like :filter or c.last_name like :filter') + ->setParameter('filter', $datatable['query']['data-rows-search'] . '%'); + } + if (isset($datatable['query']['rider'])) + { + $query->innerJoin('q.rider', 'r') + ->andWhere('r.id = :rider_id') + ->setParameter('rider_id', $datatable['query']['rider']); + } + if (isset($datatable['query']['schedule_date'])) + { + $start = $datatable['query']['schedule_date'][0] . ' ' . '00:00:00'; + $end = $datatable['query']['schedule_date'][1] . ' ' . '23:59:00'; + + $date_start = DateTime::createFromFormat('m/d/Y H:i:s', $start); + $date_end = DateTime::createFromFormat('m/d/Y H:i:s', $end); + + $query->andWhere('q.date_schedule >= :date_start') + ->andWhere('q.date_schedule <= :date_end') + ->setParameter('date_start', $date_start) + ->setParameter('date_end', $date_end); + } + // status should be assigned + $query->andWhere('q.status = :status') + ->setParameter('status', $status); + + $current_datetime = new DateTime(); + $other_date = new DateTime(); + + $interval = new DateInterval('PT15M'); + $other_date->add($interval); + + //error_log('current datetime ' . $current_datetime->format('Y-m-d H:i:s')); + //error_log('other_date ' . $other_date->format('Y-m-d H:i:s')); + + $query->andWhere('q.date_schedule < :current_datetime OR q.date_schedule <= :other_date') + ->setParameter('current_datetime', $current_datetime) + ->setParameter('other_date', $other_date); + break; default: $query->where('q.status = :status') From 40eb185fdb19d63f0632dc6daafd885c0b9ba676 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 15 Jul 2020 08:58:06 +0000 Subject: [PATCH 098/138] Add template for behind schedule JOs. #436 --- .../cmb.list.behindschedule.html.twig | 195 ++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 templates/job-order/cmb.list.behindschedule.html.twig diff --git a/templates/job-order/cmb.list.behindschedule.html.twig b/templates/job-order/cmb.list.behindschedule.html.twig new file mode 100644 index 00000000..da9853b5 --- /dev/null +++ b/templates/job-order/cmb.list.behindschedule.html.twig @@ -0,0 +1,195 @@ +{% extends 'base.html.twig' %} + +{% block body %} + +
+
+
+

+ Job Orders (Behind Schedule) +

+
+
+
+ +
+ +
+
+
+
+
+
+
+
+
+
+ + + + +
+
+
+
+
+ +
+
+
+
+
+
+ +
+ +
+ +
+
+
+
+
+
+
+ +
+ +
+
+
+
+
+{% endblock %} + +{% block scripts %} + +{% endblock %} From 326bbeaed2f82f73075c57365a70cbc094779d36 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 16 Jul 2020 03:31:04 +0000 Subject: [PATCH 099/138] Add channel for rider availability to add/remove rider when rider goes online/offline. #436 --- public/assets/js/map_mqtt.js | 17 ++++++++++++++++- .../RiderAPIHandler/CMBRiderAPIHandler.php | 8 ++++++++ templates/home.html.twig | 3 ++- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/public/assets/js/map_mqtt.js b/public/assets/js/map_mqtt.js index 250e00c6..65736b4c 100644 --- a/public/assets/js/map_mqtt.js +++ b/public/assets/js/map_mqtt.js @@ -36,6 +36,10 @@ class MapEventHandler { // subscribe to rider status console.log('subscribing to ' + my.options.channels.rider_status); my.mqtt.subscribe(my.options.channels.rider_status); + + // subscribe to rider availability + console.log('subscribing to ' + my.options.channels.rider_availability); + my.mqtt.subscribe(my.options.channels.rider_availability); } if (my.options.track_jo) { @@ -76,6 +80,17 @@ class MapEventHandler { handleRider(chan_split, payload) { console.log("rider message"); switch (chan_split[2]) { + case "availability": + console.log("got availability for rider " + chan_split[1] + " - " + payload); + switch (payload) { + case 'rider_offline': + this.dashmap.removeRiderMarker(chan_split[1]); + break; + case 'rider_online': + this.dashmap.putRiderAvailableMarker(chan_split[1], lat, lng); + break; + } + break; case "location": console.log("got location for rider " + chan_split[1] + " - " + payload); var pl_split = payload.split(':'); @@ -88,7 +103,7 @@ class MapEventHandler { var lat = parseFloat(pl_split[0]); var lng = parseFloat(pl_split[1]); - // TODO: check if available or not + // TODO: cache rider availability status and check before displaying icon this.dashmap.putRiderAvailableMarker(chan_split[1], lat, lng); break; case "status": diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 7ec2f592..066b76d4 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -281,6 +281,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $this->em->flush(); + // send mqtt event to put rider on map + $channel = 'rider/' . $rider->getID() . '/availability'; + $this->mclient->publish($channel, 'rider_online'); + return $data; } @@ -301,6 +305,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $this->em->flush(); + // send mqtt event to remove rider from map + $channel = 'rider/' . $rider->getID() . '/availability'; + $this->mclient->publish($channel, 'rider_offline'); + return $data; } diff --git a/templates/home.html.twig b/templates/home.html.twig index ebe8cff3..8e5b1760 100644 --- a/templates/home.html.twig +++ b/templates/home.html.twig @@ -54,7 +54,8 @@ function initEventHandler(dashmap, icons, ssl) { 'rider_status': 'rider/+/status', 'jo_location': 'jo/+/location', 'jo_status': 'jo/+/status', - 'jo_origin': 'jo/+/origin' + 'jo_origin': 'jo/+/origin', + 'rider_availability': 'rider/+/availability' }, }; From 0c845b456ea2d814fc33628406180e3f1bec667d Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 16 Jul 2020 05:09:53 +0000 Subject: [PATCH 100/138] Fix issue of icon not displaying when rider goes online. #436 --- public/assets/js/dashboard_map.js | 4 ++++ public/assets/js/map_mqtt.js | 7 +++++- .../RiderAPIHandler/CMBRiderAPIHandler.php | 22 ++++++++++++++++--- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/public/assets/js/dashboard_map.js b/public/assets/js/dashboard_map.js index 51e43b4c..29d42731 100644 --- a/public/assets/js/dashboard_map.js +++ b/public/assets/js/dashboard_map.js @@ -211,6 +211,8 @@ class DashboardMap { this.layer_groups.customer.removeLayer(markers[id]); this.layer_groups.mobile_customer.removeLayer(markers[id]); + + delete markers[id]; } putMobileCustomerMarker(id, lat, lng) { @@ -260,6 +262,8 @@ class DashboardMap { this.layer_groups.rider_active_jo.removeLayer(markers[id]); this.layer_groups.rider_available.removeLayer(markers[id]); + + delete markers[id]; } loadLocations(location_url) { diff --git a/public/assets/js/map_mqtt.js b/public/assets/js/map_mqtt.js index 65736b4c..73138723 100644 --- a/public/assets/js/map_mqtt.js +++ b/public/assets/js/map_mqtt.js @@ -82,11 +82,16 @@ class MapEventHandler { switch (chan_split[2]) { case "availability": console.log("got availability for rider " + chan_split[1] + " - " + payload); - switch (payload) { + var obj = JSON.parse(payload); + var status = obj.status; + console.log("status " + status); + switch (status) { case 'rider_offline': this.dashmap.removeRiderMarker(chan_split[1]); break; case 'rider_online': + var lat = parseFloat(obj.latitude); + var lng = parseFloat(obj.longitude); this.dashmap.putRiderAvailableMarker(chan_split[1], lat, lng); break; } diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 066b76d4..fc2b1272 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -22,6 +22,7 @@ use App\Service\MQTTClient; use App\Service\WarrantyHandler; use App\Service\JobOrderHandlerInterface; use App\Service\InvoiceGeneratorInterface; +use App\Service\RiderTracker; use App\Entity\RiderSession; use App\Entity\Rider; @@ -57,7 +58,8 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface EncoderFactoryInterface $ef, RiderCache $rcache, string $country_code, MQTTClient $mclient, WarrantyHandler $wh, JobOrderHandlerInterface $jo_handler, - InvoiceGeneratorInterface $ic, string $upload_dir) + InvoiceGeneratorInterface $ic, string $upload_dir, + RiderTracker $rider_tracker) { $this->em = $em; $this->redis = $redis; @@ -69,6 +71,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $this->jo_handler = $jo_handler; $this->ic = $ic; $this->upload_dir = $upload_dir; + $this->rider_tracker = $rider_tracker; // 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 @@ -282,8 +285,18 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $this->em->flush(); // send mqtt event to put rider on map + // get rider coordinates from redis + $coord = $this->rider_tracker->getRiderLocation($rider->getID()); + + $lng = $coord->getLongitude(); + $lat = $coord->getLatitude();; $channel = 'rider/' . $rider->getID() . '/availability'; - $this->mclient->publish($channel, 'rider_online'); + $payload = [ + 'status' => 'rider_online', + 'longitude' => $lng, + 'latitude' => $lat, + ]; + $this->mclient->publish($channel, json_encode($payload)); return $data; } @@ -307,7 +320,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // send mqtt event to remove rider from map $channel = 'rider/' . $rider->getID() . '/availability'; - $this->mclient->publish($channel, 'rider_offline'); + $payload = [ + 'status' => 'rider_offline' + ]; + $this->mclient->publish($channel, json_encode($payload)); return $data; From f060223fb50c6d81c22186963876c39c6f72af2e Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 16 Jul 2020 13:53:55 +0800 Subject: [PATCH 101/138] Add console debug for rider availability packets #424 --- public/assets/js/map_mqtt.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/assets/js/map_mqtt.js b/public/assets/js/map_mqtt.js index 73138723..b1bfa7b2 100644 --- a/public/assets/js/map_mqtt.js +++ b/public/assets/js/map_mqtt.js @@ -83,7 +83,9 @@ class MapEventHandler { case "availability": console.log("got availability for rider " + chan_split[1] + " - " + payload); var obj = JSON.parse(payload); + var status = obj.status; + console.log(status); console.log("status " + status); switch (status) { case 'rider_offline': From b24bae37889427c071ba8cc033e77ed70405a189 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 16 Jul 2020 14:19:16 +0800 Subject: [PATCH 102/138] Add rider availability ajax call #424 --- config/routes/rider.yaml | 5 +++++ public/assets/js/map_mqtt.js | 20 ++++++++++++++++---- src/Controller/RiderController.php | 19 +++++++++++++++++++ 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/config/routes/rider.yaml b/config/routes/rider.yaml index 1934a1b1..da41058d 100644 --- a/config/routes/rider.yaml +++ b/config/routes/rider.yaml @@ -56,3 +56,8 @@ rider_priority_down_jo: path: /riders/{id}/priority_down/{jo_id} controller: App\Controller\RiderController::priorityDownJO methods: [GET] + +rider_ajax_avialable: + path: /riders/{id}/available + controller: App\Controller\RiderController::ajaxAvailable + methods: [GET] diff --git a/public/assets/js/map_mqtt.js b/public/assets/js/map_mqtt.js index b1bfa7b2..7088d110 100644 --- a/public/assets/js/map_mqtt.js +++ b/public/assets/js/map_mqtt.js @@ -85,7 +85,6 @@ class MapEventHandler { var obj = JSON.parse(payload); var status = obj.status; - console.log(status); console.log("status " + status); switch (status) { case 'rider_offline': @@ -94,14 +93,27 @@ class MapEventHandler { case 'rider_online': var lat = parseFloat(obj.latitude); var lng = parseFloat(obj.longitude); - this.dashmap.putRiderAvailableMarker(chan_split[1], lat, lng); + + // cheeck if rider is available / unavailable + // TODO: make url not hardcoded + $.get('https://cmbdev.wildcard.cc/riders/' + chan_split[1] + '/available').done(function(data) { + console.log('rider availability - ' + data); + switch (data) { + case 'available': + this.dashmap.putRiderAvailableMarker(chan_split[1], lat, lng); + break; + case 'unavailable': + this.dashmap.putRiderActiveJOMarker(chan_split[1], lat, lng); + break; + } + } break; } break; case "location": - console.log("got location for rider " + chan_split[1] + " - " + payload); + // console.log("got location for rider " + chan_split[1] + " - " + payload); var pl_split = payload.split(':'); - console.log(pl_split); + // console.log(pl_split); // check for correct format if (pl_split.length != 2) diff --git a/src/Controller/RiderController.php b/src/Controller/RiderController.php index 43f5d6d6..6ceae155 100644 --- a/src/Controller/RiderController.php +++ b/src/Controller/RiderController.php @@ -596,4 +596,23 @@ class RiderController extends Controller return $this->redirecttoRoute('rider_update', ['id' => $rider->getID()]); } + + /** + * @ParamConverter("rider", class="App\Entity\Rider") + */ + public function ajaxAvailable(EntityManagerInterface $em, Rider $rider) + { + $jos = $rider->getOpenJobOrders(); + if (count($jos) > 0) + $avail = 'available'; + else + $avail = 'unavaiable'; + + $response = new Response( + 'active', + Response::HTTP_OK, + ['content-type' => 'text/plain'] + ); + return $response; + } } From 1b2ea618911e6d5143901943ae48f3430bceaf51 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 16 Jul 2020 14:20:44 +0800 Subject: [PATCH 103/138] Fix js error #424 --- public/assets/js/map_mqtt.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/assets/js/map_mqtt.js b/public/assets/js/map_mqtt.js index 7088d110..403dbf30 100644 --- a/public/assets/js/map_mqtt.js +++ b/public/assets/js/map_mqtt.js @@ -106,7 +106,7 @@ class MapEventHandler { this.dashmap.putRiderActiveJOMarker(chan_split[1], lat, lng); break; } - } + }); break; } break; From 718125f2bf5f6322a72c9740e54988204bf899c4 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 16 Jul 2020 14:23:42 +0800 Subject: [PATCH 104/138] Remove debug js for mqtt messasges to make it easier #424 --- public/assets/js/map_mqtt.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/assets/js/map_mqtt.js b/public/assets/js/map_mqtt.js index 403dbf30..b197454e 100644 --- a/public/assets/js/map_mqtt.js +++ b/public/assets/js/map_mqtt.js @@ -60,7 +60,7 @@ class MapEventHandler { onMessage(msg) { // console.log(msg); - console.log('received message'); + // console.log('received message'); var channel = msg.destinationName; var chan_split = channel.split('/'); @@ -78,7 +78,7 @@ class MapEventHandler { } handleRider(chan_split, payload) { - console.log("rider message"); + // console.log("rider message"); switch (chan_split[2]) { case "availability": console.log("got availability for rider " + chan_split[1] + " - " + payload); From 2745e0dac0b38f314ee56fc8ef25bd42df5c0d4e Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 16 Jul 2020 14:31:51 +0800 Subject: [PATCH 105/138] Fix hardcoded availability of rider in ajax call #424 --- src/Controller/RiderController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controller/RiderController.php b/src/Controller/RiderController.php index 6ceae155..a3730c62 100644 --- a/src/Controller/RiderController.php +++ b/src/Controller/RiderController.php @@ -609,7 +609,7 @@ class RiderController extends Controller $avail = 'unavaiable'; $response = new Response( - 'active', + $avail, Response::HTTP_OK, ['content-type' => 'text/plain'] ); From 9fd31a1531990833a44c7161e1df898dad8e7414 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 16 Jul 2020 14:33:45 +0800 Subject: [PATCH 106/138] Make dashmap available in ajax call #424 --- public/assets/js/map_mqtt.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/public/assets/js/map_mqtt.js b/public/assets/js/map_mqtt.js index b197454e..8eb59272 100644 --- a/public/assets/js/map_mqtt.js +++ b/public/assets/js/map_mqtt.js @@ -96,14 +96,15 @@ class MapEventHandler { // cheeck if rider is available / unavailable // TODO: make url not hardcoded + var dashmap = this.dashmap; $.get('https://cmbdev.wildcard.cc/riders/' + chan_split[1] + '/available').done(function(data) { console.log('rider availability - ' + data); switch (data) { case 'available': - this.dashmap.putRiderAvailableMarker(chan_split[1], lat, lng); + dashmap.putRiderAvailableMarker(chan_split[1], lat, lng); break; case 'unavailable': - this.dashmap.putRiderActiveJOMarker(chan_split[1], lat, lng); + dashmap.putRiderActiveJOMarker(chan_split[1], lat, lng); break; } }); From 3f2cc2b82ac92314a88638d60b8ff92dbc2ad878 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 16 Jul 2020 14:36:23 +0800 Subject: [PATCH 107/138] Add debug console log for putting markers #424 --- public/assets/js/map_mqtt.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/assets/js/map_mqtt.js b/public/assets/js/map_mqtt.js index 8eb59272..e6566068 100644 --- a/public/assets/js/map_mqtt.js +++ b/public/assets/js/map_mqtt.js @@ -101,9 +101,11 @@ class MapEventHandler { console.log('rider availability - ' + data); switch (data) { case 'available': + console.log('putting available marker ' + chan_split[1] + ' ' + lat + ':' + lng); dashmap.putRiderAvailableMarker(chan_split[1], lat, lng); break; case 'unavailable': + console.log('putting active jo marker ' + chan_split[1] + ' ' + lat + ':' + lng); dashmap.putRiderActiveJOMarker(chan_split[1], lat, lng); break; } From e79ae22f3289c0d1010270383ecd6a199f8e031e Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 16 Jul 2020 14:40:30 +0800 Subject: [PATCH 108/138] Fix rider available ajax call to rely on active job order #424 --- src/Controller/RiderController.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Controller/RiderController.php b/src/Controller/RiderController.php index a3730c62..5e86c44e 100644 --- a/src/Controller/RiderController.php +++ b/src/Controller/RiderController.php @@ -602,11 +602,11 @@ class RiderController extends Controller */ public function ajaxAvailable(EntityManagerInterface $em, Rider $rider) { - $jos = $rider->getOpenJobOrders(); - if (count($jos) > 0) - $avail = 'available'; + $jo = $rider->getRiderActiveJobOrder(); + if ($jo == null) + $avail = 'available'; else - $avail = 'unavaiable'; + $avail = 'unavailable'; $response = new Response( $avail, From 2d292e1f9def0ea5d4e9a8d6d7f1a76fc4e9d0c8 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 16 Jul 2020 14:50:36 +0800 Subject: [PATCH 109/138] Do not display marker for inactive rider #424 --- public/assets/js/dashboard_map.js | 1 + public/assets/js/map_mqtt.js | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/public/assets/js/dashboard_map.js b/public/assets/js/dashboard_map.js index 29d42731..82debb56 100644 --- a/public/assets/js/dashboard_map.js +++ b/public/assets/js/dashboard_map.js @@ -3,6 +3,7 @@ class DashboardMap { this.options = options; this.rider_markers = rider_markers; this.cust_markers = cust_markers; + this.rider_availability = {}; // layer groups this.layer_groups = { diff --git a/public/assets/js/map_mqtt.js b/public/assets/js/map_mqtt.js index e6566068..6a9ede6c 100644 --- a/public/assets/js/map_mqtt.js +++ b/public/assets/js/map_mqtt.js @@ -88,9 +88,11 @@ class MapEventHandler { console.log("status " + status); switch (status) { case 'rider_offline': + this.dashmap.rider_availability[chan_split[1]] = false; this.dashmap.removeRiderMarker(chan_split[1]); break; case 'rider_online': + this.dashmap.rider_availability[chan_split[1]] = true; var lat = parseFloat(obj.latitude); var lng = parseFloat(obj.longitude); @@ -102,10 +104,12 @@ class MapEventHandler { switch (data) { case 'available': console.log('putting available marker ' + chan_split[1] + ' ' + lat + ':' + lng); + dashmap.switchRiderStatus(chan_split[1], 'available'); dashmap.putRiderAvailableMarker(chan_split[1], lat, lng); break; case 'unavailable': console.log('putting active jo marker ' + chan_split[1] + ' ' + lat + ':' + lng); + dashmap.switchRiderStatus(chan_split[1], 'jo'); dashmap.putRiderActiveJOMarker(chan_split[1], lat, lng); break; } @@ -125,7 +129,16 @@ class MapEventHandler { var lat = parseFloat(pl_split[0]); var lng = parseFloat(pl_split[1]); + var display_marker = true; + if (this.dashmap.rider_availability.hasOwnProperty(chan_split[1])) { + if (!this.dashmap.rider_availability) { + console.log('NOT displaying marker for inactive rider'); + display_marker = false; + } + } + // TODO: cache rider availability status and check before displaying icon + // NOTE: code is already above, need to make it into a function and call it here this.dashmap.putRiderAvailableMarker(chan_split[1], lat, lng); break; case "status": From 3d861537b5935940d81b49da44a6eda5fa92fea9 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 16 Jul 2020 14:52:59 +0800 Subject: [PATCH 110/138] Add debug for rider availability #424 --- public/assets/js/map_mqtt.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/assets/js/map_mqtt.js b/public/assets/js/map_mqtt.js index 6a9ede6c..7f4191e9 100644 --- a/public/assets/js/map_mqtt.js +++ b/public/assets/js/map_mqtt.js @@ -129,6 +129,7 @@ class MapEventHandler { var lat = parseFloat(pl_split[0]); var lng = parseFloat(pl_split[1]); + console.log(this.dashmap.rider_availability); var display_marker = true; if (this.dashmap.rider_availability.hasOwnProperty(chan_split[1])) { if (!this.dashmap.rider_availability) { From a8b5a59ddb2ed2bf88e6b7085855989368d17148 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 16 Jul 2020 14:54:26 +0800 Subject: [PATCH 111/138] Display marker only if rider is 'online' #424 --- public/assets/js/map_mqtt.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/assets/js/map_mqtt.js b/public/assets/js/map_mqtt.js index 7f4191e9..40daf495 100644 --- a/public/assets/js/map_mqtt.js +++ b/public/assets/js/map_mqtt.js @@ -140,7 +140,9 @@ class MapEventHandler { // TODO: cache rider availability status and check before displaying icon // NOTE: code is already above, need to make it into a function and call it here - this.dashmap.putRiderAvailableMarker(chan_split[1], lat, lng); + if (display_marker) { + this.dashmap.putRiderAvailableMarker(chan_split[1], lat, lng); + } break; case "status": console.log("got status for rider " + chan_split[1] + " - " + payload); From 9e649c9d70dca4d7bc21ac66d80125fb434b740d Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 16 Jul 2020 14:56:20 +0800 Subject: [PATCH 112/138] Fix bug in rider availability check #424 --- public/assets/js/map_mqtt.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/assets/js/map_mqtt.js b/public/assets/js/map_mqtt.js index 40daf495..1a35abc3 100644 --- a/public/assets/js/map_mqtt.js +++ b/public/assets/js/map_mqtt.js @@ -132,10 +132,12 @@ class MapEventHandler { console.log(this.dashmap.rider_availability); var display_marker = true; if (this.dashmap.rider_availability.hasOwnProperty(chan_split[1])) { - if (!this.dashmap.rider_availability) { + if (!this.dashmap.rider_availability[chan_split[1]]) { console.log('NOT displaying marker for inactive rider'); display_marker = false; } + } else { + console.log('rider not in availability check'); } // TODO: cache rider availability status and check before displaying icon From 4b22344e7225b052d35ef0eda92d18665fd0ca41 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 16 Jul 2020 15:00:50 +0800 Subject: [PATCH 113/138] Minor cleanup #424 --- public/assets/js/map_mqtt.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/public/assets/js/map_mqtt.js b/public/assets/js/map_mqtt.js index 1a35abc3..00474c6f 100644 --- a/public/assets/js/map_mqtt.js +++ b/public/assets/js/map_mqtt.js @@ -129,7 +129,6 @@ class MapEventHandler { var lat = parseFloat(pl_split[0]); var lng = parseFloat(pl_split[1]); - console.log(this.dashmap.rider_availability); var display_marker = true; if (this.dashmap.rider_availability.hasOwnProperty(chan_split[1])) { if (!this.dashmap.rider_availability[chan_split[1]]) { @@ -140,8 +139,8 @@ class MapEventHandler { console.log('rider not in availability check'); } - // TODO: cache rider availability status and check before displaying icon - // NOTE: code is already above, need to make it into a function and call it here + // TODO: cache rider availability (available vs active jo) status and check before displaying icon + // NOTE: we really should fix our terms since available can mean many things if (display_marker) { this.dashmap.putRiderAvailableMarker(chan_split[1], lat, lng); } From 655b632849460d1ac7cdd18452e08eb3c24a9a03 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 16 Jul 2020 15:12:44 +0800 Subject: [PATCH 114/138] Fix availability if active jo is closed #424 --- src/Controller/RiderController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controller/RiderController.php b/src/Controller/RiderController.php index 5e86c44e..247123d5 100644 --- a/src/Controller/RiderController.php +++ b/src/Controller/RiderController.php @@ -603,7 +603,7 @@ class RiderController extends Controller public function ajaxAvailable(EntityManagerInterface $em, Rider $rider) { $jo = $rider->getRiderActiveJobOrder(); - if ($jo == null) + if ($jo == null || $jo->isClosed()) $avail = 'available'; else $avail = 'unavailable'; From 20f5e4672644ab0dd7fcdb6f19324b66185a188f Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 17 Jul 2020 06:17:55 +0000 Subject: [PATCH 115/138] Add date_accept to the responses when getting a job order. #440 --- .../RiderAPIHandler/CMBRiderAPIHandler.php | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index fc2b1272..19696229 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -444,6 +444,19 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface if (empty($trade_in_type)) $trade_in_type = 'none'; + // get time when JO was accepted by rider + $event_type = CMBJOEventType::RIDER_ACCEPT; + $rider_id = $this->session->getRider()->getID(); + $jo_id = $jo->getID(); + $date_accept = ''; + + $results = $this->em->getRepository(JOEvent::class)->findby(['type_id' => $event_type, 'rider' => $rider_id, 'job_order' => $jo_id], ['date_happen' => 'DESC']); + if ($results != null) + { + $jo_event = current($results); + $date_accept = $jo_event->getDateHappen()->format('Ymd H:i:s'); + } + $jo_data[] = [ 'job_order' => [ 'id' => $jo->getID(), @@ -486,6 +499,8 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface 'has_warranty_doc' => false, 'flag_coolant' => $jo->hasCoolant(), 'has_motolite' => $cv->hasMotoliteBattery(), + // date and time accepted + 'date_accept' => $date_accept, ] ]; } @@ -736,6 +751,19 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface else $cust_email = $jo->getMeta('customer_email'); + // get time when JO was accepted by rider + $event_type = CMBJOEventType::RIDER_ACCEPT; + $rider_id = $this->session->getRider()->getID(); + $jo_id = $jo->getID(); + $date_accept = ''; + + $results = $this->em->getRepository(JOEvent::class)->findby(['type_id' => $event_type, 'rider' => $rider_id, 'job_order' => $jo_id], ['date_happen' => 'DESC']); + if ($results != null) + { + $jo_event = current($results); + $date_accept = $jo_event->getDateHappen()->format('Ymd H:i:s'); + } + $data = [ 'id' => $jo->getID(), 'service_type' => $jo->getServiceType(), @@ -790,7 +818,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // customer email 'customer_email' => $cust_email, - // END: cmb speicifc details + // date and time accepted + 'date_accept' => $date_accept, + + // END: cmb specific details ]; return $data; From 95a070051e53bd5adf8a848e3ea02eb0a06cb12d Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 20 Jul 2020 08:21:34 +0000 Subject: [PATCH 116/138] Add checking for assigned job orders when rider is logging out or going offline. #437 --- .../RiderAPIHandler/CMBRiderAPIHandler.php | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index fc2b1272..72bc1c78 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -251,6 +251,17 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // make rider unavailable $rider = $this->session->getRider(); + // check if rider has assigned JOs + $assigned_jos = $this->em->getRepository(JobOrder::class)->findBy(['rider' => $rider->getID(), 'status' => JOStatus::ASSIGNED]); + if ($assigned_jos != null) + { + $data = [ + 'title' => 'Failed Logout', + 'error' => 'Rider has assigned job orders.' + ]; + return $data; + } + $rider->setAvailable(false); $rider->setActive(false); @@ -314,6 +325,17 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // set rider to unavailable to take on JOs $rider = $this->session->getRider(); + // check if rider has assigned JOs + $assigned_jos = $this->em->getRepository(JobOrder::class)->findBy(['rider' => $rider->getID(), 'status' => JOStatus::ASSIGNED]); + if ($assigned_jos != null) + { + $data = [ + 'title' => 'Failed Go Offline', + 'error' => 'Rider has assigned job orders.' + ]; + return $data; + } + $rider->setAvailable(false); $this->em->flush(); From 109911bbb027b2b220087fb763a8e2430f91def4 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 21 Jul 2020 04:51:50 +0000 Subject: [PATCH 117/138] Clear rider when JO has been rejected. Send event for rider availability when rider rejects JO. #437 --- src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 72bc1c78..7954a703 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -976,7 +976,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $jo->requeue(); - // TODO: do we leave JO as assigned to rider? + $jo->clearRider(); // add event log $rider = $this->session->getRider(); @@ -987,6 +987,9 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface ->setRider($rider); $this->em->persist($event); + // set rider's active JO to null + $rider->setActiveJobOrder(); + $this->em->flush(); // send mqtt event @@ -997,6 +1000,13 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface ]; $this->mclient->sendEvent($jo, $payload); + // need to send another mqtt event saying rider is available + // to change icon on dashboard + $channel = 'rider/' . $rider->getID() . '/status'; + $rider_status = 'available'; + + $this->mclient->publish($channel, $rider_status); + return $data; } From d01aa82e316b73a7dd31abf9aaac43029d59299c Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 21 Jul 2020 04:58:14 +0000 Subject: [PATCH 118/138] Clear rider when JO has been rejected. Send event for rider availability when rider rejects JO. #437 --- src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 72bc1c78..11beab1d 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -976,7 +976,8 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $jo->requeue(); - // TODO: do we leave JO as assigned to rider? + // set rider to null + $jo->clearRider(); // add event log $rider = $this->session->getRider(); @@ -997,6 +998,12 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface ]; $this->mclient->sendEvent($jo, $payload); + // send available event to change rider icon status + $channel = 'rider/' . $rider->getID() . '/status'; + $rider_status = 'available'; + + $this->mclient->publish($channel, $rider_status); + return $data; } From 6b65e927117353e973dc20843edb959ebf958bb1 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 21 Jul 2020 07:10:45 +0000 Subject: [PATCH 119/138] Add date_start to the job order data response. #440 --- .../RiderAPIHandler/CMBRiderAPIHandler.php | 42 ++++++++++++++----- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 19696229..3cb0f307 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -445,18 +445,28 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $trade_in_type = 'none'; // get time when JO was accepted by rider - $event_type = CMBJOEventType::RIDER_ACCEPT; + $accept_event_type = CMBJOEventType::RIDER_ACCEPT; $rider_id = $this->session->getRider()->getID(); $jo_id = $jo->getID(); $date_accept = ''; - $results = $this->em->getRepository(JOEvent::class)->findby(['type_id' => $event_type, 'rider' => $rider_id, 'job_order' => $jo_id], ['date_happen' => 'DESC']); - if ($results != null) + $accept_results = $this->em->getRepository(JOEvent::class)->findby(['type_id' => $accept_event_type, 'rider' => $rider_id, 'job_order' => $jo_id], ['date_happen' => 'DESC']); + if ($accept_results != null) { - $jo_event = current($results); + $jo_event = current($accept_results); $date_accept = $jo_event->getDateHappen()->format('Ymd H:i:s'); } + // get time when JO was started by rider + $start_event_type = CMBJOEventType::RIDER_START; + $date_start = ''; + $start_results = $this->em->getRepository(JOEvent::class)->findby(['type_id' => $start_event_type, 'rider' => $rider_id, 'job_order' => $jo_id], ['date_happen' => 'DESC']); + if ($start_results != null) + { + $jo_event = current($start_results); + $date_start = $jo_event->getDateHappen()->format('Ymd H:i:s'); + } + $jo_data[] = [ 'job_order' => [ 'id' => $jo->getID(), @@ -499,8 +509,9 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface 'has_warranty_doc' => false, 'flag_coolant' => $jo->hasCoolant(), 'has_motolite' => $cv->hasMotoliteBattery(), - // date and time accepted + // date and time accepted and started 'date_accept' => $date_accept, + 'date_start' => $date_start, ] ]; } @@ -752,18 +763,28 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $cust_email = $jo->getMeta('customer_email'); // get time when JO was accepted by rider - $event_type = CMBJOEventType::RIDER_ACCEPT; + $accept_event_type = CMBJOEventType::RIDER_ACCEPT; $rider_id = $this->session->getRider()->getID(); $jo_id = $jo->getID(); $date_accept = ''; - $results = $this->em->getRepository(JOEvent::class)->findby(['type_id' => $event_type, 'rider' => $rider_id, 'job_order' => $jo_id], ['date_happen' => 'DESC']); - if ($results != null) + $accept_results = $this->em->getRepository(JOEvent::class)->findby(['type_id' => $accept_event_type, 'rider' => $rider_id, 'job_order' => $jo_id], ['date_happen' => 'DESC']); + if ($accept_results != null) { - $jo_event = current($results); + $jo_event = current($accept_results); $date_accept = $jo_event->getDateHappen()->format('Ymd H:i:s'); } + // get time when JO was started by rider + $start_event_type = CMBJOEventType::RIDER_START; + $date_start = ''; + $start_results = $this->em->getRepository(JOEvent::class)->findby(['type_id' => $start_event_type, 'rider' => $rider_id, 'job_order' => $jo_id], ['date_happen' => 'DESC']); + if ($start_results != null) + { + $jo_event = current($start_results); + $date_start = $jo_event->getDateHappen()->format('Ymd H:i:s'); + } + $data = [ 'id' => $jo->getID(), 'service_type' => $jo->getServiceType(), @@ -818,8 +839,9 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // customer email 'customer_email' => $cust_email, - // date and time accepted + // date and time accepted and started 'date_accept' => $date_accept, + 'date_start' => $date_start, // END: cmb specific details ]; From b680349e561686539566f9a78e83a3456ecea7bd Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 21 Jul 2020 09:58:06 +0000 Subject: [PATCH 120/138] Limit uploaded photos to four. Rename images to generic names. #441 --- src/Entity/JOExtra.php | 64 ++++++---- .../JobOrderHandler/CMBJobOrderHandler.php | 27 +++-- .../RiderAPIHandler/CMBRiderAPIHandler.php | 111 +++++++++++------- .../job-order/cmb.form.onestep.html.twig | 23 ++-- 4 files changed, 134 insertions(+), 91 deletions(-) diff --git a/src/Entity/JOExtra.php b/src/Entity/JOExtra.php index 12974b33..7770c150 100644 --- a/src/Entity/JOExtra.php +++ b/src/Entity/JOExtra.php @@ -22,22 +22,27 @@ class JOExtra /** * @ORM\Column(type="string", nullable=true) */ - protected $after_speed_image_filename; + protected $image_1_filename; /** * @ORM\Column(type="string", nullable=true) */ - protected $after_plate_num_image_filename; + protected $image_2_filename; /** * @ORM\Column(type="string", nullable=true) */ - protected $after_batt_image_filename; + protected $image_3_filename; + + /** + * @ORM\Column(type="string", nullable=true) + */ + protected $image_4_filename; /** * @ORM\Column(type="array", nullable=true) */ - protected $after_other_images; + protected $other_images; /** * @ORM\Column(type="string", nullable=true) @@ -47,7 +52,7 @@ class JOExtra public function __construct() { - $this->after_other_images = new ArrayCollection(); + $this->other_images = new ArrayCollection(); } public function getID() @@ -55,59 +60,70 @@ class JOExtra return $this->id; } - public function setAfterSpeedImageFilename($image_filename) + public function setImage1Filename($image_filename) { - $this->after_speed_image_filename = $image_filename; + $this->image_1_filename = $image_filename; return $this; } - public function getAfterSpeedImageFilename() + public function getImage1Filename() { - return $this->after_speed_image_filename; + return $this->image_1_filename; } - public function setAfterPlateNumImageFilename($image_filename) + public function setImage2Filename($image_filename) { - $this->after_plate_num_image_filename = $image_filename; + $this->image_2_filename = $image_filename; return $this; } - public function getAfterPlateNumImageFilename() + public function getImage2Filename() { - return $this->after_plate_num_image_filename; + return $this->image_2_filename; } - public function setAfterBattImageFilename($image_filename) + public function setImage3Filename($image_filename) { - $this->after_batt_image_filename = $image_filename; + $this->image_3_filename = $image_filename; return $this; } - public function getAfterBattImageFilename() + public function getImage3Filename() { - return $this->after_batt_image_filename; + return $this->image_3_filename; } - public function getAfterOtherImages() + public function setImage4Filename($image_filename) { - return $this->after_other_images; + $this->image_4_filename = $image_filename; + return $this; } - public function setAfterOtherImages(array $images) + public function getImage4Filename() { - $this->after_other_images = new ArrayCollection(); + return $this->image_4_filename; + } + + public function getOtherImages() + { + return $this->other_images; + } + + public function setOtherImages(array $images) + { + $this->other_images = new ArrayCollection(); foreach ($images as $image_filename) { - $this->after_other_images->add($image_filename); + $this->other_images->add($image_filename); } return $this; } - public function clearAfterOtherImages() + public function clearOtherImages() { - $this->after_other_images = new ArrayCollection(); + $this->other_images = new ArrayCollection(); return $this; } diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index d19587a0..42f1b49b 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -1513,24 +1513,27 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $params['signature'] = null; if ($jo_extra != null) { - $a_speed_img = $jo_extra->getAfterSpeedImageFilename(); - $a_plate_img = $jo_extra->getAfterPlateNumImageFilename(); - $a_batt_img = $jo_extra->getAfterBattImageFilename(); + $img_1 = $jo_extra->getImage1Filename(); + $img_2 = $jo_extra->getImage2Filename(); + $img_3 = $jo_extra->getImage3Filename(); + $img_4 = $jo_extra->getImage4Filename(); - $a_other_images = $jo_extra->getAfterOtherImages(); + $other_images = $jo_extra->getOtherImages(); $cust_signature = $jo_extra->getCustomerSignature(); - if ($a_speed_img != null) - $pic_array['after_speed_img'] = $a_speed_img; - if ($a_plate_img != null) - $pic_array['after_plate_img'] = $a_plate_img; - if ($a_batt_img != null) - $pic_array['after_batt_img'] = $a_batt_img; + if ($img_1 != null) + $pic_array['image_1'] = $img_1; + if ($img_2 != null) + $pic_array['image_2'] = $img_2; + if ($img_3 != null) + $pic_array['image_3'] = $img_3; + if ($img_4 != null) + $pic_array['image_4'] = $img_4; - foreach ($a_other_images as $a_img) + foreach ($other_images as $img) { - $pic_array['a_other_images'][] = $a_img; + $pic_array['other_images'][] = $img; } $params['signature'] = $cust_signature; diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index f414ead4..d435e0ca 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -755,27 +755,28 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface if ($odo <= 0) $odo = 0; - $after_images = [ - 'speedometer' => null, - 'plate_number' => null, - 'battery' => null, + $images = [ + 'image_1' => null, + 'image_2' => null, + 'image_3' => null, + 'image_4' => null, 'others' => [], ]; $jo_extra = $jo->getJOExtra(); if ($jo_extra != null) { - // after images - $after_images['speedometer'] = $this->getURLExtraImage($req, $jo_extra->getAfterSpeedImageFilename()); - $after_images['plate_number'] = $this->getURLExtraImage($req, $jo_extra->getAfterPlateNumImageFilename()); - $after_images['battery'] = $this->getURLExtraImage($req, $jo_extra->getAfterBattImageFilename()); + $images['image_1'] = $this->getURLExtraImage($req, $jo_extra->getImage1Filename()); + $images['image_2'] = $this->getURLExtraImage($req, $jo_extra->getImage2Filename()); + $images['image_3'] = $this->getURLExtraImage($req, $jo_extra->getImage3Filename()); + $images['image_4'] = $this->getURLExtraImage($req, $jo_extra->getImage4Filename()); // other images $other_images = []; - foreach ($jo_extra->getAfterOtherImages() as $others) + foreach ($jo_extra->getOtherImages() as $others) { $other_images[] = $this->getURLExtraImage($req, $others); } - $after_images['others'] = $other_images; + $images['others'] = $other_images; } // customer email @@ -856,7 +857,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface 'odometer' => $odo, // images - 'finish_photos' => $after_images, + 'finish_photos' => $images, // customer email 'customer_email' => $cust_email, @@ -1700,14 +1701,16 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $dest = $this->upload_dir; - $speed_img_file = $req->files->get('speedometer_img'); - $batt_img_file = $req->files->get('battery_img'); - $plate_num_img_file = $req->files->get('plate_number_img'); + $img_1_file = $req->files->get('img_1'); + $img_2_file = $req->files->get('img_2'); + $img_3_file = $req->files->get('img_3'); + $img_4_file = $req->files->get('img_4'); $other_img_files[]= $req->files->get('other_images'); - if ((empty($speed_img_file)) && - (empty($batt_img_file)) && - (empty($plate_num_img_file))) + if ((empty($img_1_file)) && + (empty($img_2_file)) && + (empty($img_3_file)) && + (empty($img_4_file))) { $data = [ 'title' => 'Failed Upload Arrive Photos', @@ -1717,20 +1720,20 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface } else { - $new_speed_filename = ''; - $new_batt_filename = ''; - $new_plate_num_filename = ''; + $new_img1_filename = ''; + $new_img2_filename = ''; + $new_img3_filename = ''; + $new_img4_filename = ''; $other_filenames = []; - if (!empty($speed_img_file)) + if (!empty($img_1_file)) { - // save speedometer file - $orig_speed_filename = pathinfo($speed_img_file->getClientOriginalName(), PATHINFO_FILENAME); - $new_speed_filename = uniqid() . '-'. $orig_speed_filename . '.' . $speed_img_file->guessClientExtension(); + $orig_img1_filename = pathinfo($img_1_file->getClientOriginalName(), PATHINFO_FILENAME); + $new_img1_filename = uniqid() . '-'. $orig_img1_filename . '.' . $img_1_file->guessClientExtension(); try { - $speed_img_file->move($dest, $new_speed_filename); + $img_1_file->move($dest, $new_img1_filename); } catch (FileException $e) { @@ -1740,15 +1743,14 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } } - if (!empty($batt_img_file)) + if (!empty($img_2_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(); + $orig_img2_filename = pathinfo($img_2_file->getClientOriginalName(), PATHINFO_FILENAME); + $new_img2_filename = uniqid() . '-' . $orig_img2_filename . '.' . $img_2_file->guessClientExtension(); try { - $batt_img_file->move($dest, $new_batt_filename); + $img_2_file->move($dest, $new_img2_filename); } catch (FileException $e) { @@ -1758,15 +1760,32 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } } - if (!empty($plate_num_img_file)) + if (!empty($img_3_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(); + $orig_img3_filename = pathinfo($img_3_file->getClientOriginalName(), PATHINFO_FILENAME); + $new_img3_filename = uniqid() . '-' . $orig_img3_filename . '.' . $img_3_file->guessClientExtension(); try { - $plate_num_img_file->move($dest, $new_plate_num_filename); + $img_3_file->move($dest, $new_img3_filename); + } + catch (FileException $e) + { + $data = [ + 'error' => 'Error saving image files.' + ]; + return $data; + } + } + + if (!empty($img_4_file)) + { + $orig_img4_filename = pathinfo($img_4_file->getClientOriginalName(), PATHINFO_FILENAME); + $new_img4_filename = uniqid() . '-' . $orig_img4_filename . '.' . $img_4_file->guessClientExtension(); + + try + { + $img_4_file->move($dest, $new_img4_filename); } catch (FileException $e) { @@ -1809,17 +1828,18 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // 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_extra->setImage1Filename($new_img1_filename); + $jo_extra->setImage2Filename($new_img2_filename); + $jo_extra->setImage3Filename($new_img3_filename); + $jo_extra->setImage4Filename($new_img4_filename); if (empty($other_filenames)) { - $jo_extra->clearAfterOtherImages(); + $jo_extra->clearOtherImages(); } else { - $jo_extra->setAfterOtherImages($other_filenames); + $jo_extra->setOtherImages($other_filenames); } $jo->setJOExtra($jo_extra); @@ -1828,17 +1848,18 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface } else { - $jo_extra->setAfterSpeedImageFilename($new_speed_filename); - $jo_extra->setAfterBattImageFilename($new_batt_filename); - $jo_extra->setAfterPlateNumImageFilename($new_plate_num_filename); + $jo_extra->setImage1Filename($new_img1_filename); + $jo_extra->setImage2Filename($new_img2_filename); + $jo_extra->setImage3Filename($new_img3_filename); + $jo_extra->setImage4Filename($new_img4_filename); if (empty($other_filenames)) { - $jo_extra->clearAfterOtherImages(); + $jo_extra->clearOtherImages(); } else { - $jo_extra->setAfterOtherImages($other_filenames); + $jo_extra->setOtherImages($other_filenames); } } diff --git a/templates/job-order/cmb.form.onestep.html.twig b/templates/job-order/cmb.form.onestep.html.twig index 6e53cf9e..94c45369 100644 --- a/templates/job-order/cmb.form.onestep.html.twig +++ b/templates/job-order/cmb.form.onestep.html.twig @@ -525,36 +525,39 @@
- +
{% for key, picture in jo_pictures %} - {% if key == 'after_speed_img' %} + {% if key == 'image_1' %}
-
{% endif %} - {% if key == 'after_plate_img' %} + {% if key == 'image_2' %}
-
{% endif %} - {% if key == 'after_batt_img' %} + {% if key == 'image_3' %}
-
{% endif %} + {% if key == 'image_4' %} +
+
+
+ {% endif %} + {% endfor %}
- +
{% for key, picture in jo_pictures %} - {% if key == 'a_other_images' %} - {% for pic in jo_pictures['a_other_images'] %} + {% if key == 'other_images' %} + {% for pic in jo_pictures['other_images'] %}
From 6ed3c52e498acf83debfe223fe2c7d5b7941614b Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 21 Jul 2020 10:04:47 +0000 Subject: [PATCH 121/138] Commented out the Other Images section. #441 --- templates/job-order/cmb.form.onestep.html.twig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/job-order/cmb.form.onestep.html.twig b/templates/job-order/cmb.form.onestep.html.twig index 94c45369..2b01fbad 100644 --- a/templates/job-order/cmb.form.onestep.html.twig +++ b/templates/job-order/cmb.form.onestep.html.twig @@ -551,7 +551,7 @@ {% endfor %}
-
+
{% endif %} From 37fef914d9e80ec8b306ce727a831555de8c98b3 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 22 Jul 2020 06:35:12 +0000 Subject: [PATCH 122/138] Add checking for null for other images. #424 --- src/Service/JobOrderHandler/CMBJobOrderHandler.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 42f1b49b..85ed87d7 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -1531,9 +1531,12 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface if ($img_4 != null) $pic_array['image_4'] = $img_4; - foreach ($other_images as $img) + if ($other_images != null) { - $pic_array['other_images'][] = $img; + foreach ($other_images as $img) + { + $pic_array['other_images'][] = $img; + } } $params['signature'] = $cust_signature; From 232ebfe3fca71bfeded11462c4481b6c73e9be4b Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 23 Jul 2020 02:50:13 +0000 Subject: [PATCH 123/138] Add RIDER_FINISH event. Add date_complete to API response. #424 --- src/Ramcar/CMBJOEventType.php | 2 ++ .../RiderAPIHandler/CMBRiderAPIHandler.php | 29 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/Ramcar/CMBJOEventType.php b/src/Ramcar/CMBJOEventType.php index e6a14482..4a26baa4 100644 --- a/src/Ramcar/CMBJOEventType.php +++ b/src/Ramcar/CMBJOEventType.php @@ -18,6 +18,7 @@ class CMBJOEventType extends NameValue const RIDER_EDIT = 'rider_edit'; const PAID = 'paid'; const PERFORM = 'perform'; + const RIDER_FINISH = 'finish'; const COLLECTION = [ 'create' => 'Created', @@ -34,5 +35,6 @@ class CMBJOEventType extends NameValue 'rider_edit' => 'Rider Edit', 'paid' => 'Paid', 'perform' => 'Perform', + 'finish' => 'Finish', ]; } diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index d435e0ca..27bfedc4 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -489,6 +489,16 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $date_start = $jo_event->getDateHappen()->format('Ymd H:i:s'); } + // get time when JO was completed by rider + $complete_event_type = CMBJOEventType::RIDER_FINISH; + $date_complete = ''; + $complete_results = $this->em->getRepository(JOEvent::class)->findby(['type_id' => $complete_event_type, 'rider' => $rider_id, 'job_order' => $jo_id], ['date_happen' => 'DESC']); + if ($complete_results != null) + { + $jo_event = current($complete_results); + $date_complete = $jo_event->getDateHappen()->format('Ymd H:i:s'); + } + $jo_data[] = [ 'job_order' => [ 'id' => $jo->getID(), @@ -534,6 +544,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // date and time accepted and started 'date_accept' => $date_accept, 'date_start' => $date_start, + 'date_complete' => $date_complete, ] ]; } @@ -808,6 +819,16 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $date_start = $jo_event->getDateHappen()->format('Ymd H:i:s'); } + // get time when JO was completed by rider + $complete_event_type = CMBJOEventType::RIDER_FINISH; + $date_complete = ''; + $complete_results = $this->em->getRepository(JOEvent::class)->findby(['type_id' => $complete_event_type, 'rider' => $rider_id, 'job_order' => $jo_id], ['date_happen' => 'DESC']); + if ($complete_results != null) + { + $jo_event = current($complete_results); + $date_complete = $jo_event->getDateHappen()->format('Ymd H:i:s'); + } + $data = [ 'id' => $jo->getID(), 'service_type' => $jo->getServiceType(), @@ -865,6 +886,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface // date and time accepted and started 'date_accept' => $date_accept, 'date_start' => $date_start, + 'date_complete' => $date_complete, // END: cmb specific details ]; @@ -1547,6 +1569,13 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface ->setRider($rider); $this->em->persist($event); + $rider_event = new JOEvent(); + $rider_event->setDateHappen(new DateTime()) + ->setTypeID(CMBJOEventType::RIDER_FINISH) + ->setJobOrder($jo) + ->setRider($rider); + $this->em->persist($rider_event); + // save to customer vehicle battery record $this->jo_handler->updateVehicleBattery($jo); From eadcd4604a9139fffcb3bd0d1c025d073f3d3f76 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 23 Jul 2020 03:55:33 +0000 Subject: [PATCH 124/138] Add getHeaderCoordinates to rider api. #424 --- .../RiderAPIHandler/CMBRiderAPIHandler.php | 108 +++++++++++++++++- 1 file changed, 105 insertions(+), 3 deletions(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 27bfedc4..8834a106 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -98,6 +98,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + // retry until we get a unique id while (true) { @@ -191,6 +195,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + // assign rider to session $this->session->setRider($rider); @@ -248,6 +256,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + // make rider unavailable $rider = $this->session->getRider(); @@ -288,6 +300,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + // set rider to available to take on JOs $rider = $this->session->getRider(); @@ -322,6 +338,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + // set rider to unavailable to take on JOs $rider = $this->session->getRider(); @@ -371,6 +391,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + $rider = $this->session->getRider(); // get JOs assigned to rider for the month given @@ -577,6 +601,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + $rider = $this->session->getRider(); $qb = $this->em->getRepository(JobOrder::class)->createQueryBuilder('j'); @@ -906,6 +934,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + $jo_data = $this->formatJobOrderData($req, $jo); $data = [ @@ -927,6 +959,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + // TODO: put JO in job queue // TODO: refactor this into a jo handler class, so we don't have to repeat for control center @@ -955,12 +991,13 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + // set jo status to in transit $jo->setStatus(JOStatus::IN_TRANSIT); - // set rider's active JO - - // TODO: send mqtt event (?) // add event log @@ -991,6 +1028,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + $cancel_reason = $req->request->get('cancel_reason'); $jo->cancel($cancel_reason); @@ -1022,6 +1063,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + $jo->perform(); // add event log @@ -1050,6 +1095,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + $jo->requeue(); // set rider to null @@ -1096,6 +1145,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + // TODO: refactor this into a jo handler class, so we don't have to repeat for control center // set jo status to in progress @@ -1168,6 +1221,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + // add mode of payment $mode = $req->request->get('mode_of_payment'); $jo->setModeOfPayment($mode); @@ -1441,6 +1498,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + $inv = $jo->getInvoice(); $promo = $inv->getPromo(); @@ -1514,6 +1575,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + // set jo status to in progress $jo->setStatus(JOStatus::IN_PROGRESS); @@ -1541,6 +1606,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + // set customer signature $jo_extra = $jo->getJOExtra(); $sig_file = $this->handleFileUpload($req, 'signature'); @@ -1650,6 +1719,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + $rider = $this->session->getRider(); $rider->setActiveJobOrder($jo); @@ -1672,6 +1745,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + $odometer_reading = $req->request->get('odometer'); if ($odometer_reading > 999999) @@ -1728,6 +1805,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + $dest = $this->upload_dir; $img_1_file = $req->files->get('img_1'); @@ -1908,6 +1989,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + $rider = $this->session->getRider(); $rider_status = $rider->isAvailable(); @@ -1945,6 +2030,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + $rider = $this->session->getRider(); // check if we have an active JO @@ -2026,6 +2115,10 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + // get longitude and latitude + // TODO: right now, we're just checking if we get the coordinates + $this->getHeaderCoordinates($req); + $rider = $this->session->getRider(); // check if rider is assigned to JO if ($jo->getRider() != null) @@ -2308,4 +2401,13 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $req->getScheme() . '://' . $req->getHttpHost() . $req->getBasePath() . '/uploads/jo_extra/' . $filename; } + + protected function getHeaderCoordinates(Request $req) + { + $x_lng = $req->headers->get('x-longitude'); + $x_lat = $req->headers->get('x-latitude'); + + error_log('rider_longitude ' . $x_lng); + error_log('rider_latitude ' . $x_lat); + } } From ff83dec5ceb2113616076f78fed391232076eef1 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 23 Jul 2020 04:40:48 +0000 Subject: [PATCH 125/138] Add upload photo event type. #424 --- src/Ramcar/CMBJOEventType.php | 32 ++++++++++--------- .../RiderAPIHandler/CMBRiderAPIHandler.php | 32 +++++++++++++++++++ 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/src/Ramcar/CMBJOEventType.php b/src/Ramcar/CMBJOEventType.php index 4a26baa4..631b434b 100644 --- a/src/Ramcar/CMBJOEventType.php +++ b/src/Ramcar/CMBJOEventType.php @@ -4,21 +4,22 @@ namespace App\Ramcar; class CMBJOEventType extends NameValue { - const CREATE = 'create'; - const HUB_ASSIGN = 'hub_assign'; - const RIDER_ASSIGN = 'rider_assign'; - const CANCEL = 'cancel'; - const FULFILL = 'fulfill'; - const OPEN_EDIT = 'open_edit'; - const REQUEUE = 'requeue'; - 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 PAID = 'paid'; - const PERFORM = 'perform'; - const RIDER_FINISH = 'finish'; + const CREATE = 'create'; + const HUB_ASSIGN = 'hub_assign'; + const RIDER_ASSIGN = 'rider_assign'; + const CANCEL = 'cancel'; + const FULFILL = 'fulfill'; + const OPEN_EDIT = 'open_edit'; + const REQUEUE = 'requeue'; + 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 PAID = 'paid'; + const PERFORM = 'perform'; + const RIDER_FINISH = 'finish'; + const RIDER_UPLOAD_PHOTO = 'rider_upload_photo'; const COLLECTION = [ 'create' => 'Created', @@ -36,5 +37,6 @@ class CMBJOEventType extends NameValue 'paid' => 'Paid', 'perform' => 'Perform', 'finish' => 'Finish', + 'rider_upload_photo' => 'Rider Upload Photo', ]; } diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 8834a106..ef87523f 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -522,6 +522,17 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $jo_event = current($complete_results); $date_complete = $jo_event->getDateHappen()->format('Ymd H:i:s'); } + else + { + // find the time when photos were uploaded + $upload_event_type = CMBJOEventType::RIDER_UPLOAD_PHOTO; + $upload_results = $this->em->getRepository(JOEvent::class)->findby(['type_id' => $upload_event_type, 'rider' => $rider_id, 'job_order' => $jo_id], ['date_happen' => 'DESC']); + if ($upload_results != null) + { + $jo_event = current($upload_results); + $date_complete = $jo_event->getDateHappen()->format('Ymd H:i:s'); + } + } $jo_data[] = [ 'job_order' => [ @@ -856,6 +867,17 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $jo_event = current($complete_results); $date_complete = $jo_event->getDateHappen()->format('Ymd H:i:s'); } + else + { + // find the time when photos were uploaded + $upload_event_type = CMBJOEventType::RIDER_UPLOAD_PHOTO; + $upload_results = $this->em->getRepository(JOEvent::class)->findby(['type_id' => $upload_event_type, 'rider' => $rider_id, 'job_order' => $jo_id], ['date_happen' => 'DESC']); + if ($upload_results != null) + { + $jo_event = current($upload_results); + $date_complete = $jo_event->getDateHappen()->format('Ymd H:i:s'); + } + } $data = [ 'id' => $jo->getID(), @@ -1805,6 +1827,8 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + $rider = $this->session->getRider(); + // get longitude and latitude // TODO: right now, we're just checking if we get the coordinates $this->getHeaderCoordinates($req); @@ -1973,6 +1997,14 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface } } + // create event for upload photo + $rider_event = new JOEvent(); + $rider_event->setDateHappen(new DateTime()) + ->setTypeID(CMBJOEventType::RIDER_UPLOAD_PHOTO) + ->setJobOrder($jo) + ->setRider($rider); + $this->em->persist($rider_event); + $this->em->flush(); } From febd4d6e0914df06f96d6789625fd9ed2d6a0fc0 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Thu, 23 Jul 2020 06:53:01 +0000 Subject: [PATCH 126/138] Comment out the error_log for header longitude and latitude. #424 --- src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index ef87523f..3dd1b8e6 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -2439,7 +2439,9 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface $x_lng = $req->headers->get('x-longitude'); $x_lat = $req->headers->get('x-latitude'); - error_log('rider_longitude ' . $x_lng); - error_log('rider_latitude ' . $x_lat); + // TODO: this is still unfinished + + //error_log('rider_longitude ' . $x_lng); + //error_log('rider_latitude ' . $x_lat); } } From d61d71804d4c21bbc5c1ef05222bce5935ce0f85 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 24 Jul 2020 06:42:38 +0000 Subject: [PATCH 127/138] Return empty array for job order when no ongoing job order. #424 --- src/Service/RiderAPIHandler/CMBRiderAPIHandler.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php index 3dd1b8e6..282f6bb6 100644 --- a/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/CMBRiderAPIHandler.php @@ -2047,7 +2047,7 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface if (isset($data['error'])) { $data['title'] = 'Failed Get Ongoing Job Order'; - $data['job_order'] = null; + $data['job_order'] = []; return $data; } @@ -2073,9 +2073,9 @@ class CMBRiderAPIHandler implements RiderAPIHandlerInterface if ($jo == null) { $data = [ - 'title' => 'Failed Get Ongoing Job Order', - 'error' => 'No active job order.', - 'job_order' => null, + //'title' => 'Failed Get Ongoing Job Order', + //'error' => 'No active job order.', + 'job_order' => [], ]; return $data; } From ed53e494b40a82ffcc12b10c1131357be2cd7790 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Fri, 24 Jul 2020 08:57:33 +0000 Subject: [PATCH 128/138] Fix bug where JO goes back to assigned when updated. #424 --- src/Service/JobOrderHandler/CMBJobOrderHandler.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 85ed87d7..1aa00065 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -595,7 +595,6 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface ->setServiceType($stype) ->setWarrantyClass($req->request->get('warranty_class')) ->setSource($req->request->get('source')) - ->setStatus(JOStatus::ASSIGNED) ->setDeliveryInstructions($req->request->get('delivery_instructions')) ->setTier1Notes($req->request->get('tier1_notes')) ->setTier2Notes($req->request->get('tier2_notes')) @@ -611,6 +610,12 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $jo->addMeta('discount', $discount); $jo->addMeta('service_charges', $service_charges); + // retain old jo status if it's an update JO + if ($old_jo_status != null) + $jo->setStatus($old_jo_status); + else + $jo->setStatus(JOStatus::ASSIGNED); + // check if user is null, meaning call to create came from API if ($user != null) { From e85139b864685ca9bf5c12a7509058b7597e83c6 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 27 Jul 2020 07:38:13 +0000 Subject: [PATCH 129/138] Add date start to the list of JOs in View All and Open. #424 --- .../JobOrderHandler/CMBJobOrderHandler.php | 37 ++++++++++++++----- templates/job-order/cmb.list.all.html.twig | 4 ++ templates/job-order/cmb.list.open.html.twig | 4 ++ 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 1aa00065..e1054e9f 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -31,7 +31,7 @@ use App\Entity\ServiceCharge; use App\Ramcar\InvoiceCriteria; use App\Ramcar\CMBServiceType; use App\Ramcar\CMBTradeInType; -use App\Ramcar\JOEventType; +use App\Ramcar\CMBJOEventType; use App\Ramcar\JOStatus; use App\Ramcar\CMBWarrantyClass; use App\Ramcar\DiscountApply; @@ -177,13 +177,26 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface // get rider information $rider_name = ''; $rider_plate_number = ''; + $rider_id = ''; $rider = $orow->getRider(); if (!empty($rider)) { + $rider_id = $rider->getID(); $rider_name = $rider->getFullName(); $rider_plate_number = $rider->getPlateNumber(); } + // get time when JO was started by rider + $start_event_type = CMBJOEventType::RIDER_START; + $date_start = ''; + $start_results = $this->em->getRepository(JOEvent::class)->findby(['type_id' => $start_event_type, 'rider' => $rider_id, 'job_order' => $orow->getID()], ['date_happen' => 'DESC']); + if ($start_results != null) + { + $jo_event = current($start_results); + $date_start = $jo_event->getDateHappen()->format('d M Y g:i A'); + } + + // add row data $row['id'] = $orow->getID(); $row['customer_name'] = $orow->getCustomer()->getFirstName() . ' ' . $orow->getCustomer()->getLastName(); @@ -198,6 +211,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $row['car_model'] = $car_model; $row['rider_name'] = $rider_name; $row['rider_plate_number'] = $rider_plate_number; + $row['date_start'] = $date_start; $processor = $orow->getProcessedBy(); if ($processor == null) @@ -400,7 +414,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface // the event $event = new JOEvent(); $event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::CREATE) + ->setTypeID(CMBJOEventType::CREATE) ->setJobOrder($jo); if ($user != null) @@ -610,6 +624,9 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $jo->addMeta('discount', $discount); $jo->addMeta('service_charges', $service_charges); + // TODO: what happens if hub and rider are changed + // and JO is already in_transit or in_progress? + // retain old jo status if it's an update JO if ($old_jo_status != null) $jo->setStatus($old_jo_status); @@ -662,7 +679,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface // the event $event = new JOEvent(); $event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::CREATE) + ->setTypeID(CMBJOEventType::CREATE) ->setJobOrder($jo); if ($user != null) @@ -801,7 +818,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface // the event $event = new JOEvent(); $event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::HUB_ASSIGN) + ->setTypeID(CMBJOEventType::HUB_ASSIGN) ->setJobOrder($obj); if ($user != null) @@ -900,7 +917,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface // the event $event = new JOEvent(); $event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::RIDER_ASSIGN) + ->setTypeID(CMBJOEventType::RIDER_ASSIGN) ->setJobOrder($obj); if ($user != null) @@ -971,7 +988,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface // the event $event = new JOEvent(); $event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::FULFILL) + ->setTypeID(CMBJOEventType::FULFILL) ->setJobOrder($obj); // get current user @@ -1069,7 +1086,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface // the event $event = new JOEvent(); $event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::CANCEL) + ->setTypeID(CMBJOEventType::CANCEL) ->setJobOrder($obj); // get current user @@ -1179,7 +1196,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface // add event $event = new JOEvent(); $event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::HUB_ASSIGN) + ->setTypeID(CMBJOEventType::HUB_ASSIGN) ->setJobOrder($obj); if ($user != null) @@ -1379,7 +1396,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface // add event $event = new JOEvent(); $event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::RIDER_ASSIGN) + ->setTypeID(CMBJOEventType::RIDER_ASSIGN) ->setJobOrder($obj); if ($user != null) @@ -2730,7 +2747,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface // the event $event = new JOEvent(); $event->setDateHappen(new DateTime()) - ->setTypeID(JOEventType::CREATE) + ->setTypeID(CMBJOEventType::CREATE) ->setJobOrder($jo); if ($user != null) diff --git a/templates/job-order/cmb.list.all.html.twig b/templates/job-order/cmb.list.all.html.twig index ae0cc4c7..c45d3e73 100644 --- a/templates/job-order/cmb.list.all.html.twig +++ b/templates/job-order/cmb.list.all.html.twig @@ -132,6 +132,10 @@ field: 'type', title: 'Schedule' }, + { + field: 'date_start', + title: 'Start Date' + }, { field: 'date_schedule', title: 'Scheduled Date' diff --git a/templates/job-order/cmb.list.open.html.twig b/templates/job-order/cmb.list.open.html.twig index f7b96452..4fa85c70 100644 --- a/templates/job-order/cmb.list.open.html.twig +++ b/templates/job-order/cmb.list.open.html.twig @@ -131,6 +131,10 @@ field: 'type', title: 'Schedule' }, + { + field: 'date_start', + title: 'Start Date' + }, { field: 'date_schedule', title: 'Scheduled Date' From a432def97bf10ae18eb3227a46d948b940bbf9f4 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 27 Jul 2020 07:48:10 +0000 Subject: [PATCH 130/138] Add date start to list of job orders behind schedule. #424 --- templates/job-order/cmb.list.behindschedule.html.twig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/templates/job-order/cmb.list.behindschedule.html.twig b/templates/job-order/cmb.list.behindschedule.html.twig index da9853b5..d2e1199a 100644 --- a/templates/job-order/cmb.list.behindschedule.html.twig +++ b/templates/job-order/cmb.list.behindschedule.html.twig @@ -120,6 +120,10 @@ field: 'type', title: 'Schedule' }, + { + field: 'date_start', + title: 'Start Date' + }, { field: 'date_schedule', title: 'Scheduled Date' From fdce6c02a48fe729830ecabd683e1b6487c95cc6 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 27 Jul 2020 09:49:53 +0000 Subject: [PATCH 131/138] Add name to rider label. #424 --- public/assets/js/dashboard_map.js | 18 ++++++++++++------ src/Controller/HomeController.php | 5 +++++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/public/assets/js/dashboard_map.js b/public/assets/js/dashboard_map.js index 82debb56..f0fd7900 100644 --- a/public/assets/js/dashboard_map.js +++ b/public/assets/js/dashboard_map.js @@ -147,7 +147,7 @@ class DashboardMap { } } - putMarkerWithLabel(id, lat, lng, markers, icon, layer_group, popup_url) { + putMarkerWithLabel(id, name, lat, lng, markers, icon, layer_group, popup_url) { var my = this; // existing marker if (markers.hasOwnProperty(id)) { @@ -162,7 +162,10 @@ class DashboardMap { { icon: icon } ); - markers[id].bindTooltip(id, + var marker_label = id + ' - ' + name; + console.log(marker_label); + + markers[id].bindTooltip(marker_label, { permanent: true, direction: 'right' @@ -228,9 +231,10 @@ class DashboardMap { ); } - putRiderAvailableMarker(id, lat, lng) { + putRiderAvailableMarker(id, name, lat, lng) { this.putMarkerWithLabel( id, + name, lat, lng, this.rider_markers, @@ -240,9 +244,10 @@ class DashboardMap { ); } - putRiderActiveJOMarker(id, lat, lng) { + putRiderActiveJOMarker(id, name, lat, lng) { this.putMarkerWithLabel( id, + name, lat, lng, this.rider_markers, @@ -298,11 +303,12 @@ class DashboardMap { $.each(riders, function(id, data) { var lat = data.latitude; var lng = data.longitude; + var name = data.name; if (data.has_jo) - my.putRiderActiveJOMarker(id, lat, lng); + my.putRiderActiveJOMarker(id, name, lat, lng); else - my.putRiderAvailableMarker(id, lat, lng); + my.putRiderAvailableMarker(id, name, lat, lng); }); // console.log(rider_markers); diff --git a/src/Controller/HomeController.php b/src/Controller/HomeController.php index 1a157b78..ffaba318 100644 --- a/src/Controller/HomeController.php +++ b/src/Controller/HomeController.php @@ -58,11 +58,16 @@ class HomeController extends Controller continue; } + // get full name of rider + $name = $rider->getFullName(); + $riders[$rider_id]['name'] = $name; + $jo = $rider->getActiveJobOrder(); if ($jo == null) $riders[$rider_id]['has_jo'] = false; else $riders[$rider_id]['has_jo'] = true; + } // get active JOs and check transaction origin for TransactionOrigin::MOBILE_APP From 55a445558635912bf7b00aa99527323946df5e4d Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Tue, 4 Aug 2020 05:39:07 +0000 Subject: [PATCH 132/138] Revert "Add name to rider label. #424" This reverts commit fdce6c02a48fe729830ecabd683e1b6487c95cc6 --- public/assets/js/dashboard_map.js | 18 ++++++------------ src/Controller/HomeController.php | 5 ----- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/public/assets/js/dashboard_map.js b/public/assets/js/dashboard_map.js index f0fd7900..82debb56 100644 --- a/public/assets/js/dashboard_map.js +++ b/public/assets/js/dashboard_map.js @@ -147,7 +147,7 @@ class DashboardMap { } } - putMarkerWithLabel(id, name, lat, lng, markers, icon, layer_group, popup_url) { + putMarkerWithLabel(id, lat, lng, markers, icon, layer_group, popup_url) { var my = this; // existing marker if (markers.hasOwnProperty(id)) { @@ -162,10 +162,7 @@ class DashboardMap { { icon: icon } ); - var marker_label = id + ' - ' + name; - console.log(marker_label); - - markers[id].bindTooltip(marker_label, + markers[id].bindTooltip(id, { permanent: true, direction: 'right' @@ -231,10 +228,9 @@ class DashboardMap { ); } - putRiderAvailableMarker(id, name, lat, lng) { + putRiderAvailableMarker(id, lat, lng) { this.putMarkerWithLabel( id, - name, lat, lng, this.rider_markers, @@ -244,10 +240,9 @@ class DashboardMap { ); } - putRiderActiveJOMarker(id, name, lat, lng) { + putRiderActiveJOMarker(id, lat, lng) { this.putMarkerWithLabel( id, - name, lat, lng, this.rider_markers, @@ -303,12 +298,11 @@ class DashboardMap { $.each(riders, function(id, data) { var lat = data.latitude; var lng = data.longitude; - var name = data.name; if (data.has_jo) - my.putRiderActiveJOMarker(id, name, lat, lng); + my.putRiderActiveJOMarker(id, lat, lng); else - my.putRiderAvailableMarker(id, name, lat, lng); + my.putRiderAvailableMarker(id, lat, lng); }); // console.log(rider_markers); diff --git a/src/Controller/HomeController.php b/src/Controller/HomeController.php index ffaba318..1a157b78 100644 --- a/src/Controller/HomeController.php +++ b/src/Controller/HomeController.php @@ -58,16 +58,11 @@ class HomeController extends Controller continue; } - // get full name of rider - $name = $rider->getFullName(); - $riders[$rider_id]['name'] = $name; - $jo = $rider->getActiveJobOrder(); if ($jo == null) $riders[$rider_id]['has_jo'] = false; else $riders[$rider_id]['has_jo'] = true; - } // get active JOs and check transaction origin for TransactionOrigin::MOBILE_APP From 8a026ef44a3c45d1f9cce18b8bd706ac57b0c863 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 4 Aug 2020 07:52:27 +0000 Subject: [PATCH 133/138] Add fix to dashboard map zoom error. #424 --- config/routes/rider.yaml | 5 + public/assets/js/dashboard_map.js | 9 +- public/assets/js/map_mqtt.js | 164 +++++++++++++++-------------- src/Controller/RiderController.php | 14 +++ 4 files changed, 110 insertions(+), 82 deletions(-) diff --git a/config/routes/rider.yaml b/config/routes/rider.yaml index da41058d..5e31dfb4 100644 --- a/config/routes/rider.yaml +++ b/config/routes/rider.yaml @@ -61,3 +61,8 @@ rider_ajax_avialable: path: /riders/{id}/available controller: App\Controller\RiderController::ajaxAvailable methods: [GET] + +rider_ajax_rider_name: + path: /riders/rider_name + controller: App\Controller\RiderController::ajaxRiderName + methods: [GET] diff --git a/public/assets/js/dashboard_map.js b/public/assets/js/dashboard_map.js index f0fd7900..aaf6827b 100644 --- a/public/assets/js/dashboard_map.js +++ b/public/assets/js/dashboard_map.js @@ -163,7 +163,6 @@ class DashboardMap { ); var marker_label = id + ' - ' + name; - console.log(marker_label); markers[id].bindTooltip(marker_label, { @@ -231,7 +230,7 @@ class DashboardMap { ); } - putRiderAvailableMarker(id, name, lat, lng) { + putRiderAvailableMarker(id, lat, lng, name) { this.putMarkerWithLabel( id, name, @@ -244,7 +243,7 @@ class DashboardMap { ); } - putRiderActiveJOMarker(id, name, lat, lng) { + putRiderActiveJOMarker(id, lat, lng, name) { this.putMarkerWithLabel( id, name, @@ -306,9 +305,9 @@ class DashboardMap { var name = data.name; if (data.has_jo) - my.putRiderActiveJOMarker(id, name, lat, lng); + my.putRiderActiveJOMarker(id, lat, lng, name); else - my.putRiderAvailableMarker(id, name, lat, lng); + my.putRiderAvailableMarker(id, lat, lng, name); }); // console.log(rider_markers); diff --git a/public/assets/js/map_mqtt.js b/public/assets/js/map_mqtt.js index 00474c6f..825bf065 100644 --- a/public/assets/js/map_mqtt.js +++ b/public/assets/js/map_mqtt.js @@ -79,88 +79,98 @@ class MapEventHandler { handleRider(chan_split, payload) { // console.log("rider message"); - switch (chan_split[2]) { - case "availability": - console.log("got availability for rider " + chan_split[1] + " - " + payload); - var obj = JSON.parse(payload); + // get rider name using chan_split[1] which is rider id + var rider_id = chan_split[1]; + $.ajax({ + method: "GET", + url: "{{ url('rider_ajax_rider_name') }}", + data: {id: rider_id} + }).done(function(response) { + var name = response.rider_name; + console.log('rider_name ' + name); + switch (chan_split[2]) { + case "availability": + console.log("got availability for rider " + chan_split[1] + " - " + payload); + var obj = JSON.parse(payload); - var status = obj.status; - console.log("status " + status); - switch (status) { - case 'rider_offline': - this.dashmap.rider_availability[chan_split[1]] = false; - this.dashmap.removeRiderMarker(chan_split[1]); - break; - case 'rider_online': - this.dashmap.rider_availability[chan_split[1]] = true; - var lat = parseFloat(obj.latitude); - var lng = parseFloat(obj.longitude); + var status = obj.status; + console.log("status " + status); + switch (status) { + case 'rider_offline': + this.dashmap.rider_availability[chan_split[1]] = false; + this.dashmap.removeRiderMarker(chan_split[1]); + break; + case 'rider_online': + this.dashmap.rider_availability[chan_split[1]] = true; + var lat = parseFloat(obj.latitude); + var lng = parseFloat(obj.longitude); - // cheeck if rider is available / unavailable - // TODO: make url not hardcoded - var dashmap = this.dashmap; - $.get('https://cmbdev.wildcard.cc/riders/' + chan_split[1] + '/available').done(function(data) { - console.log('rider availability - ' + data); - switch (data) { - case 'available': - console.log('putting available marker ' + chan_split[1] + ' ' + lat + ':' + lng); - dashmap.switchRiderStatus(chan_split[1], 'available'); - dashmap.putRiderAvailableMarker(chan_split[1], lat, lng); - break; - case 'unavailable': - console.log('putting active jo marker ' + chan_split[1] + ' ' + lat + ':' + lng); - dashmap.switchRiderStatus(chan_split[1], 'jo'); - dashmap.putRiderActiveJOMarker(chan_split[1], lat, lng); - break; - } - }); - break; - } - break; - case "location": - // console.log("got location for rider " + chan_split[1] + " - " + payload); - var pl_split = payload.split(':'); - // console.log(pl_split); - - // check for correct format - if (pl_split.length != 2) - break; - - var lat = parseFloat(pl_split[0]); - var lng = parseFloat(pl_split[1]); - - var display_marker = true; - if (this.dashmap.rider_availability.hasOwnProperty(chan_split[1])) { - if (!this.dashmap.rider_availability[chan_split[1]]) { - console.log('NOT displaying marker for inactive rider'); - display_marker = false; + // cheeck if rider is available / unavailable + // TODO: make url not hardcoded + var dashmap = this.dashmap; + $.get('https://cmbdev.wildcard.cc/riders/' + chan_split[1] + '/available').done(function(data) { + console.log('rider availability - ' + data); + switch (data) { + case 'available': + console.log('putting available marker ' + chan_split[1] + ' ' + lat + ':' + lng); + dashmap.switchRiderStatus(chan_split[1], 'available'); + dashmap.putRiderAvailableMarker(chan_split[1], lat, lng, name); + break; + case 'unavailable': + console.log('putting active jo marker ' + chan_split[1] + ' ' + lat + ':' + lng); + dashmap.switchRiderStatus(chan_split[1], 'jo'); + dashmap.putRiderActiveJOMarker(chan_split[1], lat, lng, name); + break; + } + }); + break; } - } else { - console.log('rider not in availability check'); - } + break; + case "location": + // console.log("got location for rider " + chan_split[1] + " - " + payload); + var pl_split = payload.split(':'); + // console.log(pl_split); - // TODO: cache rider availability (available vs active jo) status and check before displaying icon - // NOTE: we really should fix our terms since available can mean many things - if (display_marker) { - this.dashmap.putRiderAvailableMarker(chan_split[1], lat, lng); - } - break; - case "status": - console.log("got status for rider " + chan_split[1] + " - " + payload); - switch (payload) { - case 'available': - this.dashmap.switchRiderStatus(chan_split[1], 'available'); + // check for correct format + if (pl_split.length != 2) break; - case 'jo': - console.log('jo status'); - this.dashmap.switchRiderStatus(chan_split[1], 'jo'); - break; - case 'logout': - this.dashmap.removeRiderMarker(chan_split[1]); - break; - } - break; - } + + var lat = parseFloat(pl_split[0]); + var lng = parseFloat(pl_split[1]); + + var display_marker = true; + if (this.dashmap.rider_availability.hasOwnProperty(chan_split[1])) { + if (!this.dashmap.rider_availability[chan_split[1]]) { + console.log('NOT displaying marker for inactive rider'); + display_marker = false; + } + } else { + console.log('rider not in availability check'); + } + + // TODO: cache rider availability (available vs active jo) status and check before displaying icon + // NOTE: we really should fix our terms since available can mean many things + if (display_marker) { + this.dashmap.putRiderAvailableMarker(chan_split[1], lat, lng, name); + } + break; + case "status": + console.log("got status for rider " + chan_split[1] + " - " + payload); + switch (payload) { + case 'available': + this.dashmap.switchRiderStatus(chan_split[1], 'available'); + break; + case 'jo': + console.log('jo status'); + this.dashmap.switchRiderStatus(chan_split[1], 'jo'); + break; + case 'logout': + this.dashmap.removeRiderMarker(chan_split[1]); + break; + } + break; + } + }); } handleJobOrder(chan_split, payload) { diff --git a/src/Controller/RiderController.php b/src/Controller/RiderController.php index 247123d5..bdfd3b85 100644 --- a/src/Controller/RiderController.php +++ b/src/Controller/RiderController.php @@ -615,4 +615,18 @@ class RiderController extends Controller ); return $response; } + + public function ajaxRiderName(EntityManagerInterface $em, Request $req) + { + $rider_id = $req->query->get('id'); + + $rider = $em->getRepository(Rider::class)->find($rider_id); + $rider_name = ''; + if ($rider != null) + $rider_name = $rider->getFullName(); + + return $this->json([ + 'rider_name' => $rider_name, + ]); + } } From 46bcf7f209aac99c0f5756f9787ec6857592412b Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 4 Aug 2020 08:08:56 +0000 Subject: [PATCH 134/138] Fix zoom issue in dashboard map. #424 --- public/assets/js/dashboard_map.js | 9 ++++++--- src/Controller/HomeController.php | 4 ++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/public/assets/js/dashboard_map.js b/public/assets/js/dashboard_map.js index 653b0bd7..a00612a6 100644 --- a/public/assets/js/dashboard_map.js +++ b/public/assets/js/dashboard_map.js @@ -147,7 +147,7 @@ class DashboardMap { } } - putMarkerWithLabel(id, lat, lng, markers, icon, layer_group, popup_url) { + putMarkerWithLabel(id, lat, lng, markers, icon, layer_group, popup_url, name) { var my = this; // existing marker if (markers.hasOwnProperty(id)) { @@ -238,7 +238,8 @@ class DashboardMap { this.rider_markers, this.options.icons.rider_available, this.layer_groups.rider_available, - this.options.rider_popup_url + this.options.rider_popup_url, + name ); } @@ -250,7 +251,8 @@ class DashboardMap { this.rider_markers, this.options.icons.rider_active_jo, this.layer_groups.rider_active_jo, - this.options.rider_popup_url + this.options.rider_popup_url, + name ); } @@ -300,6 +302,7 @@ class DashboardMap { $.each(riders, function(id, data) { var lat = data.latitude; var lng = data.longitude; + var name = data.name; if (data.has_jo) my.putRiderActiveJOMarker(id, lat, lng, name); diff --git a/src/Controller/HomeController.php b/src/Controller/HomeController.php index 1a157b78..46f50c19 100644 --- a/src/Controller/HomeController.php +++ b/src/Controller/HomeController.php @@ -58,6 +58,10 @@ class HomeController extends Controller continue; } + // get full name of rider + $name = $rider->getFullName(); + $riders[$rider_id]['name'] = $name; + $jo = $rider->getActiveJobOrder(); if ($jo == null) $riders[$rider_id]['has_jo'] = false; From 407c860582b22a8f65a10abb7ccfa7ebf750ee67 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 5 Aug 2020 03:51:40 +0000 Subject: [PATCH 135/138] Add finish date column to list of all job orders. #456 --- src/Service/JobOrderHandler/CMBJobOrderHandler.php | 10 ++++++++++ templates/job-order/cmb.list.all.html.twig | 8 ++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index e1054e9f..57094a1c 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -196,6 +196,15 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $date_start = $jo_event->getDateHappen()->format('d M Y g:i A'); } + // get time when JO was finished by rider + $finish_event_type = CMBJOEventType::RIDER_FINISH; + $date_finish = ''; + $finish_results = $this->em->getRepository(JOEvent::class)->findby(['type_id' => $finish_event_type, 'rider' => $rider_id, 'job_order' => $orow->getID()], ['date_happen' => 'DESC']); + if ($finish_results != null) + { + $jo_event = current($finish_results); + $date_finish = $jo_event->getDateHappen()->format('d M Y g:i A'); + } // add row data $row['id'] = $orow->getID(); @@ -212,6 +221,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface $row['rider_name'] = $rider_name; $row['rider_plate_number'] = $rider_plate_number; $row['date_start'] = $date_start; + $row['date_finish'] = $date_finish; $processor = $orow->getProcessedBy(); if ($processor == null) diff --git a/templates/job-order/cmb.list.all.html.twig b/templates/job-order/cmb.list.all.html.twig index c45d3e73..7351e2ad 100644 --- a/templates/job-order/cmb.list.all.html.twig +++ b/templates/job-order/cmb.list.all.html.twig @@ -132,13 +132,17 @@ field: 'type', title: 'Schedule' }, + { + field: 'date_schedule', + title: 'Scheduled Date' + }, { field: 'date_start', title: 'Start Date' }, { - field: 'date_schedule', - title: 'Scheduled Date' + field: 'date_finish', + title: 'Finish Date' }, { field: 'rider_name', From 5942575fde5ebc5bd27e4f028629512575f1d93f Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 5 Aug 2020 08:03:46 +0000 Subject: [PATCH 136/138] Add responsible_party field to job order entity and JO forms. #459 --- src/Entity/JobOrder.php | 17 +++++++++++++++++ .../JobOrderHandler/CMBJobOrderHandler.php | 6 ++++-- templates/job-order/cmb.form.onestep.html.twig | 5 +++++ templates/job-order/cmb.form.walkin.html.twig | 10 ++++++++-- 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/Entity/JobOrder.php b/src/Entity/JobOrder.php index 718c70ee..7335c512 100644 --- a/src/Entity/JobOrder.php +++ b/src/Entity/JobOrder.php @@ -346,6 +346,12 @@ class JobOrder */ protected $date_status_change; + // insurer/responsible party handling the onsite job + /** + * @ORM\Column(type="string", length=80, nullable=true) + */ + protected $responsible_party; + public function __construct() { $this->date_create = new DateTime(); @@ -996,4 +1002,15 @@ class JobOrder return $this->jo_extra; } + public function setResponsibleParty($responsible_party) + { + $this->responsible_party = $responsible_party; + return $this; + } + + public function getResponsibleParty() + { + return $this->responsible_party; + } + } diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 57094a1c..9ffb102a 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -629,7 +629,8 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface ->setLandmark($req->request->get('landmark')) ->setHub($hub) ->setRider($rider) - ->setPriority($priority); + ->setPriority($priority) + ->setResponsibleParty($req->request->get('responsible_party', '')); $jo->addMeta('discount', $discount); $jo->addMeta('service_charges', $service_charges); @@ -2707,7 +2708,8 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface ->setDeliveryAddress('Walk-in') ->setLandmark('Walk-in') ->setCoordinates($hub_coordinates) - ->setHub($hub); + ->setHub($hub) + ->setResponsibleParty($req->request->get('responsible_party', '')); $jo->addMeta('discount', $discount); diff --git a/templates/job-order/cmb.form.onestep.html.twig b/templates/job-order/cmb.form.onestep.html.twig index 2b01fbad..d6d5ba20 100644 --- a/templates/job-order/cmb.form.onestep.html.twig +++ b/templates/job-order/cmb.form.onestep.html.twig @@ -335,6 +335,11 @@
+
+ + + +
diff --git a/templates/job-order/cmb.form.walkin.html.twig b/templates/job-order/cmb.form.walkin.html.twig index 58b52900..f0769f18 100644 --- a/templates/job-order/cmb.form.walkin.html.twig +++ b/templates/job-order/cmb.form.walkin.html.twig @@ -332,13 +332,19 @@
-
-
+
+
+
+
+ + + +

From 62a4ffcdfd9ed8ad555af18d006ba1acd734e21a Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 5 Aug 2020 09:40:18 +0000 Subject: [PATCH 137/138] Add mobile number to customer vehicle search in JO forms. #457 --- .../CustomerHandler/CMBCustomerHandler.php | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/Service/CustomerHandler/CMBCustomerHandler.php b/src/Service/CustomerHandler/CMBCustomerHandler.php index 242ee284..600ed3f6 100644 --- a/src/Service/CustomerHandler/CMBCustomerHandler.php +++ b/src/Service/CustomerHandler/CMBCustomerHandler.php @@ -416,8 +416,14 @@ class CMBCustomerHandler implements CustomerHandlerInterface // add filters to count query if (!empty($term)) { - $tquery->where('q.plate_number like :search') - ->setParameter('search', $term . '%'); + //$tquery->where('q.plate_number like :search') + // ->setParameter('search', $term . '%'); + // TODO: this is really slow. Need to optimize + $tquery->innerJoin('q.customer', 'c') + ->where('q.plate_number like :search') + ->orWhere('c.phone_mobile = :number') + ->setParameter('search', $term . '%') + ->setParameter('number', $term); /* $tquery->where('match_against (q.plate_number, :search \'in boolean mode\') > 0.1') ->setParameter('search', $term . '*'); @@ -431,6 +437,8 @@ class CMBCustomerHandler implements CustomerHandlerInterface $total = $tquery->getQuery() ->getSingleScalarResult(); + error_log($total); + // pagination vars $page = $req->query->get('page') ?? 1; $perpage = 20; @@ -448,8 +456,14 @@ class CMBCustomerHandler implements CustomerHandlerInterface // add filters if needed if (!empty($term)) { - $query->where('q.plate_number like :search') - ->setParameter('search', $term . '%'); + // TODO: this is really slow. Need to optimize + $query->innerJoin('q.customer', 'cust') + ->where('q.plate_number like :search') + ->orWhere('cust.phone_mobile = :number') + ->setParameter('search', $term . '%') + ->setParameter('number', $term); + //$query->where('q.plate_number like :search') + // ->setParameter('search', $term . '%'); /* $query->where('match_against (q.plate_number, :search \'in boolean mode\') > 0.1') ->setParameter('search', $term . '*'); @@ -465,7 +479,7 @@ class CMBCustomerHandler implements CustomerHandlerInterface ->setFirstResult($offset) ->setMaxResults($perpage) ->getQuery(); - // error_log($query_obj->getSql()); + error_log($query_obj->getSql()); $obj_rows = $query_obj->getResult(); From 1a82676c2583572fe5181bfc81109548d1e6dd53 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Wed, 5 Aug 2020 10:13:53 +0000 Subject: [PATCH 138/138] Remove log messages. #457 --- src/Service/CustomerHandler/CMBCustomerHandler.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Service/CustomerHandler/CMBCustomerHandler.php b/src/Service/CustomerHandler/CMBCustomerHandler.php index 600ed3f6..28612897 100644 --- a/src/Service/CustomerHandler/CMBCustomerHandler.php +++ b/src/Service/CustomerHandler/CMBCustomerHandler.php @@ -437,8 +437,6 @@ class CMBCustomerHandler implements CustomerHandlerInterface $total = $tquery->getQuery() ->getSingleScalarResult(); - error_log($total); - // pagination vars $page = $req->query->get('page') ?? 1; $perpage = 20; @@ -479,7 +477,7 @@ class CMBCustomerHandler implements CustomerHandlerInterface ->setFirstResult($offset) ->setMaxResults($perpage) ->getQuery(); - error_log($query_obj->getSql()); + // error_log($query_obj->getSql()); $obj_rows = $query_obj->getResult();