PDF報告書

With Studio, you can edit existing PDF reports (e.g., invoices, quotations, etc.) or create new ones.

デフォルトレイアウト

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.

ちなみに

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.

以下の設定を使用します:

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

  • : 報告書の構成に使用される主色と副色を変更します。デフォルトの色は、ロゴの色に基づいて自動的に生成されます。

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

新しい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:

報告書を作成したら、:ref:`編集 <studio/pdf-reports/edit>`を開始できます。

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.

ちなみに

または、ワンルームを開き、:guilabel:`報告書`をクリックして、特定の報告書やモデルを検索することもできます。

重要

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.

PDF報告書の複製

オプション

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.

  • 添付ファイルから再読み込み: 報告書を最初に生成したときにレコードに添付ファイルとして保存し、その後は元のバージョンの報告書を再読み込みします。これは請求書では法的に必要であり、主にこのケースで使用されます。

  • グループへの公開設定を制限: PDF報告書の対応可能性を特定の:doc:`ユーザグループ <../general/users/access_rights>`に制限します。

  • ソースを編集: :ref:`XMLファイル <studio/pdf-reports/XML-editing>`で直接報告書を変更します。

  • 報告書をリセット: 報告書に加えたすべての変更を破棄し、標準バージョンにリセットします。

  • 印刷プレビュー: 報告書のプレビューを生成してダウンロードします。

報告書エディタ

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

ちなみに

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

  • 変更は、レポートを終了したときに自動的に保存されるか、:guilabel:`保存`ボタンを使用して手動で保存されます。

  • 画面左側の:guilabel:`レポートをリセット`ボタンをクリックすると、レポートを標準バージョンにリセットできます。

重要

レポートのヘッダーとフッターを編集すると、すべての標準レポートとカスタムレポートに影響します。

条件付きブロック

破線の四角形は**条件付きブロック**(*if/else*文)を表します。これらは特定の条件に基づいてコンテンツの表示/非表示を切り替えるために使用されます。ブロックをクリックして条件を表示します。

ブロックに適用されている条件を表示します。

値を選択して、対応する出力をプレビューし、必要に応じて編集します。

別の条件の出力をプレビューします。

注釈

Conditions can only be edited in XML.

その他のコンテンツ

レポートには2種類の文字列コンテンツがあります。

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

レポートに静的な文字列を追加するには、追加したい場所に文字列を入力します。

より高度な変更については、:ref:`XMLで直接レポートを編集 <studio/pdf-reports/XML-editing>`できます。

フィールドを追加

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.

注釈

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.

注釈

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

フォーマット

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

テキストエディタを使用してテキストをフォーマットします。

報告書のXMLを編集

警告

XMLを直接変更すると、:doc:`アップグレード <../../../administration/upgrade>`時に報告書に問題が発生する可能性があります。この場合は、古いデータベースから変更内容をコピーして、アップグレードしたデータベースに貼り付けるだけです。

報告書のXMLを編集するには、左ペインの:guilabel:`ソースを編集`をクリックします。

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>

注釈

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

注釈

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

特定の条件に基づいてコンテンツを表示/非表示にしたい場合は、報告書のXMLに`if/else`制御文を手動で追加できます。

例えば、タグがない場合にカスタムデータテーブルを非表示にしたい場合、`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>

タイトル*仮請求書*は、いくつかのコンテキスト条件に応じて使用されます。これらの条件が満たされず、ドキュメントのステータスが`draft`または`sent`の場合、*見積もり*が使用されます。これらのいずれの条件も満たされない場合、報告書のタイトルは*注文*になります。

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.

例えば、以下のコードは、明細行のプロダクトのフィールド`image_128`を幅64pxの画像として出力します(高さは画像のアスペクト比に基づいて自動的に設定されます)。

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

画像ウィジェットには、以下のオプションが利用可能です:

  • width:画像の幅(通常はピクセル単位またはCSS長さ単位(例:rem)で指定、自動幅の場合は空欄にします)。

  • height:画像の高さ(通常はピクセル単位またはCSS長さ単位(例:rem)で指定、自動高さの場合は空欄にします)。

  • classimg`タグに適用されるCSSクラス;`Bootstrap classes <https://getbootstrap.com/docs/5.1/content/tables>が利用可能です。

  • alt:画像の代替テキスト

  • style:スタイル属性;Bootstrap classes <https://getbootstrap.com/docs/5.1/content/tables>よりも自由にスタイルをオーバーライドできます。

これらの属性には文字列を含める必要があります。つまり、引用符内に引用符で囲まれたテキスト(例:t-options-width="'64px'")、または有効なPython式を指定します。

注釈

画像ウィジェットは`img`タグでは使用できません。代わりに、`span`(インラインコンテンツの場合)または`div`(ブロックコンテンツの場合)ノードに`t-field`ディレクティブを設定します。

例として、見積もりテーブルにプロダクト画像の列を追加してみましょう:

<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ピクセルに制限し、`t-options-class`で使用されるBootstrapクラスは、角が丸く影のあるサムネイルのようなボーダーを作成します。

見積もりテーブルにプロダクト画像の列を追加します。