SIPDAM/samooapk/app/Models/Kasbon.php

192 lines
4.4 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Kasbon extends Model
{
use HasFactory;
protected static function boot()
{
parent::boot();
static::creating(function ($kasbon) {
if ($kasbon->tanggal_kasbon) {
$date = \Carbon\Carbon::parse($kasbon->tanggal_kasbon);
$kasbon->periode_bulan = $date->month;
$kasbon->periode_tahun = $date->year;
}
if (auth()->check()) {
$kasbon->diinput_oleh = auth()->id();
}
});
}
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'kasbons';
/**
* The primary key associated with the table.
*
* @var string
*/
protected $primaryKey = 'id_kasbon';
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'id_teknisi',
'jumlah_kasbon',
'tanggal_kasbon',
'periode_bulan',
'periode_tahun',
'keperluan',
'keterangan_detail',
'metode_pemberian',
'diinput_oleh',
'status',
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'jumlah_kasbon' => 'decimal:2',
'tanggal_kasbon' => 'date',
'status' => 'string',
'created_at' => 'timestamp',
'updated_at' => 'timestamp',
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [];
/**
* Status constants
*/
const STATUS_LUNAS = 'lunas';
const STATUS_BELUM_LUNAS = 'belum_lunas';
/**
* Get all available status options
*
* @return array
*/
public static function getStatusOptions()
{
return [
self::STATUS_LUNAS => 'Lunas',
self::STATUS_BELUM_LUNAS => 'Belum Lunas'
];
}
/**
* Scope untuk filter berdasarkan status
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $status
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeByStatus($query, $status)
{
return $query->where('status', $status);
}
/**
* Scope untuk kasbon yang belum lunas
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeBelumLunas($query)
{
return $query->where('status', self::STATUS_BELUM_LUNAS);
}
/**
* Scope untuk kasbon yang sudah lunas
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeLunas($query)
{
return $query->where('status', self::STATUS_LUNAS);
}
/**
* Accessor untuk format jumlah kasbon dalam rupiah
*
* @return string
*/
public function getJumlahKasbonFormatAttribute()
{
return 'Rp ' . number_format($this->jumlah_kasbon, 0, ',', '.');
}
/**
* Accessor untuk format tanggal kasbon
*
* @return string
*/
public function getTanggalKasbonFormatAttribute()
{
return $this->tanggal_kasbon ? $this->tanggal_kasbon->format('d/m/Y') : '';
}
/**
* Accessor untuk status dalam bahasa Indonesia
*
* @return string
*/
public function getStatusLabelAttribute()
{
$statusOptions = self::getStatusOptions();
return $statusOptions[$this->status] ?? $this->status;
}
/**
* Mutator untuk format jumlah kasbon sebelum disimpan
*
* @param mixed $value
* @return void
*/
public function setJumlahKasbonAttribute($value)
{
// Hapus format rupiah jika ada
$cleanValue = str_replace(['Rp', '.', ',', ' '], '', $value);
$this->attributes['jumlah_kasbon'] = (float) $cleanValue;
}
/**
* Accessor untuk keterangan (alias keperluan)
*/
public function getKeteranganAttribute()
{
return $this->keperluan;
}
/**
* Relasi ke Teknisi
*/
public function teknisi()
{
return $this->belongsTo(Teknisi::class, 'id_teknisi', 'id_teknisi');
}
}