Skip to content

Chỉ mục bàn giao (Delivery Index) — Ví KM 2 (Promotion Wallet 2)

File này dùng để làm gì: cho team biết phải đọc file nào trước, file nào là canonical, và còn blocker gì sau đợt review/regenerate này. Nên đọc trước: Danh sách file -> Điểm còn mở / blocker -> Gate kỹ thuật trước merge / bàn giao QA -> Kế hoạch triển khai.

TrườngGiá trị
FeatureVí Khuyến Mãi 2 (Promotion Wallet 2)
Phiên bản1.6
Ngày28/04/2026
Độ phức tạpL

Đầu vào chuẩn (Canonical Inputs)

FileVai tròNếu xung đột
SOURCE_OF_TRUTH.mdNguồn sự thật chuẩn + khóa giải phápƯu tiên cao nhất
decision-brief.mdCửa vào package, tóm tắt phạm vi/ảnh hưởng/rủi roChỉ định hướng, không thay file chịu trách nhiệm
go-live-checklist.mdReadiness, deploy order, rollback, monitoringFile owner của release gates

Danh sách file

#FileNgười đọcGhi chú
1Tóm tắt quyết địnhPO, TL, Delivery, Tất cảĐọc đầu tiên: tóm tắt 5 phút, phạm vi, rủi ro, file cần đọc tiếp
2Gói bằng chứngPO, TL, QA, Tất cảBằng chứng code/screen/config thật; đọc trước khi tin vào tài liệu dẫn xuất
3Nguồn sự thật chuẩnPO, TL, FE, BE, QANguồn sự thật chuẩn + khóa giải pháp của bản regen
4PRDPO, Tech Lead, Tất cảView business/decision/formula đã được đặt dưới canonical layer
5Đặc tả UIUI/UX, FE DevUI delta và flows; nếu khác SoT thì SoT thắng
6Đặc tả kỹ thuậtBE Dev, FE Dev, Tech LeadẢnh hưởng kỹ thuật, data model, FIFO Go action, report/fund/print impact
7Kế hoạch kiểm thửQACoverage/test data/traceability; dùng cùng SoT làm nền
8Checklist phát hànhOps, TL, QARelease gates, rollback, monitoring cho wallet/payment rủi ro
9Design docTất cảDesign intent ban đầu; không còn là nguồn truth cao nhất

Ai đọc gì

Vai tròĐọcTrọng tâm
PO/BATóm tắt quyết định → PRD: A0 → Z → A5 → A10Duyệt requirements, formulas, kế toán
UI/UXPRD: A0 + A5 FR-012. Đặc tả UI: B0-B9 + B-FR012Thiết kế màn mới + rà delta 8 màn cũ
Tech LeadPRD: A0 → Z. Đặc tả kỹ thuật: C1-C4/C8/C11. Handoff: TG-001..TG-007Duyệt architecture, FIFO Go action, cross-DB snapshot, Dynamic Permission v2, gate trước merge
FE DevĐặc tả UI: B2.1-B9 + B-FR012. Đặc tả kỹ thuật: C5-C6Triển khai 8 màn mới + delta 8 màn cũ
BE DevĐặc tả kỹ thuật: C1-C12. PRD: A10 (4 formulas)FIFO action, event handler, scheduler, 30+ files sửa
QAPRD: A5. Kế hoạch kiểm thử: D1-D580 TCs, focus race condition + multi-payment + Dynamic Permission v2 + FR-012 + impact boundary regression
Ops/TLChecklist phát hành: E1-E6Deploy gates, rollback, monitoring

RACI

Hạng mục bàn giaoPOTLUI/UXFE DevBE DevQA
PRDACIIII
Đặc tả UI — màn mới (B2.1-B9)CIRCII
Đặc tả UI — delta FR-012 (B-FR012)CIRCII
Đặc tả kỹ thuậtIAICRI
Kế hoạch kiểm thửCIIIIR
Checklist phát hànhIAIICC
Migration + HasuraIARI
FE ComponentsIICRI

