17 KiB
Training System Requirements Aligned With Project Stack
1. เป้าหมายของระบบ
ระบบนี้เป็นเว็บแอปสำหรับจัดเก็บและติดตามประวัติการอบรมของพนักงาน รวมถึงไฟล์ใบรับรองการอบรม และการตรวจสอบความครบถ้วนตาม Training Matrix ของแต่ละหน่วยงานหรือแต่ละตำแหน่งงาน
เอกสารฉบับนี้ปรับให้สอดคล้องกับ stack และสถาปัตยกรรมของโปรเจ็กต์ปัจจุบัน โดยไม่ใช้ Google Apps Script, Google Sheets หรือ Google Drive เป็นแกนหลักของระบบ
2. Stack ที่ต้องใช้ตามโปรเจ็กต์นี้
- Frontend: Next.js 16 App Router + React 19 + TypeScript
- UI: Tailwind CSS v4 + shadcn/ui
- Auth: Auth.js
- Database: PostgreSQL + Drizzle ORM
- Data fetching: TanStack React Query
- URL state: nuqs
- Forms: TanStack Form + Zod ผ่าน
useAppForm - API boundary: Next.js Route Handlers ภายใต้
src/app/api/** - Icons: ใช้ผ่าน
@/components/iconsเท่านั้น
3. แนวทางสถาปัตยกรรมที่ต้องยึด
- ใช้ feature-based structure ภายใต้
src/features/<feature>/ - ใช้ data layer pattern ของโปรเจ็กต์:
types.tsservice.tsqueries.tsmutations.tsเมื่อมี create/update/delete
- ฝั่ง client ต้องเรียกข้อมูลผ่าน
service.ts service.tsต้องเรียก Route Handlers ด้วยapiClient- Route Handlers ต้องเป็น boundary หลักสำหรับ auth, authorization, validation ขั้นต้น และ database access
- หน้า dashboard ต้องใช้
PageContainerสำหรับ page header - table/listing ที่มี filter, search, sort, pagination ต้องใช้ React Query + nuqs ตาม pattern ของหน้า
productsและusers - form ต้องใช้
useAppFormและ field wrappers ของโปรเจ็กต์
4. Domain Model ที่ต้องใช้ในระบบ
ระบบนี้ควรใช้คำศัพท์โดเมนให้ชัดและสอดคล้องกับโครงสร้าง auth ปัจจุบัน
user: ผู้ใช้งานที่ล็อกอินเข้าระบบorganization: หน่วยงานเจ้าของข้อมูล หรือ tenant ของระบบmembership: ความสัมพันธ์ระหว่าง user กับ organization พร้อม roleemployee: ข้อมูลพนักงานที่ถูกติดตามประวัติการอบรมcourse: หลักสูตรอบรมกลางtraining_record: รายการประวัติการอบรมของพนักงานแต่ละครั้งcertificate: ข้อมูลไฟล์ใบรับรองที่ผูกกับ training recordtraining_matrix: ข้อกำหนดว่าตำแหน่งหรือแผนกใดต้องผ่านหลักสูตรอะไรdepartment: หน่วยงานภายในองค์กรposition: ตำแหน่งงาน
หมายเหตุ:
- ถ้าผู้ใช้ระบบกับพนักงานเป็นคนละแนวคิด ต้องแยก
userออกจากemployee - ข้อมูลทั้งหมดควรถูกผูกกับ
organizationIdเพื่อรองรับ multi-tenant
5. ขอบเขตข้อมูลหลักใน PostgreSQL
ตารางหลักที่ควรมีในระบบนี้:
users- ข้อมูลบัญชีผู้ใช้งานสำหรับ Auth.js
organizations- ข้อมูลองค์กรหรือ workspace
memberships- บทบาทของผู้ใช้งานในแต่ละ organization
employees- รหัสพนักงาน, ชื่อ, แผนก, ตำแหน่ง, บริษัท, สถานะ
departments- หน่วยงานภายใน organization
positions- ตำแหน่งงานภายใน organization
courses- ชื่อหลักสูตร, หมวดหมู่, ผู้จัดอบรม, จำนวนชั่วโมง, อายุใบรับรอง, บังคับหรือไม่
training_records- employee, course, วันที่อบรม, รูปแบบการอบรม, ชั่วโมง, หมายเหตุ, สถานะอนุมัติ
certificates- ชื่อไฟล์, path หรือ storage key, mime type, uploadedAt
training_matrices- mapping ระหว่าง department หรือ position กับ course ที่จำเป็น
แนวทางสำคัญ:
- ทุกตารางเชิงธุรกิจควรมี
organizationId - ใช้ foreign keys ชัดเจนระหว่าง employee, course, training_record, certificate
- เก็บ file metadata ใน database และเก็บไฟล์จริงใน app-owned storage
6. แนวทางจัดเก็บไฟล์ใบรับรอง
ไม่ใช้ Google Drive เป็น storage หลักของระบบนี้
รอบแรกของระบบควรใช้แนวทางใดแนวทางหนึ่ง:
- ทางเลือกแนะนำสำหรับโปรเจ็กต์นี้:
- เก็บ metadata ใน PostgreSQL
- เก็บไฟล์จริงผ่าน local uploads หรือ object storage ที่ต่อเพิ่มภายหลัง
ข้อกำหนดเชิงระบบ:
- certificate ต้องผูกกับ
training_record - ต้องสามารถเปิดดูไฟล์ย้อนหลังได้
- ต้องรองรับไฟล์อย่างน้อย
pdf,jpg,jpeg,png - ต้องมี field สำหรับ
fileName,fileType,fileSize,storageKey,uploadedAt
7. บทบาทผู้ใช้งาน
ระบบต้องรองรับ role อย่างน้อย:
member- ดู dashboard ของตัวเอง
- เพิ่มและแก้ไขประวัติการอบรมของตัวเอง
- อัปโหลดใบรับรองของตัวเอง
- ดูสถานะการอนุมัติ
admin- จัดการ employee
- จัดการ course
- ตรวจสอบและอนุมัติ training record
- จัดการ training matrix
- ดูรายงานภาพรวมของ organization
owner- สิทธิ์ระดับสูงสุดใน organization
- จัดการสมาชิกและค่ากำหนดหลักของ organization
Authorization ต้องตรวจที่ server-side ผ่าน session + membership ไม่ใช่ตรวจเฉพาะ client
8. ฟีเจอร์หลักสำหรับผู้ใช้งานทั่วไป
8.1 User Dashboard
ผู้ใช้งานต้องเห็น dashboard ส่วนตัวที่ประกอบด้วย:
- จำนวนหลักสูตรที่เคยอบรมทั้งหมด
- จำนวนชั่วโมงอบรมสะสม
- จำนวนใบรับรองที่บันทึกแล้ว
- จำนวนหลักสูตรที่ยังขาดตาม training matrix
- กราฟสรุปการอบรมรายเดือนหรือรายปี
แนวทาง implementation:
- ใช้ Recharts สำหรับกราฟ
- ใช้ server prefetch +
HydrationBoundary+useSuspenseQuery
8.2 บันทึกการอบรม
ผู้ใช้งานต้องสามารถเพิ่มรายการอบรมได้ โดยข้อมูลหลักประกอบด้วย:
- employee หรือข้อมูลผู้เข้าอบรม
- course
- training date
- training type:
online | onsite | internal | external - training hours
- organizer
- note
- certificate file
- approval status
แนวทาง implementation:
- ใช้ TanStack Form + Zod
- submit ผ่าน mutation ไปยัง Route Handler
- หลังบันทึกต้อง invalidate query ที่เกี่ยวข้อง
8.3 รายการอบรมของฉัน
ผู้ใช้งานต้องสามารถ:
- ค้นหาตามชื่อหลักสูตร
- กรองตามปี
- กรองตามหมวดหมู่
- กรองตามสถานะ
- เปิดดูรายละเอียด
- เปิดดูไฟล์ใบรับรอง
- แก้ไขรายการของตัวเอง
- ลบรายการที่ยังไม่ถูกอนุมัติ หรือเป็นไปตาม policy ที่กำหนด
แนวทาง implementation:
- ใช้ Data Table pattern เดียวกับ
productsหรือusers - ใช้ React Query + nuqs
9. ฟีเจอร์หลักสำหรับ Admin
9.1 Admin Dashboard
Admin ต้องเห็น dashboard ภาพรวมของ organization:
- จำนวนพนักงาน
- จำนวนชั่วโมงอบรมรวม
- เปอร์เซ็นต์ความครบถ้วนตาม training matrix
- จำนวนรายการที่รออนุมัติ
- สถิติแยกตามแผนก หมวดหมู่ และช่วงเวลา
9.2 จัดการ Employee
Admin ต้องสามารถ:
- เพิ่ม employee
- แก้ไข employee
- ปิดการใช้งาน employee
- กำหนดแผนก
- กำหนดตำแหน่ง
9.3 จัดการ Course
Admin ต้องสามารถ:
- เพิ่ม course
- แก้ไข course
- ลบ course
- กำหนด category
- กำหนด standard training hours
- กำหนด certificate validity
- ระบุว่าเป็น required course หรือไม่
9.4 ตรวจสอบและอนุมัติ Training Record
Admin ต้องสามารถ:
- เปิดดูไฟล์ใบรับรอง
- ตรวจสอบรายละเอียดการอบรม
- approve
- reject
- request changes
- ใส่หมายเหตุประกอบการตรวจสอบ
สถานะที่ควรใช้:
pendingapprovedrejectedneeds_revision
9.5 จัดการ Training Matrix
Admin ต้องสามารถ:
- กำหนดหลักสูตรบังคับตาม department
- กำหนดหลักสูตรบังคับตาม position
- กำหนดหลักสูตรเฉพาะรายบุคคลในอนาคตได้
- กำหนด minimum required hours เมื่อจำเป็น
- ดูสถานะครบหรือไม่ครบของแต่ละ employee
10. รายงานที่ระบบควรมี
อย่างน้อยควรมีรายงานต่อไปนี้:
- ประวัติการอบรมรายบุคคล
- การอบรมแยกตามแผนก
- ชั่วโมงอบรมสะสม
- หลักสูตรที่ยังขาดตาม matrix
- ใบรับรองใกล้หมดอายุ
- สรุป training matrix ของ organization
รูปแบบการแสดงผล:
- แสดงบนหน้า dashboard/table
- รองรับ export ใน phase ถัดไป
11. แนวทาง UI/UX ที่ต้องสอดคล้องกับโปรเจ็กต์
- ใช้ shadcn/ui และ component patterns ที่มีอยู่แล้ว
- ใช้
PageContainerสำหรับ page title, description, action - ใช้
@/components/iconsแทนการ import icon ตรงจาก package ภายนอก - ใช้ Card, Table, Dialog, Sheet, Tabs ตามแนวทางเดิมของโปรเจ็กต์
- รองรับ desktop และ mobile
- ไม่ใช้ SweetAlert2 หรือระบบ popup ภายนอกเป็นค่าเริ่มต้น
- ใช้ toast/alert/dialog ที่มีในโปรเจ็กต์แทน
12. Visual Direction
โทนสีจาก requirement เดิมสามารถตีความเป็น theme ของระบบได้ แต่ต้อง implement ผ่าน theme/token ของโปรเจ็กต์นี้ ไม่ใช่เขียนเป็นระบบ CSS แยกใหม่
สีที่ต้องการ:
- เขียวเข้ม:
#336b4a - เทา:
#808285 - ส้ม:
#e26631 - ม่วงเข้ม:
#413b60
แนวทางใช้งาน:
- primary actions: เขียวเข้ม
- warning/highlight states: ส้ม
- supporting accents/charts: ม่วงเข้ม
- muted text/borders: เทา
ถ้าต้องทำ theme จริง ให้เพิ่มผ่านระบบ theme ของโปรเจ็กต์ ไม่ทำแยกนอก src/styles/themes และ theme.config.ts
13. แนวทางแบ่ง feature ในรีโปนี้
ฟีเจอร์ที่ควรสร้างใน src/features/:
employeescoursestraining-recordscertificatestraining-matrixreports
แต่ละ feature ควรมี:
api/types.tsapi/service.tsapi/queries.tsapi/mutations.tsเมื่อมี mutationcomponents/schemas/constants/เมื่อจำเป็น
และมี route ใต้ src/app/dashboard/<feature>/page.tsx
14. ลำดับการพัฒนาที่แนะนำ
เพื่อให้เข้ากับโครงสร้างของโปรเจ็กต์ ควรพัฒนาเป็นลำดับดังนี้:
- Auth + organization + membership foundation
- Employee management
- Course management
- Training record CRUD + certificate upload metadata
- Training matrix
- Dashboard summaries and reports
15. สิ่งที่ไม่ควรใช้ใน requirement ฉบับนี้
เพื่อให้ตรงกับโปรเจ็กต์นี้ ไม่ควรออกแบบระบบโดยอิงสิ่งต่อไปนี้เป็นแกนหลัก:
- Google Apps Script
- Google Sheets เป็น database หลัก
- Google Drive เป็น storage หลัก
- HTML/CSS/JavaScript แบบแยก standalone app
- SweetAlert2 เป็น UI feedback หลัก
- FontAwesome เป็น icon source หลัก
16. สรุป
ระบบ Training System ฉบับนี้ต้องถูกออกแบบให้เป็น multi-tenant web application บน stack ของโปรเจ็กต์ปัจจุบัน โดยใช้:
- Next.js App Router
- Auth.js
- PostgreSQL + Drizzle
- React Query + nuqs
- TanStack Form + Zod
- shadcn/ui + Tailwind CSS
และต้องจัดวางฟีเจอร์ตาม feature architecture ของรีโป เพื่อให้สามารถพัฒนาต่อจากฐานโค้ดนี้ได้จริง