PDF報告書

ワンルームを使用すると、:ref:`既存のPDFレポートを編集 <studio/pdf-reports/edit>`(請求書、見積書など)したり、:ref:`新しいレポートを作成 <studio/pdf-reports/create>`したりできます。

デフォルトレイアウト

報告書のデフォルトレイアウトは、ワンルーム外で管理されます。:menuselection:`Settings`に移動し、メインページの:guilabel:`Companies`セクションで:guilabel:`Configure Document Layout`をクリックします。レイアウト設定は会社固有ですが、すべての報告書に適用されます。

ちなみに

:guilabel:`Configure your document layout`ウィンドウの右側にある報告書プレビューで、さまざまな設定が報告書レイアウトにどのように影響するかを確認できます。報告書を作成または編集する際は、画面の左側にある:guilabel:`Print preview`をクリックして、報告書のプレビューを表示できます。

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

  • Layout: 7つのレイアウトが利用可能です:

    ライトレポートレイアウトサンプル
  • 背景: 以下の背景が利用できます:

    • 空白: 何も表示されません。

    • デモロゴ: 背景にデモロゴが表示されます。

    • カスタム: カスタム背景画像をアップロードします。

  • テキスト: 8種類のフォントが利用できます: Lato、Roboto、Open Sans、Montserrat、Oswald、Raleway、Tajawal(アラビア文字とラテン文字に対応)、Fira Mono。プレビューするには`Google Fontsウェブサイト<https://fonts.google.com/>`_をご覧ください。

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

  • 住所: 会社名と住所は:ref:`外部レポート <studio/pdf-reports/header-footer>`のヘッダーに表示されます。複数行のテキストを追加できます。

  • タグライン: これは、Light、Striped、Bubble、Wave、Folderレイアウトを使用する:ref:`外部レポート <studio/pdf-reports/header-footer>`のヘッダー、およびBoxedとBoldレイアウトを使用する外部レポートのフッターに表示されます。複数行のテキストを追加できます。

  • 用紙フォーマット: レポートのデフォルトの用紙サイズを定義します。:guilabel:`A4`(21 cm x 29.7 cm)と:guilabel:`USレター`(21.59 cm x 27.54 cm)を選択できます。これは、:ref:`Studio <studio/pdf-reports/edit-options>`の:guilabel:`用紙フォーマット`フィールドで個々のレポートに対しても定義できます。

    注釈

    インストールされているアプリやモジュールによっては、他の用紙フォーマットが利用できる場合があります。例えば、在庫アプリ用のラベルシートやイベントアプリ用のイベントバッジなどです。

新しいPDFレポートの作成

モデル </applications/studio/models_modules_apps>`(例:販売オーダ)の新しいレポートを作成するには、モデルにアクセスし、:icon:`oi-studio`(:guilabel:`Studioを切り替え)ボタンをクリックしてから、:guilabel:`レポート`をクリックします。:guilabel:`新規`をクリックし、開いたポップアップウィンドウでレポートのタイプを選択します。これは、ヘッダーとフッターに表示される内容を決定するためにのみ使用されます:

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

PDF報告書の編集

モデルで利用可能な報告書にアクセスするには、モデルにアクセスし、 (ワンルームを切り替え) ボタンをクリックしてから、:guilabel:`報告書`をクリックします。既存の報告書を選択して開きます。

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

重要

標準報告書を**複製**し、複製したバージョンで変更を加えることを強くお勧めします。報告書を複製するには、報告書の右上隅にマウスポインタを合わせ、 (縦の省略記号) アイコンをクリックしてから、:guilabel:`複製`を選択します。

PDF報告書の複製

オプション

