Modify input parameter for getNearestHubAndSlots. Add 4-5 PM shift. Add slot id to response. Remove unused code. #389
This commit is contained in:
parent
9e9c5759bb
commit
383fc1ee0a
2 changed files with 161 additions and 546 deletions
|
|
@ -151,6 +151,6 @@ api_partner_review:
|
|||
methods: [POST]
|
||||
|
||||
api_nearest_hub_slots:
|
||||
path: /api/hub_slots/{jo_id}
|
||||
path: /api/hub_slots
|
||||
controller: App\Controller\APIController::getNearestHubAndSlots
|
||||
methods: [GET]
|
||||
|
|
|
|||
|
|
@ -57,6 +57,8 @@ use Exception;
|
|||
// mobile API
|
||||
class APIController extends Controller implements LoggedController
|
||||
{
|
||||
const RIDER_SLOT_ARRAY_LENGTH = 8;
|
||||
|
||||
protected $session;
|
||||
|
||||
public function __construct()
|
||||
|
|
@ -989,214 +991,119 @@ class APIController extends Controller implements LoggedController
|
|||
$invoice = $ic->generateInvoice($icrit);
|
||||
$jo->setInvoice($invoice);
|
||||
|
||||
// NOTE: Start of code for auto assign advance JO. Uncomment the whole IF snippet when implementing auto assign advance order JO
|
||||
/*
|
||||
// check if advance order
|
||||
// check for time when request came in
|
||||
$request_time_in_int = time();
|
||||
$start = '17:00';
|
||||
$end = '08:00';
|
||||
|
||||
$start_time = strtotime($start);
|
||||
$end_time = strtotime($end);
|
||||
|
||||
if (($request_time_in_int > $start_time) ||
|
||||
(($request_time_in_int < $start_time) && ($request_time_in_int < $end_time)))
|
||||
// assign hub and rider
|
||||
if (($jo->getServiceType() == ServiceType::BATTERY_REPLACEMENT_NEW) ||
|
||||
($jo->getServicetype() == ServiceType::BATTERY_REPLACEMENT_WARRANTY))
|
||||
{
|
||||
// advance order
|
||||
// assign hub and rider
|
||||
if (($jo->getServiceType() == ServiceType::BATTERY_REPLACEMENT_NEW) ||
|
||||
($jo->getServicetype() == ServiceType::BATTERY_REPLACEMENT_WARRANTY))
|
||||
{
|
||||
// get nearest hub
|
||||
// $nearest_hub = $this->findNearestHubWithInventory($jo, $batt, $em, $map_tools, $im);
|
||||
// TODO: when the inventory manager kicks in, create new function that finds the
|
||||
// the nearest hub with inventory and rider slot
|
||||
// convert to DateTime
|
||||
$nearest_hub = $this->findAdvanceNearestHub($jo, $request_time_in_int, $em, $map_tools);
|
||||
}
|
||||
else
|
||||
{
|
||||
$nearest_hub = $this->findAdvanceNearestHub($jo, $request_time_in_int, $em, $map_tools);
|
||||
}
|
||||
|
||||
if (!empty($nearest_hub))
|
||||
{
|
||||
$jo->setHub($nearest_hub);
|
||||
$jo->setStatus(JOStatus::RIDER_ASSIGN);
|
||||
}
|
||||
|
||||
$em->persist($jo);
|
||||
$em->persist($invoice);
|
||||
|
||||
// add event log for JO
|
||||
$event = new JOEvent();
|
||||
$event->setDateHappen(new DateTime())
|
||||
->setTypeID(JOEventType::CREATE)
|
||||
->setJobOrder($jo);
|
||||
$em->persist($event);
|
||||
|
||||
// check JO status
|
||||
if ($jo->getStatus() == JOStatus::RIDER_ASSIGN)
|
||||
{
|
||||
// add event logs for hub and rider assignments
|
||||
$hub_assign_event = new JOEvent();
|
||||
$hub_assign_event->setDateHappen(new DateTime())
|
||||
->setTypeID(JOEventType::HUB_ASSIGN)
|
||||
->setJobOrder($jo);
|
||||
|
||||
$em->persist($hub_assign_event);
|
||||
}
|
||||
|
||||
$em->flush();
|
||||
|
||||
// make invoice json data
|
||||
$invoice_data = [
|
||||
'total_price' => $invoice->getTotalPrice(),
|
||||
'vat_ex_price' => $invoice->getVATExclusivePrice(),
|
||||
'vat' => $invoice->getVAT(),
|
||||
'discount' => $invoice->getDiscount(),
|
||||
'trade_in' => $invoice->getTradeIn(),
|
||||
];
|
||||
$items = $invoice->getItems();
|
||||
$items_data = [];
|
||||
foreach ($items as $item)
|
||||
{
|
||||
$items_data[] = [
|
||||
'title' => $item->getTitle(),
|
||||
'qty' => $item->getQuantity() + 0,
|
||||
'price' => $item->getPrice() + 0.0,
|
||||
];
|
||||
}
|
||||
$invoice_data['items'] = $items_data;
|
||||
|
||||
// make job order data
|
||||
$data = [
|
||||
'jo_id' => $jo->getID(),
|
||||
'invoice' => $invoice_data
|
||||
];
|
||||
|
||||
// set data
|
||||
$res->setData($data);
|
||||
|
||||
// get nearest hub
|
||||
// $nearest_hub = $this->findNearestHubWithInventory($jo, $batt, $em, $map_tools, $im);
|
||||
$nearest_hub = $this->findNearestHub($jo, $em, $map_tools);
|
||||
}
|
||||
else
|
||||
{ */
|
||||
// NOTE: End of IF snippet for auto assign JO. Uncomment the whole IF snippet when implementing auto assign advance order JO
|
||||
// assign hub and rider
|
||||
if (($jo->getServiceType() == ServiceType::BATTERY_REPLACEMENT_NEW) ||
|
||||
($jo->getServicetype() == ServiceType::BATTERY_REPLACEMENT_WARRANTY))
|
||||
{
|
||||
// get nearest hub
|
||||
// $nearest_hub = $this->findNearestHubWithInventory($jo, $batt, $em, $map_tools, $im);
|
||||
$nearest_hub = $this->findNearestHub($jo, $em, $map_tools);
|
||||
}
|
||||
else
|
||||
{
|
||||
$nearest_hub = $this->findNearestHub($jo, $em, $map_tools);
|
||||
}
|
||||
{
|
||||
$nearest_hub = $this->findNearestHub($jo, $em, $map_tools);
|
||||
}
|
||||
|
||||
if (!empty($nearest_hub))
|
||||
if (!empty($nearest_hub))
|
||||
{
|
||||
//error_log('found nearest hub ' . $nearest_hub->getID());
|
||||
// assign rider
|
||||
$available_riders = $nearest_hub->getAvailableRiders();
|
||||
if (count($available_riders) > 0)
|
||||
{
|
||||
//error_log('found nearest hub ' . $nearest_hub->getID());
|
||||
// assign rider
|
||||
$available_riders = $nearest_hub->getAvailableRiders();
|
||||
if (count($available_riders) > 0)
|
||||
$assigned_rider = null;
|
||||
if (count($available_riders) > 1)
|
||||
{
|
||||
$assigned_rider = null;
|
||||
if (count($available_riders) > 1)
|
||||
// TODO: the setting of riders into an array
|
||||
// will no longer be necessary when the contents
|
||||
// of randomizeRider changes
|
||||
$riders = [];
|
||||
foreach ($available_riders as $rider)
|
||||
{
|
||||
// TODO: the setting of riders into an array
|
||||
// will no longer be necessary when the contents
|
||||
// of randomizeRider changes
|
||||
$riders = [];
|
||||
foreach ($available_riders as $rider)
|
||||
{
|
||||
$riders[] = $rider;
|
||||
}
|
||||
|
||||
$assigned_rider = $this->randomizeRider($riders);
|
||||
$riders[] = $rider;
|
||||
}
|
||||
else
|
||||
$assigned_rider = $available_riders[0];
|
||||
|
||||
//error_log('found rider ' . $assigned_rider->getID());
|
||||
$jo->setHub($nearest_hub);
|
||||
$jo->setRider($assigned_rider);
|
||||
$jo->setStatus(JOStatus::ASSIGNED);
|
||||
|
||||
$assigned_rider->setAvailable(false);
|
||||
$assigned_rider = $this->randomizeRider($riders);
|
||||
}
|
||||
else
|
||||
$assigned_rider = $available_riders[0];
|
||||
|
||||
//error_log('found rider ' . $assigned_rider->getID());
|
||||
$jo->setHub($nearest_hub);
|
||||
$jo->setRider($assigned_rider);
|
||||
$jo->setStatus(JOStatus::ASSIGNED);
|
||||
|
||||
$assigned_rider->setAvailable(false);
|
||||
}
|
||||
}
|
||||
|
||||
$em->persist($jo);
|
||||
$em->persist($invoice);
|
||||
$em->persist($jo);
|
||||
$em->persist($invoice);
|
||||
|
||||
// add event log for JO
|
||||
$event = new JOEvent();
|
||||
$event->setDateHappen(new DateTime())
|
||||
->setTypeID(JOEventType::CREATE)
|
||||
// add event log for JO
|
||||
$event = new JOEvent();
|
||||
$event->setDateHappen(new DateTime())
|
||||
->setTypeID(JOEventType::CREATE)
|
||||
->setJobOrder($jo);
|
||||
$em->persist($event);
|
||||
|
||||
// check JO status
|
||||
if ($jo->getStatus() == JOStatus::ASSIGNED)
|
||||
{
|
||||
// add event logs for hub and rider assignments
|
||||
$hub_assign_event = new JOEvent();
|
||||
$hub_assign_event->setDateHappen(new DateTime())
|
||||
->setTypeID(JOEventType::HUB_ASSIGN)
|
||||
->setJobOrder($jo);
|
||||
$em->persist($event);
|
||||
|
||||
// check JO status
|
||||
if ($jo->getStatus() == JOStatus::ASSIGNED)
|
||||
{
|
||||
// add event logs for hub and rider assignments
|
||||
$hub_assign_event = new JOEvent();
|
||||
$hub_assign_event->setDateHappen(new DateTime())
|
||||
->setTypeID(JOEventType::HUB_ASSIGN)
|
||||
->setJobOrder($jo);
|
||||
$em->persist($hub_assign_event);
|
||||
|
||||
$em->persist($hub_assign_event);
|
||||
$rider_assign_event = new JOEvent();
|
||||
$rider_assign_event->setDateHappen(new DateTime())
|
||||
->setTypeID(JOEventType::RIDER_ASSIGN)
|
||||
->setJobOrder($jo);
|
||||
|
||||
$rider_assign_event = new JOEvent();
|
||||
$rider_assign_event->setDateHappen(new DateTime())
|
||||
->setTypeID(JOEventType::RIDER_ASSIGN)
|
||||
->setJobOrder($jo);
|
||||
$em->persist($rider_assign_event);
|
||||
|
||||
$em->persist($rider_assign_event);
|
||||
|
||||
// user mqtt event
|
||||
$payload = [
|
||||
'event' => 'outlet_assign'
|
||||
];
|
||||
$mclient->sendEvent($jo, $payload);
|
||||
|
||||
$rah->assignJobOrder($jo, $jo->getRider());
|
||||
}
|
||||
|
||||
$em->flush();
|
||||
|
||||
// make invoice json data
|
||||
$invoice_data = [
|
||||
'total_price' => $invoice->getTotalPrice(),
|
||||
'vat_ex_price' => $invoice->getVATExclusivePrice(),
|
||||
'vat' => $invoice->getVAT(),
|
||||
'discount' => $invoice->getDiscount(),
|
||||
'trade_in' => $invoice->getTradeIn(),
|
||||
// user mqtt event
|
||||
$payload = [
|
||||
'event' => 'outlet_assign'
|
||||
];
|
||||
$items = $invoice->getItems();
|
||||
$items_data = [];
|
||||
foreach ($items as $item)
|
||||
{
|
||||
$items_data[] = [
|
||||
'title' => $item->getTitle(),
|
||||
'qty' => $item->getQuantity() + 0,
|
||||
'price' => $item->getPrice() + 0.0,
|
||||
];
|
||||
}
|
||||
$invoice_data['items'] = $items_data;
|
||||
$mclient->sendEvent($jo, $payload);
|
||||
|
||||
// make job order data
|
||||
$data = [
|
||||
'jo_id' => $jo->getID(),
|
||||
'invoice' => $invoice_data
|
||||
$rah->assignJobOrder($jo, $jo->getRider());
|
||||
}
|
||||
|
||||
$em->flush();
|
||||
|
||||
// make invoice json data
|
||||
$invoice_data = [
|
||||
'total_price' => $invoice->getTotalPrice(),
|
||||
'vat_ex_price' => $invoice->getVATExclusivePrice(),
|
||||
'vat' => $invoice->getVAT(),
|
||||
'discount' => $invoice->getDiscount(),
|
||||
'trade_in' => $invoice->getTradeIn(),
|
||||
];
|
||||
$items = $invoice->getItems();
|
||||
$items_data = [];
|
||||
foreach ($items as $item)
|
||||
{
|
||||
$items_data[] = [
|
||||
'title' => $item->getTitle(),
|
||||
'qty' => $item->getQuantity() + 0,
|
||||
'price' => $item->getPrice() + 0.0,
|
||||
];
|
||||
}
|
||||
$invoice_data['items'] = $items_data;
|
||||
|
||||
// set data
|
||||
$res->setData($data);
|
||||
//} // NOTE: uncomment this curly when auto assign advance order JO is to be implemented
|
||||
// make job order data
|
||||
$data = [
|
||||
'jo_id' => $jo->getID(),
|
||||
'invoice' => $invoice_data
|
||||
];
|
||||
|
||||
// set data
|
||||
$res->setData($data);
|
||||
|
||||
return $res->getReturnResponse();
|
||||
}
|
||||
|
|
@ -2364,36 +2271,20 @@ class APIController extends Controller implements LoggedController
|
|||
return $res->getReturnResponse();
|
||||
}
|
||||
|
||||
public function getNearestHubAndSlots(Request $req, $jo_id, EntityManagerInterface $em,
|
||||
public function getNearestHubAndSlots(Request $req, EntityManagerInterface $em,
|
||||
MapTools $map_tools)
|
||||
{
|
||||
$required_params = [];
|
||||
$required_params = [
|
||||
'longitude',
|
||||
'latitude',
|
||||
];
|
||||
|
||||
$res = $this->checkParamsAndKey($req, $em, $required_params);
|
||||
if ($res->isError())
|
||||
return $res->getReturnResponse();
|
||||
|
||||
// find JO
|
||||
$jo = $em->getRepository(JobOrder::class)->find($jo_id);
|
||||
if ($jo == null)
|
||||
{
|
||||
$res->setError(true)
|
||||
->setErrorMessage('No job order found.');
|
||||
return $res->getReturnResponse();
|
||||
}
|
||||
|
||||
// find nearest hub
|
||||
if (($jo->getServiceType() == ServiceType::BATTERY_REPLACEMENT_NEW) ||
|
||||
($jo->getServicetype() == ServiceType::BATTERY_REPLACEMENT_WARRANTY))
|
||||
{
|
||||
// get nearest hub
|
||||
// TODO: might have to find advance nearest hub with inventory later
|
||||
$nearest_hub_slots = $this->findAdvanceNearestHubAndSlots($jo, $em, $map_tools);
|
||||
}
|
||||
else
|
||||
{
|
||||
$nearest_hub_slots = $this->findAdvanceNearestHubAndSlots($jo, $em, $map_tools);
|
||||
}
|
||||
$coordinates = new Point($req->query->get('longitude'), $req->query->get('latitude'));
|
||||
$nearest_hub_slots = $this->findAdvanceNearestHubAndSlots($coordinates, $em, $map_tools);
|
||||
|
||||
if (empty($nearest_hub_slots['hub']))
|
||||
{
|
||||
|
|
@ -2611,315 +2502,11 @@ class APIController extends Controller implements LoggedController
|
|||
return $selected_rider;
|
||||
}
|
||||
|
||||
protected function findAdvanceNearestHub($jo, $request_time, EntityManagerInterface $em, MapTools $map_tools)
|
||||
{
|
||||
// get the nearest 10 hubs
|
||||
$selected_hub = null;
|
||||
$hubs = $map_tools->getClosestOpenHubs($jo->getCoordinates(), 10);
|
||||
|
||||
$nearest_hubs_with_distance = [];
|
||||
$nearest_branch_codes = [];
|
||||
foreach ($hubs as $hub)
|
||||
{
|
||||
$nearest_hubs_with_distance[] = $hub;
|
||||
//if (!empty($hub['hub']->getBranchCode()))
|
||||
// $nearest_branch_codes[] = $hub['hub']->getBranchCode();
|
||||
}
|
||||
|
||||
// check if nearest hubs have branch codes
|
||||
//if (count($nearest_branch_codes) == 0)
|
||||
// return $selected_hub;
|
||||
|
||||
// assume all 10 have stock
|
||||
// find the nearest hub with available riders
|
||||
$nearest = null;
|
||||
$slot_found = false;
|
||||
foreach ($nearest_hubs_with_distance as $nhd)
|
||||
{
|
||||
if (empty($nearest))
|
||||
$nearest = $nhd;
|
||||
else
|
||||
{
|
||||
if ($nhd['distance'] < $nearest['distance'])
|
||||
$nearest = $nhd;
|
||||
}
|
||||
|
||||
$result = $this->findRiderSlots($jo, $nearest['hub'], $request_time, $em);
|
||||
|
||||
if ($result != null)
|
||||
$slot_found = $result['slot_found'];
|
||||
else
|
||||
$nearest = null;
|
||||
}
|
||||
|
||||
if ($slot_found && $nearest != null)
|
||||
{
|
||||
$result = $this->findRiderSlots($jo, $nearest['hub'], $request_time, $em);
|
||||
|
||||
if ($result != null)
|
||||
{
|
||||
$jo_date_schedule = $result['date_schedule'];
|
||||
|
||||
$jo->setAdvanceOrder(true);
|
||||
$jo->setDateSchedule($jo_date_schedule);
|
||||
|
||||
$selected_hub = $nearest['hub'];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// uncomment this snippet when inventory check becomes active
|
||||
// get battery sku
|
||||
/*
|
||||
if ($batt != null)
|
||||
{
|
||||
$skus[] = $batt->getSAPCode();
|
||||
|
||||
// api call to check inventory
|
||||
// pass the list of branch codes of nearest hubs and the skus
|
||||
// go through returned list of branch codes
|
||||
// bypass inventory check for now
|
||||
// $hubs_with_inventory = $im->getBranchesInventory($nearest_branch_codes, $skus);
|
||||
if (!empty($hubs_with_inventory))
|
||||
{
|
||||
$nearest = [];
|
||||
$flag_hub_found = false;
|
||||
foreach ($hubs_with_inventory as $hub_with_inventory)
|
||||
{
|
||||
// find hub according to branch code
|
||||
$found_hub = $em->getRepository(Hub::class)->findOneBy(['branch_code' => $hub_with_inventory['BranchCode']]);
|
||||
if ($found_hub != null)
|
||||
{
|
||||
// check rider availability
|
||||
if (count($found_hub->getAvailableRiders()) > 0)
|
||||
{
|
||||
// check against nearest hubs with distance
|
||||
foreach ($nearest_hubs_with_distance as $nhd)
|
||||
{
|
||||
// get distance of hub from location, compare with $nearest. if less, replace nearest
|
||||
if ($found_hub->getID() == $nhd['hub']->getID())
|
||||
{
|
||||
if (empty($nearest))
|
||||
{
|
||||
$nearest = $nhd;
|
||||
$flag_hub_found = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($nhd['distance'] < $nearest['distance'])
|
||||
{
|
||||
$nearest = $nhd;
|
||||
$flag_hub_found = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$selected_hub = $nearest['hub'];
|
||||
}
|
||||
} */
|
||||
return $selected_hub;
|
||||
}
|
||||
|
||||
protected function findRiderSlots($jo, Hub $hub, $request_time, EntityManagerInterface $em)
|
||||
{
|
||||
$flag_found_slot = false;
|
||||
$results = [];
|
||||
|
||||
// array of # of riders that can handle JOs in a timeslot
|
||||
$hub_rider_slots = [];
|
||||
|
||||
// populate the array with the hub's rider slots
|
||||
for ($i = 0; $i <=7; $i++)
|
||||
{
|
||||
$hub_rider_slots[$i] = $hub->getRiderSlots();
|
||||
}
|
||||
|
||||
// check hub's advance orders for the day
|
||||
// get number of advance orders for the next day if request came in before midnight
|
||||
// or for current day if request came in after midnight
|
||||
// check request_time
|
||||
$midnight = strtotime('00:00');
|
||||
$start_date = new DateTime();
|
||||
$end_date = new DateTime();
|
||||
|
||||
if ($request_time < $midnight)
|
||||
{
|
||||
// add +1 to date to start and end date
|
||||
$start_date->add(new DateInterval('P1D'));
|
||||
$end_date->add(new DateInterval('P1D'));
|
||||
}
|
||||
|
||||
// set time bounds for the start and end date
|
||||
$start_date->setTime(0, 1);
|
||||
$end_date->setTime(23, 59);
|
||||
|
||||
$str_request_time = date('Y-m-d H:i:s', $request_time);
|
||||
$time_of_request = DateTime::createFromFormat('Y-m-d H:i:s', $str_request_time);
|
||||
|
||||
// NOTE: get advance orders via query
|
||||
// get JOs assigned to hub that are advance orders and scheduled for the next day(if before midnight) or current day(if after midnight) with
|
||||
// for hub assignment status
|
||||
$query = $em->createQuery('select jo from App\Entity\JobOrder jo where jo.hub = :hub and jo.flag_advance = true and
|
||||
jo.date_schedule >= :date_start and jo.date_schedule <= :date_end and jo.status = :status');
|
||||
$jos_advance_orders = $query->setParameters([
|
||||
'hub' => $hub,
|
||||
'date_start' => $start_date,
|
||||
'date_end' => $end_date,
|
||||
'status' => JOStatus::ASSIGNED,
|
||||
])
|
||||
->getResult();
|
||||
|
||||
// check each JO's date_schedule, decrement rider_slots if date schedule falls in that slot
|
||||
// index - equivalent time
|
||||
// 0 - 8-9
|
||||
// 1 - 9-10
|
||||
// 2 - 10-11
|
||||
// 3 - 11-12
|
||||
// 4 - 12 -13
|
||||
// 5 - 13-14
|
||||
// 6 - 14-15
|
||||
// 7 - 15-16
|
||||
// TODO: check if no pending JOs
|
||||
foreach ($jos_advance_orders as $advance_jo)
|
||||
{
|
||||
// get time schedule
|
||||
$date_schedule = $advance_jo->getDateSchedule();
|
||||
$time_schedule = $date_schedule->format('H:i');
|
||||
|
||||
$hour_schedule = $date_schedule->format('H');
|
||||
$minute_schedule = $date_schedule->format('i');
|
||||
|
||||
// check minutes. for now, if not 00, take up current slot and next one
|
||||
// if hour fits in the last slot but minutes is not 00, move to the next available hub
|
||||
// TODO: need to add custom minutes threshold
|
||||
if ($minute_schedule != '00')
|
||||
{
|
||||
switch($hour_schedule) {
|
||||
case '8':
|
||||
$hub_rider_slots[0]--;
|
||||
$hub_rider_slots[1]--;
|
||||
break;
|
||||
case '9':
|
||||
$hub_rider_slots[1]--;
|
||||
$hub_rider_slots[2]--;
|
||||
break;
|
||||
case '10':
|
||||
$hub_rider_slots[2]--;
|
||||
$hub_rider_slots[3]--;
|
||||
break;
|
||||
case '11':
|
||||
$hub_rider_slots[3]--;
|
||||
$hub_rider_slots[4]--;
|
||||
break;
|
||||
case '12':
|
||||
$hub_rider_slots[4]--;
|
||||
$hub_rider_slots[5]--;
|
||||
break;
|
||||
case '13':
|
||||
$hub_rider_slots[5]--;
|
||||
$hub_rider_slots[6]--;
|
||||
break;
|
||||
case '14':
|
||||
$hub_rider_slots[6]--;
|
||||
$hub_rider_slots[7]--;
|
||||
break;
|
||||
case '15':
|
||||
error_log('No slots for the day');
|
||||
break;
|
||||
default:
|
||||
error_log('Does not fit in any time slot. ' . $time_schedule);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch ($hour_schedule) {
|
||||
case '8':
|
||||
$hub_rider_slots[0]--;
|
||||
break;
|
||||
case '9':
|
||||
$hub_rider_slots[1]--;
|
||||
break;
|
||||
case '10':
|
||||
$hub_rider_slots[2]--;
|
||||
break;
|
||||
case '11':
|
||||
$hub_rider_slots[3]--;
|
||||
break;
|
||||
case '12':
|
||||
$hub_rider_slots[4]--;
|
||||
break;
|
||||
case '13':
|
||||
$hub_rider_slots[5]--;
|
||||
break;
|
||||
case '14':
|
||||
$hub_rider_slots[6]--;
|
||||
break;
|
||||
case '15':
|
||||
$hub_rider_slots[7]--;
|
||||
break;
|
||||
default:
|
||||
error_log('Does not fit in any time slot.' . $time_schedule);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// find first free slot
|
||||
foreach ($hub_rider_slots as $index => $rider_slot)
|
||||
{
|
||||
if ($rider_slot > 0)
|
||||
{
|
||||
$flag_found_slot = true;
|
||||
|
||||
$jo_date_schedule = $start_date;
|
||||
switch ($index) {
|
||||
case '0':
|
||||
$jo_date_schedule->setTime(8,0);
|
||||
break;
|
||||
case '1':
|
||||
$jo_date_schedule->setTime(9,0);
|
||||
break;
|
||||
case '2':
|
||||
$jo_date_schedule->setTime(10,0);
|
||||
break;
|
||||
case '3':
|
||||
$jo_date_schedule->setTime(11,0);
|
||||
break;
|
||||
case '4':
|
||||
$jo_date_schedule->setTime(12,0);
|
||||
break;
|
||||
case '5':
|
||||
$jo_date_schedule->setTime(13,0);
|
||||
break;
|
||||
case '6':
|
||||
$jo_date_schedule->setTime(14,0);
|
||||
break;
|
||||
case '7':
|
||||
$jo_date_schedule->setTime(15,0);
|
||||
break;
|
||||
default:
|
||||
error_log('Cannot find time slot.');
|
||||
}
|
||||
|
||||
$results = [
|
||||
'slot_found' => $flag_found_slot,
|
||||
'date_schedule' => $jo_date_schedule,
|
||||
];
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
return $results;
|
||||
}
|
||||
|
||||
protected function findAdvanceNearestHubAndSlots(JobOrder $jo, EntityManagerInterface $em, MapTools $map_tools)
|
||||
protected function findAdvanceNearestHubAndSlots(Point $coordinates, EntityManagerInterface $em, MapTools $map_tools)
|
||||
{
|
||||
// get the nearest 10 hubs
|
||||
$hub_data = [];
|
||||
$hubs = $map_tools->getClosestOpenHubs($jo->getCoordinates(), 10);
|
||||
$hubs = $map_tools->getClosestOpenHubs($coordinates, 10);
|
||||
|
||||
foreach ($hubs as $hub)
|
||||
{
|
||||
|
|
@ -3007,6 +2594,7 @@ class APIController extends Controller implements LoggedController
|
|||
// 5 - 13-14
|
||||
// 6 - 14-15
|
||||
// 7 - 15-16
|
||||
// 8 - 16-17
|
||||
$hub_slots = [];
|
||||
|
||||
// get the dates for the next three days
|
||||
|
|
@ -3023,15 +2611,15 @@ class APIController extends Controller implements LoggedController
|
|||
$hub_rider_slots = [];
|
||||
|
||||
// populate the array with the hub's rider slots per day
|
||||
for ($i = 0; $i <=7; $i++)
|
||||
for ($i = 0; $i <= self::RIDER_SLOT_ARRAY_LENGTH; $i++)
|
||||
{
|
||||
$hub_rider_slots[$first_date][$i] = $hub->getRiderSlots();
|
||||
}
|
||||
for ($i = 0; $i <=7; $i++)
|
||||
for ($i = 0; $i <= self::RIDER_SLOT_ARRAY_LENGTH; $i++)
|
||||
{
|
||||
$hub_rider_slots[$sec_date][$i] = $hub->getRiderSlots();
|
||||
}
|
||||
for ($i = 0; $i <=7; $i++)
|
||||
for ($i = 0; $i <= self::RIDER_SLOT_ARRAY_LENGTH; $i++)
|
||||
{
|
||||
$hub_rider_slots[$third_date][$i] = $hub->getRiderSlots();
|
||||
}
|
||||
|
|
@ -3099,38 +2687,42 @@ class APIController extends Controller implements LoggedController
|
|||
|
||||
// set all slots to true
|
||||
$data[] = [
|
||||
[
|
||||
'08_09' => [
|
||||
'label' => '8-9 AM',
|
||||
'available' => $status,
|
||||
],
|
||||
[
|
||||
'09_10' => [
|
||||
'label' => '9-10 AM',
|
||||
'available' => $status,
|
||||
],
|
||||
[
|
||||
'10_11' => [
|
||||
'label' => '10-11 AM',
|
||||
'available' => $status,
|
||||
],
|
||||
[
|
||||
'11_12' => [
|
||||
'label' => '11 AM-12 PM',
|
||||
'available' => $status,
|
||||
],
|
||||
[
|
||||
'13_14' => [
|
||||
'label' => '12 PM-1 PM',
|
||||
'available' => $status,
|
||||
],
|
||||
[
|
||||
'14_15' => [
|
||||
'label' => '1-2 PM',
|
||||
'available' => $status,
|
||||
],
|
||||
[
|
||||
'14_15' => [
|
||||
'label' => '2-3 PM',
|
||||
'available' => $status,
|
||||
],
|
||||
[
|
||||
'15_16' => [
|
||||
'label' => '3-4 PM',
|
||||
'available' => $status,
|
||||
]
|
||||
],
|
||||
'16_17' => [
|
||||
'label' => '4-5 PM',
|
||||
'available' => $status,
|
||||
],
|
||||
];
|
||||
|
||||
return $data;
|
||||
|
|
@ -3140,7 +2732,7 @@ class APIController extends Controller implements LoggedController
|
|||
{
|
||||
$data = [];
|
||||
// check values of hub_rider_slot to mark if available or not
|
||||
for ($i = 0; $i <=7; $i++)
|
||||
for ($i = 0; $i <= self::RIDER_SLOT_ARRAY_LENGTH; $i++)
|
||||
{
|
||||
if ($hub_rider_slots[$schedule_date][$i] > 0)
|
||||
{
|
||||
|
|
@ -3148,7 +2740,7 @@ class APIController extends Controller implements LoggedController
|
|||
switch($i) {
|
||||
case '0':
|
||||
$data[] = [
|
||||
[
|
||||
'08_09' => [
|
||||
'label' => '8-9 AM',
|
||||
'available' => true,
|
||||
]
|
||||
|
|
@ -3156,7 +2748,7 @@ class APIController extends Controller implements LoggedController
|
|||
break;
|
||||
case '1':
|
||||
$data[] = [
|
||||
[
|
||||
'09_10' => [
|
||||
'label' => '9-10 AM',
|
||||
'available' => true,
|
||||
]
|
||||
|
|
@ -3164,7 +2756,7 @@ class APIController extends Controller implements LoggedController
|
|||
break;
|
||||
case '2':
|
||||
$data[] = [
|
||||
[
|
||||
'10_11' => [
|
||||
'label' => '10-11 AM',
|
||||
'available' => true,
|
||||
]
|
||||
|
|
@ -3172,7 +2764,7 @@ class APIController extends Controller implements LoggedController
|
|||
break;
|
||||
case '3':
|
||||
$data[] = [
|
||||
[
|
||||
'11_12' => [
|
||||
'label' => '11 AM-12 PM',
|
||||
'available' => true,
|
||||
]
|
||||
|
|
@ -3180,7 +2772,7 @@ class APIController extends Controller implements LoggedController
|
|||
break;
|
||||
case '4':
|
||||
$data[] = [
|
||||
[
|
||||
'12_13' => [
|
||||
'label' => '12 PM-1 PM',
|
||||
'available' => true,
|
||||
]
|
||||
|
|
@ -3188,7 +2780,7 @@ class APIController extends Controller implements LoggedController
|
|||
break;
|
||||
case '5':
|
||||
$data[] = [
|
||||
[
|
||||
'13_14' => [
|
||||
'label' => '1-2 PM',
|
||||
'available' => true,
|
||||
]
|
||||
|
|
@ -3196,7 +2788,7 @@ class APIController extends Controller implements LoggedController
|
|||
break;
|
||||
case '6':
|
||||
$data[] = [
|
||||
[
|
||||
'14_15' => [
|
||||
'label' => '2-3 PM',
|
||||
'available' => true,
|
||||
]
|
||||
|
|
@ -3204,12 +2796,20 @@ class APIController extends Controller implements LoggedController
|
|||
break;
|
||||
case '7':
|
||||
$data[] = [
|
||||
[
|
||||
'15_16' => [
|
||||
'label' => '3-4 PM',
|
||||
'available' => true,
|
||||
]
|
||||
];
|
||||
break;
|
||||
case '8':
|
||||
$data[] = [
|
||||
'16_17' => [
|
||||
'label' => '4-5 PM',
|
||||
'available' => true,
|
||||
]
|
||||
];
|
||||
break;
|
||||
default:
|
||||
error_log('Invalid rider slot index.');
|
||||
}
|
||||
|
|
@ -3220,7 +2820,7 @@ class APIController extends Controller implements LoggedController
|
|||
switch($i) {
|
||||
case '0':
|
||||
$data[] = [
|
||||
[
|
||||
'08_09' => [
|
||||
'label' => '8-9 AM',
|
||||
'available' => false,
|
||||
]
|
||||
|
|
@ -3228,7 +2828,7 @@ class APIController extends Controller implements LoggedController
|
|||
break;
|
||||
case '1':
|
||||
$data[] = [
|
||||
[
|
||||
'09_10' => [
|
||||
'label' => '9-10 AM',
|
||||
'available' => false,
|
||||
]
|
||||
|
|
@ -3236,7 +2836,7 @@ class APIController extends Controller implements LoggedController
|
|||
break;
|
||||
case '2':
|
||||
$data[] = [
|
||||
[
|
||||
'10_11' => [
|
||||
'label' => '10-11 AM',
|
||||
'available' => false,
|
||||
]
|
||||
|
|
@ -3244,7 +2844,7 @@ class APIController extends Controller implements LoggedController
|
|||
break;
|
||||
case '3':
|
||||
$data[] = [
|
||||
[
|
||||
'11_12' => [
|
||||
'label' => '11 AM-12 PM',
|
||||
'available' => false,
|
||||
]
|
||||
|
|
@ -3252,7 +2852,7 @@ class APIController extends Controller implements LoggedController
|
|||
break;
|
||||
case '4':
|
||||
$data[] = [
|
||||
[
|
||||
'12_13' => [
|
||||
'label' => '12 PM-1 PM',
|
||||
'available' => false,
|
||||
]
|
||||
|
|
@ -3260,7 +2860,7 @@ class APIController extends Controller implements LoggedController
|
|||
break;
|
||||
case '5':
|
||||
$data[] = [
|
||||
[
|
||||
'13_14' => [
|
||||
'label' => '1-2 PM',
|
||||
'available' => false,
|
||||
]
|
||||
|
|
@ -3268,7 +2868,7 @@ class APIController extends Controller implements LoggedController
|
|||
break;
|
||||
case '6':
|
||||
$data[] = [
|
||||
[
|
||||
'14_15' => [
|
||||
'label' => '2-3 PM',
|
||||
'available' => false,
|
||||
]
|
||||
|
|
@ -3276,12 +2876,20 @@ class APIController extends Controller implements LoggedController
|
|||
break;
|
||||
case '7':
|
||||
$data[] = [
|
||||
[
|
||||
'15_16' => [
|
||||
'label' => '3-4 PM',
|
||||
'available' => false,
|
||||
]
|
||||
];
|
||||
break;
|
||||
case '8':
|
||||
$data[] = [
|
||||
'16_17' => [
|
||||
'label' => '4-5 PM',
|
||||
'available' => false,
|
||||
]
|
||||
];
|
||||
break;
|
||||
default:
|
||||
error_log('Invalid rider slot index.');
|
||||
}
|
||||
|
|
@ -3326,6 +2934,10 @@ class APIController extends Controller implements LoggedController
|
|||
$hub_rider_slots[$date_schedule][7]--;
|
||||
break;
|
||||
case '15':
|
||||
$hub_rider_slots[$date_schedule][7]--;
|
||||
$hub_rider_slots[$date_schedule][8]--;
|
||||
break;
|
||||
case '16':
|
||||
error_log('No slots for the day');
|
||||
break;
|
||||
default:
|
||||
|
|
@ -3359,6 +2971,9 @@ class APIController extends Controller implements LoggedController
|
|||
case '15':
|
||||
$hub_rider_slots[$date_schedule][7]--;
|
||||
break;
|
||||
case '16':
|
||||
$hub_rider_slots[$date_schedule][8]--;
|
||||
break;
|
||||
default:
|
||||
error_log('Does not fit in any time slot.' . $time_schedule);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue