Move billing more service::class methods into __get(), use of component ribbons for service status
This commit is contained in:
@@ -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')))
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user