Skip to content

US-D08: Flow P1: Chuyển nhượng — 3 deal, 2 học viên (F-P1-05 · story SAPP US-13) ​

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. As-built tại commit e77c47a. Nguồn Fact: inventory 26878 A-80 … A-83 (backlog R2 ghi A-90…A-92 — xem ghi chú lệch ở Overview §4.1). Hành vi từng loại bước → US-D03; khung stepper → US-D01.

FieldValue
US IDUS-D08
Role thực hiệnR1 - Người dùng tool (Assumption (OQ về G-01), OQ-D-05)
PhaseAs-built (đã triển khai) — phase 1 của ticket, chip us13
PriorityN/A (as-built)
StatusDraft
NFR liên quanNFR-D-02, NFR-D-03, NFR-D-04, NFR-D-06 — xem Overview §5
OQ liên quanOQ-D-02, OQ-D-06, OQ-D-10, OQ-D-12, OQ-D-16 — xem Overview §6

1. US Statement ​

text
As a Người dùng tool (Assumption — OQ về G-01)
I want dựng chuỗi ba deal chuyển nhượng khóa học giữa hai học viên (Deal gốc + Deal trừ của học viên chuyển ra,
       Deal cộng của học viên nhận), kéo Won Deal cộng rồi đồng bộ lại hóa đơn
So that kiểm được luồng "Đồng bộ Deal → hóa đơn SAP" cho story US-13 phase 1
        (trích shared/runbooks/sapp/sapp-26878/README.md:10); lợi ích cụ thể: [Assumption]

2. Dependencies & Definition Of Ready ​

N/A — đã triển khai (Mode B). Dependency runtime: pipeline học phí (Deal gốc) và pipeline chuyển nhượng (Deal trừ, Deal cộng) của các flow BE us13-source, us13-minus, us13-plus đã cấu hình cho portal (sapp-26878.constants.ts:382-507).

3. Business Rules ​

IDRuleÁp dụng ởĐã cover bởi (AC)Nguồn code (Mode B/C)
BR-01Flow có 17 bước, 3 khối (1a Deal gốc · 1b Deal trừ · 1c Deal cộng) + 1 bước đồng bộ lại; không có bước sync gói khóa học. Mọi khối cho phép "Dùng deal có sẵn".M1AC-M1.1sapp-26878-flows.ts:2337-2374,2011-2020
BR-02Hai học viên: Deal gốc và Deal trừ là học viên chuyển ra (cùng contact); Deal cộng là học viên nhận (contact khác). Sai vai trò → cảnh báo "… phải là CÙNG một học viên." / "… phải là HAI học viên khác nhau." (không chặn).M1 - bước 1, 6, 12AC-M1.2sapp-26878-flows.ts:2012-2015,2060-2063,2132-2135; sapp-26878-tool.tsx:1764-1800
BR-03Deal gốc dựng như deal học phí US-03. Deal trừ bắt buộc loai_phi_dich_vu (chỉ Chuyển nhượng), tai_khoan_nhan_phi_dich_vu, bu_san_pham_cung_cap_dich_vu, doi_tuong_mua_hang + nhánh. Deal cộng bắt buộc loai_phi_dich_vu (chỉ Không ghi nhận phí), tai_khoan_nhan_phi_dich_vu, bu_san_pham_cung_cap_dich_vu, co_so_hoc__new_, doi_tuong_mua_hang + nhánh (cccd_ho_chieu/h_t_n hoặc ma_so_thue_cong_ty/ten_cong_ty).M1 - bước 1, 6, 12AC-M1.3sapp-26878-flows.ts:2021,2069-2076,2126-2128,2141-2149,2184-2186
BR-04Deal trừ có bước "Gắn deal gốc" ngay sau bước tạo deal (ghi id Deal gốc vào deal_id_goc_cua_chuyen_doi).M1 - bước 7AC-M1.4sapp-26878-flows.ts:2236-2242
BR-05Bước đơn Ops hiện công thức đơn có id thật: order-out (deal = Deal trừ, service_fee_type = CHUYEN_NHUONG, original_deal_id = Deal gốc, sản phẩm = môn đem chuyển nhượng, final_price âm, service_fee = phí chuyển nhượng) phải tạo trước order-in (deal = Deal cộng, service_fee_type = KHONG_GHI_NHAN_PHI, original_deal_id = Deal trừ, course_packages = gói nhận). Loại phí trên hai đơn "ngược trực giác": người chuyển ra là người trả phí.M1 - bước 8, 13AC-M1.5sapp-26878-flows.ts:2340-2342,2361-2374,2244-2262
BR-06Stage gợi ý: Deal gốc Soạn thảo hợp đồng → Won - Hoàn tất thủ tục; Deal trừ và Deal cộng Thông tin thanh toán → Won - Hoàn tất thủ tục. Kéo Won Deal trừ không sinh sự kiện; Deal cộng là deal duy nhất bắn event, sinh 3 phần tử payloads cho 2 khách hàng (theo hint).M1 - bước 3, 5, 9, 11, 14, 16AC-M1.6sapp-26878-flows.ts:2218-2232,2262-2280,2303-2325
BR-07Bước 17 đồng bộ lại chỉ hóa đơn, ghim vào Deal cộng (story US-14); kèm 3 lưu ý: chỉ đặt trên Deal cộng, đứt mắt xích nào cũng hỏng, payload dựng lại từ đầu (ngày bấm).M1 - bước 17AC-M1.7sapp-26878-flows.ts:2327-2335,2346-2358,775-779

