Перейти до змісту

Друковані форми документів — 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.