Giao diện
US-S07: Kiểm tra các trạng thái chặn hủy chuyển nhượng (luồng 3C) ​
Thuộc FS: 00-overview.md — SAPP-26297 Chuyển nhượng học viên (tool
sapp.011) Phần chung (tổng quan, roles, flow tổng, related features, NFR, Open Questions, References) xem ở Overview. File này chỉ chứa nội dung riêng của US.Cơ chế chạy bước, tự chấm, xác nhận GHI → US-S01. Bước hủy → như US-S04 BR-01.
| Field | Value |
|---|---|
| US ID | US-S07 |
| Role thực hiện | R1 - Người dùng tool — Assumption (OQ về G-01 → OQ-S-01) |
| Phase | As-built (đã triển khai @ e77c47a) |
| Priority | N/A — as-built |
| Status | Draft |
| NFR liên quan | NFR-S-01, NFR-S-02 — xem Overview §5 |
| OQ liên quan | OQ-S-01, OQ-S-12, OQ-S-13, OQ-S-14 — xem Overview §6 |
1. US Statement ​
text
As a Người dùng tool [Assumption — OQ-S-01]
I want gọi hủy chuyển nhượng trong các trường hợp phải bị từ chối (hủy hai lần, hủy cho người chưa chuyển nhượng,
hủy với người nhận, lớp không phải Lesson)
So that [Assumption — OQ-S-18] xác nhận API hủy của Ops từ chối đúng theo guide QA ("Các trường hợp API hủy chuyển nhượng phải từ chối.")2. Dependencies & Definition Of Ready ​
N/A — đã triển khai. Dependency runtime:
| # | Cần sẵn sàng | Ai cung cấp | Trạng thái |
|---|---|---|---|
| D1 | 3.17: A→B đang chuyển nhượng (luồng 1 bước 2) | Tester | — |
| D2 | Fixture có user_c (3.18), foundation_class_id (3.20) | Tester | — |
3. Business Rules ​
| ID | Rule | Áp dụng ở | Đã cover bởi (AC) | Nguồn code (Mode B/C) |
|---|---|---|---|---|
| BR-01 | Hủy hai lần liên tiếp (3.17): lần 1 "Cập nhật thành công", lần 2 "Từ chối đúng" 400|100337 · exceptions.transfer_record_not_found | M1 - case 3.17 | AC-M1.1 | fe/src/ui/components/works/sapp/sapp-26297-flows.ts:1279-1287 |
| BR-02 | Hủy với học viên = C (chưa từng chuyển nhượng, 3.18) hoặc = B (người nhận, 3.19) tại L1: "Từ chối đúng" 400|100337 | M1 - case 3.18, 3.19 | AC-M1.2 | sapp-26297-flows.ts:1289-1311 |
| BR-03 | Hủy với lớp = F1 (không phải Lesson, 3.20): tool chỉ chấm success = false; hướng dẫn ghi lại mã thực tế vì guide ghi CLASS_NOT_FOUND nhưng chưa chốt dạng mã | M1 - case 3.20 | AC-M1.3 | sapp-26297-flows.ts:1313-1328 |
4. Design ​
a. Mối liên hệ giữa các màn & User Flow ​
text
[Tab "3C · Chặn hủy chuyển nhượng"]
├─ 3.17: [hủy (GHI)] → [hủy lần 2 (GHI) — kỳ vọng 100337]
├─ 3.18 / 3.19: [hủy với C / B (GHI) — kỳ vọng 100337]
└─ 3.20: [hủy với lớp F1 (GHI) — kỳ vọng success=false] → [hướng dẫn ghi mã]b. Chi tiết từng màn ​
Màn M1 - Tab "3C · Chặn hủy chuyển nhượng" ​
| Field | Value |
|---|---|
| Figma frame | N/A |
| Trigger vào màn | Bấm tab "3C · Chặn hủy chuyển nhượng" |
| Mô tả ngắn | Tóm tắt: "Các trường hợp API hủy chuyển nhượng phải từ chối." 4 case |
UI States ​
| State | Khi nào | Hiển thị | Figma frame |
|---|---|---|---|
| Default | Vào tab | Tóm tắt + 4 case đóng | N/A |
| Loading | Bước đang chạy | Theo US-S01 | N/A |
| Has data | Bước chạy xong | ✓/✗ + "x/y đạt" | N/A |
| Empty | N/A | — | N/A |
| Error | Không gọi được Ops | Hộp đỏ 13042 | N/A |
| Disabled | Fixture thiếu giá trị | Nút khoá "Chưa điền: …" | N/A |
Fields ​
| Field | Required | Type | Default | Format | Validation | Error Message | Visibility | Depends On |
|---|---|---|---|---|---|---|---|---|
class_id (đường dẫn) | Yes | Text | {class_id_l1} (3.20: {foundation_class_id}) | id Ops | US-S01 BR-10 | "Chưa điền: …" | Bước hủy | Fixture |
student_id | Yes | Text | {user_a} (3.18: {user_c}; 3.19: {user_b}) | id Ops | US-S01 BR-10 | "Chưa điền: …" | Bước hủy | Fixture |
Actions ​
A1 - Chạy các bước của một case ​
| Item | Description |
|---|---|
| Trigger | Mở case, chạy từng bước (US-S01) |
| Behavior | Thao tác dùng: hủy chuyển nhượng (GHI). Ghi vào: Ops dev/staging (3.17 lần 1 hủy thật). Không có đường PROD |
| Success Result | Các check đạt theo bảng case |
Error cases:
| Case | Expected Handling |
|---|---|
| Ops trả mã khác kỳ vọng | Check ✗ + giá trị thực |
| Không gọi được Ops | Hộp đỏ 13042 |
Bảng case (4 case):
| Mã case | Tên | Bước | Kỳ vọng tool chấm |
|---|---|---|---|
| 3.17 | Hủy hai lần liên tiếp | hướng dẫn tiền đề · hủy · hủy | Lần 1 thành công; lần 2 400|100337 transfer_record_not_found |
| 3.18 | Hủy cho học viên chưa từng chuyển nhượng | hủy (student = C) | 400|100337 |
| 3.19 | Hủy với student_id = người nhận (B) | hủy (student = B) | 400|100337 |
| 3.20 | class_id không phải lớp Lesson | hủy (lớp = F1) · hướng dẫn | success = false (mã CLASS_NOT_FOUND chưa chốt dạng — OQ-S-13) |
Acceptance Criteria của màn M1 ​
AC-M1.1 - Hủy hai lần ​
gherkin
Given A→B đang chuyển nhượng
When người dùng chạy "Hủy lần 1" rồi "Hủy lần 2"
Then lần 1 HTTP 200, success = true, data.message = "Update successfully"
And lần 2 HTTP 400, error.code = "400|100337", error.message = "exceptions.transfer_record_not_found"Maps to:
- Business Rule: BR-01
AC-M1.2 - Hủy với người không phải người cho ​
gherkin
Scenario Outline: 100337
When người dùng chạy bước hủy tại L1 với student_id = <học viên>
Then HTTP 400, error.code = "400|100337", error.message = "exceptions.transfer_record_not_found"
Examples:
| case | học viên |
| 3.18 | C |
| 3.19 | B |Maps to:
- Business Rule: BR-02
AC-M1.3 - Lớp không phải Lesson ​
gherkin
When người dùng chạy "Hủy với class_id = F1"
Then check "success = false" đạt
And tester ghi lại error.code thực tế theo hướng dẫnMaps to:
- Business Rule: BR-03
Negative AC / Edge Cases của màn M1 ​
| ID | Tình huống | Hành vi mong đợi |
|---|---|---|
| EC-M1.1 | Chạy 3.17 khi không có A→B hiệu lực | Lần 1 đã bị từ chối ⇒ check lần 1 ✗ — cần chạy lại luồng 1 bước 2 |
| EC-M1.2 | 3.20 Ops trả thành công | Check success = false ✗ — tool không có check mã lỗi cụ thể |
5. Cross-feature AC ​
Không có.