'integer',
'halaman_akhir' => 'integer',
'total_halaman' => 'integer',
'created_at' => 'datetime',
'updated_at' => 'datetime',
];
/**
* Generator ID Kustom (M001, M002, ...)
*/
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
if (empty($model->id_materi)) {
$last = Materi::orderBy('id', 'desc')->first();
$num = $last ? intval(substr($last->id_materi, 1)) + 1 : 1;
$model->id_materi = 'M' . str_pad($num, 3, '0', STR_PAD_LEFT);
}
// Auto-calculate total_halaman
if ($model->halaman_mulai && $model->halaman_akhir) {
$model->total_halaman = $model->halaman_akhir - $model->halaman_mulai + 1;
}
});
static::updating(function ($model) {
// Auto-calculate total_halaman saat update
if ($model->halaman_mulai && $model->halaman_akhir) {
$model->total_halaman = $model->halaman_akhir - $model->halaman_mulai + 1;
}
});
}
/**
* Scope untuk filter berdasarkan kategori
*/
public function scopeKategori($query, $kategori)
{
return $query->where('kategori', $kategori);
}
/**
* Scope untuk filter berdasarkan kelas
*/
public function scopeKelas($query, $kelas)
{
return $query->where('kelas', $kelas);
}
/**
* Scope untuk search
*/
public function scopeSearch($query, $search)
{
return $query->where(function($q) use ($search) {
$q->where('nama_kitab', 'like', "%{$search}%")
->orWhere('id_materi', 'like', "%{$search}%")
->orWhere('deskripsi', 'like', "%{$search}%");
});
}
/**
* Accessor untuk badge kategori
*/
public function getKategoriBadgeAttribute()
{
$badges = [
'Al-Qur\'an' => ' Al-Qur\'an',
'Hadist' => ' Hadist',
'Materi Tambahan' => ' Materi Tambahan',
];
return $badges[$this->kategori] ?? $this->kategori;
}
/**
* Accessor untuk badge kelas
*/
public function getKelasBadgeAttribute()
{
$badges = [
'Lambatan' => 'Lambatan',
'Cepatan' => 'Cepatan',
'PB' => 'PB',
];
return $badges[$this->kelas] ?? $this->kelas;
}
/**
* Relasi: Materi memiliki banyak capaian
*/
public function capaian()
{
return $this->hasMany(Capaian::class, 'id_materi', 'id_materi');
}
/**
* Get jumlah santri yang sudah ada capaian
*/
public function getJumlahSantriAttribute()
{
return $this->capaian()->distinct('id_santri')->count('id_santri');
}
}