osb/app/Models/Charge.php

107 lines
2.2 KiB
PHP
Raw Permalink Normal View History

2018-08-01 07:09:38 +00:00
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Arr;
2024-07-25 04:08:26 +00:00
use Illuminate\Support\Facades\Log;
use Leenooks\Traits\ScopeActive;
2018-08-01 07:09:38 +00:00
use App\Casts\CollectionOrNull;
use App\Traits\SiteID;
2022-06-11 07:39:25 +00:00
/**
* CLEANUP NOTES:
* + It would be useful, given an array of Charges to call a function that renders them into invoice format. This may provide consistence and be the single view of how charges do look on an invoice.
*/
2018-08-01 07:09:38 +00:00
class Charge extends Model
{
use ScopeActive,SiteID;
2022-06-11 07:39:25 +00:00
protected $casts = [
'attributes' => CollectionOrNull::class,
2024-07-25 04:08:26 +00:00
'start_at' => 'datetime:Y-m-d',
'stop_at' => 'datetime:Y-m-d',
'charge_at' => 'datetime:Y-m-d', // The date the charge applies - since it can be different to created_at
2022-06-11 07:39:25 +00:00
];
2018-08-01 07:09:38 +00:00
public const sweep = [
// 0 => 'Daily',
// 1 => 'Weekly',
// 2 => 'Monthly',
// 3 => 'Quarterly',
// 4 => 'Semi-Annually',
// 5 => 'Annually',
6 => 'Service Rebill',
];
/* RELATIONS */
public function account()
{
return $this->belongsTo(Account::class);
}
2022-06-11 07:39:25 +00:00
public function product()
{
return $this->belongsTo(Product::class);
}
public function service()
{
return $this->belongsTo(Service::class);
}
/* SCOPES */
/** @deprecated use pending */
public function scopeUnprocessed($query)
{
2024-07-25 04:08:26 +00:00
Log::alert('UMO:! Deprecated function scopeUnprocessed()');
return $this->scopePending();
}
public function scopePending($query) {
return $query
->active()
2022-07-25 13:59:28 +00:00
->whereNotNull('charge_at')
->whereNotNull('type')
->where(fn($query)=>$query->where('processed',FALSE)->orWhereNull('processed'));
}
/* ATTRIBUTES */
public function getNameAttribute(): string
2018-08-01 07:09:38 +00:00
{
2024-07-25 04:08:26 +00:00
return sprintf('%s %s',
$this->description,
$this->getAttribute('attributes')
? $this->getAttribute('attributes')->join('|')
2024-07-25 04:08:26 +00:00
: '');
}
public function getSubTotalAttribute(): float
{
return $this->quantity*$this->amount;
}
public function getTotalAttribute(): float
{
return $this->account->taxed($this->getSubTotalAttribute());
2018-08-01 07:09:38 +00:00
}
public function getTypeNameAttribute(): string
{
return Arr::get(InvoiceItem::type,$this->type);
}
/**
* Is this charge processable
*
* @return bool
*/
public function getUnprocessedAttribute(): bool
{
return $this->active && (! $this->processed);
}
2018-08-01 07:09:38 +00:00
}