Files
gravity/แบบประเมินของไอที ประจำปี/print_report.php
T
2026-09-16 23:20:08 +07:00

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>