428 lines
22 KiB
PHP
428 lines
22 KiB
PHP
<?php
|
|
session_start();
|
|
if (!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true || !isset($_SESSION['is_admin']) || !$_SESSION['is_admin']) {
|
|
header("location: index.php");
|
|
exit;
|
|
}
|
|
|
|
require_once 'includes/db_assessment.php';
|
|
require_once 'includes/db_hosoffice.php';
|
|
|
|
$year = $_GET['year'] ?? (date('Y') + 543);
|
|
|
|
// 1. Get total HR users
|
|
$total_users = 0;
|
|
try {
|
|
$stmt = $pdo_hos->query("SELECT COUNT(*) FROM hr_person WHERE HR_STATUS_ID='01'");
|
|
$total_users = (int)$stmt->fetchColumn();
|
|
} catch (Exception $e) { }
|
|
|
|
// 2. Get total assessed
|
|
$stmt = $pdo_assess->prepare("SELECT COUNT(*) FROM it_assessments WHERE assess_year = ?");
|
|
$stmt->execute([$year]);
|
|
$total_assessed = (int)$stmt->fetchColumn();
|
|
|
|
$percent_assessed = $total_users > 0 ? round(($total_assessed / $total_users) * 100, 2) : 0;
|
|
|
|
// 3. Get rules
|
|
$rules = $pdo_assess->query("SELECT * FROM it_rules ORDER BY order_no ASC")->fetchAll();
|
|
|
|
// 4. Aggregate answers
|
|
$stmt = $pdo_assess->prepare("SELECT rules_data FROM it_assessments WHERE assess_year = ?");
|
|
$stmt->execute([$year]);
|
|
$assessments = $stmt->fetchAll(PDO::FETCH_COLUMN);
|
|
|
|
// Initialize counters
|
|
$stats = [];
|
|
foreach ($rules as $r) {
|
|
$r_id = $r['id'];
|
|
$stats[$r_id] = [
|
|
'k_yes' => 0, 'k_no' => 0,
|
|
'u_yes' => 0, 'u_no' => 0,
|
|
'p_yes' => 0, 'p_no' => 0,
|
|
];
|
|
}
|
|
|
|
foreach ($assessments as $json_data) {
|
|
$data = json_decode($json_data, true);
|
|
if (is_array($data)) {
|
|
foreach ($rules as $r) {
|
|
$r_id = $r['id'];
|
|
if (isset($data[$r_id])) {
|
|
if ($data[$r_id]['k'] == 'yes') $stats[$r_id]['k_yes']++;
|
|
elseif ($data[$r_id]['k'] == 'no') $stats[$r_id]['k_no']++;
|
|
|
|
if ($data[$r_id]['u'] == 'yes') $stats[$r_id]['u_yes']++;
|
|
elseif ($data[$r_id]['u'] == 'no') $stats[$r_id]['u_no']++;
|
|
|
|
if ($data[$r_id]['p'] == 'yes') $stats[$r_id]['p_yes']++;
|
|
elseif ($data[$r_id]['p'] == 'no') $stats[$r_id]['p_no']++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 5. AI Summary Calculation
|
|
$max_k_yes = -1; $id_k_yes = ''; $max_k_no = -1; $id_k_no = '';
|
|
$max_u_yes = -1; $id_u_yes = ''; $max_u_no = -1; $id_u_no = '';
|
|
$max_p_yes = -1; $id_p_yes = ''; $max_p_no = -1; $id_p_no = '';
|
|
|
|
$rule_mapping = [];
|
|
$n = 1;
|
|
foreach ($rules as $r) {
|
|
$rule_mapping[$r['id']] = $n;
|
|
$n++;
|
|
}
|
|
|
|
foreach ($stats as $id => $s) {
|
|
if ($s['k_yes'] > $max_k_yes) { $max_k_yes = $s['k_yes']; $id_k_yes = $id; }
|
|
if ($s['k_no'] > $max_k_no) { $max_k_no = $s['k_no']; $id_k_no = $id; }
|
|
|
|
if ($s['u_yes'] > $max_u_yes) { $max_u_yes = $s['u_yes']; $id_u_yes = $id; }
|
|
if ($s['u_no'] > $max_u_no) { $max_u_no = $s['u_no']; $id_u_no = $id; }
|
|
|
|
if ($s['p_yes'] > $max_p_yes) { $max_p_yes = $s['p_yes']; $id_p_yes = $id; }
|
|
if ($s['p_no'] > $max_p_no) { $max_p_no = $s['p_no']; $id_p_no = $id; }
|
|
}
|
|
|
|
$rule_k_best = $rule_mapping[$id_k_yes] ?? '-';
|
|
$rule_k_worst = $rule_mapping[$id_k_no] ?? '-';
|
|
|
|
$rule_u_best = $rule_mapping[$id_u_yes] ?? '-';
|
|
$rule_u_worst = $rule_mapping[$id_u_no] ?? '-';
|
|
|
|
$rule_p_best = $rule_mapping[$id_p_yes] ?? '-';
|
|
$rule_p_worst = $rule_mapping[$id_p_no] ?? '-';
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html lang="th">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<title>รายงานการประเมิน ปี <?php echo htmlspecialchars($year); ?></title>
|
|
<!-- Favicon -->
|
|
<link rel="icon" type="image/png" href="assets/images/logo.png">
|
|
|
|
<link href="https://fonts.googleapis.com/css2?family=Sarabun:wght@400;600;700&display=swap" rel="stylesheet">
|
|
<style>
|
|
/* TH Sarabun PSK Equivalent settings */
|
|
@page { size: A4; margin: 2.5cm 2cm 2cm 2.5cm; } /* บน 2.5, ขวา 2, ล่าง 2, ซ้าย 2.5 */
|
|
|
|
body {
|
|
font-family: 'Sarabun', sans-serif;
|
|
font-size: 10pt; /* ลดขนาดเป็น 10pt ตามที่ต้องการ */
|
|
color: #000;
|
|
background: #fff;
|
|
margin: 0;
|
|
padding: 0;
|
|
line-height: 1.3;
|
|
}
|
|
|
|
.page { page-break-after: always; min-height: 297mm; position: relative; }
|
|
.page:last-child { page-break-after: avoid; }
|
|
|
|
.header-title {
|
|
text-align: center;
|
|
font-weight: bold;
|
|
margin-bottom: 25px;
|
|
font-size: 12pt;
|
|
line-height: 1.5;
|
|
}
|
|
|
|
.sub-header {
|
|
margin-bottom: 15px;
|
|
text-align: center;
|
|
font-size: 10pt;
|
|
}
|
|
|
|
/* Table Styling */
|
|
table {
|
|
width: 100%;
|
|
border-collapse: collapse;
|
|
margin-bottom: 20px;
|
|
font-size: 10pt;
|
|
}
|
|
th, td {
|
|
border: 1px solid #000;
|
|
padding: 6px 8px;
|
|
vertical-align: middle;
|
|
}
|
|
th {
|
|
text-align: center;
|
|
font-weight: bold;
|
|
background-color: #f9f9f9;
|
|
-webkit-print-color-adjust: exact;
|
|
}
|
|
|
|
.text-center { text-align: center; }
|
|
.text-left { text-align: left; }
|
|
|
|
.section-title {
|
|
font-weight: bold;
|
|
margin-top: 25px;
|
|
margin-bottom: 15px;
|
|
font-size: 11pt;
|
|
text-decoration: underline;
|
|
}
|
|
|
|
/* Stats List Styling */
|
|
.stats-list { margin-bottom: 25px; padding-left: 10px; }
|
|
.stats-list-item { display: flex; margin-bottom: 8px; font-size: 10pt; }
|
|
.stats-list-item .col-1 { width: 70px; font-weight: bold; }
|
|
.stats-list-item .col-2 { width: 200px; }
|
|
|
|
/* Lined Box (เส้นประสำหรับเขียน) */
|
|
.lined-box {
|
|
margin-bottom: 25px;
|
|
width: 100%;
|
|
}
|
|
.lined-box .line {
|
|
border-bottom: 1px dashed #ccc;
|
|
min-height: 32px;
|
|
line-height: 32px;
|
|
outline: none;
|
|
padding-left: 5px;
|
|
font-size: 10pt;
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
}
|
|
.lined-box .line:focus {
|
|
background-color: #fdfdfd;
|
|
border-bottom: 1px dashed #008f91;
|
|
}
|
|
|
|
/* Print Rules */
|
|
@media print {
|
|
body { margin: 0; -webkit-print-color-adjust: exact; }
|
|
.no-print { display: none !important; }
|
|
.page { min-height: auto; margin: 0; box-shadow: none; border: none; }
|
|
th { background-color: transparent; }
|
|
.lined-box .line { border-bottom: 1px dashed #aaa; } /* พิมพ์แล้วเห็นเส้นจางๆ */
|
|
}
|
|
|
|
/* Screen preview styling (shadows like a paper) */
|
|
@media screen {
|
|
body { background: #e0e5ec; padding: 20px; display: flex; flex-direction: column; align-items: center; }
|
|
.page {
|
|
background: white;
|
|
width: 210mm; /* A4 Width */
|
|
padding: 2.5cm 2cm 2cm 2.5cm;
|
|
margin-bottom: 20px;
|
|
box-shadow: 0 5px 15px rgba(0,0,0,0.1);
|
|
border-radius: 2px;
|
|
box-sizing: border-box;
|
|
}
|
|
}
|
|
|
|
.btn-print {
|
|
position: fixed; top: 20px; right: 20px; padding: 12px 24px; background: linear-gradient(135deg, #008f91, #005d68);
|
|
color: #fff; text-decoration: none; border-radius: 50px; font-family: 'Sarabun', sans-serif;
|
|
font-size: 14pt; font-weight: bold; box-shadow: 0 4px 10px rgba(0,0,0,0.15); border: none; cursor: pointer;
|
|
z-index: 1000; transition: transform 0.2s;
|
|
}
|
|
.btn-print:hover { transform: translateY(-2px); }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
|
|
<button onclick="window.print()" class="btn-print no-print">🖨️ พิมพ์รายงาน</button>
|
|
|
|
<!-- Page 1: ตารางสรุป -->
|
|
<div class="page">
|
|
<div class="header-title">
|
|
รายงานการประเมินระเบียบปฏิบัติด้านความมั่นคงปลอดภัยของระบบเทคโนโลยีสารสนเทศ<br>
|
|
ของโรงพยาบาลเกาะสมุย ประจำปี <?php echo htmlspecialchars($year); ?>
|
|
</div>
|
|
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th rowspan="2" style="width: 50%; vertical-align: middle;">ระเบียบปฏิบัติด้านความมั่นคงปลอดภัยของระบบเทคโนโลยีสารสนเทศ<br>ของโรงพยาบาลเกาะสมุย</th>
|
|
<th colspan="2">การรับรู้</th>
|
|
<th colspan="2">ความเข้าใจ</th>
|
|
<th colspan="2">การปฏิบัติ</th>
|
|
</tr>
|
|
<tr>
|
|
<th>รับรู้</th>
|
|
<th>ร้อยละ</th>
|
|
<th>เข้าใจ</th>
|
|
<th>ร้อยละ</th>
|
|
<th>ปฏิบัติ<br>ได้</th>
|
|
<th>ร้อยละ</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php
|
|
$n = 1;
|
|
foreach ($rules as $r):
|
|
$id = $r['id'];
|
|
$s = $stats[$id];
|
|
// Calculate %
|
|
$total_k = $s['k_yes'] + $s['k_no'];
|
|
$pct_k = $total_k > 0 ? number_format(($s['k_yes'] / $total_k) * 100, 2) : '0.00';
|
|
|
|
$total_u = $s['u_yes'] + $s['u_no'];
|
|
$pct_u = $total_u > 0 ? number_format(($s['u_yes'] / $total_u) * 100, 2) : '0.00';
|
|
|
|
$total_p = $s['p_yes'] + $s['p_no'];
|
|
$pct_p = $total_p > 0 ? number_format(($s['p_yes'] / $total_p) * 100, 2) : '0.00';
|
|
?>
|
|
<tr>
|
|
<td><?php echo $n . "." . htmlspecialchars($r['content']); ?></td>
|
|
<td class="text-center"><?php echo $s['k_yes']; ?></td>
|
|
<td class="text-center"><?php echo $pct_k; ?></td>
|
|
<td class="text-center"><?php echo $s['u_yes']; ?></td>
|
|
<td class="text-center"><?php echo $pct_u; ?></td>
|
|
<td class="text-center"><?php echo $s['p_yes']; ?></td>
|
|
<td class="text-center"><?php echo $pct_p; ?></td>
|
|
</tr>
|
|
<?php $n++; endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<!-- Page 2: การรับรู้ระเบียบ -->
|
|
<div class="page">
|
|
<div class="header-title">
|
|
รายงานการประเมินความรับรู้ระเบียบปฏิบัติด้านความมั่นคงปลอดภัยของระบบเทคโนโลยีสารสนเทศ<br>
|
|
ของโรงพยาบาลเกาะสมุย ครั้งที่ ประจำปี <?php echo htmlspecialchars($year); ?>
|
|
</div>
|
|
|
|
<div class="sub-header">
|
|
จำนวนผู้ใช้งานระบบทั้งสิ้น <?php echo $total_users; ?> คน ดำเนินการประเมิน <?php echo $total_assessed; ?> คน คิดเป็นร้อยละ <?php echo $percent_assessed; ?>
|
|
</div>
|
|
|
|
<div class="section-title">การรับรู้ระเบียบ</div>
|
|
<div class="stats-list">
|
|
<?php
|
|
$n = 1;
|
|
foreach ($rules as $r):
|
|
$id = $r['id'];
|
|
$s = $stats[$id];
|
|
$total_k = $s['k_yes'] + $s['k_no'];
|
|
$pct_k = $total_k > 0 ? number_format(($s['k_yes'] / $total_k) * 100, 2) : '0.00';
|
|
?>
|
|
<div class="stats-list-item">
|
|
<div class="col-1">ข้อที่ <?php echo $n; ?></div>
|
|
<div class="col-2">รู้ <?php echo $s['k_yes']; ?> คน ไม่รู้ <?php echo $s['k_no']; ?> คน</div>
|
|
<div>การรับรู้คิดเป็นร้อยละ <?php echo $pct_k; ?></div>
|
|
</div>
|
|
<?php $n++; endforeach; ?>
|
|
</div>
|
|
|
|
<div class="section-title">สรุปผลการประเมิน</div>
|
|
<div class="lined-box">
|
|
<div class="line" contenteditable="true">ระเบียบข้อที่รับรู้มากที่สุดคือข้อที่ <?php echo $rule_k_best; ?> ข้อที่ไม่รับรู้มากที่สุดคือข้อที่ <?php echo $rule_k_worst; ?></div>
|
|
<div class="line" contenteditable="true">สาเหตุหลักอาจเกิดจากการขาดการประชาสัมพันธ์ระเบียบข้อ <?php echo $rule_k_worst; ?> อย่างทั่วถึง</div>
|
|
<div class="line" contenteditable="true">หรือพนักงานอาจยังไม่คุ้นเคยกับรายละเอียดเชิงลึกของระเบียบดังกล่าว</div>
|
|
<div class="line" contenteditable="true"></div>
|
|
</div>
|
|
|
|
<div class="section-title">เสนอแนะแนวทางแก้ไข</div>
|
|
<div class="lined-box">
|
|
<div class="line" contenteditable="true">ควรเพิ่มช่องทางการสื่อสารและประชาสัมพันธ์ระเบียบข้อ <?php echo $rule_k_worst; ?> ให้ชัดเจนยิ่งขึ้น</div>
|
|
<div class="line" contenteditable="true">ผ่านระบบอินทราเน็ต หรือการแจ้งเตือนในการประชุมประจำเดือนของแต่ละแผนก</div>
|
|
<div class="line" contenteditable="true"></div>
|
|
<div class="line" contenteditable="true"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Page 3: ความเข้าใจระเบียบ -->
|
|
<div class="page">
|
|
<div class="header-title">
|
|
รายงานการประเมินความเข้าใจระเบียบปฏิบัติด้านความมั่นคงปลอดภัยของระบบเทคโนโลยีสารสนเทศ<br>
|
|
ของโรงพยาบาลเกาะสมุย ประจำปี <?php echo htmlspecialchars($year); ?>
|
|
</div>
|
|
|
|
<div class="sub-header">
|
|
จำนวนผู้ใช้งานระบบทั้งสิ้น <?php echo $total_users; ?> คน ดำเนินการประเมิน <?php echo $total_assessed; ?> คน คิดเป็นร้อยละ <?php echo $percent_assessed; ?>
|
|
</div>
|
|
|
|
<div class="section-title">ความเข้าใจระเบียบ</div>
|
|
<div class="stats-list">
|
|
<?php
|
|
$n = 1;
|
|
foreach ($rules as $r):
|
|
$id = $r['id'];
|
|
$s = $stats[$id];
|
|
$total_u = $s['u_yes'] + $s['u_no'];
|
|
$pct_u = $total_u > 0 ? number_format(($s['u_yes'] / $total_u) * 100, 2) : '0.00';
|
|
?>
|
|
<div class="stats-list-item">
|
|
<div class="col-1">ข้อที่ <?php echo $n; ?></div>
|
|
<div class="col-2" style="width: 220px;">เข้าใจ <?php echo $s['u_yes']; ?> คน ไม่เข้าใจ <?php echo $s['u_no']; ?> คน</div>
|
|
<div>ความเข้าใจคิดเป็นร้อยละ <?php echo $pct_u; ?></div>
|
|
</div>
|
|
<?php $n++; endforeach; ?>
|
|
</div>
|
|
|
|
<div class="section-title">สรุปผลการประเมิน</div>
|
|
<div class="lined-box">
|
|
<div class="line" contenteditable="true">ระเบียบข้อที่เข้าใจมากที่สุดคือข้อที่ <?php echo $rule_u_best; ?> และข้อที่ไม่เข้าใจมากที่สุดคือข้อที่ <?php echo $rule_u_worst; ?></div>
|
|
<div class="line" contenteditable="true">สาเหตุหลักอาจเกิดจากเนื้อหาของระเบียบข้อ <?php echo $rule_u_worst; ?> มีความซับซ้อน หรือต้องอาศัยการตีความ</div>
|
|
<div class="line" contenteditable="true">ทำให้ผู้ใช้งานทั่วไปเกิดความสับสนได้ง่ายในทางปฏิบัติ</div>
|
|
<div class="line" contenteditable="true"></div>
|
|
</div>
|
|
|
|
<div class="section-title">เสนอแนะแนวทางแก้ไข</div>
|
|
<div class="lined-box">
|
|
<div class="line" contenteditable="true">ควรจัดทำคู่มือหรือสื่อการสอน (Infographic) ที่เข้าใจง่ายสำหรับระเบียบข้อ <?php echo $rule_u_worst; ?></div>
|
|
<div class="line" contenteditable="true">พร้อมยกตัวอย่างการใช้งานจริง เพื่อสร้างความเข้าใจที่ถูกต้องให้แก่เจ้าหน้าที่</div>
|
|
<div class="line" contenteditable="true"></div>
|
|
<div class="line" contenteditable="true"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Page 4: การปฏิบัติตามระเบียบ -->
|
|
<div class="page">
|
|
<div class="header-title">
|
|
รายงานการประเมินการปฏิบัติตามระเบียบปฏิบัติด้านความมั่นคงปลอดภัยของระบบเทคโนโลยีสารสนเทศ<br>
|
|
ของโรงพยาบาลเกาะสมุย ประจำปี <?php echo htmlspecialchars($year); ?>
|
|
</div>
|
|
|
|
<div class="sub-header">
|
|
จำนวนผู้ใช้งานระบบทั้งสิ้น <?php echo $total_users; ?> คน ดำเนินการประเมิน <?php echo $total_assessed; ?> คน คิดเป็นร้อยละ <?php echo $percent_assessed; ?>
|
|
</div>
|
|
|
|
<div class="section-title">การปฏิบัติตามระเบียบ</div>
|
|
<div class="stats-list">
|
|
<?php
|
|
$n = 1;
|
|
foreach ($rules as $r):
|
|
$id = $r['id'];
|
|
$s = $stats[$id];
|
|
$total_p = $s['p_yes'] + $s['p_no'];
|
|
$pct_p = $total_p > 0 ? number_format(($s['p_yes'] / $total_p) * 100, 2) : '0.00';
|
|
?>
|
|
<div class="stats-list-item">
|
|
<div class="col-1">ข้อที่ <?php echo $n; ?></div>
|
|
<div class="col-2" style="width: 240px;">ปฏิบัติ <?php echo $s['p_yes']; ?> คน ไม่ปฏิบัติ <?php echo $s['p_no']; ?> คน</div>
|
|
<div>การปฏิบัติตามคิดเป็นร้อยละ <?php echo $pct_p; ?></div>
|
|
</div>
|
|
<?php $n++; endforeach; ?>
|
|
</div>
|
|
|
|
<div class="section-title">สรุปผลการประเมิน</div>
|
|
<div class="lined-box">
|
|
<div class="line" contenteditable="true">ระเบียบที่เจ้าหน้าที่ปฏิบัติตามมากที่สุดคือข้อที่ <?php echo $rule_p_best; ?> ส่วนข้อที่ละเมิดมากที่สุดคือข้อที่ <?php echo $rule_p_worst; ?></div>
|
|
<div class="line" contenteditable="true">สาเหตุของการละเมิดระเบียบข้อ <?php echo $rule_p_worst; ?> อาจเป็นเพราะข้อจำกัดในการทำงานจริง</div>
|
|
<div class="line" contenteditable="true">หรือความไม่สะดวกในการปฏิบัติตามขั้นตอนที่ระบบกำหนดไว้</div>
|
|
<div class="line" contenteditable="true"></div>
|
|
</div>
|
|
|
|
<div class="section-title">เสนอแนะแนวทางแก้ไข</div>
|
|
<div class="lined-box">
|
|
<div class="line" contenteditable="true">ควรสร้างความตระหนักถึงความเสี่ยงด้านความปลอดภัยหากละเมิดระเบียบข้อ <?php echo $rule_p_worst; ?></div>
|
|
<div class="line" contenteditable="true">และอาจพิจารณาทบทวนขั้นตอนการทำงานให้ยืดหยุ่น ควบคู่กับมาตรการกำกับดูแลที่เหมาะสม</div>
|
|
<div class="line" contenteditable="true"></div>
|
|
<div class="line" contenteditable="true"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- No-print warning text for users -->
|
|
<div class="no-print" style="margin: 20px; padding: 15px; background: #e9ecef; border-radius: 8px;">
|
|
💡 <strong>คำแนะนำ:</strong> คุณสามารถ <u>คลิกที่ข้อความสรุปผลเพื่อแก้ไข</u> ได้ก่อนกดปุ่มพิมพ์ (เนื้อหาที่แก้ไขจะไม่ถูกบันทึกในระบบ แต่จะปรากฏในเอกสารที่พิมพ์)
|
|
</div>
|
|
|
|
</body>
|
|
</html>
|