[Back] <?php
/**
* @property string $full_name
*/
class OsAgentModel extends OsModel {
public $id,
$first_name = '',
$last_name = '',
$display_name,
$email,
$phone,
$password,
$avatar_image_id,
$bio_image_id,
$is_custom_price = false,
$is_custom_hours = false,
$is_custom_duration = false,
$custom_hours,
$wp_user_id,
$title,
$bio,
$features,
$extra_emails,
$extra_phones,
$status,
$meta_class = 'OsAgentMetaModel',
$updated_at,
$created_at,
$services_agents_table_name;
function __construct($id = false) {
parent::__construct();
$this->table_name = LATEPOINT_TABLE_AGENTS;
$this->services_agents_table_name = LATEPOINT_TABLE_AGENTS_SERVICES;
$this->nice_names = array(
'first_name' => __('First Name', 'latepoint'),
'password' => __('Password', 'latepoint'),
'email' => __('Email Address', 'latepoint'),
'wp_user_id' => __('Connected WordPress User', 'latepoint'),
'last_name' => __('Last Name', 'latepoint'));
if ($id) {
$this->load_by_id($id);
}
}
public function get_initials(){
return mb_substr($this->first_name,0,1).mb_substr($this->last_name,0,1);
}
public function get_edit_link(){
return OsRouterHelper::build_link(['agents', 'edit_form'], ['id' => $this->id] );
}
public function generate_data_vars(): array {
return [
'id' => $this->id,
'full_name' => $this->full_name,
'email' => $this->email,
'phone' => $this->phone
];
}
protected function params_to_save($role = 'admin') {
$params_to_save = array('id',
'first_name',
'last_name',
'display_name',
'email',
'phone',
'password',
'wp_user_id',
'bio_image_id',
'title',
'bio',
'features',
'status',
'extra_emails',
'extra_phones',
'avatar_image_id',
'custom_hours');
return $params_to_save;
}
protected function allowed_params($role = 'admin') {
$allowed_params = array('id',
'first_name',
'last_name',
'display_name',
'email',
'phone',
'password',
'wp_user_id',
'bio_image_id',
'title',
'bio',
'features',
'extra_emails',
'extra_phones',
'status',
'avatar_image_id',
'custom_hours');
return $allowed_params;
}
protected function properties_to_validate() {
$validations = array(
'email' => array('presence'),
'wp_user_id' => array('uniqueness'),
);
return $validations;
}
public function count_number_of_connected_locations($service_id = false) {
if ($this->is_new_record()) return 0;
$args = ['agent_id' => $this->id];
if ($service_id) $args['service_id'] = $service_id;
return OsConnectorHelper::count_connections($args, 'location_id');
}
public function delete_meta_by_key($meta_key) {
if ($this->is_new_record()) return false;
$meta = new OsAgentMetaModel();
return $meta->delete_by_key($meta_key, $this->id);
}
public function get_meta_by_key($meta_key, $default = false) {
if ($this->is_new_record()) return $default;
$meta = new OsAgentMetaModel();
return $meta->get_by_key($meta_key, $this->id, $default);
}
public function save_meta_by_key($meta_key, $meta_value) {
if ($this->is_new_record()) return false;
$meta = new OsAgentMetaModel();
return $meta->save_by_key($meta_key, $meta_value, $this->id);
}
protected function set_defaults() {
if (empty($this->status)) $this->status = LATEPOINT_AGENT_STATUS_ACTIVE;
}
public function has_location($location_id) {
return OsConnectorHelper::has_connection(['agent_id' => $this->id, 'location_id' => $location_id]);
}
protected function get_total_future_bookings() {
$bookings = new OsBookingModel();
$total = $bookings->where(['agent_id' => $this->id])->should_be_in_future()->count();
return $total;
}
protected function get_total_synced_future_bookings() {
$bookings = new OsBookingModel();
$total = $bookings->where(['agent_id' => $this->id, LATEPOINT_TABLE_BOOKING_META.'.meta_key' => 'google_calendar_event_id'])
->join(LATEPOINT_TABLE_BOOKING_META, ['object_id' => LATEPOINT_TABLE_BOOKINGS . '.id'])
->should_be_in_future()
->count();
return $total;
}
protected function get_future_bookings($limit = false) {
$bookings = new OsBookingModel();
if ($limit) {
$bookings = $bookings->set_limit($limit);
}
return $bookings->order_by('start_date, start_time asc')->where(['agent_id' => $this->id])->should_be_in_future()->get_results_as_models();
}
public function should_be_active() {
return $this->where(['status !=' => LATEPOINT_AGENT_STATUS_DISABLED]);
}
public function has_service_and_location($service_id, $location_id) {
if ($this->is_new_record()) return false;
return OsConnectorHelper::has_connection(['location_id' => $location_id, 'agent_id' => $this->id, 'service_id' => $service_id]);
}
public function get_features_arr() {
$features_arr = [];
if (!empty($this->features)) {
$features = json_decode($this->features, true);
if(!empty($features)){
foreach ($features as $feature) {
if ($feature['value'] && $feature['label']) $features_arr[] = $feature;
}
}
}
return $features_arr;
}
public function save_custom_schedule($work_periods) {
foreach ($work_periods as &$work_period) {
$work_period['agent_id'] = $this->id;
}
unset($work_period);
OsWorkPeriodsHelper::save_work_periods($work_periods);
}
public function delete_custom_schedule() {
$work_periods_model = new OsWorkPeriodModel();
$work_periods = $work_periods_model->where(array('agent_id' => $this->id, 'service_id' => 0, 'location_id' => 0, 'custom_date' => 'IS NULL'))->get_results_as_models();
if (is_array($work_periods)) {
foreach ($work_periods as $work_period) {
$work_period->delete();
}
}
}
public function has_service($service_id) {
foreach ($this->services as $service) {
if ($service->id == $service_id) return true;
}
return false;
}
public function save_services() {
foreach ($this->services as $service) {
$service_connection_row = $this->db->get_row($this->db->prepare('SELECT id FROM ' . $this->services_agents_table_name . ' WHERE agent_id = %d AND service_id = %d', array($this->id, $service->id)));
if ($service_connection_row) {
$update_data = array('is_custom_hours' => $service->is_custom_hours, 'is_custom_price' => $service->is_custom_price, 'is_custom_duration' => $service->is_custom_duration);
$this->db->update($this->services_agents_table_name, $update_data, array('id' => $service_connection_row->id));
} else {
$insert_data = array('service_id' => $service->id, 'agent_id' => $this->id, 'is_custom_hours' => $service->is_custom_hours, 'is_custom_price' => $service->is_custom_price, 'is_custom_duration' => $service->is_custom_duration);
if ($this->db->insert($this->services_agents_table_name, $insert_data)) {
$service_connection_row_id = $this->db->insert_id;
}
}
}
return true;
}
public function remove_services_by_ids($ids_to_remove = array()) {
if ($ids_to_remove) {
$query = $this->db->prepare('DELETE FROM %i WHERE agent_id = %d AND service_id IN ' . OsModel::where_in_array_to_string($ids_to_remove), [$this->services_agents_table_name, $this->id]);
$this->db->query($query);
}
}
public function get_service_ids_to_remove($new_services = array()) {
$current_service_ids = $this->get_current_service_ids_from_db();
$new_service_ids = array();
foreach ($new_services as $service) {
if ($service['connected'] == "yes") $new_service_ids[] = $service['id'];
}
$service_ids_to_remove = array_diff($current_service_ids, $new_service_ids);
return $service_ids_to_remove;
}
public function save_locations_and_services($services) {
if (!$services) return true;
$connections_to_save = [];
$connections_to_remove = [];
foreach ($services as $service_key => $locations) {
$service_id = str_replace('service_', '', $service_key);
foreach ($locations as $location_key => $location) {
$location_id = str_replace('location_', '', $location_key);
$connection = ['service_id' => $service_id, 'agent_id' => $this->id, 'location_id' => $location_id];
if ($location['connected'] == 'yes') {
$connections_to_save[] = $connection;
} else {
$connections_to_remove[] = $connection;
}
}
}
if (!empty($connections_to_save)) {
foreach ($connections_to_save as $connection_to_save) {
OsConnectorHelper::save_connection($connection_to_save);
}
}
if (!empty($connections_to_remove)) {
foreach ($connections_to_remove as $connection_to_remove) {
OsConnectorHelper::remove_connection($connection_to_remove);
}
}
return true;
}
public function set_features($features) {
$this->features = wp_json_encode($features);
}
public function get_current_service_ids_from_db() {
$query = $this->db->prepare('SELECT service_id FROM ' . $this->services_agents_table_name . ' WHERE agent_id = %d', $this->id);
$service_rows = $this->db->get_results($query);
$service_ids = array();
if ($service_rows) {
foreach ($service_rows as $service_row) {
$service_ids[] = $service_row->service_id;
}
}
return $service_ids;
}
public function get_current_service_ids() {
$service_ids = array();
foreach ($this->services as $service) {
$service_ids[] = $service->id;
}
return $service_ids;
}
public function set_services($service_datas) {
$this->services = array();
foreach ($service_datas as $service_data) {
if ($service_data['connected'] == "yes") {
$service = new OsserviceModel();
$service->id = $service_data['id'];
$service->is_custom_hours = $service_data['is_custom_hours'];
$service->is_custom_price = $service_data['is_custom_price'];
$service->is_custom_duration = $service_data['is_custom_duration'];
$this->services[] = $service;
}
}
return $this;
}
public function filter_allowed_records(): OsModel{
if(!OsRolesHelper::are_all_records_allowed('agent')){
$this->filter_where_conditions(['id' => OsRolesHelper::get_allowed_records('agent')]);
}
return $this;
}
public function get_services() {
if (!isset($this->services)) {
$query = 'SELECT * FROM ' . $this->services_agents_table_name . ' WHERE agent_id = %d GROUP BY service_id';
$query_args = array($this->id);
$services_rows = $this->get_query_results($query, $query_args);
$this->services = array();
if ($services_rows) {
foreach ($services_rows as $service_row) {
$service = new OsServiceModel($service_row->service_id);
$service->is_custom_hours = $service_row->is_custom_hours;
$service->is_custom_price = $service_row->is_custom_price;
$service->is_custom_duration = $service_row->is_custom_duration;
$this->services[] = $service;
}
}
}
return $this->services;
}
protected function before_create() {
if (empty($this->password)) $this->password = wp_hash_password(bin2hex(openssl_random_pseudo_bytes(8)));
}
protected function before_save() {
}
public function get_full_name() {
$full_name = trim(join(' ', array($this->first_name, $this->last_name)));
return empty($full_name) ? __('Agent', 'latepoint') : $full_name;
}
protected function get_name_for_front() {
if (isset($this->display_name) && !empty($this->display_name)) {
return $this->display_name;
} else {
return $this->get_full_name();
}
}
public function get_avatar_url() {
return OsAgentHelper::get_avatar_url($this);
}
public function get_avatar_image() {
return '<img src="' . $this->get_avatar_url() . '"/>';
}
public function get_bio_image_url() {
return OsAgentHelper::get_bio_image_url($this);
}
public function get_bio_image() {
return '<img src="' . $this->get_bio_image_url() . '"/>';
}
public function delete($id = false) {
if (!$id && isset($this->id)) {
$id = $this->id;
}
if ($id && $this->db->delete($this->table_name, array('id' => $id), array('%d'))) {
$this->db->delete(LATEPOINT_TABLE_AGENTS_SERVICES, array('agent_id' => $id), array('%d'));
$this->db->delete(LATEPOINT_TABLE_WORK_PERIODS, array('agent_id' => $id), array('%d'));
$this->db->delete(LATEPOINT_TABLE_AGENT_META, array('object_id' => $id), array('%d'));
return true;
} else {
return false;
}
}
}