4. Design ​

a. Mối liên hệ giữa các màn & User Flow ​

text
[Chip "US-13 · Chuyển nhượng"] → [M1: Stepper 17 bước, 3 hàng]
  1a Deal gốc (HV chuyển ra) : 1 Tạo deal → 2 Đơn Ops → 3 Soạn thảo HĐ → 4 Giao dịch → 5 Kéo Won
  1b Deal trừ (HV chuyển ra) : 6 Tạo deal → 7 Gắn deal gốc → 8 Đơn chuyển nhượng RA → 9 Thông tin TT → 10 Giao dịch → 11 Kéo Won (không event)
  1c Deal cộng (HV nhận)     : 12 Tạo deal → 13 Đơn chuyển nhượng VÀO → 14 Thông tin TT → 15 Giao dịch → 16 Kéo Won (event)
  → 17 Đồng bộ lại hóa đơn (Deal cộng) → hết luồng

b. Chi tiết từng màn ​

Màn M1 - Stepper flow "US-13 · Chuyển nhượng" ​

FieldValue
Figma frameN/A
Trigger vào mànChọn chip US-13 · Chuyển nhượng (Dev / Staging)
Mô tả ngắnTiêu đề "US-13 · Chuyển nhượng khóa học giữa hai học viên (Deal Won) → SAP"; hint nêu luồng duy nhất gửi 3 phần tử payloads với 2 khách hàng và cảnh báo loại phí ngược trực giác.

Bảng bước

