Skip to content

US-T01: Truy vấn ticket theo pipeline / cap_nhat_owner / owner / ngày ​

Thuộc FS: 00-overview.md — SAPP-23954 Ticket Owner 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 @ e77c47a · nguồn: inventory 23954 A-01, A-02, A-03, A-04, A-05.

FieldValue
US IDUS-T01
Role thực hiệnR1 - Người dùng tool Assumption (OQ về G-01); R2 - Hệ thống (tải lookup)
PhaseĐã triển khai (as-built @ e77c47a)
PriorityN/A — as-built
StatusDraft
NFR liên quanNFR-T-01, NFR-T-02, NFR-T-04 — xem Overview §5
OQ liên quanOQ-T-01, OQ-T-02, OQ-T-05, OQ-T-06, OQ-T-15 — xem Overview §6

1. US Statement ​

text
As a Người dùng tool (Assumption — OQ về G-01)
I want chọn portal HubSpot Dev hoặc Prod, lọc ticket theo pipeline, giá trị cap_nhat_owner,
       có / chưa có owner và khoảng ngày tạo, rồi chọn các ticket trong kết quả
So that [Assumption — OQ-T-01] tìm đúng nhóm ticket cần "làm mới" để automation gán owner chạy lại

2. Dependencies & Definition Of Ready ​

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

Dependency runtime (tham khảo):

#Cần sẵn sàngAi cung cấpTrạng thái
D1Token HubSpot của portal đang chọn trong env_systems (US-P04)Admin CMSN/A — runtime
D2Tool sapp.008 đang bật / đã mở khoá (US-P02)Admin CMSN/A — runtime
D3Lookup pipeline ticket và property cap_nhat_owner của nhóm HubSpot (REL-04, REL-05)Đã cóN/A — runtime

3. Business Rules ​

IDRuleÁp dụng ởĐã cover bởi (AC)Nguồn code (Mode B/C)
BR-01Có 2 portal Dev và Prod; khi mở màn, portal mặc định là Dev. Mọi truy vấn chạy trên portal đang chọnM1 - tab portalAC-M1.1fe/src/ui/components/works/sapp/sapp-23954-tool.tsx:58-61, :913, :957
BR-02Khi mở panel của một portal, hệ thống tải danh sách pipeline ticket và danh sách tuỳ chọn cap_nhat_owner của portal đó làm bộ lọc; tuỳ chọn đang bị ẩn trên HubSpot không hiển thịM1 - field Pipeline, Cập nhật ownerAC-M1.2, EC-M1.1fe/src/ui/components/works/sapp/sapp-23954-tool.tsx:447-476
BR-03Mọi bộ lọc đều tuỳ chọn và kết hợp theo VÀ; trong một bộ lọc chọn nhiều giá trị thì ticket khớp bất kỳ giá trị nào. Không chọn bộ lọc nào = lấy mọi ticket của portalM1 - action Truy vấn ticketAC-M1.3, AC-M1.4be/libs/modules/src/lib/sapp/common.service.ts:322-342, :364
BR-04Bộ lọc owner có 3 lựa chọn: "Tất cả" (không lọc), "Có owner" (chỉ ticket đã gán owner), "Chưa có owner" (chỉ ticket chưa gán owner)M1 - field Chủ sở hữu (owner)AC-M1.5fe/src/ui/components/works/sapp/sapp-23954-tool.tsx:531-533, :702-713; be/libs/modules/src/lib/sapp/common.service.ts:337-342
BR-05Ngày "từ" không được chọn sau ngày "đến" và ngược lại (lịch chặn ngày ngoài khoảng)M1 - field Tạo từ ngày / Đến ngàyAC-M1.6fe/src/ui/components/works/sapp/sapp-23954-tool.tsx:717-729
BR-06Kết quả luôn sắp theo ngày tạo mới nhất trướcM1 - bảng kết quảAC-M1.3be/libs/modules/src/lib/sapp/common.service.ts:365-370
BR-07Mỗi lần truy vấn lấy 100 ticket; còn trang sau thì có nút "Tải thêm" để nối trang kế vào cuối bảng, giữ nguyên lựa chọnM1 - action Tải thêmAC-M1.7fe/src/ui/components/works/sapp/sapp-23954-tool.tsx:66, :648-653, :861-875; be/libs/constants/src/lib/sapp/sapp-23954.constants.ts:27-31
BR-08Tên pipeline tra từ danh sách pipeline ticket của portal; không tra được thì hiển thị id pipelineM1 - cột PipelineAC-M1.8be/libs/modules/src/lib/sapp/common.service.ts:376-394; fe/src/ui/components/works/sapp/sapp-23954-tool.tsx:843
BR-09Truy vấn mới (không phải "Tải thêm") thay toàn bộ bảng, xoá lựa chọn và xoá kết quả làm mới cũM1 - action Truy vấn ticketAC-M1.9fe/src/ui/components/works/sapp/sapp-23954-tool.tsx:557-569
BR-10"Chọn tất cả" chỉ chọn các ticket đã tải trên màn, không phải toàn bộ tổng số khớp bộ lọcM1 - action Chọn tất cảAC-M1.10fe/src/ui/components/works/sapp/sapp-23954-tool.tsx:673-678
BR-11Nút "Làm mới cap_nhat_owner (N)" chỉ bật khi đã chọn ≥ 1 ticket (N = số đã chọn) — hành động làm mới ở US-T02M1 - action Chọn ticketAC-M1.10fe/src/ui/components/works/sapp/sapp-23954-tool.tsx:773-787

