184 lines
5.0 KiB
PHP
184 lines
5.0 KiB
PHP
<?php
|
|
|
|
namespace App\Models\Common;
|
|
|
|
use App\Abstracts\Model;
|
|
use App\Traits\Recurring as RecurringTrait;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
|
|
class Recurring extends Model
|
|
{
|
|
use RecurringTrait;
|
|
|
|
public const ACTIVE_STATUS = 'active';
|
|
public const END_STATUS = 'ended';
|
|
public const COMPLETE_STATUS = 'completed';
|
|
public const INVOICE_RECURRING_TYPE = 'invoice-recurring';
|
|
public const BILL_RECURRING_TYPE = 'bill-recurring';
|
|
public const INCOME_RECURRING_TYPE = 'income-recurring';
|
|
public const EXPENSE_RECURRING_TYPE = 'expense-recurring';
|
|
|
|
protected $table = 'recurring';
|
|
|
|
/**
|
|
* Attributes that should be mass-assignable.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $fillable = [
|
|
'company_id',
|
|
'recurable_id',
|
|
'recurable_type',
|
|
'frequency',
|
|
'interval',
|
|
'started_at',
|
|
'status',
|
|
'limit_by',
|
|
'limit_count',
|
|
'limit_date',
|
|
'auto_send',
|
|
'created_from',
|
|
'created_by',
|
|
];
|
|
|
|
/**
|
|
* The attributes that should be cast.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $casts = [
|
|
'auto_send' => 'boolean',
|
|
'deleted_at' => 'datetime',
|
|
];
|
|
|
|
/**
|
|
* Get all of the owning recurable models.
|
|
*/
|
|
public function recurable()
|
|
{
|
|
return $this->morphTo()->isRecurring();
|
|
}
|
|
|
|
public function documents()
|
|
{
|
|
return $this->morphedByMany(
|
|
'App\Models\Document\Document',
|
|
'recurable',
|
|
'recurring',
|
|
'recurable_id',
|
|
'id'
|
|
);
|
|
}
|
|
|
|
public function invoices()
|
|
{
|
|
return $this->documents()->where('type', self::INVOICE_RECURRING_TYPE);
|
|
}
|
|
|
|
public function bills()
|
|
{
|
|
return $this->documents()->where('type', self::BILL_RECURRING_TYPE);
|
|
}
|
|
|
|
public function transactions()
|
|
{
|
|
return $this->morphedByMany(
|
|
'App\Models\Banking\Transaction',
|
|
'recurable',
|
|
'recurring',
|
|
'recurable_id',
|
|
'id'
|
|
);
|
|
}
|
|
|
|
public function incomes()
|
|
{
|
|
return $this->transactions()->where('type', self::INCOME_RECURRING_TYPE);
|
|
}
|
|
|
|
public function expenses()
|
|
{
|
|
return $this->transactions()->where('type', self::EXPENSE_RECURRING_TYPE);
|
|
}
|
|
|
|
public function scopeActive(Builder $query): Builder
|
|
{
|
|
return $query->where($this->qualifyColumn('status'), '=', static::ACTIVE_STATUS);
|
|
}
|
|
|
|
public function scopeEnded(Builder $query): Builder
|
|
{
|
|
return $query->where($this->qualifyColumn('status'), '=', static::END_STATUS);
|
|
}
|
|
|
|
public function scopeCompleted(Builder $query): Builder
|
|
{
|
|
return $query->where($this->qualifyColumn('status'), '=', static::COMPLETE_STATUS);
|
|
}
|
|
|
|
public function scopeDocument(Builder $query, $type): Builder
|
|
{
|
|
return $query->where($this->qualifyColumn('recurable_type'), '=', 'App\\Models\\Document\\Document')
|
|
->whereHas('recurable', function (Builder $query) use ($type) {
|
|
$query->where('type', $type);
|
|
});
|
|
}
|
|
|
|
public function scopeInvoice(Builder $query): Builder
|
|
{
|
|
return $query->where($this->qualifyColumn('recurable_type'), '=', 'App\\Models\\Document\\Document')
|
|
->whereHas('recurable', function (Builder $query) {
|
|
$query->where('type', self::INVOICE_RECURRING_TYPE);
|
|
});
|
|
}
|
|
|
|
public function scopeBill(Builder $query): Builder
|
|
{
|
|
return $query->where($this->qualifyColumn('recurable_type'), '=', 'App\\Models\\Document\\Document')
|
|
->whereHas('recurable', function (Builder $query) {
|
|
$query->where('type', self::BILL_RECURRING_TYPE);
|
|
});
|
|
}
|
|
|
|
public function scopeTransaction(Builder $query): Builder
|
|
{
|
|
return $query->where($this->qualifyColumn('recurable_type'), '=', 'App\\Models\\Banking\\Transaction');
|
|
}
|
|
|
|
public function scopeExpenseTransaction(Builder $query): Builder
|
|
{
|
|
return $query->where($this->qualifyColumn('recurable_type'), '=', 'App\\Models\\Banking\\Transaction')
|
|
->whereHas('recurable', function (Builder $query) {
|
|
$query->where('type', self::EXPENSE_RECURRING_TYPE);
|
|
});
|
|
}
|
|
|
|
public function scopeIncomeTransaction(Builder $query): Builder
|
|
{
|
|
return $query->where($this->qualifyColumn('recurable_type'), '=', 'App\\Models\\Banking\\Transaction')
|
|
->whereHas('recurable', function (Builder $query) {
|
|
$query->where('type', self::INCOME_RECURRING_TYPE);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Determine if recurring is a document.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isDocument()
|
|
{
|
|
return (bool) ($this->recurable_type == 'App\\Models\\Document\\Document');
|
|
}
|
|
|
|
/**
|
|
* Determine if recurring is a transaction.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isTransaction()
|
|
{
|
|
return (bool) ($this->recurable_type == 'App\\Models\\Banking\\Transaction');
|
|
}
|
|
}
|