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

Database Schema - ระบบนัดหมายผู้ป่วยและระบบบริหารจัดการคิว

Document Version: 1.0
Date: 11 สิงหาคม 2025
Integration with: ระบบงานเวชระเบียนและเวชสถิติ (EMR System)

เอกสารนี้รวบรวมโครงสร้างตารางฐานข้อมูลสำหรับระบบนัดหมายผู้ป่วยและระบบบริหารจัดการคิว ที่เชื่อมโยงกับระบบเวชระเบียนที่มีอยู่


Table of Contents

SECTION 1: CORE MASTER DATA TABLES

  1. ตาราง users
  2. ตาราง departments
  3. ตาราง clinics
  4. ตาราง doctors

SECTION 2: DOCTOR SCHEDULE MANAGEMENT

  1. ตาราง doctor_schedules
  2. ตาราง clinic_schedules
  3. ตาราง schedule_exceptions

SECTION 3: APPOINTMENT SYSTEM

  1. ตาราง appointment_packages
  2. ตาราง appointment_package_items
  3. ตาราง appointments
  4. ตาราง appointment_slots
  5. ตาราง appointment_history
  6. ตาราง appointment_reminders

SECTION 4: QUEUE MANAGEMENT SYSTEM

  1. ตาราง queue_configurations
  2. ตาราง queue_sessions
  3. ตาราง queues
  4. ตาราง queue_calls
  5. ตาราง queue_displays

SECTION 5: MULTI-CHANNEL INTEGRATION

  1. ตาราง line_bot_users
  2. ตาราง mobile_app_sessions
  3. ตาราง notification_logs
  4. ตาราง communication_templates

SECTION 6: INTEGRATION & AUDIT

  1. ตาราง external_integrations
  2. ตาราง system_audit_logs

MASTER SCHEMA ALIGNMENT NOTES

ระบบนัดหมายและคิวใช้ Foundation Tables จาก Master Schema และเพิ่ม Module-specific tables:

  • Foundation Tables: users, departments, medical_visits, patients จาก Master Schema
  • Integration Points: เชื่อมต่อกับ EMR Core System อย่างไร้รอยต่อ
  • Multi-Channel Support: Mobile App, Line Bot, Kiosk, Staff Portal integration
  • Real-time Updates: WebSocket สำหรับ queue status updates
  • Compliance Ready: Audit trails และ PDPA compliance

SECTION 1: SHARED FOUNDATION TABLES (จาก Master Schema)

หมายเหตุ: ตารางหลักเหล่านี้ถูกกำหนดใน MASTER_DATABASE_SCHEMA.md และใช้ร่วมกันทุกโมดูล

Foundation Tables ที่ใช้ร่วมกัน:

  1. users - ผู้ใช้งานระบบทั้งหมด (Healthcare staff, admin)
  2. patients - ข้อมูลผู้ป่วยหลัก (Master Patient Index)
  3. departments - โครงสร้างแผนกโรงพยาบาล
  4. clinics - คลินิกต่างๆ ภายในแผนก
  5. medical_visits - ข้อมูลการมารับบริการ
  6. appointments - ระบบนัดหมายหลัก (จาก Master Schema)
  7. queues - ระบบคิวแบบ Real-time (จาก Master Schema)
  8. roles และ permissions - ระบบ RBAC
  9. audit_logs - Audit trail สำหรับ compliance
  10. notifications - ระบบแจ้งเตือนแบบ Multi-channel

Integration Benefits: - ไม่มีการสร้างตารางซ้ำซ้อน - ข้อมูลสอดคล้องกันระหว่างโมดูล
- รองรับ Real-time integration - ปฏิบัติตาม Healthcare compliance standards


2. ตาราง departments

ตารางแผนก/หน่วยงาน - เชื่อมโยงกับระบบเวชระเบียนที่มีอยู่

CREATE TABLE departments (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    dept_code VARCHAR(10) UNIQUE NOT NULL,
    dept_name_thai VARCHAR(100) NOT NULL,
    dept_name_eng VARCHAR(100),
    dept_type VARCHAR(20) CHECK (dept_type IN ('clinical', 'support', 'administration')) DEFAULT 'clinical',

    -- Department Information
    description TEXT,
    location VARCHAR(100),
    floor_number INTEGER,
    building VARCHAR(50),

    -- Contact Information
    phone_number VARCHAR(15),
    extension VARCHAR(10),
    email VARCHAR(100),

    -- Operating Hours
    operating_hours JSONB,

    -- Management
    head_doctor_id UUID,

    -- Status
    is_active BOOLEAN DEFAULT TRUE,
    accepts_appointments BOOLEAN DEFAULT TRUE,
    accepts_walkins BOOLEAN DEFAULT TRUE,

    -- Audit Fields
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    created_by UUID REFERENCES users(id),
    updated_by UUID REFERENCES users(id)
);

คำอธิบายฟิลด์ (Field Descriptions):

Field Type Constraints คำอธิบาย
id UUID PRIMARY KEY รหัสเฉพาะของแผนก
dept_code VARCHAR(10) UNIQUE, NOT NULL รหัสแผนก (เช่น MED001, SUR002)
dept_name_thai VARCHAR(100) NOT NULL ชื่อแผนก (ภาษาไทย)
dept_name_eng VARCHAR(100) ชื่อแผนก (ภาษาอังกฤษ)
dept_type VARCHAR(20) CHECK ประเภทแผนก (clinical, support, administration)
description TEXT คำอธิบายแผนก
location VARCHAR(100) ที่ตั้งของแผนก
floor_number INTEGER ชั้นที่ตั้ง
building VARCHAR(50) อาคารที่ตั้ง
phone_number VARCHAR(15) เบอร์โทรศัพท์แผนก
extension VARCHAR(10) เบอร์ภายใน
email VARCHAR(100) อีเมลแผนก
operating_hours JSONB เวลาทำการ (JSON format)
head_doctor_id UUID FK รหัสหัวหน้าแผนก
is_active BOOLEAN DEFAULT TRUE สถานะการใช้งาน
accepts_appointments BOOLEAN DEFAULT TRUE รับการนัดหมายหรือไม่
accepts_walkins BOOLEAN DEFAULT TRUE รับ Walk-in หรือไม่

3. ตาราง clinics

ตารางคลินิกภายในแผนก - รองรับการจัดการตารางเวลาและคิว

CREATE TABLE clinics (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    department_id UUID NOT NULL REFERENCES departments(id),
    clinic_code VARCHAR(10) NOT NULL,
    clinic_name_thai VARCHAR(100) NOT NULL,
    clinic_name_eng VARCHAR(100),

    -- Clinic Information
    description TEXT,
    room_number VARCHAR(20),
    capacity INTEGER DEFAULT 1,

    -- Operating Schedule
    default_operating_hours JSONB,
    appointment_duration_minutes INTEGER DEFAULT 30,

    -- Queue Settings
    max_queue_per_day INTEGER,
    allow_walkin BOOLEAN DEFAULT TRUE,
    priority_queue_percentage DECIMAL(3,2) DEFAULT 0.20,

    -- Status
    is_active BOOLEAN DEFAULT TRUE,

    -- Audit Fields
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    created_by UUID REFERENCES users(id),
    updated_by UUID REFERENCES users(id),

    UNIQUE(department_id, clinic_code)
);

คำอธิบายฟิลด์ (Field Descriptions):

Field Type Constraints คำอธิบาย
id UUID PRIMARY KEY รหัสเฉพาะของคลินิก
department_id UUID NOT NULL, FK รหัสแผนกที่สังกัด
clinic_code VARCHAR(10) NOT NULL รหัสคลินิก (เช่น MED001-01)
clinic_name_thai VARCHAR(100) NOT NULL ชื่อคลินิก (ภาษาไทย)
clinic_name_eng VARCHAR(100) ชื่อคลินิก (ภาษาอังกฤษ)
description TEXT คำอธิบายคลินิก
room_number VARCHAR(20) หมายเลขห้อง
capacity INTEGER DEFAULT 1 จำนวนผู้ป่วยที่รับได้พร้อมกัน
default_operating_hours JSONB เวลาทำการมาตรฐาน (JSON format)
appointment_duration_minutes INTEGER DEFAULT 30 ระยะเวลานัดมาตรฐาน (นาที)
max_queue_per_day INTEGER จำนวนคิวสูงสุดต่อวัน
allow_walkin BOOLEAN DEFAULT TRUE อนุญาต Walk-in หรือไม่
priority_queue_percentage DECIMAL(3,2) DEFAULT 0.20 เปอร์เซ็นต์สำหรับคิวพิเศษ
is_active BOOLEAN DEFAULT TRUE สถานะการใช้งาน

4. ตาราง doctors

ตารางข้อมูลแพทย์ - รวมข้อมูลทางวิชาชีพและการตั้งค่าการนัด

CREATE TABLE doctors (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    user_id UUID UNIQUE REFERENCES users(id),
    doctor_code VARCHAR(10) UNIQUE NOT NULL,

    -- Professional Information
    medical_license_number VARCHAR(20) UNIQUE NOT NULL,
    specialization_thai VARCHAR(100),
    specialization_eng VARCHAR(100),
    title_thai VARCHAR(50) NOT NULL,
    title_eng VARCHAR(50),

    -- Affiliation
    primary_department_id UUID REFERENCES departments(id),
    secondary_departments UUID[],

    -- Schedule Settings
    default_appointment_duration INTEGER DEFAULT 30,
    max_patients_per_day INTEGER DEFAULT 40,
    consultation_fee DECIMAL(8,2),

    -- Professional Details
    education JSONB,
    board_certifications JSONB,
    experience_years INTEGER,

    -- Contact and Availability
    available_for_emergency BOOLEAN DEFAULT FALSE,
    on_call_phone VARCHAR(15),

    -- Status
    is_active BOOLEAN DEFAULT TRUE,
    employment_status VARCHAR(20) CHECK (employment_status IN ('full_time', 'part_time', 'consultant', 'retired')) DEFAULT 'full_time',

    -- Audit Fields
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    created_by UUID REFERENCES users(id),
    updated_by UUID REFERENCES users(id)
);

คำอธิบายฟิลด์ (Field Descriptions):

Field Type Constraints คำอธิบาย
id UUID PRIMARY KEY รหัสเฉพาะของแพทย์
user_id UUID UNIQUE, FK รหัสผู้ใช้ที่เชื่อมโยง
doctor_code VARCHAR(10) UNIQUE, NOT NULL รหัสแพทย์ (เช่น DOC001)
medical_license_number VARCHAR(20) UNIQUE, NOT NULL เลขที่ใบอนุญาตประกอบวิชาชีพ
specialization_thai VARCHAR(100) ความเชี่ยวชาญ (ภาษาไทย)
specialization_eng VARCHAR(100) ความเชี่ยวชาญ (ภาษาอังกฤษ)
title_thai VARCHAR(50) NOT NULL คำนำหน้า (นพ./พญ./ผศ.นพ.)
title_eng VARCHAR(50) คำนำหน้า (Dr./Prof.Dr.)
primary_department_id UUID FK รหัสแผนกหลัก
secondary_departments UUID[] รหัสแผนกรอง (Array)
default_appointment_duration INTEGER DEFAULT 30 ระยะเวลานัดมาตรฐาน (นาที)
max_patients_per_day INTEGER DEFAULT 40 จำนวนผู้ป่วยสูงสุดต่อวัน
consultation_fee DECIMAL(8,2) ค่าตรวจ
education JSONB ประวัติการศึกษา (JSON format)
board_certifications JSONB ใบรับรอง (JSON format)
experience_years INTEGER จำนวนปีประสบการณ์
available_for_emergency BOOLEAN DEFAULT FALSE พร้อมรับเคสฉุกเฉินหรือไม่
on_call_phone VARCHAR(15) เบอร์โทรศัพท์เวร
is_active BOOLEAN DEFAULT TRUE สถานะการใช้งาน
employment_status VARCHAR(20) CHECK สถานะการจ้างงาน

