

# 「テンプレート印刷」機能を使って《供給・購入契約書》を生成する例

サプライチェーンや貿易の場面では、標準化された「供給・購入契約書」を迅速に作成し、データソースにある買い手、売り手、商品詳細などの情報に基づいて内容を動的に埋め込む必要が頻繁にあります。ここでは、簡略化した「契約」のユースケースを例に、「テンプレート印刷」機能の設定方法と使い方をご紹介します。この機能を使うと、データ情報を契約テンプレートのプレースホルダーにマッピングし、最終的な契約書を自動で生成できます。

---

## 1. 背景とデータ構造の概要

この例では、主に以下の**コレクション**が存在します（関連しない他のフィールドは省略しています）。

- **parties**：甲乙両当事者の組織または個人情報（名称、住所、担当者、電話番号など）を保存します。
- **contracts**：具体的な契約記録（契約番号、買い手/売り手の外部キー、署名者情報、開始/終了日、銀行口座など）を保存します。
- **contract_line_items**：当該契約に含まれる複数の項目（商品名、仕様、数量、単価、納期など）を保存します。

![template_print-2025-11-01-16-34-04](https://static-docs.nocobase.com/template_print-2025-11-01-16-34-04.png)

現在のシステムでは単一レコードの印刷のみをサポートしているため、「契約詳細」ページで「印刷」をクリックすると、システムは対応する `contracts` レコードと、関連する `parties` などの情報を自動的に取得し、WordまたはPDFドキュメントに埋め込みます。

## 2. 準備作業

### 2.1 **プラグイン**の準備

「テンプレート印刷」は商用**プラグイン**であり、印刷操作を行うには購入してアクティベートする必要がありますのでご注意ください。

![template_print-2025-11-01-17-31-51](https://static-docs.nocobase.com/template_print-2025-11-01-17-31-51.png)

**プラグイン**の有効化を確認する：

任意のページで詳細ブロック（例：`users`）を作成し、操作設定に対応するテンプレート設定オプションがあるか確認してください。

![template_print-2025-11-01-17-32-09](https://static-docs.nocobase.com/template_print-2025-11-01-17-32-09.png)

![template_print-2025-11-01-17-32-30](https://static-docs.nocobase.com/template_print-2025-11-01-17-32-30.png)

### 2.2 **コレクション**の作成

上記で設計した主体**コレクション**、契約**コレクション**、商品項目**コレクション**を作成します（主要なフィールドのみで構いません）。

#### 契約**コレクション**（Contracts）

| フィールドカテゴリ | フィールド表示名 | Field Name | フィールドインターフェース |
|---------|-------------------|------------|-----------------|
| **主キー & 外部キーフィールド** | | | |
| | ID | id | 整数 |
| | 買い手ID | buyer_id | 整数 |
| | 売り手ID | seller_id | 整数 |
| **関連フィールド** | | | |
| | 契約項目 | contract_items | 1対多 |
| | 買い手（甲） | buyer | 多対1 |
| | 売り手（乙） | seller | 多対1 |
| **一般フィールド** | | | |
| | 契約番号 | contract_no | 1行テキスト |
| | 納期開始日 | start_date | 日時（タイムゾーン付き） |
| | 納期終了日 | end_date | 日時（タイムゾーン付き） |
| | 手付金比率（%） | deposit_ratio | パーセント |
| | 納品後支払い日数 | payment_days_after | 整数 |
| | 銀行口座名（受取人） | bank_account_name | 1行テキスト |
| | 銀行名 | bank_name | 1行テキスト |
| | 銀行口座番号（受取人） | bank_account_number | 1行テキスト |
| | 合計金額 | total_amount | 数値 |
| | 通貨コード | currency_codes | 単一選択 |
| | 残高比率（%） | balance_ratio | パーセント |
| | 残高支払い日数（納品後） | balance_days_after | 整数 |
| | 納品場所 | delivery_place | 長文テキスト |
| | 甲署名者名 | party_a_signatory_name | 1行テキスト |
| | 甲署名者役職 | party_a_signatory_title | 1行テキスト |
| | 乙署名者名 | party_b_signatory_name | 1行テキスト |
| | 乙署名者役職 | party_b_signatory_title | 1行テキスト |
| **システムフィールド** | | | |
| | 作成日時 | createdAt | 作成日時 |
| | 作成者 | createdBy | 作成者 |
| | 最終更新日時 | updatedAt | 最終更新日時 |
| | 最終更新者 | updatedBy | 最終更新者 |

#### 主体**コレクション**（Parties）

| フィールドカテゴリ | フィールド表示名 | Field Name | フィールドインターフェース |
|---------|-------------------|------------|-----------------|
| **主キー & 外部キーフィールド** | | | |
| | ID | id | 整数 |
| **一般フィールド** | | | |
| | 当事者名 | party_name | 1行テキスト |
| | 住所 | address | 1行テキスト |
| | 担当者 | contact_person | 1行テキスト |
| | 連絡先電話番号 | contact_phone | 電話番号 |
| | 役職 | position | 1行テキスト |
| | メールアドレス | email | メール |
| | ウェブサイト | website | URL |
| **システムフィールド** | | | |
| | 作成日時 | createdAt | 作成日時 |
| | 作成者 | createdBy | 作成者 |
| | 最終更新日時 | updatedAt | 最終更新日時 |
| | 最終更新者 | updatedBy | 最終更新者 |

#### 商品項目**コレクション**（Contract Line Items）

| フィールドカテゴリ | フィールド表示名 | Field Name | フィールドインターフェース |
|---------|-------------------|------------|-----------------|
| **主キー & 外部キーフィールド** | | | |
| | ID | id | 整数 |
| | 契約ID | contract_id | 整数 |
| **関連フィールド** | | | |
| | 契約 | contract | 多対1 |
| **一般フィールド** | | | |
| | 商品名 | product_name | 1行テキスト |
| | 仕様/型番 | spec | 1行テキスト |
| | 数量 | quantity | 整数 |
| | 単価 | unit_price | 数値 |
| | 合計金額 | total_amount | 数値 |
| | 納期 | delivery_date | 日時（タイムゾーン付き） |
| | 備考 | remark | 長文テキスト |
| **システムフィールド** | | | |
| | 作成日時 | createdAt | 作成日時 |
| | 作成者 | createdBy | 作成者 |
| | 最終更新日時 | updatedAt | 最終更新日時 |
| | 最終更新者 | updatedBy | 最終更新者 |

### 2.3 インターフェース設定

**サンプルデータを入力する：**

![template_print-2025-11-01-17-32-59](https://static-docs.nocobase.com/template_print-2025-11-01-17-32-59.png)

![template_print-2025-11-01-17-33-11](https://static-docs.nocobase.com/template_print-2025-11-01-17-33-11.png)

**合計金額と後払い項目を自動計算する連携ルールを以下のように設定します：**

![template_print-2025-11-01-17-33-21](https://static-docs.nocobase.com/template_print-2025-11-01-17-33-21.png)

**ビューブロックを作成し、データを確認したら、「テンプレート印刷」操作を有効にします：**

![template_print-2025-11-01-17-33-33](https://static-docs.nocobase.com/template_print-2025-11-01-17-33-33.png)

### 2.4 テンプレート印刷**プラグイン**の設定

![template_print-2025-11-01-17-33-45](https://static-docs.nocobase.com/template_print-2025-11-01-17-33-45.png)

「供給・購入契約書」のようなテンプレート設定を新規追加します：

![template_print-2025-11-01-17-33-57](https://static-docs.nocobase.com/template_print-2025-11-01-17-33-57.png)

![template_print-2025-11-01-17-34-08](https://static-docs.nocobase.com/template_print-2025-11-01-17-34-08.png)

次に、フィールドリストのタブページに移動すると、現在のオブジェクトのすべてのフィールドが表示されます。後ほど「コピー」をクリックした後、テンプレートへの入力を開始できます。

![template_print-2025-11-01-17-35-19](https://static-docs.nocobase.com/template_print-2025-11-01-17-35-19.png)

### 2.5 契約ファイルの準備

**Word契約テンプレートファイル**

事前に契約書のひな形（.docxファイル）を用意してください。例：`SUPPLY AND PURCHASE CONTRACT.docx`

この例では、簡略化された《供給・購入契約書》を提供しており、以下のサンプルプレースホルダーが含まれています。

- `{d.contract_no}`：契約番号
- `{d.buyer.party_name}`、`{d.seller.party_name}`：買い手、売り手の名称
- `{d.total_amount}`：契約合計金額
- その他、「担当者」「住所」「電話番号」などのプレースホルダー

次に、作成した**コレクション**のフィールドをコピーし、Wordに貼り付けてください。

---

## 3. テンプレート変数チュートリアル

### 3.1 基本変数、関連オブジェクトプロパティの入力

**基本フィールドの入力：**

例えば、一番上の契約番号や、契約を締結する主体オブジェクトなどです。「コピー」をクリックし、契約書の対応する空白箇所に直接貼り付けるだけで完了です。

![template_print-2025-11-01-17-31-11](https://static-docs.nocobase.com/template_print-2025-11-01-17-31-11.gif)

![template_print-2025-11-01-17-30-51](https://static-docs.nocobase.com/template_print-2025-11-01-17-30-51.png)

### 3.2 データフォーマット

#### 日付のフォーマット

テンプレートでは、特に日付フィールドのフォーマットが必要になることがよくあります。直接コピーした日付の形式は通常長く（例：Wed Jan 01 2025 00:00:00 GMT）、希望するスタイルで表示するにはフォーマットが必要です。

日付フィールドには、`formatD()` 関数を使用して出力形式を指定できます。

```
{フィールド名:formatD(フォーマットスタイル)}
```

**例：**

例えば、コピーした元のフィールドが `{d.created_at}` で、日付を `2025-01-01` の形式にフォーマットしたい場合、このフィールドを次のように変更します。

```
{d.created_at:formatD(YYYY-MM-DD)}  // 出力：2025-01-01
```

**一般的な日付フォーマットスタイル：**

- `YYYY` - 年（4桁）
- `MM` - 月（2桁）
- `DD` - 日（2桁）
- `HH` - 時（24時間制）
- `mm` - 分
- `ss` - 秒

**例2：**

```
{d.created_at:formatD(YYYY-MM-DD HH:mm:ss)}  // 出力：2025-01-01 14:30:00
```

#### 金額のフォーマット

契約書に `{d.total_amount}` のような金額フィールドがあるとします。`formatN()` 関数を使用して数値をフォーマットし、小数点以下の桁数と桁区切り文字を指定できます。

**構文：**

```
{フィールド名:formatN(小数点以下の桁数, 桁区切り文字)}
```

- **小数点以下の桁数**：小数点以下に何桁残すかを指定できます。例えば、`2` は小数点以下2桁を意味します。
- **桁区切り文字**：桁区切り文字を使用するかどうかを指定します。通常は `true` または `false` です。

**例1：桁区切り文字と小数点以下2桁で金額をフォーマットする**

```
{d.amount:formatN(2, true)}  // 出力：1,234.56
```

これは `d.amount` を小数点以下2桁にフォーマットし、桁区切り文字を追加します。

**例2：小数点以下のない整数として金額をフォーマットする**

```
{d.amount:formatN(0, true)}  // 出力：1,235
```

これは `d.amount` を整数にフォーマットし、桁区切り文字を追加します。

**例3：桁区切り文字なしで小数点以下2桁の金額をフォーマットする**

```
{d.amount:formatN(2, false)}  // 出力：1234.56
```

ここでは桁区切り文字を無効にし、小数点以下2桁のみを保持します。

**その他の金額フォーマットの要件：**

- **通貨記号**：Carbone自体は通貨記号のフォーマット機能を直接提供していませんが、データまたはテンプレートに通貨記号を直接追加することで実現できます。例：
  ```
  {d.amount:formatN(2, true)} 円  // 出力：1,234.56 円
  ```

#### 文字列のフォーマット

文字列フィールドの場合、`:upperCase` を使用して、大文字/小文字変換などのテキスト形式を指定できます。

**構文：**

```
{フィールド名:upperCase:その他のコマンド}
```

**一般的な変換方法：**

- `upperCase` - すべて大文字に変換
- `lowerCase` - すべて小文字に変換
- `upperCase:ucFirst` - 先頭の文字を大文字に変換

**例：**

```
{d.party_a_signatory_name:upperCase}  // 出力：JOHN DOE
```

### 3.3 ループ印刷

#### 子オブジェクトリスト（商品詳細など）を印刷する方法

複数の子項目（商品詳細など）を含むテーブルを印刷する必要がある場合、通常はループ印刷を使用します。これにより、システムはリスト内の各項目に基づいて1行の内容を生成し、すべての項目が処理されるまで繰り返します。

例えば、複数の商品オブジェクトを含む商品リスト（`contract_items`など）があるとします。各商品オブジェクトには、商品名、仕様、数量、単価、合計金額、備考などの複数の属性があります。

**ステップ1：テーブルの1行目にフィールドを入力する**

まず、テーブルの1行目（ヘッダーではない）に、テンプレート変数を直接コピーして入力します。これらの変数は対応するデータに置き換えられ、出力に表示されます。

例えば、テーブルの1行目は次のようになります。

| 商品名 | 仕様/型番 | 数量 | 単価 | 合計金額 | 備考 |
|--------------|----------------------|----------|------------|--------------|--------|
| {d.contract_items[i].product_name} | {d.contract_items[i].spec} | {d.contract_items[i].quantity} | {d.contract_items[i].unit_price} | {d.contract_items[i].total_amount} | {d.contract_items[i].remark} |

ここで、`d.contract_items[i]` は商品リストのi番目の項目を表し、`i` は現在の商品の順序を示すインデックスです。

**ステップ2：2行目のインデックスを変更する**

次に、テーブルの2行目で、フィールドのインデックスを `i+1` に変更し、最初の属性のみを入力します。これは、ループ印刷時にリストから次のデータ項目を取得し、次の行に表示する必要があるためです。

例えば、2行目は次のように入力します。
| 商品名 | 仕様/型番 | 数量 | 単価 | 合計金額 | 備考 |
|--------------|----------------------|----------|------------|--------------|--------|
| {d.contract_items[i+1].product_name} | | |  | |  |

この例では、`[i]` を `[i+1]` に変更することで、リスト内の次の商品データを取得できます。

**ステップ3：テンプレートレンダリング時の自動ループ印刷**

システムがこのテンプレートを処理する際、以下のロジックに従って動作します。

1. 1行目は、テンプレートで設定したフィールドに従って入力されます。
2. その後、システムは自動的に2行目を削除し、`d.contract_items` からデータの抽出を開始し、すべての商品詳細が印刷されるまでテーブルの形式で各行をループして入力します。

各行の `i` はインクリメントされ、各行に異なる商品情報が表示されるようにします。

---

## 4. 契約テンプレートのアップロードと設定

### 4.1 テンプレートのアップロード

1. 「テンプレートを追加」ボタンをクリックし、「供給・購入契約書テンプレート」のようなテンプレート名を入力します。
2. 準備した [Word契約ファイル（.docx）](https://static-docs.nocobase.com/template_print-2025-11-01-17-37-11.docx) をアップロードします。これにはすべてのプレースホルダーが含まれています。

![template_print-2025-11-01-17-36-06](https://static-docs.nocobase.com/template_print-2025-11-01-17-36-06.png)

3. 完了後、システムはこのテンプレートをオプションのテンプレートリストに表示し、後で使用できるようにします。
4. 「使用」をクリックすると、このテンプレートがアクティベートされます。

![template_print-2025-11-01-17-36-13](https://static-docs.nocobase.com/template_print-2025-11-01-17-36-13.png)

この時点で現在のポップアップを終了し、「テンプレートをダウンロード」をクリックすると、生成された完全なテンプレートを取得できます。

**ヒント：**

- テンプレートが `.doc` またはその他の形式を使用している場合、**プラグイン**のサポート状況に応じて `.docx` に変換する必要がある場合があります。
- Wordファイルでは、レンダリングエラーを避けるため、プレースホルダーを複数の段落やテキストボックスに分割しないように注意してください。

---

「テンプレート印刷」機能をご活用ください！この機能を使えば、契約管理における繰り返し作業を大幅に削減し、手作業によるコピー＆ペーストのエラーを防ぎ、契約書の標準化と自動出力を実現できます。