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

Software Requirements Specification (SRS)

ระบบงานเวชระเบียนและเวชสถิติ - โรงพยาบาลจังหวัด

Document Version: 4.0 (Complete TOR-Based Edition)
Date: 18 สิงหาคม 2024
Project: Hospital Information System - EMR Module
Target Hospital: โรงพยาบาลระดับจังหวัด (500+ เตียง, 100+ ผู้ใช้พร้อมกัน)
Based on: ร่าง TOR ระบบเวชระเบียน


📋 Table of Contents

  1. บทนำและขอบเขตโครงการ
  2. ความต้องการเชิงหน้าที่ (Functional Requirements)
  3. ความต้องการด้านประสิทธิภาพ (Performance Requirements)
  4. ความต้องการด้านความปลอดภัย (Security Requirements)
  5. ความต้องการด้านการเชื่อมต่อ (Integration Requirements)
  6. ความต้องการด้านการใช้งาน (Usability Requirements)
  7. ความต้องการด้านการปฏิบัติตามกฎระเบียบ (Compliance Requirements)
  8. ข้อกำหนดทางเทคนิค (Technical Specifications)
  9. การทดสอบและประกันคุณภาพ (Testing & Quality Assurance)
  10. เอกสารและรายงาน (Documentation & Reporting)
  11. การติดตั้งและการนำไปใช้ (Implementation & Deployment)
  12. การบำรุงรักษาและสนับสนุน (Maintenance & Support)
  13. การติดตามและประเมินผล (Monitoring & Evaluation)
    13.1. API Route Specifications (API Routes และ Technical Specifications)
  14. การจัดการความเสี่ยง (Risk Management)
  15. การฝึกอบรมและการเปลี่ยนแปลง (Training & Change Management)
  16. สรุปและการอนุมัติ (Summary & Approval)
  17. ภาคผนวก (Appendices)

1. บทนำและขอบเขตโครงการ

1.1 วัตถุประสงค์ของเอกสาร

เอกสารนี้กำหนดความต้องการทางซอฟต์แวร์สำหรับระบบงานเวชระเบียนและเวชสถิติ ซึ่งเป็นระบบพื้นฐาน (Foundation System) สำหรับ MediTech HIS ecosystem ตามเอกสาร TOR ที่ครอบคลุม:

  • ระบบลงทะเบียนผู้ป่วยใหม่แบบหลากหลายช่องทาง
  • ระบบส่งผู้ป่วยเข้าห้องตรวจ (เปิด Visit)
  • ระบบตรวจสอบสิทธิการรักษาแบบเรียลไทม์
  • การเชื่อมโยงข้อมูลระหว่างแผนกต่างๆ
  • การรองรับผู้ป่วยทั้งไทยและต่างชาติ

1.2 ขอบเขตของระบบ

ระบบที่รวมอยู่ใน Scope:

  • Patient Registration System (แบบหลากหลายช่องทาง)
  • Visit Management System (OPD Visit Creation)
  • Multi-channel Registration (Staff, Kiosk, Mobile App, Line App)
  • Real-time Eligibility Checking
  • Queue Management System
  • Document Generation & Printing
  • Nationality Support (Thai & International)
  • Master Data Management (Departments, Service Points, Insurance Types)
  • Foundation APIs for other clinical modules

ระบบที่อยู่นอก Scope:

  • การวินิจฉัยและการรักษา (อยู่ใน OPD_CPOE, IPD_SYSTEM)
  • การจัดการยาและเวชภัณฑ์ (อยู่ใน PHARMACY)
  • การเงินและการชำระเงิน (อยู่ใน FINANCIAL)
  • รายงานทางการเงิน (อยู่ใน FINANCIAL)
  • การจัดการเตียงและห้องพัก (อยู่ใน IPD_SYSTEM)

การรองรับภาษาไทยและอังกฤษ: ทุกส่วนของระบบรองรับ dual-language

1.3 คำจำกัดความและคำย่อ

คำศัพท์ คำจำกัดความ
HN Hospital Number - หมายเลขผู้ป่วยในโรงพยาบาล
OPD Out-Patient Department - แผนกผู้ป่วยนอก
IPD In-Patient Department - แผนกผู้ป่วยใน
CPOE Computerized Physician Order Entry - ระบบสั่งการแพทย์ด้วยคอมพิวเตอร์
NHSO National Health Security Office - สำนักงานหลักประกันสุขภาพแห่งชาติ
SSO Social Security Office - สำนักงานประกันสังคม
HL7 FHIR Health Level 7 Fast Healthcare Interoperability Resources
PDPA Personal Data Protection Act - พระราชบัญญัติคุ้มครองข้อมูลส่วนบุคคล
MFA Multi-Factor Authentication - การยืนยันตัวตนแบบหลายชั้น
JWT JSON Web Token - โทเค็นสำหรับการยืนยันตัวตน
API Application Programming Interface - ส่วนติดต่อการเขียนโปรแกรมประยุกต์
PWA Progressive Web Application - แอปพลิเคชันเว็บแบบก้าวหน้า

1.4 การอ้างอิง

  • TOR ระบบเวชระเบียนและเวชสถิติ v2.0
  • SRS Template Standard v1.0 (MediTech)
  • TOR Relationship Analysis v1.0
  • MediTech Overall System Architecture
  • Database Schema Standards (schema.md)
  • API Design Guidelines
  • PDPA Compliance Framework
  • Healthcare Data Standards (HL7 FHIR, ICD-10)
  • IEEE 830-1998 (Software Requirements Specifications)

1.5 ภาพรวมของเอกสาร

เอกสารนี้แบ่งออกเป็น 17 หมวดหลัก ครอบคลุมตั้งแต่ความต้องการเชิงหน้าที่ ไปจนถึงการนำไปใช้และบำรุงรักษา โดยยึดมาตรฐาน IEEE 830-1998 และปรับให้เหมาะสมกับระบบสารสนเทศโรงพยาบาล โดยเน้นการเป็นระบบพื้นฐาน (Foundation System) ที่ให้บริการ APIs และ Master Data สำหรับระบบอื่นๆ ใน MediTech ecosystem


2. ความต้องการเชิงหน้าที่ (Functional Requirements)

2.1 โมดูลลงทะเบียนผู้ป่วยใหม่

FR-001: การลงทะเบียนผู้ป่วยแบบหลากหลายช่องทาง

Priority: Critical
Description: ระบบต้องรองรับการลงทะเบียนผู้ป่วยใหม่ผ่านช่องทางต่างๆ

Acceptance Criteria:

AC-001.1: การลงทะเบียนโดยเจ้าหน้าที่เวชระเบียน

  • แสดงฟอร์มลงทะเบียนแบบ responsive design
  • รองรับการป้อนข้อมูลภาษาไทยและอังกฤษ
  • Client-side validation ด้วย React Hook Form + Zod schema
  • Real-time duplicate checking ขณะพิมพ์

AC-001.2: การลงทะเบียนผ่าน Kiosk (Self-Service)

  • หน้าจอสัมผัสที่ใช้งานง่าย
  • รองรับการสแกน QR code จากบัตรประชาชน
  • ต้องมีการยืนยันข้อมูลโดยเจ้าหน้าที่ก่อนบันทึก
  • ภาษาไทยและอังกฤษ

AC-001.4: การลงทะเบียนผ่าน Line Application

  • Line Bot integration
  • รองรับการส่งข้อมูลผ่าน Line
  • ตรวจสอบข้อมูลซ้ำและยืนยันโดยเจ้าหน้าที่

FR-002: ข้อมูลผู้ป่วยครบถ้วนตาม TOR

Priority: Critical
Description: ระบบต้องสามารถบันทึกข้อมูลผู้ป่วยครบถ้วนตามรายละเอียดใน TOR

Database Schema: patients

Acceptance Criteria:

AC-002.1: ข้อมูลทั่วไปของผู้ป่วย

  • บันทึกข้อมูล HN (auto-generate), ชื่อ-นามสกุล, เพศ, คำนำหน้าชื่อ
  • วันเดือนปีเกิด (คำนวณอายุอัตโนมัติ), หมู่เลือด, สถานภาพสมรส
  • เชื้อชาติ, สัญชาติ, ศาสนา, การศึกษา, อาชีพ, สถานะการมีชีวิต

AC-002.2: หมายเลขประจำตัว

  • รองรับหมายเลขบัตรประชาชน 13 หลัก (ไทย)
  • รองรับ Passport สำหรับชาวต่างชาติ
  • Validation format และ checksum

AC-002.3: ข้อมูลส่งตัวและประวัติ

  • เลขที่หนังสือส่งตัว, สถานพยาบาลที่ส่งตัว
  • เวชระเบียนเก่า, ชื่อเดิม, ชื่อเล่น

AC-002.4: ข้อมูลการติดต่อและที่อยู่

  • ที่อยู่ตามบัตรประชาชน/Passport
  • ที่อยู่ที่สามารถติดต่อได้
  • ข้อมูลผู้ติดต่อกรณีฉุกเฉิน และความสัมพันธ์
  • ข้อมูลบิดา-มารดา พร้อมช่องทางการติดต่อ

FR-003: ข้อมูลสิทธิการรักษา

Priority: Critical
Description: ระบบต้องรองรับการบันทึกและจัดการข้อมูลสิทธิการรักษา

Database Schema: patient_insurance

Acceptance Criteria:

  • AC-003.1: รองรับสิทธิหลักและสิทธิรอง
  • AC-003.2: เชื่อมโยงข้อมูลสิทธิจากระบบภายนอก (สปสช., กรมบัญชีกลาง)
    • การเชื่อมต่อกับระบบตรวจสอบสิทธิของ สปสช.
      • วัตถุประสงค์: เพื่อตรวจสอบสิทธิหลักประกันสุขภาพ (บัตรทอง) และสิทธิประกันสังคม
      • โปรโตคอล: Web Service (SOAP/REST - รอการยืนยัน)
      • Endpoint URL: รอข้อมูลจาก สปสช.
      • การยืนยันตัวตน: รอข้อมูลจาก สปสช. (คาดว่าเป็น User/Pass หรือ API Key)
      • ข้อมูลที่ส่ง: เลขบัตรประชาชน (HN อาจใช้เป็นตัวสำรอง)
      • ข้อมูลที่รับ: ประเภทสิทธิ, สถานะสิทธิ, โรงพยาบาลหลัก/โรงพยาบาลรอง
    • การเชื่อมต่อกับระบบตรวจสอบสิทธิของกรมบัญชีกลาง
      • วัตถุประสงค์: เพื่อตรวจสอบสิทธิเบิกจ่ายตรงของข้าราชการและบุคคลในครอบครัว
      • โปรโตคอล: Web Service (SOAP/REST - รอการยืนยัน)
      • Endpoint URL: รอข้อมูลจากกรมบัญชีกลาง
      • การยืนยันตัวตน: รอข้อมูลจากกรมบัญชีกลาง
      • ข้อมูลที่ส่ง: เลขบัตรประชาชน
      • ข้อมูลที่รับ: ประเภทสิทธิ, สถานะสิทธิ, วงเงินคงเหลือ (ถ้ามี)
  • AC-003.3: การบันทึกสิทธิแบบ manual

FR-004: ฟีเจอร์พิเศษตาม TOR

Priority: High
Description: ระบบต้องรองรับฟีเจอร์พิเศษตามที่ระบุใน TOR

Acceptance Criteria:

AC-004.1: การถ่ายภาพและแนบภาพถ่ายผู้ป่วย

  • รองรับการถ่ายภาพผู้ป่วยผ่าน webcam
  • การอัพโหลดภาพจากไฟล์
  • บีบอัดภาพอัตโนมัติเพื่อประหยัดพื้นที่

AC-004.2: ระบบตรวจสอบข้อมูลซ้ำ

  • ตรวจสอบซ้ำจากชื่อ-นามสกุล และ HN โดยอัตโนมัติ
  • แสดงรายการผู้ป่วยที่อาจซ้ำก่อนบันทึก

AC-004.3: การอ่านข้อมูลจากบัตรประชาชน

  • รองรับ Smart Card Reader
  • ดึงข้อมูลจากบัตรประชาชนอัตโนมัติ
  • ตรวจสอบความถูกต้องของข้อมูล

AC-004.4: รองรับผู้ป่วยชาวต่างชาติ

  • ฟอร์มภาษาอังกฤษสำหรับชาวต่างชาติ
  • รองรับข้อมูล Passport
  • การจัดการข้อมูลที่อยู่ต่างประเทศ

AC-004.5: HN ชั่วคราวสำหรับกรณีฉุกเฉิน

  • สร้าง HN ชั่วคราวสำหรับผู้ป่วยหมดสติ (ใช้ is_temporary_hn = TRUE)
  • บันทึกเหตุผลในฟิลด์ temporary_hn_reason
  • ระบบ merge ข้อมูลเมื่อทราบตัวตนจริง (อัพเดท merge_status, original_patient_id)

AC-004.6: การเชื่อมโยงข้อมูลระหว่างแผนก

  • ส่งข้อมูลการลงทะเบียนไปยังแผนก/คลินิกต่างๆ
  • การให้บริการต่อเนื่อง
  • ตรวจสอบประวัติย้อนหลังได้

FR-008: ระบบค้นหาข้อมูลผู้ป่วย

Priority: Critical
Description: ระบบต้องสามารถค้นหาข้อมูลผู้ป่วยได้อย่างรวดเร็วและแม่นยำ

Database Schema: patients

Acceptance Criteria:

AC-008.1: การค้นหาด้วยหลายเงื่อนไข

  • ค้นหาด้วย HN, เลขบัตรประชาชน, Passport
  • ค้นหาด้วยชื่อ-นามสกุล (ภาษาไทยและอังกฤษ)
  • ค้นหาด้วยเบอร์โทรศัพท์
  • ค้นหาผู้ป่วยที่มี HN ชั่วคราว (ใช้ flag is_temporary_hn = TRUE ในฐานข้อมูล)

AC-008.3: ประสิทธิภาพการค้นหา

  • Response time ≤ 2 วินาที สำหรับ exact match
  • Response time ≤ 5 วินาที สำหรับ fuzzy search
  • รองรับการค้นหาพร้อมกัน 100 concurrent users
  • แสดงผลได้สูงสุด 100 รายการต่อหน้า
  • Pagination สำหรับผลลัพธ์จำนวนมาก

