PDF звіти

За допомогою Studio ви можете редагувати наявні PDF-звіти (наприклад, рахунки-фактури, пропозиції тощо) або створити нові.

Типовий шаблон

Макет звітів за замовчуванням керується поза Studio. Перейдіть до Налаштування, потім у розділі Компанії натисніть Налаштувати макет документа. Параметри макета залежать від компанії, але застосовуються до всіх звітів.

Порада

Ви можете побачити, як різні параметри впливають на макет звіту, у попередньому перегляді звіту праворуч або завантажити зразок рахунка-фактури у форматі PDF, натиснувши Завантажити попередній перегляд PDF.

Використовуйте такі налаштування:

  • Макет: доступні чотири макети:

    Зразок макета світлого звіту
  • Шрифт: доступно сім шрифтів: Lato, Roboto, Open Sans, Montserrat, Oswald, Raleway і Tajawal (який підтримує арабську та латинську графіки). Перейдіть на веб-сайт Google Fonts, щоб переглянути їх.

  • Кольори: Зміна основних і додаткових кольорів, які використовуються для структурування звітів. Кольори за замовчуванням генеруються автоматично на основі кольорів логотипу.

  • Тло макета: Доступні такі фони:

    • Пусто: нічого не відображається.

    • Геометричний: у фоновому режимі відображається зображення з геометричними фігурами.

    • Користувацький: завантажити власне фонове зображення.

  • Слоган компанії: це відображається в заголовку зовнішні звіти. Ви можете додати кілька рядків тексту.

  • Слоган компанії: це відображається в заголовку зовнішні звіти. Ви можете додати кілька рядків тексту.

  • Формат паперу: щоб визначити стандартний розмір паперу для звітів. Ви можете вибрати A4 (21 см x 29,7 см), US Letter (21,59 см x 27,54 см) або Сторінка QR-кодів. Це також можна визначити для окремих звітів у полі Формат паперу в Studio.

Створення нових PDF звітів

Щоб створити новий звіт для моделі, перейдіть до моделі, натисніть кнопку Перемикач Studio, а потім натисніть Звіти. Натисніть Новий і у спливаючому вікні, що відкриється, виберіть тип звіту. Це використовується лише для визначення того, що відображається у верхньому та нижньому колонтитулах:

Після створення звіту ви можете почати редагувати його.

Редагування PDF звітів

Щоб отримати доступ до звітів, доступних для моделі, перейдіть до моделі (наприклад, замовлення на продаж), натисніть кнопку Перемикач Studio, а потім натисніть Звіти. Виберіть існуючий звіт, щоб відкрити його, або створити новий.

Порада

Крім того, ви також можете відкрити Studio, натиснути Звіти і знайти певний звіт або модель.

Важливо

Настійно рекомендується продублювати стандартний звіт і внести зміни в дубліковану версію. Щоб скопіювати звіт, наведіть вказівник миші на верхній правий кут звіту, клацніть піктограму вертикального еліпса (), а потім виберіть Дублювати.

Дублювання PDF-звіту

Опції

Вибравши або створивши звіт, ви можете скористатися параметрами в лівій частині екрана, щоб:

  • Змініть Назву звіту. Нова назва буде застосована скрізь (у Studio, під кнопкою Друк і в назві PDF-файлу).

  • Змініть Формат паперу. Якщо значення не вибрано, використовується формат, визначений у макет за замовчуванням.

  • Показати в меню друку: щоб додати звіт до меню Друк, доступного із запису.

  • Перезавантажити з вкладення: щоб зберегти звіт як вкладення до запису під час першого його створення та перезавантажувати оригінальну версію звіту кожного наступного разу. Це передбачено законом для рахунків-фактур і в основному використовується в цьому випадку.

  • guilabel:Обмежити видимість групам: щоб обмежити доступність PDF-звіту до певних групи користувачів.

  • Редагувати джерела: щоб змінити звіт безпосередньо у XML-файл.

  • Скинути звіт: щоб скасувати всі зміни, внесені до звіту, і скинути його стандартну версію.

  • Попередній перегляд: для створення та завантаження попереднього перегляду звіту.

Редактор звіту

Редактор звітів дозволяє змінювати форматування та вміст звіту.

Порада

  • Ви можете Скасувати або Повторити зміни за допомогою відповідних кнопок або комбінацій клавіш CTRL Z і CTRL Y.

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

  • Ви можете скинути звіт до стандартної версії, натиснувши кнопку Скинути звіт у лівій частині екрана.

Важливо

Редагування верхнього та нижнього колонтитулів звіту впливає на всі стандартні та спеціальні звіти.

