Files
ilycats/app/Models/Treatment.php
T

109 lines
3.0 KiB
PHP
Raw Normal View History

2026-02-08 15:16:35 +07:00
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Storage;
class Treatment extends Model
{
/**
* Kolom yang boleh diisi secara mass-assignment.
*/
protected $fillable = [
'cat_id',
'user_id',
'tanggal',
'keluhan',
'diagnosa',
'nama_obat',
'dosis',
'keterangan',
'foto_bukti',
'medicine_id',
'qty_used',
];
/**
* Casting data agar formatnya sesuai (Tanggal jadi object Carbon).
*/
protected $casts = [
'tanggal' => 'datetime',
'qty_used' => 'decimal:2',
];
/* -------------------------------------------------------------------------- */
/* RELASI (MENGATASI ERROR RELATION NOT FOUND) */
/* -------------------------------------------------------------------------- */
/**
* Relasi ke Kucing.
*/
public function cat(): BelongsTo
{
return $this->belongsTo(Cat::class, 'cat_id')->withDefault([
'nama_kucing' => 'Kucing Terhapus'
]);
}
/**
* Relasi utama ke User (PIC).
* Nama fungsi 'user' wajib ada karena dipanggil di TreatmentController baris 31.
*/
public function user(): BelongsTo
{
return $this->belongsTo(User::class, 'user_id')->withDefault([
'name' => 'System / Admin'
]);
}
/**
* Alias untuk relasi user.
* Nama fungsi 'pic' wajib ada karena dipanggil di DashboardController.
*/
public function pic(): BelongsTo
{
return $this->user();
}
/**
* Relasi ke Inventori Obat.
*/
public function medicine(): BelongsTo
{
return $this->belongsTo(Medicine::class, 'medicine_id')->withDefault([
'nama_obat' => $this->nama_obat ?? 'Obat Manual'
]);
}
/* -------------------------------------------------------------------------- */
/* ACCESSORS */
/* -------------------------------------------------------------------------- */
/**
* Mengambil URL foto bukti.
* Cara akses di Blade: {{ $treatment->foto_url }}
*/
public function getFotoUrlAttribute(): string
{
if (!$this->foto_bukti) {
return 'https://ui-avatars.com/api/?name=No+Image&background=f1f5f9&color=cbd5e1';
}
return Storage::url($this->foto_bukti);
}
/* -------------------------------------------------------------------------- */
/* SCOPES */
/* -------------------------------------------------------------------------- */
/**
* Scope untuk mengurutkan data terbaru.
*/
public function scopeLatestFirst(Builder $query): void
{
$query->orderBy('tanggal', 'desc');
}
}