MIF_E31231714/app/Models/Attendance.php

109 lines
2.7 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Carbon;
class Attendance extends Model
{
protected $table = 'attendances';
public $incrementing = false;
protected $keyType = 'string';
protected $fillable = [
'id',
'user_id',
'user_type',
'tanggal',
'jam_masuk',
'jam_keluar',
'durasi_jam',
'keterangan',
];
protected $casts = [
'tanggal' => 'date',
'jam_masuk' => 'time',
'jam_keluar' => 'time',
];
public $timestamps = true;
/**
* Generate UUID untuk new records
*/
protected static function boot(): void
{
parent::boot();
static::creating(function ($model) {
if (empty($model->{$model->getKeyName()})) {
$model->{$model->getKeyName()} = \Illuminate\Support\Str::uuid()->toString();
}
});
}
/**
* Get duration attendance for each day this week
* Return array dengan format: ['Senin' => 7.5, 'Selasa' => 6.8, ...]
*/
public static function getDurationByDayThisWeek($userId)
{
$today = Carbon::today();
$startOfWeek = $today->copy()->startOfWeek(Carbon::MONDAY);
$endOfWeek = $today->copy()->endOfWeek(Carbon::SUNDAY);
$attendances = self::where('user_id', $userId)
->whereBetween('tanggal', [$startOfWeek, $endOfWeek])
->get();
// Map hari dalam Bahasa Indonesia
$daysIndonesian = [
'Monday' => 'Senin',
'Tuesday' => 'Selasa',
'Wednesday' => 'Rabu',
'Thursday' => 'Kamis',
'Friday' => 'Jumat',
'Saturday' => 'Sabtu',
'Sunday' => 'Minggu',
];
// Initialize durasi untuk Senin - Jumat (workdays)
$durasiMingguan = [
'Senin' => 0,
'Selasa' => 0,
'Rabu' => 0,
'Kamis' => 0,
'Jumat' => 0,
];
// Fill durasi dari data attendance
foreach ($attendances as $attendance) {
$dayName = $attendance->tanggal->format('l'); // e.g., 'Monday'
$dayIndonesian = $daysIndonesian[$dayName] ?? null;
if ($dayIndonesian && isset($durasiMingguan[$dayIndonesian])) {
$durasiMingguan[$dayIndonesian] = $attendance->durasi_jam ?? 0;
}
}
return $durasiMingguan;
}
/**
* Relationship to User (polymorphic concept)
*/
public function userDosen()
{
return $this->belongsTo(UserDosen::class, 'user_id', 'id');
}
public function userStaff()
{
return $this->belongsTo(UserStaff::class, 'user_id', 'id');
}
}