Files
2026-09-16 23:20:08 +07:00

6.1 KiB

เอกสารวิเคราะห์ระบบและ 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

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) ตลอดทั้งแอปพลิเคชัน