'boolean', 'vibrate' => 'boolean', 'show_preview' => 'boolean', ]; /** * 알림 유형 상수 */ public const TYPE_DEPOSIT = 'deposit'; // 입금 public const TYPE_WITHDRAWAL = 'withdrawal'; // 출금 public const TYPE_ORDER = 'order'; // 수주 public const TYPE_APPROVAL = 'approval'; // 결재 public const TYPE_ATTENDANCE = 'attendance'; // 근태 public const TYPE_NOTICE = 'notice'; // 공지사항 public const TYPE_SYSTEM = 'system'; // 시스템 /** * 알림음 상수 */ public const SOUND_DEFAULT = 'default'; public const SOUND_DEPOSIT = 'deposit.wav'; // 입금 알림음 public const SOUND_WITHDRAWAL = 'withdrawal.wav'; // 출금 알림음 public const SOUND_ORDER = 'order.wav'; // 수주 알림음 public const SOUND_APPROVAL = 'approval.wav'; // 결재 알림음 public const SOUND_URGENT = 'urgent.wav'; // 긴급 알림음 /** * 모든 알림 유형 반환 */ public static function getAllTypes(): array { return [ self::TYPE_DEPOSIT, self::TYPE_WITHDRAWAL, self::TYPE_ORDER, self::TYPE_APPROVAL, self::TYPE_ATTENDANCE, self::TYPE_NOTICE, self::TYPE_SYSTEM, ]; } /** * 모든 알림음 반환 */ public static function getAllSounds(): array { return [ self::SOUND_DEFAULT, self::SOUND_DEPOSIT, self::SOUND_WITHDRAWAL, self::SOUND_ORDER, self::SOUND_APPROVAL, self::SOUND_URGENT, ]; } /** * 사용자 관계 */ public function user(): BelongsTo { return $this->belongsTo(User::class); } /** * 테넌트 관계 */ public function tenant(): BelongsTo { return $this->belongsTo(Tenant::class); } /** * Scope: 활성화된 알림만 */ public function scopeEnabled($query) { return $query->where('is_enabled', true); } /** * Scope: 특정 사용자의 설정 */ public function scopeForUser($query, int $userId) { return $query->where('user_id', $userId); } /** * Scope: 특정 알림 유형 */ public function scopeOfType($query, string $type) { return $query->where('notification_type', $type); } }