AC-008.4: การแสดงผลการค้นหา

  • แสดงข้อมูลสำคัญ: HN, ชื่อ-นามสกุล, อายุ, เพศ
  • แสดงรูปภาพผู้ป่วย (thumbnail)
  • แสดงสถานะปัจจุบัน (active/inactive)
  • Sort ตามความเกี่ยวข้อง หรือ ล่าสุด

FR-009: ระบบแก้ไขข้อมูลผู้ป่วย

Priority: High
Description: ระบบต้องสามารถแก้ไขข้อมูลผู้ป่วยได้อย่างปลอดภัยพร้อม audit trail

Database Schema: patients

Acceptance Criteria:

AC-009.1: การแก้ไขข้อมูลพื้นฐาน

  • แก้ไขข้อมูลการติดต่อ (ที่อยู่, เบอร์โทร, อีเมล)
  • แก้ไขข้อมูลสถานภาพ (การศึกษา, อาชีพ, สถานภาพสมรส)
  • แก้ไขข้อมูลผู้ติดต่อฉุกเฉิน
  • Real-time validation ขณะแก้ไข

AC-009.2: การแก้ไขข้อมูลสำคัญ (ต้องอนุมัติ)

  • เลขบัตรประชาชน/Passport
  • ชื่อ-นามสกุล
  • วันเดือนปีเกิด
  • HN (เฉพาะกรณีพิเศษ)
  • ต้องมีเหตุผลและผู้อนุมัติ

AC-009.3: Audit Trail และ Version History

  • บันทึกทุกการเปลี่ยนแปลงพร้อม timestamp
  • เก็บข้อมูลผู้แก้ไข, IP address, user agent
  • แสดง change history ย้อนหลัง
  • Compare versions (before/after)
  • Export audit log สำหรับตรวจสอบ

AC-009.4: ระบบอนุมัติการเปลี่ยนแปลง

  • Change request workflow สำหรับข้อมูลสำคัญ
  • Email notification ถึงผู้อนุมัติ
  • Approval dashboard สำหรับ supervisors
  • Auto-expire requests หลัง 7 วัน
  • Bulk approval สำหรับ multiple requests

AC-009.5: การป้องกันและความปลอดภัย

  • Field-level permissions ตาม user role
  • Two-factor authentication สำหรับข้อมูลสำคัญ
  • Session timeout หลังไม่ใช้งาน 15 นาที
  • Concurrent edit protection (optimistic locking)
  • Data validation และ sanitization

2.2 โมดูลการส่งผู้ป่วยเข้าห้องตรวจ (เปิด Visit)

FR-005: การสร้าง OPD Visit

Priority: Critical
Description: ระบบต้องสามารถส่งผู้ป่วยเข้ารับบริการ ณ จุดตรวจรักษาต่างๆ

Database Schema: medical_visits

Acceptance Criteria:

AC-005.1: การทำรายการหลากหลายช่องทาง

  • รองรับการทำรายการโดยเจ้าหน้าที่
  • รองรับผู้ป่วยผ่าน Kiosk ที่ได้รับการยืนยันข้อมูลแล้ว
  • Interface ที่ใช้งานง่ายสำหรับทั้งสองช่องทาง

AC-005.2: การสร้าง OPD Visit

  • ระบุแผนกหรือคลินิกที่รับบริการ
  • Auto-generate Visit Number
  • บันทึกวันที่และเวลาการมาใช้บริการ

AC-005.3: การส่งผู้ป่วยหลายแผนกพร้อมกัน

  • รองรับการส่งผู้ป่วยเข้าตรวจได้มากกว่า 1 แผนกพร้อมกัน
  • แยกคิวแต่ละแผนกอย่างชัดเจน
  • การจัดการลำดับความสำคัญ

FR-006: ระบบตรวจสอบสิทธิการรักษา

Priority: Critical
Description: ตรวจสอบสิทธิการรักษาแบบเรียลไทม์

Acceptance Criteria:

AC-006.1: การตรวจสอบสิทธิจากระบบภายนอก

  • เชื่อมต่อ สปสช. (NHSO) แบบเรียลไทม์
  • เชื่อมต่อกรมบัญชีกลางสำหรับ CSMBS
  • แสดงผลการตรวจสอบภายใน 5 วินาที

AC-006.2: การเลือกใช้สิทธิหลักหรือสิทธิรอง

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

AC-006.3: การบันทึกสิทธิแบบ Manual

  • สำหรับกรณีที่ระบบภายนอกไม่สามารถเชื่อมต่อได้
  • ต้องระบุเหตุผลและผู้ที่ทำการยืนยัน

FR-007: ระบบจัดการคิวและเอกสาร

Priority: High
Description: การออกเอกสารส่งตรวจและจัดการคิวบริการ

Acceptance Criteria:

AC-007.1: การออกเอกสารส่งตรวจ

  • เอกสารส่งตรวจพร้อมบัตรคิวในชุดเดียวกัน
  • ข้อมูลผู้ป่วย, แผนกที่ตรวจ, หมายเลขคิว
  • รองรับการพิมพ์จากจุดบริการหรือ Kiosk

AC-007.2: ระบบหมายเลขคิว

  • สร้างหมายเลขคิวตามเงื่อนไขของแต่ละคลินิก
  • รองรับคิวแยกตามประเภท (ปกติ, ผู้สูงอายุ, พิการ, ฉุกเฉิน)
  • แนบหมายเลขคิวในเอกสารเดียวกัน

AC-007.3: การแสดงสถานะการเข้ารับบริการ

  • ประวัติการตรวจย้อนหลัง
  • สถานะปัจจุบันของการรับบริการแต่ละแผนก
  • เวลาโดยประมาณที่จะได้รับบริการ

3. ความต้องการด้านประสิทธิภาพ (Performance Requirements)

3.1 Response Time Requirements

const responseTimeRequirements = {
  // Patient Registration (ตาม TOR)
  patient_registration: '≤ 3 seconds',
  duplicate_checking: '≤ 2 seconds',
  smart_card_reading: '≤ 5 seconds',
  photo_capture_upload: '≤ 3 seconds',

  // Patient Search & Edit Features
  patient_search_exact: '≤ 2 seconds',
  patient_search_fuzzy: '≤ 5 seconds',
  patient_data_update: '≤ 3 seconds',
  audit_log_creation: '≤ 1 second',

  // Visit Management
  visit_creation: '≤ 2 seconds',
  eligibility_checking: '≤ 5 seconds', // NHSO/Government API
  queue_generation: '≤ 1 second',
  document_printing: '≤ 3 seconds',

  // Multi-channel Support
  kiosk_interface: '≤ 2 seconds',
  mobile_app_sync: '≤ 3 seconds',
  line_bot_response: '≤ 2 seconds'
};

3.2 Throughput Requirements

const throughputRequirements = {
  // Daily Operations (ตาม TOR)
  daily_new_registrations: 500,
  daily_visits: 2000,
  concurrent_registrations: 20,

  // Multi-channel Capacity
  staff_registrations_per_hour: 100,
  kiosk_registrations_per_hour: 50,
  mobile_app_registrations_per_day: 200,

  // Peak Hour Performance
  peak_hour_visits: 400,
  concurrent_eligibility_checks: 50,
  concurrent_queue_generations: 100
};

4. ความต้องการด้านความปลอดภัย (Security Requirements)

4.1 Data Protection (ตาม TOR)

SR-001: Patient Photo Security

  • รูปภาพผู้ป่วยต้องเข้ารหัส AES-256
  • จัดเก็บแยกจากข้อมูลส่วนบุคคลอื่น
  • มี audit trail การเข้าถึงรูปภาพ

SR-002: Smart Card Data Protection

  • ข้อมูลจากบัตรประชาชนต้องเข้ารหัสทันทีหลังอ่าน
  • ไม่เก็บ PIN หรือ sensitive card data
  • Log การใช้งาน card reader

SR-003: Multi-channel Security

  • Authentication แยกตามช่องทาง
  • Session management สำหรับ Kiosk
  • API security สำหรับ Mobile App และ Line Bot

4.2 Access Control

const accessControlMatrix = {
  'Registration_Staff': {
    patients: ['create', 'read', 'update'],
    visits: ['create', 'read'],
    insurance: ['read', 'verify'],
    photos: ['capture', 'view'],
    search: ['basic_search', 'advanced_search'],
    edit: ['basic_data', 'contact_info']
  },
  'Senior_Registration_Staff': {
    patients: ['create', 'read', 'update', 'approve_changes'],
    visits: ['create', 'read', 'update'],
    insurance: ['read', 'verify', 'override'],
    photos: ['capture', 'view', 'update'],
    search: ['basic_search', 'advanced_search', 'bulk_search'],
    edit: ['basic_data', 'contact_info', 'critical_data'],
    audit: ['view_logs', 'export_logs']
  },
  'Medical_Staff': {
    patients: ['read', 'view_medical_history'],
    visits: ['read', 'update_visit'],
    search: ['basic_search', 'medical_search'],
    edit: ['medical_notes', 'emergency_contact']
  },
  'Supervisor': {
    patients: ['read', 'approve_critical_changes'],
    change_requests: ['view', 'approve', 'reject'],
    audit: ['view_logs', 'export_logs', 'generate_reports'],
    search: ['basic_search', 'advanced_search', 'audit_search']
  },
  'Kiosk_User': {
    patients: ['create_self', 'update_self'],
    visits: ['create_self'],
    insurance: ['view_self'],
    search: ['search_self'],
    edit: ['basic_self_data']
  },
  'Mobile_App_User': {
    patients: ['create_self', 'update_self'],
    appointments: ['create', 'view_self'],
    queue_status: ['view_self'],
    search: ['search_self'],
    edit: ['contact_info_self']
  },
  'IT_Administrator': {
    patients: ['read', 'system_maintenance'],
    audit: ['view_all_logs', 'export_all_logs', 'system_logs'],
    search: ['system_search', 'debug_search'],
    system: ['backup', 'restore', 'maintain_indexes']
  }
};

5. ความต้องการด้านการเชื่อมต่อ (Integration Requirements)

5.1 Government System Integration

IR-001: NHSO Integration (สปสช.)

  • Real-time eligibility verification
  • สิทธิบัตรทอง, สิทธิหลักประกันสุขภาพถ้วนหน้า
  • Cross-provincial treatment support
  • API timeout handling และ fallback mechanism

IR-002: Civil Registration Integration (กรมบัญชีกลาง)

  • CSMBS eligibility checking
  • Government officer verification
  • ข้าราชการ, ลูกจ้างประจำ, พนักงานราชการ

IR-003: Smart Card Integration

  • Thai National ID Card reader
  • Real-time data extraction
  • Photo verification
  • Digital signature validation

5.2 Internal System Integration

IR-004: Department Systems

  • ส่งข้อมูล visit ไปยังแผนกต่างๆ
  • Queue management system integration
  • Laboratory and radiology scheduling
  • Pharmacy notification

IR-006: HL7 Document Management System

Priority: High
Description: ระบบการจัดการเอกสารทางการแพทย์ตาม HL7 FHIR R4 standards

Acceptance Criteria:

AC-006.1: HL7 Document Upload และ Management

  • รองรับการอัพโหลดเอกสารทางการแพทย์ในรูปแบบ HL7 FHIR
  • Validate HL7 document structure ตาม FHIR R4 specification
  • เก็บ metadata ของเอกสาร: DocumentReference, Patient reference, Practitioner
  • รองรับ document types: ClinicalDocument, DiagnosticReport, MedicationStatement

AC-006.2: FHIR Resource Management

const supportedFHIRResources = {
  patient_resources: [
    'Patient',
    'Person', 
    'Practitioner',
    'PractitionerRole'
  ],
  clinical_resources: [
    'Encounter',
    'Observation',
    'DiagnosticReport',
    'DocumentReference',
    'MedicationStatement',
    'AllergyIntolerance',
    'Condition'
  ],
  administrative_resources: [
    'Organization',
    'Location',
    'Schedule',
    'Appointment'
  ]
};

AC-006.3: Document Validation และ Processing

  • XML/JSON schema validation สำหรับ FHIR documents
  • Automatic patient matching จาก FHIR Patient resource
  • Extract clinical data ไปยัง local database structure
  • Error handling สำหรับ invalid HL7 documents
  • Audit trail การ upload และ processing

AC-006.4: HL7 Export Functionality

  • Export patient data เป็น FHIR Bundle
  • Generate HL7 CDA documents สำหรับการส่งต่อ
  • รองรับ bulk export ตาม FHIR Bulk Data Access standard
  • API endpoint สำหรับ external system integration
const hl7ExportEndpoints = {
  fhir_api: {
    base_url: '/api/fhir/R4/',
    endpoints: [
      'GET /Patient/{id}',
      'GET /Encounter/{id}',
      'GET /DocumentReference/{id}',
      'POST /Patient/$export',
      'GET /Patient/{id}/Observation',
      'GET /Patient/{id}/DiagnosticReport'
    ],
    content_types: ['application/fhir+json', 'application/fhir+xml']
  }
};

AC-006.5: HL7 Message Processing (HL7 v2.x)

  • รองรับ HL7 v2.x messages: ADT, ORU, ORM
  • Message parsing และ validation
  • Automatic patient registration จาก ADT^A04 messages
  • Lab result integration จาก ORU^R01 messages
  • Order management จาก ORM^O01 messages
const hl7v2MessageTypes = {
  ADT_messages: {
    'ADT^A01': 'Patient Admission',
    'ADT^A02': 'Patient Transfer', 
    'ADT^A03': 'Patient Discharge',
    'ADT^A04': 'Patient Registration',
    'ADT^A08': 'Patient Information Update'
  },
  ORU_messages: {
    'ORU^R01': 'Laboratory Results',
    'ORU^R32': 'Radiology Results'
  },
  ORM_messages: {
    'ORM^O01': 'General Order Message'
  }
};

IR-005: Mobile and Line Bot Integration

const integrationApis = {
  mobile_app: {
    endpoints: [
      'POST /api/mobile/register',
      'GET /api/mobile/patient/{id}',
      'POST /api/mobile/visit',
      'GET /api/mobile/queue-status/{visitId}'
    ],
    authentication: 'JWT + refresh token',
    rate_limiting: '100 requests/minute per user'
  },

  line_bot: {
    webhook_url: '/api/line/webhook',
    messaging_api: 'Line Messaging API v2',
    supported_actions: [
      'patient_registration',
      'appointment_booking',
      'queue_inquiry'
    ]
  }
};

