Initial commit

This commit is contained in:
Porawit Dongwang
2026-09-16 23:20:08 +07:00
commit 0041668dbb
32577 changed files with 3687927 additions and 0 deletions
@@ -0,0 +1,312 @@
<?php
require_once 'includes/header.php';
// Fetch stats
try {
$stmt_u = $pdo_sys->query("SELECT COUNT(DISTINCT created_by) as total_users FROM meet_requests");
$total_users = $stmt_u->fetch()['total_users'];
$stmt1 = $pdo_sys->query("SELECT COUNT(*) as total FROM meet_requests");
$total_meetings = $stmt1->fetch()['total'];
$stmt2 = $pdo_sys->query("SELECT COUNT(*) as pending FROM meet_requests WHERE CONCAT(meet_date, ' ', start_time) > NOW()");
$pending_meetings = $stmt2->fetch()['pending'];
$stmt3 = $pdo_sys->query("SELECT COUNT(*) as completed FROM meet_requests WHERE CONCAT(meet_date, ' ', end_time) < NOW()");
$completed_meetings = $stmt3->fetch()['completed'];
$stmt4 = $pdo_sys->query("SELECT COUNT(*) as active FROM meet_requests WHERE NOW() BETWEEN CONCAT(meet_date, ' ', start_time) AND CONCAT(meet_date, ' ', end_time)");
$active_meetings = $stmt4->fetch()['active'];
// Monthly Data
$year = date('Y');
$stmt_m = $pdo_sys->query("SELECT MONTH(meet_date) as m, COUNT(*) as c FROM meet_requests WHERE YEAR(meet_date) = $year GROUP BY m");
$monthly_arr = array_fill(1, 12, 0);
while($row = $stmt_m->fetch()) {
$monthly_arr[(int)$row['m']] = (int)$row['c'];
}
} catch (PDOException $e) {
$total_meetings = 0;
$pending_meetings = 0;
$completed_meetings = 0;
$active_meetings = 0;
$total_users = 0;
$monthly_arr = array_fill(1, 12, 0);
}
$monthly_json = json_encode(array_values($monthly_arr));
$status_json = json_encode([$completed_meetings, $pending_meetings, $active_meetings, 0]);
// Thai Date Format
$today = format_thai_date(date('Y-m-d'));
?>
<div class="page-content">
<!-- Welcome Hero -->
<div class="card-premium mb-4 overflow-hidden position-relative" style="background: linear-gradient(135deg, var(--primary) 0%, #064e3b 100%); color: white; border: none;">
<div class="card-body p-4 p-lg-5 position-relative z-1">
<h2 class="fw-bold mb-1">Good Morning, <?= htmlspecialchars($_SESSION['fullname']) ?> 👋</h2>
<p class="opacity-75 mb-4"><?= $today ?> | นี่คือภาพรวมของระบบในวันนี้</p>
<div class="d-flex gap-3">
<a href="requests.php" class="btn btn-light rounded-pill px-4 fw-semibold text-primary">ดูรายการทั้งหมด</a>
<button class="btn btn-outline-light rounded-pill px-4" onclick="window.showToast('กำลังโหลดข้อมูล...', 'info')">รีเฟรชข้อมูล</button>
</div>
</div>
<i class="bi bi-clouds position-absolute opacity-25" style="font-size: 15rem; right: -2rem; bottom: -4rem;"></i>
</div>
<!-- KPI Cards -->
<div class="row g-4 mb-4">
<div class="col-md-6 col-xl-3">
<div class="card-premium h-100 p-4">
<div class="d-flex justify-content-between align-items-start mb-3">
<div>
<p class="text-muted mb-1 fw-medium text-uppercase" style="font-size: 0.8rem; letter-spacing: 0.5px;">จำนวนผู้ใช้งาน</p>
<h3 class="mb-0 fw-bold"><?= number_format($total_users) ?></h3>
</div>
<div class="p-2 rounded-3 bg-primary-subtle text-primary">
<i class="bi bi-people fs-4"></i>
</div>
</div>
<div class="text-success small fw-medium">
<i class="bi bi-arrow-up-short"></i> 12.5% <span class="text-muted">เมื่อเทียบกับเดือนที่แล้ว</span>
</div>
</div>
</div>
<div class="col-md-6 col-xl-3">
<div class="card-premium h-100 p-4">
<div class="d-flex justify-content-between align-items-start mb-3">
<div>
<p class="text-muted mb-1 fw-medium text-uppercase" style="font-size: 0.8rem; letter-spacing: 0.5px;">การจองทั้งหมด</p>
<h3 class="mb-0 fw-bold"><?= number_format($total_meetings) ?></h3>
</div>
<div class="p-2 rounded-3 text-info" style="background-color: var(--info-light);">
<i class="bi bi-calendar-check fs-4"></i>
</div>
</div>
<div class="text-success small fw-medium">
<i class="bi bi-arrow-up-short"></i> 5.2% <span class="text-muted">เมื่อเทียบกับเดือนที่แล้ว</span>
</div>
</div>
</div>
<div class="col-md-6 col-xl-3">
<div class="card-premium h-100 p-4">
<div class="d-flex justify-content-between align-items-start mb-3">
<div>
<p class="text-muted mb-1 fw-medium text-uppercase" style="font-size: 0.8rem; letter-spacing: 0.5px;">รอดำเนินการ</p>
<h3 class="mb-0 fw-bold"><?= number_format($pending_meetings) ?></h3>
</div>
<div class="p-2 rounded-3 text-warning" style="background-color: var(--warning-light);">
<i class="bi bi-hourglass-split fs-4"></i>
</div>
</div>
<div class="text-warning small fw-medium">
ต้องตรวจสอบวันนี้
</div>
</div>
</div>
<div class="col-md-6 col-xl-3">
<div class="card-premium h-100 p-4">
<div class="d-flex justify-content-between align-items-start mb-3">
<div>
<p class="text-muted mb-1 fw-medium text-uppercase" style="font-size: 0.8rem; letter-spacing: 0.5px;">เสร็จสิ้น</p>
<h3 class="mb-0 fw-bold"><?= number_format($completed_meetings) ?></h3>
</div>
<div class="p-2 rounded-3 text-success" style="background-color: var(--success-light);">
<i class="bi bi-check2-circle fs-4"></i>
</div>
</div>
<div class="text-muted small fw-medium">
ทั้งหมดในระบบ
</div>
</div>
</div>
</div>
<!-- Charts -->
<div class="row g-4 mb-4">
<div class="col-lg-8">
<div class="card-premium h-100">
<div class="card-header bg-transparent border-0 pt-4 pb-0 px-4 d-flex justify-content-between align-items-center">
<h5 class="mb-0 fw-bold">สถิติการใช้งานรายเดือน (Monthly Activity)</h5>
<div class="dropdown">
<button class="btn btn-sm btn-outline-secondary dropdown-toggle rounded-pill" type="button" data-bs-toggle="dropdown">
ปีนี้ (<?= date('Y') + 543 ?>)
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">ปีที่แล้ว (<?= date('Y') + 542 ?>)</a></li>
</ul>
</div>
</div>
<div class="card-body p-4">
<div style="height: 300px;">
<canvas id="monthlyChart"></canvas>
</div>
</div>
</div>
</div>
<div class="col-lg-4">
<div class="card-premium h-100">
<div class="card-header bg-transparent border-0 pt-4 pb-0 px-4">
<h5 class="mb-0 fw-bold">ภาพรวมสถานะ (Status)</h5>
</div>
<div class="card-body p-4 d-flex justify-content-center align-items-center">
<div style="height: 250px; width: 100%;">
<canvas id="statusChart"></canvas>
</div>
</div>
</div>
</div>
</div>
<!-- Recent Records and Activity -->
<div class="row g-4">
<!-- Table -->
<div class="col-xl-8">
<div class="card-premium h-100">
<div class="card-header bg-transparent border-0 pt-4 pb-3 px-4 d-flex justify-content-between align-items-center">
<h5 class="mb-0 fw-bold">การขอใช้งานล่าสุด จำนวน 5 รายการ</h5>
<a href="requests.php" class="btn btn-sm btn-light rounded-pill">ดูทั้งหมด</a>
</div>
<div class="card-body p-4">
<div class="table-responsive">
<table id="recentRecordsTable" class="table table-hover align-middle mb-0" style="color: var(--text-main); width: 100%;">
<thead class="table-light" style="background-color: var(--bg-surface-hover);">
<tr>
<th class="ps-4 text-nowrap">ID</th>
<th>หัวข้อ (Topic)</th>
<th class="text-nowrap text-center">ผู้จอง</th>
<th class="text-nowrap">วันที่</th>
<th class="text-nowrap text-center">สถานะ</th>
</tr>
</thead>
<tbody>
<?php
try {
// Fetch only the 5 most recent records
$stmt = $pdo_sys->query("SELECT * FROM meet_requests ORDER BY id DESC LIMIT 5");
while ($row = $stmt->fetch()) {
$meet_dt = $row['meet_date'] . ' ' . $row['start_time'];
$end_dt = $row['meet_date'] . ' ' . $row['end_time'];
$now = date('Y-m-d H:i:s');
$status_html = "<span class='badge-soft badge-soft-warning'>รอดำเนินการ</span>";
if ($now > $end_dt) {
$status_html = "<span class='badge-soft badge-soft-success'>เสร็จสิ้น</span>";
} else if ($now >= $meet_dt && $now <= $end_dt) {
$status_html = "<span class='badge-soft' style='background-color: var(--info-light); color: var(--info);'>กำลังใช้งาน</span>";
}
echo "<tr>";
echo "<td class='ps-4 fw-medium text-muted text-nowrap'>#" . str_pad($row['id'], 4, '0', STR_PAD_LEFT) . "</td>";
echo "<td><span class='fw-medium'>" . htmlspecialchars($row['topic']) . "</span></td>";
echo "<td class='text-nowrap text-center'>" . htmlspecialchars($row['created_by']) . "</td>";
echo "<td class='text-nowrap'>" . format_thai_date($row['meet_date']) . " " . date('H:i', strtotime($row['start_time'])) . " - " . date('H:i', strtotime($row['end_time'])) . "</td>";
echo "<td class='text-nowrap text-center'>" . $status_html . "</td>";
echo "</tr>";
}
} catch (PDOException $e) {
echo "<tr><td colspan='5' class='text-center text-muted py-4'>ไม่มีข้อมูล</td></tr>";
}
?>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- Today's Meetings -->
<div class="col-xl-4">
<div class="card-premium h-100">
<div class="card-header bg-transparent border-0 pt-4 pb-3 px-4 d-flex justify-content-between align-items-center">
<h5 class="mb-0 fw-bold">รายการประชุมวันนี้</h5>
<span class="badge bg-primary rounded-pill"><?= date('d M') ?></span>
</div>
<div class="card-body px-4 pt-0">
<div class="position-relative mt-3" style="border-left: 2px solid var(--border-color); margin-left: 10px;">
<?php
try {
$today_date = date('Y-m-d');
$stmt = $pdo_sys->prepare("SELECT * FROM meet_requests WHERE meet_date = ? ORDER BY start_time ASC");
$stmt->execute([$today_date]);
$meetings_today = $stmt->fetchAll();
if (count($meetings_today) > 0) {
foreach ($meetings_today as $row) {
$end_dt = $row['meet_date'] . ' ' . $row['end_time'];
$meet_dt = $row['meet_date'] . ' ' . $row['start_time'];
$now = date('Y-m-d H:i:s');
// Determine icon color based on status
$icon_color = 'text-primary';
$border_color = 'var(--primary)';
$opacity = '1';
if ($now > $end_dt) {
$icon_color = 'text-success'; // Finished
$border_color = 'var(--success)';
$opacity = '0.6';
} else if ($now >= $meet_dt && $now <= $end_dt) {
$icon_color = 'text-info'; // Happening now
$border_color = 'var(--info)';
}
echo '
<div class="position-relative mb-4 ps-4" style="opacity: '.$opacity.';">
<i class="bi bi-circle-fill '.$icon_color.' position-absolute" style="left: -11px; top: 0px; font-size: 1rem; background: var(--bg-surface); border: 2px solid var(--bg-surface); border-radius: 50%;"></i>
<div class="p-3 rounded-3" style="background-color: rgba(0,0,0,0.02); border-left: 3px solid '.$border_color.';">
<div class="d-flex justify-content-between align-items-center mb-1">
<span class="fw-bold text-dark small">'.date('H:i', strtotime($row['start_time'])).' - '.date('H:i', strtotime($row['end_time'])).'</span>
<span class="badge bg-light text-dark border"><i class="bi bi-people-fill me-1"></i>'.htmlspecialchars($row['attendees'] ?? '0').'</span>
</div>
<p class="mb-1 fw-medium text-truncate" title="'.htmlspecialchars($row['topic']).'">'.htmlspecialchars($row['topic']).'</p>
<p class="text-muted small mb-0"><i class="bi bi-person me-1"></i>'.htmlspecialchars($row['created_by']).'</p>
</div>
</div>';
}
} else {
echo '
<div class="text-center py-5">
<div class="mb-3"><i class="bi bi-calendar-x text-muted" style="font-size: 3rem; opacity: 0.5;"></i></div>
<p class="text-muted mb-0 fw-medium">ไม่มีรายการประชุมในวันนี้</p>
</div>';
}
} catch (PDOException $e) {}
?>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Initialize Charts on this page -->
<script>
document.addEventListener('DOMContentLoaded', () => {
// Init charts using function from dashboard.js
if(typeof initDashboardCharts === 'function') {
initDashboardCharts(<?= $monthly_json ?>, <?= $status_json ?>);
}
// Init DataTable for Recent Records
if ($.fn.DataTable) {
$('#recentRecordsTable').DataTable({
"language": {
"url": "https://cdn.datatables.net/plug-ins/1.13.6/i18n/th.json"
},
"paging": false,
"searching": false,
"lengthChange": false,
"ordering": false,
"info": false
});
}
});
</script>
<?php require_once 'includes/footer.php'; ?>