Your IP : 216.73.216.93


Current Path : /home/users/unlimited/www/foodbank.codeskitter.site/app/Http/Requests/
Upload File :
Current File : /home/users/unlimited/www/foodbank.codeskitter.site/app/Http/Requests/RequestWithdrawRequest.php

<?php

namespace App\Http\Requests;

use App\Enums\RequestWithdrawStatus;
use App\Models\RequestWithdraw;
use App\Models\User;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class RequestWithdrawRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'amount' => ['required', 'numeric', 'gt:0'],
            'user_id' => ['required'],
            'date'   => ['required', 'date', 'after_or_equal:today'],
            'status' => ['nullable', 'numeric']
        ];
    }


    public function withValidator($validator)
    {
        if (!is_numeric(request('amount'))) {
            return   $validator->errors()->add('amount', 'Amount must be numeric.');
        }
        return $validator->after(function ($validator) {
            $this->checkBalanceAmount($this->request_withdraw, $validator);
        });
    }

    public function checkBalanceAmount($requestWithdrawId, $validator)
    {

        $user = User::find(request('user_id'));
        $amount  = 0;
        $user_id = 0;
        $requestWithdraw = [];
        if ($requestWithdrawId) {
            $requestWithdraw = RequestWithdraw::find($requestWithdrawId);
            if (!blank($requestWithdraw)) {
                $amount  = $requestWithdraw->user->balance->balance;
                $user_id = $requestWithdraw->user_id;
            }
        } else {
            if ($user) {
                $amount  = $user->balance->balance;
                $user_id = $user->id;
            }
        }
        $requestWithdrawAmount = RequestWithdraw::where(['user_id' => $user_id, 'status' => RequestWithdrawStatus::PENDING])->sum('amount');

        if ($requestWithdrawId) {
            $requestWithdrawAmount -= $requestWithdraw->amount;
        }

        $requestAmount         = $requestWithdrawAmount + request('amount');

        if ($amount >= $requestAmount) {
            return false;
        }

        $remainAmount = $amount - $requestWithdrawAmount;
        if ($remainAmount <= 0) {
            $validator->errors()->add('amount', 'Your available balance amount is 0.');
        } else {
            $validator->errors()->add('amount', 'The amount can not greater than to balance amount ' . $remainAmount);
        }
    }

    public function attributes()
    {
        return [
            'amount' => trans('validation.attributes.amount'),
            'date'   => trans('validation.attributes.date'),
            'status' => trans('validation.attributes.status'),
        ];
    }
}