'int' ]; protected $table = 'transactions'; public function owner(): morphTo { return $this->morphTo(); } /** * @return MorphMany */ public function transactions(): MorphMany { return $this->MorphMany(Transaction::class, 'owner'); } /** * @return \Illuminate\Database\Eloquent\Relations\MorphOne */ public function creditNoteTransaction() { return $this->MorphOne(Transaction::class, 'owner')->where('type', TransactionType::CREDIT_NOTE); } /** * @return \Illuminate\Database\Eloquent\Relations\MorphOne */ public function transaction_owner() { return $this->MorphOne(StatementTransactionOwner::class, 'owner','owner_type','owner_id'); } /** * @return BelongsTo */ public function booking(): BelongsTo { return $this->BelongsTo(Booking::class, 'owner_id', 'id'); } /** * @return BelongsTo */ public function issuerCompany(): BelongsTo { return $this->BelongsTo( Company::class, 'issuer', 'id'); } /** * Get the user that owns the Transaction * * @return BelongsTo */ public function receiverCompany(): BelongsTo { return $this->belongsTo(Company::class, 'receiver', 'id'); } /** * @return BelongsTo */ public function recipientBankAccount(): BelongsTo { return $this->BelongsTo(Bank::class); } /** * @return MorphMany */ public function documents(): morphMany { return $this->morphMany(Document::class, 'owner'); } /** * @return BelongsTo */ public function currency(): BelongsTo { return $this->BelongsTo(Currency::class, 'currency_id', 'id'); } /** * @return BelongsTo */ public function original_currency(): BelongsTo { return $this->BelongsTo(Currency::class, 'original_currency_id', 'id'); } /** * @return HasMany */ public function transactionDetails(): HasMany { return $this->HasMany(TransactionDetail::class, 'transaction_id', 'id'); } /** * @return HasOne */ public function groupTransaction(): HasOne { return $this->HasOne(GroupTransaction::class, 'transaction_id'); } /** * @return HasOne */ public function voucherRedemption(): HasOne { return $this->HasOne(VoucherRedemption::class, 'transaction_id', 'id'); } public function convert_original_amount() { if($this->booking()->first()->fix_currency_id !== 1) { $currency_rate = $this->currency()->first()->rates()->where('payment_method_type', $this->payment_method)->first(); return number_format($this->original_amount / $currency_rate->selling, 2); } return $this->original_amount; } /** * @param Builder $query * @return Builder */ public function scopePayments(Builder $query) { return $query->where('type', TransactionType::PAYMENT); } /** * @param Builder $query * @return Builder */ public function scopeBills(Builder $query) { return $query->where('type', TransactionType::BILL); } /** * @param Builder $query * @param string $payment_reference * @return Builder */ public function scopeRefunds(Builder $query, ?string $payment_reference = NULL) { if($payment_reference){ $query->where('payment_reference', $payment_reference); } return $query->where('type', TransactionType::REFUND); } /** * @param Builder $query * @return Builder */ public function scopeInComplete(Builder $query) { return $query->where(function(Builder $query){ $query->where(function(Builder $query){ $query->where('status', ApprovalStatus::PENDING_SUBMISSION) ->whereDate('expires_on', '>=', Carbon::now()); })->orWhere(function(Builder $query){ $query->where('status', ApprovalStatus::PENDING_VERIFICATION); }); }); } /** * @param Builder $query * @return Builder */ public function scopeComplete(Builder $query) { return $query->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]); } /** * @param Builder $query * @return Builder */ public function scopeTransferred(Builder $query) { return $query->whereIn('status', [ApprovalStatus::APPROVED]); } /** * @return MorphMany */ public function voucherifyEntities(): MorphMany { return $this->morphMany(VoucherEntityMapping::class, 'owner'); } }