# BR — Business Rules — | | | |---|---| | **Version** | 1.0 | | **Date** | YYYY-MM-DD | | **Author** | (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 — | | | |---|---| | **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ể: `` **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`