Друковані бланки: теги та підстановки
Суми прописом, числа для колонок, реквізити компанії в бланку та рахунок на кожен склад — із готовими шматками розмітки.
На цій сторінці
Рахунок, накладна й усе інше, що магазин друкує за замовленням, — це теж шаблони: звичайна розмітка сторінки з підстановками із замовлення. Редагуються вони в «Налаштування» → «Друковані форми», кожна своєю мовою, а кнопка «Подивитися» показує готовий папір на справжньому замовленні — можна ввести номер того замовлення, заради якого правку й затіяли.
Бланк пишеться тими самими тегами, що й тема, плюс кількома власними — грошовими.
Гроші, числа та кількість
{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 шаблонізатор прийме за
свої теги.
Якщо бланк зламався
Помилка в розмітці не кладе магазин: замість документа відкриється сторінка з поясненням, у якій формі помилка. Кнопка «Повернути заводський вигляд» повертає бланк, який іде з магазином, — ваші правки при цьому замінюються, скасувати це не можна.
Тим самим способом дивляться, що нового з’явилося в заводському бланку після оновлення магазину: ваші правки оновлення не чіпає, тому свіжий бланк видно лише так.