6. ความต้องการด้านการใช้งาน (Usability Requirements)

6.1 Multi-channel User Interface

UR-001: Staff Interface

  • Desktop web application
  • Keyboard shortcuts สำหรับการป้อนข้อมูลเร็ว
  • Drag & drop photo upload
  • Auto-complete สำหรับข้อมูลที่ใช้บ่อย

UR-002: Kiosk Interface

  • Touch-optimized interface
  • ฟอนต์ใหญ่อ่านง่าย
  • Voice guidance (ภาษาไทยและอังกฤษ)
  • Help button เรียกเจ้าหน้าที่

UR-003: Mobile App Interface

  • Progressive Web App (PWA)
  • Responsive design
  • Offline capability สำหรับข้อมูลพื้นฐาน
  • Push notification สำหรับคิวและการนัดหมาย

UR-004: Line Bot Interface

  • Rich menu design
  • Quick reply buttons
  • Flex message สำหรับการแสดงข้อมูล
  • Image carousel สำหรับ multi-option

6.2 Accessibility Requirements

UR-005: Thai Language Support

  • Unicode UTF-8 support
  • Thai font rendering
  • Thai keyboard layout
  • Thai date format (Buddhist calendar)

UR-006: International Patient Support

  • English interface toggle
  • Passport data input
  • International address format
  • Multi-language help text

7. เอกสารและรายงาน (Documentation & Reporting)

7.1 Document Generation

DR-001: Registration Documents

  • ใบยืนยันการลงทะเบียน
  • บัตรผู้ป่วย (Patient card)
  • เอกสารสิทธิการรักษา

DR-002: Visit Documents

  • เอกสารส่งตรวจ
  • บัตรคิวบริการ
  • ใบรับรองการมาใช้บริการ

7.2 Reports

DR-003: Registration Statistics

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

DR-004: Visit Analysis

  • สถิติการเข้ารับบริการ
  • ระยะเวลารอคิวเฉลี่ย
  • การใช้สิทธิการรักษา

8. การติดตั้งและการนำไปใช้ (Implementation & Deployment)

8.1 Implementation Phases

Phase 1: Core Registration System (6 weeks)

  • Patient registration by staff
  • Basic visit creation
  • Smart card integration
  • Photo capture functionality

Phase 2: Multi-channel Extension (4 weeks)

  • Kiosk interface
  • Mobile app development
  • Line Bot integration
  • Queue management system

Phase 3: External Integration (4 weeks)

  • NHSO API integration
  • Government system connections
  • Cross-provincial support
  • Advanced reporting

Phase 4: Optimization & Go-live (2 weeks)

  • Performance tuning
  • User training
  • System monitoring
  • Production deployment

8.2 Training Requirements

TR-001: Staff Training

  • Registration staff: 8 hours
  • IT support staff: 16 hours
  • Department staff: 4 hours
  • Management overview: 2 hours

TR-002: Patient Education

  • Kiosk usage instruction
  • Mobile app tutorial
  • Line Bot guide
  • Multi-language materials

9. การบำรุงรักษาและสนับสนุน (Maintenance & Support)

9.1 System Maintenance

MS-001: Regular Maintenance

  • Daily backup verification
  • Weekly performance monitoring
  • Monthly security updates
  • Quarterly system health check

MS-002: Integration Maintenance

  • NHSO API connection monitoring
  • Smart card reader calibration
  • Mobile app update deployment
  • Line Bot functionality testing

9.2 Support Structure

MS-003: Multi-level Support

  • Level 1: Basic user support (1 hour response)
  • Level 2: Technical issues (2 hours response)
  • Level 3: System integration issues (4 hours response)
  • Emergency: 24/7 critical system failures

10. การติดตามและประเมินผล (Monitoring & Evaluation)

10.1 Key Performance Indicators (KPIs)

ตัวชี้วัดตาม TOR:

const torKPIs = {
  // การลงทะเบียน (TOR 1.1)
  registration_efficiency: {
    avg_registration_time: '≤ 5 minutes',
    data_completeness_rate: '≥ 95%',
    duplicate_detection_accuracy: '≥ 98%',
    photo_capture_success_rate: '≥ 95%'
  },

  // ช่องทางการลงทะเบียน
  channel_adoption: {
    staff_registration_percentage: '60%',
    kiosk_usage_percentage: '25%',
    mobile_app_percentage: '10%',
    line_app_percentage: '5%'
  },

  // การส่งผู้ป่วยเข้าตรวจ (TOR 1.2)
  visit_management: {
    visit_creation_time: '≤ 2 minutes',
    eligibility_check_success_rate: '≥ 98%',
    queue_waiting_accuracy: '≤ 10% variance',
    multi_department_visits_handled: '≥ 90%'
  },

  // ความพึงพอใจ
  user_satisfaction: {
    patient_satisfaction_score: '≥ 4.0/5.0',
    staff_satisfaction_score: '≥ 4.0/5.0',
    system_usability_score: '≥ 80%'
  }
};

10.2 การติดตามการใช้งานระบบ

MO-001: Dashboard การติดตามแบบเรียลไทม์

-- View สำหรับ Dashboard ตาม TOR
CREATE VIEW v_registration_dashboard AS
SELECT 
    CURRENT_DATE as report_date,

    -- การลงทะเบียนตามช่องทาง
    COUNT(CASE WHEN registration_channel = 'staff' THEN 1 END) as staff_registrations,
    COUNT(CASE WHEN registration_channel = 'kiosk' THEN 1 END) as kiosk_registrations,
    COUNT(CASE WHEN registration_channel = 'mobile' THEN 1 END) as mobile_registrations,
    COUNT(CASE WHEN registration_channel = 'line' THEN 1 END) as line_registrations,

    -- ประสิทธิภาพการลงทะเบียน
    AVG(EXTRACT(EPOCH FROM (completed_at - started_at))/60) as avg_registration_minutes,
    COUNT(CASE WHEN photo_path IS NOT NULL THEN 1 END) as registrations_with_photo,
    COUNT(CASE WHEN smart_card_used = TRUE THEN 1 END) as smart_card_usage,

    -- การตรวจสอบข้อมูลซ้ำ
    COUNT(CASE WHEN duplicate_check_performed = TRUE THEN 1 END) as duplicate_checks,
    COUNT(CASE WHEN duplicate_found = TRUE THEN 1 END) as duplicates_found,

    -- สิทธิการรักษา
    COUNT(CASE WHEN eligibility_verified = TRUE THEN 1 END) as eligibility_verified,
    AVG(eligibility_check_time_seconds) as avg_eligibility_check_time,

    -- Visit management
    COUNT(v.id) as total_visits_created,
    COUNT(CASE WHEN v.multi_department = TRUE THEN 1 END) as multi_department_visits

FROM patients p
LEFT JOIN medical_visits v ON p.id = v.patient_id AND v.visit_date = CURRENT_DATE
WHERE p.created_at >= CURRENT_DATE
GROUP BY CURRENT_DATE;

10.3 การประเมินผลตาม TOR

EV-001: การประเมินประสิทธิภาพการลงทะเบียน

  • เวลาการลงทะเบียน: เป้าหมาย ≤ 5 นาที (ตาม TOR 1.1.1)
  • ความถูกต้องข้อมูล: เป้าหมาย ≥ 99%
  • การใช้งานช่องทางต่างๆ: ตามสัดส่วนที่กำหนด
  • ความพึงพอใจผู้ใช้: เป้าหมาย ≥ 4.0/5.0

EV-002: การประเมินการส่งผู้ป่วยเข้าตรวจ

  • เวลาการสร้าง Visit: เป้าหมาย ≤ 2 นาที (ตาม TOR 1.2.1)
  • ความสำเร็จการตรวจสิทธิ: เป้าหมาย ≥ 98%
  • ความแม่นยำของคิว: เป้าหมาย ±10%
  • การรองรับหลายแผนก: เป้าหมาย ≥ 90%

11. การจัดการความเสี่ยง (Risk Management)

11.1 การระบุความเสี่ยงตาม TOR

RI-001: ความเสี่ยงด้านเทคนิค

const technicalRisks = [
  {
    risk: 'Smart Card Reader ไม่สามารถอ่านบัตรได้',
    probability: 'Medium',
    impact: 'High',
    mitigation: 'เตรียม manual input backup, มี spare reader',
    owner: 'IT Team'
  },
  {
    risk: 'NHSO API ไม่สามารถเชื่อมต่อได้',
    probability: 'Medium', 
    impact: 'High',
    mitigation: 'Offline mode, manual verification process',
    owner: 'Integration Team'
  },
  {
    risk: 'Kiosk หน้าจอสัมผัสเสียหาย',
    probability: 'High',
    impact: 'Medium',
    mitigation: 'Regular maintenance, backup kiosk unit',
    owner: 'Facility Team'
  },
  {
    risk: 'Mobile App/Line Bot ไม่เสถียร',
    probability: 'Medium',
    impact: 'Medium', 
    mitigation: 'Comprehensive testing, gradual rollout',
    owner: 'Development Team'
  }
];

RI-002: ความเสี่ยงด้านการใช้งาน

const usabilityRisks = [
  {
    risk: 'ผู้ป่วยสูงอายุใช้ Kiosk ไม่เป็น',
    probability: 'High',
    impact: 'Medium',
    mitigation: 'Voice guidance, help button, staff assistance',
    owner: 'UX Team'
  },
  {
    risk: 'ชาวต่างชาติไม่เข้าใจระบบ',
    probability: 'Medium',
    impact: 'Medium',
    mitigation: 'Multi-language support, visual guides',
    owner: 'Localization Team'
  },
  {
    risk: 'เจ้าหน้าที่ต้านทานการเปลี่ยนแปลง',
    probability: 'Medium',
    impact: 'High',
    mitigation: 'Comprehensive training, change management',
    owner: 'Change Management Team'
  }
];

11.2 แผนรองรับสำหรับความเสี่ยง

RI-003: Business Continuity Plan

const continuityPlan = {
  smart_card_failure: {
    immediate_action: 'Switch to manual input mode',
    alternative_method: 'Keyboard input with validation',
    recovery_time: '< 5 minutes',
    notification: 'Alert IT support immediately'
  },

  nhso_api_failure: {
    immediate_action: 'Activate offline eligibility mode',
    alternative_method: 'Manual verification with callback',
    recovery_time: '< 15 minutes',
    notification: 'Alert integration team and NHSO'
  },

  kiosk_failure: {
    immediate_action: 'Redirect patients to staff counter',
    alternative_method: 'Additional staff coverage',
    recovery_time: '< 30 minutes',
    notification: 'Alert facility management'
  },

  mobile_line_failure: {
    immediate_action: 'Notify users via system message',
    alternative_method: 'Redirect to web interface or call center',
    recovery_time: '< 2 hours',
    notification: 'Update status page and social media'
  }
};

12. การฝึกอบรมและการเปลี่ยนแปลง (Training & Change Management)

12.1 แผนการฝึกอบรมตาม TOR

TR-001: การฝึกอบรมเจ้าหน้าที่

const staffTrainingPlan = {
  registration_staff: {
    duration: '8 hours',
    content: [
      'Patient registration workflow (2 hours)',
      'Smart card reader operation (1 hour)', 
      'Photo capture and management (1 hour)',
      'Duplicate checking procedures (1 hour)',
      'Foreign patient handling (1 hour)',
      'Emergency registration (1 hour)',
      'Troubleshooting common issues (1 hour)'
    ],
    assessment: 'Practical exam with real scenarios',
    certification: 'Required before system access'
  },

  medical_staff: {
    duration: '4 hours',
    content: [
      'Visit creation and management (1.5 hours)',
      'Queue system operation (1 hour)',
      'Multi-department workflow (1 hour)',
      'Patient history access (0.5 hours)'
    ],
    assessment: 'System navigation test',
    certification: 'Competency verification'
  },

  it_support: {
    duration: '16 hours',
    content: [
      'System architecture overview (2 hours)',
      'Database management (3 hours)',
      'Integration troubleshooting (3 hours)',
      'Hardware maintenance (2 hours)',
      'Security protocols (2 hours)',
      'Backup and recovery (2 hours)',
      'Performance monitoring (2 hours)'
    ],
    assessment: 'Technical proficiency exam',
    certification: 'System administrator certification'
  }
};

TR-002: การให้ความรู้ผู้ป่วย

const patientEducationPlan = {
  kiosk_usage: {
    materials: [
      'Step-by-step visual guide (Thai/English)',
      'Video tutorial (2 minutes)',
      'Quick reference card',
      'Help desk contact information'
    ],
    placement: 'Near kiosk units, waiting areas',
    updates: 'Monthly review and refresh'
  },

  mobile_app: {
    materials: [
      'Download and setup guide',
      'Feature walkthrough video',
      'FAQ document',
      'In-app tutorial'
    ],
    distribution: 'Hospital website, social media, posters',
    support: 'Dedicated help line'
  },

  line_bot: {
    materials: [
      'QR code for adding bot',
      'Command reference guide',
      'Screenshot examples',
      'Voice message instructions'
    ],
    promotion: 'Line official account, hospital Line group',
    assistance: 'Live chat support during business hours'
  }
};

12.2 การจัดการการเปลี่ยนแปลง

CM-001: Change Management Strategy

const changeManagementApproach = {
  stakeholder_engagement: {
    hospital_management: {
      involvement: 'Strategic oversight and resource allocation',
      communication: 'Monthly progress meetings',
      concerns: 'ROI and operational efficiency'
    },

    medical_staff: {
      involvement: 'Workflow design and testing',
      communication: 'Department meetings and demos',
      concerns: 'Impact on patient care time'
    },

    registration_staff: {
      involvement: 'Daily operations and feedback',
      communication: 'Weekly training sessions',
      concerns: 'Job security and learning curve'
    },

    patients: {
      involvement: 'User acceptance testing',
      communication: 'Information campaigns',
      concerns: 'Ease of use and privacy'
    }
  },

  phased_rollout: {
    phase_1: {
      scope: 'Staff registration system only',
      duration: '2 weeks',
      success_criteria: 'Staff competency achieved'
    },

    phase_2: {
      scope: 'Add kiosk registration',
      duration: '2 weeks', 
      success_criteria: 'Patient adoption > 20%'
    },

    phase_3: {
      scope: 'Mobile app and Line bot',
      duration: '4 weeks',
      success_criteria: 'Multi-channel usage balanced'
    },

    phase_4: {
      scope: 'Full optimization',
      duration: '2 weeks',
      success_criteria: 'All KPIs met'
    }
  }
};

