Rapports PDF¶
With Studio, you can edit existing PDF reports (e.g., invoices, quotations, etc.) or create new ones.
Présentation par défaut¶
The default layout of reports is managed outside Studio. Go to , then, in the Companies section, click Configure Document Layout. Layout settings are company-specific but apply to all reports.
Astuce
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.
Utiliser les paramètres suivants :
Layout: Four layouts are available:
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.
Logo de la société : cliquer sur le bouton Modifier pour télécharger ou changer le logo. Cela ajoute le logo à la fiche de la société sur le modèle Société, accessible en allant à , puis en cliquant sur Mettre à jour les informations dans la section Sociétés.
Couleurs : modifier les couleurs primaire et secondaire utilisées pour structurer les rapports. Les couleurs par défaut sont automatiquement générées en fonction des couleurs du logo.
Layout background: The following backgrounds are available:
Vide : rien n’est affiché.
Géométrique : une image représentant des formes géométriques est affichée en arrière-plan.
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.
Créer de nouveaux rapports PDF¶
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:
Une fois le rapport créé, vous pouvez commencer à le modifier.
Modifier des rapports PDF¶
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.
Astuce
Vous pouvez également ouvrir Studio, cliquer sur Rapports et rechercher un rapport ou un modèle spécifique.
Important
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.
Options¶
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.
Recharger depuis la pièce jointe : pour enregistrer le rapport en tant que pièce jointe sur l’enregistrement la première fois qu’il est généré et recharger la version originale du rapport lors des fois suivantes. Ceci est légalement requis pour les factures et est principalement utilisé dans ce cas.
Limiter la visibilité aux groupes : pour limiter la disponibilité du rapport PDF à des groupes d’utilisateurs spécifiques.
Modifier les sources : pour modifier le rapport directement dans le fichier XML.
Réinitialiser le rapport : pour annuler toutes les modifications apportées au rapport et le réinitialiser à sa version standard.
Aperçu avant impression : pour générer et télécharger un aperçu du rapport.
Éditeur de rapport¶
The report editor allows you to modify the formatting and contents of the report.
Astuce
You can Undo or Redo changes using the related buttons or the shortcuts
CTRL ZandCTRL Y.Les modifications sont enregistrées automatiquement lorsque vous quittez le rapport ou manuellement en utilisant le bouton Enregistrer.
Vous pouvez réinitialiser le rapport à sa version standard en cliquant sur le bouton Réinitialiser le rapport dans la partie gauche de l’écran.
Important
Modifier l’en-tête et le pied de page d’un rapport impacte tous les rapports standard et personnalisés.
Blocs conditionnels¶
Les rectangles en pointillés représentent des blocs conditionnels (instructions if/else). Ils servent à afficher/masquer du contenu selon des conditions spécifiques. Cliquer sur le bloc pour voir les conditions.
Sélectionner une valeur pour prévisualiser le résultat correspondant et le modifier si nécessaire.
Note
Conditions can only be edited in XML.
Autre contenu¶
Il existe deux types de contenu textuel dans les rapports :
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.
Pour ajouter du texte statique au rapport, saisir le texte à l’emplacement souhaité.
Pour des modifications plus avancées, vous pouvez modifier le rapport directement dans le XML.
Ajouter un champ¶
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.
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.
Note
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.
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.
Note
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.
Formatage¶
To format text in the report, select it, then format it using the options in the Éditeur de texte.
Modifier le XML du rapport¶
Avertissement
Modifier directement le XML peut entraîner des problèmes de rapport lors des mises à niveau. Si cela se produit, copiez simplement vos modifications de l’ancienne base de données vers votre base de données mise à niveau.
Pour modifier le XML du rapport, cliquer sur Modifier les sources dans le volet de gauche.
Exemples¶
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-outort-fielddirective).<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>Note
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">![]()
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>
Note
When adding tables manually, style them using Bootstrap classes, like the table class included in the
example above.
Pour afficher/masquer du contenu en fonction de conditions spécifiques, vous pouvez ajouter manuellement des instructions de contrôle if/else dans le XML du rapport.
Par exemple, pour masquer une table de données personnalisée s’il n’y a pas d’étiquettes, vous pouvez utiliser l’attribut t-if pour définir la condition, qui est ensuite évaluée comme True ou False. La table ne sera pas affichée s’il n’y a pas d’étiquettes dans le devis.
<!-- 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>
Pour afficher un autre bloc au cas où l’instruction t-if est évaluée comme False, vous pouvez le spécifier à l’aide de l’instruction t-else. Le bloc t-else doit directement suivre le bloc t-if dans la structure du document. Il n’est pas nécessaire de spécifier une condition dans l’attribut t-else. À titre d’exemple, affichons un bref message expliquant qu’il n’y a pas d’étiquettes sur le devis :
<!-- 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>
En utilisant la notation t-if/t-else, l’éditeur de rapport reconnaît que ces sections sont mutuellement exclusives et doivent être affichées comme des blocs conditionnels :
Vous pouvez changer de condition à l’aide de l’éditeur pour prévisualiser leur résultat :
Pour disposer de plusieurs options, vous pouvez également utiliser des directives t-elif pour ajouter des conditions intermédiaires. Par exemple, voici comment le titre des rapports de commande client change en fonction de la condition du document sous-jacent.
<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>
Le titre Facture pro forma est utilisé en fonction de certaines conditions contextuelles. Si ces conditions ne sont pas remplies et que l’état du document est soit draft soit sent, alors Devis est utilisé. Si aucune de ces conditions n’est remplie, le titre du rapport est Commande.
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.
Par exemple, le code suivant affiche le champ image_128 du produit de la ligne sous forme d’image de 64 px de large (avec une hauteur automatique basée sur le rapport d’aspect de l’image).
<span t-field="line.product_id.image_128" t-options-widget="image" t-options-width="64px"/>
Les options suivantes sont disponibles pour les widgets d’image :
width: largeur de l’image, généralement en pixels ou en unités de longueur CSS (par exemple,rem) (laisser vide pour une largeur automatique).height: hauteur de l’image, généralement en pixels ou en unités de longueur CSS (par exemple,rem) (laisser vide pour une hauteur automatique).class: classes CSS appliquées sur la baliseimg; les classes Bootstrap sont disponibles.alt: texte alternatif de l’imagestyle: attribut de style ; il permet de remplacer les styles plus librement qu’avec les classes Bootstrap.
Ces attributs doivent contenir des chaînes de caractères, c’est-à-dire du texte entre guillemets dans des guillemets, par exemple, t-options-width="'64px'" (ou, alternativement, une expression Python valide).
Note
Le widget image ne peut pas être utilisé sur une balise img. À la place, définir la directive t-field sur un nœud span (pour le contenu en ligne) ou div (pour le contenu en bloc).
Par exemple, ajoutons une colonne avec l’image du produit dans le tableau du devis :
<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"/>
L’attribut t-options-width limite la largeur de l’image à 64 pixels, et les classes Bootstrap utilisées dans t-options-class créent une bordure semblable à une miniature avec des coins arrondis et une ombre.