Skip to content

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 commit e77c47a, dựng từ Feature Inventory 26878 (đã qua Gate R1). Chưa chạy thử màn hay gọi API nào.

FieldValue
Doc IDFS-SAPP-26878
ModeB – As-built
As-built tại commite77c47a
Last Updated2026-09-30
AuthorAI (lane ba/)
ReviewersBA
StatusDRAFT
Figma ProjectN/A — as-built, không có Figma
Related BRD../../brd/brd-as-built-v0.1-20260930.md
Related Impact MatrixN/A — Mode B (as-built), không có Impact Analysis

1. Tổng quan dự án &ZeroWidthSpace;

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 &ZeroWidthSpace;

  • 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-26878 dựng sẵn mọi bước cho người test bấm tay" (trích shared/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ã flow F-P1-xx / F-P2-xx và mã US US-Dxx để không nhầm với số story của SAPP.

1.2 Mục tiêu &ZeroWidthSpace;

  • [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 &ZeroWidthSpace;

  • 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 route sapp-ops/* / sap-log/* mà flow gọi (chỉ ở mức "26878 dùng chúng thế nào").

1.4 Out Of Scope &ZeroWidthSpace;

  • 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ảng sapp-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 &ZeroWidthSpace;

Role IDRole NameDescriptionPermission Summary
R1Người dùng toolNgườ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 &ZeroWidthSpace;

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é &ZeroWidthSpace;

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) &ZeroWidthSpace;

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 &ZeroWidthSpace;

Mã flowChip (id)Story SAPP gốcTên flowSố bướcUS-D
F-P1-01us03US-03 (phase 1)Học phí thường7US-D04
F-P1-02us05US-05 (phase 1)Gia hạn / Bảo lưu7US-D05
F-P1-03us06US-06 (phase 1)CBE / Cert / Becker7US-D06
F-P1-04us11US-11 (phase 1)Chuyển đổi (chuỗi 3 deal)18US-D07
F-P1-05us13US-13 (phase 1)Chuyển nhượng (3 deal, 2 học viên)17US-D08
F-P2-01us01US-01 (phase 2)DTTH theo buổi18US-D09
F-P2-02us02US-02 (phase 2)DTTH lớp online15US-D10
F-P2-03us03-p2US-03 (phase 2)DTTH chốt sổ19US-D11
F-P2-04us04US-04 (phase 2)DTTH ghi bù (học viên A/B)29US-D12
F-P2-05us05-p2US-05 (phase 2)DTTH rời lớp (A rời / B nhận)30US-D13
F-P2-06us06-p2US-06 (phase 2)DTTH đảo buổi22US-D14
F-P2-07us07US-07 (phase 2)Trường chiều18US-D15
F-P2-08us08-p2US-08 (phase 2)DTTH đồng bộ lại22US-D16
F-P2-09us09-p2US-09 (phase 2)DTTH đồng bộ ngược (⏸ chờ SAPP: sign-callback)21US-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ước resync cuố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 &ZeroWidthSpace;

MãTính năng liên quanLink tài liệuLoại liên quanMục bị ảnh hưởng ở feature kiaMục ảnh hưởng ở feature hiện tạiMô tả ảnh hưởng
REL-01Hub /works/sapp + khoá tool (US-P01, US-P02)US-P01, US-P02Affects-US-D01.M1 - vào toolTool chỉ mở được khi đang bật / đã mở khoá ở hub
REL-02Cấu hình env_systems (US-P04)US-P04Affects-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-03Tra log SAP + quét doanh thu (US-P05)US-P05Affects-US-D02.M1 (Log SAP), US-D03 M10 (scan), M11 (trace), chip Trace / Chạy lượt quét26878 chỉ gọi; hành vi tra log / quét mô tả ở US-P05
REL-04Callback SAP đã ký (US-P06)US-P06Affects-US-D17 (flow F-P2-09)Bước "Dựng callback đã ký" dùng dịch vụ nền tảng
REL-05Thêm option property HubSpot dev (US-P07)US-P07Affects-US-D03 M8 (option)Bước "Thêm option mã lớp" gọi route nền tảng, chỉ dev
REL-06Ops passthrough + auto-login (US-P08)US-P08Affects-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-07Ops SQL runner (US-P09)US-P09Affects-US-D03 M12 (sql)Panel SQL chạy statement theo id qua runner nền tảng
REL-08Hệ ngoài: webhook HubSpot → lms-be → SAP (SAPP)N/A — hệ ngoài, xem shared/external/sapp/sapp-26878/README.mdBe AffectedHóa đơn / chứng từ SAP, mail kế toánUS-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-09Sub-tool 26297 (dùng chung SQL runner)FS 26297Affects-US-D03 M12Cù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ường Maps to.

4. User Story Index &ZeroWidthSpace;

US IDTên User StoryFileRolePriorityStatus
US-D01Chạ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.mdR1N/A (as-built)Draft
US-D02Xem lịch sử run và log SAP của một flowUS-D02-lich-su-run-log-sap.mdR1N/A (as-built)Draft
US-D03Thực hiện một bước theo loại (12 loại bước)US-D03-loai-buoc.mdR1N/A (as-built)Draft
US-D04Flow P1: Học phí thường (F-P1-01 · US-03)US-D04-p1-hoc-phi-thuong.mdR1N/A (as-built)Draft
US-D05Flow P1: Gia hạn / Bảo lưu (F-P1-02 · US-05)US-D05-p1-gia-han-bao-luu.mdR1N/A (as-built)Draft
US-D06Flow P1: CBE / Cert / Becker (F-P1-03 · US-06)US-D06-p1-cbe-cert-becker.mdR1N/A (as-built)Draft
US-D07Flow P1: Chuyển đổi — chuỗi 3 deal (F-P1-04 · US-11)US-D07-p1-chuyen-doi.mdR1N/A (as-built)Draft
US-D08Flow P1: Chuyển nhượng — 3 deal, 2 học viên (F-P1-05 · US-13)US-D08-p1-chuyen-nhuong.mdR1N/A (as-built)Draft
US-D09Flow P2: DTTH theo buổi (F-P2-01 · US-01)US-D09-p2-dtth-theo-buoi.mdR1N/A (as-built)Draft
US-D10Flow P2: DTTH lớp online (F-P2-02 · US-02)US-D10-p2-lop-online.mdR1N/A (as-built)Draft
US-D11Flow P2: DTTH chốt sổ (F-P2-03 · US-03)US-D11-p2-chot-so.mdR1N/A (as-built)Draft
US-D12Flow P2: DTTH ghi bù — học viên A/B (F-P2-04 · US-04)US-D12-p2-ghi-bu.mdR1N/A (as-built)Draft
US-D13Flow P2: DTTH rời lớp — A rời / B nhận (F-P2-05 · US-05)US-D13-p2-roi-lop.mdR1N/A (as-built)Draft
US-D14Flow P2: DTTH đảo buổi (F-P2-06 · US-06)US-D14-p2-dao-buoi.mdR1N/A (as-built)Draft
US-D15Flow P2: Trường chiều (F-P2-07 · US-07)US-D15-p2-truong-chieu.mdR1N/A (as-built)Draft
US-D16Flow P2: DTTH đồng bộ lại (F-P2-08 · US-08)US-D16-p2-dong-bo-lai.mdR1N/A (as-built)Draft
US-D17Flow P2: DTTH đồng bộ ngược (F-P2-09 · US-09) — ⏸ chờ SAPP: sign-callbackUS-D17-p2-dong-bo-nguoc.mdR1N/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.mdR1N/A (as-built)Draft

Status = Draft cho 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 &ZeroWidthSpace;

Hành động inventoryUS-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-46US-D04
A-50 … A-55US-D05
A-60 … A-65US-D06
A-70 … A-74US-D07
A-80 … A-83US-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-06US-D18 (A-92, E-04, E-05 chỉ tham chiếu US-P05)
A-100 … A-117US-D09
A-120 … A-127US-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 &ZeroWidthSpace;

IDRequirementApplies To (US/màn/API)Acceptance Criteria
NFR-D-01Quyề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-DGọi route sapp-26878/* không kèm token vẫn được xử lý (theo NFR-P-01)
NFR-D-02Chặ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-D18Tab 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-D18Hành động có đường ghi PROD mang dòng ⚠️ Ghi PROD trong Behavior
NFR-D-04Chỉ 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-D18Gọ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-05Lư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-06Nhậ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-D17Mọi deal tool tạo có tiền tố [IT TEST][SAPP-26878]
NFR-D-07SQL 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-D17Bấm "Chạy" câu ghi → hiện hộp xác nhận; huỷ → không gọi API
NFR-D-08Chố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-D18Trong lúc một lời gọi chưa xong, nút cùng màn ở trạng thái disabled
NFR-D-09Khả 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-D01Bấm bước bị khoá → hiện câu lý do, không im lặng

6. Open Questions &ZeroWidthSpace;

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).

IDQuestionOwnerDue DateStatusBlocks (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 → BEGate R2OpenUS-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 → BEGate R2OpenUS-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 → BEGate R2OpenUS-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 → FEGate R2OpenUS-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?BAGate R2OpenMọ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 → FEGate R2OpenUS-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 → FEGate R2OpenUS-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 ↔ SAPPGate R2OpenUS-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—OpenUS-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—OpenUS-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—OpenUS-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—OpenUS-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?BAGate R2OpenUS-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—OpenUS-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—OpenUS-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?BAGate R2OpenUS-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—OpenUS-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—OpenUS-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—OpenUS-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—OpenUS-D15

6b. Drift: tài liệu ↔ code &ZeroWidthSpace;

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.

IDTài liệu nóiCode đang làm (bằng chứng file:dòng)Ảnh hưởngOwner 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, sourceFlowService 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-D18BE
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/14FE 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-D17BE
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-D18BE
DR-D-04(inventory DR-04) sapp.md bảng route 26878 (1391-1428): không có route assign-class-codeRoute 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-D17BE
DR-D-05(inventory DR-05) sapp.md §POST deals (1443-1447): nhãn flow cho tên deal chỉ phase 1Cò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-D13BE
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ượtChỉ 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-D17FE / 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-D14FE
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-D02BE
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-D18FE
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-D17FE
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-D09FE

7. References &ZeroWidthSpace;

  • 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.tsx nằ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 &ZeroWidthSpace;

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 fileSection thiếuTrạ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õ✅