array( array('ORM::get_next_id',array(':model',':field')), ), 'site_id'=>array( array('ORM::set_site_id',array(':model',':field')), ), ); } /** * Add our OSB site_id to each SELECT query * @see parent::__build() */ final protected function _build($type) { // Exclude tables without site ID's if (! in_array($this->_table_name,ORM::$no_site_id_tables)) $this->where($this->_object_name.'.site_id','=',Company::instance()->site()); return parent::_build($type); } /** * Determine if the account is authoised by the user */ public function authorised(Model $o=NULL,Model_Account $ao=NULL,$aid='account_id') { if (is_null($o)) $o = $this; if (is_null($ao)) $ao = Auth::instance()->get_user(); return in_array($o->{$aid},$ao->RTM->customers($ao->RTM)); } /** * Override KH's ORM count_relations() function, to include our site_id in the query. * * This is a copy of KH's ORM count_relations() function, with the addition of a where * clause to include the site id. */ public function count_relations($alias, $far_keys = NULL) { if ($far_keys === NULL) { return (int) DB::select(array(DB::expr('COUNT(*)'), 'records_found')) ->from($this->_has_many[$alias]['through']) ->where($this->_has_many[$alias]['foreign_key'], '=', $this->pk()) ->where('site_id', '=', Company::instance()->site()) ->execute($this->_db)->get('records_found'); } $far_keys = ($far_keys instanceof ORM) ? $far_keys->pk() : $far_keys; // We need an array to simplify the logic $far_keys = (array) $far_keys; // Nothing to check if the model isn't loaded or we don't have any far_keys if ( ! $far_keys OR ! $this->_loaded) return 0; $count = (int) DB::select(array(DB::expr('COUNT(*)'), 'records_found')) ->from($this->_has_many[$alias]['through']) ->where($this->_has_many[$alias]['foreign_key'], '=', $this->pk()) ->where($this->_has_many[$alias]['far_key'], 'IN', $far_keys) ->where('site_id', '=', Company::instance()->site()) ->execute($this->_db)->get('records_found'); // Rows found need to match the rows searched return (int) $count; } public function config($key) { $mc = Config::instance()->module_config($this->_object_name); return empty($mc[$key]) ? '' : $mc[$key]; } /** * Get Next record id * * @param array Validate object * @param string Primary Key */ final public static function get_next_id($model,$field) { if (! is_null($model->$field)) return TRUE; $model->_changed[$field] = $field; $ido = ORM::factory('Module') ->where('name','=',$model->_table_name) ->find(); if (! $ido->loaded()) throw new Kohana_Exception('Problem getting record_id for :table',array(':table'=>$model->_table_name)); $model->$field = $ido->record_id->next_id($ido->id); return TRUE; } final public function mid() { return ORM::factory('Module',array('name'=>$this->_table_name)); } /** * Set the site ID attribute for each row update */ final public static function set_site_id($model,$field) { if (! is_null($model->$field)) return TRUE; $model->_changed[$field] = $field; $model->$field = Company::instance()->site(); return TRUE; } /** * Function help to find records that are active */ public function list_active($active=TRUE) { $x=($active ? $this->where_active() : $this); return $x->find_all(); } public function list_count($active=TRUE) { $x=($active ? $this->where_active() : $this); return $x->find_all()->count(); } public function where_active() { return $this->where($this->_table_name.'.active','=',TRUE); } public function where_authorised(Model_Account $ao=NULL,$aid='account_id') { if (is_null($ao)) $ao = Auth::instance()->get_user(); return $this->where($aid,'IN',$ao->RTM->customers($ao->RTM)); } public function where_startstop($date,$date_end,$start='date_start',$stop='date_stop') { if (array_key_exists('priority',$this->table_columns())) $this->order_by('priority','ASC'); return $this ->where_open() ->where_open()->where($start,'<=',$date)->and_where($stop,'>=',$date)->where_close() ->or_where_open()->where($start,'<=',$date_end)->and_where($stop,'>=',$date_end)->where_close() ->or_where_open()->where($start,'is',NULL)->where_open()->where($stop,'is',NULL)->or_where($stop,'>=',$date)->where_close()->where_close() ->or_where_open()->where($stop,'is',NULL)->where_open()->where($start,'is',NULL)->or_where($start,'<=',$date_end)->where_close()->where_close() ->where_close() ->order_by($start,'ASC') ->order_by($stop,'ASC'); } } ?>