13. การรับประกันคุณภาพ (Quality Assurance)

13.1 Testing Strategy ตาม TOR

QA-001: Functional Testing

const functionalTestCases = {
  patient_registration: [
    {
      test_case: 'REG-001',
      description: 'ลงทะเบียนผู้ป่วยใหม่ด้วยบัตรประชาชน',
      steps: [
        'เสียบบัตรประชาชนใน Smart Card Reader',
        'ระบบดึงข้อมูลอัตโนมัติ',
        'ถ่ายภาพผู้ป่วย',
        'กรอกข้อมูลเพิ่มเติม',
        'ตรวจสอบข้อมูลซ้ำ',
        'บันทึกข้อมูล'
      ],
      expected_result: 'สร้าง HN และบันทึกข้อมูลสำเร็จ',
      test_data: 'บัตรประชาชนจริง 10 ใบ'
    },

    {
      test_case: 'REG-002', 
      description: 'ลงทะเบียนผู้ป่วยชาวต่างชาติ',
      steps: [
        'เลือกโหมดชาวต่างชาติ',
        'กรอกข้อมูล Passport',
        'เลือกภาษาอังกฤษ',
        'กรอกข้อมูลที่อยู่ต่างประเทศ',
        'บันทึกข้อมูล'
      ],
      expected_result: 'สร้างบัญชีผู้ป่วยต่างชาติสำเร็จ',
      test_data: 'ข้อมูล Passport ตัวอย่าง'
    }
  ],

  patient_search: [
    {
      test_case: 'SEARCH-001',
      description: 'ค้นหาผู้ป่วยด้วย HN',
      steps: [
        'เข้าหน้าค้นหาผู้ป่วย',
        'กรอก HN ในช่องค้นหา',
        'กดปุ่มค้นหา',
        'ตรวจสอบผลลัพธ์'
      ],
      expected_result: 'แสดงข้อมูลผู้ป่วยที่ตรงกับ HN',
      test_data: 'HN ที่มีอยู่ในระบบ 20 รายการ'
    },

    {
      test_case: 'SEARCH-002',
      description: 'ค้นหาผู้ป่วยด้วยชื่อ-นามสกุล (Fuzzy search)',
      steps: [
        'กรอกชื่อที่พิมพ์ผิดเล็กน้อย',
        'กดปุ่มค้นหา',
        'ตรวจสอบว่าระบบแสดงผลลัพธ์ที่เกี่ยวข้อง'
      ],
      expected_result: 'แสดงรายการผู้ป่วยที่มีชื่อใกล้เคียง',
      test_data: 'ชื่อไทยที่พิมพ์ผิด 10 รูปแบบ'
    },

    {
      test_case: 'SEARCH-003',
      description: 'ค้นหาขั้นสูงตามหลายเงื่อนไข',
      steps: [
        'เปิดฟอร์มค้นหาขั้นสูง',
        'กรอกเงื่อนไข: อายุ 30-50, เพศชาย, สิทธิ UCS',
        'กดค้นหา',
        'ตรวจสอบผลลัพธ์'
      ],
      expected_result: 'แสดงผู้ป่วยที่ตรงตามเงื่อนไขทั้งหมด',
      test_data: 'ข้อมูลผู้ป่วยหลากหลายกลุ่ม'
    }
  ],

  patient_edit: [
    {
      test_case: 'EDIT-001',
      description: 'แก้ไขข้อมูลการติดต่อผู้ป่วย',
      steps: [
        'ค้นหาและเลือกผู้ป่วย',
        'กดปุ่มแก้ไขข้อมูล',
        'เปลี่ยนเบอร์โทรศัพท์และที่อยู่',
        'บันทึกการเปลี่ยนแปลง',
        'ตรวจสอบ audit log'
      ],
      expected_result: 'ข้อมูลถูกอัพเดทและมี audit trail',
      test_data: 'ผู้ป่วยที่มีข้อมูลการติดต่อ'
    },

    {
      test_case: 'EDIT-002',
      description: 'ขอแก้ไขข้อมูลสำคัญ (ต้องอนุมัติ)',
      steps: [
        'ค้นหาและเลือกผู้ป่วย',
        'พยายามแก้ไขชื่อ-นามสกุล',
        'กรอกเหตุผลการแก้ไข',
        'ส่งคำขออนุมัติ',
        'ตรวจสอบสถานะคำขอ'
      ],
      expected_result: 'สร้าง change request และส่ง notification',
      test_data: 'ผู้ป่วยที่ต้องแก้ไขชื่อ'
    },

    {
      test_case: 'EDIT-003',
      description: 'อนุมัติการแก้ไขข้อมูลสำคัญ',
      steps: [
        'เข้า approval dashboard',
        'เลือก pending change request',
        'ตรวจสอบรายละเอียดการเปลี่ยนแปลง',
        'อนุมัติการเปลี่ยนแปลง',
        'ตรวจสอบว่าข้อมูลถูกอัพเดท'
      ],
      expected_result: 'ข้อมูลถูกอัพเดทหลังได้รับอนุมัติ',
      test_data: 'Change request ที่ pending'
    }
  ],

  visit_management: [
    {
      test_case: 'VIS-001',
      description: 'สร้าง OPD Visit และตรวจสิทธิ',
      steps: [
        'ค้นหาผู้ป่วยด้วย HN',
        'เลือกแผนกที่ต้องการตรวจ',
        'ตรวจสอบสิทธิการรักษา',
        'สร้าง Visit และคิว',
        'พิมพ์เอกสารส่งตรวจ'
      ],
      expected_result: 'สร้าง Visit สำเร็จและได้รับคิว',
      test_data: 'ผู้ป่วยที่มีสิทธิ UCS'
    }
  ]
};

QA-002: Multi-channel Testing

const multichannelTests = {
  kiosk_testing: {
    hardware_tests: [
      'Touch screen responsiveness',
      'Smart card reader functionality', 
      'Camera operation',
      'Printer connectivity',
      'Network connectivity'
    ],
    usability_tests: [
      'Senior citizen usability (65+ years)',
      'Disability accessibility',
      'Thai/English language switching',
      'Voice guidance functionality'
    ]
  },

  mobile_app_testing: {
    device_compatibility: [
      'iOS 14+ (iPhone 8 and newer)',
      'Android 8+ (Various manufacturers)',
      'Different screen sizes',
      'Different network conditions'
    ],
    functionality_tests: [
      'Registration process',
      'Photo upload',
      'Queue status checking',
      'Push notification delivery'
    ]
  },

  line_bot_testing: {
    conversation_flows: [
      'Registration conversation',
      'Appointment booking',
      'Queue inquiry', 
      'Help and support'
    ],
    integration_tests: [
      'Line webhook handling',
      'Message delivery',
      'Rich menu functionality',
      'Error handling'
    ]
  }
};

13.2 Performance Testing

QA-003: Load Testing Scenarios

const loadTestScenarios = {
  peak_registration: {
    description: 'จำลองยอดลงทะเบียนสูงสุดตอนเช้า',
    concurrent_users: 50,
    duration: '30 minutes',
    channels: {
      staff: 30,
      kiosk: 15,
      mobile: 5
    },
    acceptance_criteria: 'Response time ≤ 5 seconds, 0% error rate'
  },

  eligibility_check_stress: {
    description: 'ทดสอบการตรวจสิทธิหนาแน่น',
    concurrent_checks: 100,
    duration: '15 minutes',
    external_apis: ['NHSO', 'Civil Registration'],
    acceptance_criteria: 'Success rate ≥ 98%, timeout handling works'
  },

  smart_card_concurrent: {
    description: 'การใช้ Smart Card Reader หลายเครื่องพร้อมกัน',
    concurrent_reads: 20,
    duration: '20 minutes',
    test_cards: 50,
    acceptance_criteria: 'Read success rate ≥ 95%, no card conflicts'
  }
};

13.1 API Route Specifications (API Routes และ Technical Specifications)

13.1.1 API Design Standards

RESTful API Design Principles

const apiStandards = {
  base_url: '/api/v1/emr/',
  authentication: 'JWT Bearer Token',
  content_type: 'application/json',
  charset: 'UTF-8',
  versioning: 'URL path versioning (/api/v1/, /api/v2/)',
  naming_convention: 'kebab-case for endpoints, camelCase for JSON fields'
};

const responseFormat = {
  success: {
    status: 'success',
    data: {}, // Response data
    message: 'Operation completed successfully',
    timestamp: '2024-08-18T10:30:00.000Z',
    requestId: 'req-uuid-123'
  },
  error: {
    status: 'error',
    error: {
      code: 'EMR_PATIENT_NOT_FOUND',
      message: 'Patient not found',
      details: 'Patient with HN 12345 does not exist'
    },
    timestamp: '2024-08-18T10:30:00.000Z',
    requestId: 'req-uuid-123'
  }
};

Authentication & Security

const authenticationSpec = {
  jwt_token: {
    header: 'Authorization: Bearer <jwt_token>',
    expiration: '24 hours',
    refresh_token: 'Required for token renewal',
    claims: {
      userId: 'string',
      hospitalId: 'string',
      roles: 'string[]',
      departments: 'string[]',
      permissions: 'string[]'
    }
  },

  rate_limiting: {
    authenticated_users: '1000 requests/minute',
    kiosk_endpoints: '100 requests/minute',
    public_endpoints: '50 requests/minute'
  },

  cors_policy: {
    allowed_origins: ['https://meditech.hospital.th', 'https://kiosk.hospital.th'],
    allowed_methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'],
    allowed_headers: ['Content-Type', 'Authorization', 'X-Request-ID']
  }
};

13.1.2 Patient Registration APIs

A. Core Patient Management Endpoints

POST /api/v1/emr/patients

// Create new patient
const createPatientRequest = {
  method: 'POST',
  endpoint: '/api/v1/emr/patients',
  headers: {
    'Authorization': 'Bearer <jwt_token>',
    'Content-Type': 'application/json'
  },
  body: {
    // Personal Information
    nationalId: '1234567890123',
    passportNumber: 'AB1234567', // For foreign patients
    titleThai: 'นาย',
    titleEng: 'Mr.',
    firstNameThai: 'สมชาย',
    firstNameEng: 'Somchai',
    lastNameThai: 'ใจดี',
    lastNameEng: 'Jaidee',
    nickNameThai: 'ชาย',
    nickNameEng: 'Chai',

    // Demographics
    birthDate: '1985-05-15',
    age: 39,
    gender: 'M', // M, F, O (Other)
    nationality: 'TH',
    religion: 'Buddhist',
    occupation: 'Engineer',

    // Contact Information
    phoneNumber: '0812345678',
    email: '[email protected]',
    emergencyContact: {
      name: 'นางสาวใจดี ใจงาม',
      relationship: 'spouse',
      phoneNumber: '0823456789'
    },

    // Address
    address: {
      houseNumber: '123/45',
      village: 'หมู่บ้านดีใจ',
      street: 'ถนนสุขใจ',
      subDistrict: 'ใจดี',
      district: 'สุขใจ',
      province: 'กรุงเทพมหานคร',
      postalCode: '10110',
      country: 'Thailand'
    },

    // Insurance Information
    insurance: {
      type: 'NHSO', // NHSO, SSO, PRIVATE, CASH, OTHER
      cardNumber: '1234567890123',
      expiryDate: '2025-12-31',
      employer: 'ABC Company'
    },

    // Registration metadata
    registrationChannel: 'STAFF', // STAFF, KIOSK, MOBILE, LINE
    registeredBy: 'user123',
    photo: 'base64_encoded_image_data'
  }
};

const createPatientResponse = {
  status: 'success',
  data: {
    patientId: 'pt-uuid-123',
    hn: 'HN001234567',
    queueNumber: 'A001',
    registrationNumber: 'REG2024081801',
    estimatedTime: '10:30 AM'
  },
  message: 'Patient registered successfully',
  timestamp: '2024-08-18T09:45:00.000Z'
};

GET /api/v1/emr/patients/:id

// Get patient by ID or HN
const getPatientRequest = {
  method: 'GET',
  endpoint: '/api/v1/emr/patients/HN001234567',
  headers: {
    'Authorization': 'Bearer <jwt_token>'
  },
  query_params: {
    include: 'insurance,address,visits', // Optional data to include
    lang: 'th' // th, en
  }
};

const getPatientResponse = {
  status: 'success',
  data: {
    patientId: 'pt-uuid-123',
    hn: 'HN001234567',
    // Full patient data object
    personalInfo: { /* ... */ },
    insurance: { /* ... */ },
    address: { /* ... */ },
    visits: { /* Recent visits if included */ },
    lastVisit: '2024-08-15T14:30:00.000Z'
  }
};

GET /api/v1/emr/patients/search

// Search patients with various criteria
const searchPatientsRequest = {
  method: 'GET',
  endpoint: '/api/v1/emr/patients/search',
  query_params: {
    q: 'สมชาย', // Search term
    nationalId: '1234567890123',
    hn: 'HN001234567',
    phoneNumber: '0812345678',
    birthDate: '1985-05-15',
    page: 1,
    limit: 20,
    sortBy: 'lastVisit', // createdAt, lastVisit, hn
    sortOrder: 'desc'
  }
};

const searchPatientsResponse = {
  status: 'success',
  data: {
    patients: [
      {
        patientId: 'pt-uuid-123',
        hn: 'HN001234567',
        fullNameThai: 'นายสมชาย ใจดี',
        fullNameEng: 'Mr. Somchai Jaidee',
        birthDate: '1985-05-15',
        age: 39,
        phoneNumber: '0812345678',
        lastVisit: '2024-08-15T14:30:00.000Z'
      }
    ],
    pagination: {
      page: 1,
      limit: 20,
      total: 1,
      totalPages: 1
    }
  }
};

PUT /api/v1/emr/patients/:id

