Quyền & phân quyền
Permission matrix v1.0 cho PrintUp P0 sau implementation freeze; authorization enforce tại API/server.
1. Nguyên tắc
Matrix này là implementation baseline v1.0. Guest là trạng thái chưa xác thực, không phải role: guest chỉ browse catalog, cấu hình sản phẩm và giữ cart cục bộ; mọi checkout/order/account data yêu cầu account đã xác thực.
Các invariant:
- Chỉ một Production Approver active tại một thời điểm.
- Chỉ Production Approver được approve file và approve production.
- Admin gán/thay Production Approver nhưng không tự có quyền approve nếu chưa được gán role đó.
- Accounting xác nhận/manual-reconcile payment, ghi refund execution, invoice và payout; Sales/Production không tự xác nhận tiền.
- Mọi account có thể apply Agent; chỉ Admin approve/reject/suspend.
- Management mặc định read-only.
- Authorization kiểm tại API/server, không dựa vào việc ẩn nút UI.
- Action nhạy cảm phải audit actor/time/action/target/reason và before-after khi phù hợp.
2. Ký hiệu
- Own: chỉ dữ liệu của account.
- R: read.
- RW: read/write theo state rule.
- A: approval/gate action.
- Admin: quản trị cấu hình/quyền.
- Request: gửi yêu cầu, không tự thực thi.
- —: không có quyền mặc định.
3. Permission matrix v1.0
| Tài nguyên / hành động | Customer | Agent | Sales | Production | Production Approver | Accounting | Admin | Management |
|---|---|---|---|---|---|---|---|---|
| Profile cá nhân/doanh nghiệp | Own RW | Own RW | R | — | R | R | RW | R |
| Address/contact | Own RW | Own RW | R | R khi fulfilment | R | R | RW | R |
| Cart | Own RW | Own RW | — | — | — | — | R support | — |
| Order | Own R; RW/cancel trước payment | Own R + referral scope | RW theo state | R | R | R | RW theo state | R |
| Cancel/change sau payment | Request | Request | Request | — | — | R | A/RW | R |
| Refund amount/decision | Request | — | Request | — | — | R | A/RW | R |
| Refund execution/reference | Own R | — | R | — | — | RW/A | R | R |
| Catalog/product/variant | R | R | R | R | R | R | Admin | R |
| Pricing config/margin/promo | — | — | R | R | R | R | Admin | R |
| Floor override one-off | — | — | Request | — | — | R | A | R |
| Manual quote | Own R/Accept | Own R/Accept | RW | — | R | R | RW | R |
| Public design URL | Own RW trước lock | — | R | R | RW note | — | R | — |
| File checklist result | Own R | — | R | R | RW/A | — | R | R |
| Approve file | — | — | — | — | A | — | — | — |
| Production order/ticket | Own status R | — | R | RW | RW | R | RW | R |
| Approve production | — | — | — | — | A | — | — | — |
| QC/Rework/Scrap record | Own status R | — | R | RW | RW | R | RW | R |
| Payment/SePay | Own R | — | R | R | R | RW | R | R |
| Manual payment reconciliation | — | — | — | — | — | RW/A | R | R |
| Invoice info trước Issued | Own RW | — | R | — | — | RW | R | R |
| Invoice Issued/adjustment ref/status | Own R | — | R | — | — | RW | R | R |
| Shipment/tracking/status | Own R | — | R | RW | RW | R | RW | R |
| Agent application | Own | Own | — | — | — | R | R | R |
| Agent approve/reject/suspend | — | — | — | — | — | R | A | R |
| Referral attribution | Own R | Own R | R | — | — | R | RW correction trước lock | R |
| Commission | — | Own R | R | — | — | RW | R | R |
| Monthly payout batch | — | Own R | — | — | — | RW/A | R | R |
| Notification delivery log | Own R | Own R | R | R | R | R | RW/support | R |
| Internal user activation/role | — | — | — | — | — | — | Admin | R |
| Gán Production Approver | — | — | — | — | — | — | Admin | R |
| Report tổng hợp | Own | Own scope | R | R | R | R | R | R |
| Yêu cầu xóa account/data | Request | Request | — | — | — | — | RW process | — |
| Soft-delete business data | — | — | — | — | — | — | Admin | — |
| Hard purge | — | — | — | — | — | — | Admin + strong confirm | — |
4. Ràng buộc kỹ thuật
- Reassign Production Approver phải atomic hoặc có cơ chế tương đương để không tồn tại hai approver active.
- File approval và production approval là hai action riêng dù cùng một người thực hiện.
- Production approval chỉ được phép khi payment = Paid và active design version = Approved.
- Manual SePay reconciliation lưu actor, time, source transaction, target order, amount và reason.
- Floor override chỉ one-off manual quote/order, không có global bypass flag.
- Admin quyết refund amount; Accounting ghi execution/reference sau khi chuyển tiền bên ngoài.
- Customer/business/account/address/order/invoice data lịch sử dùng snapshot phù hợp để profile update không rewrite history.
- Soft-delete là mặc định; hard purge không cascade audit record của delete.
- Internal user bị disable phải mất quyền truy cập và long-lived session theo auth implementation hiện hành.
5. Thay đổi sau freeze
Matrix có thể được version hóa khi tổ chức thay đổi, nhưng thay đổi quyền nhạy cảm phải có regression test RBAC. Việc một người kiêm nhiều role được phép nếu Admin gán rõ; ví dụ Admin có thể đồng thời được gán Production Approver, nhưng quyền approve đến từ role Production Approver chứ không từ Admin.