207 lines
7.2 KiB
PHP
207 lines
7.2 KiB
PHP
<?php
|
|
|
|
namespace App\Filament\Resources\AssessmentResource\Pages;
|
|
|
|
use App\Filament\Resources\AssessmentResource;
|
|
use App\Models\Assessment;
|
|
use App\Models\Attendances;
|
|
use App\Models\ClassStudent;
|
|
use App\Models\HomeRoomTeacher;
|
|
use Filament\Actions;
|
|
use Filament\Forms\Components\Select;
|
|
use Filament\Resources\Pages\page;
|
|
use App\Models\Student;
|
|
use App\Models\TeacherSubject;
|
|
use Filament\Forms;
|
|
use Filament\Notifications\Notification;
|
|
use Illuminate\Support\Collection;
|
|
use function Symfony\Component\Translation\t;
|
|
|
|
class MultipleAssessments extends page
|
|
{
|
|
protected static string $resource = AssessmentResource::class;
|
|
|
|
protected static string $view = 'filament.resources.assessment-resource.pages.multiple-assessment';
|
|
|
|
use Forms\Concerns\InteractsWithForms;
|
|
|
|
public ?array $data = [];
|
|
public ?int $teacherSubjectId = null;
|
|
|
|
public $teacherSubject;
|
|
|
|
public array $students = [];
|
|
|
|
public $semester = 'first';
|
|
|
|
public function mount(): void
|
|
{
|
|
$this->form->fill();
|
|
}
|
|
|
|
protected function getFormSchema(): array
|
|
{
|
|
return [
|
|
Forms\Components\Grid::make(2)
|
|
->schema([
|
|
// Forms\Components\Select::make('teacherSubjectId')
|
|
// ->label('Teacher Subject')
|
|
// ->options(
|
|
// TeacherSubject::with(['teacher', 'subject', 'class', 'academicYear'])->get()->mapWithKeys(function ($item) {
|
|
// return [
|
|
// $item->id => "{$item->teacher->name} - {$item->subject->name} - {$item->class->class_name} - {$item->academicYear->name}"
|
|
// ];
|
|
// })->toArray()
|
|
// )
|
|
// ->searchable()
|
|
// ->reactive()
|
|
// ->afterStateUpdated(function ($state) {
|
|
// $this->teacherSubjectId = $state;
|
|
// $this->loadStudents();
|
|
// }),
|
|
|
|
Select::make('teacherSubjectId')
|
|
->label('Teacher Subject')
|
|
->required()
|
|
->options(function () {
|
|
$user = auth()->user();
|
|
$query = TeacherSubject::with(['teacher', 'subject', 'class', 'academicYear']);
|
|
|
|
if ($user->hasRole('teacher')) {
|
|
$homeRoomClassIds = HomeRoomTeacher::where('teacher_id', $user->id)
|
|
->pluck('class_room_id')
|
|
->toArray();
|
|
|
|
$query->where(function($q) use ($user, $homeRoomClassIds) {
|
|
$q->where('teacher_id', $user->id)
|
|
->orWhereIn('class_id', $homeRoomClassIds);
|
|
});
|
|
}
|
|
|
|
return $query->get()->mapWithKeys(fn ($item) => [
|
|
$item->id => sprintf('%s - %s - %s - %s',
|
|
$item->teacher->name,
|
|
$item->subject->name,
|
|
$item->class->class_name,
|
|
$item->academicYear->name
|
|
)
|
|
]);
|
|
})
|
|
->searchable()
|
|
->live()
|
|
->afterStateUpdated(function ($state) {
|
|
$this->teacherSubjectId = $state;
|
|
$this->loadStudents();
|
|
}),
|
|
|
|
Forms\Components\Select::make('semester')
|
|
->label('Semester')
|
|
->required()
|
|
->default('first')
|
|
->options([
|
|
'first' => 'First Semester',
|
|
'second' => 'Second Semester'
|
|
])
|
|
->live()
|
|
->afterStateUpdated(function ($state) {
|
|
$this->semester = $state;
|
|
$this->loadStudents();
|
|
}),
|
|
]),
|
|
];
|
|
}
|
|
|
|
public function loadStudents(): void
|
|
{
|
|
if (!$this->teacherSubjectId) {
|
|
$this->students = [];
|
|
return;
|
|
}
|
|
|
|
$this->teacherSubject = TeacherSubject::with(['subject','class','academicYear','teacher'])
|
|
->where('id', $this->teacherSubjectId)
|
|
->firstOrFail();
|
|
|
|
$classStudents = ClassStudent::where('class_room_id', $this->teacherSubject->class_id)
|
|
->where('academic_year_id', $this->teacherSubject->academic_year_id)
|
|
->with('student')
|
|
->get();
|
|
|
|
$isSubjectReligion = $this->teacherSubject->subject->is_religious;
|
|
$subjectName = strtolower($this->teacherSubject->subject->name);
|
|
|
|
$result = [];
|
|
|
|
foreach ($classStudents as $classStudent) {
|
|
$student = $classStudent->student;
|
|
|
|
if (!$student) continue; // Jaga-jaga kalau relasi student-nya null
|
|
|
|
$existingAssessment = Assessment::where('student_id', $student->id)
|
|
->where('teacher_subject_id', $this->teacherSubjectId)
|
|
->where('semester', $this->semester)
|
|
->first();
|
|
|
|
if ($isSubjectReligion) {
|
|
$studentReligion = strtolower($student->religion);
|
|
|
|
if (!str_contains($subjectName, $studentReligion)) {
|
|
continue; // Skip kalau agama tidak cocok
|
|
}
|
|
}
|
|
|
|
$result[] = [
|
|
'id' => $student->id,
|
|
'name' => $student->full_name,
|
|
'nis' => $student->nis,
|
|
'score' => $existingAssessment ? $existingAssessment->score : null,
|
|
];
|
|
}
|
|
|
|
$this->students = $result;
|
|
}
|
|
|
|
public function submit(): void
|
|
{
|
|
if (!$this->teacherSubjectId || empty($this->students)) {
|
|
Notification::make()
|
|
->title('Error')
|
|
->body('Please select a teacher subject and enter student scores.')
|
|
->danger()
|
|
->send();
|
|
return;
|
|
}
|
|
|
|
foreach ($this->students as $student) {
|
|
if (!isset($student['score'])) continue;
|
|
|
|
Assessment::updateOrCreate(
|
|
[
|
|
'student_id' => $student['id'],
|
|
'teacher_subject_id' => $this->teacherSubjectId,
|
|
],
|
|
[
|
|
'score' => $student['score'],
|
|
'semester' => $this->semester,
|
|
]
|
|
);
|
|
}
|
|
|
|
Notification::make()
|
|
->title('Success')
|
|
->body('Assessments saved successfully.')
|
|
->success()
|
|
->send();
|
|
}
|
|
|
|
protected function getHeaderActions(): array
|
|
{
|
|
return [
|
|
Actions\Action::make('back')
|
|
->label('Back to Assessments')
|
|
->url(static::getResource()::getUrl('index')),
|
|
];
|
|
}
|
|
|
|
}
|