2026-03-30 15:29:29 +05:30

91 lines
2.6 KiB
PHP

<?php
namespace App\Controllers;
use App\Models\PatientModel;
class Patient extends BaseController
{
private function normalizeAppointmentTime(string $time): string
{
$time = trim($time);
return preg_match('/^\d{2}:\d{2}$/', $time) ? $time . ':00' : $time;
}
public function dashboard()
{
if ($r = $this->requireRole('patient')) {
return $r;
}
$db = \Config\Database::connect();
$query = $db->query("
SELECT doctors.id AS doctor_id, users.name, doctors.specialization
FROM users
JOIN doctors ON doctors.user_id = users.id
WHERE users.role = 'doctor'
");
$data['doctors'] = $query->getResult();
$patientModel = new PatientModel();
$userId = (int) session()->get('id');
$patient = $patientModel->where('user_id', $userId)->first();
$data['myAppointments'] = [];
if ($patient) {
$data['myAppointments'] = $db->query('
SELECT a.id, a.appointment_date, a.appointment_time, a.status,
u.name AS doctor_name, doctors.specialization
FROM appointments a
JOIN doctors ON doctors.id = a.doctor_id
JOIN users u ON u.id = doctors.user_id
WHERE a.patient_id = ?
ORDER BY a.appointment_date DESC, a.appointment_time DESC
', [$patient['id']])->getResult();
}
return view('patient/dashboard', $data);
}
public function bookAppointment()
{
if ($r = $this->requireRole('patient')) {
return $r;
}
$rules = [
'doctor_id' => 'required|integer',
'date' => 'required|valid_date',
'time' => 'required',
];
if (! $this->validate($rules)) {
return redirect()->back()->withInput();
}
$patientModel = new PatientModel();
$userId = (int) session()->get('id');
$patient = $patientModel->where('user_id', $userId)->first();
if (! $patient) {
return redirect()->back()->with('error', 'Patient profile not found. Please contact support.');
}
$appointmentTime = $this->normalizeAppointmentTime((string) $this->request->getPost('time'));
$data = [
'patient_id' => $patient['id'],
'doctor_id' => (int) $this->request->getPost('doctor_id'),
'appointment_date' => $this->request->getPost('date'),
'appointment_time' => $appointmentTime,
];
}
}