2025-05-15 10:02:57 +07:00

172 lines
5.4 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 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();
}),
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')),
];
}
}