Друковані форми документів — PrintForms¶
Архітектура, стратегія, фази реалізації і roadmap описані у єдиному документі: → planning/reports-and-print-strategy.md (§ 2 — Print Framework).
Статус¶
Фаза 2 (Print Migration) закрита у сесії 2026-04-24. Універсальний fallback-шаблон додано у сесії 2026-04-25.
backend/core/print/— движок (Jinja2 sandbox + Playwright headless Chromium), resolver (tenant→locale→base), registry, QR (segno), media helpers.- 3 кастомні PDF-контракти + шаблони: Invoice, GoodsShipment, Waybill. Усі з QR-кодом для warehouse-сценарію.
UniversalPrintContract(backend/core/print/universal.py) — fallback для будь-якогоTransactionModelбез зареєстрованогоPrintContract. Контекст автогенерується з метаданих моделі (header / parties / lines / totals / org_branding), рендериться через universal/base.html. Резолвер шукає модель черезEntityRegistry, потім через Django app registry — тож навіть моделі позаEntityRegistry(Manufacturing, AdditionalExpenseAllocation) автоматично друкуються.- Waybill відповідає 7 вимогам первинного документа (ЗУ «Про бухоблік»).
- Universal list print — shared/ListPrintV2.tsx +
/api/v1/print-list/<entity>/. - Organization branding — logo + director/accountant facsimile, auto-підстановка в шаблони.
- Frontend:
printDocumentSafe(entityCode, recordId, lang)з lib/printPdf.ts — єдина точка виклику з форм і list-toolbar'ів. Усі legacy URL-навігації (navigate('${basePath}/print?docId=X')) видалено. - Fortune Sheet повністю видалений (попередня реалізація шаблонів у
public/templates/*.json).
Master data — друк за замовчуванням вимкнений¶
UniversalPrintContract свідомо обмежений TransactionModel — для довідників не вмикається. У MasterDataFormToolbar кнопка «Принтер» показується тільки якщо форма явно передає onPrint. Відсутність кастомного PrintContract для довідника = кнопка прихована (без 404-відповідей чи мовчазних no-op).
Якщо для конкретного довідника потрібна кастомна друкована форма (наприклад «Особова справа» для Employee, «Картка автомобіля» для Vehicle): пишеш свій PrintContract + статичний шаблон + явно передаєш onPrint={() => printDocumentSafe('<entity>', recordId, lang)} у формі.
Як додати новий PDF-шаблон¶
Кастомний шаблон потрібен лише коли універсальний layout не задовольняє (специфічна юридична форма, кастомні обчислення в контексті, особливі лейаути).
Через skill: .claude/skills/new-print-template/SKILL.md — 6 чекпоінтів (backend PrintContract → HTML template → registry → frontend mappings → onPrint handlers → browser test).
Референси реалізації: backend/core/print/, backend/essentials/print/contracts.py, print_templates/{invoice,goods-shipment,waybill,universal}/.
Фаза 3 — AI Inbox для шаблонів¶
Не розпочата. План у reports-and-print-strategy.md § 4 Фаза 3: Gmail IMAP → restricted Claude Agent SDK tool-set → PrintTemplateOverride модель з version history → HMAC-approval endpoint.