コンテンツにスキップ

iDempiere 予約購入の使い方|販売管理 操作マニュアル・技術仕様

📖 販売管理の全体像: 販売管理の全体図 も合わせてご覧ください。

予約購入(Subscription)は、取引先が特定の品目を定期的に購入・更新する契約を記録するマスタです。「誰が」「どの品目を」「いつから」「いつまで支払済で」「次はいつ更新か」を1レコードで保持し、配送タブに納品実績を残せます。

⚠️ 注意: このウィンドウ(AD_Window_ID: 316)は iDempiere 13 標準では無効化されており、標準メニューにも登録されていません(旧バージョンからの互換用)。新規の業務設計で定期購読・保守契約を扱う場合は、この画面ではなく受注伝票の定期作成や独自プラグインでの実装を検討してください。

📌 ポイント: 予約購入には伝票処理(DocAction / DocStatus)も自動更新処理もありません。開始日・支払済有効期限・更新日付・支払期日フラグはすべて手入力(または独自プロセスでの更新)が前提の「台帳」です。契約情報を記録するだけで、請求書や出荷は自動生成されません。

  • 取引先と品目の組み合わせによる定期購読契約の登録
  • 契約開始日(開始日付)の記録
  • 支払済有効期限(PaidUntilDate)による「どこまで支払済か」の管理
  • 次回更新日付(RenewalDate)の記録
  • 「支払期日」フラグによる更新期限到来の明示
  • 予約購入タイプによる更新サイクルの紐づけ
  • 配送タブへの納品実績レコードの記録

予約購入はヘッダー+配送の2タブ構成です。

graph TD
    subgraph "予約購入ウィンドウ(Window ID: 316)"
        T1["🔁 予約購入<br/>C_Subscription<br/>11項目"]
        T2["🚚 配送<br/>C_Subscription_Delivery<br/>6項目"]
    end
    T1 --> T2

予約購入ウィンドウ(Window ID: 316) 予約購入 C_Subscription 11項目 配送 C_Subscription_Delivery 6項目

タブ名テーブル項目数役割
予約購入C_Subscription11項目契約ヘッダー(取引先・品目・各日付)
配送C_Subscription_Delivery6項目予約購入に対する任意の配送記録

💡 ヒント: 配送タブは「配送があったこと」を作成日時付きで残すだけの最小構成で、数量・出荷伝票へのリンクは持ちません。実際の出荷実績は出荷伝票側で管理してください。

graph TD
    A["🚀 ウィンドウを開く<br/>(標準メニュー未登録のため<br/>ロール設定でメニュー追加が必要)"] --> B["🔁 先に予約購入タイプを登録<br/>(更新頻度の定義)"]
    B --> C["➕ 新規ボタンをクリック"]
    C --> D["✏️ 名称・取引先・品目を入力"]
    D --> E["📅 開始日付・支払済有効期限<br/>・更新日付を入力"]
    E --> F["💾 保存"]
    F --> G{納品実績を残す?}
    G -->|はい| H["🚚 配送タブで<br/>配送レコードを追加"]
    G -->|いいえ| I["✅ 登録完了"]
    H --> I
    I --> J["🔄 更新時期が来たら<br/>支払期日フラグ・各日付を更新"]

ウィンドウを開く (標準メニュー未登録のため ロール設定でメニュー追加が必要) 先に予約購入タイプを登録 (更新頻度の定義) 新規ボタンをクリック 名称・取引先・品目を入力 開始日付・支払済有効期限 ・更新日付を入力 保存 配送タブで 配送レコードを追加 登録完了 更新時期が来たら 支払期日フラグ・各日付を更新 納品実績を残す? はい いいえ

アクセス方法(メニューパス)

Section titled “アクセス方法(メニューパス)”

