ข้ามไปที่เนื้อหา

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 Enhancement

Option 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. ระบบตรวจสอบสิทธิ (1.2.15) = รับผิดชอบเฉพาะการตรวจสอบสิทธิ, ยืนยันสิทธิ, เชื่อมต่อกับ สปสช./สนย.
  2. ระบบการเงิน (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);

เอกสารนี้จัดทำขึ้นเพื่อใช้ในการพัฒนาระบบตรวจสอบสิทธิสำหรับโรงพยาบาลค่ายธนรัชน์ และต้องได้รับการอนุมัติจากผู้มีอำนาจก่อนนำไปใช้ในการพัฒนาระบบ