doctor-appointment-system/app/Models/AppointmentModel.php
2026-04-13 19:04:12 +05:30

115 lines
3.8 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',
'appointment_date',
'appointment_time',
'status'
];
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'];
public static function normalizeStatus(?string $status): string
{
$status = trim((string) $status);
if ($status === '' || ! in_array($status, self::$validStatuses, true)) {
return 'pending';
}
return $status;
}
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')
->join('users u2', 'u2.id = d.user_id')
->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 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 = [];
}