// 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'); });