Формат шаблона

Краткий справочник для тех, кто пишет свой файл .invoyatemplate.

Шаблон — это JSON-файл с расширением .invoyatemplate. Он описывает только макет: какие разделы есть в счёте, в каком порядке и как они выглядят. Данные подставляет Invoya, а все подписи — «Плательщик», «Итого» — печатаются на языке, выбранном в приложении.

Проще всего начать с шаблона из галереи: скачайте его, измените в любом текстовом редакторе и откройте в Invoya — вы увидите результат, прежде чем добавить шаблон.

Показано всё, что может использовать шаблон с "formatVersion": "1.3". Он работает в Invoya 1.3 и новее.

Файл

Ключи верхнего уровня.

КлючЗначениеЧто делает
formatобязательно"invoya.invoice-template"Отмечает файл как шаблон Invoya.
formatVersionобязательно"1.3"Самая ранняя версия Invoya, в которой работает шаблон, например "1.3". Более старые версии файл не примут. Укажите версию, в которой появился самый новый ключ или блок вашего шаблона, — выбор версии выше показывает, что есть в каждой.
idобязательно"…"Уникальный идентификатор, например com.yourname.paper. Если добавить шаблон с идентификатором, который у вас уже есть, ваша копия будет заменена.
nameобязательно{ "en": "…", "de": "…", … }Название в приложении по коду языка: en, de, ru, uk. en обязателен и используется для всех языков, которых нет в списке.
author"…"Кто сделал шаблон.
page{ … }Размер листа и поля. См. ниже.
style{ … }Шрифт, размер текста и цвета. См. ниже.
letterhead["business", …]по умолчанию: []Идентификаторы блоков, из которых состоит ваша шапка. Приложение показывает их как превью в разделе «Данные компании».
blocksобязательно[ … ]Разделы счёта сверху вниз. См. ниже.

page

Размеры — в пунктах: 1 pt — это 1/72 дюйма, лист A4 — 595 × 842 pt. Правое поле всегда равно левому.

КлючЗначениеЧто делает
size"a4"по умолчанию: "a4"Лист. Пока есть только A4.
margins.top72по умолчанию: 72Отступ над первым блоком.
margins.left72по умолчанию: 72Отступ слева — и справа.
margins.bottom72по умолчанию: 72Отступ под последней строкой, после которой содержимое переносится на следующую страницу.
margins.footer30по умолчанию: 30Расстояние от нижнего края листа до нижнего колонтитула.

style

Все ключи здесь необязательны.

КлючЗначениеЧто делает
bodySize8.5по умолчанию: 8Размер текста в пунктах.
font"sans" | "serif" | "mono" | "rounded" | "humanist"по умолчанию: "sans"Шрифт по роли: sans — Helvetica, serif — Times New Roman, mono — Courier, rounded — Avenir Next, humanist — Optima. Все пять есть на каждом Mac, iPhone и iPad, поэтому счёт везде выглядит одинаково.
accent"#rrggbb"по умолчанию: "#eff0f1"Цвет залитой полосы заголовка и шапки таблицы.
accentText"#rrggbb"по умолчанию: "#000000"Цвет текста на акцентном цвете. Тёмному акценту нужен светлый текст.
logoHeight42Высота логотипа, когда он стоит рядом с вашими данными. Без этого ключа логотип по высоте равен блоку данных.

blocks

Блоки печатаются сверху вниз в том порядке, в каком перечислены. У каждого блока есть type и может быть id — он нужен только для списка letterhead. Один тип можно использовать несколько раз, особенно spacer.

"type": "business"

Данные вашей компании из раздела «Данные компании» и ваш логотип.

КлючЗначениеЧто делает
align"left" | "center" | "right"по умолчанию: "right"С какой стороны стоят данные.
logo"none" | "left" | "right" | "above" | "banner"по умолчанию: "left"Где стоит логотип. left и right ставят его рядом с данными — это работает только на противоположной от них стороне; на той же стороне он переносится над ними. above ставит его отдельной строкой над данными, banner — крупный логотип по центру над всем остальным.

"type": "spacer"

Пустое место.

КлючЗначениеЧто делает
heightобязательно24В пунктах.

"type": "title"

Заголовок «Счет».

КлючЗначениеЧто делает
align"left" | "center" | "right"по умолчанию: "center"Где он стоит.
filledtrue | falseпо умолчанию: trueСтавит его на полосу акцентного цвета.