⚠️ Observed không viết thành BR: lọc ngày theo UTC (EC-M1.4, OQ-T-06); tên tham số owner ngược nghĩa (EC-M1.5, OQ-T-05); đổi tab mất trạng thái (EC-M1.6, OQ-T-15).

4. Design ​

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

text
[Menu "SAPP 23954 - Ticket Owner" › "Query & Refresh tickets"]
  ↓
[M1: Panel truy vấn — tab Dev (mặc định) / Prod]
  ↓ hệ thống tải lookup Pipeline + cap_nhat_owner
  ↓ người dùng chọn bộ lọc → "Truy vấn ticket"
[M1: Bảng kết quả]
  ├─ còn trang sau → "Tải thêm" → nối dòng
  ├─ chọn ticket → "Làm mới cap_nhat_owner (N)" ──→ US-T02
  ├─ "Lịch sử làm mới" ──→ US-T04
  └─ lỗi API → hộp lỗi "Truy vấn ticket thất bại", giữ bảng cũ

Link flow chi tiết nếu có:

  • N/A — không có flow Figma / Mermaid.

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

Màn M1 - Panel truy vấn ticket (sapp.008) ​

FieldValue
Figma frameN/A
Trigger vào mànMở /works/sapp/tools/sapp-23954 từ menu "SAPP 23954 - Ticket Owner" › "Query & Refresh tickets"
Mô tả ngắnTiêu đề "SAPP-23954 Ticket Owner", 2 tab Dev / Prod, khối bộ lọc + nút "Truy vấn ticket" / "Lịch sử làm mới", bảng kết quả có chọn dòng
UI States ​
StateKhi nàoHiển thịFigma frame
DefaultVừa vào màn / vừa đổi tabTab Dev chọn sẵn; bộ lọc trống; chú thích "Bỏ trống mọi bộ lọc để lấy tất cả ticket. Sắp xếp theo ngày tạo mới nhất."; chưa có bảng kết quảN/A
LoadingĐang tải lookup / đang truy vấnNhóm checkbox hiện đang tải; nút đổi thành "Đang truy vấn…" có spinner; khi "Tải thêm" thì spinner ở nút "Tải thêm"N/A
Has dataTruy vấn có kết quảDòng "Kết quả — hiển thị {số dòng} / {tổng} ticket · đã chọn {N}"; bảng cột: chọn · Ticket ID · Tên ticket · Pipeline · cap_nhat_owner · Owner ID; ô trống hiện "—"N/A
EmptyTruy vấn không có ticket khớp"Không có ticket khớp bộ lọc."; lookup rỗng: "Không có pipeline." / "Không có tùy chọn."N/A
ErrorAPI lỗiHộp lỗi tiêu đề "Truy vấn ticket thất bại" (hoặc "Không tải được danh sách pipeline" / "Không tải được tùy chọn cap_nhat_owner"), nội dung "{thông điệp} ({mã})"N/A
DisabledĐang truy vấn / chưa chọn ticketNút "Truy vấn ticket" và "Tải thêm" khoá khi đang truy vấn; nút "Làm mới cap_nhat_owner (0)" khoá khi chưa chọn ticketN/A
Fields ​
FieldRequiredTypeDefaultFormatValidationError MessageVisibilityDepends On
Tab portalYesTab (Dev / Prod)Dev—Chỉ 2 giá trị (BR-01)—Always—
PipelineNoMulti-select checkboxKhông chọnid pipeline ticketTuỳ chọn từ lookup (BR-02)—AlwaysPortal đang chọn
Cập nhật owner (cap_nhat_owner)NoMulti-select checkboxKhông chọngiá trị dropdown HubSpotTuỳ chọn không ẩn từ lookup (BR-02)—AlwaysPortal đang chọn
Chủ sở hữu (owner)NoDropdown"Tất cả"Tất cả / Có owner / Chưa có ownerBR-04—Always—
Tạo từ ngày (createdate ≥)NoDateTrốngngày (gửi đi 00:00:00.000 UTC)Không sau "Đến ngày" (BR-05)— (lịch chặn chọn)AlwaysĐến ngày
Đến ngày (createdate ≤)NoDateTrốngngày (gửi đi 23:59:59.999 UTC)Không trước "Tạo từ ngày" (BR-05)— (lịch chặn chọn)AlwaysTạo từ ngày
Ô chọn dòng / Chọn tất cảNoCheckboxBỏ chọn—BR-10—Khi có kết quảCác dòng đã tải
Filter / Search / Sort (chỉ màn List/Report — xóa nếu không phải) ​
LoạiTheo fieldKiểuDefaultNotes
FilterPipelinemulti-selectTất cảKhớp bất kỳ (BR-03)
Filtercap_nhat_ownermulti-selectTất cảKhớp bất kỳ (BR-03)
FilterOwnerdropdown 3 trạng tháiTất cảBR-04; ⚠️ Observed tên tham số API ngược nghĩa (EC-M1.5)
FilterNgày tạodate rangeKhông giới hạnTrọn ngày theo UTC — ⚠️ Observed (EC-M1.4)
Search———N/A — không có ô tìm kiếm tự do
SortNgày tạocố địnhMới nhất trướcKhông đổi được (BR-06)
Pagination—cursor "Tải thêm"100 / trangBR-07, NFR-T-04
Actions ​
A1 - Chọn portal ​
ItemDescription
TriggerBấm tab "Dev" hoặc "Prod"
BehaviorĐổi portal; panel được dựng lại từ đầu và tải lại lookup của portal mới (BR-01, BR-02). Không ghi dữ liệu
Success ResultPanel của portal mới ở trạng thái Default

