209 lines
7.3 KiB
Markdown
209 lines
7.3 KiB
Markdown
# BR — Business Rules — <Tên module>
|
||
|
||
| | |
|
||
|---|---|
|
||
| **Version** | 1.0 |
|
||
| **Date** | YYYY-MM-DD |
|
||
| **Author** | <BA> (skill ba-2-analysis) |
|
||
| **Status** | 🟡 Draft |
|
||
| **Approved by** | — |
|
||
| **Source** | |
|
||
| **Scope** | |
|
||
|
||
## Change Log
|
||
|
||
| Version | Date | Người sửa | Thay đổi | CR |
|
||
|---|---|---|---|---|
|
||
|
||
---
|
||
|
||
## 1. Danh sách quy tắc
|
||
|
||
> **Rule sống độc lập với user story.** Cùng một rule thường chi phối nhiều US; nhét rule
|
||
> vào mô tả US thì sửa một chỗ sẽ quên chín chỗ.
|
||
|
||
### BR-001 — <tên ngắn>
|
||
|
||
| | |
|
||
|---|---|
|
||
| **Loại** | Ràng buộc dữ liệu / Điều kiện hành động / Tính toán / Quy trình-phê duyệt |
|
||
| **Nguồn** | 🔴 Quy định pháp luật / 🟠 Hợp đồng-chính sách / 🟢 Thói quen nội bộ |
|
||
| **Người chốt** | STK-nn, ngày… |
|
||
| **RQ** | RQ-007 |
|
||
| **US áp dụng** | US-011, US-013 |
|
||
| **Khi vi phạm** | Chặn / Cảnh báo cho qua / Chỉ ghi log |
|
||
| **Có ngoại lệ** | Không / Có — ai được cho phép: … |
|
||
| **Có thể đổi trong 1 năm** | Có / Không |
|
||
|
||
**Phát biểu:**
|
||
> *(một câu, một quy tắc — quy tắc W1)*
|
||
|
||
**Điều kiện áp dụng:** *(khi nào rule này có hiệu lực)*
|
||
|
||
**Ví dụ đúng / sai:**
|
||
|
||
| Trường hợp | Dữ liệu | Kết quả mong đợi |
|
||
|---|---|---|
|
||
| Hợp lệ | | Cho qua |
|
||
| Vi phạm | | Chặn, báo `E-XXX-0001` |
|
||
| Biên | | |
|
||
|
||
---
|
||
|
||
**Cột `Nguồn` quyết định độ cứng của rule:**
|
||
|
||
| Nguồn | Được đề xuất bỏ/sửa không |
|
||
|---|---|
|
||
| 🔴 Quy định pháp luật | Không. Chỉ tuân thủ, và phải ghi rõ điều khoản nào |
|
||
| 🟠 Hợp đồng / chính sách công ty | Có, nhưng phải qua cấp ký hợp đồng/chính sách |
|
||
| 🟢 Thói quen nội bộ | Có — và **nên hỏi** khi nó đang cản trở, vì thường không ai nhớ vì sao có |
|
||
|
||
## 2. Bảng tổng hợp
|
||
|
||
| ID | Tên | Loại | Nguồn | US áp dụng | Khi vi phạm | Mã lỗi (GĐ3) |
|
||
|---|---|---|---|---|---|---|
|
||
| BR-001 | | | 🔴 | US-011 | Chặn | E-STL-0001 |
|
||
|
||
## 3. Vòng đời trạng thái
|
||
|
||
*Bắt buộc với mọi thực thể có trạng thái (quy tắc W6).*
|
||
|
||
### Thực thể: `<tên>`
|
||
|
||
**Bốn câu phải trả lời:**
|
||
|
||
| Câu hỏi | Trả lời |
|
||
|---|---|
|
||
| Trạng thái khởi tạo | |
|
||
| Trạng thái cuối (không đi tiếp được) | |
|
||
| Từ trạng thái cuối quay lại được không | |
|
||
| Trạng thái nào cho phép xoá | |
|
||
|
||
**Sơ đồ:**
|
||
|
||
```mermaid
|
||
stateDiagram-v2
|
||
state "Nháp" as Nhap
|
||
state "Chờ duyệt" as ChoDuyet
|
||
state "Đã duyệt" as DaDuyet
|
||
state "Đã đóng" as DaDong
|
||
|
||
[*] --> Nhap
|
||
Nhap --> ChoDuyet: gửi duyệt (đủ trường bắt buộc)
|
||
ChoDuyet --> DaDuyet: duyệt
|
||
ChoDuyet --> Nhap: từ chối
|
||
DaDuyet --> DaDong: đóng (có ghi chú lý do)
|
||
DaDong --> [*]
|
||
```
|
||
|
||
*ID trạng thái không dấu, nhãn có dấu — xem `../../ba-lifecycle/references/diagram-rules.md` §1.*
|
||
|
||
**Bảng chuyển trạng thái:**
|
||
|
||
| # | Nguồn | Sự kiện | Điều kiện | Đích | Ai được làm | BR | Ghi vết |
|
||
|---|---|---|---|---|---|---|---|
|
||
| 1 | Nháp | Gửi duyệt | Đã điền đủ trường bắt buộc | Chờ duyệt | Người tạo | BR-005 | ✅ |
|
||
|
||
**Chuyển trạng thái KHÔNG được phép** *(ghi ra để dev biết mà chặn):*
|
||
|
||
| Từ | Sang | Vì sao cấm |
|
||
|---|---|---|
|
||
| Đã đóng | Nháp | Mất dấu vết đối soát |
|
||
|
||
## 4. Mô hình dữ liệu khái niệm (ERD)
|
||
|
||
🔴 **Mục bắt buộc khi US có từ 2 thực thể trở lên.** Không có nó, dev tự suy ra quan hệ giữa
|
||
các thực thể từ những bảng field rời rạc của từng màn hình — và mỗi người suy một kiểu.
|
||
|
||
```mermaid
|
||
erDiagram
|
||
CUA_HANG ||--o{ GIAO_DICH : "phát sinh"
|
||
GIAO_DICH ||--o| CHENH_LECH : "sinh ra khi lệch"
|
||
NGUOI_DUNG ||--o{ CHENH_LECH : "xử lý"
|
||
|
||
CUA_HANG {
|
||
string ma_cua_hang PK "3-20 ký tự"
|
||
string ten
|
||
enum trang_thai
|
||
}
|
||
GIAO_DICH {
|
||
bigint id PK
|
||
string ma_cua_hang FK
|
||
decimal so_tien "VND"
|
||
datetime thoi_diem "UTC"
|
||
}
|
||
CHENH_LECH {
|
||
bigint id PK
|
||
bigint giao_dich_id FK
|
||
decimal so_tien "VND"
|
||
enum trang_thai
|
||
}
|
||
```
|
||
|
||
*Tên thực thể **không dấu, viết hoa**; tên tiếng Việt để ở bảng §4.1. Ký hiệu lực lượng:
|
||
`||--o{` một-nhiều · `||--||` một-một · `||--o|` một-không hoặc một · `}o--o{` nhiều-nhiều.*
|
||
|
||
🔴 **Đây là mô hình khái niệm, không phải schema.** Nêu thực thể, quan hệ, khoá nghiệp vụ.
|
||
**Không** nêu kiểu dữ liệu vật lý, index, bảng trung gian, chiến lược phân mảnh — đó là việc
|
||
của Solution Architect và dev.
|
||
|
||
### 4.1 Bảng thực thể *(bắt buộc đi kèm sơ đồ — quy tắc W13)*
|
||
|
||
| Thực thể | Tên nghiệp vụ | Khoá nghiệp vụ | Số bản ghi hiện có | Ai tạo | Vòng đời | BR |
|
||
|---|---|---|---|---|---|---|
|
||
| `CUA_HANG` | Cửa hàng | `ma_cua_hang` | ~1.200 | Admin | §3 | BR-021 |
|
||
|
||
**Khoá nghiệp vụ** là thứ người dùng dùng để nhận biết, không phải id kỹ thuật. Nó quyết
|
||
định quy tắc chống trùng — thiếu cột này thì rule "không được trùng" không có nghĩa.
|
||
|
||
### 4.2 Quan hệ cần làm rõ
|
||
|
||
*Sơ đồ chỉ vẽ được lực lượng. Bốn câu sau phải trả lời bằng chữ:*
|
||
|
||
| Quan hệ | Xoá bên "một" thì bên "nhiều" ra sao | Bắt buộc có quan hệ? | Đổi được sang bên khác? | BR |
|
||
|---|---|---|---|---|
|
||
| `CUA_HANG` → `GIAO_DICH` | Chặn xoá nếu còn giao dịch | ✅ giao dịch luôn thuộc 1 cửa hàng | ❌ | BR-006 |
|
||
|
||
### 4.3 Thực thể ngoài phạm vi
|
||
|
||
*Thực thể có nhắc tới nhưng do hệ thống khác sở hữu — nêu rõ để không ai định tạo bảng cho nó.*
|
||
|
||
| Thực thể | Ai sở hữu | Lấy về bằng cách nào | Cache không |
|
||
|---|---|---|---|
|
||
|
||
## 5. Công thức tính toán
|
||
|
||
| ID | Đại lượng | Công thức | Đơn vị | Làm tròn | Nguồn dữ liệu | Ví dụ |
|
||
|---|---|---|---|---|---|---|
|
||
| BR-0nn | Chênh lệch | tổng POS − tổng hệ thống | VND | Tới đơn vị, làm tròn xuống | | 1.234.567 − 1.234.000 = 567 |
|
||
|
||
🔴 Ghi rõ: **thứ tự phép tính**, **làm tròn ở bước nào** (làm tròn từng dòng rồi cộng ≠ cộng
|
||
rồi làm tròn), **múi giờ** với mọi mốc thời gian, **tiền tệ** với mọi số tiền.
|
||
|
||
## 6. Kiểm tra mâu thuẫn giữa các rule
|
||
|
||
*Đối chiếu từng cặp rule cùng tác động lên một thực thể.*
|
||
|
||
| # | Rule A | Rule B | Mâu thuẫn ở đâu | Trạng thái |
|
||
|---|---|---|---|---|
|
||
| 1 | BR-003 | BR-011 | | 🔴 Chờ PO quyết — OQ-0nn |
|
||
|
||
Không tự chọn bên nào. Đưa PO quyết, ghi vào `DEC-nn`.
|
||
|
||
## 7. Rule của hệ thống hiện tại bị thay đổi
|
||
|
||
*Chỉ dùng khi làm enhancement.*
|
||
|
||
| Rule cũ | Đang áp dụng ở đâu | Đổi thành | Dữ liệu cũ theo rule cũ xử lý sao |
|
||
|---|---|---|---|
|
||
|
||
## 8. Open Questions
|
||
|
||
| ID | Câu hỏi | Hỏi ai | Từ ngày | Chặn gì |
|
||
|---|---|---|---|---|
|
||
|
||
## 9. Ngoài phạm vi
|
||
|
||
- Thông điệp lỗi hiển thị nguyên văn → GĐ3 `SRS` §bảng mã lỗi
|
||
- Ai được thực hiện hành động → `RBAC_…md`
|