# Training System Test Flow

เอกสารนี้ใช้สำหรับทดสอบระบบตามโครงสร้างล่าสุดของโปรเจ็กต์:

- `Super Admin` จัดการ `Organizers`
- `Admin` จัดการ `Users`, `Courses`, `Training Records`, `Training Matrix`, `Reports`
- `User` เห็นเฉพาะ `Dashboard`, `Training Records`, `Reports`
- ใช้ `users` เป็น person entity เดียวของระบบแล้ว ไม่ใช้ `employees` เป็น runtime module

## 1. Scope

ครอบคลุม flow หลักดังนี้:

- Authentication และ organizer access
- Organizer management
- User management
- Course management
- Training record CRUD
- Certificate upload
- Approval workflow
- Training matrix
- Dashboard
- Reports และ CSV export
- RBAC และ data scoping

## 2. Test Prerequisites

ก่อนเริ่มทดสอบ ให้ตรวจสอบว่า:

- ตั้งค่า `.env.local` แล้ว
- PostgreSQL ทำงานได้
- migrations ถูก apply แล้ว
- dev server รันได้ด้วย `npm run dev`
- มีข้อมูล master ของ `departments` และ `positions`

บัญชีทดสอบที่แนะนำ:

- `super_admin` 1 คน
- `admin` 1 คน
- `user` 1 คน

ข้อมูลทดสอบขั้นต่ำ:

- 1 organizer
- 2 departments
- 2 positions
- 3 users
- 3 courses

## 3. Recommended Test Order

1. Auth and access
2. Organizer management
3. User management
4. Courses
5. Training records
6. Certificates
7. Approval workflow
8. Training matrix
9. Dashboard
10. Reports
11. RBAC regression

## 4. Auth And Access

### 4.1 Sign In

ทดสอบ:

- เปิด `/auth/sign-in`
- login ด้วย `super_admin`
- login ด้วย `admin`
- login ด้วย `user`

ผลที่คาดหวัง:

- `super_admin` เข้า organizer flow ได้
- `admin` เข้า `/dashboard/overview` ได้
- `user` เข้า `/dashboard/overview` ได้

### 4.2 Sign Up Disabled

ทดสอบ:

- เปิด `/auth/sign-up`
- เรียก `POST /api/auth/register`

ผลที่คาดหวัง:

- ผู้ใช้สมัครเองไม่ได้
- ระบบแจ้งชัดว่าต้องให้ admin สร้างบัญชีให้

### 4.3 Protected Routes

ทดสอบ:

- logout
- เปิด `/dashboard/overview`
- เรียก `/api/users`

ผลที่คาดหวัง:

- หน้า dashboard redirect ไป sign-in
- protected API ตอบ `401`

## 5. Organizer Flow

ใช้ `super_admin`

### 5.1 Organizer List

ทดสอบ:

- เปิด `/dashboard/organizers`

ผลที่คาดหวัง:

- เห็นรายการ organizer ทั้งหมด

### 5.2 Create Organizer

ทดสอบ:

- สร้าง organizer ใหม่

ผลที่คาดหวัง:

- สร้าง organizer สำเร็จ
- master data ของ organizer ใหม่ถูก seed ให้

## 6. User Flow

ใช้ `admin` หรือ `super_admin`

### 6.1 User List

ทดสอบ:

- เปิด `/dashboard/users`
- search
- filter status
- sort
- pagination

ผลที่คาดหวัง:

- ตารางโหลดข้อมูลได้
- filter และ sort ทำงานถูกต้อง

### 6.2 Create User

ทดสอบ:

- กดเพิ่ม user
- กรอก `full name`, `email`, `phone`, `employee code`
- เลือก `department` จาก dropdown
- เลือก `position` จาก dropdown
- ระบุ `hired date`
- สำหรับ `super_admin` ให้เลือก organizer ได้
- สำหรับ `admin` organizer ต้อง default จาก active organizer

ผลที่คาดหวัง:

- สร้าง user สำเร็จ
- user ใหม่มี membership ใน organizer ที่เลือก

### 6.3 Edit User

ทดสอบ:

- แก้ไข department, position, role, status

ผลที่คาดหวัง:

- ข้อมูลอัปเดตสำเร็จ

## 7. Sidebar Visibility

### 7.1 Super Admin

ผลที่คาดหวัง:

- เห็น `Dashboard`, `Organizers`, `Users`, `Courses`, `Training Records`, `Training Matrix`, `Reports`

### 7.2 Admin

ผลที่คาดหวัง:

- เห็น `Dashboard`, `Users`, `Courses`, `Training Records`, `Training Matrix`, `Reports`
- ไม่เห็น `Organizers`

### 7.3 User

ผลที่คาดหวัง:

- เห็นเฉพาะ `Dashboard`, `Training Records`, `Reports`

## 8. Course Flow

ใช้ `admin`

### 8.1 Course List And Filters

ทดสอบ:

- เปิด `/dashboard/courses`
- search
- filter category
- filter status

ผลที่คาดหวัง:

- ตารางแสดงผลถูกต้อง

### 8.2 Create And Edit Course

ทดสอบ:

