Merge branch '617-migrate-rider-api' into 'master-fix'

Resolve "Migrate Rider API"

See merge request jankstudio/resq!730
This commit is contained in:
Kendrick Chan 2021-08-24 08:59:04 +00:00
commit e271034331
20 changed files with 2261 additions and 21 deletions

View file

@ -53,6 +53,18 @@ class User extends BaseUser
*/
protected $roles;
// rider linked to user
// NOTE: we're directly linking this only because we don't have to care about other apps using this library
/**
* @ORM\OneToOne(targetEntity="App\Entity\Rider", mappedBy="api_user")
*/
protected $rider;
/**
* @ORM\Column(type="json")
*/
protected $metadata;
public function __construct()
{
parent::__construct();
@ -63,6 +75,7 @@ class User extends BaseUser
// set date created
$this->date_create = new DateTime();
$this->metadata = [];
}
public function getID()
@ -140,9 +153,34 @@ class User extends BaseUser
return $this->generateKey('secret');
}
public function setMetadata($meta)
{
$this->metadata = $meta;
return $this;
}
public function getMetadata()
{
if ($this->metadata == null)
return [];
return $this->metadata;
}
protected function generateKey($prefix = '')
{
return md5(uniqid($prefix, true));
}
public function setRider($rider)
{
$this->rider = $rider;
return $this;
}
public function getRider()
{
return $this->rider;
}
}

View file

@ -16,6 +16,11 @@ security:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
new_rider_api_login:
pattern: ^\/rider_api\/login$
methods: [POST]
security: false
login:
pattern: ^\/login$
methods: [GET]
@ -46,6 +51,14 @@ security:
provider: api_key_user_provider
user_checker: Catalyst\AuthBundle\Service\UserChecker
new_rider_api:
pattern: ^\/rider_api\/
stateless: true
simple_preauth:
authenticator: Catalyst\APIBundle\Security\APIKeyAuthenticator
provider: api_key_user_provider
user_checker: Catalyst\AuthBundle\Service\UserChecker
main:
provider: user_provider
form_login:

View file

@ -0,0 +1,97 @@
# rider app api
capi_rider_register:
path: /rider_api/register
controller: App\Controller\CAPI\RiderAppController::register
methods: [POST]
capi_rider_login:
path: /rider_api/login
controller: App\Controller\CAPI\RiderAppController::login
methods: [POST]
capi_rider_logout:
path: /rider_api/logout
controller: App\Controller\CAPI\RiderAppController::logout
methods: [POST]
capi_rider_jo_get:
path: /rider_api/joborder
controller: App\Controller\CAPI\RiderAppController::getJobOrder
methods: [GET]
capi_rider_jo_accept:
path: /rider_api/accept
controller: App\Controller\CAPI\RiderAppController::acceptJobOrder
methods: [POST]
capi_rider_jo_cancel:
path: /rider_api/cancel
controller: App\Controller\CAPI\RiderAppController::cancelJobOrder
methods: [POST]
capi_rider_arrive:
path: /rider_api/arrive
controller: App\Controller\CAPI\RiderAppController::arrive
methods: [POST]
capi_rider_payment:
path: /rider_api/payment
controller: App\Controller\CAPI\RiderAppController::payment
methods: [POST]
capi_rider_hub_arrive:
path: /rider_api/hub_arrive
controller: App\Controller\CAPI\RiderAppController::hubArrive
methods: [POST]
capi_rider_promos:
path: /rider_api/promos
controller: App\Controller\CAPI\RiderAppController::getPromos
methods: [GET]
capi_rider_batteries:
path: /rider_api/batteries
controller: App\Controller\CAPI\RiderAppController::getBatteries
methods: [GET]
capi_rider_change_service:
path: /rider_api/service
controller: App\Controller\CAPI\RiderAppController::changeService
methods: [POST]
capi_rider_available:
path: /rider_api/available
controller: App\Controller\CAPI\RiderAppController::available
methods: [POST]
capi_rider_hub_depart:
path: /rider_api/hub_depart
controller: App\Controller\CAPI\RiderAppController::hubDepart
methods: [POST]
capi_rider_pre_hub_depart:
path: /rider_api/pre_hub_depart
controller: App\Controller\CAPI\RiderAppController::preHubDepart
methods: [POST]
capi_rider_pre_hub_arrive:
path: /rider_api/pre_hub_arrive
controller: App\Controller\CAPI\RiderAppController::preHubArrive
methods: [POST]
capi_rider_post_hub_depart:
path: /rider_api/post_hub_depart
controller: App\Controller\CAPI\RiderAppController::postHubDepart
methods: [POST]
capi_rider_post_hub_arrive:
path: /rider_api/post_hub_arrive
controller: App\Controller\CAPI\RiderAppController::postHubArrive
methods: [POST]
capi_rider_jo_start:
path: /rider_api/start
controller: App\Controller\CAPI\RiderAppController::startJobOrder
methods: [POST]

