Files
gravity/บริหารจัดการคิวนวดแผนไทย/app/Controllers/ReportController.php
T
2026-09-16 23:20:08 +07:00

91 lines
3.6 KiB
PHP

<?php
namespace App\Controllers;
use App\Helpers\Response;
use App\Middleware\JwtAuthMiddleware;
use App\Middleware\RoleGuard;
use App\Models\Model;
/**
* Class ReportController
* Executive Dashboard & Daily KPI Report Controller
*
* @package App\Controllers
*/
class ReportController
{
/**
* GET /api/v1/reports/kpi - Get Daily Executive KPI
*/
public function kpi(): void
{
$user = JwtAuthMiddleware::handle();
RoleGuard::check(['Admin', 'Manager']);
$date = $_GET['date'] ?? date('Y-m-d');
$branchId = isset($_GET['branch_id']) ? (int)$_GET['branch_id'] : $user['branch'];
$db = Model::getDB();
$stmt = $db->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();
}
}