Skip to content

US-P05: Tra vết log SAP và theo dõi / kích hoạt đợt quét doanh thu ​

Thuộc FS: 00-overview.md — Nền tảng dùng chung của cụm tool SAPP (as-built @ e77c47a) 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.

FieldValue
US IDUS-P05
Role thực hiệnR1 - Người dùng tool (qua sub-tool sapp.010 — SAPP 26878 "Test data theo luồng") — Assumption (OQ về G-01), xem OQ-P-13
PhaseAs-built (đã triển khai)
PriorityN/A — as-built
StatusDraft
NFR liên quanNFR-P-01, NFR-P-03, NFR-P-04, NFR-P-05 — xem Overview §5
OQ liên quanOQ-P-01, OQ-P-22 — xem Overview §6

Nguồn inventory: A-13, A-14, A-15.

Sub-tool đang dùng dịch vụ này (Fact): chỉ sapp.010 (FS 26878) — tab "Trace", tab "Chạy lượt quét", bước scan / trace trong các flow, modal tra vết mở từ lịch sử run (fe/src/ui/components/works/sapp/sapp-26878-tool.tsx:34-43, :1376, :1489, :2198-2211; fe/src/ui/components/works/sapp/sapp-26878-step-scan.tsx:6). Các FS nhóm khác không gọi. Chi tiết cách 26878 đặt các màn này vào flow → FS 26878 US-D02 / US-D03.

1. US Statement ​

text
As a Người dùng tool (qua sub-tool 26878)  [Assumption — OQ-P-13 / G-01]
I want tra các dòng log mà SAP service ghi cho một deal / event / entry / lớp / giao dịch, xem tiến độ các đợt quét ghi nhận doanh thu, và bắn một lượt quét ngay trên dev/staging
So that dựng và kiểm được dữ liệu test cho kịch bản doanh thu phase 2 mà không phải chờ lượt quét tuần — nguồn: `shared/external/sapp/sapp-26878/0005-sapp-26878-phase2-us04-tra-loi-ops-mind.md:28-30` (đường thay thế "INSERT một dòng `sap_revenue_scan_runs` rồi gọi lượt quét thủ công")

2. Dependencies & Definition Of Ready ​

N/A — đã triển khai (Mode B).

Dependency runtime:

#Cần sẵn sàngAi cung cấpTrạng thái
D1SAPP_SAP_{API_URL,CLIENT_ID,HMAC_SECRET}_<ENV> trong env_systems (US-P04)Admin CMSTheo môi trường
D2SAP service (ngoài mind_keep) chạy; công tắc nghiệp vụ SAP_REVENUE_RECOGNITION_ENABLED bật (phía SAP service)Đội SAPPNgoài hệ thống

3. Business Rules &ZeroWidthSpace;

