array('model'=>'Service_Plugin_Adsl','foreign_key'=>'service_username','far_key'=>'service'), ); private $metrics = array( 'up_peak', 'up_offpeak', 'down_peak', 'down_offpeak', 'peer', 'internal', ); public function rules() { $result = parent::rules(); // We don use the "ID" field. unset($result['id']); return $result; } public function save(Validation $validation = NULL) { // If all our values are zero/NULL, we'll ignore if our previous one was. if ($this->total() !== 0) return parent::save($validation); $l = ORM::factory($this->_object_name)->where('service','=',$this->service)->where('supplier_id','=',$this->supplier_id)->list_last(); if ($l->total() !== 0) return parent::save($validation); // Fake our save, since the previous value is 0. $this->_loaded = $this->_saved = TRUE; $this->_changed = array(); $this->_original_values = $this->_object; return $this; } public function total() { $result = 0; foreach ($this->metrics as $metric) { if (is_null($this->$metric)) $this->$metric = 0; $result += $this->$metric; } return $result; } public function traffic(Model_Product_Plugin_Adsl $plan) { // Roll up the charges according to the product plan configuration return ADSL::allowance(array( 'base_down_peak'=>is_null($plan->base_down_peak) ? NULL : $this->down_peak, 'base_down_offpeak'=>is_null($plan->base_down_offpeak) ? NULL : $this->down_offpeak, 'base_up_peak'=>is_null($plan->base_up_peak) ? NULL : $this->up_peak, 'base_up_offpeak'=>is_null($plan->base_up_offpeak) ? NULL : $this->up_offpeak, 'extra_down_peak'=>$plan->extra_down_peak, 'extra_down_offpeak'=>$plan->extra_down_offpeak, 'extra_up_peak'=>$plan->extra_up_peak, 'extra_up_offpeak'=>$plan->extra_up_offpeak, )); } public function list_last() { return $this->order_by('date','DESC')->order_by('time','DESC')->find(); } } ?>