add-report-student-preview

This commit is contained in:
reihanrere 2025-05-16 21:14:06 +07:00
parent 34733ed65e
commit 017a49350c
5 changed files with 203 additions and 65 deletions

View File

@ -3,14 +3,20 @@
namespace App\Filament\Pages; namespace App\Filament\Pages;
use App\Models\AcademicYear; use App\Models\AcademicYear;
use App\Models\Assessment;
use App\Models\ClassRoom; use App\Models\ClassRoom;
use App\Models\ClassSubject; use App\Models\ClassSubject;
use App\Models\CompetencyAchievement;
use App\Models\ExtracurricularAssessment;
use App\Models\Student; use App\Models\Student;
use App\Models\SchoolInformation; use App\Models\SchoolInformation;
use App\Models\Subject;
use App\Models\TeacherSubject;
use Filament\Notifications\Notification; use Filament\Notifications\Notification;
use Filament\Pages\Page; use Filament\Pages\Page;
use Carbon\Carbon; use Carbon\Carbon;
use function PHPUnit\Framework\isEmpty; use function PHPUnit\Framework\isEmpty;
use function Symfony\Component\String\s;
Carbon::setLocale('id'); Carbon::setLocale('id');
@ -30,12 +36,32 @@ class ReportPreview extends Page
public $table = []; public $table = [];
public $sakit = 0;
public $izin = 0;
public $tanpa_keterangan = 0;
public function mount() public function mount()
{ {
$this->loadData(); $this->loadData();
$this->loadAssessment(); $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 protected function loadData() : void
{ {
$this->student = Student::find(request()->query('studentId')); $this->student = Student::find(request()->query('studentId'));
@ -68,29 +94,82 @@ class ReportPreview extends Page
$semester = request()->query('semester'); $semester = request()->query('semester');
$year_id = request()->query('yearId'); $year_id = request()->query('yearId');
// Class Student Mapping // Assessment Mapping
$classSubjects = ClassSubject::with(['subject', 'class', 'academicYear']) $assessments = Assessment::where('semester', $this->semester)
->where('class_room_id', $class_id) ->whereHas('teacherSubject', function($query) use ($class_id, $year_id) {
->where('academic_year_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() ->get()
->sortByDesc(function ($item) { ->map(function ($as) use ($class_id) {
return $item->subject->name; $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(); ->toArray();
$this->table["extracurricular"] = $extracurricular;
}
$subjects = []; public function downloadPdf()
{
foreach ($classSubjects as $classSubject) { $view = $this->render()->render();
$category = strtolower($classSubject['subject']['category']); $pdf = PDF::loadHTML($view)->setPaper('a4', 'landscape');
$subjectName = $classSubject['subject']['name']; return response()->streamDownload(function () use ($pdf) {
$subjectId = $classSubject['subject']['id']; echo $pdf->stream();
$subjects[$category][$subjectId] = $subjectName; }, $this->student->full_name . '.pdf');
}
$this->table["subjects"] = $subjects;
// dd($subjects);
} }
public function extractClassLetter($className) public function extractClassLetter($className)

View File

@ -50,8 +50,19 @@ class ExtracurricularAssessmentResource extends Resource
]) ])
->required(), ->required(),
Forms\Components\TextInput::make('score') Forms\Components\Select::make('predicate')
->numeric() ->label('Predicate')
->options([
'A' => 'A',
'B' => 'B',
'C' => 'C',
'D' => 'D',
'E' => 'E',
])
->required(),
Forms\Components\Textarea::make('description')
->label('Description')
->required(), ->required(),
]); ]);
} }
@ -74,10 +85,17 @@ class ExtracurricularAssessmentResource extends Resource
Tables\Columns\TextColumn::make('extracurricular.name') Tables\Columns\TextColumn::make('extracurricular.name')
->label('Extracurricular'), ->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(), ->sortable(),
Tables\Columns\TextColumn::make('description')
->label('Description'),
]) ])
->filters([ ->filters([
// //

View File

@ -9,7 +9,8 @@ class ExtracurricularAssessment extends Model
protected $fillable = [ protected $fillable = [
'class_student_id', 'class_student_id',
'extracurricular_id', 'extracurricular_id',
'score', 'predicate',
'description',
'semester', 'semester',
]; ];

View File

@ -15,7 +15,8 @@ return new class extends Migration
$table->id(); $table->id();
$table->foreignId('class_student_id')->constrained('class_students'); $table->foreignId('class_student_id')->constrained('class_students');
$table->foreignId('extracurricular_id')->constrained('extracurriculars'); $table->foreignId('extracurricular_id')->constrained('extracurriculars');
$table->float('score'); $table->string('predicate');
$table->text('description');
$table->string('semester'); $table->string('semester');
$table->timestamps(); $table->timestamps();

View File

@ -1,7 +1,7 @@
<x-filament-panels::page > <x-filament-panels::page >
<div class="w-full flex gap-8"> <div class="w-full flex gap-8">
{{-- Report Preview --}} {{-- Report Preview --}}
<div class="w-full" style="font-family: 'Times New Roman', Times, serif;"> <div class="w-full" style="font-family: 'Times New Roman', Times, serif;" id="print">
<div class="text-center mb-6"> <div class="text-center mb-6">
<h2 class="text-lg font-bold uppercase">Laporan Hasil Belajar</h2> <h2 class="text-lg font-bold uppercase">Laporan Hasil Belajar</h2>
<h3 class="text-sm font-bold uppercase">(RAPOR)</h3> <h3 class="text-sm font-bold uppercase">(RAPOR)</h3>
@ -44,30 +44,30 @@
$i = 1; $i = 1;
@endphp @endphp
<tbody> <tbody>
@if(!empty($this->table['subjects']['umum'])) @if(!empty($this->table['assessments']['umum']))
@foreach($this->table['subjects']['umum'] as $subjectId => $subjectName) @foreach($this->table['assessments']['umum'] as $subjects => $subject)
<tr> <tr>
<td class="border border-black text-center">{{ $i }}</td> <td class="border border-black text-center">{{ $i }}</td>
<td class="border border-black">{{ $subjectName }}</td> <td class="border border-black">{{ $subject["subject"] }}</td>
<td class="border border-black text-center">90</td> <td class="border border-black text-center">{{ $subject["score"] }}</td>
<td class="border border-black">Ananda sangat memahami materi ajaran dan menunjukkan perilaku religius dalam keseharian.</td> <td class="border border-black">{{ $subject["competency_achievement"] }}</td>
</tr> </tr>
@php @php
$i++; $i++;
@endphp @endphp
@endforeach @endforeach
@endif @endif
@if(!empty($this->table['subjects']['seni'])) @if(!empty($this->table['assessments']['seni']))
<tr> <tr>
<td class="border border-black text-center">{{ $i }}</td> <td class="border border-black text-center">{{ $i }}</td>
<td class="border border-black" colspan="3">Seni</td> <td class="border border-black" colspan="3">Seni</td>
</tr> </tr>
@foreach($this->table['subjects']['seni'] as $subjectId => $subjectName) @foreach($this->table['assessments']['seni'] as $subjects => $subject)
<tr> <tr>
<td class="border border-black text-center">a</td> <td class="border border-black text-center">a</td>
<td class="border border-black">{{ $subjectName }}</td> <td class="border border-black">{{ $subject["subject"] }}</td>
<td class="border border-black text-center">90</td> <td class="border border-black text-center">{{ $subject["score"] }}</td>
<td class="border border-black">Ananda sangat memahami materi ajaran dan menunjukkan perilaku religius dalam keseharian.</td> <td class="border border-black">{{ $subject["competency_achievement"] }}</td>
</tr> </tr>
@php @php
$i++; $i++;
@ -90,19 +90,19 @@
</thead> </thead>
<tbody> <tbody>
@if(!empty($this->table['subjects']['muatan lokal'])) @if(!empty($this->table['assessments']['muatan lokal']))
@foreach($this->table['subjects']['muatan lokal'] as $subjectId => $subjectName) @foreach($this->table['assessments']['muatan lokal'] as $subjects => $subject)
<tr> <tr>
<td class="border border-black text-center">{{ $i }}</td> <td class="border border-black text-center">{{ $i }}</td>
<td class="border border-black">{{ $subjectName }}</td> <td class="border border-black">{{ $subject["subject"] }}</td>
<td class="border border-black text-center">90</td> <td class="border border-black text-center">{{ $subject["score"] }}</td>
<td class="border border-black">Ananda sangat memahami materi ajaran dan menunjukkan perilaku religius dalam keseharian.</td> <td class="border border-black">{{ $subject["competency_achievement"] }}</td>
</tr> </tr>
@php @php
$i++; $i++;
@endphp @endphp
@endforeach @endforeach
@endif @endif
</tbody> </tbody>
</table> </table>
@ -116,28 +116,47 @@
</tr> </tr>
</thead> </thead>
@php
$i = 1;
@endphp
<tbody> <tbody>
<tr> @if(!empty($this->table["extracurricular"]))
<td class="border border-black">1</td>
<td class="border border-black">Pramuka</td> @foreach($this->table['extracurricular'] as $subjects => $subject)
<td class="border border-black text-center">A</td> <tr>
<td class="border border-black">Sangat Berkembang</td> <td class="border border-black text-center">{{ $i }}</td>
</tr> <td class="border border-black">{{ $subject["name"] }}</td>
<td class="border border-black text-center">{{ $subject["predicate"] }}</td>
<td class="border border-black">{{ $subject["description"] }}</td>
</tr>
@php
$i++;
@endphp
@endforeach
@else
<tr>
<td class="border border-black"></td>
<td class="border border-black"></td>
<td class="border border-black text-center"></td>
<td class="border border-black"></td>
</tr>
@endif
</tbody> </tbody>
</table> </table>
{{-- Table Ketidakhadiran --}}
<table class="border text-sm mt-6"> <table class="border text-sm mt-6">
<tr> <tr>
<td class="border text-center" colspan="2">Ketidakhadiran</td> <td class="border text-center" colspan="2">Ketidakhadiran</td>
</tr> </tr>
<tr> <tr>
<td>Sakit</td><td>: 2 hari</td> <td>Sakit</td><td>: {{ $sakit }} hari</td>
</tr> </tr>
<tr> <tr>
<td>Izin</td><td>: 1 hari</td> <td>Izin</td><td>: {{ $izin }} hari</td>
</tr> </tr>
<tr> <tr>
<td>Tanpa Keterangan</td><td>: 0 hari</td> <td>Tanpa Keterangan</td><td>: {{ $tanpa_keterangan }} hari</td>
</tr> </tr>
</table> </table>
@ -173,21 +192,41 @@
<div> <div>
<h4 class="font-semibold mb-1">Input Absensi</h4> <h4 class="font-semibold mb-1">Input Absensi</h4>
<label class="block text-sm">Sakit:</label> <label class="block text-sm">Sakit:</label>
<input type="number" class="w-full rounded border-gray-300" placeholder="0"> <input
type="number"
wire:model="sakit"
class="w-full rounded border-gray-300"
placeholder="0"
min="0">
<label class="block text-sm mt-2">Izin:</label> <label class="block text-sm mt-2">Izin:</label>
<input type="number" class="w-full rounded border-gray-300" placeholder="0"> <input
type="number"
wire:model="izin"
class="w-full rounded border-gray-300"
placeholder="0"
min="0">
<label class="block text-sm mt-2">Tanpa Keterangan:</label> <label class="block text-sm mt-2">Tanpa Keterangan:</label>
<input type="number" class="w-full rounded border-gray-300" placeholder="0"> <input
type="number"
wire:model="tanpa_keterangan"
class="w-full rounded border-gray-300"
placeholder="0"
min="0">
</div> </div>
<div> <x-filament::button
<h4 class="font-semibold mb-1">Catatan Wali Kelas</h4> wire:click="saveAttendance"
<textarea class="w-full rounded border-gray-300" rows="4" placeholder="Tulis catatan di sini..."></textarea> class="w-full">
</div> Simpan
</x-filament::button>
<x-filament::button class="w-full">Simpan</x-filament::button> <x-filament::button
wire:click="downloadPdf"
class="w-full">
Generate Report
</x-filament::button>
</div> </div>
</div> </div>
</div> </div>