diff --git a/config/routes/rider_api.yaml b/config/routes/rider_api.yaml index bd38c492..b38cd6ae 100644 --- a/config/routes/rider_api.yaml +++ b/config/routes/rider_api.yaml @@ -64,3 +64,34 @@ rapi_available: path: /rapi/available controller: App\Controller\RAPIController::available methods: [POST] + +rapi_hub_depart: + path: /rapi/hub_depart + controller: App\Controller\RAPIController::hubDepart + methods: [POST] + +rapi_pre_hub_depart: + path: /rapi/pre_hub_depart + controller: App\Controller\RAPIController::preHubDepart + methods: [POST] + +rapi_pre_hub_arrive: + path: /rapi/pre_hub_arrive + controller: App\Controller\RAPIController::preHubArrive + methods: [POST] + +rapi_post_hub_depart: + path: /rapi/post_hub_depart + controller: App\Controller\RAPIController::postHubDepart + methods: [POST] + +rapi_post_hub_arrive: + path: /rapi/post_hub_arrive + controller: App\Controller\RAPIController::postHubArrive + methods: [POST] + +rapi_jo_start: + path: /rapi/start + controller: App\Controller\RAPIController::startJobOrder + methods: [POST] + diff --git a/src/Controller/RAPIController.php b/src/Controller/RAPIController.php index 3b8bdab1..a818e9a7 100644 --- a/src/Controller/RAPIController.php +++ b/src/Controller/RAPIController.php @@ -300,4 +300,136 @@ class RAPIController extends Controller // response return $res->getReturnResponse(); } + + public function hubDepart(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->hubDepart($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function preHubArrive(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->preHubArrive($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function preHubDepart(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->preHubDepart($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function postHubArrive(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->postHubArrive($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + return $res->getReturnResponse(); + } + + public function postHubDepart(Request $req, RiderAPIHandlerInterface $rapi_handler) + { + $res = new APIResult(); + + $data = $rapi_handler->postHubDepart($req); + + if (isset($data['error'])) + { + $message = $data['error']; + + $res->setError(true) + ->setErrorMessage($message); + } + else + { + $res->setData($data); + } + + // response + 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/Entity/Rider.php b/src/Entity/Rider.php index 502d93bc..8a2ed9ea 100644 --- a/src/Entity/Rider.php +++ b/src/Entity/Rider.php @@ -120,6 +120,15 @@ class Rider */ protected $sessions; + // current job order + // NOTE: for forgotten reasons, we don't set active_job_order. + // but we now need rider's current JO for the time stamp events + /** + * @ORM\OneToOne(targetEntity="JobOrder") + * @ORM\JoinColumn(name="current_jo_id", referencedColumnName="id") + */ + protected $current_job_order; + public function __construct() { $this->job_orders = new ArrayCollection(); @@ -132,6 +141,7 @@ class Rider $this->password = ''; $this->active_job_order = null; + $this->current_job_order = null; } public function getID() @@ -371,4 +381,15 @@ class Rider $map_label = $this->first_name .' ' . $this->last_name; return $map_label; } + + public function setCurrentJobOrder(JobOrder $jo = null) + { + $this->current_job_order = $jo; + return $this; + } + + public function getCurrentJobOrder() + { + return $this->current_job_order; + } } diff --git a/src/Ramcar/JOEventType.php b/src/Ramcar/JOEventType.php index 3929c24e..e530679d 100644 --- a/src/Ramcar/JOEventType.php +++ b/src/Ramcar/JOEventType.php @@ -4,16 +4,24 @@ namespace App\Ramcar; class JOEventType 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_ARRIVE = 'arrive'; - const RIDER_EDIT = 'rider_edit'; + 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_ARRIVE = 'arrive'; + const RIDER_EDIT = 'rider_edit'; + const RIDER_DEPART_HUB = 'rider_depart_hub'; + const RIDER_ARRIVE_HUB_PRE_JO = 'rider_arrive_hub_pre_jo'; + const RIDER_DEPART_HUB_PRE_JO = 'rider_depart_hub_pre_jo'; + const RIDER_START = 'rider_start'; + const RIDER_END = 'rider_end'; + const RIDER_ARRIVE_HUB_POST_JO = 'rider_arrive_hub_post_jo'; + const RIDER_DEPART_HUB_POST_JO = 'rider_depart_hub_post_jo'; + const RIDER_ARRIVE_HUB = 'rider_arrive_hub'; const COLLECTION = [ 'create' => 'Created', diff --git a/src/Service/RiderAPIHandler/ResqRiderAPIHandler.php b/src/Service/RiderAPIHandler/ResqRiderAPIHandler.php index 10678139..db83076b 100644 --- a/src/Service/RiderAPIHandler/ResqRiderAPIHandler.php +++ b/src/Service/RiderAPIHandler/ResqRiderAPIHandler.php @@ -33,6 +33,7 @@ use App\Entity\Promo; use App\Entity\Battery; use App\Entity\BatteryModel; use App\Entity\BatterySize; +use App\Entity\JobOrder; use DateTime; @@ -408,8 +409,15 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface // TODO: send mqtt event (?) - // add event log $rider = $this->session->getRider(); + + // set rider's current job order + $rider->setCurrentJobOrder($jo); + + // set rider to unavailable + $rider->setAvailable(false); + + // add event log $event = new JOEvent(); $event->setDateHappen(new DateTime()) ->setTypeID(JOEventType::RIDER_ACCEPT) @@ -433,8 +441,11 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface // requeue it, instead of cancelling it $jo->requeue(); - // add event log $rider = $this->session->getRider(); + // set rider's current job order to null + $rider->setCurrentJobOrder(); + + // add event log $event = new JOEvent(); $event->setDateHappen(new DateTime()) ->setTypeID(JOEventType::REQUEUE) @@ -512,10 +523,26 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + $rider = $this->session->getRider(); + + // get rider's current job order + $jo = $rider->getCurrentJobOrder(); + + $timestamp_event = new JOEvent(); + $timestamp_event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_ARRIVE_HUB) + ->setJobOrder($jo) + ->setRider($rider); + + $this->em->persist($timestamp_event); + // tag rider as available $rider = $this->session->getRider(); $rider->setAvailable(true); + // set rider's current job order to null + $rider->setCurrentJobOrder(); + $this->em->flush(); return $data; @@ -544,8 +571,20 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface ->setTypeID(JOEventType::FULFILL) ->setJobOrder($jo) ->setRider($rider); - $this->em->persist($event); + $timestamp_event = new JOEvent(); + $timestamp_event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_END) + ->setJobOrder($jo) + ->setRider($rider); + + $this->em->persist($event); + $this->em->persist($timestamp_event); + + // NOTE: fix for the rider being assigned to other JO + // while on another JO. + // TODO: comment this out. Rider needs to be set to unavailable + // when rider accepts the JO // tag rider as unavailable $rider->setAvailable(false); @@ -845,6 +884,162 @@ class ResqRiderAPIHandler implements RiderAPIHandlerInterface return $data; } + public function hubDepart(Request $req) + { + $required_params = []; + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + return $data; + + $rider = $this->session->getRider(); + + // get rider's current job order + $jo = $rider->getCurrentJobOrder(); + + // create time stamp event for JO event + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_DEPART_HUB) + ->setJobOrder($jo) + ->setRider($rider); + + $this->em->persist($event); + $this->em->flush(); + + return $data; + } + + public function preHubArrive(Request $req) + { + $required_params = []; + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + return $data; + + $rider = $this->session->getRider(); + + // get rider's current job order + $jo = $rider->getCurrentJobOrder(); + + // create time stamp event for JO event + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_ARRIVE_HUB_PRE_JO) + ->setJobOrder($jo) + ->setRider($rider); + + $this->em->persist($event); + $this->em->flush(); + + return $data; + } + + public function preHubDepart(Request $req) + { + $required_params = []; + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + return $data; + + $rider = $this->session->getRider(); + + // get rider's current job order + $jo = $rider->getCurrentJobOrder(); + + // create time stamp event for JO event + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_DEPART_HUB_PRE_JO) + ->setJobOrder($jo) + ->setRider($rider); + + $this->em->persist($event); + $this->em->flush(); + + return $data; + } + + public function startJobOrder(Request $req) + { + $required_params = []; + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + return $data; + + $rider = $this->session->getRider(); + + // get rider's current job order + $jo = $rider->getCurrentJobOrder(); + + // create time stamp event for JO event + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_START) + ->setJobOrder($jo) + ->setRider($rider); + + $this->em->persist($event); + $this->em->flush(); + + return $data; + } + + public function postHubArrive(Request $req) + { + $required_params = []; + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + return $data; + + $rider = $this->session->getRider(); + + // get rider's current job order + $jo = $rider->getCurrentJobOrder(); + + // create time stamp event for JO event + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_ARRIVE_HUB_POST_JO) + ->setJobOrder($jo) + ->setRider($rider); + + $this->em->persist($event); + $this->em->flush(); + + return $data; + } + + public function postHubDepart(Request $req) + { + $required_params = []; + $data = $this->checkParamsAndKey($req, $required_params); + if (isset($data['error'])) + return $data; + + $rider = $this->session->getRider(); + + // get rider's current job order + $jo = $rider->getCurrentJobOrder(); + + // create time stamp event for JO event + $rider = $this->session->getRider(); + $event = new JOEvent(); + $event->setDateHappen(new DateTime()) + ->setTypeID(JOEventType::RIDER_DEPART_HUB_POST_JO) + ->setJobOrder($jo) + ->setRider($rider); + + $this->em->persist($event); + $this->em->flush(); + + return $data; + } + protected function checkMissingParameters(Request $req, $params = []) { $missing = [];