Minh Đỗ
Nghị định 30/2020/NĐ-CP

Tạo Văn Bản Hành Chính

Dạy AI Agent cách sinh file .docx văn bản hành chính đúng thể thức. Từ công văn đến quyết định, đúng chuẩn pixel-perfect.

2
Loại văn bản
5
Bước thực hiện
NĐ30
Chuẩn áp dụng

Phiên bản 1.0 | Tháng 3/2026

📝 Biên soạn: Minh Đỗ

Chương 1: Giới thiệu

Nghị định 30 là gì?

Nghị định 30/2020/NĐ-CP là văn bản quy phạm pháp luật quy định về công tác văn thư, bao gồm thể thức trình bày văn bản hành chính tại Việt Nam. Mọi cơ quan nhà nước, tổ chức chính trị, đơn vị sự nghiệp đều phải tuân thủ.

Skill này giải quyết vấn đề gì?

Không có SkillCó Skill
Soạn văn bản bằng Word, canh lề thủ công, dễ sai thông sốSinh file .docx tự động, đúng thông số pixel-perfect
Không biết quốc hiệu cỡ bao nhiêu, tiêu ngữ đậm hay thườngĐã mã hóa toàn bộ thông số: cỡ chữ, kiểu chữ, khoảng cách
Gạch ngang dùng Underline, in ra bị lệchDùng Border Top - kỹ thuật chuẩn, không lệch khi in
Không rõ ai ký: Bộ trưởng, Thứ trưởng hay Vụ trưởng?Ma trận phân quyền ký TM/KT/TL tự động tra cứu
Header 2 cột bị lệch, chữ "NAM" rớt xuống dòngTable ẩn viền 2 cột tỷ lệ 3500:5571 dxa - không bao giờ rớt chữ

Hỗ trợ 2 loại văn bản

Công văn Văn bản không có tên loại

Dùng khi trao đổi, hướng dẫn, đề nghị giữa các cơ quan. Không có tiêu đề "CÔNG VĂN" trên văn bản. Phần "Kính gửi" nằm ngay sau header.

Quyết định Văn bản có tên loại

Dùng khi ban hành quyết định hành chính: bổ nhiệm, thành lập tổ công tác, phê duyệt kế hoạch. Có tiêu đề "QUYẾT ĐỊNH" in hoa đậm giữa trang, phần "Căn cứ" nghiêng, nội dung chia theo Điều.

Chương 2: Cài đặt

Yêu cầu hệ thống

Thành phầnYêu cầu
Node.jsPhiên bản 18 trở lên
npmĐi kèm Node.js
Thư viện docxPhiên bản 9.0 trở lên (cài tự động)
Microsoft WordĐể mở và kiểm tra file .docx đầu ra

Cài đặt

# Vào thư mục skill
cd .agents/skill/Skill_The_Thuc_VB_ND30

# Cài thư viện
npm install

Cấu trúc thư mục

Skill_The_Thuc_VB_ND30/
├── SKILL.md                     ← Hướng dẫn cho AI Agent
├── README.md                    ← Giới thiệu cho người dùng
├── package.json                 ← Khai báo thư viện docx
├── scripts/
│   ├── generate_cong_van.js     ← Script sinh công văn
│   └── generate_quyet_dinh.js   ← Script sinh quyết định
└── references/
    ├── quy_tac_the_thuc.md      ← Thông số pixel-perfect
    └── phan_quyen_ky.md         ← Ma trận phân quyền ký

Cách sử dụng với AI Agent

Khi đã cài skill vào workspace, chỉ cần nói tự nhiên:

Ví dụ 1: "Soạn công văn gửi Sở Tài chính về việc hướng dẫn quyết toán thuế"

Ví dụ 2: "Tạo quyết định thành lập tổ công tác kiểm tra"

Ví dụ 3: "Soạn văn bản hành chính gửi các chi cục thuế"

Agent sẽ tự động: thu thập thông tin → tra phân quyền ký → tạo JSON → chạy script → xuất file .docx.

Chương 3: Công văn

Công văn Văn bản không có tên loại - dùng để trao đổi, hướng dẫn, đề nghị.

Quy trình 5 bước

BướcMô tảChi tiết
1Thu thập thông tinHỏi: loại văn bản, cơ quan, người nhận, nội dung, ai ký
2Tra phân quyền kýĐọc phan_quyen_ky.md → xác định TM/KT/TL
3Tạo file JSONTạo dữ liệu đầu vào theo cấu trúc quy định
4Chạy scriptnode scripts/generate_cong_van.js --input data.json --output cong_van.docx
5Kiểm traMở file .docx bằng Word, kiểm tra header, font, lề

