| 
<?php
 namespace App\Models;
 
 use http\Encoding\Stream\Inflate;
 use Illuminate\Contracts\Auth\MustVerifyEmail;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\SoftDeletes;
 use Illuminate\Foundation\Auth\User as Authenticatable;
 use Illuminate\Notifications\Notifiable;
 use Tymon\JWTAuth\Contracts\JWTSubject;
 
 class User extends Authenticatable implements JWTSubject
 {
 use  HasFactory, Notifiable, SoftDeletes;
 
 /**
 * The attributes that are mass assignable.
 *
 * @var string[]
 */
 
 protected $fillable = [
 'name',
 'email',
 'password',
 ];
 
 /**
 * The attributes that should be hidden for serialization.
 *
 * @var array
 */
 protected $hidden = [
 'password',
 'remember_token',
 ];
 
 /**
 * The attributes that should be cast.
 *
 * @var array
 */
 protected $casts = [
 'email_verified_at' => 'datetime',
 ];
 
 
 /**
 * create user->wallet relation
 * the user can have only one wallet
 * @return \Illuminate\Database\Eloquent\Relations\HasOne
 */
 public function wallet()
 {
 return $this->hasOne(Wallet::class);
 }
 
 /**
 * create withdraw transaction for user wallet
 * @param $amount
 * @return bool
 */
 public function withdraw($amount, $uuid): bool
 {
 if ($this->wallet->allowWithdraw($amount)) {
 $this->wallet->transactions()->create([
 'amount' => $amount,
 'type' => 'withdraw',
 'uuid' => $uuid,
 ]);
 return true;
 }
 
 return false;
 }
 
 /**
 * create deposit transaction for user wallet
 * @param $amount
 * @return bool
 */
 public function deposit($amount, $uuid): bool
 {
 $this->wallet->transactions()->create([
 'amount' => $amount,
 'type' => 'deposit',
 'uuid' => $uuid,
 ]);
 
 return true;
 }
 
 /**
 * this method well called when we set value to locked attribute
 * ($this->blocked = value)
 * @return bool
 */
 public function getIsBlockedAttribute() : bool
 {
 return $this->deleted_at !== null;
 }
 
 /**
 * get blocked users only
 */
 public function blocked()
 {
 return User::onlyTrashed()->get();
 }
 
 /**
 * get total approved transactions for user
 * @return mixed
 */
 public function totalApproved()
 {
 return $this->wallet->transactions()->approved()->count();
 }
 
 /**
 * get total Declined transactions for user
 * @return mixed
 */
 public function totalDeclined()
 {
 return $this->wallet->transactions()->declined()->count();
 }
 
 /**
 * get total Pending transactions for user
 * @return mixed
 */
 public function totalPending()
 {
 return $this->wallet->transactions()->waiting()->count();
 }
 
 /**
 * @return mixed|void
 */
 public function getJWTIdentifier()
 {
 return $this->getKey();
 }
 
 /**
 * @return array
 */
 public function getJWTCustomClaims()
 {
 return [];
 }
 }
 
 |