Files
sam-api/app/Models/Tenants/BankAccount.php
김보곤 fdea1d0244 fix: [bank-account] 계좌 관리 API 누락 필드 8개 보강
- account_type, balance, currency, opened_at, branch_name, memo, sort_order, last_transaction_at 추가
- Model: fillable, casts, hidden, scopes, accessors를 MNG 모델 기준으로 통일
- Service: store/update에 누락 필드 반영
- FormRequest: Store/Update에 검증 규칙 추가
2026-02-21 17:19:18 +09:00

200 lines
4.8 KiB
PHP

<?php
namespace App\Models\Tenants;
use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
/**
* 은행 계좌 모델
*
* @property int $id
* @property int $tenant_id
* @property string $bank_code
* @property string $bank_name
* @property string $account_number
* @property string $account_holder
* @property string $account_name
* @property string $status
* @property int|null $assigned_user_id
* @property bool $is_primary
* @property int|null $created_by
* @property int|null $updated_by
* @property int|null $deleted_by
*/
class BankAccount extends Model
{
use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;
protected $table = 'bank_accounts';
protected $fillable = [
'tenant_id',
'bank_code',
'bank_name',
'account_number',
'account_holder',
'account_name',
'account_type',
'balance',
'currency',
'opened_at',
'last_transaction_at',
'branch_name',
'memo',
'status',
'assigned_user_id',
'is_primary',
'sort_order',
'created_by',
'updated_by',
'deleted_by',
];
protected $hidden = [
'created_by',
'updated_by',
'deleted_by',
'deleted_at',
];
protected $casts = [
'balance' => 'decimal:2',
'is_primary' => 'boolean',
'opened_at' => 'date',
'last_transaction_at' => 'datetime',
];
protected $attributes = [
'status' => 'active',
'is_primary' => false,
];
// =========================================================================
// 관계 정의
// =========================================================================
/**
* 담당자
*/
public function assignedUser(): BelongsTo
{
return $this->belongsTo(User::class, 'assigned_user_id');
}
/**
* 생성자
*/
public function creator(): BelongsTo
{
return $this->belongsTo(User::class, 'created_by');
}
/**
* 수정자
*/
public function updater(): BelongsTo
{
return $this->belongsTo(User::class, 'updated_by');
}
// =========================================================================
// 헬퍼 메서드
// =========================================================================
// =========================================================================
// Accessors
// =========================================================================
/**
* 포맷된 잔액
*/
public function getFormattedBalanceAttribute(): string
{
$amount = abs($this->balance ?? 0);
if ($amount >= 100000000) {
return number_format($amount / 100000000, 1).'억원';
} elseif ($amount >= 10000000) {
return number_format($amount / 10000000, 0).'천만원';
} elseif ($amount >= 10000) {
return number_format($amount / 10000, 0).'만원';
}
return number_format($amount).'원';
}
/**
* 마스킹된 계좌번호
*/
public function getMaskedAccountNumber(): string
{
$number = $this->account_number;
if (strlen($number) <= 6) {
return $number;
}
return substr($number, 0, 3).'-***-'.substr($number, -4);
}
// =========================================================================
// Scopes
// =========================================================================
public function scopeActive($query)
{
return $query->where('status', 'active');
}
public function scopePrimary($query)
{
return $query->where('is_primary', true);
}
public function scopeByType($query, string $accountType)
{
return $query->where('account_type', $accountType);
}
public function scopeOrdered($query)
{
return $query->orderBy('sort_order')->orderBy('bank_name');
}
// =========================================================================
// 헬퍼 메서드
// =========================================================================
/**
* 활성 상태 여부
*/
public function isActive(): bool
{
return $this->status === 'active';
}
/**
* 상태 토글
*/
public function toggleStatus(): void
{
$this->status = $this->status === 'active' ? 'inactive' : 'active';
}
/**
* 잔액 업데이트
*/
public function updateBalance(float $newBalance): void
{
$this->update([
'balance' => $newBalance,
'last_transaction_at' => now(),
]);
}
}