Cấu trúc JSON đầu vào

{
  "loai_van_ban": "cong_van",
  "co_quan_chu_quan": "BỘ TÀI CHÍNH",
  "co_quan_ban_hanh": "CỤC THUẾ TP. HÀ NỘI",
  "don_vi_soan_thao": "CT-HNi",
  "dia_danh": "Hà Nội",
  "trich_yeu": "V/v hướng dẫn kê khai thuế TNCN năm 2026",
  "kinh_gui": [
    "Các Chi cục Thuế quận, huyện",
    "Phòng Thuế thu nhập cá nhân"
  ],
  "noi_dung": "Nội dung công văn...",
  "cap_ky": "KT",
  "chuc_vu_cap_tren": "CỤC TRƯỞNG",
  "chuc_vu_ky": "PHÓ CỤC TRƯỞNG",
  "nguoi_ky": "Nguyễn Văn An",
  "noi_nhan": [
    "- Như trên;",
    "- Cục trưởng (để b/c);",
    "- Lưu: VT, TNCN (3b)."
  ]
}

Giải thích các trường

TrườngBắt buộcMô tả
co_quan_chu_quanCóTên cơ quan cấp trên (VD: BỘ TÀI CHÍNH)
co_quan_ban_hanhCóTên cơ quan ban hành (VD: CỤC THUẾ TP. HÀ NỘI)
don_vi_soan_thaoKhôngViết tắt đơn vị soạn thảo, dùng cho số ký hiệu
dia_danhKhôngMặc định "Hà Nội"
trich_yeuCóTrích yếu nội dung (VD: V/v hướng dẫn...)
kinh_guiCóMảng tên cơ quan nhận
noi_dungCóNội dung chính, tách đoạn bằng xuống dòng
cap_kyKhôngTM / KT / TL / TUQ (xem Chương 6)
chuc_vu_cap_trenKhôngChức vụ người đứng đầu (khi dùng KT/TL)
chuc_vu_kyCóChức vụ người ký
nguoi_kyCóHọ tên người ký
noi_nhanKhôngMảng nơi nhận, mặc định: "Như trên" + "Lưu: VT"

Lệnh chạy

node scripts/generate_cong_van.js --input data.json --output cong_van.docx

Chương 4: Quyết định

Quyết định Văn bản có tên loại - dùng khi ban hành quyết định hành chính.

Khác biệt so với Công văn

Yếu tốCông vănQuyết định
Tên loạiKhông có"QUYẾT ĐỊNH" in hoa, đậm, giữa trang
Trích yếu"V/v ..." cỡ 12, dưới số ký hiệuDưới tên loại, đậm, có gạch ngang
Căn cứKhông cóLiệt kê các căn cứ pháp lý, chữ nghiêng
Nội dungĐoạn văn tự doChia theo Điều 1, Điều 2, Điều 3...
Kính gửiCóKhông (thay bằng "Căn cứ")

Cấu trúc JSON - Quyết định

{
  "loai_van_ban": "quyet_dinh",
  "co_quan_chu_quan": "BỘ TÀI CHÍNH",
  "co_quan_ban_hanh": "CỤC THUẾ TP. HÀ NỘI",
  "don_vi_soan_thao": "QĐ-CT",
  "trich_yeu": "Về việc thành lập Tổ công tác kiểm tra thuế",
  "can_cu": [
    "Luật Quản lý thuế số 38/2019/QH14",
    "Nghị định số 126/2020/NĐ-CP ngày 19/10/2020"
  ],
  "noi_dung": "Điều 1. Thành lập Tổ công tác...\nĐiều 2. Tổ công tác có nhiệm vụ...\nĐiều 3. Quyết định này có hiệu lực kể từ ngày ký.",
  "cap_ky": "TM",
  "chuc_vu_ky": "CỤC TRƯỞNG",
  "nguoi_ky": "Phạm Đình Hưng",
  "noi_nhan": [
    "- Như Điều 3;",
    "- Phòng KT1, KT2;",
    "- Lưu: VT, TCCB (5b)."
  ]
}

Trường riêng của Quyết định

TrườngMô tả
can_cuMảng liệt kê các căn cứ pháp lý. In nghiêng, kết thúc bằng dấu ";" (mục cuối kết bằng ".")
noi_dung (chuỗi)Nội dung dạng văn bản. Các dòng bắt đầu bằng "Điều X." sẽ tự động in đậm
noi_dung (mảng)Mảng các Điều, mỗi phần tử có tieu_de và noi_dung

Lệnh chạy

node scripts/generate_quyet_dinh.js --input data.json --output quyet_dinh.docx

