'datetime', 'qty_used' => 'decimal:2', ]; /* -------------------------------------------------------------------------- */ /* RELASI */ /* -------------------------------------------------------------------------- */ /** * Relasi ke Kucing. */ public function cat(): BelongsTo { return $this->belongsTo(Cat::class)->withTrashed(); } /** * Relasi utama ke User (PIC). */ public function user(): BelongsTo { return $this->belongsTo(User::class); } /** * Alias untuk relasi user (Digunakan di Dashboard). */ public function pic(): BelongsTo { return $this->user(); } /** * PENTING: Relasi ke Medicine tunggal (Legacy Support). * Ini yang memperbaiki error 'RelationNotFoundException' pada data lama. */ public function medicine(): BelongsTo { return $this->belongsTo(Medicine::class); } /** * Relasi ke Detail Obat (Sistem Baru Multi-Medicine). */ public function details(): HasMany { return $this->hasMany(TreatmentDetail::class); } /** * Relasi langsung ke banyak Medicine (Many-to-Many via pivot details). */ public function medicines(): BelongsToMany { return $this->belongsToMany(Medicine::class, 'treatment_details') ->withPivot('dosis', 'keterangan_pakai') ->withTimestamps(); } /* -------------------------------------------------------------------------- */ /* ACCESSORS */ /* -------------------------------------------------------------------------- */ /** * Mengambil URL foto bukti. */ 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); } /** * Menghitung Progres Pengobatan secara otomatis. * Cara pakai di Blade: {{ $treatment->status_progress }} */ public function getStatusProgressAttribute(): string { $text = strtolower($this->diagnosa . ' ' . $this->keterangan); // Keyword indikator membaik $improvingKeywords = ['baik', 'makan', 'aktif', 'sembuh', 'lincah', 'normal', 'turun panas']; if (Str::contains($text, $improvingKeywords)) { return 'MEMBAIK'; } return 'STUCK'; } /* -------------------------------------------------------------------------- */ /* SCOPES */ /* -------------------------------------------------------------------------- */ /** * Scope untuk mengurutkan data terbaru. */ public function scopeLatestFirst(Builder $query): void { $query->orderBy('tanggal', 'desc'); } /** * Scope khusus untuk mengambil rekam medis yang sedang aktif (Under Treatment). */ public function scopeActiveTreatment(Builder $query): Builder { return $query->whereHas('cat', function($q) { $q->where('treatment_status', 1); }); } }