belongsTo(Invoice::class); } public function product() { return $this->belongsTo(Product::class); } public function service() { return $this->belongsTo(Service::class); } public function taxes() { return $this->hasMany(InvoiceItemTax::class); } public function getItemTypeNameAttribute() { $types = [ 1=>'Hardware', // * 2=>'Service Relocation Fee', // * Must have corresponding SERVICE_ID 3=>'Service Change', // * Must have corresponding SERVICE_ID 4=>'Service Connection', // * Must have corresponding SERVICE_ID 6=>'Service Cancellation', // * Must have corresponding SERVICE_ID 7=>'Extra Product/Service Charge', // * Service Billing in advance, Must have corresponding SERVICE_ID 8=>'Product Addition', // * Additional Product Customisation, Must have corresponding SERVICE_ID 120=>'Credit/Debit Transfer', // * SERVICE_ID is NULL, MODULE_ID is NULL, MODULE_REF is NULL : INVOICE_ID is NOT NULL 123=>'Shipping', 124=>'Late Payment Fee', // * SERVICE_ID is NULL, MODULE_ID = CHECKOUT MODULE, 125=>'Payment Fee', // * SERVICE_ID is NULL, MODULE_ID = CHECKOUT MODULE, MODULE_REF = CHECKOUT NAME 126=>'Other', // * MODEL_ID should be a module 127=>'Rounding', // * SERVICE_ID is NULL, MODULE_ID is NULL, MODULE_REF is NULL ]; switch ($this->item_type) { // * Line Charge Topic on Invoice. case 0: return sprintf('%s [%s]','Product/Service', $this->date_start == $this->date_stop ? $this->date_start->format('Y-m-d') : sprintf('%s -> %s',$this->date_start->format('Y-m-d'),$this->date_stop->format('Y-m-d'))); // * Excess Service Item, of item 0, must have corresponding SERVICE_ID case 5: return sprintf('%s [%s] (%s)','Excess Usage', $this->date_start == $this->date_stop ? $this->date_start->format('Y-m-d') : sprintf('%s -> %s',$this->date_start->format('Y-m-d'),$this->date_stop->format('Y-m-d')), $this->module_text() ); default: return array_get($types,$this->item_type,'Unknown'); } } public function module_text() { switch ($this->module_id) { // Charges Module case 30: return Charge::findOrFail($this->module_ref)->name; default: abort(500,'Unable to handle '.$this->module_id); } } public function getSubTotalAttribute() { return $this->quantity * $this->price_base; } public function getTaxAttribute() { if (! $this->_tax) { foreach ($this->taxes as $o) { $this->_tax += $o->amount; } } return $this->_tax; } public function getTotalAttribute() { return $this->tax + $this->sub_total; } }