#Tên bướcLoại (US-D03)Ghi gì / ở đâuĐiều kiện chuyển sang bước sau
11a · Tạo deal (Deal gốc)deal (M1)HubSpot deal + contact HV chuyển ra (Dev → dev portal; Staging → prod portal)Deal gốc đã có
21a · Đơn hàng Opsguide (M2)— tay: đơn học phíBấm "Đã hiểu"
31a · Chuyển deal stagestage (M3)Deal gốc → Soạn thảo hợp đồngChuyển thành công
41a · Giao dịch trong đơnguide (M2)— tayBấm "Đã hiểu"
51a · Kéo sang Wonstage (M3)Deal gốc → Won - Hoàn tất thủ tụcChuyển thành công
61b · Tạo deal (Deal trừ)deal (M1)HubSpot deal, cùng contact HV chuyển raDeal trừ đã có
71b · Gắn deal gốclink (M5)Deal trừ deal_id_goc_cua_chuyen_doi = id Deal gốcGọi thành công
81b · Đơn hàng Opsguide (M2)— tay: đơn chuyển nhượng RA (order-out, tạo trước)Bấm "Đã hiểu"
91b · Chuyển deal stagestage (M3)Deal trừ → Thông tin thanh toánChuyển thành công
101b · Giao dịch trong đơnguide (M2)— tayBấm "Đã hiểu"
111b · Kéo sang Wonstage (M3)Deal trừ → Won - Hoàn tất thủ tục (không sinh sự kiện)Chuyển thành công
121c · Tạo deal (Deal cộng)deal (M1)HubSpot deal + contact HV nhận (khác)Deal cộng đã có
131c · Đơn hàng Opsguide (M2)— tay: đơn chuyển nhượng VÀO (order-in)Bấm "Đã hiểu"
141c · Chuyển deal stagestage (M3)Deal cộng → Thông tin thanh toánChuyển thành công
151c · Giao dịch trong đơnguide (M2)— tayBấm "Đã hiểu"
161c · Kéo sang Wonstage (M3)Deal cộng → Won - Hoàn tất thủ tục (bắn event)Chuyển thành công
17Đồng bộ lại hóa đơnresync (M6)Deal cộng trang_thai_dong_bo_hoa_don = Đồng bộ lại (story US-14)Bấm ≥ 1 lần — hết luồng
UI States ​
StateKhi nàoHiển thịFigma frame
DefaultPhiên mớiRail 3 hàng + bước đồng bộ lại; chỉ bước 1 mởN/A
LoadingTải pipeline / stageTheo US-D03 M1, M3N/A
Has dataCó deal trong chuỗiBảng "Chuỗi deal đã dựng (<x>/3)" + công thức đơnN/A
EmptyChưa có dealCông thức đơn còn trống idN/A
ErrorLỗi ở bướcTheo US-D03N/A
Cảnh báoContact sai vai trò"… phải là HAI học viên khác nhau." / "… phải là CÙNG một học viên."N/A
DisabledProdKhông chạy (NFR-D-02)N/A
Fields &ZeroWidthSpace;
FieldRequiredTypeDefaultFormatValidationError MessageVisibilityDepends On
Deal gốc: doi_tuong_mua_hang, thoi_gian_ket_thuc_dao_tao_bo_sung (+ nhánh như US-D04)YesTheo HubSpotDanh tính test—BR-03"Còn thiếu: …"Bước 1—
Deal trừ: loai_phi_dich_vuYesEnum (chỉ Chuyển nhượng)——BR-03"Còn thiếu: …"Bước 6—
Deal trừ: tai_khoan_nhan_phi_dich_vu, bu_san_pham_cung_cap_dich_vu, doi_tuong_mua_hang + nhánhYesTheo HubSpot——BR-03"Còn thiếu: …"Bước 6doi_tuong_mua_hang
Deal cộng: loai_phi_dich_vuYesEnum (chỉ Không ghi nhận phí)——BR-03"Còn thiếu: …"Bước 12—
Deal cộng: tai_khoan_nhan_phi_dich_vu, bu_san_pham_cung_cap_dich_vu, co_so_hoc__new_, doi_tuong_mua_hang + nhánhYesTheo HubSpot——BR-03"Còn thiếu: …"Bước 12doi_tuong_mua_hang
Contact mỗi khốiYesTạo mới / chọn có sẵn——BR-02 (cảnh báo)—Bước 1, 6, 12—
Filter / Search / Sort &ZeroWidthSpace;

N/A — không phải màn List.

