Giao diện
SAPP-26878 · Tạo dữ liệu test doanh thu (Ops → HubSpot → SAP) - FS Overview ​
File tổng quan + index của FS. Mỗi User Story là 1 file riêng trong cùng thư mục (
US-D<NN>-<slug>.md). Các phần dùng chung (tổng quan, flow tổng, related features, NFR, Open Questions, Drift, References) đặt tập trung tại đây — file US chỉ tham chiếu ID, không lặp lại. As-built: mô tả hành vi của code tại commite77c47a, dựng từ Feature Inventory 26878 (đã qua Gate R1). Chưa chạy thử màn hay gọi API nào.
| Field | Value |
|---|---|
| Doc ID | FS-SAPP-26878 |
| Mode | B – As-built |
| As-built tại commit | e77c47a |
| Last Updated | 2026-09-30 |
| Author | AI (lane ba/) |
| Reviewers | BA |
| Status | DRAFT |
| Figma Project | N/A — as-built, không có Figma |
| Related BRD | ../../brd/brd-as-built-v0.1-20260930.md |
| Related Impact Matrix | N/A — Mode B (as-built), không có Impact Analysis |
1. Tổng quan dự án ​
Sub-tool sapp.010 ("SAPP 26878: Create deal instance", route /works/sapp/tools/sapp-26878) là một màn stepper giúp người test tự dựng dữ liệu test cho dự án "Doanh thu thực hiện" của SAPP: tạo deal/contact trên HubSpot, thao tác trên SAPP Ops, kích hoạt SAP và đọc lại log SAP. Màn có ba nhóm chip — Phase 1 · hóa đơn & tiền vé (5 flow dựng deal + 5 màn đồng bộ lại), Trace (tra log SAP, chạy lượt quét, 3 màn gửi lại thô) và Phase 2 · doanh thu thực hiện (9 flow). Cả 14 flow được khai báo dạng dữ liệu và chạy qua cùng một stepper (sapp-26878-tool.tsx:1967,2038-2150).
1.1 Bối cảnh ​
- Dự án SAPP-26878 gồm hai pha: Phase 1 = "Đồng bộ Deal → hóa đơn SAP" và Phase 2 = "DTTH — ghi nhận theo buổi, ghi bù, bút toán âm, đảo buổi" (trích
shared/runbooks/sapp/sapp-26878/README.md:8-11). - Mỗi flow test cần một chuỗi dài thao tác trên ba hệ thống (HubSpot, SAPP Ops, SAP service) theo đúng thứ tự; "chip
sapp-26878dựng sẵn mọi bước cho người test bấm tay" (tríchshared/runbooks/sapp/sapp-26878/phase-2/README.md:6). - ⚠ Hai pha dùng lại tên user story nhưng không cùng nghĩa: "US-03" phase 1 khác hẳn "US-03" phase 2 (trích
shared/runbooks/sapp/sapp-26878/README.md:13-14). FS này dùng mã flowF-P1-xx/F-P2-xxvà mã USUS-Dxxđể không nhầm với số story của SAPP.
1.2 Mục tiêu ​
[Assumption]Cho người test dựng đủ dữ liệu của từng kịch bản nghiệm thu SAPP-26878 mà không phải tự nhớ thứ tự thao tác trên ba hệ thống, và tra lại được deal / log SAP của các lượt đã chạy.- Mục tiêu nghiệp vụ của chính dự án DTTH (Fact từ nguồn SAPP, không suy từ code): "Ghi nhận doanh thu theo buổi học thay vì ghi một lần khi thu tiền: mỗi buổi đã diễn ra sinh một bút toán sang SAP, và số dư tài khoản 3387 của học viên giảm dần cho tới khi lớp kết thúc" (
shared/runbooks/sapp/sapp-26878/README.md:3-4). - KPI: chưa có — chờ BA (G-05, xem OQ-D-05).
1.3 In Scope ​
- Khung stepper chung: chọn portal, chọn chip, gate bước, tự chuyển bước, bỏ qua bước, reset, lưu/khôi phục phiên (US-D01).
- Lịch sử run và modal Log SAP của một flow (US-D02).
- 12 loại bước:
deal · guide · stage · sync · link · resync · ops · option · classcode · scan · trace · sql(US-D03). - 5 flow phase 1 (US-D04…US-D08) và 9 flow phase 2 (US-D09…US-D17).
- 5 màn "Re-sync US-0x" theo story đồng bộ lại và 3 màn gửi lại thô sang SAP (US-D18).
- Các route BE
sapp-26878/*mà tool gọi, cách lưu run trên Redis, các routesapp-ops/*/sap-log/*mà flow gọi (chỉ ở mức "26878 dùng chúng thế nào").
1.4 Out Of Scope ​
- Cơ chế dùng chung (khoá tool,
env_systems, auto-login Ops, Ops passthrough, Ops SQL runner, tra log SAP, quét doanh thu, callback đã ký, thêm option property) → FS nền tảngsapp-platform-as-built-v0.1-20260930. - Nội dung từng câu SQL trong danh mục statement (chỉ ghi id + đọc/ghi).
- Logic phía hệ ngoài:
lms-be, SAP service, webhook HubSpot (chỉ trích từ hint trong code vàshared/external/). - Sub-tool 26297 (dùng chung SQL runner) → FS 26297.
1.5 Roles And Permissions ​
| Role ID | Role Name | Description | Permission Summary |
|---|---|---|---|
| R1 | Người dùng tool | Người mở sub-tool sapp.010 để dựng dữ liệu test (code gọi là "tester"). Assumption (OQ về G-01) — chưa rõ là dev/QA nội bộ, đội SAPP hay kế toán (OQ-D-05). | Dùng mọi chip và mọi bước. Không có phân quyền riêng trong tool; quyền truy cập API theo NFR-D-01 (→ NFR-P-01). |
2. Luồng tổng quan của dự án ​
text
[Hub /works/sapp → mở tool sapp.010] (→ US-P01, US-P02)
↓
[Khung tool: chọn portal Dev/Staging/Prod + chọn chip: US-D01]
├─ Chip Phase 1 (flow) ──→ [Stepper: US-D01] ──→ [Từng bước theo loại: US-D03]
│ F-P1-01 US-D04 · F-P1-02 US-D05 · F-P1-03 US-D06 · F-P1-04 US-D07 · F-P1-05 US-D08
│ (mỗi deal tạo xong → ghi run: US-D02)
├─ Chip Phase 1 (Re-sync US-0x) ──→ [Chọn run cũ → đồng bộ lại: US-D18]
├─ Chip Trace:
│ Trace log SAP · Chạy lượt quét ──→ (→ US-P05)
│ Gửi lại bút toán / lớp / giao dịch ──→ [US-D18]
└─ Chip Phase 2 (flow) ──→ [Stepper: US-D01] ──→ [Từng bước theo loại: US-D03]
F-P2-01 US-D09 … F-P2-09 US-D17
↓
[Trong stepper bất kỳ: nút Log SAP / Lịch sử: US-D02]
↓
[Kết quả: dữ liệu test trên HubSpot / Ops / SAP + run trên Redis]2.1 Flow tổng quan phase 1 — hóa đơn & tiền vé ​
text
Tạo deal (HubSpot) → [Tester tạo đơn + giao dịch trên SAPP OPS bằng tay — bước guide]
→ Chuyển stage giữa luồng → Kéo sang Won (mốc bắn event SAP qua webhook HubSpot → lms-be → SAP)
→ Đồng bộ lại hóa đơn / reconcile (ghi "Đồng bộ lại" lên deal → SAP chạy lại)
Chuỗi 3 deal (US-11, US-13): Deal gốc → Deal trừ (gắn deal gốc) → Deal cộng (deal duy nhất bắn event)2.2 Flow tổng quan phase 2 — doanh thu thực hiện (DTTH) ​
text
Kiểm tra kết nối Ops → Đếm lớp → Tạo lớp → (Tạo buổi học → Gán phòng) → Mở lớp PUBLIC
→ Thêm option mã lớp (HubSpot dev) → Tạo Deal → Gán mã lớp
→ Tạo đơn hàng Ops → Soạn thảo hợp đồng → Tạo giao dịch → Xác nhận giao dịch (bước gọi SAP)
→ Kéo sang Won → Hoàn thiện hồ sơ → Chạy lượt quét → Đọc kết quả (trace)
→ [bước riêng từng flow: xoá buổi đuôi, kéo buổi về quá khứ, chuyển nhượng, đảo buổi, dựng dòng lỗi, callback…]
Xương sống là F-P2-01 (US-01, 18 bước); 8 flow còn lại tái dùng bước của nó.2.3 Bảng 14 flow ​
| Mã flow | Chip (id) | Story SAPP gốc | Tên flow | Số bước | US-D |
|---|---|---|---|---|---|
| F-P1-01 | us03 | US-03 (phase 1) | Học phí thường | 7 | US-D04 |
| F-P1-02 | us05 | US-05 (phase 1) | Gia hạn / Bảo lưu | 7 | US-D05 |
| F-P1-03 | us06 | US-06 (phase 1) | CBE / Cert / Becker | 7 | US-D06 |
| F-P1-04 | us11 | US-11 (phase 1) | Chuyển đổi (chuỗi 3 deal) | 18 | US-D07 |
| F-P1-05 | us13 | US-13 (phase 1) | Chuyển nhượng (3 deal, 2 học viên) | 17 | US-D08 |
| F-P2-01 | us01 | US-01 (phase 2) | DTTH theo buổi | 18 | US-D09 |
| F-P2-02 | us02 | US-02 (phase 2) | DTTH lớp online | 15 | US-D10 |
| F-P2-03 | us03-p2 | US-03 (phase 2) | DTTH chốt sổ | 19 | US-D11 |
| F-P2-04 | us04 | US-04 (phase 2) | DTTH ghi bù (học viên A/B) | 29 | US-D12 |
| F-P2-05 | us05-p2 | US-05 (phase 2) | DTTH rời lớp (A rời / B nhận) | 30 | US-D13 |
| F-P2-06 | us06-p2 | US-06 (phase 2) | DTTH đảo buổi | 22 | US-D14 |
| F-P2-07 | us07 | US-07 (phase 2) | Trường chiều | 18 | US-D15 |
| F-P2-08 | us08-p2 | US-08 (phase 2) | DTTH đồng bộ lại | 22 | US-D16 |
| F-P2-09 | us09-p2 | US-09 (phase 2) | DTTH đồng bộ ngược (⏸ chờ SAPP: sign-callback) | 21 | US-D17 |
Số bước lấy theo từng bảng flow của inventory §3.2–§3.3 (phase 1 = 56, phase 2 = 194, tổng 250). Tiêu đề backlog R2 ghi "223 bước" — lệch với tổng từng flow; số từng flow ở bảng trên là số đã đối chiếu với spec (vd US-02 = 15 bước,
sapp-26878-flows.ts:3628-3647). Điều phối viên cần sửa con số tổng ở backlog. Story đồng bộ lại phase 1 (US-08/09/10/12/14) không phải flow riêng — là bướcresynccuối mỗi flow phase 1 và 5 màn "Re-sync US-0x" (US-D18).
3. Các tính năng liên quan ​
| Mã | Tính năng liên quan | Link tài liệu | Loại liên quan | Mục bị ảnh hưởng ở feature kia | Mục ảnh hưởng ở feature hiện tại | Mô tả ảnh hưởng |
|---|---|---|---|---|---|---|
| REL-01 | Hub /works/sapp + khoá tool (US-P01, US-P02) | US-P01, US-P02 | Affects | - | US-D01.M1 - vào tool | Tool chỉ mở được khi đang bật / đã mở khoá ở hub |
| REL-02 | Cấu hình env_systems (US-P04) | US-P04 | Affects | - | US-D03 M7 (ops), M12 (sql), M10 (scan), M11 (trace) | Kết nối Ops / Ops DB / SAP service theo môi trường lấy từ env_systems |
| REL-03 | Tra log SAP + quét doanh thu (US-P05) | US-P05 | Affects | - | US-D02.M1 (Log SAP), US-D03 M10 (scan), M11 (trace), chip Trace / Chạy lượt quét | 26878 chỉ gọi; hành vi tra log / quét mô tả ở US-P05 |
| REL-04 | Callback SAP đã ký (US-P06) | US-P06 | Affects | - | US-D17 (flow F-P2-09) | Bước "Dựng callback đã ký" dùng dịch vụ nền tảng |
| REL-05 | Thêm option property HubSpot dev (US-P07) | US-P07 | Affects | - | US-D03 M8 (option) | Bước "Thêm option mã lớp" gọi route nền tảng, chỉ dev |
| REL-06 | Ops passthrough + auto-login (US-P08) | US-P08 | Affects | - | US-D03 M7 (ops), US-D18.M2 (gửi lại thô) | Mọi thao tác Ops của flow đi qua passthrough |
| REL-07 | Ops SQL runner (US-P09) | US-P09 | Affects | - | US-D03 M12 (sql) | Panel SQL chạy statement theo id qua runner nền tảng |
| REL-08 | Hệ ngoài: webhook HubSpot → lms-be → SAP (SAPP) | N/A — hệ ngoài, xem shared/external/sapp/sapp-26878/README.md | Be Affected | Hóa đơn / chứng từ SAP, mail kế toán | US-D03 M3 (stage — kéo Won), M6 (resync) | Kéo Won / ghi Đồng bộ lại trên deal kích hoạt SAP thật ở môi trường tương ứng (Fact theo hint + comment, sapp-26878-flows.ts:1139,1151) |
| REL-09 | Sub-tool 26297 (dùng chung SQL runner) | FS 26297 | Affects | - | US-D03 M12 | Cùng dịch vụ SQL runner; thay đổi runner ảnh hưởng cả hai |
Mã
REL-XXđược tham chiếu ở phần Cross-feature AC của từng file US bằng trườngMaps to.
4. User Story Index ​
| US ID | Tên User Story | File | Role | Priority | Status |
|---|---|---|---|---|---|
| US-D01 | Chạy một flow test theo stepper (chọn portal, chọn flow, bỏ qua, reset, lưu / khôi phục phiên) | US-D01-chay-flow-stepper.md | R1 | N/A (as-built) | Draft |
| US-D02 | Xem lịch sử run và log SAP của một flow | US-D02-lich-su-run-log-sap.md | R1 | N/A (as-built) | Draft |
| US-D03 | Thực hiện một bước theo loại (12 loại bước) | US-D03-loai-buoc.md | R1 | N/A (as-built) | Draft |
| US-D04 | Flow P1: Học phí thường (F-P1-01 · US-03) | US-D04-p1-hoc-phi-thuong.md | R1 | N/A (as-built) | Draft |
| US-D05 | Flow P1: Gia hạn / Bảo lưu (F-P1-02 · US-05) | US-D05-p1-gia-han-bao-luu.md | R1 | N/A (as-built) | Draft |
| US-D06 | Flow P1: CBE / Cert / Becker (F-P1-03 · US-06) | US-D06-p1-cbe-cert-becker.md | R1 | N/A (as-built) | Draft |
| US-D07 | Flow P1: Chuyển đổi — chuỗi 3 deal (F-P1-04 · US-11) | US-D07-p1-chuyen-doi.md | R1 | N/A (as-built) | Draft |
| US-D08 | Flow P1: Chuyển nhượng — 3 deal, 2 học viên (F-P1-05 · US-13) | US-D08-p1-chuyen-nhuong.md | R1 | N/A (as-built) | Draft |
| US-D09 | Flow P2: DTTH theo buổi (F-P2-01 · US-01) | US-D09-p2-dtth-theo-buoi.md | R1 | N/A (as-built) | Draft |
| US-D10 | Flow P2: DTTH lớp online (F-P2-02 · US-02) | US-D10-p2-lop-online.md | R1 | N/A (as-built) | Draft |
| US-D11 | Flow P2: DTTH chốt sổ (F-P2-03 · US-03) | US-D11-p2-chot-so.md | R1 | N/A (as-built) | Draft |
| US-D12 | Flow P2: DTTH ghi bù — học viên A/B (F-P2-04 · US-04) | US-D12-p2-ghi-bu.md | R1 | N/A (as-built) | Draft |
| US-D13 | Flow P2: DTTH rời lớp — A rời / B nhận (F-P2-05 · US-05) | US-D13-p2-roi-lop.md | R1 | N/A (as-built) | Draft |
| US-D14 | Flow P2: DTTH đảo buổi (F-P2-06 · US-06) | US-D14-p2-dao-buoi.md | R1 | N/A (as-built) | Draft |
| US-D15 | Flow P2: Trường chiều (F-P2-07 · US-07) | US-D15-p2-truong-chieu.md | R1 | N/A (as-built) | Draft |
| US-D16 | Flow P2: DTTH đồng bộ lại (F-P2-08 · US-08) | US-D16-p2-dong-bo-lai.md | R1 | N/A (as-built) | Draft |
| US-D17 | Flow P2: DTTH đồng bộ ngược (F-P2-09 · US-09) — ⏸ chờ SAPP: sign-callback | US-D17-p2-dong-bo-nguoc.md | R1 | N/A (as-built) | Draft |
| US-D18 | Đồng bộ lại theo story và gửi lại thô (5 màn re-sync, 3 màn gửi lại) | US-D18-resync-va-gui-lai.md | R1 | N/A (as-built) | Draft |
Status =
Draftcho mọi US (as-built, chờ Gate R2). Priority: không áp dụng — tính năng đã triển khai hết.
4.1 Truy vết hành động inventory → US ​
| Hành động inventory | US-D |
|---|---|
| A-01 … A-07 (khung stepper) | US-D01 |
| A-08, A-09, A-10 (Log SAP, Lịch sử, ghi run) | US-D02 |
| A-20 … A-31 (12 loại bước) | US-D03 |
| A-40 … A-46 | US-D04 |
| A-50 … A-55 | US-D05 |
| A-60 … A-65 | US-D06 |
| A-70 … A-74 | US-D07 |
| A-80 … A-83 | US-D08 |
| A-90, A-91, A-92 (màn re-sync, gửi lại thô, chip Chạy lượt quét) + E-03, E-04, E-05, E-06 | US-D18 (A-92, E-04, E-05 chỉ tham chiếu US-P05) |
| A-100 … A-117 | US-D09 |
| A-120 … A-127 | US-D10 … US-D17 (mỗi dòng một US) |
⚠ Lệch so với backlog R2: backlog ghi US-D07 = "A-70 → A-74, A-80 → A-83" và US-D08 = "A-90 → A-92". Theo inventory §3.2, A-80…A-83 là bước của flow Chuyển nhượng (F-P1-05) và A-90…A-92 là màn đồng bộ lại / gửi lại ngoài stepper. FS này gán theo nội dung inventory (bảng trên); mọi A-xx vẫn xuất hiện ≥ 1 lần.
5. Non-functional Requirements ​
| ID | Requirement | Applies To (US/màn/API) | Acceptance Criteria |
|---|---|---|---|
| NFR-D-01 | Quyền truy cập API theo NFR-P-01 của FS nền tảng — toàn bộ route /api/v1/sapp/* mà tool gọi (sapp-26878/*, sapp-ops/*, sap-log/*) là @Public(); khoá tool chỉ ở giao diện (US-P02). Tool không có phân quyền riêng. Nguồn: sapp.controller.ts:2648,2688,2961,3147,3370,3469,3652,3756,774,798. | Mọi US-D | Gọi route sapp-26878/* không kèm token vẫn được xử lý (theo NFR-P-01) |
| NFR-D-02 | Chặn production ở giao diện: mọi chip dựng data / ghi (flow phase 1, phase 2, Re-sync, Gửi lại, Chạy lượt quét) chỉ bật portal Dev + Staging; Prod chỉ bật cho chip "Trace log SAP" (chỉ đọc). Nguồn: sapp-26878-tool.tsx:91-119,1977-2006. ⚠️ Observed: BE vẫn có route prod cho tạo deal/contact, chuyển stage, gán mã lớp, sync, link, resync, runs và các thao tác ghi Ops (sapp.controller.ts:2647,2960,3146,3206,3258,3369,3468; sapp-ops.controller.ts:1261,1651,1667,2179,2290,2350) → OQ-D-02. | US-D01, US-D03, US-D04…US-D18 | Tab Prod bị tắt (có tooltip "chỉ mở cho màn Trace log SAP") ở mọi chip trừ Trace |
| NFR-D-03 | "Staging" HubSpot = portal production. Portal Staging dùng credential của portal prod, flow chạy trên pipeline [UAT-TEST] (Fact theo comment, sapp-26878-tool.tsx:85-90; sapp-26878.constants.ts:382-507). ⇒ Mọi thao tác ghi HubSpot khi chọn Staging là ghi vào portal PROD (deal, contact, stage, property); kéo Won / Đồng bộ lại trên Staging xảy ra trên deal của portal prod (pipeline [UAT-TEST]) — hệ nào phía SAP nhận event đó nằm ngoài phạm vi truy vết (hệ ngoài). Riêng bước "Thêm option mã lớp" tự chặn Staging (US-D03 M8). | US-D03 (M1, M3–M6, M9), US-D04…US-D18 | Hành động có đường ghi PROD mang dòng ⚠️ Ghi PROD trong Behavior |
| NFR-D-04 | Chỉ thao tác trên deal do tool tạo: đọc / chuyển stage / gán mã lớp / sync / link / resync bị từ chối (400 13033) với deal không nằm trong danh sách deal tool đã tạo trên đúng môi trường. Nguồn: sapp.controller.ts:2762-2773. | US-D03 M3–M6, M9; US-D02; US-D18 | Gọi stage/resync với deal id do người khác tạo → lỗi 13033 "Deal was not created by the SAPP-26878 tool" |
| NFR-D-05 | Lưu trạng thái: không có bảng DB. Phiên stepper lưu sessionStorage theo (luồng, portal), mất khi đóng tab (sapp-26878-tool.tsx:314-391); danh sách deal/contact tool đã tạo và run history lưu Redis của mind_keep (sapp-26878.constants.ts:183-192,278-296). ⚠️ Observed: run chỉ trên Redis, TTL 30 ngày, tối đa 50 run / flow / portal (common.service.ts:1134-1171) → OQ-D-17. | US-D01, US-D02, US-D18 | Đóng tab → mở lại tool thì stepper về trạng thái mới; run cũ hơn 30 ngày không còn trong Lịch sử |
| NFR-D-06 | Nhận diện dữ liệu test: tên deal do server sinh [IT TEST][SAPP-26878] <nhãn flow> <n>, client không đặt được (sapp-26878.constants.ts:512-539; sapp.controller.ts:2623-2645). | US-D03 M1, US-D04…US-D17 | Mọi deal tool tạo có tiền tố [IT TEST][SAPP-26878] |
| NFR-D-07 | SQL trên DB Ops: chỉ Dev/Staging (không có route prod), chạy theo statement id (không gửi text SQL), câu ghi không bao giờ tự chạy và phải qua hộp xác nhận "Không có undo" (sapp-26878-step-sql.tsx:40,200-213) — cơ chế runner → US-P09. | US-D03 M12, US-D09…US-D17 | Bấm "Chạy" câu ghi → hiện hộp xác nhận; huỷ → không gọi API |
| NFR-D-08 | Chống bấm lặp: nút hành động bị khoá trong lúc đang gọi (vd lượt quét: SAP service từ chối hai lượt trong 1 giây bằng 429, sapp-26878-step-scan.tsx:89-93; re-sync: khoá mọi nút khi một lần bấm đang chạy, sapp-26878-history.tsx:185). | US-D02, US-D03, US-D18 | Trong lúc một lời gọi chưa xong, nút cùng màn ở trạng thái disabled |
| NFR-D-09 | Khả năng tiếp cận của stepper: bước bị khoá không dùng disabled mà vẫn bấm được để hiện lý do bằng câu đầy đủ; thông báo tự chuyển bước dùng vùng aria-live="polite" (sapp-26878-tool.tsx:1113-1135,1202-1221). | US-D01 | Bấm bước bị khoá → hiện câu lý do, không im lặng |
6. Open Questions ​
Mã OQ-D-NN với NN = 01…15 trùng số câu hỏi inventory Q-01…Q-15 (ổn định để phần B tham chiếu). OQ-D-16…OQ-D-20 phát sinh ở R3 (OQ-D-18…20 do người viết phần B phát hiện). Chưa câu nào có trả lời (Gate R1: G-01…G-10 chưa trả lời).
| ID | Question | Owner | Due Date | Status | Blocks (US) |
|---|---|---|---|---|---|
| OQ-D-01 | (inventory Q-01 · G-07) Khi lưu run, BE bỏ trigger / sourceRunId / sourceFlow → log đồng bộ lại hiện —, không biết lần bấm là hóa đơn hay reconcile và từ run nào. Cố ý hay bug? Nếu bug → handover BE qua shared/integration/. | BA → BE | Gate R2 | Open | US-D02, US-D18 |
| OQ-D-02 | (inventory Q-02 · G-02/G-03) BE mở route prod cho mọi thao tác ghi (tạo deal, kéo stage Won, resync, tạo lớp/đơn/confirm giao dịch Ops, gửi lại SAP) — chặn prod chỉ ở FE. Thiết kế chấp nhận được hay rủi ro cần đóng? | BA → BE | Gate R2 | Open | US-D03, US-D04…US-D18 |
| OQ-D-03 | (inventory Q-03 · G-07) Run history phase 2 hoạt động nhờ BE không kiểm {flow} lúc chạy, trong khi danh sách flow hợp lệ ở BE chỉ có phase 1 + story. Phase 2 có chính thức được lưu history không? | BA → BE | Gate R2 | Open | US-D02, US-D09…US-D17 |
| OQ-D-04 | (inventory Q-04 · G-06) Nút "Lịch sử" hiện ở mọi flow; ở flow phase 2 không có story đồng bộ lại tương ứng → modal có thể lỗi khi mở (⚠️ Observed, suy từ code, chưa chạy). Đã biết? Phase 2 có cần màn lịch sử không? | BA → FE | Gate R2 | Open | US-D02, US-D09…US-D17 |
| OQ-D-05 | (inventory Q-05 · G-01) Tool dành cho ai (dev/QA nội bộ, kế toán, đội SAPP)? "Tester" trong code là ai? | BA | Gate R2 | Open | Mọi US-D (role) |
| OQ-D-06 | (inventory Q-06 · G-07) "Dùng deal có sẵn" không kiểm deal id có tồn tại / do tool tạo, và đánh dấu mọi bước còn lại của deal đó là xong — ở phase 2 (1 deal cho cả flow) gồm cả bước Ops (tạo lớp, đơn, giao dịch, quét). Cố ý? | BA → FE | Gate R2 | Open | US-D01, US-D03, US-D04…US-D17 |
| OQ-D-07 | (inventory Q-07 · G-07) Chỉ F-P2-01 (US-01) có bước "Trả lại mã lớp (staging)". Các flow phase 2 khác chạy staging trả mã bằng cách nào? Có cần thêm bước? (rủi ro cạn pool mã staging) | BA → FE | Gate R2 | Open | US-D10…US-D17 |
| OQ-D-08 | (inventory Q-08 · G-08) Bộ ký /sign-callback đang ⏳ chờ SAPP, chặn 2 ca bắt buộc của US-09 phase 2. Trạng thái hiện tại? F-P2-09 coi là "đã triển khai, chưa nghiệm thu được"? | BA ↔ SAPP | Gate R2 | Open | US-D17 |
| OQ-D-09 | (inventory Q-09) Chạy lượt quét là GET nhưng có tác dụng phụ (bắn lượt quét) — chấp nhận ở nền tảng? | BA → BE | — | Open | US-D03 (M10), US-D09…US-D17 |
| OQ-D-10 | (inventory Q-10) Phase 1: tạo đơn / giao dịch Ops là làm tay (bước guide); phase 2 tool tự gọi Ops. Có kế hoạch tự động hoá phase 1 không, hay đây là phạm vi chốt? | BA | — | Open | US-D04…US-D08 |
| OQ-D-11 | (inventory Q-11) Số thứ tự lớp mới lấy từ lượt đếm tại thời điểm bấm — người khác tạo lớp xen giữa → trùng mã. Có cần rule chống trùng? | BA → FE | — | Open | US-D09…US-D17 |
| OQ-D-12 | (inventory Q-12) Danh sách owner test cố định (3 người) cho hubspot_owner_id được hard-code ở FE. Ai duy trì danh sách này? | BA | — | Open | US-D03 (M1), US-D04, US-D07, US-D08 |
| OQ-D-13 | (inventory Q-13 · G-10) Ý đồ từng story phase 2 (US-01…US-09) và story đồng bộ lại phase 1 (US-08…US-14): code chỉ có hint / mã AC (AC-M1.4, AC-9.5, BR-03…). BA có FS gốc để đối chiếu? | BA | Gate R2 | Open | US-D09…US-D18 |
| OQ-D-14 | (inventory Q-14) Chưa kiểm chứng id câu SQL phía FE khớp đủ 59 id phía BE cho từng panel (nút "Chạy" có thể tắt âm thầm khi lệch id). Cần một lượt đối chiếu kỹ thuật? | BA → FE | — | Open | US-D03 (M12), US-D09…US-D17 |
| OQ-D-15 | (inventory Q-15) Bước "Đọc kết quả" không bao giờ chặn — nghiệm thu dựa vào người test đọc check. Có cần gate "check phải xanh"? | BA | — | Open | US-D03 (M11), US-D09…US-D17 |
| OQ-D-16 | (R3, sapp-26878-step1.tsx:547-560; liên quan G-04) Tạo contact mới với email đã có → HubSpot trả contact cũ, tool cập nhật contact đó theo form rồi gắn vào deal. Trên Staging (= portal prod) điều này có thể ghi đè contact thật. Chấp nhận? | BA | Gate R2 | Open | US-D03 (M1), US-D04…US-D17 |
| OQ-D-17 | (R3, inventory §4 + Gate R1 X-6) Run test chỉ lưu Redis (TTL 30 ngày, tối đa 50 run / flow / portal, không có bảng DB). Đủ cho nhu cầu truy vết nghiệm thu, hay cần lưu bền? | BA | — | Open | US-D02, US-D18 |
| OQ-D-18 | (R3, phần B) Guide các bước SQL ghi "⚠ Chỉ làm trên dev", nhưng bước không bị khoá trên Staging và runbook ghi đã chạy trên staging. Staging có được phép chạy các câu SQL này không? Nếu không, cần khoá bước; nếu có, cần sửa chữ hướng dẫn. | BA | — | Open | US-D11, US-D12, US-D13, US-D16 |
| OQ-D-19 | (R3, phần B) Câu SQL dọn dữ liệu xoá mọi lượt EVENT_LEAVE / EVENT_RESCHEDULE / EVENT_RESYNC của cả môi trường, không lọc theo lớp của lượt test. Cố ý (môi trường test riêng) hay bug (xoá cả dữ liệu của người test khác)? | BA | — | Open | US-D13, US-D14, US-D16 |
| OQ-D-20 | (R3, phần B) Hint luồng và hint bước US-07 ghi "Tám kiểm chứng", code khai 9 kiểm chứng. Kiểm chứng thứ 9 có nằm trong tiêu chí nghiệm thu không? | BA | — | Open | US-D15 |
6b. Drift: tài liệu ↔ code ​
Mã DR-D-NN với NN = 01…11 trùng số Drift inventory DR-01…DR-11. Không tự chọn bên đúng.
| ID | Tài liệu nói | Code đang làm (bằng chứng file:dòng) | Ảnh hưởng | Owner quyết |
|---|---|---|---|---|
| DR-D-01 | (inventory DR-01) shared/api-docs/sapp.md §runs (dòng 2032-2049, mẫu 2056-2077): entry re-sync mang trigger, sourceRunId, sourceFlow | Service không lưu 3 field → GET không bao giờ trả; log hiện —, không hiện "từ luồng" (common.service.ts:1145-1156; sapp-26878-resync-tool.tsx:228-238) | US-D02, US-D18 | BE |
| DR-D-02 | (inventory DR-02) sapp.md §runs bảng flow (2027-2034): bucket chỉ us03/05/06/11/13 + us08/09/10/12/14 | FE ghi/đọc thêm bucket phase 2 (us01, us02, us03-p2, us04, us05-p2…us09-p2) (sapp-26878-tool.tsx:1337,1384-1389; sapp-26878-flows.ts:6274-6283) | US-D02, US-D09…US-D17 | BE |
| DR-D-03 | (inventory DR-03) sapp.md §runs (2079-2080): lỗi SAPP_26878_DEAL_NOT_FOUND (13033) | Tên hằng là SAPP_26878_DEAL_NOT_STAGED (13033); FAILED_TRIGGER_SAPP_26878_RESYNC (13036) khai nhưng không route nào ném (error-codes.constants.ts:704-722) | US-D03, US-D18 | BE |
| DR-D-04 | (inventory DR-04) sapp.md bảng route 26878 (1391-1428): không có route assign-class-code | Route POST {env}/sapp-26878/deals/{dealId}/assign-class-code tồn tại và bước "Gán mã lớp" dùng nó (sapp.controller.ts:3146,3166,3186) | US-D03 (M9), US-D09…US-D17 | BE |
| DR-D-05 | (inventory DR-05) sapp.md §POST deals (1443-1447): nhãn flow cho tên deal chỉ phase 1 | Còn 4 nhãn phase 2: US-04 Ghi bù · Học viên A/B, US-05 Rời lớp · Học viên A/B (sapp-26878.constants.ts:515-529) | US-D03 (M1), US-D12, US-D13 | BE |
| DR-D-06 | (inventory DR-06) shared/runbooks/sapp/sapp-26878/phase-2/staging/README.md §0.1 (113-120) + lượt 6d–6h: bước cuối "Trả lại mã lớp" của mọi lượt | Chỉ US-01 có bước này; US-02…US-09 không có (sapp-26878-flows.ts:3343-3350 vs :3628-3647,4044-4082,4459-4496,4876-4906,5345-5380,5592-5617,5911-5948,6216-6252) | US-D09…US-D17 | FE / owner runbook |
| DR-D-07 | (inventory DR-07) shared/external/sapp/sapp-26878/README.md dòng 182, 198: "US-04 (28 bước)", "US-06 24 bước" | Spec: US-04 = 29 bước, US-06 = 22 bước (có thể là thay đổi sau ngày ghi) (sapp-26878-flows.ts:4459-4496,5345-5380) | US-D12, US-D14 | FE |
| DR-D-08 | (inventory DR-08) sapp.md §runs (2082-2084): "Chưa endpoint nào trong mục này được gọi thật" | Tool gọi PUT runs mỗi lần tạo deal / bấm re-sync (sapp-26878-tool.tsx:1337,1526) | US-D02 | BE |
| DR-D-09 | (inventory DR-09) Comment trong code quy tắc re-sync: "Chỉ US-13 chưa khai bước resync (tới khi US-14 dựng)" | US-13 đã có bước resync US-14 (sapp-26878-flows.ts:2453-2456 vs :2361-2369) | US-D08, US-D18 | FE |
| DR-D-10 | (inventory DR-10) Comment dịch vụ dựng callback: "flow is pinned to dev" | Phase 2 đã chạy được staging (sapp-26878-step-ops.tsx:1060-1063; shared/integration/README.md:202 #40BE) | US-D17 | FE |
| DR-D-11 | (inventory DR-11) Hint bước "Tạo lớp" / "Tạo đơn hàng" US-01: "copy sang Deal ở bước 5" | Deal là bước 8 của US-01 (sapp-26878-flows.ts:2874,3113 vs :3095) | US-D09 | FE |
7. References ​
- BRD: ../../brd/brd-as-built-v0.1-20260930.md
- Impact Matrix: N/A — Mode B
- Solution Decision: ../../../project-decisions.md
- Figma: N/A — as-built
- API Spec:
shared/api-docs/sapp.md§"SAPP-26878 tool: HubSpot test data" (đối chiếu Drift ở §6b) - Code đã đọc: chi tiết ở feature-inventory-26878-20260930.md §9. Quy ước đường dẫn trong cột Nguồn code:
sapp-26878-*.tsx,sapp-26878-flows.ts,sap-resync-panel.tsxnằm ởfe/src/ui/components/works/sapp/;sapp.controller.ts,sapp-ops.controller.tsởbe/apps/api/src/sapp/;common.service.tsởbe/libs/modules/src/lib/sapp/;sapp-26878.constants.ts,sapp-26878-sql.constants.tsởbe/libs/constants/src/lib/sapp/;sapp-26878.dto.tsởbe/libs/interface/src/lib/dto/sapp/;error-codes.constants.tsởbe/libs/constants/src/lib/error-codes/. - Nguồn ý đồ:
shared/runbooks/sapp/sapp-26878/README.md,shared/runbooks/sapp/sapp-26878/phase-2/README.md,shared/external/sapp/sapp-26878/README.md(sổ cái MIND ↔ SAPP). - Meeting Notes / Q&A:
working/ai-drafts/gate-r1-summary-20260930.md(G-01…G-10, chưa trả lời). - FS nền tảng: ../sapp-platform-as-built-v0.1-20260930/00-overview.md (NFR-P-01).
Template Conformance Check ​
So khớp mục lục section với ba/_workflow/templates/fs/User-Story.md: Metadata · 1 US Statement · 2 Dependencies & DoR · 3 Business Rules (cột "Đã cover bởi (AC)" + "Nguồn code") · 4 Design (a flow; b mỗi màn: Figma frame · UI States · Fields · Filter/Search/Sort nếu List · Actions · AC G/W/T · Negative AC/EC) · 5 Cross-feature AC.
| US file | Section thiếu | Trạng thái |
|---|---|---|
| US-D01-chay-flow-stepper.md | (đủ) — Filter/Search/Sort ghi N/A (không phải màn List) | ✅ |
| US-D02-lich-su-run-log-sap.md | (đủ) — M2 là List: Filter/Search/Sort có (không filter, sort mới nhất trước, không phân trang) | ✅ |
| US-D03-loai-buoc.md | (đủ) — 12 khối M1…M12, mỗi khối đủ UI States/Fields/Actions/AC/EC | ✅ |
| US-D04-p1-hoc-phi-thuong.md | (đủ) | ✅ |
| US-D05-p1-gia-han-bao-luu.md | (đủ) | ✅ |
| US-D06-p1-cbe-cert-becker.md | (đủ) | ✅ |
| US-D07-p1-chuyen-doi.md | (đủ) | ✅ |
| US-D08-p1-chuyen-nhuong.md | (đủ) | ✅ |
| US-D09-p2-dtth-theo-buoi.md | (đủ) — kiểm bởi người viết phần B + quét mục lục của điều phối viên | ✅ |
| US-D10-p2-lop-online.md | (đủ) — kiểm bởi người viết phần B + quét mục lục của điều phối viên | ✅ |
| US-D11-p2-chot-so.md | (đủ) — kiểm bởi người viết phần B + quét mục lục của điều phối viên | ✅ |
| US-D12-p2-ghi-bu.md | (đủ) — kiểm bởi người viết phần B + quét mục lục của điều phối viên | ✅ |
| US-D13-p2-roi-lop.md | (đủ) — kiểm bởi người viết phần B + quét mục lục của điều phối viên | ✅ |
| US-D14-p2-dao-buoi.md | (đủ) — kiểm bởi người viết phần B + quét mục lục của điều phối viên | ✅ |
| US-D15-p2-truong-chieu.md | (đủ) — kiểm bởi người viết phần B + quét mục lục của điều phối viên | ✅ |
| US-D16-p2-dong-bo-lai.md | (đủ) — kiểm bởi người viết phần B + quét mục lục của điều phối viên | ✅ |
| US-D17-p2-dong-bo-nguoc.md | (đủ) — kiểm bởi người viết phần B + quét mục lục của điều phối viên | ✅ |
| US-D18-resync-va-gui-lai.md | (đủ) — M1 có danh sách run: Filter (chọn luồng nguồn) / Sort ghi rõ | ✅ |