View file

@ -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]

View file

@ -0,0 +1,92 @@
<?php
namespace App\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Output\OutputInterface;
use Doctrine\ORM\EntityManagerInterface;
use Catalyst\APIBundle\Entity\User as APIUser;
use Catalyst\APIBundle\Entity\Role as APIRole;
use App\Entity\Rider;
use DateTime;
class CreateRiderAPIUserCommand extends Command
{
protected $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
parent::__construct();
}
protected function configure()
{
$this->setName('api:user-create-for-rider')
->setDescription('Create API users for existing riders.')
->setHelp('Creates API users for existing riders.')
->addArgument('role_id', InputArgument::REQUIRED, 'Role ID for api_user.');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
error_log('Creating api users...');
// get all existing riders
$riders = $this->em->getRepository(Rider::class)->findAll();
// get role for rider api user
$role_id = $input->getArgument('role_id');
$role = $this->em->getRepository(APIRole::class)->find($role_id);
if ($role == null)
{
error_log('Cannot find role with id ' . $role_id);
return 0;
}
foreach ($riders as $rider)
{
// skip riders who already have users
if ($rider->getAPIUser() != null)
continue;
// create api user for each rider
// no need to generate the keys.
// Secret and API keys are generated in constructor
$api_user = new APIUser();
// set enabled to true
$api_user->setEnabled(true);
// set name to rider's last name + first name
$rider_name = $rider->getFirstName() . ' ' . $rider->getLastName();
$api_user->setName($rider_name);
// set rider to api_user
$api_user->setRider($rider);
// set meta
$meta = ['rider_id' => $rider->getID()];
$api_user->setMetaData($meta);
// set role
$api_user->addRole($role);
// set rider's api user
$rider->setAPIUser($api_user);
$this->em->persist($api_user);
}
$this->em->flush();
return 0;
}
}

View file

