Initial commit

This commit is contained in:
Porawit Dongwang
2026-09-16 23:20:08 +07:00
commit 0041668dbb
32577 changed files with 3687927 additions and 0 deletions
@@ -0,0 +1,47 @@
# คู่มือการติดตั้ง (Installation Guide)
## ระบบขออนุมัติเดินทางประชุม-อบรม
### 1. ความต้องการของระบบ (System Requirements)
- PHP 8.3 หรือใหม่กว่า (เปิดใช้งาน pdo_mysql, mbstring, gd)
- MySQL 8.0 หรือ MariaDB 10.5 ขึ้นไป
- Apache (เปิดใช้งาน `mod_rewrite`) หรือ Nginx
- Composer
### 2. การติดตั้ง (Installation Steps)
**2.1 โคลนซอร์สโค้ด และ ติดตั้ง Dependencies**
```bash
git clone <repository_url> trip-approval
cd trip-approval
composer install
```
**2.2 ตั้งค่าฐานข้อมูล (Database Setup)**
1. สร้างฐานข้อมูลชื่อ `trip_approval_system`
2. นำเข้าโครงสร้างตารางจากไฟล์ `database/schema.sql`
```bash
mysql -u root -p trip_approval_system < database/schema.sql
```
3. สมมติฐานว่าระบบนี้เชื่อมต่อกับฐานข้อมูล `hosoffice_2566` (ตาราง `hr_person`) ที่มีอยู่เดิม
**2.3 ตั้งค่าการเชื่อมต่อในซอร์สโค้ด (Configuration)**
- เปิดไฟล์ `src/Core/Database.php`
- แก้ไข User, Password, DB Name สำหรับฝั่ง `$hrConnection` และ `$systemConnection` ให้ตรงกับเซิร์ฟเวอร์ของคุณ
**2.4 ตั้งค่า Web Server (Apache)**
- ให้ชี้ Document Root ของ Virtual Host ไปที่โฟลเดอร์ `public/`
- ตัวอย่าง `.htaccess` ในโฟลเดอร์ `public/`
```apache
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
```
### 3. การทดสอบเข้าระบบ
- เข้าสู่ระบบด้วย Username/Password ที่มีอยู่ในตาราง `hr_person`
- หรือเพิ่มข้อมูลจำลองในตาราง `hr_person` เพื่อทดสอบ
### 4. การตั้งค่าเพิ่มเติม (Advanced Settings)
- **Google Sheets**: เข้าไปที่ "ตั้งค่าระบบ" > "Google Sheets Integration" เพื่อระบุ Spreadsheet ID
- **PDF Template**: เข้าไปที่ "ตั้งค่าระบบ" > "PDF Template Designer" เพื่ออัปโหลดฟอร์ม PDF ว่างเปล่า และลากวางตัวแปร
@@ -0,0 +1,132 @@
# เอกสารวิเคราะห์ระบบและ 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) ตลอดทั้งแอปพลิเคชัน
@@ -0,0 +1,28 @@
# Test Cases (กรณีทดสอบ)
## 1. การยืนยันตัวตน (Authentication)
| TC ID | คำอธิบาย | ข้อมูลที่ใช้ทดสอบ | ผลลัพธ์ที่คาดหวัง |
|---|---|---|---|
| TC-AUTH-01 | เข้าสู่ระบบด้วยข้อมูลที่ถูกต้อง | Username=admin, Pass=1234 | เข้าสู่หน้า Dashboard สำเร็จ, มีชื่อแสดง |
| TC-AUTH-02 | เข้าสู่ระบบด้วยรหัสผ่านผิด | Username=admin, Pass=wrong | กลับไปหน้า Login, แสดงข้อความ "ชื่อผู้ใช้งานหรือรหัสผ่านไม่ถูกต้อง" |
| TC-AUTH-03 | ตรวจสอบ CSRF ในหน้า Login | (ยิง POST ผ่าน Postman ไม่มี CSRF) | ถูกปฏิเสธ (403 Forbidden) |
## 2. การขอเดินทาง (Trip Request)
| TC ID | คำอธิบาย | ข้อมูลที่ใช้ทดสอบ | ผลลัพธ์ที่คาดหวัง |
|---|---|---|---|
| TC-TRIP-01 | สร้างคำขอเดินทางครบถ้วน | กรอกครบทุกฟิลด์ | บันทึกลง DB สถานะ "Pending", Redirect ไปหน้าแรกพร้อมขึ้นแจ้งเตือนสำเร็จ |
| TC-TRIP-02 | สร้างคำขอโดยไม่กรอกฟิลด์จำเป็น | เว้นว่าง "สถานที่" | กลับไปหน้าฟอร์มเดิม แสดงข้อความเตือนให้กรอกครบถ้วน |
## 3. การอนุมัติ (Workflow)
| TC ID | คำอธิบาย | ข้อมูลที่ใช้ทดสอบ | ผลลัพธ์ที่คาดหวัง |
|---|---|---|---|
| TC-APP-01 | ผู้อนุมัติเข้าดูรายการ | Login ด้วยบัญชีผู้อนุมัติ | เห็นรายการที่ร้องขอจากพนักงานในตาราง "รอพิจารณา" |
| TC-APP-02 | อนุมัติรายการ (Approve) | กดปุ่ม "อนุมัติ" พร้อมคอมเมนต์ | สถานะใน `trip_requests` และ `trip_approvals` เปลี่ยนเป็น Approved, บันทึก Audit Log |
| TC-APP-03 | ไม่อนุมัติรายการ (Reject) | กดปุ่ม "ไม่อนุมัติ" | สถานะเปลี่ยนเป็น Rejected |
## 4. Google Sheets & PDF Designer
| TC ID | คำอธิบาย | ข้อมูลที่ใช้ทดสอบ | ผลลัพธ์ที่คาดหวัง |
|---|---|---|---|
| TC-INT-01 | ทดสอบหน้าตั้งค่า Sheet | กรอกข้อมูล Spreadsheet ID | บันทึกข้อมูลตั้งค่าสำเร็จ และดึงข้อมูล JSON มาแสดงผลเบื้องต้นได้ |
| TC-INT-02 | ลากวางฟิลด์ลง PDF | ลาก "{fullname}" ไปยัง Canvas | Canvas รับ Object และบันทึกพิกัด X, Y กลับมาได้ |
| TC-INT-03 | ตรวจสอบ XSS | พิมพ์ `<script>alert(1)</script>` ในช่อง Sheet Name | หน้าจอแสดงโค้ดเป็น Text ธรรมดา ไม่เกิด Alert |