Workflow phê duyệt 2 cấp: nhân viên submit → manager duyệt cấp 1 → HR duyệt cấp 2. Test state machine, balance integrity, overlap check.
Luồng phê duyệt 2 cấp: nhân viên submit yêu cầu → manager duyệt cấp 1 → HR duyệt cấp 2. Mỗi yêu cầu đi qua nhiều state với nhiều actor — đây là loại flow rất phổ biến trong hệ thống nội bộ doanh nghiệp.
Employee submit Manager approve HR approve
┌───────────┐ ┌─────────────┐ ┌──────────┐
│ pending_ │ ───────────────→ │ pending_hr │ ──────→ │ approved │ (final)
│ manager │ │ │ └──────────┘
└─────┬─────┘ └──────┬──────┘
│ Manager reject │ HR reject
↓ ↓
┌──────────────────┐ ┌──────────────────┐
│ rejected_by_ │ │ rejected_by_hr │
│ manager (final) │ │ (final) │
└──────────────────┘ └──────────────────┘
| Field | Yêu cầu |
|---|---|
| Nhân viên | Bắt buộc, chọn từ dropdown. |
| Loại phép | annual (phép năm) | sick (phép ốm) | personal (phép cá nhân). |
| Từ ngày | Bắt buộc. Phải ≥ hôm nay (không xin nghỉ ngày quá khứ). |
| Đến ngày | Bắt buộc. Phải ≥ "Từ ngày". |
| Lý do | Bắt buộc, ≥ 10 ký tự. |
| Số ngày | Tính tự động: (to_date - from_date) + 1 (inclusive cả 2 đầu). VD: 25/4 → 27/4 = 3 ngày. |
Quy tắc balance:
12 ngày phép năm. Sick / personal KHÔNG trừ balance.annual: số ngày yêu cầu phải ≤ balance còn lại. Nếu vượt → báo lỗi.Quy tắc overlap: KHÔNG được phép xin nghỉ chồng đè với 1 request đã approved hoặc đang pending_* của cùng nhân viên.
Submit thành công → hiển thị message Yêu cầu nghỉ phép đã được gửi thành công!, request mới có status pending_manager.
pending_manager.pending_hr.rejected_by_manager (final).pending_hr (đã qua manager).approved (final). Trừ balance nếu là annual leave.rejected_by_hr (final). Balance giữ nguyên.| STT | Mô tả | Bước tái hiện | Thực tế | Mong đợi | Mức độ |
|---|---|---|---|---|---|
| 1 | (học viên điền) | ||||
Form thực hành chỉ dành cho học viên đã đăng nhập.
Tab này chứa danh sách các lỗi đã cài cắm trong form. Vui lòng nhập mã giảng viên để mở khóa. Mã sẽ ghi nhớ trong phiên làm việc — chỉ cần nhập 1 lần cho cả 3 bài.