SECTION 2: DOCTOR SCHEDULE MANAGEMENT

5. ตาราง doctor_schedules

ตารางเวลาการทำงานของแพทย์ - รองรับการจัดสรร slots ตามช่องทาง

CREATE TABLE doctor_schedules (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    doctor_id UUID NOT NULL REFERENCES doctors(id),
    clinic_id UUID NOT NULL REFERENCES clinics(id),

    -- Schedule Date and Time
    schedule_date DATE NOT NULL,
    session_type VARCHAR(10) CHECK (session_type IN ('morning', 'afternoon', 'evening', 'night')) NOT NULL,
    start_time TIME NOT NULL,
    end_time TIME NOT NULL,

    -- Slot Configuration
    slot_duration_minutes INTEGER DEFAULT 30,
    max_patients_per_slot INTEGER DEFAULT 1,
    max_patients_per_session INTEGER,

    -- Channel Allocation
    total_slots INTEGER,
    staff_reserved_slots INTEGER DEFAULT 0,
    mobile_app_slots INTEGER DEFAULT 0,
    line_bot_slots INTEGER DEFAULT 0,
    walkin_slots INTEGER DEFAULT 0,

    -- Status
    status VARCHAR(20) DEFAULT 'active' CHECK (status IN ('active', 'cancelled', 'modified', 'completed')),

    -- Audit Fields
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    created_by UUID REFERENCES users(id),
    updated_by UUID REFERENCES users(id)
);

คำอธิบายฟิลด์ (Field Descriptions):

Field Type Constraints คำอธิบาย
id UUID PRIMARY KEY รหัสเฉพาะของตารางเวลา
doctor_id UUID NOT NULL, FK รหัสแพทย์
clinic_id UUID NOT NULL, FK รหัสคลินิก
schedule_date DATE NOT NULL วันที่ทำการ
session_type VARCHAR(10) CHECK ช่วงเวลา (morning, afternoon, evening, night)
start_time TIME NOT NULL เวลาเริ่ม
end_time TIME NOT NULL เวลาสิ้นสุด
slot_duration_minutes INTEGER DEFAULT 30 ระยะเวลาต่อ slot (นาที)
max_patients_per_slot INTEGER DEFAULT 1 จำนวนผู้ป่วยสูงสุดต่อ slot
max_patients_per_session INTEGER จำนวนผู้ป่วยสูงสุดต่อ session
total_slots INTEGER จำนวน slots ทั้งหมด
staff_reserved_slots INTEGER DEFAULT 0 slots สำหรับเจ้าหน้าที่
mobile_app_slots INTEGER DEFAULT 0 slots สำหรับ Mobile App
line_bot_slots INTEGER DEFAULT 0 slots สำหรับ Line Bot
walkin_slots INTEGER DEFAULT 0 slots สำหรับ Walk-in
status VARCHAR(20) CHECK สถานะตารางเวลา

6. ตาราง clinic_schedules

ตารางตั้งค่าเวลาทำการของคลินิก - รองรับการกำหนด slot และช่องทาง

CREATE TABLE clinic_schedules (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    clinic_id UUID NOT NULL REFERENCES clinics(id),

    -- Schedule Configuration
    schedule_date DATE NOT NULL,
    session_type VARCHAR(10) CHECK (session_type IN ('morning', 'afternoon', 'evening', 'allday')) NOT NULL,
    start_time TIME NOT NULL,
    end_time TIME NOT NULL,

    -- Slot Configuration
    slot_type VARCHAR(20) CHECK (slot_type IN ('fixed_time', 'duration_based', 'flexible')) DEFAULT 'duration_based',
    slot_duration_minutes INTEGER DEFAULT 30,
    slots_per_hour INTEGER DEFAULT 2,

    -- Capacity Management
    max_appointments_per_day INTEGER,
    max_appointments_per_slot INTEGER DEFAULT 1,

    -- Channel Allocation (รองรับ TOR 6)
    total_available_slots INTEGER,
    staff_channel_slots INTEGER DEFAULT 0,
    mobile_app_slots INTEGER DEFAULT 0,
    line_bot_slots INTEGER DEFAULT 0,
    walk_in_reserved_slots INTEGER DEFAULT 0,

    -- Special Settings
    allows_emergency_booking BOOLEAN DEFAULT FALSE,
    priority_booking_percentage DECIMAL(3,2) DEFAULT 0.10,

    -- Status
    status VARCHAR(20) DEFAULT 'open' CHECK (status IN ('open', 'closed', 'full', 'restricted')),

    -- Audit Fields
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    created_by UUID REFERENCES users(id),
    updated_by UUID REFERENCES users(id)
);

คำอธิบายฟิลด์ (Field Descriptions):

Field Type Constraints คำอธิบาย
id UUID PRIMARY KEY รหัสเฉพาะของตารางเวลาคลินิก
clinic_id UUID NOT NULL, FK รหัสคลินิก
schedule_date DATE NOT NULL วันที่เปิดให้บริการ
session_type VARCHAR(10) CHECK ช่วงเวลา (morning, afternoon, evening, allday)
start_time TIME NOT NULL เวลาเริ่มให้บริการ
end_time TIME NOT NULL เวลาสิ้นสุดให้บริการ
slot_type VARCHAR(20) CHECK รูปแบบการจอง (fixed_time, duration_based, flexible)
slot_duration_minutes INTEGER DEFAULT 30 ระยะเวลาต่อ slot (นาที)
slots_per_hour INTEGER DEFAULT 2 จำนวน slots ต่อชั่วโมง
max_appointments_per_day INTEGER จำนวนการนัดสูงสุดต่อวัน
max_appointments_per_slot INTEGER DEFAULT 1 จำนวนการนัดสูงสุดต่อ slot
total_available_slots INTEGER จำนวน slots ทั้งหมดที่เปิดให้จอง
staff_channel_slots INTEGER DEFAULT 0 slots สำหรับเจ้าหน้าที่
mobile_app_slots INTEGER DEFAULT 0 slots สำหรับ Mobile App
line_bot_slots INTEGER DEFAULT 0 slots สำหรับ Line Bot
walk_in_reserved_slots INTEGER DEFAULT 0 slots สำหรับ Walk-in
allows_emergency_booking BOOLEAN DEFAULT FALSE อนุญาตการนัดฉุกเฉินหรือไม่
priority_booking_percentage DECIMAL(3,2) DEFAULT 0.10 เปอร์เซ็นต์สำหรับการนัดพิเศษ
status VARCHAR(20) CHECK สถานะการเปิดให้บริการ

7. ตาราง schedule_exceptions

ตารางข้อยกเว้นตารางเวลา - วันหยุด, วันพิเศษ, การเปลี่ยนแปลงตารางเวลา

CREATE TABLE schedule_exceptions (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),

    -- Target (Doctor or Clinic)
    doctor_id UUID REFERENCES doctors(id),
    clinic_id UUID REFERENCES clinics(id),
    department_id UUID REFERENCES departments(id),

    -- Exception Details
    exception_date DATE NOT NULL,
    exception_type VARCHAR(20) NOT NULL CHECK (exception_type IN ('holiday', 'special_hours', 'closed', 'emergency_only', 'reduced_capacity')),

    -- Alternative Schedule
    alternative_start_time TIME,
    alternative_end_time TIME,
    alternative_max_patients INTEGER,

    -- Description
    reason TEXT NOT NULL,
    description_thai TEXT,
    description_eng TEXT,

    -- Notification
    notify_existing_appointments BOOLEAN DEFAULT TRUE,
    auto_reschedule_appointments BOOLEAN DEFAULT FALSE,

    -- Status
    is_active BOOLEAN DEFAULT TRUE,

    -- Audit Fields
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    created_by UUID REFERENCES users(id),
    updated_by UUID REFERENCES users(id),

    -- Constraint: Must have at least one target
    CONSTRAINT chk_exception_target CHECK (
        (doctor_id IS NOT NULL) OR (clinic_id IS NOT NULL) OR (department_id IS NOT NULL)
    )
);

คำอธิบายฟิลด์ (Field Descriptions):

Field Type Constraints คำอธิบาย
id UUID PRIMARY KEY รหัสเฉพาะของข้อยกเว้น
doctor_id UUID FK รหัสแพทย์ (ถ้าเป็นยกเว้นเฉพาะแพทย์)
clinic_id UUID FK รหัสคลินิก (ถ้าเป็นยกเว้นทั้งคลินิก)
department_id UUID FK รหัสแผนก (ถ้าเป็นยกเว้นทั้งแผนก)
exception_date DATE NOT NULL วันที่มีข้อยกเว้น
exception_type VARCHAR(20) CHECK ประเภทข้อยกเว้น
alternative_start_time TIME เวลาเริ่มทางเลือก (ถ้ามี)
alternative_end_time TIME เวลาสิ้นสุดทางเลือก (ถ้ามี)
alternative_max_patients INTEGER จำนวนผู้ป่วยสูงสุดทางเลือก
reason TEXT NOT NULL เหตุผลข้อยกเว้น
description_thai TEXT คำอธิบายภาษาไทย
description_eng TEXT คำอธิบายภาษาอังกฤษ
notify_existing_appointments BOOLEAN DEFAULT TRUE แจ้งเตือนการนัดที่มีอยู่
auto_reschedule_appointments BOOLEAN DEFAULT FALSE เลื่อนการนัดอัตโนมัติ

SECTION 3: APPOINTMENT SYSTEM

8. ตาราง appointment_packages

ตารางแพคเกจการนัด - รองรับการนัดเป็นชุดตาม TOR 3

CREATE TABLE appointment_packages (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    package_code VARCHAR(20) UNIQUE NOT NULL,
    package_name_thai VARCHAR(100) NOT NULL,
    package_name_eng VARCHAR(100),

    -- Package Information
    description_thai TEXT,
    description_eng TEXT,
    package_type VARCHAR(30) CHECK (package_type IN ('health_checkup', 'pre_operative', 'follow_up_series', 'treatment_cycle', 'screening_program')) NOT NULL,

    -- Target Group
    target_department_id UUID REFERENCES departments(id),
    applicable_conditions TEXT[],
    age_range_min INTEGER,
    age_range_max INTEGER,
    gender_restriction CHAR(1) CHECK (gender_restriction IN ('M', 'F')),

    -- Package Settings
    total_appointments INTEGER NOT NULL DEFAULT 1,
    sequence_required BOOLEAN DEFAULT TRUE,
    interval_days INTEGER DEFAULT 7,
    max_duration_days INTEGER DEFAULT 90,

    -- Pricing
    package_price DECIMAL(10,2),
    individual_booking_allowed BOOLEAN DEFAULT TRUE,

    -- Instructions
    preparation_instructions_thai TEXT,
    preparation_instructions_eng TEXT,

    -- Status
    is_active BOOLEAN DEFAULT TRUE,
    effective_from DATE DEFAULT CURRENT_DATE,
    effective_to DATE,

    -- Audit Fields
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    created_by UUID REFERENCES users(id),
    updated_by UUID REFERENCES users(id)
);

