/** * @param $field * @param $data */ public function validateEmail($field, $data) { if ($data['email']) { if (!is_email($data['email'])) { $this->errors[$field] = __('Invalid email', 'bookly'); } // Check email for uniqueness when a new WP account will be created. if (get_option('ab_settings_create_account', 0) && $data['name'] && !get_current_user_id()) { $wp_user = AB_Customer::query('c')->select('c.wp_user_id')->where('c.name', $data['name'])->where('c.email', $data['email'])->fetchArray(); $wp_user_id = $wp_user['0']['wp_user_id']; if (!$wp_user_id && email_exists($data['email'])) { $this->errors[$field] = __('This email is already in use', 'bookly'); } } } else { $this->errors[$field] = __('Please tell us your email', 'bookly'); } }
/** * Get list of customers. */ public function executeGetCustomers() { $wpdb = $this->getWpdb(); $response = array('customers' => array(), 'total' => 0, 'pages' => 0, 'active_page' => 0); $page = intval($this->getParameter('page')); $sort = in_array($this->getParameter('sort'), array('name', 'phone', 'email', 'notes', 'last_appointment', 'total_appointments', 'payments', 'wp_user')) ? $this->getParameter('sort') : 'name'; $order = in_array($this->getParameter('order'), array('asc', 'desc')) ? $this->getParameter('order') : 'asc'; $filter = $wpdb->_real_escape($this->getParameter('filter')); $items_per_page = 20; $total = AB_Customer::query()->count(); $pages = ceil($total / $items_per_page); if ($page < 1 || $page > $pages) { $page = 1; } if ($total) { $query = AB_Customer::query('c')->select('c.*, MAX(a.start_date) AS last_appointment, COUNT(a.id) AS total_appointments, COALESCE(SUM(p.total),0) AS payments, wpu.display_name AS wp_user')->leftJoin('AB_CustomerAppointment', 'ca', 'ca.customer_id = c.id')->leftJoin('AB_Appointment', 'a', 'a.id = ca.appointment_id')->leftJoin('AB_Payment', 'p', 'p.customer_appointment_id = ca.id')->tableJoin($wpdb->users, 'wpu', 'wpu.ID = c.wp_user_id'); // WHERE if ($filter !== '') { $query->whereLike('c.name', "%{$filter}%")->whereLike('c.phone', "%{$filter}%", 'OR')->whereLike('c.email', "%{$filter}%", 'OR'); } $data = $query->groupBy('c.id')->sortBy($sort)->order($order)->limit($items_per_page)->offset(($page - 1) * $items_per_page)->fetchArray(); array_walk($data, function (&$row) { if ($row['last_appointment']) { $row['last_appointment'] = AB_DateTimeUtils::formatDateTime($row['last_appointment']); } $row['payments'] = AB_Utils::formatPrice($row['payments']); }); // Populate response. $response['customers'] = $data; $response['total'] = $total; $response['pages'] = $pages; $response['active_page'] = $page; } wp_send_json_success($response); }
/** * Get data needed for appointment form initialisation. */ public function executeGetDataForAppointmentForm() { $result = array('staff' => array(), 'customers' => array(), 'custom_fields' => array(), 'time' => array(), 'time_interval' => get_option('ab_settings_time_slot_length') * 60); // Staff list. $staff_members = AB_Utils::isCurrentUserAdmin() ? AB_Staff::query()->sortBy('position')->find() : AB_Staff::query()->where('wp_user_id', get_current_user_id())->find(); /** @var AB_Staff $staff_member */ foreach ($staff_members as $staff_member) { $services = array(); foreach ($staff_member->getStaffServices() as $staff_service) { $services[] = array('id' => $staff_service->service->get('id'), 'title' => sprintf('%s (%s)', $staff_service->service->get('title'), AB_Service::durationToString($staff_service->service->get('duration'))), 'duration' => $staff_service->service->get('duration'), 'capacity' => $staff_service->get('capacity')); } $result['staff'][] = array('id' => $staff_member->get('id'), 'full_name' => $staff_member->get('full_name'), 'services' => $services); } // Customers list. foreach (AB_Customer::query()->sortBy('name')->find() as $customer) { $name = $customer->get('name'); if ($customer->get('email') != '' || $customer->get('phone') != '') { $name .= ' (' . trim($customer->get('email') . ', ' . $customer->get('phone'), ', ') . ')'; } $result['customers'][] = array('id' => $customer->get('id'), 'name' => $name, 'custom_fields' => array(), 'number_of_persons' => 1); } // Time list. $ts_length = AB_BookingConfiguration::getTimeSlotLength(); $time_start = AB_StaffScheduleItem::WORKING_START_TIME; $time_end = AB_StaffScheduleItem::WORKING_END_TIME; // Run the loop. while ($time_start <= $time_end) { $result['time'][] = array('value' => AB_DateTimeUtils::buildTimeString($time_start, false), 'title' => AB_DateTimeUtils::formatTime($time_start)); $time_start += $ts_length; } wp_send_json($result); }