IDRuleÁp dụng ởĐã cover bởi (AC)Nguồn code (Mode B/C)
BR-01Tra vết và xem đợt quét có trên cả 3 môi trường prod / staging / dev (chỉ đọc); quét thủ công chỉ có dev / stagingM1, M2, M3AC-M1.1, AC-M3.3be/apps/api/src/sapp/sapp.controller.ts:3841-3916, :3991-4015
BR-02Tra vết cần ít nhất một trong 5 khoá lọc: deal_id, event_id, entry_id, class_code, transaction_id; nhiều khoá thì kết hợp AND. Không có khoá → lỗi 13040M1 - Bộ lọcAC-M1.2, EC-M1.1be/libs/modules/src/lib/sapp/sap-log.common.service.ts:132-144, be/libs/constants/src/lib/sapp/sap-log.constants.ts:79-89
BR-03Tra theo deal_id trả cả dòng phase 1 (hoá đơn, tiền về) của deal đóM1AC-M1.3be/libs/modules/src/lib/sapp/sap-log.common.service.ts:156-164, fe/src/ui/components/works/sapp/sap-log-trace.tsx:44-49
BR-04limit phải trong 1–200 (ngoài khoảng → lỗi 13041) và áp cho từng bảng, không phải cả kết quả; màn mặc định limit 50, offset 0M1, M2AC-M1.4, EC-M1.2be/libs/modules/src/lib/sapp/sap-log.common.service.ts:146-154, be/libs/constants/src/lib/sapp/sap-log.constants.ts:72-77, fe/src/ui/components/works/sapp/sap-log-trace.tsx:317-321
BR-05Khoá lọc để trống bị bỏ trước khi gửi (chuỗi rỗng không được coi là điều kiện)M1, M2AC-M1.5be/libs/modules/src/lib/sapp/sap-log.common.service.ts:357-369
BR-06Yêu cầu tra vết / đợt quét được ký HMAC ở BE bằng credential của môi trường; credential không bao giờ tới trình duyệtM1, M2AC-M1.1be/libs/modules/src/lib/sapp/sap-log.common.service.ts:56-68, :165-188
BR-07Thiếu URL / client id / HMAC secret của môi trường → lỗi 13037 "SAP service log API is not configured for this environment" (log nêu tên key thiếu); quét thủ công chỉ cần URLM1, M2, M3EC-M1.3be/libs/modules/src/lib/sapp/sap-log.common.service.ts:79-113, :340-355
BR-08Kết quả tra vết giữ nguyên dữ liệu từng bảng log (vd lesson_entries, event_trackings, logs, scan_runs) kèm số dòng mỗi bảng; màn hiện tóm tắt + dòng thời gian + bảng thô từng bảngM1AC-M1.6be/libs/interface/src/lib/dto/sapp/sap-log.dto.ts:74-86, fe/src/ui/components/works/sapp/sap-log-trace.tsx:420-440
BR-09Chấm màu trạng thái dòng log theo từ khoá, ưu tiên: lỗi (FAIL, ERROR, REJECT, TIMEOUT, CANCEL, INVALID) → đang xử lý (NOT_SYNCED, PENDING, RETRY…) → thành công (SUCCESS, SYNCED, SENT…) → không rõM1 - tóm tắtAC-M1.6fe/src/ui/components/works/sapp/sap-log-summary.tsx:160-200
BR-10Danh sách đợt quét lọc được theo run_type (WEEKLY, MONTH_CLOSE, EVENT_LEAVE, EVENT_RESCHEDULE, EVENT_RESYNC, MANUAL_TEST), from/to (YYYY-MM-DD), limit, offsetM2AC-M2.1fe/src/ui/components/works/sapp/sap-log-trace.tsx:501-508, be/libs/interface/src/lib/dto/sapp/sap-log.dto.ts:48-63
BR-11Quét thủ công bị từ chối trên prod (lỗi 13050) — cả ở tầng dịch vụ lẫn vì không có route prodM3AC-M3.3be/libs/modules/src/lib/sapp/sap-log.common.service.ts:228-236, be/apps/api/src/sapp/sapp.controller.ts:3991-4015
BR-12Kết quả quét thủ công: triggered=true chỉ nghĩa là đã vào hàng đợi (quét chạy bất đồng bộ); triggered=false nghĩa là nghiệp vụ đang tắt bằng công tắc SAP_REVENUE_RECOGNITION_ENABLED — trả như kết quả bình thường, không phải lỗiM3AC-M3.1, AC-M3.2be/libs/modules/src/lib/sapp/sap-log.common.service.ts:215-271, fe/src/ui/components/works/sapp/sapp-26878-step-scan.tsx:118-150
BR-13Lỗi quét thủ công từ SAP service: 403 → 13050, 429 → 13051 (hai lượt phải cách nhau ≥ 1 giây), khác → 13052; thông điệp gốc của SAP service được giữM3EC-M3.1, EC-M3.2be/libs/modules/src/lib/sapp/sap-log.common.service.ts:245-262
BR-14Màn quét thủ công đặt ngay trên danh sách đợt quét để người dùng đọc kết quả thật của lượt vừa bắnM3AC-M3.1fe/src/ui/components/works/sapp/sapp-26878-tool.tsx:2190-2199

4. Design &ZeroWidthSpace;

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

text
[Sub-tool 26878] ─ tab "Trace" ──────→ M1 Tra vết log SAP + M2 Đợt quét (prod/staging/dev)
                ─ tab "Chạy lượt quét" → M3 Quét thủ công (dev/staging) + M2 Đợt quét
                ─ bước scan / trace trong flow, modal trace từ lịch sử → dùng lại M3 / M1
M1: nhập khoá → "Tra log" → tóm tắt + bảng thô
M3: "Chạy lượt quét ngay" → vào hàng đợi / nghiệp vụ TẮT / lỗi → đọc M2

b. Chi tiết từng màn &ZeroWidthSpace;

Màn M1 - Tra vết log SAP &ZeroWidthSpace;

