80 lines
2.2 KiB
PHP
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');
|
|
}
|
|
} |