Actions &ZeroWidthSpace;
A1 - Tạo deal từng khối (bước 1, 6, 12) &ZeroWidthSpace;
ItemDescription
TriggerBấm "Tạo deal"
BehaviorTheo US-D03 M1 A1 với spec BR-03. ⚠️ Ghi PROD: Staging tạo deal/contact trên portal HubSpot production (NFR-D-03); BE còn route prod (NFR-D-02, OQ-D-02).
Success ResultDeal của khối tạo xong

Error cases:

CaseExpected Handling
Thiếu field"Còn thiếu: …"
A2 - Gắn deal gốc (bước 7) &ZeroWidthSpace;
ItemDescription
TriggerBấm "Gắn deal gốc"
BehaviorTheo US-D03 M5 A1 (BR-04). ⚠️ Ghi PROD: Staging ghi lên portal production (NFR-D-03, OQ-D-02).
Success ResultDeal trừ mang id Deal gốc

Error cases:

CaseExpected Handling
Chưa có Deal gốcKhông gắn được
A3 - Chuyển stage (bước 3, 5, 9, 11, 14, 16) &ZeroWidthSpace;
ItemDescription
TriggerBấm "Chuyển stage"
BehaviorTheo US-D03 M3 A1 (BR-06). ⚠️ Ghi PROD: Staging chuyển stage trên portal production (NFR-D-03, OQ-D-02).
Success ResultDeal ở stage đích

Error cases:

CaseExpected Handling
Deal không do tool tạo13033 (US-D03 BR-08)
A4 - Xác nhận hướng dẫn (bước 2, 4, 8, 10, 13, 15) &ZeroWidthSpace;
ItemDescription
TriggerBấm "Đã hiểu"
BehaviorTheo US-D03 M2; bước 8, 13 hiện công thức đơn (BR-05). Không ghi dữ liệu từ tool.
Success ResultBước xong

Error cases:

CaseExpected Handling
Tạo đơn VÀO trước đơn RATool không kiểm; hướng dẫn yêu cầu đơn RA trước
A5 - Đồng bộ lại hóa đơn (bước 17) &ZeroWidthSpace;
ItemDescription
TriggerBấm "Đồng bộ lại"
BehaviorTheo US-D03 M6 A1 trên Deal cộng (BR-07); lượt ghi vào bucket US-14. ⚠️ Ghi PROD: Staging ghi property trên portal production (NFR-D-03, OQ-D-02).
Success ResultProperty hóa đơn của Deal cộng = Đồng bộ lại

Error cases:

CaseExpected Handling
Property trốngCảnh báo "chưa từng qua SAP"
Acceptance Criteria của màn M1 &ZeroWidthSpace;
AC-M1.1 - Rail 3 hàng, 17 bước, không có sync &ZeroWidthSpace;
gherkin
Given chip "US-13 · Chuyển nhượng" trên Dev
When người dùng mở stepper
Then rail có 3 hàng và bước "Đồng bộ lại hóa đơn"; khối Deal gốc không có bước "Sync gói khóa học"
When người dùng hoàn tất lần lượt 17 bước
Then flow kết thúc ở bước 17

Maps to:

  • Business Rule: BR-01
AC-M1.2 - Hai học viên khác nhau &ZeroWidthSpace;
gherkin
Given Deal trừ gán contact C1 (HV chuyển ra)
When Deal cộng cũng gán C1
Then hiện cảnh báo "… đang gán cùng một contact (C1) nhưng phải là HAI học viên khác nhau."
Given Deal gốc gán C1 và Deal trừ gán C2
Then hiện cảnh báo "… phải là CÙNG một học viên."

Maps to:

  • Business Rule: BR-02
AC-M1.3 - Loại phí thu hẹp theo khối &ZeroWidthSpace;
gherkin
Given bước 6 (Deal trừ) đang mở
Then dropdown loai_phi_dich_vu chỉ có "Chuyển nhượng"
Given bước 12 (Deal cộng) đang mở
Then dropdown loai_phi_dich_vu chỉ có "Không ghi nhận phí" và co_so_hoc__new_ là bắt buộc

