# เอกสารวิเคราะห์ระบบและ ER Diagram (System Analysis & ER Diagram) ## 1. ภาพรวมของระบบ (System Overview) ระบบขออนุมัติเดินทางประชุม-อบรม เป็นระบบที่ช่วยให้บุคลากรสามารถสร้างคำขออนุมัติเดินทางไปราชการ ประชุม หรืออบรม ผ่านทางออนไลน์ โดยมีการอนุมัติผ่านสายงาน (Workflow) บันทึกประวัติการทำรายการ (Audit Log) สามารถสร้างแบบฟอร์ม PDF อัตโนมัติตามเทมเพลต และดึงข้อมูล/เชื่อมโยงกับ Google Sheets ## 2. โครงสร้างฐานข้อมูล (Database Design) ระบบแบ่งออกเป็น 2 ฐานข้อมูล (หรืออาจเป็น 2 Schema ในเซิร์ฟเวอร์เดียวกัน) 1. **HR Database (`hosoffice_2566`)**: ใช้เป็นข้อมูลอ้างอิงและตรวจสอบสิทธิ์เข้าใช้งาน 2. **System Database (`system`)**: เก็บข้อมูลการขออนุมัติและการตั้งค่าระบบ ### ตารางใน System Database 1. **`system_roles`**: เก็บชื่อบทบาท (เช่น Admin, User, Approver_L1, Approver_L2) 2. **`system_user_roles`**: แมปผู้ใช้งาน (จาก `hr_person.id`) กับบทบาท 3. **`trip_requests`**: ข้อมูลคำขอเดินทาง (ชื่อเรื่อง, วันที่, สถานที่, งบประมาณ, สถานะ) 4. **`trip_approvals`**: ประวัติและสถานะการอนุมัติตามลำดับขั้น (Workflow) 5. **`pdf_templates`**: เก็บไฟล์แบบฟอร์มตั้งต้นที่ใช้วางตัวแปร 6. **`pdf_template_fields`**: พิกัด (X, Y) และข้อมูลของแต่ละช่องตัวแปรบน PDF 7. **`google_sheet_settings`**: ตั้งค่าการเชื่อมต่อและ Mapping Google Sheets 8. **`audit_logs`**: เก็บประวัติการใช้งานระบบ (ใคร ทำอะไร เมื่อไหร่) ## 3. ER Diagram ```mermaid erDiagram %% HR Database Reference HR_PERSON { int id PK string username string password_hash string firstname string lastname string position int department_id } %% System Database SYSTEM_ROLES { int id PK string name "e.g. Admin, User, Manager" string description } SYSTEM_USER_ROLES { int user_id PK, FK "Refers to HR_PERSON.id" int role_id PK, FK "Refers to SYSTEM_ROLES.id" } TRIP_REQUESTS { int id PK int user_id FK "Refers to HR_PERSON.id" string doc_number "เลขที่หนังสือ" string title "ชื่อเรื่อง" text objective "วัตถุประสงค์" date start_date date end_date string location decimal budget string status "Draft, Pending, Approved, Rejected" datetime created_at datetime updated_at } TRIP_APPROVALS { int id PK int request_id FK int approver_id FK "Refers to HR_PERSON.id" int step "ลำดับการอนุมัติ" string status "Pending, Approved, Rejected" text comments datetime created_at } PDF_TEMPLATES { int id PK string name string file_path int version datetime created_at datetime updated_at } PDF_TEMPLATE_FIELDS { int id PK int template_id FK string field_name "e.g. {firstname}" string field_type "Text, Image, QR, Signature" decimal x_pos decimal y_pos int page_num decimal width decimal height int font_size } GOOGLE_SHEET_SETTINGS { int id PK string spreadsheet_id string sheet_name string sync_range json column_mapping datetime last_synced_at string status } AUDIT_LOGS { int id PK int user_id FK "Refers to HR_PERSON.id" string action "CREATE, UPDATE, DELETE, LOGIN" string entity_type "TableName" int entity_id text details string ip_address datetime created_at } %% Relationships HR_PERSON ||--o{ SYSTEM_USER_ROLES : "has" SYSTEM_ROLES ||--o{ SYSTEM_USER_ROLES : "assigned_to" HR_PERSON ||--o{ TRIP_REQUESTS : "creates" TRIP_REQUESTS ||--o{ TRIP_APPROVALS : "has_workflow_steps" HR_PERSON ||--o{ TRIP_APPROVALS : "approves" PDF_TEMPLATES ||--o{ PDF_TEMPLATE_FIELDS : "contains" HR_PERSON ||--o{ AUDIT_LOGS : "performs" ``` ## 4. ข้อสังเกตเพิ่มเติม (Notes) - การอนุมัติ (Trip Approvals) จะตรวจสอบแบบลำดับขั้น (Step-by-Step) - PDF Template Fields เก็บพิกัดเพื่อใช้ในการ Render ด้วย TCPDF/FPDI - การเก็บรหัสผ่าน (Password Hash) ฝั่ง HR จะถูกเรียกใช้โดย PDO ตัวแรก ส่วนเนื้อหาอื่นๆ จะเรียกใช้โดย PDO ตัวที่สอง - โครงสร้างนี้สามารถรองรับได้ถึง OWASP Top 10 โดยการบังคับใช้ Prepared Statements (PDO) ตลอดทั้งแอปพลิเคชัน