# Biểu mẫu Sáng kiến – Auto-fill Toolkit

Tự động điền hồ sơ sáng kiến (Mẫu số 01–04 + Bản cam kết) từ file JSON.

## Files trong bộ công cụ

| File | Mô tả |
|---|---|
| `template_sang_kien.docx` | Template Word với placeholder `{{...}}` (docxtpl/Jinja2) |
| `data_blank.json` | Schema JSON rỗng – copy rồi điền dữ liệu vào |
| `data_sop.json` | Ví dụ đã điền sẵn (SOP xét duyệt đạo đức nghiên cứu trên động vật) |
| `fill_template.py` | Script điền JSON vào template → xuất file `.docx` |
| `build_template.py` | Script tạo lại template (nếu cần chỉnh sửa bố cục) |

## Cài đặt

```bash
pip install docxtpl
```

## Sử dụng

1. Copy `data_blank.json` → `data_cua_toi.json`
2. Điền dữ liệu vào file JSON
3. Chạy lệnh:
   ```bash
   python fill_template.py data_cua_toi.json output.docx
   ```

## Quy ước JSON

### Text đơn giản
```json
"ten_sang_kien": "Tên sáng kiến của tôi"
```

### Bảng (nhiều dòng)
Thêm nhiều object vào array – template sẽ tự nhân dòng:
```json
"danh_sach_tac_gia": [
  {"stt": "1", "ho_ten": "Nguyễn Văn A", "ngay_sinh": "01/01/1990", ...},
  {"stt": "2", "ho_ten": "Trần Thị B",  "ngay_sinh": "02/02/1992", ...}
]
```

### Checkbox
```json
"phan_loai": {
  "giai_phap_ky_thuat": true,     // ☑ được đánh dấu
  "sang_kien_tu_nckh":  false,    // ☐ không đánh dấu
  "sang_kien_tu_sach":  false
}
```

### Ngày tháng
```json
"ngay_ky": {"ngay": "15", "thang": "10", "nam": "2025"}
```

## Cấu trúc JSON

```
trang_bia          → Trang bìa ngoài + trong
mau_01             → Mẫu số 01: Báo cáo mô tả sáng kiến
mau_02             → Mẫu số 02: Đơn đề nghị công nhận
mau_03             → Mẫu số 03: Bản xác nhận tỷ lệ đóng góp
mau_04             → Mẫu số 04: Phiếu đánh giá
ban_cam_ket        → Bản cam kết
```

## Liên kết với fe0 (ứng viên)

- **Frontend** (`fe0`) giữ bản mẫu có **nhãn tiếng Việt** làm khóa: `fe0/public/assets/bieu_mau_sang_kien_template.json` (và bản import trong `fe0/src/components/applicant/initiative-draft/bieu_mau_sang_kien_template.json`).
- Hàm `buildOfficialBieuMauFromDraft` trong `mapDraftToOfficialBieuMau.ts` điền đối tượng này từ **Đơn / Báo cáo / Xác nhận đóng góp** (cùng nguồn với `ReviewPanel`).
- Trường **`officialBieuMau`** trong JSON bundle xuất từ **Review** (`Tải JSON đầy đủ`) là cùng cấu trúc — backend có thể lưu JSONB hoặc `json.dumps` rồi chạy `fill_template.py` sau khi map sang `data_blank.json` (snake_case) nếu template Word dùng khóa Latin.

## Lưu ý kỹ thuật

- Template dùng cú pháp `docxtpl` (mở rộng Jinja2 cho Word)
- Bảng dùng pattern `{%tr for %}` / `{%tr endfor %}` – 2 dòng đánh dấu sẽ bị xóa khi render, chỉ còn các dòng dữ liệu
- Checkbox dùng `{% if %}☑{% else %}☐{% endif %}`
- Muốn xuống dòng trong cùng một field text: dùng `\n` trong JSON (docxtpl xử lý tự động)

## Minh chứng đính kèm (2.1 / 2.2)

Các tệp minh chứng PDF (và loại khác) **không** đi qua bộ `fill_template.py` ở đây. Chúng được tải lên MinIO qua **be0** và hiển thị trong **fe0** (tab Minh chứng). API trả về `downloadUrl` (tải / mở tab) và `viewUrl` (xem PDF nhúng với `Content-Disposition: inline`).
