array('through'=>'invoice_item'), ); protected $_has_one = array( 'service_adsl'=>array('far_key'=>'id'), 'service_domain'=>array('far_key'=>'id'), ); protected $_belongs_to = array( 'product'=>array(), 'account'=>array(), ); /** * Filters used to format the display of values into friendlier values */ protected $_display_filters = array( 'active'=>array( array('StaticList_YesNo::display',array(':value')), ), 'date_last_invoice'=>array( array('Config::date',array(':value')), ), 'date_next_invoice'=>array( array('Config::date',array(':value')), ), 'recur_schedule'=>array( array('StaticList_RecurSchedule::display',array(':value')), ), 'price'=>array( array('Tax::add',array(':value')), array('Currency::display',array(':value')), ), ); /** * The service_name should be implemented in child objects. * It renders the name of the service, typically used on invoice */ protected function _service_name() { throw new Kohana_Exception(':method not defined in child class :class',array(':method'=>__METHOD__,':class'=>get_class($this))); } /** * The service_view should be implemented in child objects. * It renders the details of the ordered service */ protected function _service_view() { throw new Kohana_Exception(':method not defined in child class :class',array(':method'=>__METHOD__,':class'=>get_class($this))); } /** * The _details should be implemented in child objects. */ protected function _details($type) { throw new Kohana_Exception(':method not defined in child class :class',array(':method'=>__METHOD__,':class'=>get_class($this))); } protected function _admin_update() { throw new Kohana_Exception(':method not defined in child class :class',array(':method'=>__METHOD__,':class'=>get_class($this))); } /** * Return the object of the product plugin */ private function plugin() { if (! $this->product->prod_plugin_file) return NULL; if (! is_numeric($this->product->prod_plugin_data)) throw new Kohana_Exception('Missing plugin_id for :product (:type)',array(':product'=>$this->product->id,':type'=>$this->product->prod_plugin_file)); $spn = sprintf('%s_%s',get_class($this),$this->product->prod_plugin_file); return new $spn(array('service_id'=>$this->id)); } /** * Display the service number */ public function id() { return sprintf('%05s',$this->id); } /** * Display the service product name */ public function name() { return $this->product->name(); } /** * Display the product feature summary */ public function product_feature_summary() { return $this->product->feature_summary(); } /** * Display the service details */ public function service_view() { if (is_null($plugin = $this->plugin())) return HTML::nbsp(''); else return $plugin->_service_view(); } public function service_name() { if (is_null($plugin = $this->plugin())) return $this->name(); else return $plugin->_service_name(); } /** * Render some details for specific calls, eg: invoice */ public function details($type) { switch ($type) { case 'invoice': if (is_null($plugin = $this->plugin())) return array(); else return $plugin->_details($type); break; default: throw new Kohana_Exception('Unkown detail request :type',array(':type'=>$type)); } } public function admin_update() { if (is_null($plugin = $this->plugin())) return NULL; else return $plugin->_admin_update(); } // @todo To implement /** * Calculate the tax for this item */ public function tax() { return $this->price * .1; } } ?>