Skip to content

US-I01: Chọn môi trường và xem contact / deal đã tạo bằng tool ​

Thuộc FS: 00-overview.md — SAPP-24395 Contact / Deal instances & Bulk product creation 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 — suy từ code, chưa chạy thử.

FieldValue
US IDUS-I01
Role thực hiệnR1 - Người dùng tool (Assumption — OQ-I-16 về G-01)
PhaseAs-built (đã triển khai)
PriorityN/A — as-built
StatusDraft
NFR liên quanNFR-I-01, NFR-I-04, NFR-I-05, NFR-I-07 — xem Overview §5
OQ liên quanOQ-I-02, OQ-I-08, OQ-I-11, OQ-I-16, OQ-I-18, OQ-I-19 — xem Overview §6

Nguồn inventory: A-01, A-02, A-08.

1. US Statement ​

text
As a Người dùng tool (Assumption — OQ-I-16)
I want chọn môi trường HubSpot (Dev / Staging) và xem lại các contact, deal mà tool đã tạo ở môi trường đó
So that [Assumption] tôi dùng lại được dữ liệu test đã dựng (gắn contact vào deal mới, tìm lại deal để kiểm tra luồng ghi nhận doanh thu) mà không phải tra trên HubSpot

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
D1Tool sapp.006 đang bật / mở khoá ở workspace (US-P02)Admin CMSN/A — runtime
D2Redis mind-keep hoạt động (danh sách lưu ở Redis)Hạ tầng BEN/A — runtime

3. Business Rules ​

IDRuleÁp dụng ởĐã cover bởi (AC)Nguồn code (Mode B/C)
BR-01Màn có 3 tab môi trường: Dev (mặc định khi mở), Staging, Prod. Tab Prod đang bị vô hiệu hoá, di chuột hiện "Tạm thời vô hiệu hóa"M1 - tab môi trườngAC-M1.1, EC-M1.1fe/src/ui/components/works/sapp/sapp-24395-tool.tsx:49-54, :989, :1014-1021
BR-02Đổi tab thì toàn bộ khu vực làm việc được dựng lại cho môi trường mới: nạp lại danh sách contact và deal, xoá lựa chọn contact và dữ liệu đang nhập trong form contact / dealM1 - tab môi trườngAC-M1.2fe/src/ui/components/works/sapp/sapp-24395-tool.tsx:1038, :902-928
BR-03Danh sách contact / deal tách riêng theo từng môi trường (prod / staging / dev) — kể cả staging và prod dùng chung một portal HubSpot, danh sách của hai tab vẫn khác nhauM1 - danh sáchAC-M1.3be/libs/constants/src/lib/sapp/sapp.constants.ts:231-240
BR-04Danh sách chỉ gồm contact / deal do tool này tạo (không đọc HubSpot), mỗi mục chỉ có id + tên (không lưu email / SĐT), theo thứ tự tạoM1 - danh sách; M2AC-M1.3, AC-M2.1be/libs/modules/src/lib/sapp/common.service.ts:1557-1569, :1642-1650, :1666-1684
BR-05Khi mở tab: tự nạp cả hai danh sách; nút "Tải lại" (mục 1) nạp lại danh sách contact; nút "Tải lại" ở chân modal lịch sử nạp lại danh sách dealM1 - A1, A2; M2 - A2AC-M1.3, AC-M1.4, AC-M2.3fe/src/ui/components/works/sapp/sapp-24395-tool.tsx:908-928, :341-348, :846-857
BR-06Lịch sử deal lọc theo tên deal chứa chuỗi tìm, không phân biệt hoa thường, bỏ khoảng trắng đầu cuối; chuỗi rỗng = hiện tất cảM2 - ô tìmAC-M2.2, EC-M2.2fe/src/ui/components/works/sapp/sapp-24395-tool.tsx:835-841
BR-07Lỗi nạp danh sách hiện popup "Không tải được danh sách contact" / "Không tải được danh sách deal" với nội dung <message> (<code>) (13008 / 13010)M1 - A1AC-M1.5fe/src/ui/components/works/sapp/sapp-24395-tool.tsx:916, :927; be/libs/constants/src/lib/error-codes/error-codes.constants.ts:579-592