Умовні блоки

Пунктирні прямокутники представляють умовні блоки (оператори if/else). Вони використовуються для показу/приховання вмісту на основі певних умов. Натисніть на блок, щоб переглянути умови.

Переглянути умови, застосовані до блоку.

Виберіть значення для попереднього перегляду відповідного результату та відредагуйте його, якщо необхідно.

Попередній перегляд виходу іншої умови.

Примітка

Умови можна редагувати лише в XML.

Інший контент

Існує два типи текстового вмісту у звітах:

  • Статичний текст, тобто текст, не виділений синім кольором, який можна змінити безпосередньо в редакторі.

  • Динамічний текст, тобто текст, виділений синім кольором, який під час створення звіту замінюється значеннями полів, наприклад, номер замовлення на продаж або дата пропозиції.

Ви можете додавати вміст (наприклад, поля, списки, таблиці, зображення, банери тощо) до звіту за допомогою команд. Введіть /, щоб відкрити powerbox, потім введіть назву команди або виберіть її зі списку.

Щоб додати до звіту статичний текст, введіть текст у потрібному місці.

Для більш складних змін ви можете відредагувати звіт у XML безпосередньо.

Додати поле

Щоб додати поле, введіть / і виберіть команду Поле. У списку, що відкриється, виберіть або знайдіть поле; клацніть стрілку вправо поруч із назвою поля, щоб отримати доступ до списку пов’язаних полів, якщо потрібно. Потім вкажіть значення за замовчуванням і натисніть Enter.

Виберіть відповідне поле.
Додати таблицю даних

Таблиці даних використовуються для відображення реляційні поля. Щоб додати таблицю даних, введіть /, виберіть команду Динамічна таблиця і виберіть зв’язок, який буде відображатися в таблиці.

Примітка

Лише відносини типу one2many або many2many можуть відображатися як таблиці даних.

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

Додати стовпець у динамічну таблицю.

Потім ви можете вставити поле за вашим вибором у стовпці. У діалоговому вікні, що відкриється, буде показано вихідний об’єкт для поля (наприклад, модель Тег) і список доступних полів.

Список доступних полів для моделі тегів.

Примітка

  • Рядок за замовчуванням автоматично переглядає вміст поля, генеруючи рядок у звіті для кожного значення поля (наприклад, один рядок на тег). Ви можете додати рядки статичного вмісту над або під згенерованими рядками за допомогою інструментів таблиці.

  • Ви також можете додати таблиці даних, змінивши XML звіту.

Форматування

Щоб відформатувати текст у звіті, виберіть його, а потім відформатуйте за допомогою параметрів у Текстовий редактор.

Відформатуйте текст за допомогою текстового редактора.

Редагування XML звіту

Попередження

Безпосередня зміна XML може призвести до проблем зі звітами під час оновлення. Якщо це станеться, просто скопіюйте зміни зі старої бази даних у оновлену базу даних.

Щоб редагувати XML звіт, клацніть Редагувати джерела на лівій панелі.

Приклади

Іноді таблиці не розпізнаються як такі належним чином через складну структуру. У таких випадках ви все одно можете змінити їх вручну в XML звіту. Наприклад, із замовленням на продаж ви можете знайти таку структуру в XML (спрощено для цілей документації):

<!-- table root element -->
<table>
    <!-- thead = table header, the row with column titles -->
    <thead>
        <!-- table row element -->
        <tr>
            <!-- table header element -->
            <th>Name</th>
            <th>Price</th>
        </tr>
    </thead>
    <!-- table body, the main content -->
    <tbody>
        <!-- we create a row for each subrecord with t-foreach -->
        <tr t-foreach="record.some_relation_ids" t-as="line">
            <!-- for each line, we output the name and price as table cells -->
            <td t-out="line.name"/>
            <td t-out="line.price"/>
        </tr>
    </tbody>
</table>

Щоб змінити таблицю, ви повинні переконатися, що кожен рядок має однакову кількість клітинок даних. Наприклад, у наведеному вище випадку вам потрібно додати одну комірку в розділ заголовка (наприклад, із заголовком стовпця) та іншу клітинку в розділі тіла з вмістом поля (зазвичай, з директивою t-out або t-field).