Kế hoạch triển khai

MốcMục tiêuPhụ tráchPhụ thuộc
1. BE Phase 1a — DB migrations + wallet constants + Go action deduct_km2_paymentT+7 ngàyBE Dev
2. BE Phase 1b — Payment flow (payment_order, order_confirm) + scheduler + event handlersT+12 ngàyBE DevSau #1
3. FE Phase 1 — Config + PrepaidCard form + Payment method + FR-012 Phase 1 (mỹ phẩm, sản phẩm, invoice, fund)T+14 ngàyFE DevSau #1 deploy
4. QA Phase 1 — Test bán Gói Ví KM2 + thanh toán + multi-payment + FR-012T+17 ngàyQASau #2 + #3
5. BE Phase 2 — Refund flow + refund_km2_wallet trong Yêu cầu hoàn tiền + withdrawT+22 ngàyBE DevSau Phase 1 pass
6. FE Phase 2 — Tab Ví KM 2 profile + Form Hoàn ví KM2 + FR-012 Phase 2 (report DV/NV, CRM)T+24 ngàyFE DevSau #5
7. QA Phase 2 — Test refund + Hoàn ví KM2 + permission v2 + profile + reportT+27 ngàyQASau #5 + #6
8. Phase 3 — Report dashboard KM2 + Dashboard PTTT updateT+37 ngàyTất cảSau Phase 2 pass + PO chốt PD-001
9. Go-LiveTheo lịch releaseTL + Ops + QAE1-E6 pass trong go-live-checklist.md

Điểm còn mở / blocker

IDHạng mụcPhụ tráchHạn chótTrạng tháiCó block không?
PD-001Vị trí Report dashboard trong menuPOTrước Phase 3MởKhông block Phase 1/2
TL-001Review final C3/C5 về idempotency + expiry guard cho deduct_km2_paymentTL + BETrước payment implementationSẵn sàng kickoffKhông — acceptance checkpoint trong P1
BE-001Grep full hardcode wallet / wallet_promotion / VND_PROMOTION để lập implementation checklistBE DevĐầu P1Sẵn sàng kickoffKhông — task bắt buộc trong P1
OPS-001ZNS template đăng ký với Zalo providerOpsTrước khi bật FR-011MởKhông block core nếu FR-011 chưa bật
BE-002Fix Invoice struct thiếu WalletPromotionAmount (bug hiện tại)BE DevPhase 1MởKhông — fix trong P1

Sprint 0 — Checklist 1 tuần kickoff (BẮT BUỘC trước Phase 1)

Mục tiêu: giảm rủi ro tech debt + design ambiguity trước khi BE bắt đầu code Phase 1. Sprint 0 không phải Phase 1; là pre-work. Hoàn tất 7 task dưới đây thì Phase 1 mới được kickoff.

Thời lượng: 5 ngày làm việc. Daily standup 9:00 sáng review tiến độ.

Pass criteria: mỗi task có cột Bằng chứng pass được TL ký xác nhận. Sprint 0 close khi 7 task đều có ✅.