Không phải BR (⚠️ Observed → OQ): danh sách không hết hạn / không xoá được (OQ-I-08); tên deal rỗng có thể làm hỏng ô tìm (OQ-I-11); contact trùng email lặp trong danh sách (OQ-I-18); tab Staging = portal prod, route prod BE vẫn mở (OQ-I-02, NFR-I-01).

4. Design &ZeroWidthSpace;

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

text
[Workspace SAPP › "Contact / Deal instances" (sapp.006)]
  ↓ vào màn (tab Dev mặc định)
[M1: Màn Contact / Deal instances — tab môi trường + mục 1 (contact) + mục 2 (deal)]
  ├─ đổi tab Dev ↔ Staging ──→ dựng lại M1 cho môi trường mới (BR-02)
  ├─ tick contact ──→ dùng ở US-I03
  └─ bấm icon "Xem lịch sử deal đã tạo"
        ↓
     [M2: Modal "Deal đã tạo (n)" — tìm theo tên deal]
        └─ đóng ──→ về M1

Link flow chi tiết: N/A.

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

Màn M1 - Contact / Deal instances (khung + danh sách) &ZeroWidthSpace;

FieldValue
Figma frameN/A
Trigger vào mànMở tool "Contact / Deal instances" (/works/sapp/tools/sapp-24395) trong nhóm "SAPP 24395 - Tự động ghi nhận doanh thu"
Mô tả ngắnHeader "SAPP-24395 · Tự động ghi nhận doanh thu bán hàng CX", 3 tab môi trường, mục 1 "Tạo HubSpot contact instance" (form: US-I02, danh sách contact: US này), mục 2 "Tạo HubSpot deal instance theo case" (form: US-I03, số deal + nút lịch sử: US này)
UI States &ZeroWidthSpace;
StateKhi nàoHiển thịFigma frame
DefaultVừa vào mànTab Dev được chọn; tab Prod mờ, không bấm đượcN/A
LoadingĐang nạp danh sách contact lần đầu"Đang tải danh sách…" dưới nhãn "Contact đã tạo (0) — tick để gán vào deal"; icon "Tải lại" quayN/A
Has dataCó contactDanh sách checkbox (tối đa cao ~52 đơn vị, cuộn), mỗi dòng: tên + id; nhãn "Contact đã tạo (n) — tick để gán vào deal"; mục 2 hiện "Deal đã tạo (n)"N/A
EmptyChưa có contact nào"Chưa có contact nào. Bấm "Tạo contact mặc định" để bắt đầu." (chữ lệch tên nút — OQ-I-19)N/A
ErrorAPI danh sách lỗiPopup lỗi (BR-07); danh sách giữ trạng thái rỗngN/A
DisabledTab ProdTab mờ, tooltip "Tạm thời vô hiệu hóa"N/A
Fields &ZeroWidthSpace;
FieldRequiredTypeDefaultFormatValidationError MessageVisibilityDepends On
Tab môi trườngYesTab (Dev / Staging / Prod)Dev—Prod bị vô hiệu hoá (BR-01)—Always—
Danh sách "Contact đã tạo"NoCheckbox list (tên + id)Không tickid dạng số HubSpot——AlwaysTab môi trường (BR-03)
"Deal đã tạo (n)"—Nhãn đếm + icon lịch sử————AlwaysTab môi trường
Filter / Search / Sort (chỉ màn List/Report — xóa nếu không phải) &ZeroWidthSpace;

N/A — danh sách contact ở M1 không có lọc / tìm / sắp xếp; thứ tự = thứ tự tạo (BR-04). Tìm deal nằm ở M2.

Actions &ZeroWidthSpace;
A1 - Chọn tab môi trường &ZeroWidthSpace;
ItemDescription
TriggerBấm tab Dev hoặc Staging
BehaviorDựng lại khu vực làm việc cho môi trường đã chọn (BR-02), tự gọi đọc danh sách contact và deal của môi trường đó (BR-03, BR-05). Chỉ đọc Redis mind_keep, không gọi HubSpot. Lưu ý: chọn Staging thì các thao tác ghi sau đó (US-I02, US-I03) đi vào HubSpot PRODUCTION (NFR-I-05)
Success ResultHiện danh sách của môi trường mới

Error cases:

