Files
ilycats/app/Models/Medicine.php
T
2026-02-08 15:16:35 +07:00

80 lines
2.2 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Facades\Storage;
class Medicine extends Model
{
/**
* Mass assignment untuk kolom-kolom inventori.
* Kolom 'kategori' tetap ada di fillable agar bisa diisi otomatis oleh sistem.
*/
protected $fillable = [
'nama_obat',
'foto_produk',
'kategori',
'qty',
'unit',
'expired_date'
];
/**
* Logic Otomatisasi & Integritas Data
*/
protected static function booted()
{
static::saving(function ($medicine) {
$name = strtolower($medicine->nama_obat);
// Ambil semua kategori dari database
$categories = \App\Models\Category::all();
foreach ($categories as $cat) {
// Pecah kata kunci berdasarkan koma
$keywords = explode(',', strtolower($cat->keywords));
foreach ($keywords as $keyword) {
if (str_contains($name, trim($keyword))) {
$medicine->category_id = $cat->id;
$medicine->kategori = $cat->name; // Sinkronisasi teks kategori
return;
}
}
}
$medicine->kategori = 'Umum';
});
}
/**
* Casting tipe data untuk presisi medis.
*/
protected $casts = [
'expired_date' => 'date', // Memperbaiki error isPast() di Blade
'qty' => 'float', // Mendukung dosis desimal seperti 2.5 ml
];
/**
* Accessor: Mempermudah pemanggilan foto produk dengan fallback image.
*/
public function getFotoUrlAttribute(): string
{
if ($this->foto_produk && Storage::disk('public')->exists($this->foto_produk)) {
return asset('storage/' . $this->foto_produk);
}
// Menggunakan UI Avatars sebagai placeholder jika foto tidak ada
return 'https://ui-avatars.com/api/?name=' . urlencode($this->nama_obat) . '&background=f1f5f9&color=64748b';
}
/**
* Relasi ke riwayat pengobatan kucing.
*/
public function treatments(): HasMany
{
return $this->hasMany(Treatment::class, 'medicine_id');
}
}