[ 'request'=>'options.address', 'key'=>'service_address', 'validation'=>'required|string:10|unique:service_broadband,service_address', 'validation_message'=>'Address is a required field.', ], 'options.notes'=>[ 'request'=>'options.notes', 'key'=>'order_info.notes', 'validation'=>'present', 'validation_message'=>'Special Instructions here.', ], ]; // The model that is referenced when this product is ordered protected string $order_model = ServiceBroadband::class; /* RELATIONS */ /** * The offering supplied with this product * * @return \Illuminate\Database\Eloquent\Relations\HasOne */ public function supplied() { return $this->hasOne(SupplierBroadband::class,'id','supplier_item_id'); } /* INTERFACES */ /** * Calculate the allowance array or traffic used array * * @param array Traffic Used in each metric. * @param bool $ceil Round the numbers to integers * @return array|string */ public function allowance(array $data=[],bool $ceil=TRUE): Collection { $config = collect(); foreach (array_keys(SupplierBroadband::traffic_map) as $k => $v) { // Base Config $config->put($k,$this->{$k}); // Excess Config $config->put($v,$this->{$v}); } // Shaped or Charge $config->put('shaped',$this->extra_shaped); $config->put('charged',$this->extra_charged); // Metric - used to round down data in $data. $config->put('metric',$this->metric); return $this->supplied->allowance($config,$data,$ceil); } /* ATTRIBUTES */ /** * Return the suppliers cost for this service * * @return float */ // @todo To check public function allowance_cost(): float { $result = 0; foreach ($this->supplied->allowance(NULL,$this->allowance([])->toArray()) as $k=>$v) { $result += -$v*$this->supplied->{SupplierBroadband::traffic_map[$k]}; } return $result; } /** * Render the allowance as a string * eg: 50/100 * * @return string */ // @todo To check public function allowance_string(): string { $result = ''; $data = $this->allowance(); foreach ([ 'base_down_peak', 'base_up_peak', 'base_down_offpeak', 'base_up_offpeak', ] as $k) { if ($data->has($k)) { if ($result) $result .= '/'; $result .= $data->get($k); } } return $result; } /** * The product contract term is the highest of * + This defined contract_term * + The suppliers contract_term * * @return int */ public function getContractTermAttribute(): int { return max($this->attributes['contract_term'],$this->supplied->getContractTermAttribute()); } public function getCostAttribute(): float { abort(500,'deprecated'); // @todo Tax shouldnt be hard coded return ($this->supplied->base_cost+$this->allowance_cost())*1.1; } public function getSupplierAttribute() { abort(500,'deprecated'); return $this->getRelationValue('supplier'); } public function hasUsage(): bool { return TRUE; } }