From 017a49350c8ed0cc3dbebb6d4b829153b62ab1d9 Mon Sep 17 00:00:00 2001 From: reihanrere Date: Fri, 16 May 2025 21:14:06 +0700 Subject: [PATCH] add-report-student-preview --- app/Filament/Pages/ReportPreview.php | 115 ++++++++++++++--- .../ExtracurricularAssessmentResource.php | 26 +++- app/Models/ExtracurricularAssessment.php | 3 +- ...eate_extracurricular_assessments_table.php | 3 +- .../filament/pages/report-preview.blade.php | 121 ++++++++++++------ 5 files changed, 203 insertions(+), 65 deletions(-) diff --git a/app/Filament/Pages/ReportPreview.php b/app/Filament/Pages/ReportPreview.php index a713bc7..2e80025 100644 --- a/app/Filament/Pages/ReportPreview.php +++ b/app/Filament/Pages/ReportPreview.php @@ -3,14 +3,20 @@ namespace App\Filament\Pages; use App\Models\AcademicYear; +use App\Models\Assessment; use App\Models\ClassRoom; use App\Models\ClassSubject; +use App\Models\CompetencyAchievement; +use App\Models\ExtracurricularAssessment; use App\Models\Student; use App\Models\SchoolInformation; +use App\Models\Subject; +use App\Models\TeacherSubject; use Filament\Notifications\Notification; use Filament\Pages\Page; use Carbon\Carbon; use function PHPUnit\Framework\isEmpty; +use function Symfony\Component\String\s; Carbon::setLocale('id'); @@ -30,12 +36,32 @@ class ReportPreview extends Page public $table = []; + public $sakit = 0; + public $izin = 0; + public $tanpa_keterangan = 0; + public function mount() { $this->loadData(); $this->loadAssessment(); } + + public function saveAttendance() + { + $this->validate([ + 'sakit' => 'required|integer|min:0', + 'izin' => 'required|integer|min:0', + 'tanpa_keterangan' => 'required|integer|min:0', + ]); + + $this->dispatch('notify', [ + 'title' => 'Berhasil', + 'message' => 'Data ketidakhadiran diperbarui', + 'type' => 'success' + ]); + } + protected function loadData() : void { $this->student = Student::find(request()->query('studentId')); @@ -68,29 +94,82 @@ class ReportPreview extends Page $semester = request()->query('semester'); $year_id = request()->query('yearId'); - // Class Student Mapping - $classSubjects = ClassSubject::with(['subject', 'class', 'academicYear']) - ->where('class_room_id', $class_id) - ->where('academic_year_id', $year_id) + // Assessment Mapping + $assessments = Assessment::where('semester', $this->semester) + ->whereHas('teacherSubject', function($query) use ($class_id, $year_id) { + $query->where('academic_year_id', $year_id) + ->where('class_id', $class_id); + }) + ->where('student_id', $this->student->id) + ->with('teacherSubject.subject', 'student') ->get() - ->sortByDesc(function ($item) { - return $item->subject->name; + ->map(function ($as) use ($class_id) { + $subject = $as->teacherSubject->subject ?? null; + + if (!$subject) { + return null; + } + + $competencyAchievements = CompetencyAchievement::where('class_room_id', $class_id) + ->where('subject_id', $subject->id) + ->where('min_score', '<=', $as->score) + ->where('max_score', '>=', $as->score) + ->first(); + + return [ + "score" => $as->score, + "subject" => $subject->name, + "category" => $subject->category, + "competency_achievement" => $competencyAchievements ? $this->student->full_name . '' . $competencyAchievements->description : '-', + ]; + }) + ->filter() // Hapus null jika ada + ->sortByDesc('subject') + ->sortBy(function ($item) { + return $item['category'] === 'umum' ? 0 : 1; + }) + ->values() + ->toArray(); + + $this->table["assessments"]['umum'] = array_filter($assessments, function ($item) { + return $item["category"] === "umum"; + }); + + $this->table["assessments"]['muatan lokal'] = array_filter($assessments, function ($item) { + return $item["category"] === "muatan lokal"; + }); + + $this->table["assessments"]['seni'] = array_filter($assessments, function ($item) { + return $item["category"] === "seni"; + }); + + $extracurricular = ExtracurricularAssessment::with('classStudent','extracurricular') + ->where('semester', $this->semester) + ->whereHas('classStudent', function($query) use ($class_id, $year_id) { + $query->where('academic_year_id', $year_id) + ->where('class_room_id', $class_id) + ->where('student_id', $this->student->id); + }) + ->get() + ->map(function ($as) { + return [ + "name" => $as->extracurricular->name, + "predicate" => $as->predicate, + "description" => $as->description, + ]; }) ->toArray(); + $this->table["extracurricular"] = $extracurricular; + } - $subjects = []; - - foreach ($classSubjects as $classSubject) { - $category = strtolower($classSubject['subject']['category']); - $subjectName = $classSubject['subject']['name']; - $subjectId = $classSubject['subject']['id']; - $subjects[$category][$subjectId] = $subjectName; - } - - $this->table["subjects"] = $subjects; - -// dd($subjects); + public function downloadPdf() + { + $view = $this->render()->render(); + $pdf = PDF::loadHTML($view)->setPaper('a4', 'landscape'); + return response()->streamDownload(function () use ($pdf) { + echo $pdf->stream(); + }, $this->student->full_name . '.pdf'); } public function extractClassLetter($className) diff --git a/app/Filament/Resources/ExtracurricularAssessmentResource.php b/app/Filament/Resources/ExtracurricularAssessmentResource.php index 7e3383d..e7b54c5 100644 --- a/app/Filament/Resources/ExtracurricularAssessmentResource.php +++ b/app/Filament/Resources/ExtracurricularAssessmentResource.php @@ -50,8 +50,19 @@ class ExtracurricularAssessmentResource extends Resource ]) ->required(), - Forms\Components\TextInput::make('score') - ->numeric() + Forms\Components\Select::make('predicate') + ->label('Predicate') + ->options([ + 'A' => 'A', + 'B' => 'B', + 'C' => 'C', + 'D' => 'D', + 'E' => 'E', + ]) + ->required(), + + Forms\Components\Textarea::make('description') + ->label('Description') ->required(), ]); } @@ -74,10 +85,17 @@ class ExtracurricularAssessmentResource extends Resource Tables\Columns\TextColumn::make('extracurricular.name') ->label('Extracurricular'), - Tables\Columns\TextColumn::make('semester'), + Tables\Columns\TextColumn::make('semester') + ->formatStateUsing(function ($state) { + return $state === 'first' ? 'Ganjil' : 'Genap'; + }), - Tables\Columns\TextColumn::make('score') + Tables\Columns\TextColumn::make('predicate') + ->label('Predicate') ->sortable(), + + Tables\Columns\TextColumn::make('description') + ->label('Description'), ]) ->filters([ // diff --git a/app/Models/ExtracurricularAssessment.php b/app/Models/ExtracurricularAssessment.php index 347b9b1..e94937b 100644 --- a/app/Models/ExtracurricularAssessment.php +++ b/app/Models/ExtracurricularAssessment.php @@ -9,7 +9,8 @@ class ExtracurricularAssessment extends Model protected $fillable = [ 'class_student_id', 'extracurricular_id', - 'score', + 'predicate', + 'description', 'semester', ]; diff --git a/database/migrations/2025_05_15_030547_create_extracurricular_assessments_table.php b/database/migrations/2025_05_15_030547_create_extracurricular_assessments_table.php index afdc4d8..032d773 100644 --- a/database/migrations/2025_05_15_030547_create_extracurricular_assessments_table.php +++ b/database/migrations/2025_05_15_030547_create_extracurricular_assessments_table.php @@ -15,7 +15,8 @@ return new class extends Migration $table->id(); $table->foreignId('class_student_id')->constrained('class_students'); $table->foreignId('extracurricular_id')->constrained('extracurriculars'); - $table->float('score'); + $table->string('predicate'); + $table->text('description'); $table->string('semester'); $table->timestamps(); diff --git a/resources/views/filament/pages/report-preview.blade.php b/resources/views/filament/pages/report-preview.blade.php index d4a31f0..87c636d 100644 --- a/resources/views/filament/pages/report-preview.blade.php +++ b/resources/views/filament/pages/report-preview.blade.php @@ -1,7 +1,7 @@
{{-- Report Preview --}} -
+

Laporan Hasil Belajar

(RAPOR)

@@ -44,30 +44,30 @@ $i = 1; @endphp - @if(!empty($this->table['subjects']['umum'])) - @foreach($this->table['subjects']['umum'] as $subjectId => $subjectName) + @if(!empty($this->table['assessments']['umum'])) + @foreach($this->table['assessments']['umum'] as $subjects => $subject) {{ $i }} - {{ $subjectName }} - 90 - Ananda sangat memahami materi ajaran dan menunjukkan perilaku religius dalam keseharian. + {{ $subject["subject"] }} + {{ $subject["score"] }} + {{ $subject["competency_achievement"] }} @php $i++; @endphp @endforeach @endif - @if(!empty($this->table['subjects']['seni'])) + @if(!empty($this->table['assessments']['seni'])) {{ $i }} Seni - @foreach($this->table['subjects']['seni'] as $subjectId => $subjectName) + @foreach($this->table['assessments']['seni'] as $subjects => $subject) a - {{ $subjectName }} - 90 - Ananda sangat memahami materi ajaran dan menunjukkan perilaku religius dalam keseharian. + {{ $subject["subject"] }} + {{ $subject["score"] }} + {{ $subject["competency_achievement"] }} @php $i++; @@ -90,19 +90,19 @@ - @if(!empty($this->table['subjects']['muatan lokal'])) - @foreach($this->table['subjects']['muatan lokal'] as $subjectId => $subjectName) - - {{ $i }} - {{ $subjectName }} - 90 - Ananda sangat memahami materi ajaran dan menunjukkan perilaku religius dalam keseharian. - - @php - $i++; - @endphp - @endforeach - @endif + @if(!empty($this->table['assessments']['muatan lokal'])) + @foreach($this->table['assessments']['muatan lokal'] as $subjects => $subject) + + {{ $i }} + {{ $subject["subject"] }} + {{ $subject["score"] }} + {{ $subject["competency_achievement"] }} + + @php + $i++; + @endphp + @endforeach + @endif @@ -116,28 +116,47 @@ + @php + $i = 1; + @endphp - - 1 - Pramuka - A - Sangat Berkembang - + @if(!empty($this->table["extracurricular"])) + + @foreach($this->table['extracurricular'] as $subjects => $subject) + + {{ $i }} + {{ $subject["name"] }} + {{ $subject["predicate"] }} + {{ $subject["description"] }} + + @php + $i++; + @endphp + @endforeach + @else + + + + + + + @endif + {{-- Table Ketidakhadiran --}} - + - + - +
Ketidakhadiran
Sakit: 2 hariSakit: {{ $sakit }} hari
Izin: 1 hariIzin: {{ $izin }} hari
Tanpa Keterangan: 0 hariTanpa Keterangan: {{ $tanpa_keterangan }} hari
@@ -173,21 +192,41 @@

Input Absensi

- + - + - +
-
-

Catatan Wali Kelas

- -
+ + Simpan + - Simpan + + Generate Report +