From 383fc1ee0a4156dd65fc05275e64158dcc80126a Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 27 Apr 2020 09:19:21 +0000 Subject: [PATCH] Modify input parameter for getNearestHubAndSlots. Add 4-5 PM shift. Add slot id to response. Remove unused code. #389 --- config/routes/api.yaml | 2 +- src/Controller/APIController.php | 705 +++++++------------------------ 2 files changed, 161 insertions(+), 546 deletions(-) diff --git a/config/routes/api.yaml b/config/routes/api.yaml index fbbdecfd..5531407f 100644 --- a/config/routes/api.yaml +++ b/config/routes/api.yaml @@ -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] diff --git a/src/Controller/APIController.php b/src/Controller/APIController.php index 1a7f96d7..1d4d02d0 100644 --- a/src/Controller/APIController.php +++ b/src/Controller/APIController.php @@ -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); }