Chương 5: Thông số thể thức

Tham chiếu Toàn bộ thông số pixel-perfect để sinh file .docx đúng chuẩn.

Khổ giấy và lề

Thông sốGiá trịĐơn vị dxa
Khổ giấyA4 (210 x 297 mm)-
Lề trái30 mm~1701 dxa
Lề phải20 mm~1134 dxa
Lề trên20 mm~1134 dxa
Lề dưới20 mm~1134 dxa
Font mặc địnhTimes New Roman, Unicode-

Header - Table 2 cột x 2 dòng ẩn viền

Đây là phần quan trọng nhất và hay bị sai nhất. Header PHẢI dùng Table ẩn viền, KHÔNG dùng Tab hay Space.

Cấu trúc Header

+---------------------------+------------------------------------------+
| DÒNG 1 - CỘT TRÁI (3500) | DÒNG 1 - CỘT PHẢI (5571)                |
| - Tên cơ quan chủ quản    | - QUỐC HIỆU (in hoa, đậm, cỡ 13)       |
| - TÊN CƠ QUAN BAN HÀNH   | - Tiêu ngữ (đậm, thường, cỡ 14)         |
|   + Gạch ngang 1/3        |   + Gạch ngang = chiều dài tiêu ngữ      |
+---------------------------+------------------------------------------+
| DÒNG 2 - CỘT TRÁI (3500) | DÒNG 2 - CỘT PHẢI (5571)                |
| - Số, Ký hiệu            | - Địa danh, ngày tháng (nghiêng, cỡ 14) |
| - V/v (Trích yếu, cỡ 12) |                                          |
+---------------------------+------------------------------------------+

Thông số chi tiết Header

Yếu tốVị tríCỡ chữKiểuKẻ dưới
Quốc hiệuDòng 1, Phải (5571 dxa)13ĐẬM, IN HOAKhông
Tiêu ngữDòng 1, Phải (dưới QH)14Đậm, ThườngBorder Top, indent 1100 dxa
Cơ quan chủ quảnDòng 1, Trái (3500 dxa)13Thường, IN HOAKhông
Cơ quan ban hànhDòng 1, Trái (giữa)13ĐẬM, IN HOABorder Top, indent 1350 dxa
Số, Ký hiệuDòng 2, Trái13ThườngKhông
Địa danh, ngày thángDòng 2, Phải14NghiêngKhông
Trích yếu (V/v)Dòng 2, Trái12ThườngKhông

Body - Thông số khoảng cách

Thông sốGiá trịĐơn vị twips
Khoảng cách trước đoạn6pt120 twips
Khoảng cách sau đoạn6pt120 twips
Giãn dòngChính xác 17pt340 twips (LineRuleType.EXACT)
Lùi đầu dòng1 - 1.27 cm~720 twips
Cỡ chữ body14 (hoặc 13)-
Căn lềĐều 2 bên (Justified)-

Kỹ thuật gạch ngang - Border Top

TUYỆT ĐỐI KHÔNG dùng UnderlineType

Gạch ngang trong văn bản hành chính phải dùng Border Top trên một Paragraph trống. Không dùng UnderlineType, ImageRun, hay thẻ <v:line>.

Lý do: UnderlineType phụ thuộc vào nội dung text, khi in sẽ bị lệch. Border Top là đường viền cố định, không phụ thuộc text.

// Gạch dưới tên cơ quan (1/3 chiều rộng cột trái)
new Paragraph({
  spacing: { before: 20, after: 0 },
  border: {
    top: { style: BorderStyle.SINGLE, size: 2, color: "000000", space: 1 }
  },
  indent: { left: 1350, right: 1350 }
});

// Gạch dưới tiêu ngữ (bằng chiều dài chữ)
new Paragraph({
  spacing: { before: 20, after: 0 },
  border: {
    top: { style: BorderStyle.SINGLE, size: 2, color: "000000", space: 1 }
  },
  indent: { left: 1100, right: 1100 }
});

Chương 6: Phân quyền ký

Tham chiếu Quy định cách trình bày khối chữ ký theo cấp ký.

Các hình thức ký

Viết tắtĐầy đủÝ nghĩaNgười ký
TM.Thay mặtNgười đứng đầu ký trực tiếpBộ trưởng
KT.Ký thayCấp phó ký thay người đứng đầuThứ trưởng
TL.Thừa lệnhCấp dưới ký theo ủy quyềnVụ trưởng
TUQ.Thừa ủy quyềnKý theo ủy quyền chuyển tiếpPhó Vụ trưởng

Cách trình bày khối chữ ký