CaseExpected Handling
Đọc danh sách lỗiPopup BR-07
Bấm tab ProdKhông phản hồi (tab bị vô hiệu hoá)
A2 - Tải lại danh sách contact &ZeroWidthSpace;
ItemDescription
TriggerBấm "Tải lại" cạnh nút "Tạo contact"
BehaviorGọi lại đọc danh sách contact của môi trường hiện tại (Redis). Không đổi lựa chọn đã tick
Success ResultDanh sách cập nhật

Error cases:

CaseExpected Handling
Đọc lỗiPopup "Không tải được danh sách contact"
A3 - Tick / bỏ tick contact &ZeroWidthSpace;
ItemDescription
TriggerBấm vào dòng contact
BehaviorĐảo trạng thái chọn; số contact đã chọn dùng ở US-I03
Success ResultDòng được tô nền khi chọn

Error cases:

CaseExpected Handling
—Không có (thao tác cục bộ)
Acceptance Criteria của màn M1 &ZeroWidthSpace;
AC-M1.1 - Mặc định Dev, Prod bị tắt &ZeroWidthSpace;
gherkin
Given người dùng mở màn Contact / Deal instances
When màn hiển thị xong
Then tab "Dev" đang được chọn
And tab "Prod" bị vô hiệu hoá, di chuột hiện "Tạm thời vô hiệu hóa"

Maps to:

  • Business Rule: BR-01
  • Field/Action: Tab môi trường
AC-M1.2 - Đổi tab dựng lại khu vực làm việc &ZeroWidthSpace;
gherkin
Given đang ở tab Dev, đã tick 2 contact và nhập dở Họ tên ở form contact
When người dùng bấm tab "Staging"
Then danh sách contact và deal được nạp lại cho môi trường staging
And không còn contact nào được tick, form contact / deal trở về rỗng

Maps to:

  • Business Rule: BR-02
  • Field/Action: A1
AC-M1.3 - Danh sách theo môi trường, chỉ do tool tạo &ZeroWidthSpace;
gherkin
Given tool đã tạo contact "A" ở tab Dev và contact "B" ở tab Staging
When người dùng mở tab Staging
Then danh sách "Contact đã tạo" chỉ có "B" (tên + id)
And không hiện email / SĐT

Maps to:

  • Business Rule: BR-03, BR-04, BR-05
AC-M1.4 - Tải lại &ZeroWidthSpace;
gherkin
Given danh sách contact đang hiển thị
When người dùng bấm "Tải lại"
Then danh sách contact của môi trường hiện tại được đọc lại

Maps to:

  • Business Rule: BR-05
  • Field/Action: A2
AC-M1.5 - Lỗi nạp danh sách &ZeroWidthSpace;
gherkin
Given Redis không đọc được
When màn nạp danh sách contact
Then hiện popup "Không tải được danh sách contact" với nội dung "Failed to list SAPP contact instances (13008)"

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.1Gọi thẳng API môi trường prod (không qua giao diện)⚠️ Observed — route prod vẫn trả / ghi dữ liệu dù tab bị tắt, không cần đăng nhập (NFR-I-01 → OQ-I-02)
EC-M1.2Danh sách tích luỹ lâu ngày⚠️ Observed — danh sách không bao giờ hết hạn, không có nút / API xoá; chỉ tăng (OQ-I-08)
EC-M1.3Cùng một contact được "tạo" hai lần do trùng email⚠️ Observed (suy từ code) — contact đó xuất hiện 2 dòng cùng id; tick một dòng có thể tick cả hai (OQ-I-18)
EC-M1.4Mất mạng khi nạpPopup lỗi chung "Không tải được danh sách …" với "Đã có lỗi xảy ra." nếu không có message
EC-M1.5Refresh trangQuay về tab Dev, mất lựa chọn contact (không lưu ở trình duyệt); danh sách vẫn còn (Redis)

Màn M2 - Modal lịch sử deal đã tạo &ZeroWidthSpace;

