Giao diện
US-D10: Flow P2 — DTTH lớp online (story SAPP US-02) ​
Thuộc FS: 00-overview.md — SAPP-26878 · Tạo dữ liệu test doanh thu (Ops → HubSpot → SAP) 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.
Mode B – As-built tại commit
e77c47a· nguồn Fact: inventory 26878 §3.3 (A-120). Khung stepper → US-D01 · lịch sử / log SAP → US-D02 · loại bước → US-D03.U01:x= bước x của luồng US-01, mô tả đầy đủ ở US-D09 §4a — file này không lặp lại.
| Field | Value |
|---|---|
| US ID | US-D10 |
| Role thực hiện | Người dùng tool — Assumption (OQ về G-01 · inventory Q-05 — xem 00-overview §6) |
| Phase | Phase 2 của SAPP-26878 (DTTH) · chip US-02 · DTTH lớp online (id us02) |
| Priority | N/A — as-built, đã triển khai (backlog R2: không xếp Priority) |
| Status | Draft |
| NFR liên quan | NFR-P-01 (quyền, FS nền tảng) · NFR của 26878 — xem 00-overview §5 |
| OQ liên quan | OQ-D-07, OQ-D-06, OQ-D-13, OQ-D-15 — xem 00-overview §6 · DR-D-06 — xem 00-overview §6b |
1. US Statement ​
text
As a Người dùng tool (Assumption — OQ về G-01)
I want dựng một lớp Recorded Online (không có buổi học) cùng Deal, đơn hàng và giao dịch, chạy lượt
quét rồi đọc kết quả
So that kiểm được rằng với lớp online, hệ thống ghi trọn số dư doanh thu của môn đúng một lần, chọn
phạm vi theo ngày kích hoạt của học viên chứ không theo ngày buổi- Nguồn "So that": hint luồng
fe/src/ui/components/works/sapp/sapp-26878-flows.ts:3626và runbookshared/runbooks/sapp/sapp-26878/phase-2/README.md("US-02 · Lớp Recorded Online (FULL_REMAINING)"). Ý đồ story gốc / tiêu chí nghiệm thu của tool là[Assumption](OQ-D-13).
2. Dependencies & Definition Of Ready ​
N/A — đã triển khai (Mode B). Dependency runtime giống US-D09 §2 (env_systems, danh mục phase 2, Ops passthrough US-P08, SQL runner US-P09, option US-P07, quét/trace US-P05), thêm: danh mục sản phẩm phải có sản phẩm mã ONLINE.
3. Business Rules ​
| ID | Rule | Áp dụng ở | Đã cover bởi (AC) | Nguồn code (Mode B/C) |
|---|---|---|---|---|
| BR-01 | Luồng có 15 bước theo thứ tự ở §4a; không có bước tạo buổi học, gán phòng học và trả lại mã lớp | M1 | AC-M1.1 | fe/src/ui/components/works/sapp/sapp-26878-flows.ts:3628-3648 |
| BR-02 | Lớp của luồng có hình thức ONLINE và thời lượng FIXED — cả hai cố định, không sửa được trên form | M1 - A3 Tạo lớp | AC-M1.2 | sapp-26878-flows.ts:3490-3503 |
| BR-03 | Lớp online gửi cả ngày bắt đầu và ngày kết thúc, cả hai mặc định 00:00 hôm nay giờ VN và bắt buộc; gửi thêm flexible_days mặc định 100 | M1 - A3 Tạo lớp | AC-M1.2 | sapp-26878-flows.ts:3504-3530 |
| BR-04 | Mã lớp / tên lớp / pool mã staging giống US-01 (US-D09 BR-03 → BR-05) | M1 - A3 Tạo lớp | AC-M1.2 | sapp-26878-flows.ts:3442-3457 |
| BR-05 | Bước Tạo đơn hàng dùng lại bước của US-01 nhưng chọn sẵn sản phẩm mã ONLINE (vẫn đổi được) | M1 - A8 Tạo đơn | AC-M1.3 | sapp-26878-flows.ts:3637-3640 |
| BR-06 | Bước Đọc kết quả lọc log SAP theo deal_id, tự chạy 5 kiểm chứng (§M2) và luôn coi là xong | M2 | AC-M2.1 → AC-M2.6 | sapp-26878-flows.ts:3563-3614; fe/src/ui/components/works/sapp/sapp-26878-tool.tsx:883-884 |
4. Design ​
a. Mối liên hệ giữa các màn & User Flow ​
text
[Chip "US-02 · DTTH lớp online", portal Dev | Staging]
↓
[M1] U01:1 → U01:2 → Tạo lớp ONLINE → U01:6 → U01:7 → U01:8 → U01:9 → U01:10 (sản phẩm ONLINE)
→ U01:11 → U01:12 → U01:13 → U01:14 → U01:15 → U01:16
↓
[M2] Đọc kết quả (luôn "xong") — hết luồng, không có bước trả mã lớpBảng bước (Fact: sapp-26878-flows.ts:3628-3648).
| # | Tên bước | Loại | Tái dùng | Ghi gì (hệ thống · môi trường) | Điều kiện chuyển (xong) |
|---|---|---|---|---|---|
| 1 | Kiểm tra kết nối Ops | ops + sql | U01:1 | Không ghi | Ping thành công |
| 2 | Đếm lớp của môn | ops | U01:2 | Không ghi | Gọi thành công |
| 3 | Tạo lớp | ops | riêng (lớp ONLINE) | Ops dev/staging: lớp DRAFT, ONLINE, FIXED, có ngày kết thúc | Gọi thành công |
| 4 | Mở lớp (PUBLIC) | ops | U01:6 | Ops | Gọi thành công |
| 5 | Thêm option mã lớp | option | U01:7 | HubSpot dev (staging: bỏ qua) | Đủ 3 property / bỏ qua |
| 6 | Tạo Deal | deal | U01:8 | HubSpot deal + contact (⚠️ portal prod khi Staging); Redis run history | Có deal |
| 7 | Gán mã lớp | classcode | U01:9 | HubSpot deal + contact | Gọi thành công |
| 8 | Tạo đơn hàng | ops | U01:10 (ghi đè: sản phẩm mặc định ONLINE) | Ops: đơn hàng | Thành công và số tiền ≠ 0 |
| 9 | Soạn thảo hợp đồng | stage | U01:11 | HubSpot dealstage | Chuyển stage thành công |
| 10 | Tạo giao dịch | ops | U01:12 | Ops | Gọi thành công |
| 11 | Xác nhận giao dịch | ops | U01:13 | Ops → SAP (theo hint) | Gọi thành công |
| 12 | Kéo sang Won | stage | U01:14 | HubSpot dealstage | Chuyển stage thành công |
| 13 | Hoàn thiện hồ sơ | stage | U01:15 | HubSpot dealstage | Chuyển stage thành công |
| 14 | Chạy lượt quét | scan | U01:16 | SAP service dev/staging | Gọi thành công |
| 15 | Đọc kết quả | trace | riêng | Không ghi | Luôn xong |
⚠️ Ghi PROD — trên Staging, bước 6, 7, 9, 12, 13 ghi HubSpot portal production (như US-D09 §4a).
Tình trạng nghiệm thu gần nhất (nguồn ngoài code, chưa kiểm chứng ở R3): runbook ghi US-02 ✅ 5/5 trên dev 2026-09-18 (shared/runbooks/sapp/sapp-26878/phase-2/README.md) và một lượt trọn vẹn trên staging 2026-09-22 (.../phase-2/staging/README.md §6d).
b. Chi tiết từng màn ​
Màn M1 - Chuỗi bước dựng dữ liệu (bước 1–14) ​
| Field | Value |
|---|---|
| Figma frame | N/A — as-built, không có Figma |
| Trigger vào màn | Chọn chip US-02 · DTTH lớp online (inventory E-07) |
| Mô tả ngắn | Stepper 15 bước; bước 1–14 dựng lớp online, Deal và giao dịch rồi chạy lượt quét. |
UI States ​
| State | Khi nào | Hiển thị | Figma frame |
|---|---|---|---|
| Default | Sitting mới | Bước 1 mở, còn lại khóa (→ US-D01) | N/A |
| Loading | Đang gọi hệ ngoài | Nút chạy bước ở trạng thái xử lý | N/A |
| Has data | Bước xong | Response + id vào bag, tự sang bước kế | N/A |
| Empty | Staging, pool mã lớp rỗng | Như US-D09 EC-M1.2 | N/A |
| Error | Hệ ngoài trả lỗi | Lỗi của bước, bước không xong | N/A |
| Disabled | Bước khóa; bước 5 trên Staging | Như US-D09 | N/A |
Fields ​
Chỉ field khác US-01 (bước 3 và bước 8). Field còn lại → US-D09 §M1 Fields.
| Field | Required | Type | Default | Format | Validation | Error Message | Visibility | Depends On |
|---|---|---|---|---|---|---|---|---|
B3 · instruction_mode | — | Text | ONLINE | — | BR-02 | — | Readonly | — |
B3 · duration_type | — | Text | FIXED | — | BR-02 | — | Readonly | — |
B3 · flexible_days | No | Number | 100 | số | — | — | Always | — |
B3 · started_at | Yes | Datetime ISO | 00:00 hôm nay giờ VN | ISO | BR-03 | Lỗi của Ops | Always | — |
B3 · finished_at | Yes | Datetime ISO | 00:00 hôm nay giờ VN | ISO | BR-03 | Lỗi của Ops | Always | — |
B3 · facility_id | Yes | Dropdown | — | id | — | — | Always | Hint: vẫn gửi dù Center = ALL |
B8 · product_ids | — | Dropdown (danh mục sản phẩm) | sản phẩm mã ONLINE | — | BR-05 | — | Always | Danh mục |
Actions ​
A3 - Tạo lớp ONLINE (bước 3) ​
| Item | Description |
|---|---|
| Trigger | Kiểm/chọn mã lớp, bấm chạy |
| Behavior | Tạo lớp trên Ops dev/staging với hình thức ONLINE, FIXED, có ngày bắt đầu + kết thúc (BR-02, BR-03, BR-04). |
| Success Result | Bag có class_id, class_code |
Error cases:
| Case | Expected Handling |
|---|---|
| Pool mã staging rỗng / mã trùng | Như US-D09 EC-M1.1, EC-M1.2 |
A8 - Tạo đơn hàng với sản phẩm ONLINE (bước 8) ​
| Item | Description |
|---|---|
| Trigger | Mở bước (sản phẩm ONLINE đã chọn sẵn), bấm chạy |
| Behavior | Như U01:10, riêng sản phẩm mặc định ONLINE (BR-05). |
| Success Result | Bag có order_id, order_amount |
Error cases:
| Case | Expected Handling |
|---|---|
| Người dùng đổi sang sản phẩm BLENDED | Tool không chặn; theo hint, luồng chạy tới Won rồi hỏng ở lượt quét với ERR-01 (sapp-26878-flows.ts:3639) |
Acceptance Criteria của màn M1 ​
AC-M1.1 - Chuỗi 15 bước không có buổi học ​
gherkin
Given một sitting mới của luồng US-02
When người dùng xem stepper
Then thấy 15 bước theo §4a; không có bước "Tạo buổi học", "Gán phòng học", "Trả lại mã lớp"Maps to:
- Business Rule: BR-01
AC-M1.2 - Lớp online cố định ​
gherkin
Given bước 3 "Tạo lớp" của US-02
When mở form
Then instruction_mode = ONLINE và duration_type = FIXED ở chế độ chỉ đọc
And started_at, finished_at bắt buộc, mặc định 00:00 hôm nay giờ VNMaps to:
- Business Rule: BR-02, BR-03, BR-04
AC-M1.3 - Sản phẩm ONLINE chọn sẵn ​
gherkin
Given danh mục sản phẩm của môi trường có sản phẩm mã ONLINE
When mở bước 8 "Tạo đơn hàng"
Then ô sản phẩm đã chọn sẵn sản phẩm ONLINEMaps to:
- Business Rule: BR-05
Negative AC / Edge Cases của màn M1 ​
| ID | Tình huống | Hành vi mong đợi |
|---|---|---|
| EC-M1.1 | ⚠️ Observed — chạy luồng trên Staging | Hành vi hiện tại: luồng không có bước "Trả lại mã lớp" (chỉ US-01 có, US-D09 bước 18), trong khi runbook staging §0.1 "Vòng đời một mã lớp" và lượt §6d ghi mọi lượt đều trả mã. Mỗi lượt giữ vĩnh viễn một mã của pool staging; tool không có đường nào trả mã của lớp do luồng này tạo. Pool cạn → bước Tạo lớp của mọi luồng phase 2 bị chặn (US-D09 EC-M1.2). OQ-D-07 · DR-D-06 — xem 00-overview §6 / §6b |
| EC-M1.2 | ⚠️ Observed — bước 6 chọn "Dùng deal có sẵn" | Như US-D09 EC-M1.3: mọi bước còn lại bị đánh dấu xong — OQ-D-06 |
| EC-M1.3 | Đổi sản phẩm đơn hàng khác ONLINE | Tool không chặn (A8 Error cases) |
Màn M2 - Bước 15 "Đọc kết quả" ​
| Field | Value |
|---|---|
| Figma frame | N/A — as-built, không có Figma |
| Trigger vào màn | Mở bước 15 |
| Mô tả ngắn | Trace log SAP theo deal_id (→ US-P05) + 5 kiểm chứng tự chấm. |
UI States ​
| State | Khi nào | Hiển thị | Figma frame |
|---|---|---|---|
| Default | Mở bước | Hint + mã lớp + trace tự chạy (lọc deal_id) | N/A |
| Loading | Đang tra | Trace đang tải | N/A |
| Has data | Có trail | Kết quả 5 kiểm chứng pass / fail / unknown | N/A |
| Empty | Chưa có dòng nào | Theo hint: số dư 3387 bằng 0 thì không có bút toán — "không có dòng" có thể là đúng | N/A |
| Error | Trace lỗi | → US-P05 | N/A |
| Disabled | N/A | N/A | N/A |
Fields ​
N/A — bước chỉ đọc.
Actions ​
A15 - Đọc kết quả ​
| Item | Description |
|---|---|
| Trigger | Mở bước (tự chạy) |
| Behavior | Tra log theo deal_id, chạy 5 kiểm chứng (BR-06). Không ghi. |
| Success Result | Bước luôn xong |
Error cases:
| Case | Expected Handling |
|---|---|
| Không đọc được trường | Kiểm chứng = unknown (US-D09 BR-17) |
Acceptance Criteria của màn M2 ​
AC = kiểm chứng tự chấm (sapp-26878-flows.ts:3563-3602).
AC-M2.1 - Ghi trọn số dư một lần ​
gherkin
Given lượt quét đã gửi bút toán của lớp online
When chạy kiểm chứng "Ghi trọn số dư một lần"
Then pass khi recognition_type trong payload = FULL_REMAININGMaps to:
- Business Rule: BR-06
AC-M2.2 - Không mang tiến trình buổi học ​
gherkin
When chạy kiểm chứng "Không mang tiến trình buổi học"
Then pass khi payload KHÔNG có lesson_hoursMaps to:
- Business Rule: BR-06
AC-M2.3 - Không mang số dư theo buổi ​
gherkin
When chạy kiểm chứng "Không mang số dư theo buổi"
Then pass khi payload KHÔNG có standard_hours_remainingMaps to:
- Business Rule: BR-06
AC-M2.4 - Trung tâm cố định ALL ​
gherkin
When chạy kiểm chứng "Trung tâm cố định ALL"
Then pass khi dimensions.center = ALLMaps to:
- Business Rule: BR-06
AC-M2.5 - Dòng sổ cái đúng loại ​
gherkin
When chạy kiểm chứng "Dòng sổ cái đúng loại"
Then pass khi dòng sổ cái có entry_type = RECORDED_ONLINEMaps to:
- Business Rule: BR-06
AC-M2.6 - Bước đọc không chặn ​
gherkin
Given một kiểm chứng fail hoặc unknown
Then bước 15 vẫn là "xong"Maps to:
- Business Rule: BR-06
Negative AC / Edge Cases của màn M2 ​
| ID | Tình huống | Hành vi mong đợi |
|---|---|---|
| EC-M2.1 | Chạy lại lượt quét trên lớp đã ghi | Theo hint: lớp không vào lượt quét nữa; muốn test lại phải xóa dòng sổ cái bằng SQL ngoài tool — luồng không cung cấp câu SQL này |
| EC-M2.2 | Kiểm chứng fail nhưng người dùng đi tiếp | Không có gate — OQ-D-15 |
5. Cross-feature AC ​
AC-X.1 - Dùng lại bước US-01 ​
gherkin
Given bước U01:1, 2, 6–16 thay đổi ở US-01
When mở luồng US-02
Then luồng dùng đúng định nghĩa mới, trừ ô sản phẩm của bước 8 (ghi đè riêng)Maps to:
- Liên quan nội bộ FS 26878 (không có mã REL) (US-D09, AC-X.1)