diff --git a/app/Console/Commands/ServiceList.php b/app/Console/Commands/ServiceList.php index 90b9864..939e8c2 100644 --- a/app/Console/Commands/ServiceList.php +++ b/app/Console/Commands/ServiceList.php @@ -49,7 +49,7 @@ class ServiceList extends Command )); foreach (Service::cursor() as $o) { - if ((! $this->option('inactive')) && (! $o->isActive())) + if ((! $this->option('inactive')) && (! $o->is_active)) continue; if ($this->option('type') && ($o->product->getCategoryAttribute() !== $this->option('type'))) diff --git a/app/Models/Service.php b/app/Models/Service.php index db0b5e6..6a44702 100644 --- a/app/Models/Service.php +++ b/app/Models/Service.php @@ -43,14 +43,20 @@ use App\Traits\{ScopeAccountUserAuthorised,ScopeServiceActive,SiteID}; * + billing_cost_orig_taxed : Cost for this service before being overridden by $this->cost (with Account TAX) * + billing_interval : The period that this service is billed * + billing_interval_name : The period that this service is billed as a name + * + contract_term : The term that this service must be active + * + is_active : Is this service active. It is active, if active=true, or the order_status is not in self::INACTIVE_STATUS[] * + is_billed : Does this service generate an invoice + * + is_cancelled : Service that has been cancelled or never provisioned * + is_charge_overridden : Has the price been overridden + * + is_contracted : Is this service on a contract * + is_cost_overridden : Has the cost been overridden + * + is_pending_active : Has this service been ordered, waiting to be active + * + is_pending_change : Is this service changing + * + is_pending_cancel : Is this active service being cancelled + * + status : Service status (inactive/active) * * Attributes for services (OLD): - * + additional_cost : Pending additional charges for this service (excluding setup) //@todo check all these are still valid * + invoiced_to : When this service has been billed to - * + contract_term : The term that this service must be active * + contract_end : The date that the contract ends for this service * + name : Service short name with service address * + name_short : Service Product short name, eg: phone number, domain name, certificate CN @@ -58,12 +64,6 @@ use App\Traits\{ScopeAccountUserAuthorised,ScopeServiceActive,SiteID}; * + product : Our product that is providing this service * + sid : System ID for service * + supplied : The model of the supplier's product used for this service. - * - * Methods: - * + isPending : Is this a pending active service - * - * @package App\Models - * @todo Add min_charge */ class Service extends Model implements IDs { @@ -301,9 +301,22 @@ class Service extends Model implements IDs 'billing_interval' => $this->recur_schedule ?: $this->product->billing_interval, 'billing_interval_name' => Invoice::billing_name($this->billing_interval), + 'contract_term' => max($this->supplied->contract_term,$this->product->type->contract_term), + + 'is_active' => $this->active || ($this->order_status && (! in_array($this->order_status,self::INACTIVE_STATUS))), 'is_billed' => (! ($this->external_billing || $this->suspend_billing || ($this->price === 0))), + 'is_cancelled' => in_array($this->order_status,self::INACTIVE_STATUS), 'is_charge_overridden' => (! is_null($this->price)), + 'is_contracted' => $this->getContractEndAttribute() && $this->getContractEndAttribute()->greaterThan(Carbon::now()), 'is_cost_overridden' => (! is_null($this->cost)), + 'is_pending_active' => (! $this->active) && (! is_null($this->order_status)) && (! in_array($this->order_status,array_merge(self::INACTIVE_STATUS,['INACTIVE']))), + 'is_pending_change' => $this->active && $this->changes()->where('service__change.active',TRUE)->where('complete',FALSE)->count(), + 'is_pending_cancel' => $this->active && in_array(strtolower($this->order_status),['cancel-request','cancel-pending']), + + 'status' => $this->active + ? strtolower($this->order_status) + : ((strtolower($this->order_status) === 'cancelled') ? 'cancelled' : 'inactive'), + default => parent::__get($key), }; } @@ -571,7 +584,7 @@ class Service extends Model implements IDs if (! $this->start_at) return $this->type->expire_at; - $end = $this->start_at->clone()->addMonths($this->getContractTermAttribute()); + $end = $this->start_at->clone()->addMonths($this->contract_term); // If we dont have an expire date, use the start date + contract_term if (! $this->type->expire_at) @@ -581,17 +594,6 @@ class Service extends Model implements IDs return ($end < $this->type->expire_at) ? $this->type->expire_at : $end; } - /** - * This function will determine the minimum contract term for a service, which is the maximum of - * supplied->contract_term, or the product->type->contract_term; - * - * @return int - */ - public function getContractTermAttribute(): int - { - return max($this->supplied->contract_term,$this->product->type->contract_term); - } - /** * Return the date for the next invoice * @@ -645,9 +647,7 @@ class Service extends Model implements IDs */ public function getNameShortAttribute() { - return $this->type->getServiceNameAttribute() - ? $this->type->getServiceNameAttribute() - : 'SID:'.$this->sid; + return $this->type->getServiceNameAttribute() ?: 'SID:'.$this->sid; } /** @@ -708,18 +708,6 @@ class Service extends Model implements IDs : NULL; } - /** - * Return the Service Status - * - * @return string - */ - public function getStatusAttribute(): string - { - return $this->active - ? strtolower($this->order_status) - : ((strtolower($this->order_status) === 'cancelled') ? 'cancelled' : 'inactive'); - } - /** * Return the product that supplies this service * ie: product/* @@ -898,7 +886,7 @@ class Service extends Model implements IDs $max = max($date,$this->getCancelDateAttribute())->clone(); if (! $this->getPaidToAttribute()) - return $this->getContractTermAttribute()*$this->billing_charge_normalised_taxed; + return $this->contract_term*$this->billing_charge_normalised_taxed; if ($this->getPaidToAttribute()->lessThan($max)) { $d = $this->getPaidToAttribute()->diffInDays($max); @@ -938,7 +926,7 @@ class Service extends Model implements IDs $max = max($date,$this->getCancelDateAttribute())->clone(); if (! $this->getInvoicedToAttribute()) - return $this->getContractTermAttribute()*$this->billing_cost_normalised_taxed; + return $this->contract_term*$this->billing_cost_normalised_taxed; if ($this->getInvoicedToAttribute()->lessThan($max)) { $d = $this->getInvoicedToAttribute()->diffInDays($max); @@ -1000,17 +988,6 @@ class Service extends Model implements IDs ->get(); } - /** - * Determine if a service is active. It is active, if active=1, or the order_status is not in self::INACTIVE_STATUS[] - * - * @return bool - */ - public function isActive(): bool - { - return $this->attributes['active'] - || ($this->order_status && (! in_array($this->order_status,self::INACTIVE_STATUS))); - } - /** * Determine if the current user has the role for this service * @@ -1060,28 +1037,6 @@ class Service extends Model implements IDs return FALSE; } - public function isContract(): bool - { - return $this->getContractEndAttribute() && $this->getContractEndAttribute()->greaterThan(Carbon::now()); - } - - /** - * Identify if a service is being ordered, ie: not active yet nor cancelled - * - * @return bool - */ - public function isPending(): bool - { - return (! $this->active) - && (! is_null($this->order_status)) - && (! in_array($this->order_status,array_merge(self::INACTIVE_STATUS,['INACTIVE']))); - } - - public function isPendingCancel(): bool - { - return in_array(strtolower($this->order_status),['cancel-request','cancel-pending']); - } - /** * Generate a collection of invoice_item objects that will be billed for the next invoice * @@ -1091,7 +1046,7 @@ class Service extends Model implements IDs */ public function next_invoice_items(Carbon $billdate=NULL): Collection { - if ($this->wasCancelled() || (! $this->is_billed)) + if ($this->is_cancelled || (! $this->is_billed)) return collect(); $o = collect(); @@ -1180,14 +1135,4 @@ class Service extends Model implements IDs { return $this->order_info ? $this->order_info->get($key) : NULL; } - - /** - * Service that was cancelled or never provisioned - * - * @return bool - */ - public function wasCancelled(): bool - { - return in_array($this->order_status,self::INACTIVE_STATUS); - } } \ No newline at end of file diff --git a/resources/views/components/ribbons/change.blade.php b/resources/views/components/ribbons/change.blade.php new file mode 100644 index 0000000..440cec0 --- /dev/null +++ b/resources/views/components/ribbons/change.blade.php @@ -0,0 +1,7 @@ +@if($change) +