147 lines
4.9 KiB
PHP
147 lines
4.9 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use CodeIgniter\Model;
|
|
|
|
class AppointmentModel extends Model
|
|
{
|
|
protected $table = 'appointments';
|
|
protected $primaryKey = 'id';
|
|
protected $useAutoIncrement = true;
|
|
protected $returnType = 'array';
|
|
protected $useSoftDeletes = false;
|
|
protected $protectFields = true;
|
|
protected $allowedFields = [
|
|
'patient_id',
|
|
'doctor_id',
|
|
'services',
|
|
'created_by',
|
|
'appointment_date',
|
|
'appointment_time',
|
|
'status',
|
|
'note'
|
|
];
|
|
|
|
protected bool $allowEmptyInserts = false;
|
|
protected bool $updateOnlyChanged = true;
|
|
|
|
protected array $casts = [];
|
|
protected array $castHandlers = [];
|
|
|
|
// Dates
|
|
protected $useTimestamps = false;
|
|
protected $dateFormat = 'datetime';
|
|
protected $createdField = 'created_at';
|
|
protected $updatedField = 'updated_at';
|
|
protected $deletedField = 'deleted_at';
|
|
|
|
// Validation
|
|
protected $validationRules = [];
|
|
protected $validationMessages = [];
|
|
protected $skipValidation = false;
|
|
protected $cleanValidationRules = true;
|
|
|
|
// Callbacks
|
|
protected $allowCallbacks = true;
|
|
protected $beforeInsert = ['setDefaultStatus'];
|
|
protected $afterInsert = [];
|
|
|
|
protected static array $validStatuses = ['pending', 'approved', 'rejected', 'assigned', 'completed', 'cancelled'];
|
|
|
|
public static function normalizeStatus(?string $status): string
|
|
{
|
|
$status = strtolower(trim((string) $status));
|
|
|
|
if ($status === '' || ! in_array($status, self::$validStatuses, true)) {
|
|
return 'pending';
|
|
}
|
|
|
|
return $status;
|
|
}
|
|
|
|
public function isDoctorBooked($doctorId, $date, $time): bool
|
|
{
|
|
return $this->where('doctor_id', $doctorId)
|
|
->where('appointment_date', $date)
|
|
->where('appointment_time', $time)
|
|
->where('status', 'assigned')
|
|
->countAllResults() > 0;
|
|
}
|
|
|
|
protected function setDefaultStatus(array $eventData): array
|
|
{
|
|
if (! isset($eventData['data']['status']) || trim((string) $eventData['data']['status']) === '') {
|
|
$eventData['data']['status'] = 'pending';
|
|
} else {
|
|
$eventData['data']['status'] = self::normalizeStatus($eventData['data']['status']);
|
|
}
|
|
|
|
return $eventData;
|
|
}
|
|
|
|
public function countForDate(string $date): int
|
|
{
|
|
return $this->where('appointment_date', $date)->countAllResults();
|
|
}
|
|
|
|
public function getRecentActivity(int $limit = 6): array
|
|
{
|
|
return $this->select("
|
|
appointments.status,
|
|
appointments.appointment_date,
|
|
appointments.appointment_time,
|
|
TRIM(CONCAT(COALESCE(u1.first_name,''),' ',COALESCE(u1.last_name,''))) AS patient_name,
|
|
TRIM(CONCAT(COALESCE(u2.first_name,''),' ',COALESCE(u2.last_name,''))) AS doctor_name
|
|
")
|
|
->join('patients p', 'p.id = appointments.patient_id')
|
|
->join('users u1', 'u1.id = p.user_id')
|
|
->join('doctors d', 'd.id = appointments.doctor_id', 'left')
|
|
->join('users u2', 'u2.id = d.user_id', 'left')
|
|
->orderBy('appointments.id', 'DESC')
|
|
->findAll($limit);
|
|
}
|
|
// public function getAdminAppointments(): array
|
|
// {
|
|
// return $this->asObject()
|
|
// ->select("appointments.*, TRIM(CONCAT(COALESCE(u1.first_name, ''), ' ', COALESCE(u1.last_name, ''))) AS patient_name, TRIM(CONCAT(COALESCE(u2.first_name, ''), ' ', COALESCE(u2.last_name, ''))) AS doctor_name")
|
|
// ->join('patients p', 'p.id = appointments.patient_id')
|
|
// ->join('users u1', 'u1.id = p.user_id')
|
|
// ->join('doctors d', 'd.id = appointments.doctor_id')
|
|
// ->join('users u2', 'u2.id = d.user_id')
|
|
// ->findAll();
|
|
// }
|
|
public function getAdminAppointments(): array
|
|
{
|
|
return $this->asObject()
|
|
->select("
|
|
appointments.*,
|
|
CONCAT('APT', LPAD(appointments.id, 7, '0')) AS formatted_appointment_id,
|
|
TRIM(CONCAT(COALESCE(u1.first_name,''),' ',COALESCE(u1.last_name,''))) AS patient_name,
|
|
TRIM(CONCAT(COALESCE(u2.first_name,''),' ',COALESCE(u2.last_name,''))) AS doctor_name
|
|
")
|
|
->join('patients p', 'p.id = appointments.patient_id')
|
|
->join('users u1', 'u1.id = p.user_id')
|
|
->join('doctors d', 'd.id = appointments.doctor_id', 'left')
|
|
->join('users u2', 'u2.id = d.user_id', 'left')
|
|
->orderBy('appointments.id','DESC')
|
|
->findAll();
|
|
}
|
|
public function deleteByDoctorId(int $doctorId): void
|
|
{
|
|
$this->where('doctor_id', $doctorId)->delete();
|
|
}
|
|
|
|
public function deleteByPatientId(int $patientId): void
|
|
{
|
|
$this->where('patient_id', $patientId)->delete();
|
|
}
|
|
|
|
protected $beforeUpdate = [];
|
|
protected $afterUpdate = [];
|
|
protected $beforeFind = [];
|
|
protected $afterFind = [];
|
|
protected $beforeDelete = [];
|
|
protected $afterDelete = [];
|
|
}
|