namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Transaction extends Model { use HasFactory; protected $fillable = [ 'user_id', 'wallet_id', 'transaction_id', 'type', 'amount', 'fee', 'net_amount', 'balance_before', 'balance_after', 'description', 'status', 'payment_method', 'reference_id', 'reference_type', 'metadata', 'ip_address', 'approved_by', 'approved_at', ]; protected $casts = [ 'amount' => 'decimal:2', 'fee' => 'decimal:2', 'net_amount' => 'decimal:2', 'balance_before' => 'decimal:2', 'balance_after' => 'decimal:2', 'metadata' => 'array', 'approved_at' => 'datetime', ]; protected $appends = [ 'formatted_amount', 'formatted_balance', 'status_badge', 'type_badge', ]; // Relationships public function user() { return $this->belongsTo(User::class); } public function wallet() { return $this->belongsTo(Wallet::class); } public function reference() { return $this->morphTo(); } public function approver() { return $this->belongsTo(Admin::class, 'approved_by'); } // Accessors public function getFormattedAmountAttribute() { $prefix = $this->amount > 0 ? '+' : '-'; return $prefix . ' ' . number_format(abs($this->amount), 2) . ' ' . ($this->wallet->currency ?? 'USD'); } public function getFormattedBalanceAttribute() { return number_format($this->balance_after, 2) . ' ' . ($this->wallet->currency ?? 'USD'); } public function getStatusBadgeAttribute() { $colors = [ 'pending' => 'warning', 'processing' => 'info', 'completed' => 'success', 'failed' => 'danger', 'cancelled' => 'secondary', ]; return [ 'text' => ucfirst($this->status), 'color' => $colors[$this->status] ?? 'secondary', ]; } public function getTypeBadgeAttribute() { $icons = [ 'deposit' => 'arrow-down', 'withdrawal' => 'arrow-up', 'order' => 'shopping-cart', 'refund' => 'arrow-return-left', 'commission' => 'gift', 'adjustment' => 'pencil', ]; return [ 'text' => ucfirst($this->type), 'icon' => $icons[$this->type] ?? 'circle', ]; } // Scopes public function scopeDeposits($query) { return $query->where('type', 'deposit'); } public function scopeWithdrawals($query) { return $query->where('type', 'withdrawal'); } public function scopeOrders($query) { return $query->where('type', 'order'); } public function scopeCompleted($query) { return $query->where('status', 'completed'); } public function scopePending($query) { return $query->where('status', 'pending'); } public function scopeToday($query) { return $query->whereDate('created_at', today()); } public function scopeThisMonth($query) { return $query->whereMonth('created_at', now()->month); } // Methods public function isCompleted() { return $this->status === 'completed'; } public function isPending() { return $this->status === 'pending'; } public function markAsCompleted() { $this->update([ 'status' => 'completed', 'approved_at' => now(), ]); } public function markAsFailed($reason = null) { $this->update([ 'status' => 'failed', 'description' => $reason ? $this->description . "\nReason: " . $reason : $this->description, ]); } }