PDF-rapporten

Met Studio kun je bestaande PDF-rapporten aanpassen (bv. verkoopfacturen, offertes, enz.) of nieuwe rapporten aanmaken.

Standaard Template

The default layout of reports is managed outside Studio. Go to Settings, then, in the Companies section, click Configure Document Layout. Layout settings are company-specific but apply to all reports.

Tip

You can see how the different settings affect the report layout in the report preview on the right, or download a sample invoice PDF by clicking Download PDF Preview.

Gebruik de volgende instellingen:

  • Layout: Four layouts are available:

    Light rapportlay-outvoorbeeld
  • Font: Seven fonts are available: Lato, Roboto, Open Sans, Montserrat, Oswald, Raleway, and Tajawal (which supports Arabic and Latin scripts). Go to the Google Fonts website to preview them.

  • Kleuren: Wijzig de primaire en secundaire kleuren die worden gebruikt om rapporten te structureren. De standaardkleuren worden automatisch gegenereerd op basis van de kleuren van het logo.

  • Layout background: The following backgrounds are available:

    • Blank: nothing is displayed.

    • Geometric: an image featuring geometric shapes is displayed in the background.

    • Custom: upload a custom background image.

  • Company tagline: This is displayed in the header of external reports. You can add multiple lines of text.

  • Company details: These are displayed in the header of external reports. You can add multiple lines of text.

  • Paper format: to define the default paper size of reports. You can select A4 (21 cm x 29.7 cm), US Letter (21.59 cm x 27.54 cm), or QR codes page. This can also be defined for individual reports in the Paper format field in Studio.

Nieuwe pdf-rapporten maken

To create a new report for a model, access the model, click the Toggle Studio button, then click Reports. Click New and, in the popup window that opens, select the type of report. This is solely used to determine what is displayed in the header and footer:

Nadat je het rapport hebt gemaakt, kun je beginnen met het bewerken.

Pdf-rapporten bewerken

To access the reports available for a model, access the model (e.g., sales orders), click the Toggle Studio button, then click Reports. Select an existing report to open it or create a new one.

Tip

Je kunt ook Studio openen, op Rapporten klikken en zoeken naar een specifiek rapport of model.

Belangrijk

It is strongly recommended to duplicate the standard report and perform changes in the duplicated version. To duplicate a report, hover the mouse pointer on the top right corner of the report, click the vertical ellipsis icon (), and then select Duplicate.

Een pdf-rapport dupliceren

Opties

Once you’ve selected or created a report, you can use the options in the left part of the screen to:

  • Change the Report name. The new name is applied everywhere (in Studio, under the Print button, and in the PDF file name).

  • Modify the Paper format. If no value is selected, the format defined in the default layout is used.

  • Show in print menu: to add the report in the Print menu available from the record.

  • Opnieuw laden uit bijlage: om het rapport als bijlage op de record op te slaan wanneer het voor de eerste keer wordt gegenereerd en de originele versie van het rapport opnieuw te laden bij elke volgende keer. Dit is wettelijk verplicht voor verkoopfacturen en wordt vooral in dit geval gebruikt.

  • Zichtbaarheid beperken tot groepen: om de beschikbaarheid van het pdf-rapport te beperken tot specifieke gebruikersgroepen.

  • Bronnen bewerken: het rapport rechtstreeks in het XML-bestand aanpassen.

  • Rapport herstellen: alle wijzigingen aan het rapport annuleren en het herstellen naar de standaardversie.

  • Afdrukvoorbeeld: een rapportvoorbeeld genereren en downloaden.

Rapporteditor

The report editor allows you to modify the formatting and contents of the report.

Tip

  • You can Undo or Redo changes using the related buttons or the shortcuts CTRL Z and CTRL Y.

  • Wijzigingen worden automatisch opgeslagen wanneer je het rapport verlaat of handmatig met de knop Opslaan.

  • Je kunt het rapport herstellen naar de standaardversie door op de knop Rapport herstellen in het linkergedeelte van het scherm te klikken.

Belangrijk

De header en footer van een rapport aanpassen heeft invloed op alle standaard- en aangepaste rapporten.

Voorwaardelijke blokken

De gestippelde rechthoeken vertegenwoordigen voorwaardelijke blokken (if/else-instructies). Deze worden gebruikt om inhoud te tonen of te verbergen op basis van specifieke voorwaarden. Klik op het blok om de voorwaarden te bekijken.

Bekijk voorwaarden die op een blok zijn toegepast.

Selecteer een waarde om het bijbehorende resultaat te bekijken en indien nodig aan te passen.

Bekijk het resultaat van een andere voorwaarde.

Notitie

Conditions can only be edited in XML.

Overige inhoud

Er zijn twee soorten tekstinhoud in rapporten:

  • Static text, i.e., the text that’s not highlighted in blue, which can be modified directly in the editor.

  • Dynamic text, i.e., the text that’s highlighted in blue, which is replaced by field values when the report is generated, e.g., the SO number or the quotation date.

You can add content (e.g., fields, lists, tables, images, banners, etc.) to the report using commands. Type / to open the powerbox, then type the command’s name or select it from the list.

Typ de tekst waar je die wilt om statische tekst aan het rapport toe te voegen.

Voor geavanceerdere wijzigingen kun je het rapport rechtstreeks in de XML bewerken.

Een veld toevoegen

To add a field, type / and select the Field command. In the list that opens, select or search for the field; click the right arrow next to the field name to access the list of related fields if needed. Then, specify the default value and press Enter.

Selecteer een gerelateerd veld.
Add a data table

Data tables are used to display relational fields. To add a data table, type /, select the Dynamic Table command, and select the relation to be displayed in the table.

Notitie

Only relations of type one2many or many2many can be displayed as data tables.