報告書を選択または作成したら、画面の左側にあるオプションを使用して次のことができます:

  • 報告書名`の変更: 新しい名前はすべての場所(ワンルーム、フォームビューの:icon:`fa-cog (歯車) アイコン下の:guilabel:`印刷`メニュー、PDFファイル名)に適用されます。

  • :guilabel:`用紙フォーマット`の変更: 値が選択されていない場合、:ref:`デフォルトレイアウト <studio/pdf-reports/default-layout-paper>`で定義されたフォーマットが使用されます。

  • 印刷メニューに表示: フォームビューの:guilabel:`印刷`メニューに報告書を追加します。

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

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

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

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

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

報告書エディタ

レポートエディタでは、レポートの内容と書式を変更できます。

ちなみに

  • 関連するボタンまたはショートカット`CTRL` + Z`および`CTRL + `Y`を使用して、:guilabel:`元に戻す`または:guilabel:`やり直す`ことができます。

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

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

重要

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

条件付きブロック

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

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

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

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

注釈

条件は:ref:`XML <studio/pdf-reports/XML-editing>`でのみ編集できます。

その他のコンテンツ

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

  • 静的な文字列、つまり青色でハイライト表示されていない文字列は、エディタで直接変更できます。

  • 動的な文字列、つまり青色でハイライト表示されている文字列は、レポートが生成されるときに:doc:`フィールド </applications/studio/fields>`値に置き換えられます(例:販売オーダ番号や見積もり日付)。

コマンドを使用して、レポートにコンテンツ(フィールド、リスト、テーブル、画像、バナーなど)を追加できます。`/`を入力して:ref:`パワーボックス <essentials/html_editor/commands>`を開き、コマンド名を入力するか、リストから選択します。

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

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

フィールドを追加

`/`を入力して:guilabel:`フィールド`コマンドを選択すると、フィールドを追加できます。開いたリストで、フィールドを選択または検索します。必要に応じて、フィールド名の横にある右矢印をクリックして関連フィールドのリストにアクセスします。次に、レコードでフィールドが入力されていない場合に表示されるデフォルト値を指定し、`Enter`を押します。

関連するフィールドを選択します。
テーブルを追加または編集

レポートには2種類のテーブルがあります:

  • :ref:`静的テーブル <studio/pdf-reports/static-table>`は、静的なテキストやフィールドを表示するために使用されます。このタイプのテーブルでは、テーブル追加時に列数と行数を定義します。

  • :ref:`動的テーブル <studio/pdf-reports/dynamic-table>`は、:ref:`リレーションフィールド <studio/fields/relational-fields>`からのデータを表示するために使用されます。このタイプのテーブルでは、テーブル追加時に列数のみを定義します。生成されるレポート内の行数は、現在のモデルにリンクされている関連モデルのレコード数によって決まります。

    Example

    販売オーダレポートでは、動的テーブルは販売オーダに関連するオーダ行を表示するために使用されます。販売オーダに10件のオーダ行が含まれている場合、生成されるレポートのテーブルには10行が表示され、2件のオーダ行が含まれている場合、テーブルには2行が表示されます。

静的テーブルを追加または編集

静的テーブルを追加するには、`/`を入力して:guilabel:`テーブル`コマンドを選択します。テーブルの列数と行数を決定します。テーブルが追加されたら、編集を開始できます。

テーブルツールを使用して、列と行を挿入、移動、削除できます。カーソルを列の上または行の左に配置し、紫色の四角形をクリックしてオプションを選択します。

テーブル構造を編集するための利用可能なオプション一覧。

列のサイズを変更するには、列の境界線を目的の位置にドラッグします。テーブルツールから:guilabel:`サイズをリセット`を選択することで、すべての列を標準サイズにリセットできます。

セル内に:ref:`任意のフィールド <studio/pdf-reports/add-field>`を追加するか、入力して静的なテキストを追加します。

ちなみに

テーブルを使用せずに構造化された方法でテキストを追加するには、列を使用できます。/`を入力して適切なコマンドを選択することで列を追加します::guilabel:`2列3列、または:guilabel:4列

動的テーブルを追加または編集

