ok

Mini Shell

Direktori : /home2/selectio/www/billingsoftwarenew/core/app/Models/
Upload File :
Current File : //home2/selectio/www/billingsoftwarenew/core/app/Models/Dps.php

<?php

namespace App\Models;

use App\Constants\Status;
use App\Traits\ApiQuery;
use App\Traits\Searchable;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model;

class Dps extends Model {
    use Searchable, ApiQuery;

    protected $guarded = ['id'];

    protected $casts = [
        'withdrawn_at'          => 'datetime',
        'next_installment_date' => 'datetime',
        'due_notification_sent' => 'datetime',
    ];

    /* ========= Relations ========= */
    public function user() {
        return $this->belongsTo(User::class);
    }

    public function plan() {
        return $this->belongsTo(DpsPlan::class, 'plan_id', 'id');
    }

    public function installments() {
        return $this->morphMany(Installment::class, 'installmentable');
    }

    public function dueInstallments() {
        return $this->morphMany(Installment::class, 'installmentable')->whereNull('given_at')->whereDate('installment_date', '<', now()->format('Y-m-d'));
    }

    public function nextInstallment() {
        return $this->morphOne(Installment::class, 'installmentable')->whereNull('given_at');
    }

    /*========= Scopes =========*/
    public function scopeRunning($query) {
        return $query->where('status', Status::DPS_RUNNING);
    }

    public function scopeMatured($query) {
        return $query->where('status', Status::DPS_MATURED);
    }

    public function scopeClosed($query) {
        return $query->where('status', Status::DPS_CLOSED);
    }

    public function scopeDue($query) {
        return $query->where('status', Status::DPS_RUNNING)->whereHas('installments', function ($q) {
            $q->whereNull('given_at')->whereDate('installment_date', '<', now()->format('Y-m-d'));
        });
    }

    /* ========= Accessors ========= */
    public function statusBadge(): Attribute {
        return Attribute::make(get:function () {
            if ($this->due_installments_count > 0) {
                return createBadge('danger', 'Due');
            } elseif ($this->status == 1) {
                return createBadge('success', 'Running');
            } elseif ($this->status == 2) {
                return createBadge('warning', 'Matured');
            } else {
                return createBadge('dark', 'Closed');
            }
        });
    }

    // ========= Other Methods ========= //

    public function depositedAmount() {
        return $this->per_installment * $this->total_installment;
    }

    public function profitAmount() {
        return $this->depositedAmount() * $this->interest_rate / 100;
    }

    public function withdrawableAmount() {

        return $this->depositedAmount() + $this->profitAmount() - $this->delay_charge;
    }

    public function shortCodes() {
        return [
            'plan_name'              => $this->plan->name,
            'dps_number'             => $this->dps_number,
            'per_installment'        => $this->per_installment,
            'interest_rate'          => $this->interest_rate,
            'installment_interval'   => $this->installment_interval,
            'delay_value'            => $this->delay_value,
            'charge_per_installment' => $this->charge_per_installment,
            'delay_charge'           => $this->delay_charge,
            'given_installment'      => $this->given_installment,
            'total_installment'      => $this->total_installment,
            'total_deposited'        => $this->depositedAmount(),
            'withdrawable_amount'    => $this->withdrawableAmount(),
        ];
    }
}

Zerion Mini Shell 1.0