'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(), ]); } }