Files
2026-09-23 12:45:02 +07:00

152 lines
4.1 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
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',
'status_perawatan', // Tambahan Baru
'remark_pasca_sakit'
];
/**
* Casting data agar formatnya sesuai.
*/
protected $casts = [
'tanggal' => '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);
});
}
}