Consider the book advance timeout when generating unavailable dates (#855).

This commit is contained in:
Alex Tselegidis 2020-08-15 14:41:13 +03:00
parent 88ce8d506a
commit 4f1c39b564

View file

@ -425,30 +425,7 @@ class Appointments extends CI_Controller {
$provider); $provider);
} }
// If the selected date is today, remove past hours. It is important include the timeout before booking $response = $this->consider_book_advance_timeout($selected_date, $available_hours, $provider);
// that is set in the back-office the system. Normally we might want the customer to book an appointment
// that is at least half or one hour from now. The setting is stored in minutes.
$provider_timezone = new DateTimeZone($provider['timezone']);
$book_advance_timeout = $this->settings_model->get_setting('book_advance_timeout');
$threshold = new DateTime('+' . $book_advance_timeout . ' minutes', $provider_timezone);
foreach ($available_hours as $index => $value)
{
$available_hour = new DateTime($selected_date . ' ' . $value, $provider_timezone);
if ($available_hour->getTimestamp() <= $threshold->getTimestamp())
{
unset($available_hours[$index]);
}
}
$available_hours = array_values($available_hours);
sort($available_hours, SORT_STRING);
$available_hours = array_values($available_hours);
$response = $available_hours;
} }
catch (Exception $exception) catch (Exception $exception)
{ {
@ -1299,7 +1276,7 @@ class Appointments extends CI_Controller {
foreach ($provider_list as $current_provider_id) foreach ($provider_list as $current_provider_id)
{ {
// Get the provider record. // Get the provider record.
$curr_provider = $this->providers_model->get_row($current_provider_id); $current_provider = $this->providers_model->get_row($current_provider_id);
$empty_periods = $this->get_provider_available_time_periods($current_provider_id, $empty_periods = $this->get_provider_available_time_periods($current_provider_id,
$current_date->format('Y-m-d'), $exclude_appointments); $current_date->format('Y-m-d'), $exclude_appointments);
@ -1314,12 +1291,19 @@ class Appointments extends CI_Controller {
if ($service['attendants_number'] > 1) if ($service['attendants_number'] > 1)
{ {
$available_hours = $this->get_multiple_attendants_hours($current_date->format('Y-m-d'), $service, $available_hours = $this->get_multiple_attendants_hours($current_date->format('Y-m-d'),
$curr_provider); $service, $current_provider);
if ( ! empty($available_hours)) break;
if ( ! empty($available_hours))
{
break;
} }
} }
$available_hours = $this->consider_book_advance_timeout($current_date->format('Y-m-d'),
$available_hours, $current_provider);
}
// No availability amongst all the provider. // No availability amongst all the provider.
if (empty($available_hours)) if (empty($available_hours))
{ {
@ -1373,4 +1357,42 @@ class Appointments extends CI_Controller {
return $provider_list; return $provider_list;
} }
/**
* Consider the book advance timeout and remove available hours that have passed the threshold.
*
* If the selected date is today, remove past hours. It is important include the timeout before booking
* that is set in the back-office the system. Normally we might want the customer to book an appointment
* that is at least half or one hour from now. The setting is stored in minutes.
*
* @param string $selected_date The selected date.
* @param array $available_hours Already generated available hours.
* @param array $provider Provider information.
*
* @return array Returns the updated available hours.
*
* @throws Exception
*/
protected function consider_book_advance_timeout($selected_date, $available_hours, $provider)
{
$provider_timezone = new DateTimeZone($provider['timezone']);
$book_advance_timeout = $this->settings_model->get_setting('book_advance_timeout');
$threshold = new DateTime('+' . $book_advance_timeout . ' minutes', $provider_timezone);
foreach ($available_hours as $index => $value)
{
$available_hour = new DateTime($selected_date . ' ' . $value, $provider_timezone);
if ($available_hour->getTimestamp() <= $threshold->getTimestamp())
{
unset($available_hours[$index]);
}
}
$available_hours = array_values($available_hours);
sort($available_hours, SORT_STRING);
return array_values($available_hours);
}
} }