このウィンドウは iDempiere 13 標準ではメニューに登録されていません。利用する場合はシステム管理者がメニュー(AD_Menu)へウィンドウ ID 316 を追加し、ロールにアクセス権を付与する必要があります。

  1. 予約購入タイプを先に登録しておきます
  2. 新規」ボタンをクリック
  3. 契約情報を入力(すべて必須):
    • 名称: 契約名(例: 月刊誌購読_A社
    • 予約タイプ: 登録済みの予約購入タイプを選択
    • 取引先: 購読者となる取引先
    • 品目: 購読対象の品目
    • 開始日付: 契約開始日(初日を含む)
    • 支払済有効期限: この日まで支払済/有効
    • 更新日付: 次回更新予定日
    • 支払期日: 更新期限が到来している場合にチェック
  4. 保存」をクリック

⚠️ 注意: 予約購入タブの日付項目(開始日付・支払済有効期限・更新日付)と支払期日フラグはすべて必須です。片方だけ埋めて保存することはできません。

  1. 配送」タブに移動
  2. 新規」ボタンをクリック
  3. 親の予約購入が自動セットされるので、そのまま「保存
  4. 作成日・作成者が自動記録されます
項目名カラム必須説明
クライアントAD_Client_ID必須選択テナント
組織AD_Org_ID必須選択組織
名称Name必須文字列(60)契約名
予約タイプC_SubscriptionType_ID必須選択更新サイクルの定義
取引先C_BPartner_ID必須検索購読する取引先
品目M_Product_ID必須検索購読対象の品目・サービス
開始日付StartDate必須日付契約開始日(初日を含む)
支払済有効期限PaidUntilDate必須日付この日まで支払済/有効
更新日付RenewalDate必須日付次回更新予定日
支払期日IsDue必須チェック更新期限が到来しているか
有効IsActive必須チェックレコードが有効か(既定: Y)
項目名カラム必須説明
予約C_Subscription_ID必須選択親の予約購入(自動セット)
作成日Created自動日時配送記録の作成日時
作成者CreatedBy自動検索記録したユーザー
有効IsActive必須チェックレコードが有効か

全項目一覧はリファレンス参照

Q. 更新日が来たら請求書が自動作成されますか?

Section titled “Q. 更新日が来たら請求書が自動作成されますか?”

されません。C_Subscription には M クラス(ビジネスロジック実装クラス)が存在せず、自動生成された X_C_Subscription(353行)のみが提供されています。更新の検知・請求書生成・出荷指示はすべてコア外の実装が必要です。

Q. 「支払期日(IsDue)」は自動でチェックされますか?

Section titled “Q. 「支払期日(IsDue)」は自動でチェックされますか?”

自動更新されません。日付を比較して IsDue を立てるコアロジックは実装されていないため、スケジューラ(AD_Scheduler)で動かす独自プロセスなどで更新する必要があります。

Q. 1つの契約で複数品目を扱えますか?

Section titled “Q. 1つの契約で複数品目を扱えますか?”

扱えません。C_SubscriptionM_Product_ID を1つだけ持つフラットな構造で、明細行テーブルがありません。複数品目の契約は品目ごとにレコードを分けて登録してください。

Q. 配送タブに数量や出荷伝票を記録できますか?

Section titled “Q. 配送タブに数量や出荷伝票を記録できますか?”

できません。C_Subscription_Delivery はクライアント・組織・親予約・有効フラグ・作成情報のみを持つ最小構成のテーブルで、数量カラムも M_InOut_ID への参照もありません。

伝票処理(DocAction)が無いため「解約」ステータスは存在しません。運用上は「有効」チェックを外す、または支払済有効期限を解約日に更新する運用になります。

graph TD
    A["🔁 予約購入タイプ<br/>更新サイクル定義"] --> B["📄 予約購入<br/>契約台帳"]
    C["🏢 取引先マスタ"] --> B
    D["📦 品目マスタ"] --> B
    B --> E["🚚 配送記録<br/>C_Subscription_Delivery"]
    B -.手動または独自プロセス.-> F["📋 受注伝票"]
    F --> G["💴 売上請求書"]

予約購入タイプ 更新サイクル定義 予約購入 契約台帳 取引先マスタ 品目マスタ 配送記録 C_Subscription_Delivery 受注伝票 売上請求書

📌 ポイント: 点線部分(予約購入から受注伝票への展開)は iDempiere 標準では実装されていません。ここを自動化するのがサブスクリプション業務の実装ポイントになります。


🛠 技術仕様(開発者向け)

予約購入はマスタデータ型のウィンドウ(AD_Window_ID: 316)で、C_Subscription(ヘッダー)と C_Subscription_Delivery(配送記録)の2テーブルで構成されます。どちらも専用の M クラスを持たず、AD から自動生成された X_C_Subscription(353行)と X_C_Subscription_Delivery(180行)のみが提供されています。Document 型ではなく、DocStatus / DocAction カラムも存在しません。

classDiagram
    class X_C_Subscription {
        <<generated>>
        +getC_SubscriptionType_ID() int
        +getC_BPartner_ID() int
        +getM_Product_ID() int
        +getStartDate() Timestamp
        +getPaidUntilDate() Timestamp
        +getRenewalDate() Timestamp
        +isDue() boolean
    }
    class X_C_Subscription_Delivery {
        <<generated>>
        +getC_Subscription_ID() int
    }
    class PO {
        <<abstract>>
    }
    X_C_Subscription --|> PO
    X_C_Subscription_Delivery --|> PO
    X_C_Subscription --> X_C_Subscription_Delivery : has many
    X_C_Subscription --> X_C_SubscriptionType : renewal cycle

<> +getC_SubscriptionType_ID() int +getC_BPartner_ID() int +getM_Product_ID() int +getStartDate() Timestamp +getPaidUntilDate() Timestamp +getRenewalDate() Timestamp +isDue() boolean <> +getC_Subscription_ID() int <> > PO X_C_Subscription_Delivery --

パッケージ: org.compiere.model ソースファイル: org.adempiere.base/src/org/compiere/model/X_C_Subscription.javaX_C_Subscription_Delivery.java

テーブル属性: 削除可(IsDeleteable=Y)/大量データ扱いなし/アクセスレベル=クライアント+組織/ビューではない。

カラム名必須説明備考
C_Subscription_IDIDPK予約購入ID主キー
C_Subscription_UUUUID(36)NUUIDキー
AD_Client_IDTable DirectYクライアント既定 @#AD_Client_ID@
AD_Org_IDTable DirectY組織既定 @#AD_Org_ID@
NameString(60)Y名称識別子カラム
C_SubscriptionType_IDTable DirectY予約購入タイプ更新サイクル
C_BPartner_IDSearchY取引先購読者
M_Product_IDSearchY品目購読対象(1件のみ)
StartDateDateY開始日付初日を含む
PaidUntilDateDateY支払済有効期限
RenewalDateDateY更新日付
IsDueYes-NoY支払期日既定値なし
IsActiveYes-NoY有効既定 Y
Created / CreatedByDate+Time / SearchY作成日時・作成者既定 SYSDATE
Updated / UpdatedByDate+Time / SearchY更新日時・更新者既定 SYSDATE
カラム名必須説明備考
C_Subscription_Delivery_IDIDPK配送記録ID主キー
C_Subscription_Delivery_UUUUID(36)NUUIDキー
C_Subscription_IDTable DirectY予約購入FK更新不可
AD_Client_IDTable DirectYクライアント既定 @AD_Client_ID@
AD_Org_IDTable DirectY組織既定 @AD_Org_ID@
IsActiveYes-NoY有効既定 Y
Created / CreatedByDate+Time / SearchY作成日時・作成者画面上の表示項目
Updated / UpdatedByDate+Time / SearchY更新日時・更新者

📌 ポイント: C_Subscription_Delivery には数量・出荷伝票参照・配送日といった業務カラムが一切ありません。実質的に「配送が発生した回数と日時」を数えるためのテーブルです。

erDiagram
    C_SubscriptionType ||--o{ C_Subscription : "renewal cycle"
    C_Subscription ||--o{ C_Subscription_Delivery : "deliveries"
    C_Subscription }o--|| C_BPartner : "subscriber"
    C_Subscription }o--|| M_Product : "subscribed product"

renewal cycle subscribed product

M クラスが存在しないため、コアに固有のビジネスロジック(beforeSave / afterSave / 期日計算 / 更新判定)はありません。保存時の挙動は PO の標準処理(必須チェック、外部キー整合性、アクセスレベル制御)に従います。

C_Subscription_ID(配送タブ側)と DocumentNo 相当のカラムは IsUpdateable=N で、保存後の親付け替えはできません。

拡張ポイント(カスタマイズ箇所)

Section titled “拡張ポイント(カスタマイズ箇所)”
public class CustomSubscriptionValidator implements ModelValidator {
@Override
public int modelChange(PO po, int type) throws Exception {
if (po instanceof X_C_Subscription
&& (type == TYPE_BEFORE_NEW || type == TYPE_BEFORE_CHANGE)) {
X_C_Subscription sub = (X_C_Subscription) po;
// 例: 更新日付は開始日付より後であること
if (sub.getRenewalDate() != null && sub.getStartDate() != null
&& !sub.getRenewalDate().after(sub.getStartDate())) {
throw new AdempiereException("更新日付は開始日付より後の日付にしてください");
}
}
return null;
}
}

IsDue の自動更新は、AD_Scheduler から起動する SvrProcess 実装で行うのが定石です。RenewalDate <= 今日 かつ IsDue='N' のレコードを抽出して更新し、必要に応じて受注伝票(MOrder)を自動生成します。

C_Subscription / C_Subscription_Delivery のカラムには AD 上の callout 定義がありません。予約購入タイプ選択時に更新日付を自動計算したい場合などは、独自 callout を追加してください。

このウィンドウには専用のプロセスボタンは定義されていません。


iDempiere 標準の予約購入は契約台帳としての最小構成にとどまり、更新検知・自動請求・解約処理はコアに実装されていません。 スケジューラ連携の更新プロセスや受注伝票の自動生成をOSGiプラグインで追加すれば、コア改変なしにサブスクリプション業務を運用できます。

As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。

OSS ERP導入・カスタマイズサービスの詳細はこちら