593 lines
37 KiB
PHP
593 lines
37 KiB
PHP
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
<h1 class="h3 mb-0 text-gray-800">ขออนุมัติเดินทางไปราชการ/ประชุม</h1>
|
|
<a href="<?= BASE_URL ?>/" class="btn btn-outline-secondary shadow-sm"><i class="fa-solid fa-arrow-left me-1"></i> กลับ</a>
|
|
</div>
|
|
|
|
<div class="card shadow border-0 rounded-4 mb-5">
|
|
<div class="card-body p-4 p-md-5">
|
|
<form action="<?= BASE_URL ?>/trip/create" method="POST" id="tripForm">
|
|
<input type="hidden" name="csrf_token" value="<?= $csrf_token ?>">
|
|
|
|
<!-- ส่วนที่ 1: ข้อมูลหนังสือ -->
|
|
<h5 class="fw-bold mb-4 text-primary border-bottom pb-2"><i class="fa-solid fa-file-lines me-2"></i>อ้างถึงหนังสือ</h5>
|
|
<div class="row mb-4">
|
|
<div class="col-md-5 mb-3 mb-md-0">
|
|
<label class="form-label">เลขอ้างอิงหนังสือ</label>
|
|
<div class="input-group">
|
|
<select class="form-select" id="doc_year" style="max-width: 120px;">
|
|
<?php
|
|
$currentYearBE = date('Y') + 543;
|
|
echo '<option value="'.$currentYearBE.'">ปี '.$currentYearBE.'</option>';
|
|
echo '<option value="'.($currentYearBE - 1).'">ปี '.($currentYearBE - 1).'</option>';
|
|
?>
|
|
</select>
|
|
<input type="text" class="form-control" name="doc_number" id="doc_number" placeholder="เลขอ้างอิง (เช่น 123)">
|
|
<button class="btn btn-outline-primary" type="button" id="btnSearchDoc"><i class="fa-solid fa-magnifying-glass"></i> ค้นหา</button>
|
|
</div>
|
|
<div class="form-text text-muted small"><i class="fa-solid fa-circle-info"></i> ระบบจะค้นหาเลขอ้างอิงจากปีที่เลือก</div>
|
|
</div>
|
|
<div class="col-md-4 mb-3 mb-md-0">
|
|
<label class="form-label">เลขที่หนังสือ</label>
|
|
<input type="text" class="form-control" name="doc_no" id="doc_no" placeholder="เช่น ศธ 1234/567">
|
|
</div>
|
|
<div class="col-md-3">
|
|
<label class="form-label">ลงวันที่</label>
|
|
<input type="date" class="form-control" name="doc_date" id="doc_date">
|
|
</div>
|
|
</div>
|
|
|
|
<input type="hidden" name="doc_link" id="doc_link" value="">
|
|
|
|
<!-- ส่วนที่ 2: ข้อมูลการประชุม/ไปราชการ -->
|
|
<h5 class="fw-bold mb-4 text-primary border-bottom pb-2 mt-5"><i class="fa-solid fa-briefcase me-2"></i>รายละเอียดการเดินทาง</h5>
|
|
|
|
<div class="mb-4">
|
|
<label class="form-label text-danger">เรื่อง *</label>
|
|
<input type="text" class="form-control" name="title" id="title" required placeholder="หัวข้อการประชุมหรือเรื่องที่ไปราชการ">
|
|
</div>
|
|
|
|
<div class="row mb-4">
|
|
<div class="col-md-4 mb-3 mb-md-0">
|
|
<label class="form-label">ประเภทบุคลากร</label>
|
|
<select class="form-select" name="personnel_type">
|
|
<option value="ข้าราชการ">ข้าราชการ</option>
|
|
<option value="ลูกจ้างประจำ">ลูกจ้างประจำ</option>
|
|
<option value="พนักงานราชการ">พนักงานราชการ</option>
|
|
<option value="พนักงานกระทรวงฯ">พนักงานกระทรวงฯ</option>
|
|
<option value="ลูกจ้างชั่วคราว">ลูกจ้างชั่วคราว</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-md-4 mb-3 mb-md-0">
|
|
<label class="form-label text-danger">วันที่เริ่มต้น *</label>
|
|
<input type="date" class="form-control" name="start_date" required>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label text-danger">วันที่สิ้นสุด *</label>
|
|
<input type="date" class="form-control" name="end_date" required>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row mb-4">
|
|
<div class="col-md-6 mb-3 mb-md-0">
|
|
<label class="form-label text-danger">สถานที่ *</label>
|
|
<input type="text" class="form-control" name="location" list="locationList" required placeholder="สถานที่จัดงาน / จังหวัด">
|
|
<datalist id="locationList">
|
|
<?php foreach($locations as $loc): ?>
|
|
<option value="<?= htmlspecialchars($loc) ?>">
|
|
<?php endforeach; ?>
|
|
</datalist>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<label class="form-label">ผู้จัด</label>
|
|
<input type="text" class="form-control" name="organizer" list="organizerList" placeholder="ระบุหน่วยงานที่จัด">
|
|
<datalist id="organizerList">
|
|
<?php foreach($organizers as $org): ?>
|
|
<option value="<?= htmlspecialchars($org) ?>">
|
|
<?php endforeach; ?>
|
|
</datalist>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mb-4">
|
|
<label class="form-label text-danger">วัตถุประสงค์ (เหตุผลที่ต้องไป) *</label>
|
|
<textarea class="form-control" name="objective" rows="2" required placeholder="ระบุเหตุผลและวัตถุประสงค์ในการเดินทาง"></textarea>
|
|
</div>
|
|
|
|
<!-- ส่วนที่ 3: กำหนดการเดินทาง (ไป-กลับ) -->
|
|
<h5 class="fw-bold mb-4 text-primary border-bottom pb-2 mt-5"><i class="fa-solid fa-route me-2"></i>กำหนดการเดินทาง</h5>
|
|
|
|
<!-- ขาไป -->
|
|
<div class="card bg-light border-0 mb-4">
|
|
<div class="card-body">
|
|
<h6 class="fw-bold mb-3">โดยเดินทางออกจาก</h6>
|
|
<div class="row g-3">
|
|
<div class="col-md-3">
|
|
<div class="form-check mb-2">
|
|
<input class="form-check-input" type="radio" name="depart_from" id="df1" value="สำนักงาน" checked>
|
|
<label class="form-check-label" for="df1">สำนักงาน</label>
|
|
</div>
|
|
<div class="form-check mb-2">
|
|
<input class="form-check-input" type="radio" name="depart_from" id="df2" value="บ้านพัก">
|
|
<label class="form-check-label" for="df2">บ้านพัก</label>
|
|
</div>
|
|
<div class="form-check mb-2">
|
|
<input class="form-check-input" type="radio" name="depart_from" id="df3" value="อื่นๆ">
|
|
<label class="form-check-label" for="df3">อื่นๆ (ระบุที่อยู่)</label>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-5">
|
|
<label class="form-label small">ประเทศไทย เลขที่ / ตำบล</label>
|
|
<select class="form-select form-select-sm tambon-select" data-target="depart_address">
|
|
<option value="">-- เลือกตำบล --</option>
|
|
<option value="อ่างทอง">อ่างทอง</option>
|
|
<option value="ลิปะน้อย">ลิปะน้อย</option>
|
|
<option value="ตลิ่งงาม">ตลิ่งงาม</option>
|
|
<option value="หน้าเมือง">หน้าเมือง</option>
|
|
<option value="มะเร็ต">มะเร็ต</option>
|
|
<option value="บ่อผุด">บ่อผุด</option>
|
|
<option value="แม่น้ำ">แม่น้ำ</option>
|
|
<option value="อื่นๆ">อื่นๆ (ระบุเอง)</option>
|
|
</select>
|
|
<input type="text" class="form-control form-control-sm mt-2 d-none" name="depart_address" id="depart_address" placeholder="ระบุที่อยู่ / ตำบลที่ต้องการ">
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label small">วันที่และเวลาออกเดินทาง</label>
|
|
<input type="datetime-local" class="form-control form-control-sm" name="depart_datetime">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- ขากลับ -->
|
|
<div class="card bg-light border-0 mb-4">
|
|
<div class="card-body">
|
|
<h6 class="fw-bold mb-3">และกลับถึง</h6>
|
|
<div class="row g-3">
|
|
<div class="col-md-3">
|
|
<div class="form-check mb-2">
|
|
<input class="form-check-input" type="radio" name="arrive_at" id="ar1" value="สำนักงาน" checked>
|
|
<label class="form-check-label" for="ar1">สำนักงาน</label>
|
|
</div>
|
|
<div class="form-check mb-2">
|
|
<input class="form-check-input" type="radio" name="arrive_at" id="ar2" value="บ้านพัก">
|
|
<label class="form-check-label" for="ar2">บ้านพัก</label>
|
|
</div>
|
|
<div class="form-check mb-2">
|
|
<input class="form-check-input" type="radio" name="arrive_at" id="ar3" value="อื่นๆ">
|
|
<label class="form-check-label" for="ar3">อื่นๆ (ระบุที่อยู่)</label>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-5">
|
|
<label class="form-label small">ประเทศไทย เลขที่ / ตำบล</label>
|
|
<select class="form-select form-select-sm tambon-select" data-target="arrive_address">
|
|
<option value="">-- เลือกตำบล --</option>
|
|
<option value="อ่างทอง">อ่างทอง</option>
|
|
<option value="ลิปะน้อย">ลิปะน้อย</option>
|
|
<option value="ตลิ่งงาม">ตลิ่งงาม</option>
|
|
<option value="หน้าเมือง">หน้าเมือง</option>
|
|
<option value="มะเร็ต">มะเร็ต</option>
|
|
<option value="บ่อผุด">บ่อผุด</option>
|
|
<option value="แม่น้ำ">แม่น้ำ</option>
|
|
<option value="อื่นๆ">อื่นๆ (ระบุเอง)</option>
|
|
</select>
|
|
<input type="text" class="form-control form-control-sm mt-2 d-none" name="arrive_address" id="arrive_address" placeholder="ระบุที่อยู่ / ตำบลที่ต้องการ">
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label small">วันที่และเวลากลับถึง</label>
|
|
<input type="datetime-local" class="form-control form-control-sm" name="arrive_datetime">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- ส่วนที่ 4: พาหนะและค่าใช้จ่าย -->
|
|
<h5 class="fw-bold mb-4 text-primary border-bottom pb-2 mt-5"><i class="fa-solid fa-car me-2"></i>พาหนะ และ แหล่งงบประมาณ</h5>
|
|
|
|
<div class="row mb-4">
|
|
<div class="col-md-6 mb-3 mb-md-0">
|
|
<label class="form-label">โดยสารพาหนะ</label>
|
|
<select class="form-select" name="vehicle_type">
|
|
<option value="">-- ระบุพาหนะ --</option>
|
|
<option value="เครื่องบิน">เครื่องบิน</option>
|
|
<option value="รถยนต์ของทางราชการ">รถยนต์ของทางราชการ</option>
|
|
<option value="รถโดยสารประจำทาง">รถโดยสารประจำทาง</option>
|
|
<option value="พาหนะส่วนตัว">พาหนะส่วนตัว</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<label class="form-label">ทะเบียนรถ (กรณีรถส่วนตัว/รถราชการ)</label>
|
|
<input type="text" class="form-control" name="vehicle_plate" placeholder="เช่น กข 1234 สมุย">
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card bg-light border-0 mb-5">
|
|
<div class="card-body">
|
|
<h6 class="fw-bold mb-3">รายละเอียดการเบิกจ่าย</h6>
|
|
<div class="row mb-4">
|
|
<div class="col-md-5 mb-3 mb-md-0">
|
|
<label class="form-label">ขอเบิกค่าใช้จ่ายในการเดินทางจาก</label>
|
|
<select class="form-select" name="budget_source" id="budget_source">
|
|
<option value="เงินบำรุง รพ.">เงินบำรุง รพ.</option>
|
|
<option value="ผู้จัดสนับสนุนทั้งหมด">ผู้จัดสนับสนุนทั้งหมด (ไม่ขอเบิก)</option>
|
|
<option value="ผู้จัดสนับสนุนบางส่วน">ผู้จัดสนับสนุนบางส่วน</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-md-4 mb-3 mb-md-0 d-none" id="organizer_support_container">
|
|
<label class="form-label text-danger">ระบุจำนวนเงินที่สนับสนุน (บาท) *</label>
|
|
<input type="number" step="0.01" min="0" class="form-control" name="organizer_support_amount" id="organizer_support_amount" value="0.00">
|
|
</div>
|
|
<div class="col-md-3">
|
|
<label class="form-label">รายละเอียดเพิ่มเติม (ถ้ามี)</label>
|
|
<input type="text" class="form-control" name="budget_remark" placeholder="เช่น เบิกเฉพาะค่าที่พัก">
|
|
</div>
|
|
</div>
|
|
|
|
<div id="expense_section">
|
|
<h6 class="fw-bold mb-3 border-top pt-3">รูปแบบการประมาณการค่าใช้จ่าย</h6>
|
|
<div class="mb-3">
|
|
<div class="form-check form-check-inline">
|
|
<input class="form-check-input" type="radio" name="budget_type" id="budget_type_lump" value="lump_sum" checked>
|
|
<label class="form-check-label" for="budget_type_lump">แบบประมาณการรวม (กรอกแค่ยอดรวม)</label>
|
|
</div>
|
|
<div class="form-check form-check-inline">
|
|
<input class="form-check-input" type="radio" name="budget_type" id="budget_type_detail" value="detailed">
|
|
<label class="form-check-label" for="budget_type_detail">แบบระบุรายละเอียด</label>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- แบบประมาณการรวม -->
|
|
<div id="lump_sum_container" class="mb-3">
|
|
<label class="form-label">ประมาณการค่าใช้จ่ายรวม (บาท)</label>
|
|
<div class="input-group" style="max-width: 300px;">
|
|
<span class="input-group-text">฿</span>
|
|
<input type="number" step="0.01" min="0" class="form-control calc-total" name="budget" id="budget_lump_sum" value="0.00">
|
|
</div>
|
|
</div>
|
|
|
|
<!-- แบบระบุรายละเอียด -->
|
|
<div id="detailed_expense_container" class="d-none">
|
|
<div class="row">
|
|
<!-- ค่าที่พัก -->
|
|
<div class="col-12 mb-3">
|
|
<div class="d-flex justify-content-between align-items-center mb-2">
|
|
<label class="form-label mb-0 fw-bold"><i class="fa-solid fa-bed me-1"></i> ค่าที่พัก</label>
|
|
<button type="button" class="btn btn-sm btn-outline-primary" id="add_accommodation"><i class="fa-solid fa-plus"></i> เพิ่มที่พัก</button>
|
|
</div>
|
|
<div id="accommodations_list">
|
|
<!-- Items will be generated here -->
|
|
<div class="row g-2 align-items-center mb-2 accommodation-item">
|
|
<div class="col-md-5">
|
|
<div class="input-group input-group-sm">
|
|
<span class="input-group-text">จำนวนคืน</span>
|
|
<input type="number" min="0" step="1" name="acc_days[]" class="form-control acc-days calc-trigger" placeholder="0">
|
|
</div>
|
|
</div>
|
|
<div class="col-md-5">
|
|
<div class="input-group input-group-sm">
|
|
<span class="input-group-text">ราคา/คืน</span>
|
|
<input type="number" min="0" step="0.01" name="acc_prices[]" class="form-control acc-prices calc-trigger" placeholder="0.00">
|
|
<span class="input-group-text">บาท</span>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-2 text-end">
|
|
<button type="button" class="btn btn-sm btn-outline-danger btn-remove-row" disabled><i class="fa-solid fa-trash"></i></button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- ค่าเบี้ยเลี้ยง -->
|
|
<div class="col-12 mb-3">
|
|
<div class="d-flex justify-content-between align-items-center mb-2">
|
|
<label class="form-label mb-0 fw-bold"><i class="fa-solid fa-utensils me-1"></i> ค่าเบี้ยเลี้ยง</label>
|
|
<button type="button" class="btn btn-sm btn-outline-primary" id="add_allowance"><i class="fa-solid fa-plus"></i> เพิ่มเบี้ยเลี้ยง</button>
|
|
</div>
|
|
<div id="allowances_list">
|
|
<!-- Items will be generated here -->
|
|
<div class="row g-2 align-items-center mb-2 allowance-item">
|
|
<div class="col-md-5">
|
|
<div class="input-group input-group-sm">
|
|
<span class="input-group-text">จำนวนวัน</span>
|
|
<input type="number" min="0" step="0.5" name="alw_days[]" class="form-control alw-days calc-trigger" placeholder="0">
|
|
</div>
|
|
</div>
|
|
<div class="col-md-5">
|
|
<div class="input-group input-group-sm">
|
|
<span class="input-group-text">อัตรา/วัน</span>
|
|
<input type="number" min="0" step="0.01" name="alw_prices[]" class="form-control alw-prices calc-trigger" placeholder="0.00">
|
|
<span class="input-group-text">บาท</span>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-2 text-end">
|
|
<button type="button" class="btn btn-sm btn-outline-danger btn-remove-row" disabled><i class="fa-solid fa-trash"></i></button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- ค่าโดยสารและค่าลงทะเบียน -->
|
|
<div class="col-md-6 mb-3">
|
|
<label class="form-label fw-bold"><i class="fa-solid fa-ticket me-1"></i> ค่าโดยสารทั้งหมด</label>
|
|
<div class="input-group input-group-sm">
|
|
<input type="number" min="0" step="0.01" name="expense_transport" id="expense_transport" class="form-control calc-trigger" placeholder="0.00">
|
|
<span class="input-group-text">บาท</span>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6 mb-3">
|
|
<label class="form-label fw-bold"><i class="fa-solid fa-address-card me-1"></i> ค่าลงทะเบียน</label>
|
|
<div class="input-group input-group-sm">
|
|
<input type="number" min="0" step="0.01" name="expense_registration" id="expense_registration" class="form-control calc-trigger" placeholder="0.00">
|
|
<span class="input-group-text">บาท</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- สรุปยอดรวม -->
|
|
<div class="col-12 mt-3 pt-3 border-top">
|
|
<div class="d-flex justify-content-end align-items-center">
|
|
<h5 class="mb-0 me-3">รวมเป็นเงินทั้งสิ้น:</h5>
|
|
<h4 class="mb-0 text-primary fw-bold" id="detailed_total_display">0.00</h4>
|
|
<span class="ms-2">บาท</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="text-end border-top pt-4">
|
|
<button type="reset" class="btn btn-light me-2 px-4">ล้างข้อมูล</button>
|
|
<button type="submit" class="btn btn-primary px-5 shadow"><i class="fa-solid fa-paper-plane me-1"></i> เสนอขออนุมัติ</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<?php
|
|
$extraScripts = '
|
|
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
|
|
<script>
|
|
// ฟังก์ชันแปลงวันที่รูปแบบไทย/ทั่วไป เป็น YYYY-MM-DD สำหรับ input[type="date"]
|
|
function parseDateToInputFormat(dateStr) {
|
|
if (!dateStr) return "";
|
|
// ถ้ามาเป็น YYYY-MM-DD อยู่แล้วก็คืนค่าได้เลย
|
|
if (/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) return dateStr;
|
|
|
|
// ลองแยกด้วย / หรือ -
|
|
var parts = dateStr.split(/[\/\-]/);
|
|
if (parts.length === 3) {
|
|
var d = parseInt(parts[0], 10);
|
|
var m = parseInt(parts[1], 10);
|
|
var y = parseInt(parts[2], 10);
|
|
|
|
// ถ้าปีเป็น 25xx ให้แปลงเป็น ค.ศ.
|
|
if (y > 2400) y -= 543;
|
|
// ถ้าปีมาแค่ 2 หลัก (เช่น 66) ถือว่าเป็น 2566
|
|
else if (y > 50 && y < 100) y = (y + 2500) - 543;
|
|
// ถ้า d > 31 แสดงว่ามาในรูปแบบ YYYY/MM/DD
|
|
if (d > 31) {
|
|
var temp = d;
|
|
d = y;
|
|
y = temp;
|
|
}
|
|
|
|
var mm = m < 10 ? "0" + m : m;
|
|
var dd = d < 10 ? "0" + d : d;
|
|
return y + "-" + mm + "-" + dd;
|
|
}
|
|
return ""; // ถ้าแปลงไม่ได้
|
|
}
|
|
|
|
$(document).ready(function() {
|
|
// จัดการ Select ตำบลเกาะสมุย
|
|
$(".tambon-select").on("change", function() {
|
|
var targetId = $(this).data("target");
|
|
var val = $(this).val();
|
|
|
|
if (val === "อื่นๆ") {
|
|
$("#" + targetId).removeClass("d-none").val("").focus();
|
|
} else {
|
|
$("#" + targetId).addClass("d-none").val(val);
|
|
}
|
|
});
|
|
|
|
$("#btnSearchDoc").on("click", function() {
|
|
var q = $("#doc_number").val().trim();
|
|
var year = $("#doc_year").val();
|
|
if (!q) {
|
|
Swal.fire("กรุณาระบุ", "โปรดกรอกเลขที่หนังสือที่ต้องการค้นหา", "warning");
|
|
return;
|
|
}
|
|
|
|
var btn = $(this);
|
|
var originalHtml = btn.html();
|
|
btn.html(\'<i class="fa-solid fa-spinner fa-spin"></i>\').prop("disabled", true);
|
|
|
|
$.ajax({
|
|
url: "' . BASE_URL . '/trip/search-docs",
|
|
type: "GET",
|
|
dataType: "json",
|
|
data: { q: q, year: year },
|
|
success: function(res) {
|
|
btn.html(originalHtml).prop("disabled", false);
|
|
|
|
if (res.results && res.results.length > 0) {
|
|
// ดึงรายการแรกที่ตรงที่สุด
|
|
var data = res.results[0];
|
|
|
|
if (data.title) {
|
|
$("#title").val(data.title);
|
|
$("#title").addClass("is-valid");
|
|
setTimeout(() => $("#title").removeClass("is-valid"), 2000);
|
|
}
|
|
if (data.doc_no) {
|
|
$("#doc_no").val(data.doc_no);
|
|
$("#doc_no").addClass("is-valid");
|
|
setTimeout(() => $("#doc_no").removeClass("is-valid"), 2000);
|
|
}
|
|
if (data.doc_link) {
|
|
$("#doc_link").val(data.doc_link);
|
|
}
|
|
if (data.doc_date) {
|
|
var parsedDate = parseDateToInputFormat(data.doc_date);
|
|
if (parsedDate) {
|
|
$("#doc_date").val(parsedDate);
|
|
$("#doc_date").addClass("is-valid");
|
|
setTimeout(() => $("#doc_date").removeClass("is-valid"), 2000);
|
|
} else {
|
|
// ถ้าแปลงอัตโนมัติไม่ได้
|
|
Swal.fire("แจ้งเตือน", "ดึงวันที่ได้คือ \'" + data.doc_date + "\' แต่ระบบไม่สามารถจัดรูปแบบอัตโนมัติได้ กรุณาเลือกวันที่ด้วยตนเอง", "info");
|
|
}
|
|
}
|
|
|
|
Swal.fire({
|
|
icon: "success",
|
|
title: "ดึงข้อมูลสำเร็จ",
|
|
text: "พบหนังสือเรื่อง: " + (data.title || "-"),
|
|
timer: 1500,
|
|
showConfirmButton: false
|
|
});
|
|
} else {
|
|
Swal.fire("ไม่พบข้อมูล", "ไม่พบเลขที่หนังสือ \'" + q + "\' ในระบบ", "error");
|
|
}
|
|
},
|
|
error: function() {
|
|
btn.html(originalHtml).prop("disabled", false);
|
|
Swal.fire("เกิดข้อผิดพลาด", "ไม่สามารถเชื่อมต่อระบบค้นหาได้", "error");
|
|
}
|
|
});
|
|
});
|
|
|
|
// --- Expense Logic ---
|
|
function toggleExpenseUI() {
|
|
var budgetSource = $("#budget_source").val();
|
|
if (budgetSource === "ผู้จัดสนับสนุนบางส่วน") {
|
|
$("#organizer_support_container").removeClass("d-none");
|
|
} else {
|
|
$("#organizer_support_container").addClass("d-none");
|
|
$("#organizer_support_amount").val("0.00");
|
|
}
|
|
|
|
if (budgetSource === "ผู้จัดสนับสนุนทั้งหมด") {
|
|
$("#expense_section").addClass("d-none");
|
|
// clear budgets
|
|
$("#budget_lump_sum").val("0.00");
|
|
} else {
|
|
$("#expense_section").removeClass("d-none");
|
|
var budgetType = $("input[name=\'budget_type\']:checked").val();
|
|
if (budgetType === "detailed") {
|
|
$("#lump_sum_container").addClass("d-none");
|
|
$("#detailed_expense_container").removeClass("d-none");
|
|
calculateDetailedTotal();
|
|
} else {
|
|
$("#lump_sum_container").removeClass("d-none");
|
|
$("#detailed_expense_container").addClass("d-none");
|
|
}
|
|
}
|
|
}
|
|
|
|
$("#budget_source, input[name=\'budget_type\']").on("change", toggleExpenseUI);
|
|
|
|
// Add Row functions
|
|
$("#add_accommodation").click(function() {
|
|
var template = `
|
|
<div class="row g-2 align-items-center mb-2 accommodation-item">
|
|
<div class="col-md-5">
|
|
<div class="input-group input-group-sm">
|
|
<span class="input-group-text">จำนวนคืน</span>
|
|
<input type="number" min="0" step="1" name="acc_days[]" class="form-control acc-days calc-trigger" placeholder="0">
|
|
</div>
|
|
</div>
|
|
<div class="col-md-5">
|
|
<div class="input-group input-group-sm">
|
|
<span class="input-group-text">ราคา/คืน</span>
|
|
<input type="number" min="0" step="0.01" name="acc_prices[]" class="form-control acc-prices calc-trigger" placeholder="0.00">
|
|
<span class="input-group-text">บาท</span>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-2 text-end">
|
|
<button type="button" class="btn btn-sm btn-outline-danger btn-remove-row"><i class="fa-solid fa-trash"></i></button>
|
|
</div>
|
|
</div>`;
|
|
$("#accommodations_list").append(template);
|
|
updateRemoveButtons("#accommodations_list");
|
|
});
|
|
|
|
$("#add_allowance").click(function() {
|
|
var template = `
|
|
<div class="row g-2 align-items-center mb-2 allowance-item">
|
|
<div class="col-md-5">
|
|
<div class="input-group input-group-sm">
|
|
<span class="input-group-text">จำนวนวัน</span>
|
|
<input type="number" min="0" step="0.5" name="alw_days[]" class="form-control alw-days calc-trigger" placeholder="0">
|
|
</div>
|
|
</div>
|
|
<div class="col-md-5">
|
|
<div class="input-group input-group-sm">
|
|
<span class="input-group-text">อัตรา/วัน</span>
|
|
<input type="number" min="0" step="0.01" name="alw_prices[]" class="form-control alw-prices calc-trigger" placeholder="0.00">
|
|
<span class="input-group-text">บาท</span>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-2 text-end">
|
|
<button type="button" class="btn btn-sm btn-outline-danger btn-remove-row"><i class="fa-solid fa-trash"></i></button>
|
|
</div>
|
|
</div>`;
|
|
$("#allowances_list").append(template);
|
|
updateRemoveButtons("#allowances_list");
|
|
});
|
|
|
|
function updateRemoveButtons(listId) {
|
|
var items = $(listId).find(".btn-remove-row");
|
|
if (items.length > 1) {
|
|
items.prop("disabled", false);
|
|
} else {
|
|
items.prop("disabled", true);
|
|
}
|
|
}
|
|
|
|
$(document).on("click", ".btn-remove-row", function() {
|
|
var list = $(this).closest("div[id$=\'_list\']");
|
|
$(this).closest(".row").remove();
|
|
updateRemoveButtons("#" + list.attr("id"));
|
|
calculateDetailedTotal();
|
|
});
|
|
|
|
function calculateDetailedTotal() {
|
|
var total = 0;
|
|
// Accommodations
|
|
$(".accommodation-item").each(function() {
|
|
var days = parseFloat($(this).find(".acc-days").val()) || 0;
|
|
var price = parseFloat($(this).find(".acc-prices").val()) || 0;
|
|
total += (days * price);
|
|
});
|
|
// Allowances
|
|
$(".allowance-item").each(function() {
|
|
var days = parseFloat($(this).find(".alw-days").val()) || 0;
|
|
var price = parseFloat($(this).find(".alw-prices").val()) || 0;
|
|
total += (days * price);
|
|
});
|
|
// Transport
|
|
var transport = parseFloat($("#expense_transport").val()) || 0;
|
|
total += transport;
|
|
|
|
// Registration
|
|
var registration = parseFloat($("#expense_registration").val()) || 0;
|
|
total += registration;
|
|
|
|
$("#detailed_total_display").text(total.toLocaleString("en-US", {minimumFractionDigits: 2, maximumFractionDigits: 2}));
|
|
|
|
// Also sync it to budget_lump_sum so the backend can just read \'budget\'
|
|
$("#budget_lump_sum").val(total.toFixed(2));
|
|
}
|
|
|
|
$(document).on("input", ".calc-trigger", calculateDetailedTotal);
|
|
|
|
// Initial setup
|
|
toggleExpenseUI();
|
|
});
|
|
</script>
|
|
';
|
|
$extraStyles = '';
|
|
?>
|