<table> <!-- table root element -->
    <thead> <!-- thead = table header, the row with column titles -->
        <tr> <!-- table row element -->
            <th>Name</th> <!-- table header element -->
            <th>Price</th>
            <th>Category</th>
        </tr>
    </thead>
    <tbody>  <!-- table body, the main content -->
        <tr t-foreach="record.some_relation_ids" t-as="line">  <!-- we create a row for each subrecord with t-foreach -->
            <td t-out="line.name"/>  <!-- for each line, we output the name and price as table cells -->
            <td t-out="line.price"/>
            <td t-out="line.category_id.display_name"/>
        </tr>
    </tbody>
</table>

Примітка

Комірки можуть займати кілька рядків або стовпців. Для отримання додаткової інформації перейдіть на веб-сайт Mozilla Developer Network.

Наприклад, ви можете змінити звіт Цінова пропозиція/Замовлення, щоб додати стовпець для відображення категорії продукту в головній таблиці:

<table class="table table-sm o_main_table table-borderless mt-4">
    <!-- In case we want to repeat the header, remove "display: table-row-group" -->
    <thead style="display: table-row-group">
        <tr>
            <th name="th_description" class="text-start">Description</th>
            <th>Product Category</th>
            <th name="th_quantity" class="text-end">Quantity</th>
            <th name="th_priceunit" class="text-end">Unit Price</th>
[...]
            <tr t-att-class="'bg-200 fw-bold o_line_section' if line.display_type == 'line_section' else 'fst-italic o_line_note' if line.display_type == 'line_note' else ''">
                <t t-if="not line.display_type">
                    <td name="td_name"><span t-field="line.name">Bacon Burger</span></td>
                    <td t-out="line.product_id.categ_id.display_name"/>
                    <td name="td_quantity" class="text-end">
                        <span t-field="line.product_uom_qty">3</span>
                        <span t-field="line.product_uom">units</span>
                        <span t-if="line.product_packaging_id">
Додайте стовпець Категорія продукту в Замовленні на продаж.

Щоб додати таблицю в XML, вам потрібно знати назви полів і об’єктів, до яких ви хочете отримати доступ і відобразити їх. Як приклад, давайте додамо таблицю з деталями тегів у замовленні на продаж:

<!-- table root element -->
<table class="table">
    <!-- thead = table header, the row with column titles -->
    <thead>
        <!-- table row element -->
        <tr>
            <!-- table header element -->
            <th>ID</th>
            <th>Name</th>
        </tr>
    </thead>
    <!-- table body, the main content -->
    <tbody>
        <!-- we create a row for each subrecord with t-foreach -->
        <tr t-foreach="doc.tag_ids" t-as="tag">
            <!-- for each line, we output the name and price as table cells -->
            <td t-out="tag.id"/>
            <td t-out="tag.name"/>
        </tr>
    </tbody>
</table>
Додайте таблицю даних у форматі XML

Примітка

Додаючи таблиці вручну, стилізуйте їх за допомогою Bootstrap classes, як клас table, включений у приклад вище.

Якщо ви хочете показати/приховати вміст на основі певних умов, ви можете вручну додати керуючі оператори if/else у XML звіту.

Наприклад, якщо ви хочете приховати спеціальну таблицю даних, якщо немає тегів, ви можете використовувати атрибут t-if, щоб визначити умову, яка потім оцінюється як True або False. Таблиця не відображатиметься, якщо в пропозиції немає тегів.

<!-- table root element -->
<table class="table" t-if="len(doc.tag_ids) > 0">
    <!-- thead = table header, the row with column titles -->
    <thead>
        <!-- table row element -->
        <tr>
            <!-- table header element -->
            <th>ID</th>
            <th>Name</th>
        </tr>
    </thead>
    <!-- table body, the main content -->
    <tbody>
        <!-- we create a row for each subrecord with t-foreach -->
        <tr t-foreach="doc.tag_ids" t-as="tag">
            <!-- for each line, we output the name and price as table cells -->
            <td t-out="tag.id"/>
            <td t-out="tag.name"/>
        </tr>
    </tbody>
</table>

Якщо ви бажаєте відобразити інший блок у випадку, якщо оператор t-if оцінюється як False, ви можете вказати його за допомогою оператора t-else. Блок t-else має безпосередньо слідувати за блоком t-if у структурі документа. Немає необхідності вказувати будь-які умови в атрибуті t-else. Як приклад, давайте покажемо коротке повідомлення, яке пояснює, що в цитаті немає тегів:

<!-- table root element -->
<table class="table" t-if="len(doc.tag_ids) > 0">
    <!-- thead = table header, the row with column titles -->
    <thead>
        <!-- table row element -->
        <tr>
            <!-- table header element -->
            <th>ID</th>
            <th>Name</th>
        </tr>
    </thead>
    <!-- table body, the main content -->
    <tbody>
        <!-- we create a row for each subrecord with t-foreach -->
        <tr t-foreach="doc.tag_ids" t-as="tag">
            <!-- for each line, we output the name and price as table cells -->
            <td t-out="tag.id"/>
            <td t-out="tag.name"/>
        </tr>
    </tbody>
