'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 * @param string $payment_reference * @return Builder */ public function scopeSupplierRefunds(Builder $query, ?string $payment_reference = NULL) { if($payment_reference){ $query->where('payment_reference', $payment_reference); } return $query->where('type', TransactionType::SUPPLIER_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]); } /** * @param Builder $query * @return Builder */ public function scopeGetReceiverWithJoinStatementTransactionAndOwner(Builder $query, Array $row) { $query->join('companies',function($q) use ($row) { $q->on('companies.id','=','transactions.receiver'); $q->where('debtor',$row['debtor_code']); }) ->join('statement_transaction_owners', function ($q) { $q->on('statement_transaction_owners.owner_id','=','transactions.id'); $q->where('statement_transaction_owners.owner_type','=',Transaction::class); }) ->join('statement_transactions','statement_transactions.id','=','statement_transaction_owners.statement_transaction_id'); } /** * @return MorphMany */ public function voucherifyEntities(): MorphMany { return $this->morphMany(VoucherEntityMapping::class, 'owner'); } /** * @return MorphMany */ public function remarks(): morphMany { return $this->morphMany(Remark::class, 'owner'); } /** * @return MorphMany */ public function attributesKVP(): MorphMany { return $this->morphMany(KeyValuePair::class, 'owner'); } /** * * @return Model|null */ public function getBankAttribute() { $keyValuePairs = $this->attributesKVP()->where('key', 'App\Models\Bank')->latest()->first(); if($keyValuePairs){ $bank = Bank::where('id', $keyValuePairs->value)->first(); return $bank; } return null; } }