'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'); } }