คำอธิบายฟิลด์ (Field Descriptions):

Field Type Constraints คำอธิบาย
id UUID PRIMARY KEY รหัสเฉพาะของแพคเกจ
package_code VARCHAR(20) UNIQUE, NOT NULL รหัสแพคเกจ
package_name_thai VARCHAR(100) NOT NULL ชื่อแพคเกจ (ภาษาไทย)
package_name_eng VARCHAR(100) ชื่อแพคเกจ (ภาษาอังกฤษ)
description_thai TEXT คำอธิบายแพคเกจ (ภาษาไทย)
description_eng TEXT คำอธิบายแพคเกจ (ภาษาอังกฤษ)
package_type VARCHAR(30) CHECK ประเภทแพคเกจ
target_department_id UUID FK แผนกเป้าหมาย
applicable_conditions TEXT[] เงื่อนไขการใช้งาน
age_range_min INTEGER อายุต่ำสุด
age_range_max INTEGER อายุสูงสุด
gender_restriction CHAR(1) CHECK จำกัดเพศ (M, F)
total_appointments INTEGER NOT NULL จำนวนการนัดในแพคเกจ
sequence_required BOOLEAN DEFAULT TRUE ต้องนัดตามลำดับหรือไม่
interval_days INTEGER DEFAULT 7 ระยะห่างระหว่างการนัด (วัน)
max_duration_days INTEGER DEFAULT 90 ระยะเวลาสูงสุดของแพคเกจ
package_price DECIMAL(10,2) ราคาแพคเกจ
individual_booking_allowed BOOLEAN DEFAULT TRUE อนุญาตนัดแยกรายการได้
preparation_instructions_thai TEXT คำแนะนำการเตรียมตัว (ไทย)
preparation_instructions_eng TEXT คำแนะนำการเตรียมตัว (อังกฤษ)

9. ตาราง appointment_package_items

ตารางรายการในแพคเกจการนัด - รองรับการนัดหลายขั้นตอน

CREATE TABLE appointment_package_items (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    package_id UUID NOT NULL REFERENCES appointment_packages(id) ON DELETE CASCADE,

    -- Item Details
    sequence_number INTEGER NOT NULL,
    item_name_thai VARCHAR(100) NOT NULL,
    item_name_eng VARCHAR(100),
    item_description_thai TEXT,
    item_description_eng TEXT,

    -- Appointment Configuration
    department_id UUID REFERENCES departments(id),
    clinic_id UUID REFERENCES clinics(id),
    doctor_specialization VARCHAR(100),
    appointment_type VARCHAR(30) CHECK (appointment_type IN ('consultation', 'examination', 'lab_test', 'imaging', 'procedure', 'follow_up')),

    -- Timing
    days_from_start INTEGER DEFAULT 0,
    estimated_duration_minutes INTEGER DEFAULT 30,

    -- Requirements
    required_preparation TEXT,
    prerequisite_items INTEGER[], -- Array of sequence_numbers that must be completed first

    -- Pricing
    item_price DECIMAL(8,2),

    -- Status
    is_mandatory BOOLEAN DEFAULT TRUE,
    is_active BOOLEAN DEFAULT TRUE,

    -- Audit Fields
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,

    UNIQUE(package_id, sequence_number)
);

คำอธิบายฟิลด์ (Field Descriptions):

Field Type Constraints คำอธิบาย
id UUID PRIMARY KEY รหัสเฉพาะของรายการ
package_id UUID NOT NULL, FK รหัสแพคเกจที่สังกัด
sequence_number INTEGER NOT NULL ลำดับในแพคเกจ
item_name_thai VARCHAR(100) NOT NULL ชื่อรายการ (ภาษาไทย)
item_name_eng VARCHAR(100) ชื่อรายการ (ภาษาอังกฤษ)
item_description_thai TEXT คำอธิบายรายการ (ไทย)
item_description_eng TEXT คำอธิบายรายการ (อังกฤษ)
department_id UUID FK แผนกที่ให้บริการ
clinic_id UUID FK คลินิกที่ให้บริการ
doctor_specialization VARCHAR(100) ความเชี่ยวชาญแพทย์ที่ต้องการ
appointment_type VARCHAR(30) CHECK ประเภทการนัด
days_from_start INTEGER DEFAULT 0 จำนวนวันนับจากการเริ่มแพคเกจ
estimated_duration_minutes INTEGER DEFAULT 30 เวลาโดยประมาณ (นาที)
required_preparation TEXT การเตรียมตัวที่จำเป็น
prerequisite_items INTEGER[] รายการที่ต้องทำก่อน
item_price DECIMAL(8,2) ราคารายการ
is_mandatory BOOLEAN DEFAULT TRUE บังคับหรือไม่
is_active BOOLEAN DEFAULT TRUE สถานะใช้งาน

10. ตาราง appointments (Master Schema Foundation Table)

ตารางหลักจาก Master Schema: ตาราง appointments ถูกกำหนดใน MASTER_DATABASE_SCHEMA.md
Integration Points: ตารางนี้เชื่อมโยงกับ appointment_packages, appointment_slots, appointment_history ในโมดูลนี้

Key Features from Master Schema: - รองรับการจองแบบ Multi-channel (staff, mobile_app, line_bot, kiosk, website) - ระบบ Package appointments สำหรับการนัดแบบชุด - Reschedule tracking และ notification preferences - เชื่อมโยงกับ patients, medical_visits, users จาก Master Schema - Audit trail และ digital signature support

Module-Specific Extensions: - appointment_packages - แพคเกจการนัดแบบชุด - appointment_slots - การจัดการ time slots - appointment_history - ประวัติการเปลี่ยนแปลง - appointment_reminders - ระบบแจ้งเตือนแบบ Multi-channel

คำอธิบายฟิลด์ (Field Descriptions):

Field Type Constraints คำอธิบาย
id UUID PRIMARY KEY รหัสเฉพาะของการนัด
appointment_number VARCHAR(20) UNIQUE, NOT NULL หมายเลขการนัด (สร้างอัตโนมัติ)
patient_id UUID NOT NULL รหัสผู้ป่วยจากระบบ EMR
visit_id UUID รหัส Visit (ถ้าเชื่อมโยงกับการรับบริการ)
package_id UUID FK รหัสแพคเกจการนัด (ถ้าเป็นส่วนหนึ่งของแพคเกจ)
package_sequence_number INTEGER ลำดับในแพคเกจ
parent_appointment_id UUID FK การนัดหลักในชุด (สำหรับ series appointments)
doctor_id UUID FK รหัสแพทย์
clinic_id UUID NOT NULL, FK รหัสคลินิก
department_id UUID NOT NULL, FK รหัสแผนก
appointment_date DATE NOT NULL วันที่นัด
appointment_time TIME เวลาที่นัด
estimated_duration_minutes INTEGER DEFAULT 30 ระยะเวลาโดยประมาณ (นาที)
session_type VARCHAR(10) CHECK ช่วงเวลา (morning, afternoon, evening)
appointment_type VARCHAR(30) CHECK ประเภทการนัด (รวม admit, discharge_followup)
priority_level INTEGER CHECK ระดับความสำคัญ (1=สูงสุด, 10=ต่ำสุด)
chief_complaint TEXT อาการสำคัญ
reason_for_appointment TEXT เหตุผลการนัด
preparation_instructions TEXT คำแนะนำการเตรียมตัว
pre_appointment_checklist JSONB รายการเตรียมตัวก่อนนัด
booking_channel VARCHAR(20) CHECK ช่องทางการจอง (รวม ward)
booking_reference VARCHAR(50) หมายเลขอ้างอิงจากระบบภายนอก
booked_by_user_id UUID FK ผู้ทำการนัด
referral_source VARCHAR(30) CHECK แหล่งที่มาของการส่งตัว
referring_doctor_id UUID FK แพทย์ผู้ส่งตัว
referring_department_id UUID FK แผนกผู้ส่งตัว
status VARCHAR(20) CHECK สถานะการนัด
confirmation_status VARCHAR(20) CHECK สถานะการยืนยัน
reschedule_count INTEGER DEFAULT 0 จำนวนครั้งที่เลื่อนนัด
original_appointment_date DATE วันนัดเดิม
original_appointment_time TIME เวลานัดเดิม
reschedule_reason TEXT เหตุผลการเลื่อนนัด
last_rescheduled_at TIMESTAMP เวลาที่เลื่อนนัดครั้งล่าสุด
last_rescheduled_by UUID FK ผู้ที่ทำการเลื่อนนัด
notification_preferences JSONB การตั้งค่าการแจ้งเตือน
appointment_card_generated BOOLEAN DEFAULT FALSE สร้างใบนัดแล้ว
appointment_card_sent BOOLEAN DEFAULT FALSE ส่งใบนัดแล้ว
special_needs TEXT ความต้องการพิเศษ
wheelchair_required BOOLEAN DEFAULT FALSE ต้องการรถเข็น
interpreter_needed VARCHAR(20) ต้องการล่าม
estimated_cost DECIMAL(10,2) ประมาณการค่าใช้จ่าย
insurance_coverage_confirmed BOOLEAN DEFAULT FALSE ยืนยันสิทธิการรักษาแล้ว

11. ตาราง appointment_slots

ตารางการจัดการ slots การนัด - รองรับการจองตาม TOR 5

CREATE TABLE appointment_slots (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),

    -- Schedule Reference
    doctor_schedule_id UUID REFERENCES doctor_schedules(id),
    clinic_schedule_id UUID REFERENCES clinic_schedules(id),

    -- Slot Information
    slot_date DATE NOT NULL,
    slot_time TIME NOT NULL,
    slot_duration_minutes INTEGER DEFAULT 30,
    slot_number INTEGER NOT NULL,

    -- Availability Configuration (รองรับ TOR 5 - slot configuration)
    slot_type VARCHAR(20) CHECK (slot_type IN ('fixed_10min', 'fixed_15min', 'fixed_30min', 'fixed_60min', 'flexible', 'allday')) DEFAULT 'fixed_30min',
    max_appointments INTEGER DEFAULT 1,

    -- Channel Allocation (รองรับ TOR 6 - multi-channel)
    reserved_for_channel VARCHAR(20) CHECK (reserved_for_channel IN ('any', 'staff', 'mobile_app', 'line_bot', 'walk_in')),
    channel_quota_used INTEGER DEFAULT 0,

    -- Appointment Assignment
    appointment_id UUID REFERENCES appointments(id),

    -- Status
    status VARCHAR(20) DEFAULT 'available' CHECK (status IN ('available', 'booked', 'blocked', 'cancelled', 'completed')),
    blocking_reason TEXT,

    -- Emergency Override
    emergency_slot BOOLEAN DEFAULT FALSE,
    can_be_overbooked BOOLEAN DEFAULT FALSE,

    -- Audit Fields
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    created_by UUID REFERENCES users(id),
    updated_by UUID REFERENCES users(id),

    -- Ensure slot uniqueness
    UNIQUE(doctor_schedule_id, slot_date, slot_time, slot_number),
    UNIQUE(clinic_schedule_id, slot_date, slot_time, slot_number)
);

คำอธิบายฟิลด์ (Field Descriptions):

