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;
|
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)
|
||||||
|
|||||||
@ -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([
|
||||||
//
|
//
|
||||||
|
|||||||
@ -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',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user