</table>
<div class="text-muted" t-else="">No tag present on this document.</div>

Використовуючи нотацію t-if/t-else, редактор звіту визнає, що ці розділи є взаємовиключними та мають відображатися як умовні блоки:

Вивести попередній перегляд, якщо є теги.

Ви можете перемикати умови за допомогою редактора для попереднього перегляду їхніх результатів:

Вивести попередній перегляд, якщо немає тегів.

Якщо ви бажаєте мати кілька варіантів, ви також можете використовувати директиви t-elif, щоб додати проміжні умови. Наприклад, ось як заголовок замовлення клієнта повідомляє про зміни на основі стану основного документа.

<h2 class="mt-4">
    <span t-if="env.context.get('proforma', False) or is_pro_forma">Pro-Forma Invoice # </span>
    <span t-elif="doc.state in ['draft','sent']">Quotation # </span>
    <span t-else="">Order # </span>
    <span t-field="doc.name">SO0000</span>
</h2>

Заголовок Рахунок-проформа використовується залежно від деяких контекстуальних умов. Якщо ці умови не виконуються і документ має статус чернетка або надіслано, тоді використовується Цитата. Якщо жодна з цих умов не виконується, заголовок звіту буде Замовлення.

Робота із зображеннями у звіті може бути складною, оскільки точний контроль над розміром і поведінкою зображення не завжди очевидний. Ви можете вставляти поля зображень за допомогою редактора звітів (за допомогою команди /Field), але вставлення їх у XML за допомогою директиви t-field і супутніх атрибутів t-options забезпечує кращий контроль розміру та позиціонування.

Наприклад, наведений нижче код виводить поле image_128 продукту лінії як зображення шириною 64 пікселя (з автоматичною висотою на основі співвідношення сторін зображення).

<span t-field="line.product_id.image_128" t-options-widget="image" t-options-width="64px"/>

Для віджетів зображень доступні такі параметри:

  • width: ширина зображення, зазвичай у пікселях або одиницях довжини CSS (наприклад, rem) (залиште порожнім для автоматичної ширини).

  • height: висота зображення, зазвичай у пікселях або одиницях довжини CSS (наприклад, rem) (залиште порожнім для автоматичної висоти).

  • class: класи CSS, застосовані до тегу img; Bootstrap classes доступні.

  • alt: альтернативний текст зображення

  • style: атрибут стилю; це дозволяє вам змінювати стилі вільніше, ніж за допомогою Bootstrap classes.

Ці атрибути мають містити рядки, тобто текст, укладений у лапки в межах лапок, наприклад, t-options-width="'64px'" (або, альтернативно, дійсний вираз Python).

Примітка

Віджет зображення не можна використовувати з тегом img. Замість цього встановіть директиву t-field у вузлі span (для вбудованого вмісту) або div (для блокового вмісту).

Наприклад, давайте додамо стовпець із зображенням продукту в таблиці пропозицій:

<table class="table table-sm o_main_table table-borderless mt-4">
    <thead style="display: table-row-group">
        <tr>
            <th>Image</th>
            <th name="th_description" class="text-start">Description</th>
            <th>Product Category</th>
            <th name="th_quantity" class="text-end">Quantity</th>
            <th name="th_priceunit" class="text-end">Unit Price</th>
[...]
        <t t-foreach="lines_to_report" t-as="line">
            <t t-set="current_subtotal" t-value="current_subtotal + line.price_subtotal"/>
            <tr t-att-class="'bg-200 fw-bold o_line_section' if line.display_type == 'line_section' else 'fst-italic o_line_note' if line.display_type == 'line_note' else ''">
                <t t-if="not line.display_type">
                   <td>
                       <span t-field="line.product_template_id.image_128"
                             t-options-widget="'image'"
                             t-options-width="'64px'"
                             t-options-class="'rounded-3 shadow img-thumbnail'"
                           />
                   </td>
                    <td name="td_name"><span t-field="line.name">Bacon Burger</span></td>
                    <td t-out="line.product_id.categ_id.display_name"/>

Атрибут t-options-width обмежує ширину зображення до 64 пікселів, а Bootstrap classes, які використовуються в t-options-class, створюють рамку, схожу на мініатюру, із закругленими кутами та тінню.

Додайте стовпець із зображенням товару в таблицю пропозицій.