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>
84 lines
4.2 KiB
JavaScript
84 lines
4.2 KiB
JavaScript
// 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');
|
||
});
|