68 lines
1.8 KiB
PHP
68 lines
1.8 KiB
PHP
<?php
|
|
// api/dashboard.php
|
|
require_once dirname(__DIR__) . '/config/database.php';
|
|
require_once dirname(__DIR__) . '/models/Job.php';
|
|
|
|
header('Content-Type: application/json');
|
|
|
|
// Need to be logged in
|
|
session_start();
|
|
if (!isset($_SESSION['user_id'])) {
|
|
echo json_encode(['status' => 'error', 'message' => 'Unauthorized']);
|
|
exit;
|
|
}
|
|
|
|
$conn = Database::getInstance();
|
|
|
|
// 1. Fetch Stats
|
|
$stats_query = "
|
|
SELECT
|
|
COUNT(*) as total,
|
|
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending,
|
|
SUM(CASE WHEN status IN ('assigned', 'in_progress', 'waiting_for_return') THEN 1 ELSE 0 END) as in_progress,
|
|
SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed
|
|
FROM jobs
|
|
WHERE DATE(created_at) = CURDATE()
|
|
";
|
|
$stmt = $conn->query($stats_query);
|
|
$stats = $stmt->fetch();
|
|
|
|
// 2. Fetch Latest Jobs (Limit 10)
|
|
$jobs_query = "
|
|
SELECT j.*,
|
|
fd.name as from_dept,
|
|
COALESCE(td.name, j.to_department_custom) as to_dept
|
|
FROM jobs j
|
|
LEFT JOIN departments fd ON j.from_department_id = fd.id
|
|
LEFT JOIN departments td ON j.to_department_id = td.id
|
|
ORDER BY j.created_at DESC
|
|
LIMIT 10
|
|
";
|
|
$stmt2 = $conn->query($jobs_query);
|
|
$jobs = $stmt2->fetchAll();
|
|
|
|
// 3. Fetch Online Staff
|
|
$staff_query = "
|
|
SELECT id, username, full_name, status
|
|
FROM users
|
|
WHERE role IN ('staff', 'nurse')
|
|
AND status != 'offline'
|
|
ORDER BY status DESC, username ASC
|
|
";
|
|
$stmt3 = $conn->query($staff_query);
|
|
$staff = $stmt3->fetchAll();
|
|
|
|
echo json_encode([
|
|
'status' => 'success',
|
|
'data' => [
|
|
'stats' => [
|
|
'total' => $stats['total'] ?? 0,
|
|
'pending' => $stats['pending'] ?? 0,
|
|
'in_progress' => $stats['in_progress'] ?? 0,
|
|
'completed' => $stats['completed'] ?? 0
|
|
],
|
|
'jobs' => $jobs,
|
|
'staff' => $staff
|
|
]
|
|
]);
|