Skip to content

1.3.0

Released: 2026-05-29

Highlights

  • The visual PDF builder now has a home for its layouts: tenants can save, version, and reuse document designs per document type (Quotes, Orders, Invoices, …).

Added

  • PDF Builder Templates — a new module that stores a versioned, JSON-based builder layout per document type. See PDF Builder Templates.
  • GraphQL queries: pdfBuilderTemplates, pdfBuilderTemplate, pdfBuilderTemplatesByEntityType, defaultPdfBuilderTemplate.
  • GraphQL mutations: createPdfBuilderTemplate, updatePdfBuilderTemplate, deletePdfBuilderTemplate.
  • Types: PdfBuilderTemplate, PdfBuilderTemplateInput.
  • A template can be marked the default for its entity type (isDefault); the backend keeps at most one default per type and exposes defaultPdfBuilderTemplate(entityType: …) to fetch it.

Changed

  • Nothing.

Fixed

  • Nothing.

Migrations

  • add_pdf_builder_templates_table (down_revision add_sales_safety_tier_1) — creates the pdf_builder_templates table (name, entity_type, value jsonb, version, created_at) with an index on entity_type.
  • add_is_default_to_pdf_builder_templates (down_revision add_pdf_builder_templates_table) — adds the is_default column and a partial unique index enforcing one default per entity type.

No one-off scripts required.

Frontend impact

  • The PDF builder serializes its canvas to a JSON object and persists it as value on a PdfBuilderTemplate, along with a version string and an entityType (one of the PdfSourceType enum values).
  • Full CRUD plus fetch-by-entity-type is available, so the builder can list "templates for Quotes", load one to edit, save a new version, and delete.

Versioning notes

  • Bumped with uv run python scripts/bump_version.py 1.3.0 --changelog-stub.
  • MINOR bump: additive GraphQL surface and a new table; no breaking changes and no deploy-order constraints beyond applying the migration.