<?php class OsLocationModel extends OsModel{ public $id, $name, $full_address, $selection_image_id, $status, $category_id, $order_number, $services_agents_table_name, $updated_at, $created_at; function __construct($id = false){ parent::__construct(); $this->table_name = LATEPOINT_TABLE_LOCATIONS; $this->services_agents_table_name = LATEPOINT_TABLE_AGENTS_SERVICES; $this->nice_names = array( 'name' => __('Location Name', 'latepoint')); if($id){ $this->load_by_id($id); } } public function generate_data_vars(): array { $location_category = empty($this->category_id) ? false : new OsLocationCategoryModel($this->category_id); return [ 'id' => $this->id, 'name' => $this->name, 'full_address' => $this->full_address, 'category' => $location_category ? $location_category->get_data_vars() : [], ]; } public function filter_allowed_records(): OsModel{ if(!OsRolesHelper::are_all_records_allowed('location')){ $this->filter_where_conditions(['id' => OsRolesHelper::get_allowed_records('location')]); } return $this; } protected function allowed_params($role = 'admin'){ $allowed_params = array('id', 'name', 'full_address', 'status', 'category_id', 'order_number', 'selection_image_id', ); return $allowed_params; } protected function params_to_save($role = 'admin'){ $params_to_save = array('id', 'name', 'status', 'category_id', 'order_number', 'full_address', 'selection_image_id'); return $params_to_save; } protected function before_create(){ } protected function set_defaults(){ if(empty($this->category_id)) $this->category_id = 0; if(empty($this->status)) $this->status = LATEPOINT_LOCATION_STATUS_ACTIVE; } public function save_custom_schedule($work_periods){ foreach($work_periods as &$work_period){ $work_period['location_id'] = $this->id; } unset($work_period); OsWorkPeriodsHelper::save_work_periods($work_periods); } public function get_google_maps_link($embed = false){ $extra = $embed ? '&output=embed' : ''; return 'https://google.com/maps?q='.urlencode($this->full_address).$extra; } public function get_google_maps_iframe($height = '240'){ return '<iframe width="100%" height="'.$height.'" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="'.$this->get_google_maps_link(true).'"></iframe>'; } public function delete_custom_schedule(){ $work_periods_model = new OsWorkPeriodModel(); $work_periods = $work_periods_model->where(array('location_id' => $this->id, 'agent_id' => 0, 'service_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 count_number_of_connected_services($agent_id = false){ if($this->is_new_record()) return 0; $args = ['location_id' => $this->id]; if($agent_id) $args['agent_id'] = $agent_id; return OsConnectorHelper::count_connections($args, 'service_id'); } public function get_connected_agents(){ $connector = new OsConnectorModel(); $agent_ids = $connector->select('agent_id')->where(['location_id' => $this->id])->group_by('agent_id')->get_results(); $agents = []; if($agent_ids){ foreach($agent_ids as $connector_row){ $agents[] = new OsAgentModel($connector_row->agent_id); } } return $agents; } public function save_agents_and_services($agents){ if(!$agents) return true; $connections_to_save = []; $connections_to_remove = []; foreach($agents as $agent_key => $services){ $agent_id = str_replace('agent_', '', $agent_key); foreach($services as $service_key => $service){ $service_id = str_replace('service_', '', $service_key); $connection = ['location_id' => $this->id, 'agent_id' => $agent_id, 'service_id' => $service_id]; if($service['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 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('location_id' => $id), array( '%d' ) ); $this->db->delete(LATEPOINT_TABLE_BOOKINGS, array('location_id' => $id), array( '%d' ) ); $this->db->delete(LATEPOINT_TABLE_WORK_PERIODS, array('location_id' => $id), array( '%d' ) ); return true; }else{ return false; } } public function should_be_active(){ return $this->where(['status' => LATEPOINT_LOCATION_STATUS_ACTIVE]); } public function is_active(){ return ($this->status == LATEPOINT_LOCATION_STATUS_ACTIVE); } public function get_selection_image_url(){ $default_location_image_url = LATEPOINT_IMAGES_URL . 'location-image.png'; return OsImageHelper::get_image_url_by_id($this->selection_image_id, 'thumbnail', $default_location_image_url); } public function has_agent($agent_id){ return OsConnectorHelper::has_connection(['location_id' => $this->id, 'agent_id' => $agent_id]); } public function has_agent_and_service($agent_id, $service_id){ if($this->is_new_record()) return false; return OsConnectorHelper::has_connection(['location_id' => $this->id, 'agent_id' => $agent_id, 'service_id' => $service_id]); } protected function properties_to_validate(){ $validations = array( 'name' => array('presence', 'uniqueness'), ); return $validations; } }