// Update patient information
const updatePatientRequest = {
  method: 'PUT',
  endpoint: '/api/v1/emr/patients/pt-uuid-123',
  headers: {
    'Authorization': 'Bearer <jwt_token>',
    'Content-Type': 'application/json'
  },
  body: {
    // Only fields being updated
    phoneNumber: '0812345679',
    email: '[email protected]',
    address: {
      houseNumber: '123/46', // Updated house number
      // Other address fields remain same
    }
  }
};

B. Insurance & Eligibility APIs

POST /api/v1/emr/patients/verify-eligibility

// Check insurance eligibility (NHSO/SSO)
const verifyEligibilityRequest = {
  method: 'POST',
  endpoint: '/api/v1/emr/patients/verify-eligibility',
  body: {
    nationalId: '1234567890123',
    insuranceType: 'NHSO', // NHSO, SSO
    serviceDate: '2024-08-18'
  }
};

const verifyEligibilityResponse = {
  status: 'success',
  data: {
    eligible: true,
    insuranceInfo: {
      type: 'NHSO',
      scheme: 'UC', // UC, SSS, CSMBS
      cardNumber: '1234567890123',
      expiryDate: '2025-12-31',
      coverageLevel: 'Full',
      copayAmount: 0
    },
    warnings: [],
    restrictions: []
  }
};

POST /api/v1/emr/patients/smart-card

// Read smart card data
const smartCardRequest = {
  method: 'POST',
  endpoint: '/api/v1/emr/patients/smart-card',
  body: {
    cardReaderStation: 'KIOSK-001',
    readTimeout: 30000 // 30 seconds
  }
};

const smartCardResponse = {
  status: 'success',
  data: {
    cardType: 'NATIONAL_ID', // NATIONAL_ID, NHSO
    nationalId: '1234567890123',
    titleThai: 'นาย',
    firstNameThai: 'สมชาย',
    lastNameThai: 'ใจดี',
    birthDate: '1985-05-15',
    address: { /* Address from card */ },
    photo: 'base64_encoded_photo',
    issueDate: '2019-01-01',
    expiryDate: '2029-01-01'
  }
};

C. Visit Management APIs

GET /api/v1/emr/patients/:id/history

// Get patient visit history
const getPatientHistoryRequest = {
  method: 'GET',
  endpoint: '/api/v1/emr/patients/pt-uuid-123/history',
  query_params: {
    startDate: '2024-01-01',
    endDate: '2024-08-18',
    visitType: 'OPD', // OPD, IPD, ER
    departmentId: 'dept-uuid-123',
    page: 1,
    limit: 10
  }
};

const getPatientHistoryResponse = {
  status: 'success',
  data: {
    visits: [
      {
        visitId: 'visit-uuid-123',
        visitNumber: 'VN2024081801',
        visitDate: '2024-08-18',
        visitTime: '09:30:00',
        visitType: 'OPD',
        department: {
          id: 'dept-uuid-123',
          nameThai: 'อายุรกรรม',
          nameEng: 'Internal Medicine'
        },
        chiefComplaint: 'ปวดท้อง',
        status: 'COMPLETED' // SCHEDULED, IN_PROGRESS, COMPLETED, CANCELLED
      }
    ],
    pagination: {
      page: 1,
      limit: 10,
      total: 25,
      totalPages: 3
    }
  }
};

13.1.3 Medical Record APIs

A. SOAP Notes & Clinical Documentation

GET /api/v1/emr/medical-records/:patientId

// Get patient medical records
const getMedicalRecordsRequest = {
  method: 'GET',
  endpoint: '/api/v1/emr/medical-records/pt-uuid-123',
  query_params: {
    visitId: 'visit-uuid-123', // Optional: specific visit
    startDate: '2024-01-01',
    endDate: '2024-08-18',
    recordType: 'SOAP_NOTE', // SOAP_NOTE, VITAL_SIGNS, DIAGNOSIS, PRESCRIPTION
    page: 1,
    limit: 20
  }
};

const getMedicalRecordsResponse = {
  status: 'success',
  data: {
    records: [
      {
        recordId: 'rec-uuid-123',
        visitId: 'visit-uuid-123',
        recordType: 'SOAP_NOTE',
        createdDate: '2024-08-18T10:30:00.000Z',
        createdBy: {
          userId: 'dr-uuid-123',
          displayName: 'นพ.สมชาย ใจดี',
          department: 'อายุรกรรม'
        },
        content: {
          subjective: 'ผู้ป่วยมาด้วยอาการปวดท้อง',
          objective: 'ตรวจพบท้องอ่อน ไม่มีก้อน',
          assessment: 'Gastritis',
          plan: 'ให้ยาลดกรด'
        }
      }
    ]
  }
};

POST /api/v1/emr/medical-records/soap-notes

// Create SOAP note
const createSoapNoteRequest = {
  method: 'POST',
  endpoint: '/api/v1/emr/medical-records/soap-notes',
  body: {
    visitId: 'visit-uuid-123',
    patientId: 'pt-uuid-123',
    subjective: 'ผู้ป่วยมาด้วยอาการปวดท้อง เป็นมา 2 วัน',
    objective: 'ตรวจพบท้องอ่อน ไม่มีก้อน BP 120/80 T 36.5°C',
    assessment: 'Gastritis, rule out PUD',
    plan: 'ให้ยาลดกรด Omeprazole 20mg bid, นัดตรวจซ้ำ 1 สัปดาห์',

    // Additional clinical data
    vitalSigns: {
      bloodPressure: '120/80',
      heartRate: 72,
      temperature: 36.5,
      respiratoryRate: 18,
      oxygenSaturation: 98
    },

    diagnosis: [
      {
        code: 'K29.7',
        codeSystem: 'ICD-10',
        display: 'Gastritis, unspecified',
        type: 'PRIMARY' // PRIMARY, SECONDARY, RULE_OUT
      }
    ]
  }
};

PUT /api/v1/emr/medical-records/soap-notes/:id

// Update SOAP note
const updateSoapNoteRequest = {
  method: 'PUT',
  endpoint: '/api/v1/emr/medical-records/soap-notes/rec-uuid-123',
  body: {
    // Updated fields only
    plan: 'ให้ยาลดกรด Omeprazole 20mg bid x 7 days, นัดตรวจซ้ำ 1 สัปดาห์',
    updatedReason: 'ปรับขนาดยา'
  }
};

B. Vital Signs Management

GET /api/v1/emr/medical-records/vital-signs/:visitId

// Get vital signs for a visit
const getVitalSignsRequest = {
  method: 'GET',
  endpoint: '/api/v1/emr/medical-records/vital-signs/visit-uuid-123'
};

const getVitalSignsResponse = {
  status: 'success',
  data: {
    vitalSigns: [
      {
        id: 'vs-uuid-123',
        recordedAt: '2024-08-18T10:30:00.000Z',
        recordedBy: {
          userId: 'nurse-uuid-123',
          displayName: 'พยาบาลสมหญิง ใจเย็น'
        },
        measurements: {
          bloodPressure: {
            systolic: 120,
            diastolic: 80,
            unit: 'mmHg'
          },
          heartRate: {
            value: 72,
            unit: 'bpm'
          },
          temperature: {
            value: 36.5,
            unit: 'celsius',
            site: 'oral'
          },
          respiratoryRate: {
            value: 18,
            unit: 'per_minute'
          },
          oxygenSaturation: {
            value: 98,
            unit: 'percent'
          },
          height: {
            value: 170,
            unit: 'cm'
          },
          weight: {
            value: 70,
            unit: 'kg'
          },
          bmi: {
            value: 24.2,
            unit: 'kg_per_m2'
          }
        }
      }
    ]
  }
};

POST /api/v1/emr/medical-records/vital-signs

// Record vital signs
const recordVitalSignsRequest = {
  method: 'POST',
  endpoint: '/api/v1/emr/medical-records/vital-signs',
  body: {
    visitId: 'visit-uuid-123',
    patientId: 'pt-uuid-123',
    measurements: {
      bloodPressure: {
        systolic: 120,
        diastolic: 80
      },
      heartRate: 72,
      temperature: 36.5,
      respiratoryRate: 18,
      oxygenSaturation: 98,
      height: 170,
      weight: 70
    },
    notes: 'Patient stable, no acute distress'
  }
};

13.1.4 Document Management APIs

A. Medical Document Upload & Retrieval

POST /api/v1/emr/documents/upload

// Upload medical document
const uploadDocumentRequest = {
  method: 'POST',
  endpoint: '/api/v1/emr/documents/upload',
  headers: {
    'Content-Type': 'multipart/form-data',
    'Authorization': 'Bearer <jwt_token>'
  },
  body: {
    file: 'File object',
    metadata: JSON.stringify({
      patientId: 'pt-uuid-123',
      visitId: 'visit-uuid-123',
      documentType: 'LAB_RESULT', // LAB_RESULT, XRAY, CONSENT_FORM, INSURANCE_CARD, OTHER
      title: 'Complete Blood Count Result',
      description: 'CBC results from 2024-08-18',
      tags: ['lab', 'cbc', 'hematology']
    })
  }
};

const uploadDocumentResponse = {
  status: 'success',
  data: {
    documentId: 'doc-uuid-123',
    fileName: 'cbc_result_20240818.pdf',
    fileSize: 524288, // bytes
    mimeType: 'application/pdf',
    uploadedAt: '2024-08-18T11:00:00.000Z',
    url: '/api/v1/emr/documents/doc-uuid-123/download'
  }
};

GET /api/v1/emr/documents/:id

// Download document
const downloadDocumentRequest = {
  method: 'GET',
  endpoint: '/api/v1/emr/documents/doc-uuid-123',
  query_params: {
    action: 'download', // download, view
    thumbnail: false // true for thumbnail version
  }
};
// Response: Binary file data with appropriate headers

GET /api/v1/emr/documents/patient/:patientId

// List patient documents
const listPatientDocumentsRequest = {
  method: 'GET',
  endpoint: '/api/v1/emr/documents/patient/pt-uuid-123',
  query_params: {
    documentType: 'LAB_RESULT',
    startDate: '2024-01-01',
    endDate: '2024-08-18',
    page: 1,
    limit: 20
  }
};

const listPatientDocumentsResponse = {
  status: 'success',
  data: {
    documents: [
      {
        documentId: 'doc-uuid-123',
        title: 'Complete Blood Count Result',
        documentType: 'LAB_RESULT',
        fileName: 'cbc_result_20240818.pdf',
        fileSize: 524288,
        uploadedAt: '2024-08-18T11:00:00.000Z',
        uploadedBy: {
          userId: 'lab-tech-123',
          displayName: 'นางสาวสมหญิง แล็บ'
        },
        thumbnailUrl: '/api/v1/emr/documents/doc-uuid-123?thumbnail=true'
      }
    ],
    pagination: {
      page: 1,
      limit: 20,
      total: 15,
      totalPages: 1
    }
  }
};

DELETE /api/v1/emr/documents/:id

// Soft delete document
const deleteDocumentRequest = {
  method: 'DELETE',
  endpoint: '/api/v1/emr/documents/doc-uuid-123',
  body: {
    reason: 'Duplicate document uploaded',
    deleteType: 'SOFT' // SOFT, HARD (hard delete requires admin permission)
  }
};

13.1.5 Statistics and Reporting APIs

A. Real-time Statistics

GET /api/v1/emr/statistics/daily-census

// Daily patient statistics
const getDailyCensusRequest = {
  method: 'GET',
  endpoint: '/api/v1/emr/statistics/daily-census',
  query_params: {
    date: '2024-08-18',
    departmentId: 'dept-uuid-123', // Optional
    includeDetails: true
  }
};

const getDailyCensusResponse = {
  status: 'success',
  data: {
    date: '2024-08-18',
    summary: {
      totalRegistrations: 250,
      newPatients: 35,
      returningPatients: 215,
      opdVisits: 230,
      erVisits: 15,
      ipdAdmissions: 5
    },
    byDepartment: [
      {
        departmentId: 'dept-uuid-123',
        name: 'อายุรกรรม',
        registrations: 45,
        newPatients: 8,
        averageWaitTime: 25 // minutes
      }
    ],
    byHour: [
      { hour: '08:00', registrations: 25 },
      { hour: '09:00', registrations: 35 }
    ]
  }
};

GET /api/v1/emr/statistics/department/:id

// Department-specific statistics
const getDepartmentStatsRequest = {
  method: 'GET',
  endpoint: '/api/v1/emr/statistics/department/dept-uuid-123',
  query_params: {
    startDate: '2024-08-01',
    endDate: '2024-08-18',
    metrics: 'all' // all, visits, wait_times, satisfaction
  }
};

const getDepartmentStatsResponse = {
  status: 'success',
  data: {
    department: {
      id: 'dept-uuid-123',
      name: 'อายุรกรรม'
    },
    period: {
      startDate: '2024-08-01',
      endDate: '2024-08-18'
    },
    metrics: {
      totalVisits: 850,
      averageVisitsPerDay: 47.2,
      averageWaitTime: 23.5, // minutes
      patientSatisfaction: 4.2, // out of 5
      topDiagnoses: [
        { code: 'K29.7', diagnosis: 'Gastritis', count: 45 },
        { code: 'I10', diagnosis: 'Essential hypertension', count: 38 }
      ]
    }
  }
};

B. Clinical Reports

GET /api/v1/emr/reports/icd10-summary

// ICD-10 diagnosis summary report
const getIcd10SummaryRequest = {
  method: 'GET',
  endpoint: '/api/v1/emr/reports/icd10-summary',
  query_params: {
    startDate: '2024-08-01',
    endDate: '2024-08-18',
    departmentId: 'dept-uuid-123', // Optional
    groupBy: 'category', // code, category, department
    top: 20 // Top N diagnoses
  }
};

const getIcd10SummaryResponse = {
  status: 'success',
  data: {
    period: { startDate: '2024-08-01', endDate: '2024-08-18' },
    summary: {
      totalDiagnoses: 1250,
      uniqueIcd10Codes: 187
    },
    diagnoses: [
      {
        code: 'K29.7',
        description: 'Gastritis, unspecified',
        category: 'Diseases of the digestive system',
        count: 45,
        percentage: 3.6
      }
    ]
  }
};

GET /api/v1/emr/reports/patient-demographics

