673 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			673 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace App\Models\Banking;
 | |
| 
 | |
| use App\Abstracts\Model;
 | |
| use App\Models\Common\Media as MediaModel;
 | |
| use App\Scopes\Transaction as Scope;
 | |
| use App\Traits\Currencies;
 | |
| use App\Traits\DateTime;
 | |
| use App\Traits\Media;
 | |
| use App\Traits\Recurring;
 | |
| use App\Traits\Transactions;
 | |
| use Bkwld\Cloner\Cloneable;
 | |
| use Illuminate\Database\Eloquent\Builder;
 | |
| use Illuminate\Database\Eloquent\Factories\HasFactory;
 | |
| use Illuminate\Support\Str;
 | |
| 
 | |
| class Transaction extends Model
 | |
| {
 | |
|     use Cloneable, Currencies, DateTime, HasFactory, Media, Recurring, Transactions;
 | |
| 
 | |
|     public const INCOME_TYPE = 'income';
 | |
|     public const INCOME_TRANSFER_TYPE = 'income-transfer';
 | |
|     public const INCOME_SPLIT_TYPE = 'income-split';
 | |
|     public const INCOME_RECURRING_TYPE = 'income-recurring';
 | |
|     public const EXPENSE_TYPE = 'expense';
 | |
|     public const EXPENSE_TRANSFER_TYPE = 'expense-transfer';
 | |
|     public const EXPENSE_SPLIT_TYPE = 'expense-split';
 | |
|     public const EXPENSE_RECURRING_TYPE = 'expense-recurring';
 | |
| 
 | |
|     protected $table = 'transactions';
 | |
| 
 | |
|     /**
 | |
|      * Attributes that should be mass-assignable.
 | |
|      *
 | |
|      * @var array
 | |
|      */
 | |
|     protected $fillable = [
 | |
|         'company_id',
 | |
|         'type',
 | |
|         'number',
 | |
|         'account_id',
 | |
|         'paid_at',
 | |
|         'amount',
 | |
|         'currency_code',
 | |
|         'currency_rate',
 | |
|         'document_id',
 | |
|         'contact_id',
 | |
|         'description',
 | |
|         'category_id',
 | |
|         'payment_method',
 | |
|         'reference',
 | |
|         'parent_id',
 | |
|         'split_id',
 | |
|         'created_from',
 | |
|         'created_by',
 | |
|     ];
 | |
| 
 | |
|     /**
 | |
|      * The attributes that should be cast.
 | |
|      *
 | |
|      * @var array
 | |
|      */
 | |
|     protected $casts = [
 | |
|         'paid_at'           => 'datetime',
 | |
|         'amount'            => 'double',
 | |
|         'currency_rate'     => 'double',
 | |
|         'deleted_at'        => 'datetime',
 | |
|     ];
 | |
| 
 | |
|     /**
 | |
|      * Sortable columns.
 | |
|      *
 | |
|      * @var array
 | |
|      */
 | |
|     public $sortable = ['type', 'number', 'paid_at', 'amount', 'category.name', 'account.name', 'customer.name', 'invoice.document_number'];
 | |
| 
 | |
|     /**
 | |
|      * Clonable relationships.
 | |
|      *
 | |
|      * @var array
 | |
|      */
 | |
|     public $cloneable_relations = ['recurring'];
 | |
| 
 | |
|     /**
 | |
|      * The "booted" method of the model.
 | |
|      *
 | |
|      * @return void
 | |
|      */
 | |
|     protected static function booted()
 | |
|     {
 | |
|         static::addGlobalScope(new Scope);
 | |
|     }
 | |
| 
 | |
|     public function account()
 | |
|     {
 | |
|         return $this->belongsTo('App\Models\Banking\Account')->withDefault(['name' => trans('general.na')]);
 | |
|     }
 | |
| 
 | |
|     public function bill()
 | |
|     {
 | |
|         return $this->belongsTo('App\Models\Document\Document', 'document_id')->withoutGlobalScope('App\Scopes\Document');
 | |
|     }
 | |
| 
 | |
|     public function category()
 | |
|     {
 | |
|         return $this->belongsTo('App\Models\Setting\Category')->withoutGlobalScope('App\Scopes\Category')->withDefault(['name' => trans('general.na')]);
 | |
|     }
 | |
| 
 | |
|     public function children()
 | |
|     {
 | |
|         return $this->hasMany('App\Models\Banking\Transaction', 'parent_id');
 | |
|     }
 | |
| 
 | |
|     public function contact()
 | |
|     {
 | |
|         return $this->belongsTo('App\Models\Common\Contact')->withDefault(['name' => trans('general.na')]);
 | |
|     }
 | |
| 
 | |
|     public function currency()
 | |
|     {
 | |
|         return $this->belongsTo('App\Models\Setting\Currency', 'currency_code', 'code');
 | |
|     }
 | |
| 
 | |
|     public function invoice()
 | |
|     {
 | |
|         return $this->belongsTo('App\Models\Document\Document', 'document_id')->withoutGlobalScope('App\Scopes\Document');
 | |
|     }
 | |
| 
 | |
|     public function document()
 | |
|     {
 | |
|         return $this->belongsTo('App\Models\Document\Document', 'document_id')->withoutGlobalScope('App\Scopes\Document');
 | |
|     }
 | |
| 
 | |
|     public function parent()
 | |
|     {
 | |
|         return $this->belongsTo('App\Models\Banking\Transaction', 'parent_id')->isRecurring();
 | |
|     }
 | |
| 
 | |
|     public function recurring()
 | |
|     {
 | |
|         return $this->morphOne('App\Models\Common\Recurring', 'recurable');
 | |
|     }
 | |
| 
 | |
|     public function transfer()
 | |
|     {
 | |
|         if ($this->type == static::INCOME_TRANSFER_TYPE) {
 | |
|             return $this->belongsTo('App\Models\Banking\Transfer', 'id', 'income_transaction_id');
 | |
|         }
 | |
| 
 | |
|         if ($this->type == static::EXPENSE_TRANSFER_TYPE) {
 | |
|             return $this->belongsTo('App\Models\Banking\Transfer', 'id', 'expense_transaction_id');
 | |
|         }
 | |
| 
 | |
|         return null;
 | |
|     }
 | |
| 
 | |
|     public function splits()
 | |
|     {
 | |
|         return $this->hasMany('App\Models\Banking\Transaction', 'split_id');
 | |
|     }
 | |
| 
 | |
|     public function user()
 | |
|     {
 | |
|         return $this->belongsTo('App\Models\Auth\User', 'contact_id', 'id');
 | |
|     }
 | |
| 
 | |
|     public function scopeNumber(Builder $query, string $number): Builder
 | |
|     {
 | |
|         return $query->where('number', '=', $number);
 | |
|     }
 | |
| 
 | |
|     public function scopeType(Builder $query, $types): Builder
 | |
|     {
 | |
|         if (empty($types)) {
 | |
|             return $query;
 | |
|         }
 | |
| 
 | |
|         return $query->whereIn($this->qualifyColumn('type'), (array) $types);
 | |
|     }
 | |
| 
 | |
|     public function scopeIncome(Builder $query): Builder
 | |
|     {
 | |
|         return $query->whereIn($this->qualifyColumn('type'), (array) $this->getIncomeTypes());
 | |
|     }
 | |
| 
 | |
|     public function scopeIncomeTransfer(Builder $query): Builder
 | |
|     {
 | |
|         return $query->where($this->qualifyColumn('type'), '=', self::INCOME_TRANSFER_TYPE);
 | |
|     }
 | |
| 
 | |
|     public function scopeIncomeRecurring(Builder $query): Builder
 | |
|     {
 | |
|         return $query->where($this->qualifyColumn('type'), '=', self::INCOME_RECURRING_TYPE)
 | |
|                 ->whereHas('recurring', function (Builder $query) {
 | |
|                     $query->whereNull('deleted_at');
 | |
|                 });
 | |
|     }
 | |
| 
 | |
|     public function scopeExpense(Builder $query): Builder
 | |
|     {
 | |
|         return $query->whereIn($this->qualifyColumn('type'), (array) $this->getExpenseTypes());
 | |
|     }
 | |
| 
 | |
|     public function scopeExpenseTransfer(Builder $query): Builder
 | |
|     {
 | |
|         return $query->where($this->qualifyColumn('type'), '=', self::EXPENSE_TRANSFER_TYPE);
 | |
|     }
 | |
| 
 | |
|     public function scopeExpenseRecurring(Builder $query): Builder
 | |
|     {
 | |
|         return $query->where($this->qualifyColumn('type'), '=', self::EXPENSE_RECURRING_TYPE)
 | |
|                 ->whereHas('recurring', function (Builder $query) {
 | |
|                     $query->whereNull('deleted_at');
 | |
|                 });
 | |
|     }
 | |
| 
 | |
|     public function scopeIsTransfer(Builder $query): Builder
 | |
|     {
 | |
|         return $query->where($this->qualifyColumn('type'), 'like', '%-transfer');
 | |
|     }
 | |
| 
 | |
|     public function scopeIsNotTransfer(Builder $query): Builder
 | |
|     {
 | |
|         return $query->where($this->qualifyColumn('type'), 'not like', '%-transfer');
 | |
|     }
 | |
| 
 | |
|     public function scopeIsRecurring(Builder $query): Builder
 | |
|     {
 | |
|         return $query->where($this->qualifyColumn('type'), 'like', '%-recurring');
 | |
|     }
 | |
| 
 | |
|     public function scopeIsNotRecurring(Builder $query): Builder
 | |
|     {
 | |
|         return $query->where($this->qualifyColumn('type'), 'not like', '%-recurring');
 | |
|     }
 | |
| 
 | |
|     public function scopeIsSplit(Builder $query): Builder
 | |
|     {
 | |
|         return $query->where($this->qualifyColumn('type'), 'like', '%-split');
 | |
|     }
 | |
| 
 | |
|     public function scopeIsNotSplit(Builder $query): Builder
 | |
|     {
 | |
|         return $query->where($this->qualifyColumn('type'), 'not like', '%-split');
 | |
|     }
 | |
| 
 | |
|     public function scopeIsDocument(Builder $query): Builder
 | |
|     {
 | |
|         return $query->whereNotNull('document_id');
 | |
|     }
 | |
| 
 | |
|     public function scopeIsNotDocument(Builder $query): Builder
 | |
|     {
 | |
|         return $query->whereNull('document_id');
 | |
|     }
 | |
| 
 | |
|     public function scopeDocumentId(Builder $query, int $document_id): Builder
 | |
|     {
 | |
|         return $query->where('document_id', '=', $document_id);
 | |
|     }
 | |
| 
 | |
|     public function scopeAccountId(Builder $query, int $account_id): Builder
 | |
|     {
 | |
|         return $query->where('account_id', '=', $account_id);
 | |
|     }
 | |
| 
 | |
|     public function scopeContactId(Builder $query, int $contact_id): Builder
 | |
|     {
 | |
|         return $query->where('contact_id', '=', $contact_id);
 | |
|     }
 | |
| 
 | |
|     public function scopeCategoryId(Builder $query, int $category_id): Builder
 | |
|     {
 | |
|         return $query->where('category_id', '=', $category_id);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Order by paid date.
 | |
|      */
 | |
|     public function scopeLatest(Builder $query): Builder
 | |
|     {
 | |
|         return $query->orderBy('paid_at', 'desc');
 | |
|     }
 | |
| 
 | |
|     public function scopePaid(Builder $query): Builder
 | |
|     {
 | |
|         return $query->sum('amount');
 | |
|     }
 | |
| 
 | |
|     public function scopeIsReconciled(Builder $query): Builder
 | |
|     {
 | |
|         return $query->where('reconciled', 1);
 | |
|     }
 | |
| 
 | |
|     public function scopeIsNotReconciled(Builder $query): Builder
 | |
|     {
 | |
|         return $query->where('reconciled', 0);
 | |
|     }
 | |
| 
 | |
|     public function onCloning($src, $child = null)
 | |
|     {
 | |
|         if (app()->has(\App\Console\Commands\RecurringCheck::class)) {
 | |
|             $suffix = '';
 | |
|         } else {
 | |
|             $suffix = $src->isRecurringTransaction() ? '-recurring' : '';
 | |
|         }
 | |
| 
 | |
|         $this->number       = $this->getNextTransactionNumber($suffix);
 | |
|         $this->document_id  = null;
 | |
|         $this->split_id     = null;
 | |
|         unset($this->reconciled);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Convert amount to double.
 | |
|      *
 | |
|      * @return float
 | |
|      */
 | |
|     public function getAmountForAccountAttribute()
 | |
|     {
 | |
|         $amount = $this->amount;
 | |
| 
 | |
|         // Convert amount if not same currency
 | |
|         if ($this->account->currency_code != $this->currency_code) {
 | |
|             $to_code = $this->account->currency_code;
 | |
|             $to_rate = config('money.currencies.' . $this->account->currency_code . '.rate');
 | |
| 
 | |
|             $amount = $this->convertBetween($amount, $this->currency_code, $this->currency_rate, $to_code, $to_rate);
 | |
|         }
 | |
| 
 | |
|         return $amount;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the current balance.
 | |
|      *
 | |
|      * @return string
 | |
|      */
 | |
|     public function getAttachmentAttribute($value)
 | |
|     {
 | |
|         if (!empty($value) && !$this->hasMedia('attachment')) {
 | |
|             return $value;
 | |
|         } elseif (!$this->hasMedia('attachment')) {
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         return $this->getMedia('attachment')->all();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the splittable status.
 | |
|      *
 | |
|      * @return bool
 | |
|      */
 | |
|     public function getIsSplittableAttribute()
 | |
|     {
 | |
|         return is_null($this->split_id);
 | |
|     }
 | |
| 
 | |
|     public function delete_attachment()
 | |
|     {
 | |
|         if ($attachments = $this->attachment) {
 | |
|             foreach ($attachments as $file) {
 | |
|                 MediaModel::where('id', $file->id)->delete();
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the title of type.
 | |
|      *
 | |
|      * @return string
 | |
|      */
 | |
|     public function getTypeTitleAttribute($value)
 | |
|     {
 | |
|         $type = $this->getRealTypeOfRecurringTransaction($this->type);
 | |
|         $type = $this->getRealTypeOfTransferTransaction($type);
 | |
|         $type = $this->getRealTypeOfSplitTransaction($type);
 | |
| 
 | |
|         $type = str_replace('-', '_', $type);
 | |
| 
 | |
|         return $value ?? trans_choice('general.' . Str::plural($type), 1);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the route name.
 | |
|      *
 | |
|      * @return string
 | |
|      */
 | |
|     public function getRouteNameAttribute($value)
 | |
|     {
 | |
|         if ($value) {
 | |
|             return $value;
 | |
|         }
 | |
| 
 | |
|         if ($this->isIncome()) {
 | |
|             if (! empty($this->document_id) && $this->document->type != 'invoice') {
 | |
|                 return $this->getRouteFromConfig();
 | |
|             } else {
 | |
|                 return !empty($this->document_id) ? 'invoices.show' : 'transactions.show';
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         if ($this->isExpense()) {
 | |
|             if (! empty($this->document_id) && $this->document->type != 'bill') {
 | |
|                 return $this->getRouteFromConfig();
 | |
|             } else {
 | |
|                 return !empty($this->document_id) ? 'bills.show' : 'transactions.show';
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return 'transactions.index';
 | |
|     }
 | |
| 
 | |
|     public function getRouteFromConfig()
 | |
|     {
 | |
|         $route = '';
 | |
| 
 | |
|         $alias = config('type.document.' . $this->document->type . '.alias');
 | |
|         $prefix = config('type.document.' . $this->document->type . '.route.prefix');
 | |
| 
 | |
|         // if use module set module alias
 | |
|         if (!empty($alias)) {
 | |
|             $route .= $alias . '.';
 | |
|         }
 | |
| 
 | |
|         if (!empty($prefix)) {
 | |
|             $route .= $prefix . '.';
 | |
|         }
 | |
| 
 | |
|         if ($route) {
 | |
|             return $route . 'show';
 | |
|         }
 | |
| 
 | |
|         return 'transactions.index';
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the route id.
 | |
|      *
 | |
|      * @return string
 | |
|      */
 | |
|     public function getRouteIdAttribute($value)
 | |
|     {
 | |
|         return !empty($value) ? $value : (!empty($this->document_id) ? $this->document_id : $this->id);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the line actions.
 | |
|      *
 | |
|      * @return array
 | |
|      */
 | |
|     public function getLineActionsAttribute()
 | |
|     {
 | |
|         $actions = [];
 | |
| 
 | |
|         $prefix = 'transactions';
 | |
| 
 | |
|         if (Str::contains($this->type, 'recurring')) {
 | |
|             $prefix = 'recurring-transactions';
 | |
|         }
 | |
| 
 | |
|         try {
 | |
|             $actions[] = [
 | |
|                 'title' => trans('general.show'),
 | |
|                 'icon' => 'visibility',
 | |
|                 'url' => route($prefix. '.show', $this->id),
 | |
|                 'permission' => 'read-banking-transactions',
 | |
|                 'attributes' => [
 | |
|                     'id' => 'index-line-actions-show-' . $this->type . '-'  . $this->id,
 | |
|                 ],
 | |
|             ];
 | |
|         } catch (\Exception $e) {}
 | |
| 
 | |
|         try {
 | |
|             if (! $this->reconciled && $this->isNotTransferTransaction()) {
 | |
|                 $actions[] = [
 | |
|                     'title' => trans('general.edit'),
 | |
|                     'icon' => 'edit',
 | |
|                     'url' => route($prefix. '.edit', $this->id),
 | |
|                     'permission' => 'update-banking-transactions',
 | |
|                     'attributes' => [
 | |
|                         'id' => 'index-line-actions-edit-' . $this->type . '-'  . $this->id,
 | |
|                     ],
 | |
|                 ];
 | |
|             }
 | |
|         } catch (\Exception $e) {}
 | |
| 
 | |
|         try {
 | |
|             if (empty($this->document_id) && $this->isNotTransferTransaction()) {
 | |
|                 $actions[] = [
 | |
|                     'title' => trans('general.duplicate'),
 | |
|                     'icon' => 'file_copy',
 | |
|                     'url' => route($prefix. '.duplicate', $this->id),
 | |
|                     'permission' => 'create-banking-transactions',
 | |
|                     'attributes' => [
 | |
|                         'id' => 'index-line-actions-duplicate-' . $this->type . '-'  . $this->id,
 | |
|                     ],
 | |
|                 ];
 | |
|             }
 | |
|         } catch (\Exception $e) {}
 | |
| 
 | |
|         try {
 | |
|             if (
 | |
|                 $this->is_splittable
 | |
|                 && empty($this->document_id)
 | |
|                 && empty($this->recurring)
 | |
|                 && $this->isNotTransferTransaction()
 | |
|             ) {
 | |
|                 $connect = [
 | |
|                     'type' => 'button',
 | |
|                     'title' => trans('general.connect'),
 | |
|                     'icon' => 'sensors',
 | |
|                     'permission' => 'create-banking-transactions',
 | |
|                     'attributes' => [
 | |
|                         'id' => 'index-line-actions-connect-' . $this->type . '-'  . $this->id,
 | |
|                         '@click' => 'onConnectTransactions(\'' . route('transactions.dial', $this->id) . '\')',
 | |
|                     ],
 | |
|                 ];
 | |
| 
 | |
|                 $actions[] = $connect;
 | |
| 
 | |
|                 $actions[] = [
 | |
|                     'type' => 'divider',
 | |
|                 ];
 | |
|             }
 | |
|         } catch (\Exception $e) {}
 | |
| 
 | |
|         try {
 | |
|             $actions[] = [
 | |
|                 'title' => trans('general.print'),
 | |
|                 'icon' => 'print',
 | |
|                 'url' => route($prefix. '.print', $this->id),
 | |
|                 'permission' => 'read-banking-transactions',
 | |
|                 'attributes' => [
 | |
|                     'id' => 'index-line-actions-print-' . $this->type . '-'  . $this->id,
 | |
|                     'target' => '_blank',
 | |
|                 ],
 | |
|             ];
 | |
|         } catch (\Exception $e) {}
 | |
| 
 | |
|         try {
 | |
|             $actions[] = [
 | |
|                 'title' => trans('general.download_pdf'),
 | |
|                 'icon' => 'picture_as_pdf',
 | |
|                 'url' => route($prefix. '.pdf', $this->id),
 | |
|                 'permission' => 'read-banking-transactions',
 | |
|                 'attributes' => [
 | |
|                     'id' => 'index-line-actions-pdf-' . $this->type . '-'  . $this->id,
 | |
|                     'target' => '_blank',
 | |
|                 ],
 | |
|             ];
 | |
|         } catch (\Exception $e) {}
 | |
| 
 | |
|         if ($prefix != 'recurring-transactions') {
 | |
|             if ($this->isNotTransferTransaction()) {
 | |
|                 $actions[] = [
 | |
|                     'type' => 'divider',
 | |
|                 ];
 | |
| 
 | |
|                 try {
 | |
|                     $actions[] = [
 | |
|                         'type' => 'button',
 | |
|                         'title' => trans('general.share_link'),
 | |
|                         'icon' => 'share',
 | |
|                         'url' => route('modals.transactions.share.create', $this->id),
 | |
|                         'permission' => 'read-banking-transactions',
 | |
|                         'attributes' => [
 | |
|                             'id' => 'index-line-actions-share-' . $this->type . '-'  . $this->id,
 | |
|                             '@click' => 'onShareLink("' . route('modals.transactions.share.create', $this->id) . '")',
 | |
|                         ],
 | |
|                     ];
 | |
|                 } catch (\Exception $e) {}
 | |
| 
 | |
|                 try {
 | |
|                     if (! empty($this->contact) && $this->contact->email) {
 | |
|                         $actions[] = [
 | |
|                             'type' => 'button',
 | |
|                             'title' => trans('invoices.send_mail'),
 | |
|                             'icon' => 'email',
 | |
|                             'url' => route('modals.transactions.emails.create', $this->id),
 | |
|                             'permission' => 'read-banking-transactions',
 | |
|                             'attributes' => [
 | |
|                                 'id' => 'index-line-actions-send-email-' . $this->type . '-'  . $this->id,
 | |
|                                 '@click' => 'onSendEmail("' . route('modals.transactions.emails.create', $this->id) . '")',
 | |
|                             ],
 | |
|                         ];
 | |
|                     }
 | |
|                 } catch (\Exception $e) {}
 | |
| 
 | |
|                 $actions[] = [
 | |
|                     'type' => 'divider',
 | |
|                 ];
 | |
| 
 | |
|                 try {
 | |
|                     if (! $this->reconciled) {
 | |
|                         $actions[] = [
 | |
|                             'type' => 'delete',
 | |
|                             'icon' => 'delete',
 | |
|                             'title' => ! empty($this->recurring) ? 'transactions' : 'recurring_template',
 | |
|                             'route' => $prefix. '.destroy',
 | |
|                             'permission' => 'delete-banking-transactions',
 | |
|                             'attributes' => [
 | |
|                                 'id' => 'index-line-actions-delete-' . $this->type . '-'  . $this->id,
 | |
|                             ],
 | |
|                             'model' => $this,
 | |
|                         ];
 | |
|                     }
 | |
|                 } catch (\Exception $e) {}
 | |
|             }
 | |
|         } else {
 | |
|             if ($this->recurring && $this->recurring->status != 'ended') {
 | |
|                 try {
 | |
|                     $actions[] = [
 | |
|                         'title' => trans('general.end'),
 | |
|                         'icon' => 'block',
 | |
|                         'url' => route($prefix. '.end', $this->id),
 | |
|                         'permission' => 'update-banking-transactions',
 | |
|                         'attributes' => [
 | |
|                             'id' => 'index-line-actions-end-' . $this->type . '-'  . $this->id,
 | |
|                         ],
 | |
|                     ];
 | |
|                 } catch (\Exception $e) {}
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return $actions;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the recurring status label.
 | |
|      *
 | |
|      * @return string
 | |
|      */
 | |
|     public function getRecurringStatusLabelAttribute()
 | |
|     {
 | |
|         return match($this->recurring->status) {
 | |
|             'active'    => 'status-partial',
 | |
|             'ended'     => 'status-success',
 | |
|             default     => 'status-success',
 | |
|         };
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Retrieve the model for a bound value.
 | |
|      *
 | |
|      * @param  mixed  $value
 | |
|      * @param  string|null  $field
 | |
|      * @return \Illuminate\Database\Eloquent\Model|null
 | |
|      */
 | |
|     public function resolveRouteBinding($value, $field = null)
 | |
|     {
 | |
|         $query = $this->where('id', $value);
 | |
| 
 | |
|         if (request()->route()->hasParameter('recurring_transaction')) {
 | |
|             $query->isRecurring();
 | |
|         }
 | |
| 
 | |
|         return $query->firstOrFail();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Create a new factory instance for the model.
 | |
|      *
 | |
|      * @return \Illuminate\Database\Eloquent\Factories\Factory
 | |
|      */
 | |
|     protected static function newFactory()
 | |
|     {
 | |
|         return \Database\Factories\Transaction::new();
 | |
|     }
 | |
| }
 |