/** * Get data for FullCalendar. * * @return json */ public function executeGetStaffAppointments() { $result = array(); $staff_members = array(); if (AB_Utils::isCurrentUserAdmin()) { $staff_ids = $this->getParameter('staff_ids'); $query = AB_Staff::query()->whereIn('id', array_merge(array(0), explode(',', $staff_ids))); $staff_members = $query->find(); } else { $staff = AB_Staff::query()->where('wp_user_id', get_current_user_id())->findOne(); $staff_members[] = $staff; } foreach ($staff_members as $staff) { $staff_id = $staff->get('id'); $one_day = new DateInterval('P1D'); $start_date = new DateTime($this->getParameter('start')); $end_date = new DateTime($this->getParameter('end')); // FullCalendar sends end date as 1 day further. $end_date->sub($one_day); /** @var AB_Staff $staff */ $result = array_merge($result, $staff->getAppointmentsForFC($start_date, $end_date)); // Schedule. $items = $staff->getScheduleItems(); $day = clone $start_date; while ($day <= $end_date) { do { /** @var AB_StaffScheduleItem $item */ $item = $items[$day->format('w') + 1]; if ($item->get('start_time')) { // Check one-time holidays. if (AB_Holiday::query()->where('date', $day->format('Y-m-d'))->whereRaw('staff_id = %d OR staff_id IS NULL', array($staff_id))->count() == 0) { // Check repeating holidays. if (AB_Holiday::query()->whereRaw('MONTH(date) = %d AND DAY(date) = %s', array($day->format('m'), $day->format('d')))->whereRaw('staff_id = %d OR staff_id IS NULL', array($staff_id))->count() == 0) { // No holidays for this day. // Continue schedule. if ($item->get('start_time') != '00:00:00') { $result[] = array('start' => $day->format('Y-m-d 00:00:00'), 'end' => $day->format("Y-m-d {$item->get('start_time')}"), 'rendering' => 'background', 'staffId' => $staff->get('id')); } if ($item->get('end_time') != '24:00:00') { $result[] = array('start' => $day->format("Y-m-d {$item->get('end_time')}"), 'end' => $day->format('Y-m-d 24:00:00'), 'rendering' => 'background', 'staffId' => $staff->get('id')); } // Breaks. foreach ($item->getBreaksList() as $break) { $result[] = array('start' => $day->format("Y-m-d {$break['start_time']}"), 'end' => $day->format("Y-m-d {$break['end_time']}"), 'rendering' => 'background', 'staffId' => $staff->get('id')); } break; } } } $result[] = array('start' => $day->format('Y-m-d 00:00:00'), 'end' => $day->format('Y-m-d 24:00:00'), 'rendering' => 'background', 'staffId' => $staff->get('id')); } while (0); $day->add($one_day); } } wp_send_json($result); }
/** * @return mixed|string|void */ protected function getHolidays() { $collection = AB_Holiday::query()->where('staff_id', null)->fetchArray(); $holidays = array(); if (count($collection)) { foreach ($collection as $holiday) { $holidays[$holiday['id']] = array('m' => intval(date('m', strtotime($holiday['date']))), 'd' => intval(date('d', strtotime($holiday['date']))), 'title' => $holiday['title']); // if not repeated holiday, add the year if (!$holiday['repeat_event']) { $holidays[$holiday['id']]['y'] = intval(date('Y', strtotime($holiday['date']))); } } } return json_encode($holidays); }
/** * Prepare data for staff. * * @param DateTime $start_date */ private function _prepareStaffData(DateTime $start_date) { $this->staffData = array(); $services = AB_StaffService::query('ss')->select('ss.staff_id, ss.price, ss.capacity')->whereIn('ss.staff_id', $this->staff_ids)->where('ss.service_id', $this->userData->get('service_id'))->fetchArray(); foreach ($services as $item) { $this->staffData[$item['staff_id']] = array('price' => $item['price'], 'capacity' => $item['capacity'], 'holidays' => array(), 'bookings' => array(), 'working_hours' => array()); } // Load holidays. $holidays = AB_Holiday::query('h')->whereIn('h.staff_id', $this->staff_ids)->fetchArray(); foreach ($holidays as $item) { $this->staffData[$item['staff_id']]['holidays'][] = $item; } // Load working schedule. $working_schedule = AB_StaffScheduleItem::query('ssi')->select('ssi.*, break.start_time AS break_start, break.end_time AS break_end')->leftJoin('AB_ScheduleItemBreak', 'break', 'break.staff_schedule_item_id = ssi.id')->whereIn('ssi.staff_id', $this->staff_ids)->whereNot('ssi.start_time', null)->fetchArray(); foreach ($working_schedule as $item) { if (!isset($this->staffData[$item['staff_id']]['working_hours'][$item['day_index']])) { $this->staffData[$item['staff_id']]['working_hours'][$item['day_index']] = array('start_time' => $item['start_time'], 'end_time' => $item['end_time'], 'breaks' => array()); } if ($item['break_start']) { $this->staffData[$item['staff_id']]['working_hours'][$item['day_index']]['breaks'][] = array('start' => $item['break_start'], 'end' => $item['break_end']); } } // Load bookings. $bookings = AB_CustomerAppointment::query('ca')->select('a.*, SUM(ca.number_of_persons) AS number_of_bookings')->leftJoin('AB_Appointment', 'a', 'a.id = ca.appointment_id')->leftJoin('AB_StaffService', 'ss', 'ss.staff_id = a.staff_id AND ss.service_id = a.service_id')->whereIn('a.staff_id', $this->staff_ids)->whereGte('a.start_date', $this->userData->get('date_from'))->groupBy('a.start_date')->groupBy('a.staff_id')->groupBy('a.service_id')->fetchArray(); foreach ($bookings as $item) { $item['from_google'] = false; // Handle bookings which end at 24:00. if (substr($item['end_date'], 11) == '00:00:00') { // Set time to 24:00:00 (date part does not matter, it just needs to be 10 characters length). $item['end_date'] = '10_symbols 24:00:00'; } $this->staffData[$item['staff_id']]['bookings'][] = $item; } // Handle Google Calendar events. if (get_option('ab_settings_google_two_way_sync')) { $query = AB_Staff::query('s')->whereIn('s.id', array_merge($this->userData->get('staff_ids'), array(0))); foreach ($query->find() as $staff) { $google = new AB_Google(); if ($google->loadByStaff($staff)) { $this->staffData[$staff->get('id')]['bookings'] = array_merge($this->staffData[$staff->get('id')]['bookings'], $google->getCalendarEvents($start_date) ?: array()); } } } }