FieldValue
Figma frameN/A — as-built, không có Figma
Trigger vào mànTrong sapp.010: tab "Trace", hoặc modal tra vết theo deal của một run
Mô tả ngắnBộ lọc 5 khoá + limit/offset → tóm tắt, dòng thời gian, bảng thô
UI States &ZeroWidthSpace;
StateKhi nàoHiển thịFigma frame
DefaultChưa traSection "Bộ lọc" + gợi ý "Cần ÍT NHẤT một khóa; nhiều khóa thì AND với nhau. limit áp cho TỪNG BẢNG…"N/A
DisabledChưa có khoá nàoCảnh báo "Chưa có khóa lọc nào — nhập ít nhất một trong deal_id · event_id · entry_id · class_code · transaction_id…"N/A
LoadingĐang traNút "Đang tra…"N/A
Has dataCó kết quảTóm tắt có chấm màu + bảng thô theo thứ tự bảngN/A
EmptyKhông bảng nào có dòngTóm tắt/bảng rỗngN/A
ErrorAPI lỗiLỗi "Không tra được log SAP" + thông điệpN/A
Fields &ZeroWidthSpace;
FieldRequiredTypeDefaultFormatValidationError MessageVisibilityDepends On
deal_idMột trong 5Text— ("27334455")id HubSpotBR-0213040Always—
event_idMột trong 5Text— ("REVENUE_RECOGNITION.…")—BR-0213040Always—
entry_idMột trong 5Text— ("uuid")uuid; phase 2 = external_referenceBR-0213040Always—
class_codeMột trong 5Text— ("ACCA.F2.2609.NEU.01")—BR-0213040Always—
transaction_idMột trong 5Text— ("uuid giao dịch trên Order")uuid; phase 1BR-0213040Always—
limitNoNumber501–200BR-0413041 "limit must be between 1 and 200"Always—
offsetNoNumber0≥ 0——Always—

Nguồn: fe/src/ui/components/works/sapp/sap-log-trace.tsx:38-67, :317-321.

Filter / Search / Sort &ZeroWidthSpace;
LoạiTheo fieldKiểuDefaultNotes
Filter5 khoá lọcfree-text, AND—BR-02
Search———Không có
Sort——Thứ tự SAP service trả—
Paginationlimit / offsetNumber50 / 0Áp từng bảng (BR-04)
Actions &ZeroWidthSpace;
A1 - Tra log &ZeroWidthSpace;
ItemDescription
TriggerBấm "Tra log" (hoặc tự chạy khi mở từ nơi đã biết deal)
BehaviorPOST /api/v1/sapp/<env>/sap-log/trace; BE bỏ khoá rỗng (BR-05), ký HMAC (BR-06), gọi SAP service. Chỉ đọc log SAP của môi trường đã chọn — kể cả prod; không ghi
Success ResultHiện tóm tắt + bảng thô (BR-08, BR-09)

Error cases:

CaseExpected Handling
Không có khoá13040
limit ngoài 1–20013041
Thiếu cấu hình13037
SAP service lỗi13038 "Failed to trace SAP log"
Acceptance Criteria của màn M1 &ZeroWidthSpace;
AC-M1.1 - Tra vết trên prod (chỉ đọc) &ZeroWidthSpace;
gherkin
Given môi trường prod có đủ SAPP_SAP_*_PROD
When người dùng nhập deal_id và bấm "Tra log"
Then nhận được các bảng log của deal trên SAP service prod; không có dữ liệu nào bị ghi

Maps to:

  • Business Rule: BR-01, BR-06
AC-M1.2 - Nhiều khoá kết hợp AND &ZeroWidthSpace;
gherkin
Given người dùng nhập class_code và deal_id
When tra
Then chỉ trả dòng khớp cả hai khoá

Maps to:

  • Business Rule: BR-02
AC-M1.3 - Tra theo deal có cả phase 1 &ZeroWidthSpace;
gherkin
Given deal có hoá đơn và tiền về (phase 1) và dòng doanh thu theo buổi (phase 2)
When tra theo deal_id
Then kết quả có cả dòng phase 1 và phase 2

Maps to:

  • Business Rule: BR-03
AC-M1.4 - limit áp từng bảng &ZeroWidthSpace;
gherkin
Given limit = 50
When tra một lớp có 80 dòng sổ cái và 70 dòng log
Then mỗi bảng trả tối đa 50 dòng (không phải 50 dòng tổng)

Maps to:

  • Business Rule: BR-04
AC-M1.5 - Khoá rỗng bị bỏ &ZeroWidthSpace;
gherkin
Given người dùng nhập deal_id và để class_code rỗng
When tra
Then điều kiện gửi đi chỉ có deal_id

Maps to:

  • Business Rule: BR-05
