Документація

Друковані бланки: теги та підстановки

Суми прописом, числа для колонок, реквізити компанії в бланку та рахунок на кожен склад — із готовими шматками розмітки.

На цій сторінці

Рахунок, накладна й усе інше, що магазин друкує за замовленням, — це теж шаблони: звичайна розмітка сторінки з підстановками із замовлення. Редагуються вони в «Налаштування» → «Друковані форми», кожна своєю мовою, а кнопка «Подивитися» показує готовий папір на справжньому замовленні — можна ввести номер того замовлення, заради якого правку й затіяли.

Бланк пишеться тими самими тегами, що й тема, плюс кількома власними — грошовими.

Гроші, числа та кількість

{sum amount=$order.total}                Разом: 1 250,50 ₴
{in_words amount=$order.total}           Одна тисяча двісті п’ятдесят гривень 50 коп.
{number value=$item.price}               1250.50
{number value=$item.weight precision=3}  6.100
{qty value=$item.qty}                    1.5

{sum} бере валюту самого замовлення — писати її в кожному місці бланка не потрібно. {number} друкує голе число рівно в сотих: його ставлять у колонки, де валюту винесено в шапку. {qty} друкує кількість без хвостових нулів, щоб штучний товар не виглядав як «2.000».

Замовлення — це знімок: суми, ціни та курс у ньому лишаються такими, якими були в день оформлення. Бланк нічого не перераховує, він лише друкує.

Від якої компанії рахунок

{profile id=2}                  далі весь бланк друкується від цієї компанії
{profile id=2 assign=seller}    реквізити ляжуть у $seller, $shop не чіпаємо

Компанію оголошує сам бланк, а не той, хто натиснув «Друк». Тому «Рахунок від ФОП» і «Рахунок від ТОВ» — два різні бланки: обирати компанію при кожному друці не потрібно, та й у листі з рахунком обирати нема кому. Номер профілю показує підказка під редактором, там само його можна вставити натисканням.

Профіль видалили, а бланк на нього посилається — надрукується продавець вітрини замовлення: порожня шапка рахунку гірша за неточну.

Що доступне в бланку

Змінна Що всередині
$doc сам документ: number, date, title
$shop продавець: name, legal_name, tax_number, vat_number, tax_system, address, phone, email, bank_name, iban, director, accountant, logo, stamp, signature
$order замовлення: number, date, comment, items_total, services_total, discount_total, shipping_total, tax_total, total, paid_total, due, total_in_words, weight, storefront, status
$customer покупець: name, company, tax_number, phone, email, address
$recipient інший отримувач — або null, якщо посилку приймає сам покупець
$items позиції замовлення, перебираються {foreach}
$warehouses те саме замовлення, розкладене за складами
$shipping, $payment доставка й оплата: id, code, name, адреса та точка отримання, номер накладної, чи сплачено й коли

Позиція ($item усередині циклу) дає n, name, sku, unit, qty, price, discount, total, tax_rate, tax, photo, weight, упаковку (pack.name, pack.packs, pack.rest), характеристики (features, feature), послуги (services) і склад відвантаження (warehouse, warehouse_id).

Повний перелік із людськими підписами лежить просто під редактором бланка — «Що можна підставити в бланк»: натискання вставляє підстановку туди, де стоїть курсор. А що прийшло в цей конкретний документ, покаже {dump}.

Таблиця позицій

<table>
    {foreach $items as $item}
        <tr>
            <td>{$item.n}</td>
            <td>{$item.name}{if $item.sku} ({$item.sku}){/if}</td>
            <td>{qty value=$item.qty} {$item.unit}</td>
            <td>{number value=$item.price}</td>
            <td>{number value=$item.total}</td>
        </tr>
    {/foreach}
</table>

<p>Усього до сплати: {sum amount=$order.total}</p>
<p>Прописом: {in_words amount=$order.total}</p>

Інший отримувач — окремим блоком

{if $recipient}
    <h3>Отримувач</h3>
    <p>{$recipient.name}, {$recipient.phone}</p>

    {* або все, що магазин запитав у покупця, — з підписами полів *}
    {foreach $recipient.fields as $f}
        <div>{$f.label}: {$f.value}</div>
    {/foreach}
{/if}

Отримувач приходить власним набором, а не домішується до полів покупця: посилку приймає людина, навіть коли замовлення оформлює компанія. Немає іншого отримувача — змінна порожня, і блок не друкується.

Склад полів отримувача власник задає сам, тому крім name і телефону в бланку є перебірний список fields — із підписом і значенням кожного поля. Позначка «замовлення забирає компанія» лежить окремо, у is_company, і в перебір не потрапляє.

Рахунок на кожен склад

Магазину, у якого склади належать різним юрособам, потрібен рахунок від тієї, чий товар у рядку. Замовлення приходить у бланк розкладеним за складами, а компанію для кожного оголошує {profile}:

{$fops = [1 => 2, 5 => 3, 6 => 4]}   {* номер складу → номер профілю *}

{foreach $warehouses as $w}
    {profile id=$fops[$w.id] assign=seller}

    <h2>{$seller.legal_name}</h2>
    <p>{$seller.address}, {$seller.iban}</p>

    {foreach $w.items as $item}
        <div>{$item.name} — {qty value=$item.qty} × {number value=$item.price}</div>
    {/foreach}

    <p>Разом: {sum amount=$w.total}</p>
{/foreach}

Готову заготовку цього шматка можна вставити з підказки під редактором — лишиться вписати свої номери складів і профілів. Доставку та знижку на замовлення магазин між складами не ділить: як їх рознести між юрособами, вирішуєте ви в самому бланку.

Папір і друк

Бланк друкується браузером і зберігається в PDF, тому верстка проста: таблиці, відступи, розміри в міліметрах. Розмір аркуша задається в стилях бланка:

<style>{literal}
    @page { size: A4 portrait; margin: 12mm; }
    body { font-family: Arial, "DejaVu Sans", sans-serif; font-size: 11px; }
{/literal}</style>

{literal} тут обов’язковий: без нього фігурні дужки CSS шаблонізатор прийме за свої теги.

Якщо бланк зламався

Помилка в розмітці не кладе магазин: замість документа відкриється сторінка з поясненням, у якій формі помилка. Кнопка «Повернути заводський вигляд» повертає бланк, який іде з магазином, — ваші правки при цьому замінюються, скасувати це не можна.

Тим самим способом дивляться, що нового з’явилося в заводському бланку після оновлення магазину: ваші правки оновлення не чіпає, тому свіжий бланк видно лише так.

Оновлено 24 серпня 2026