IDTaskOwnerEffortBằng chứng passBlock Phase 1 nếu thiếu?
S0-01BE-001 Grep hardcode — chạy grep toàn repo diva-backend/ cho 3 keyword wallet_promotion, VND_PROMOTION, wallet_type_id; phân loại mỗi occurrence thành sửa cho KM2 / giữ nguyên có lý do / không liên quan; output sang Google Sheet hoặc BE_HARDCODE_AUDIT.md trong repoBE Dev1 ngàySheet/file có 100% occurrence được phân loại; TL review + sign — nếu thiếu thì task P1-04..P1-07 không biết scope
S0-02TL-001 Idempotency design review — TL đọc dev-spec C5.4.1 mới, viết docs/features/vi-km-2/design-notes/idempotency-review.md trả lời: (a) có đồng ý dedup window 7 ngày? (b) có đồng ý lock TTL 90s? (c) có đồng ý attempt_id gen ở client thay vì server? (d) edge case nào còn miss?TL0.5 ngàyFile design-notes commit; 7 test case TC-IDEMPOTENT-01..07 được TL approve — không có thì BE code có rủi ro phải refactor
S0-03Cross-DB snapshot POC — viết script test: tạo prepaid_cardecommerce DB → tạo wallet_km2_lotwallet DB với snapshot fields; verify Hasura có thể query lot + JOIN logic FE-side với prepaid_card (vì cross-DB join không hỗ trợ); test scenario Admin sửa giá Gói sau bán → lot cũ giữ nguyên giá snapshotBE Dev1 ngàyPOC script + screenshot Hasura query + test pass cho 3 case (snapshot OK, sửa giá không ảnh hưởng lot, FE-side join hoạt động) — pattern này dùng xuyên suốt; sai sẽ cần redesign C4
S0-04TG-001 Refund handler subtask — TL + BE chia subtask cho refund_km2_wallet behavior: 1 subtask FE (option dialog SCR-07), 1 subtask BE handler, 1 subtask QA test cases; verify backend refund hiện tại không hard-code wallet_type_id='VND_PROMOTION' ở các path ngoài transaction_request (nếu có thì list ra)TL + BE + FE0.5 ngày3 ticket Linear/Jira tạo với scope rõ; danh sách hard-code path khác (nếu có) đính kèmKHÔNG Phase 1 — nhưng block Phase 2 nếu thiếu
S0-05BE-002 Fix Invoice struct bug — fix bug hiện tại: pkg/store/invoice.go thiếu field WalletPromotionAmount cho KM1; merge fix này trước khi vào KM2 work để FR-012 hoá đơn in render đúng KM1 trước, KM2 sauBE Dev0.5 ngàyPR merged; smoke test render hoá đơn có KM1 hiển thị đúng — fix lẫn lộn KM1/KM2 nếu để sau
S0-06Capacity model verify — TL review dev-spec C9 mới (capacity ước lượng + index strategy); verify ước lượng row count với 1 spa thật đang dùng KM1 (lấy COUNT từ wallet_promotion history); confirm partial index strategy + threshold partitionTL0.5 ngàyComment trong dev-spec C9 ghi "đã verify với data spa X" + giá trị thậtKHÔNG — chỉ block Phase 2
S0-07Monitoring instrumentation kickoff — BE list 23 metric trong dev-spec C10 mới, tạo template Prometheus client code (Go); Ops tạo Grafana dashboard skeleton; QA viết runbook stub RUNBOOK-KM2-01..05 (chỉ cần action steps, không cần đầy đủ)BE + Ops + QA1 ngàyCode template commit + dashboard URL + 5 file runbook stubKHÔNG Phase 1 code — nhưng block Day-0

Gate Sprint 0 close (TL ký)

  • [ ] 7 task có bằng chứng pass
  • [ ] TL review tổng + commit SPRINT_0_REPORT.md tóm tắt findings (đặc biệt nếu S0-01 phát hiện thêm impact ngoài scope hiện tại)
  • [ ] PO + TL agree go/no-go Phase 1
  • [ ] Nếu Sprint 0 phát hiện scope tăng > 30% → quay lại update SOURCE_OF_TRUTH.md + dev-spec; KHÔNG kickoff Phase 1 với scope cũ

Gate kỹ thuật trước merge / bàn giao QA

Các gate dưới đây là checklist bắt buộc để giảm rủi ro kỹ thuật khi team bắt đầu implement. Phase 1/2 được kickoff ngay, nhưng code liên quan không được merge lên staging/UAT nếu gate tương ứng chưa có bằng chứng pass.