AC-M1.6 - Tóm tắt có chấm màu &ZeroWidthSpace;
gherkin
Given một dòng log có trạng thái "SYNC_FAILED"
When hiển thị tóm tắt
Then dòng đó được chấm màu "lỗi" (ưu tiên hơn "đang xử lý" và "thành công")
And bảng thô vẫn hiện nguyên cột và giá trị gốc

Maps to:

  • Business Rule: BR-08, BR-09
Negative AC / Edge Cases của màn M1 &ZeroWidthSpace;
IDTình huốngHành vi mong đợi
EC-M1.1Gọi API không có khoá nào13040 "At least one of deal_id, event_id, entry_id, class_code, transaction_id is required"
EC-M1.2limit = 50013041
EC-M1.3Thiếu SAPP_SAP_HMAC_SECRET_STAGING13037; log BE nêu tên key thiếu
EC-M1.4⚠️ Observed — Route tra vết public, không cần đăng nhậpAi có URL API đều đọc được log SAP prod (NFR-P-01, OQ-P-01)

Màn M2 - Đợt quét (phase 2) &ZeroWidthSpace;

FieldValue
Figma frameN/A — as-built, không có Figma
Trigger vào mànTrong sapp.010: dưới M1 (tab "Trace") và dưới M3 (tab "Chạy lượt quét")
Mô tả ngắnDanh sách lượt quét doanh thu thực hiện; thứ đáng đọc nhất là counters từng dòng
UI States &ZeroWidthSpace;
StateKhi nàoHiển thịFigma frame
Default / Has dataTải xongSection "Đợt quét (phase 2)" + bộ lọc + danh sáchN/A
LoadingĐang tảiBộ lọc vô hiệuN/A
EmptyKhông có lượtDanh sách rỗngN/A
ErrorAPI lỗi"Không tải được danh sách đợt quét"N/A
DisabledĐang tảiÔ lọc vô hiệuN/A
Fields &ZeroWidthSpace;
FieldRequiredTypeDefaultFormatValidationError MessageVisibilityDepends On
run_typeNoDropdown"— Tất cả —"6 giá trị BR-10enum—Always—
limitNoNumber501–200BR-0413041Always—
from / toNoDate—YYYY-MM-DD——Always—
Filter / Search / Sort &ZeroWidthSpace;
LoạiTheo fieldKiểuDefaultNotes
Filterrun_typedropdownTất cảBR-10
Filterfrom / todate range—
Search———Không có
Sort——Thứ tự SAP service trả
Paginationlimit / offsetNumber50 / 0
Actions &ZeroWidthSpace;
A1 - Tải danh sách đợt quét &ZeroWidthSpace;
ItemDescription
TriggerMở màn / đổi bộ lọc
BehaviorPOST /api/v1/sapp/<env>/sap-log/scan-runs (ký HMAC). Chỉ đọc SAP service; không ghi
Success ResultDanh sách lượt quét với counters

Error cases:

CaseExpected Handling
SAP service lỗi13039 "Failed to get SAP revenue scan runs"
Thiếu cấu hình13037
Acceptance Criteria của màn M2 &ZeroWidthSpace;
AC-M2.1 - Lọc theo loại lượt &ZeroWidthSpace;
gherkin
Given có lượt WEEKLY và MANUAL_TEST
When chọn run_type = MANUAL_TEST
Then chỉ hiện lượt MANUAL_TEST

Maps to:

  • Business Rule: BR-10
Negative AC / Edge Cases của màn M2 &ZeroWidthSpace;
IDTình huốngHành vi mong đợi
EC-M2.1Vừa bắn quét thủ công, danh sách chưa có lượt mớiHành vi đúng thiết kế: quét chạy bất đồng bộ — đọc lại sau (BR-12)

Màn M3 - Chạy lượt quét doanh thu (quét thủ công) &ZeroWidthSpace;