Field Type Constraints คำอธิบาย
id UUID PRIMARY KEY รหัสเฉพาะของ slot
doctor_schedule_id UUID FK รหัสตารางเวลาแพทย์
clinic_schedule_id UUID FK รหัสตารางเวลาคลินิก
slot_date DATE NOT NULL วันที่ของ slot
slot_time TIME NOT NULL เวลาของ slot
slot_duration_minutes INTEGER DEFAULT 30 ระยะเวลาของ slot (นาที)
slot_number INTEGER NOT NULL หมายเลข slot ในวันนั้น
slot_type VARCHAR(20) CHECK ประเภท slot (10/15/30/60 นาที, flexible, allday)
max_appointments INTEGER DEFAULT 1 จำนวนการนัดสูงสุดใน slot
reserved_for_channel VARCHAR(20) CHECK จองไว้สำหรับช่องทางใด
channel_quota_used INTEGER DEFAULT 0 จำนวนที่ใช้ไปแล้วใน quota
appointment_id UUID FK รหัสการนัดที่จอง slot นี้
status VARCHAR(20) CHECK สถานะของ slot
blocking_reason TEXT เหตุผลการบล็อก slot
emergency_slot BOOLEAN DEFAULT FALSE slot ฉุกเฉิน
can_be_overbooked BOOLEAN DEFAULT FALSE อนุญาต overbooking

12. ตาราง appointment_history

ตารางประวัติการเปลี่ยนแปลงการนัด - รองรับ TOR 8

CREATE TABLE appointment_history (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    appointment_id UUID NOT NULL REFERENCES appointments(id),

    -- Change Information
    action_type VARCHAR(20) NOT NULL CHECK (action_type IN ('created', 'rescheduled', 'cancelled', 'confirmed', 'checked_in', 'completed', 'no_show')),

    -- Previous Values (สำหรับ reschedule)
    previous_date DATE,
    previous_time TIME,
    previous_doctor_id UUID REFERENCES doctors(id),
    previous_clinic_id UUID REFERENCES clinics(id),

    -- New Values
    new_date DATE,
    new_time TIME,
    new_doctor_id UUID REFERENCES doctors(id),
    new_clinic_id UUID REFERENCES clinics(id),

    -- Change Details
    reason TEXT,
    notes TEXT,
    initiated_by VARCHAR(20) CHECK (initiated_by IN ('patient', 'staff', 'system', 'doctor')),

    -- Communication
    notification_sent BOOLEAN DEFAULT FALSE,
    notification_method VARCHAR(20) CHECK (notification_method IN ('sms', 'line', 'email', 'phone', 'mobile_app')),
    patient_acknowledged BOOLEAN DEFAULT FALSE,

    -- User Information
    changed_by_user_id UUID REFERENCES users(id),
    changed_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,

    -- System Information
    ip_address INET,
    user_agent TEXT
);

คำอธิบายฟิลด์ (Field Descriptions):

Field Type Constraints คำอธิบาย
id UUID PRIMARY KEY รหัสเฉพาะของประวัติ
appointment_id UUID NOT NULL, FK รหัสการนัดที่เกี่ยวข้อง
action_type VARCHAR(20) CHECK ประเภทการเปลี่ยนแปลง
previous_date DATE วันที่เดิม (ก่อนเปลี่ยน)
previous_time TIME เวลาเดิม
previous_doctor_id UUID FK แพทย์เดิม
previous_clinic_id UUID FK คลินิกเดิม
new_date DATE วันที่ใหม่
new_time TIME เวลาใหม่
new_doctor_id UUID FK แพทย์ใหม่
new_clinic_id UUID FK คลินิกใหม่
reason TEXT เหตุผลการเปลี่ยนแปลง
notes TEXT หมายเหตุเพิ่มเติม
initiated_by VARCHAR(20) CHECK ผู้ริเริ่มการเปลี่ยนแปลง
notification_sent BOOLEAN DEFAULT FALSE ส่งการแจ้งเตือนแล้ว
notification_method VARCHAR(20) CHECK วิธีการแจ้งเตือน
patient_acknowledged BOOLEAN DEFAULT FALSE ผู้ป่วยรับทราบแล้ว
changed_by_user_id UUID FK ผู้ทำการเปลี่ยนแปลง
changed_at TIMESTAMP DEFAULT NOW() เวลาที่เปลี่ยนแปลง

13. ตาราง appointment_reminders

ตารางการแจ้งเตือนการนัด - รองรับ TOR 6 และ 2.6

CREATE TABLE appointment_reminders (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    appointment_id UUID NOT NULL REFERENCES appointments(id),

    -- Reminder Configuration
    reminder_type VARCHAR(20) NOT NULL CHECK (reminder_type IN ('confirmation', 'reminder_24h', 'reminder_2h', 'preparation', 'custom')),

    -- Schedule
    scheduled_datetime TIMESTAMP WITH TIME ZONE NOT NULL,
    send_before_minutes INTEGER NOT NULL,

    -- Message Configuration
    message_template_id UUID REFERENCES communication_templates(id),
    custom_message_thai TEXT,
    custom_message_eng TEXT,

    -- Delivery Channels (รองรับ Multi-channel ตาม TOR 2.6)
    send_sms BOOLEAN DEFAULT FALSE,
    send_line BOOLEAN DEFAULT FALSE,
    send_email BOOLEAN DEFAULT FALSE,
    send_push_notification BOOLEAN DEFAULT FALSE,
    phone_call_required BOOLEAN DEFAULT FALSE,

    -- Delivery Status
    status VARCHAR(20) DEFAULT 'scheduled' CHECK (status IN ('scheduled', 'sent', 'delivered', 'failed', 'cancelled')),
    sent_at TIMESTAMP WITH TIME ZONE,
    delivered_at TIMESTAMP WITH TIME ZONE,

    -- Delivery Details
    sms_status VARCHAR(20),
    line_status VARCHAR(20),
    email_status VARCHAR(20),
    push_status VARCHAR(20),
    phone_call_status VARCHAR(20),

    -- Error Handling
    error_message TEXT,
    retry_count INTEGER DEFAULT 0,
    max_retries INTEGER DEFAULT 3,
    next_retry_at TIMESTAMP WITH TIME ZONE,

    -- Patient Response
    patient_responded BOOLEAN DEFAULT FALSE,
    response_method VARCHAR(20),
    response_at TIMESTAMP WITH TIME ZONE,
    response_content TEXT,

    -- Audit Fields
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

คำอธิบายฟิลด์ (Field Descriptions):

Field Type Constraints คำอธิบาย
id UUID PRIMARY KEY รหัสเฉพาะของการแจ้งเตือน
appointment_id UUID NOT NULL, FK รหัสการนัดที่เกี่ยวข้อง
reminder_type VARCHAR(20) CHECK ประเภทการแจ้งเตือน
scheduled_datetime TIMESTAMP NOT NULL เวลาที่กำหนดส่ง
send_before_minutes INTEGER NOT NULL ส่งก่อนนัดกี่นาที
message_template_id UUID FK รหัส template ข้อความ
custom_message_thai TEXT ข้อความกำหนดเอง (ไทย)
custom_message_eng TEXT ข้อความกำหนดเอง (อังกฤษ)
send_sms BOOLEAN DEFAULT FALSE ส่ง SMS
send_line BOOLEAN DEFAULT FALSE ส่งผ่าน Line
send_email BOOLEAN DEFAULT FALSE ส่ง Email
send_push_notification BOOLEAN DEFAULT FALSE ส่ง Push Notification
phone_call_required BOOLEAN DEFAULT FALSE ต้องการโทรแจ้ง
status VARCHAR(20) CHECK สถานะการส่ง
sent_at TIMESTAMP เวลาที่ส่ง
delivered_at TIMESTAMP เวลาที่ส่งถึง
sms_status VARCHAR(20) สถานะการส่ง SMS
line_status VARCHAR(20) สถานะการส่ง Line
email_status VARCHAR(20) สถานะการส่ง Email
push_status VARCHAR(20) สถานะการส่ง Push
phone_call_status VARCHAR(20) สถานะการโทร
error_message TEXT ข้อความ Error
retry_count INTEGER DEFAULT 0 จำนวนครั้งที่ลองใหม่
max_retries INTEGER DEFAULT 3 จำนวนครั้งสูงสุดที่ลองได้
next_retry_at TIMESTAMP เวลาที่จะลองใหม่
patient_responded BOOLEAN DEFAULT FALSE ผู้ป่วยตอบกลับ
response_method VARCHAR(20) วิธีการตอบกลับ
response_at TIMESTAMP เวลาที่ตอบกลับ
response_content TEXT เนื้อหาที่ตอบกลับ

SECTION 4: QUEUE MANAGEMENT SYSTEM

14. ตาราง queue_configurations

ตารางการตั้งค่าระบบคิว - รองรับ TOR 2.3

CREATE TABLE queue_configurations (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),

    -- Target Configuration
    department_id UUID REFERENCES departments(id),
    clinic_id UUID REFERENCES clinics(id),
    service_point VARCHAR(30) NOT NULL, -- registration, screening, examination, pharmacy, cashier

    -- Queue Settings
    queue_prefix VARCHAR(10) NOT NULL,
    queue_reset_type VARCHAR(20) CHECK (queue_reset_type IN ('daily', 'weekly', 'session', 'manual')) DEFAULT 'daily',
    queue_start_number INTEGER DEFAULT 1,
    queue_increment INTEGER DEFAULT 1,
    max_queue_number INTEGER DEFAULT 999,

    -- Priority Configuration (รองรับ TOR 2.3.1 - แยกประเภทคิว)
    priority_weights JSONB DEFAULT '{
        "emergency": 1000,
        "vip": 500,
        "elderly": 100,
        "disabled": 100,
        "pregnant": 100,
        "appointment": 50,
        "child": 25,
        "walkin": 10
    }',

    -- Time Management
    average_service_time_minutes INTEGER DEFAULT 15,
    buffer_time_minutes INTEGER DEFAULT 5,

    -- Display Settings
    display_name_thai VARCHAR(100) NOT NULL,
    display_name_eng VARCHAR(100),
    show_estimated_time BOOLEAN DEFAULT TRUE,
    show_queue_ahead INTEGER DEFAULT 3,

    -- Audio Settings
    enable_audio_call BOOLEAN DEFAULT TRUE,
    audio_language VARCHAR(10) DEFAULT 'thai',
    repeat_call_times INTEGER DEFAULT 3,
    call_interval_seconds INTEGER DEFAULT 30,

    -- Integration Settings
    auto_call_next BOOLEAN DEFAULT FALSE,
    integration_endpoint VARCHAR(200),

    -- Status
    is_active BOOLEAN DEFAULT TRUE,
    operating_hours JSONB,

    -- Audit Fields
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    created_by UUID REFERENCES users(id),
    updated_by UUID REFERENCES users(id),

    -- Unique constraint
    UNIQUE(department_id, clinic_id, service_point)
);

คำอธิบายฟิลด์ (Field Descriptions):

