Giao diện
US-E02: Retry các flow FAIL và chờ cron xử lý ​
Thuộc FS: 00-overview.md — SAPP-20603 eContract (Retry · Check luồng · Thống kê lỗi) 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.
⚠️ Ghi PROD — đây là thao tác ghi production duy nhất của nhóm SAPP-20603:
UPDATE retry = 0trên DB econtract PRODUCTION của SAPP; khoảng 1 phút sau, cron của econtract-payment chạy lại luồng và gọi nhà cung cấp hợp đồng điện tử EFY/FPT thật (tạo / huỷ hợp đồng).
| Field | Value |
|---|---|
| US ID | US-E02 |
| Role thực hiện | R1 - Người dùng tool (Assumption (OQ về G-01) — OQ-E-04) |
| Phase | Đã triển khai (as-built @ e77c47a) — sub-tool sapp.005 Retry econtract |
| Priority | N/A — as-built |
| Status | Draft |
| NFR liên quan | NFR-E-01, NFR-E-06, NFR-E-07 — xem Overview §5 |
| OQ liên quan | OQ-E-01, OQ-E-02, OQ-E-03, OQ-E-05, OQ-E-06, OQ-E-08, OQ-E-09, OQ-E-12 — xem Overview §6 |
1. US Statement ​
text
As a Người dùng tool [Assumption (OQ về G-01)]
I want đặt lại lượt retry cho các flow process FAIL của một deal (sau khi xác nhận), rồi chờ cron
econtract chạy lại và xem kết quả
So that [Assumption — OQ-E-12] luồng hợp đồng điện tử của deal đã hết vòng tự động được chạy lại
mà không cần dev can thiệp trực tiếp DB prod2. Dependencies & Definition Of Ready ​
N/A — đã triển khai. Dependency runtime:
| # | Cần sẵn sàng | Ai cung cấp | Trạng thái |
|---|---|---|---|
| D1 | Như US-E01 D1–D3; thêm: user DB econtract prod có quyền UPDATE econtract_flow_processes | Admin CMS / SAPP | Runtime |
| D2 | Cron reTryFlow của econtract-payment đang chạy trên prod (mỗi phút — theo tài liệu, OQ-E-06) | SAPP | Runtime (ngoài repo) |
| D3 | US-E01 đã cho kết luận "Đủ điều kiện retry" | - | Trong màn |
3. Business Rules ​
| ID | Rule | Áp dụng ở | Đã cover bởi (AC) | Nguồn code (Mode B/C) |
|---|---|---|---|---|
| BR-01 | Nút "Retry process này" chỉ có khi kết luận bước 1 là Đủ điều kiện retry (US-E01 BR-06) | M1 - action A1 | AC-M1.1 | fe/src/ui/components/works/sapp/retry-econtract-tool.tsx:603-621 · :438-439 |
| BR-02 | Trước khi ghi phải qua hộp xác nhận tiêu đề "Retry deal <deal id>?", liệt kê từng dòng sẽ đặt lại dạng tên · FAIL · retry = N → 0 và câu "Cron của econtract sẽ chạy lại trong khoảng 1 phút."; nút "Retry" / "Huỷ". Huỷ thì không ghi | M1 - hộp xác nhận | AC-M1.2, AC-M1.3 | retry-econtract-tool.tsx:438-462 |
| BR-03 | BE kiểm tra lại điều kiện ngay trước khi ghi và từ chối (không ghi gì) với 4 mã: 13002 (404) deal không có flow process · 13063 (409) có ≥ 2 flow cùng tên · 13003 (409) không có dòng FAIL · 13006 (409) mọi dòng FAIL đã có retry = 0 (nghĩa là hệ thống sẽ tự chạy lại) | M1 - action A2 | EC-M1.1, EC-M1.2, EC-M1.3, EC-M1.4 | be/libs/modules/src/lib/sapp/common.service.ts:2428-2468 · be/libs/constants/src/lib/error-codes/error-codes.constants.ts:523-557 |
| BR-04 | Ghi: đặt retry = 0 cho các dòng FAIL có retry ≥ 1 của deal trên DB econtract PROD, trong 1 lệnh; trả lại toàn bộ dòng của deal sau khi cập nhật | M1 - action A2 | AC-M1.4 | common.service.ts:2470-2476 · be/apps/api/src/sapp/sapp.controller.ts:192-210 |
| BR-05 | Retry chỉ chạy lại luồng econtract, không đổi deal stage trên HubSpot và không gọi EFY/FPT trực tiếp (việc gọi do cron econtract-payment làm) | M1 - action A2 | AC-M1.4, AC-X.1 | retry-econtract-tool.tsx:533-534 · common.service.ts:1707-2487 (không lời gọi HubSpot) |
| BR-06 | Lỗi khác khi ghi (DB, mạng…) → mã 13005; thiếu cấu hình kết nối → 13001 | M1 - action A2 | EC-M1.5 | common.service.ts:2477-2486 · :1685-1704 · error-codes.constants.ts:518-542 |
| BR-07 | Ghi thành công → vào Chờ cron: thông báo "Đã đặt lại retry = 0 — cron sẽ chạy lại trong ~1 phút", đếm ngược tới giây 15 của phút kế tiếp rồi tự đọc lại flow process (chỉ đọc) | M2 - vùng Chờ cron | AC-M2.1 | retry-econtract-tool.tsx:110-117 · :356-371 · :386-401 · :623-654 |
| BR-08 | Kết quả theo các dòng đang theo dõi: có dòng FAIL với retry ≥ 1 → Vẫn FAIL; không có, nhưng còn dòng chưa SUCCESS → Chưa chạy; mọi dòng SUCCESS → SUCCESS | M2 - badge kết quả | AC-M2.2, AC-M2.3, AC-M2.4 | retry-econtract-tool.tsx:98-108 · :266-290 |
| BR-09 | Dòng được theo dõi = các dòng đủ điều kiện ở bước 1 (không đánh giá lại từ dữ liệu sau khi đặt lại); vùng kết quả chỉ hiện các dòng này | M2 | AC-M2.2 | retry-econtract-tool.tsx:362-369 · :656-661 |
| BR-10 | Kết quả khác SUCCESS → nút "Kiểm tra lại (về bước 1)": quay lại bước 1 với deal đang ở ô nhập, tăng "Lượt N" | M2 - action A3 | AC-M2.5 | retry-econtract-tool.tsx:669-679 · :413-436 · :575 |
| BR-11 | Kết quả SUCCESS → link "Xem chi tiết ở Check luồng econtract" (chi tiết US-E03) | M2 | AC-M2.2 | retry-econtract-tool.tsx:662-668 |
| BR-12 | ≥ 2 lượt liên tiếp "Chưa chạy" → hiện ghi chú liên hệ developer + nút copy (US-E03); một lượt không phải "Chưa chạy" đặt lại bộ đếm | M2 | AC-M2.6 | retry-econtract-tool.tsx:382 · :520 |
| BR-13 | Đếm ngược tính theo mốc tuyệt đối (tab chạy nền không bị trôi) và chỉ đọc lại 1 lần mỗi lượt chờ | M2 | AC-M2.1 | retry-econtract-tool.tsx:386-401 |
Không phải BR (hành vi
⚠️ Observed, xem AC-M1.5, EC-M1.6, EC-M1.7): reset nhiều flow khác tên cùng lúc (OQ-E-02) · nhánh dự phòng ghi không hỏi (OQ-E-08) · không có nhật ký Retry (OQ-E-03) · route ghi không đòi đăng nhập (NFR-E-01, OQ-E-01).
4. Design ​
a. Mối liên hệ giữa các màn & User Flow ​
text
[US-E01: Đủ điều kiện retry]
↓ bấm "Retry process này"
[M1: Hộp xác nhận "Retry deal <id>?"]
├─ Huỷ ───────────────→ đóng hộp, không ghi, vẫn ở "Đủ điều kiện retry"
└─ Retry ──→ POST retry (⚠️ GHI PROD)
├─ BE từ chối 13002/13063/13003/13006, lỗi 13005/13001 → hộp lỗi "Không retry được flow process"
└─ OK → [M2: Chờ cron] đếm ngược tới giây 15 phút kế → đọc lại (chỉ đọc)
├─ SUCCESS ──→ badge xanh + link Check luồng (US-E03 → US-E04)
├─ Vẫn FAIL ─→ badge đỏ + "Kiểm tra lại (về bước 1)"
└─ Chưa chạy → badge vàng + "Kiểm tra lại"; ≥ 2 lượt liên tiếp → ghi chú liên hệ dev
Phía econtract-payment (theo tài liệu, ngoài repo): cron reTryFlow mỗi phút lấy dòng FAIL · retry = 0
→ chạy lại → gọi EFY/FPT thật → SUCCESS hoặc FAIL · retry = 1b. Chi tiết từng màn ​
Màn M1 - Hộp xác nhận Retry (trên màn Retry econtract) ​
| Field | Value |
|---|---|
| Figma frame | N/A |
| Trigger vào màn | Bấm "Retry process này" ở khung "Đủ điều kiện retry" (US-E01 AC-M1.6) |
| Mô tả ngắn | Hộp xác nhận chung của ứng dụng; chặn thao tác ghi prod bằng một lần bấm (comment code: "one click is too little for that") |
UI States ​
| State | Khi nào | Hiển thị | Figma frame |
|---|---|---|---|
| Default | Vừa mở hộp | Tiêu đề "Retry deal <id>?"; "Sẽ đặt lại retry = 0 cho:"; mỗi dòng tên · FAIL · retry = N → 0; "Cron của econtract sẽ chạy lại trong khoảng 1 phút."; nút "Retry" và "Huỷ". Hộp không bật kiểu "thao tác nguy hiểm" (nút màu lỗi) — fe/src/logic/contexts/app-status.provider.tsx:43 | N/A |
| Loading | Sau khi bấm Retry, đang gọi API | Hộp đóng; nút ở khung đổi thành "Đang retry…" và bị khoá | N/A |
| Has data | Ghi thành công | Chuyển sang M2 | N/A |
| Empty | N/A — hộp chỉ mở khi có ≥ 1 dòng đủ điều kiện | - | N/A |
| Error | BE từ chối / lỗi | Hộp lỗi "Không retry được flow process" + thông điệp (mã) | N/A |
| Disabled | Đang có lời gọi khác | Nút "Retry process này" bị khoá | N/A |
Fields ​
| Field | Required | Type | Default | Format | Validation | Error Message | Visibility | Depends On |
|---|---|---|---|---|---|---|---|---|
| (hiển thị) Danh sách dòng sẽ đặt lại | - | Text, mỗi dòng 1 mục | - | tên · FAIL · retry = N → 0 | Chỉ dòng FAIL retry ≥ 1 (US-E01 BR-06) | - | Always | Kết luận bước 1 |
Không có field nhập — deal id lấy từ lượt kiểm tra đang chạy (không đọc lại ô nhập).
Filter / Search / Sort (chỉ màn List/Report — xóa nếu không phải) ​
N/A — hộp xác nhận, không phải màn danh sách.
Actions ​
A1 - Mở hộp xác nhận ("Retry process này") ​
| Item | Description |
|---|---|
| Trigger | Bấm "Retry process này" |
| Behavior | Chỉ chạy khi kết luận là Đủ điều kiện (BR-01); dựng danh sách dòng và mở hộp xác nhận (BR-02). Không ghi hệ thống nào |
| Success Result | Hộp xác nhận hiện |
Error cases:
| Case | Expected Handling |
|---|---|
| ⚠️ Observed — ngữ cảnh không cấp hàm hộp xác nhận | Hành vi hiện tại: nhánh dự phòng gọi thẳng bước xác nhận → ghi prod ngay, không hỏi (EC-M1.6, OQ-E-08) |
A2 - Xác nhận "Retry" ​
| Item | Description |
|---|---|
| Trigger | Bấm "Retry" trong hộp xác nhận |
| Behavior | Đóng hộp → gọi POST /api/v1/sapp/prod/econtract/flow-processes/<dealId>/retry. BE đọc lại mọi dòng của deal, kiểm tra 4 điều kiện (BR-03), rồi chạy 1 lệnh đặt retry = 0 cho mọi dòng FAIL có retry ≥ 1 của deal (BR-04). ⚠️ Ghi PROD: hệ thống = DB MySQL econtract của SAPP, môi trường = PRODUCTION (kết nối SAPP_PROD_ECONTRACT_DB_*); hệ quả gián tiếp: cron econtract-payment gọi EFY/FPT thật (REL-03). Không ghi DB mind_keep, không ghi nhật ký thao tác (NFR-E-06) |
| Success Result | Nhận lại các dòng sau cập nhật; FE vào M2 (BR-07) |
Error cases:
| Case | Expected Handling |
|---|---|
13002 Econtract flow process not found for this deal (404) | Hộp lỗi "Không retry được flow process", không ghi |
13063 More than one econtract flow process with the same flow name… (409) | Hộp lỗi, không ghi |
13003 Econtract flow process is not in FAIL status (409) | Hộp lỗi, không ghi |
13006 …already queued for an automatic retry (retry = 0)… (409) | Hộp lỗi, không ghi |
13005 Failed to retry econtract flow process (400) / 13001 DB not configured (400) | Hộp lỗi; với 13005 không biết chắc lệnh UPDATE đã chạy hay chưa (lỗi có thể xảy ra ở bước đọc lại sau ghi) |
A3 - Huỷ ​
| Item | Description |
|---|---|
| Trigger | Bấm "Huỷ" |
| Behavior | Đóng hộp, không gọi API, không ghi |
| Success Result | Vẫn ở khung "Đủ điều kiện retry" |
Error cases:
| Case | Expected Handling |
|---|---|
| N/A | - |
Acceptance Criteria của màn M1 ​
AC-M1.1 - Nút Retry chỉ có khi đủ điều kiện ​
gherkin
Given kết luận bước 1 là Dừng hoặc Hệ thống tự chạy
When màn hiển thị kết luận
Then không có nút "Retry process này"Maps to:
- Business Rule: BR-01
AC-M1.2 - Hộp xác nhận liệt kê từng dòng ​
gherkin
Given deal D đủ điều kiện với dòng CREATE_CONTRACT (FAIL, retry = 1)
When người dùng bấm "Retry process này"
Then hiện hộp "Retry deal D?" với dòng "CREATE_CONTRACT · FAIL · retry = 1 → 0"
And câu "Cron của econtract sẽ chạy lại trong khoảng 1 phút."
And chưa có lời gọi ghi nàoMaps to:
- Business Rule: BR-02
- Field/Action: A1
AC-M1.3 - Huỷ không ghi ​
gherkin
Given hộp xác nhận đang mở
When người dùng bấm "Huỷ"
Then hộp đóng và không có lời gọi POST retry
And DB econtract prod không đổiMaps to:
- Business Rule: BR-02
- Field/Action: A3
AC-M1.4 - Ghi PROD thành công ​
gherkin
Given hộp xác nhận đang mở cho deal D có dòng CREATE_CONTRACT (FAIL, retry = 1)
When người dùng bấm "Retry"
Then BE đặt retry = 0 cho dòng đó trên DB econtract PRODUCTION
And trả về mọi dòng của D sau cập nhật
And màn chuyển sang Chờ cron (M2)
And deal stage trên HubSpot không đổiMaps to:
- Business Rule: BR-04, BR-05
- Field/Action: A2
AC-M1.5 - ⚠️ Observed: nhiều flow FAIL khác tên bị đặt lại cùng lúc ​
gherkin
Given deal D có CREATE_CONTRACT (FAIL, retry = 1) và EFY_CANCEL_CONTRACT (FAIL, retry = 1)
When người dùng xác nhận Retry
Then hành vi hiện tại: cả hai dòng được liệt kê trong hộp xác nhận và cùng bị đặt retry = 0 trong một lệnh
And cron có thể chạy lại cả hai luồng (tạo và huỷ hợp đồng) ở lượt kế tiếpMaps to:
- Business Rule: N/A —
⚠️ Observed, cố ý hay bug → OQ-E-02 (common.service.ts:2462·:2470-2474)
Negative AC / Edge Cases của màn M1 ​
| ID | Tình huống | Hành vi mong đợi |
|---|---|---|
| EC-M1.1 | Giữa lúc kiểm tra và bấm Retry, mọi dòng của deal bị xoá | BE từ chối 13002, hộp lỗi "Không retry được flow process", không ghi |
| EC-M1.2 | Giữa chừng phát sinh dòng thứ hai cùng tên | BE từ chối 13063, không ghi |
| EC-M1.3 | Giữa chừng cron đã chạy lại thành công (không còn FAIL) | BE từ chối 13003, không ghi |
| EC-M1.4 | Giữa chừng reProcessFlow đã đưa dòng về retry = 0 (hoặc người khác vừa Retry) | BE từ chối 13006 "…already queued for an automatic retry…", không ghi |
| EC-M1.5 | DB lỗi / mất kết nối khi ghi | Hộp lỗi mã 13005; trạng thái dòng trên prod không xác định từ màn — người dùng "Kiểm tra" lại để xem |
| EC-M1.6 | ⚠️ Observed — ngữ cảnh giao diện không cấp hàm hộp xác nhận | Hành vi hiện tại: ghi prod ngay không hỏi (retry-econtract-tool.tsx:446). Thực tế provider có cấp (fe/src/logic/contexts/app-status.provider.tsx:148 · :188). OQ-E-08 |
| EC-M1.7 | ⚠️ Observed — cần biết ai đã Retry deal D lúc nào | Hành vi hiện tại: không có nhật ký thao tác, chỉ log lỗi BE. OQ-E-03, NFR-E-06 |
| EC-M1.8 | ⚠️ Observed — gọi thẳng API Retry không qua màn (không đăng nhập, tool đang khoá) | Hành vi hiện tại: BE vẫn ghi prod nếu đủ điều kiện BR-03. NFR-E-01 (→ NFR-P-01), OQ-E-01 |
| EC-M1.9 | Bấm "Retry" hai lần nhanh | Nút bị khoá khi đang gọi; nếu lời gọi thứ hai vẫn tới BE thì bị từ chối 13006 vì dòng đã về retry = 0 |
Màn M2 - Chờ cron & Kết quả (trên màn Retry econtract) ​
| Field | Value |
|---|---|
| Figma frame | N/A |
| Trigger vào màn | Ghi thành công ở M1 (hoặc US-E01 "Hệ thống tự chạy" — cùng vùng hiển thị, câu thông báo khác) |
| Mô tả ngắn | Stepper bước 3 "Chờ cron" rồi bước 4 "Kết quả"; đồng hồ đếm ngược m:ss; sau đó badge kết quả và các dòng đang theo dõi |
UI States ​
| State | Khi nào | Hiển thị | Figma frame |
|---|---|---|---|
| Default | Vừa vào chờ | "Đã đặt lại retry = 0 — cron sẽ chạy lại trong ~1 phút" + đồng hồ đếm ngược; ghi chú "Tool đọc lại trạng thái ở giây 15 của phút kế tiếp, cho job kịp chạy." | N/A |
| Loading | Đếm ngược về 0, đang đọc lại | "Đang đọc lại…" | N/A |
| Has data — SUCCESS | BR-08 | Badge "SUCCESS — đã chạy lại thành công"; bước 4 xong; link "Xem chi tiết ở Check luồng econtract" | N/A |
| Has data — Vẫn FAIL | BR-08 | Badge "Vẫn FAIL — lần chạy lại vừa rồi lỗi tiếp"; bước 4 đỏ; nút "Kiểm tra lại (về bước 1)" | N/A |
| Has data — Chưa chạy | BR-08 | Badge "Chưa chạy — cron chưa lấy process này"; nút "Kiểm tra lại (về bước 1)"; từ lượt thứ 2 liên tiếp thêm ghi chú liên hệ dev | N/A |
| Empty | N/A — luôn có ≥ 1 dòng theo dõi | - | N/A |
| Error | Đọc lại lỗi | Hộp lỗi "Không đọc lại được trạng thái" + thông điệp (mã) | N/A |
| Disabled | Đang chờ / đang đọc | Ô deal id và nút Kiểm tra bị khoá (US-E01 BR-08) | N/A |
Fields ​
| Field | Required | Type | Default | Format | Validation | Error Message | Visibility | Depends On |
|---|---|---|---|---|---|---|---|---|
| (hiển thị) Đồng hồ đếm ngược | - | Text | Thời gian tới giây 15 của phút kế tiếp | m:ss | - | - | Khi đang chờ | BR-07 |
| (hiển thị) Badge kết quả | - | Badge | - | 3 giá trị ở UI States | - | - | Sau khi đọc lại | BR-08 |
| (hiển thị) Dòng đang theo dõi | - | Danh sách như US-E01 BR-11 | - | - | - | - | Sau khi đọc lại | BR-09 |
| (hiển thị) Lượt N | - | Text | Ẩn ở lượt 1 | "Lượt N" | - | - | Từ lượt 2 | BR-10 |
Filter / Search / Sort (chỉ màn List/Report — xóa nếu không phải) ​
N/A — không phải màn danh sách.
Actions ​
A1 - Tự đọc lại sau đếm ngược ​
| Item | Description |
|---|---|
| Trigger | Hệ thống — đồng hồ về 0 |
| Behavior | Gọi đọc flow process của deal (chỉ đọc, DB econtract PROD), tính kết quả theo BR-08 trên các dòng theo dõi (BR-09) |
| Success Result | Badge kết quả + dòng theo dõi |
Error cases:
| Case | Expected Handling |
|---|---|
| Lỗi đọc | Hộp lỗi "Không đọc lại được trạng thái"; không có kết quả, người dùng Kiểm tra lại từ ô nhập |
A2 - Mở Check luồng (khi SUCCESS) ​
| Item | Description |
|---|---|
| Trigger | Bấm "Xem chi tiết ở Check luồng econtract" |
| Behavior | Xem US-E03 A2 |
| Success Result | Màn Check luồng mở với deal hiện tại |
Error cases:
| Case | Expected Handling |
|---|---|
| N/A | - |
A3 - Kiểm tra lại (về bước 1) ​
| Item | Description |
|---|---|
| Trigger | Bấm "Kiểm tra lại (về bước 1)" khi kết quả khác SUCCESS |
| Behavior | Chạy lại US-E01 A1 với deal ở ô nhập, tăng "Lượt N"; giữ bộ đếm lượt "Chưa chạy" liên tiếp (BR-10, BR-12). Không ghi |
| Success Result | Kết luận bước 1 mới (thường là "Đủ điều kiện retry" lại nếu vẫn FAIL retry = 1) |
Error cases:
| Case | Expected Handling |
|---|---|
| Lỗi đọc | Như US-E01 A1 |
Acceptance Criteria của màn M2 ​
AC-M2.1 - Đếm ngược tới giây 15 phút kế ​
gherkin
Given Retry vừa thành công lúc 10:20:40
When màn vào bước Chờ cron
Then đồng hồ đếm ngược tới 10:21:15
And tới mốc đó màn tự đọc lại flow process đúng 1 lần, kể cả khi tab chạy nềnMaps to:
- Business Rule: BR-07, BR-13
AC-M2.2 - Kết quả SUCCESS ​
gherkin
Given dòng theo dõi CREATE_CONTRACT đọc lại có trạng thái SUCCESS
When màn đọc lại xong
Then hiện badge "SUCCESS — đã chạy lại thành công" và chỉ hiện dòng CREATE_CONTRACT
And có link "Xem chi tiết ở Check luồng econtract", không có nút "Kiểm tra lại"Maps to:
- Business Rule: BR-08, BR-09, BR-11
AC-M2.3 - Kết quả Vẫn FAIL ​
gherkin
Given một dòng theo dõi đọc lại vẫn FAIL với retry ≥ 1
When màn đọc lại xong
Then hiện badge "Vẫn FAIL — lần chạy lại vừa rồi lỗi tiếp" (kể cả khi dòng khác đã SUCCESS)
And bước 4 đánh dấu dừng và có nút "Kiểm tra lại (về bước 1)"Maps to:
- Business Rule: BR-08
AC-M2.4 - Kết quả Chưa chạy ​
gherkin
Given không dòng theo dõi nào FAIL với retry ≥ 1, và còn dòng chưa SUCCESS (vẫn FAIL retry = 0)
When màn đọc lại xong
Then hiện badge "Chưa chạy — cron chưa lấy process này" và nút "Kiểm tra lại (về bước 1)"Maps to:
- Business Rule: BR-08
AC-M2.5 - Kiểm tra lại tăng lượt ​
gherkin
Given kết quả lượt 1 là Vẫn FAIL
When người dùng bấm "Kiểm tra lại (về bước 1)"
Then màn chạy lại bước Kiểm tra cho cùng deal và hiện "Lượt 2"Maps to:
- Business Rule: BR-10
AC-M2.6 - Hai lượt Chưa chạy liên tiếp ​
gherkin
Given lượt trước kết quả Chưa chạy
When lượt kế tiếp cũng kết quả Chưa chạy
Then hiện ghi chú "Cần liên hệ developer để kiểm tra kỹ hơn…" và nút "Copy thông tin gửi dev"Maps to:
- Business Rule: BR-12
Negative AC / Edge Cases của màn M2 ​
| ID | Tình huống | Hành vi mong đợi |
|---|---|---|
| EC-M2.1 | Cron prod không chạy ở giây 0 mỗi phút (lịch khác) | Đọc lại quá sớm → "Chưa chạy"; người dùng Kiểm tra lại. Lịch cron chưa được xác nhận — OQ-E-06 |
| EC-M2.2 | Refresh / đóng tab khi đang đếm ngược | Mất trạng thái chờ; việc ghi prod đã xảy ra vẫn giữ nguyên; cron vẫn chạy phía econtract. Mở lại và Kiểm tra để xem |
| EC-M2.3 | Mở 2 tab cùng Retry 1 deal | Tab thứ hai bị BE từ chối 13006 (dòng đã về retry = 0) — EC-M1.4 |
| EC-M2.4 | Chạy lại xong lại FAIL (retry = 1) | Kết quả Vẫn FAIL; Kiểm tra lại cho kết luận Đủ điều kiện → có thể Retry tiếp (mỗi lần là 1 lần ghi prod + 1 lần gọi EFY/FPT) |
| EC-M2.5 | ⚠️ Observed — giờ "cập nhật" của dòng theo dõi | Có thể lệch múi giờ, như US-E01 EC-M1.4 (OQ-E-05) |
5. Cross-feature AC ​
AC-X.1 - Retry kích hoạt cron econtract gọi EFY/FPT thật ​
gherkin
Given Retry vừa đặt retry = 0 cho dòng CREATE_CONTRACT của deal D trên prod
When cron reTryFlow của econtract-payment chạy lượt kế tiếp (theo tài liệu: mỗi phút)
Then cron chạy lại luồng CREATE_CONTRACT và gọi nhà cung cấp EFY/FPT thật
And ghi kết quả vào flow process (SUCCESS, hoặc FAIL với retry = 1) và thêm 1 dòng job trace — thấy được ở US-E04 / US-E05Maps to:
- REL-03 (Be Affected - Cron econtract-payment + EFY/FPT)
AC-X.2 - Không đổi HubSpot ​
gherkin
Given Retry thành công cho deal D
When xem deal D trên HubSpot
Then deal stage không bị tool này thay đổiMaps to:
- REL-04 (Affects - HubSpot deal)