Bộ trưởng ký trực tiếp

                              BỘ TRƯỞNG
                          (Ký, ghi rõ họ tên)
                            Nguyễn Văn Thắng

Thứ trưởng ký thay (KT.)

                            KT. BỘ TRƯỞNG
                              THỨ TRƯỞNG
                          (Ký, ghi rõ họ tên)
                            Đỗ Thanh Trung

Vụ trưởng ký thừa lệnh (TL.)

                            TL. BỘ TRƯỞNG
                      VỤ TRƯỞNG VỤ TỔ CHỨC CÁN BỘ
                          (Ký, ghi rõ họ tên)
                            Nguyễn Văn A

Phó Vụ trưởng ký thừa ủy quyền (TUQ.)

                            TL. BỘ TRƯỞNG
                    KT. VỤ TRƯỞNG VỤ TỔ CHỨC CÁN BỘ
                           PHÓ VỤ TRƯỞNG
                          (Ký, ghi rõ họ tên)
                            Trần Văn B

Loại công việc tương ứng cấp ký

Loại công việcCấp kýChức vụ
Cử đại diện tham gia tổ công tác (Thứ trưởng)TM.Bộ trưởng ký
Cử đại diện tham gia tổ công tác (cấp Vụ)KT.Thứ trưởng ký
Văn bản hành chính thông thườngTL.Vụ trưởng ký
Quyết định bổ nhiệm, điều độngTM.Bộ trưởng ký

Thông số kỹ thuật khối chữ ký

Yếu tốCỡ chữKiểu
Quyền hạn (TM./KT./TL.)13IN HOA, Đậm, căn phải
Chức vụ13 hoặc 14IN HOA, Đậm, căn giữa khối
"(Ký, ghi rõ họ tên)"14Nghiêng, căn giữa
Họ tên người ký14Đậm, căn giữa dưới chức vụ
Khoảng cách đến chữ ký2-3 dòng trống

Nơi nhận

Yếu tốCỡ chữKiểu
"Nơi nhận:"12Đậm, Nghiêng
Các mục liệt kê11Thường, bắt đầu bằng dấu "-"
Mục cuối11"Lưu: VT, ..."

Chương 7: Tham khảo nhanh

Lệnh tắt

LệnhMô tả
node scripts/generate_cong_van.js --input data.json --output cong_van.docxSinh công văn
node scripts/generate_quyet_dinh.js --input data.json --output quyet_dinh.docxSinh quyết định
npm installCài thư viện docx

Danh sách kiểm tra sau khi tạo file

Kiểm traĐúngSai thường gặp
Header 2 cộtTable ẩn viền, cân đốiDùng Tab/Space, bị lệch khi in
Quốc hiệuĐủ chữ "NAM" trên 1 dòngChữ "NAM" rớt xuống dòng 2
Gạch ngangBorder Top, chiều dài cố địnhDùng Underline, bị lệch
FontTimes New Roman toàn bộLẫn font khác (Calibri, Arial)
Cỡ chữ13-14pt body, đúng từng phầnCỡ đồng nhất, không phân biệt
LềTrái 3cm, các lề khác 2cmLề đều 2cm hoặc 2.54cm
Giãn dòngChính xác 17ptDùng Single hoặc 1.5
Khối chữ kýTM/KT/TL + chức vụ đúngThiếu tiền tố quyền hạn

Câu hỏi thường gặp

Tại sao dùng Border Top thay vì Underline?

UnderlineType gắn vào text, khi text thay đổi thì đường gạch cũng thay đổi. Border Top là đường viền của Paragraph, chiều dài cố định bằng indent, không phụ thuộc nội dung text.

Tỷ lệ 3500:5571 nghĩa là gì?

Đó là chiều rộng 2 cột header tính bằng đơn vị dxa (1 inch = 1440 dxa). Tỷ lệ này đảm bảo quốc hiệu "CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM" không bị rớt chữ "NAM" xuống dòng mới.

Có thể thêm loại văn bản khác không?

Có. Tạo script mới (VD: generate_to_trinh.js) theo cùng cấu trúc. Header và chữ ký giống nhau, chỉ khác phần Body.

Tệp tham chiếu ở đâu?

TệpNội dung
references/quy_tac_the_thuc.mdThông số pixel-perfect: Header, Body, Chữ ký
references/phan_quyen_ky.mdMa trận phân quyền ký TM/KT/TL

Thông tin dự án

Phiên bản: 1.0

Chuẩn áp dụng: Nghị định 30/2020/NĐ-CP, Quyết định 4114/QĐ-BTC

Công nghệ: Node.js + docx-js

Yêu cầu: Node.js phiên bản 18 trở lên