GatePhạm vi kiểm soátOwnerBằng chứng cần cóĐiều kiện pass
TG-001Luồng Hoàn ví KM2 trong Yêu cầu hoàn tiềnTL + FE + BE + QASubtask riêng cho refund_km2_wallet; diff FE/BE; test tạo/duyệt/thực hiện hoànUI có option "Hoàn ví KM2"; request dùng behavior refund_km2_wallet; không hard-code wallet_type_id='VND_PROMOTION'; hoàn đúng lot KM2, ghi deduction/audit, không rơi nhầm luồng KM1
TG-002Hard-code KM1 / wallet promotionTL + BE + FEKết quả grep "wallet_promotion", "VND_PROMOTION", "wallet_type_id" và phân loại sửa / giữ nguyên có lý do / không liên quanKhông còn occurrence chưa phân loại trong payment, invoice, fund, print, report, notification, customer profile; KM1 và KM2 có field/label/semantics tách riêng
TG-003FIFO deduction, idempotency, expiry guardTL + BEReview note thiết kế transaction; test race condition/retry; log idempotencydeduct_km2_payment dùng transaction lock theo lot, chống double submit bằng idempotency key, luôn check expired_at > NOW() trước khi trừ tiền, rollback đúng khi payment fail
TG-004DB / Hasura / codegen contractBE + FEMigration applied trên staging clone; metadata reload; GraphQL codegen outputwallet_km2_lot, wallet_km2_lot_deduction, wallet_km2_config, action get_customer_km2_lots, deduct_km2_payment, refund_km2_wallet và các field KM2 xuất hiện đúng contract dev-spec
TG-005Dynamic Permission v2 runtime mappingTL + BE + FE + QASeed module_permission_action; role_module.actions; ModuleOperationMapping; test grant/revoke/API no-leakKM2 không hard-code theo role name; FE ẩn/hiện theo quyền; backend chặn API trực tiếp khi thiếu quyền, sai portal hoặc ngoài branch scope
TG-006Scheduler, rollback, monitoringTL + Ops + BECron dry-run; metric/log dashboard; rollback rehearsalScheduler không trừ nhầm lot đang hợp lệ; disable config/cron rollback được; có metric/log cho deduction error, scheduler error, expired balance và duplicate deduction
TG-007Impact boundary regressionQA + TLChạy đủ TC-IMPACT-*; danh sách affected/unaffected đã tick kết quảFlow bị ảnh hưởng được thêm KM2 đúng chỗ; flow không ảnh hưởng không bị đổi dữ liệu, route, quyền hoặc báo cáo ngoài phạm vi

Luồng Hoàn ví KM2 cần chốt khi giao task

Điểm kiểm soátYêu cầu khi implement
Entry pointDùng màn Yêu cầu hoàn tiền hiện có, thêm option nghiệp vụ "Hoàn ví KM2"; không tạo module duyệt mới.
BehaviorDùng refund_km2_wallet; không dùng lại behavior KM1 nếu behavior đó đang gắn mặc định VND_PROMOTION.
Dữ liệu bắt buộcCustomer, Gói Ví KM2/lot KM2, số tiền hoàn, phí hoàn nếu có, phương thức nhận hoàn, chứng từ, lý do, reviewer step.
Wallet/lot updateHoàn phải cập nhật đúng wallet_km2_lot / wallet_km2_lot_deduction, không chỉ ghi wallet_balance tổng.
PermissionDùng refund_request_management_submenu:access/create/update/approve/payment + reviewer config + branch scope.
QA oracleTạo request, sửa request, duyệt, từ chối, thực hiện hoàn, hoàn partial/full, lot hết hạn, thiếu quyền, khác branch.

Lưu ý quan trọng cho team

Logic kế toán (xem PRD FR-003 + FR-004)

MUA GÓI VÍ KM2:
  Khách trả 500k → Thực thu = 500k (giá mua gói)
                  → Ví KM 2 = +5,000,000đ (toàn bộ vào KM2)
                  → Ví VND = 0, Ví KM 1 = 0
                  → Commission tính trên giá mua gói (500k)
  Khác KM1: KM1 chia base→VND + bonus→KM1. KM2: toàn bộ vào KM2.

