array('model' => 'user_token'), 'service_billing' => array('far_key'=>'id'), 'email_log' => array('far_key'=>'id'), 'group' => array('through' => 'account_group'), 'invoice' => array('far_key'=>'id'), 'payment'=>array('far_key'=>'id'), 'service' => array('far_key'=>'id'), ); protected $_has_one = array( 'country'=>array('foreign_key'=>'id'), 'currency'=>array('foreign_key'=>'id'), 'language'=>array('foreign_key'=>'id'), 'RTM'=>array('far_key'=>'id'), ); protected $_display_filters = array( 'date_orig'=>array( array('Config::date',array(':value')), ), 'date_last'=>array( array('Config::date',array(':value')), ), 'status'=>array( array('StaticList_YesNo::get',array(':value',TRUE)), ), ); protected $_save_message = TRUE; /** * Our account number format */ public function accnum() { return sprintf('%s-%04s',Company::instance()->site(TRUE),$this->id); } /** * Get the groups that an account belongs to */ public function groups() { $result = array(); foreach ($this->group->where_active()->find_all() as $go) foreach ($go->list_parentgrps(TRUE) as $cgo) if (empty($result[$cgo->id])) $result[$cgo->id] = $cgo; return $result; } /** * Get a list of all invoices for this account */ public function invoices($processed=FALSE) { $o = $this->invoice; return $processed ? $o->find_all() : $o->where_unprocessed()->find_all(); } public function isAdmin() { return ($this->RTM->loaded() AND is_null($this->RTM->parent_id)); } public function isReseller() { return $this->RTM->loaded(); } /** * Get a list of due invoices for this account * * @param int Date (in secs) to only retrieve invoices prior to this date */ public function invoices_due($date=NULL) { $result = array(); foreach ($this->invoices() as $io) if ((is_null($date) OR $io->date_orig < $date) AND $io->due()) $result[$io->id] = $io; return $result; } /** * Calculate the total of invoices due for this account */ public function invoices_due_total($date=NULL,$format=FALSE) { $result = 0; foreach ($this->invoices_due($date) as $io) $result += $io->due(); return $format ? Currency::display($result) : $result; } public function log($message) { // Log a message for this account $alo = ORM::factory('Account_Log'); $alo->account_id = $this->id; $alo->ip = Request::$client_ip; $alo->details = $message; $alo->save(); return $alo->saved(); } /** * This function will extract the available methods for this account * This is used both for menu options and method security */ public function methods() { static $result = array(); // @todo We may want to optimise this with some session caching. if ($result) return $result; foreach ($this->groups() as $go) foreach ($go->module_method->find_all() as $mmo) if (empty($result[$mmo->id])) $result[$mmo->id] = $mmo; Sort::MAsort($result,'module->name,menu_display'); return $result; } /** * Return an account name */ public function name($withcompany=FALSE) { return trim(sprintf('%s %s',$this->first_name,$this->last_name).(($withcompany AND $this->company) ? sprintf(' (%s)',$this->company) : '')); } /** * List all the services for this account */ public function services($active=TRUE) { $o = $this->service; return $active ? $o->where_active()->find_all() : $o->find_all(); } public function services_count($active=TRUE) { return $this->services($active)->count(); } /** * The key we use to sort entries of this model type */ public function sortkey($withcompany=FALSE) { $sk = ''; if ($withcompany AND $this->company) $sk .= $this->company.' '; return $sk.sprintf('%s %s',$this->last_name,$this->first_name); } /** * Search for accounts matching a term */ public function list_autocomplete($term,$index,$value,array $label,array $limit=array(),array $options=NULL) { $ao = Auth::instance()->get_user(); $this->clear(); $this->where_active(); // Build our where clause // First Name, Last name if (preg_match('/\ /',$term)) { list($fn,$ln) = explode(' ',$term,2); $this->where_open() ->where('first_name','like','%'.$fn.'%') ->and_where('last_name','like','%'.$ln.'%') ->where_close() ->or_where('company','like','%'.$term.'%'); } elseif (is_numeric($term)) { $this->where('id','like','%'.$term.'%'); } elseif (preg_match('/\@/',$term)) { $this->where('email','like','%'.$term.'%'); } else { $this->where_open() ->where('company','like','%'.$term.'%') ->or_where('first_name','like','%'.$term.'%') ->or_where('last_name','like','%'.$term.'%') ->where_close(); } // Restrict results to authorised accounts array_push($limit,array('id','IN',$ao->RTM->customers($ao->RTM))); return parent::list_autocomplete($term,$index,$value,$label,$limit,$options); } } ?>