Field Type Constraints คำอธิบาย
id UUID PRIMARY KEY รหัสเฉพาะของการตั้งค่าคิว
department_id UUID FK รหัสแผนก
clinic_id UUID FK รหัสคลินิก
service_point VARCHAR(30) NOT NULL จุดบริการ (registration, screening, examination, pharmacy, cashier)
queue_prefix VARCHAR(10) NOT NULL อักษรนำหน้าคิว (เช่น A, B, C)
queue_reset_type VARCHAR(20) CHECK รูปแบบการ reset หมายเลขคิว
queue_start_number INTEGER DEFAULT 1 หมายเลขเริ่มต้น
queue_increment INTEGER DEFAULT 1 การเพิ่มหมายเลขคิว
max_queue_number INTEGER DEFAULT 999 หมายเลขคิวสูงสุด
priority_weights JSONB น้ำหนักความสำคัญของแต่ละประเภทคิว
average_service_time_minutes INTEGER DEFAULT 15 เวลาให้บริการเฉลี่ย (นาที)
buffer_time_minutes INTEGER DEFAULT 5 เวลา buffer (นาที)
display_name_thai VARCHAR(100) NOT NULL ชื่อแสดงผล (ภาษาไทย)
display_name_eng VARCHAR(100) ชื่อแสดงผล (ภาษาอังกฤษ)
show_estimated_time BOOLEAN DEFAULT TRUE แสดงเวลาโดยประมาณ
show_queue_ahead INTEGER DEFAULT 3 แสดงจำนวนคิวข้างหน้า
enable_audio_call BOOLEAN DEFAULT TRUE เปิดเสียงเรียกคิว
audio_language VARCHAR(10) DEFAULT 'thai' ภาษาเสียงเรียก
repeat_call_times INTEGER DEFAULT 3 จำนวนครั้งที่เรียกซ้ำ
call_interval_seconds INTEGER DEFAULT 30 ช่วงเวลาระหว่างการเรียก (วินาที)
auto_call_next BOOLEAN DEFAULT FALSE เรียกคิวถัดไปอัตโนมัติ
integration_endpoint VARCHAR(200) Endpoint สำหรับ integration
is_active BOOLEAN DEFAULT TRUE สถานะการใช้งาน
operating_hours JSONB เวลาทำการ

15. ตาราง queue_sessions

ตารางเซสชันการทำงานของคิว - รองรับการจัดการคิวรายวัน

CREATE TABLE queue_sessions (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    queue_config_id UUID NOT NULL REFERENCES queue_configurations(id),

    -- Session Information
    session_date DATE NOT NULL DEFAULT CURRENT_DATE,
    session_type VARCHAR(20) CHECK (session_type IN ('morning', 'afternoon', 'evening', 'full_day')) DEFAULT 'full_day',

    -- Session Schedule
    start_time TIME NOT NULL,
    end_time TIME NOT NULL,
    planned_end_time TIME,
    actual_end_time TIME,

    -- Queue Counter
    current_queue_number INTEGER DEFAULT 0,
    total_queues_issued INTEGER DEFAULT 0,
    total_queues_served INTEGER DEFAULT 0,
    total_no_shows INTEGER DEFAULT 0,

    -- Performance Metrics
    average_wait_time_minutes DECIMAL(5,2),
    average_service_time_minutes DECIMAL(5,2),
    peak_queue_count INTEGER DEFAULT 0,
    peak_queue_time TIME,

    -- Status
    status VARCHAR(20) DEFAULT 'active' CHECK (status IN ('scheduled', 'active', 'paused', 'completed', 'cancelled')),
    pause_reason TEXT,
    paused_at TIMESTAMP WITH TIME ZONE,
    resumed_at TIMESTAMP WITH TIME ZONE,

    -- Staff Assignment
    assigned_staff UUID[] DEFAULT ARRAY[]::UUID[],

    -- Audit Fields
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    created_by UUID REFERENCES users(id),
    updated_by UUID REFERENCES users(id),

    -- Unique constraint per day
    UNIQUE(queue_config_id, session_date, session_type)
);

คำอธิบายฟิลด์ (Field Descriptions):

Field Type Constraints คำอธิบาย
id UUID PRIMARY KEY รหัสเฉพาะของเซสชันคิว
queue_config_id UUID NOT NULL, FK รหัสการตั้งค่าคิว
session_date DATE NOT NULL วันที่ของเซสชัน
session_type VARCHAR(20) CHECK ประเภทเซสชัน (morning, afternoon, evening, full_day)
start_time TIME NOT NULL เวลาเริ่มต้นเซสชัน
end_time TIME NOT NULL เวลาสิ้นสุดเซสชัน
planned_end_time TIME เวลาสิ้นสุดที่วางแผนไว้
actual_end_time TIME เวลาสิ้นสุดจริง
current_queue_number INTEGER DEFAULT 0 หมายเลขคิวปัจจุบัน
total_queues_issued INTEGER DEFAULT 0 จำนวนคิวทั้งหมดที่ออก
total_queues_served INTEGER DEFAULT 0 จำนวนคิูที่ให้บริการแล้ว
total_no_shows INTEGER DEFAULT 0 จำนวนผู้ไม่มา
average_wait_time_minutes DECIMAL(5,2) เวลารอเฉลี่ย
average_service_time_minutes DECIMAL(5,2) เวลาให้บริการเฉลี่ย
peak_queue_count INTEGER DEFAULT 0 จำนวนคิวสูงสุด
peak_queue_time TIME เวลาที่มีคิวสูงสุด
status VARCHAR(20) CHECK สถานะเซสชัน
pause_reason TEXT เหตุผลการหยุด
paused_at TIMESTAMP เวลาที่หยุด
resumed_at TIMESTAMP เวลาที่เริ่มใหม่
assigned_staff UUID[] รายการเจ้าหน้าที่ที่มอบหมาย

16. ตาราง queues (Master Schema Foundation Table)

ตารางหลักจาก Master Schema: ตาราง queues ถูกกำหนดใน MASTER_DATABASE_SCHEMA.md
Integration Points: ตารางนี้เชื่อมโยงกับ queue_configurations, queue_sessions, queue_calls ในโมดูลนี้

Key Features from Master Schema: - รองรับ Real-time queue management ด้วย WebSocket integration - ระบบ Priority-based queuing ตาม healthcare standards - Service flow tracking สำหรับ Multi-service point workflow - เชื่อมโยงกับ appointments, medical_visits, patients จาก Master Schema - QR Code integration สำหรับ Digital patient experience

Module-Specific Extensions: - queue_configurations - การตั้งค่าระบบคิวแต่ละแผนก/คลินิก - queue_sessions - การจัดการเซสชันคิวรายวัน - queue_calls - ระบบเรียกคิวด้วยเสียงและจอแสดงผล - queue_displays - การจัดการจอแสดงผลคิวแบบ Real-time

คำอธิบายฟิลด์ (Field Descriptions):

Field Type Constraints คำอธิบาย
id UUID PRIMARY KEY รหัสเฉพาะของคิว
queue_number VARCHAR(20) NOT NULL หมายเลขคิว
visit_id UUID รหัส Visit จากระบบ EMR
appointment_id UUID FK รหัสการนัดหมาย
patient_id UUID NOT NULL รหัสผู้ป่วยจากระบบ EMR
clinic_id UUID NOT NULL, FK รหัสคลินิก
doctor_id UUID FK รหัสแพทย์
queue_type VARCHAR(20) CHECK ประเภทคิว
priority_score INTEGER NOT NULL คะแนนความสำคัญ
service_points TEXT[] จุดบริการที่ต้องผ่าน
current_service_point VARCHAR(20) จุดบริการปัจจุบัน
service_point_history JSONB ประวัติการผ่านจุดบริการ
status VARCHAR(20) CHECK สถานะคิว
issued_at TIMESTAMP เวลาที่ออกคิว
estimated_service_time TIMESTAMP เวลาโดยประมาณที่จะได้รับบริการ
called_at TIMESTAMP เวลาที่ถูกเรียก
service_started_at TIMESTAMP เวลาที่เริ่มรับบริการ
service_completed_at TIMESTAMP เวลาที่เสร็จสิ้นบริการ
estimated_wait_minutes INTEGER เวลารอโดยประมาณ (นาที)
actual_wait_minutes INTEGER GENERATED เวลารอจริง (คำนวณอัตโนมัติ)
special_requirements TEXT[] ความต้องการพิเศษ
notes TEXT หมายเหตุ
qr_code VARCHAR(100) QR Code สำหรับติดตามสถานะ

17. ตาราง queue_calls

ตารางการเรียกคิว - รองรับ TOR 2.3.3 และ 2.3.4 (เรียกคิวอัตโนมัติและแสดงผล)