THANH TOÁN BẰNG KM2:
  Đơn 1tr → KM2 trả 140k + tiền mặt 860k
  → Thực thu = 860k (chỉ tiền mặt)
  → KM2 không tính thực thu, không tính customer points
  → Không ảnh hưởng hạng thành viên (hạng dựa trên thực thu)

THANH TOÁN NHIỀU LẦN (mua Gói Ví KM2):
  Ví nhận theo tỉ lệ đã trả. Lot tạo từ lần trả đầu tiên.
  VD: trả 60% → ví nhận 60% giá trị. Trả nốt 40% → ví nhận 40%.

Kiến trúc đặc biệt

  • FIFO deduction: Go action handler deduct_km2_payment dùng direct PostgreSQL tx (DEC-018) — KHÔNG qua Hasura GraphQL vì cần SELECT FOR UPDATE
  • Cross-DB: wallet_km2_lot snapshot giá mua gói (DEC-016) — KHÔNG join cross-DB sang ecommerce
  • Dynamic Permission v2: Không hard-code role name; quyền thực tế = role_module.actions + portal + branch_mode + backend enforcement. Customer profile dùng action get_customer_km2_lots; Hoàn ví KM2 dùng refund_request_management_submenu:access/create/update/approve/payment + reviewer config (DEC-025/026)
  • Default enablement: migration seed config KM2 ở trạng thái disabled=true; chỉ bật trong go-live sau khi readiness pass (DEC-023)
  • Trả góp: KHÔNG cho mua Gói Ví KM2 bằng trả góp (DEC-017)

Ảnh hưởng màn hình cũ (FR-012)

Phase 1 PHẢI sửa (sẽ break nếu không):

  • Đơn mỹ phẩm: CosmeticOrderFormPayment + table + multi-payment
  • Đơn sản phẩm: ProductOrderItems (allow_promo_wallet_2)
  • Hoá đơn in: print_invoice_popup.go, InvoiceTemplatePopupPrint.tsx
  • Fund/Quỹ: FundTable, FundInvoicePopup

Phase 2 nên sửa (data sẽ thiếu):

  • Withdraw detail, Report DV/NV, CRM Customer

KHÔNG cần sửa:

  • OrderCard, CustomerOrderHistory (card không breakdown)
  • Dashboard (Phase 3)
  • Rank/Loyalty (KM2 không tính thực thu → không ảnh hưởng hạng)

Checklist trước khi dev bắt đầu

  • [ ] PO ký duyệt Tóm tắt quyết định + PRD — đặc biệt: bảng kế toán FR-003/004, hoàn ví KM2 FR-009, multi-payment DEC-019, report PD-001
  • [ ] Tech Lead rà soát Đặc tả kỹ thuật — trọng tâm: DEC-018 FIFO Go action, DEC-022 idempotency/expiry guard, DEC-016 cross-DB snapshot, DEC-024/025 Dynamic Permission v2, C2 Ảnh hưởng 30+ files
  • [ ] Tech Lead tạo checklist/subtask theo TG-001..TG-007 — mỗi gate có owner, bằng chứng pass và trạng thái trước khi merge staging/UAT
  • [ ] UI/UX rà soát Đặc tả UI — trọng tâm: B-FR012 delta 8 màn cũ, SCR-03 đối chiếu UI thực tế, SCR-07 form Hoàn ví KM2 mới
  • [ ] QA rà soát Kế hoạch kiểm thử — 80 TCs, focus TC-004-09/11/12, TC-006-06, TC-009-05/06/07/08, TC-PERM-*, TC-012 và TC-IMPACT regression
  • [ ] Ops/TL rà soát Checklist phát hành — E1-E6 tiêu chí pass, rollback, monitoring
  • [ ] Ops đăng ký ZNS template với Zalo nếu PO bật FR-011 cho rollout
  • [ ] BE Dev grep "wallet_promotion" toàn bộ codebase → liệt kê full list files cần sửa (RSK-002)
  • [ ] FE Dev đối chiếu Đặc tả UI SCR-03 với màn hình "Tạo Mới Nạp Tiền" thực tế