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);
$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
);
@ -542,10 +542,10 @@ class Appointments extends CI_Controller {
foreach($reserved_appointments as $appointment) {
foreach($available_periods_with_appointments as $index => &$period) {
$a_start = date('H:i', strtotime($appointment['start_datetime']));
$a_end = date('H:i', strtotime($appointment['end_datetime']));
$p_start = date('H:i', strtotime($period['start']));
$p_end = date('H:i', strtotime($period['end']));
$a_start = strtotime($appointment['start_datetime']);
$a_end = strtotime($appointment['end_datetime']);
$p_start = strtotime($selected_date . ' ' . $period['start']);
$p_end = strtotime($selected_date . ' ' .$period['end']);
if ($a_start <= $p_start && $a_end <= $p_end && $a_end <= $p_start) {
// 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) {
// The appointment starts before the period and finishes somewhere inside.
// 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) {
// The appointment is inside the time period, so we will split the period
// into two new others.
unset($available_periods_with_appointments[$index]);
$available_periods_with_appointments[] = array(
'start' => $p_start,
'end' => $a_start
'start' => date('H:i', $p_start),
'end' => date('H:i', $a_start)
);
$available_periods_with_appointments[] = array(
'start' => $a_end,
'end' => $p_end
'start' => date('H:i', $a_end),
'end' => date('H:i', $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
// 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) {
// The appointment does not belong in the period so do not change anything.

View file

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

View file

@ -989,7 +989,7 @@ var BackendCalendar = {
* @param {object} $calendar The calendar jQuery object.
* @param {int} recordId The selected record id.
* @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 {type} endDate Visible end date of the calendar.
*/
@ -1045,7 +1045,37 @@ var BackendCalendar = {
var selDayName = $calendar.fullCalendar('getView')
.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.
var calendarDateStart = $calendar.fullCalendar('getView').start;
@ -1105,50 +1135,34 @@ var BackendCalendar = {
$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;
case 'agendaWeek':
var currDateStart = GeneralFunctions.clone($calendar.fullCalendar('getView').start);
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) {
// 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) {
// Add a full day unavailable event.