Merge pull request #2 from reihanrere/add-report-student

add-report-student-preview
This commit is contained in:
Reihan Renaldi 2025-05-16 21:14:33 +07:00 committed by GitHub
commit d65bf05e47
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 203 additions and 65 deletions

View File

@ -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();
$subjects = [];
foreach ($classSubjects as $classSubject) {
$category = strtolower($classSubject['subject']['category']);
$subjectName = $classSubject['subject']['name'];
$subjectId = $classSubject['subject']['id'];
$subjects[$category][$subjectId] = $subjectName;
$this->table["extracurricular"] = $extracurricular;
}
$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)

View File

@ -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([
//

View File

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

View File

@ -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();

View File

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