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 , 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.
会社ロゴ: :guilabel:`編集`ボタンをクリックして、ロゴをアップロードまたは変更します。これにより、*会社*モデルの会社レコードにロゴが追加されます。このレコードには、:menuselection:`設定`に移動し、:guilabel:`会社`セクションの:guilabel:`情報を更新`をクリックしてアクセスできます。
色: 報告書の構成に使用される主色と副色を変更します。デフォルトの色は、ロゴの色に基づいて自動的に生成されます。
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.
オプション¶
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.
ちなみに
重要
レポートのヘッダーとフッターを編集すると、すべての標準レポートとカスタムレポートに影響します。
条件付きブロック¶
破線の四角形は**条件付きブロック**(*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.
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.
注釈
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-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>注釈
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>
注釈
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)で指定、自動高さの場合は空欄にします)。class:img`タグに適用される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クラスは、角が丸く影のあるサムネイルのようなボーダーを作成します。