'string', 'is_active' => 'boolean', ]; public function rekomendasiAhli() { return $this->hasMany(RekomendasiAhli::class); } public function makananKomponenWaktu() { return $this->hasMany(MakananKomponenWaktu::class); } public function makanans() { return $this->belongsToMany(Makanan::class, 'makanan_komponen_waktu') ->withPivot('komponen_id') ->withTimestamps(); } public function komponens() { return $this->belongsToMany(Komponen::class, 'makanan_komponen_waktu', 'waktu_makan_id', 'komponen_id') ->distinct(); } public function rekomendasis() { return $this->hasMany(Rekomendasi::class, 'waktu_makan_id'); } public function consistencyRatios() { return $this->hasMany(ConsistencyRatio::class); } public function getLatestConsistencyRatioAttribute() { return $this->consistencyRatios() ->where('user_id', auth()->id()) ->orderBy('tanggal_perhitungan', 'desc') ->first(); } /** * Get waktu makan dalam timezone yang sesuai */ public function getWaktuDalamTimezone($timezone = null) { $timezone = $timezone ?: config('app.timezone'); // Parse waktu dari database (format time) $waktu = Carbon::createFromFormat('H:i:s', $this->keterangan); // Set timezone $waktu->setTimezone($timezone); return $waktu; } /** * Get waktu makan yang sudah disesuaikan dengan timezone saat ini */ public function getWaktuSekarang() { return $this->getWaktuDalamTimezone(config('app.timezone')); } /** * Check apakah sekarang adalah waktu makan ini */ public function isWaktuMakanSekarang($tolerance = 30) { $waktuMakan = $this->getWaktuSekarang(); $waktuSekarang = Carbon::now(config('app.timezone')); $selisih = abs($waktuMakan->diffInMinutes($waktuSekarang)); return $selisih <= $tolerance; } /** * Get waktu makan dalam format yang mudah dibaca */ public function getWaktuFormatted($timezone = null) { $waktu = $this->getWaktuDalamTimezone($timezone); return $waktu->format('H:i'); } /** * Get waktu makan dengan AM/PM */ public function getWaktuAMPM($timezone = null) { $waktu = $this->getWaktuDalamTimezone($timezone); return $waktu->format('h:i A'); } }