feat: add withdraw request functionality and UI components

This commit is contained in:
2026-08-27 02:39:57 +03:30
parent aeef95339d
commit 4ce663c669
115 changed files with 4064 additions and 315 deletions
+26
View File
@@ -0,0 +1,26 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class BankCard extends Model
{
use HasFactory;
protected $fillable = [
'card_number',
'holder_name',
'user_id',
];
protected $casts = [
'user_id' => 'integer',
];
public function user()
{
return $this->belongsTo(User::class);
}
}
+5
View File
@@ -56,6 +56,11 @@ class Document extends Model
return $this->belongsTo(User::class);
}
public function invoice()
{
return $this->hasOne(Invoice::class);
}
public function assignments()
{
return $this->hasMany(DocumentAssignment::class);
+47
View File
@@ -0,0 +1,47 @@
<?php
namespace App\Models;
use App\Enums\InvoicePaymentMethodEnum;
use App\Enums\InvoiceStatusEnum;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Invoice extends Model
{
use HasFactory;
protected $fillable = [
'number',
'amount',
'status',
'payment_method',
'paid_at',
'document_id',
'user_id',
];
protected $casts = [
'status' => InvoiceStatusEnum::class,
'payment_method' => InvoicePaymentMethodEnum::class,
'amount' => 'integer',
'paid_at' => 'datetime',
'document_id' => 'integer',
'user_id' => 'integer',
];
public function document()
{
return $this->belongsTo(Document::class);
}
public function user()
{
return $this->belongsTo(User::class);
}
public function payments()
{
return $this->hasMany(Payment::class);
}
}
+43
View File
@@ -0,0 +1,43 @@
<?php
namespace App\Models;
use App\Enums\PaymentPurposeEnum;
use App\Enums\PaymentStatusEnum;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Payment extends Model
{
use HasFactory;
protected $fillable = [
'track_id',
'amount',
'status',
'purpose',
'ref_number',
'verified_at',
'invoice_id',
'payer_id',
];
protected $casts = [
'status' => PaymentStatusEnum::class,
'purpose' => PaymentPurposeEnum::class,
'amount' => 'integer',
'verified_at' => 'datetime',
'invoice_id' => 'integer',
'payer_id' => 'integer',
];
public function invoice()
{
return $this->belongsTo(Invoice::class);
}
public function payer()
{
return $this->belongsTo(User::class, 'payer_id');
}
}
+5 -1
View File
@@ -17,6 +17,10 @@ class Report extends Model
'medium_id',
'status',
'body',
'technique',
'finding',
'diagnose',
'recommendation',
'submitted_at',
];
@@ -43,7 +47,7 @@ class Report extends Model
'media_assignments',
'mediable_id',
'media_id'
)->withPivot('collection')->withTimestamps();
)->withPivot('collection');
}
public function medium()
+22
View File
@@ -22,6 +22,7 @@ class User extends Authenticatable
protected $fillable = [
'username',
'fullname',
'birthdate',
'national_code',
'level',
'email',
@@ -56,6 +57,7 @@ class User extends Authenticatable
{
return [
'email_verified_at' => 'datetime',
'birthdate' => 'date:Y-m-d',
'password' => 'hashed',
];
}
@@ -76,4 +78,24 @@ class User extends Authenticatable
{
return $this->hasMany(Shift::class);
}
public function wallet()
{
return $this->hasOne(Wallet::class);
}
public function invoices()
{
return $this->hasMany(Invoice::class);
}
public function bankCards()
{
return $this->hasMany(BankCard::class);
}
public function withdrawRequests()
{
return $this->hasMany(WithdrawRequest::class);
}
}
+31
View File
@@ -0,0 +1,31 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Wallet extends Model
{
use HasFactory;
protected $fillable = [
'balance',
'user_id',
];
protected $casts = [
'balance' => 'integer',
'user_id' => 'integer',
];
public function user()
{
return $this->belongsTo(User::class);
}
public function transactions()
{
return $this->hasMany(WalletTransaction::class);
}
}
+56
View File
@@ -0,0 +1,56 @@
<?php
namespace App\Models;
use App\Enums\WalletTransactionReasonEnum;
use App\Enums\WalletTransactionTypeEnum;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class WalletTransaction extends Model
{
use HasFactory;
protected $fillable = [
'type',
'reason',
'amount',
'balance_after',
'description',
'wallet_id',
'invoice_id',
'payment_id',
'withdraw_request_id',
];
protected $casts = [
'type' => WalletTransactionTypeEnum::class,
'reason' => WalletTransactionReasonEnum::class,
'amount' => 'integer',
'balance_after' => 'integer',
'wallet_id' => 'integer',
'invoice_id' => 'integer',
'payment_id' => 'integer',
'withdraw_request_id' => 'integer',
];
public function wallet()
{
return $this->belongsTo(Wallet::class);
}
public function invoice()
{
return $this->belongsTo(Invoice::class);
}
public function payment()
{
return $this->belongsTo(Payment::class);
}
public function withdrawRequest()
{
return $this->belongsTo(WithdrawRequest::class);
}
}
+46
View File
@@ -0,0 +1,46 @@
<?php
namespace App\Models;
use App\Enums\WithdrawRequestStatusEnum;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class WithdrawRequest extends Model
{
use HasFactory;
protected $fillable = [
'amount',
'status',
'admin_note',
'reviewed_at',
'reviewed_by',
'user_id',
'bank_card_id',
];
protected $casts = [
'status' => WithdrawRequestStatusEnum::class,
'amount' => 'integer',
'reviewed_at' => 'datetime',
'reviewed_by' => 'integer',
'user_id' => 'integer',
'bank_card_id' => 'integer',
];
public function user()
{
return $this->belongsTo(User::class);
}
public function bankCard()
{
return $this->belongsTo(BankCard::class);
}
public function reviewedBy()
{
return $this->belongsTo(User::class, 'reviewed_by');
}
}