Merge branch '617-migrate-rider-api' into 'master-fix'
Resolve "Migrate Rider API" See merge request jankstudio/resq!730
This commit is contained in:
commit
e271034331
20 changed files with 2261 additions and 21 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
97
config/routes/capi_rider.yaml
Normal file
97
config/routes/capi_rider.yaml
Normal 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]
|
||||
|
||||
|
|
@ -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]
|
||||
|
||||
|
|
|
|||
92
src/Command/CreateRiderAPIUserCommand.php
Normal file
92
src/Command/CreateRiderAPIUserCommand.php
Normal 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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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']);
|
||||
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
1311
src/Controller/CAPI/RiderAppController.php
Normal file
1311
src/Controller/CAPI/RiderAppController.php
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
134
src/Entity/RiderAPISession.php
Normal file
134
src/Entity/RiderAPISession.php
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
41
src/Ramcar/DeliveryStatus.php
Normal file
41
src/Ramcar/DeliveryStatus.php
Normal 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',
|
||||
];
|
||||
}
|
||||
|
||||
|
|
@ -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',
|
||||
];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 = [];
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
Loading…
Reference in a new issue