feat: endpoint attendance sertakan detail per jam (waktu time_slots + mapel schedule)
This commit is contained in:
@@ -105,13 +105,61 @@ class ParentStudentController extends Controller
|
|||||||
->whereBetween('date', [$from, $today])
|
->whereBetween('date', [$from, $today])
|
||||||
->orderBy('date')
|
->orderBy('date')
|
||||||
->orderBy('lesson_hour')
|
->orderBy('lesson_hour')
|
||||||
->get(['date', 'status']);
|
->get(['date', 'status', 'lesson_hour']);
|
||||||
|
|
||||||
$statuses = ['hadir', 'izin', 'sakit', 'alpha'];
|
$statuses = ['hadir', 'izin', 'sakit', 'alpha'];
|
||||||
|
|
||||||
|
// ---- Detail per jam: waktu (dari time_slots e-jurnal) + mapel (dari schedule) ----
|
||||||
|
$jamTimes = [];
|
||||||
|
try {
|
||||||
|
$db = DB::connection('ejurnal');
|
||||||
|
$slots = $db->table('time_slots')
|
||||||
|
->where('is_break', 0)
|
||||||
|
->orderBy('period')
|
||||||
|
->get(['period', 'start_time', 'end_time']);
|
||||||
|
$map = [];
|
||||||
|
$idx = 1;
|
||||||
|
foreach ($slots as $s) {
|
||||||
|
$map[$s->period] = $idx++;
|
||||||
|
}
|
||||||
|
foreach ($slots as $s) {
|
||||||
|
$jamTimes[$map[$s->period]] = [
|
||||||
|
substr($s->start_time, 0, 5),
|
||||||
|
substr($s->end_time, 0, 5),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
Log::error('Detail jam tidak tersedia: '.$e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
$subjectByDay = [];
|
||||||
|
try {
|
||||||
|
$db = DB::connection('ejurnal');
|
||||||
|
$yearId = $db->table('academic_years')->where('is_active', 1)->value('id');
|
||||||
|
$semesterId = $db->table('semesters')->where('is_active', 1)->value('id');
|
||||||
|
foreach ($db->table('schedules as s')
|
||||||
|
->join('classes as c', 'c.id', '=', 's.class_id')
|
||||||
|
->join('subjects as sub', 'sub.id', '=', 's.subject_id')
|
||||||
|
->where('c.name', $student->class_name)
|
||||||
|
->where('s.academic_year_id', $yearId)
|
||||||
|
->where('s.semester_id', $semesterId)
|
||||||
|
->where('s.is_active', 1)
|
||||||
|
->get(['s.day_of_week', 'sub.name as subject']) as $row) {
|
||||||
|
$subjectByDay[$row->day_of_week] = $row->subject;
|
||||||
|
}
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
Log::error('Mapel detail tidak tersedia: '.$e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
$dayEnglish = [
|
||||||
|
'Sunday' => 'sunday', 'Monday' => 'monday', 'Tuesday' => 'tuesday',
|
||||||
|
'Wednesday' => 'wednesday', 'Thursday' => 'thursday', 'Friday' => 'friday',
|
||||||
|
'Saturday' => 'saturday',
|
||||||
|
];
|
||||||
|
|
||||||
$byDate = $rows->groupBy('date');
|
$byDate = $rows->groupBy('date');
|
||||||
$records = $byDate
|
$records = $byDate
|
||||||
->map(function ($items, $date) use ($statuses) {
|
->map(function ($items, $date) use ($statuses, $jamTimes, $subjectByDay, $dayEnglish) {
|
||||||
$counts = [];
|
$counts = [];
|
||||||
foreach ($statuses as $s) {
|
foreach ($statuses as $s) {
|
||||||
$counts[$s] = $items->where('status', $s)->count();
|
$counts[$s] = $items->where('status', $s)->count();
|
||||||
@@ -124,10 +172,26 @@ class ParentStudentController extends Controller
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$dayKey = $dayEnglish[date('l', strtotime((string) $date))] ?? null;
|
||||||
|
$subject = $dayKey ? ($subjectByDay[$dayKey] ?? null) : null;
|
||||||
|
|
||||||
|
$details = $items->sortBy('lesson_hour')->map(function ($item) use ($jamTimes, $subject) {
|
||||||
|
$t = $jamTimes[$item->lesson_hour] ?? [null, null];
|
||||||
|
|
||||||
|
return [
|
||||||
|
'hour' => (int) $item->lesson_hour,
|
||||||
|
'start' => $t[0],
|
||||||
|
'end' => $t[1],
|
||||||
|
'subject' => $subject,
|
||||||
|
'status' => $item->status,
|
||||||
|
];
|
||||||
|
})->values();
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'date' => \Illuminate\Support\Str::substr((string) $date, 0, 10),
|
'date' => \Illuminate\Support\Str::substr((string) $date, 0, 10),
|
||||||
'primary' => $primary,
|
'primary' => $primary,
|
||||||
'statuses' => $counts,
|
'statuses' => $counts,
|
||||||
|
'details' => $details,
|
||||||
];
|
];
|
||||||
})
|
})
|
||||||
->values()
|
->values()
|
||||||
|
|||||||
Reference in New Issue
Block a user