91 lines
3.6 KiB
PHP
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();
|
|
}
|
|
}
|