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,70 @@
<!-- Modal สำหรับเซ็นอนุมัติออนไลน์ -->
<div class="modal fade" id="approvalModal" tabindex="-1">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title fw-bold"><i class="bi bi-shield-check text-success"></i> ระบบอนุมัติออนไลน์ (e-Approval)</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<form action="save_approval.php" method="POST" id="approvalForm">
<div class="modal-body">
<input type="hidden" name="item_id" id="modal_item_id">
<div class="mb-3">
<label class="form-label font-bold">ผู้อนุมัติ</label>
<input type="text" name="approver_name" class="form-class form-control" required placeholder="ชื่อ-นามสกุล">
</div>
<div class="mb-3">
<label class="form-label">ความเห็น/ข้อเสนอแนะ</label>
<textarea name="comment" class="form-control" rows="2"></textarea>
</div>
<div class="mb-3">
<label class="form-label">วาดลายเซ็นดิจิทัล (Digital Signature)</label>
<div class="border rounded bg-light p-1">
<canvas id="sigCanvas" width="430" height="150" style="touch-action: none; cursor: crosshair;"></canvas>
</div>
<button type="button" class="btn btn-sm btn-link text-danger p-0 mt-1" onclick="clearSignature()">ล้างลายเซ็น</button>
<input type="hidden" name="signature_data" id="signature_data">
</div>
</div>
<div class="modal-footer">
<button type="submit" name="action" value="rejected" class="btn btn-outline-danger">ไม่อนุมัติ</button>
<button type="submit" name="action" value="approved" class="btn btn-success"><i class="bi bi-check-lg"></i> ลงนามอนุมัติ</button>
</div>
</form>
</div>
</div>
</div>
<script>
// Canvas Digital Signature Script
const canvas = document.getElementById('sigCanvas');
const ctx = canvas.getContext('2d');
let drawing = false;
canvas.addEventListener('mousedown', () => drawing = true);
canvas.addEventListener('mouseup', () => {
drawing = false;
ctx.beginPath();
});
canvas.addEventListener('mousemove', draw);
function draw(e) {
if (!drawing) return;
const rect = canvas.getBoundingClientRect();
ctx.lineWidth = 2;
ctx.lineCap = 'round';
ctx.strokeStyle = '#000';
ctx.lineTo(e.clientX - rect.left, e.clientY - rect.top);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(e.clientX - rect.left, e.clientY - rect.top);
}
function clearSignature() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
document.getElementById('approvalForm').addEventListener('submit', function() {
document.getElementById('signature_data').value = canvas.toDataURL();
});
</script>
@@ -0,0 +1,50 @@
<?php
// config.php
$host = 'localhost';
$db = 'asset_tracker';
$user = 'root';
$pass = '@Samui@10742';
try {
$pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8mb4", $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
} catch (PDOException $e) {
die("Database Connection Failed: " . $e->getMessage());
}
// ฟังก์ชันคำนวณ % Progress ตามขั้นตอน Workflow
function getProgressByStatus($status)
{
return match ($status) {
'รอการยืนยันแผน' => 15,
'อยู่ระหว่างดำเนินการ' => 50,
'ใบส่งซื้อ/ทำสัญญา' => 85,
'ดำเนินการเสร็จสิ้น' => 100,
default => 0
};
}
// ฟังก์ชันประเมินสถานะ Timeline สี (เขียว, เหลือง, แดง)
function getTimelineBadge($dueDate, $status)
{
if ($status === 'ดำเนินการเสร็จสิ้น') {
return '<span class="badge bg-success"><i class="bi bi-check-circle"></i> เสร็จสิ้น</span>';
}
if (empty($dueDate)) {
return '<span class="badge bg-secondary">ยังไม่ระบุวัน</span>';
}
$today = new DateTime();
$due = new DateTime($dueDate);
$diff = $today->diff($due)->days * ($today > $due ? -1 : 1);
if ($diff < 0) {
return '<span class="badge bg-danger"><i class="bi bi-exclamation-triangle"></i> ล่าช้า (' . abs($diff) . ' วัน)</span>';
} elseif ($diff <= 15) {
return '<span class="badge bg-warning text-dark"><i class="bi bi-clock-history"></i> ใกล้กำหนด (เหลือ ' . $diff . ' วัน)</span>';
} else {
return '<span class="badge bg-success"><i class="bi bi-calendar-check"></i> ตรงเวลา (เหลือ ' . $diff . ' วัน)</span>';
}
}
@@ -0,0 +1,56 @@
<?php
require_once 'config.php';
include 'header.php';
$items = $pdo->query("SELECT * FROM procurement_items ORDER BY id ASC LIMIT 50")->fetchAll();
?>
<div class="card p-4">
<div class="d-flex justify-content-between align-items-center mb-3">
<h5 class="fw-bold"><i class="bi bi-bar-chart-steps me-2"></i>Gantt Chart & Timeline แผนจัดซื้อปี 2569</h5>
<div>
<span class="badge bg-success me-1">ตรงเวลา</span>
<span class="badge bg-warning text-dark me-1">ใกล้กำหนด (<=15 วัน)</span>
<span class="badge bg-danger">เกินกำหนด/ล่าช้า</span>
</div>
</div>
<div class="table-responsive">
<table class="table table-hover align-middle">
<thead class="table-light">
<tr>
<th>รหัส</th>
<th style="width: 25%;">รายการครุภัณฑ์</th>
<th>หน่วยงาน</th>
<th>งบประมาณ</th>
<th>เปอร์เซ็นต์</th>
<th>Timeline สถานะ</th>
<th>การดำเนินการ</th>
</tr>
</thead>
<tbody>
<?php foreach ($items as $row): ?>
<tr>
<td><code><?= $row['item_code'] ?? '-' ?></code></td>
<td class="fw-bold"><?= htmlspecialchars($row['item_name']) ?></td>
<td><?= $row['department'] ?></td>
<td>฿<?= number_format($row['total_price'], 2) ?></td>
<td style="width: 120px;">
<div class="progress" style="height: 18px;">
<div class="progress-bar bg-info" style="width: <?= $row['progress'] ?>%"><?= $row['progress'] ?>%</div>
</div>
</td>
<td><?= getTimelineBadge($row['due_date'], $row['status']) ?></td>
<td>
<a href="qr_view.php?id=<?= $row['id'] ?>" target="_blank" class="btn btn-sm btn-outline-dark"><i class="bi bi-qr-code"></i> QR</a>
<button class="btn btn-sm btn-primary" onclick="openApprovalModal(<?= $row['id'] ?>)"><i class="bi bi-pen"></i> อนุมัติ</button>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
</body>
</html>
@@ -0,0 +1,24 @@
<?php
// ตัวอย่าง integration โครงสร้าง Google Drive API v3
function createGoogleDriveFolder($itemName, $itemCode) {
// กำหนดชื่อโฟลเดอร์ เช่น "[10003] กำจัดปลวก"
$folderName = "[" . ($itemCode ?: 'ITEM') . "] " . $itemName;
/*
// ใช้ Google Client Library:
$client = new Google\Client();
$client->setAuthConfig('credentials.json');
$client->addScope(Google\Service\Drive::DRIVE_FILE);
$service = new Google\Service\Drive($client);
$fileMetadata = new Google\Service\Drive\DriveFile([
'name' => $folderName,
'mimeType' => 'application/vnd.google-apps.folder'
]);
$folder = $service->files->create($fileMetadata, ['fields' => 'id']);
return $folder->id;
*/
return "DRIVE_FOLDER_MOCK_" . uniqid();
}
?>
@@ -0,0 +1,37 @@
<!DOCTYPE html>
<html lang="th">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ระบบติดตามสถานะการจัดซื้อครุภัณฑ์ 2569</title>
<!-- Google Fonts: Sarabun -->
<link href="https://fonts.googleapis.com/css2?family=Sarabun:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<!-- Bootstrap 5 CSS & Icons -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.0/font/bootstrap-icons.css" rel="stylesheet">
<!-- DataTables CSS -->
<link href="https://cdn.datatables.net/1.13.6/css/dataTables.bootstrap5.min.css" rel="stylesheet">
<style>
body { font-family: 'Sarabun', sans-serif; background-color: #f4f6f9; color: #212529; }
.card { border-radius: 12px; border: none; box-shadow: 0 4px 12px rgba(0,0,0,0.05); }
.kanban-col { background-color: #ebecf0; border-radius: 10px; min-height: 600px; padding: 15px; }
.kanban-card { background: #ffffff; border-left: 4px solid #0d6efd; border-radius: 8px; margin-bottom: 12px; padding: 12px; cursor: grab; transition: all 0.2s; }
.kanban-card:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0,0,0,0.1); }
.kpi-card { border-left: 5px solid; }
</style>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark bg-primary shadow-sm mb-4">
<div class="container-fluid px-4">
<a class="navbar-brand fw-bold" href="index.php"><i class="bi bi-box-seam-fill me-2"></i>ติดตามการจัดซื้อครุภัณฑ์ 2569</a>
<div class="collapse navbar-collapse">
<ul class="navbar-brand navbar-nav ms-auto fs-6">
<li class="nav-item"><a class="nav-link text-white" href="index.php"><i class="bi bi-speedometer2"></i> Dashboard ผู้อำนวยการ</a></li>
<li class="nav-item"><a class="nav-link text-white" href="kanban.php"><i class="bi bi-kanban"></i> Kanban Board</a></li>
<li class="nav-item"><a class="nav-link text-white" href="gantt.php"><i class="bi bi-bar-chart-steps"></i> Gantt Chart & Timeline</a></li>
<li class="nav-item"><a class="nav-link text-white" href="items.php"><i class="bi bi-list-task"></i> รายการทั้งหมด</a></li>
</ul>
</div>
</div>
</nav>
<div class="container-fluid px-4">
@@ -0,0 +1,90 @@
<?php
require_once 'config.php';
include 'header.php';
// ดึงข้อมูล KPI
$totalItems = $pdo->query("SELECT COUNT(*) FROM procurement_items")->fetchColumn();
$totalBudget = $pdo->query("SELECT SUM(total_price) FROM procurement_items")->fetchColumn();
$actualSpent = $pdo->query("SELECT SUM(procured_price) FROM procurement_items WHERE status='ดำเนินการเสร็จสิ้น'")->fetchColumn();
$savings = $totalBudget - $actualSpent;
// สรุปตามสถานะ
$statusCounts = $pdo->query("SELECT status, COUNT(*) as cnt, SUM(total_price) as sum_price FROM procurement_items GROUP BY status")->fetchAll();
?>
<div class="row g-3 mb-4">
<div class="col-md-3">
<div class="card p-3 kpi-card border-primary">
<small class="text-muted fw-bold">รายการจัดซื้อทั้งหมด</small>
<h3 class="fw-bold text-primary mt-1"><?= number_format($totalItems) ?> <span class="fs-6 text-muted">รายการ</span></h3>
</div>
</div>
<div class="col-md-3">
<div class="card p-3 kpi-card border-info">
<small class="text-muted fw-bold">งบประมาณตั้งต้นรวม</small>
<h3 class="fw-bold text-info mt-1">฿<?= number_format($totalBudget, 2) ?></h3>
</div>
</div>
<div class="col-md-3">
<div class="card p-3 kpi-card border-success">
<small class="text-muted fw-bold">จัดซื้อจริงได้แล้ว</small>
<h3 class="fw-bold text-success mt-1">฿<?= number_format($actualSpent, 2) ?></h3>
</div>
</div>
<div class="col-md-3">
<div class="card p-3 kpi-card border-warning">
<small class="text-muted fw-bold">ประหยัดงบประมาณได้</small>
<h3 class="fw-bold text-warning mt-1">฿<?= number_format($savings, 2) ?></h3>
</div>
</div>
</div>
<div class="row g-4">
<div class="col-md-6">
<div class="card p-4 h-100">
<h5 class="fw-bold mb-3"><i class="bi bi-pie-chart-fill me-2 text-primary"></i>สัดส่วนสถานะการจัดซื้อ</h5>
<canvas id="statusChart"></canvas>
</div>
</div>
<div class="col-md-6">
<div class="card p-4 h-100">
<h5 class="fw-bold mb-3"><i class="bi bi-bar-chart-line-fill me-2 text-success"></i>งบประมาณแยกตามหมวดหมู่</h5>
<canvas id="categoryChart"></canvas>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
const statusData = <?= json_encode($statusCounts) ?>;
const labels = statusData.map(item => item.status);
const counts = statusData.map(item => item.cnt);
new Chart(document.getElementById('statusChart'), {
type: 'doughnut',
data: {
labels: labels,
datasets: [{
data: counts,
backgroundColor: ['#ffc107', '#0d6efd', '#0dcaf0', '#198754', '#dc3545']
}]
},
options: { responsive: true, plugins: { legend: { position: 'bottom' } } }
});
// กราฟจำลองแยกตามประเภท
new Chart(document.getElementById('categoryChart'), {
type: 'bar',
data: {
labels: ['ค.การแพทย์', 'บำรุงรักษา', 'ค่าใช้สอย', 'จ้างเหมา', 'คอมพิวเตอร์', 'สำนักงาน'],
datasets: [{
label: 'งบประมาณ (บาท)',
data: [4500000, 2800000, 1500000, 1200000, 950000, 600000],
backgroundColor: '#0d6efd'
}]
},
options: { responsive: true, plugins: { legend: { display: false } } }
});
</script>
</body>
</html>
@@ -0,0 +1,255 @@
<?php
// items.php
require_once 'config.php';
include 'header.php';
// ดึงตัวเลือกสำหรับ Filter
$categories = $pdo->query("SELECT DISTINCT category_code, category FROM procurement_items WHERE category IS NOT NULL ORDER BY category_code, category")->fetchAll();
$departments = $pdo->query("SELECT DISTINCT department FROM procurement_items WHERE department IS NOT NULL ORDER BY department")->fetchAll(PDO::FETCH_COLUMN);
$statuses = $pdo->query("SELECT DISTINCT status FROM procurement_items WHERE status IS NOT NULL ORDER BY status")->fetchAll(PDO::FETCH_COLUMN);
// ดึงรายการจัดซื้อทั้งหมด
$stmt = $pdo->query("SELECT * FROM procurement_items ORDER BY id ASC");
$items = $stmt->fetchAll();
?>
<style>
/* ตั้งค่าบังคับจัดกึ่งกลางให้ชื่อหัวคอลัมน์ทั้งหมด (th) */
#procurementTable th {
text-align: center !important;
vertical-align: middle !important;
}
/* Custom Progress Bar Style */
.custom-progress-container {
background-color: #e9ecef;
border-radius: 20px;
height: 12px;
overflow: hidden;
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
}
.progress-bar-danger {
background: linear-gradient(90deg, #ff758c 0%, #ff7eb3 100%);
}
.progress-bar-info {
background: linear-gradient(90deg, #36d1dc 0%, #5b86e5 100%);
}
.progress-bar-success-custom {
background: linear-gradient(90deg, #11998e 0%, #38ef7d 100%);
}
.badge-progress {
font-size: 0.75rem;
padding: 3px 8px;
border-radius: 12px;
min-width: 42px;
text-align: center;
}
</style>
<div class="card p-4 shadow-sm mb-4">
<!-- 1. แถวหัวข้อและปุ่มเพิ่มรายการ -->
<div class="d-flex justify-content-between align-items-center mb-4 pb-2 border-bottom">
<h4 class="fw-bold mb-0"><i class="bi bi-list-task me-2 text-primary"></i>รายการจัดซื้อครุภัณฑ์ ประจำปี 2569</h4>
<div>
<button class="btn btn-success me-2 shadow-sm" onclick="alert('เปิดฟอร์มเพิ่มรายการใหม่')">
<i class="bi bi-plus-circle me-1"></i> เพิ่มรายการจัดซื้อ
</button>
<a href="index.php" class="btn btn-outline-secondary shadow-sm">
<i class="bi bi-arrow-left me-1"></i> กลับหน้าหลัก
</a>
</div>
</div>
<!-- 2. กล่องกรองข้อมูล (Filter Section) -->
<div class="row g-3 mb-4 bg-light p-3 rounded border shadow-sm">
<div class="col-md-3">
<label class="form-label fw-bold small text-muted">กรองตามหน่วยงาน</label>
<select id="deptFilter" class="form-select form-select-sm">
<option value="">-- ทั้งหมดทุกหน่วยงาน --</option>
<?php foreach ($departments as $dept): ?>
<option value="<?= htmlspecialchars($dept) ?>"><?= htmlspecialchars($dept) ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-4">
<label class="form-label fw-bold small text-muted">กรองตามหมวดหมู่รายการ</label>
<select id="catFilter" class="form-select form-select-sm">
<option value="">-- ทั้งหมดทุกหมวดหมู่ --</option>
<?php foreach ($categories as $cat): ?>
<option value="<?= htmlspecialchars($cat['category']) ?>">
<?= $cat['category_code'] ? '[' . $cat['category_code'] . '] ' : '' ?><?= htmlspecialchars($cat['category']) ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-3">
<label class="form-label fw-bold small text-muted">กรองตามสถานะการจัดซื้อ</label>
<select id="statusFilter" class="form-select form-select-sm">
<option value="">-- ทั้งหมดทุกสถานะ --</option>
<?php foreach ($statuses as $st): ?>
<option value="<?= htmlspecialchars($st) ?>"><?= htmlspecialchars($st) ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-2 d-flex align-items-end">
<button class="btn btn-sm btn-secondary w-100" onclick="resetFilters()">
<i class="bi bi-arrow-counterclockwise me-1"></i> ล้างการกรอง
</button>
</div>
</div>
<!-- 3. Data Table -->
<div class="table-responsive">
<table id="procurementTable" class="table table-hover align-middle w-100 fs-6">
<thead class="table-light">
<tr>
<th class="text-nowrap text-center" style="width: 5%;">ลำดับ</th>
<th class="text-nowrap text-center" style="width: 8%;">รหัส</th>
<th class="text-nowrap text-center" style="width: 25%;">รายการครุภัณฑ์</th>
<th class="text-nowrap text-center">หมวดหมู่</th>
<th class="text-nowrap text-center">หน่วยงาน</th>
<th class="text-nowrap text-center">งบตั้งต้น</th>
<th class="text-nowrap text-center">จัดซื้อจริง</th>
<th class="text-nowrap text-center" style="width: 14%;">ความคืบหน้า</th>
<th class="text-nowrap text-center">สถานะปัจจุบัน</th>
<th class="text-nowrap text-center">Timeline</th>
<th class="text-nowrap text-center" style="width: 10%;">จัดการ</th>
</tr>
</thead>
<tbody>
<?php foreach ($items as $row): ?>
<tr>
<td class="text-center"><?= $row['seq_no'] ?></td>
<td class="text-center"><code><?= $row['item_code'] ?: '-' ?></code></td>
<td>
<div class="fw-bold text-dark"><?= htmlspecialchars($row['item_name']) ?></div>
<small class="text-muted"><?= $row['quantity'] ?> <?= $row['unit'] ?> (<?= $row['plan_type'] ?>)</small>
</td>
<td>
<span class="badge bg-light text-dark border" title="<?= htmlspecialchars($row['category']) ?>">
<?= $row['category_code'] ? '[' . $row['category_code'] . '] ' : '' ?><?= htmlspecialchars($row['category']) ?>
</span>
</td>
<td><?= htmlspecialchars($row['department']) ?></td>
<!-- งบตั้งต้น -->
<td class="text-end fw-bold"><?= number_format($row['total_price'], 0) ?></td>
<!-- จัดซื้อจริง -->
<td class="text-end text-success fw-bold">
<?= $row['procured_price'] > 0 ? number_format($row['procured_price'], 0) : '-' ?>
</td>
<!-- ความคืบหน้า -->
<td>
<?php
$p = (int)$row['progress'];
if ($p <= 30) {
$barClass = 'progress-bar-danger';
$badgeBg = 'bg-danger text-white';
} elseif ($p <= 70) {
$barClass = 'progress-bar-info';
$badgeBg = 'bg-primary text-white';
} else {
$barClass = 'progress-bar-success-custom';
$badgeBg = 'bg-success text-white';
}
?>
<div class="d-flex align-items-center">
<div class="custom-progress-container flex-grow-1 me-2">
<div class="progress-bar <?= $barClass ?> progress-bar-striped progress-bar-animated h-100" style="width: <?= $p ?>%"></div>
</div>
<span class="badge <?= $badgeBg ?> badge-progress shadow-sm"><?= $p ?>%</span>
</div>
</td>
<td class="text-center">
<?php
$badgeClass = match ($row['status']) {
'รอการยืนยันแผน' => 'bg-warning text-dark',
'อยู่ระหว่างดำเนินการ' => 'bg-primary',
'ใบส่งซื้อ/ทำสัญญา' => 'bg-info text-dark',
'ดำเนินการเสร็จสิ้น' => 'bg-success',
default => 'bg-secondary'
};
?>
<span class="badge <?= $badgeClass ?>"><?= $row['status'] ?></span>
</td>
<td class="text-center"><?= getTimelineBadge($row['due_date'], $row['status']) ?></td>
<td class="text-center">
<div class="btn-group btn-group-sm">
<a href="qr_view.php?id=<?= $row['id'] ?>" target="_blank" class="btn btn-outline-dark" title="QR Code Mobile View">
<i class="bi bi-qr-code-scan"></i>
</a>
<?php if ($row['gdrive_folder_id']): ?>
<a href="https://drive.google.com/drive/folders/<?= $row['gdrive_folder_id'] ?>" target="_blank" class="btn btn-outline-primary" title="เปิดโฟลเดอร์ Google Drive">
<i class="bi bi-folder-symlink-fill"></i>
</a>
<?php endif; ?>
<button class="btn btn-outline-success" onclick="openApprovalModal(<?= $row['id'] ?>)" title="อนุมัติออนไลน์">
<i class="bi bi-check-circle"></i>
</button>
</div>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
<!-- jQuery & DataTables JS -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.13.6/js/dataTables.bootstrap5.min.js"></script>
<script>
$(document).ready(function() {
var table = $('#procurementTable').DataTable({
"language": {
"url": "//cdn.datatables.net/plug-ins/1.13.6/i18n/th.json"
},
"pageLength": 10,
"order": [
[0, "asc"]
],
"columnDefs": [{
"orderable": false,
"targets": [7, 9, 10]
}]
});
// Custom Filters
$('#deptFilter').on('change', function() {
table.column(4).search(this.value).draw();
});
$('#catFilter').on('change', function() {
table.column(3).search(this.value).draw();
});
$('#statusFilter').on('change', function() {
table.column(8).search(this.value).draw();
});
});
function resetFilters() {
$('#deptFilter').val('');
$('#catFilter').val('');
$('#statusFilter').val('');
var table = $('#procurementTable').DataTable();
table.columns().search('').draw();
}
</script>
</body>
</html>
@@ -0,0 +1,76 @@
<?php
require_once 'config.php';
include 'header.php';
$statuses = ['รอการยืนยันแผน', 'อยู่ระหว่างดำเนินการ', 'ใบส่งซื้อ/ทำสัญญา', 'ดำเนินการเสร็จสิ้น'];
?>
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="fw-bold"><i class="bi bi-kanban me-2"></i>Kanban Board การจัดซื้อ</h4>
<span class="text-muted"><i class="bi bi-info-circle"></i> ลากวางการ์ดเพื่อเปลี่ยนสถานะแบบ Real-time</span>
</div>
<div class="row g-3">
<?php foreach ($statuses as $st):
$stmt = $pdo->prepare("SELECT * FROM procurement_items WHERE status = ? ORDER BY id DESC LIMIT 20");
$stmt->execute([$st]);
$items = $stmt->fetchAll();
?>
<div class="col-md-3">
<div class="kanban-col">
<div class="d-flex justify-content-between align-items-center mb-3">
<h6 class="fw-bold m-0"><?= $st ?></h6>
<span class="badge bg-white text-dark shadow-sm rounded-pill"><?= count($items) ?></span>
</div>
<div class="kanban-list" data-status="<?= $st ?>" style="min-height: 500px;">
<?php foreach ($items as $item): ?>
<div class="kanban-card" data-id="<?= $item['id'] ?>">
<div class="d-flex justify-content-between">
<small class="text-muted">#<?= $item['item_code'] ?? $item['id'] ?></small>
<span class="badge bg-light text-primary border"><?= $item['department'] ?></span>
</div>
<div class="fw-bold my-2"><?= htmlspecialchars($item['item_name']) ?></div>
<div class="text-muted small mb-2">งบประมาณ: <strong>฿<?= number_format($item['total_price'], 2) ?></strong></div>
<div class="progress mb-2" style="height: 6px;">
<div class="progress-bar bg-success" style="width: <?= $item['progress'] ?>%"></div>
</div>
<div class="d-flex justify-content-between align-items-center small">
<span>Progress: <?= $item['progress'] ?>%</span>
<?= getTimelineBadge($item['due_date'], $item['status']) ?>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
<script src="https://cdn.jsdelivr.net/npm/sortablejs@1.15.0/Sortable.min.js"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
document.querySelectorAll('.kanban-list').forEach(col => {
new Sortable(col, {
group: 'kanban',
animation: 150,
onEnd: function(evt) {
let itemId = evt.item.getAttribute('data-id');
let newStatus = evt.to.getAttribute('data-status');
$.post('update_status.php', {
id: itemId,
status: newStatus
}, function(res) {
if (res.success) {
location.reload();
} else {
alert('เกิดข้อผิดพลาดในการอัปเดต');
}
}, 'json');
}
});
});
</script>
</body>
</html>
@@ -0,0 +1,56 @@
<?php
require_once 'config.php';
$id = $_GET['id'] ?? 0;
$stmt = $pdo->prepare("SELECT * FROM procurement_items WHERE id = ?");
$stmt->execute([$id]);
$item = $stmt->fetch();
if (!$item) die("ไม่พบข้อมูลรายการ");
?>
<!DOCTYPE html>
<html lang="th">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>สถานะจัดซื้อ - <?= htmlspecialchars($item['item_name']) ?></title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Sarabun:wght@400;600;700&display=swap" rel="stylesheet">
<style>
body {
font-family: 'Sarabun', sans-serif;
background: #f8f9fa;
}
</style>
</head>
<body class="p-3">
<div class="card shadow-sm border-0 mx-auto" style="max-width: 500px;">
<div class="card-header bg-primary text-white py-3">
<small class="d-block opacity-75">การติดตามสถานะจัดซื้อครุภัณฑ์ Mobile View</small>
<h5 class="fw-bold mb-0"><?= htmlspecialchars($item['item_name']) ?></h5>
</div>
<div class="card-body">
<div class="mb-3 text-center">
<?= getTimelineBadge($item['due_date'], $item['status']) ?>
<h2 class="fw-bold text-primary mt-2 mb-0"><?= $item['progress'] ?>%</h2>
<small class="text-muted">ความคืบหน้าของขั้นตอนจัดซื้อ</small>
</div>
<ul class="list-group list-group-flush mb-3">
<li class="list-group-item d-flex justify-content-between"><span>รหัสรายการ:</span> <strong><?= $item['item_code'] ?? '-' ?></strong></li>
<li class="list-group-item d-flex justify-content-between"><span>หน่วยงาน:</span> <strong><?= $item['department'] ?></strong></li>
<li class="list-group-item d-flex justify-content-between"><span>ประเภท:</span> <strong><?= $item['category'] ?></strong></li>
<li class="list-group-item d-flex justify-content-between"><span>งบประมาณ:</span> <strong>฿<?= number_format($item['total_price'], 2) ?></strong></li>
<li class="list-group-item d-flex justify-content-between"><span>สถานะปัจจุบัน:</span> <span class="badge bg-info text-dark"><?= $item['status'] ?></span></li>
</ul>
<?php if ($item['gdrive_folder_id']): ?>
<a href="https://drive.google.com/drive/folders/<?= $item['gdrive_folder_id'] ?>" target="_blank" class="btn btn-outline-primary w-100"><i class="bi bi-folder-symlink"></i> เปิดเอกสารใน Google Drive</a>
<?php endif; ?>
</div>
</div>
</body>
</html>
@@ -0,0 +1,342 @@
-- ============================================================
-- Complete System Installation Script (Clean Install)
-- System: Procurement Tracking System 2569
-- Database: procurement_db
-- Features: Mapped Categories (ก่อหนี้ผูกพัน), HR Department Mapping (75 Departments), Procurement Items (173 Items)
-- ============================================================
CREATE DATABASE IF NOT EXISTS `asset_tracker` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE `asset_tracker`;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `audit_logs`;
DROP TABLE IF EXISTS `approvals`;
DROP TABLE IF EXISTS `procurement_items`;
DROP TABLE IF EXISTS `departments`;
SET FOREIGN_KEY_CHECKS = 1;
-- 1. ตารางหน่วยงาน (Departments)
CREATE TABLE `departments` (
`id` INT PRIMARY KEY COMMENT 'HR_DEPARTMENT_SUB_SUB_ID',
`department_name` VARCHAR(255) NOT NULL COMMENT 'HR_DEPARTMENT_SUB_SUB_NAME',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 2. ตารางรายการจัดซื้อครุภัณฑ์ (Procurement Items)
CREATE TABLE `procurement_items` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`seq_no` INT COMMENT 'ลำดับ',
`plan_type` VARCHAR(50) DEFAULT 'ในแผน' COMMENT 'แผน',
`category_code` VARCHAR(10) COMMENT 'รหัสหมวดรายการก่อหนี้',
`category` VARCHAR(150) COMMENT 'ชื่อหมวดรายการก่อหนี้',
`department_id` INT NULL COMMENT 'รหัสหน่วยงาน HR',
`department` VARCHAR(100) COMMENT 'ชื่อหน่วยงานในแผน',
`item_code` VARCHAR(50) COMMENT 'รหัสรายการ',
`item_name` VARCHAR(255) NOT NULL COMMENT 'รายการครุภัณฑ์',
`unit` VARCHAR(50) COMMENT 'หน่วยนับ',
`quantity` INT DEFAULT 1 COMMENT 'จำนวน',
`unit_price` DECIMAL(12,2) DEFAULT 0.00 COMMENT 'ราคาต่อหน่วย',
`total_price` DECIMAL(12,2) DEFAULT 0.00 COMMENT 'ราคารวมงบตั้งต้น',
`actual_quantity` INT DEFAULT 0 COMMENT 'จำนวนซื้อจริง',
`actual_price` DECIMAL(12,2) DEFAULT 0.00 COMMENT 'ราคาจริง',
`procured_price` DECIMAL(12,2) DEFAULT 0.00 COMMENT 'จัดซื้อจัดจ้างได้',
`status` ENUM('รอการยืนยันแผน', 'อยู่ระหว่างดำเนินการ', 'ใบส่งซื้อ/ทำสัญญา', 'ดำเนินการเสร็จสิ้น', 'ยกเลิก') DEFAULT 'รอการยืนยันแผน',
`confirm_period` VARCHAR(100) COMMENT 'ยืนยัน/ช่วงเวลาดำเนินการ',
`quarter` VARCHAR(50) COMMENT 'ก่อหนี้ ไตรมาส',
`start_date` DATE NULL COMMENT 'วันเริ่มดำเนินการ',
`due_date` DATE NULL COMMENT 'กำหนดวันเสร็จสิ้น/รับของ',
`received_date` DATE NULL COMMENT 'วันที่รับของจริง',
`progress` INT DEFAULT 0 COMMENT 'ความคืบหน้า (%)',
`gdrive_folder_id` VARCHAR(255) NULL COMMENT 'Google Drive Folder ID',
`qr_code_path` VARCHAR(255) NULL,
`remarks` TEXT COMMENT 'หมายเหตุ',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT `fk_procurement_department` FOREIGN KEY (`department_id`) REFERENCES `departments`(`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 3. ตารางอนุมัติออนไลน์และลายเซ็นดิจิทัล (e-Approvals)
CREATE TABLE `approvals` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`item_id` INT NOT NULL,
`approver_name` VARCHAR(150) NOT NULL,
`approver_role` VARCHAR(100) NOT NULL COMMENT 'ตำแหน่ง/บทบาท',
`action` ENUM('approved', 'rejected', 'pending') DEFAULT 'pending',
`signature_data` LONGTEXT COMMENT 'Base64 Canvas Digital Signature',
`comment` TEXT,
`approved_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT `fk_approvals_item` FOREIGN KEY (`item_id`) REFERENCES `procurement_items`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 4. ตารางประวัติการเปลี่ยนแปลง (Audit Trail)
CREATE TABLE `audit_logs` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`item_id` INT NOT NULL,
`user_name` VARCHAR(100) DEFAULT 'System',
`action` VARCHAR(100) NOT NULL,
`old_status` VARCHAR(50),
`new_status` VARCHAR(50),
`details` TEXT,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT `fk_audit_item` FOREIGN KEY (`item_id`) REFERENCES `procurement_items`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ============================================================
-- DATA INSERTS
-- ============================================================
-- 1. นำเข้าข้อมูลตารางหน่วยงาน (75 รายการ)
INSERT INTO `departments` (`id`, `department_name`) VALUES
(1, 'งานธุรการ'),
(2, 'งานบำบัดน้ำเสีย-เตาเผาขยะ'),
(3, 'งานประชาสัมพันธ์'),
(5, 'งานสนาม'),
(6, 'แม่บ้าน'),
(8, 'ศูนย์สื่อสาร'),
(9, 'โสตทัศนศึกษา'),
(10, 'เวชระเบียน'),
(11, 'จ่ายกลาง'),
(13, 'กลุ่มงานสุขภาพดิจิทัล'),
(14, 'วิสัญญี'),
(15, 'อายุรกรรม'),
(16, 'ซักฟอก'),
(17, 'ห้องผ่าตัด'),
(18, 'จิตเวช'),
(20, 'ผู้ป่วยนอก'),
(21, 'อุบัติเหตุและฉุกเฉิน'),
(22, 'เภสัชกรรม'),
(23, 'งานการแพทย์'),
(24, 'ศัลยกรรม'),
(25, 'สมเด็จเกี่ยวฯ'),
(26, 'งานเทคนิคการแพทย์และพยาธิวิทยาคลินิก'),
(27, 'งานการแพทย์แผนไทยและการแพทย์ทางเลือก'),
(28, 'สูติกรรม'),
(30, 'อาชีวเวชกรรม'),
(31, 'ผู้ป่วยสูติ-นรีเวชกรรม'),
(33, 'พิเศษใหม่'),
(34, 'ผู้ป่วยหนัก'),
(35, 'งานยุทธศาสตร์และแผนงานโครงการ'),
(37, 'งานทรัพยากรบุคคล'),
(39, 'การเงินและบัญชี'),
(40, 'ทันตกรรม'),
(49, 'แพทย์แผนจีน'),
(46, 'สูติ-นรีเวช'),
(44, 'ห้องคลอด'),
(45, 'ซ่อมบำรุง'),
(47, 'พัสดุ'),
(48, 'แพทย์แผนไทย'),
(51, 'พิเศษสงฆ์'),
(52, 'ห้องบัตร'),
(68, 'บริหาร'),
(54, 'กายภาพ'),
(55, 'เวชกรรมสังคม'),
(56, 'รังสีวิทยา'),
(57, 'ไตเทียม'),
(58, 'ประกันสุขภาพ'),
(59, 'เทคนิคการแพทย์และพยาธิวิทยาคลินิก'),
(60, 'พิเศษรวม'),
(62, 'ยานพาหนะ'),
(63, 'งานเวชปฏิบัติครอบครัวและชุมชนและศูนย์สุขภาพชุมชนเขตเมือง'),
(64, 'งานส่งเสริมสุขภาพและฟื้นฟู'),
(65, 'งานตรวจสุขภาพ'),
(66, 'การป้องกันควบคุมครอบครัวและระบาดวิทยา'),
(67, 'กลุ่มงานพัฒนาทรัพยากรบุคคล'),
(72, 'พัฒนาทรัพยากรบุคคล'),
(70, 'องค์กรแพทย์'),
(71, 'ทรัพยากรบุคคล'),
(73, 'HA'),
(92, 'เวชศาสตร์การเดินทางและการท่องเที่ยว'),
(76, 'งานควบคุมและป้องกันการติดเชื้อในโรงพยาบาล'),
(77, 'กลุ่มงานการพยาบาลชุมชน'),
(78, 'นิติการ'),
(79, 'ศูนย์ประกัน+ต่างชาติ'),
(80, 'โภชนศาสตร์'),
(82, 'พรส.'),
(83, 'งานพยาบาลผู้จัดการสุขภาพชุมชน'),
(95, 'มารีน่า ฮับ'),
(87, 'การพยาบาลที่บ้านและชุมชน'),
(86, 'เคมีบำบัด'),
(88, 'IC'),
(89, 'สุขศึกษา'),
(90, 'ส่องกล้อง'),
(91, 'เวชศาตร์ฉุกเฉิน'),
(93, 'กลุ่มการพยาบาล'),
(94, 'มารีน่าฮับ (Marina Sea)');
-- 2. นำเข้าข้อมูลรายการจัดซื้อครุภัณฑ์ (173 รายการ พร้อม Mapping หมวดหมู่และหน่วยงาน)
INSERT INTO `procurement_items` (`seq_no`, `plan_type`, `category_code`, `category`, `department_id`, `department`, `item_code`, `item_name`, `unit`, `quantity`, `unit_price`, `total_price`, `status`, `confirm_period`, `actual_quantity`, `actual_price`, `procured_price`, `quarter`, `progress`, `remarks`) VALUES
(1, 'ในแผน', '810', 'จ้างเหมาบริการกำจัดปลวก', 68, 'บริหารทั่วไป', '10003', 'กำจัดปลวก', 'งาน', 1, 55000.00, 55000.00, 'รอการยืนยันแผน', 'ตค.68', 1, 21400.00, 21400.00, NULL, 15, NULL),
(2, 'ในแผน', '802', 'ค่าเช่าเครื่องถ่ายเอกสาร', 68, 'บริหารทั่วไป', '10004', 'ค่าเช่าเครื่องถ่ายเอกสาร', 'เครื่อง', 3, 100000.00, 300000.00, 'อยู่ระหว่างดำเนินการ', '27 ตค.68-12/69', 1, 15800.00, 15800.00, NULL, 50, NULL),
(3, 'ในแผน', '813', 'จ้างเหมาดูแลสวนหย่อม', 68, 'บริหารทั่วไป', '10005', 'ตัดแต่งกิ่งไม้บริเวณรอบโรงพยาบาล', 'งาน', 1, 100000.00, 100000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(4, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 68, 'บริหารทั่วไป', '10009', 'ค่าตรวจคุณภาพน้ำทิ้งส่งองค์กรภายนอก', 'งาน', 4, 5500.00, 22000.00, 'อยู่ระหว่างดำเนินการ', '29 ตค.68-15/69', 1, 5350.00, 5350.00, NULL, 50, NULL),
(5, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 68, 'บริหารทั่วไป', '10010', 'ค่าตรวจน้ำทิ้งและกากตะกอนของระบบบำบัดน้ำเสีย', 'งาน', 1, 4500.00, 4500.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(6, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 68, 'บริหารทั่วไป', '10011', 'ค่าตรวจคุณภาพน้ำดื่มน้ำใช้', 'งาน', 1, 20000.00, 20000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(7, 'ในแผน', '806', 'ค่าสื่อสารและโทรคมนาคม(เน็ต)', 13, 'สารสนเทศ', '10224', 'ค่าเช่าระบบจัดเก็บ Log File บน Cloud แบบที่ 1 หมดอายุ 30 ธันวาคม 2568', 'งาน', 1, 50000.00, 50000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-60/69', NULL, NULL, 0.00, NULL, 50, NULL),
(8, 'ในแผน', '806', 'ค่าสื่อสารและโทรคมนาคม(เน็ต)', 13, 'สารสนเทศ', '10225', 'ค่าต่ออายุบริการ GMAIL หมดอายุ 30 มกราคม 2569', 'งาน', 1, 75000.00, 75000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(9, 'ในแผน', '806', 'ค่าสื่อสารและโทรคมนาคม(เน็ต)', 13, 'สารสนเทศ', '10227', 'ค่าต่ออายุบริการ HOSxP หมดอายุ 30 ธันวาคม 2568', 'งาน', 1, 65000.00, 65000.00, 'อยู่ระหว่างดำเนินการ', '27 ตค.68-11/69', 1, 63555.00, 63555.00, NULL, 50, NULL),
(10, 'ในแผน', '806', 'ค่าสื่อสารและโทรคมนาคม(เน็ต)', 13, 'สารสนเทศ', '10228', 'ค่าต่ออายุบริการ Line หมดอายุ 30 ธันวาคม 2568', 'งาน', 1, 305000.00, 305000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-61/69', NULL, NULL, 0.00, NULL, 50, NULL),
(11, 'ในแผน', '806', 'ค่าสื่อสารและโทรคมนาคม(เน็ต)', 13, 'สารสนเทศ', '10229', 'ค่าต่ออายุบริการ Teamviewver หมดอายุ 12 ธันวาคม 2568', 'งาน', 1, 60000.00, 60000.00, 'อยู่ระหว่างดำเนินการ', '11 พย.68-20/69', NULL, NULL, 0.00, NULL, 50, NULL),
(12, 'ในแผน', '806', 'ค่าสื่อสารและโทรคมนาคม(เน็ต)', 13, 'สารสนเทศ', '10230', 'ค่าต่ออายุบริการ SSL หมดอายุ 20 เมษายน 2569', 'งาน', 1, 4000.00, 4000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(13, 'ในแผน', '806', 'ค่าสื่อสารและโทรคมนาคม(เน็ต)', 13, 'สารสนเทศ', '10231', 'Software Navicat หมดอายุ 30 ธันวาคม 2568', 'งาน', 1, 35203.00, 35203.00, 'อยู่ระหว่างดำเนินการ', '4 พย.68-16/69', NULL, NULL, 0.00, NULL, 50, NULL),
(14, 'ในแผน', '806', 'ค่าสื่อสารและโทรคมนาคม(เน็ต)', 45, 'ซ่อมบำรุง', '9989', 'ค่าต่ออายุโปรแกรม Sketch UP3D', 'หน่วย', 1, 16000.00, 16000.00, 'อยู่ระหว่างดำเนินการ', '27 ตค.68-13/69', NULL, NULL, 0.00, NULL, 50, NULL),
(15, 'ในแผน', '806', 'ค่าสื่อสารและโทรคมนาคม(เน็ต)', 45, 'ซ่อมบำรุง', '9990', 'ค่าต่ออายุโปรแกรม Autocad', 'หน่วย', 1, 17000.00, 17000.00, 'อยู่ระหว่างดำเนินการ', '27 ตค.68-14/69', NULL, NULL, 0.00, NULL, 50, NULL),
(17, 'ในแผน', '801', 'ค่าใช้สอยวัสดุต่างๆ', 68, 'บริหารทั่วไป', '10306', 'เคลื่อนย้ายพร้อมติดตั้ง Boiler (หม้อต้มไอน้ำ/น้ำร้อน)', 'งาน', 1, 1500000.00, 1500000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(18, 'ในแผน', '801', 'ค่าใช้สอยวัสดุต่างๆ', 68, 'บริหารทั่วไป', '10307', 'ย้ายพร้อมติดตั้งสถานีแก๊ส', 'งาน', 1, 1500000.00, 1500000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(19, 'ในแผน', '801', 'ค่าใช้สอยวัสดุต่างๆ', 21, 'อุบัติเหตุ', '10152', 'ทำสติเกอร์รถพยาบาลตามระเบียบ สพฉ. 3 คัน', 'คัน', 3, 35000.00, 105000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(20, 'ในแผน', '801', 'ค่าใช้สอยวัสดุต่างๆ', 13, 'สารสนเทศ', '10303', 'ระบบอ่านผลภาพเอกซเรย์ทรวงอกด้วยระบบปัญญาประดิษฐ์ (AI)', 'งาน', 1, 329000.00, 329000.00, 'อยู่ระหว่างดำเนินการ', '16 กย.68-9/69', 1, 329000.00, 329000.00, NULL, 50, NULL),
(21, 'ในแผน', '801', 'ค่าใช้สอยวัสดุต่างๆ', 79, 'ศูนย์ประกัน', '10305', 'ค่าต่ออายุบริการ โปรแกรม HERP Copilot (ลูกหนี้)', 'งาน', 1, 50000.00, 50000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(22, 'ในแผน', '801', 'ค่าใช้สอยวัสดุต่างๆ', NULL, 'ทุกหน่วยงาน', '10304', 'ค่าจ้างเหมาอื่นๆ', 'งาน', 1, 6336000.00, 6336000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(23, 'ในแผน', '801', 'ค่าใช้สอยวัสดุต่างๆ', 13, 'สารสนเทศ', '10363', 'เช่าครุภัณฑ์คอมพิวเตอร์พร้อมเครื่องสำรองไฟ', 'ชุด', 130, 2310000.00, 2310000.00, 'อยู่ระหว่างดำเนินการ', '22 ธค.68-78/69', NULL, NULL, 0.00, NULL, 50, NULL),
(24, 'ในแผน', '817', 'จ้างเหมาอื่นๆ', 45, 'ซ่อมบำรุง', '9992', 'จ้างเหมาบริการซ่อมบำรุง ระบบไฟฟ้า และน้ำประปา', 'งาน', 1, 2050000.00, 2050000.00, 'ใบส่งซื้อ/ทำสัญญา', '8 กย.68-4/69', 1, 469000.00, 469000.00, NULL, 85, NULL),
(25, 'ในแผน', '814', 'จ้างเหมาบำรุงรักษาเครื่องปรับอากาศ', 45, 'ซ่อมบำรุง', '9993', 'จ้างเหมาบริการซ่อมบำรุงเครื่องปรับอากาศ', 'งาน', 1, 400000.00, 400000.00, 'ใบส่งซื้อ/ทำสัญญา', '8 กย.68-5/69', 1, 91350.00, 91350.00, NULL, 85, NULL),
(26, 'ในแผน', '817', 'จ้างเหมาอื่นๆ', 57, 'ไตเทียม', '10116', 'จ้างเหมาบริการฟอกเลือดผู้ป่วยโรคไตด้วยเครื่องไตเทียม', 'งาน', 1, 19015200.00, 19015200.00, 'ใบส่งซื้อ/ทำสัญญา', '15 กย.68-7/69', 1, 4086600.00, 4086600.00, NULL, 85, NULL),
(27, 'ในแผน', '809', 'จ้างบริการรักษาความปลอดภัย', 68, 'บริหารทั่วไป', '10000', 'จ้างเหมาบริการรักษาความปลอดภัย', 'งาน', 1, 1800000.00, 1800000.00, 'ใบส่งซื้อ/ทำสัญญา', '8 กย.68-1/69', 1, 393984.30, 393984.30, NULL, 85, NULL),
(28, 'ในแผน', '817', 'จ้างเหมาอื่นๆ', 68, 'บริหารทั่วไป', '10001', 'จ้างเหมาบริการทำความสะอาด', 'งาน', 1, 4180000.00, 4180000.00, 'ใบส่งซื้อ/ทำสัญญา', '8 กย.68-2/69', 1, 1066922.40, 1066922.40, NULL, 85, NULL),
(29, 'ในแผน', '816', 'จ้างเหมากำจัดขยะ', 68, 'บริหารทั่วไป', '10002', 'จ้างเหมาบริการกำจัดขยะมูลฝอยติดเชื้อ', 'งาน', 1, 1800000.00, 1800000.00, 'อยู่ระหว่างดำเนินการ', '8 กย.68-3/69', NULL, NULL, 0.00, NULL, 50, NULL),
(30, 'ในแผน', '817', 'จ้างเหมาอื่นๆ', 68, 'บริหารทั่วไป', '10308', 'ค่าสำรวจระบบท่อบำบัดน้ำเสีย', 'งาน', 1, 300000.00, 300000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(31, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 59, 'พยาธิวิทยาคลินิค', '10148', 'สอบเทียบเครื่องมือทางห้องปฏิบัติการ', 'หน่วย', 1, 99000.00, 99000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(32, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 59, 'พยาธิวิทยาคลินิค', '10234', 'เช่าเครื่องอัตโนมัติพร้อมน้ำยา', 'งาน', 1, 11000000.00, 11000000.00, 'ใบส่งซื้อ/ทำสัญญา', NULL, 1, 4076378.02, 4076378.02, NULL, 85, NULL),
(33, 'ในแผน', '817', 'จ้างเหมาอื่นๆ', 22, 'เภสัชกรรม', '10204', 'ติดตั้งสัญญาณเตือน smoke detector ไปยังศูนย์สื่อสาร', 'งาน', 1, 30000.00, 30000.00, 'อยู่ระหว่างดำเนินการ', '12 พย.68-25/69', NULL, NULL, 0.00, NULL, 50, NULL),
(34, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 56, 'รังสี', '10290', 'จ้างเหมาบริการ PACs', 'งาน', 1, 1188000.00, 1188000.00, 'ใบส่งซื้อ/ทำสัญญา', '15 กย.68-8/69', 1, 396000.00, 396000.00, NULL, 85, NULL),
(35, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 56, 'รังสี', '10292', 'จ้างเหมาบริการตรวจด้วยเครื่องเอกซเรย์คอมพิวเตอร์ (CT Scan)', 'งาน', 1, 15000000.00, 15000000.00, 'อยู่ระหว่างดำเนินการ', '5 พย.68-17/69', NULL, NULL, 0.00, NULL, 50, NULL),
(36, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 56, 'รังสี', '10291', 'จ้างเหมาบริการตรวจด้วยเครื่อง MRI', 'งาน', 1, 4000000.00, 4000000.00, 'ใบส่งซื้อ/ทำสัญญา', '5 พย.68-18/69', 1, 941800.00, 941800.00, NULL, 85, NULL),
(37, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 56, 'รังสี', '10293', 'จ้างเหมาบริการตรวจเอกซเรย์เต้านม ด้วยเครื่อง Mammogram', 'งาน', 1, 100000.00, 100000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(38, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 56, 'รังสี', '10294', 'ค่าตรวจมาตรฐานห้องปฏิบัติการทางรังสี', 'งาน', 1, 30000.00, 30000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(39, 'ในแผน', '817', 'จ้างเหมาอื่นๆ', 47, 'ศูนย์เครื่องมือแพทย์', '10081', 'จ้างเหมาช่างเครื่องมือแพทย์', 'คน', 1, 200000.00, 200000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(40, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 47, 'ศูนย์เครื่องมือแพทย์', '10082', 'สอบเทียบเครื่องมือแพทย์', 'งาน', 1, 300000.00, 300000.00, 'อยู่ระหว่างดำเนินการ', '12 ธค.68-72/69', NULL, NULL, 0.00, NULL, 50, NULL),
(41, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 68, 'บริหารทั่วไป', '10008', 'บำรุงรักษาระบบก๊าสทางการแพทย์ AIR LIQUIDE', 'งาน', 1, 60000.00, 60000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(42, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 68, 'บริหารทั่วไป', '10066', 'บำรุงรักษาตู้เก็บศพ', 'งาน', 1, 50000.00, 50000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(43, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 54, 'เวชกรรมฟื้นฟู', '10098', 'บำรุงรักษาเครื่องมือกายภาพบำบัด (calibrate)', 'เครื่อง', 18, 3000.00, 54000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(44, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 22, 'เภสัชกรรม', '10103', 'บำรุงรักษาระบบ Alarm ตู้เย็น (ตู้เย็น 7 ตู้)', 'งาน', 1, 21000.00, 21000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(45, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 22, 'เภสัชกรรม', '10104', 'บำรุงรักษาระบบแจ้งเหตุเพลิงไหม้ อาคารเภสัชกรรม', 'งาน', 1, 42000.00, 42000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(46, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 22, 'เภสัชกรรม', '10106', 'บำรุงรักษาตู้เตรียมยา Isolator', 'งาน', 2, 20000.00, 40000.00, 'อยู่ระหว่างดำเนินการ', '19 พย.68-31/69', NULL, NULL, 0.00, NULL, 50, NULL),
(47, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 57, 'ไตเทียม', '10120', 'บำรุงรักษาเชิงป้องกัน ระบบน้ำ RO', 'งาน', 1, 139280.00, 139280.00, 'อยู่ระหว่างดำเนินการ', '17 พย.68-30/69', NULL, NULL, 0.00, NULL, 50, NULL),
(48, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 57, 'ไตเทียม', '10122', 'บำรุงรักษาเชิงป้องกัน ระบบน้ำ RO mobile', 'งาน', 1, 44400.00, 44400.00, 'อยู่ระหว่างดำเนินการ', '17 พย.68-28/69', NULL, NULL, 0.00, NULL, 50, NULL),
(49, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 57, 'ไตเทียม', '10124', 'บำรุงรักษาเชิงป้องกันเครื่องไตเทียม Fresenius รายสามเดือน ระยะเวลา 1 ปี ( 6 เครื่อง)', 'งาน', 1, 48320.00, 48320.00, 'อยู่ระหว่างดำเนินการ', '17 พย.68-29/69', NULL, NULL, 0.00, NULL, 50, NULL),
(50, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 21, 'อุบัติเหตุ', '10134', 'ค่า Maintenance ระบบ Telemed ของศูนย์1669 กับรถพยาบาล 6 คัน', 'งาน', 1, 180000.00, 180000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(51, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 11, 'จ่ายกลาง', '10172', 'บำรุงรักษาเครื่องซักผ้า 4 เครื่อง', 'เครื่อง', 4, 8025.00, 32100.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(52, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 11, 'จ่ายกลาง', '10173', 'บำรุงรักษาเครื่องอบพลาสม่า', 'เครื่อง', 1, 29700.00, 29700.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(53, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 11, 'จ่ายกลาง', '10174', 'บำรุงรักษาเครื่องอบผ้า 3 เครื่อง', 'เครื่อง', 3, 8100.00, 24300.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(54, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 11, 'จ่ายกลาง', '10175', 'บำรุงรักษาเครื่องนึ่งไอน้ำ 1 เครื่อง', 'เครื่อง', 1, 18000.00, 18000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(55, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 11, 'จ่ายกลาง', '10176', 'บำรุงรักษาเครื่องนึ่งไอน้ำ 2 เครื่อง', 'เครื่อง', 2, 7500.00, 15000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(56, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 11, 'จ่ายกลาง', '10177', 'บำรุงรักษาเครื่องล้างสายยางอัตโนมัติ', 'เครื่อง', 1, 26400.00, 26400.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(57, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 11, 'จ่ายกลาง', '10179', 'บำรุงรักษาเครื่องล้างเครื่องมือ', 'เครื่อง', 1, 27000.00, 27000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(58, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 11, 'จ่ายกลาง', '10180', 'ตรวจมาตรฐานความปลอดภัยเครื่องกำเนิดไอน้ำ', 'เครื่อง', 2, 95000.00, 190000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(59, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 11, 'จ่ายกลาง', '10181', 'ตรวจมาตรฐานประจำปีสถานีแก๊ส', 'งาน', 1, 75000.00, 75000.00, 'ใบส่งซื้อ/ทำสัญญา', '15 ธค.68-74/69', 1, 4297.12, 4297.12, NULL, 85, NULL),
(60, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10195', 'ค่าซ่อมบำรุงรักษาเครื่อง C-arm', 'เครื่อง', 1, 100000.00, 100000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(61, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10196', 'ค่าซ่อมบำรุงรักษาเครื่อง Phaco', 'เครื่อง', 1, 150000.00, 150000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(62, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10197', 'ค่าบำรุงรักษา unit mini air drive', 'เครื่อง', 1, 150000.00, 150000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(63, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10198', 'ค่าบำรุงรักษาเครื่องฟลูโอโรสโคป', 'เครื่อง', 1, 150000.00, 150000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(64, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10199', 'ค่าบำรุงรักษาเครื่อง colono scope', 'เครื่อง', 1, 150000.00, 150000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(65, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10200', 'ค่าซ่อมบำรุงรักษากล้องmicro scope CARL ZISS', 'เครื่อง', 1, 150000.00, 150000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(66, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 30, 'อาชีวะ', '10211', 'calibrate เครื่องตรวจสมรรถภาพปอด', 'เครื่อง', 1, 10000.00, 10000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(67, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 30, 'อาชีวะ', '10212', 'calibrate เครื่องตรวจสมรรถภาพการได้ยิน (Audiogram)', 'เครื่อง', 1, 10000.00, 10000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(68, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10216', 'ค่าบำรุงรักษาเครื่องมือผ่าตัดจอประสาทตา', 'งาน', 1, 100000.00, 100000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(69, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10217', 'ค่าบำรุงรักษากล้องไมโครสโคบ LiCA', 'งาน', 1, 100000.00, 100000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(70, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 45, 'ซ่อมบำรุง', '9991', 'บำรุงรักษาระบบระบายอากาศ หน่วยงานผ่าตัด ห้องคลอด แยกโรค พิเศษสงฆ์ อายุรกรรม ICU', 'งาน', 1, 500000.00, 500000.00, 'ดำเนินการเสร็จสิ้น', '8 ธค.68-50/69', 1, 347617.70, 347617.70, NULL, 100, NULL),
(71, 'ในแผน', '814', 'จ้างเหมาบำรุงรักษาเครื่องปรับอากาศ', 45, 'ซ่อมบำรุง', '10059', 'บำรุงรักษาแอร์ไดเออร์', 'เครื่อง', 2, 200000.00, 400000.00, 'อยู่ระหว่างดำเนินการ', '22 ธค.68-79/69', NULL, NULL, 0.00, NULL, 50, NULL),
(72, 'ในแผน', '908', 'ซ่อมบำรุงครุภัณฑ์สิ่งก่อสร้าง', 45, 'ซ่อมบำรุง', '10060', 'บำรุงรักษาระบบไปป์ไลน์', 'งาน', 1, 50000.00, 50000.00, 'ดำเนินการเสร็จสิ้น', '8 ธค.68-49/69', 1, 42800.00, 42800.00, NULL, 100, NULL),
(73, 'ในแผน', '908', 'ซ่อมบำรุงครุภัณฑ์สิ่งก่อสร้าง', 45, 'ซ่อมบำรุง', '10061', 'เพิ่มขนาดหม้อแปลงไฟฟ้า 500 KVA เป็น 1000 KVA', 'เครื่อง', 1, 750000.00, 750000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(74, 'ในแผน', '908', 'ซ่อมบำรุงครุภัณฑ์สิ่งก่อสร้าง', 45, 'ซ่อมบำรุง', '10062', 'ตรวจเช็คตู้ MDB ประจำปี', 'เครื่อง', 2, 30000.00, 60000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(75, 'ในแผน', '812', 'จ้างเหมาดูแลลิฟท์', 45, 'ซ่อมบำรุง', '9983', 'บำรุงรักษาลิฟท์ ตึกสมเด็จเกี่ยวฯ', 'เครื่อง', 1, 300000.00, 300000.00, 'ดำเนินการเสร็จสิ้น', '8 ธค.68-51/69', 1, 258000.00, 258000.00, NULL, 100, NULL),
(76, 'ในแผน', '812', 'จ้างเหมาดูแลลิฟท์', 45, 'ซ่อมบำรุง', '9984', 'บำรุงรักษาลิฟท์ อาคารเภสัช', 'เครื่อง', 1, 40000.00, 40000.00, 'อยู่ระหว่างดำเนินการ', '8 ธค.68-46/69', NULL, NULL, 0.00, NULL, 50, NULL),
(77, 'ในแผน', '812', 'จ้างเหมาดูแลลิฟท์', 45, 'ซ่อมบำรุง', '9985', 'บำรุงรักษาลิฟท์ตึกผู้ป่วยนอก', 'เครื่อง', 1, 40000.00, 40000.00, 'ดำเนินการเสร็จสิ้น', '8 ธค.68-47/69', 1, 31019.30, 31019.30, NULL, 100, NULL),
(78, 'ในแผน', '911', 'ซ่อมบำรุงครุภัณฑ์อื่นๆ', 45, 'ซ่อมบำรุง', '9986', 'บำรุงรักษาเครื่องกำเนิดไฟฟ้า', 'เครื่อง', 2, 40000.00, 80000.00, 'ดำเนินการเสร็จสิ้น', '8 ธค.68-48/69', 1, 53500.00, 53500.00, NULL, 100, NULL),
(79, 'ในแผน', '911', 'ซ่อมบำรุงครุภัณฑ์อื่นๆ', 45, 'ซ่อมบำรุง', '9987', 'บำรุงรักษาเครื่องผลิตออกซิเจน', 'เครื่อง', 1, 400000.00, 400000.00, 'ดำเนินการเสร็จสิ้น', '8 ธค.68-51/69', 1, 258000.00, 258000.00, NULL, 100, NULL),
(80, 'ในแผน', '908', 'ซ่อมบำรุงครุภัณฑ์สิ่งก่อสร้าง', 45, 'ซ่อมบำรุง', '9988', 'บำรุงรักษาหม้อแปลงไฟฟ้า', 'งาน', 1, 50000.00, 50000.00, 'อยู่ระหว่างดำเนินการ', '22 ธค.68-80/69', NULL, NULL, 0.00, NULL, 50, NULL),
(81, 'ในแผน', '906', 'ซ่อมบำรุงครุภัณฑ์ยานพาหนะ', 68, 'บริหารทั่วไป', '10012', 'ซ่อมบำรุงรักษารถยนต์ทางราชการ', 'คัน', 15, 40000.00, 600000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(82, 'ในแผน', '911', 'ซ่อมบำรุงครุภัณฑ์อื่นๆ', 68, 'บริหารทั่วไป', '10013', 'บำรุงรักษาถังดับเพลิง', 'งาน', 1, 100000.00, 100000.00, 'ดำเนินการเสร็จสิ้น', '11 พย.68-23/69', 1, 100000.00, 100000.00, NULL, 100, NULL),
(83, 'ในแผน', '908', 'ซ่อมบำรุงครุภัณฑ์สิ่งก่อสร้าง', 68, 'บริหารทั่วไป', '10067', 'บำรุงรักษาระบบบ่อบำบัดน้ำเสีย', 'งาน', 1, 50000.00, 50000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(84, 'ในแผน', '906', 'ซ่อมบำรุงครุภัณฑ์ยานพาหนะ', 68, 'บริหารทั่วไป', '10068', 'ซ่อมบำรุงรักษารถงานสนาม', 'คัน', 1, 150000.00, 150000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-55/69', NULL, NULL, 0.00, NULL, 50, NULL),
(85, 'ในแผน', '906', 'ซ่อมบำรุงครุภัณฑ์ยานพาหนะ', 21, 'อุบัติเหตุ', '10142', 'ซ่อมบำรุงรักษารถกอล์ฟเคลื่อนย้ายผู้ป่วย', 'คัน', 1, 40000.00, 40000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(86, 'ในแผน', '906', 'ซ่อมบำรุงครุภัณฑ์ยานพาหนะ', 21, 'อุบัติเหตุ', '10309', 'ปรับปรุงซ่อมแซมภายใน+ภายนอกรถพยาบาลตามระเบียบ สพฉ', 'คัน', 1, 300000.00, 300000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(87, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10156', 'เครื่องมือผ่าตัดในการผนึกหลอดเลือดและเนื้อเยื่อด้วยคลื่นเสียงความถี่สูงแบบไร้สาย ใช้แบตเตอรี่', 'เครื่อง', 1, 450000.00, 450000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(88, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10310', 'โต๊ะเมโยจัดเครื่องมือ 4 ล้อ', 'คัน', 4, 8000.00, 32000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(89, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10311', 'ตู้เย็นเก็บวัสดุชีวภาพ', 'เครื่อง', 1, 8500.00, 8500.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(90, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 20, 'ผู้ป่วยนอก', '10112', 'ชุดตรวจหู (Opthalmoseope)', 'ชุด', 1, 11000.00, 11000.00, 'อยู่ระหว่างดำเนินการ', '17 พย.68-26/69', NULL, NULL, 0.00, NULL, 50, NULL),
(91, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 59, 'พยาธิวิทยาคลินิค', '10232', 'กล้องจุลทรรศน์', 'เครื่อง', 1, 80000.00, 80000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(92, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 59, 'พยาธิวิทยาคลินิค', '10233', 'เครื่องปั่นเม็ดเลือดแดงอัดแน่น', 'เครื่อง', 1, 80000.00, 80000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(93, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 60, 'พิเศษรวม', '10069', 'เตียงตรวจทางสูติ-นรีเวช', 'เครื่อง', 1, 50000.00, 50000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(94, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 22, 'เภสัชกรรม', '10153', 'รถเข็นสเตนเลส 2 ชั้น ขนาด กว้าง 55 cm ยาว 85 cm สูง 90 cm', 'คัน', 1, 11000.00, 11000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(95, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 22, 'เภสัชกรรม', '10155', 'รถเข็นสเตนเลส 2 ชั้น ขนาด กว้าง 45 cm ยาว 73.5 cm สูง 80 cm', 'คัน', 1, 11000.00, 11000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(96, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 92, 'เวชศาสตร์การเดินทางและท่องเที่ยว', '10312', 'ความวัดความดันแบบสอดแขน (อัตโนมัติ)', 'เครื่อง', 1, 68000.00, 68000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(97, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 92, 'เวชศาสตร์การเดินทางและท่องเที่ยว', '10313', 'เครื่องชั่งน้ำหนักพร้อมที่วัดส่วนสูง', 'เครื่อง', 1, 14300.00, 14300.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(98, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 92, 'เวชศาสตร์การเดินทางและท่องเที่ยว', '10314', 'เครื่องวัดอุณหภูมิดิจิตอล แบบไม่สัมผัส', 'เครื่อง', 1, 2500.00, 2500.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(99, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 92, 'เวชศาสตร์การเดินทางและท่องเที่ยว', '10315', 'เครื่องวัดออกซิเจนปลายนิ้ว', 'เครื่อง', 1, 880.00, 880.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(100, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 14, 'วิสัญญี', '10218', 'เปลนอนแสตนเลสมีที่ใส่แท๊งออกซิเจนสำหรับรับส่งผู้ป่วยในพักฟื้น', 'เครื่อง', 1, 38000.00, 38000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(101, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 47, 'ศูนย์เครื่องมือแพทย์', '10316', 'รถเข็นอุปกรณ์', 'คัน', 1, 50000.00, 50000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(102, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 47, 'ศูนย์เครื่องมือแพทย์', '10088', 'รถใส่อุปกรณ์เครื่องมือแพทย์ (ชนิดมีล้อ)', 'คัน', 1, 5000.00, 5000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(103, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 25, 'สมเด็จเกี่ยว 3', '10317', 'รถเข็นสำหรับส่งของนึ่ง', 'คัน', 1, 5000.00, 5000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(104, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 28, 'สูติกรรม', '10126', 'เครื่องกระตุกไฟฟ้าหัวใจชนิดไบเฟสิค พร้อมภาควัดออกซิเจนในเลือด ( Biphasic Defibrillator with Blood Ox', 'เครื่อง', 1, 300000.00, 300000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(105, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 28, 'สูติกรรม', '10128', 'เครื่องติดตามการทำงานของหัวใจและสัญญาณชีพอัตโนมัติ ขนาดใหญ่ (Large Bedside Monitor )', 'เครื่อง', 1, 300000.00, 300000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(106, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 34, 'หอผู้ป่วยหนัก', '10074', 'เครื่องควบคุมอุณหภูมิทารกแรกเกิด Radiant warmer', 'เครื่อง', 1, 70000.00, 70000.00, 'อยู่ระหว่างดำเนินการ', '8 ธค.68-83/69', NULL, NULL, 0.00, NULL, 50, NULL),
(107, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 34, 'หอผู้ป่วยหนัก', '10318', 'เครื่อง Remote Inspiratory Monitoring Neonate', 'เครื่อง', 2, 22000.00, 44000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-56/69', NULL, NULL, 0.00, NULL, 50, NULL),
(108, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 34, 'หอผู้ป่วยหนัก', '10032', 'รถเข็นสเตนเลส 2 ชั้น', 'คัน', 1, 11000.00, 11000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-59/69', NULL, NULL, 0.00, NULL, 50, NULL),
(109, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 30, 'อาชีวะ', '10213', 'เครื่องตรวจสมรรถภาพปอด', 'เครื่อง', 1, 250000.00, 250000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(110, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 15, 'อายุรกรรม', '10146', 'เครื่องดูดเสมหะ (intermittent suction)', 'อัน', 1, 28000.00, 28000.00, 'ดำเนินการเสร็จสิ้น', '13 กพ.69-137/69', 1, 13500.00, 13500.00, NULL, 100, NULL),
(111, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 21, 'อุบัติเหตุ', '10151', 'เครื่องกระตุกหัวใจไฟฟ้าแบบ2ระบบ (Defibrillator)', 'เครื่อง', 1, 500000.00, 500000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(112, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 21, 'อุบัติเหตุ', '10319', 'หัวตรวจสำหรับหลอดเลือดขนาดเล็ก (Hockey stick)', 'ชุด', 1, 250000.00, 250000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(113, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 21, 'อุบัติเหตุ', '10135', 'เพิ่มไปด์ไล ในห้องnegative 1 จุด', 'งาน', 1, 100000.00, 100000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(114, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 21, 'อุบัติเหตุ', '10162', 'Traverse Rescue Titan Stainless Steel Rescue Litter, Stainless Steel ชุดเปลตะกร้า, Basket Stretcher', 'อัน', 1, 80000.00, 80000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(115, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 21, 'อุบัติเหตุ', '10137', 'vacuum splint', 'ชุด', 2, 30000.00, 60000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(116, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 21, 'อุบัติเหตุ', '10210', 'รถเข็นอุปกรณ์ 2 ชั้น', 'คัน', 2, 11000.00, 22000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(117, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 21, 'อุบัติเหตุ_ฉุกเฉิน', '9732', 'เครื่อง Monoplace Hyperbaric Chamber', 'เครื่อง', 1, 15050000.00, 15050000.00, 'อยู่ระหว่างดำเนินการ', '12 ธค.68-73/69', NULL, NULL, 0.00, NULL, 50, NULL),
(118, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 93, 'กลุ่มการพยาบาล', '10161', 'เก้าอี้สำนักงานมีพนักพิงปรับเอนและขึ้นลงได้ ห้องหน.พยาบาล (กลุ่มการพยาบาล)', 'ตัว', 1, 5000.00, 5000.00, 'อยู่ระหว่างดำเนินการ', '8 ธค.68-54/69', NULL, NULL, 0.00, NULL, 50, NULL),
(119, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 17, 'ผ่าตัด', '10108', 'ตู้ชั้นเก็บเครื่องมือ', 'ลูก', 2, 7000.00, 14000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(120, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 17, 'ผ่าตัด', '10109', 'ตู้เย็นเก็บยา', 'ลูก', 2, 7500.00, 15000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(121, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 22, 'เภสัชกรรม', '10100', 'เก้าอี้สำนักงานมีพนักพิง', 'ตัว', 2, 4500.00, 9000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(122, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 22, 'เภสัชกรรม', '10102', 'โต๊ะสำนักงาน', 'ตัว', 1, 6500.00, 6500.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(123, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 22, 'เภสัชกรรม', '10208', 'โซฟาเบดที่แข็งแรง สำหรับพักตอนเวรดึก', 'ตัว', 1, 7500.00, 7500.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(124, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 92, 'เวชศาสตร์การเดินทางและท่องเที่ยว', '10320', 'โต๊ะสำนักงาน', 'ตัว', 1, 6500.00, 6500.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(125, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 92, 'เวชศาสตร์การเดินทางและท่องเที่ยว', '10321', 'เก้าอี้สำนักงานมีพนักพิง', 'ตัว', 1, 4500.00, 4500.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(126, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 35, 'วิชาการ', '10079', 'เก้าอี้สำนักงานมีพนักพิง', 'ตัว', 1, 4500.00, 4500.00, 'อยู่ระหว่างดำเนินการ', '19 พย.68-32/69', NULL, NULL, 0.00, NULL, 50, NULL),
(127, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 47, 'ศูนย์เครื่องมือแพทย์', '10087', 'ตู้ล็อกเกอร์ 9 ช่อง', 'หลัง', 1, 8000.00, 8000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(128, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 58, 'ศูนย์ประกันสุขภาพ', '10078', 'เก้าอี้สำนักงานมีพนักพิง', 'ตัว', 1, 4500.00, 4500.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(129, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 58, 'ศูนย์ประกันสุขภาพ', '10080', 'เก้าอี้สำหรับผู้มารับบริการ (ต่างชาติ ตัวใหญ่)', 'ตัว', 3, 4500.00, 13500.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(130, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 34, 'หอผู้ป่วยหนัก', '10028', 'เก้าอี้สำนักงานมีพนักพิง', 'ตัว', 2, 4500.00, 9000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-58/69', NULL, NULL, 0.00, NULL, 50, NULL),
(131, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 15, 'อายุรกรรม', '10129', 'พัดลมติดผนัง', 'ตัว', 1, 1900.00, 1900.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(132, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 21, 'อุบัติเหตุ', '10322', 'เก้าอี้สำนักงานมีพนักพิง', 'ตัว', 1, 4500.00, 4500.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(133, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10243', 'อุปกรณ์อ่านบัตรแบบอเนกประสงค์ (Smart Card Reader) (ข้อที่ 59)', 'อัน', 10, 700.00, 7000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-62/69', NULL, NULL, 0.00, NULL, 50, NULL),
(134, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10245', 'เครื่องพิมพ์แบบใช้ความร้อน (Thermal Printer) (ข้อ 55)', 'เครื่อง', 4, 20000.00, 80000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-71/69', NULL, NULL, 0.00, NULL, 50, NULL),
(135, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10250', 'คอมพิวเตอร์ (เพิ่ม)', 'เครื่อง', 8, 32000.00, 256000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(136, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10251', 'คอมพิวเตอร์ (ทดแทน)', 'เครื่อง', 22, 32000.00, 704000.00, 'อยู่ระหว่างดำเนินการ', '17 กย.68-10/69', NULL, NULL, 0.00, NULL, 50, NULL),
(137, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10252', 'เครื่องสำรองไฟฟ้า ขนาด 800VA (ข้อที่ 62)', 'เครื่อง', 40, 2500.00, 100000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-63/69', NULL, NULL, 0.00, NULL, 50, NULL),
(138, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10253', 'เครื่องคอมพิวเตอร์ Notebook สำหรับประมวลผล', 'เครื่อง', 3, 24000.00, 72000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(139, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10254', 'เครื่อง Scan', 'เครื่อง', 2, 33000.00, 66000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-64/69', NULL, NULL, 0.00, NULL, 50, NULL),
(140, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10256', 'Switch Hub : USW-Pro-24-POE (400W)', 'เครื่อง', 3, 30000.00, 90000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-65/69', NULL, NULL, 0.00, NULL, 50, NULL),
(141, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10258', 'Module : UACC-OM-SM-10G-S-2', 'ชุด', 3, 8000.00, 24000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-66/69', NULL, NULL, 0.00, NULL, 50, NULL),
(142, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10259', 'Switch Hub : USW-Pro-XG-8-PoE', 'เครื่อง', 1, 30000.00, 30000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-67/69', NULL, NULL, 0.00, NULL, 50, NULL),
(143, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10260', 'Software Gimini', 'หน่วย', 1, 100000.00, 100000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(144, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10261', 'Software Canva', 'หน่วย', 1, 18000.00, 18000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(145, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10262', 'Software AneyDesk 5 License', 'หน่วย', 1, 20000.00, 20000.00, 'ดำเนินการเสร็จสิ้น', '9 ธค.68-68/69', 1, 18190.00, 18190.00, NULL, 100, NULL),
(146, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10263', 'IMILAB EC6 Camera + Memory', 'เครื่อง', 3, 4000.00, 12000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-69/69', NULL, NULL, 0.00, NULL, 50, NULL),
(147, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10264', 'Epson EcoTank L6460', 'เครื่อง', 1, 16000.00, 16000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-70/69', NULL, NULL, 0.00, NULL, 50, NULL),
(148, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 11, 'จ่ายกลาง', '10334', 'โปรแกรมระบบบริหารการจัดผ้าด้วย RFID Linen Management', 'ระบบ', 1, 150000.00, 150000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(149, 'ในแผน', '603', 'ครุภัณฑ์งานบ้านงานครัว', 54, 'กายภาพ', '10323', 'เครื่องทำน้ำร้อน-เย็น 2 ก๊อก', 'เครื่อง', 1, 7000.00, 7000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(150, 'ในแผน', '603', 'ครุภัณฑ์งานบ้านงานครัว', 20, 'ผู้ป่วยนอก', '10091', 'เครื่องทำน้ำร้อน-เย็น 2 ก๊อก', 'เครื่อง', 1, 7000.00, 7000.00, 'อยู่ระหว่างดำเนินการ', '17 พย.68-27/69', NULL, NULL, 0.00, NULL, 50, NULL),
(151, 'ในแผน', '603', 'ครุภัณฑ์งานบ้านงานครัว', 24, 'ศัลยกรรม', '10185', 'เครื่องทำน้ำร้อน-เย็น 2 ก๊อก', 'เครื่อง', 1, 7000.00, 7000.00, 'อยู่ระหว่างดำเนินการ', '9 มีค.69-152/69', NULL, NULL, 0.00, NULL, 50, NULL),
(152, 'ในแผน', '603', 'ครุภัณฑ์งานบ้านงานครัว', 28, 'สูติกรรม', '10130', 'ตู้เย็นเก็บนม 2 ประตู', 'เครื่อง', 1, 6000.00, 6000.00, 'อยู่ระหว่างดำเนินการ', '23 ธค.68-83/69', NULL, NULL, 0.00, NULL, 50, NULL),
(153, 'ในแผน', '603', 'ครุภัณฑ์งานบ้านงานครัว', 34, 'หอผู้ป่วยหนัก', '10033', 'ตู้เย็นเก็บนม 2 ประตู', 'เครื่อง', 1, 6000.00, 6000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-57/69', NULL, NULL, 0.00, NULL, 50, NULL),
(154, 'ในแผน', '603', 'ครุภัณฑ์งานบ้านงานครัว', 39, 'การเงิน', '10324', 'เตียงพร้อมที่นอน 3.5 ฟุต', 'ชุด', 1, 12000.00, 12000.00, 'อยู่ระหว่างดำเนินการ', '11 พย.68-22/69', NULL, NULL, 0.00, NULL, 50, NULL),
(155, 'ในแผน', '603', 'ครุภัณฑ์งานบ้านงานครัว', 39, 'การเงิน', '10325', 'ตู้ข้างเตียง', 'ตัว', 1, 7000.00, 7000.00, 'อยู่ระหว่างดำเนินการ', '11 พย.68-22/69', NULL, NULL, 0.00, NULL, 50, NULL),
(156, 'ในแผน', '604', 'ครุภัณฑ์ไฟฟ้าและวิทยุ', 68, 'บริหารทั่วไป', '10326', 'กล้องวงจรปิด', 'ตัว', 32, 25000.00, 800000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(157, 'ในแผน', '604', 'ครุภัณฑ์ไฟฟ้าและวิทยุ', 68, 'บริหารทั่วไป', '10327', 'วิทยุสื่อสาร', 'ตัว', 10, 13000.00, 130000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(158, 'ในแผน', '604', 'ครุภัณฑ์ไฟฟ้าและวิทยุ', 68, 'บริหารทั่วไป', '10328', 'ไมค์โครโฟนสำหรับเครื่องวิทยุสื่อสาร', 'ตัว', 2, 2900.00, 5800.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(159, 'ในแผน', '604', 'ครุภัณฑ์ไฟฟ้าและวิทยุ', 68, 'บริหารทั่วไป', '10335', 'ตู้โทรศัพท์', 'ตู้', 1, 1600000.00, 1600000.00, 'อยู่ระหว่างดำเนินการ', '23 ธค.68-82/69', NULL, NULL, 0.00, NULL, 50, NULL),
(160, 'ในแผน', '604', 'ครุภัณฑ์ไฟฟ้าและวิทยุ', 21, 'อุบัติเหตุ', '10168', 'วิทยุพกพามารีนแบน ให้ทีมพยาบาลที่ออกเหตุทะเล', 'ตัว', 1, 50000.00, 50000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(161, 'ในแผน', '604', 'ครุภัณฑ์ไฟฟ้าและวิทยุ', 25, 'พิเศษสมเด็จ', '9999', 'กล่องรับสัญญาณทีวี PSI สมเด็จเกี่ยว3', 'เครื่อง', 3, 3000.00, 9000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(162, 'ในแผน', '604', 'ครุภัณฑ์ไฟฟ้าและวิทยุ', 22, 'เภสัชกรรม', '10329', 'ระบบ interphone สื่อสาร 2 ทาง', 'ตัว', 3, 2000.00, 6000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(163, 'ในแผน', '606', 'ครุภัณฑ์โฆษณาและเผยแพร่', 9, 'โสตทัศนศึกษา', '10330', 'กล้องถ่ายรูป พร้อมเลนส์', 'ตัว', 1, 67000.00, 67000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(164, 'ในแผน', '807', 'ค่าที่ดินและสิ่งปลูกสร้าง', 68, 'บริหารทั่วไป', '10332', 'สร้างโรงเรือน Boiler (หม้อต้มไอน้ำ/น้ำร้อน)', 'งาน', 1, 500000.00, 500000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(165, 'ในแผน', '807', 'ค่าที่ดินและสิ่งปลูกสร้าง', 68, 'บริหารทั่วไป', '10333', 'สร้างโรงเรือนสถานนี้แก๊ส', 'งาน', 1, 200000.00, 200000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(166, 'ในแผน', '807', 'ค่าที่ดินและสิ่งปลูกสร้าง', 68, 'บริหารทั่วไป', '10014', 'ปรับปรุงแฟลต บ้านพักไม้และบ้านพักแพทย์', 'งาน', 1, 400000.00, 400000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(167, 'ในแผน', '807', 'ค่าที่ดินและสิ่งปลูกสร้าง', 22, 'เภสัชกรรม', '10206', 'ปรับปรุงพื้นที่ตรวจรับ', 'งาน', 1, 100000.00, 100000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(168, 'ในแผน', '807', 'ค่าที่ดินและสิ่งปลูกสร้าง', 51, 'พิเศษสงฆ์', '10331', 'ปรับปรุงหอผู้ป่วยพิเศษสงฆ์', 'งาน', 1, 500000.00, 500000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(169, 'นอกแผน', '817', 'จ้างเหมาอื่นๆ', 68, 'บริหาร', '10350', 'งานเดินท่อออกซิเจนเหลวอาคาร Marina Hub พร้อมติดตั้ง', 'งาน', 1, 73081.00, 73081.00, 'อยู่ระหว่างดำเนินการ', '10 พย.69-19/69', NULL, NULL, 0.00, NULL, 50, NULL),
(170, 'นอกแผน', '806', 'ค่าสื่อสารและโทรคมนาคม(เน็ต)', 13, 'สารสนเทศ', '10351', 'ค่าบริการ OTP', 'งาน', 1, 20800.00, 20800.00, 'อยู่ระหว่างดำเนินการ', '11 พย.69-21/69', NULL, NULL, 0.00, NULL, 50, NULL),
(171, 'นอกแผน', '908', 'ซ่อมบำรุงครุภัณฑ์สิ่งก่อสร้าง', 40, 'ทันตกรรม', '10365', 'เพิ่มท่อน้ำทิ้งยูนิตทันตกรรมทั้ง 12 ยุนิตตึกมารีน่า', 'งาน', 1, 160000.00, 160000.00, 'อยู่ระหว่างดำเนินการ', '3 ธค.68-33/69', NULL, NULL, 0.00, NULL, 50, NULL),
(172, 'นอกแผน', '602', 'ครุภัณฑ์สำนักงาน', 39, 'การเงิน', '10415', 'ทีวี 55 นิ้ว', 'เครื่อง', 1, 12490.00, 12490.00, 'อยู่ระหว่างดำเนินการ', '18 ธค.68-76/69', NULL, NULL, 0.00, NULL, 50, NULL),
(173, 'นอกแผน', '817', 'จ้างเหมาอื่นๆ', 13, 'สารสนเทศ', '10416', 'ติดตั้งระบบเครือข่ายอาคาร Marina HUB', 'งาน', 1, 2993900.66, 2993900.66, 'อยู่ระหว่างดำเนินการ', '22 ธค.68-77/69', NULL, NULL, 0.00, NULL, 50, NULL),
(174, 'นอกแผน', '817', 'จ้างเหมาอื่นๆ', 34, 'หอผู้ป่วยหนัก', '10418', 'ติดตั้งระบบน้ำเพื่อใช้ในการฟอกไต', 'งาน', 1, 29120.00, 29120.00, 'อยู่ระหว่างดำเนินการ', '22 ธค.68-81/69', NULL, NULL, 0.00, NULL, 50, NULL);
@@ -0,0 +1,28 @@
<?php
require_once 'config.php';
header('Content-Type: application/json');
$id = $_POST['id'] ?? 0;
$newStatus = $_POST['status'] ?? '';
if ($id && $newStatus) {
// ดึงสถานะเดิม
$stmt = $pdo->prepare("SELECT status FROM procurement_items WHERE id = ?");
$stmt->execute([$id]);
$oldStatus = $stmt->fetchColumn();
$newProgress = getProgressByStatus($newStatus);
// อัปเดตข้อมูล
$update = $pdo->prepare("UPDATE procurement_items SET status = ?, progress = ? WHERE id = ?");
$update->execute([$newStatus, $newProgress, $id]);
// บันทึก Audit Trail
$log = $pdo->prepare("INSERT INTO audit_logs (item_id, user_name, action, old_status, new_status, details) VALUES (?, 'ผู้ใช้งานระบบ', 'เปลี่ยนสถานะผ่าน Kanban', ?, ?, ?)");
$log->execute([$id, $oldStatus, $newStatus, "เปลี่ยนสถานะจาก '$oldStatus' เป็น '$newStatus' (Progress: $newProgress%)"]);
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false]);
}
?>
@@ -0,0 +1,70 @@
<!-- Modal สำหรับเซ็นอนุมัติออนไลน์ -->
<div class="modal fade" id="approvalModal" tabindex="-1">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title fw-bold"><i class="bi bi-shield-check text-success"></i> ระบบอนุมัติออนไลน์ (e-Approval)</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<form action="save_approval.php" method="POST" id="approvalForm">
<div class="modal-body">
<input type="hidden" name="item_id" id="modal_item_id">
<div class="mb-3">
<label class="form-label font-bold">ผู้อนุมัติ</label>
<input type="text" name="approver_name" class="form-class form-control" required placeholder="ชื่อ-นามสกุล">
</div>
<div class="mb-3">
<label class="form-label">ความเห็น/ข้อเสนอแนะ</label>
<textarea name="comment" class="form-control" rows="2"></textarea>
</div>
<div class="mb-3">
<label class="form-label">วาดลายเซ็นดิจิทัล (Digital Signature)</label>
<div class="border rounded bg-light p-1">
<canvas id="sigCanvas" width="430" height="150" style="touch-action: none; cursor: crosshair;"></canvas>
</div>
<button type="button" class="btn btn-sm btn-link text-danger p-0 mt-1" onclick="clearSignature()">ล้างลายเซ็น</button>
<input type="hidden" name="signature_data" id="signature_data">
</div>
</div>
<div class="modal-footer">
<button type="submit" name="action" value="rejected" class="btn btn-outline-danger">ไม่อนุมัติ</button>
<button type="submit" name="action" value="approved" class="btn btn-success"><i class="bi bi-check-lg"></i> ลงนามอนุมัติ</button>
</div>
</form>
</div>
</div>
</div>
<script>
// Canvas Digital Signature Script
const canvas = document.getElementById('sigCanvas');
const ctx = canvas.getContext('2d');
let drawing = false;
canvas.addEventListener('mousedown', () => drawing = true);
canvas.addEventListener('mouseup', () => {
drawing = false;
ctx.beginPath();
});
canvas.addEventListener('mousemove', draw);
function draw(e) {
if (!drawing) return;
const rect = canvas.getBoundingClientRect();
ctx.lineWidth = 2;
ctx.lineCap = 'round';
ctx.strokeStyle = '#000';
ctx.lineTo(e.clientX - rect.left, e.clientY - rect.top);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(e.clientX - rect.left, e.clientY - rect.top);
}
function clearSignature() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
document.getElementById('approvalForm').addEventListener('submit', function() {
document.getElementById('signature_data').value = canvas.toDataURL();
});
</script>
@@ -0,0 +1,60 @@
<?php
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
if (isset($_GET['year'])) {
$_SESSION['budget_year'] = (int)$_GET['year'];
}
$active_year = $_SESSION['budget_year'] ?? 2569;
// config.php
$host = 'localhost';
$db = 'asset_tracker';
$user = 'root';
$pass = '@Samui@10742';
try {
$pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8mb4", $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
} catch (PDOException $e) {
die("Database Connection Failed: " . $e->getMessage());
}
// ฟังก์ชันคำนวณ % Progress ตามขั้นตอน Workflow
function getProgressByStatus($status)
{
return match ($status) {
'รอการยืนยันแผน' => 15,
'อยู่ระหว่างดำเนินการ' => 50,
'ใบส่งซื้อ/ทำสัญญา' => 85,
'ดำเนินการเสร็จสิ้น' => 100,
default => 0
};
}
// ฟังก์ชันประเมินสถานะ Timeline สี (เขียว, เหลือง, แดง)
function getTimelineBadge($dueDate, $status)
{
if ($status === 'ดำเนินการเสร็จสิ้น') {
return '<span class="badge bg-success"><i class="bi bi-check-circle"></i> เสร็จสิ้น</span>';
}
if (empty($dueDate)) {
return '<span class="badge bg-secondary">ยังไม่ระบุวัน</span>';
}
$today = new DateTime();
$due = new DateTime($dueDate);
$diff = $today->diff($due)->days * ($today > $due ? -1 : 1);
if ($diff < 0) {
return '<span class="badge bg-danger"><i class="bi bi-exclamation-triangle"></i> ล่าช้า (' . abs($diff) . ' วัน)</span>';
} elseif ($diff <= 15) {
return '<span class="badge bg-warning text-dark"><i class="bi bi-clock-history"></i> ใกล้กำหนด (เหลือ ' . $diff . ' วัน)</span>';
} else {
return '<span class="badge bg-success"><i class="bi bi-calendar-check"></i> ตรงเวลา (เหลือ ' . $diff . ' วัน)</span>';
}
}
@@ -0,0 +1,58 @@
<?php
require_once 'config.php';
include 'header.php';
$stmt = $pdo->prepare("SELECT * FROM procurement_items WHERE budget_year = ? ORDER BY id ASC LIMIT 50");
$stmt->execute([$active_year]);
$items = $stmt->fetchAll();
?>
<div class="card p-4">
<div class="d-flex justify-content-between align-items-center mb-3">
<h5 class="fw-bold"><i class="bi bi-bar-chart-steps me-2"></i>Gantt Chart & Timeline แผนจัดซื้อปี <?= $active_year ?></h5>
<div>
<span class="badge bg-success me-1">ตรงเวลา</span>
<span class="badge bg-warning text-dark me-1">ใกล้กำหนด (<=15 วัน)</span>
<span class="badge bg-danger">เกินกำหนด/ล่าช้า</span>
</div>
</div>
<div class="table-responsive">
<table class="table table-hover align-middle">
<thead class="table-light">
<tr>
<th>รหัส</th>
<th style="width: 25%;">รายการครุภัณฑ์</th>
<th>หน่วยงาน</th>
<th>งบประมาณ</th>
<th>เปอร์เซ็นต์</th>
<th>Timeline สถานะ</th>
<th>การดำเนินการ</th>
</tr>
</thead>
<tbody>
<?php foreach ($items as $row): ?>
<tr>
<td><code><?= $row['item_code'] ?? '-' ?></code></td>
<td class="fw-bold"><?= htmlspecialchars($row['item_name']) ?></td>
<td><?= $row['department'] ?></td>
<td>฿<?= number_format($row['total_price'], 2) ?></td>
<td style="width: 120px;">
<div class="progress" style="height: 18px;">
<div class="progress-bar bg-info" style="width: <?= $row['progress'] ?>%"><?= $row['progress'] ?>%</div>
</div>
</td>
<td><?= getTimelineBadge($row['due_date'], $row['status']) ?></td>
<td>
<a href="qr_view.php?id=<?= $row['id'] ?>" target="_blank" class="btn btn-sm btn-outline-dark"><i class="bi bi-qr-code"></i> QR</a>
<button class="btn btn-sm btn-primary" onclick="openApprovalModal(<?= $row['id'] ?>)"><i class="bi bi-pen"></i> อนุมัติ</button>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
</body>
</html>
@@ -0,0 +1,24 @@
<?php
// ตัวอย่าง integration โครงสร้าง Google Drive API v3
function createGoogleDriveFolder($itemName, $itemCode) {
// กำหนดชื่อโฟลเดอร์ เช่น "[10003] กำจัดปลวก"
$folderName = "[" . ($itemCode ?: 'ITEM') . "] " . $itemName;
/*
// ใช้ Google Client Library:
$client = new Google\Client();
$client->setAuthConfig('credentials.json');
$client->addScope(Google\Service\Drive::DRIVE_FILE);
$service = new Google\Service\Drive($client);
$fileMetadata = new Google\Service\Drive\DriveFile([
'name' => $folderName,
'mimeType' => 'application/vnd.google-apps.folder'
]);
$folder = $service->files->create($fileMetadata, ['fields' => 'id']);
return $folder->id;
*/
return "DRIVE_FOLDER_MOCK_" . uniqid();
}
?>
@@ -0,0 +1,55 @@
<?php
require_once 'config.php';
header('Content-Type: application/json');
$id = $_GET['id'] ?? 0;
if ($id) {
$stmt = $pdo->prepare("SELECT * FROM audit_logs WHERE item_id = ? ORDER BY created_at ASC");
$stmt->execute([$id]);
$logs = $stmt->fetchAll(PDO::FETCH_ASSOC);
// คำนวณระยะเวลา
$history = [];
$previousTime = null;
foreach ($logs as $log) {
$currentTime = new DateTime($log['created_at']);
$duration = '-';
if ($previousTime) {
$interval = $previousTime->diff($currentTime);
$days = $interval->days;
$hours = $interval->h;
$minutes = $interval->i;
$durationStr = [];
if ($days > 0) $durationStr[] = $days . ' วัน';
if ($hours > 0) $durationStr[] = $hours . ' ชั่วโมง';
if ($minutes > 0) $durationStr[] = $minutes . ' นาที';
if (empty($durationStr)) {
$duration = 'น้อยกว่า 1 นาที';
} else {
$duration = implode(' ', $durationStr);
}
}
$history[] = [
'id' => $log['id'],
'action' => $log['action'],
'old_status' => $log['old_status'],
'new_status' => $log['new_status'],
'details' => $log['details'],
'created_at' => $currentTime->format('d/m/Y H:i'),
'duration' => $duration
];
$previousTime = $currentTime;
}
echo json_encode(['success' => true, 'data' => $history]);
} else {
echo json_encode(['success' => false, 'message' => 'Invalid ID']);
}
?>
@@ -0,0 +1,66 @@
<!DOCTYPE html>
<html lang="th">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ระบบติดตามสถานะการจัดซื้อครุภัณฑ์ <?= $active_year ?></title>
<!-- Google Fonts: Sarabun -->
<link href="https://fonts.googleapis.com/css2?family=Sarabun:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<!-- Bootstrap 5 CSS & Icons -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.0/font/bootstrap-icons.css" rel="stylesheet">
<!-- DataTables CSS -->
<link href="https://cdn.datatables.net/1.13.6/css/dataTables.bootstrap5.min.css" rel="stylesheet">
<!-- Bootstrap JS Bundle -->
<script defer src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<style>
body { font-family: 'Sarabun', sans-serif; background-color: #f4f6f9; color: #212529; }
.card { border-radius: 12px; border: none; box-shadow: 0 4px 12px rgba(0,0,0,0.05); }
.kanban-col { background-color: #ebecf0; border-radius: 10px; min-height: 600px; padding: 15px; }
.kanban-card { background: #ffffff; border-left: 4px solid #0d6efd; border-radius: 8px; margin-bottom: 12px; padding: 12px; cursor: grab; transition: all 0.2s; }
.kanban-card:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0,0,0,0.1); }
.kpi-card { border-left: 5px solid; }
</style>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark bg-primary shadow-sm mb-4">
<div class="container-fluid px-4">
<a class="navbar-brand fw-bold" href="index.php"><i class="bi bi-box-seam-fill me-2"></i>ติดตามการจัดซื้อครุภัณฑ์ <?= $active_year ?></a>
<div class="ms-auto me-3 d-lg-none">
<form action="" method="GET" class="d-flex align-items-center">
<select name="year" class="form-select form-select-sm" onchange="this.form.submit()">
<option value="2568" <?= $active_year == 2568 ? 'selected' : '' ?>>2568</option>
<option value="2569" <?= $active_year == 2569 ? 'selected' : '' ?>>2569</option>
<option value="2570" <?= $active_year == 2570 ? 'selected' : '' ?>>2570</option>
<option value="2571" <?= $active_year == 2571 ? 'selected' : '' ?>>2571</option>
</select>
</form>
</div>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto fs-6 align-items-lg-center">
<li class="nav-item d-none d-lg-block me-3">
<form action="" method="GET" class="d-flex align-items-center m-0">
<span class="text-white me-2 small">ปีงบประมาณ:</span>
<select name="year" class="form-select form-select-sm" onchange="this.form.submit()" style="width: auto;">
<option value="2568" <?= $active_year == 2568 ? 'selected' : '' ?>>2568</option>
<option value="2569" <?= $active_year == 2569 ? 'selected' : '' ?>>2569</option>
<option value="2570" <?= $active_year == 2570 ? 'selected' : '' ?>>2570</option>
<option value="2571" <?= $active_year == 2571 ? 'selected' : '' ?>>2571</option>
</select>
</form>
</li>
<li class="nav-item"><a class="nav-link text-white" href="index.php"><i class="bi bi-speedometer2"></i> Dashboard ผู้อำนวยการ</a></li>
<li class="nav-item"><a class="nav-link text-white" href="kanban.php"><i class="bi bi-kanban"></i> Kanban Board</a></li>
<li class="nav-item"><a class="nav-link text-white" href="gantt.php"><i class="bi bi-bar-chart-steps"></i> Gantt Chart & Timeline</a></li>
<li class="nav-item"><a class="nav-link text-white" href="items.php"><i class="bi bi-list-task"></i> รายการทั้งหมด</a></li>
</ul>
</div>
</div>
</nav>
<div class="container-fluid px-4">
@@ -0,0 +1,101 @@
<?php
require_once 'config.php';
include 'header.php';
// ดึงข้อมูล KPI
$stmtTotalItems = $pdo->prepare("SELECT COUNT(*) FROM procurement_items WHERE budget_year = ?");
$stmtTotalItems->execute([$active_year]);
$totalItems = $stmtTotalItems->fetchColumn();
$stmtTotalBudget = $pdo->prepare("SELECT SUM(total_price) FROM procurement_items WHERE budget_year = ?");
$stmtTotalBudget->execute([$active_year]);
$totalBudget = $stmtTotalBudget->fetchColumn();
$stmtActualSpent = $pdo->prepare("SELECT SUM(procured_price) FROM procurement_items WHERE status='ดำเนินการเสร็จสิ้น' AND budget_year = ?");
$stmtActualSpent->execute([$active_year]);
$actualSpent = $stmtActualSpent->fetchColumn();
$savings = $totalBudget - $actualSpent;
// สรุปตามสถานะ
$stmtStatusCounts = $pdo->prepare("SELECT status, COUNT(*) as cnt, SUM(total_price) as sum_price FROM procurement_items WHERE budget_year = ? GROUP BY status");
$stmtStatusCounts->execute([$active_year]);
$statusCounts = $stmtStatusCounts->fetchAll();
?>
<div class="row g-3 mb-4">
<div class="col-md-3">
<div class="card p-3 kpi-card border-primary">
<small class="text-muted fw-bold">รายการจัดซื้อทั้งหมด</small>
<h3 class="fw-bold text-primary mt-1"><?= number_format($totalItems) ?> <span class="fs-6 text-muted">รายการ</span></h3>
</div>
</div>
<div class="col-md-3">
<div class="card p-3 kpi-card border-info">
<small class="text-muted fw-bold">งบประมาณตั้งต้นรวม</small>
<h3 class="fw-bold text-info mt-1">฿<?= number_format($totalBudget, 2) ?></h3>
</div>
</div>
<div class="col-md-3">
<div class="card p-3 kpi-card border-success">
<small class="text-muted fw-bold">จัดซื้อจริงได้แล้ว</small>
<h3 class="fw-bold text-success mt-1">฿<?= number_format($actualSpent, 2) ?></h3>
</div>
</div>
<div class="col-md-3">
<div class="card p-3 kpi-card border-warning">
<small class="text-muted fw-bold">ประหยัดงบประมาณได้</small>
<h3 class="fw-bold text-warning mt-1">฿<?= number_format($savings, 2) ?></h3>
</div>
</div>
</div>
<div class="row g-4">
<div class="col-md-6">
<div class="card p-4 h-100">
<h5 class="fw-bold mb-3"><i class="bi bi-pie-chart-fill me-2 text-primary"></i>สัดส่วนสถานะการจัดซื้อ</h5>
<canvas id="statusChart"></canvas>
</div>
</div>
<div class="col-md-6">
<div class="card p-4 h-100">
<h5 class="fw-bold mb-3"><i class="bi bi-bar-chart-line-fill me-2 text-success"></i>งบประมาณแยกตามหมวดหมู่</h5>
<canvas id="categoryChart"></canvas>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
const statusData = <?= json_encode($statusCounts) ?>;
const labels = statusData.map(item => item.status);
const counts = statusData.map(item => item.cnt);
new Chart(document.getElementById('statusChart'), {
type: 'doughnut',
data: {
labels: labels,
datasets: [{
data: counts,
backgroundColor: ['#ffc107', '#0d6efd', '#0dcaf0', '#198754', '#dc3545']
}]
},
options: { responsive: true, plugins: { legend: { position: 'bottom' } } }
});
// กราฟจำลองแยกตามประเภท
new Chart(document.getElementById('categoryChart'), {
type: 'bar',
data: {
labels: ['ค.การแพทย์', 'บำรุงรักษา', 'ค่าใช้สอย', 'จ้างเหมา', 'คอมพิวเตอร์', 'สำนักงาน'],
datasets: [{
label: 'งบประมาณ (บาท)',
data: [4500000, 2800000, 1500000, 1200000, 950000, 600000],
backgroundColor: '#0d6efd'
}]
},
options: { responsive: true, plugins: { legend: { display: false } } }
});
</script>
</body>
</html>
@@ -0,0 +1,413 @@
<?php
// items.php
require_once 'config.php';
include 'header.php';
// ดึงตัวเลือกสำหรับ Filter
$stmtCategories = $pdo->prepare("SELECT DISTINCT category_code, category FROM procurement_items WHERE category IS NOT NULL AND budget_year = ? ORDER BY category_code, category");
$stmtCategories->execute([$active_year]);
$categories = $stmtCategories->fetchAll();
$stmtDepartments = $pdo->prepare("SELECT DISTINCT department FROM procurement_items WHERE department IS NOT NULL AND budget_year = ? ORDER BY department");
$stmtDepartments->execute([$active_year]);
$departments = $stmtDepartments->fetchAll(PDO::FETCH_COLUMN);
$stmtStatuses = $pdo->prepare("SELECT DISTINCT status FROM procurement_items WHERE status IS NOT NULL AND budget_year = ? ORDER BY status");
$stmtStatuses->execute([$active_year]);
$statuses = $stmtStatuses->fetchAll(PDO::FETCH_COLUMN);
// ดึงรายการจัดซื้อทั้งหมด
$stmt = $pdo->prepare("SELECT * FROM procurement_items WHERE budget_year = ? ORDER BY id ASC");
$stmt->execute([$active_year]);
$items = $stmt->fetchAll();
?>
<style>
/* ตั้งค่าบังคับจัดกึ่งกลางให้ชื่อหัวคอลัมน์ทั้งหมด (th) */
#procurementTable th {
text-align: center !important;
vertical-align: middle !important;
}
/* Custom Progress Bar Style */
.custom-progress-container {
background-color: #e9ecef;
border-radius: 20px;
height: 12px;
overflow: hidden;
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
}
.progress-bar-danger {
background: linear-gradient(90deg, #ff758c 0%, #ff7eb3 100%);
}
.progress-bar-info {
background: linear-gradient(90deg, #36d1dc 0%, #5b86e5 100%);
}
.progress-bar-success-custom {
background: linear-gradient(90deg, #11998e 0%, #38ef7d 100%);
}
.badge-progress {
font-size: 0.75rem;
padding: 3px 8px;
border-radius: 12px;
min-width: 42px;
text-align: center;
}
/* Custom DataTables Sort Icons */
table.dataTable thead>tr>th.sorting:before,
table.dataTable thead>tr>th.sorting:after,
table.dataTable thead>tr>th.sorting_asc:before,
table.dataTable thead>tr>th.sorting_asc:after,
table.dataTable thead>tr>th.sorting_desc:before,
table.dataTable thead>tr>th.sorting_desc:after,
table.dataTable thead>tr>td.sorting:before,
table.dataTable thead>tr>td.sorting:after,
table.dataTable thead>tr>td.sorting_asc:before,
table.dataTable thead>tr>td.sorting_asc:after,
table.dataTable thead>tr>td.sorting_desc:before,
table.dataTable thead>tr>td.sorting_desc:after {
display: none !important;
}
table.dataTable thead th.sorting {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="%23adb5bd" class="bi bi-arrow-down-up" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M11.5 15a.5.5 0 0 0 .5-.5V2.707l3.146 3.147a.5.5 0 0 0 .708-.708l-4-4a.5.5 0 0 0-.708 0l-4 4a.5.5 0 1 0 .708.708L11 2.707V14.5a.5.5 0 0 0 .5.5zm-7-14a.5.5 0 0 1 .5.5v11.793l3.146-3.147a.5.5 0 0 1 .708.708l-4 4a.5.5 0 0 1-.708 0l-4-4a.5.5 0 0 1 .708-.708L4 13.293V1.5a.5.5 0 0 1 .5-.5z"/></svg>') !important;
background-position: right 6px center !important;
background-repeat: no-repeat !important;
padding-right: 25px !important;
}
table.dataTable thead th.sorting_asc {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="%230d6efd" class="bi bi-sort-alpha-down" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M10.082 5.629 9.664 7H8.598l1.789-5.332h1.234L13.402 7h-1.12l-.419-1.371h-1.781zm1.57-.785L11 2.687h-.047l-.652 2.157h1.351z"/><path d="M12.96 14H8.5v-1.299l3.46-3.94h-3.46V7.49h4.46v1.298l-3.46 3.94h3.46V14zM4.5 2.5a.5.5 0 0 0-1 0v9.793l-1.146-1.147a.5.5 0 0 0-.708.708l2 1.999.007.007a.497.497 0 0 0 .7-.006l2-2a.5.5 0 0 0-.707-.708L4.5 12.293V2.5z"/></svg>') !important;
background-position: right 6px center !important;
background-repeat: no-repeat !important;
padding-right: 25px !important;
}
table.dataTable thead th.sorting_desc {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="%230d6efd" class="bi bi-sort-alpha-up-alt" viewBox="0 0 16 16"><path d="M12.96 7H8.5V5.701l3.46-3.94h-3.46V.51h4.46v1.298l-3.46 3.94h3.46V7zM4.5 13.5a.5.5 0 0 1-1 0V3.707L2.354 4.854a.5.5 0 1 1-.708-.708l2-1.999.007-.007a.498.498 0 0 1 .7.006l2 2a.5.5 0 1 1-.707.708L4.5 3.707V13.5zm5.582-7.871L9.664 7H8.598l1.789-5.332h1.234L13.402 7h-1.12l-.419-1.371h-1.781zm1.57-.785L11 2.687h-.047l-.652 2.157h1.351z"/></svg>') !important;
background-position: right 6px center !important;
background-repeat: no-repeat !important;
padding-right: 25px !important;
}
</style>
<div class="card p-4 shadow-sm mb-4">
<!-- 1. แถวหัวข้อและปุ่มเพิ่มรายการ -->
<div class="d-flex justify-content-between align-items-center mb-4 pb-2 border-bottom">
<h4 class="fw-bold mb-0"><i class="bi bi-list-task me-2 text-primary"></i>รายการจัดซื้อครุภัณฑ์ ประจำปี <?= $active_year ?></h4>
<div>
<button class="btn btn-success me-2 shadow-sm" onclick="alert('เปิดฟอร์มเพิ่มรายการใหม่')">
<i class="bi bi-plus-circle me-1"></i> เพิ่มรายการจัดซื้อ
</button>
<a href="index.php" class="btn btn-outline-secondary shadow-sm">
<i class="bi bi-arrow-left me-1"></i> กลับหน้าหลัก
</a>
</div>
</div>
<!-- 2. กล่องกรองข้อมูล (Filter Section) -->
<div class="row g-3 mb-4 bg-light p-3 rounded border shadow-sm">
<div class="col-md-3">
<label class="form-label fw-bold small text-muted">กรองตามหน่วยงาน</label>
<select id="deptFilter" class="form-select form-select-sm">
<option value="">-- ทั้งหมดทุกหน่วยงาน --</option>
<?php foreach ($departments as $dept): ?>
<option value="<?= htmlspecialchars($dept) ?>"><?= htmlspecialchars($dept) ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-4">
<label class="form-label fw-bold small text-muted">กรองตามหมวดหมู่รายการ</label>
<select id="catFilter" class="form-select form-select-sm">
<option value="">-- ทั้งหมดทุกหมวดหมู่ --</option>
<?php foreach ($categories as $cat): ?>
<option value="<?= htmlspecialchars($cat['category']) ?>">
<?= $cat['category_code'] ? '[' . $cat['category_code'] . '] ' : '' ?><?= htmlspecialchars($cat['category']) ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-3">
<label class="form-label fw-bold small text-muted">กรองตามสถานะการจัดซื้อ</label>
<select id="statusFilter" class="form-select form-select-sm">
<option value="">-- ทั้งหมดทุกสถานะ --</option>
<?php foreach ($statuses as $st): ?>
<option value="<?= htmlspecialchars($st) ?>"><?= htmlspecialchars($st) ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-2 d-flex align-items-end">
<button class="btn btn-sm btn-secondary w-100" onclick="resetFilters()">
<i class="bi bi-arrow-counterclockwise me-1"></i> ล้างการกรอง
</button>
</div>
</div>
<!-- 3. Data Table -->
<div class="table-responsive">
<table id="procurementTable" class="table table-hover align-middle w-100 fs-6">
<thead class="table-light">
<tr>
<th class="text-nowrap text-center" style="width: 5%;">ลำดับ</th>
<th class="text-nowrap text-center" style="width: 8%;">รหัส</th>
<th class="text-nowrap text-center" style="width: 25%;">รายการครุภัณฑ์</th>
<th class="text-nowrap text-center">หมวดหมู่</th>
<th class="text-nowrap text-center">หน่วยงาน</th>
<th class="text-nowrap text-center">งบตั้งต้น</th>
<th class="text-nowrap text-center">จัดซื้อจริง</th>
<th class="text-nowrap text-center" style="width: 14%;">ความคืบหน้า</th>
<th class="text-nowrap text-center">สถานะปัจจุบัน</th>
<th class="text-nowrap text-center">Timeline</th>
<th class="text-nowrap text-center" style="width: 10%;">จัดการ</th>
</tr>
</thead>
<tbody>
<?php foreach ($items as $row): ?>
<tr>
<td class="text-center"><?= $row['seq_no'] ?></td>
<td class="text-center"><code><?= $row['item_code'] ?: '-' ?></code></td>
<td>
<div class="fw-bold text-dark"><?= htmlspecialchars($row['item_name']) ?></div>
<small class="text-muted"><?= $row['quantity'] ?> <?= $row['unit'] ?> (<?= $row['plan_type'] ?>)</small>
</td>
<td>
<span class="badge bg-light text-dark border" title="<?= htmlspecialchars($row['category']) ?>">
<?= $row['category_code'] ? '[' . $row['category_code'] . '] ' : '' ?><?= htmlspecialchars($row['category']) ?>
</span>
</td>
<td><?= htmlspecialchars($row['department']) ?></td>
<!-- งบตั้งต้น -->
<td class="text-end fw-bold"><?= number_format($row['total_price'], 0) ?></td>
<!-- จัดซื้อจริง -->
<td class="text-end text-success fw-bold">
<?= $row['procured_price'] > 0 ? number_format($row['procured_price'], 0) : '-' ?>
</td>
<!-- ความคืบหน้า -->
<td>
<?php
$p = (int)$row['progress'];
if ($p <= 30) {
$barClass = 'progress-bar-danger';
$badgeBg = 'bg-danger text-white';
} elseif ($p <= 70) {
$barClass = 'progress-bar-info';
$badgeBg = 'bg-primary text-white';
} else {
$barClass = 'progress-bar-success-custom';
$badgeBg = 'bg-success text-white';
}
?>
<div class="d-flex align-items-center">
<div class="custom-progress-container flex-grow-1 me-2">
<div class="progress-bar <?= $barClass ?> progress-bar-striped progress-bar-animated h-100" style="width: <?= $p ?>%"></div>
</div>
<span class="badge <?= $badgeBg ?> badge-progress shadow-sm"><?= $p ?>%</span>
</div>
</td>
<td class="text-center" data-sort="<?= $row['status'] ?>">
<?php
$badgeClass = match ($row['status']) {
'รอการยืนยันแผน' => 'bg-warning text-dark',
'อยู่ระหว่างดำเนินการ' => 'bg-primary text-white',
'ใบส่งซื้อ/ทำสัญญา' => 'bg-info text-dark',
'ดำเนินการเสร็จสิ้น' => 'bg-success text-white',
default => 'bg-secondary text-white'
};
?>
<select class="form-select form-select-sm text-center fw-bold border-0 shadow-sm <?= $badgeClass ?>"
style="border-radius: 20px; font-size: 0.85rem;"
data-id="<?= $row['id'] ?>"
onchange="changeStatus(this)">
<option value="รอการยืนยันแผน" <?= $row['status'] == 'รอการยืนยันแผน' ? 'selected' : '' ?>>รอการยืนยันแผน</option>
<option value="อยู่ระหว่างดำเนินการ" <?= $row['status'] == 'อยู่ระหว่างดำเนินการ' ? 'selected' : '' ?>>อยู่ระหว่างดำเนินการ</option>
<option value="ใบส่งซื้อ/ทำสัญญา" <?= $row['status'] == 'ใบส่งซื้อ/ทำสัญญา' ? 'selected' : '' ?>>ใบส่งซื้อ/ทำสัญญา</option>
<option value="ดำเนินการเสร็จสิ้น" <?= $row['status'] == 'ดำเนินการเสร็จสิ้น' ? 'selected' : '' ?>>ดำเนินการเสร็จสิ้น</option>
<option value="ยกเลิก" <?= $row['status'] == 'ยกเลิก' ? 'selected' : '' ?>>ยกเลิก</option>
</select>
</td>
<td class="text-center">
<?php if (!empty($row['confirm_period'])): ?>
<div class="small fw-bold text-muted mb-1"><i class="bi bi-calendar2-range me-1"></i><?= htmlspecialchars($row['confirm_period']) ?></div>
<?php endif; ?>
<?= getTimelineBadge($row['due_date'], $row['status']) ?>
</td>
<td class="text-center">
<div class="btn-group btn-group-sm">
<button class="btn btn-outline-info" onclick="viewHistory(<?= $row['id'] ?>)" title="ดูประวัติและระยะเวลาดำเนินงาน">
<i class="bi bi-clock-history"></i>
</button>
<a href="qr_view.php?id=<?= $row['id'] ?>" target="_blank" class="btn btn-outline-dark" title="QR Code Mobile View">
<i class="bi bi-qr-code-scan"></i>
</a>
<?php if ($row['gdrive_folder_id']): ?>
<a href="https://drive.google.com/drive/folders/<?= $row['gdrive_folder_id'] ?>" target="_blank" class="btn btn-outline-primary" title="เปิดโฟลเดอร์ Google Drive">
<i class="bi bi-folder-symlink-fill"></i>
</a>
<?php endif; ?>
<button class="btn btn-outline-success" onclick="openApprovalModal(<?= $row['id'] ?>)" title="อนุมัติออนไลน์">
<i class="bi bi-check-circle"></i>
</button>
</div>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
<!-- History Modal -->
<div class="modal fade" id="historyModal" tabindex="-1" aria-labelledby="historyModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header bg-info text-white">
<h5 class="modal-title" id="historyModalLabel"><i class="bi bi-clock-history me-2"></i>ประวัติการเปลี่ยนสถานะ</h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="table-responsive">
<table class="table table-bordered table-striped" id="historyTable">
<thead class="table-light text-center">
<tr>
<th>วัน-เวลาที่เปลี่ยน</th>
<th>สถานะเดิม</th>
<th>สถานะใหม่</th>
<th>ระยะเวลาที่ใช้ (นับจากสถานะก่อนหน้า)</th>
</tr>
</thead>
<tbody id="historyBody">
<!-- Data will be loaded here -->
</tbody>
</table>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">ปิด</button>
</div>
</div>
</div>
</div>
<!-- jQuery & DataTables JS -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.13.6/js/dataTables.bootstrap5.min.js"></script>
<script>
$(document).ready(function() {
var table = $('#procurementTable').DataTable({
"language": {
"url": "//cdn.datatables.net/plug-ins/1.13.6/i18n/th.json"
},
"pageLength": 10,
"order": [
[0, "asc"]
],
"columnDefs": [{
"orderable": false,
"targets": [7, 9, 10]
}]
});
// Custom Filters
$('#deptFilter').on('change', function() {
table.column(4).search(this.value).draw();
});
$('#catFilter').on('change', function() {
table.column(3).search(this.value).draw();
});
$('#statusFilter').on('change', function() {
table.column(8).search(this.value).draw();
});
});
function resetFilters() {
$('#deptFilter').val('');
$('#catFilter').val('');
$('#statusFilter').val('');
var table = $('#procurementTable').DataTable();
table.columns().search('').draw();
}
function viewHistory(id) {
$.ajax({
url: 'get_history.php',
type: 'GET',
data: { id: id },
dataType: 'json',
success: function(res) {
if (res.success) {
var tbody = $('#historyBody');
tbody.empty();
if (res.data.length === 0) {
tbody.append('<tr><td colspan="4" class="text-center text-muted">ไม่มีประวัติการเปลี่ยนสถานะ</td></tr>');
} else {
res.data.forEach(function(log) {
var row = `<tr>
<td class="text-center">${log.created_at}</td>
<td class="text-center"><span class="badge bg-secondary">${log.old_status || '-'}</span></td>
<td class="text-center"><span class="badge bg-primary">${log.new_status}</span></td>
<td class="text-center">${log.duration}</td>
</tr>`;
tbody.append(row);
});
}
var modal = new bootstrap.Modal(document.getElementById('historyModal'));
modal.show();
} else {
alert('ไม่สามารถดึงข้อมูลประวัติได้');
}
},
error: function() {
alert('เกิดข้อผิดพลาดในการเชื่อมต่อ');
}
});
}
function changeStatus(selectObj) {
var id = $(selectObj).data('id');
var newStatus = $(selectObj).val();
$(selectObj).prop('disabled', true);
$.ajax({
url: 'update_status.php',
type: 'POST',
data: { id: id, status: newStatus },
dataType: 'json',
success: function(res) {
if (res.success) {
// Refresh the page to update progress bars and badges correctly
location.reload();
} else {
alert('ไม่สามารถอัปเดตสถานะได้');
$(selectObj).prop('disabled', false);
}
},
error: function() {
alert('เกิดข้อผิดพลาดในการเชื่อมต่อระบบ');
$(selectObj).prop('disabled', false);
}
});
}
</script>
</body>
</html>
@@ -0,0 +1,76 @@
<?php
require_once 'config.php';
include 'header.php';
$statuses = ['รอการยืนยันแผน', 'อยู่ระหว่างดำเนินการ', 'ใบส่งซื้อ/ทำสัญญา', 'ดำเนินการเสร็จสิ้น'];
?>
<div class="d-flex justify-content-between align-items-center mb-3">
<h4 class="fw-bold"><i class="bi bi-kanban me-2"></i>Kanban Board การจัดซื้อ</h4>
<span class="text-muted"><i class="bi bi-info-circle"></i> ลากวางการ์ดเพื่อเปลี่ยนสถานะแบบ Real-time</span>
</div>
<div class="row g-3">
<?php foreach ($statuses as $st):
$stmt = $pdo->prepare("SELECT * FROM procurement_items WHERE status = ? AND budget_year = ? ORDER BY id DESC LIMIT 20");
$stmt->execute([$st, $active_year]);
$items = $stmt->fetchAll();
?>
<div class="col-md-3">
<div class="kanban-col">
<div class="d-flex justify-content-between align-items-center mb-3">
<h6 class="fw-bold m-0"><?= $st ?></h6>
<span class="badge bg-white text-dark shadow-sm rounded-pill"><?= count($items) ?></span>
</div>
<div class="kanban-list" data-status="<?= $st ?>" style="min-height: 500px;">
<?php foreach ($items as $item): ?>
<div class="kanban-card" data-id="<?= $item['id'] ?>">
<div class="d-flex justify-content-between">
<small class="text-muted">#<?= $item['item_code'] ?? $item['id'] ?></small>
<span class="badge bg-light text-primary border"><?= $item['department'] ?></span>
</div>
<div class="fw-bold my-2"><?= htmlspecialchars($item['item_name']) ?></div>
<div class="text-muted small mb-2">งบประมาณ: <strong>฿<?= number_format($item['total_price'], 2) ?></strong></div>
<div class="progress mb-2" style="height: 6px;">
<div class="progress-bar bg-success" style="width: <?= $item['progress'] ?>%"></div>
</div>
<div class="d-flex justify-content-between align-items-center small">
<span>Progress: <?= $item['progress'] ?>%</span>
<?= getTimelineBadge($item['due_date'], $item['status']) ?>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
<script src="https://cdn.jsdelivr.net/npm/sortablejs@1.15.0/Sortable.min.js"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
document.querySelectorAll('.kanban-list').forEach(col => {
new Sortable(col, {
group: 'kanban',
animation: 150,
onEnd: function(evt) {
let itemId = evt.item.getAttribute('data-id');
let newStatus = evt.to.getAttribute('data-status');
$.post('update_status.php', {
id: itemId,
status: newStatus
}, function(res) {
if (res.success) {
location.reload();
} else {
alert('เกิดข้อผิดพลาดในการอัปเดต');
}
}, 'json');
}
});
});
</script>
</body>
</html>
@@ -0,0 +1,56 @@
<?php
require_once 'config.php';
$id = $_GET['id'] ?? 0;
$stmt = $pdo->prepare("SELECT * FROM procurement_items WHERE id = ?");
$stmt->execute([$id]);
$item = $stmt->fetch();
if (!$item) die("ไม่พบข้อมูลรายการ");
?>
<!DOCTYPE html>
<html lang="th">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>สถานะจัดซื้อ - <?= htmlspecialchars($item['item_name']) ?></title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Sarabun:wght@400;600;700&display=swap" rel="stylesheet">
<style>
body {
font-family: 'Sarabun', sans-serif;
background: #f8f9fa;
}
</style>
</head>
<body class="p-3">
<div class="card shadow-sm border-0 mx-auto" style="max-width: 500px;">
<div class="card-header bg-primary text-white py-3">
<small class="d-block opacity-75">การติดตามสถานะจัดซื้อครุภัณฑ์ Mobile View</small>
<h5 class="fw-bold mb-0"><?= htmlspecialchars($item['item_name']) ?></h5>
</div>
<div class="card-body">
<div class="mb-3 text-center">
<?= getTimelineBadge($item['due_date'], $item['status']) ?>
<h2 class="fw-bold text-primary mt-2 mb-0"><?= $item['progress'] ?>%</h2>
<small class="text-muted">ความคืบหน้าของขั้นตอนจัดซื้อ</small>
</div>
<ul class="list-group list-group-flush mb-3">
<li class="list-group-item d-flex justify-content-between"><span>รหัสรายการ:</span> <strong><?= $item['item_code'] ?? '-' ?></strong></li>
<li class="list-group-item d-flex justify-content-between"><span>หน่วยงาน:</span> <strong><?= $item['department'] ?></strong></li>
<li class="list-group-item d-flex justify-content-between"><span>ประเภท:</span> <strong><?= $item['category'] ?></strong></li>
<li class="list-group-item d-flex justify-content-between"><span>งบประมาณ:</span> <strong>฿<?= number_format($item['total_price'], 2) ?></strong></li>
<li class="list-group-item d-flex justify-content-between"><span>สถานะปัจจุบัน:</span> <span class="badge bg-info text-dark"><?= $item['status'] ?></span></li>
</ul>
<?php if ($item['gdrive_folder_id']): ?>
<a href="https://drive.google.com/drive/folders/<?= $item['gdrive_folder_id'] ?>" target="_blank" class="btn btn-outline-primary w-100"><i class="bi bi-folder-symlink"></i> เปิดเอกสารใน Google Drive</a>
<?php endif; ?>
</div>
</div>
</body>
</html>
@@ -0,0 +1,377 @@
-- ============================================================
-- Complete System Installation Script (Clean Install)
-- System: Procurement Tracking System 2569
-- Database: procurement_db
-- Features: Mapped Categories (ก่อหนี้ผูกพัน), HR Department Mapping (75 Departments), Procurement Items (173 Items)
-- ============================================================
CREATE DATABASE IF NOT EXISTS `asset_tracker` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE `asset_tracker`;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `audit_logs`;
DROP TABLE IF EXISTS `approvals`;
DROP TABLE IF EXISTS `procurement_items`;
DROP TABLE IF EXISTS `departments`;
SET FOREIGN_KEY_CHECKS = 1;
-- 1. ตารางหน่วยงาน (Departments)
CREATE TABLE `departments` (
`id` INT PRIMARY KEY COMMENT 'HR_DEPARTMENT_SUB_SUB_ID',
`department_name` VARCHAR(255) NOT NULL COMMENT 'HR_DEPARTMENT_SUB_SUB_NAME',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 2. ตารางประเภทแผน (Plan Types)
CREATE TABLE `plan_types` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`plan_name` VARCHAR(100) NOT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 3. ตารางหน่วยนับ (Unit Types)
CREATE TABLE `unit_types` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`unit_name` VARCHAR(100) NOT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 4. ตารางรายการจัดซื้อครุภัณฑ์ (Procurement Items)
CREATE TABLE `procurement_items` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`budget_year` INT DEFAULT 2569 COMMENT 'ปีงบประมาณ',
`seq_no` INT COMMENT 'ลำดับ',
`plan_type` VARCHAR(50) DEFAULT 'ในแผน' COMMENT 'แผน',
`category_code` VARCHAR(10) COMMENT 'รหัสหมวดรายการก่อหนี้',
`category` VARCHAR(150) COMMENT 'ชื่อหมวดรายการก่อหนี้',
`department_id` INT NULL COMMENT 'รหัสหน่วยงาน HR',
`department` VARCHAR(100) COMMENT 'ชื่อหน่วยงานในแผน',
`item_code` VARCHAR(50) COMMENT 'รหัสรายการ',
`item_name` VARCHAR(255) NOT NULL COMMENT 'รายการครุภัณฑ์',
`unit` VARCHAR(50) COMMENT 'หน่วยนับ',
`quantity` INT DEFAULT 1 COMMENT 'จำนวน',
`unit_price` DECIMAL(12,2) DEFAULT 0.00 COMMENT 'ราคาต่อหน่วย',
`total_price` DECIMAL(12,2) DEFAULT 0.00 COMMENT 'ราคารวมงบตั้งต้น',
`actual_quantity` INT DEFAULT 0 COMMENT 'จำนวนซื้อจริง',
`actual_price` DECIMAL(12,2) DEFAULT 0.00 COMMENT 'ราคาจริง',
`procured_price` DECIMAL(12,2) DEFAULT 0.00 COMMENT 'จัดซื้อจัดจ้างได้',
`status` ENUM('รอการยืนยันแผน', 'อยู่ระหว่างดำเนินการ', 'ใบส่งซื้อ/ทำสัญญา', 'ดำเนินการเสร็จสิ้น', 'ยกเลิก') DEFAULT 'รอการยืนยันแผน',
`confirm_period` VARCHAR(100) COMMENT 'ยืนยัน/ช่วงเวลาดำเนินการ',
`quarter` VARCHAR(50) COMMENT 'ก่อหนี้ ไตรมาส',
`start_date` DATE NULL COMMENT 'วันเริ่มดำเนินการ',
`due_date` DATE NULL COMMENT 'กำหนดวันเสร็จสิ้น/รับของ',
`received_date` DATE NULL COMMENT 'วันที่รับของจริง',
`progress` INT DEFAULT 0 COMMENT 'ความคืบหน้า (%)',
`gdrive_folder_id` VARCHAR(255) NULL COMMENT 'Google Drive Folder ID',
`qr_code_path` VARCHAR(255) NULL,
`remarks` TEXT COMMENT 'หมายเหตุ',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT `fk_procurement_department` FOREIGN KEY (`department_id`) REFERENCES `departments`(`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 3. ตารางอนุมัติออนไลน์และลายเซ็นดิจิทัล (e-Approvals)
CREATE TABLE `approvals` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`item_id` INT NOT NULL,
`approver_name` VARCHAR(150) NOT NULL,
`approver_role` VARCHAR(100) NOT NULL COMMENT 'ตำแหน่ง/บทบาท',
`action` ENUM('approved', 'rejected', 'pending') DEFAULT 'pending',
`signature_data` LONGTEXT COMMENT 'Base64 Canvas Digital Signature',
`comment` TEXT,
`approved_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT `fk_approvals_item` FOREIGN KEY (`item_id`) REFERENCES `procurement_items`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 4. ตารางประวัติการเปลี่ยนแปลง (Audit Trail)
CREATE TABLE `audit_logs` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`item_id` INT NOT NULL,
`user_name` VARCHAR(100) DEFAULT 'System',
`action` VARCHAR(100) NOT NULL,
`old_status` VARCHAR(50),
`new_status` VARCHAR(50),
`details` TEXT,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT `fk_audit_item` FOREIGN KEY (`item_id`) REFERENCES `procurement_items`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ============================================================
-- DATA INSERTS
-- ============================================================
-- 1. นำเข้าข้อมูลตารางหน่วยงาน (75 รายการ)
INSERT INTO `departments` (`id`, `department_name`) VALUES
(1, 'งานธุรการ'),
(2, 'งานบำบัดน้ำเสีย-เตาเผาขยะ'),
(3, 'งานประชาสัมพันธ์'),
(5, 'งานสนาม'),
(6, 'แม่บ้าน'),
(8, 'ศูนย์สื่อสาร'),
(9, 'โสตทัศนศึกษา'),
(10, 'เวชระเบียน'),
(11, 'จ่ายกลาง'),
(13, 'กลุ่มงานสุขภาพดิจิทัล'),
(14, 'วิสัญญี'),
(15, 'อายุรกรรม'),
(16, 'ซักฟอก'),
(17, 'ห้องผ่าตัด'),
(18, 'จิตเวช'),
(20, 'ผู้ป่วยนอก'),
(21, 'อุบัติเหตุและฉุกเฉิน'),
(22, 'เภสัชกรรม'),
(23, 'งานการแพทย์'),
(24, 'ศัลยกรรม'),
(25, 'สมเด็จเกี่ยวฯ'),
(26, 'งานเทคนิคการแพทย์และพยาธิวิทยาคลินิก'),
(27, 'งานการแพทย์แผนไทยและการแพทย์ทางเลือก'),
(28, 'สูติกรรม'),
(30, 'อาชีวเวชกรรม'),
(31, 'ผู้ป่วยสูติ-นรีเวชกรรม'),
(33, 'พิเศษใหม่'),
(34, 'ผู้ป่วยหนัก'),
(35, 'งานยุทธศาสตร์และแผนงานโครงการ'),
(37, 'งานทรัพยากรบุคคล'),
(39, 'การเงินและบัญชี'),
(40, 'ทันตกรรม'),
(49, 'แพทย์แผนจีน'),
(46, 'สูติ-นรีเวช'),
(44, 'ห้องคลอด'),
(45, 'ซ่อมบำรุง'),
(47, 'พัสดุ'),
(48, 'แพทย์แผนไทย'),
(51, 'พิเศษสงฆ์'),
(52, 'ห้องบัตร'),
(68, 'บริหาร'),
(54, 'กายภาพ'),
(55, 'เวชกรรมสังคม'),
(56, 'รังสีวิทยา'),
(57, 'ไตเทียม'),
(58, 'ประกันสุขภาพ'),
(59, 'เทคนิคการแพทย์และพยาธิวิทยาคลินิก'),
(60, 'พิเศษรวม'),
(62, 'ยานพาหนะ'),
(63, 'งานเวชปฏิบัติครอบครัวและชุมชนและศูนย์สุขภาพชุมชนเขตเมือง'),
(64, 'งานส่งเสริมสุขภาพและฟื้นฟู'),
(65, 'งานตรวจสุขภาพ'),
(66, 'การป้องกันควบคุมครอบครัวและระบาดวิทยา'),
(67, 'กลุ่มงานพัฒนาทรัพยากรบุคคล'),
(72, 'พัฒนาทรัพยากรบุคคล'),
(70, 'องค์กรแพทย์'),
(71, 'ทรัพยากรบุคคล'),
(73, 'HA'),
(92, 'เวชศาสตร์การเดินทางและการท่องเที่ยว'),
(76, 'งานควบคุมและป้องกันการติดเชื้อในโรงพยาบาล'),
(77, 'กลุ่มงานการพยาบาลชุมชน'),
(78, 'นิติการ'),
(79, 'ศูนย์ประกัน+ต่างชาติ'),
(80, 'โภชนศาสตร์'),
(82, 'พรส.'),
(83, 'งานพยาบาลผู้จัดการสุขภาพชุมชน'),
(95, 'มารีน่า ฮับ'),
(87, 'การพยาบาลที่บ้านและชุมชน'),
(86, 'เคมีบำบัด'),
(88, 'IC'),
(89, 'สุขศึกษา'),
(90, 'ส่องกล้อง'),
(91, 'เวชศาตร์ฉุกเฉิน'),
(93, 'กลุ่มการพยาบาล'),
(94, 'มารีน่าฮับ (Marina Sea)');
-- 2. นำเข้าข้อมูลตารางประเภทแผน
INSERT INTO `plan_types` (`plan_name`) VALUES
('ในแผน'),
('นอกแผน');
-- 3. นำเข้าข้อมูลตารางหน่วยนับ
INSERT INTO `unit_types` (`unit_name`) VALUES
('คน'),
('คัน'),
('เครื่อง'),
('งาน'),
('ชุด'),
('ตัว'),
('ตู้'),
('ระบบ'),
('ลูก'),
('หน่วย'),
('หลัง'),
('อัน');
-- 4. นำเข้าข้อมูลรายการจัดซื้อครุภัณฑ์ (173 รายการ พร้อม Mapping หมวดหมู่และหน่วยงาน)
INSERT INTO `procurement_items` (`seq_no`, `plan_type`, `category_code`, `category`, `department_id`, `department`, `item_code`, `item_name`, `unit`, `quantity`, `unit_price`, `total_price`, `status`, `confirm_period`, `actual_quantity`, `actual_price`, `procured_price`, `quarter`, `progress`, `remarks`) VALUES
(1, 'ในแผน', '810', 'จ้างเหมาบริการกำจัดปลวก', 68, 'บริหารทั่วไป', '10003', 'กำจัดปลวก', 'งาน', 1, 55000.00, 55000.00, 'รอการยืนยันแผน', 'ตค.68', 1, 21400.00, 21400.00, NULL, 15, NULL),
(2, 'ในแผน', '802', 'ค่าเช่าเครื่องถ่ายเอกสาร', 68, 'บริหารทั่วไป', '10004', 'ค่าเช่าเครื่องถ่ายเอกสาร', 'เครื่อง', 3, 100000.00, 300000.00, 'อยู่ระหว่างดำเนินการ', '27 ตค.68-12/69', 1, 15800.00, 15800.00, NULL, 50, NULL),
(3, 'ในแผน', '813', 'จ้างเหมาดูแลสวนหย่อม', 68, 'บริหารทั่วไป', '10005', 'ตัดแต่งกิ่งไม้บริเวณรอบโรงพยาบาล', 'งาน', 1, 100000.00, 100000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(4, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 68, 'บริหารทั่วไป', '10009', 'ค่าตรวจคุณภาพน้ำทิ้งส่งองค์กรภายนอก', 'งาน', 4, 5500.00, 22000.00, 'อยู่ระหว่างดำเนินการ', '29 ตค.68-15/69', 1, 5350.00, 5350.00, NULL, 50, NULL),
(5, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 68, 'บริหารทั่วไป', '10010', 'ค่าตรวจน้ำทิ้งและกากตะกอนของระบบบำบัดน้ำเสีย', 'งาน', 1, 4500.00, 4500.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(6, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 68, 'บริหารทั่วไป', '10011', 'ค่าตรวจคุณภาพน้ำดื่มน้ำใช้', 'งาน', 1, 20000.00, 20000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(7, 'ในแผน', '806', 'ค่าสื่อสารและโทรคมนาคม(เน็ต)', 13, 'สารสนเทศ', '10224', 'ค่าเช่าระบบจัดเก็บ Log File บน Cloud แบบที่ 1 หมดอายุ 30 ธันวาคม 2568', 'งาน', 1, 50000.00, 50000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-60/69', NULL, NULL, 0.00, NULL, 50, NULL),
(8, 'ในแผน', '806', 'ค่าสื่อสารและโทรคมนาคม(เน็ต)', 13, 'สารสนเทศ', '10225', 'ค่าต่ออายุบริการ GMAIL หมดอายุ 30 มกราคม 2569', 'งาน', 1, 75000.00, 75000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(9, 'ในแผน', '806', 'ค่าสื่อสารและโทรคมนาคม(เน็ต)', 13, 'สารสนเทศ', '10227', 'ค่าต่ออายุบริการ HOSxP หมดอายุ 30 ธันวาคม 2568', 'งาน', 1, 65000.00, 65000.00, 'อยู่ระหว่างดำเนินการ', '27 ตค.68-11/69', 1, 63555.00, 63555.00, NULL, 50, NULL),
(10, 'ในแผน', '806', 'ค่าสื่อสารและโทรคมนาคม(เน็ต)', 13, 'สารสนเทศ', '10228', 'ค่าต่ออายุบริการ Line หมดอายุ 30 ธันวาคม 2568', 'งาน', 1, 305000.00, 305000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-61/69', NULL, NULL, 0.00, NULL, 50, NULL),
(11, 'ในแผน', '806', 'ค่าสื่อสารและโทรคมนาคม(เน็ต)', 13, 'สารสนเทศ', '10229', 'ค่าต่ออายุบริการ Teamviewver หมดอายุ 12 ธันวาคม 2568', 'งาน', 1, 60000.00, 60000.00, 'อยู่ระหว่างดำเนินการ', '11 พย.68-20/69', NULL, NULL, 0.00, NULL, 50, NULL),
(12, 'ในแผน', '806', 'ค่าสื่อสารและโทรคมนาคม(เน็ต)', 13, 'สารสนเทศ', '10230', 'ค่าต่ออายุบริการ SSL หมดอายุ 20 เมษายน 2569', 'งาน', 1, 4000.00, 4000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(13, 'ในแผน', '806', 'ค่าสื่อสารและโทรคมนาคม(เน็ต)', 13, 'สารสนเทศ', '10231', 'Software Navicat หมดอายุ 30 ธันวาคม 2568', 'งาน', 1, 35203.00, 35203.00, 'อยู่ระหว่างดำเนินการ', '4 พย.68-16/69', NULL, NULL, 0.00, NULL, 50, NULL),
(14, 'ในแผน', '806', 'ค่าสื่อสารและโทรคมนาคม(เน็ต)', 45, 'ซ่อมบำรุง', '9989', 'ค่าต่ออายุโปรแกรม Sketch UP3D', 'หน่วย', 1, 16000.00, 16000.00, 'อยู่ระหว่างดำเนินการ', '27 ตค.68-13/69', NULL, NULL, 0.00, NULL, 50, NULL),
(15, 'ในแผน', '806', 'ค่าสื่อสารและโทรคมนาคม(เน็ต)', 45, 'ซ่อมบำรุง', '9990', 'ค่าต่ออายุโปรแกรม Autocad', 'หน่วย', 1, 17000.00, 17000.00, 'อยู่ระหว่างดำเนินการ', '27 ตค.68-14/69', NULL, NULL, 0.00, NULL, 50, NULL),
(17, 'ในแผน', '801', 'ค่าใช้สอยวัสดุต่างๆ', 68, 'บริหารทั่วไป', '10306', 'เคลื่อนย้ายพร้อมติดตั้ง Boiler (หม้อต้มไอน้ำ/น้ำร้อน)', 'งาน', 1, 1500000.00, 1500000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(18, 'ในแผน', '801', 'ค่าใช้สอยวัสดุต่างๆ', 68, 'บริหารทั่วไป', '10307', 'ย้ายพร้อมติดตั้งสถานีแก๊ส', 'งาน', 1, 1500000.00, 1500000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(19, 'ในแผน', '801', 'ค่าใช้สอยวัสดุต่างๆ', 21, 'อุบัติเหตุ', '10152', 'ทำสติเกอร์รถพยาบาลตามระเบียบ สพฉ. 3 คัน', 'คัน', 3, 35000.00, 105000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(20, 'ในแผน', '801', 'ค่าใช้สอยวัสดุต่างๆ', 13, 'สารสนเทศ', '10303', 'ระบบอ่านผลภาพเอกซเรย์ทรวงอกด้วยระบบปัญญาประดิษฐ์ (AI)', 'งาน', 1, 329000.00, 329000.00, 'อยู่ระหว่างดำเนินการ', '16 กย.68-9/69', 1, 329000.00, 329000.00, NULL, 50, NULL),
(21, 'ในแผน', '801', 'ค่าใช้สอยวัสดุต่างๆ', 79, 'ศูนย์ประกัน', '10305', 'ค่าต่ออายุบริการ โปรแกรม HERP Copilot (ลูกหนี้)', 'งาน', 1, 50000.00, 50000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(22, 'ในแผน', '801', 'ค่าใช้สอยวัสดุต่างๆ', NULL, 'ทุกหน่วยงาน', '10304', 'ค่าจ้างเหมาอื่นๆ', 'งาน', 1, 6336000.00, 6336000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(23, 'ในแผน', '801', 'ค่าใช้สอยวัสดุต่างๆ', 13, 'สารสนเทศ', '10363', 'เช่าครุภัณฑ์คอมพิวเตอร์พร้อมเครื่องสำรองไฟ', 'ชุด', 130, 2310000.00, 2310000.00, 'อยู่ระหว่างดำเนินการ', '22 ธค.68-78/69', NULL, NULL, 0.00, NULL, 50, NULL),
(24, 'ในแผน', '817', 'จ้างเหมาอื่นๆ', 45, 'ซ่อมบำรุง', '9992', 'จ้างเหมาบริการซ่อมบำรุง ระบบไฟฟ้า และน้ำประปา', 'งาน', 1, 2050000.00, 2050000.00, 'ใบส่งซื้อ/ทำสัญญา', '8 กย.68-4/69', 1, 469000.00, 469000.00, NULL, 85, NULL),
(25, 'ในแผน', '814', 'จ้างเหมาบำรุงรักษาเครื่องปรับอากาศ', 45, 'ซ่อมบำรุง', '9993', 'จ้างเหมาบริการซ่อมบำรุงเครื่องปรับอากาศ', 'งาน', 1, 400000.00, 400000.00, 'ใบส่งซื้อ/ทำสัญญา', '8 กย.68-5/69', 1, 91350.00, 91350.00, NULL, 85, NULL),
(26, 'ในแผน', '817', 'จ้างเหมาอื่นๆ', 57, 'ไตเทียม', '10116', 'จ้างเหมาบริการฟอกเลือดผู้ป่วยโรคไตด้วยเครื่องไตเทียม', 'งาน', 1, 19015200.00, 19015200.00, 'ใบส่งซื้อ/ทำสัญญา', '15 กย.68-7/69', 1, 4086600.00, 4086600.00, NULL, 85, NULL),
(27, 'ในแผน', '809', 'จ้างบริการรักษาความปลอดภัย', 68, 'บริหารทั่วไป', '10000', 'จ้างเหมาบริการรักษาความปลอดภัย', 'งาน', 1, 1800000.00, 1800000.00, 'ใบส่งซื้อ/ทำสัญญา', '8 กย.68-1/69', 1, 393984.30, 393984.30, NULL, 85, NULL),
(28, 'ในแผน', '817', 'จ้างเหมาอื่นๆ', 68, 'บริหารทั่วไป', '10001', 'จ้างเหมาบริการทำความสะอาด', 'งาน', 1, 4180000.00, 4180000.00, 'ใบส่งซื้อ/ทำสัญญา', '8 กย.68-2/69', 1, 1066922.40, 1066922.40, NULL, 85, NULL),
(29, 'ในแผน', '816', 'จ้างเหมากำจัดขยะ', 68, 'บริหารทั่วไป', '10002', 'จ้างเหมาบริการกำจัดขยะมูลฝอยติดเชื้อ', 'งาน', 1, 1800000.00, 1800000.00, 'อยู่ระหว่างดำเนินการ', '8 กย.68-3/69', NULL, NULL, 0.00, NULL, 50, NULL),
(30, 'ในแผน', '817', 'จ้างเหมาอื่นๆ', 68, 'บริหารทั่วไป', '10308', 'ค่าสำรวจระบบท่อบำบัดน้ำเสีย', 'งาน', 1, 300000.00, 300000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(31, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 59, 'พยาธิวิทยาคลินิค', '10148', 'สอบเทียบเครื่องมือทางห้องปฏิบัติการ', 'หน่วย', 1, 99000.00, 99000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(32, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 59, 'พยาธิวิทยาคลินิค', '10234', 'เช่าเครื่องอัตโนมัติพร้อมน้ำยา', 'งาน', 1, 11000000.00, 11000000.00, 'ใบส่งซื้อ/ทำสัญญา', NULL, 1, 4076378.02, 4076378.02, NULL, 85, NULL),
(33, 'ในแผน', '817', 'จ้างเหมาอื่นๆ', 22, 'เภสัชกรรม', '10204', 'ติดตั้งสัญญาณเตือน smoke detector ไปยังศูนย์สื่อสาร', 'งาน', 1, 30000.00, 30000.00, 'อยู่ระหว่างดำเนินการ', '12 พย.68-25/69', NULL, NULL, 0.00, NULL, 50, NULL),
(34, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 56, 'รังสี', '10290', 'จ้างเหมาบริการ PACs', 'งาน', 1, 1188000.00, 1188000.00, 'ใบส่งซื้อ/ทำสัญญา', '15 กย.68-8/69', 1, 396000.00, 396000.00, NULL, 85, NULL),
(35, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 56, 'รังสี', '10292', 'จ้างเหมาบริการตรวจด้วยเครื่องเอกซเรย์คอมพิวเตอร์ (CT Scan)', 'งาน', 1, 15000000.00, 15000000.00, 'อยู่ระหว่างดำเนินการ', '5 พย.68-17/69', NULL, NULL, 0.00, NULL, 50, NULL),
(36, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 56, 'รังสี', '10291', 'จ้างเหมาบริการตรวจด้วยเครื่อง MRI', 'งาน', 1, 4000000.00, 4000000.00, 'ใบส่งซื้อ/ทำสัญญา', '5 พย.68-18/69', 1, 941800.00, 941800.00, NULL, 85, NULL),
(37, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 56, 'รังสี', '10293', 'จ้างเหมาบริการตรวจเอกซเรย์เต้านม ด้วยเครื่อง Mammogram', 'งาน', 1, 100000.00, 100000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(38, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 56, 'รังสี', '10294', 'ค่าตรวจมาตรฐานห้องปฏิบัติการทางรังสี', 'งาน', 1, 30000.00, 30000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(39, 'ในแผน', '817', 'จ้างเหมาอื่นๆ', 47, 'ศูนย์เครื่องมือแพทย์', '10081', 'จ้างเหมาช่างเครื่องมือแพทย์', 'คน', 1, 200000.00, 200000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(40, 'ในแผน', '808', 'จ้างบริการตรวจวิเคราะห์', 47, 'ศูนย์เครื่องมือแพทย์', '10082', 'สอบเทียบเครื่องมือแพทย์', 'งาน', 1, 300000.00, 300000.00, 'อยู่ระหว่างดำเนินการ', '12 ธค.68-72/69', NULL, NULL, 0.00, NULL, 50, NULL),
(41, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 68, 'บริหารทั่วไป', '10008', 'บำรุงรักษาระบบก๊าสทางการแพทย์ AIR LIQUIDE', 'งาน', 1, 60000.00, 60000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(42, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 68, 'บริหารทั่วไป', '10066', 'บำรุงรักษาตู้เก็บศพ', 'งาน', 1, 50000.00, 50000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(43, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 54, 'เวชกรรมฟื้นฟู', '10098', 'บำรุงรักษาเครื่องมือกายภาพบำบัด (calibrate)', 'เครื่อง', 18, 3000.00, 54000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(44, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 22, 'เภสัชกรรม', '10103', 'บำรุงรักษาระบบ Alarm ตู้เย็น (ตู้เย็น 7 ตู้)', 'งาน', 1, 21000.00, 21000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(45, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 22, 'เภสัชกรรม', '10104', 'บำรุงรักษาระบบแจ้งเหตุเพลิงไหม้ อาคารเภสัชกรรม', 'งาน', 1, 42000.00, 42000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(46, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 22, 'เภสัชกรรม', '10106', 'บำรุงรักษาตู้เตรียมยา Isolator', 'งาน', 2, 20000.00, 40000.00, 'อยู่ระหว่างดำเนินการ', '19 พย.68-31/69', NULL, NULL, 0.00, NULL, 50, NULL),
(47, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 57, 'ไตเทียม', '10120', 'บำรุงรักษาเชิงป้องกัน ระบบน้ำ RO', 'งาน', 1, 139280.00, 139280.00, 'อยู่ระหว่างดำเนินการ', '17 พย.68-30/69', NULL, NULL, 0.00, NULL, 50, NULL),
(48, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 57, 'ไตเทียม', '10122', 'บำรุงรักษาเชิงป้องกัน ระบบน้ำ RO mobile', 'งาน', 1, 44400.00, 44400.00, 'อยู่ระหว่างดำเนินการ', '17 พย.68-28/69', NULL, NULL, 0.00, NULL, 50, NULL),
(49, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 57, 'ไตเทียม', '10124', 'บำรุงรักษาเชิงป้องกันเครื่องไตเทียม Fresenius รายสามเดือน ระยะเวลา 1 ปี ( 6 เครื่อง)', 'งาน', 1, 48320.00, 48320.00, 'อยู่ระหว่างดำเนินการ', '17 พย.68-29/69', NULL, NULL, 0.00, NULL, 50, NULL),
(50, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 21, 'อุบัติเหตุ', '10134', 'ค่า Maintenance ระบบ Telemed ของศูนย์1669 กับรถพยาบาล 6 คัน', 'งาน', 1, 180000.00, 180000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(51, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 11, 'จ่ายกลาง', '10172', 'บำรุงรักษาเครื่องซักผ้า 4 เครื่อง', 'เครื่อง', 4, 8025.00, 32100.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(52, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 11, 'จ่ายกลาง', '10173', 'บำรุงรักษาเครื่องอบพลาสม่า', 'เครื่อง', 1, 29700.00, 29700.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(53, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 11, 'จ่ายกลาง', '10174', 'บำรุงรักษาเครื่องอบผ้า 3 เครื่อง', 'เครื่อง', 3, 8100.00, 24300.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(54, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 11, 'จ่ายกลาง', '10175', 'บำรุงรักษาเครื่องนึ่งไอน้ำ 1 เครื่อง', 'เครื่อง', 1, 18000.00, 18000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(55, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 11, 'จ่ายกลาง', '10176', 'บำรุงรักษาเครื่องนึ่งไอน้ำ 2 เครื่อง', 'เครื่อง', 2, 7500.00, 15000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(56, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 11, 'จ่ายกลาง', '10177', 'บำรุงรักษาเครื่องล้างสายยางอัตโนมัติ', 'เครื่อง', 1, 26400.00, 26400.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(57, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 11, 'จ่ายกลาง', '10179', 'บำรุงรักษาเครื่องล้างเครื่องมือ', 'เครื่อง', 1, 27000.00, 27000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(58, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 11, 'จ่ายกลาง', '10180', 'ตรวจมาตรฐานความปลอดภัยเครื่องกำเนิดไอน้ำ', 'เครื่อง', 2, 95000.00, 190000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(59, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 11, 'จ่ายกลาง', '10181', 'ตรวจมาตรฐานประจำปีสถานีแก๊ส', 'งาน', 1, 75000.00, 75000.00, 'ใบส่งซื้อ/ทำสัญญา', '15 ธค.68-74/69', 1, 4297.12, 4297.12, NULL, 85, NULL),
(60, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10195', 'ค่าซ่อมบำรุงรักษาเครื่อง C-arm', 'เครื่อง', 1, 100000.00, 100000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(61, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10196', 'ค่าซ่อมบำรุงรักษาเครื่อง Phaco', 'เครื่อง', 1, 150000.00, 150000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(62, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10197', 'ค่าบำรุงรักษา unit mini air drive', 'เครื่อง', 1, 150000.00, 150000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(63, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10198', 'ค่าบำรุงรักษาเครื่องฟลูโอโรสโคป', 'เครื่อง', 1, 150000.00, 150000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(64, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10199', 'ค่าบำรุงรักษาเครื่อง colono scope', 'เครื่อง', 1, 150000.00, 150000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(65, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10200', 'ค่าซ่อมบำรุงรักษากล้องmicro scope CARL ZISS', 'เครื่อง', 1, 150000.00, 150000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(66, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 30, 'อาชีวะ', '10211', 'calibrate เครื่องตรวจสมรรถภาพปอด', 'เครื่อง', 1, 10000.00, 10000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(67, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 30, 'อาชีวะ', '10212', 'calibrate เครื่องตรวจสมรรถภาพการได้ยิน (Audiogram)', 'เครื่อง', 1, 10000.00, 10000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(68, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10216', 'ค่าบำรุงรักษาเครื่องมือผ่าตัดจอประสาทตา', 'งาน', 1, 100000.00, 100000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(69, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10217', 'ค่าบำรุงรักษากล้องไมโครสโคบ LiCA', 'งาน', 1, 100000.00, 100000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(70, 'ในแผน', '901', 'ซ่อมบำรุงครุภัณฑ์การแพทย์', 45, 'ซ่อมบำรุง', '9991', 'บำรุงรักษาระบบระบายอากาศ หน่วยงานผ่าตัด ห้องคลอด แยกโรค พิเศษสงฆ์ อายุรกรรม ICU', 'งาน', 1, 500000.00, 500000.00, 'ดำเนินการเสร็จสิ้น', '8 ธค.68-50/69', 1, 347617.70, 347617.70, NULL, 100, NULL),
(71, 'ในแผน', '814', 'จ้างเหมาบำรุงรักษาเครื่องปรับอากาศ', 45, 'ซ่อมบำรุง', '10059', 'บำรุงรักษาแอร์ไดเออร์', 'เครื่อง', 2, 200000.00, 400000.00, 'อยู่ระหว่างดำเนินการ', '22 ธค.68-79/69', NULL, NULL, 0.00, NULL, 50, NULL),
(72, 'ในแผน', '908', 'ซ่อมบำรุงครุภัณฑ์สิ่งก่อสร้าง', 45, 'ซ่อมบำรุง', '10060', 'บำรุงรักษาระบบไปป์ไลน์', 'งาน', 1, 50000.00, 50000.00, 'ดำเนินการเสร็จสิ้น', '8 ธค.68-49/69', 1, 42800.00, 42800.00, NULL, 100, NULL),
(73, 'ในแผน', '908', 'ซ่อมบำรุงครุภัณฑ์สิ่งก่อสร้าง', 45, 'ซ่อมบำรุง', '10061', 'เพิ่มขนาดหม้อแปลงไฟฟ้า 500 KVA เป็น 1000 KVA', 'เครื่อง', 1, 750000.00, 750000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(74, 'ในแผน', '908', 'ซ่อมบำรุงครุภัณฑ์สิ่งก่อสร้าง', 45, 'ซ่อมบำรุง', '10062', 'ตรวจเช็คตู้ MDB ประจำปี', 'เครื่อง', 2, 30000.00, 60000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(75, 'ในแผน', '812', 'จ้างเหมาดูแลลิฟท์', 45, 'ซ่อมบำรุง', '9983', 'บำรุงรักษาลิฟท์ ตึกสมเด็จเกี่ยวฯ', 'เครื่อง', 1, 300000.00, 300000.00, 'ดำเนินการเสร็จสิ้น', '8 ธค.68-51/69', 1, 258000.00, 258000.00, NULL, 100, NULL),
(76, 'ในแผน', '812', 'จ้างเหมาดูแลลิฟท์', 45, 'ซ่อมบำรุง', '9984', 'บำรุงรักษาลิฟท์ อาคารเภสัช', 'เครื่อง', 1, 40000.00, 40000.00, 'อยู่ระหว่างดำเนินการ', '8 ธค.68-46/69', NULL, NULL, 0.00, NULL, 50, NULL),
(77, 'ในแผน', '812', 'จ้างเหมาดูแลลิฟท์', 45, 'ซ่อมบำรุง', '9985', 'บำรุงรักษาลิฟท์ตึกผู้ป่วยนอก', 'เครื่อง', 1, 40000.00, 40000.00, 'ดำเนินการเสร็จสิ้น', '8 ธค.68-47/69', 1, 31019.30, 31019.30, NULL, 100, NULL),
(78, 'ในแผน', '911', 'ซ่อมบำรุงครุภัณฑ์อื่นๆ', 45, 'ซ่อมบำรุง', '9986', 'บำรุงรักษาเครื่องกำเนิดไฟฟ้า', 'เครื่อง', 2, 40000.00, 80000.00, 'ดำเนินการเสร็จสิ้น', '8 ธค.68-48/69', 1, 53500.00, 53500.00, NULL, 100, NULL),
(79, 'ในแผน', '911', 'ซ่อมบำรุงครุภัณฑ์อื่นๆ', 45, 'ซ่อมบำรุง', '9987', 'บำรุงรักษาเครื่องผลิตออกซิเจน', 'เครื่อง', 1, 400000.00, 400000.00, 'ดำเนินการเสร็จสิ้น', '8 ธค.68-51/69', 1, 258000.00, 258000.00, NULL, 100, NULL),
(80, 'ในแผน', '908', 'ซ่อมบำรุงครุภัณฑ์สิ่งก่อสร้าง', 45, 'ซ่อมบำรุง', '9988', 'บำรุงรักษาหม้อแปลงไฟฟ้า', 'งาน', 1, 50000.00, 50000.00, 'อยู่ระหว่างดำเนินการ', '22 ธค.68-80/69', NULL, NULL, 0.00, NULL, 50, NULL),
(81, 'ในแผน', '906', 'ซ่อมบำรุงครุภัณฑ์ยานพาหนะ', 68, 'บริหารทั่วไป', '10012', 'ซ่อมบำรุงรักษารถยนต์ทางราชการ', 'คัน', 15, 40000.00, 600000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(82, 'ในแผน', '911', 'ซ่อมบำรุงครุภัณฑ์อื่นๆ', 68, 'บริหารทั่วไป', '10013', 'บำรุงรักษาถังดับเพลิง', 'งาน', 1, 100000.00, 100000.00, 'ดำเนินการเสร็จสิ้น', '11 พย.68-23/69', 1, 100000.00, 100000.00, NULL, 100, NULL),
(83, 'ในแผน', '908', 'ซ่อมบำรุงครุภัณฑ์สิ่งก่อสร้าง', 68, 'บริหารทั่วไป', '10067', 'บำรุงรักษาระบบบ่อบำบัดน้ำเสีย', 'งาน', 1, 50000.00, 50000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(84, 'ในแผน', '906', 'ซ่อมบำรุงครุภัณฑ์ยานพาหนะ', 68, 'บริหารทั่วไป', '10068', 'ซ่อมบำรุงรักษารถงานสนาม', 'คัน', 1, 150000.00, 150000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-55/69', NULL, NULL, 0.00, NULL, 50, NULL),
(85, 'ในแผน', '906', 'ซ่อมบำรุงครุภัณฑ์ยานพาหนะ', 21, 'อุบัติเหตุ', '10142', 'ซ่อมบำรุงรักษารถกอล์ฟเคลื่อนย้ายผู้ป่วย', 'คัน', 1, 40000.00, 40000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(86, 'ในแผน', '906', 'ซ่อมบำรุงครุภัณฑ์ยานพาหนะ', 21, 'อุบัติเหตุ', '10309', 'ปรับปรุงซ่อมแซมภายใน+ภายนอกรถพยาบาลตามระเบียบ สพฉ', 'คัน', 1, 300000.00, 300000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(87, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10156', 'เครื่องมือผ่าตัดในการผนึกหลอดเลือดและเนื้อเยื่อด้วยคลื่นเสียงความถี่สูงแบบไร้สาย ใช้แบตเตอรี่', 'เครื่อง', 1, 450000.00, 450000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(88, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10310', 'โต๊ะเมโยจัดเครื่องมือ 4 ล้อ', 'คัน', 4, 8000.00, 32000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(89, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 17, 'ผ่าตัด', '10311', 'ตู้เย็นเก็บวัสดุชีวภาพ', 'เครื่อง', 1, 8500.00, 8500.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(90, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 20, 'ผู้ป่วยนอก', '10112', 'ชุดตรวจหู (Opthalmoseope)', 'ชุด', 1, 11000.00, 11000.00, 'อยู่ระหว่างดำเนินการ', '17 พย.68-26/69', NULL, NULL, 0.00, NULL, 50, NULL),
(91, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 59, 'พยาธิวิทยาคลินิค', '10232', 'กล้องจุลทรรศน์', 'เครื่อง', 1, 80000.00, 80000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(92, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 59, 'พยาธิวิทยาคลินิค', '10233', 'เครื่องปั่นเม็ดเลือดแดงอัดแน่น', 'เครื่อง', 1, 80000.00, 80000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(93, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 60, 'พิเศษรวม', '10069', 'เตียงตรวจทางสูติ-นรีเวช', 'เครื่อง', 1, 50000.00, 50000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(94, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 22, 'เภสัชกรรม', '10153', 'รถเข็นสเตนเลส 2 ชั้น ขนาด กว้าง 55 cm ยาว 85 cm สูง 90 cm', 'คัน', 1, 11000.00, 11000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(95, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 22, 'เภสัชกรรม', '10155', 'รถเข็นสเตนเลส 2 ชั้น ขนาด กว้าง 45 cm ยาว 73.5 cm สูง 80 cm', 'คัน', 1, 11000.00, 11000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(96, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 92, 'เวชศาสตร์การเดินทางและท่องเที่ยว', '10312', 'ความวัดความดันแบบสอดแขน (อัตโนมัติ)', 'เครื่อง', 1, 68000.00, 68000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(97, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 92, 'เวชศาสตร์การเดินทางและท่องเที่ยว', '10313', 'เครื่องชั่งน้ำหนักพร้อมที่วัดส่วนสูง', 'เครื่อง', 1, 14300.00, 14300.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(98, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 92, 'เวชศาสตร์การเดินทางและท่องเที่ยว', '10314', 'เครื่องวัดอุณหภูมิดิจิตอล แบบไม่สัมผัส', 'เครื่อง', 1, 2500.00, 2500.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(99, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 92, 'เวชศาสตร์การเดินทางและท่องเที่ยว', '10315', 'เครื่องวัดออกซิเจนปลายนิ้ว', 'เครื่อง', 1, 880.00, 880.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(100, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 14, 'วิสัญญี', '10218', 'เปลนอนแสตนเลสมีที่ใส่แท๊งออกซิเจนสำหรับรับส่งผู้ป่วยในพักฟื้น', 'เครื่อง', 1, 38000.00, 38000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(101, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 47, 'ศูนย์เครื่องมือแพทย์', '10316', 'รถเข็นอุปกรณ์', 'คัน', 1, 50000.00, 50000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(102, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 47, 'ศูนย์เครื่องมือแพทย์', '10088', 'รถใส่อุปกรณ์เครื่องมือแพทย์ (ชนิดมีล้อ)', 'คัน', 1, 5000.00, 5000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(103, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 25, 'สมเด็จเกี่ยว 3', '10317', 'รถเข็นสำหรับส่งของนึ่ง', 'คัน', 1, 5000.00, 5000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(104, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 28, 'สูติกรรม', '10126', 'เครื่องกระตุกไฟฟ้าหัวใจชนิดไบเฟสิค พร้อมภาควัดออกซิเจนในเลือด ( Biphasic Defibrillator with Blood Ox', 'เครื่อง', 1, 300000.00, 300000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(105, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 28, 'สูติกรรม', '10128', 'เครื่องติดตามการทำงานของหัวใจและสัญญาณชีพอัตโนมัติ ขนาดใหญ่ (Large Bedside Monitor )', 'เครื่อง', 1, 300000.00, 300000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(106, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 34, 'หอผู้ป่วยหนัก', '10074', 'เครื่องควบคุมอุณหภูมิทารกแรกเกิด Radiant warmer', 'เครื่อง', 1, 70000.00, 70000.00, 'อยู่ระหว่างดำเนินการ', '8 ธค.68-83/69', NULL, NULL, 0.00, NULL, 50, NULL),
(107, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 34, 'หอผู้ป่วยหนัก', '10318', 'เครื่อง Remote Inspiratory Monitoring Neonate', 'เครื่อง', 2, 22000.00, 44000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-56/69', NULL, NULL, 0.00, NULL, 50, NULL),
(108, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 34, 'หอผู้ป่วยหนัก', '10032', 'รถเข็นสเตนเลส 2 ชั้น', 'คัน', 1, 11000.00, 11000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-59/69', NULL, NULL, 0.00, NULL, 50, NULL),
(109, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 30, 'อาชีวะ', '10213', 'เครื่องตรวจสมรรถภาพปอด', 'เครื่อง', 1, 250000.00, 250000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(110, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 15, 'อายุรกรรม', '10146', 'เครื่องดูดเสมหะ (intermittent suction)', 'อัน', 1, 28000.00, 28000.00, 'ดำเนินการเสร็จสิ้น', '13 กพ.69-137/69', 1, 13500.00, 13500.00, NULL, 100, NULL),
(111, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 21, 'อุบัติเหตุ', '10151', 'เครื่องกระตุกหัวใจไฟฟ้าแบบ2ระบบ (Defibrillator)', 'เครื่อง', 1, 500000.00, 500000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(112, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 21, 'อุบัติเหตุ', '10319', 'หัวตรวจสำหรับหลอดเลือดขนาดเล็ก (Hockey stick)', 'ชุด', 1, 250000.00, 250000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(113, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 21, 'อุบัติเหตุ', '10135', 'เพิ่มไปด์ไล ในห้องnegative 1 จุด', 'งาน', 1, 100000.00, 100000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(114, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 21, 'อุบัติเหตุ', '10162', 'Traverse Rescue Titan Stainless Steel Rescue Litter, Stainless Steel ชุดเปลตะกร้า, Basket Stretcher', 'อัน', 1, 80000.00, 80000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(115, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 21, 'อุบัติเหตุ', '10137', 'vacuum splint', 'ชุด', 2, 30000.00, 60000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(116, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 21, 'อุบัติเหตุ', '10210', 'รถเข็นอุปกรณ์ 2 ชั้น', 'คัน', 2, 11000.00, 22000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(117, 'ในแผน', '601', 'ครุภัณฑ์การแพทย์', 21, 'อุบัติเหตุ_ฉุกเฉิน', '9732', 'เครื่อง Monoplace Hyperbaric Chamber', 'เครื่อง', 1, 15050000.00, 15050000.00, 'อยู่ระหว่างดำเนินการ', '12 ธค.68-73/69', NULL, NULL, 0.00, NULL, 50, NULL),
(118, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 93, 'กลุ่มการพยาบาล', '10161', 'เก้าอี้สำนักงานมีพนักพิงปรับเอนและขึ้นลงได้ ห้องหน.พยาบาล (กลุ่มการพยาบาล)', 'ตัว', 1, 5000.00, 5000.00, 'อยู่ระหว่างดำเนินการ', '8 ธค.68-54/69', NULL, NULL, 0.00, NULL, 50, NULL),
(119, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 17, 'ผ่าตัด', '10108', 'ตู้ชั้นเก็บเครื่องมือ', 'ลูก', 2, 7000.00, 14000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(120, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 17, 'ผ่าตัด', '10109', 'ตู้เย็นเก็บยา', 'ลูก', 2, 7500.00, 15000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(121, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 22, 'เภสัชกรรม', '10100', 'เก้าอี้สำนักงานมีพนักพิง', 'ตัว', 2, 4500.00, 9000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(122, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 22, 'เภสัชกรรม', '10102', 'โต๊ะสำนักงาน', 'ตัว', 1, 6500.00, 6500.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(123, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 22, 'เภสัชกรรม', '10208', 'โซฟาเบดที่แข็งแรง สำหรับพักตอนเวรดึก', 'ตัว', 1, 7500.00, 7500.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(124, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 92, 'เวชศาสตร์การเดินทางและท่องเที่ยว', '10320', 'โต๊ะสำนักงาน', 'ตัว', 1, 6500.00, 6500.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(125, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 92, 'เวชศาสตร์การเดินทางและท่องเที่ยว', '10321', 'เก้าอี้สำนักงานมีพนักพิง', 'ตัว', 1, 4500.00, 4500.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(126, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 35, 'วิชาการ', '10079', 'เก้าอี้สำนักงานมีพนักพิง', 'ตัว', 1, 4500.00, 4500.00, 'อยู่ระหว่างดำเนินการ', '19 พย.68-32/69', NULL, NULL, 0.00, NULL, 50, NULL),
(127, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 47, 'ศูนย์เครื่องมือแพทย์', '10087', 'ตู้ล็อกเกอร์ 9 ช่อง', 'หลัง', 1, 8000.00, 8000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(128, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 58, 'ศูนย์ประกันสุขภาพ', '10078', 'เก้าอี้สำนักงานมีพนักพิง', 'ตัว', 1, 4500.00, 4500.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(129, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 58, 'ศูนย์ประกันสุขภาพ', '10080', 'เก้าอี้สำหรับผู้มารับบริการ (ต่างชาติ ตัวใหญ่)', 'ตัว', 3, 4500.00, 13500.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(130, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 34, 'หอผู้ป่วยหนัก', '10028', 'เก้าอี้สำนักงานมีพนักพิง', 'ตัว', 2, 4500.00, 9000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-58/69', NULL, NULL, 0.00, NULL, 50, NULL),
(131, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 15, 'อายุรกรรม', '10129', 'พัดลมติดผนัง', 'ตัว', 1, 1900.00, 1900.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(132, 'ในแผน', '602', 'ครุภัณฑ์สำนักงาน', 21, 'อุบัติเหตุ', '10322', 'เก้าอี้สำนักงานมีพนักพิง', 'ตัว', 1, 4500.00, 4500.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(133, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10243', 'อุปกรณ์อ่านบัตรแบบอเนกประสงค์ (Smart Card Reader) (ข้อที่ 59)', 'อัน', 10, 700.00, 7000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-62/69', NULL, NULL, 0.00, NULL, 50, NULL),
(134, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10245', 'เครื่องพิมพ์แบบใช้ความร้อน (Thermal Printer) (ข้อ 55)', 'เครื่อง', 4, 20000.00, 80000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-71/69', NULL, NULL, 0.00, NULL, 50, NULL),
(135, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10250', 'คอมพิวเตอร์ (เพิ่ม)', 'เครื่อง', 8, 32000.00, 256000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(136, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10251', 'คอมพิวเตอร์ (ทดแทน)', 'เครื่อง', 22, 32000.00, 704000.00, 'อยู่ระหว่างดำเนินการ', '17 กย.68-10/69', NULL, NULL, 0.00, NULL, 50, NULL),
(137, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10252', 'เครื่องสำรองไฟฟ้า ขนาด 800VA (ข้อที่ 62)', 'เครื่อง', 40, 2500.00, 100000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-63/69', NULL, NULL, 0.00, NULL, 50, NULL),
(138, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10253', 'เครื่องคอมพิวเตอร์ Notebook สำหรับประมวลผล', 'เครื่อง', 3, 24000.00, 72000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(139, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10254', 'เครื่อง Scan', 'เครื่อง', 2, 33000.00, 66000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-64/69', NULL, NULL, 0.00, NULL, 50, NULL),
(140, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10256', 'Switch Hub : USW-Pro-24-POE (400W)', 'เครื่อง', 3, 30000.00, 90000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-65/69', NULL, NULL, 0.00, NULL, 50, NULL),
(141, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10258', 'Module : UACC-OM-SM-10G-S-2', 'ชุด', 3, 8000.00, 24000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-66/69', NULL, NULL, 0.00, NULL, 50, NULL),
(142, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10259', 'Switch Hub : USW-Pro-XG-8-PoE', 'เครื่อง', 1, 30000.00, 30000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-67/69', NULL, NULL, 0.00, NULL, 50, NULL),
(143, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10260', 'Software Gimini', 'หน่วย', 1, 100000.00, 100000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(144, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10261', 'Software Canva', 'หน่วย', 1, 18000.00, 18000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(145, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10262', 'Software AneyDesk 5 License', 'หน่วย', 1, 20000.00, 20000.00, 'ดำเนินการเสร็จสิ้น', '9 ธค.68-68/69', 1, 18190.00, 18190.00, NULL, 100, NULL),
(146, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10263', 'IMILAB EC6 Camera + Memory', 'เครื่อง', 3, 4000.00, 12000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-69/69', NULL, NULL, 0.00, NULL, 50, NULL),
(147, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 13, 'สารสนเทศ', '10264', 'Epson EcoTank L6460', 'เครื่อง', 1, 16000.00, 16000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-70/69', NULL, NULL, 0.00, NULL, 50, NULL),
(148, 'ในแผน', '605', 'ครุภัณฑ์คอมพิวเตอร์', 11, 'จ่ายกลาง', '10334', 'โปรแกรมระบบบริหารการจัดผ้าด้วย RFID Linen Management', 'ระบบ', 1, 150000.00, 150000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(149, 'ในแผน', '603', 'ครุภัณฑ์งานบ้านงานครัว', 54, 'กายภาพ', '10323', 'เครื่องทำน้ำร้อน-เย็น 2 ก๊อก', 'เครื่อง', 1, 7000.00, 7000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(150, 'ในแผน', '603', 'ครุภัณฑ์งานบ้านงานครัว', 20, 'ผู้ป่วยนอก', '10091', 'เครื่องทำน้ำร้อน-เย็น 2 ก๊อก', 'เครื่อง', 1, 7000.00, 7000.00, 'อยู่ระหว่างดำเนินการ', '17 พย.68-27/69', NULL, NULL, 0.00, NULL, 50, NULL),
(151, 'ในแผน', '603', 'ครุภัณฑ์งานบ้านงานครัว', 24, 'ศัลยกรรม', '10185', 'เครื่องทำน้ำร้อน-เย็น 2 ก๊อก', 'เครื่อง', 1, 7000.00, 7000.00, 'อยู่ระหว่างดำเนินการ', '9 มีค.69-152/69', NULL, NULL, 0.00, NULL, 50, NULL),
(152, 'ในแผน', '603', 'ครุภัณฑ์งานบ้านงานครัว', 28, 'สูติกรรม', '10130', 'ตู้เย็นเก็บนม 2 ประตู', 'เครื่อง', 1, 6000.00, 6000.00, 'อยู่ระหว่างดำเนินการ', '23 ธค.68-83/69', NULL, NULL, 0.00, NULL, 50, NULL),
(153, 'ในแผน', '603', 'ครุภัณฑ์งานบ้านงานครัว', 34, 'หอผู้ป่วยหนัก', '10033', 'ตู้เย็นเก็บนม 2 ประตู', 'เครื่อง', 1, 6000.00, 6000.00, 'อยู่ระหว่างดำเนินการ', '9 ธค.68-57/69', NULL, NULL, 0.00, NULL, 50, NULL),
(154, 'ในแผน', '603', 'ครุภัณฑ์งานบ้านงานครัว', 39, 'การเงิน', '10324', 'เตียงพร้อมที่นอน 3.5 ฟุต', 'ชุด', 1, 12000.00, 12000.00, 'อยู่ระหว่างดำเนินการ', '11 พย.68-22/69', NULL, NULL, 0.00, NULL, 50, NULL),
(155, 'ในแผน', '603', 'ครุภัณฑ์งานบ้านงานครัว', 39, 'การเงิน', '10325', 'ตู้ข้างเตียง', 'ตัว', 1, 7000.00, 7000.00, 'อยู่ระหว่างดำเนินการ', '11 พย.68-22/69', NULL, NULL, 0.00, NULL, 50, NULL),
(156, 'ในแผน', '604', 'ครุภัณฑ์ไฟฟ้าและวิทยุ', 68, 'บริหารทั่วไป', '10326', 'กล้องวงจรปิด', 'ตัว', 32, 25000.00, 800000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(157, 'ในแผน', '604', 'ครุภัณฑ์ไฟฟ้าและวิทยุ', 68, 'บริหารทั่วไป', '10327', 'วิทยุสื่อสาร', 'ตัว', 10, 13000.00, 130000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(158, 'ในแผน', '604', 'ครุภัณฑ์ไฟฟ้าและวิทยุ', 68, 'บริหารทั่วไป', '10328', 'ไมค์โครโฟนสำหรับเครื่องวิทยุสื่อสาร', 'ตัว', 2, 2900.00, 5800.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(159, 'ในแผน', '604', 'ครุภัณฑ์ไฟฟ้าและวิทยุ', 68, 'บริหารทั่วไป', '10335', 'ตู้โทรศัพท์', 'ตู้', 1, 1600000.00, 1600000.00, 'อยู่ระหว่างดำเนินการ', '23 ธค.68-82/69', NULL, NULL, 0.00, NULL, 50, NULL),
(160, 'ในแผน', '604', 'ครุภัณฑ์ไฟฟ้าและวิทยุ', 21, 'อุบัติเหตุ', '10168', 'วิทยุพกพามารีนแบน ให้ทีมพยาบาลที่ออกเหตุทะเล', 'ตัว', 1, 50000.00, 50000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(161, 'ในแผน', '604', 'ครุภัณฑ์ไฟฟ้าและวิทยุ', 25, 'พิเศษสมเด็จ', '9999', 'กล่องรับสัญญาณทีวี PSI สมเด็จเกี่ยว3', 'เครื่อง', 3, 3000.00, 9000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(162, 'ในแผน', '604', 'ครุภัณฑ์ไฟฟ้าและวิทยุ', 22, 'เภสัชกรรม', '10329', 'ระบบ interphone สื่อสาร 2 ทาง', 'ตัว', 3, 2000.00, 6000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(163, 'ในแผน', '606', 'ครุภัณฑ์โฆษณาและเผยแพร่', 9, 'โสตทัศนศึกษา', '10330', 'กล้องถ่ายรูป พร้อมเลนส์', 'ตัว', 1, 67000.00, 67000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(164, 'ในแผน', '807', 'ค่าที่ดินและสิ่งปลูกสร้าง', 68, 'บริหารทั่วไป', '10332', 'สร้างโรงเรือน Boiler (หม้อต้มไอน้ำ/น้ำร้อน)', 'งาน', 1, 500000.00, 500000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(165, 'ในแผน', '807', 'ค่าที่ดินและสิ่งปลูกสร้าง', 68, 'บริหารทั่วไป', '10333', 'สร้างโรงเรือนสถานนี้แก๊ส', 'งาน', 1, 200000.00, 200000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(166, 'ในแผน', '807', 'ค่าที่ดินและสิ่งปลูกสร้าง', 68, 'บริหารทั่วไป', '10014', 'ปรับปรุงแฟลต บ้านพักไม้และบ้านพักแพทย์', 'งาน', 1, 400000.00, 400000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(167, 'ในแผน', '807', 'ค่าที่ดินและสิ่งปลูกสร้าง', 22, 'เภสัชกรรม', '10206', 'ปรับปรุงพื้นที่ตรวจรับ', 'งาน', 1, 100000.00, 100000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(168, 'ในแผน', '807', 'ค่าที่ดินและสิ่งปลูกสร้าง', 51, 'พิเศษสงฆ์', '10331', 'ปรับปรุงหอผู้ป่วยพิเศษสงฆ์', 'งาน', 1, 500000.00, 500000.00, 'รอการยืนยันแผน', NULL, NULL, NULL, 0.00, NULL, 15, NULL),
(169, 'นอกแผน', '817', 'จ้างเหมาอื่นๆ', 68, 'บริหาร', '10350', 'งานเดินท่อออกซิเจนเหลวอาคาร Marina Hub พร้อมติดตั้ง', 'งาน', 1, 73081.00, 73081.00, 'อยู่ระหว่างดำเนินการ', '10 พย.69-19/69', NULL, NULL, 0.00, NULL, 50, NULL),
(170, 'นอกแผน', '806', 'ค่าสื่อสารและโทรคมนาคม(เน็ต)', 13, 'สารสนเทศ', '10351', 'ค่าบริการ OTP', 'งาน', 1, 20800.00, 20800.00, 'อยู่ระหว่างดำเนินการ', '11 พย.69-21/69', NULL, NULL, 0.00, NULL, 50, NULL),
(171, 'นอกแผน', '908', 'ซ่อมบำรุงครุภัณฑ์สิ่งก่อสร้าง', 40, 'ทันตกรรม', '10365', 'เพิ่มท่อน้ำทิ้งยูนิตทันตกรรมทั้ง 12 ยุนิตตึกมารีน่า', 'งาน', 1, 160000.00, 160000.00, 'อยู่ระหว่างดำเนินการ', '3 ธค.68-33/69', NULL, NULL, 0.00, NULL, 50, NULL),
(172, 'นอกแผน', '602', 'ครุภัณฑ์สำนักงาน', 39, 'การเงิน', '10415', 'ทีวี 55 นิ้ว', 'เครื่อง', 1, 12490.00, 12490.00, 'อยู่ระหว่างดำเนินการ', '18 ธค.68-76/69', NULL, NULL, 0.00, NULL, 50, NULL),
(173, 'นอกแผน', '817', 'จ้างเหมาอื่นๆ', 13, 'สารสนเทศ', '10416', 'ติดตั้งระบบเครือข่ายอาคาร Marina HUB', 'งาน', 1, 2993900.66, 2993900.66, 'อยู่ระหว่างดำเนินการ', '22 ธค.68-77/69', NULL, NULL, 0.00, NULL, 50, NULL),
(174, 'นอกแผน', '817', 'จ้างเหมาอื่นๆ', 34, 'หอผู้ป่วยหนัก', '10418', 'ติดตั้งระบบน้ำเพื่อใช้ในการฟอกไต', 'งาน', 1, 29120.00, 29120.00, 'อยู่ระหว่างดำเนินการ', '22 ธค.68-81/69', NULL, NULL, 0.00, NULL, 50, NULL);
@@ -0,0 +1,28 @@
<?php
require_once 'config.php';
header('Content-Type: application/json');
$id = $_POST['id'] ?? 0;
$newStatus = $_POST['status'] ?? '';
if ($id && $newStatus) {
// ดึงสถานะเดิม
$stmt = $pdo->prepare("SELECT status FROM procurement_items WHERE id = ?");
$stmt->execute([$id]);
$oldStatus = $stmt->fetchColumn();
$newProgress = getProgressByStatus($newStatus);
// อัปเดตข้อมูล
$update = $pdo->prepare("UPDATE procurement_items SET status = ?, progress = ? WHERE id = ?");
$update->execute([$newStatus, $newProgress, $id]);
// บันทึก Audit Trail
$log = $pdo->prepare("INSERT INTO audit_logs (item_id, user_name, action, old_status, new_status, details) VALUES (?, 'ผู้ใช้งานระบบ', 'เปลี่ยนสถานะผ่าน Kanban', ?, ?, ?)");
$log->execute([$id, $oldStatus, $newStatus, "เปลี่ยนสถานะจาก '$oldStatus' เป็น '$newStatus' (Progress: $newProgress%)"]);
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false]);
}
?>