- สร้าง course ใหม่
- แก้ไขข้อมูล course

ผลที่คาดหวัง:

- create/update สำเร็จ

## 9. Training Record Flow

### 9.1 Admin Creates Training Record

ใช้ `admin`

ทดสอบ:

- เปิด `/dashboard/training-records`
- สร้าง record ใหม่
- เลือก `user`
- เลือก `course`
- กรอก date, type, hours, organizer, note

ผลที่คาดหวัง:

- สร้าง record สำเร็จ
- status เริ่มที่ `pending`

### 9.2 User Creates Own Training Record

ใช้ `user`

ทดสอบ:

- เปิด `/dashboard/training-records`
- สร้าง record ใหม่

ผลที่คาดหวัง:

- dropdown `user` ต้องมองเห็นได้เฉพาะตัวเอง
- สร้าง record ของคนอื่นไม่ได้

### 9.3 List And Edit

ทดสอบ:

- list records
- filter by status
- filter by type
- เปิดหน้า detail/edit

ผลที่คาดหวัง:

- `admin` เห็นทุก record ใน organizer
- `user` เห็นเฉพาะ record ของตัวเอง

## 10. Certificate Flow

### 10.1 Upload Certificate

ทดสอบ:

- เปิดหน้า edit training record
- อัปโหลด `pdf`, `jpg`, `jpeg`, `png`

ผลที่คาดหวัง:

- upload สำเร็จ
- metadata ถูกบันทึก

### 10.2 View And Delete

ทดสอบ:

- เปิดดูไฟล์ย้อนหลัง
- ลบ certificate

ผลที่คาดหวัง:

- เปิดไฟล์ได้
- ลบแล้วรายการหาย

## 11. Approval Workflow

### 11.1 Admin Review

ใช้ `admin`

ทดสอบ:

- เปิด `/dashboard/training-records?status=pending`
- `Approve`
- `Reject`
- `Request Changes`
- ใส่ reviewer note

ผลที่คาดหวัง:

- เปลี่ยน status ได้
- reviewer note ถูกบันทึก

### 11.2 User Restrictions

ใช้ `user`

ทดสอบ:

- พยายาม review record
- พยายามแก้ approved record

ผลที่คาดหวัง:

- review ไม่ได้
- approved record แก้ไม่ได้ตาม policy

## 12. Training Matrix

ใช้ `admin`

### 12.1 Create Rules

ทดสอบ:

- เปิด `/dashboard/training-matrix`
- เพิ่ม rule แบบ department -> course
- เพิ่ม rule แบบ position -> course
- กำหนด renewal period

ผลที่คาดหวัง:

- สร้าง rules สำเร็จ

### 12.2 Compliance

ทดสอบ:

- user ที่มี approved records ครบ
- user ที่ยังขาด course
- user ที่มี course หมดอายุ

ผลที่คาดหวัง:

- compliance คำนวณถูกต้อง
- missing courses แสดงถูกต้อง

## 13. Dashboard

### 13.1 Admin Dashboard

ใช้ `admin`

ผลที่คาดหวัง:

- เห็นภาพรวมระดับ organizer
- summary cards, charts, recent activity ใช้ข้อมูลจริง

### 13.2 User Dashboard

ใช้ `user`

ผลที่คาดหวัง:

- เห็นเฉพาะข้อมูลของตัวเอง
- ไม่เห็น organizer-wide management views

## 14. Reports

### 14.1 Admin Reports

ใช้ `admin`

ทดสอบ:

- เปิด `/dashboard/reports`
- filter ตาม user
- filter ตาม department
- filter ตาม expiring days

ผลที่คาดหวัง:

- ตารางรายงานอัปเดตตาม filter
- export CSV ได้

### 14.2 User Reports

ใช้ `user`

ทดสอบ:

- เปิด `/dashboard/reports`
- ทดลองแก้ query string เอง

ผลที่คาดหวัง:

- เห็นเฉพาะข้อมูลของตัวเอง
- server บังคับ self-scope แม้ปรับ URL เอง
- export CSV ได้เฉพาะข้อมูลของตัวเอง

## 15. RBAC Regression

### 15.1 Cross-Organizer Isolation

ทดสอบ:

- login ด้วย user ของ organizer A
- พยายามเปิดข้อมูลของ organizer B

ผลที่คาดหวัง:

- มองไม่เห็นข้อมูลข้าม organizer

### 15.2 Legacy Employee Routes

ทดสอบ:

- เปิด `/dashboard/employees`
- เปิด `/dashboard/employees/new`

ผลที่คาดหวัง:

- ระบบพาไปหน้า `/dashboard/users`

## 16. Final Regression Checklist

- sign-in / sign-out ทำงาน
- sign-up ถูกปิด
- sidebar แยกตาม role ถูกต้อง
- organizer flow ใช้งานได้
- users ใช้งานได้
- courses ใช้งานได้
- training-records ใช้งานได้
- certificate upload ใช้งานได้
- approval workflow ใช้งานได้
- training matrix ใช้งานได้
- dashboard ใช้งานได้
- reports และ CSV export ใช้งานได้
- `npm run build` ผ่าน