"type": "invoiceMeta"

Номер счёта и даты.

КлючЗначениеЧто делает
align"left" | "center" | "right"по умолчанию: "right"С какой стороны они стоят.
fields["number", "invoiceDate", "dueDate"]Какие строки показывать и в каком порядке.

"type": "client"

Кому выставлен счёт.

КлючЗначениеЧто делает
caption"billTo"Добавляет над клиентом строку «Плательщик». Без этого ключа подписи нет.

"type": "items"

Таблица позиций счёта — единственный блок, который переносится на следующую страницу, если счёт длинный.

КлючЗначениеЧто делает
columns["index", "description", "unit", "qty", "rate", "amount"]Какие столбцы показывать и в каком порядке: номер строки, описание, единица, количество, ставка, сумма.
borderstrue | falseпо умолчанию: trueРисует линии таблицы.

"type": "totals"

Суммы под таблицей.

КлючЗначениеЧто делает
align"left" | "center" | "right"по умолчанию: "right"С какой стороны они стоят.
lines["subtotal", "discount", "taxes", "total"]Какие строки показывать и в каком порядке.

"type": "terms"

Условия контракта. Печатаются, только если они в контракте есть.

Без параметров.

"type": "payment"

Ваши банковские реквизиты.

КлючЗначениеЧто делает
qr"auto" | "never"по умолчанию: "auto"auto добавляет платёжный QR-код SEPA, если счёт в евро, ваш IBAN действителен и включён параметр «Печатать QR на счетах в евро». never его не печатает.

"type": "footer"

Печатается внизу каждой страницы, где бы ни стоял в списке. В каждом шаблоне должен быть такой блок с текстом нижней строки.

КлючЗначениеЧто делает
left"pageXofN"pageXofN печатает слева «Страница 1 из 2» — только если в счёте больше одной страницы.
centerобязательно"footerText"footerText печатает по центру текст нижней строки счёта: «Создан с помощью Invoya app» или собственный текст из Настройки → «Шаблон счета» → «Нижняя строка».

Что приложение не примет

  • Тип блока или значение, которых нет на этой странице. Invoya отклонит весь файл, а не напечатает полсчёта.
  • Шаблон без блока footer с "center": "footerText". Каждый счёт печатает текст нижней строки, поэтому в шаблоне для него должно быть место.
  • formatVersion новее, чем приложение. Обновите Invoya и откройте файл снова.
  • Файл больше 16 КБ.

Полезно знать

  • Цвета записываются как #rrggbb. Цвет, который не удалось прочитать, печатается чёрным.
  • Шаблон не может содержать свои шрифты, картинки или текст: шрифт — один из пяти выше, логотип — тот, что задан в приложении, а все подписи берутся из приложения.

Пример

«Классический» — шаблон, с которого начинается каждая установка:

{
  "format": "invoya.invoice-template",
  "formatVersion": "1.3",
  "id": "app.invoya.classic",
  "name": {
    "en": "Classic",
    "de": "Klassisch",
    "ru": "Классический",
    "uk": "Класичний"
  },
  "author": "Invoya",
  "page": {
    "size": "a4",
    "margins": { "top": 72, "left": 72, "bottom": 72, "footer": 30 }
  },
  "style": { "bodySize": 8 },
  "letterhead": ["business"],
  "blocks": [
    { "id": "business", "type": "business", "align": "right", "logo": "left" },
    { "type": "spacer", "height": 30 },
    { "id": "title", "type": "title", "align": "center", "filled": true },
    { "id": "meta", "type": "invoiceMeta", "align": "right",
      "fields": ["number", "invoiceDate", "dueDate"] },
    { "id": "client", "type": "client", "caption": "billTo" },
    { "type": "spacer", "height": 30 },
    { "id": "items", "type": "items",
      "columns": ["index", "description", "unit", "qty", "rate", "amount"],
      "borders": true },
    { "type": "spacer", "height": 10 },
    { "id": "totals", "type": "totals", "align": "right",
      "lines": ["subtotal", "discount", "taxes", "total"] },
    { "id": "terms", "type": "terms" },
    { "id": "payment", "type": "payment", "qr": "auto" },
    { "id": "footer", "type": "footer", "left": "pageXofN", "center": "footerText" }
  ]
}

Пришлите его нам

Сделали шаблон, который вам нравится? Пришлите файл на support@invoya.app — возможно, он попадёт в галерею.