Giao diện
US-D02: Xem lịch sử run và log SAP của một flow ​
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-08, A-09, A-10.
| Field | Value |
|---|---|
| US ID | US-D02 |
| Role thực hiện | R1 - Người dùng tool (Assumption (OQ về G-01), OQ-D-05) |
| Phase | As-built (đã triển khai) — dùng chung cho mọi flow |
| Priority | N/A (as-built) |
| Status | Draft |
| NFR liên quan | NFR-D-01, NFR-D-02, NFR-D-03, NFR-D-04, NFR-D-05, NFR-D-08 — xem Overview §5 |
| OQ liên quan | OQ-D-01, OQ-D-03, OQ-D-04, OQ-D-17 — xem Overview §6 |
1. US Statement ​
text
As a Người dùng tool (Assumption — OQ về G-01)
I want tra log SAP của các deal mà lượt test hiện tại đã tạo, và xem lại các lượt test trước của flow
(lấy lại deal id, bắn đồng bộ lại cho deal cũ)
So that [Assumption] tìm lại dữ liệu test sau khi tải lại trang / đổi chip / đổi portal (những thao tác làm mất
stepper) và kiểm tra SAP đã xử lý deal ra sao2. Dependencies & Definition Of Ready ​
N/A — đã triển khai (Mode B). Dependency runtime:
| # | Cần sẵn sàng | Ai cung cấp | Trạng thái |
|---|---|---|---|
| D1 | Redis của mind_keep (lưu run) | BE | N/A — runtime |
| D2 | Cấu hình tra log SAP theo môi trường (→ US-P04, US-P05) | Admin CMS | N/A — runtime |
3. Business Rules ​
| ID | Rule | Áp dụng ở | Đã cover bởi (AC) | Nguồn code (Mode B/C) |
|---|---|---|---|---|
| BR-01 | "Log SAP" tra log SAP theo mọi deal id mà phiên hiện tại đã tạo, theo thứ tự chuỗi; khi chưa có deal nào thì nút tắt, tooltip "Chưa có deal nào để tra log — tạo deal ở bước 1 trước". Việc tra log do dịch vụ nền tảng làm (US-P05). | M1 - action Log SAP | AC-M1.1, AC-M1.2 | sapp-26878-tool.tsx:957-960,1001-1014,1375-1381 |
| BR-02 | Mỗi lần tạo xong một deal trong stepper, tool ghi (hoặc cập nhật) một bản ghi lượt test cho phiên hiện tại, định danh bằng mã phiên; bản ghi chứa danh sách deal của chuỗi (nhãn, deal id, tên deal, contact id, chế độ mới / có sẵn). | Hệ thống - ghi run | AC-M2.1 | sapp-26878-tool.tsx:1317-1340; common.service.ts:1134-1171; sapp-26878.dto.ts:187-215 |
| BR-03 | Ghi lượt test là "bắn rồi quên": lỗi ghi không được báo cho người dùng và không làm thao tác vừa thành công bị coi là lỗi. | Hệ thống - ghi run | AC-M2.2 | sapp-26878-tool.tsx:1335-1340; sapp-26878-history.tsx:92-101 |
| BR-04 | Modal "Lịch sử" liệt kê các lượt test của flow trên portal đang chọn, mới nhất trước; mỗi lượt hiện thời điểm cập nhật, portal, số deal, thời điểm bắt đầu (nếu khác), và từng deal kèm nút sao chép id, nút "Log SAP" riêng cho deal đó. Không mở lại lượt test vào stepper. | M2 | AC-M2.1, AC-M2.3 | sapp-26878-history.tsx:46-105,106-215 |
| BR-05 | Nút đồng bộ lại trong Lịch sử chỉ hiện cho deal + loại (hóa đơn / reconcile) mà chính flow khai báo ở bước resync; deal không được phép hiện "Mắt xích trung gian — đặt trên deal ghi nhận doanh thu". (Chuỗi US-11 / US-13 chỉ Deal cộng + hóa đơn; US-03 / 05 / 06 cả hai.) | M2 - action Đồng bộ lại | AC-M2.4 | sapp-26878-flows.ts:2458-2470; sapp-26878-history.tsx:150-200 |
| BR-06 | Bấm đồng bộ lại trong Lịch sử ghi Đồng bộ lại lên property tương ứng của deal (HubSpot) và tạo một bản ghi mới trong nhóm lịch sử của story đồng bộ lại (US-08/09/10/12/14). | M2 - action Đồng bộ lại | AC-M2.5 | sapp-26878-history.tsx:79-105; sapp-26878-tool.tsx:1526-1545 |
⚠️ Observed (không viết thành BR, xem AC/EC):
- Giới hạn lưu run: chỉ Redis, TTL 30 ngày (làm mới mỗi lần ghi), tối đa 50 run / flow / portal (AC-M2.6, OQ-D-17).
- BE bỏ
trigger/sourceRunId/sourceFlowkhi lưu (EC-M2.2, OQ-D-01, DR-D-01).- Nút "Lịch sử" ở flow phase 2 có thể lỗi khi mở (EC-M2.3, OQ-D-04); bucket phase 2 được ghi dù BE không khai (EC-M2.4, OQ-D-03, DR-D-02).
4. Design ​
a. Mối liên hệ giữa các màn & User Flow ​
text
[Stepper của flow (US-D01.M2)]
├─ tạo xong deal ──→ (hệ thống) ghi / cập nhật lượt test trên Redis
├─ bấm "Log SAP" ──→ [M1: Modal Log SAP — các deal của phiên] (tra log → US-P05)
└─ bấm "Lịch sử" ──→ [M2: Modal Lịch sử test]
├─ "Log SAP" của một deal ──→ [M1 với 1 deal]
└─ "hóa đơn" / "reconcile" ──→ ghi Đồng bộ lại lên deal + ghi lượt mới vào bucket storyb. Chi tiết từng màn ​
Màn M1 - Modal "Log SAP" ​
| Field | Value |
|---|---|
| Figma frame | N/A |
| Trigger vào màn | Bấm "Log SAP" ở đầu thân stepper (mọi deal của phiên) hoặc ở một deal trong modal Lịch sử (1 deal) |
| Mô tả ngắn | Mở modal tra log SAP của nền tảng với danh sách deal id cho trước. Nội dung tra log → US-P05. |
UI States ​
| State | Khi nào | Hiển thị | Figma frame |
|---|---|---|---|
| Default | Mở modal | Theo US-P05 | N/A |
| Loading / Has data / Empty / Error | — | Theo US-P05 | N/A |
| Disabled | Phiên chưa tạo deal nào | Nút "Log SAP" tắt, tooltip "Chưa có deal nào để tra log — tạo deal ở bước 1 trước" | N/A |
Fields ​
N/A — modal nhận danh sách deal id từ phiên; field tra log thuộc US-P05.
Filter / Search / Sort ​
N/A — thuộc US-P05.
Actions ​
A1 - Mở Log SAP ​
| Item | Description |
|---|---|
| Trigger | Bấm "Log SAP" |
| Behavior | Mở modal tra log với các deal id của phiên (BR-01). Chỉ đọc — không ghi dữ liệu. Chạy trên portal đang chọn. |
| Success Result | Modal tra log hiện |
Error cases:
| Case | Expected Handling |
|---|---|
| Lỗi tra log | Theo US-P05 |
Acceptance Criteria của màn M1 ​
AC-M1.1 - Nút tắt khi chưa có deal ​
gherkin
Given phiên mới của "US-03 · Học phí thường", chưa tạo deal
When người dùng nhìn nút "Log SAP"
Then nút ở trạng thái tắt với tooltip "Chưa có deal nào để tra log — tạo deal ở bước 1 trước"Maps to:
- Business Rule: BR-01
AC-M1.2 - Tra theo mọi deal của chuỗi ​
gherkin
Given phiên "US-11 · Chuyển đổi" đã tạo Deal gốc và Deal trừ
When người dùng bấm "Log SAP"
Then modal tra log mở với đúng 2 deal id đó, theo thứ tự chuỗi
And tooltip trước khi bấm là "Tra log SAP của 2 deal trong lượt test này"Maps to:
- Business Rule: BR-01
Negative AC / Edge Cases của màn M1 ​
| ID | Tình huống | Hành vi mong đợi |
|---|---|---|
| EC-M1.1 | Deal được ghi ở chế độ "deal có sẵn" | Deal id đó cũng nằm trong danh sách tra log |
| EC-M1.2 | Portal Prod | Không áp dụng trong stepper (stepper không chạy Prod — NFR-D-02); tra log prod dùng chip Trace (US-P05) |
Màn M2 - Modal "Lịch sử test — <tên flow>" ​
| Field | Value |
|---|---|
| Figma frame | N/A |
| Trigger vào màn | Bấm "Lịch sử" ở đầu thân stepper (có ở mọi flow) |
| Mô tả ngắn | Phụ đề: "Các lần dựng data test của luồng này trên portal <env>, mới nhất trước. Lưu 30 ngày. Không mở lại được vào stepper, nhưng tra lại được deal id và bắn đồng bộ lại (<story>) cho deal của bản test." |
UI States ​
| State | Khi nào | Hiển thị | Figma frame |
|---|---|---|---|
| Default | Mở modal | Tiêu đề "Lịch sử test — <tên flow>" + phụ đề | N/A |
| Loading | Đang tải | Spinner "Đang tải…" | N/A |
| Has data | Có lượt test | Danh sách thẻ lượt test (BR-04) | N/A |
| Empty | Chưa có lượt nào | "Chưa có bản test nào. Bản test được ghi lại từ lúc bạn tạo deal đầu tiên của luồng." | N/A |
| Error | Tải lỗi | Thông báo lỗi "Không tải được lịch sử test" | N/A |
| Disabled | Một lần đồng bộ lại đang chạy | Mọi nút đồng bộ lại tạm tắt; nút đang chạy hiện spinner | N/A |
Fields ​
| Field | Required | Type | Default | Format | Validation | Error Message | Visibility | Depends On |
|---|---|---|---|---|---|---|---|---|
| Thời điểm cập nhật | — | Datetime (readonly) | — | Locale vi-VN | — | — | Always | — |
| Portal | — | Text (readonly) | — | — | — | — | Always | — |
| Số deal | — | Number (readonly) | — | "<n> deal" | — | — | Always | — |
| Bắt đầu | — | Datetime (readonly) | — | "Bắt đầu <thời điểm>" | — | — | Khi thời điểm tạo ≠ cập nhật | — |
| Deal (mỗi dòng) | — | Nhãn + id sao chép được + ghi chú (tên deal · "deal có sẵn" · contact) | — | — | — | — | Always | — |
Filter / Search / Sort ​
| Loại | Theo field | Kiểu | Default | Notes |
|---|---|---|---|---|
| Filter | Flow + portal | Cố định theo stepper đang mở | Flow & portal hiện tại | Không có bộ lọc người dùng chọn |
| Search | — | — | — | Không có |
| Sort | Thời điểm cập nhật | Giảm dần | Mới nhất trước | BE trả sẵn thứ tự (common.service.ts:1195-1205) |
| Pagination | — | Không có | Tối đa 50 lượt (⚠️ Observed, AC-M2.6) | Cuộn trong modal |
Actions ​
A1 - Xem lịch sử ​
| Item | Description |
|---|---|
| Trigger | Mở modal |
| Behavior | Đọc danh sách lượt test của (flow, portal) từ Redis mind_keep (BR-04). Chỉ đọc. |
| Success Result | Danh sách hiện, mới nhất trước |
Error cases:
| Case | Expected Handling |
|---|---|
| Lỗi đọc | Thông báo "Không tải được lịch sử test" |
A2 - Đồng bộ lại từ lịch sử (hóa đơn / reconcile) ​
| Item | Description |
|---|---|
| Trigger | Bấm "hóa đơn" hoặc "reconcile" ở một deal được phép (BR-05) |
| Behavior | Ghi Đồng bộ lại vào property trạng thái đồng bộ hóa đơn / reconcile của deal trên HubSpot của portal đang chọn (cơ chế như bước resync, US-D03 M6); BE chỉ nhận deal do tool tạo (NFR-D-04). Sau đó ghi một lượt mới vào bucket story trên Redis mind_keep (BR-06, BR-03). ⚠️ Ghi PROD: chọn Staging = ghi lên deal của portal HubSpot prod (NFR-D-03); BE có route prod cho thao tác này dù giao diện không mở Prod (NFR-P-01, NFR-D-02, OQ-D-02). |
| Success Result | Property deal = Đồng bộ lại; lượt mới trong nhóm story |
Error cases:
| Case | Expected Handling |
|---|---|
| HubSpot / BE lỗi | Thông báo "Không đặt được trạng thái đồng bộ lại"; không ghi lượt mới |
| Deal không do tool tạo | BE trả 400 13033 → hiện như lỗi trên |
Acceptance Criteria của màn M2 ​
AC-M2.1 - Lượt test xuất hiện sau khi tạo deal ​
gherkin
Given người dùng vừa tạo deal ở bước 1 của "US-05" trên Dev
When người dùng mở "Lịch sử"
Then lượt test của phiên hiện tại nằm đầu danh sách với 1 deal, portal dev
When người dùng tạo tiếp deal thứ hai trong cùng phiên (flow chuỗi)
Then vẫn là cùng một lượt test, nay có 2 dealMaps to:
- Business Rule: BR-02, BR-04
AC-M2.2 - Lỗi ghi lịch sử không phá thao tác chính ​
gherkin
Given Redis không ghi được
When người dùng tạo deal thành công
Then tool vẫn báo tạo deal thành công và không hiện lỗi lịch sử
And lượt test đó không có trong "Lịch sử"Maps to:
- Business Rule: BR-03
AC-M2.3 - Không mở lại vào stepper ​
gherkin
Given modal Lịch sử có một lượt test cũ
When người dùng xem lượt đó
Then chỉ có nút sao chép id, "Log SAP" và các nút đồng bộ lại được phép; không có nút mở lại lượt vào stepperMaps to:
- Business Rule: BR-04
AC-M2.4 - Chỉ deal được phép có nút đồng bộ lại ​
gherkin
Given một lượt test của "US-11 · Chuyển đổi" có Deal gốc, Deal trừ, Deal cộng
When người dùng mở Lịch sử
Then chỉ Deal cộng có nút "hóa đơn" (không có "reconcile")
And Deal gốc và Deal trừ hiện "Mắt xích trung gian — đặt trên deal ghi nhận doanh thu"Maps to:
- Business Rule: BR-05
AC-M2.5 - Đồng bộ lại tạo lượt mới trong bucket story ​
gherkin
Given một lượt test của "US-03" có deal D
When người dùng bấm "reconcile" ở deal D
Then property reconcile của D trên HubSpot = "Đồng bộ lại"
And nhóm lịch sử của story US-08 có thêm một lượt mới (mã mới) chứa deal DMaps to:
- Business Rule: BR-06
AC-M2.6 - ⚠️ Observed: giới hạn lưu run ​
gherkin
Given flow "US-03" trên Dev đã có 50 lượt test
When một lượt test mới được ghi
Then hành vi hiện tại: chỉ giữ 50 lượt mới nhất; toàn bộ danh sách hết hạn sau 30 ngày kể từ lần ghi cuối
And dữ liệu chỉ nằm trên Redis, không có bảng DB (OQ-D-17)Maps to:
- NFR: NFR-D-05; OQ-D-17
Negative AC / Edge Cases của màn M2 ​
| ID | Tình huống | Hành vi mong đợi |
|---|---|---|
| EC-M2.1 | Deal đã bị xoá trên HubSpot | Lịch sử vẫn hiện deal id (dữ liệu Redis); đồng bộ lại sẽ lỗi từ HubSpot |
| EC-M2.2 | ⚠️ Observed: lượt ghi từ nút đồng bộ lại gửi kèm loại (hóa đơn/reconcile) và lượt/flow nguồn | Hành vi hiện tại: BE bỏ ba thông tin này khi lưu → không đọc lại được (common.service.ts:1145-1156). Cố ý hay bug → OQ-D-01, DR-D-01 |
| EC-M2.3 | ⚠️ Observed: mở "Lịch sử" ở flow phase 2 | Flow phase 2 không có story đồng bộ lại tương ứng; code tính nhãn story từ giá trị không tồn tại → modal có thể lỗi khi mở (suy từ code sapp-26878-history.tsx:72-76, chưa chạy) → OQ-D-04 |
| EC-M2.4 | ⚠️ Observed: lượt test của flow phase 2 | Vẫn được ghi vào bucket us01, us04, … dù danh sách flow hợp lệ ở BE chỉ có phase 1 + story (BE không kiểm lúc chạy) → OQ-D-03, DR-D-02 |
| EC-M2.5 | Bấm hai nút đồng bộ lại liên tiếp | Nút thứ hai tắt cho tới khi lần đầu xong (NFR-D-08) |
5. Cross-feature AC ​
AC-X.1 - Log SAP dùng dịch vụ tra log nền tảng ​
gherkin
Given phiên có deal
When người dùng mở "Log SAP"
Then kết quả tra log (bảng log, dòng thời gian) hiển thị theo US-P05Maps to:
- REL-03 (Affects - Tra log SAP + quét doanh thu)
AC-X.2 - Đồng bộ lại kích hoạt hệ ngoài ​
gherkin
Given deal đã từng qua SAP
When người dùng bấm đồng bộ lại trong Lịch sử
Then property deal = "Đồng bộ lại" và hệ ngoài (webhook HubSpot → lms-be → SAP) xử lý lại, rồi ghi SUCCESS / FAILED về property (Fact theo hint, ngoài phạm vi truy vết)Maps to:
- REL-08 (Be Affected - webhook HubSpot → lms-be → SAP)