Files
aplikasi-ketertiban/app/Models/Violation.php
T
Bro 4fa709509f feat: snapshot class_name di setiap presensi & pelanggaran
Migration: tambah kolom:
- attendances.class_name (varchar 100)
- violations.student_class (varchar 100)
- Backfill data existing dari students.class_name

Controller manual: simpan class_name dari form
Sync E-Jurnal: simpan class_name dari lookup student
ViolationService: ambil class_name dari student saat buat
Model: tambah ke fillable

Ini menjamin data historis tetap akurat meskipun
 siswa naik kelas (X→XI→XII) di tahun ajaran baru.
2026-07-24 18:38:35 +07:00

84 lines
2.0 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
class Violation extends Model
{
use SoftDeletes;
protected $fillable = [
'student_id', 'student_class', 'violation_type_id', 'recorded_by',
'description', 'points', 'sanction', 'location',
'violation_date', 'violation_time',
'is_verified', 'verified_by', 'verified_at',
'notes', 'handling_status', 'handled_at', 'handled_by',
];
protected function casts(): array
{
return [
'violation_date' => 'date',
'violation_time' => 'datetime:H:i',
'is_verified' => 'boolean',
'verified_at' => 'datetime',
'handled_at' => 'datetime',
'points' => 'integer',
];
}
public function student(): BelongsTo
{
return $this->belongsTo(Student::class);
}
public function violationType(): BelongsTo
{
return $this->belongsTo(ViolationType::class, 'violation_type_id');
}
public function recorder(): BelongsTo
{
return $this->belongsTo(User::class, 'recorded_by');
}
public function verifier(): BelongsTo
{
return $this->belongsTo(User::class, 'verified_by');
}
public function evidences(): HasMany
{
return $this->hasMany(ViolationEvidence::class);
}
public function handlings(): HasMany
{
return $this->hasMany(ViolationHandling::class);
}
public function handler(): BelongsTo
{
return $this->belongsTo(User::class, 'handled_by');
}
public function isUnhandled(): bool
{
return $this->handling_status === 'unhandled';
}
public function isInProgress(): bool
{
return $this->handling_status === 'in_progress';
}
public function isResolved(): bool
{
return $this->handling_status === 'resolved';
}
}