'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'); } }