Merge pull request #2 from reihanrere/add-report-student
add-report-student-preview
This commit is contained in:
commit
d65bf05e47
@ -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)
|
||||
|
||||
@ -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([
|
||||
//
|
||||
|
||||
@ -9,7 +9,8 @@ class ExtracurricularAssessment extends Model
|
||||
protected $fillable = [
|
||||
'class_student_id',
|
||||
'extracurricular_id',
|
||||
'score',
|
||||
'predicate',
|
||||
'description',
|
||||
'semester',
|
||||
];
|
||||
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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,19 +90,19 @@
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
@if(!empty($this->table['subjects']['muatan lokal']))
|
||||
@foreach($this->table['subjects']['muatan lokal'] as $subjectId => $subjectName)
|
||||
<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>
|
||||
</tr>
|
||||
@php
|
||||
$i++;
|
||||
@endphp
|
||||
@endforeach
|
||||
@endif
|
||||
@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">{{ $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
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@ -116,28 +116,47 @@
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
@php
|
||||
$i = 1;
|
||||
@endphp
|
||||
<tbody>
|
||||
<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>
|
||||
</tr>
|
||||
@if(!empty($this->table["extracurricular"]))
|
||||
|
||||
@foreach($this->table['extracurricular'] as $subjects => $subject)
|
||||
<tr>
|
||||
<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>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user