'date', 'start_time' => 'string', 'end_time' => 'string', 'sleep_hours' => 'float', ]; public function user() { return $this->belongsTo(User::class); } public function recommendation() { return $this->hasOne(Recommendation::class, 'activity_log_id'); } // Hitung durasi otomatis public function calculateDuration() { if ($this->start_time && $this->end_time) { $start = \Carbon\Carbon::parse($this->start_time); $end = \Carbon\Carbon::parse($this->end_time); $this->duration_minutes = $end->diffInMinutes($start); } } // Helper untuk mendapatkan kualitas tidur public function getSleepQualityAttribute() { if ($this->sleep_hours < 5) return 'Kurang Tidur'; if ($this->sleep_hours < 7) return 'Kurang Ideal'; if ($this->sleep_hours <= 9) return 'Ideal'; return 'Berlebih'; } public function getMoodColorAttribute() { return match($this->mood) { 'Bagus' => 'green', 'Lumayan' => 'blue', 'Biasa Saja' => 'gray', 'Cukup Jenuh' => 'yellow', 'Jenuh' => 'red', default => 'gray' }; } public function scopeToday($query) { return $query->whereDate('activity_date', Carbon::now('Asia/Jakarta')->toDateString()); } /** * Scope untuk 7 hari terakhir */ public function scopeLastWeek($query) { return $query->whereDate('activity_date', '>=', Carbon::now('Asia/Jakarta')->subDays(7)->toDateString()); } /** * Scope untuk rentang tanggal tertentu */ public function scopeDateRange($query, $startDate, $endDate) { return $query->whereBetween('activity_date', [$startDate, $endDate]); } /** * Scope untuk filter mood */ public function scopeByMood($query, $mood) { return $query->where('mood', $mood); } /** * Cek apakah aktivitas untuk hari ini */ public function isToday() { return Carbon::parse($this->activity_date)->isToday(); } /** * Format tanggal untuk tampilan */ public function getFormattedDateAttribute() { return Carbon::parse($this->activity_date)->format('d M Y'); } /** * Format hari untuk tampilan */ public function getFormattedDayAttribute() { return Carbon::parse($this->activity_date)->isoFormat('dddd'); } /** * Accessor untuk sleep hours dengan default 7 */ public function getSleepHoursAttribute($value) { return $value ?? 7; } /** * Get durasi dalam format jam dan menit */ public function getDurationFormattedAttribute() { $hours = floor($this->duration_minutes / 60); $minutes = $this->duration_minutes % 60; if ($hours > 0) { return $hours . ' jam ' . $minutes . ' menit'; } return $minutes . ' menit'; } }