prepare("CALL sp_generate_daily_kpi(:pdate, :pbranch)"); $stmt->execute(['pdate' => $date, 'pbranch' => $branchId]); $kpi = $stmt->fetch(); $stmt->closeCursor(); // ดึงสถิติภาระงานหมอนวดทั้งหมดจาก View $workloadStmt = $db->prepare("SELECT * FROM vw_therapist_workload_summary WHERE branch_id = :bid ORDER BY completed_queues_today DESC"); $workloadStmt->execute(['bid' => $branchId]); $therapistWorkloads = $workloadStmt->fetchAll(); Response::success('รายงานสรุปผลงานและ KPI ประจำวัน', [ 'date' => $date, 'branch_id' => $branchId, 'kpi_summary' => $kpi, 'therapist_workloads' => $therapistWorkloads, ]); } /** * GET /api/v1/reports/export - Export Revenue and Queue Report as CSV / Excel */ public function export(): void { JwtAuthMiddleware::handle(); RoleGuard::check(['Admin', 'Manager']); $date = $_GET['date'] ?? date('Y-m-d'); $db = Model::getDB(); $stmt = $db->prepare("SELECT q.queue_no, q.queue_date, p.hn, CONCAT(p.first_name_th, ' ', p.last_name_th) AS patient, s.name_th AS service, CONCAT(u.first_name, ' ', u.last_name) AS therapist, q.status, q.wait_time_mins, q.service_time_mins, pm.net_amount FROM queues q JOIN patients p ON q.patient_id = p.id JOIN services s ON q.service_id = s.id LEFT JOIN therapists t ON q.therapist_id = t.id LEFT JOIN users u ON t.user_id = u.id LEFT JOIN payments pm ON pm.queue_id = q.id WHERE q.queue_date = :dt ORDER BY q.id ASC"); $stmt->execute(['dt' => $date]); $rows = $stmt->fetchAll(); header('Content-Type: text/csv; charset=UTF-8'); header("Content-Disposition: attachment; filename=TTMQMS_Report_{$date}.csv"); $out = fopen('php://output', 'w'); // BOM for UTF-8 in Excel fputs($out, "\xEF\xBB\xBF"); fputcsv($out, ['ลำดับคิว', 'วันที่', 'HN', 'ผู้รับบริการ', 'รายการนวด', 'หมอนวด', 'สถานะ', 'เวลารอ (นาที)', 'เวลาบริการ (นาที)', 'รายได้สุทธิ (บาท)']); foreach ($rows as $row) { fputcsv($out, [ $row['queue_no'], $row['queue_date'], $row['hn'], $row['patient'], $row['service'], $row['therapist'], $row['status'], $row['wait_time_mins'], $row['service_time_mins'], $row['net_amount'] ]); } fclose($out); exit(); } }