Once the table has been added, you can add columns using the table tools. Position the cursor on top of the column, then click the purple rectangle and select an option.

Add a column in a dynamic table.

You can then insert the field of your choice in the columns. The dialog box that opens shows the source object for the field (e.g., the Tag model) and the list of available fields.

List of available fields for the Tag model.

Notitie

  • The default row automatically iterates over the field’s content, generating a row on the report for each field value (e.g., one row per tag). You can add static content rows above or below the generated rows using the table tools.

  • You can also add data tables by modifying the report’s XML.

Opmaak

To format text in the report, select it, then format it using the options in the Text editor.

Formatteer tekst met de teksteditor.

De XML van het rapport bewerken

Waarschuwing

Het rechtstreeks wijzigen van de XML kan problemen met het rapport veroorzaken tijdens upgrades. Als dit gebeurt, kopieer je simpelweg je wijzigingen van de oude database naar je geüpgradede database.

Om de XML van het rapport te bewerken, klik je op Edit sources in het linkerpaneel.

Voorbeelden

Sometimes, tables are not properly recognized as such due to complex structures. In those cases, you can still modify them manually in the report XML. For example, with a sales order, you can find the following structure in the XML (simplified for documentation purposes):

<!-- 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>

To modify a table, you must ensure that each row has the same number of data cells. For example, in the case above, you need to add a cell in the header section (with e.g., the column title) and another one in the body section with the field content (usually, with a t-out or t-field directive).

<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>

Notitie

Cells can span multiple rows or columns. For more information, go to the Mozilla Developer Network website.

For example, you can modify the Quotation/Order report to add a column to display the product category in the main table:

<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">
Add a Product Category column in a SO.

To add a table in XML, you need to know the names of the fields and objects you wish to access and display. As an example, let’s add a table that details the tags on a sales order:

<!-- 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>
Add a data table in XML

Notitie

When adding tables manually, style them using Bootstrap classes, like the table class included in the example above.

Als je inhoud wilt tonen of verbergen op basis van specifieke voorwaarden, kun je handmatig if/else-besturingsstatements toevoegen aan de rapport-XML.

Als je bijvoorbeeld een aangepaste gegevenstabel wilt verbergen als er geen labels zijn, kun je het attribuut t-if gebruiken om de voorwaarde te definiëren, die vervolgens wordt geëvalueerd als True of False. De tabel wordt niet weergegeven als er geen labels in de offerte staan.

<!-- 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>

Als je een ander blok wilt weergeven wanneer de t-if-statement wordt geëvalueerd als False, kun je dit specificeren met de t-else-statement. Het t-else-blok moet direct volgen op het t-if-blok in de documentstructuur. Je hoeft geen voorwaarde op te geven in het t-else-attribuut. Laten we als voorbeeld een korte boodschap tonen die uitlegt dat er geen labels op de offerte staan:

<!-- 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>

Door de t-if/t-else-notatie te gebruiken, herkent de rapporteditor dat deze secties elkaar uitsluiten en als voorwaardelijke blokken moeten worden weergegeven:

Uitvoervoorbeeld als er labels zijn.

Je kunt voorwaarden wisselen met de editor om een voorbeeld van de uitvoer te bekijken:

Uitvoervoorbeeld als er geen labels zijn.

Als je meerdere opties wilt hebben, kun je ook t-elif-instructies gebruiken om tussenliggende voorwaarden toe te voegen. Dit is bijvoorbeeld hoe de titel van verkooporderrapporten verandert op basis van de status van het onderliggende document.

<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>

De titel Pro-Forma Invoice wordt gebruikt afhankelijk van bepaalde contextuele voorwaarden. Als deze voorwaarden niet worden voldaan en de status van het document draft of sent is, dan wordt Quotation gebruikt. Als aan geen van deze voorwaarden wordt voldaan, is de titel van het rapport Order.

Working with images in a report can be challenging, as precise control over image size and behavior is not always obvious. You can insert image fields using the report editor (by using the /Field command), but inserting them in XML using the t-field directive and accompanying t-options attributes provides better sizing and positioning control.

De volgende code geeft bijvoorbeeld het veld image_128 van het product van de regel weer als een afbeelding van 64px breed (met een automatische hoogte op basis van de beeldverhouding van de afbeelding).

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

De volgende opties zijn beschikbaar voor afbeeldingswidgets:

  • width: breedte van de afbeelding, meestal in pixels of CSS-lengte-eenheden (bv. rem) (laat leeg voor automatische breedte).

  • height: hoogte van de afbeelding, meestal in pixels of CSS-lengte-eenheden (bv. rem) (laat leeg voor automatische hoogte).

  • class: CSS-klassen die worden toegepast op de img-tag; Bootstrap-klassen zijn beschikbaar.

  • alt: alternatieve tekst van de afbeelding

  • style: style-attribuut; hiermee kun je stijlen vrijer overschrijven dan met Bootstrap-klassen.

Deze attributen moeten strings bevatten, d.w.z. tekst tussen aanhalingstekens binnen aanhalingstekens, bv. t-options-width="'64px'" (of, als alternatief, een geldige Python-expressie).

Notitie

De afbeeldingswidget kan niet worden gebruikt op een img-tag. Stel in plaats daarvan de t-field-directive in op een span-node (voor inline inhoud) of div-node (voor blokinhoud).

Voeg bijvoorbeeld een kolom toe met de productafbeelding in de offertetabel:

<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"/>

Het attribuut t-options-width beperkt de breedte van de afbeelding tot 64 pixels, en de Bootstrap-klassen die worden gebruikt in t-options-class creëren een miniatuurachtige rand met afgeronde hoeken en een schaduw.

Voeg een kolom toe met de productafbeelding in de offertetabel.