Error cases:

CaseExpected Handling
Đang có bộ lọc / kết quả / lựa chọn ở tab cũ⚠️ Observed — toàn bộ bị mất khi đổi tab (EC-M1.6)
A2 - Tải lookup bộ lọc (hệ thống) ​
ItemDescription
TriggerPanel của portal được mở
BehaviorĐọc danh sách pipeline ticket và định nghĩa property cap_nhat_owner của portal từ HubSpot qua lookup nhóm HubSpot (REL-04, REL-05); bỏ tuỳ chọn ẩn (BR-02). Chỉ đọc
Success ResultHai nhóm checkbox "Pipeline" và "Cập nhật owner (cap_nhat_owner)" có tuỳ chọn

Error cases:

CaseExpected Handling
Lookup pipeline lỗiHộp lỗi "Không tải được danh sách pipeline"; nhóm checkbox trống ("Không có pipeline.")
Lookup cap_nhat_owner lỗiHộp lỗi "Không tải được tùy chọn cap_nhat_owner"; nhóm checkbox trống ("Không có tùy chọn.")
A3 - Truy vấn ticket ​
ItemDescription
TriggerBấm "Truy vấn ticket"
BehaviorGửi bộ lọc hiện tại (BR-03, BR-04, BR-05) với 100 dòng / trang tới HubSpot Search của portal đang chọn; sắp mới nhất trước (BR-06); tra tên pipeline (BR-08). Chỉ đọc HubSpot, không ghi. Thay bảng, xoá lựa chọn và kết quả làm mới cũ (BR-09)
Success ResultBảng kết quả + "hiển thị N / tổng"

Error cases:

CaseExpected Handling
Portal chưa cấu hình token HubSpotHộp lỗi "Truy vấn ticket thất bại" với thông điệp thiếu cấu hình (mã 12001 — xem US-P04)
HubSpot trả lỗi / lỗi không xác địnhHộp lỗi "Truy vấn ticket thất bại" — lỗi HubSpot trả nguyên mã lỗi HubSpot chung; lỗi khác "Failed to query SAPP-23954 tickets (13022)". Bảng cũ giữ nguyên
A4 - Tải thêm ​
ItemDescription
TriggerBấm "Tải thêm" (chỉ hiện khi còn trang sau)
BehaviorTruy vấn lại cùng bộ lọc với con trỏ trang kế; nối dòng vào cuối, giữ lựa chọn (BR-07). Chỉ đọc
Success ResultBảng dài thêm tối đa 100 dòng; nút ẩn khi hết trang

