From b4b18e5d3d6e78232bbb13786d39c38f7f7002fe Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 9 Aug 2018 02:06:33 +0800 Subject: [PATCH 1/9] Have rider api cancel job order requeue the job order for reassignment instead #162 --- src/Controller/RAPIController.php | 23 +++++++++++++---------- src/Entity/JOEvent.php | 18 ++++++++++++++++++ src/Entity/JobOrder.php | 8 ++++++++ src/Ramcar/JOEventType.php | 2 ++ templates/job-order/form.html.twig | 2 +- 5 files changed, 42 insertions(+), 11 deletions(-) diff --git a/src/Controller/RAPIController.php b/src/Controller/RAPIController.php index 0fa9f31d..abe6fc8a 100644 --- a/src/Controller/RAPIController.php +++ b/src/Controller/RAPIController.php @@ -23,6 +23,7 @@ use App\Ramcar\TransactionOrigin; use App\Ramcar\TradeInType; use App\Ramcar\InvoiceStatus; use App\Ramcar\ModeOfPayment; +use App\Ramcar\JOEventType; use App\Service\InvoiceCreator; use App\Service\MQTTClient; @@ -40,6 +41,7 @@ use App\Entity\BatterySize; use App\Entity\RiderRating; use App\Entity\Rider; use App\Entity\User; +use App\Entity\JOEvent; use DateTime; @@ -481,17 +483,19 @@ class RAPIController extends Controller if ($res->isError()) return $res->getReturnResponse(); - /* - // set jo status to cancelled - // TODO: set reason - $jo->setStatus(JOStatus::CANCELLED) - ->setDateCancel(new DateTime()); + $rider = $this->session->getRider(); - // make rider available - $this->session->getRider()->setAvailable(true); - */ + // $jo->cancel("rider cancelled"); + // requeue it, instead of cancelling it + $jo->requeue(); - $jo->cancel("rider cancelled"); + // add event + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::REQUEUE) + ->setJobOrder($jo) + ->setRider($rider); + $em->persist($event); $em->flush(); @@ -504,7 +508,6 @@ class RAPIController extends Controller $mclient->sendEvent($jo, $payload); - // TODO: add event return $res->getReturnResponse(); } diff --git a/src/Entity/JOEvent.php b/src/Entity/JOEvent.php index 7d0d5d31..ee051712 100644 --- a/src/Entity/JOEvent.php +++ b/src/Entity/JOEvent.php @@ -52,6 +52,13 @@ class JOEvent */ protected $job_order; + // rider related to the event + /** + * @ORM\ManyToOne(targetEntity="Rider", inversedBy="events") + * @ORM\JoinColumn(name="rider_id", referencedColumnName="id", nullable=true) + */ + protected $rider; + public function __construct() { $this->date_create = new DateTime(); @@ -115,4 +122,15 @@ class JOEvent { return $this->job_order; } + + public function setRider(Rider $rider) + { + $this->rider = $rider; + return $this; + } + + public function getRider() + { + return $this->rider; + } } diff --git a/src/Entity/JobOrder.php b/src/Entity/JobOrder.php index 122df4df..e3e69688 100644 --- a/src/Entity/JobOrder.php +++ b/src/Entity/JobOrder.php @@ -661,6 +661,14 @@ class JobOrder $rider->setAvailable(); } + public function requeue() + { + // set status back to 'for rider assignment' + $this->setStatus(JOStatus::RIDER_ASSIGN); + + $this->makeRiderAvailable(); + } + public function cancel($reason) { // set status to cancelled diff --git a/src/Ramcar/JOEventType.php b/src/Ramcar/JOEventType.php index defa6d3b..73db12ef 100644 --- a/src/Ramcar/JOEventType.php +++ b/src/Ramcar/JOEventType.php @@ -10,6 +10,7 @@ class JOEventType extends NameValue const CANCEL = 'cancel'; const FULFILL = 'fulfill'; const OPEN_EDIT = 'open_edit'; + const REQUEUE = 'requeue'; const COLLECTION = [ 'create' => 'Created', @@ -18,5 +19,6 @@ class JOEventType extends NameValue 'cancel' => 'Cancelled', 'fulfill' => 'Fulfilled', 'open_edit' => 'Open Edit', + 'requeue' => 'Requeue', ]; } diff --git a/templates/job-order/form.html.twig b/templates/job-order/form.html.twig index 349c2d68..f566ab00 100644 --- a/templates/job-order/form.html.twig +++ b/templates/job-order/form.html.twig @@ -739,7 +739,7 @@
- {{ event.getTypeName }} by {{ event.getUser.getFullName|default('Application') }} + {{ event.getTypeName }} by {{ event.getUser.getFullName|default('Application') }} {% if event.getRider %} - Rider - {{ event.getRider.getFullName }}{% endif %}
{% endfor %} From f2d83dca432401f53cef53d1dcd7ea3917b9b38e Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 9 Aug 2018 02:46:58 +0800 Subject: [PATCH 2/9] Add in transit status job orders to open list #162 --- src/Controller/JobOrderController.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php index 401a7612..7068d730 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -597,7 +597,8 @@ class JobOrderController extends BaseController JOStatus::PENDING, JOStatus::RIDER_ASSIGN, JOStatus::ASSIGNED, - JOStatus::IN_PROGRESS + JOStatus::IN_PROGRESS, + JOStatus::IN_TRANSIT, ]; break; case 'all': From df709aa35382a31c598b8d9b5cb34941d99d8ce8 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 9 Aug 2018 03:36:27 +0800 Subject: [PATCH 3/9] Add delivery_address and delivery_instructions to rider status user api call #162 --- src/Controller/APIController.php | 66 ++++++++++++++------------------ 1 file changed, 28 insertions(+), 38 deletions(-) diff --git a/src/Controller/APIController.php b/src/Controller/APIController.php index 7c05464d..194c853b 100644 --- a/src/Controller/APIController.php +++ b/src/Controller/APIController.php @@ -1088,29 +1088,26 @@ class APIController extends Controller $jo = $ongoing_jos[0]; $dest = $jo->getCoordinates(); + $data = [ + 'jo_id' => $jo->getID(), + 'service_type' => $jo->getServiceType(), + 'destination' => [ + 'long' => $dest->getLongitude(), + 'lat' => $dest->getLatitude(), + ], + 'delivery_address' => $jo->getDeliveryAddress(), + 'delivery_instructions' => $jo->getDeliveryInstructions(), + ]; + switch ($jo->getStatus()) { case JOStatus::PENDING: - $res->setData([ - 'status' => APIRiderStatus::OUTLET_ASSIGN, - 'jo_id' => $jo->getID(), - 'service_type' => $jo->getServiceType(), - 'destination' => [ - 'long' => $dest->getLongitude(), - 'lat' => $dest->getLatitude(), - ], - ]); + $data['status'] = APIRiderStatus::OUTLET_ASSIGN; + $res->setData($data); return $res->getReturnResponse(); case JOStatus::RIDER_ASSIGN: - $res->setData([ - 'status' => APIRiderStatus::RIDER_ASSIGN, - 'jo_id' => $jo->getID(), - 'service_type' => $jo->getServiceType(), - 'destination' => [ - 'long' => $dest->getLongitude(), - 'lat' => $dest->getLatitude(), - ], - ]); + $data['status'] = APIRiderStatus::RIDER_ASSIGN; + $res->setData($data); return $res->getReturnResponse(); case JOStatus::ASSIGNED: case JOStatus::IN_TRANSIT: @@ -1123,27 +1120,20 @@ class APIController extends Controller $image_url = $url_prefix . '/assets/images/user.gif'; if ($rider->getImageFile() != null) $image_url = $url_prefix . '/uploads/' . $rider->getImageFile(); - $res->setData([ - 'status' => APIRiderStatus::RIDER_PICK_UP, - 'jo_id' => $jo->getID(), - 'service_type' => $jo->getServiceType(), - 'destination' => [ - 'long' => $dest->getLongitude(), - 'lat' => $dest->getLatitude(), - ], - // TODO: fix this to actual location of rider - 'rider' => [ - 'id' => $rider->getID(), - 'name' => $rider->getFullName(), - 'plate_num' => $rider->getPlateNumber(), - 'contact_num' => $rider->getContactNumber(), - 'image_url' => $image_url, - 'location' => [ - 'long' => $coord->getLongitude(), - 'lat' => $coord->getLatitude() - ] + + $data['status'] = APIRiderStatus::RIDER_PICK_UP; + // TODO: fix this to actual location of rider + $data['rider'] = [ + 'id' => $rider->getID(), + 'name' => $rider->getFullName(), + 'plate_num' => $rider->getPlateNumber(), + 'contact_num' => $rider->getContactNumber(), + 'image_url' => $image_url, + 'location' => [ + 'long' => $coord->getLongitude(), + 'lat' => $coord->getLatitude() ] - ]); + ]; return $res->getReturnResponse(); } From 28b298dbb4203be9fc7cd4d0d247554b887d015a Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 9 Aug 2018 04:53:09 +0800 Subject: [PATCH 4/9] Add event log entries for rider api events #162 --- src/Controller/RAPIController.php | 53 ++++++++++++++++++++++++------- src/Ramcar/JOEventType.php | 6 ++++ 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/Controller/RAPIController.php b/src/Controller/RAPIController.php index abe6fc8a..3d38a15a 100644 --- a/src/Controller/RAPIController.php +++ b/src/Controller/RAPIController.php @@ -466,11 +466,19 @@ class RAPIController extends Controller // set jo status to in transit $jo->setStatus(JOStatus::IN_TRANSIT); - $em->flush(); // TODO: send mqtt event (?) - // TODO: add event + // add event log + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_ACCEPT) + ->setJobOrder($jo) + ->setRider($rider); + $em->persist($event); + + $em->flush(); return $res->getReturnResponse(); } @@ -483,13 +491,12 @@ class RAPIController extends Controller if ($res->isError()) return $res->getReturnResponse(); - $rider = $this->session->getRider(); - // $jo->cancel("rider cancelled"); // requeue it, instead of cancelling it $jo->requeue(); - // add event + // add event log + $rider = $this->session->getRider(); $event = new JOEvent(); $event->setDateHappen(new DateTime()) ->setTypeID(JOEventType::REQUEUE) @@ -524,6 +531,16 @@ class RAPIController extends Controller // set jo status to in progress $jo->setStatus(JOStatus::IN_PROGRESS); + + // add event log + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_ARRIVE) + ->setJobOrder($jo) + ->setRider($rider); + $em->persist($event); + $em->flush(); // send mqtt event @@ -541,7 +558,6 @@ class RAPIController extends Controller ]; $mclient->sendEvent($jo, $payload); - // TODO: add event return $res->getReturnResponse(); } @@ -563,6 +579,15 @@ class RAPIController extends Controller */ $jo->fulfill(); + // add event log + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::FULFILL) + ->setJobOrder($jo) + ->setRider($rider); + $em->persist($event); + $em->flush(); // send mqtt event (fulfilled) @@ -579,9 +604,6 @@ class RAPIController extends Controller ]; $mclient->sendEvent($jo, $payload); - - // TODO: add event - return $res->getReturnResponse(); } @@ -775,10 +797,17 @@ class RAPIController extends Controller // save invoice $jo->setInvoice($invoice); $em->persist($invoice); + + // add event log + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_EDIT) + ->setJobOrder($jo) + ->setRider($rider); + $em->persist($event); + $em->flush(); - - // TODO: add event - // TODO: send mqtt event (?) return $res->getReturnResponse(); diff --git a/src/Ramcar/JOEventType.php b/src/Ramcar/JOEventType.php index 73db12ef..3929c24e 100644 --- a/src/Ramcar/JOEventType.php +++ b/src/Ramcar/JOEventType.php @@ -11,6 +11,9 @@ class JOEventType extends NameValue const FULFILL = 'fulfill'; const OPEN_EDIT = 'open_edit'; const REQUEUE = 'requeue'; + const RIDER_ACCEPT = 'accept'; + const RIDER_ARRIVE = 'arrive'; + const RIDER_EDIT = 'rider_edit'; const COLLECTION = [ 'create' => 'Created', @@ -20,5 +23,8 @@ class JOEventType extends NameValue 'fulfill' => 'Fulfilled', 'open_edit' => 'Open Edit', 'requeue' => 'Requeue', + 'accept' => 'Rider Accept', + 'arrive' => 'Rider Arrive', + 'rider_edit' => 'Rider Edit', ]; } From 57eef0a0a44656b078f76cc3d6c077bdeb45b41f Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 9 Aug 2018 05:15:50 +0800 Subject: [PATCH 5/9] Replace filler confirmation code with randomly generated one in user api #162 --- src/Controller/APIController.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Controller/APIController.php b/src/Controller/APIController.php index 194c853b..812a2658 100644 --- a/src/Controller/APIController.php +++ b/src/Controller/APIController.php @@ -193,6 +193,11 @@ class APIController extends Controller return $res->getReturnResponse(); } + protected function generateConfirmCode() + { + return sprintf("%06d", mt_rand(100000, 999999)); + } + public function confirmNumber(RisingTideGateway $rt, Request $req) { // check parameters @@ -213,9 +218,9 @@ class APIController extends Controller // TODO: validate phone number - // TODO: generate code and save - // use '123456' for now - $code = '123456'; + // generate code and save + // $code = '123456'; + $code = $this->generateConfirmCode(); $this->session->setConfirmCode($code) ->setPhoneNumber($phone_number); $em->flush(); From 5b323e155bc38049970fd825accb6a33165a9af4 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 9 Aug 2018 05:39:13 +0800 Subject: [PATCH 6/9] Add event log entries for user api JO calls #162 --- src/Controller/APIController.php | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/Controller/APIController.php b/src/Controller/APIController.php index 812a2658..5ea8a578 100644 --- a/src/Controller/APIController.php +++ b/src/Controller/APIController.php @@ -20,6 +20,7 @@ use App\Ramcar\WarrantyClass; use App\Ramcar\APIRiderStatus; use App\Ramcar\TransactionOrigin; use App\Ramcar\TradeInType; +use App\Ramcar\JOEventType; use App\Service\InvoiceCreator; use App\Service\RisingTideGateway; @@ -34,6 +35,7 @@ use App\Entity\JobOrder; use App\Entity\Promo; use App\Entity\Battery; use App\Entity\RiderRating; +use App\Entity\JOEvent; use DateTime; @@ -888,6 +890,14 @@ class APIController extends Controller $em->persist($jo); $em->persist($invoice); + + // add event log + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::CREATE) + ->setJobOrder($jo); + $em->persist($event); + $em->flush(); // make invoice json data @@ -1311,11 +1321,13 @@ class APIController extends Controller $cancel_reason = $req->request->get('reason'); $jo->cancel($cancel_reason); - /* - $jo->setStatus(JOStatus::CANCELLED) - ->setDateCancel(new DateTime()) - ->setCancelReason($cancel_reason); - */ + + // add event log + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::CANCEL) + ->setJobOrder($jo); + $em->persist($event); $em->flush(); From bbc6989a668d37a418edb790b0f73b857716b7c0 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Fri, 10 Aug 2018 08:06:29 +0800 Subject: [PATCH 7/9] Add jo invoice user api call #162 --- config/routes/api.yaml | 5 +++ src/Controller/APIController.php | 75 ++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/config/routes/api.yaml b/config/routes/api.yaml index a47df74b..50e50957 100644 --- a/config/routes/api.yaml +++ b/config/routes/api.yaml @@ -100,6 +100,11 @@ api_jo_history: controller: App\Controller\APIController:getJOHistory methods: [GET] +api_jo_invoice: + path: /api/job_order/invoice + controller: App\Controller\APIController:getJOInvoice + methods: [GET] + api_device_id: path: /api/device_id controller: App\Controller\APIController:updateDeviceID diff --git a/src/Controller/APIController.php b/src/Controller/APIController.php index 5ea8a578..7dc867f8 100644 --- a/src/Controller/APIController.php +++ b/src/Controller/APIController.php @@ -1278,6 +1278,81 @@ class APIController extends Controller return $res->getReturnResponse(); } + public function getJOInvoice(Request $req) + { + $required_params = [ + 'jo_id', + ]; + $em = $this->getDoctrine()->getManager(); + $res = $this->checkParamsAndKey($req, $em, $required_params); + if ($res->isError()) + return $res->getReturnResponse(); + + // get job order + $jo_id = $req->query->get('jo_id'); + $jo = $em->getRepository(JobOrder::class)->find($jo_id); + if ($jo == null) + { + $res->setError(true) + ->setErrorMessage('No job order found'); + return $res->getReturnResponse(); + } + + // get customer + $cust = $this->session->getCustomer(); + if ($cust == null) + { + $res->setError(true) + ->setErrorMessage('No customer information found'); + return $res->getReturnResponse(); + } + + // check that the customer owns the job order + $jo_cust = $jo->getCustomer(); + if ($jo_cust->getID() != $cust->getID()) + { + $res->setError(true) + ->setErrorMessage('Job order was not initiated by customer'); + return $res->getReturnResponse(); + } + + $inv = $jo->getInvoice(); + + // 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, + ]; + } + + $data = [ + 'invoice' => [ + 'discount' => $inv->getDiscount(), + 'trade_in' => $inv->getTradeIn(), + 'total_price' => $inv->getTotalPrice(), + 'vat' => $inv->getVat(), + 'items' => $inv_items, + ], + ]; + + + $res->setData($data); + + return $res->getReturnResponse(); + } + public function cancelJobOrder(Request $req, MQTTClient $mclient) { $required_params = [ From a74e73f99c0ccd4b11c9b3695ee3f41ad636d8aa Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Fri, 10 Aug 2018 08:54:23 +0800 Subject: [PATCH 8/9] Add skeleton method for hub arrive rider api call #162 --- config/routes/rider_api.yaml | 5 +++++ src/Controller/RAPIController.php | 26 ++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/config/routes/rider_api.yaml b/config/routes/rider_api.yaml index 2f61be21..bd38c492 100644 --- a/config/routes/rider_api.yaml +++ b/config/routes/rider_api.yaml @@ -40,6 +40,11 @@ rapi_payment: controller: App\Controller\RAPIController::payment methods: [POST] +rapi_hub_arrive: + path: /rapi/hub_arrive + controller: App\Controller\RAPIController::hubArrive + methods: [POST] + rapi_promos: path: /rapi/promos controller: App\Controller\RAPIController::getPromos diff --git a/src/Controller/RAPIController.php b/src/Controller/RAPIController.php index 3d38a15a..37ccdcc2 100644 --- a/src/Controller/RAPIController.php +++ b/src/Controller/RAPIController.php @@ -562,6 +562,30 @@ class RAPIController extends Controller return $res->getReturnResponse(); } + public function hubArrive(Request $req) + { + $required_params = []; + $em = $this->getDoctrine()->getManager(); + $res = $this->checkParamsAndKey($req, $em, $required_params); + if ($res->isError()) + return $res->getReturnResponse(); + + // are we logged in? + if (!$this->session->hasRider()) + { + $res->setError(true) + ->setErrorMessage('No logged in rider.'); + return $res->getReturnResponse(); + } + + // TODO: tag rider as available + + $em->flush(); + + + return $res->getReturnResponse(); + } + public function payment(Request $req, MQTTClient $mclient) { $em = $this->getDoctrine()->getManager(); @@ -588,6 +612,8 @@ class RAPIController extends Controller ->setRider($rider); $em->persist($event); + // TODO: tag rider as unavailable + $em->flush(); // send mqtt event (fulfilled) From 93da2003f0d0c6a77dc25f8cba1be18c9a621bfa Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Fri, 10 Aug 2018 10:21:02 +0800 Subject: [PATCH 9/9] Add privacy flags in get user info api call #162 --- src/Controller/APIController.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Controller/APIController.php b/src/Controller/APIController.php index 7dc867f8..a61ea970 100644 --- a/src/Controller/APIController.php +++ b/src/Controller/APIController.php @@ -321,6 +321,8 @@ class APIController extends Controller $data = [ 'first_name' => $cust->getFirstName(), 'last_name' => $cust->getLastName(), + 'priv_third_party' => $cust->getPrivacyThirdParty(), + 'priv_promo' => $cust->getPrivacyPromo(), ]; $res->setData($data);