load->model('providers_model'); $this->load->model('appointments_model'); $this->load->model('settings_model'); try { // If manage mode is TRUE then the following we should not // consider the selected appointment when calculating the // available time periods of the provider. $exclude_appointments = ($_POST['manage_mode'] === 'true') ? array($_POST['appointment_id']) : array(); $empty_periods = $this->get_provider_available_time_periods( $_POST['provider_id'], $_POST['selected_date'], $exclude_appointments); // Calculate the available appointment hours for the given // date. The empty spaces are broken down to 15 min and if // the service fit in each quarter then a new available hour // is added to the "$available_hours" array. $available_hours = array(); foreach ($empty_periods as $period) { $start_hour = new DateTime($_POST['selected_date'] . ' ' . $period['start']); $end_hour = new DateTime($_POST['selected_date'] . ' ' . $period['end']); $minutes = $start_hour->format('i'); if ($minutes % 15 != 0) { // Change the start hour of the current space in // order to be on of the following: 00, 15, 30, 45. if ($minutes < 15) { $start_hour->setTime($start_hour->format('H'), 15); } else if ($minutes < 30) { $start_hour->setTime($start_hour->format('H'), 30); } else if ($minutes < 45) { $start_hour->setTime($start_hour->format('H'), 45); } else { $start_hour->setTime($start_hour->format('H') + 1, 00); } } $current_hour = $start_hour; $diff = $current_hour->diff($end_hour); while (($diff->h * 60 + $diff->i) > intval($_POST['service_duration'])) { $available_hours[] = $current_hour->format('H:i'); $current_hour->add(new DateInterval("PT15M")); $diff = $current_hour->diff($end_hour); } } // If the selected date is today, remove past hours. It is // important include the timeout before booking that is set // in the backoffice 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. if (date('m/d/Y', strtotime($_POST['selected_date'])) == date('m/d/Y')) { if ($_POST['manage_mode'] === 'true') { $book_advance_timeout = 0; } else { $book_advance_timeout = $this->settings_model->get_setting('book_advance_timeout'); } foreach($available_hours as $index => $value) { $available_hour = strtotime($value); $current_hour = strtotime('+' . $book_advance_timeout . ' minutes', strtotime('now')); if ($available_hour <= $current_hour) { unset($available_hours[$index]); } } } $available_hours = array_values($available_hours); echo json_encode($available_hours); } catch(Exception $exc) { echo json_encode(array( 'exceptions' => array(exceptionToJavaScript($exc)) )); } }