From 16c2c9c79e9e7866695de46893c8a12e3f436ca1 Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Wed, 6 May 2026 17:06:01 +0700 Subject: [PATCH] [CLAUDE] Docs: User Manual 7 file rewrite compact cho end-user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- docs/_user-guide/_gen-admin-02.js | 100 ++++++ docs/_user-guide/_gen-user-01.js | 83 +++++ docs/_user-guide/_gen-user-02.js | 96 ++++++ docs/_user-guide/_gen-user-03.js | 94 ++++++ docs/_user-guide/_gen-user-04.js | 89 ++++++ docs/_user-guide/_gen-user-05.js | 83 +++++ docs/_user-guide/_gen-user-06.js | 168 ++++++++++ docs/_user-guide/_helpers.js | 292 ++++++++++++++++++ .../admin/02-Quan-ly-Users-Roles.docx | Bin 0 -> 12737 bytes docs/_user-guide/package-lock.json | 207 +++++++++++++ docs/_user-guide/package.json | 19 ++ docs/_user-guide/user/01-Bat-dau.docx | Bin 0 -> 12093 bytes docs/_user-guide/user/02-Hop-dong.docx | Bin 0 -> 12350 bytes docs/_user-guide/user/03-Duyet-Workflow.docx | Bin 0 -> 12199 bytes .../user/04-PE-Phieu-Duyet-NCC.docx | Bin 0 -> 12417 bytes .../_user-guide/user/05-Budget-Ngan-sach.docx | Bin 0 -> 12027 bytes .../user/06-7-Loai-HD-Cheatsheet.docx | Bin 0 -> 12822 bytes 17 files changed, 1231 insertions(+) create mode 100644 docs/_user-guide/_gen-admin-02.js create mode 100644 docs/_user-guide/_gen-user-01.js create mode 100644 docs/_user-guide/_gen-user-02.js create mode 100644 docs/_user-guide/_gen-user-03.js create mode 100644 docs/_user-guide/_gen-user-04.js create mode 100644 docs/_user-guide/_gen-user-05.js create mode 100644 docs/_user-guide/_gen-user-06.js create mode 100644 docs/_user-guide/_helpers.js create mode 100644 docs/_user-guide/admin/02-Quan-ly-Users-Roles.docx create mode 100644 docs/_user-guide/package-lock.json create mode 100644 docs/_user-guide/package.json create mode 100644 docs/_user-guide/user/01-Bat-dau.docx create mode 100644 docs/_user-guide/user/02-Hop-dong.docx create mode 100644 docs/_user-guide/user/03-Duyet-Workflow.docx create mode 100644 docs/_user-guide/user/04-PE-Phieu-Duyet-NCC.docx create mode 100644 docs/_user-guide/user/05-Budget-Ngan-sach.docx create mode 100644 docs/_user-guide/user/06-7-Loai-HD-Cheatsheet.docx diff --git a/docs/_user-guide/_gen-admin-02.js b/docs/_user-guide/_gen-admin-02.js new file mode 100644 index 0000000..82bf48d --- /dev/null +++ b/docs/_user-guide/_gen-admin-02.js @@ -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'); +}); diff --git a/docs/_user-guide/_gen-user-01.js b/docs/_user-guide/_gen-user-01.js new file mode 100644 index 0000000..af7b227 --- /dev/null +++ b/docs/_user-guide/_gen-user-01.js @@ -0,0 +1,83 @@ +// User Manual 01 — Bắt đầu (Đăng nhập + Đổi pwd + Hồ sơ + Dashboard + Sidebar + Chuông) +// Style: end-user friendly — chỉ các bước thực hiện đơn giản, không bảng field/error chi tiết. +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 Bắt đầu", + "Phần 01: Đăng nhập, Đổi mật khẩu, Hồ sơ, Điều hướng", + ), + + h1("1. Mở hệ thống"), + p("Truy cập https://eoffice.solutions.com.vn bằng trình duyệt Chrome / Edge / Cốc Cốc."), + p("Tài khoản: email công ty cấp (vd ten.ho@solutions.com.vn). Mật khẩu lần đầu: User@123456."), + + h1("2. Đăng nhập"), + num("Mở https://eoffice.solutions.com.vn"), + num("Nhập Email + Mật khẩu"), + num("Click \"Đăng nhập\""), + note("Lần đầu đăng nhập, hệ thống tự chuyển sang trang Đổi mật khẩu."), + + h1("3. Đổi mật khẩu lần đầu"), + num("Nhập Mật khẩu hiện tại (User@123456)"), + num("Nhập Mật khẩu mới (≥ 6 ký tự, có chữ hoa, chữ thường, số, ký tự đặc biệt)"), + num("Nhập lại Mật khẩu mới để xác nhận"), + num("Click \"Lưu\""), + num("Hệ thống đăng xuất → đăng nhập lại bằng mật khẩu mới"), + warn("Phải nhớ chính xác mật khẩu mới. Nếu quên, liên hệ admin reset."), + + h1("4. Cập nhật hồ sơ cá nhân"), + num("Click avatar góc trên phải → \"Hồ sơ của tôi\""), + num("Sửa Họ tên / Chức vụ / Số điện thoại"), + num("Click \"Lưu\""), + note("Email + Phòng ban + Vai trò là read-only, do admin gán. Liên hệ admin nếu cần đổi."), + + h1("5. Dashboard - Trang chủ"), + p("Sau khi đăng nhập, Dashboard hiển thị 5 thẻ:"), + bullet("Bản nháp đang soạn — HĐ user là Drafter, ở phase Đang soạn thảo"), + bullet("Chờ tôi duyệt — HĐ ở phase mà role user được duyệt"), + bullet("Sắp đến hạn — HĐ có SLA trong 2 ngày tới"), + bullet("Quá hạn — HĐ đã quá SLA chưa xử lý"), + bullet("Tổng giá trị nháp — tổng giá trị HĐ đang soạn"), + p("Click thẻ → mở danh sách tương ứng."), + + h1("6. Sidebar - Menu trái"), + p("Menu 3 cấp:"), + num("Cấp 1: Hợp đồng / Phiếu duyệt NCC / Ngân sách / Báo cáo / ..."), + num("Cấp 2: 7 loại HĐ (Thầu phụ, Giao khoán, NCC, Dịch vụ, Mua bán, Nguyên tắc NCC, Nguyên tắc DV)"), + num("Cấp 3: 3 thao tác (Danh sách / Tạo mới / Duyệt)"), + tip("Click cấp 1 → mở rộng. Khi mở 1 nhóm, các nhóm khác tự đóng."), + + h1("7. Chuông thông báo"), + p("Icon chuông góc trên phải. Badge số đỏ = số notification chưa đọc."), + num("Click chuông → popup 10 notification mới nhất"), + num("Click 1 notification → đánh dấu đã đọc + chuyển đến trang HĐ liên quan"), + num("Click \"Đánh dấu tất cả đã đọc\" để clear badge"), + note("Notification mới đẩy realtime — không cần refresh trang."), + + h1("8. Đăng xuất"), + num("Click avatar góc trên phải"), + num("Click \"Đăng xuất\""), + p("Hệ thống clear session, chuyển về trang Đăng nhập."), + + h1("9. Khi gặp lỗi"), + bullet("Sai mật khẩu nhiều lần → tài khoản bị khóa 30 phút (auto unlock)"), + bullet("Trang trắng / không response → Ctrl + Shift + R (hard refresh)"), + bullet("Sidebar trống → liên hệ admin xác nhận quyền"), + bullet("Lỗi không tự xử lý → email admin@solutions.com.vn kèm screenshot + URL"), +]; + +const doc = buildDoc( + "User Manual - 01 Bắt đầu", + "SOLUTION_ERP - User Manual - 01 Bắt đầu", + children, +); + +const outPath = path.join(__dirname, 'user', '01-Bat-dau.docx'); +Packer.toBuffer(doc).then(buf => { + fs.writeFileSync(outPath, buf); + console.log('✅ Generated:', outPath); + console.log(' Size:', (buf.length / 1024).toFixed(1) + ' KB'); +}); diff --git a/docs/_user-guide/_gen-user-02.js b/docs/_user-guide/_gen-user-02.js new file mode 100644 index 0000000..9cc20a5 --- /dev/null +++ b/docs/_user-guide/_gen-user-02.js @@ -0,0 +1,96 @@ +// User Manual 02 — Hợp đồng (Tạo + Sửa + 7 loại + Xóa) +// Style: end-user friendly — các bước đơn giả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 Hợp đồng", + "Phần 02: 7 loại HĐ - Tạo, Sửa, Xóa", + ), + + h1("1. 7 loại hợp đồng"), + bullet("HĐ Thầu phụ (HĐTP) — thuê NTP xây thô / hoàn thiện"), + bullet("HĐ Giao khoán (HĐGK) — khoán công việc cho tổ đội"), + bullet("HĐ NCC — mua vật tư, thiết bị từ NCC"), + bullet("HĐ Dịch vụ (HĐDV) — thuê tư vấn, kiểm định, vệ sinh"), + bullet("HĐ Mua bán (HĐMB) — mua bán thiết bị, vật phẩm"), + bullet("HĐ Nguyên tắc NCC — khung nguyên tắc lâu dài với NCC"), + bullet("HĐ Nguyên tắc DV — khung nguyên tắc dịch vụ lâu dài"), + note("Tham khảo Phần 06 để biết field đặc thù mỗi loại."), + + h1("2. Inbox vs Hợp đồng của tôi"), + bullet("Inbox (/inbox) — HĐ đang chờ vai trò bạn duyệt"), + bullet("Hợp đồng của tôi (/my-contracts) — HĐ bạn là Drafter (mọi phase)"), + tip("Filter theo loại: thêm ?type=N (1-7) vào URL hoặc dùng menu Sidebar."), + + h1("3. Tạo HĐ mới"), + num("Sidebar → Hợp đồng → chọn loại HĐ → Tạo mới"), + num("Hoặc URL trực tiếp /contracts/new?type=N (N = 1-7)"), + num("Điền Header: Tên HĐ, NCC/NTP, Dự án, Phòng ban chủ trì, Giá trị, Ngày dự kiến"), + num("(Tùy chọn) Liên kết Ngân sách dự án"), + num("Click \"Lưu nháp\" → hệ thống tạo HĐ ở phase Đang soạn thảo"), + note("Mã HĐ chưa gen ngay — sẽ tự gen khi chuyển sang phase Đang đóng dấu."), + + h1("4. Thêm chi tiết HĐ"), + p("Sau khi tạo nháp, mở HĐ → tab \"Chi tiết\" để nhập hạng mục cụ thể."), + num("Mở HĐ → tab \"Chi tiết\""), + num("Click \"Thêm hạng mục\""), + num("Nhập Mã / Tên hạng mục / Đơn vị / Khối lượng / Đơn giá"), + num("Hệ thống tự tính Thành tiền = Khối lượng × Đơn giá"), + num("Click \"Lưu\""), + tip("Lặp lại để thêm nhiều hạng mục. Tổng giá trị HĐ tự tổng hợp."), + + h1("5. Sửa HĐ nháp"), + num("Mở HĐ ở phase Đang soạn thảo"), + num("Click \"Sửa\" ở Header hoặc inline edit từng hạng mục"), + num("Click \"Lưu\""), + warn("Sau khi trình duyệt (Phase ≠ Đang soạn thảo), HĐ bị khóa edit. Phải reject về Đang soạn thảo mới sửa được."), + + h1("6. Trình duyệt HĐ"), + num("Mở HĐ ở phase Đang soạn thảo"), + num("Panel Quy trình bên phải → click \"Trình → Đang góp ý\""), + num("(Tùy chọn) Nhập ghi chú"), + num("Click \"Xác nhận\""), + p("HĐ chuyển sang phase tiếp theo, người duyệt nhận notification."), + p("Chi tiết quy trình duyệt 9 phase: xem Phần 03 - Duyệt Workflow."), + + h1("7. Đính kèm file"), + num("Mở HĐ → tab \"Đính kèm\" hoặc kéo thả file vào khu vực dropzone"), + num("Chọn loại file: Báo giá / Yêu cầu KT / Phiếu duyệt / ..."), + num("File upload xong, hiển thị trong danh sách"), + num("Click tên file để tải về"), + + h1("8. Comment / Góp ý"), + num("Mở HĐ → tab \"Bình luận\""), + num("Nhập nội dung góp ý vào khung text"), + num("Click \"Gửi\""), + note("Drafter + role đã comment trước nhận notification realtime."), + + h1("9. Xóa HĐ nháp"), + num("Mở HĐ ở phase Đang soạn thảo / Từ chối"), + num("Click icon \"Xóa\" (thùng rác) ở Header"), + num("Xác nhận \"Xóa\""), + warn("Chỉ xóa được HĐ ở phase Đang soạn thảo hoặc Từ chối. HĐ đã trình duyệt KHÔNG xóa được."), + + h1("10. Tìm + Filter"), + bullet("Search box: tìm theo Mã HĐ / Tên / NCC"), + bullet("Filter Phase: dropdown 9 phase + Từ chối"), + bullet("Filter NCC / Dự án: dropdown"), + bullet("Filter SLA: chỉ hiện HĐ sắp đến hạn / quá hạn"), + tip("URL có thể bookmark, vd /my-contracts?type=5&phase=2 = HĐ Mua bán phase Đang soạn thảo."), +]; + +const doc = buildDoc( + "User Manual - 02 Hợp đồng", + "SOLUTION_ERP - User Manual - 02 Hợp đồng", + children, +); + +const outPath = path.join(__dirname, 'user', '02-Hop-dong.docx'); +Packer.toBuffer(doc).then(buf => { + fs.writeFileSync(outPath, buf); + console.log('✅ Generated:', outPath); + console.log(' Size:', (buf.length / 1024).toFixed(1) + ' KB'); +}); diff --git a/docs/_user-guide/_gen-user-03.js b/docs/_user-guide/_gen-user-03.js new file mode 100644 index 0000000..e85accc --- /dev/null +++ b/docs/_user-guide/_gen-user-03.js @@ -0,0 +1,94 @@ +// User Manual 03 — Duyệt Workflow (9 phase + 2-stage approval + smart reject) +// Style: end-user friendly — các bước duyệt 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 Duyệt Workflow", + "Phần 03: 9 phase HĐ + 2-cấp duyệt phòng ban + Từ chối/Trình lại", + ), + + h1("1. 9 phase quy trình"), + num("Đang chọn — chưa khởi tạo"), + num("Đang soạn thảo — Drafter đang soạn"), + num("Đang góp ý — các phòng ban góp ý song song"), + num("Đang đàm phán — đàm phán với NCC/NTP"), + num("Đang in ký — in nháp, ký nháp"), + num("Đang kiểm tra CCM — CCM kiểm tra (skip với HĐ Bypass)"), + num("Đang trình ký — BOD trình ký"), + num("Đang đóng dấu — HRA đóng dấu (mã HĐ tự gen)"), + num("Đã phát hành — HĐ phát hành chính thức"), + bullet("Từ chối — bị reject, Drafter có thể sửa và trình lại"), + + h1("2. Inbox - HĐ chờ tôi duyệt"), + num("Mở /inbox hoặc Sidebar → \"Hộp thư\""), + num("Panel trái: danh sách HĐ chờ vai trò bạn duyệt"), + num("Click 1 HĐ → Panel giữa hiện chi tiết, Panel phải hiện Quy trình"), + + h1("3. Duyệt 1 HĐ"), + num("Mở HĐ trong Inbox"), + num("Đọc kỹ: Header / Chi tiết / Đính kèm / Bình luận"), + num("Panel Quy trình bên phải → click nút \"Trình → [phase tiếp theo]\""), + num("(Tùy chọn) Nhập ghi chú duyệt"), + num("Click \"Xác nhận\""), + p("HĐ chuyển sang phase mới, Drafter + role kế tiếp nhận notification."), + + h1("4. Duyệt 2-cấp phòng ban (mới)"), + p("Khi vai trò bạn thuộc phòng ban (ví dụ NV.PRO), quy trình duyệt 2 cấp:"), + num("Bạn (NV) duyệt → ghi nhận \"Review\" — phase CHƯA chuyển"), + num("Trưởng phòng cùng dept (TPB) duyệt → ghi nhận \"Confirm\" — phase chuyển"), + p("Panel Quy trình hiển thị section \"Tiến trình duyệt 2-cấp phòng ban\":"), + bullet("Review NV — ai đã review + thời gian + ghi chú"), + bullet("Confirm TPB — chờ TPB confirm (highlight vàng)"), + note("Admin có thể bật \"Bypass\" cho 1 NV cụ thể — NV được Confirm trực tiếp, skip Review."), + + h1("5. Từ chối (Reject)"), + num("Mở HĐ trong Inbox"), + num("Panel Quy trình → click nút \"Trình → Từ chối\""), + num("Nhập lý do từ chối (bắt buộc)"), + num("Click \"Xác nhận\""), + p("HĐ tự động về phase Đang soạn thảo. Drafter sửa rồi trình lại."), + + h1("6. Trình lại sau khi sửa (Resume)"), + num("Drafter mở HĐ ở Đang soạn thảo (sau reject)"), + num("Sửa Header / Chi tiết theo góp ý"), + num("Panel Quy trình → click \"Trình → [phase tiếp theo]\""), + num("Click \"Xác nhận\""), + note("Hệ thống tự nhảy về phase đã reject (không cần đi lại từ đầu)."), + + h1("7. Comment / Góp ý"), + num("Mở HĐ → tab \"Bình luận\""), + num("Nhập nội dung"), + num("Click \"Gửi\""), + p("Comment KHÔNG ảnh hưởng phase — chỉ thông tin cho team."), + + h1("8. SLA - Hạn xử lý"), + bullet("Mỗi phase có SLA mặc định (1-7 ngày tùy phase)"), + bullet("Khi sắp hết hạn (còn 20%), Drafter nhận notification cảnh báo"), + bullet("Hết hạn → hệ thống tự auto-approve (qua phase tiếp theo)"), + tip("Inbox có badge đỏ \"Quá hạn\" để ưu tiên xử lý."), + + h1("9. Lịch sử duyệt"), + num("Mở HĐ → Panel phải → cuộn xuống section \"Lịch sử duyệt\""), + p("Hiển thị từng lần chuyển phase: ai duyệt, từ phase nào → phase nào, ghi chú, thời gian."), + + h1("10. Quy tắc đặc biệt"), + bullet("Admin có quyền duyệt mọi phase (skip role check + 2-stage)"), + bullet("HĐ Dịch vụ / Mua bán / Nguyên tắc bypass phase Kiểm tra CCM"), + bullet("Sau Đang đóng dấu, HĐ KHÔNG sửa được nữa — chỉ xem"), +]; + +const doc = buildDoc( + "User Manual - 03 Duyệt Workflow", + "SOLUTION_ERP - User Manual - 03 Duyệt Workflow", + children, +); + +const outPath = path.join(__dirname, 'user', '03-Duyet-Workflow.docx'); +Packer.toBuffer(doc).then(buf => { + fs.writeFileSync(outPath, buf); + console.log('✅ Generated:', outPath); + console.log(' Size:', (buf.length / 1024).toFixed(1) + ' KB'); +}); diff --git a/docs/_user-guide/_gen-user-04.js b/docs/_user-guide/_gen-user-04.js new file mode 100644 index 0000000..344fbee --- /dev/null +++ b/docs/_user-guide/_gen-user-04.js @@ -0,0 +1,89 @@ +// User Manual 04 — Phiếu Duyệt NCC (PE) tiền-HĐ +// Style: end-user friendly — các bước đơn giả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 Phiếu Duyệt NCC", + "Phần 04: Phiếu so sánh NCC/Thầu phụ tiền-HĐ — 2 quy trình A/B", + ), + + h1("1. Phiếu Duyệt NCC là gì?"), + p("Phiếu Duyệt NCC (PE) là biểu mẫu so sánh giá / năng lực giữa nhiều NCC trước khi tạo Hợp đồng chính thức."), + bullet("2 loại: \"Duyệt NCC\" (đơn giản) và \"Duyệt NCC + Giải pháp\" (có thêm bảng so sánh giải pháp kỹ thuật)"), + bullet("Khi phiếu \"Đã duyệt\" → có thể sinh HĐ 1-click với NCC thắng thầu được chọn"), + + h1("2. Tạo phiếu mới"), + num("Sidebar → \"Phiếu Duyệt NCC\" → chọn loại → \"Tạo mới\""), + num("Hoặc URL /purchase-evaluations/new?type=1 (1 = NCC) hoặc ?type=2 (NCC + Giải pháp)"), + num("Điền Header: Tên gói thầu, Dự án, Phòng ban, (tùy chọn) Liên kết Ngân sách"), + num("Click \"Lưu nháp\""), + note("Mã phiếu format PE/{Năm}/{A|B}/{số thứ tự} — tự gen ngay khi tạo."), + + h1("3. Thêm NCC tham gia"), + num("Mở phiếu → section \"NCC/Thầu phụ tham gia\""), + num("Click \"Thêm NCC\""), + num("Chọn NCC từ danh sách (hoặc tạo NCC mới qua Master)"), + num("Nhập điều khoản thanh toán + ghi chú (tùy chọn)"), + num("Click \"Lưu\""), + tip("Lặp lại để thêm 2-3 NCC so sánh. Tối thiểu 1 NCC, khuyến nghị 3 để chọn lựa."), + + h1("4. Thêm hạng mục + báo giá"), + num("Mở phiếu → section \"Hạng mục + Báo giá\""), + num("Click \"Thêm hạng mục\" (Mã / Tên / Đơn vị / Khối lượng ngân sách + Khối lượng thi công)"), + num("Tại bảng matrix, mỗi NCC có 1 cột — nhập đơn giá báo giá NCC"), + num("Hệ thống tự tính Thành tiền = Khối lượng × Đơn giá"), + num("Click \"Lưu\""), + tip("Cột \"NS link · Δ\" so sánh đơn giá báo giá vs ngân sách (xanh = dưới NS, đỏ = vượt)."), + + h1("5. Đính kèm báo giá NCC"), + num("Mỗi dòng NCC có nút \"Tải lên\" → đính kèm file báo giá / hồ sơ năng lực"), + num("Hoặc tab \"Đính kèm\" → upload file chung (Bảng so sánh tổng, Yêu cầu KT, ...)"), + + h1("6. Chọn NCC thắng thầu"), + num("Sau khi nhập đủ báo giá, mở section \"Hạng mục + Báo giá\""), + num("Tại mỗi dòng hạng mục, tick checkbox cột NCC bạn chọn"), + num("Hoặc click \"Chọn NCC này\" để chọn cho toàn bộ hạng mục"), + num("Tổng giá trị NCC thắng tự cập nhật"), + + h1("7. Ý kiến 4 phòng ban"), + p("Section \"Ý kiến 4 phòng ban\" có 4 ô: Phê duyệt / P.CCM / P.Mua hàng / SM-PM. Mỗi phòng ban điền ý kiến và ký."), + num("Trưởng phòng từng phòng ban mở phiếu"), + num("Tìm ô tương ứng phòng mình → nhập nội dung ý kiến"), + num("Click \"Lưu & Ký\" → ghi nhận chữ ký + thời gian"), + + h1("8. Trình duyệt phiếu"), + num("Mở phiếu ở phase Đang soạn thảo"), + num("Panel Quy trình bên phải → click \"Trình → [phase tiếp theo]\""), + num("(Tùy chọn) Nhập ghi chú"), + num("Click \"Xác nhận\""), + p("Phiếu đi qua các phase tùy quy trình A (3 step: ChoPurchasing → ChoCCM → ChoCEONcc) hoặc B (5 step thêm ChoDuAn + ChoCEOPa)."), + note("Quy trình PE cũng có duyệt 2-cấp phòng ban (NV Review → TPB Confirm) giống HĐ — xem Phần 03."), + + h1("9. Tạo HĐ từ phiếu Đã duyệt"), + num("Mở phiếu ở phase \"Đã duyệt\" và đã chọn NCC thắng thầu"), + num("Click \"Tạo HĐ từ phiếu\" (góc phải Header)"), + num("Chọn loại HĐ (1-7) muốn tạo"), + num("Click \"Tạo\""), + p("Hệ thống tạo HĐ nháp tự động: copy NCC + Dự án + (tùy chọn) Ngân sách. Drafter mở HĐ để điền chi tiết tiếp."), + + h1("10. Sửa / Xóa phiếu nháp"), + bullet("Phase Đang soạn thảo: sửa Header / NCC / hạng mục / báo giá tự do"), + bullet("Phase ≠ Đang soạn thảo: bị khóa edit (tương tự HĐ)"), + bullet("Xóa: chỉ ở phase Đang soạn thảo / Từ chối, click icon thùng rác"), +]; + +const doc = buildDoc( + "User Manual - 04 Phiếu Duyệt NCC", + "SOLUTION_ERP - User Manual - 04 PE Phiếu Duyệt NCC", + children, +); + +const outPath = path.join(__dirname, 'user', '04-PE-Phieu-Duyet-NCC.docx'); +Packer.toBuffer(doc).then(buf => { + fs.writeFileSync(outPath, buf); + console.log('✅ Generated:', outPath); + console.log(' Size:', (buf.length / 1024).toFixed(1) + ' KB'); +}); diff --git a/docs/_user-guide/_gen-user-05.js b/docs/_user-guide/_gen-user-05.js new file mode 100644 index 0000000..2aac42e --- /dev/null +++ b/docs/_user-guide/_gen-user-05.js @@ -0,0 +1,83 @@ +// User Manual 05 — Budget Ngân sách dự án +// Style: end-user friendly — các bước đơn giả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 Ngân sách Dự án", + "Phần 05: Budget - Tạo Ngân sách + Hạng mục + Liên kết HĐ/PE", + ), + + h1("1. Ngân sách dự án là gì?"), + p("Module Ngân sách quản lý dự toán chi phí cho từng dự án. Mỗi dự án có thể có 1 hoặc nhiều ngân sách (theo năm hoặc theo hạng mục lớn)."), + bullet("HĐ + Phiếu PE có thể liên kết Ngân sách để theo dõi \"đã chi vs ngân sách\""), + bullet("Workflow đơn giản 3 bước: Đang soạn thảo → Chờ CCM → Chờ CEO → Đã duyệt"), + + h1("2. Tạo ngân sách mới"), + num("Sidebar → \"Ngân sách\" → \"Tạo mới\""), + num("Hoặc URL /budgets/new"), + num("Điền Header: Tên ngân sách, Năm, Dự án, Phòng ban, Mô tả"), + num("Click \"Lưu nháp\""), + note("Mã ngân sách format NS-{Năm tháng}-{số thứ tự} — tự gen."), + + h1("3. Thêm hạng mục ngân sách"), + num("Mở ngân sách → section \"Hạng mục\""), + num("Click \"Thêm hạng mục\""), + num("Nhập: Mã nhóm / Tên nhóm / Mã hạng mục / Nội dung / Đơn vị / Khối lượng / Đơn giá"), + num("Hệ thống tự tính Thành tiền = Khối lượng × Đơn giá"), + num("Tổng ngân sách tự tổng hợp ở Header"), + num("Click \"Lưu\""), + tip("Mã nhóm + Mã hạng mục dùng để match với chi tiết HĐ/PE khi đối chiếu \"đã chi vs ngân sách\"."), + + h1("4. Sửa hạng mục"), + num("Mở ngân sách ở phase Đang soạn thảo"), + num("Click vào ô cần sửa → inline edit"), + num("Click ngoài để lưu (auto-save)"), + warn("Sau khi trình duyệt, ngân sách bị khóa edit. Phải reject về Đang soạn thảo mới sửa được."), + + h1("5. Trình duyệt ngân sách"), + num("Mở ngân sách ở phase Đang soạn thảo"), + num("Panel Quy trình bên phải → click \"Trình → Chờ CCM\""), + num("CCM duyệt → \"Chờ CEO\""), + num("CEO duyệt → \"Đã duyệt\""), + note("Workflow Budget cũng có duyệt 2-cấp phòng ban (NV Review → TPB Confirm) — xem Phần 03."), + + h1("6. Liên kết HĐ / Phiếu PE với ngân sách"), + p("Khi tạo HĐ hoặc Phiếu PE, chọn ngân sách trong ô \"Liên kết Ngân sách\":"), + num("Tạo HĐ mới → form Header có dropdown \"Ngân sách\""), + num("Filter chỉ hiện ngân sách: Phase = Đã duyệt + cùng Dự án"), + num("Chọn ngân sách → HĐ liên kết với ngân sách đó"), + + h1("7. Cột \"So với ngân sách\" trong Phiếu PE"), + p("Khi PE có liên kết ngân sách, bảng Hạng mục có thêm cột \"NS link · Δ\":"), + bullet("Match dòng PE với ngân sách qua key \"Mã nhóm | Mã hạng mục\""), + bullet("Hiển thị Đơn giá ngân sách + Δ chênh lệch"), + bullet("Δ < 0 (xanh) — báo giá NCC dưới ngân sách (tốt)"), + bullet("Δ > 0 (đỏ) — báo giá vượt ngân sách (cảnh báo)"), + bullet("Δ = 0 (xám) — khớp ngân sách"), + + h1("8. Xem changelog ngân sách"), + num("Mở ngân sách → Panel phải → section \"Lịch sử thay đổi\""), + p("Ghi nhận: ai sửa, sửa gì (Header / hạng mục / phase transition), thời gian."), + + h1("9. Xóa ngân sách nháp"), + num("Mở ngân sách ở phase Đang soạn thảo / Từ chối"), + num("Click icon thùng rác ở Header"), + num("Xác nhận \"Xóa\""), + warn("Chỉ xóa được ngân sách ở phase Đang soạn thảo / Từ chối. Đã duyệt KHÔNG xóa được."), +]; + +const doc = buildDoc( + "User Manual - 05 Ngân sách", + "SOLUTION_ERP - User Manual - 05 Budget Ngân sách", + children, +); + +const outPath = path.join(__dirname, 'user', '05-Budget-Ngan-sach.docx'); +Packer.toBuffer(doc).then(buf => { + fs.writeFileSync(outPath, buf); + console.log('✅ Generated:', outPath); + console.log(' Size:', (buf.length / 1024).toFixed(1) + ' KB'); +}); diff --git a/docs/_user-guide/_gen-user-06.js b/docs/_user-guide/_gen-user-06.js new file mode 100644 index 0000000..c1869e1 --- /dev/null +++ b/docs/_user-guide/_gen-user-06.js @@ -0,0 +1,168 @@ +// User Manual 06 — Cheatsheet 7 loại HĐ (mỗi loại 1 page tóm gọn) +// Style: end-user friendly — chỉ thông tin cốt lõi để Drafter biết khi nào dùng loại nào. +const fs = require('fs'); const path = require('path'); +const H = require('./_helpers'); +const { h1, h2, p, bullet, num, note, tip, titlePage, buildDoc, Packer } = H; + +const cheatsheet = (info) => { + const out = [ + h1(info.title), + p("Khi nào dùng: " + info.use), + ]; + if (info.bypass !== undefined) { + out.push(p("Bypass CCM: " + (info.bypass ? "Có (skip phase Kiểm tra CCM)" : "Không (đầy đủ 9 phase)"))); + } + out.push(h2("Field đặc thù khi tạo")); + for (const f of info.fields) out.push(bullet(f)); + out.push(h2("Mã HĐ format")); + out.push(p(info.codeFormat)); + if (info.tips) { + out.push(h2("Lưu ý")); + for (const t of info.tips) out.push(bullet(t)); + } + return out; +}; + +const children = [ + ...titlePage( + "Cheatsheet 7 loại Hợp đồng", + "Phần 06: Khi nào dùng loại nào + Field đặc thù mỗi loại", + ), + + h1("Tóm tắt - Bảng phân loại nhanh"), + bullet("HĐ Thầu phụ (HĐTP) — thuê NTP làm việc cho dự án xây dựng (xây thô, hoàn thiện, MEP)"), + bullet("HĐ Giao khoán (HĐGK) — khoán việc cho tổ đội nhỏ (theo công nhật, theo m²)"), + bullet("HĐ NCC — mua vật tư / thiết bị 1 lần từ NCC (cụ thể đầu việc)"), + bullet("HĐ Dịch vụ (HĐDV) — thuê tư vấn / kiểm định / vệ sinh / dịch vụ phụ trợ"), + bullet("HĐ Mua bán (HĐMB) — mua bán thiết bị / hàng hóa (không phải vật tư xây dựng)"), + bullet("HĐ Nguyên tắc NCC — khung hợp tác lâu dài với NCC, cụ thể từng đợt qua phiếu yêu cầu"), + bullet("HĐ Nguyên tắc DV — khung dịch vụ lâu dài (vd hợp đồng vệ sinh năm)"), + tip("Nếu phân vân, hỏi P.CCM hoặc P.Mua hàng để chốt loại."), + + ...cheatsheet({ + title: "1. HĐ Thầu phụ (HĐTP) — Type 1", + use: "Thuê nhà thầu phụ (NTP) thực hiện gói thầu xây dựng cho 1 dự án cụ thể.", + bypass: false, + fields: [ + "NCC/NTP: chọn từ danh sách nhà thầu phụ (Master)", + "Dự án: chọn dự án áp dụng", + "Hạng mục: liệt kê đầy đủ công việc + khối lượng + đơn giá", + "Thanh toán: tỷ lệ tạm ứng / thanh toán theo tiến độ / quyết toán / bảo hành", + "Bảo hành: thời gian bảo hành sau quyết toán", + ], + codeFormat: "{Mã DA}/HĐTP/SOL&{Mã NCC}/{số thứ tự 2 chữ số}", + tips: [ + "Đầy đủ 9 phase, có duyệt CCM", + "Mỗi NTP chỉ 1 HĐTP active per dự án (chia nhiều đợt qua Hạng mục)", + ], + }), + + ...cheatsheet({ + title: "2. HĐ Giao khoán (HĐGK) — Type 2", + use: "Khoán việc cho tổ đội nhỏ (10-50 người) làm phần việc cụ thể trong dự án.", + bypass: false, + fields: [ + "Tổ đội: chọn tổ trưởng + tên tổ (Master)", + "Dự án + Phạm vi công việc", + "Khối lượng giao khoán: theo m², công nhật, hoặc trọn gói", + "Đơn giá khoán: per đơn vị", + "Thời hạn hoàn thành", + ], + codeFormat: "{Mã DA}/HĐGK/SOL&{Mã NCC}/{số thứ tự 2 chữ số}", + }), + + ...cheatsheet({ + title: "3. HĐ NCC — Type 3", + use: "Mua vật tư / thiết bị 1 lần từ NCC cho 1 dự án (vd mua thép, xi măng, thang máy).", + bypass: false, + fields: [ + "NCC: chọn từ Master", + "Dự án", + "Hạng mục: vật tư + quy cách + khối lượng + đơn giá", + "Giao hàng: địa điểm + thời gian + điều kiện", + "Thanh toán: tỷ lệ tạm ứng + còn lại sau giao hàng", + ], + codeFormat: "{Mã DA}/NCC/SOL&{Mã NCC}/{số thứ tự 2 chữ số}", + tips: [ + "Trước khi tạo HĐ NCC, NÊN tạo Phiếu Duyệt NCC (PE) để so sánh giá nhiều NCC", + "Sau khi PE Đã duyệt, click \"Tạo HĐ từ phiếu\" → tự sinh HĐ NCC nháp", + ], + }), + + ...cheatsheet({ + title: "4. HĐ Dịch vụ (HĐDV) — Type 4", + use: "Thuê dịch vụ tư vấn, kiểm định, thí nghiệm, vệ sinh, an ninh cho 1 dự án.", + bypass: true, + fields: [ + "NCC dịch vụ", + "Dự án", + "Phạm vi dịch vụ: liệt kê công việc tư vấn / kiểm định / ...", + "Phí dịch vụ: trọn gói hoặc theo giờ / theo lần", + "Sản phẩm bàn giao: báo cáo / chứng nhận / ...", + ], + codeFormat: "{Mã DA}/HĐDV/SOL&{Mã NCC}/{số thứ tự 2 chữ số}", + }), + + ...cheatsheet({ + title: "5. HĐ Mua bán (HĐMB) — Type 5", + use: "Mua bán thiết bị / hàng hóa không thuộc nhóm vật tư xây dựng (vd máy tính văn phòng).", + bypass: true, + fields: [ + "NCC bán hàng", + "Dự án (nếu có) hoặc Phòng ban đặt mua", + "Hạng mục hàng hóa: tên / model / số lượng / đơn giá", + "Bảo hành nhà sản xuất + bảo hành NCC", + "Phương thức giao hàng + thanh toán", + ], + codeFormat: "{Mã DA}/MB/SOL&{Mã NCC}/{số thứ tự 2 chữ số}", + }), + + ...cheatsheet({ + title: "6. HĐ Nguyên tắc NCC — Type 6", + use: "Khung hợp tác lâu dài với 1 NCC (vd hợp đồng nguyên tắc cung cấp xi măng cả năm).", + bypass: true, + fields: [ + "NCC + Phạm vi sản phẩm", + "Đơn giá khung (có thể điều chỉnh theo CPI / thị trường)", + "Thời hạn HĐ nguyên tắc (thường 1 năm)", + "Điều kiện chung: thanh toán / giao hàng / phạt", + ], + codeFormat: "{Năm 4 chữ số}/NCC/SOL&{Mã NCC}/{số thứ tự 2 chữ số}", + tips: [ + "Mã HĐ theo NĂM (không theo dự án) — vì áp dụng cho nhiều dự án", + "Mỗi đợt mua thực tế tạo Phiếu yêu cầu vật tư (chưa có module — manual)", + ], + }), + + ...cheatsheet({ + title: "7. HĐ Nguyên tắc DV — Type 7", + use: "Khung dịch vụ lâu dài (vd hợp đồng vệ sinh hàng năm cho mọi dự án).", + bypass: true, + fields: [ + "NCC dịch vụ + Phạm vi dịch vụ", + "Phí dịch vụ khung", + "Thời hạn HĐ nguyên tắc (thường 1 năm)", + "Điều kiện chung", + ], + codeFormat: "{Năm 4 chữ số}/HĐDV/SOL&{Mã NCC}/{số thứ tự 2 chữ số}", + }), + + h1("Mẹo chung khi tạo HĐ"), + bullet("Chọn đúng loại ngay từ đầu — không chuyển loại sau khi tạo (phải xóa + tạo lại)"), + bullet("Liên kết Ngân sách dự án nếu có — để theo dõi \"đã chi vs ngân sách\""), + bullet("Đính kèm đầy đủ: báo giá, biên bản đàm phán, phụ lục"), + bullet("Mã HĐ KHÔNG gen ngay — chỉ gen khi chuyển sang phase \"Đang đóng dấu\""), +]; + +const doc = buildDoc( + "User Manual - 06 Cheatsheet 7 loại HĐ", + "SOLUTION_ERP - User Manual - 06 Cheatsheet 7 loại HĐ", + children, +); + +const outPath = path.join(__dirname, 'user', '06-7-Loai-HD-Cheatsheet.docx'); +Packer.toBuffer(doc).then(buf => { + fs.writeFileSync(outPath, buf); + console.log('✅ Generated:', outPath); + console.log(' Size:', (buf.length / 1024).toFixed(1) + ' KB'); +}); diff --git a/docs/_user-guide/_helpers.js b/docs/_user-guide/_helpers.js new file mode 100644 index 0000000..6fcf0e2 --- /dev/null +++ b/docs/_user-guide/_helpers.js @@ -0,0 +1,292 @@ +// Shared helpers cho 5 file user manual (02-06) +const { + Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell, + Header, Footer, AlignmentType, LevelFormat, + HeadingLevel, BorderStyle, WidthType, ShadingType, PageNumber, + TableOfContents, TabStopType, TabStopPosition, +} = require('docx'); + +const PAGE_WIDTH = 12240, PAGE_HEIGHT = 15840, MARGIN = 1440; +const CONTENT_WIDTH = PAGE_WIDTH - MARGIN * 2; // 9360 +const FONT = "Calibri"; +const BRAND = "1F7DC1"; + +// ===== Heading helpers ===== +const h1 = (text) => new Paragraph({ + heading: HeadingLevel.HEADING_1, + children: [new TextRun({ text, font: FONT, size: 32, bold: true, color: BRAND })], + spacing: { before: 360, after: 200 }, +}); +const h2 = (text) => new Paragraph({ + heading: HeadingLevel.HEADING_2, + children: [new TextRun({ text, font: FONT, size: 26, bold: true, color: "333333" })], + spacing: { before: 280, after: 160 }, +}); +const h3 = (text) => new Paragraph({ + heading: HeadingLevel.HEADING_3, + children: [new TextRun({ text, font: FONT, size: 22, bold: true, color: "555555" })], + spacing: { before: 200, after: 120 }, +}); + +// ===== Text helpers ===== +const p = (text, opts = {}) => new Paragraph({ + children: [new TextRun({ text, font: FONT, size: 22, ...(opts.run || {}) })], + spacing: { after: 120 }, + ...opts, +}); +const bullet = (text, level = 0) => new Paragraph({ + numbering: { reference: "bullets", level }, + children: [new TextRun({ text, font: FONT, size: 22 })], + spacing: { after: 80 }, +}); +const num = (text, level = 0) => new Paragraph({ + numbering: { reference: "numbers", level }, + children: [new TextRun({ text, font: FONT, size: 22 })], + spacing: { after: 80 }, +}); + +// ===== Callout boxes ===== +const note = (text) => new Paragraph({ + shading: { fill: "FFF4D6", type: ShadingType.CLEAR }, + border: { left: { style: BorderStyle.SINGLE, size: 18, color: "F0B429" } }, + children: [new TextRun({ text: "💡 " + text, font: FONT, size: 22, italics: true })], + spacing: { before: 120, after: 120 }, + indent: { left: 240 }, +}); +const warn = (text) => new Paragraph({ + shading: { fill: "FFE5E5", type: ShadingType.CLEAR }, + border: { left: { style: BorderStyle.SINGLE, size: 18, color: "D63031" } }, + children: [new TextRun({ text: "⚠️ " + text, font: FONT, size: 22, italics: true })], + spacing: { before: 120, after: 120 }, + indent: { left: 240 }, +}); +const tip = (text) => new Paragraph({ + shading: { fill: "E8F5E9", type: ShadingType.CLEAR }, + border: { left: { style: BorderStyle.SINGLE, size: 18, color: "4CAF50" } }, + children: [new TextRun({ text: "✓ " + text, font: FONT, size: 22, italics: true })], + spacing: { before: 120, after: 120 }, + indent: { left: 240 }, +}); +const code = (text) => new Paragraph({ + shading: { fill: "F5F5F5", type: ShadingType.CLEAR }, + children: [new TextRun({ text, font: "Consolas", size: 20 })], + spacing: { before: 80, after: 120 }, + indent: { left: 240 }, +}); + +// ===== Mock screenshot placeholder ===== +const mockScreenshot = (label) => new Paragraph({ + alignment: AlignmentType.CENTER, + shading: { fill: "FAFAFA", type: ShadingType.CLEAR }, + border: { + top: { style: BorderStyle.DASHED, size: 6, color: "999999" }, + bottom: { style: BorderStyle.DASHED, size: 6, color: "999999" }, + left: { style: BorderStyle.DASHED, size: 6, color: "999999" }, + right: { style: BorderStyle.DASHED, size: 6, color: "999999" }, + }, + spacing: { before: 200, after: 200 }, + children: [new TextRun({ + text: `[ Ảnh chụp màn hình: ${label} ]`, + font: FONT, size: 20, italics: true, color: "999999", + })], +}); + +// ===== Table cell builder ===== +const border = { style: BorderStyle.SINGLE, size: 1, color: "CCCCCC" }; +const borders = { top: border, bottom: border, left: border, right: border }; +const cellMargins = { top: 80, bottom: 80, left: 120, right: 120 }; +const cell = (text, opts = {}) => new TableCell({ + borders, + width: { size: opts.width, type: WidthType.DXA }, + shading: opts.shading ? { fill: opts.shading, type: ShadingType.CLEAR } : undefined, + margins: cellMargins, + children: [new Paragraph({ + children: [new TextRun({ + text, font: FONT, size: 20, + bold: opts.bold || false, + color: opts.color || "000000", + })], + })], +}); + +// ===== Bảng nhập liệu chuẩn 5 cột ===== +const fieldTable = (rows) => { + const widths = [2200, 1500, 1100, 2860, 1700]; + return new Table({ + width: { size: CONTENT_WIDTH, type: WidthType.DXA }, + columnWidths: widths, + rows: [ + new TableRow({ tableHeader: true, children: [ + cell("Tên field", { width: widths[0], bold: true, shading: BRAND, color: "FFFFFF" }), + cell("Kiểu dữ liệu", { width: widths[1], bold: true, shading: BRAND, color: "FFFFFF" }), + cell("Bắt buộc", { width: widths[2], bold: true, shading: BRAND, color: "FFFFFF" }), + cell("Quy tắc validation", { width: widths[3], bold: true, shading: BRAND, color: "FFFFFF" }), + cell("Ví dụ", { width: widths[4], bold: true, shading: BRAND, color: "FFFFFF" }), + ]}), + ...rows.map(r => new TableRow({ children: [ + cell(r[0], { width: widths[0], bold: true }), + cell(r[1], { width: widths[1] }), + cell(r[2], { width: widths[2], color: r[2] === "Có" ? "D63031" : "999999", bold: r[2] === "Có" }), + cell(r[3], { width: widths[3] }), + cell(r[4], { width: widths[4] }), + ]})), + ], + }); +}; + +// ===== Bảng lỗi 3 cột ===== +const errorTable = (rows) => { + const widths = [2800, 3360, 3200]; + return new Table({ + width: { size: CONTENT_WIDTH, type: WidthType.DXA }, + columnWidths: widths, + rows: [ + new TableRow({ tableHeader: true, children: [ + cell("Lỗi / Triệu chứng", { width: widths[0], bold: true, shading: "D63031", color: "FFFFFF" }), + cell("Nguyên nhân", { width: widths[1], bold: true, shading: "D63031", color: "FFFFFF" }), + cell("Cách xử lý", { width: widths[2], bold: true, shading: "D63031", color: "FFFFFF" }), + ]}), + ...rows.map(r => new TableRow({ children: [ + cell(r[0], { width: widths[0], bold: true }), + cell(r[1], { width: widths[1] }), + cell(r[2], { width: widths[2] }), + ]})), + ], + }); +}; + +// ===== Bảng tổng quát N cột ===== +const genericTable = (headers, rows, widths, headerColor = BRAND) => { + return new Table({ + width: { size: CONTENT_WIDTH, type: WidthType.DXA }, + columnWidths: widths, + rows: [ + new TableRow({ tableHeader: true, children: headers.map((h, i) => + cell(h, { width: widths[i], bold: true, shading: headerColor, color: "FFFFFF" }) + )}), + ...rows.map(r => new TableRow({ children: r.map((c, i) => + cell(typeof c === 'string' ? c : c.text, { + width: widths[i], + bold: typeof c === 'object' ? c.bold : (i === 0), + }) + )})), + ], + }); +}; + +// ===== Title page ===== +const titlePage = (subtitle, partTitle) => [ + new Paragraph({ + alignment: AlignmentType.CENTER, + spacing: { before: 1200, after: 300 }, + children: [new TextRun({ text: "SOLUTION_ERP", font: FONT, size: 56, bold: true, color: BRAND })], + }), + new Paragraph({ + alignment: AlignmentType.CENTER, + spacing: { after: 120 }, + children: [new TextRun({ + text: "Hướng dẫn Sử dụng - User Manual", + font: FONT, size: 36, bold: true, color: "333333", + })], + }), + new Paragraph({ + alignment: AlignmentType.CENTER, + spacing: { after: 600 }, + children: [new TextRun({ + text: partTitle, + font: FONT, size: 28, color: "666666", + })], + }), + new Paragraph({ + alignment: AlignmentType.CENTER, + spacing: { after: 1200 }, + children: [new TextRun({ + text: "Công ty TNHH Xây dựng Solutions | Hệ thống Quản lý Hợp đồng", + font: FONT, size: 22, italics: true, color: "888888", + })], + }), + new Paragraph({ children: [new TextRun("")], pageBreakBefore: true }), + h1("Mục lục"), + new TableOfContents("Table of Contents", { hyperlink: true, headingStyleRange: "1-3" }), + new Paragraph({ children: [new TextRun("")], pageBreakBefore: true }), +]; + +// ===== Document builder ===== +const buildDoc = (title, headerLabel, contentChildren) => new Document({ + creator: "SOLUTION_ERP", + title, + description: title, + styles: { + default: { document: { run: { font: FONT, size: 22 } } }, + paragraphStyles: [ + { id: "Heading1", name: "Heading 1", basedOn: "Normal", next: "Normal", quickFormat: true, + run: { size: 32, bold: true, font: FONT, color: BRAND }, + paragraph: { spacing: { before: 360, after: 200 }, outlineLevel: 0 } }, + { id: "Heading2", name: "Heading 2", basedOn: "Normal", next: "Normal", quickFormat: true, + run: { size: 26, bold: true, font: FONT, color: "333333" }, + paragraph: { spacing: { before: 280, after: 160 }, outlineLevel: 1 } }, + { id: "Heading3", name: "Heading 3", basedOn: "Normal", next: "Normal", quickFormat: true, + run: { size: 22, bold: true, font: FONT, color: "555555" }, + paragraph: { spacing: { before: 200, after: 120 }, outlineLevel: 2 } }, + ], + }, + numbering: { + config: [ + { reference: "bullets", + levels: [ + { level: 0, format: LevelFormat.BULLET, text: "•", alignment: AlignmentType.LEFT, + style: { paragraph: { indent: { left: 720, hanging: 360 } } } }, + { level: 1, format: LevelFormat.BULLET, text: "◦", alignment: AlignmentType.LEFT, + style: { paragraph: { indent: { left: 1440, hanging: 360 } } } }, + ] }, + { reference: "numbers", + levels: [ + { level: 0, format: LevelFormat.DECIMAL, text: "%1.", alignment: AlignmentType.LEFT, + style: { paragraph: { indent: { left: 720, hanging: 360 } } } }, + { level: 1, format: LevelFormat.LOWER_LETTER, text: "%2)", alignment: AlignmentType.LEFT, + style: { paragraph: { indent: { left: 1440, hanging: 360 } } } }, + ] }, + ], + }, + sections: [{ + properties: { + page: { + size: { width: PAGE_WIDTH, height: PAGE_HEIGHT }, + margin: { top: MARGIN, right: MARGIN, bottom: MARGIN, left: MARGIN }, + }, + }, + headers: { + default: new Header({ children: [new Paragraph({ + alignment: AlignmentType.RIGHT, + children: [new TextRun({ + text: headerLabel, + font: FONT, size: 18, color: "888888", + })], + })]}), + }, + footers: { + default: new Footer({ children: [new Paragraph({ + tabStops: [{ type: TabStopType.RIGHT, position: TabStopPosition.MAX }], + children: [ + new TextRun({ text: "© Solutions | v1.0 | 2026-05-04", font: FONT, size: 18, color: "888888" }), + new TextRun({ text: "\tTrang ", font: FONT, size: 18, color: "888888" }), + new TextRun({ children: [PageNumber.CURRENT], font: FONT, size: 18, color: "888888" }), + new TextRun({ text: " / ", font: FONT, size: 18, color: "888888" }), + new TextRun({ children: [PageNumber.TOTAL_PAGES], font: FONT, size: 18, color: "888888" }), + ], + })]}), + }, + children: contentChildren, + }], +}); + +module.exports = { + // Constants + PAGE_WIDTH, PAGE_HEIGHT, MARGIN, CONTENT_WIDTH, FONT, BRAND, + // Helpers + h1, h2, h3, p, bullet, num, note, warn, tip, code, mockScreenshot, + cell, fieldTable, errorTable, genericTable, + titlePage, buildDoc, + // Re-export docx primitives + Paragraph, TextRun, Packer, +}; diff --git a/docs/_user-guide/admin/02-Quan-ly-Users-Roles.docx b/docs/_user-guide/admin/02-Quan-ly-Users-Roles.docx new file mode 100644 index 0000000000000000000000000000000000000000..f87c605c1767324f6b6ba74c00fc0847d55787c5 GIT binary patch literal 12737 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" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/nanoid": { + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.11.tgz", + "integrity": "sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "license": "MIT" + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + } + } +} diff --git a/docs/_user-guide/package.json b/docs/_user-guide/package.json new file mode 100644 index 0000000..7eb5f34 --- /dev/null +++ b/docs/_user-guide/package.json @@ -0,0 +1,19 @@ +{ + "name": "solution-erp-user-guide-generator", + "version": "1.0.0", + "description": "Generate end-user manual .docx files for SOLUTION_ERP", + "private": true, + "scripts": { + "gen:01": "node _gen-user-01.js", + "gen:02": "node _gen-user-02.js", + "gen:03": "node _gen-user-03.js", + "gen:04": "node _gen-user-04.js", + "gen:05": "node _gen-user-05.js", + "gen:06": "node _gen-user-06.js", + "gen:admin-02": "node _gen-admin-02.js", + "gen:all": "npm run gen:01 && npm run gen:02 && npm run gen:03 && npm run gen:04 && npm run gen:05 && npm run gen:06 && npm run gen:admin-02" + }, + "dependencies": { + "docx": "9.5.0" + } +} diff --git a/docs/_user-guide/user/01-Bat-dau.docx b/docs/_user-guide/user/01-Bat-dau.docx new file mode 100644 index 0000000000000000000000000000000000000000..23d753a6688cab18804c419110601caa73492119 GIT binary patch literal 12093 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 literal 0 HcmV?d00001 diff --git a/docs/_user-guide/user/02-Hop-dong.docx b/docs/_user-guide/user/02-Hop-dong.docx new file mode 100644 index 0000000000000000000000000000000000000000..accecdab841fa8790a220b95dad3f9a0de03597a GIT binary patch literal 12350 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 literal 0 HcmV?d00001 diff --git a/docs/_user-guide/user/06-7-Loai-HD-Cheatsheet.docx b/docs/_user-guide/user/06-7-Loai-HD-Cheatsheet.docx new file mode 100644 index 0000000000000000000000000000000000000000..1e3b03562f07b8dbd002d5d45cf6cfdbfdfec41f GIT binary patch literal 12822 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 Jd;$Og{eRC>+?fCX literal 0 HcmV?d00001