Fixed provider availability generation bug.

This commit is contained in:
alextselegidis@gmail.com 2014-01-15 15:48:58 +00:00
parent 919c3da18d
commit 3e98961e7e
3 changed files with 70 additions and 56 deletions

View file

@ -480,7 +480,7 @@ class Appointments extends CI_Controller {
$working_plan = json_decode($this->providers_model->get_setting('working_plan', $provider_id), true); $working_plan = json_decode($this->providers_model->get_setting('working_plan', $provider_id), true);
$where_clause = array( $where_clause = array(
'DATE(start_datetime)' => date('Y-m-d', strtotime($selected_date)), //'DATE(start_datetime)' => date('Y-m-d', strtotime($selected_date)),
'id_users_provider' => $provider_id 'id_users_provider' => $provider_id
); );
@ -542,10 +542,10 @@ class Appointments extends CI_Controller {
foreach($reserved_appointments as $appointment) { foreach($reserved_appointments as $appointment) {
foreach($available_periods_with_appointments as $index => &$period) { foreach($available_periods_with_appointments as $index => &$period) {
$a_start = date('H:i', strtotime($appointment['start_datetime'])); $a_start = strtotime($appointment['start_datetime']);
$a_end = date('H:i', strtotime($appointment['end_datetime'])); $a_end = strtotime($appointment['end_datetime']);
$p_start = date('H:i', strtotime($period['start'])); $p_start = strtotime($selected_date . ' ' . $period['start']);
$p_end = date('H:i', strtotime($period['end'])); $p_end = strtotime($selected_date . ' ' .$period['end']);
if ($a_start <= $p_start && $a_end <= $p_end && $a_end <= $p_start) { if ($a_start <= $p_start && $a_end <= $p_end && $a_end <= $p_start) {
// The appointment does not belong in this time period, so we // The appointment does not belong in this time period, so we
@ -553,25 +553,25 @@ class Appointments extends CI_Controller {
} else if ($a_start <= $p_start && $a_end <= $p_end && $a_end >= $p_start) { } else if ($a_start <= $p_start && $a_end <= $p_end && $a_end >= $p_start) {
// The appointment starts before the period and finishes somewhere inside. // The appointment starts before the period and finishes somewhere inside.
// We will need to break this period and leave the available part. // We will need to break this period and leave the available part.
$period['start'] = $a_end; $period['start'] = date('H:i', $a_end);
} else if ($a_start >= $p_start && $a_end <= $p_end) { } else if ($a_start >= $p_start && $a_end <= $p_end) {
// The appointment is inside the time period, so we will split the period // The appointment is inside the time period, so we will split the period
// into two new others. // into two new others.
unset($available_periods_with_appointments[$index]); unset($available_periods_with_appointments[$index]);
$available_periods_with_appointments[] = array( $available_periods_with_appointments[] = array(
'start' => $p_start, 'start' => date('H:i', $p_start),
'end' => $a_start 'end' => date('H:i', $a_start)
); );
$available_periods_with_appointments[] = array( $available_periods_with_appointments[] = array(
'start' => $a_end, 'start' => date('H:i', $a_end),
'end' => $p_end 'end' => date('H:i', $p_end)
); );
} else if ($a_start >= $p_start && $a_end >= $p_start && $a_start <= $p_end) { } else if ($a_start >= $p_start && $a_end >= $p_start && $a_start <= $p_end) {
// The appointment starts in the period and finishes out of it. We will // The appointment starts in the period and finishes out of it. We will
// need to remove the time that is taken from the appointment. // need to remove the time that is taken from the appointment.
$period['end'] = $a_start; $period['end'] = date('H:i', $a_start);
} else if ($a_start >= $p_start && $a_end >= $p_end && $a_start >= $p_end) { } else if ($a_start >= $p_start && $a_end >= $p_end && $a_start >= $p_end) {
// The appointment does not belong in the period so do not change anything. // The appointment does not belong in the period so do not change anything.

View file

@ -53,8 +53,8 @@ class Backend_api extends CI_Controller {
// Get appointments // Get appointments
$where_clause = array( $where_clause = array(
$where_id => $_POST['record_id'], $where_id => $_POST['record_id'],
'start_datetime >=' => $_POST['start_date'], //'start_datetime >=' => $_POST['start_date'],
'end_datetime <=' => $_POST['end_date'], //'end_datetime <=' => $_POST['end_date'],
'is_unavailable' => FALSE 'is_unavailable' => FALSE
); );
@ -70,8 +70,8 @@ class Backend_api extends CI_Controller {
if ($_POST['filter_type'] == FILTER_TYPE_PROVIDER) { if ($_POST['filter_type'] == FILTER_TYPE_PROVIDER) {
$where_clause = array( $where_clause = array(
$where_id => $_POST['record_id'], $where_id => $_POST['record_id'],
'start_datetime >=' => $_POST['start_date'], //'start_datetime >=' => $_POST['start_date'],
'end_datetime <=' => $_POST['end_date'], //'end_datetime <=' => $_POST['end_date'],
'is_unavailable' => TRUE 'is_unavailable' => TRUE
); );

View file

@ -989,7 +989,7 @@ var BackendCalendar = {
* @param {object} $calendar The calendar jQuery object. * @param {object} $calendar The calendar jQuery object.
* @param {int} recordId The selected record id. * @param {int} recordId The selected record id.
* @param {string} filterType The filter type, could be either FILTER_TYPE_PROVIDER * @param {string} filterType The filter type, could be either FILTER_TYPE_PROVIDER
* or FILTER_TYPE_SERVICE * or FILTER_TYPE_SERVICE.
* @param {date} startDate Visible start date of the calendar. * @param {date} startDate Visible start date of the calendar.
* @param {type} endDate Visible end date of the calendar. * @param {type} endDate Visible end date of the calendar.
*/ */
@ -1045,7 +1045,37 @@ var BackendCalendar = {
var selDayName = $calendar.fullCalendar('getView') var selDayName = $calendar.fullCalendar('getView')
.start.toString('dddd').toLowerCase(); .start.toString('dddd').toLowerCase();
if (workingPlan[selDayName] == null) return; // go to next loop // Add custom unavailable periods.
$.each(response.unavailables, function(index, unavailable) {
var unavailablePeriod = {
'title': EALang['unavailable'] + ' <br><small>' + ((unavailable.notes.length > 30)
? unavailable.notes.substring(0, 30) + '...'
: unavailable.notes) + '</small>',
'start': Date.parse(unavailable.start_datetime),
'end': Date.parse(unavailable.end_datetime),
'allDay': false,
'color': '#879DB4',
'editable': true,
'className': 'fc-unavailable fc-custom',
'data': unavailable
};
$calendar.fullCalendar('renderEvent', unavailablePeriod, false);
});
// non working day
if (workingPlan[selDayName] == null) {
unavailablePeriod = {
'title': EALang['not_working'],
'start': GeneralFunctions.clone($calendar.fullCalendar('getView').start),
'end': GeneralFunctions.clone($calendar.fullCalendar('getView').end),
'allDay': false,
'color': '#BEBEBE',
'editable': false,
'className': 'fc-unavailable'
};
$calendar.fullCalendar('renderEvent', unavailablePeriod, true);
return; // go to next loop
}
// Add unavailable period before work starts. // Add unavailable period before work starts.
var calendarDateStart = $calendar.fullCalendar('getView').start; var calendarDateStart = $calendar.fullCalendar('getView').start;
@ -1105,50 +1135,34 @@ var BackendCalendar = {
$calendar.fullCalendar('renderEvent', unavailablePeriod, false); $calendar.fullCalendar('renderEvent', unavailablePeriod, false);
}); });
// Add custom unavailable periods.
$.each(response.unavailables, function(index, unavailable) {
var unavailablePeriod = {
'title': EALang['unavailable'] + ' <br><small>' + ((unavailable.notes.length > 30)
? unavailable.notes.substring(0, 30) + '...'
: unavailable.notes) + '</small>',
'start': Date.parse(unavailable.start_datetime),
'end': Date.parse(unavailable.end_datetime),
'allDay': false,
'color': '#879DB4',
'editable': true,
'className': 'fc-unavailable fc-custom',
'data': unavailable
};
$calendar.fullCalendar('renderEvent', unavailablePeriod, false);
});
break; break;
case 'agendaWeek': case 'agendaWeek':
var currDateStart = GeneralFunctions.clone($calendar.fullCalendar('getView').start); var currDateStart = GeneralFunctions.clone($calendar.fullCalendar('getView').start);
var currDateEnd = GeneralFunctions.clone(currDateStart).addDays(1); var currDateEnd = GeneralFunctions.clone(currDateStart).addDays(1);
// Add custom unavailable periods (they are always displayed
// on the calendar, even if the provider won't work on that day).
$.each(response.unavailables, function(index, unavailable) {
//if (currDateStart.toString('dd/MM/yyyy')
// === Date.parse(unavailable.start_datetime).toString('dd/MM/yyyy')) {
unavailablePeriod = {
'title': EALang['unavailable'] + ' <br><small>' + ((unavailable.notes.length > 30)
? unavailable.notes.substring(0, 30) + '...'
: unavailable.notes) + '</small>',
'start': Date.parse(unavailable.start_datetime),
'end': Date.parse(unavailable.end_datetime),
'allDay': false,
'color': '#879DB4',
'editable': true,
'className': 'fc-unavailable fc-custom',
'data': unavailable
};
$calendar.fullCalendar('renderEvent', unavailablePeriod, false);
//}
});
$.each(workingPlan, function(index, workingDay) { $.each(workingPlan, function(index, workingDay) {
// Add custom unavailable periods (they are always displayed
// on the calendar, even if the provider won't work on that day).
$.each(response.unavailables, function(index, unavailable) {
if (currDateStart.toString('dd/MM/yyyy')
=== Date.parse(unavailable.start_datetime).toString('dd/MM/yyyy')) {
var unavailablePeriod = {
'title': EALang['unavailable'] + ' <br><small>' + ((unavailable.notes.length > 30)
? unavailable.notes.substring(0, 30) + '...'
: unavailable.notes) + '</small>',
'start': Date.parse(unavailable.start_datetime),
'end': Date.parse(unavailable.end_datetime),
'allDay': false,
'color': '#879DB4',
'editable': true,
'className': 'fc-unavailable fc-custom',
'data': unavailable
};
$calendar.fullCalendar('renderEvent', unavailablePeriod, false);
}
});
if (workingDay == null) { if (workingDay == null) {
// Add a full day unavailable event. // Add a full day unavailable event.