Maps to:

  • Business Rule: BR-03
AC-M1.4 - Gắn deal gốc &ZeroWidthSpace;
gherkin
Given đã có Deal gốc G và Deal trừ T
When người dùng chạy bước 7
Then deal_id_goc_cua_chuyen_doi của T = G

Maps to:

  • Business Rule: BR-04
AC-M1.5 - Công thức đơn RA / VÀO &ZeroWidthSpace;
gherkin
Given đã có G, T, P
When người dùng mở bước 8
Then công thức "order-out" ghi "deal_id = Deal trừ T · service_fee_type = CHUYEN_NHUONG · original_deal_id = Deal gốc G · … final_price là SỐ ÂM · service_fee = phí chuyển nhượng"
When mở bước 13
Then công thức "order-in" ghi "deal_id = Deal cộng P · service_fee_type = KHONG_GHI_NHAN_PHI · original_deal_id = Deal trừ T · …"

Maps to:

  • Business Rule: BR-05
AC-M1.6 - Chỉ Deal cộng bắn event &ZeroWidthSpace;
gherkin
Given bước 11 (Kéo sang Won Deal trừ) đang mở
Then hint nói kéo Won ở đây KHÔNG sinh sự kiện
Given bước 16 đang mở
Then hint nói đây là deal DUY NHẤT kéo Won để sinh sự kiện

Maps to:

  • Business Rule: BR-06
AC-M1.7 - Đồng bộ lại chỉ Deal cộng &ZeroWidthSpace;
gherkin
Given Deal cộng đã kéo Won
When người dùng mở bước 17
Then bước ghim vào Deal cộng, chỉ có hóa đơn, hiện 3 lưu ý của story US-14
When bấm "Đồng bộ lại"
Then trang_thai_dong_bo_hoa_don của Deal cộng = "Đồng bộ lại" và lượt ghi vào lịch sử story US-14

Maps to:

  • Business Rule: BR-07
Negative AC / Edge Cases của màn M1 &ZeroWidthSpace;
IDTình huốngHành vi mong đợi
EC-M1.1Đặt Đồng bộ lại lên Deal trừ (ngoài tool)Theo lưu ý: hệ ngoài không gửi, ghi FAILED + mail chỉ rõ Deal cộng
EC-M1.2Đặt lên Deal gốc (ngoài tool)Theo lưu ý: không báo lỗi, đồng bộ nhầm hóa đơn học phí của Deal gốc
EC-M1.3Sửa lệch số môn giữa hai đơnTheo lưu ý: đồng bộ lại lỗi "Số môn nhận chuyển nhượng (N) không bằng số môn chuyển nhượng ra (M)"
EC-M1.4⚠️ Observed: khối dùng "deal có sẵn"Mọi bước còn lại của khối đó tự đánh dấu xong (US-D01 EC-M2.3) → OQ-D-06
EC-M1.5Comment code nói US-13 chưa có bước resyncCode thật đã có bước 17 — Drift DR-D-09

5. Cross-feature AC &ZeroWidthSpace;

AC-X.1 - Kéo Won Deal cộng sinh payload cho 2 khách hàng &ZeroWidthSpace;

gherkin
Given đơn RA và đơn VÀO nối chuỗi đúng
When bước 16 kéo Deal cộng sang Won
Then hệ ngoài gửi 3 phần tử payloads cho 2 khách hàng (Fact theo hint)

Maps to:

  • REL-08 (Be Affected - webhook HubSpot → lms-be → SAP)

AC-X.2 - Kiểm kết quả bằng Log SAP &ZeroWidthSpace;

gherkin
Given chuỗi đã có deal
When người dùng bấm "Log SAP"
Then log SAP của mọi deal trong chuỗi hiển thị theo US-P05

Maps to:

  • REL-03 (Affects - Tra log SAP + quét doanh thu)