[CLAUDE] Docs: User Manual 7 file rewrite compact cho end-user

User feedback: "ko cần quá đầy đủ chi tiết, cho end-user họ làm".

Rewrite 7 generator scripts theo style end-user friendly:
- Bỏ field validation table 5 cột (Tên field / Kiểu / Bắt buộc / Validation / Ví dụ)
- Bỏ error troubleshoot table 3 cột (Lỗi / Nguyên nhân / Cách xử lý)
- Bỏ FAQ chi tiết 8 câu (giữ 1 chương "Khi gặp lỗi" 4-5 bullet)
- Bỏ phím tắt table
- Giữ: tổng quan ngắn, numbered steps đơn giản, note/warn/tip chỉ khi critical

7 file generator (đã refactor dùng _helpers.js shared):
- _gen-user-01: Bắt đầu (login + đổi pwd + hồ sơ + dashboard + sidebar + chuông)
- _gen-user-02: Hợp đồng (7 loại + tạo + sửa + xóa + đính kèm + comment)
- _gen-user-03: Duyệt Workflow (9 phase + 2-stage NV/TPB + reject + resume)
- _gen-user-04: Phiếu Duyệt NCC (PE) (A/B + matrix báo giá + winner + 4PB + tạo HĐ)
- _gen-user-05: Ngân sách (tạo + hạng mục + WF 3-step + liên kết HĐ/PE)
- _gen-user-06: Cheatsheet 7 loại HĐ (mỗi loại 1 page: use case + field + format mã)
- _gen-admin-02: Quản lý Users-Roles (tạo + role + reset + lock + bypass review S9)

Setup: package.json + npm install docx@9.5.0 + script "gen:all".

Output sizes:
- 01: 12.1 KB (cũ 21.7 KB → giảm ~44%)
- 02: 12.4 KB
- 03: 12.2 KB
- 04: 12.4 KB
- 05: 12.0 KB
- 06: 12.8 KB
- admin-02: 12.7 KB
- Tổng ~86 KB cho 7 file đầy đủ chức năng cốt lõi.

Note: ContractType label "Phương án" → "Giải pháp" (đã rebrand session 3).
2-stage dept approval mention ở Phần 03 + admin-02 (Migration 16 Session 8/9).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-05-06 17:06:01 +07:00
parent bdd175c07b
commit 16c2c9c79e
17 changed files with 1231 additions and 0 deletions

View File

@ -0,0 +1,100 @@
// 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');
});