CREATE TABLE queue_calls (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    queue_id UUID NOT NULL REFERENCES queues(id),
    queue_session_id UUID REFERENCES queue_sessions(id),

    -- Call Information
    call_number INTEGER NOT NULL,
    queue_number VARCHAR(20) NOT NULL,
    service_point VARCHAR(30) NOT NULL,

    -- Call Details
    called_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    call_type VARCHAR(20) CHECK (call_type IN ('first_call', 'repeat_call', 'final_call', 'manual_call')) DEFAULT 'first_call',

    -- Target Destination
    display_screen_id VARCHAR(50),
    audio_zone VARCHAR(30),
    counter_number VARCHAR(10),
    room_number VARCHAR(20),

    -- Call Status
    call_status VARCHAR(20) DEFAULT 'called' CHECK (call_status IN ('called', 'acknowledged', 'no_response', 'completed')),
    acknowledged_at TIMESTAMP WITH TIME ZONE,
    response_timeout_at TIMESTAMP WITH TIME ZONE,

    -- Audio Settings
    audio_enabled BOOLEAN DEFAULT TRUE,
    audio_language VARCHAR(10) DEFAULT 'thai',
    custom_message TEXT,
    voice_file_path VARCHAR(500),

    -- Display Settings
    display_duration_seconds INTEGER DEFAULT 60,
    display_priority INTEGER DEFAULT 1,
    show_preparation_info BOOLEAN DEFAULT FALSE,
    preparation_message TEXT,

    -- Staff Assignment
    called_by_user_id UUID REFERENCES users(id),
    serving_staff_id UUID REFERENCES users(id),

    -- Integration
    external_display_sent BOOLEAN DEFAULT FALSE,
    external_audio_sent BOOLEAN DEFAULT FALSE,
    integration_response JSONB,

    -- Audit Fields
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

คำอธิบายฟิลด์ (Field Descriptions):

Field Type Constraints คำอธิบาย
id UUID PRIMARY KEY รหัสเฉพาะของการเรียกคิว
queue_id UUID NOT NULL, FK รหัสคิวที่เรียก
queue_session_id UUID FK รหัสเซสชันคิว
call_number INTEGER NOT NULL ลำดับการเรียก
queue_number VARCHAR(20) NOT NULL หมายเลขคิวที่เรียก
service_point VARCHAR(30) NOT NULL จุดบริการที่เรียก
called_at TIMESTAMP DEFAULT NOW() เวลาที่เรียก
call_type VARCHAR(20) CHECK ประเภทการเรียก (first_call, repeat_call, final_call, manual_call)
display_screen_id VARCHAR(50) รหัสจอแสดงผล
audio_zone VARCHAR(30) โซนเสียง
counter_number VARCHAR(10) หมายเลขเคาน์เตอร์
room_number VARCHAR(20) หมายเลขห้อง
call_status VARCHAR(20) CHECK สถานะการเรียก
acknowledged_at TIMESTAMP เวลาที่รับทราบ
response_timeout_at TIMESTAMP เวลาหมดเวลาตอบสนอง
audio_enabled BOOLEAN DEFAULT TRUE เปิดเสียงหรือไม่
audio_language VARCHAR(10) DEFAULT 'thai' ภาษาเสียง
custom_message TEXT ข้อความกำหนดเอง
voice_file_path VARCHAR(500) ไฟล์เสียง
display_duration_seconds INTEGER DEFAULT 60 ระยะเวลาแสดงผล (วินาที)
display_priority INTEGER DEFAULT 1 ลำดับความสำคัญการแสดงผล
show_preparation_info BOOLEAN DEFAULT FALSE แสดงข้อมูลการเตรียมตัว
preparation_message TEXT ข้อความการเตรียมตัว
called_by_user_id UUID FK ผู้เรียกคิว
serving_staff_id UUID FK เจ้าหน้าที่ให้บริการ

18. ตาราง queue_displays

ตารางการแสดงผลคิว - รองรับ TOR 2.3.4 (จอแสดงผลและระบบเสียง)

CREATE TABLE queue_displays (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),

    -- Display Configuration
    display_name VARCHAR(100) NOT NULL,
    display_code VARCHAR(20) UNIQUE NOT NULL,
    display_type VARCHAR(20) CHECK (display_type IN ('main_board', 'counter_display', 'mobile_app', 'kiosk', 'department_tv')) NOT NULL,

    -- Physical Location
    location_description TEXT,
    department_id UUID REFERENCES departments(id),
    clinic_id UUID REFERENCES clinics(id),
    building VARCHAR(50),
    floor_number INTEGER,
    zone VARCHAR(30),

    -- Display Settings
    screen_resolution VARCHAR(20) DEFAULT '1920x1080',
    orientation VARCHAR(10) CHECK (orientation IN ('landscape', 'portrait')) DEFAULT 'landscape',

    -- Content Configuration
    show_current_queue BOOLEAN DEFAULT TRUE,
    show_queue_ahead INTEGER DEFAULT 5,
    show_estimated_time BOOLEAN DEFAULT TRUE,
    show_preparation_info BOOLEAN DEFAULT FALSE,

    -- Service Points Display
    service_points_displayed TEXT[] DEFAULT ARRAY['examination'],
    max_queues_per_service_point INTEGER DEFAULT 10,

    -- Visual Settings
    theme VARCHAR(20) DEFAULT 'hospital_blue',
    font_size VARCHAR(10) CHECK (font_size IN ('small', 'medium', 'large', 'extra_large')) DEFAULT 'large',
    language_display VARCHAR(10) DEFAULT 'thai',
    show_clock BOOLEAN DEFAULT TRUE,
    show_hospital_logo BOOLEAN DEFAULT TRUE,

    -- Audio Settings (รองรับ TOR 2.3.4)
    audio_enabled BOOLEAN DEFAULT TRUE,
    audio_zone VARCHAR(30),
    speaker_ip_address INET,
    audio_volume INTEGER DEFAULT 70 CHECK (audio_volume BETWEEN 0 AND 100),

    -- Real-time Updates
    refresh_interval_seconds INTEGER DEFAULT 5,
    websocket_endpoint VARCHAR(200),

    -- Network Configuration
    ip_address INET,
    mac_address VARCHAR(17),
    device_model VARCHAR(50),
    device_serial VARCHAR(100),

    -- Status and Monitoring
    status VARCHAR(20) DEFAULT 'online' CHECK (status IN ('online', 'offline', 'maintenance', 'error')),
    last_heartbeat TIMESTAMP WITH TIME ZONE,
    uptime_minutes INTEGER DEFAULT 0,
    error_log TEXT,

    -- Integration
    api_endpoint VARCHAR(200),
    api_key VARCHAR(100),

    -- Audit Fields
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    created_by UUID REFERENCES users(id),
    updated_by UUID REFERENCES users(id)
);

คำอธิบายฟิลด์ (Field Descriptions):

Field Type Constraints คำอธิบาย
id UUID PRIMARY KEY รหัสเฉพาะของจอแสดงผล
display_name VARCHAR(100) NOT NULL ชื่อจอแสดงผล
display_code VARCHAR(20) UNIQUE, NOT NULL รหัสจอแสดงผล
display_type VARCHAR(20) CHECK ประเภทจอแสดงผล
location_description TEXT คำอธิบายที่ตั้ง
department_id UUID FK รหัสแผนก
clinic_id UUID FK รหัสคลินิก
building VARCHAR(50) อาคาร
floor_number INTEGER ชั้น
zone VARCHAR(30) โซน
screen_resolution VARCHAR(20) DEFAULT '1920x1080' ความละเอียดหน้าจอ
orientation VARCHAR(10) CHECK แนวหน้าจอ
show_current_queue BOOLEAN DEFAULT TRUE แสดงคิวปัจจุบัน
show_queue_ahead INTEGER DEFAULT 5 แสดงคิวข้างหน้ากี่คิว
show_estimated_time BOOLEAN DEFAULT TRUE แสดงเวลาโดยประมาณ
show_preparation_info BOOLEAN DEFAULT FALSE แสดงข้อมูลการเตรียมตัว
service_points_displayed TEXT[] จุดบริการที่แสดง
max_queues_per_service_point INTEGER DEFAULT 10 จำนวนคิวสูงสุดต่อจุดบริการ
theme VARCHAR(20) DEFAULT 'hospital_blue' ธีมการแสดงผล
font_size VARCHAR(10) CHECK ขนาดตัวอักษร
language_display VARCHAR(10) DEFAULT 'thai' ภาษาแสดงผล
show_clock BOOLEAN DEFAULT TRUE แสดงนาฬิกา
show_hospital_logo BOOLEAN DEFAULT TRUE แสดงโลโก้โรงพยาบาล
audio_enabled BOOLEAN DEFAULT TRUE เปิดเสียง
audio_zone VARCHAR(30) โซนเสียง
speaker_ip_address INET IP Address ของลำโพง
audio_volume INTEGER CHECK ระดับเสียง (0-100)
refresh_interval_seconds INTEGER DEFAULT 5 ช่วงเวลา refresh (วินาที)
websocket_endpoint VARCHAR(200) Websocket endpoint
ip_address INET IP Address
mac_address VARCHAR(17) MAC Address
device_model VARCHAR(50) รุ่นอุปกรณ์
device_serial VARCHAR(100) หมายเลขซีเรียล
status VARCHAR(20) CHECK สถานะ
last_heartbeat TIMESTAMP Heartbeat ครั้งล่าสุด
uptime_minutes INTEGER DEFAULT 0 เวลาทำงาน (นาที)
error_log TEXT บันทึก Error
api_endpoint VARCHAR(200) API Endpoint
api_key VARCHAR(100) API Key

SECTION 5: MULTI-CHANNEL INTEGRATION

19. ตาราง line_bot_users

ผู้ใช้ Line Bot - การเชื่อมโยงบัญชีและการตั้งค่า