// Patient demographics report
const getPatientDemographicsRequest = {
  method: 'GET',
  endpoint: '/api/v1/emr/reports/patient-demographics',
  query_params: {
    registrationPeriod: '2024-08-01,2024-08-18',
    groupBy: 'age_group', // age_group, gender, insurance_type, nationality
    includeCharts: true
  }
};

const getPatientDemographicsResponse = {
  status: 'success',
  data: {
    totalPatients: 3245,
    byAgeGroup: [
      { ageGroup: '0-18', count: 324, percentage: 10.0 },
      { ageGroup: '19-35', count: 978, percentage: 30.1 },
      { ageGroup: '36-60', count: 1203, percentage: 37.1 },
      { ageGroup: '61+', count: 740, percentage: 22.8 }
    ],
    byGender: [
      { gender: 'Female', count: 1789, percentage: 55.1 },
      { gender: 'Male', count: 1456, percentage: 44.9 }
    ],
    chartData: {
      ageDistribution: { /* Chart.js compatible data */ }
    }
  }
};

POST /api/v1/emr/reports/generate

// Generate custom report
const generateCustomReportRequest = {
  method: 'POST',
  endpoint: '/api/v1/emr/reports/generate',
  body: {
    reportType: 'CUSTOM_QUERY',
    name: 'Monthly Cardiology Report',
    parameters: {
      startDate: '2024-08-01',
      endDate: '2024-08-31',
      departments: ['dept-cardiology-123'],
      includeFields: ['patient_count', 'diagnosis_summary', 'age_distribution'],
      filters: {
        ageRange: { min: 40, max: 80 },
        insuranceType: ['NHSO', 'SSO']
      }
    },
    outputFormat: 'PDF', // PDF, EXCEL, CSV
    deliveryMethod: 'EMAIL', // EMAIL, DOWNLOAD
    recipients: ['[email protected]']
  }
};

const generateCustomReportResponse = {
  status: 'success',
  data: {
    reportId: 'report-uuid-123',
    status: 'PROCESSING', // PROCESSING, COMPLETED, FAILED
    estimatedTime: '5-10 minutes',
    downloadUrl: null // Available when completed
  }
};

13.1.6 Integration APIs

A. External System Integrations

POST /api/v1/emr/external/nhso/eligibility

// NHSO eligibility check
const nhsoEligibilityRequest = {
  method: 'POST',
  endpoint: '/api/v1/emr/external/nhso/eligibility',
  body: {
    nationalId: '1234567890123',
    serviceDate: '2024-08-18',
    hospitalCode: 'HOSP12345'
  }
};

const nhsoEligibilityResponse = {
  status: 'success',
  data: {
    eligible: true,
    scheme: 'UC',
    mainProvider: {
      code: 'HOSP12345',
      name: 'โรงพยาบาลจังหวัดตัวอย่าง'
    },
    coverage: {
      level: 'Full',
      copayRequired: false,
      preAuthRequired: false
    },
    restrictions: [],
    expiryDate: '2025-12-31'
  }
};

POST /api/v1/emr/external/sso/verify

// SSO insurance verification
const ssoVerifyRequest = {
  method: 'POST',
  endpoint: '/api/v1/emr/external/sso/verify',
  body: {
    nationalId: '1234567890123',
    employerId: 'EMP123456',
    serviceDate: '2024-08-18'
  }
};

const ssoVerifyResponse = {
  status: 'success',
  data: {
    eligible: true,
    coverage: {
      medical: true,
      dental: false,
      maternity: true
    },
    employer: {
      id: 'EMP123456',
      name: 'บริษัท ตัวอย่าง จำกัด'
    },
    contributionStatus: 'ACTIVE',
    lastContribution: '2024-07-31'
  }
};

GET /api/v1/emr/external/civil-registry/:nationalId

// Civil registration lookup
const civilRegistryRequest = {
  method: 'GET',
  endpoint: '/api/v1/emr/external/civil-registry/1234567890123'
};

const civilRegistryResponse = {
  status: 'success',
  data: {
    nationalId: '1234567890123',
    titleThai: 'นาย',
    firstNameThai: 'สมชาย',
    lastNameThai: 'ใจดี',
    birthDate: '1985-05-15',
    birthPlace: 'กรุงเทพมหานคร',
    address: {
      houseNumber: '123/45',
      // ... complete address
    },
    status: 'ACTIVE', // ACTIVE, DECEASED, SUSPENDED
    issueDate: '2019-01-01',
    expiryDate: '2029-01-01'
  }
};

B. Webhook Endpoints

POST /api/v1/emr/webhooks/appointment-confirmed

// Webhook for appointment confirmation
const webhookAppointmentRequest = {
  method: 'POST',
  endpoint: '/api/v1/emr/webhooks/appointment-confirmed',
  headers: {
    'X-Webhook-Signature': 'sha256=signature',
    'Content-Type': 'application/json'
  },
  body: {
    eventType: 'APPOINTMENT_CONFIRMED',
    eventId: 'event-uuid-123',
    timestamp: '2024-08-18T12:00:00.000Z',
    data: {
      appointmentId: 'appt-uuid-123',
      patientId: 'pt-uuid-123',
      departmentId: 'dept-uuid-123',
      appointmentDate: '2024-08-20',
      appointmentTime: '10:00',
      source: 'LINE_BOT' // LINE_BOT, MOBILE_APP, PHONE
    }
  }
};

13.1.7 Audit and Compliance APIs

A. Audit Trail Management

GET /api/v1/emr/audit-logs/patient/:patientId

// Patient access logs
const getPatientAuditRequest = {
  method: 'GET',
  endpoint: '/api/v1/emr/audit-logs/patient/pt-uuid-123',
  query_params: {
    startDate: '2024-08-01',
    endDate: '2024-08-18',
    action: 'READ', // CREATE, READ, UPDATE, DELETE, EXPORT
    userId: 'user-uuid-123', // Optional
    page: 1,
    limit: 50
  }
};

const getPatientAuditResponse = {
  status: 'success',
  data: {
    logs: [
      {
        logId: 'log-uuid-123',
        timestamp: '2024-08-18T10:30:00.000Z',
        userId: 'dr-uuid-123',
        userName: 'นพ.สมชาย ใจดี',
        action: 'READ',
        resource: 'patient_medical_record',
        details: {
          recordId: 'rec-uuid-123',
          visitId: 'visit-uuid-123'
        },
        ipAddress: '192.168.1.100',
        userAgent: 'Mozilla/5.0...',
        sessionId: 'session-uuid-123'
      }
    ],
    pagination: {
      page: 1,
      limit: 50,
      total: 125,
      totalPages: 3
    }
  }
};

GET /api/v1/emr/audit-logs/user/:userId

// User activity logs
const getUserAuditRequest = {
  method: 'GET',
  endpoint: '/api/v1/emr/audit-logs/user/dr-uuid-123',
  query_params: {
    startDate: '2024-08-18',
    endDate: '2024-08-18',
    resource: 'patient', // patient, medical_record, document
    page: 1,
    limit: 100
  }
};

const getUserAuditResponse = {
  status: 'success',
  data: {
    user: {
      userId: 'dr-uuid-123',
      displayName: 'นพ.สมชาย ใจดี',
      department: 'อายุรกรรม'
    },
    summary: {
      totalActions: 89,
      patientsAccessed: 25,
      recordsCreated: 12,
      recordsModified: 8
    },
    logs: [ /* Detailed log entries */ ]
  }
};

POST /api/v1/emr/consent/patient/:patientId

// Record patient consent
const recordConsentRequest = {
  method: 'POST',
  endpoint: '/api/v1/emr/consent/patient/pt-uuid-123',
  body: {
    consentType: 'DATA_PROCESSING', // DATA_PROCESSING, MEDICAL_TREATMENT, RESEARCH_PARTICIPATION
    consentGiven: true,
    consentDate: '2024-08-18T09:00:00.000Z',
    consentMethod: 'DIGITAL_SIGNATURE', // DIGITAL_SIGNATURE, VERBAL, WRITTEN_FORM
    consentDetails: {
      dataUsage: ['TREATMENT', 'QUALITY_IMPROVEMENT', 'RESEARCH'],
      dataSharing: ['INTERNAL_DEPARTMENTS', 'INSURANCE_PROVIDERS'],
      retentionPeriod: '10_YEARS'
    },
    witnessId: 'nurse-uuid-123',
    documentId: 'consent-form-uuid-123'
  }
};

const recordConsentResponse = {
  status: 'success',
  data: {
    consentId: 'consent-uuid-123',
    status: 'ACTIVE',
    effectiveDate: '2024-08-18T09:00:00.000Z',
    expiryDate: null, // Null for no expiry
    digitalSignature: 'signature_hash_123'
  }
};

GET /api/v1/emr/consent/patient/:patientId

// Get consent status
const getConsentStatusRequest = {
  method: 'GET',
  endpoint: '/api/v1/emr/consent/patient/pt-uuid-123',
  query_params: {
    consentType: 'DATA_PROCESSING', // Optional
    includeHistory: true
  }
};

const getConsentStatusResponse = {
  status: 'success',
  data: {
    currentConsent: {
      consentId: 'consent-uuid-123',
      consentType: 'DATA_PROCESSING',
      consentGiven: true,
      effectiveDate: '2024-08-18T09:00:00.000Z',
      consentDetails: { /* ... */ }
    },
    history: [
      {
        consentId: 'consent-uuid-122',
        consentType: 'DATA_PROCESSING',
        consentGiven: false,
        effectiveDate: '2024-01-15T10:00:00.000Z',
        revokedDate: '2024-08-18T09:00:00.000Z',
        revocationReason: 'Patient requested data processing opt-in'
      }
    ]
  }
};

13.1.8 WebSocket APIs for Real-time Features

A. Real-time Queue Updates

WebSocket Connection: ws://api/v1/emr/queue/updates

// WebSocket connection for queue updates
const queueWebSocket = {
  connection_url: 'ws://api.meditech.hospital.th/v1/emr/queue/updates',
  authentication: {
    protocol: 'WebSocket subprotocol',
    token: 'Bearer <jwt_token>',
    headers: {
      'Authorization': 'Bearer <jwt_token>',
      'X-Department-ID': 'dept-uuid-123'
    }
  },

  // Client subscribes to specific queues
  subscribe_message: {
    action: 'SUBSCRIBE',
    channels: [
      'queue.department.dept-uuid-123',
      'queue.patient.pt-uuid-123'
    ]
  },

  // Server sends real-time updates
  update_message: {
    channel: 'queue.department.dept-uuid-123',
    event: 'QUEUE_UPDATED',
    timestamp: '2024-08-18T10:30:00.000Z',
    data: {
      queueNumber: 'A025',
      patientId: 'pt-uuid-123',
      status: 'CALLED', // WAITING, CALLED, IN_PROGRESS, COMPLETED
      estimatedTime: '2 minutes',
      currentQueue: 'A025',
      waitingCount: 5
    }
  }
};

B. Real-time Notifications

WebSocket Connection: ws://api/v1/emr/notifications

// WebSocket connection for notifications
const notificationWebSocket = {
  connection_url: 'ws://api.meditech.hospital.th/v1/emr/notifications',

  // Notification types
  notification_types: [
    'PATIENT_REGISTERED',
    'APPOINTMENT_REMINDER',
    'LAB_RESULT_READY',
    'PRESCRIPTION_READY',
    'SYSTEM_ALERT'
  ],

  // Example notification message
  notification_message: {
    notificationId: 'notif-uuid-123',
    type: 'LAB_RESULT_READY',
    priority: 'HIGH', // LOW, MEDIUM, HIGH, URGENT
    timestamp: '2024-08-18T11:00:00.000Z',
    recipientId: 'dr-uuid-123',
    title: 'ผลแล็บพร้อมแล้ว',
    message: 'ผลตรวจเลือดของคุณสมชาย ใจดี (HN: 001234567) พร้อมแล้ว',
    data: {
      patientId: 'pt-uuid-123',
      patientName: 'สมชาย ใจดี',
      hn: 'HN001234567',
      labResultId: 'lab-result-uuid-123',
      actionUrl: '/patients/pt-uuid-123/lab-results'
    },
    actions: [
      {
        label: 'ดูผล',
        action: 'VIEW_RESULT',
        url: '/api/v1/emr/lab-results/lab-result-uuid-123'
      }
    ]
  }
};

C. Real-time Vital Signs Monitoring

WebSocket Connection: ws://api/v1/emr/vital-signs/monitor

// WebSocket for vital signs monitoring
const vitalSignsWebSocket = {
  connection_url: 'ws://api.meditech.hospital.th/v1/emr/vital-signs/monitor',

  // Subscribe to patient vital signs
  subscribe_message: {
    action: 'SUBSCRIBE',
    patientId: 'pt-uuid-123',
    monitoringDevice: 'bedside-monitor-001'
  },

  // Real-time vital signs data
  vital_signs_data: {
    patientId: 'pt-uuid-123',
    deviceId: 'bedside-monitor-001',
    timestamp: '2024-08-18T10:30:15.000Z',
    measurements: {
      heartRate: 72,
      bloodPressure: { systolic: 120, diastolic: 80 },
      oxygenSaturation: 98,
      temperature: 36.5
    },
    alerts: [
      {
        type: 'HIGH_HEART_RATE',
        severity: 'MEDIUM',
        message: 'Heart rate above normal range',
        value: 102,
        threshold: 100
      }
    ]
  }
};

13.1.9 API Security Specifications

A. Authentication & Authorization

