@@ -76,6 +76,10 @@ File này chỉ lưu sự thật và quyết định dài hạn giúp các phiê
- Hệ thống log sử dụng LoggerService, đầu ra JSON ở production và text màu ở development, hỗ trợ ẩn thông tin nhạy cảm.
- Môi trường production được container hóa bằng Dockerfile (multi-stage) chạy với user phi quản trị và docker-compose.yml có thiết hành kiểm tra sức khoẻ (healthcheck) cho Postgres và Redis.
- Script seed (prisma/seed.ts) được mở rộng để tự động tạo dữ liệu mẫu demo phong phú (Wallets, Transactions, Budgets, SavingGoals, Contributions, Notifications, Reminders) cho tài khoản user@finwise.local.
- Dynamic RBAC (Role-Based Access Control) là kiến trúc phân quyền chính thức: Phân quyền dựa trên Permission (Role -> Permissions -> User), KHÔNG hardcode quyền theo tên Role.
- QUY TẮC BẮT BUỘC: Tất cả tên quyền (Permission names) PHẢI được định nghĩa tập trung trong `src/common/constants/permission.constant.ts` (ở cả BE và FE), TUYỆT ĐỐI KHÔNG hardcode chuỗi string permission rải rác trong code.
- Mọi route endpoint nghiệp vụ ở backend bắt buộc được bảo vệ bằng middleware `requirePermission(PERMISSIONS.*)`.
- Các vai trò hệ thống mặc định/bất biến (Bootstrap & System protection) được định nghĩa tập trung qua `SYSTEM_ROLES` trong `src/common/constants/system-role.constant.ts` (ví dụ `SYSTEM_ROLES.USER` cho vai trò đăng ký mặc định, `SYSTEM_ROLES.ADMIN` cho vai trò quản trị bất biến), không dùng `SYSTEM_ROLES` để kiểm tra phân quyền.
{name:'REPORT_READ',resource:'REPORT',action:'READ',description:'Xem báo cáo và phân tích tài chính',isSystem:true},
// FORECAST
{name:'FORECAST_READ',resource:'FORECAST',action:'READ',description:'Xem dự báo dòng tiền và cạn kiệt ngân sách',isSystem:true},
// SIMULATION
{name:'SIMULATION_READ',resource:'SIMULATION',action:'READ',description:'Xem kịch bản mô phỏng tài chính',isSystem:true},
{name:'SIMULATION_EXECUTE',resource:'SIMULATION',action:'EXECUTE',description:'Chạy mô phỏng kịch bản What-if',isSystem:true},
// ANOMALY
{name:'ANOMALY_READ',resource:'ANOMALY',action:'READ',description:'Xem cảnh báo chi tiêu bất thường',isSystem:true},
{name:'ANOMALY_EVALUATE',resource:'ANOMALY',action:'EVALUATE',description:'Đánh giá chi tiêu bất thường',isSystem:true},
// SUBSCRIPTION
{name:'SUBSCRIPTION_READ',resource:'SUBSCRIPTION',action:'READ',description:'Xem phát hiện thuê bao định kỳ',isSystem:true},
{name:'SUBSCRIPTION_MANAGE',resource:'SUBSCRIPTION',action:'MANAGE',description:'Quản lý và chuyển đổi thuê bao định kỳ',isSystem:true},
// QUERY
{name:'QUERY_EXECUTE',resource:'QUERY',action:'EXECUTE',description:'Truy vấn dữ liệu bằng ngôn ngữ tự nhiên DSL',isSystem:true},
// RECURRING_TRANSACTION
{name:'RECURRING_TRANSACTION_READ',resource:'RECURRING_TRANSACTION',action:'READ',description:'Xem lịch giao dịch tự động định kỳ',isSystem:true},
{name:'RECURRING_TRANSACTION_CREATE',resource:'RECURRING_TRANSACTION',action:'CREATE',description:'Tạo lịch giao dịch định kỳ mới',isSystem:true},
{name:'RECURRING_TRANSACTION_UPDATE',resource:'RECURRING_TRANSACTION',action:'UPDATE',description:'Cập nhật/Tạm dừng/Tiếp tục lịch giao dịch định kỳ',isSystem:true},
{name:'RECURRING_TRANSACTION_DELETE',resource:'RECURRING_TRANSACTION',action:'DELETE',description:'Xóa lịch giao dịch định kỳ',isSystem:true},
// NOTIFICATION
{name:'NOTIFICATION_READ',resource:'NOTIFICATION',action:'READ',description:'Xem thông báo hệ thống',isSystem:true},
{name:'NOTIFICATION_UPDATE',resource:'NOTIFICATION',action:'UPDATE',description:'Cập nhật cài đặt và trạng thái thông báo',isSystem:true},