CREATE TABLE line_bot_users (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    line_user_id VARCHAR(100) UNIQUE NOT NULL,
    patient_id UUID, -- REFERENCES patients(id) - nullable until linked

    -- Line User Information
    display_name VARCHAR(100),
    profile_picture_url TEXT,

    -- Account Linking
    linking_status VARCHAR(20) DEFAULT 'unlinked' CHECK (linking_status IN ('unlinked', 'linking_pending', 'linked', 'linking_failed')),
    linking_code VARCHAR(10),
    linking_expires_at TIMESTAMP WITH TIME ZONE,
    linked_at TIMESTAMP WITH TIME ZONE,

    -- User Preferences
    preferred_language VARCHAR(10) DEFAULT 'thai',
    notification_enabled BOOLEAN DEFAULT TRUE,
    reminder_enabled BOOLEAN DEFAULT TRUE,

    -- Usage Statistics
    total_appointments_made INTEGER DEFAULT 0,
    last_interaction_at TIMESTAMP WITH TIME ZONE,

    -- Audit Fields
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

20. ตาราง mobile_app_sessions

ตารางเซสชัน Mobile App - รองรับการใช้งาน PWA และ Native App

CREATE TABLE mobile_app_sessions (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    patient_id UUID, -- REFERENCES patients(id) - nullable for guest sessions

    -- Session Information
    session_token VARCHAR(255) UNIQUE NOT NULL,
    device_id VARCHAR(100) NOT NULL,
    platform VARCHAR(20) CHECK (platform IN ('ios', 'android', 'web', 'pwa')) NOT NULL,

    -- Device Information
    device_model VARCHAR(100),
    os_version VARCHAR(50),
    app_version VARCHAR(20),
    browser_info VARCHAR(200),

    -- Location and Network
    ip_address INET,
    user_agent TEXT,

    -- Session State
    is_authenticated BOOLEAN DEFAULT FALSE,
    login_method VARCHAR(20) CHECK (login_method IN ('username_password', 'phone_otp', 'line_login', 'guest')),

    -- Features Used
    features_used TEXT[] DEFAULT ARRAY[]::TEXT[],
    last_activity_type VARCHAR(50),

    -- FCM/Push Notification
    fcm_token VARCHAR(500),
    push_enabled BOOLEAN DEFAULT TRUE,

    -- Session Management
    session_start TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    session_end TIMESTAMP WITH TIME ZONE,
    last_activity TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    is_active BOOLEAN DEFAULT TRUE,

    -- Usage Statistics
    total_appointments_booked INTEGER DEFAULT 0,
    total_time_spent_minutes INTEGER DEFAULT 0,

    -- Security
    failed_login_attempts INTEGER DEFAULT 0,
    locked_until TIMESTAMP WITH TIME ZONE,

    -- Audit
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

คำอธิบายฟิลด์ (Field Descriptions):

Field Type Constraints คำอธิบาย
id UUID PRIMARY KEY รหัสเฉพาะของเซสชัน
patient_id UUID รหัสผู้ป่วย (null สำหรับ guest)
session_token VARCHAR(255) UNIQUE, NOT NULL Token เซสชัน
device_id VARCHAR(100) NOT NULL รหัสอุปกรณ์
platform VARCHAR(20) CHECK แพลตฟอร์ม (ios, android, web, pwa)
device_model VARCHAR(100) รุ่นอุปกรณ์
os_version VARCHAR(50) เวอร์ชัน OS
app_version VARCHAR(20) เวอร์ชันแอป
browser_info VARCHAR(200) ข้อมูลเบราว์เซอร์
ip_address INET IP Address
user_agent TEXT User Agent
is_authenticated BOOLEAN DEFAULT FALSE สถานะการยืนยันตัวตน
login_method VARCHAR(20) CHECK วิธีการเข้าสู่ระบบ
features_used TEXT[] ฟีเจอร์ที่ใช้งาน
last_activity_type VARCHAR(50) กิจกรรมล่าสุด
fcm_token VARCHAR(500) FCM Token สำหรับ Push Notification
push_enabled BOOLEAN DEFAULT TRUE เปิดใช้ Push Notification
session_start TIMESTAMP DEFAULT NOW() เวลาเริ่มเซสชัน
session_end TIMESTAMP เวลาสิ้นสุดเซสชัน
last_activity TIMESTAMP DEFAULT NOW() กิจกรรมล่าสุด
is_active BOOLEAN DEFAULT TRUE สถานะเซสชัน
total_appointments_booked INTEGER DEFAULT 0 จำนวนการนัดที่จองผ่านเซสชันนี้
total_time_spent_minutes INTEGER DEFAULT 0 เวลาใช้งานรวม (นาที)

21. ตาราง notification_logs

ตารางบันทึกการแจ้งเตือนทั้งหมด - รองรับ multi-channel notification

CREATE TABLE notification_logs (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),

    -- Target Information
    patient_id UUID, -- REFERENCES patients(id)
    appointment_id UUID REFERENCES appointments(id),
    queue_id UUID REFERENCES queues(id),

    -- Notification Details
    notification_type VARCHAR(30) NOT NULL CHECK (notification_type IN ('appointment_reminder', 'appointment_confirmed', 'appointment_cancelled', 'queue_called', 'queue_reminder', 'system_announcement', 'health_alert')),

    -- Message Content
    subject_thai VARCHAR(200),
    subject_eng VARCHAR(200),
    message_thai TEXT NOT NULL,
    message_eng TEXT,

    -- Delivery Channel
    delivery_channel VARCHAR(20) NOT NULL CHECK (delivery_channel IN ('sms', 'line', 'email', 'push', 'phone_call', 'in_app')),

    -- Recipient Information
    recipient_phone VARCHAR(15),
    recipient_line_id VARCHAR(100),
    recipient_email VARCHAR(100),
    recipient_device_token VARCHAR(500),

    -- Delivery Status
    status VARCHAR(20) DEFAULT 'pending' CHECK (status IN ('pending', 'sent', 'delivered', 'failed', 'bounce')),
    sent_at TIMESTAMP WITH TIME ZONE,
    delivered_at TIMESTAMP WITH TIME ZONE,
    read_at TIMESTAMP WITH TIME ZONE,

    -- External Service Response
    external_message_id VARCHAR(100),
    external_response JSONB,
    error_code VARCHAR(20),
    error_message TEXT,

    -- Retry Logic
    retry_count INTEGER DEFAULT 0,
    max_retries INTEGER DEFAULT 3,
    next_retry_at TIMESTAMP WITH TIME ZONE,

    -- Cost Tracking
    delivery_cost DECIMAL(6,4) DEFAULT 0.0000, -- Cost per message in THB

    -- Templates
    template_used VARCHAR(100),

    -- Audit Fields
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

คำอธิบายฟิลด์ (Field Descriptions):

Field Type Constraints คำอธิบาย
id UUID PRIMARY KEY รหัสเฉพาะของบันทึกการแจ้งเตือน
patient_id UUID รหัสผู้ป่วย
appointment_id UUID FK รหัสการนัดที่เกี่ยวข้อง
queue_id UUID FK รหัสคิวที่เกี่ยวข้อง
notification_type VARCHAR(30) CHECK ประเภทการแจ้งเตือน
subject_thai VARCHAR(200) หัวข้อ (ภาษาไทย)
subject_eng VARCHAR(200) หัวข้อ (ภาษาอังกฤษ)
message_thai TEXT NOT NULL ข้อความ (ภาษาไทย)
message_eng TEXT ข้อความ (ภาษาอังกฤษ)
delivery_channel VARCHAR(20) CHECK ช่องทางการส่ง
recipient_phone VARCHAR(15) เบอร์โทรผู้รับ
recipient_line_id VARCHAR(100) Line ID ผู้รับ
recipient_email VARCHAR(100) Email ผู้รับ
recipient_device_token VARCHAR(500) Device Token ผู้รับ
status VARCHAR(20) CHECK สถานะการส่ง
sent_at TIMESTAMP เวลาที่ส่ง
delivered_at TIMESTAMP เวลาที่ส่งถึง
read_at TIMESTAMP เวลาที่อ่าน
external_message_id VARCHAR(100) Message ID จากระบบภายนอก
external_response JSONB Response จากระบบภายนอก
error_code VARCHAR(20) รหัสข้อผิดพลาด
error_message TEXT ข้อความข้อผิดพลาด
retry_count INTEGER DEFAULT 0 จำนวนครั้งที่ลองใหม่
delivery_cost DECIMAL(6,4) DEFAULT 0.0000 ค่าใช้จ่ายในการส่ง
template_used VARCHAR(100) Template ที่ใช้

22. ตาราง communication_templates

ตารางเทมเพลตการสื่อสาร - รองรับ TOR 6 การสื่อสารและแจ้งเตือน

CREATE TABLE communication_templates (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),

    -- Template Identification
    template_code VARCHAR(50) UNIQUE NOT NULL,
    template_name_thai VARCHAR(100) NOT NULL,
    template_name_eng VARCHAR(100),

    -- Template Category
    category VARCHAR(30) CHECK (category IN ('appointment_reminder', 'appointment_confirmation', 'appointment_cancellation', 'queue_notification', 'system_alert', 'health_education', 'promotional')) NOT NULL,

    -- Usage Context
    usage_context VARCHAR(50) CHECK (usage_context IN ('before_appointment', 'appointment_confirmed', 'appointment_day', 'queue_called', 'emergency', 'general')) NOT NULL,

    -- Message Content (Multi-language)
    subject_thai VARCHAR(200),
    subject_eng VARCHAR(200),
    message_thai TEXT NOT NULL,
    message_eng TEXT,

    -- Dynamic Variables
    variables JSONB DEFAULT '[]', -- List of variables that can be replaced
    sample_data JSONB, -- Sample data for testing

    -- Channel Specific Content
    sms_message_thai VARCHAR(160), -- SMS has character limit
    sms_message_eng VARCHAR(160),
    line_message_format JSONB, -- Rich message format for Line
    email_html_thai TEXT,
    email_html_eng TEXT,
    push_title_thai VARCHAR(100),
    push_title_eng VARCHAR(100),

    -- Delivery Settings
    applicable_channels TEXT[] DEFAULT ARRAY['sms', 'line', 'email', 'push'],
    priority_level INTEGER DEFAULT 3 CHECK (priority_level BETWEEN 1 AND 5),

    -- Timing Configuration
    default_send_before_minutes INTEGER, -- For appointment reminders
    can_be_scheduled BOOLEAN DEFAULT TRUE,

    -- Approval and Compliance
    requires_approval BOOLEAN DEFAULT FALSE,
    approved_by UUID REFERENCES users(id),
    approved_at TIMESTAMP WITH TIME ZONE,
    compliance_checked BOOLEAN DEFAULT FALSE,

    -- Usage Statistics
    total_sent INTEGER DEFAULT 0,
    success_rate DECIMAL(5,4) DEFAULT 0.0000,
    last_used_at TIMESTAMP WITH TIME ZONE,

    -- Template Status
    is_active BOOLEAN DEFAULT TRUE,
    effective_from DATE DEFAULT CURRENT_DATE,
    effective_to DATE,

    -- Version Control
    version_number INTEGER DEFAULT 1,
    parent_template_id UUID REFERENCES communication_templates(id),

    -- Audit Fields
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    created_by UUID REFERENCES users(id),
    updated_by UUID REFERENCES users(id)
);

คำอธิบายฟิลด์ (Field Descriptions):

Field Type Constraints คำอธิบาย
id UUID PRIMARY KEY รหัสเฉพาะของเทมเพลต
template_code VARCHAR(50) UNIQUE, NOT NULL รหัสเทมเพลต
template_name_thai VARCHAR(100) NOT NULL ชื่อเทมเพลต (ภาษาไทย)
template_name_eng VARCHAR(100) ชื่อเทมเพลต (ภาษาอังกฤษ)
category VARCHAR(30) CHECK หมวดหมู่เทมเพลต
usage_context VARCHAR(50) CHECK บริบทการใช้งาน
subject_thai VARCHAR(200) หัวข้อ (ภาษาไทย)
subject_eng VARCHAR(200) หัวข้อ (ภาษาอังกฤษ)
message_thai TEXT NOT NULL ข้อความ (ภาษาไทย)
message_eng TEXT ข้อความ (ภาษาอังกฤษ)
variables JSONB DEFAULT '[]' ตัวแปรที่สามารถแทนที่ได้
sample_data JSONB ข้อมูลตัวอย่างสำหรับทดสอบ
sms_message_thai VARCHAR(160) ข้อความ SMS (ไทย)
sms_message_eng VARCHAR(160) ข้อความ SMS (อังกฤษ)
line_message_format JSONB รูปแบบข้อความ Line (Rich Format)
email_html_thai TEXT HTML Email (ไทย)
email_html_eng TEXT HTML Email (อังกฤษ)
push_title_thai VARCHAR(100) หัวข้อ Push Notification (ไทย)
push_title_eng VARCHAR(100) หัวข้อ Push Notification (อังกฤษ)
applicable_channels TEXT[] ช่องทางที่สามารถใช้ได้
priority_level INTEGER CHECK ระดับความสำคัญ (1-5)
default_send_before_minutes INTEGER ส่งก่อนนัดกี่นาที (default)
can_be_scheduled BOOLEAN DEFAULT TRUE สามารถกำหนดเวลาส่งได้
requires_approval BOOLEAN DEFAULT FALSE ต้องการอนุมัติ
approved_by UUID FK ผู้อนุมัติ
approved_at TIMESTAMP วันที่อนุมัติ
compliance_checked BOOLEAN DEFAULT FALSE ตรวจสอบความถูกต้องแล้ว
total_sent INTEGER DEFAULT 0 จำนวนครั้งที่ใช้
success_rate DECIMAL(5,4) DEFAULT 0.0000 อัตราความสำเร็จ
last_used_at TIMESTAMP ใช้ครั้งล่าสุดเมื่อไหร่
is_active BOOLEAN DEFAULT TRUE สถานะใช้งาน
version_number INTEGER DEFAULT 1 หมายเลขเวอร์ชัน
parent_template_id UUID FK เทมเพลตต้นแบบ

23. ตาราง external_integrations

ตารางการเชื่อมต่อระบบภายนอก - รองรับ TOR การเชื่อมต่อ APIs

CREATE TABLE external_integrations (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),

    -- Integration Identity
    integration_name VARCHAR(100) NOT NULL,
    integration_type VARCHAR(50) CHECK (integration_type IN ('sms_gateway', 'line_messaging', 'email_service', 'nhso_api', 'sso_api', 'civil_registration', 'his_integration', 'payment_gateway')) NOT NULL,

    -- Service Provider
    provider_name VARCHAR(100) NOT NULL,
    service_endpoint VARCHAR(500) NOT NULL,

    -- Authentication
    auth_type VARCHAR(30) CHECK (auth_type IN ('api_key', 'oauth2', 'basic_auth', 'jwt', 'custom')) NOT NULL,
    api_key VARCHAR(500),
    client_id VARCHAR(200),
    client_secret VARCHAR(500),
    oauth_token TEXT,
    oauth_refresh_token TEXT,
    oauth_expires_at TIMESTAMP WITH TIME ZONE,

    -- Configuration
    configuration JSONB NOT NULL DEFAULT '{}',
    headers JSONB DEFAULT '{}',
    timeout_seconds INTEGER DEFAULT 30,
    retry_attempts INTEGER DEFAULT 3,

    -- Rate Limiting
    rate_limit_per_minute INTEGER,
    rate_limit_per_hour INTEGER,
    rate_limit_per_day INTEGER,

    -- Status Monitoring
    status VARCHAR(20) DEFAULT 'active' CHECK (status IN ('active', 'inactive', 'maintenance', 'error', 'suspended')),
    last_health_check TIMESTAMP WITH TIME ZONE,
    health_check_interval_minutes INTEGER DEFAULT 15,
    consecutive_failures INTEGER DEFAULT 0,
    max_consecutive_failures INTEGER DEFAULT 5,

    -- Usage Statistics
    total_requests INTEGER DEFAULT 0,
    successful_requests INTEGER DEFAULT 0,
    failed_requests INTEGER DEFAULT 0,
    average_response_time_ms DECIMAL(8,2),

    -- Cost Management
    cost_per_request DECIMAL(8,4) DEFAULT 0.0000,
    monthly_budget DECIMAL(10,2),
    current_month_cost DECIMAL(10,2) DEFAULT 0.00,

    -- Security
    ip_whitelist TEXT[],
    ssl_required BOOLEAN DEFAULT TRUE,
    certificate_path VARCHAR(500),

    -- Fallback Configuration
    fallback_integration_id UUID REFERENCES external_integrations(id),
    auto_fallback_enabled BOOLEAN DEFAULT FALSE,

    -- Compliance and Logging
    log_requests BOOLEAN DEFAULT TRUE,
    log_responses BOOLEAN DEFAULT FALSE, -- Due to privacy
    gdpr_compliant BOOLEAN DEFAULT FALSE,
    data_retention_days INTEGER DEFAULT 90,

    -- Audit Fields
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    created_by UUID REFERENCES users(id),
    updated_by UUID REFERENCES users(id)
);

