@@ -90,7 +90,7 @@ File này lưu trữ các quyết định thiết kế dài hạn và trạng th
- QUY TẮC BẮT BUỘC: Tất cả tên quyền (Permission names) PHẢI được import từ `@/common/constants/permission.constant.ts` (hoặc `@/common/constants`), TUYỆT ĐỐI KHÔNG hardcode chuỗi string permission rải rác trong code.
- Các vai trò hệ thống mặc định/bất biến được định nghĩa tập trung qua `SYSTEM_ROLES` trong `src/common/constants/system-role.constant.ts`.
- Màn hình quản lý phân quyền Claymorphism tại `/roles` và `/admin/roles` gồm: Danh sách Roles, Ma trận phân quyền theo Resource/Action, Thêm/Sửa/Xóa vai trò tùy chỉnh và Nhật ký kiểm toán (Audit Logs).
- Admin Control Center tại `/admin` dùng TanStack Query và permission động, gồm dashboard KPI/hoạt động gần đây, danh sách người dùng có tìm kiếm-lọc-phân trang, tạo/đổi trạng thái/xóa mềm, chi tiết người dùng có đổi vai trò/khôi phục và lịch sử kiểm toán, cùng audit viewer lọc theo khoảng ngày Việt Nam/action/target và so sánh JSON trước-sau. Trang chủ chỉ hiện lối vào khi có `USER_READ`.
- Admin Control Center tại `/admin` dùng TanStack Query và permission động, gồm dashboard KPI/hoạt động gần đây, danh sách người dùng có tìm kiếm-lọc-phân trang, tạo/đổi trạng thái/xóa mềm, chi tiết người dùng có đổi vai trò/khôi phục (lịch sử kiểm toán được quản lý tập trung tại `/admin/audit-logs`), cùng audit viewer lọc theo khoảng ngày Việt Nam/action/target và so sánh JSON trước-sau. Trang chủ chỉ hiện lối vào khi có `USER_READ`.
- Mọi lối vào module trên trang chủ phải được ẩn khi người dùng thiếu quyền đang bảo vệ route tương ứng; tiêu đề nhóm Tính năng Nâng cao cũng ẩn khi không có bất kỳ module con nào khả dụng. Lối vào Hồ sơ vẫn hiển thị vì route này không có permission riêng; lối vào Style Guide mặc định ẩn với vai trò hệ thống `USER` và hiển thị cho các vai trò còn lại.
- Contract Backend hiện chưa cho list hoặc đọc user đã soft-delete (`GET /users` và `GET /users/:id` đều loại `deletedAt != null`), nên nút restore trên detail đã sẵn sàng theo type/permission nhưng chỉ khả dụng khi Backend trả được bản ghi đã xóa.
"archiveCleanupConfirmDesc":"The system will export all audit logs older than 30 days to a compressed archive file before purging them from the database. Are you sure you want to proceed?",
"archiveCleanupSuccess":"Archive and cleanup completed: {{count}} records.",
"archiveCleanupNoLogs":"No audit records older than 30 days found.",
"archiveCleanupProcessing":"Archiving and cleaning up...",
"archiveCleanupFailed":"Failed to archive and clean up audit logs."
"retentionPolicyNotice":"Nhật ký kiểm toán được tự động nén lưu trữ và dọn dẹp sau 30 ngày để tối ưu dung lượng hệ thống.",
"archiveCleanupBtn":"Dọn dẹp & Lưu trữ ngay",
"archiveCleanupConfirmTitle":"Xác nhận dọn dẹp nhật ký kiểm toán",
"archiveCleanupConfirmDesc":"Hệ thống sẽ kết xuất toàn bộ bản ghi kiểm toán cũ hơn 30 ngày thành file nén lưu trữ trước khi dọn dẹp khỏi cơ sở dữ liệu. Bạn có chắc chắn muốn thực hiện?",
"archiveCleanupSuccess":"Đã hoàn tất lưu trữ và dọn dẹp: {{count}} bản ghi.",
"archiveCleanupNoLogs":"Không có bản ghi kiểm toán nào cũ hơn 30 ngày.",
"archiveCleanupProcessing":"Đang nén lưu trữ và dọn dẹp...",
"archiveCleanupFailed":"Quá trình lưu trữ và dọn dẹp thất bại."