Database Schema Design
ระบบการเงิน (Financial Management System)
โรงพยาบาลค่ายธนรัชน์
เอกสารเลขที่: SRS-1.2.14-SCHEMA
เวอร์ชัน: 1.0
วันที่: 8 ตุลาคม 2568
ผู้จัดทำ: ทีมพัฒนาระบบ
ผู้อนุมัติ: ผู้อำนวยการโรงพยาบาลค่ายธนรัชน์
การปรับปรุง: ใหม่ - ครอบคลุมการจัดการการเงินและการชำระเงินครบวงจร
Database Schema Design
ระบบการเงินเป็นระบบที่ทำหน้าที่เป็นศูนย์กลางการจัดการการเงิน การรับชำระเงิน การออกใบเสร็จ และการบริหารจัดการสิทธิการรักษาพยาบาลทางการเงิน โดยเชื่อมโยงกับระบบอื่นผ่าน API Integration:
- ระบบเวชระเบียน (1.2.1): การดึงข้อมูลผู้ป่วยและการเข้ารับบริการ
- ระบบตรวจสอบสิทธิ (1.2.15): การตรวจสอบและยืนยันสิทธิการรักษา
- ระบบห้องตรวจแพทย์ (1.2.3): การรับค่าบริการจากการตรวจรักษา
- ระบบเภสัชกรรม (1.2.13): การคิดค่ายาและเวชภัณฑ์
- ระบบผู้ป่วยใน (1.2.17): การคิดค่าห้องและค่ารักษาผู้ป่วยใน
- ระบบห้องฉุกเฉิน (1.2.4): การรับชำระค่าบริการฉุกเฉิน
8.2.1 ตารางหลัก (Core Tables)
8.2.1.1 ข้อมูลสิทธิการรักษาทางการเงิน
Table: FINANCIAL_RIGHTS (สิทธิการรักษาพยาบาล)
วัตถุประสงค์: เก็บข้อมูลสิทธิการรักษาพยาบาลทางการเงิน รวมถึงการกำหนดผังการคิดค่าบริการและส่วนลดตามสิทธิ
| Field | Type | Key | Description |
|---|---|---|---|
| RightID | VARCHAR(10) | PK | รหัสสิทธิการรักษา |
| RightName | NVARCHAR(100) | ชื่อสิทธิการรักษา | |
| RightDescription | NTEXT | คำอธิบายสิทธิ | |
| PaymentTypeCode | VARCHAR(10) | FK | ประเภทการชำระเงิน (อ้างอิง PAYMENT_TYPE) |
| NHSO_Code | VARCHAR(10) | รหัสสิทธิ สนย. (43 แฟ้ม) | |
| NHSO_StandardName | NVARCHAR(100) | ชื่อสิทธิมาตรฐาน สปสช. | |
| CopaymentAmount | DECIMAL(10,2) | ค่าธรรมเนียมสิทธิที่ต้องชำระเอง | |
| PaymentMethod | ENUM('FEE_FOR_SERVICE','DRG','GLOBAL_BUDGET','CAPITATION','MIXED') | วิธีการคิดค่าบริการ | |
| IsActive | BIT | ใช้งานได้ | |
| EffectiveDate | DATE | วันที่เริ่มใช้ | |
| ExpiryDate | DATE | วันที่หมดอายุ | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง | |
| LastModified | DATETIME | วันที่แก้ไขล่าสุด | |
| ModifiedBy | VARCHAR(50) | ผู้แก้ไขล่าสุด |
Table: PAYMENT_CHART (ผังการคิดค่าบริการ)
วัตถุประสงค์: กำหนดสูตรการคำนวณค่าบริการสำหรับแต่ละสิทธิและหมวดค่ารักษา
| Field | Type | Key | Description |
|---|---|---|---|
| ChartID | VARCHAR(20) | PK | รหัสผังการคิด |
| RightID | VARCHAR(10) | FK | รหัสสิทธิการรักษา |
| CategoryCode | VARCHAR(10) | FK | รหัสหมวดค่ารักษา |
| CalculationMethod | ENUM('PERCENTAGE','FIXED_AMOUNT','FORMULA','EXEMPTION') | วิธีการคำนวณ | |
| DiscountPercent | DECIMAL(5,2) | เปอร์เซ็นต์ส่วนลด (0-100) | |
| FixedAmount | DECIMAL(10,2) | จำนวนเงินคงที่ | |
| CalculationFormula | TEXT | สูตรการคำนวณ (สำหรับกรณีซับซ้อน) | |
| MinimumAmount | DECIMAL(10,2) | จำนวนเงินขั้นต่ำ | |
| MaximumAmount | DECIMAL(10,2) | จำนวนเงินสูงสุด | |
| RoundingRule | ENUM('ROUND_UP','ROUND_DOWN','ROUND_NEAREST') | กฎการปัดเศษ | |
| TaxIncluded | BIT | รวมภาษีแล้ว | |
| EffectiveDate | DATE | วันที่เริ่มใช้ | |
| ExpiryDate | DATE | วันที่หมดอายุ | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
Table: FINANCIAL_CATEGORY (หมวดค่ารักษาพยาบาล)
วัตถุประสงค์: จัดประเภทค่าใช้จ่ายทางการแพทย์ทั้ง OPD และ IPD
| Field | Type | Key | Description |
|---|---|---|---|
| CategoryCode | VARCHAR(10) | PK | รหัสหมวดค่ารักษา |
| CategoryName | NVARCHAR(100) | ชื่อหมวดค่ารักษา | |
| CategoryType | ENUM('OPD','IPD','BOTH') | ประเภทการใช้งาน | |
| ParentCategoryCode | VARCHAR(10) | FK | หมวดหลัก (สำหรับหมวดย่อย) |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IsChargeable | BIT | คิดค่าบริการได้ | |
| IsActive | BIT | ใช้งานได้ | |
| Description | NTEXT | คำอธิบาย | |
| NHSO_CategoryCode | VARCHAR(10) | รหัสหมวดตาม สปสช. | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
Table: DISCOUNT_TYPE (ประเภทส่วนลด)
วัตถุประสงค์: กำหนดประเภทการลดหย่อนและยกเว้นค่ารักษาพยาบาล
| Field | Type | Key | Description |
|---|---|---|---|
| DiscountTypeCode | VARCHAR(10) | PK | รหัสประเภทส่วนลด |
| DiscountTypeName | NVARCHAR(100) | ชื่อประเภทส่วนลด | |
| DiscountCategory | ENUM('DISCOUNT','EXEMPTION','SPECIAL') | หมวดการลด | |
| CalculationMethod | ENUM('PERCENTAGE','FIXED_AMOUNT','FULL_EXEMPTION') | วิธีการคำนวณ | |
| DefaultPercent | DECIMAL(5,2) | เปอร์เซ็นต์เริ่มต้น | |
| DefaultAmount | DECIMAL(10,2) | จำนวนเงินเริ่มต้น | |
| MaxDiscountPercent | DECIMAL(5,2) | เปอร์เซ็นต์สูงสุด | |
| MaxDiscountAmount | DECIMAL(10,2) | จำนวนเงินสูงสุด | |
| RequiresApproval | BIT | ต้องขออนุมัติ | |
| ApprovalLevel | INT | ระดับการอนุมัติ | |
| IsActive | BIT | ใช้งานได้ | |
| Description | NTEXT | คำอธิบาย | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
8.2.1.2 ข้อมูลการรับชำระเงิน
Table: PAYMENT_TRANSACTION (รายการการรับชำระเงิน)
วัตถุประสงค์: ตารางหลักที่เก็บข้อมูลการรับชำระเงินทุกรายการ รองรับการชำระหลายสิทธิและหลายรูปแบบ
| Field | Type | Key | Description |
|---|---|---|---|
| PaymentID | VARCHAR(20) | PK | รหัสการรับชำระเงิน (AUTO) |
| HN | VARCHAR(10) | FK | หมายเลขผู้ป่วย (อ้างอิง PATIENT) |
| AN | VARCHAR(15) | FK | หมายเลขผู้ป่วยใน (สำหรับ IPD) |
| VisitID | VARCHAR(20) | FK | รหัสการเข้ารับบริการ (อ้างอิง VISIT) |
| PaymentDate | DATE | วันที่รับชำระเงิน | |
| PaymentTime | TIME | เวลาที่รับชำระเงิน | |
| TotalAmount | DECIMAL(10,2) | ยอดรวมทั้งหมด | |
| DiscountAmount | DECIMAL(10,2) | ยอดส่วนลด | |
| ExemptionAmount | DECIMAL(10,2) | ยอดยกเว้น | |
| Copayment | DECIMAL(10,2) | ยอดที่ผู้ป่วยต้องจ่าย | |
| RightsAmount | DECIMAL(10,2) | ยอดที่สิทธิจ่าย | |
| PaidAmount | DECIMAL(10,2) | ยอดที่ได้รับชำระ | |
| ChangeAmount | DECIMAL(10,2) | เงินทอน | |
| PaymentStatus | ENUM('PAID','PENDING','CANCELLED','PARTIAL') | สถานะการชำระ | |
| PatientType | ENUM('OPD','IPD','ER','CHECKUP') | ประเภทผู้ป่วย | |
| CashierID | VARCHAR(10) | FK | รหัสเจ้าหน้าที่การเงิน |
| TerminalID | VARCHAR(10) | FK | รหัสจุดรับชำระเงิน |
| Remarks | TEXT | หมายเหตุ | |
| CreatedAt | TIMESTAMP | วันเวลาที่สร้าง | |
| UpdatedAt | TIMESTAMP | วันเวลาที่แก้ไขล่าสุด |
Table: PAYMENT_METHOD (วิธีการชำระเงิน)
วัตถุประสงค์: เก็บข้อมูลวิธีการชำระเงินในแต่ละรายการ รองรับการชำระแบบผสมผสาน
| Field | Type | Key | Description |
|---|---|---|---|
| PaymentMethodID | VARCHAR(20) | PK | รหัสวิธีการชำระ |
| PaymentID | VARCHAR(20) | FK | รหัสการรับชำระเงิน |
| MethodType | ENUM('CASH','CARD','TRANSFER','QR','DEPOSIT','RIGHTS') | ประเภทการชำระ | |
| Amount | DECIMAL(10,2) | จำนวนเงิน | |
| SequenceNo | INT | ลำดับที่ (สำหรับการชำระแบบผสม) | |
| ReferenceNumber | VARCHAR(50) | หมายเลขอ้างอิง | |
| BankCode | VARCHAR(10) | รหัสธนาคาร | |
| CardNumber | VARCHAR(20) | หมายเลขบัตร (4 หลักสุดท้าย) | |
| ApprovalCode | VARCHAR(20) | รหัสอนุมัติ | |
| TerminalID | VARCHAR(20) | หมายเลขเครื่อง EDC | |
| SlipNumber | VARCHAR(30) | หมายเลขสลิป | |
| ProcessedDate | DATETIME | วันเวลาที่ประมวลผล | |
| CreatedAt | TIMESTAMP | วันเวลาที่สร้าง |
Table: PAYMENT_DETAIL (รายละเอียดการชำระเงิน)
วัตถุประสงค์: เก็บรายละเอียดการชำระเงินแยกตามหมวดค่ารักษาและบริการ
| Field | Type | Key | Description |
|---|---|---|---|
| PaymentDetailID | VARCHAR(20) | PK | รหัสรายละเอียดการชำระ |
| PaymentID | VARCHAR(20) | FK | รหัสการรับชำระเงิน |
| CategoryCode | VARCHAR(10) | FK | รหัสหมวดค่ารักษา |
| ServiceCode | VARCHAR(20) | รหัสบริการ | |
| ServiceName | VARCHAR(200) | ชื่อบริการ | |
| Quantity | DECIMAL(8,2) | จำนวน | |
| UnitPrice | DECIMAL(10,2) | ราคาต่อหน่วย | |
| TotalPrice | DECIMAL(10,2) | ราคารวม | |
| DiscountPercent | DECIMAL(5,2) | เปอร์เซ็นต์ส่วนลด | |
| DiscountAmount | DECIMAL(10,2) | จำนวนเงินส่วนลด | |
| NetAmount | DECIMAL(10,2) | ราคาสุทธิ | |
| DepartmentCode | VARCHAR(10) | รหัสแผนก | |
| ServiceDate | DATE | วันที่ให้บริการ | |
| RightID | VARCHAR(10) | FK | รหัสสิทธิที่ใช้ |
| CreatedAt | TIMESTAMP | วันเวลาที่สร้าง |
8.2.1.3 ข้อมูลใบเสร็จและเอกสารทางการเงิน
Table: RECEIPT (ใบเสร็จรับเงิน)
วัตถุประสงค์: เก็บข้อมูลใบเสร็จรับเงิน รองรับการออกใบเสร็จหลายภาษาและหลายรูปแบบ
| Field | Type | Key | Description |
|---|---|---|---|
| ReceiptID | VARCHAR(20) | PK | รหัสใบเสร็จ |
| ReceiptNumber | VARCHAR(30) | UK | เลขที่ใบเสร็จ (เรียงตามรูปแบบที่กำหนด) |
| PaymentID | VARCHAR(20) | FK | รหัสการรับชำระเงิน |
| ReceiptDate | DATE | วันที่ออกใบเสร็จ | |
| ReceiptTime | TIME | เวลาที่ออกใบเสร็จ | |
| ReceiptType | ENUM('ORIGINAL','COPY','REPRINT') | ประเภทใบเสร็จ | |
| PrintCount | INT | จำนวนครั้งที่พิมพ์ | |
| FormatType | VARCHAR(20) | FK | รูปแบบใบเสร็จ (อ้างอิง RECEIPT_FORMAT) |
| Language | ENUM('TH','EN') | ภาษาใบเสร็จ | |
| IsCancelled | BIT | สถานะยกเลิก | |
| CancelledDate | TIMESTAMP | วันเวลาที่ยกเลิก | |
| CancelledBy | VARCHAR(10) | FK | ผู้ยกเลิก |
| CancelReason | TEXT | เหตุผลการยกเลิก | |
| NewReceiptID | VARCHAR(20) | FK | รหัสใบเสร็จใหม่ (กรณีแก้ไข) |
| PrinterID | VARCHAR(20) | รหัสเครื่องพิมพ์ | |
| CreatedAt | TIMESTAMP | วันเวลาที่สร้าง |
Table: INVOICE (ใบแจ้งหนี้)
วัตถุประสงค์: เก็บข้อมูลใบแจ้งหนี้สำหรับการเรียกเก็บเงินจากสิทธิการรักษาและผู้ป่วย
| Field | Type | Key | Description |
|---|---|---|---|
| InvoiceID | VARCHAR(20) | PK | รหัสใบแจ้งหนี้ |
| InvoiceNumber | VARCHAR(30) | UK | เลขที่ใบแจ้งหนี้ |
| HN | VARCHAR(10) | FK | หมายเลขผู้ป่วย |
| AN | VARCHAR(15) | FK | หมายเลขผู้ป่วยใน |
| InvoiceDate | DATE | วันที่ออกใบแจ้งหนี้ | |
| DueDate | DATE | วันที่ครบกำหนด | |
| InvoiceType | ENUM('OPD','IPD','RIGHTS','INSURANCE') | ประเภทใบแจ้งหนี้ | |
| BillToType | ENUM('PATIENT','RIGHTS','INSURANCE') | ผู้รับบิล | |
| BillToCode | VARCHAR(20) | รหัสผู้รับบิล | |
| BillToName | VARCHAR(200) | ชื่อผู้รับบิล | |
| TotalAmount | DECIMAL(10,2) | ยอดรวม | |
| PaidAmount | DECIMAL(10,2) | ยอดที่ชำระแล้ว | |
| BalanceAmount | DECIMAL(10,2) | ยอดคงเหลือ | |
| InvoiceStatus | ENUM('PENDING','SENT','PAID','OVERDUE','CANCELLED') | สถานะใบแจ้งหนี้ | |
| Language | ENUM('TH','EN') | ภาษาใบแจ้งหนี้ | |
| CreatedBy | VARCHAR(10) | FK | ผู้สร้าง |
| CreatedAt | TIMESTAMP | วันเวลาที่สร้าง |
Table: RECEIPT_FORMAT (รูปแบบใบเสร็จ)
วัตถุประสงค์: กำหนดรูปแบบการพิมพ์ใบเสร็จตามที่แต่ละสถานพยาบาลกำหนด
| Field | Type | Key | Description |
|---|---|---|---|
| FormatID | VARCHAR(20) | PK | รหัสรูปแบบ |
| FormatName | NVARCHAR(100) | ชื่อรูปแบบ | |
| FormatType | ENUM('STANDARD','THERMAL','A4','CUSTOM') | ประเภทรูปแบบ | |
| PaperSize | VARCHAR(20) | ขนาดกระดาษ | |
| HeaderTemplate | TEXT | แม่แบบส่วนหัว | |
| BodyTemplate | TEXT | แม่แบบเนื้อหา | |
| FooterTemplate | TEXT | แม่แบบส่วนท้าย | |
| LogoPath | VARCHAR(255) | ที่อยู่โลโก้ | |
| IsDefault | BIT | รูปแบบเริ่มต้น | |
| IsActive | BIT | ใช้งานได้ | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
8.2.1.4 ข้อมูลเงินรับฝากและค้างชำระ
Table: DEPOSIT_TRANSACTION (รายการเงินรับฝาก)
วัตถุประสงค์: เก็บข้อมูลการทำรายการเงินรับฝาก การฝาก-ถอน-คืนเงิน
| Field | Type | Key | Description |
|---|---|---|---|
| DepositTransactionID | VARCHAR(20) | PK | รหัสรายการเงินรับฝาก |
| HN | VARCHAR(10) | FK | หมายเลขผู้ป่วย |
| AN | VARCHAR(15) | FK | หมายเลขผู้ป่วยใน |
| TransactionType | ENUM('DEPOSIT','WITHDRAW','REFUND','TRANSFER') | ประเภทรายการ | |
| Amount | DECIMAL(10,2) | จำนวนเงิน | |
| BalanceBefore | DECIMAL(10,2) | ยอดคงเหลือก่อนทำรายการ | |
| BalanceAfter | DECIMAL(10,2) | ยอดคงเหลือหลังทำรายการ | |
| DepositDate | DATE | วันที่ทำรายการ | |
| DepositTime | TIME | เวลาที่ทำรายการ | |
| DepositorName | VARCHAR(200) | ชื่อผู้ฝากเงิน | |
| PaymentMethod | ENUM('CASH','TRANSFER','CARD') | วิธีการชำระ | |
| ReferenceNumber | VARCHAR(50) | หมายเลขอ้างอิง | |
| ReceiptNumber | VARCHAR(30) | เลขที่ใบรับฝากเงิน | |
| Remarks | TEXT | หมายเหตุ | |
| CashierID | VARCHAR(10) | FK | รหัสเจ้าหน้าที่ |
| TerminalID | VARCHAR(10) | FK | รหัสจุดรับชำระเงิน |
| RelatedPaymentID | VARCHAR(20) | FK | รหัสการชำระที่เกี่ยวข้อง |
| CreatedAt | TIMESTAMP | วันเวลาที่สร้าง |
Table: OUTSTANDING_BALANCE (ยอดค้างชำระ)
วัตถุประสงค์: เก็บข้อมูลยอดค้างชำระของผู้ป่วย พร้อมระบบแจ้งเตือน
| Field | Type | Key | Description |
|---|---|---|---|
| OutstandingID | VARCHAR(20) | PK | รหัสยอดค้างชำระ |
| HN | VARCHAR(10) | FK | หมายเลขผู้ป่วย |
| VisitID | VARCHAR(20) | FK | รหัสการเข้ารับบริการ |
| AN | VARCHAR(15) | FK | หมายเลขผู้ป่วยใน |
| ServiceDate | DATE | วันที่ใช้บริการ | |
| TotalAmount | DECIMAL(10,2) | ยอดรวม | |
| PaidAmount | DECIMAL(10,2) | ยอดที่ชำระแล้ว | |
| BalanceAmount | DECIMAL(10,2) | ยอดคงเหลือ | |
| DueDate | DATE | วันที่ครบกำหนด | |
| OverdueDays | INT | จำนวนวันค้างชำระ | |
| Status | ENUM('PENDING','PARTIAL','PAID','WRITTEN_OFF','DISPUTED') | สถานะ | |
| AlertSent | BIT | ส่งการแจ้งเตือนแล้ว | |
| LastAlertDate | DATE | วันที่แจ้งเตือนครั้งสุดท้าย | |
| AlertCount | INT | จำนวนครั้งที่แจ้งเตือน | |
| Remarks | TEXT | หมายเหตุ | |
| CreatedAt | TIMESTAMP | วันเวลาที่สร้าง | |
| UpdatedAt | TIMESTAMP | วันเวลาที่แก้ไขล่าสุด |
8.2.2 ตารางรองรับการทำงาน (Support Tables)
8.2.2.1 การอนุมัติและลดหย่อน
Table: PAYMENT_APPROVAL (การอนุมัติการชำระ)
วัตถุประสงค์: เก็บข้อมูลการขออนุมัติการชำระเงิน ส่วนลด และยกเว้น
| Field | Type | Key | Description |
|---|---|---|---|
| ApprovalID | VARCHAR(20) | PK | รหัสการขออนุมัติ |
| PaymentID | VARCHAR(20) | FK | รหัสการรับชำระเงิน |
| ApprovalType | ENUM('DISCOUNT','EXEMPTION','INSTALLMENT','SPECIAL') | ประเภทการอนุมัติ | |
| RequestedAmount | DECIMAL(10,2) | จำนวนเงินที่ขออนุมัติ | |
| ApprovedAmount | DECIMAL(10,2) | จำนวนเงินที่อนุมัติ | |
| Reason | TEXT | เหตุผลการขออนุมัติ | |
| SupportingDocument | VARCHAR(255) | เอกสารประกอบ | |
| RequestedBy | VARCHAR(10) | FK | ผู้ขออนุมัติ |
| RequestedDate | TIMESTAMP | วันเวลาที่ขออนุมัติ | |
| ApprovalLevel | INT | ระดับการอนุมัติ | |
| ApproverID | VARCHAR(10) | FK | ผู้อนุมัติ |
| ApprovalDate | TIMESTAMP | วันเวลาที่อนุมัติ | |
| ApprovalStatus | ENUM('PENDING','APPROVED','REJECTED','CANCELLED') | สถานะการอนุมัติ | |
| ApprovalRemarks | TEXT | หมายเหตุการอนุมัติ | |
| NextApproverID | VARCHAR(10) | FK | ผู้อนุมัติลำดับถัดไป |
Table: DISCOUNT_EXEMPTION (การลดหย่อนและยกเว้น)
วัตถุประสงค์: เก็บข้อมูลการลดหย่อนและยกเว้นค่ารักษาที่ได้รับอนุมัติ
| Field | Type | Key | Description |
|---|---|---|---|
| DiscountExemptionID | VARCHAR(20) | PK | รหัสการลดหย่อนและยกเว้น |
| PaymentID | VARCHAR(20) | FK | รหัสการรับชำระเงิน |
| Type | ENUM('DISCOUNT','EXEMPTION','SPECIAL_PROGRAM') | ประเภทการลด | |
| DiscountTypeCode | VARCHAR(10) | FK | รหัสประเภทส่วนลด |
| ExemptionTypeCode | VARCHAR(10) | FK | รหัสประเภทยกเว้น |
| CategoryCode | VARCHAR(10) | FK | รหัสหมวดค่ารักษา (ถ้าเฉพาะหมวด) |
| CalculationMethod | ENUM('PERCENTAGE','FIXED_AMOUNT','FULL_EXEMPTION') | วิธีคำนวณ | |
| DiscountPercent | DECIMAL(5,2) | เปอร์เซ็นต์ส่วนลด | |
| DiscountAmount | DECIMAL(10,2) | จำนวนเงินส่วนลด | |
| OriginalAmount | DECIMAL(10,2) | ยอดเงินเดิม | |
| DiscountedAmount | DECIMAL(10,2) | ยอดเงินหลังลด | |
| ApprovalID | VARCHAR(20) | FK | รหัสการอนุมัติ |
| EffectiveDate | DATE | วันที่มีผล | |
| ExpiryDate | DATE | วันที่หมดอายุ | |
| BeneficiaryType | ENUM('PATIENT','STAFF','SPECIAL','GOVERNMENT') | ประเภทผู้รับสิทธิ | |
| CreatedBy | VARCHAR(10) | FK | ผู้สร้าง |
| CreatedAt | TIMESTAMP | วันเวลาที่สร้าง |
8.2.2.2 การปิดรอบการเงิน
Table: FINANCIAL_CLOSING (การปิดรอบการเงิน)
วัตถุประสงค์: เก็บข้อมูลการปิดรอบการเงินรายวัน รายเดือน และรายปี
| Field | Type | Key | Description |
|---|---|---|---|
| ClosingID | VARCHAR(20) | PK | รหัสการปิดรอบ |
| ClosingType | ENUM('DAILY','MONTHLY','YEARLY') | ประเภทการปิดรอบ | |
| ClosingDate | DATE | วันที่ปิดรอบ | |
| PeriodFrom | DATE | วันที่เริ่มต้นรอบ | |
| PeriodTo | DATE | วันที่สิ้นสุดรอบ | |
| TotalTransactions | INT | จำนวนรายการทั้งหมด | |
| TotalCashAmount | DECIMAL(15,2) | ยอดเงินสดรวม | |
| TotalCardAmount | DECIMAL(15,2) | ยอดบัตรเครดิตรวม | |
| TotalTransferAmount | DECIMAL(15,2) | ยอดเงินโอนรวม | |
| TotalRightsAmount | DECIMAL(15,2) | ยอดสิทธิรวม | |
| TotalDiscountAmount | DECIMAL(15,2) | ยอดส่วนลดรวม | |
| TotalExemptionAmount | DECIMAL(15,2) | ยอดยกเว้นรวม | |
| NetAmount | DECIMAL(15,2) | ยอดสุทธิ | |
| ClosingStatus | ENUM('PENDING','PROCESSING','COMPLETED','VERIFIED') | สถานะการปิดรอบ | |
| ClosedBy | VARCHAR(10) | FK | ผู้ปิดรอบ |
| ClosedAt | TIMESTAMP | วันเวลาที่ปิดรอบ | |
| VerifiedBy | VARCHAR(10) | FK | ผู้ตรวจสอบ |
| VerifiedAt | TIMESTAMP | วันเวลาที่ตรวจสอบ | |
| Remarks | TEXT | หมายเหตุ |
Table: CASH_DRAWER (ลิ้นชักเก็บเงิน)
วัตถุประสงค์: จัดการเงินสดในลิ้นชักของแต่ละจุดรับชำระเงิน
| Field | Type | Key | Description |
|---|---|---|---|
| DrawerID | VARCHAR(20) | PK | รหัสลิ้นชัก |
| TerminalID | VARCHAR(10) | FK | รหัสจุดรับชำระเงิน |
| CashierID | VARCHAR(10) | FK | รหัสเจ้าหน้าที่ |
| OpeningDate | DATE | วันที่เปิดลิ้นชัก | |
| OpeningTime | TIME | เวลาที่เปิดลิ้นชัก | |
| OpeningAmount | DECIMAL(10,2) | ยอดเงินเริ่มต้น | |
| TotalCashIn | DECIMAL(10,2) | เงินสดรับเข้าทั้งหมด | |
| TotalCashOut | DECIMAL(10,2) | เงินสดจ่ายออกทั้งหมด | |
| EndingAmount | DECIMAL(10,2) | ยอดเงินสิ้นสุด | |
| ActualAmount | DECIMAL(10,2) | เงินสดจริงที่นับได้ | |
| Variance | DECIMAL(10,2) | ส่วนต่าง (บวก/ลบ) | |
| ClosingDate | DATE | วันที่ปิดลิ้นชัก | |
| ClosingTime | TIME | เวลาที่ปิดลิ้นชัก | |
| Status | ENUM('OPEN','CLOSED','BALANCED','UNBALANCED') | สถานะลิ้นชัก | |
| Remarks | TEXT | หมายเหตุ |
8.2.2.3 การจัดการเครื่องมือและอุปกรณ์
Table: PAYMENT_TERMINAL (จุดรับชำระเงิน)
วัตถุประสงค์: จัดการข้อมูลจุดรับชำระเงินและอุปกรณ์ที่เกี่ยวข้อง
| Field | Type | Key | Description |
|---|---|---|---|
| TerminalID | VARCHAR(10) | PK | รหัสจุดรับชำระเงิน |
| TerminalName | NVARCHAR(100) | ชื่อจุดรับชำระ | |
| Location | NVARCHAR(100) | ตำแหน่งที่ตั้ง | |
| DepartmentCode | VARCHAR(10) | FK | รหัสแผนกที่สังกัด |
| TerminalType | ENUM('CASHIER','KIOSK','MOBILE','BEDSIDE') | ประเภทจุด | |
| IPAddress | VARCHAR(15) | หมายเลข IP | |
| MACAddress | VARCHAR(17) | หมายเลข MAC | |
| PrinterModel | VARCHAR(50) | รุ่นเครื่องพิมพ์ | |
| PrinterIP | VARCHAR(15) | IP เครื่องพิมพ์ | |
| CashDrawerModel | VARCHAR(50) | รุ่นลิ้นชักเก็บเงิน | |
| EDCTerminalID | VARCHAR(20) | รหัสเครื่อง EDC | |
| IsActive | BIT | ใช้งานได้ | |
| LastOnline | TIMESTAMP | ออนไลน์ครั้งสุดท้าย | |
| ConfigJSON | TEXT | การตั้งค่าเพิ่มเติม (JSON) | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
Table: PAYMENT_CONFIG (การตั้งค่าระบบการเงิน)
วัตถุประสงค์: เก็บการตั้งค่าต่างๆ ของระบบการเงิน
| Field | Type | Key | Description |
|---|---|---|---|
| ConfigID | VARCHAR(20) | PK | รหัสการตั้งค่า |
| ConfigCategory | VARCHAR(50) | หมวดการตั้งค่า | |
| ConfigKey | VARCHAR(100) | คีย์การตั้งค่า | |
| ConfigValue | TEXT | ค่าการตั้งค่า | |
| DataType | ENUM('STRING','INTEGER','DECIMAL','BOOLEAN','JSON') | ประเภทข้อมูล | |
| Description | NTEXT | คำอธิบาย | |
| IsSystem | BIT | เป็นการตั้งค่าระบบ | |
| IsEditable | BIT | แก้ไขได้ | |
| ValidValues | TEXT | ค่าที่อนุญาต (สำหรับ dropdown) | |
| DefaultValue | TEXT | ค่าเริ่มต้น | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง | |
| LastModified | DATETIME | วันที่แก้ไขล่าสุด | |
| ModifiedBy | VARCHAR(50) | ผู้แก้ไขล่าสุด |
8.2.3 ตารางจัดการระบบ (System Tables)
8.2.3.1 บันทึกการตรวจสอบและแก้ไข
Table: FINANCIAL_AUDIT_LOG (บันทึกการแก้ไขทางการเงิน)
วัตถุประสงค์: เก็บบันทึกการเปลี่ยนแปลงข้อมูลทางการเงินทั้งหมดเพื่อการตรวจสอบ
| Field | Type | Key | Description |
|---|---|---|---|
| LogID | VARCHAR(20) | PK | รหัส Log |
| TableName | VARCHAR(50) | ชื่อตาราง | |
| RecordID | VARCHAR(20) | รหัสระเบียน | |
| HN | VARCHAR(10) | รหัสผู้ป่วย (ถ้ามี) | |
| PaymentID | VARCHAR(20) | รหัสการชำระเงิน (ถ้ามี) | |
| Action | ENUM('INSERT','UPDATE','DELETE','CANCEL') | การกระทำ | |
| FieldName | VARCHAR(50) | ชื่อฟิลด์ที่เปลี่ยน | |
| OldValue | TEXT | ค่าเดิม | |
| NewValue | TEXT | ค่าใหม่ | |
| ChangeReason | TEXT | เหตุผลการเปลี่ยน | |
| IPAddress | VARCHAR(15) | หมายเลข IP ผู้ใช้ | |
| UserAgent | VARCHAR(255) | ข้อมูล Browser/Device | |
| SessionID | VARCHAR(50) | รหัส Session | |
| TransactionID | VARCHAR(50) | รหัสการทำงานกลุ่ม | |
| Timestamp | TIMESTAMP | วันเวลาที่เกิดเหตุการณ์ | |
| UserId | VARCHAR(50) | รหัสผู้ใช้ | |
| UserRole | VARCHAR(50) | บทบาทผู้ใช้ |
Table: RECEIPT_CANCEL_LOG (บันทึกการยกเลิกใบเสร็จ)
วัตถุประสงค์: เก็บประวัติการยกเลิกใบเสร็จอย่างละเอียด ตาม TOR 1.2.14.5
| Field | Type | Key | Description |
|---|---|---|---|
| CancelLogID | VARCHAR(20) | PK | รหัสบันทึกการยกเลิก |
| ReceiptID | VARCHAR(20) | FK | รหัสใบเสร็จที่ยกเลิก |
| OldReceiptNumber | VARCHAR(30) | เลขที่ใบเสร็จเดิม | |
| NewReceiptID | VARCHAR(20) | FK | รหัสใบเสร็จใหม่ (ถ้ามี) |
| NewReceiptNumber | VARCHAR(30) | เลขที่ใบเสร็จใหม่ (ถ้ามี) | |
| CancelDate | DATE | วันที่ยกเลิก | |
| CancelTime | TIME | เวลาที่ยกเลิก | |
| HN | VARCHAR(10) | หมายเลขผู้ป่วย | |
| PatientName | NVARCHAR(100) | ชื่อ-สกุลผู้ป่วย | |
| CancelledAmount | DECIMAL(10,2) | จำนวนเงินที่ยกเลิก | |
| CancelReason | TEXT | สาเหตุของการยกเลิก | |
| CancelType | ENUM('ERROR','REFUND','ADJUSTMENT','SYSTEM_ERROR') | ประเภทการยกเลิก | |
| CancelledBy | VARCHAR(10) | FK | เจ้าหน้าที่ที่ทำการยกเลิก |
| ApprovedBy | VARCHAR(10) | FK | ผู้อนุมัติการยกเลิก |
| TerminalID | VARCHAR(10) | FK | จุดที่ทำการยกเลิก |
| RefundMethod | ENUM('CASH','ORIGINAL_METHOD','DEPOSIT') | วิธีการคืนเงิน | |
| DocumentPath | VARCHAR(255) | เส้นทางเอกสารประกอบ | |
| CreatedAt | TIMESTAMP | วันเวลาที่บันทึก |
8.2.3.2 การเชื่อมโยงกับระบบภายนอก
Table: FINANCIAL_INTEGRATION_LOG (บันทึกการเชื่อมโยงระบบ)
วัตถุประสงค์: เก็บบันทึกการส่งข้อมูลไปยังระบบภายนอกและการรับข้อมูลกลับ
| Field | Type | Key | Description |
|---|---|---|---|
| IntegrationLogID | VARCHAR(20) | PK | รหัสบันทึกการเชื่อมโยง |
| SystemName | VARCHAR(50) | ชื่อระบบปลายทาง | |
| ApiEndpoint | VARCHAR(255) | URL ของ API | |
| RequestType | ENUM('SEND','RECEIVE','SYNC','VERIFY') | ประเภทคำขอ | |
| PaymentID | VARCHAR(20) | FK | รหัสการชำระที่เกี่ยวข้อง |
| HN | VARCHAR(10) | รหัสผู้ป่วย | |
| RequestData | TEXT | ข้อมูลที่ส่ง (JSON) | |
| ResponseData | TEXT | ข้อมูลที่ได้รับ (JSON) | |
| StatusCode | VARCHAR(10) | รหัสสถานะ HTTP | |
| IsSuccess | BIT | สำเร็จหรือไม่ | |
| ErrorMessage | TEXT | ข้อความ Error (ถ้ามี) | |
| ProcessingTime | INT | เวลาประมวลผล (ms) | |
| RetryCount | INT | จำนวนครั้งที่ลองใหม่ | |
| CreatedAt | TIMESTAMP | วันเวลาที่เกิดเหตุการณ์ |
Table: EXTERNAL_PAYMENT_API (API การชำระเงินภายนอก)
วัตถุประสงค์: จัดการการเชื่อมต่อกับระบบการชำระเงินภายนอก (บัตรเครดิต, QR Code, etc.)
| Field | Type | Key | Description |
|---|---|---|---|
| ApiConfigID | VARCHAR(20) | PK | รหัสการตั้งค่า API |
| ApiName | VARCHAR(100) | ชื่อ API | |
| ApiType | ENUM('CREDIT_CARD','QR_PAYMENT','BANK_TRANSFER','E_WALLET') | ประเภท API | |
| ProviderName | VARCHAR(100) | ชื่อผู้ให้บริการ | |
| BaseURL | VARCHAR(255) | URL หลัก | |
| ApiKey | VARCHAR(255) | API Key (เข้ารหัส) | |
| SecretKey | VARCHAR(255) | Secret Key (เข้ารหัส) | |
| MerchantID | VARCHAR(100) | รหัสร้านค้า | |
| TerminalID | VARCHAR(100) | รหัส Terminal | |
| IsActive | BIT | ใช้งานได้ | |
| IsTestMode | BIT | โหมดทดสอบ | |
| TimeoutSeconds | INT | Timeout (วินาที) | |
| MaxRetries | INT | จำนวนครั้งสูงสุดที่ลองใหม่ | |
| ConfigJSON | TEXT | การตั้งค่าเพิ่มเติม | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
8.2.4 ตาราง Master Data
8.2.4.1 ข้อมูลพื้นฐานทางการเงิน
Table: PAYMENT_TYPE (ประเภทการชำระเงิน)
วัตถุประสงค์: กำหนดประเภทการชำระเงินที่รองรับในระบบ
| Field | Type | Key | Description |
|---|---|---|---|
| PaymentTypeCode | VARCHAR(10) | PK | รหัสประเภทการชำระ |
| PaymentTypeName | NVARCHAR(100) | ชื่อประเภทการชำระ | |
| PaymentMethod | ENUM('CASH','CARD','TRANSFER','QR','DEPOSIT','RIGHTS') | วิธีการชำระ | |
| IsActive | BIT | ใช้งานได้ | |
| RequiresApproval | BIT | ต้องขออนุมัติ | |
| MaxAmountPerDay | DECIMAL(12,2) | จำนวนเงินสูงสุดต่อวัน | |
| ProcessingFee | DECIMAL(8,2) | ค่าธรรมเนียมการดำเนินการ | |
| ProcessingFeePercent | DECIMAL(5,2) | เปอร์เซ็นต์ค่าธรรมเนียม | |
| Description | NTEXT | คำอธิบาย | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| IconPath | VARCHAR(255) | เส้นทางไอคอน | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
Table: BANK_MASTER (ข้อมูลธนาคาร)
วัตถุประสงค์: เก็บข้อมูลธนาคารสำหรับการโอนเงินและบัตรเครดิต
| Field | Type | Key | Description |
|---|---|---|---|
| BankCode | VARCHAR(10) | PK | รหัสธนาคาร |
| BankName | NVARCHAR(100) | ชื่อธนาคาร | |
| BankNameEN | VARCHAR(100) | ชื่อธนาคาร (อังกฤษ) | |
| BankAbbreviation | VARCHAR(10) | ชื่อย่อ | |
| SwiftCode | VARCHAR(11) | รหัส SWIFT | |
| LogoPath | VARCHAR(255) | เส้นทางโลโก้ | |
| IsActive | BIT | ใช้งานได้ | |
| SupportsCreditCard | BIT | รองรับบัตรเครดิต | |
| SupportsTransfer | BIT | รองรับการโอน | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
8.2.4.2 ข้อมูลสิทธิและการยกเว้น
Table: EXEMPTION_TYPE (ประเภทการยกเว้น)
วัตถุประสงค์: กำหนดประเภทการยกเว้นค่ารักษาตาม TOR 1.2.14.2
| Field | Type | Key | Description |
|---|---|---|---|
| ExemptionTypeCode | VARCHAR(10) | PK | รหัสประเภทยกเว้น |
| ExemptionTypeName | NVARCHAR(100) | ชื่อประเภทยกเว้น | |
| ExemptionCategory | ENUM('FULL','PARTIAL','CONDITIONAL','STAFF') | หมวดการยกเว้น | |
| DefaultPercent | DECIMAL(5,2) | เปอร์เซ็นต์เริ่มต้น | |
| MaxExemptionPercent | DECIMAL(5,2) | เปอร์เซ็นต์สูงสุด | |
| RequiresDocument | BIT | ต้องมีเอกสารประกอบ | |
| RequiresApproval | BIT | ต้องขออนุมัติ | |
| ApprovalLevel | INT | ระดับการอนุมัติ | |
| ValidDays | INT | จำนวนวันที่ใช้ได้ | |
| IsActive | BIT | ใช้งานได้ | |
| Description | NTEXT | คำอธิบาย | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
Table: RIGHTS_VERIFICATION_API (API ตรวจสอบสิทธิ)
วัตถุประสงค์: การเชื่อมโยงกับระบบตรวจสอบสิทธิภายนอก (สปสช., สนย., etc.)
| Field | Type | Key | Description |
|---|---|---|---|
| ApiID | VARCHAR(20) | PK | รหัส API |
| ApiName | VARCHAR(100) | ชื่อ API | |
| OrganizationCode | VARCHAR(10) | รหัสหน่วยงาน | |
| OrganizationName | NVARCHAR(100) | ชื่อหน่วยงาน | |
| BaseURL | VARCHAR(255) | URL หลัก | |
| ApiVersion | VARCHAR(10) | เวอร์ชัน API | |
| AuthenticationType | ENUM('API_KEY','OAUTH','CERTIFICATE') | ประเภทการยืนยันตัวตน | |
| AuthenticationConfig | TEXT | การตั้งค่าการยืนยัน (JSON) | |
| IsActive | BIT | ใช้งานได้ | |
| IsRealtime | BIT | ตรวจสอบแบบ Real-time | |
| CacheValidMinutes | INT | ระยะเวลา Cache (นาที) | |
| TimeoutSeconds | INT | Timeout (วินาที) | |
| MaxRetries | INT | จำนวนครั้งสูงสุดที่ลองใหม่ | |
| LastSuccessDate | DATETIME | วันที่สำเร็จครั้งสุดท้าย | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
8.3 ความสัมพันธ์ระหว่างตาราง (Table Relationships)
8.3.1 Primary Relationships
erDiagram
PATIENT ||--o{ PAYMENT_TRANSACTION : "รับชำระเงิน"
VISIT ||--o{ PAYMENT_TRANSACTION : "การชำระในแต่ละครั้ง"
PAYMENT_TRANSACTION ||--o{ PAYMENT_METHOD : "วิธีการชำระ"
PAYMENT_TRANSACTION ||--o{ PAYMENT_DETAIL : "รายละเอียดการชำระ"
PAYMENT_TRANSACTION ||--|| RECEIPT : "ออกใบเสร็จ"
PAYMENT_TRANSACTION ||--o{ PAYMENT_APPROVAL : "ขออนุมัติ"
FINANCIAL_RIGHTS ||--o{ PAYMENT_CHART : "ผังการคิด"
FINANCIAL_CATEGORY ||--o{ PAYMENT_CHART : "หมวดค่ารักษา"
FINANCIAL_CATEGORY ||--o{ PAYMENT_DETAIL : "จัดหมวดรายการ"
PAYMENT_TERMINAL ||--o{ PAYMENT_TRANSACTION : "จุดรับชำระ"
PAYMENT_TERMINAL ||--o{ CASH_DRAWER : "ลิ้นชักเงิน"
OUTSTANDING_BALANCE ||--o{ PAYMENT_TRANSACTION : "ชำระหนี้ค้าง"
DEPOSIT_TRANSACTION ||--o{ PAYMENT_TRANSACTION : "ใช้เงินฝาก"
8.3.2 Integration Relationships
ความสัมพันธ์กับระบบอื่น:
- PATIENT ← ระบบเวชระเบียน (1.2.1)
- VISIT ← ระบบเวชระเบียน (1.2.1)
- FINANCIAL_RIGHTS ↔ ระบบตรวจสอบสิทธิ (1.2.15)
- PAYMENT_DETAIL ← ระบบห้องตรวจ (1.2.3), ระบบเภสัชกรรม (1.2.13)
- EXTERNAL_PAYMENT_API ↔ ระบบชำระเงินภายนอก
8.4 Indexes และ Performance Optimization
8.4.1 Primary Indexes
-- Primary Keys (อัตโนมัติ)
CREATE UNIQUE INDEX PK_PAYMENT_TRANSACTION ON PAYMENT_TRANSACTION(PaymentID);
CREATE UNIQUE INDEX PK_RECEIPT ON RECEIPT(ReceiptID);
CREATE UNIQUE INDEX PK_FINANCIAL_RIGHTS ON FINANCIAL_RIGHTS(RightID);
-- Foreign Key Indexes
CREATE INDEX IX_PAYMENT_TRANSACTION_HN ON PAYMENT_TRANSACTION(HN);
CREATE INDEX IX_PAYMENT_TRANSACTION_VISIT ON PAYMENT_TRANSACTION(VisitID);
CREATE INDEX IX_PAYMENT_DETAIL_PAYMENT ON PAYMENT_DETAIL(PaymentID);
CREATE INDEX IX_RECEIPT_PAYMENT ON RECEIPT(PaymentID);
8.4.2 Search Indexes
-- การค้นหาตามวันที่
CREATE INDEX IX_PAYMENT_DATE ON PAYMENT_TRANSACTION(PaymentDate, PaymentTime);
CREATE INDEX IX_RECEIPT_DATE ON RECEIPT(ReceiptDate, ReceiptTime);
-- การค้นหาตามสถานะ
CREATE INDEX IX_PAYMENT_STATUS ON PAYMENT_TRANSACTION(PaymentStatus);
CREATE INDEX IX_OUTSTANDING_STATUS ON OUTSTANDING_BALANCE(Status);
-- การค้นหาตามผู้ป่วย
CREATE INDEX IX_OUTSTANDING_HN ON OUTSTANDING_BALANCE(HN, Status);
CREATE INDEX IX_DEPOSIT_HN ON DEPOSIT_TRANSACTION(HN, TransactionType);
8.4.3 Composite Indexes
-- การปิดรอบการเงิน
CREATE INDEX IX_PAYMENT_CLOSING ON PAYMENT_TRANSACTION(PaymentDate, TerminalID, PaymentStatus);
-- การค้นหาใบเสร็จ
CREATE INDEX IX_RECEIPT_NUMBER ON RECEIPT(ReceiptNumber, IsCancelled);
-- Audit และรายงาน
CREATE INDEX IX_AUDIT_LOG_DATE ON FINANCIAL_AUDIT_LOG(Timestamp, TableName);
8.5 Security และ Data Protection
8.5.1 การเข้ารหัสข้อมูล
ข้อมูลที่ต้องเข้ารหัส:
- API Keys และ Secret Keys ในตาราง EXTERNAL_PAYMENT_API
- หมายเลขบัตรเครดิตในตาราง PAYMENT_METHOD
- ข้อมูลการยืนยันตัวตนในตาราง RIGHTS_VERIFICATION_API
8.5.2 Data Masking
-- ฟังก์ชันการซ่อนหมายเลขบัตร
FUNCTION MASK_CARD_NUMBER(@CardNumber VARCHAR(20))
RETURNS VARCHAR(20)
AS
BEGIN
RETURN LEFT(@CardNumber, 4) + 'XXXX-XXXX-' + RIGHT(@CardNumber, 4)
END
8.5.3 Audit Trail
ทุกตารางหลักมี Audit Trail:
- CreatedAt, CreatedBy
- UpdatedAt, ModifiedBy
- การบันทึกใน FINANCIAL_AUDIT_LOG
8.6 Data Validation Rules
8.6.1 Business Rules
การตรวจสอบยอดเงิน:
-- ยอดชำระต้องไม่เกินยอดรวม
CHECK (PaidAmount <= TotalAmount)
-- เงินทอนต้องไม่ติดลบ
CHECK (ChangeAmount >= 0)
-- ส่วนลดไม่เกิน 100%
CHECK (DiscountPercent BETWEEN 0 AND 100)
การตรวจสอบวันที่:
-- วันที่ชำระไม่เกินวันปัจจุบัน
CHECK (PaymentDate <= GETDATE())
-- วันครบกำหนดต้องหลังวันที่ออกบิล
CHECK (DueDate >= InvoiceDate)
8.6.2 Data Constraints
-- รหัสใบเสร็จไม่ซ้ำ
ALTER TABLE RECEIPT ADD CONSTRAINT UQ_RECEIPT_NUMBER UNIQUE (ReceiptNumber);
-- สถานะการชำระ
ALTER TABLE PAYMENT_TRANSACTION ADD CONSTRAINT CK_PAYMENT_STATUS
CHECK (PaymentStatus IN ('PAID','PENDING','CANCELLED','PARTIAL'));
-- ประเภทการยกเว้น
ALTER TABLE EXEMPTION_TYPE ADD CONSTRAINT CK_EXEMPTION_PERCENT
CHECK (MaxExemptionPercent BETWEEN 0 AND 100);
8.7 การนำไปใช้งาน (Implementation Notes)
8.7.1 การติดตั้งฐานข้อมูล
- สร้างฐานข้อมูล
- สร้างตารางตามลำดับ: Master Data → Core Tables → Support Tables → System Tables
- สร้าง Indexes และ Constraints
- กำหนดสิทธิ์การเข้าถึง
- ป้อนข้อมูลเริ่มต้น (Seed Data)
8.7.2 Data Migration
สำหรับการย้ายข้อมูลจากระบบเก่า:
1. ข้อมูลสิทธิและผังการคิด → FINANCIAL_RIGHTS, PAYMENT_CHART
2. ข้อมูลการชำระย้อนหลัง → PAYMENT_TRANSACTION (1-2 ปี)
3. ยอดค้างชำระ → OUTSTANDING_BALANCE
4. การตั้งค่าระบบ → PAYMENT_CONFIG
8.7.3 การบำรุงรักษา
การทำความสะอาดข้อมูล: - Archive ข้อมูล Audit Log เก่ากว่า 7 ปี - ลบ Session และ Temporary Data - สำรองข้อมูลการเงินรายเดือน
การตรวจสอบความสมบูรณ์: - ตรวจสอบยอดรวมการปิดรอบ - Validate การเชื่อมโยง Foreign Keys - ตรวจสอบ Audit Trail
หมายเหตุ: เอกสารนี้จัดทำขึ้นเพื่อใช้เป็นแนวทางในการพัฒนาฐานข้อมูลระบบการเงิน ควรทบทวนและปรับปรุงตามความต้องการจริงของโรงพยาบาลก่อนการนำไปใช้งาน | Status | ENUM('OPEN','CLOSED','BALANCED','UNBALANCED') | | สถานะลิ้นชัก | | Remarks | TEXT | | หมายเหตุ |
8.2.2.3 การจัดการเครื่องมือและอุปกรณ์
Table: PAYMENT_TERMINAL (จุดรับชำระเงิน)
วัตถุประสงค์: จัดการข้อมูลจุดรับชำระเงินและอุปกรณ์ที่เกี่ยวข้อง
| Field | Type | Key | Description |
|---|---|---|---|
| TerminalID | VARCHAR(10) | PK | รหัสจุดรับชำระเงิน |
| TerminalName | NVARCHAR(100) | ชื่อจุดรับชำระ | |
| Location | NVARCHAR(100) | ตำแหน่งที่ตั้ง | |
| DepartmentCode | VARCHAR(10) | FK | รหัสแผนกที่สังกัด |
| TerminalType | ENUM('CASHIER','KIOSK','MOBILE','BEDSIDE') | ประเภทจุด | |
| IPAddress | VARCHAR(15) | หมายเลข IP | |
| MACAddress | VARCHAR(17) | หมายเลข MAC | |
| PrinterModel | VARCHAR(50) | รุ่นเครื่องพิมพ์ | |
| PrinterIP | VARCHAR(15) | IP เครื่องพิมพ์ | |
| CashDrawerModel | VARCHAR(50) | รุ่นลิ้นชักเก็บเงิน | |
| EDCTerminalID | VARCHAR(20) | รหัสเครื่อง EDC | |
| IsActive | BIT | ใช้งานได้ | |
| LastOnline | TIMESTAMP | ออนไลน์ครั้งสุดท้าย | |
| ConfigJSON | TEXT | การตั้งค่าเพิ่มเติม (JSON) | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง |
Table: PAYMENT_CONFIG (การตั้งค่าระบบการเงิน)
วัตถุประสงค์: เก็บการตั้งค่าต่างๆ ของระบบการเงิน
| Field | Type | Key | Description |
|---|---|---|---|
| ConfigID | VARCHAR(20) | PK | รหัสการตั้งค่า |
| ConfigCategory | VARCHAR(50) | หมวดการตั้งค่า | |
| ConfigKey | VARCHAR(100) | คีย์การตั้งค่า | |
| ConfigValue | TEXT | ค่าการตั้งค่า | |
| DataType | ENUM('STRING','INTEGER','DECIMAL','BOOLEAN','JSON') | ประเภทข้อมูล | |
| Description | NTEXT | คำอธิบาย | |
| IsSystem | BIT | เป็นการตั้งค่าระบบ | |
| IsEditable | BIT | แก้ไขได้ | |
| ValidValues | TEXT | ค่าที่อนุญาต (สำหรับ dropdown) | |
| DefaultValue | TEXT | ค่าเริ่มต้น | |
| DisplayOrder | INT | ลำดับการแสดงผล | |
| CreatedDate | DATETIME | วันที่สร้าง | |
| CreatedBy | VARCHAR(50) | ผู้สร้าง | |
| LastModified | DATETIME | วันที่แก้ไขล่าสุด | |
| ModifiedBy | VARCHAR(50) | ผู้แก้ไขล่าสุด |