@ -31,6 +31,7 @@ use App\Ramcar\AutoAssignStatus;
use App\Ramcar\WarrantySource;
use App\Ramcar\HubCriteria;
use App\Ramcar\CustomerSource;
use App\Ramcar\DeliveryStatus;
use App\Service\InvoiceGeneratorInterface;
use App\Service\RisingTideGateway;
@ -1061,6 +1062,7 @@ class APIController extends Controller implements LoggedController
// find nearest hubs
$nearest_hubs = $hub_select->find($hub_criteria);
$assigned_rider = null;
if (!empty($nearest_hubs))
{
// go through the hub list, find the nearest hub
@ -1071,7 +1073,6 @@ class APIController extends Controller implements LoggedController
$available_riders = $nearest_hub['hub']->getAvailableRiders();
if (count($available_riders) >= 1)
{
$assigned_rider = null;
if (count($available_riders) == 1)
{
$assigned_rider = $available_riders[0];
@ -1097,6 +1098,9 @@ class APIController extends Controller implements LoggedController
$assigned_rider->setAvailable(false);
// set rider's current job order
$assigned_rider->setCurrentJobOrder($jo);
// update redis hub_jo_count for hub
$hub_dist->incrementJoCountForHub($nearest_hub['hub']);
@ -2947,9 +2951,13 @@ class APIController extends Controller implements LoggedController
$jo->setRider($assigned_rider);
$jo->setStatus(JOStatus::ASSIGNED);
$jo->setStatusAutoAssign(AutoAssignStatus::HUB_AND_RIDER_ASSIGNED);
$jo->setDeliveryStatus(DeliveryStatus::RIDER_ASSIGN);
$assigned_rider->setAvailable(false);
// set rider's current job order
$assigned_rider->setCurrentJobOrder($jo);
// update redis hub_jo_count for hub
$hub_dist->incrementJoCountForHub($nearest_hub['hub']);

View file

@ -242,7 +242,7 @@ class APIRoleController extends Controller
if (!$row->isSuperAdmin())
{
// clear first
$row->clearACLAttributes();
$row->clearACLAccess();
// then add
$acl_attribs = $req->request->get('acl');

View file

@ -14,6 +14,8 @@ use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Catalyst\MenuBundle\Annotation\Menu;
use App\Entity\Rider;
class APIUserController extends Controller
{
/**
@ -135,6 +137,7 @@ class APIUserController extends Controller
// get roles
$em = $this->getDoctrine()->getManager();
$params['roles'] = $em->getRepository(APIRole::class)->findAll();
$params['riders'] = $em->getRepository(Rider::class)->findBy([], ['first_name' => 'asc']);
// response
return $this->render('api-user/form.html.twig', $params);
@ -149,9 +152,21 @@ class APIUserController extends Controller
$em = $this->getDoctrine()->getManager();
$obj = new APIUser();
// metadata
$rider_id = $req->request->get('rider_id');
$rider = $em->getRepository(Rider::class)->find($rider_id);
// TODO: check for null rider
$meta = ['rider_id' => $rider_id];
// set api user in rider
$rider->setAPIUser($obj);
// set and save values
$obj->setName($req->request->get('name'))
->setEnabled($req->request->get('enabled') ? true : false)
->setMetadata($meta)
->setRider($rider)
->clearRoles();
// set roles
@ -221,6 +236,7 @@ class APIUserController extends Controller
// get roles
$params['roles'] = $em->getRepository(APIRole::class)->findAll();
$params['riders'] = $em->getRepository(Rider::class)->findBy([], ['first_name' => 'asc']);
$params['obj'] = $obj;
@ -241,8 +257,21 @@ class APIUserController extends Controller
throw $this->createNotFoundException('The item does not exist');
// set and save values
// metadata
$rider_id = $req->request->get('rider_id');
$rider = $em->getRepository(Rider::class)->find($rider_id);
// TODO: check for null rider
$meta = $obj->getMetadata();
$meta['rider_id'] = $rider_id;
// set api user in rider
$rider->setAPIUser($obj);
$obj->setName($req->request->get('name'))
->setEnabled($req->request->get('enabled') ? true : false)
->setMetadata($meta)
->setRider($rider)
->clearRoles();
// set roles

File diff suppressed because it is too large Load diff

View file

@ -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();
}
}

View file

@ -359,6 +359,12 @@ class JobOrder
*/
protected $no_trade_in_reason;
// delivery status of the job order
/**
* @ORM\Column(type="string", length=30, nullable=true)
*/
protected $delivery_status;
public function __construct()
{
$this->date_create = new DateTime();
@ -1032,4 +1038,16 @@ class JobOrder
{
return $this->no_trade_in_reason;
}
public function setDeliveryStatus($delivery_status)
{
$this->delivery_status = $delivery_status;
return $this;
}
public function getDeliveryStatus()
{
return $this->delivery_status;
}
}

View file

@ -9,6 +9,7 @@ use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Criteria;
use App\Ramcar\JOStatus;
use Catalyst\APIBundle\Entity\User as APIUser;
/**
* @ORM\Entity
@ -120,6 +121,21 @@ 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;
/**
* @ORM\OneToOne(targetEntity="Catalyst\APIBundle\Entity\User", inversedBy="rider")
* @ORM\JoinColumn(name="api_user_id", referencedColumnName="id", nullable=true)
*/
protected $api_user;
public function __construct()
{
$this->job_orders = new ArrayCollection();
@ -132,6 +148,8 @@ class Rider
$this->password = '';
$this->active_job_order = null;
$this->current_job_order = null;
$this->api_user = null;
}
public function getID()
@ -371,4 +389,26 @@ 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;
}
public function setAPIUser($user)
{
$this->api_user = $user;
return $this;
}
public function getAPIUser()
{
return $this->api_user;
}
}

View file

@ -0,0 +1,134 @@
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use DateTime;
/**
* @ORM\Entity
* @ORM\Table(name="rider_api_session")
*/
class RiderAPISession
{
// unique id
/**
* @ORM\Id
* @ORM\Column(type="string", length=13)
*/
protected $id;
// device id or push id used by device
/**
* @ORM\Column(type="string", length=50)
*/
protected $device_push_id;
// link to customer
/**
* @ORM\ManyToOne(targetEntity="Rider", inversedBy="api_sessions")
* @ORM\JoinColumn(name="rider_id", referencedColumnName="id", nullable=true)
*/
protected $rider;
// phone number
/**
* @ORM\Column(type="string", length=12, nullable=true)
*/
protected $phone_number;
// is this device active
/**
* @ORM\Column(type="boolean")
*/
protected $is_active;
// capi user id loosely associated to mobile user
/**
* @ORM\Column(type="integer", nullable=true)
*/
protected $capi_user_id;
public function __construct()
{
// default date generated to now
$this->id = $this->generateKeyID();
$this->rider = null;
$this->is_active = true;
$this->capi_user_id = 0;
}
public function generateKeyID()
{
// use uniqid for now, since primary key dupes will trigger exceptions
return uniqid();
}
public function getID()
{
return $this->id;
}
public function setDevicePushID($id)
{
$this->device_push_id = $id;
return $this;
}
public function getDevicePushID()
{
return $this->device_push_id;
}
public function setRider(Rider $rider = null)
{
$this->rider = $rider;
return $this;
}
public function getRider()
{
return $this->rider;
}
public function setPhoneNumber($num)
{
$this->phone_number = $num;
return $this;
}
public function getPhoneNumber()
{
return $this->phone_number;
}
public function setActive($flag = true)
{
$this->is_active = $flag;
return $this;
}
public function isActive()
{
return $this->is_active;
}
public function hasRider()
{
if ($this->rider == null)
return false;
return true;
}
public function setCapiUserId($capi_user_id)
{
$this->capi_user_id = $capi_user_id;
}
public function getCapiUserId()
{
return $this->capi_user_id;
}
}

View file

@ -0,0 +1,41 @@
<?php
namespace App\Ramcar;
class DeliveryStatus extends NameValue
{
const RIDER_ASSIGN = 'rider_assign';
const REQUEUE = 'requeue';
const RIDER_ACCEPT = 'rider_accept';
const RIDER_ARRIVE = 'rider_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 CANCELLED = 'cancelled';
const FULFILLED = 'fulfilled';
const COLLECTION = [
'rider_assign' => 'Assigned Rider',
'requeue' => 'Requeue',
'accept' => 'Rider Accept',
'arrive' => 'Rider Arrive',
'rider_edit' => 'Rider Edit',
'rider_depart_hub' => 'Rider Depart Hub',
'rider_arrive_hub_pre_jo' => 'Rider Arrive Hub Pre JO',
'rider_depart_hub_pre_jo' => 'Rider Depart Hub Pre JO',
'rider_start' => 'Rider Start',
'rider_end' => 'Rider End',
'rider_arrive_hub_post_jo' => 'Rider Arrive Hub Post JO',
'rider_depart_hub_post_jo' => 'Rider Depart Hub Post JO',
'rider_arrive_hub' => 'Rider Arrive Hub',
'cancelled' => 'Cancelled',
'fulfilled' => 'Fulfilled',
];
}

View file

@ -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',
@ -26,5 +34,13 @@ class JOEventType extends NameValue
'accept' => 'Rider Accept',
'arrive' => 'Rider Arrive',
'rider_edit' => 'Rider Edit',
'rider_depart_hub' => 'Rider Depart Hub',
'rider_arrive_hub_pre_jo' => 'Rider Arrive Hub Pre JO',
'rider_depart_hub_pre_jo' => 'Rider Depart Hub Pre JO',
'rider_start' => 'Rider Start',
'rider_end' => 'Rider End',
'rider_arrive_hub_post_jo' => 'Rider Arrive Hub Post JO',
'rider_depart_hub_post_jo' => 'Rider Depart Hub Post JO',
'rider_arrive_hub' => 'Rider Arrive Hub',
];
}

View file

@ -123,7 +123,9 @@ class ResqInvoiceGenerator implements InvoiceGeneratorInterface
// get current user
$user = $this->security->getUser();
if ($user != null)
// check if user is User or APIUser
//if ($user != null)
if ($user instanceof User)
{
$invoice->setCreatedBy($user);
}

View file

@ -43,6 +43,7 @@ use App\Ramcar\NoTradeInReason;
use App\Ramcar\WillingToWaitContent;
use App\Ramcar\WarrantySource;
use App\Ramcar\HubCriteria;
use App\Ramcar\DeliveryStatus;
use App\Service\InvoiceGeneratorInterface;
use App\Service\JobOrderHandlerInterface;
@ -932,7 +933,8 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
->setLandmark($req->request->get('landmark'))
->setWillWait($req->request->get('flag_willing_to_wait'))
->setReasonNotWait($reason)
->setNotWaitingNotes($more_reason);
->setNotWaitingNotes($more_reason)
->setDeliveryStatus(DeliveryStatus::RIDER_ASSIGN);
if ($user != null)
{
@ -951,7 +953,10 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
if (empty($error_array))
{
// set rider unavailable
$rider->setAvailable(false);
// $rider->setAvailable(false);
// set rider's current job order
$rider->setCurrentJobOrder($obj);
// the event
$event = new JOEvent();
@ -1028,7 +1033,8 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
->setLandmark($req->request->get('landmark'))
->setWillWait($req->request->get('flag_willing_to_wait'))
->setReasonNotWait($reason)
->setNotWaitingNotes($more_reason);
->setNotWaitingNotes($more_reason)
->setDeliveryStatus(DeliveryStatus::FULFILLED);
// validate
$errors = $this->validator->validate($obj);
@ -1142,7 +1148,10 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
throw new NotFoundHttpException('The item does not exist');
$cancel_reason = $req->request->get('cancel_reason');
error_log($cancel_reason);
//error_log('cancel_reason ' . $cancel_reason);
$obj->setDeliveryStatus(DeliveryStatus::CANCELLED);
$obj->cancel($cancel_reason);
// the event
@ -1464,6 +1473,13 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
];
$mclient->sendRiderEvent($obj, $rider_payload);
// need to unset first rider's current job order
$old_rider = $obj->getRider();
$old_rider->setCurrentJobOrder();
// set available flag for first rider
$old_rider->setAvailable(true);
// coordinates
$point = new Point($req->request->get('coord_lng'), $req->request->get('coord_lat'));
@ -1484,7 +1500,8 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
->setLandmark($req->request->get('landmark'))
->setWillWait($req->request->get('flag_willing_to_wait'))
->setReasonNotWait($reason)
->setNotWaitingNotes($more_reason);
->setNotWaitingNotes($more_reason)
->setDeliveryStatus(DeliveryStatus::RIDER_ASSIGN);
if ($user != null)
{
@ -1505,6 +1522,12 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
// check if any errors were found
if (empty($error_array))
{
// set new rider's current job order
$rider->setCurrentJobOrder($obj);
// set new rider's availability to false
$rider->setAvailable(false);
// add event
$event = new JOEvent();
$event->setDateHappen(new DateTime())

View file

@ -72,6 +72,8 @@ class MQTTClient
if ($rider == null)
return;
/*
// NOTE: this is for the old rider app
// check if rider has sessions
$sessions = $rider->getSessions();
if (count($sessions) == 0)
@ -84,5 +86,9 @@ class MQTTClient
$channel = self::RIDER_PREFIX . $sess_id;
$this->publish($channel, json_encode($payload));
}
*/
// NOTE: this is for the new rider app
$this->publish('rider/' . $rider->getID(), json_encode($payload));
}
}

View file

@ -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 = [];

View file

@ -45,6 +45,20 @@
</div>
</div>
</div>
<div class="form-group m-form__group row no-border">
<div class="col-lg-8">
<label data-field="brand">
Rider (Matched with User for Rider App Purposes)
</label>
<select class="form-control m-input" id="rider_id" name="rider_id">
<option value=""></option>
{% for rider in riders %}
<option value="{{ rider.getID }}"{{ rider.getID == obj.getRider.getID|default(0) ? ' selected' }}>{{ rider.getFirstName ~ ' ' ~ rider.getLastName }}</option>
{% endfor %}
</select>
<div class="form-control-feedback hide" data-field="brand"></div>
</div>
</div>
<div class="form-group m-form__group row no-border">
<div class="col-lg-12">
<span class="m-switch m-switch--icon block-switch">