'date', 'batas_bayar' => 'date', 'nominal' => 'decimal:2', 'created_at' => 'datetime', 'updated_at' => 'datetime', ]; /** * Boot method untuk auto-generate ID */ protected static function boot() { parent::boot(); static::creating(function ($model) { if (empty($model->id_pembayaran)) { $last = PembayaranSpp::orderBy('id', 'desc')->first(); $num = $last ? intval(substr($last->id_pembayaran, 3)) + 1 : 1; $model->id_pembayaran = 'SPP' . str_pad($num, 3, '0', STR_PAD_LEFT); } }); } /** * Relasi: Pembayaran SPP milik satu Santri */ public function santri() { return $this->belongsTo(Santri::class, 'id_santri', 'id_santri'); } /** * Accessor: Nama bulan dalam bahasa Indonesia */ public function getBulanNamaAttribute() { $bulanIndo = [ 1 => 'Januari', 2 => 'Februari', 3 => 'Maret', 4 => 'April', 5 => 'Mei', 6 => 'Juni', 7 => 'Juli', 8 => 'Agustus', 9 => 'September', 10 => 'Oktober', 11 => 'November', 12 => 'Desember' ]; return $bulanIndo[$this->bulan] ?? '-'; } /** * Accessor: Periode lengkap (Januari 2024) */ public function getPeriodeLengkapAttribute() { return $this->bulan_nama . ' ' . $this->tahun; } /** * Accessor: Status Badge HTML */ public function getStatusBadgeAttribute() { if ($this->status === 'Lunas') { return ' Lunas'; } // Cek apakah telat if ($this->isTelat()) { return ' Belum Lunas (Telat)'; } return ' Belum Lunas'; } /** * Cek apakah pembayaran sudah telat */ public function isTelat() { if ($this->status === 'Lunas') { return false; } return Carbon::now()->isAfter($this->batas_bayar); } /** * Accessor: Nominal format Rupiah */ public function getNominalFormatAttribute() { return 'Rp ' . number_format($this->nominal, 0, ',', '.'); } /** * Scope: Filter pembayaran belum lunas */ public function scopeBelumLunas($query) { return $query->where('status', 'Belum Lunas'); } /** * Scope: Filter pembayaran lunas */ public function scopeLunas($query) { return $query->where('status', 'Lunas'); } /** * Scope: Filter pembayaran telat */ public function scopeTelat($query) { return $query->where('status', 'Belum Lunas') ->where('batas_bayar', '<', Carbon::now()); } /** * Scope: Filter by tahun */ public function scopeTahun($query, $tahun) { return $query->where('tahun', $tahun); } /** * Scope: Filter by bulan */ public function scopeBulan($query, $bulan) { return $query->where('bulan', $bulan); } /** * Scope: Search */ public function scopeSearch($query, $search) { return $query->whereHas('santri', function($q) use ($search) { $q->where('nama_lengkap', 'like', "%{$search}%") ->orWhere('id_santri', 'like', "%{$search}%") ->orWhere('nis', 'like', "%{$search}%"); })->orWhere('id_pembayaran', 'like', "%{$search}%"); } }