109 lines
2.7 KiB
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');
|
|
}
|
|
}
|