QnA Init Docs — UC_4.16.2 Career & HR Widget (LIVE)
UC: UC_4.16.2 — Career & HR Widget (LIVE) BA phụ trách: Anh Hoang Ngày tạo: 2026-08-26 Tài liệu SRS: UC_4.16.2_v1.md
0. Nguồn đã đọc
| # | Nguồn | Dùng cho |
|---|---|---|
| 1 | RFQ_ Stack Trading Prop Tech V7.pdf | Endpoint HR Integration (input/output/logic đầy đủ) · Endpoint Current Level Detail (Level, Title, Salary, PTO, payout_portal_url + rule Payout Routing) · 3rd-party stack (Rippling = HR & Payroll) |
| 2 | RFQ_ Website and Dashboard Implementation V7.pdf | §Part C — câu định nghĩa Career & HR Widget: "Displaying Vacation Days, Next Pay Date, and Latest Certificate (Data from Rippling), Manage Payouts (payout_portal_url … target="_blank" … static vendor URL)" |
| 3 | Zapier Integration V7.pdf | Flow 6 (Level 6 Transition — W-2 vs International, Comp_Track, Standard_Hours, Rippling worker.hire) · Flow 8 (Pay Raise — Base_Income vs Base_Income_Flex, Base_Income_Type) · Flow 13 (Time-Off — Path A W-2 paid DTO check Used_DTO vs DTO_Days; Path B International unpaid hiatus no limit) · Flow 34 / 35 / 36 (payroll, PTO approval, Dots retainer) · Table A / Table B (Level Title, Base_Income, Base_Income_Flex, Base_Income_Type, DTO_Days) |
| 4 | References/QnA from clients/03_STAGE2_DASHBOARD_EVALUATION/Settings + Career + Viral/QnA_STAGE2_SETTINGS_CAREER_VIRAL_EN.md §10 | [HR-DEF-01] (Adrian Stack, 2026-08-15) + 3 điểm BA tự raise chưa hỏi khách (field nguồn của PTO, refresh cadence, state khi Rippling unreachable) + Open Item #21 |
| 5 | References/WBS/[BA Internal] Stacktrading.csv | UC_4.16.2 = STAGE 2.2: DASHBOARD LIVE / Level-Up & Certificate / Career & HR Widget — "Display vacation days, next pay date, lastest certificate" → folder dashboard_live/ |
| 6 | Chỉ đạo khách relay cho BA 2026-08-26 | Rule hiển thị [Manage Payouts] (ẩn nếu W-2, còn lại → Dots login, tab mới) và [View in Rippling] (mở Rippling tab mới, login page → employee homepage) |
| 7 | Design frame màn Career khách gửi 2026-08-26 | Toàn bộ label/string trong §9 |
⚠️
References/CR/— grep toàn bộ vớirippling,dots,vacation,PTO,pay date,payout,career,W-2: không có CR nào thay đổi phần hiển thị Career & HR. Các CR có chạm Rippling/Dots (CR-20260812-010ICA TTL 7 ngày,CR-20260812-006Dots suspension listener,CR-20260813-001Dots song song Veriff) đều thuộc STAGE 3 KYC & Live Onboarding, không ảnh hưởng màn này. Không có conflict CR cần xử lý.
1. Câu hỏi cần khách / BE chốt
| ID | Loại | Câu hỏi | Vì sao phải chốt | Status | BA Answer |
|---|---|---|---|---|---|
| Q-01 | BLOCKING BE | Field nào phân biệt US W-2 Employee vs International Contractor? GET /hr-integration chỉ trả compensation_track (Standard/Flex), nhưng US Track B (Flex Cash) và International Contractor đều mang Flex. Current Level Detail thì nói "Evaluate the user's Level and W-2 status" — tức là có discriminator nhưng chưa từng được đặt tên trong payload nào | Thiếu field này thì 4 tile + 1 button cùng chết: badge Employment status không resolve được, [Manage Payouts] không biết ẩn/hiện, Benefits / Vacation days / Next pay date không chọn được state. Trùng Open Item #8 của UC_4.16.1 | Pending BA answer | — |
| Q-02 | BLOCKING BE | Refresh cadence của read Rippling là gì — gọi API live mỗi request hay cache có TTL? (BA raise 2026-08-15 trong QnA STAGE 2, chưa đưa khách) | Quyết định "current" trên màn này nghĩa là gì; và quyết định trader book PTO trong Rippling xong quay lại dashboard thấy số mới ngay hay vài giờ sau. Cũng quyết định rate-limit Rippling có lộ ra trader không | Pending BA answer | — |
| Q-03 | BLOCKING BE | vacation_days là số ngày CÒN LẠI hay số ngày ĐƯỢC CẤP? Flow 13 Path A check Used_DTO vs DTO_Days ⇒ Rippling có cả 2 số. Design frame vẽ 10 trên caption 10 days PTO (Levels 6-13) — đúng lúc 2 số bằng nhau nên che mất hoàn toàn sự mơ hồ | Nếu là entitlement, trader đã dùng 8/10 ngày vẫn đọc thấy 10 và lên kế hoạch trên số ngày họ không có | Pending BA answer | — |
| Q-04 | UX | Tile Vacation days hiển thị gì cho International Contractor? Flow 13 Path B cho "No limit on requested days" (hiatus không lương) — đây không phải một balance | Render 0 sẽ đọc thành "bạn không có ngày nghỉ nào", ngược hoàn toàn với sự thật. Có thể phải ẩn hẳn tile | Pending BA answer | — |
| Q-05 | UX | Caption chu kỳ trả lương là chuỗi cố định hay derive? Design frame hardcode Bi-weekly direct deposit, nhưng trigger Flow 34 là "Bi-Weekly/Monthly Payroll Run Cleared", còn International Contractor là retainer hằng tháng qua Dots (Flow 36) | Trader trả lương theo tháng mà màn hình bảo họ được trả 2 tuần/lần → ticket payroll. Cần hoặc thêm field cadence vào payload, hoặc chốt rule derive | Pending BA answer | — |
| Q-06 | CONFLICT | payout_portal_url nhánh W-2 giờ thành dead data. RFQ quy định Level 6+ US W-2 ⇒ payout_portal_url = Rippling employee portal URL. Nhưng chỉ đạo khách 2026-08-26 ẩn [Manage Payouts] đúng với nhóm đó ⇒ nhánh này không còn ai consume trên tab Career | Cần xác nhận BE có ngừng populate nhánh Rippling không, hay còn consumer khác. Cũng cần xác nhận không có chỗ nào khác trên dashboard render link payout cho trader W-2 | Pending BA answer | — |
| Q-07 | UX | [View in Rippling] có hiện cho trader không phải W-2 không? Flow 6 Path B ghi "No Rippling API action is required, as the International Contractor signed their agreement at Level 1" ⇒ họ có record Rippling (cho ICA) nhưng không có payroll/PTO/benefits trong đó. Chỉ đạo khách không nêu điều kiện hiển thị | Contractor bấm vào employee portal trống trơn = dead end khó hiểu; nhưng ẩn đi thì mất luôn đường vào ICA đã ký của họ. Cả 2 phương án đều hợp lý — khách phải chọn | Pending BA answer | — |
| Q-08 | UI | Copy cho empty state và error state của từng tile là gì? Không source nào của khách cho chuỗi "chưa có gói benefits", "chưa có lương cứng", "PTO không khả dụng", "Rippling unreachable" | 6 tile × 3 state không có copy = FE không build được, QC không test được. Chốt xong phải đăng ký toast vào Common_rule/list-toast-popup.md cạnh TE-SYS-01 | Pending BA answer | — |
| Q-09 | UI | Benefits hiển thị rút gọn (~$13K) hay đầy đủ? Design frame vẽ dạng rút gọn có dấu ngã — CR-11 không định nghĩa dạng này | Nếu khách muốn rút gọn thì phải chốt rule làm tròn (~$13K từ $13,412?) và bổ sung clause abbreviated-display vào CR-11 để các màn khác làm giống hệt | Pending BA answer | — |
| Q-10 | BLOCKING BE | Path chính xác của 2 endpoint là gì? RFQ chỉ đặt tên chức năng (HR Integration, Current Level Detail), không cho route | SRS đang viết GET /hr-integration và GET /current-level-detail theo convention của các UC dashboard khác. Phải pin trước khi FE integrate | Pending BA answer | — |
| Q-11 | BE | Current Level Detail và HR Integration trùng dữ liệu — cái đầu đã trả Salary và PTO, cái sau trả base_salary_annualized và vacation_days. Field nào là source of truth cho tab Career? | Nếu 2 endpoint trả 2 giá trị lệch nhau, cùng một màn hình sẽ hiển thị 2 sự thật khác nhau tuỳ tile. SRS đang viết theo hướng HR Integration thắng cho 4 tile HR, Current Level Detail chỉ dùng cho Level/Title/payout_portal_url | Pending BA answer | — |
| Q-12 | UX | Tab Career có tồn tại cho trader LIVE Level 1–5 không? [HR-DEF-01] nói Career & HR chỉ có khi trader đã contracted; nhưng Level 1–5 là contractor 1099/ICA, Base_Income = $0, DTO_Days = 0 ⇒ 4/6 tile đều empty | Nếu tab hiện với gần như toàn bộ tile rỗng thì trải nghiệm rất tệ — có thể phải ẩn tab hoặc đổi layout cho nhóm này. SRS đang viết là tab vẫn hiện, tile tự degrade | Pending BA answer | — |
| Q-13 | UX | Trader được promote khi đang đứng ở tab Career thì sao? UC này không listen LEVEL_PROMOTION; cinematic force-redirect sang tab Command ([LUC-UI-04]) rồi trader tự quay lại | SRS đang viết là dữ liệu chỉ refresh khi remount tab. Cần xác nhận khách chấp nhận việc Current level / Base salary "cũ" trong khoảng thời gian đó | Pending BA answer | — |
| Q-14 | TRACEABILITY | Design frame màn Career (2026-08-26) chưa được check vào References/Wireframe/. Toàn bộ string trong §9 đang cite tới một artefact repo không giữ | Fail source-of-truth audit. Cùng finding với Open Item #14 của UC_4.16.1 | Pending BA answer | — |
2. Giả định BA tự đóng (không chặn viết doc)
| ID | Giả định | Căn cứ | Đã viết vào |
|---|---|---|---|
| A-01 | Tab Career là read surface thuần, không có bất kỳ request ghi nào (POST/PUT/PATCH/DELETE) | [HR-DEF-01] verbatim: "You are just reading in the current value in this screen" | BR_4.16.2.12 |
| A-02 | 2 endpoint gọi song song, độc lập, fail cái nào chỉ hỏng tile của cái đó | Không source nào ràng buộc thứ tự; ghép chuỗi sẽ làm cả tab chết vì 1 lỗi | BR_4.16.2.2, BR_4.16.2.13 |
| A-03 | Tab Career tái dùng response Current Level Detail mà dashboard đã gọi lúc load, không gọi lại lần 2 | RFQ ghi rõ payout_portal_url được cấp "upon dashboard load" | BR_4.16.2.2 |
| A-04 | Fetch on mount, không polling, không WebSocket cho dữ liệu HR | Không giá trị nào trên tab này đổi theo nhịp trading; vacation_days đổi khi Rippling duyệt, next_pay_date đổi khi chạy payroll | BR_4.16.2.14 |
| A-05 | null render empty state, tuyệt đối không thay bằng 0 / $0.00 / ngày bịa | "Chưa biết" và "bằng 0" là 2 sự thật khác nhau; với salary và PTO thì nhầm lẫn này gây thiệt hại thật | BR_4.16.2.13 |
| A-06 | Title lấy từ Level Title của Table A/B, FE không tự suy ra từ số level | Cùng nguyên tắc với UC_4.16.1 — Zapier Table chỉ đọc server-side | BR_4.16.2.4 |
| A-07 | base_salary_annualized đã được annualize server-side; FE không bao giờ quy đổi từ Hourly sang năm | Flow 8 đã định nghĩa sẵn công thức quy đổi (Rate × ((Standard_Hours × 52) / 12)) ở phía server | BR_4.16.2.5 |
| A-08 | Track B (Flex Cash) và contractor không có benefits_estimate | Flow 6 chỉ cho enroll benefits ở Track A (Full Benefits) | BR_4.16.2.6 |
| A-09 | Band DTO_Days: L1–5 = 0 · L6–13 = 10 · L14–21 = 15 · L22–24 = 20; resolve server-side | Đọc trực tiếp cột DTO_Days của Table A và Table B; khớp caption 10 days PTO (Levels 6-13) trong design frame | BR_4.16.2.7 |
| A-10 | Cả 2 button đều target="_blank" + rel="noopener noreferrer", không kèm token/user_id/PII trên URL, không interstitial/confirm/toast | RFQ ghi "standard target="_blank" redirect to open the static vendor URL"; static URL ⇒ vendor tự authenticate | BR_4.16.2.11 |
| A-11 | [Manage Payouts] khi không đủ điều kiện thì ẩn hẳn, không render dạng disabled | Chỉ đạo khách dùng đúng chữ "hide this button"; button payout trỏ vào hư vô còn tệ hơn không có button | BR_4.16.2.9 |
| A-12 | [View in Rippling] vẫn render kể cả khi cả 2 endpoint fail | URL của nó là environment config, không phải response data. Khi dashboard không hiển thị nổi dữ liệu HR thì lối thoát sang hệ thống sở hữu dữ liệu đó càng phải sống | BR_4.16.2.13 |
| A-13 | TE-SYS-01 bắn 1 lần / 1 lần load tab, không phải mỗi tile lỗi một toast | Nhất quán với cách các UC dashboard khác dùng TE-SYS-01 | BR_4.16.2.13 |
| A-14 | Không có nút retry và không auto-retry trên tab này; recovery = vào lại tab | Dữ liệu tĩnh, không đáng thêm state machine retry | BR_4.16.2.13 |
| A-15 | Mọi tile dùng wrap text, không truncate ellipsis | Salary hoặc pay date bị cắt là không đọc được, khác với việc chỉ bị nén | BR_4.16.2.15 |
3. Impact sang tài liệu khác
| # | Tài liệu | Impact | Trạng thái |
|---|---|---|---|
| 1 | UC_4.16.1 (Level-Up Cinematic & Certificate) | Đã đổi số từ UC_4.16.2 → UC_4.16.1 cho khớp WBS. BR_4.16.2.x → BR_4.16.1.x, title đổi thành "Level-Up Cinematic & Certificate (LIVE)", BR_4.16.1.1 giờ trỏ các tile HR sang UC này | ✅ Đã apply |
| 2 | UC_4.1.1–4.1.5 §UC_4.1.2 Sidebar Tab List | Dòng map tab Career phải trỏ cả 2 UC: UC_4.16.1 (certificate) + UC_4.16.2 (HR tiles), bỏ ghi chú "the remaining HR tiles are not documented" | ✅ Đã apply |
| 3 | dashboard_live/index.md | Bảng UC index: UC_4.16.1 = Level-Up Cinematic & Certificate (đã có doc), UC_4.16.2 = Career & HR Widget (đã có doc) | ✅ Đã apply |
| 4 | UC_4.1-4.17/index.md | Dòng map Career & HR Widget → UC_4.16.2 (giữ nguyên, nay đã có doc thật) | ✅ Đã apply |
| 5 | References/WBS/[BA Internal] Stacktrading.csv | Row UC_4.16.2 đang trống toàn bộ Mapping BE / Mapping FE / Mapping 3rd party / Reference. Cần BA cập nhật: BE = GET /hr-integration + GET /current-level-detail; FE = 6 tile + 2 outbound button; 3rd = Rippling, Dots | ⏳ Chờ BA cập nhật WBS |
| 6 | Common_rule/list-toast-popup.md | Sau khi chốt Q-08, đăng ký copy empty/error state của các tile HR (nếu khách muốn toast riêng thay vì dùng chung TE-SYS-01) | ⏳ Chờ Q-08 |
| 7 | Common_rule/common_rules.md — CR-11 | Sau khi chốt Q-09, bổ sung clause abbreviated monetary display (~$13K) để mọi màn làm giống nhau | ⏳ Chờ Q-09 |
| 8 | UC_4.17.2 (Account Actions — Resign Account) | Nút đỏ Resign & Close Account nằm cùng màn Career theo RFQ §Part C. Cần cross-ref 2 chiều để không ai viết trùng | ⏳ Cần rà |
| 9 | STAGE 5: PAYOUT & WITHDRAWAL (chưa viết) | UC này chỉ định nghĩa [Manage Payouts] hiện/ẩn và trỏ đi đâu. Toàn bộ cơ chế payout ở phía bên kia link thuộc STAGE 5 — phải nhất quán về việc trader W-2 không có route payout từ dashboard | ⏳ Chưa viết |
| 10 | STAGE 6: CAREER PATH & PROFESSIONALIZATION (chưa viết) | Flow 6 / Flow 8 / Flow 13 là producer của mọi giá trị trên tab này. Cần nhất quán về Comp_Track, Standard_Hours, DTO_Days và discriminator W-2 của Q-01 | ⏳ Chưa viết |
| 11 | References/Customer supplies/_SOURCE_MANIFEST.yaml | Design frame màn Career 2026-08-26 chưa có entry (cùng vấn đề với 2 file của UC_4.16.1) | ⏳ Chờ Q-14 |