const apiSecurity = {
  authentication: {
    method: 'JWT Bearer Token',
    token_expiry: '24 hours',
    refresh_token_expiry: '30 days',
    token_structure: {
      header: {
        alg: 'RS256',
        typ: 'JWT'
      },
      payload: {
        sub: 'user-uuid-123',
        hospitalId: 'hospital-uuid-123',
        roles: ['DOCTOR', 'DEPARTMENT_HEAD'],
        departments: ['dept-uuid-123'],
        permissions: [
          'READ_PATIENT_DATA',
          'WRITE_MEDICAL_RECORDS',
          'ACCESS_LAB_RESULTS'
        ],
        iat: 1692347400,
        exp: 1692433800
      }
    }
  },

  authorization: {
    rbac_model: {
      roles: [
        {
          name: 'DOCTOR',
          permissions: [
            'READ_PATIENT_DATA',
            'WRITE_MEDICAL_RECORDS',
            'PRESCRIBE_MEDICATION',
            'ORDER_TESTS'
          ]
        },
        {
          name: 'NURSE', 
          permissions: [
            'READ_PATIENT_DATA',
            'RECORD_VITAL_SIGNS',
            'UPDATE_PATIENT_STATUS'
          ]
        },
        {
          name: 'ADMIN',
          permissions: [
            'MANAGE_USERS',
            'SYSTEM_CONFIGURATION',
            'ACCESS_AUDIT_LOGS'
          ]
        },
        {
          name: 'KIOSK_USER',
          permissions: [
            'REGISTER_PATIENT',
            'SEARCH_PATIENT',
            'PRINT_DOCUMENTS'
          ]
        }
      ]
    }
  },

  api_key_management: {
    external_integrations: {
      nhso_api: {
        authentication: 'API_KEY',
        key_rotation: 'Monthly',
        backup_keys: 2
      },
      line_bot: {
        authentication: 'WEBHOOK_SIGNATURE',
        signature_validation: 'HMAC-SHA256'
      }
    }
  },

  data_encryption: {
    in_transit: 'TLS 1.3',
    at_rest: 'AES-256',
    sensitive_fields: [
      'nationalId',
      'passportNumber',
      'phoneNumber',
      'email',
      'medicalData'
    ]
  }
};

B. Input Validation & Sanitization

const inputValidation = {
  validation_rules: {
    nationalId: {
      pattern: '^[0-9]{13}$',
      checksum: 'Thai National ID algorithm',
      sanitization: 'Remove non-numeric characters'
    },
    phoneNumber: {
      pattern: '^(0[0-9]{8,9})$',
      international: '^(\\+66[0-9]{8,9})$',
      sanitization: 'Remove spaces and special characters'
    },
    email: {
      pattern: '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$',
      max_length: 255,
      sanitization: 'Convert to lowercase, trim whitespace'
    },
    medicalData: {
      sql_injection_prevention: 'Parameterized queries',
      xss_prevention: 'HTML entity encoding',
      content_filtering: 'Medical terminology validation'
    }
  },

  error_responses: {
    validation_failed: {
      status: 'error',
      error: {
        code: 'VALIDATION_FAILED',
        message: 'Input validation failed',
        details: [
          {
            field: 'nationalId',
            message: 'Invalid national ID format',
            receivedValue: '12345' // Do not log sensitive data in production
          }
        ]
      }
    }
  }
};

13.1.10 API Performance Requirements

A. Response Time Targets

const performanceTargets = {
  response_times: {
    patient_search: {
      target: '< 500ms',
      measurement: '95th percentile',
      timeout: '10 seconds'
    },
    patient_registration: {
      target: '< 1 second',
      measurement: '95th percentile',
      timeout: '30 seconds'
    },
    vital_signs_recording: {
      target: '< 200ms',
      measurement: '99th percentile',
      timeout: '5 seconds'
    },
    document_upload: {
      target: '< 5 seconds (for 10MB file)',
      measurement: '90th percentile',
      timeout: '60 seconds'
    },
    external_api_calls: {
      nhso_eligibility: '< 5 seconds',
      sso_verification: '< 3 seconds',
      civil_registry: '< 2 seconds'
    }
  },

  concurrent_handling: {
    max_concurrent_users: 500,
    max_requests_per_second: 1000,
    database_connections: 50,
    connection_pooling: 'Enabled'
  },

  caching_strategy: {
    patient_data: {
      cache_type: 'Redis',
      ttl: '5 minutes',
      invalidation: 'On patient data update'
    },
    master_data: {
      cache_type: 'Application memory',
      ttl: '1 hour',
      data_types: ['departments', 'insurance_types', 'icd10_codes']
    },
    api_responses: {
      cache_type: 'HTTP headers',
      static_content: '1 day',
      dynamic_content: '30 seconds'
    }
  }
};

B. Pagination and Data Handling

const paginationSpecs = {
  default_pagination: {
    page: 1,
    limit: 20,
    max_limit: 100,
    total_count: true
  },

  large_datasets: {
    patient_search: {
      max_results: 1000,
      streaming: 'For exports > 1000 records',
      format: 'JSON streaming or CSV export'
    },
    audit_logs: {
      max_results: 10000,
      chunking: '1000 records per chunk',
      async_processing: 'For bulk operations'
    }
  },

  response_format: {
    paginated_response: {
      data: [], // Array of results
      pagination: {
        page: 1,
        limit: 20,
        total: 250,
        totalPages: 13,
        hasNext: true,
        hasPrev: false
      },
      meta: {
        requestId: 'req-uuid-123',
        executionTime: '0.245s',
        cacheHit: false
      }
    }
  }
};

13.1.11 API Documentation Standards

A. OpenAPI/Swagger Specification

const apiDocumentationSpecs = {
  openapi_version: '3.0.3',
  documentation_url: '/api/docs',
  swagger_ui_url: '/api/docs/ui',

  endpoint_documentation: {
    required_fields: [
      'summary',
      'description',
      'parameters',
      'requestBody',
      'responses',
      'security',
      'tags'
    ],

    example_endpoint: {
      summary: 'Create new patient registration',
      description: 'Registers a new patient in the EMR system with multi-channel support',
      parameters: [
        {
          name: 'X-Request-ID',
          in: 'header',
          required: false,
          schema: { type: 'string', format: 'uuid' },
          description: 'Unique request identifier for tracing'
        }
      ],
      requestBody: {
        required: true,
        content: {
          'application/json': {
            schema: { $ref: '#/components/schemas/PatientRegistrationRequest' },
            examples: {
              thai_patient: { $ref: '#/components/examples/ThaiPatientRegistration' },
              foreign_patient: { $ref: '#/components/examples/ForeignPatientRegistration' }
            }
          }
        }
      },
      responses: {
        '201': {
          description: 'Patient registered successfully',
          content: {
            'application/json': {
              schema: { $ref: '#/components/schemas/PatientRegistrationResponse' }
            }
          }
        },
        '400': { $ref: '#/components/responses/ValidationError' },
        '401': { $ref: '#/components/responses/UnauthorizedError' },
        '409': { $ref: '#/components/responses/PatientExistsError' }
      },
      security: [{ bearerAuth: ['REGISTER_PATIENT'] }],
      tags: ['Patient Registration']
    }
  },

  change_log_format: {
    versioning: 'Semantic versioning (v1.0.0, v1.1.0, v2.0.0)',
    change_types: [
      'ADDED - New endpoints or features',
      'CHANGED - Modifications to existing endpoints',
      'DEPRECATED - Features marked for removal',
      'REMOVED - Deleted endpoints or features',
      'FIXED - Bug fixes',
      'SECURITY - Security-related changes'
    ]
  }
};

B. API Versioning Policy

const versioningPolicy = {
  versioning_strategy: 'URL path versioning',
  current_version: 'v1',
  supported_versions: ['v1'],

  version_lifecycle: {
    development: {
      duration: '3-6 months',
      stability: 'Alpha/Beta versions',
      breaking_changes: 'Allowed'
    },
    production: {
      minimum_support: '24 months',
      deprecation_notice: '12 months in advance',
      breaking_changes: 'New major version required'
    }
  },

  deprecation_process: {
    step1: 'Add deprecation headers to responses',
    step2: 'Update documentation with migration guide',
    step3: 'Send notifications to API consumers',
    step4: 'Monitor usage analytics',
    step5: 'Remove deprecated version after notice period'
  },

  backward_compatibility: {
    guaranteed_fields: 'Existing response fields will not be removed',
    optional_fields: 'New fields added as optional',
    breaking_changes: [
      'Removing response fields',
      'Changing field data types',
      'Modifying authentication requirements',
      'Changing HTTP status codes'
    ]
  }
};

14. การส่งมอบและการดูแลระบบ (Delivery & Maintenance)

14.1 Deliverables ตาม TOR

DE-001: Software Components

const softwareDeliverables = {
  core_system: {
    web_application: 'Next.js full-stack web application',
    database: 'PostgreSQL with complete schema',
    api_services: 'Nest.js API Routes for all functions',
    admin_panel: 'System administration interface'
  },

  kiosk_application: {
    touch_interface: 'Touch-optimized Next.js application',
    hardware_drivers: 'Smart card reader, camera, printer drivers',
    kiosk_management: 'Remote monitoring and update system'
  },

  mobile_applications: {
    pwa_app: 'Progressive Web App',
    native_features: 'Camera, push notifications, geolocation'
  },

  line_bot: {
    bot_application: 'Line Bot with webhook handling',
    conversation_engine: 'Natural language processing for Thai'
  },

  integration_modules: {
    nhso_connector: 'NHSO API integration module',
    smart_card_service: 'Smart card reading service',
    printing_service: 'Document and queue printing service'
  }
};

DE-002: Documentation Package

const documentationPackage = {
  technical_documentation: [
    'System Architecture Document',
    'Database Schema Documentation', 
    'API Documentation (OpenAPI/Swagger)',
    'Deployment Guide',
    'System Administration Manual',
    'Troubleshooting Guide'
  ],

  user_documentation: [
    'Staff User Manual (Thai)',
    'Kiosk User Guide (Thai/English)',
    'Mobile App User Guide',
    'Line Bot Command Reference',
    'Patient Information Leaflets'
  ],

  training_materials: [
    'Staff Training Presentation',
    'Video Tutorials',
    'Quick Reference Cards',
    'FAQ Document',
    'Training Assessment Forms'
  ]
};

14.2 Maintenance and Support Plan

MA-001: Maintenance Schedule

const maintenanceSchedule = {
  daily: [
    'System health monitoring',
    'Database backup verification',
    'Integration API status check',
    'Queue system cleanup'
  ],

  weekly: [
    'Performance metrics review',
    'User feedback analysis',
    'Security log review',
    'Hardware inspection (kiosks)'
  ],

  monthly: [
    'Software updates deployment',
    'Security patch installation',
    'Database optimization',
    'Training refresher sessions'
  ],

  quarterly: [
    'Full system audit',
    'Disaster recovery testing',
    'Hardware replacement planning',
    'User satisfaction survey'
  ]
};

MA-002: Support Level Agreement

const supportSLA = {
  critical_issues: {
    definition: 'System completely down, patient care impacted',
    response_time: '30 minutes',
    resolution_time: '2 hours',
    availability: '24/7',
    escalation: 'Immediate management notification'
  },

  high_priority: {
    definition: 'Major functionality unavailable',
    response_time: '2 hours',
    resolution_time: '8 hours (business)',
    availability: 'Business hours + on-call',
    escalation: 'After 4 hours unresolved'
  },

  medium_priority: {
    definition: 'Minor functionality issues',
    response_time: '4 hours (business)',
    resolution_time: '24 hours (business)',
    availability: 'Business hours',
    escalation: 'After 2 business days'
  },

  low_priority: {
    definition: 'Enhancement requests, training',
    response_time: '8 hours (business)',
    resolution_time: '1 week',
    availability: 'Business hours',
    escalation: 'Monthly review'
  }
};

15. สรุปและการอนุมัติ (Summary & Approval)

15.1 สรุปความครบถ้วนตาม TOR

การลงทะเบียนผู้ป่วยใหม่ (TOR 1.1) - 100% Complete

  • ✅ วัตถุประสงค์: กระบวนการลงทะเบียนที่ถูกต้อง ครบถ้วน หลากหลายช่องทาง
  • ✅ ขอบเขต: เจ้าหน้าที่, Kiosk, Mobile App, Line App พร้อมยืนยันข้อมูล
  • ✅ ข้อมูลครบถ้วน: ทุกรายการตาม TOR 1.1.3.1-1.1.3.11
  • ✅ ฟีเจอร์พิเศษ: ถ่าย/แนบภาพ, ตรวจสอบซ้ำ, อ่านบัตรประชาชน, ต่างชาติ, HN ฉุกเฉิน

การส่งผู้ป่วยเข้าห้องตรวจ (TOR 1.2) - 100% Complete

  • ✅ วัตถุประสงค์: ส่งผู้ป่วยเข้ารับบริการ มีระบบ จัดลำดับ พิมพ์ใบส่งตรวจ ตรวจสิทธิ
  • ✅ ขอบเขต: เจ้าหน้าที่และ Kiosk, OPD Visit, หลายแผนก, ตรวจสิทธิ สปสช./กรมบัญชีกลาง
  • ✅ เอกสารและคิว: ส่งตรวจ+บัตรคิว, หมายเลขตามเงื่อนไข, แสดงสถานะย้อนหลัง

15.2 การประเมินความพร้อม

RE-001: Technical Readiness - 95%

  • ✅ Database Schema: Complete และ optimized
  • ✅ API Design: RESTful APIs for all functions
  • ✅ Integration Points: NHSO, Smart Card, Printing
  • ⚠️ Performance Testing: ต้องทดสอบ load testing ในสภาพจริง

RE-002: Functional Readiness - 100%

  • ✅ All TOR requirements mapped to functional requirements
  • ✅ Multi-channel support fully specified
  • ✅ Data model covers all TOR data points
  • ✅ Workflow design matches TOR processes

RE-003: Operational Readiness - 90%

  • ✅ Training plan comprehensive
  • ✅ Support structure defined
  • ✅ Maintenance procedures documented
  • ⚠️ Change management: ต้องมี pilot testing กับผู้ใช้จริง

15.3 ความเสี่ยงที่เหลืออยู่

Remaining Risks:

  1. User Adoption Risk (Medium): ผู้ป่วยสูงอายุอาจต้านทาน Kiosk

  2. Mitigation: เพิ่ม staff support, voice guidance

  3. Integration Stability (Medium): NHSO API อาจไม่เสถียร

  4. Mitigation: Offline mode, retry mechanisms

  5. Hardware Reliability (Low): Smart Card Reader อาจขัดข้อง

  6. Mitigation: Backup devices, manual input fallback

  7. Network Dependency (Medium): การเชื่อมต่ออินเทอร์เน็ตขัดข้อง

  8. Mitigation: Offline mode, data synchronization when online

  9. Data Privacy Compliance (Low): การจัดการข้อมูลส่วนบุคคลตาม PDPA

  10. Mitigation: Encryption, audit trail, consent management

15.4 ข้อแนะนำสำหรับการดำเนินการ

RC-001: Implementation Recommendations

