87 lines
2.9 KiB
PHP
87 lines
2.9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Filament\Support\SystemNotification;
|
|
use App\Models\Assignment;
|
|
use App\Models\Attendance;
|
|
use App\Models\ClassSession;
|
|
use App\Models\Course;
|
|
use App\Models\Student;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Contracts\View\View;
|
|
use Illuminate\Http\Request;
|
|
|
|
class ShareAttendanceController extends Controller
|
|
{
|
|
public function show(Request $request, Course $course): View
|
|
{
|
|
|
|
$latestAttendance = Attendance::whereHas('courseSchedule', function ($query) use ($course) {
|
|
$query->where('course_id', $course->id);
|
|
})
|
|
->latest('date')
|
|
->first();
|
|
|
|
$defaultDate = $latestAttendance ? $latestAttendance->date?->toDateString() : now()->toDateString();
|
|
$date = $request->query('date', $defaultDate);
|
|
|
|
$activeStudents = Student::whereHas('user', fn ($q) => $q->active())
|
|
->orderBy('full_name')
|
|
->get();
|
|
|
|
$attendanceRecords = Attendance::whereHas('courseSchedule', function ($query) use ($course) {
|
|
$query->where('course_id', $course->id);
|
|
})
|
|
->whereDate('date', $date)
|
|
->get()
|
|
->keyBy('student_id');
|
|
|
|
$attendances = $activeStudents->map(fn ($student) => (object) [
|
|
'student' => $student,
|
|
'attended_at' => $attendanceRecords->get($student->id)?->attended_at,
|
|
'has_attended' => $attendanceRecords->has($student->id),
|
|
]);
|
|
|
|
$availableDates = ClassSession::where('course_id', $course->id)
|
|
->select('date')
|
|
->distinct()
|
|
->orderByDesc('date')
|
|
->get()
|
|
->pluck('date');
|
|
|
|
$assignments = Assignment::where('course_id', $course->id)
|
|
->withCount('assignmentSubmissions')
|
|
->latest()
|
|
->get();
|
|
|
|
$sessionInfo = ClassSession::where('course_id', $course->id)->whereDate('date', $date)->first();
|
|
$totalStudents = $activeStudents->count();
|
|
$presentCount = $attendanceRecords->count();
|
|
$attendancePercentage = $totalStudents > 0 ? round(($presentCount / $totalStudents) * 100) : 0;
|
|
|
|
$formattedTime = $sessionInfo
|
|
? Carbon::parse($sessionInfo->start_time)->translatedFormat('H:i').' - '.Carbon::parse($sessionInfo->end_time)->format('H:i')
|
|
: '-';
|
|
|
|
$headings = [
|
|
'list' => SystemNotification::getByKey('labels.attendance_list.title'),
|
|
'info' => SystemNotification::getByKey('labels.session_info.title'),
|
|
];
|
|
|
|
return view('pages.share-attendance', compact(
|
|
'course',
|
|
'attendances',
|
|
'date',
|
|
'availableDates',
|
|
'assignments',
|
|
'sessionInfo',
|
|
'totalStudents',
|
|
'presentCount',
|
|
'attendancePercentage',
|
|
'formattedTime',
|
|
'headings'
|
|
));
|
|
}
|
|
}
|