38960-vm/api/queue.php
2026-03-17 08:22:39 +00:00

197 lines
6.5 KiB
PHP

<?php
require_once __DIR__ . '/../db/config.php';
require_once __DIR__ . '/../includes/actions.php'; // For permissions if needed
header('Content-Type: application/json');
$action = $_GET['action'] ?? '';
$lang = $_GET['lang'] ?? 'en';
try {
$db = db();
// --- ADD TOKEN ---
if ($action === 'add') {
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
throw new Exception('Invalid request method');
}
$patient_id = $_POST['patient_id'] ?? null;
$department_id = $_POST['department_id'] ?? null;
$doctor_id = $_POST['doctor_id'] ?? null;
if (!$patient_id || !$department_id) {
throw new Exception('Patient and Department are required');
}
// Get next token number for this department today
$today = date('Y-m-d');
$stmt = $db->prepare("
SELECT MAX(token_number)
FROM patient_queue
WHERE department_id = ?
AND DATE(created_at) = ?
");
$stmt->execute([$department_id, $today]);
$max_token = $stmt->fetchColumn();
$next_token = ($max_token) ? $max_token + 1 : 1;
// Insert
$stmt = $db->prepare("
INSERT INTO patient_queue (patient_id, department_id, doctor_id, token_number, status, created_at)
VALUES (?, ?, ?, ?, 'waiting', NOW())
");
$stmt->execute([$patient_id, $department_id, $doctor_id ?: null, $next_token]);
$queue_id = $db->lastInsertId();
echo json_encode(['success' => true, 'message' => 'Token generated', 'token_number' => $next_token, 'queue_id' => $queue_id]);
exit;
}
// --- LIST QUEUE ---
if ($action === 'list') {
$dept_id = $_GET['department_id'] ?? null;
$doc_id = $_GET['doctor_id'] ?? null;
$status = $_GET['status'] ?? null; // Can be comma separated 'waiting,serving'
$today = date('Y-m-d');
$where = "WHERE DATE(q.created_at) = ?";
$params = [$today];
if ($dept_id) {
$where .= " AND q.department_id = ?";
$params[] = $dept_id;
}
if ($doc_id) {
$where .= " AND (q.doctor_id = ? OR q.doctor_id IS NULL)";
$params[] = $doc_id;
}
if ($status) {
$statuses = explode(',', $status);
$placeholders = implode(',', array_fill(0, count($statuses), '?'));
$where .= " AND q.status IN ($placeholders)";
$params = array_merge($params, $statuses);
}
$sql = "
SELECT q.*,
p.name as patient_name,
d.name_$lang as doctor_name,
d.name_en as doctor_name_en,
d.name_ar as doctor_name_ar,
dept.name_$lang as department_name,
dept.name_en as department_name_en,
dept.name_ar as department_name_ar
FROM patient_queue q
JOIN patients p ON q.patient_id = p.id
JOIN departments dept ON q.department_id = dept.id
LEFT JOIN doctors d ON q.doctor_id = d.id
$where
ORDER BY
CASE WHEN q.status = 'serving' THEN 1 WHEN q.status = 'waiting' THEN 2 ELSE 3 END,
q.token_number ASC
";
$stmt = $db->prepare($sql);
$stmt->execute($params);
$queue = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode(['success' => true, 'data' => $queue]);
exit;
}
// --- UPDATE STATUS ---
if ($action === 'update_status') {
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
throw new Exception('Invalid request method');
}
$queue_id = $_POST['queue_id'] ?? null;
$new_status = $_POST['status'] ?? null;
$doctor_id = $_POST['doctor_id'] ?? null; // If a doctor picks up a general department token
if (!$queue_id || !$new_status) {
throw new Exception('Queue ID and Status are required');
}
if (!in_array($new_status, ['waiting', 'serving', 'completed', 'cancelled'])) {
throw new Exception('Invalid status');
}
// Logic: If setting to 'serving', update doctor_id if provided
$sql = "UPDATE patient_queue SET status = ?, updated_at = NOW()";
$params = [$new_status];
if ($new_status === 'serving' && $doctor_id) {
$sql .= ", doctor_id = ?";
$params[] = $doctor_id;
}
$sql .= " WHERE id = ?";
$params[] = $queue_id;
$stmt = $db->prepare($sql);
$stmt->execute($params);
echo json_encode(['success' => true, 'message' => 'Status updated']);
exit;
}
// --- SUMMARY ---
if ($action === 'summary') {
$today = date('Y-m-d');
$dept_id = $_GET['department_id'] ?? null;
$where = "WHERE DATE(q.created_at) = ?";
$params = [$today];
if ($dept_id) {
$where .= " AND q.department_id = ?";
$params[] = $dept_id;
}
$sql = "
SELECT
dept.name_$lang as department_name,
dept.id as department_id,
SUM(CASE WHEN q.status = 'waiting' THEN 1 ELSE 0 END) as waiting,
SUM(CASE WHEN q.status = 'serving' THEN 1 ELSE 0 END) as serving,
SUM(CASE WHEN q.status = 'completed' THEN 1 ELSE 0 END) as completed
FROM patient_queue q
JOIN departments dept ON q.department_id = dept.id
$where
GROUP BY dept.id
";
$stmt = $db->prepare($sql);
$stmt->execute($params);
$summary = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode(['success' => true, 'data' => $summary]);
exit;
}
// --- GET ADS ---
if ($action === 'get_ads') {
$stmt = $db->query("SELECT * FROM queue_ads WHERE active = 1 ORDER BY created_at DESC");
$ads = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Return both languages
$data = array_map(function($ad) {
return [
'id' => $ad['id'],
'text_en' => $ad['text_en'],
'text_ar' => $ad['text_ar']
];
}, $ads);
echo json_encode(['success' => true, 'data' => $data]);
exit;
}
throw new Exception('Invalid action');
} catch (Exception $e) {
http_response_code(400);
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
}