"""Generate legitimate Belarusian construction .docx templates with Jinja2 tags. Run once from `backend/`: python scripts/generate_templates.py The resulting .docx files will be saved to `backend/templates/`. They are recognised by `app.services.document_engine.DocumentEngine`. """ from __future__ import annotations from pathlib import Path from docx import Document from docx.shared import Pt from docx.enum.text import WD_ALIGN_PARAGRAPH TEMPLATES_DIR = Path(__file__).resolve().parents[1] / "templates" def _styled_heading(doc: Document, text: str) -> None: p = doc.add_paragraph() p.alignment = WD_ALIGN_PARAGRAPH.CENTER run = p.add_run(text) run.bold = True run.font.size = Pt(14) def _add_kv(doc: Document, label: str, jinja_var: str | None = None) -> None: value = "{{ " + (jinja_var or label) + " }}" doc.add_paragraph(f"{label}: {value}") def generate_act_hidden_works() -> None: doc = Document() _styled_heading(doc, "АКТ освидетельствования скрытых работ") _add_kv(doc, "Объект", "object_name") _add_kv(doc, "Заказчик", "client") _add_kv(doc, "Подрядчик", "contractor") _add_kv(doc, "Технадзор", "technical_supervisor") _add_kv(doc, "Прораб", "work_producer") _add_kv(doc, "Главный инженер", "chief_engineer") _add_kv(doc, "Договор №", "contract_no") doc.add_paragraph() doc.add_paragraph("1. Описание скрытых работ:") _add_kv(doc, " ", "work_description") doc.add_paragraph("2. Объём работ:") _add_kv(doc, " ", "volume") doc.add_paragraph("3. Дата составления акта:") _add_kv(doc, " ", "generated_at") doc.add_paragraph() doc.add_paragraph("Подписи сторон: _____________________ / _____________________ / _____________________") doc.save(str(TEMPLATES_DIR / "act_hidden_works.docx")) def generate_act_osmotr() -> None: doc = Document() _styled_heading(doc, "АКТ осмотра ответственных конструкций") _add_kv(doc, "Объект", "object_name") _add_kv(doc, "Заказчик", "client") _add_kv(doc, "Подрядчик", "contractor") _add_kv(doc, "Технадзор", "technical_supervisor") _add_kv(doc, "Главный инженер", "chief_engineer") _add_kv(doc, "Договор №", "contract_no") doc.add_paragraph() doc.add_paragraph("1. Перечень конструкций:") _add_kv(doc, " ", "work_description") doc.add_paragraph("2. Объём / кол-во:") _add_kv(doc, " ", "volume") doc.add_paragraph("3. Заключение:") _add_kv(doc, " ", "verdict") doc.add_paragraph() doc.add_paragraph("Комиссия: ___________________ / ___________________ / ___________________") doc.save(str(TEMPLATES_DIR / "act_osmotr_responsibility.docx")) def generate_general_work_log() -> None: doc = Document() _styled_heading(doc, "Общий журнал работ") _add_kv(doc, "Объект", "object_name") _add_kv(doc, "Заказчик", "client") _add_kv(doc, "Подрядчик", "contractor") _add_kv(doc, "Производитель работ", "work_producer") _add_kv(doc, "Договор №", "contract_no") doc.add_paragraph() doc.add_paragraph("Период:") _add_kv(doc, "с ", "date_from") _add_kv(doc, "по ", "date_to") doc.add_paragraph("Описание работ:") _add_kv(doc, " ", "work_description") doc.save(str(TEMPLATES_DIR / "general_work_log.docx")) def generate_material_certificate() -> None: doc = Document() _styled_heading(doc, "Сертификат / паспорт на материал") _add_kv(doc, "Объект", "object_name") _add_kv(doc, "Подрядчик", "contractor") _add_kv(doc, "Договор №", "contract_no") doc.add_paragraph() doc.add_paragraph("1. Наименование материала:") _add_kv(doc, " ", "material") doc.add_paragraph("2. Объём поставки:") _add_kv(doc, " ", "volume") doc.add_paragraph("3. Сертификат № / партия:") _add_kv(doc, " ", "certificate_no") doc.save(str(TEMPLATES_DIR / "material_certificate.docx")) def main() -> None: TEMPLATES_DIR.mkdir(parents=True, exist_ok=True) generate_act_hidden_works() generate_act_osmotr() generate_general_work_log() generate_material_certificate() for p in sorted(TEMPLATES_DIR.glob("*.docx")): print(f"[generate] {p.name} ({p.stat().st_size} bytes)") print("[done] templates ready") if __name__ == "__main__": main()