Error cases:

CaseExpected Handling
API lỗiHộp lỗi "Truy vấn ticket thất bại"; các dòng đã có giữ nguyên
A5 - Chọn ticket / Chọn tất cả ​
ItemDescription
TriggerBấm vào dòng hoặc ô chọn của dòng; bấm ô "Chọn tất cả" ở tiêu đề bảng
BehaviorBật / tắt chọn dòng; "Chọn tất cả" chọn (hoặc bỏ chọn nếu đã chọn hết) mọi dòng đã tải (BR-10); cập nhật "đã chọn N" và nút làm mới (BR-11). Không ghi dữ liệu
Success ResultDòng được chọn tô nền; nút "Làm mới cap_nhat_owner (N)" bật khi N > 0

Error cases:

CaseExpected Handling
Tổng khớp bộ lọc lớn hơn số dòng đã tải"Chọn tất cả" chỉ chọn số đã tải (EC-M1.3)
Acceptance Criteria của màn M1 ​
AC-M1.1 - Portal mặc định Dev ​
gherkin
Given người dùng mở màn "Query & Refresh tickets"
When màn hiển thị xong
Then tab "Dev" đang được chọn
And mọi truy vấn sau đó chạy trên portal HubSpot dev cho tới khi người dùng chọn tab "Prod"

Maps to:

  • Business Rule: BR-01
  • Field/Action: Tab portal, A1
AC-M1.2 - Tải bộ lọc từ portal ​
gherkin
Given portal dev có property cap_nhat_owner với 1 tuỳ chọn đang bị ẩn
When panel Dev được mở
Then nhóm "Cập nhật owner (cap_nhat_owner)" liệt kê các tuỳ chọn không ẩn, không có tuỳ chọn bị ẩn
And nhóm "Pipeline" liệt kê pipeline ticket của portal dev

Maps to:

  • Business Rule: BR-02
  • Field/Action: A2
AC-M1.3 - Truy vấn không bộ lọc ​
gherkin
Given không chọn bộ lọc nào
When bấm "Truy vấn ticket"
Then hệ thống trả tối đa 100 ticket bất kỳ của portal, sắp theo ngày tạo mới nhất trước
And dòng tiêu đề hiển thị "hiển thị {số dòng} / {tổng}" với tổng là số ticket của portal

Maps to:

  • Business Rule: BR-03, BR-06, BR-07
  • Field/Action: A3
AC-M1.4 - Kết hợp bộ lọc ​
gherkin
Given chọn 2 pipeline P1, P2 và 1 giá trị cap_nhat_owner "Xử lý ticket thông thường"
When bấm "Truy vấn ticket"
Then chỉ trả ticket thuộc P1 hoặc P2 VÀ có cap_nhat_owner = "Xử lý ticket thông thường"

Maps to:

  • Business Rule: BR-03
  • Field/Action: Pipeline, Cập nhật owner
AC-M1.5 - Lọc theo owner ​
gherkin
Given chọn "Chủ sở hữu (owner)" = "Chưa có owner"
When bấm "Truy vấn ticket"
Then chỉ trả ticket chưa được gán owner (Owner ID hiển thị "—")
And chọn "Có owner" thì chỉ trả ticket đã có owner; chọn "Tất cả" thì không lọc theo owner

Maps to:

  • Business Rule: BR-04
  • Field/Action: Chủ sở hữu (owner)
AC-M1.6 - Khoảng ngày hợp lệ ​
gherkin
Given đã chọn "Đến ngày" = 10/09/2026
When mở lịch "Tạo từ ngày"
Then không chọn được ngày sau 10/09/2026

Maps to:

  • Business Rule: BR-05
  • Field/Action: Tạo từ ngày, Đến ngày
AC-M1.7 - Tải thêm giữ lựa chọn ​
gherkin
Given kết quả có 100 dòng, tổng 250, đã chọn 3 ticket
When bấm "Tải thêm"
Then bảng có 200 dòng, 3 ticket vẫn đang chọn
And sau lần "Tải thêm" tiếp theo bảng có 250 dòng và nút "Tải thêm" biến mất

Maps to:

  • Business Rule: BR-07
  • Field/Action: A4
AC-M1.8 - Tên pipeline ​
gherkin
Given ticket thuộc pipeline có id tra được trong danh sách pipeline của portal
When bảng kết quả hiển thị
Then cột "Pipeline" hiển thị tên pipeline
And nếu id không tra được tên thì hiển thị id pipeline

