sistem-akademik/app/Filament/Pages/StudentReport.php

306 lines
9.8 KiB
PHP

<?php
namespace App\Filament\Pages;
use App\Models\AcademicYear;
use App\Models\Assessment;
use App\Models\ClassRoom;
use App\Models\ClassStudent;
use App\Models\ClassSubject;
use App\Models\HomeRoomTeacher;
use App\Models\Student;
use App\Models\Subject;
use App\Models\TeacherSubject;
use Filament\Forms\Components\Select;
use Filament\Forms\Form;
use Filament\Pages\Page;
use Illuminate\Contracts\Support\Htmlable;
class StudentReport extends Page
{
protected static ?string $navigationIcon = 'heroicon-o-document-text';
protected static string $view = 'filament.pages.student-report';
protected static ?string $navigationGroup = 'Academic Management';
public $class_id;
public $academic_year;
public $semester;
public ?array $data;
public $list;
public static function canAccess(): bool
{
$user = auth()->user();
if ($user->hasRole('parent')) {
return true;
}
$isHomeRoomTeacher = HomeRoomTeacher::where('teacher_id', $user->id)->exists();
return $user->can('page_SchoolInformation') || $isHomeRoomTeacher;
}
public static function shouldRegisterNavigation(): bool
{
$user = auth()->user();
if ($user->hasRole('parent')) {
return true;
}
// Untuk teacher (wali kelas)
$isHomeRoomTeacher = HomeRoomTeacher::where('teacher_id', $user->id)->exists();
// Atau punya permission khusus
return $user->can('page_SchoolInformation') || $isHomeRoomTeacher;
}
public function mount(): void
{
$this->class = null;
$this->academicYear = null;
$this->semester = null;
$this->data = [];
}
public function form(Form $form): Form
{
return $form->schema([
Select::make('class_id')
->label('Kelas')
->required()
->options(function () {
$query = ClassRoom::query();
$user = auth()->user();
if ($user->hasAnyRole(['teacher'])) {
$homeRoomTeacher = HomeRoomTeacher::where('teacher_id', $user->id)->first();
if ($homeRoomTeacher) {
$query->where('id', $homeRoomTeacher->class_room_id);
}
} else if ($user->hasAnyRole(['parent'])) {
$student = Student::where("email", $user->email)->first(); // Changed from student email to parent_email
if ($student) {
$classStudentIds = ClassStudent::where("student_id", $student->id)
->pluck('class_room_id')
->toArray();
$query->whereIn("id", $classStudentIds);
}
}
return $query->pluck('class_name', 'id')->toArray();
})
->searchable()
->native(false)
->afterStateUpdated(function ($state) {
$this->class_id = $state;
$this->data['class_id'] = $state; // Update data array
$this->loadData();
}),
Select::make('academic_year')
->label('Tahun Ajaran')
->required()
->options(AcademicYear::pluck('name', 'id')->toArray())
->searchable()
->reactive()
->afterStateUpdated(function ($state) {
$this->academic_year = $state;
$this->data['academic_year'] = $state; // Update data array
$this->loadData();
}),
Select::make('semester')
->label('Semester')
->required()
->options([
'first' => 'Ganjil',
'second' => 'Genap'
])
->reactive()
->afterStateUpdated(function ($state) {
$this->semester = $state;
$this->data['semester'] = $state;
$this->loadData();
}),
])->columns(3);
}
protected function loadData(): void
{
if (count($this->data) < 3) {
$this->list = [];
return;
}
$user = auth()->user();
$isParent = $user->hasRole('parent');
$studentId = null;
if ($isParent) {
$student = Student::where('email', $user->email)->first();
$studentId = $student->id ?? null;
}
$groupedAssessment = [];
$assessments = Assessment::where('semester', $this->semester)
->whereHas('teacherSubject', function($query) {
$query->where('academic_year_id', $this->academic_year)
->where('class_id', $this->class_id);
})
->when($isParent && $studentId, function($query) use ($studentId) {
$query->where('student_id', $studentId); // Tambahan filter untuk parent
})
->with('teacherSubject', 'student')
->get()
->toArray();
$classSubjects = ClassSubject::with(['subject', 'class', 'academicYear'])
->where('class_room_id', $this->class_id)
->where('academic_year_id', $this->academic_year)
->get()
->sortByDesc(function ($item) {
return $item->subject->name;
})
->toArray();
$header = [];
foreach ($classSubjects as $classSubject) {
$category = strtolower($classSubject['subject']['category']);
$subjectName = $classSubject['subject']['name'];
$subjectId = $classSubject['subject']['id'];
$header[$category][$subjectId] = $subjectName;
}
$students = ClassStudent::with(['class', 'academicYear', 'student'])
->where('class_room_id', $this->class_id)
->where('academic_year_id', $this->academic_year)
->when($isParent && $studentId, function($query) use ($studentId) {
$query->where('student_id', $studentId); // Tambahan filter untuk parent
})
->get()
->map(function($student) {
return $student['student'];
})
->toArray();
$finals = [];
foreach ($students as $student) {
$studentData = [
'student_id' => $student['id'],
'name' => $student['full_name'],
];
foreach ($header as $category => $subjects) {
foreach ($subjects as $subjectId => $subjectName) {
$matchingAssessment = collect($assessments)->first(function ($a) use ($student, $subjectId) {
return $a['student_id'] == $student['id'] && $a['teacher_subject']['subject_id'] == $subjectId;
});
$studentData[$category][$subjectId] = $matchingAssessment['score'] ?? '-'; // atau null
}
}
$finals[] = $studentData;
}
$result = [];
foreach ($finals as $final => $fnl) {
$existStudent = Student::where('id', $fnl['student_id'])->firstOrFail();
$studentData = [
'name' => $fnl['name'],
'id' => $fnl['student_id'],
];
$mapel = $fnl['umum'] ?? null;
if ($mapel) {
foreach ($mapel as $key => $value) {
$existSubject = Subject::where('id', $key)->firstOrFail();
if ($existSubject->is_religious) {
$studentReligion = strtolower($existStudent->religion); // contoh: "islam"
$subjectName = strtolower($existSubject->name); // contoh: "pendidikan agama islam"
if (str_contains($subjectName, $studentReligion)) {
// Hanya mapel agama yang sesuai dengan agama siswa dimasukkan ke umum[0]
$studentData['umum'][0] = $value;
}
// Mapel agama lain tidak dimasukkan sama sekali
} else {
$studentData['umum'][$key] = $value;
}
}
}
$studentData['muatan lokal'] = $fnl['muatan lokal'] ?? null;
$studentData['seni'] = $fnl['seni'] ?? null;
$result[] = $studentData;
}
$groupedAssessment["data"] = $result;
$groupedSubjectsHeader = [];
$groupedSubjectsHeader['name'] = "Nama";
$religionAdded = false;
foreach ($classSubjects as $classSubject) {
$category = strtolower($classSubject['subject']['category']);
$subjectName = $classSubject['subject']['name'];
$isReligion = $classSubject['subject']['is_religious'];
$subjectId = $classSubject['subject']['id'];
if ($isReligion) {
if (!$religionAdded) {
$groupedSubjectsHeader['umum'][0] = 'Pendidikan Agama';
$religionAdded = true;
}
continue;
}
$groupedSubjectsHeader[$category][$subjectId] = $subjectName;
}
$groupedAssessment["header"] = $groupedSubjectsHeader;
$this->list = $groupedAssessment;
}
public function getTitle(): string | Htmlable
{
return 'Rapor Siswa'; // Contoh jika nama laporan dinamis
}
public static function getNavigationLabel(): string
{
return 'Rapor Siswa';
}
public static function getBreadcrumb(): string
{
return 'Rapor Siswa';
}
public static function getPluralModelLabel(): string
{
return 'Rapor Siswa';
}
}