const implementationRecommendations = {
  phase_1_priorities: [
    'เริ่มต้นด้วย staff registration system ให้เสถียรก่อน',
    'ทดสอบ smart card integration อย่างละเอียด',
    'สร้าง comprehensive training materials',
    'ติดตั้ง monitoring และ alerting system'
  ],

  phase_2_considerations: [
    'Pilot kiosk ในจุดที่มี staff support',
    'เก็บ user feedback อย่างต่อเนื่อง',
    'จัดทำ multilingual support materials',
    'ทดสอบ load balancing และ failover'
  ],

  phase_3_prerequisites: [
    'Mobile app ต้องผ่าน security audit',
    'Line bot ต้องได้รับอนุมัติจาก Line Business',
    'API rate limiting และ security measures',
    'Complete disaster recovery procedures'
  ],

  ongoing_requirements: [
    'Monthly performance review meetings',
    'Quarterly user satisfaction surveys', 
    'Semi-annual security assessments',
    'Annual system architecture review'
  ]
};

RC-002: Success Factors

const criticalSuccessFactors = {
  technical_factors: [
    'ระบบต้องมีความเสถียร 99.9% uptime',
    'Response time ตาม TOR requirements',
    'Integration กับระบบภายนอกต้องทำงานได้',
    'Data accuracy และ integrity 100%'
  ],

  organizational_factors: [
    'Management commitment และ resource allocation',
    'Staff training และ change management',
    'Clear communication กับ patients',
    'Continuous improvement culture'
  ],

  user_adoption_factors: [
    'Easy-to-use interface design',
    'Reliable technical support',
    'Clear benefits communication',
    'Gradual transition approach'
  ]
};

16. ภาคผนวก (Appendices)

16.1 Approval Matrix

Requirement Category Reviewed By Approved By Status
TOR Compliance Chief Medical Officer Hospital Director ✅ Pending
Functional Requirements Department Heads Chief Medical Officer ✅ Pending
Technical Architecture IT Director CIO ✅ Pending
Integration Requirements System Administrator IT Director ✅ Pending
Security & Privacy Security Officer Hospital Director ✅ Pending
Training & Change Mgmt HR Director Hospital Director ✅ Pending
Budget & Resources Finance Director Hospital Director ✅ Pending

16.2 Sign-off Requirements

Final Approval Checklist:

  • TOR Requirements Coverage: 100% ของ TOR requirements ได้รับการ address
  • Stakeholder Review: ทุก stakeholder ได้ review และ provide feedback
  • Technical Feasibility: Technical team ยืนยันความเป็นไปได้
  • Budget Approval: งบประมาณได้รับการอนุมัติ
  • Resource Allocation: Human resources ได้รับการจัดสรร
  • Timeline Agreement: Project timeline ได้รับการตกลง
  • Risk Acceptance: Management ยอมรับ identified risks
  • Success Criteria: KPIs และ success metrics ได้รับการตกลง

16.3 Document Control

const documentControl = {
  document_info: {
    title: 'SRS ระบบงานเวชระเบียนและเวชสถิติ (TOR-Based Edition)',
    version: '4.0',
    date_created: '18 August 2025',
    created_by: 'Project Development Team',
    document_type: 'Software Requirements Specification',
    classification: 'Internal Use Only'
  },

  distribution_list: [
    { role: 'Hospital Director', copy_type: 'Master Copy', delivery: 'Hand Delivery' },
    { role: 'Chief Medical Officer', copy_type: 'Approved Copy', delivery: 'Email + Physical' },
    { role: 'IT Director', copy_type: 'Working Copy', delivery: 'Shared Repository' },
    { role: 'Department Heads', copy_type: 'Reference Copy', delivery: 'Email' },
    { role: 'Project Team', copy_type: 'Working Copy', delivery: 'Git Repository' },
    { role: 'Vendor/Contractor', copy_type: 'Implementation Copy', delivery: 'Secure Portal' }
  ],

  review_schedule: {
    review_frequency: 'Quarterly during development, Annually post-implementation',
    review_responsibility: 'Project Steering Committee'
  }
};

16.4 Glossary - คำศัพท์เฉพาะตาม TOR

Term ภาษาไทย Definition
HN หมายเลขผู้ป่วย Hospital Number - หมายเลขประจำตัวผู้ป่วยในโรงพยาบาล
OPD Visit การมาตรวจผู้ป่วยนอก Out-Patient Department Visit - การสร้างรายการเข้ารับบริการผู้ป่วยนอก
Smart Card บัตรอัจฉริยะ บัตรประชาชนอิเล็กทรอนิกส์ที่สามารถอ่านข้อมูลได้
Kiosk เครื่องบริการตนเอง Self-service terminal สำหรับผู้ป่วยใช้ลงทะเบียนด้วยตนเอง
Line Bot บอทไลน์ Line application bot สำหรับการให้บริการผ่าน Line
สปสช. สำนักงานหลักประกันสุขภาพแห่งชาติ NHSO - National Health Security Office
UCS หลักประกันสุขภาพถ้วนหน้า Universal Coverage Scheme
CSMBS สิทธิข้าราชการ Civil Servant Medical Benefit Scheme
SSS ประกันสังคม Social Security Scheme

16.5 TOR Requirements Traceability Matrix

TOR Section TOR Requirement SRS Section Implementation Status
1.1.1 วัตถุประสงค์การลงทะเบียน FR-001 ✅ Fully Addressed
1.1.2 ขอบเขตการลงทะเบียน (4 ช่องทาง) FR-001.1-001.4 ✅ All Channels Covered
1.1.3.1 ข้อมูลทั่วไปผู้ป่วย FR-002.1 ✅ Complete Data Model
1.1.3.2 หมายเลขบัตรประชาชน/Passport FR-002.2 ✅ Validation Included
1.1.3.3 ข้อมูลส่งตัวและเวชระเบียนเก่า FR-002.3 ✅ Schema Designed
1.1.3.4 ข้อมูลที่อยู่และการติดต่อ FR-002.4 ✅ Address Management
1.1.3.5 ข้อมูลสิทธิการรักษา FR-003 ✅ Insurance Module
1.1.3.6 การถ่ายภาพผู้ป่วย FR-004.1 ✅ Photo Management
1.1.3.7 ตรวจสอบข้อมูลซ้ำ FR-004.2 ✅ Duplicate Detection
1.1.3.8 อ่านบัตรประชาชน FR-004.3 ✅ Smart Card Integration
1.1.3.9 รองรับชาวต่างชาติ FR-004.4 ✅ Multi-nationality
1.1.3.10 HN ชั่วคราวฉุกเฉิน FR-004.5 ✅ Emergency Registration
1.1.3.11 เชื่อมโยงแผนกต่างๆ FR-004.6 ✅ Inter-department Link
1.2.1 วัตถุประสงค์ส่งผู้ป่วยเข้าตรวจ FR-005 ✅ Visit Management
1.2.2 ขอบเขตการส่งตรวจ FR-005.1-005.3 ✅ Multi-channel Visit
1.2.2.4 ตรวจสอบสิทธิ สปสช./กรมบัญชีกลาง FR-006 ✅ Real-time Verification
1.2.2.5-8 เอกสาร คิว สถานะ FR-007 ✅ Document & Queue Mgmt

Coverage Score: 100% - ทุก TOR requirements ได้รับการ address อย่างครบถ้วน

16.6 Technical Architecture Summary

System Architecture Overview:

┌─────────────────────────────────────────────────────────────┐
│                    User Interfaces                          │
├─────────────┬─────────────┬─────────────┬─────────────────┤
│ Staff Web   │ Kiosk Touch │ Mobile PWA  │ Line Bot        │
│ Interface   │ Interface   │             │                 │
└─────────────┴─────────────┴─────────────┴─────────────────┘
┌─────────────────────────────────────────────────────────────┐
│                    API Gateway                              │
│            (Authentication, Rate Limiting, Routing)         │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│                  Microservices Layer                        │
├─────────────┬─────────────┬─────────────┬─────────────────┤
│ Patient     │ Visit       │ Integration │ Notification    │
│ Service     │ Service     │ Service     │ Service         │
└─────────────┴─────────────┴─────────────┴─────────────────┘
┌─────────────────────────────────────────────────────────────┐
│                    Data Layer                               │
├─────────────┬─────────────┬─────────────┬─────────────────┤
│ PostgreSQL  │ Redis       │ File        │ Audit           │
│ (Primary)   │ (Cache)     │ Storage     │ Storage         │
└─────────────┴─────────────┴─────────────┴─────────────────┘
┌─────────────────────────────────────────────────────────────┐
│                External Integrations                        │
├─────────────┬─────────────┬─────────────┬─────────────────┤
│ NHSO API    │ Smart Card  │ Printing    │ Line Platform   │
│             │ Readers     │ Services    │                 │
└─────────────┴─────────────┴─────────────┴─────────────────┘

Technology Stack:

  • Frontend: Next.js 14+, React 18+, TypeScript, Tailwind CSS
  • Backend: Nest.js API Routes, TypeScript
  • Database: PostgreSQL 15+, Redis 7+
  • Integration: REST APIs, WebSocket, Message Queue
  • Security: JWT, OAuth 2.0, AES-256 encryption
  • Deployment: Docker, Kubernetes, CI/CD Pipeline

16.7 Project Timeline Summary

title Project Implementation Timeline (16 weeks)

section Phase 1: Foundation (6 weeks)
Database Setup           :done, db, 2024-01-01, 1w
Core Patient Registration :active, reg, after db, 3w
Smart Card Integration    :crit, card, after reg, 1w
Staff Interface           :ui1, after card, 1w

section Phase 2: Multi-channel (4 weeks)
Kiosk Development        :kiosk, after ui1, 2w
Mobile PWA               :mobile, after ui1, 2w
Line Bot Integration     :line, after mobile, 2w

section Phase 3: Integration (4 weeks)
NHSO API Integration     :nhso, after line, 2w
Visit Management         :visit, after nhso, 1w
Queue System             :queue, after visit, 1w

section Phase 4: Go-live (2 weeks)
Testing & Training       :test, after queue, 1w
Production Deployment    :prod, after test, 1w

Total Project Duration: 16 weeks Go-live Target: April 2025


17. Final Summary & Next Steps

17.1 Document Completeness Assessment

100% TOR Coverage Achieved

  • การลงทะเบียนผู้ป่วยใหม่: ครบถ้วนทุกช่องทาง (เจ้าหน้าที่, Kiosk, Mobile, Line)
  • ข้อมูลผู้ป่วย: ครบถ้วนตาม TOR 1.1.3 ทุกรายการ (11 หมวด)
  • การส่งผู้ป่วยเข้าตรวจ: OPD Visit, การตรวจสิทธิ, เอกสาร, คิว
  • ฟีเจอร์พิเศษ: ถ่ายภาพ, Smart Card, ตรวจซ้ำ, ต่างชาติ, ฉุกเฉิน

Technical Specifications Complete

  • Database Schema: รองรับทุกข้อมูลตาม TOR
  • API Design: RESTful APIs สำหรับทุกฟังก์ชัน
  • Integration Points: NHSO, Smart Card, Printing, Line Bot
  • Performance Requirements: ตาม TOR timelines และ volumes

Implementation Ready

  • Architecture: Scalable microservices design
  • Technology Stack: Modern, proven technologies
  • Security: PDPA compliant, enterprise-grade
  • Support: Comprehensive maintenance and training plans

17.2 Immediate Next Steps

Step 1: Stakeholder Review & Approval (1 week)

const approvalProcess = {
  medical_review: {
    reviewers: ['Chief Medical Officer', 'Department Heads'],
    focus: 'Clinical workflow และ patient experience',
    timeline: '3 days'
  },

  technical_review: {
    reviewers: ['IT Director', 'System Administrator'],
    focus: 'Technical feasibility และ integration requirements',
    timeline: '3 days'
  },

  management_approval: {
    reviewers: ['Hospital Director', 'Finance Director'],
    focus: 'Budget, resources, ROI',
    timeline: '2 days'
  }
};

Step 2: Detailed Project Planning (1 week)

  • Project charter creation
  • Team assignment และ roles definition
  • Detailed work breakdown structure
  • Risk management plan finalization
  • Communication plan establishment

Step 3: Vendor Selection & Contracting (2 weeks)

  • RFP preparation based on this SRS
  • Vendor evaluation และ selection
  • Contract negotiation
  • Project kick-off meeting

Step 4: Development Kickoff (Week 4)

  • Development environment setup
  • Database design validation
  • Integration testing environment preparation
  • Staff training schedule finalization

17.3 Success Metrics Commitment

เป้าหมาย (Targets) ตาม TOR:

  • Registration Time: ≤ 5 นาที (ตาม TOR 1.1.1)
  • Visit Creation Time: ≤ 2 นาที (ตาม TOR 1.2.1)
  • System Availability: ≥ 99.9%
  • User Satisfaction: ≥ 4.0/5.0
  • Multi-channel Adoption: Staff 60%, Kiosk 25%, Mobile 10%, Line 5%

17.4 Final Recommendations

Critical Success Factors:

  1. Strong Management Support: Hospital Director ต้อง champion โครงการ
  2. User-Centric Design: ทุกระบบต้องออกแบบให้ใช้งานง่าย
  3. Comprehensive Training: พนักงานและผู้ป่วยต้องได้รับการอบรมที่ดี
  4. Gradual Rollout: ทีละ phase เพื่อลดความเสี่ยง
  5. Continuous Monitoring: ติดตามและปรับปรุงอย่างต่อเนื่อง

📋 Document Status: READY FOR APPROVAL

เอกสาร SRS ฉบับนี้พร้อมสำหรับ:

  • ✅ การขออนุมัติจากผู้บริหาร
  • ✅ การจัดทำ RFP สำหรับ vendor selection
  • ✅ การเริ่มต้นโครงการพัฒนาระบบ
  • ✅ การอ้างอิงสำหรับ testing และ quality assurance
  • ✅ การใช้เป็น baseline สำหรับ project management

ผู้จัดทำ: Development Team
วันที่: 18 สิงหาคม 2025
Status: รอการอนุมัติ
Next Action: ส่งให้ Stakeholders review และ approve


"ระบบงานเวชระเบียนและเวชสถิติที่ตอบสนองทุกความต้องการตาม TOR - พร้อมสำหรับการพัฒนาและนำไปใช้งานจริง"