FieldValue
Figma frameN/A
Trigger vào mànBấm icon lịch sử cạnh "Deal đã tạo (n)" (tooltip "Xem lịch sử deal đã tạo") ở mục 2
Mô tả ngắnModal "Deal đã tạo (n)", phụ đề "Tìm theo tên deal"; ô tìm + danh sách deal (tên + id); chân modal có "Tải lại"
UI States &ZeroWidthSpace;
StateKhi nàoHiển thịFigma frame
DefaultMở modalÔ tìm trống, hiện tất cả dealN/A
LoadingĐang nạp, chưa có deal"Đang tải danh sách…"N/A
Has dataCó deal khớpDanh sách tên deal + id, cuộn đượcN/A
EmptyMôi trường chưa có deal"Chưa có deal nào."N/A
Empty (lọc)Có deal nhưng không khớp chuỗi"Không tìm thấy deal khớp "<chuỗi>"."N/A
ErrorNạp lỗiPopup "Không tải được danh sách deal" (BR-07)N/A
Disabled—N/A — không có trạng thái disabledN/A
Fields &ZeroWidthSpace;
FieldRequiredTypeDefaultFormatValidationError MessageVisibilityDepends On
Ô tìmNoTextRỗngPlaceholder "Tìm theo tên deal…"BR-06—Always—
Dòng deal—Readonly (tên + id)—Tên dạng [IT TEST][SAPP-24395] <nhãn case> <n> (US-I03 BR-03)——AlwaysTab môi trường
Filter / Search / Sort (chỉ màn List/Report — xóa nếu không phải) &ZeroWidthSpace;
LoạiTheo fieldKiểuDefaultNotes
Filter———N/A — không có
SearchTên dealfree-text, chứa chuỗi, không phân biệt hoa thường—Lọc tại trình duyệt (BR-06)
Sort——Thứ tự tạoKhông đổi được
Pagination——Không phân trangCuộn trong modal
Actions &ZeroWidthSpace;
A1 - Tìm deal &ZeroWidthSpace;
ItemDescription
TriggerGõ vào ô tìm
BehaviorLọc tại chỗ theo BR-06; không gọi API
Success ResultDanh sách thu hẹp

Error cases:

CaseExpected Handling
Có deal tên rỗng (null) trong danh sách⚠️ Observed — ô tìm có thể lỗi khi gõ (OQ-I-11)
A2 - Tải lại danh sách deal &ZeroWidthSpace;
ItemDescription
TriggerBấm "Tải lại" ở chân modal
BehaviorĐọc lại danh sách deal của môi trường (Redis)
Success ResultDanh sách + số đếm cập nhật

Error cases:

CaseExpected Handling
Đọc lỗiPopup "Không tải được danh sách deal"
Acceptance Criteria của màn M2 &ZeroWidthSpace;
AC-M2.1 - Mở lịch sử &ZeroWidthSpace;
gherkin
Given tool đã tạo 3 deal ở tab Dev
When người dùng bấm icon lịch sử
Then modal "Deal đã tạo (3)" hiện 3 dòng (tên + id) theo thứ tự tạo

Maps to:

  • Business Rule: BR-04
AC-M2.2 - Tìm không phân biệt hoa thường &ZeroWidthSpace;
gherkin
Given có deal "[IT TEST][SAPP-24395] Deal CBE 2"
When người dùng gõ "  deal cbe "
Then deal đó vẫn hiện trong kết quả

Maps to:

  • Business Rule: BR-06
  • Field/Action: A1
AC-M2.3 - Tải lại trong modal &ZeroWidthSpace;
gherkin
Given modal lịch sử đang mở
When người dùng bấm "Tải lại"
Then danh sách deal được đọc lại và số đếm cập nhật

Maps to:

  • Business Rule: BR-05
  • Field/Action: A2
Negative AC / Edge Cases của màn M2 &ZeroWidthSpace;
IDTình huốngHành vi mong đợi
EC-M2.1Deal có tên null⚠️ Observed — có thể lỗi khi lọc (OQ-I-11)
EC-M2.2Chuỗi tìm chỉ gồm khoảng trắngCoi như rỗng, hiện tất cả
EC-M2.3Chuỗi tìm có ký tự đặc biệt / emojiSo khớp chuỗi thường (không regex), không lỗi
EC-M2.4Hai tab trình duyệt cùng tạo dealModal chỉ cập nhật khi bấm "Tải lại"

5. Cross-feature AC &ZeroWidthSpace;

AC-X.1 - Tool bị khoá / tắt không vào được màn &ZeroWidthSpace;

gherkin
Given tool sapp.006 đang ở trạng thái khoá trên workspace
When người dùng mở /works/sapp/tools/sapp-24395
Then áp dụng hành vi khoá của nền tảng (US-P02); API của tool vẫn gọi được trực tiếp (NFR-I-01)

Maps to:

  • REL-01 (Affects - Nền tảng Hub / khoá tool)