注釈

  • `one2many`または`many2many`タイプのリレーションのみ、動的テーブルとして表示できます。

  • 標準レポート内の既存の動的テーブルは、自分で追加する動的テーブルよりも複雑な構造を持っています。このようなテーブルでは、列の挿入または削除は可能ですが、列の移動や行の挿入、移動、削除はできません。

動的テーブルを追加するには、`/`を入力して:guilabel:`動的テーブル`コマンドを選択します。開いたリストで、テーブルの基準となるリレーションを選択または検索し、`Enter`キーを押します。テーブルが追加されたら、編集を開始できます。

:ref:`静的テーブル <studio/pdf-reports/static-table>`と同様に、テーブルツールを使用して列を挿入、移動、削除できます。また、生成される行の上または下に表示される静的な行を挿入することもできます。

セルにフィールドを追加するには、プレースホルダーテキストを削除してから、:ref:`任意のフィールド <studio/pdf-reports/add-field>`を追加します。開くダイアログボックスには、フィールドのソースオブジェクト(例:*注文行*モデル)と利用可能なフィールドのリストが表示されます。

販売オーダ行モデルの利用可能なフィールド一覧。

:guilabel:`列名`ラベルを任意のラベルに置き換えます。

注釈

デフォルトの行は、フィールドのコンテンツに対して自動的に反復処理を行い、各フィールド値に対して報告書に行を生成します(例:注文明細行ごとに1行)。

フォーマット

報告書内のテキストをフォーマットするには、テキストを選択し、:doc:`テキストエディタ </applications/essentials/html_editor>`のオプションを使用してフォーマットします。

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

報告書のXMLを編集

警告

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

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

報告書でのデータの表示方法を変更するには、フィールドのデフォルト:doc:`ウィジェット </applications/studio/fields>`を手動で変更できます。以下の例では、注文日はデフォルトで日付と時刻を表示し、単価はデフォルトで小数点以下2桁の精度で表示されます。

<div class="oe_structure">
 <span t-field="doc.date_order"/>
 <span t-field="doc.price_unit"/>
</div>

`t-options`を使用することで、この場合は`widget`オプションを使用して、これらのフィールドをそれぞれ日付のみの表示と小数点以下4桁の精度に変更できます:

<div class="oe_structure">
 <span t-field="doc.date_order" t-options="{'widget': 'date'}"/>
 <span t-field="doc.price_unit" t-options="{'widget': 'float', 'precision': 4}"/>
</div>

特定の条件に基づいてコンテンツを表示/非表示にしたい場合は、報告書の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`の場合、*見積もり*が使用されます。これらのいずれの条件も満たされない場合、報告書のタイトルは*注文*になります。

報告書で画像を扱うことは難しい場合があります。画像のサイズや動作を正確に制御することが必ずしも明確ではないためです。報告書エディタを使用して画像フィールドを挿入できます(:ref:`フィールドコマンド <studio/pdf-reports/add-field>`を使用)が、`t-field`ディレクティブと付随する`t-options`属性を使用してXMLで挿入する方が、サイズと配置の制御が向上します。

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

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

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

  • width: width of the image, usually in pixels or CSS length units (e.g., rem) (leave empty for auto-width).

  • height: height of the image, usually in pixels or CSS length units (e.g., rem) (leave empty for auto-height).

  • class: CSS classes applied on the img tag; Bootstrap classes are available.

  • alt: alternative text of the image

  • style: style attribute; it allows you to override styles more freely than with Bootstrap classes.

These attributes must contain strings, i.e., text enclosed within quotes within quotes, e.g., t-options-width="'64px'" (or, alternatively, a valid Python expression).

注釈

The image widget cannot be used on an img tag. Instead, set the t-field directive on a span (for inline content) or div (for block content) node.

For example, let's add a column with the product image in the quotation table:

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

The t-options-width attribute restricts the image width to 64 pixels, and the Bootstrap classes used in t-options-class create a thumbnail-like border with rounded corners and a shadow.

Add a column with the product image in the quotation table.