feat(wallets): implement wallet and transaction management with associated models, policies, and resources

This commit is contained in:
2026-06-07 00:18:32 +03:30
parent c2319a55cb
commit d1d42b38d1
23 changed files with 790 additions and 0 deletions

View File

@@ -10,6 +10,8 @@ use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Attributes\Hidden;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasManyThrough;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
@@ -29,6 +31,22 @@ class User extends Authenticatable implements FilamentUser
return $this->belongsToMany(Role::class);
}
/**
* @return HasOne<Wallet, $this>
*/
public function wallet(): HasOne
{
return $this->hasOne(Wallet::class);
}
/**
* @return HasManyThrough<WalletTransaction, Wallet, $this>
*/
public function walletTransactions(): HasManyThrough
{
return $this->hasManyThrough(WalletTransaction::class, Wallet::class);
}
public function hasRole(string|array $roles): bool
{
$roles = (array) $roles;

39
app/Models/Wallet.php Normal file
View File

@@ -0,0 +1,39 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
#[Fillable(['user_id', 'balance', 'is_active'])]
class Wallet extends Model
{
/**
* @return BelongsTo<User, $this>
*/
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
/**
* @return HasMany<WalletTransaction, $this>
*/
public function transactions(): HasMany
{
return $this->hasMany(WalletTransaction::class)->latest();
}
/**
* @return array<string, string>
*/
protected function casts(): array
{
return [
'balance' => 'integer',
'is_active' => 'boolean',
];
}
}

View File

@@ -0,0 +1,49 @@
<?php
namespace App\Models;
use App\Enums\WalletTransactionType;
use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
#[Fillable([
'wallet_id',
'type',
'amount',
'balance_before',
'balance_after',
'description',
'created_by',
])]
class WalletTransaction extends Model
{
/**
* @return BelongsTo<Wallet, $this>
*/
public function wallet(): BelongsTo
{
return $this->belongsTo(Wallet::class);
}
/**
* @return BelongsTo<User, $this>
*/
public function creator(): BelongsTo
{
return $this->belongsTo(User::class, 'created_by');
}
/**
* @return array<string, string>
*/
protected function casts(): array
{
return [
'type' => WalletTransactionType::class,
'amount' => 'integer',
'balance_before' => 'integer',
'balance_after' => 'integer',
];
}
}