คำอธิบายฟิลด์ (Field Descriptions):

Field Type Constraints คำอธิบาย
id UUID PRIMARY KEY รหัสเฉพาะของการเชื่อมต่อ
integration_name VARCHAR(100) NOT NULL ชื่อการเชื่อมต่อ
integration_type VARCHAR(50) CHECK ประเภทการเชื่อมต่อ
provider_name VARCHAR(100) NOT NULL ชื่อผู้ให้บริการ
service_endpoint VARCHAR(500) NOT NULL Endpoint ของบริการ
auth_type VARCHAR(30) CHECK ประเภทการยืนยันตัวตน
api_key VARCHAR(500) API Key
client_id VARCHAR(200) Client ID (OAuth2)
client_secret VARCHAR(500) Client Secret (OAuth2)
oauth_token TEXT OAuth Token
oauth_refresh_token TEXT OAuth Refresh Token
oauth_expires_at TIMESTAMP เวลาหมดอายุ OAuth Token
configuration JSONB NOT NULL การตั้งค่าเพิ่มเติม
headers JSONB DEFAULT '{}' HTTP Headers
timeout_seconds INTEGER DEFAULT 30 Timeout (วินาที)
retry_attempts INTEGER DEFAULT 3 จำนวนครั้งที่ลองใหม่
rate_limit_per_minute INTEGER จำกัดการใช้ต่อนาที
rate_limit_per_hour INTEGER จำกัดการใช้ต่อชั่วโมง
rate_limit_per_day INTEGER จำกัดการใช้ต่อวัน
status VARCHAR(20) CHECK สถานะการเชื่อมต่อ
last_health_check TIMESTAMP Health Check ครั้งล่าสุด
health_check_interval_minutes INTEGER DEFAULT 15 ช่วงเวลา Health Check
consecutive_failures INTEGER DEFAULT 0 ความล้มเหลวติดต่อกัน
total_requests INTEGER DEFAULT 0 จำนวน Request ทั้งหมด
successful_requests INTEGER DEFAULT 0 จำนวน Request สำเร็จ
failed_requests INTEGER DEFAULT 0 จำนวน Request ล้มเหลว
average_response_time_ms DECIMAL(8,2) เวลาตอบสนองเฉลี่ย (มิลลิวินาที)
cost_per_request DECIMAL(8,4) DEFAULT 0.0000 ค่าใช้จ่ายต่อ Request
monthly_budget DECIMAL(10,2) งบประมาณรายเดือน
current_month_cost DECIMAL(10,2) DEFAULT 0.00 ค่าใช้จ่ายเดือนปัจจุบัน

SECTION 6: INTEGRATION & AUDIT

24. ตาราง system_audit_logs

ระบบ Audit ทั้งหมด - data protection และ compliance

CREATE TABLE system_audit_logs (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),

    -- Audit Target
    table_name VARCHAR(50) NOT NULL,
    record_id UUID NOT NULL,
    action_type VARCHAR(20) NOT NULL CHECK (action_type IN ('INSERT', 'UPDATE', 'DELETE', 'VIEW', 'EXPORT')),

    -- Change Information
    field_changes JSONB,
    full_record_before JSONB,
    full_record_after JSONB,

    -- User and Session Information
    user_id UUID REFERENCES users(id),
    session_id VARCHAR(100),
    ip_address INET,
    user_agent TEXT,

    -- Context Information
    business_context VARCHAR(50),
    change_reason TEXT,

    -- Data Protection
    contains_pii BOOLEAN DEFAULT FALSE,

    -- Audit Fields
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

Business Rules และ Constraints

Appointment Business Rules

-- Business rule: นัดหมายต้องเป็นอนาคต
ALTER TABLE appointments 
ADD CONSTRAINT chk_appointment_time_logic 
CHECK (
    (appointment_date > CURRENT_DATE) OR 
    (appointment_date = CURRENT_DATE AND appointment_time > CURRENT_TIME)
);

-- Business rule: จำกัดจำนวนการ reschedule
ALTER TABLE appointments 
ADD CONSTRAINT chk_appointment_reschedule_limit 
CHECK (reschedule_count >= 0 AND reschedule_count <= 5);

Queue Business Rules

-- Business rule: เวลารอต้องสมเหตุสมผล
ALTER TABLE queues 
ADD CONSTRAINT chk_queue_wait_time_reasonable 
CHECK (estimated_wait_minutes IS NULL OR (estimated_wait_minutes >= 0 AND estimated_wait_minutes <= 480));

Indexes for Performance Optimization

-- Appointment indexes
CREATE INDEX idx_appointments_patient_date ON appointments(patient_id, appointment_date);
CREATE INDEX idx_appointments_clinic_date ON appointments(clinic_id, appointment_date, appointment_time);
CREATE INDEX idx_appointments_doctor_date ON appointments(doctor_id, appointment_date, appointment_time) WHERE doctor_id IS NOT NULL;
CREATE INDEX idx_appointments_status_date ON appointments(status, appointment_date);

-- Queue indexes
CREATE INDEX idx_queues_clinic_status ON queues(clinic_id, status, priority_score DESC);
CREATE INDEX idx_queues_patient ON queues(patient_id, issued_at DESC);
CREATE INDEX idx_queues_service_point ON queues(current_service_point, status);

-- Schedule indexes
CREATE INDEX idx_doctor_schedules_doctor_date ON doctor_schedules(doctor_id, schedule_date) WHERE status = 'active';
CREATE INDEX idx_clinic_schedules_clinic_date ON clinic_schedules(clinic_id, schedule_date) WHERE status = 'open';

Integration Points with EMR System

Foreign Key Relationships

-- Integration with existing EMR tables
-- appointments.patient_id -> patients.id (existing EMR table)
-- appointments.visit_id -> medical_visits.id (existing EMR table)
-- queues.patient_id -> patients.id (existing EMR table)
-- queues.visit_id -> medical_visits.id (existing EMR table)

Data Flow Integration

  1. Patient Registration: ใช้ตาราง patients ที่มีอยู่ในระบบ EMR
  2. Appointment Booking: สร้างข้อมูลในตาราง appointments
  3. Visit Check-in: สร้างข้อมูลในตาราง medical_visits (existing EMR)
  4. Queue Generation: สร้างข้อมูลในตาราง queues (enhanced system)

Comments สำหรับ Documentation

-- Table comments
COMMENT ON TABLE appointments IS 'ตารางการนัดหมายหลัก - เชื่อมโยงกับระบบเวชระเบียนและคิว';
COMMENT ON TABLE queues IS 'ตารางคิวหลัก - เสริมระบบ visit_queues ที่มีอยู่ รองรับ multi-service point';
COMMENT ON TABLE doctor_schedules IS 'ตารางเวลาการทำงานของแพทย์ - รองรับการจัดสรร slots ตามช่องทาง';

-- Key column comments
COMMENT ON COLUMN appointments.appointment_number IS 'หมายเลขการนัด - สร้างอัตโนมัติตามรูปแบบ: CLINIC + YYYYMM + SEQUENCE';
COMMENT ON COLUMN appointments.booking_channel IS 'ช่องทางการจอง: staff, mobile_app, line_bot, phone, kiosk, website';
COMMENT ON COLUMN queues.queue_number IS 'หมายเลขคิว - สร้างอัตโนมัติตาม queue_configurations';
COMMENT ON COLUMN queues.service_points IS 'จุดบริการ: registration, screening, examination, pharmacy, cashier';

INTEGRATION WITH MEDITECH MASTER SCHEMA

Foundation Tables Integration

Master Schema Table Usage in Queue Module Purpose
users Authentication & Authorization Staff, doctors, nurses, kiosk users
departments Department-based scheduling Links to clinics and appointments
patients Patient identification Master patient index for all appointments
medical_visits Visit correlation Links appointments to actual visits
audit_logs Compliance tracking Complete audit trail for PDPA compliance
notifications Multi-channel alerts SMS, Line, Email, Push notifications
permissions Access control Module-specific permissions for queue management

Real-Time Integration Events

-- Event-driven integration with other modules
-- (Uses MASTER_DATABASE_SCHEMA.md integration_events table)

-- Key events from Queue Management module:
-- - 'appointment_created', 'appointment_cancelled', 'appointment_rescheduled'
-- - 'queue_number_assigned', 'queue_called', 'queue_completed'
-- - 'patient_checked_in', 'patient_no_show'
-- - 'schedule_updated', 'clinic_capacity_changed'

-- Events consumed from other modules:
-- - 'patient_registered' (EMR) → Auto-create appointment eligibility
-- - 'visit_started' (EMR) → Update queue status
-- - 'visit_completed' (EMR) → Release queue position
-- - 'user_role_changed' (Admin) → Update access permissions

Cross-Module Data Flow Patterns

  1. Patient-Centric Flow:
  2. Master Schema patients → Queue appointments → EMR medical_visits

  3. Staff Access Flow:

  4. Master Schema users/roles → Queue permission validation

  5. Multi-Channel Notification Flow:

  6. Queue events → Master Schema notifications → SMS/Line/Email delivery

  7. Compliance Audit Flow:

  8. All Queue actions → Master Schema audit_logs → Compliance reporting

Benefits of Master Schema Integration

🎯 Unified Patient Journey

ผู้ป่วยมีประสบการณ์ที่ต่อเนื่องตั้งแต่การนัดหมายจนถึงการรับบริการ

📱 Multi-Channel Excellence

การนัดหมายผ่านช่องทางหลากหลายด้วยข้อมูลที่สอดคล้องและ real-time

Real-Time Performance

จัดการคิวแบบ real-time ที่เชื่อมโยงกับระบบ EMR อย่างไร้รอยต่อ

🔒 Enterprise Security & Compliance

ระบบความปลอดภัยและการปฏิบัติตาม PDPA/Medical Records Act ครบถ้วน

📊 Data-Driven Insights

Analytics ที่สมบูรณ์สำหรับการปรับปรุงประสิทธิภาพการให้บริการ

🏥 Hospital-Wide Ecosystem

บูรณาการสมบูรณ์กับระบบ MediTech HIS ทั้งหมด

การออกแบบนี้ทำให้ระบบนัดหมายและคิวเป็น Patient Experience Hub ที่เชื่อมต่อผู้ป่วยกับบริการทางการแพทย์อย่างครบวงจร พร้อมรองรับการเติบโตและนวัตกรรมในอนาคต

Document Version: 2.0 (Master Schema Aligned)
Last Updated: 28 สิงหาคม 2025
Integration Status: ✅ Fully aligned with MASTER_DATABASE_SCHEMA.md