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에 검증 규칙 추가
This commit is contained in:
김보곤
2026-02-20 23:20:49 +09:00
parent 0692eda282
commit fdea1d0244
4 changed files with 107 additions and 11 deletions

View File

@@ -40,16 +40,34 @@ class BankAccount extends Model
'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 = [
@@ -89,22 +107,69 @@ public function updater(): BelongsTo
// 헬퍼 메서드
// =========================================================================
// =========================================================================
// 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
{
$length = strlen($this->account_number);
if ($length <= 4) {
return $this->account_number;
$number = $this->account_number;
if (strlen($number) <= 6) {
return $number;
}
$visibleEnd = substr($this->account_number, -4);
$maskedPart = str_repeat('*', $length - 4);
return $maskedPart.$visibleEnd;
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');
}
// =========================================================================
// 헬퍼 메서드
// =========================================================================
/**
* 활성 상태 여부
*/
@@ -122,10 +187,13 @@ public function toggleStatus(): void
}
/**
* 대표계좌로 설정
* 잔액 업데이트
*/
public function setAsPrimary(): void
public function updateBalance(float $newBalance): void
{
$this->is_primary = true;
$this->update([
'balance' => $newBalance,
'last_transaction_at' => now(),
]);
}
}