// Admin Manual 02 — Quản lý Users + Roles (cho QTV) // Style: end-user friendly — các bước quản trị cơ bản. const fs = require('fs'); const path = require('path'); const H = require('./_helpers'); const { h1, h2, h3, p, bullet, num, note, warn, tip, titlePage, buildDoc, Packer } = H; const children = [ ...titlePage( "Hướng dẫn Quản lý Users + Roles", "Phần 02 (Admin): Tạo User, Gán Role, Reset Password, Khóa/Mở, Bypass Review", ), h1("1. Truy cập trang Users"), num("Đăng nhập admin tại https://admin.solutions.com.vn"), num("Sidebar → Hệ thống → Users (hoặc URL /system/users)"), num("Trang hiển thị danh sách user + filter + search"), h1("2. Tạo User mới"), num("Click \"Thêm user\" góc trên phải"), num("Điền form: Email công ty / Họ tên / Phòng ban / Chức vụ / Password tạm"), num("Tick các Vai trò gán cho user (1 user có thể có nhiều role)"), num("Click \"Tạo\""), note("Password tạm khuyến nghị: User@123456. User sẽ bị bắt đổi khi đăng nhập lần đầu."), h1("3. Sửa thông tin User"), num("Tại danh sách, click icon Pencil ở dòng user"), num("Sửa Họ tên / Phòng ban / Chức vụ / Active"), num("Click \"Lưu\""), warn("Email là read-only — KHÔNG đổi được. Nếu cần đổi email, phải xóa user và tạo lại."), h1("4. Gán / Sửa Roles"), num("Click icon Shield ở dòng user"), num("Tick / Bỏ tick các role"), num("Click \"Lưu\""), p("12 role hệ thống: Admin / Drafter / DeptManager (TPB) / ProjectManager / Procurement / CostControl / Finance / Accounting / Equipment / Director / AuthorizedSigner / HrAdmin."), tip("User được gán Admin role → bypass mọi permission check (dùng cho test hoặc emergency)."), h1("5. Reset Password"), num("Click icon Key ở dòng user"), num("Nhập password mới (≥ 6 ký tự)"), num("Click \"Reset\""), p("User bị logout khỏi mọi session, phải đăng nhập lại với password mới."), warn("Báo password mới cho user qua kênh an toàn (gặp trực tiếp / cuộc gọi). KHÔNG gửi qua email không mã hóa."), h1("6. Khóa / Mở khóa User"), num("User bị khóa tự động khi đăng nhập sai 5 lần liên tiếp"), num("Khi đó icon Lock màu cam hiện ở dòng user"), num("Admin click icon Unlock để mở khóa thủ công"), bullet("Hoặc đợi 30 phút auto unlock"), h1("7. Vô hiệu hóa / Kích hoạt User"), num("Click icon X (đỏ) hoặc CheckCircle (xanh) ở cột actions"), num("Toggle trạng thái Active"), p("User Inactive vẫn còn trong DB nhưng KHÔNG đăng nhập được. Dùng khi nhân viên nghỉ việc."), h1("8. Bypass Review (mới — Migration 16)"), p("Khi quy trình duyệt 2-cấp phòng ban, mặc định: NV duyệt = Review only, phải TPB Confirm thì phase mới chuyển. \"Bypass Review\" cho phép 1 NV cụ thể duyệt = Confirm trực tiếp (skip Review)."), num("Tại danh sách user, click icon ShieldCheck ở dòng user"), num("Icon đổi màu fuchsia + cột \"Bypass\" hiện badge \"bypass\""), num("Lần duyệt sau, NV này được Stage = Confirm + IsBypassed = true (audit)"), bullet("Use case: phòng ban không có TPB, hoặc TPB ủy quyền cho 1 NV cụ thể"), bullet("Click lần nữa để TẮT bypass"), h1("9. Tìm + Filter user"), bullet("Search: tìm theo Email / Họ tên"), bullet("Phân trang 20 user/page"), tip("Bookmark URL nếu cần truy cập nhanh: /system/users?search=tra.bui"), h1("10. Quản lý Roles"), num("Sidebar → Hệ thống → Roles (URL /system/roles)"), num("Xem 12 role hệ thống: Mã (ShortName) + Tên đầy đủ + Mô tả"), num("(Tùy chọn) Tạo role custom ngoài 12 hardcoded — click \"Thêm role\""), warn("Sửa role hệ thống có thể ảnh hưởng quy trình duyệt. Test kỹ trước khi đổi."), h1("11. Quản lý Permissions"), num("Sidebar → Hệ thống → Permissions (URL /system/permissions)"), num("Trang 3-panel: Role list trái | Matrix Menu × CRUD giữa | Stats phải"), num("Chọn 1 role → Matrix hiển thị quyền theo từng menu key"), num("Tick / Bỏ tick CRUD flag → tự động lưu (auto-save)"), note("User cần logout / login lại để thấy menu mới sau khi admin đổi quyền."), h1("12. Khi gặp lỗi"), bullet("Tạo user báo \"Email đã tồn tại\" → kiểm tra danh sách (kể cả Inactive)"), bullet("Reset password không tác dụng → check user IsActive = true"), bullet("User báo không thấy menu nào → kiểm tra Permissions matrix cho role tương ứng"), bullet("Bypass Review không có hiệu lực → user phải có Phòng ban gán + role không phải DeptManager"), ]; const doc = buildDoc( "Admin Manual - 02 Quản lý Users + Roles", "SOLUTION_ERP - Admin Manual - 02 Quản lý Users-Roles", children, ); const outPath = path.join(__dirname, 'admin', '02-Quan-ly-Users-Roles.docx'); Packer.toBuffer(doc).then(buf => { fs.writeFileSync(outPath, buf); console.log('✅ Generated:', outPath); console.log(' Size:', (buf.length / 1024).toFixed(1) + ' KB'); });