Maps to:

  • Business Rule: BR-08
AC-M1.9 - Truy vấn mới xoá lựa chọn và kết quả làm mới ​
gherkin
Given đã chọn 5 ticket và đang hiển thị khối "Kết quả làm mới" của lượt trước
When bấm "Truy vấn ticket" lần nữa
Then bảng được thay bằng kết quả mới, "đã chọn 0"
And khối "Kết quả làm mới" biến mất

Maps to:

  • Business Rule: BR-09
AC-M1.10 - Chọn tất cả và nút làm mới ​
gherkin
Given bảng đang có 100 dòng đã tải trên tổng 250
When bấm ô "Chọn tất cả"
Then 100 dòng được chọn, "đã chọn 100"
And nút "Làm mới cap_nhat_owner (100)" bật
And bấm lại ô "Chọn tất cả" thì bỏ chọn cả 100 và nút về "Làm mới cap_nhat_owner (0)" ở trạng thái khoá

Maps to:

  • Business Rule: BR-10, BR-11
  • Field/Action: A5
Negative AC / Edge Cases của màn M1 ​
IDTình huốngHành vi mong đợi
EC-M1.1Lookup pipeline hoặc cap_nhat_owner lỗiHộp lỗi tương ứng; nhóm checkbox trống; vẫn truy vấn được không theo bộ lọc đó
EC-M1.2Truy vấn không có ticket khớp"Không có ticket khớp bộ lọc."; không có nút "Tải thêm"; nút làm mới khoá
EC-M1.3"Chọn tất cả" khi tổng > số dòng đã tảiChỉ các dòng đã tải được chọn (BR-10); muốn chọn thêm phải "Tải thêm" trước
EC-M1.4⚠️ Observed — ticket tạo lúc 00:00–06:59 giờ VNHành vi hiện tại: khoảng ngày tính trọn ngày theo UTC (từ 00:00:00.000Z đến 23:59:59.999Z), nên ticket tạo 00:00–06:59 giờ VN ngày D bị tính vào ngày D-1. Nguồn: fe/src/ui/components/works/sapp/sapp-23954-tool.tsx:534-535; be/libs/modules/src/lib/sapp/common.service.ts:343-356. Cố ý hay bug: OQ-T-06
EC-M1.5⚠️ Observed — gọi API trực tiếp với tham số ownerHành vi hiện tại: tham số tên "noOwner" = true nghĩa là có owner, = false nghĩa là chưa có owner (màn gửi đúng theo nghĩa này nên người dùng màn không bị ảnh hưởng). Nguồn: be/libs/interface/src/lib/dto/sapp/sapp-23954-ticket.dto.ts:28-34; be/libs/modules/src/lib/sapp/common.service.ts:337-342. OQ-T-05
EC-M1.6⚠️ Observed — đổi tab Dev ↔ Prod giữa chừngHành vi hiện tại: panel dựng lại → mất bộ lọc, kết quả, lựa chọn của tab trước; quay lại tab cũ thấy trạng thái Default. Nguồn: fe/src/ui/components/works/sapp/sapp-23954-tool.tsx:955-957. OQ-T-15, DR-T-09
EC-M1.7Ticket có tên / cap_nhat_owner / owner trốngÔ hiển thị "—"
EC-M1.8Refresh trình duyệtMọi bộ lọc, kết quả, lựa chọn mất (không lưu trạng thái); tab về Dev

5. Cross-feature AC ​

AC-X.1 - Bộ lọc dùng lookup của nhóm HubSpot ​

gherkin
Given lookup pipeline ticket và lookup property cap_nhat_owner của nhóm HubSpot hoạt động bình thường cho portal đang chọn
When panel truy vấn được mở
Then danh sách "Pipeline" khớp danh sách pipeline ticket mà lookup trả về
And danh sách "Cập nhật owner" khớp các tuỳ chọn không ẩn mà lookup trả về

Maps to:

  • REL-04 (Affects - HubSpot Xem pipeline)
  • REL-05 (Affects - HubSpot Get property)

AC-X.2 - Cổng tool nền tảng ​

gherkin
Given tool sapp.008 đang ẩn hoặc khoá theo cấu hình nền tảng
When người dùng mở đường dẫn màn
Then màn truy vấn không hiển thị theo hành vi cổng của nền tảng (US-P02)

Maps to:

  • REL-01 (Affects - Hub mở tool)
  • REL-02 (Affects - Khoá tool)