FieldValue
Figma frameN/A — as-built, không có Figma
Trigger vào mànTrong sapp.010: tab "Chạy lượt quét", hoặc bước scan của flow phase 2
Mô tả ngắn"Bắn một lượt quét doanh thu NGAY, bỏ điều kiện chỉ-chạy-Thứ-7 của lượt quét tuần. Cửa sổ phủ tới HẾT HÔM NAY…" (fe/src/ui/components/works/sapp/sapp-26878-manual-scan.tsx:16)
UI States &ZeroWidthSpace;
StateKhi nàoHiển thịFigma frame
DefaultChưa bắnNút "Chạy lượt quét ngay"N/A
LoadingĐang bắn"Đang bắn lượt quét…"N/A
Has data (queued)triggered=true"Đã đưa lượt quét vào hàng đợi" + "⚠ Mới là vào hàng đợi, chưa phải quét xong…"; nút thành "Chạy lại"N/A
Has data (tắt)triggered=false"Nghiệp vụ đang TẮT — không có lượt quét nào chạy" + "SAP_REVENUE_RECOGNITION_ENABLED đang bằng false. Đây là công tắc rollback, không phải lỗi…"N/A
ErrorLỗi"Không chạy được lượt quét" (+ "Nhịp chặn tối thiểu 1 giây giữa hai lượt…" khi 429)N/A
DisabledMôi trường prod"Lượt quét thủ công không chạy trên production — đúng thiết kế."N/A

Nguồn: fe/src/ui/components/works/sapp/sapp-26878-step-scan.tsx:95-166.

Fields &ZeroWidthSpace;

N/A — màn chỉ có nút, không có field nhập.

Filter / Search / Sort &ZeroWidthSpace;

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

Actions &ZeroWidthSpace;
A1 - Chạy lượt quét ngay &ZeroWidthSpace;
ItemDescription
TriggerBấm "Chạy lượt quét ngay" / "Chạy lại"
BehaviorGET /api/v1/sapp/<dev|staging>/sap-log/manual-scan (không ký). SAP service đưa một lượt quét vào hàng đợi trên dev hoặc staging; lượt quét ghi sổ doanh thu phía SAP service của môi trường đó. Không có đường ghi PROD (BR-11)
Success ResultMột trong hai kết quả bình thường của BR-12

Error cases:

CaseExpected Handling
Hai lượt cách nhau < 1 giây13051
SAP service trả 40313050
Lỗi khác13052 kèm thông điệp gốc
Acceptance Criteria của màn M3 &ZeroWidthSpace;
AC-M3.1 - Vào hàng đợi &ZeroWidthSpace;
gherkin
Given môi trường staging, nghiệp vụ đang bật
When bấm "Chạy lượt quét ngay"
Then hiện "Đã đưa lượt quét vào hàng đợi" kèm cảnh báo chưa phải quét xong
And lượt mới xuất hiện ở M2 khi SAP service xử lý xong

Maps to:

  • Business Rule: BR-12, BR-14
AC-M3.2 - Nghiệp vụ tắt không phải lỗi &ZeroWidthSpace;
gherkin
Given SAP_REVENUE_RECOGNITION_ENABLED = false ở SAP service dev
When bấm "Chạy lượt quét ngay"
Then hiện "Nghiệp vụ đang TẮT — không có lượt quét nào chạy" (không phải hộp lỗi)

Maps to:

  • Business Rule: BR-12
AC-M3.3 - Prod bị chặn &ZeroWidthSpace;
gherkin
Given người dùng chọn prod
When mở màn quét thủ công
Then thấy "Lượt quét thủ công không chạy trên production — đúng thiết kế."
And gọi thẳng dịch vụ với prod thì bị từ chối 13050; không có route prod

Maps to:

  • Business Rule: BR-01, BR-11
Negative AC / Edge Cases của màn M3 &ZeroWidthSpace;
IDTình huốngHành vi mong đợi
EC-M3.1Bấm hai lần liền nhauLượt hai: 13051 "Manual sweeps must be at least 1 second apart"
EC-M3.2⚠️ Observed — SAP service trả 403 vì lý do khác prodVẫn báo mã 13050 "…cannot run against production" (kèm thông điệp gốc) — be/libs/modules/src/lib/sapp/sap-log.common.service.ts:249-254; OQ-P-22
EC-M3.3Thiếu SAPP_SAP_API_URL_DEV13037

5. Cross-feature AC &ZeroWidthSpace;

AC-X.1 - 26878 dùng lại màn, không mô tả lại &ZeroWidthSpace;

gherkin
Given FS 26878 có bước trace / scan trong flow và tab Trace / Chạy lượt quét
When đặc tả các bước đó
Then FS 26878 tham chiếu US-P05 cho hành vi tra vết, đợt quét, quét thủ công

Maps to:

  • REL-05 (Be Affected - FS 26878)

AC-X.2 - Phụ thuộc SAP service &ZeroWidthSpace;

gherkin
Given lượt quét tuần do cron ở SAP service (ngoài mind_keep) chạy
When SAP service không chạy hoặc công tắc nghiệp vụ tắt
Then mind_keep chỉ phản ánh kết quả SAP service trả về

Maps to:

  • REL-08 (Affects - SAP service)