Database Schema Design
ระบบตรวจสอบสิทธิ
โรงพยาบาลค่ายธนรัชน์
เอกสารเลขที่: SRS-1.2.15-SCHEMA
เวอร์ชัน: 1.0
วันที่: 3 ตุลาคม 2568
ผู้จัดทำ: ทีมพัฒนาระบบ
ผู้อนุมัติ: ผู้อำนวยการโรงพยาบาลค่ายธนรัชน์
Database Schema Design
ER Diagram: รายละเอียด Entity-Relationship Diagram และความสัมพันธ์ระหว่างตารางแบบละเอียด ดูได้ในไฟล์ ER Diagram.md
8.2.1 ตารางหลัก (Core Tables)
หมายเหตุ: ตาราง PATIENT, VISIT, และ USER จะอยู่ในระบบอื่นๆ ระบบตรวจสอบสิทธิจะอ้างอิงผ่าน Foreign Key เท่านั้น
Table: RIGHTTYPE (ประเภทสิทธิ)
วัตถุประสงค์: เก็บข้อมูลประเภทสิทธิการรักษาพยาบาลต่างๆ เช่น UC, SSS, ข้าราชการ, ประกันสุขภาพ เพื่อการตรวจสอบสิทธิและการเชื่อมโยงกับระบบภายนอก (การคำนวณทางการเงินจะเป็นหน้าที่ของระบบการเงิน 1.2.14)
| Field | Type | Key | Description |
|---|---|---|---|
| RightTypeID | VARCHAR(10) | PK | รหัสประเภทสิทธิ |
| RightTypeName | NVARCHAR(100) | ชื่อประเภทสิทธิ | |
| RightTypeNameEng | NVARCHAR(100) | ชื่อประเภทสิทธิ (อังกฤษ) | |
| Category | VARCHAR(50) | หมวดหมู่สิทธิ (government, social_security, universal, etc.) | |
| Description | NVARCHAR(200) | รายละเอียด | |
| CoveragePercentage | DECIMAL(5,2) | เปอร์เซ็นต์ความคุ้มครอง | |
| RequiresApproval | BIT | ต้องอนุมัติก่อนใช้สิทธิ | |
| OnlineValidation | BIT | สามารถตรวจสอบออนไลน์ได้ | |
| CopaymentRequired | BIT | ต้องจ่าย Copayment | |
| ValidHospitals | NVARCHAR(200) | โรงพยาบาลที่ใช้ได้ | |
| PriorityLevel | INT | ระดับความสำคัญ | |
| ExternalSystemID | VARCHAR(10) | FK | รหัสระบบภายนอก (อ้างอิง EXTERNALSYSTEM) |
| FinancialSystemRef | VARCHAR(20) | Reference ไปยังระบบการเงิน (1.2.14) | |
| IsActive | BIT | ใช้งานได้ |
Table: PATIENTRIGHT (สิทธิผู้ป่วย)
วัตถุประสงค์: เก็บข้อมูลสิทธิการรักษาพยาบาลของผู้ป่วยแต่ละราย สามารถมีได้หลายสิทธิต่อ 1 คน โดยระบุรายละเอียดเช่น เลขที่สิทธิ วันหมดอายุ โรงพยาบาลที่สังกัด และสถานะการใช้งาน
| Field | Type | Key | Description |
|---|---|---|---|
| PatientRightID | VARCHAR(20) | PK | รหัสสิทธิผู้ป่วย |
| HN | VARCHAR(10) | FK | Hospital Number |
| RightTypeID | VARCHAR(10) | FK | รหัสประเภทสิทธิ |
| RightNumber | VARCHAR(50) | เลขที่สิทธิ | |
| StartDate | DATE | วันที่เริ่มต้น | |
| EndDate | DATE | วันที่สิ้นสุด | |
| MainHospital | NVARCHAR(100) | โรงพยาบาลหลัก | |
| SubHospital | NVARCHAR(100) | โรงพยาบาลรอง | |
| Status | VARCHAR(20) | สถานะสิทธิ | |
| CreatedDate | DATETIME | วันที่บันทึก | |
| CreatedBy | VARCHAR(50) | ผู้บันทึก | |
| LastVerified | DATETIME | ตรวจสอบล่าสุด |
8.2.2 ตารางรองรับการทำงาน (Support Tables)
Table: RIGHTSPAYMENTTYPE (ประเภทการชำระเงินของแต่ละสิทธิ)
วัตถุประสงค์: เก็บข้อมูลประเภทการชำระเงินสำหรับแต่ละประเภทสิทธิ ตาม TOR ข้อ 1.2.15.1.2 เช่น เบิกได้เต็มจำนวน, จ่ายส่วนต่างเอง, หักค่าบริการ เพื่อการคำนวณค่าใช้จ่ายที่ถูกต้อง
| Field | Type | Key | Description |
|---|---|---|---|
| PaymentTypeID | VARCHAR(10) | PK | รหัสประเภทการชำระเงิน |
| RightTypeID | VARCHAR(10) | FK | รหัสประเภทสิทธิ |
| PaymentCode | VARCHAR(20) | รหัสการชำระเงิน (FULL_COVERAGE, COPAYMENT, DEDUCTIBLE) | |
| PaymentName | NVARCHAR(100) | ชื่อประเภทการชำระเงิน | |
| PaymentNameEng | NVARCHAR(100) | ชื่อประเภทการชำระเงิน (อังกฤษ) | |
| RequiresPayment | BIT | ต้องชำระเงินหรือไม่ | |
| PaymentMethod | VARCHAR(20) | วิธีการชำระเงิน (CASH, CREDIT, TRANSFER) | |
| DefaultAmount | DECIMAL(10,2) | จำนวนเงินมาตรฐาน | |
| CalculationFormula | NVARCHAR(500) | สูตรการคำนวณค่าใช้จ่าย | |
| IsActive | BIT | ใช้งานได้ |
Table: RIGHTSRECEIPTTYPE (ประเภทการออกใบเสร็จรับเงิน)
วัตถุประสงค์: เก็บข้อมูลประเภทการออกใบเสร็จรับเงินและผังการคิดค่าบริการ ตาม TOR ข้อ 1.2.15.1.4 เพื่อการออกใบเสร็จและการคิดค่าบริการที่ถูกต้องตามแต่ละประเภทสิทธิ
| Field | Type | Key | Description |
|---|---|---|---|
| ReceiptTypeID | VARCHAR(10) | PK | รหัสประเภทใบเสร็จ |
| RightTypeID | VARCHAR(10) | FK | รหัสประเภทสิทธิ |
| ReceiptCode | VARCHAR(20) | รหัสประเภทใบเสร็จ (GOVERNMENT, PERSONAL, INSURANCE) | |
| ReceiptName | NVARCHAR(100) | ชื่อประเภทใบเสร็จ | |
| ReceiptNameEng | NVARCHAR(100) | ชื่อประเภทใบเสร็จ (อังกฤษ) | |
| ReceiptTemplate | VARCHAR(50) | Template ใบเสร็จ | |
| ServiceChargeFormula | NTEXT | ผังการคิดค่าบริการ (JSON format) | |
| RequiresApproval | BIT | ต้องอนุมัติก่อนออกใบเสร็จ | |
| PrintCopies | INT | จำนวนฉบับที่พิมพ์ | |
| IsActive | BIT | ใช้งานได้ |
Table: RIGHTSDISCOUNT (ส่วนลดในค่าใช้จ่ายแต่ละหมวด)
วัตถุประสงค์: เก็บข้อมูลส่วนลดในค่าใช้จ่ายแต่ละหมวดสำหรับแต่ละประเภทสิทธิ ตาม TOR ข้อ 1.2.15.1.5 เพื่อการคำนวณส่วนลดที่ถูกต้องและแม่นยำ
| Field | Type | Key | Description |
|---|---|---|---|
| DiscountID | VARCHAR(20) | PK | รหัสส่วนลด |
| RightTypeID | VARCHAR(10) | FK | รหัสประเภทสิทธิ |
| ExpenseCategory | VARCHAR(50) | หมวดค่าใช้จ่าย (TREATMENT, MEDICINE, LAB, XRAY, PROCEDURE) | |
| ExpenseCategoryName | NVARCHAR(100) | ชื่อหมวดค่าใช้จ่าย | |
| DiscountType | VARCHAR(20) | ประเภทส่วนลด (PERCENTAGE, FIXED_AMOUNT, FREE) | |
| DiscountValue | DECIMAL(10,2) | ค่าส่วนลด (เปอร์เซ็นต์หรือจำนวนเงิน) | |
| MaxDiscountAmount | DECIMAL(10,2) | ส่วนลดสูงสุด | |
| MinChargeAmount | DECIMAL(10,2) | ค่าใช้จ่ายขั้นต่ำ | |
| EffectiveDate | DATE | วันที่เริ่มใช้ | |
| ExpiryDate | DATE | วันที่สิ้นสุด | |
| IsActive | BIT | ใช้งานได้ |
Table: SERVICELEVEL (ระดับการให้บริการ)
วัตถุประสงค์: เก็บข้อมูลระดับการให้บริการแต่ละระดับ เช่น Basic, Standard, Premium พร้อมรายละเอียดบริการที่รวมและไม่รวมในแต่ละระดับ
⚠️ หมายเหตุสำหรับทีมพัฒนา: ตารางนี้ออกแบบมาสำหรับ Future Enhancement ในระยะที่ 2-3 ของโครงการ ปัจจุบันยังไม่มีการเชื่อมโยงกับตารางอื่น แต่จะใช้งานเมื่อมีการพัฒนาฟีเจอร์การจัดการระดับบริการแบบละเอียด
Use Cases ในอนาคต: - ผู้ป่วย UC Premium: ได้รับ Lab/X-ray ฟรี, ใช้ห้อง VIP - ผู้ป่วย UC Basic: ได้รับบริการพื้นฐาน, จ่ายส่วนต่างบางรายการ - การคำนวณสิทธิประโยชน์ตามระดับบริการอัตโนมัติ
| Field | Type | Key | Description |
|---|---|---|---|
| ServiceLevelID | INT | PK | รหัสระดับบริการ |
| LevelCode | VARCHAR(20) | รหัสระดับ (BASIC, STANDARD, PREMIUM) | |
| LevelName | NVARCHAR(100) | ชื่อระดับบริการ | |
| LevelNameEng | NVARCHAR(100) | ชื่อระดับบริการ (อังกฤษ) | |
| IncludedServices | NTEXT | บริการที่รวม (JSON format) | |
| ExcludedServices | NTEXT | บริการที่ไม่รวม (JSON format) | |
| IsActive | BIT | ใช้งานได้ |
ตัวอย่าง JSON IncludedServices:
{ "lab_tests": ["CBC", "Blood_Sugar", "Creatinine"], "imaging": ["Chest_Xray", "Ultrasound"], "room_types": ["VIP", "Private"], "medications": "all_essential_drugs" }การเชื่อมโยงในอนาคต:
-- เชื่อมต่อกับ RIGHTTYPE ALTER TABLE RIGHTTYPE ADD COLUMN ServiceLevelID INT NULL; ALTER TABLE RIGHTTYPE ADD FOREIGN KEY (ServiceLevelID) REFERENCES SERVICELEVEL(ServiceLevelID);
Table: VALIDATIONPROVIDER (ผู้ให้บริการตรวจสอบสิทธิ)
วัตถุประสงค์: เก็บข้อมูลผู้ให้บริการตรวจสอบสิทธิออนไลน์ เช่น NHSO, SSO, CGD พร้อมข้อมูล API Endpoint และการตั้งค่าการเชื่อมต่อ
| Field | Type | Key | Description |
|---|---|---|---|
| ProviderID | VARCHAR(10) | PK | รหัสผู้ให้บริการ |
| ProviderCode | VARCHAR(20) | รหัสผู้ให้บริการ (NHSO, SSO, CGD) | |
| ProviderName | NVARCHAR(100) | ชื่อผู้ให้บริการ | |
| ProviderNameEng | NVARCHAR(100) | ชื่อผู้ให้บริการ (อังกฤษ) | |
| APIEndpoint | VARCHAR(500) | URL Endpoint | |
| AuthType | VARCHAR(50) | ประเภทการ Authentication | |
| TimeoutSeconds | INT | Timeout (วินาที) | |
| RetryAttempts | INT | จำนวนครั้งที่ Retry | |
| SupportedSchemes | NVARCHAR(200) | สิทธิที่รองรับ (JSON format) | |
| IsActive | BIT | ใช้งานได้ | |
| LastSync | DATETIME | ซิงค์ล่าสุด |
Table: TREATMENTCOVERAGE (ความคุ้มครองตามประเภทการรักษา)
วัตถุประสงค์: เก็บข้อมูลความคุ้มครองของแต่ละประเภทสิทธิต่อการรักษาแต่ละประเภท เช่น OPD, IPD, ER พร้อม Copayment และขีดจำกัด
| Field | Type | Key | Description |
|---|---|---|---|
| CoverageID | VARCHAR(20) | PK | รหัสความคุ้มครอง |
| RightTypeID | VARCHAR(10) | FK | รหัสประเภทสิทธิ |
| TreatmentType | VARCHAR(20) | ประเภทการรักษา (OPD, IPD, ER) | |
| TreatmentName | NVARCHAR(100) | ชื่อประเภทการรักษา | |
| TreatmentNameEng | NVARCHAR(100) | ชื่อประเภทการรักษา (อังกฤษ) | |
| IsCovered | BIT | คุ้มครองหรือไม่ | |
| CopaymentAmount | DECIMAL(10,2) | จำนวน Copayment | |
| LimitPerVisit | DECIMAL(12,2) | ขีดจำกัดต่อครั้ง | |
| IsActive | BIT | ใช้งานได้ |
Table: VALIDATIONSTATUS (สถานะการตรวจสอบ)
วัตถุประสงค์: เก็บข้อมูล Master Data ของสถานะการตรวจสอบสิทธิต่างๆ เช่น VALID, EXPIRED, SUSPENDED พร้อมการกำหนดว่าอนุญาตให้รักษาได้หรือไม่
| Field | Type | Key | Description |
|---|---|---|---|
| StatusID | VARCHAR(20) | PK | รหัสสถานะ |
| StatusCode | VARCHAR(20) | รหัสสถานะ (VALID, EXPIRED, SUSPENDED) | |
| StatusName | NVARCHAR(100) | ชื่อสถานะ | |
| StatusNameEng | NVARCHAR(100) | ชื่อสถานะ (อังกฤษ) | |
| AllowTreatment | BIT | อนุญาตให้รักษาได้ | |
| RequiresCopayment | BIT | ต้องจ่าย Copayment | |
| StatusColor | VARCHAR(10) | สีแสดงสถานะ (HEX Code) | |
| IsActive | BIT | ใช้งานได้ |
Table: RIGHTSVERIFICATION (การยืนยันสิทธิ)
วัตถุประสงค์: บันทึกการตรวจสอบและยืนยันสิทธิในแต่ละครั้งที่ผู้ป่วยมารับบริการ รวมถึงการเชื่อมต่อกับระบบภายนอก (สปสช./สนย.) เพื่อตรวจสอบสถานะสิทธิแบบ Real-time
| Field | Type | Key | Description |
|---|---|---|---|
| VerificationID | VARCHAR(20) | PK | รหัสการยืนยัน |
| PatientRightID | VARCHAR(20) | FK | รหัสสิทธิผู้ป่วย |
| VisitID | VARCHAR(20) | FK | รหัส Visit |
| UserID | VARCHAR(20) | FK | รหัสผู้ใช้ |
| VerificationDate | DATETIME | วันที่ยืนยัน | |
| VerificationMethod | VARCHAR(20) | วิธีการยืนยัน (REALTIME, BATCH, MANUAL, CACHED) | |
| ValidationProviderID | VARCHAR(10) | FK | รหัสผู้ให้บริการตรวจสอบ (อ้างอิง VALIDATIONPROVIDER) |
| ValidationStatusID | VARCHAR(20) | FK | รหัสสถานะการตรวจสอบ (อ้างอิง VALIDATIONSTATUS) |
| ResponseTime | INT | เวลาตอบสนอง (มิลลิวินาที) | |
| ErrorCode | VARCHAR(20) | รหัสข้อผิดพลาด (ถ้ามี) | |
| ExternalResponse | NTEXT | ผลตอบกลับจากภายนอก | |
| IsVerified | BIT | ยืนยันแล้ว | |
| Notes | NVARCHAR(500) | หมายเหตุ |
8.2.3 ตารางจัดการระบบ (System Tables)
Table: RIGHTSAUDITLOG (บันทึกการแก้ไข)
วัตถุประสงค์: เก็บบันทึก Log การเปลี่ยนแปลงข้อมูลสิทธิทั้งหมด เพื่อการตรวจสอบย้อนหลัง (Audit Trail) รวมถึงการติดตามผู้ทำรายการ เวลา และเหตุผลในการแก้ไข เป็นไปตามข้อกำหนดด้านความปลอดภัยและการควบคุม
| Field | Type | Key | Description |
|---|---|---|---|
| LogID | VARCHAR(20) | PK | รหัส Log |
| PatientRightID | VARCHAR(20) | FK | รหัสสิทธิผู้ป่วย |
| UserID | VARCHAR(20) | FK | รหัสผู้ใช้ (อ้างอิงจากระบบจัดการผู้ใช้กลาง) |
| Action | VARCHAR(50) | การกระทำ | |
| OldValue | NTEXT | ค่าเดิม | |
| NewValue | NTEXT | ค่าใหม่ | |
| ActionDate | DATETIME | วันที่ทำรายการ | |
| IPAddress | VARCHAR(50) | IP Address | |
| Reason | NVARCHAR(200) | เหตุผล |
Table: EXTERNALSYSTEM (ระบบภายนอก)
วัตถุประสงค์: จัดการการเชื่อมต่อกับระบบภายนอก เช่น สปสช. (NHSO) และ สนย. (SSO) รวมถึงระบบประกันสุขภาพอื่นๆ โดยเก็บข้อมูล URL, API Version และสถานะการเชื่อมต่อ เพื่อการ Integration และ Maintenance
| Field | Type | Key | Description |
|---|---|---|---|
| SystemID | VARCHAR(10) | PK | รหัสระบบ |
| SystemCode | VARCHAR(20) | รหัสระบบ (NHSO, SSO, CGD) | |
| SystemName | NVARCHAR(50) | ชื่อระบบ | |
| SystemNameEng | NVARCHAR(50) | ชื่อระบบ (อังกฤษ) | |
| SystemURL | VARCHAR(200) | URL ระบบ | |
| APIVersion | VARCHAR(10) | เวอร์ชัน API | |
| AuthenticationType | VARCHAR(50) | ประเภทการ Authentication | |
| TimeoutSeconds | INT | Timeout (วินาที) | |
| MaxRetryAttempts | INT | จำนวนครั้งสูงสุดที่ Retry | |
| IsActive | BIT | ใช้งานได้ | |
| LastSync | DATETIME | ซิงค์ล่าสุด |
Table: RIGHTSLIMITATION (ข้อจำกัดการใช้สิทธิ์)
วัตถุประสงค์: เก็บข้อมูลข้อจำกัดการใช้สิทธิ์ของแต่ละประเภทสิทธิ เช่น ต้องมีใบส่งตัว, ใช้ได้เฉพาะยาในบัญชี, มีระยะเวลารอคอย
| Field | Type | Key | Description |
|---|---|---|---|
| LimitationID | VARCHAR(20) | PK | รหัสข้อจำกัด |
| RightTypeID | VARCHAR(10) | FK | รหัสประเภทสิทธิ |
| LimitationType | VARCHAR(50) | ประเภทข้อจำกัด | |
| LimitationDescription | NVARCHAR(500) | รายละเอียดข้อจำกัด | |
| IsActive | BIT | ใช้งานได้ |
Table: NETWORKHOSPITAL (โรงพยาบาลในเครือข่าย)
วัตถุประสงค์: เก็บข้อมูลโรงพยาบาลในเครือข่ายที่รองรับสิทธิ์แต่ละประเภท พร้อมข้อมูลสัญญาและระดับโรงพยาบาล
⚠️ หมายเหตุสำหรับทีมพัฒนา: ตารางนี้ออกแบบมาสำหรับ Cross-Hospital Integration ในระยะที่ 3 ของโครงการ จะใช้งานเมื่อมีการพัฒนาระบบการใช้สิทธิข้ามโรงพยาบาลและ Referral System
Use Cases ในอนาคต: - ผู้ป่วย UC จาก รพ.ค่ายธนรัชน์ ใช้สิทธิที่ รพ.อื่นในเครือข่าย - ระบบตรวจสอบ Cross-Hospital Eligibility อัตโนมัติ - Automatic Billing Transfer ระหว่างโรงพยาบาล - การ Refer ผู้ป่วยไปยังโรงพยาบาลที่เหมาะสม
| Field | Type | Key | Description |
|---|---|---|---|
| NetworkHospitalID | VARCHAR(20) | PK | รหัสโรงพยาบาลในเครือข่าย |
| HospitalCode | VARCHAR(10) | รหัสโรงพยาบาล (5 หลัก) | |
| HospitalName | NVARCHAR(200) | ชื่อโรงพยาบาล | |
| HospitalNameEng | NVARCHAR(200) | ชื่อโรงพยาบาล (อังกฤษ) | |
| Province | NVARCHAR(100) | จังหวัด | |
| HospitalLevel | VARCHAR(10) | ระดับโรงพยาบาล (F1, F2, F3) | |
| SupportedSchemes | NVARCHAR(200) | สิทธิที่รองรับ (JSON format) | |
| IsMainContractor | BIT | เป็นผู้รับเหมาหลัก | |
| ContractStartDate | DATE | วันที่เริ่มสัญญา | |
| ContractEndDate | DATE | วันที่สิ้นสุดสัญญา | |
| IsActive | BIT | ใช้งานได้ |
ตัวอย่าง JSON SupportedSchemes:
{ "UC": {"opd": true, "ipd": true, "emergency": true}, "SSS": {"opd": true, "ipd": false, "emergency": true}, "CGD": {"opd": true, "ipd": true, "emergency": true} }การเชื่อมโยงในอนาคต:
-- เชื่อมต่อกับ PATIENTRIGHT (โรงพยาบาลที่ผู้ป่วยสามารถใช้สิทธิได้) ALTER TABLE PATIENTRIGHT ADD COLUMN PreferredNetworkHospitalID VARCHAR(20) NULL; ALTER TABLE PATIENTRIGHT ADD FOREIGN KEY (PreferredNetworkHospitalID) REFERENCES NETWORKHOSPITAL(NetworkHospitalID); -- เชื่อมต่อกับ RIGHTSVERIFICATION (บันทึกโรงพยาบาลต้นทาง) ALTER TABLE RIGHTSVERIFICATION ADD COLUMN SourceHospitalID VARCHAR(20) NULL; ALTER TABLE RIGHTSVERIFICATION ADD FOREIGN KEY (SourceHospitalID) REFERENCES NETWORKHOSPITAL(NetworkHospitalID);
8.2.4 ตาราง Future Enhancement (สำหรับการพัฒนาในอนาคต)
⚠️ หมายเหตุสำคัญสำหรับทีมพัฒนา:
ตาราง
SERVICELEVELและNETWORKHOSPITALออกแบบมาสำหรับการขยายระบบในอนาคต (Future Enhancement)ทางเลือกในการ Implementation:
Option 1: ข้ามไปก่อน (แนะนำสำหรับระยะแรก)
-- ไม่ต้องสร้างตารางเหล่านี้ในระยะแรก -- รอจนกว่าจะมีความต้องการใช้งานจริงOption 2: สร้างเป็น Placeholder
-- สร้างตารางไว้แต่ยังไม่เชื่อมโยง CREATE TABLE SERVICELEVEL (...); CREATE TABLE NETWORKHOSPITAL (...); -- เพิ่ม COMMENT ระบุว่าเป็น Future EnhancementOption 3: เชื่อมโยงเบื้องต้น (สำหรับระยะที่ 2-3)
-- เพิ่ม Foreign Key เมื่อพร้อม implement ALTER TABLE RIGHTTYPE ADD COLUMN ServiceLevelID INT NULL; ALTER TABLE PATIENTRIGHT ADD COLUMN PreferredNetworkHospitalID VARCHAR(20) NULL;
8.2.5 Integration Schema (การเชื่อมโยงกับระบบอื่น)
ระบบตรวจสอบสิทธิจะอ้างอิงข้อมูลจากระบบอื่นผ่าน Foreign Key แทนการสร้างตารางซ้ำ:
การอ้างอิงจากระบบเวชระเบียน (1.2.1):
-- อ้างอิงข้อมูลผู้ป่วยจากระบบเวชระเบียน
MedicalRecord.PATIENT (
HN VARCHAR(10) PK,
CitizenID VARCHAR(13),
FirstName NVARCHAR(50),
LastName NVARCHAR(50),
DateOfBirth DATE,
Gender CHAR(1),
-- ... fields อื่นๆ ตาม TOR 1.2.1
)
-- อ้างอิงข้อมูล Visit จากระบบเวชระเบียน
MedicalRecord.VISIT (
VisitID VARCHAR(20) PK,
HN VARCHAR(10) FK → MedicalRecord.PATIENT.HN,
VisitDate DATETIME,
Department NVARCHAR(50),
-- ... fields อื่นๆ
)
การอ้างอิงจากระบบจัดการผู้ใช้งาน:
-- อ้างอิงผู้ใช้งานจากระบบจัดการผู้ใช้กลาง
UserManagement.USER (
UserID VARCHAR(20) PK,
Username VARCHAR(50),
FullName NVARCHAR(100),
Role VARCHAR(20),
Department NVARCHAR(50),
-- ... fields อื่นๆ
)
การเชื่อมโยงกับระบบการเงิน (1.2.14):
-- อ้างอิงข้อมูลการเงินจากระบบการเงิน (แทนการเก็บใน Rights System)
FinancialSystem.RIGHTSFINANCIALDATA (
RightFinancialID VARCHAR(20) PK,
RightTypeID VARCHAR(10) FK, -- อ้างอิงกลับมาที่ Rights.RIGHTTYPE
PaymentType VARCHAR(20), -- ประเภทการชำระเงิน (เดิมอยู่ใน RIGHTTYPE)
DiscountPercent DECIMAL(5,2), -- เปอร์เซ็นต์ส่วนลด (เดิมอยู่ใน RIGHTTYPE)
Copayment DECIMAL(10,2), -- ค่า Co-payment (เดิมอยู่ใน RIGHTTYPE)
BillingMethod VARCHAR(20), -- วิธีการเรียกเก็บเงิน
ServiceChargeStructure VARCHAR(50), -- โครงสร้างค่าบริการ
CreatedDate DATETIME,
IsActive BIT
);
Integration Notes:
การแยกขอบเขตความรับผิดชอบ (Separation of Concerns):
- ระบบตรวจสอบสิทธิ (1.2.15) = รับผิดชอบเฉพาะการตรวจสอบสิทธิ, ยืนยันสิทธิ, เชื่อมต่อกับ สปสช./สนย.
- ระบบการเงิน (1.2.14) = รับผิดชอบการคำนวณค่าบริการ, การชำระเงิน, ส่วนลด, การออกใบเสร็จ
การอ้างอิงข้อมูล: ระบบตรวจสอบสิทธิจะใช้
FinancialSystemRefเพื่ออ้างอิงไปยังข้อมูลการเงินใน FinancialSystem.RIGHTSFINANCIALDATA แทนการเก็บข้อมูลซ้ำซ้อนตาม TOR 1.2.15.1: ข้อ 2,4,5 ที่กล่าวถึง "ประเภทการชำระเงิน", "ผังการคิดค่าบริการ", "ส่วนลด" จะถูก implement ผ่านการ reference ไปยังระบบการเงิน ไม่ใช่การเก็บข้อมูลโดยตรงในระบบตรวจสอบสิทธิ
Views สำหรับการแสดงข้อมูลรวม:
-- View รวมข้อมูลผู้ป่วยและสิทธิ (ไม่รวมข้อมูลการเงิน)
CREATE VIEW PatientRightsView AS
SELECT
p.HN, p.FirstName, p.LastName, p.CitizenID, p.DateOfBirth,
pr.PatientRightID, pr.RightNumber, pr.StartDate, pr.EndDate, pr.Status as RightStatus,
rt.RightTypeName, rt.FinancialSystemRef,
es.SystemName as ExternalSystemName
FROM
MedicalRecord.PATIENT p
LEFT JOIN Rights.PATIENTRIGHT pr ON p.HN = pr.HN
LEFT JOIN Rights.RIGHTTYPE rt ON pr.RightTypeID = rt.RightTypeID
LEFT JOIN Rights.EXTERNALSYSTEM es ON rt.ExternalSystemID = es.SystemID;
-- View รวมข้อมูลการยืนยันสิทธิ (ไม่รวมข้อมูลการเงิน)
CREATE VIEW RightsVerificationView AS
SELECT
rv.VerificationID, rv.VerificationDate, rv.IsVerified,
p.HN, p.FirstName, p.LastName,
v.VisitDate, v.Department,
u.FullName as VerifiedBy,
pr.RightNumber, rt.RightTypeName, rt.FinancialSystemRef
FROM
Rights.RIGHTSVERIFICATION rv
LEFT JOIN Rights.PATIENTRIGHT pr ON rv.PatientRightID = pr.PatientRightID
LEFT JOIN MedicalRecord.PATIENT p ON pr.HN = p.HN
LEFT JOIN MedicalRecord.VISIT v ON rv.VisitID = v.VisitID
LEFT JOIN UserManagement.USER u ON rv.UserID = u.UserID
LEFT JOIN Rights.RIGHTTYPE rt ON pr.RightTypeID = rt.RightTypeID;
-- View สำหรับ Integration กับ Financial System (การดึงข้อมูลการเงิน)
CREATE VIEW PatientRightsWithFinancialView AS
SELECT
prv.*,
-- ข้อมูลการเงินจาก Financial System (1.2.14)
fs.PaymentType, fs.DiscountPercent, fs.Copayment,
fs.BillingMethod, fs.ServiceChargeStructure
FROM
PatientRightsView prv
LEFT JOIN FinancialSystem.RIGHTSFINANCIALDATA fs
ON prv.FinancialSystemRef = fs.RightFinancialID;
8.2.5 ความสัมพันธ์ระหว่างตาราง (Relationships)
หมายเหตุ: รายละเอียด ER Diagram และความสัมพันธ์แบบละเอียดได้ถูกย้ายไปยังไฟล์
ER Diagram.mdแยกต่างหาก เพื่อความชัดเจนและง่ายต่อการจัดการ
8.2.6 Index และ Constraints
Primary Keys (สำหรับตารางในระบบตรวจสอบสิทธิ): - RIGHTTYPE.RightTypeID (PK) - PATIENTRIGHT.PatientRightID (PK) - RIGHTSVERIFICATION.VerificationID (PK) - RIGHTSAUDITLOG.LogID (PK) - EXTERNALSYSTEM.SystemID (PK)
Foreign Keys (การอ้างอิงไปยังระบบอื่น):
-- อ้างอิงไปยังระบบเวชระเบียน
ALTER TABLE PATIENTRIGHT
ADD CONSTRAINT FK_PATIENTRIGHT_HN
FOREIGN KEY (HN) REFERENCES MedicalRecord.PATIENT(HN);
ALTER TABLE RIGHTSVERIFICATION
ADD CONSTRAINT FK_RIGHTSVERIFICATION_VISIT
FOREIGN KEY (VisitID) REFERENCES MedicalRecord.VISIT(VisitID);
-- อ้างอิงไปยังระบบจัดการผู้ใช้
ALTER TABLE RIGHTSVERIFICATION
ADD CONSTRAINT FK_RIGHTSVERIFICATION_USER
FOREIGN KEY (UserID) REFERENCES UserManagement.USER(UserID);
ALTER TABLE RIGHTSAUDITLOG
ADD CONSTRAINT FK_RIGHTSAUDITLOG_USER
FOREIGN KEY (UserID) REFERENCES UserManagement.USER(UserID);
-- Foreign Keys ภายในระบบตรวจสอบสิทธิ
ALTER TABLE PATIENTRIGHT
ADD CONSTRAINT FK_PATIENTRIGHT_RIGHTTYPE
FOREIGN KEY (RightTypeID) REFERENCES RIGHTTYPE(RightTypeID);
ALTER TABLE RIGHTSVERIFICATION
ADD CONSTRAINT FK_RIGHTSVERIFICATION_PATIENTRIGHT
FOREIGN KEY (PatientRightID) REFERENCES PATIENTRIGHT(PatientRightID);
ALTER TABLE RIGHTSVERIFICATION
ADD CONSTRAINT FK_RIGHTSVERIFICATION_VALIDATIONPROVIDER
FOREIGN KEY (ValidationProviderID) REFERENCES VALIDATIONPROVIDER(ProviderID);
ALTER TABLE RIGHTSVERIFICATION
ADD CONSTRAINT FK_RIGHTSVERIFICATION_VALIDATIONSTATUS
FOREIGN KEY (ValidationStatusID) REFERENCES VALIDATIONSTATUS(StatusID);
ALTER TABLE RIGHTSAUDITLOG
ADD CONSTRAINT FK_RIGHTSAUDITLOG_PATIENTRIGHT
FOREIGN KEY (PatientRightID) REFERENCES PATIENTRIGHT(PatientRightID);
ALTER TABLE TREATMENTCOVERAGE
ADD CONSTRAINT FK_TREATMENTCOVERAGE_RIGHTTYPE
FOREIGN KEY (RightTypeID) REFERENCES RIGHTTYPE(RightTypeID);
ALTER TABLE RIGHTSLIMITATION
ADD CONSTRAINT FK_RIGHTSLIMITATION_RIGHTTYPE
FOREIGN KEY (RightTypeID) REFERENCES RIGHTTYPE(RightTypeID);
ALTER TABLE RIGHTTYPE
ADD CONSTRAINT FK_RIGHTTYPE_EXTERNALSYSTEM
FOREIGN KEY (ExternalSystemID) REFERENCES EXTERNALSYSTEM(SystemID);
-- Foreign Keys สำหรับตารางการเงินใหม่
ALTER TABLE RIGHTSPAYMENTTYPE
ADD CONSTRAINT FK_RIGHTSPAYMENTTYPE_RIGHTTYPE
FOREIGN KEY (RightTypeID) REFERENCES RIGHTTYPE(RightTypeID);
ALTER TABLE RIGHTSRECEIPTTYPE
ADD CONSTRAINT FK_RIGHTSRECEIPTTYPE_RIGHTTYPE
FOREIGN KEY (RightTypeID) REFERENCES RIGHTTYPE(RightTypeID);
ALTER TABLE RIGHTSDISCOUNT
ADD CONSTRAINT FK_RIGHTSDISCOUNT_RIGHTTYPE
FOREIGN KEY (RightTypeID) REFERENCES RIGHTTYPE(RightTypeID);
Indexes (สำหรับประสิทธิภาพการค้นหา):
-- Indexes สำหรับการค้นหาที่ใช้บ่อย
CREATE INDEX IX_PATIENTRIGHT_HN ON PATIENTRIGHT(HN);
CREATE INDEX IX_PATIENTRIGHT_STATUS ON PATIENTRIGHT(Status);
CREATE INDEX IX_PATIENTRIGHT_STARTDATE ON PATIENTRIGHT(StartDate);
CREATE INDEX IX_PATIENTRIGHT_ENDDATE ON PATIENTRIGHT(EndDate);
CREATE INDEX IX_PATIENTRIGHT_RIGHTNUMBER ON PATIENTRIGHT(RightNumber);
CREATE INDEX IX_RIGHTSVERIFICATION_DATE ON RIGHTSVERIFICATION(VerificationDate);
CREATE INDEX IX_RIGHTSVERIFICATION_ISVERIFIED ON RIGHTSVERIFICATION(IsVerified);
CREATE INDEX IX_RIGHTSVERIFICATION_METHOD ON RIGHTSVERIFICATION(VerificationMethod);
CREATE INDEX IX_RIGHTSAUDITLOG_DATE ON RIGHTSAUDITLOG(ActionDate);
CREATE INDEX IX_RIGHTSAUDITLOG_ACTION ON RIGHTSAUDITLOG(Action);
CREATE INDEX IX_RIGHTTYPE_CATEGORY ON RIGHTTYPE(Category);
CREATE INDEX IX_RIGHTTYPE_ISACTIVE ON RIGHTTYPE(IsActive);
CREATE INDEX IX_TREATMENTCOVERAGE_RIGHTTYPE ON TREATMENTCOVERAGE(RightTypeID);
CREATE INDEX IX_TREATMENTCOVERAGE_TREATMENTTYPE ON TREATMENTCOVERAGE(TreatmentType);
CREATE INDEX IX_VALIDATIONPROVIDER_CODE ON VALIDATIONPROVIDER(ProviderCode);
CREATE INDEX IX_VALIDATIONSTATUS_CODE ON VALIDATIONSTATUS(StatusCode);
-- Indexes สำหรับตารางการเงินใหม่
CREATE INDEX IX_RIGHTSPAYMENTTYPE_RIGHTTYPE ON RIGHTSPAYMENTTYPE(RightTypeID);
CREATE INDEX IX_RIGHTSPAYMENTTYPE_CODE ON RIGHTSPAYMENTTYPE(PaymentCode);
CREATE INDEX IX_RIGHTSRECEIPTTYPE_RIGHTTYPE ON RIGHTSRECEIPTTYPE(RightTypeID);
CREATE INDEX IX_RIGHTSRECEIPTTYPE_CODE ON RIGHTSRECEIPTTYPE(ReceiptCode);
CREATE INDEX IX_RIGHTSDISCOUNT_RIGHTTYPE ON RIGHTSDISCOUNT(RightTypeID);
CREATE INDEX IX_RIGHTSDISCOUNT_CATEGORY ON RIGHTSDISCOUNT(ExpenseCategory);
CREATE INDEX IX_RIGHTSDISCOUNT_DATES ON RIGHTSDISCOUNT(EffectiveDate, ExpiryDate);
-- Unique Constraints
ALTER TABLE RIGHTTYPE
ADD CONSTRAINT UQ_RIGHTTYPE_NAME UNIQUE (RightTypeName);
ALTER TABLE EXTERNALSYSTEM
ADD CONSTRAINT UQ_EXTERNALSYSTEM_NAME UNIQUE (SystemName);
ALTER TABLE EXTERNALSYSTEM
ADD CONSTRAINT UQ_EXTERNALSYSTEM_CODE UNIQUE (SystemCode);
ALTER TABLE VALIDATIONPROVIDER
ADD CONSTRAINT UQ_VALIDATIONPROVIDER_CODE UNIQUE (ProviderCode);
ALTER TABLE VALIDATIONSTATUS
ADD CONSTRAINT UQ_VALIDATIONSTATUS_CODE UNIQUE (StatusCode);
ALTER TABLE SERVICELEVEL
ADD CONSTRAINT UQ_SERVICELEVEL_CODE UNIQUE (LevelCode);
ALTER TABLE NETWORKHOSPITAL
ADD CONSTRAINT UQ_NETWORKHOSPITAL_CODE UNIQUE (HospitalCode);
Check Constraints (ตรวจสอบความถูกต้องของข้อมูล):
-- ตรวจสอบวันที่
ALTER TABLE PATIENTRIGHT
ADD CONSTRAINT CHK_PATIENTRIGHT_DATES
CHECK (EndDate >= StartDate);
-- ตรวจสอบสถานะสิทธิ
ALTER TABLE PATIENTRIGHT
ADD CONSTRAINT CHK_PATIENTRIGHT_STATUS
CHECK (Status IN ('ACTIVE', 'EXPIRED', 'SUSPENDED', 'CANCELLED'));
-- ตรวจสอบ Financial System Reference ต้องไม่เป็นค่าว่าง
ALTER TABLE RIGHTTYPE
ADD CONSTRAINT CHK_RIGHTTYPE_FINANCIALREF
CHECK (FinancialSystemRef IS NOT NULL AND LEN(FinancialSystemRef) > 0);
-- ตรวจสอบ Verification Method
ALTER TABLE RIGHTSVERIFICATION
ADD CONSTRAINT CHK_VERIFICATION_METHOD
CHECK (VerificationMethod IN ('REALTIME', 'BATCH', 'MANUAL', 'CACHED'));
-- ตรวจสอบ Coverage Percentage
ALTER TABLE RIGHTTYPE
ADD CONSTRAINT CHK_RIGHTTYPE_COVERAGE
CHECK (CoveragePercentage >= 0 AND CoveragePercentage <= 100);
-- ตรวจสอบ Priority Level
ALTER TABLE RIGHTTYPE
ADD CONSTRAINT CHK_RIGHTTYPE_PRIORITY
CHECK (PriorityLevel >= 1 AND PriorityLevel <= 5);
-- ตรวจสอบ Treatment Type
ALTER TABLE TREATMENTCOVERAGE
ADD CONSTRAINT CHK_TREATMENTCOVERAGE_TYPE
CHECK (TreatmentType IN ('OPD', 'IPD', 'ER', 'DENTAL', 'REHAB'));
-- ตรวจสอบ Hospital Level
ALTER TABLE NETWORKHOSPITAL
ADD CONSTRAINT CHK_NETWORKHOSPITAL_LEVEL
CHECK (HospitalLevel IN ('F1', 'F2', 'F3', 'S', 'M1', 'M2', 'A'));
-- ตรวจสอบ Service Level Code
ALTER TABLE SERVICELEVEL
ADD CONSTRAINT CHK_SERVICELEVEL_CODE
CHECK (LevelCode IN ('BASIC', 'STANDARD', 'PREMIUM'));
-- ตรวจสอบ Status Code
ALTER TABLE VALIDATIONSTATUS
ADD CONSTRAINT CHK_VALIDATIONSTATUS_CODE
CHECK (StatusCode IN ('VALID', 'EXPIRED', 'SUSPENDED', 'INVALID', 'PENDING', 'ERROR'));
-- ตรวจสอบ Response Time ต้องเป็นค่าบวก
ALTER TABLE RIGHTSVERIFICATION
ADD CONSTRAINT CHK_VERIFICATION_RESPONSETIME
CHECK (ResponseTime IS NULL OR ResponseTime >= 0);
-- ตรวจสอบ Copayment ต้องเป็นค่าบวก
ALTER TABLE TREATMENTCOVERAGE
ADD CONSTRAINT CHK_TREATMENTCOVERAGE_COPAYMENT
CHECK (CopaymentAmount IS NULL OR CopaymentAmount >= 0);
-- ตรวจสอบ Limit Per Visit ต้องเป็นค่าบวก
ALTER TABLE TREATMENTCOVERAGE
ADD CONSTRAINT CHK_TREATMENTCOVERAGE_LIMIT
CHECK (LimitPerVisit IS NULL OR LimitPerVisit >= 0);
-- ตรวจสอบวันที่สัญญาโรงพยาบาล
ALTER TABLE NETWORKHOSPITAL
ADD CONSTRAINT CHK_NETWORKHOSPITAL_DATES
CHECK (ContractEndDate >= ContractStartDate);
-- Check Constraints สำหรับตารางการเงินใหม่
-- ตรวจสอบ Payment Code
ALTER TABLE RIGHTSPAYMENTTYPE
ADD CONSTRAINT CHK_PAYMENTTYPE_CODE
CHECK (PaymentCode IN ('FULL_COVERAGE', 'COPAYMENT', 'DEDUCTIBLE', 'SELF_PAY'));
-- ตรวจสอบ Default Amount ต้องเป็นค่าบวก
ALTER TABLE RIGHTSPAYMENTTYPE
ADD CONSTRAINT CHK_PAYMENTTYPE_AMOUNT
CHECK (DefaultAmount IS NULL OR DefaultAmount >= 0);
-- ตรวจสอบ Payment Method
ALTER TABLE RIGHTSPAYMENTTYPE
ADD CONSTRAINT CHK_PAYMENTTYPE_METHOD
CHECK (PaymentMethod IN ('CASH', 'CREDIT', 'TRANSFER', 'CHEQUE'));
-- ตรวจสอบ Receipt Code
ALTER TABLE RIGHTSRECEIPTTYPE
ADD CONSTRAINT CHK_RECEIPTTYPE_CODE
CHECK (ReceiptCode IN ('GOVERNMENT', 'PERSONAL', 'INSURANCE', 'CORPORATE'));
-- ตรวจสอบ Print Copies ต้องเป็นค่าบวก
ALTER TABLE RIGHTSRECEIPTTYPE
ADD CONSTRAINT CHK_RECEIPTTYPE_COPIES
CHECK (PrintCopies > 0);
-- ตรวจสอบ Expense Category
ALTER TABLE RIGHTSDISCOUNT
ADD CONSTRAINT CHK_DISCOUNT_CATEGORY
CHECK (ExpenseCategory IN ('TREATMENT', 'MEDICINE', 'LAB', 'XRAY', 'PROCEDURE', 'ACCOMMODATION', 'OTHER'));
-- ตรวจสอบ Discount Type
ALTER TABLE RIGHTSDISCOUNT
ADD CONSTRAINT CHK_DISCOUNT_TYPE
CHECK (DiscountType IN ('PERCENTAGE', 'FIXED_AMOUNT', 'FREE'));
-- ตรวจสอบ Discount Value ต้องเป็นค่าบวก
ALTER TABLE RIGHTSDISCOUNT
ADD CONSTRAINT CHK_DISCOUNT_VALUE
CHECK (DiscountValue >= 0);
-- ตรวจสอบวันที่มีผล
ALTER TABLE RIGHTSDISCOUNT
ADD CONSTRAINT CHK_DISCOUNT_DATES
CHECK (ExpiryDate IS NULL OR ExpiryDate >= EffectiveDate);
เอกสารนี้จัดทำขึ้นเพื่อใช้ในการพัฒนาระบบตรวจสอบสิทธิสำหรับโรงพยาบาลค่ายธนรัชน์ และต้องได้รับการอนุมัติจากผู้มีอำนาจก่อนนำไปใช้ในการพัฒนาระบบ