iDempiere リソースマスタの使い方|取引先管理 操作マニュアル・技術仕様
📖 取引先管理の全体像: 取引先管理の全体図 も合わせてご覧ください。
リソースマスタは、会議室・機材・要員のように「予約して使う対象」を登録するマスタです。リソースを登録すると対応する品目(M_Product)が自動生成・自動同期されるため、受注伝票や請求書でそのままサービスとして扱えます。
📌 ポイント: リソースと品目は1対1で自動連携します。名称・数量単位などの属性は必ずリソース側で更新してください。品目側を直接書き換えても、リソース保存時に上書きされます。
リソースマスタでできること
Section titled “リソースマスタでできること”- リソース(会議室・機材・要員など)の登録と稼働可否の管理
- リソースタイプによる稼働時間帯・稼働曜日の一括制御
- 対応する品目の自動生成・自動同期(受注・請求で利用可能に)
- 稼働不可期間(休暇・保守など)の登録
- 価格表バージョンごとの価格設定
- 会計スキーマごとの勘定科目設定
- アサイン(予約)履歴の照会
- 製造リソースとしての利用(日次能力・稼働率・待ち時間などの設定)
リソースマスタは6タブ構成(うち2つは品目配下の孫タブ)です。
| タブ名 | テーブル | 項目数 | 役割 |
|---|---|---|---|
| リソースマスタ | S_Resource | 10項目 | リソース本体(タイプ・倉庫・稼働可否) |
| 稼働不可期間 | S_ResourceUnAvailable | 7項目 | 使用できない期間の登録 |
| リソース品目 | M_Product | 24項目 | 自動生成された品目の情報 |
| 価格 | M_ProductPrice | 8項目 | 価格表バージョンごとの価格 |
| 会計 | M_Product_Acct | 14項目 | 会計スキーマごとの勘定科目 |
| アサイン情報 | S_ResourceAssignment | 9項目 | 予約・割当の履歴 |
graph TD
T1["🏢 リソースマスタ<br/>S_Resource<br/>10項目"]
T2["🚫 稼働不可期間<br/>S_ResourceUnAvailable<br/>7項目"]
T3["📦 リソース品目<br/>M_Product<br/>24項目"]
T4["💴 価格<br/>M_ProductPrice<br/>8項目"]
T5["📒 会計<br/>M_Product_Acct<br/>14項目"]
T6["📅 アサイン情報<br/>S_ResourceAssignment<br/>9項目"]
T1 --> T2
T1 --> T3
T3 --> T4
T3 --> T5
T1 --> T6
💡 ヒント: 「価格」「会計」は品目タブの配下(第2階層)にあります。価格を設定するには、まず「リソース品目」タブでレコードを選択してから移動してください。
基本操作手順
Section titled “基本操作手順”graph TD
A["🚀 メニューから開く<br/>取引先管理 > サービス > リソースマスタ(タイプ毎)(標準)"] --> B["📋 事前にリソースタイプを登録"]
B --> C["➕ 新規で基本情報を入力<br/>(検索キー・名称)"]
C --> D["🏷 リソースタイプを選択<br/>(稼働時間帯・曜日を継承)"]
D --> E["🏭 倉庫を選択<br/>(サービス提供拠点)"]
E --> F["💾 保存<br/>(品目が自動生成される)"]
F --> G["💴 価格タブで<br/>価格表ごとの単価を登録"]
G --> H{"休暇や保守で<br/>使えない期間があるか"}
H -->|ある| I["🚫 稼働不可期間タブに<br/>開始日・終了日を登録"]
H -->|ない| J["✅ 受注伝票などから<br/>リソースを予約"]
I --> J
J --> K["📅 アサイン情報タブで<br/>予約状況を確認"]
アクセス方法(メニューパス)
Section titled “アクセス方法(メニューパス)”メニューから「取引先管理 > サービス > リソースマスタ(タイプ毎)(標準)」を開きます。
新規登録(必須項目ベースの手順)
Section titled “新規登録(必須項目ベースの手順)”- あらかじめリソースタイプを登録しておきます
- ツールバーの「新規」ボタンをクリック
- 必須項目を入力:
- 検索キー: リソースコード(40文字以内)。空欄で保存すると名称がそのままセットされます
- 名称: リソース名(60文字以内、例:
第1会議室) - リソースタイプ: 稼働時間帯・曜日・数量単位・品目カテゴリ・税カテゴリを決める分類
- 倉庫: サービス提供拠点となる倉庫
- 稼働可能: 既定でチェック済み
- 任意で ユーザー を割り当て(要員リソースの場合)
- 「保存」をクリック
⚠️ 注意: 保存すると、リソースに対応する品目が自動生成されます。品目の名称・数量単位・カテゴリ・税カテゴリはリソースおよびリソースタイプから同期されるため、品目タブで直接書き換えても次回のリソース保存時に上書きされます。
稼働不可期間の登録
Section titled “稼働不可期間の登録”- 「稼働不可期間」タブに移動して「新規」
- 開始日付(必須)と 終了日付 を入力
- 説明に理由(休暇・保守など)を記入
- 「保存」をクリック
💡 ヒント: 終了日付を空欄で保存すると、自動的に開始日付と同じ日がセットされます(1日だけの稼働不可を登録するショートカットになります)。
- 「リソース品目」タブでレコードを選択
- 「価格」タブに移動して「新規」
- 価格表バージョンを選び、営業定価 / 実績価格 / 限度価格 を入力
項目リファレンス
Section titled “項目リファレンス”リソースマスタタブ
Section titled “リソースマスタタブ”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| クライアント | 必須 | 選択 | テナント |
| 組織 | 必須 | 選択 | 組織 |
| 検索キー | 必須 | 文字列(40) | リソースコード(空欄なら名称が入る) |
| 名称 | 必須 | 文字列(60) | リソース名 |
| 説明 | - | 文字列(255) | 補足説明 |
| リソースタイプ | 必須 | 選択 | 稼働ルールを決める分類 |
| 倉庫 | 必須 | 選択 | サービス提供拠点 |
| ユーザー | - | 選択 | 要員リソースの場合の担当ユーザー |
| 稼働可能 | 必須 | チェック | 予約可能か(既定 Y) |
| 有効 | 必須 | チェック | レコードが有効か(既定 Y) |
稼働不可期間タブ
Section titled “稼働不可期間タブ”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| リソース | 必須 | 選択 | 親のリソース |
| 開始日付 | 必須 | 日付 | 稼働不可の開始日 |
| 終了日付 | - | 日付 | 稼働不可の終了日(空欄なら開始日と同じ) |
| 説明 | - | 文字列(255) | 理由 |
アサイン情報タブ
Section titled “アサイン情報タブ”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| リソース | 必須 | 選択 | 対象リソース |
| 配分開始日 | 必須 | 日時 | 予約開始日時 |
| 配分終了日 | - | 日時 | 予約終了日時 |
| 数量 | - | 数量 | 割当数量 |
| 確認済み | 必須 | チェック | 予約確定済みか |
| 名称 | 必須 | 文字列(60) | 予約の名称 |
よくある質問(FAQ)
Section titled “よくある質問(FAQ)”Q. リソースを登録したら品目が勝手に増えました
Section titled “Q. リソースを登録したら品目が勝手に増えました”仕様です。MResource.beforeSave() が新規リソースに対して品目レコードを生成し、afterSave() で名称や単位などを同期します。リソースは受注・請求で扱うために品目の実体を必要とするためです。
Q. リソースを削除すると品目も消えますか?
Section titled “Q. リソースを削除すると品目も消えますか?”はい。MResource.beforeDelete() が対応する品目のリソース参照を外したうえで、品目を削除します。品目が受注伝票などから参照されている場合は削除に失敗するため、その場合はリソースの「有効」チェックを外して無効化してください。
Q. 「検索キー」を空欄のまま保存できますか?
Section titled “Q. 「検索キー」を空欄のまま保存できますか?”できます。空欄またはゼロ文字の場合、beforeSave() が名称の値を検索キーにコピーします。ただし検索キーは一意である必要があるため、同名リソースを複数作る場合は明示的にコードを付けてください。
Q. 稼働不可期間で「終了日付が開始日付より前」の日付を入れるとどうなりますか?
Section titled “Q. 稼働不可期間で「終了日付が開始日付より前」の日付を入れるとどうなりますか?”MResourceUnAvailable.beforeSave() が検証し、エラーメッセージ(@DateTo@ > @DateFrom@)を出して保存を拒否します。
Q. 確定済みのアサインを削除できません
Section titled “Q. 確定済みのアサインを削除できません”MResourceAssignment.beforeDelete() が 確認済み(IsConfirmed=Y)のアサインの削除を拒否します。削除するにはまず「確認済み」のチェックを外してください。
Q. 製造リソースとしても使えますか?
Section titled “Q. 製造リソースとしても使えますか?”S_Resource は製造モジュール向けのカラム(製造リソース フラグ、製造リソースタイプ、日次能力、稼働率、待ち時間、計画期間)を持ちます。ただし製造リソースかつ Plant タイプの場合、計画期間(PlanningHorizon)が 0 以下だと保存時に例外になります。
🛠 技術仕様(開発者向け)
リソースは S_Resource テーブル(アクセスレベル 3 = クライアント/組織、削除可)に格納されます。モデルクラスは MResource(281行)で、ImmutablePOSupport を実装しキャッシュ経由の参照に対応します。最大の特徴は品目(M_Product)とのライフサイクル同期で、生成・更新・削除のすべてがフックで連動します。子テーブルは MResourceUnAvailable(124行)と MResourceAssignment(115行)が対応します。Document 型ではありません。
アーキテクチャ概要
Section titled “アーキテクチャ概要”classDiagram
class MResource {
+get(ctx, S_Resource_ID) MResource
+getCopy(ctx, id, trxName) MResource
+getResourceType() MResourceType
+getProduct() MProduct
+getC_UOM_ID() int
+beforeSave(boolean) boolean
+afterSave(boolean, boolean) boolean
+beforeDelete() boolean
+markImmutable() MResource
}
class X_S_Resource {
<<generated>>
}
class MResourceUnAvailable {
+isUnAvailable(I_S_Resource, Timestamp) boolean
+beforeSave(boolean) boolean
}
class MResourceAssignment {
+beforeDelete() boolean
}
class ImmutablePOSupport {
<<interface>>
}
class PO {
<<abstract>>
}
MResource --|> X_S_Resource
X_S_Resource --|> PO
MResource ..|> ImmutablePOSupport
MResource --> MProduct : creates and syncs
MResource --> MResourceType : rules
MResource --> MResourceUnAvailable : has many
MResource --> MResourceAssignment : has many
パッケージ: org.compiere.model
ソースファイル: org.adempiere.base/src/org/compiere/model/MResource.java、MResourceUnAvailable.java、MResourceAssignment.java
関連DBテーブル
Section titled “関連DBテーブル”S_Resource(リソース)
Section titled “S_Resource(リソース)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| S_Resource_ID | ID | PK | リソースID | 主キー |
| S_Resource_UU | UUID(36) | N | UUID | |
| AD_Client_ID | Table Direct | Y | クライアント | 既定 @#AD_Client_ID@ |
| AD_Org_ID | Table Direct | Y | 組織 | 既定 @#AD_Org_ID@ |
| Value | String(40) | Y | 検索キー | 空欄なら Name をコピー |
| Name | String(60) | Y | 名称 | |
| Description | String(255) | N | 説明 | |
| S_ResourceType_ID | Table Direct | Y | リソースタイプ | 稼働ルールの継承元 |
| M_Warehouse_ID | Table Direct | Y | 倉庫 | サービス提供拠点 |
| AD_User_ID | Table Direct | N | ユーザー | 要員リソース用 |
| IsAvailable | Yes-No | Y | 稼働可能 | 既定 Y |
| IsActive | Yes-No | Y | 有効 | 既定 Y |
| IsManufacturingResource | Yes-No | N | 製造リソース | 既定 N |
| ManufacturingResourceType | List(2) | N | 製造リソースタイプ | Plant 等 |
| PlanningHorizon | Integer | N | 計画期間 | 既定 0・Plant では 1 以上必須 |
| DailyCapacity | Quantity | N | 日次能力 | |
| PercentUtilization | Number | Y | 稼働率 | 既定 100 |
| QueuingTime / WaitingTime | Quantity | N | 待ち時間 | 製造向け |
| ChargeableQty | Quantity | N | 課金数量 |
S_ResourceUnAvailable(稼働不可期間)/S_ResourceAssignment(アサイン)
Section titled “S_ResourceUnAvailable(稼働不可期間)/S_ResourceAssignment(アサイン)”| テーブル | 主なカラム | 備考 |
|---|---|---|
| S_ResourceUnAvailable | S_Resource_ID / DateFrom(必須) / DateTo / Description | DateTo 未設定なら DateFrom を自動セット |
| S_ResourceAssignment | S_Resource_ID / AssignDateFrom(必須) / AssignDateTo / Qty / IsConfirmed / Name(必須) | 確認済みは削除不可 |
erDiagram
S_ResourceType ||--o{ S_Resource : "type rules"
S_Resource ||--o{ S_ResourceUnAvailable : "unavailable periods"
S_Resource ||--o{ S_ResourceAssignment : "assignments"
S_Resource ||--|| M_Product : "auto-created product"
M_Product ||--o{ M_ProductPrice : "pricing"
M_Product ||--o{ M_Product_Acct : "accounting"
S_Resource }o--|| M_Warehouse : "service point"
ビジネスロジック
Section titled “ビジネスロジック”品目とのライフサイクル同期
Section titled “品目とのライフサイクル同期”flowchart TD
A["リソースを保存"] --> B{"新規?"}
B -->|Yes| C["検索キーが空なら<br/>名称をコピー"]
C --> D["MProduct を新規生成<br/>(リソースとタイプから)"]
D --> E["product.saveEx"]
B -->|No| F["製造リソースの検証"]
E --> F
F --> G{"製造リソース かつ Plant<br/>かつ 計画期間 <= 0?"}
G -->|Yes| H["AdempiereException"]
G -->|No| I["保存実行"]
I --> J["afterSave: product.setResource(this)<br/>変更があれば saveEx"]
J --> K["品目の名称・単位等が同期される"]
beforeSave()
if (newRecord){ if (getValue() == null || getValue().length() == 0) setValue(getName()); m_product = new MProduct(this, getResourceType()); m_product.saveEx(get_TrxName());}if (isManufacturingResource() && MANUFACTURINGRESOURCETYPE_Plant.equals(getManufacturingResourceType()) && getPlanningHorizon() <= 0){ throw new AdempiereException("@"+COLUMNNAME_PlanningHorizon+"@ <= @0@ !");}afterSave(): getProduct().setResource(this) が true(変更あり)を返した場合のみ品目を保存します。名称・数量単位などがリソース側の値で上書きされる仕組みです。
beforeDelete(): 品目のリソース参照(S_Resource_ID)を 0 にしてから品目を削除します。コメントにあるとおり、参照を外さないと MProduct.beforeSave() の検証で失敗するためです。
⚠️ 注意: リソースの削除は品目の削除を伴います。受注明細・請求明細から参照されている品目は削除できないため、その場合はリソースごと削除できません。無効化(
IsActive=N)で運用してください。
数量単位の委譲
Section titled “数量単位の委譲”public int getC_UOM_ID(){ return getProduct().getC_UOM_ID();}S_Resource は数量単位カラムを持たず、品目経由でリソースタイプの単位を参照します。単位を変えたい場合はリソースタイプ側で変更します。
稼働不可判定
Section titled “稼働不可判定”MResourceUnAvailable.isUnAvailable(I_S_Resource r, Timestamp dateTime)(static)と、インスタンスメソッド isUnAvailable(Timestamp) が提供されます。インスタンス側は日付を日単位に切り捨て(TimeUtil.trunc(..., TRUNC_DAY))、DateFrom より前でも DateTo より後でもなければ「稼働不可」と判定します。
beforeSave() は DateTo 未設定時に DateFrom をコピーし、DateFrom > DateTo の場合は log.saveError() で @DateTo@ > @DateFrom@ を返して保存を中止します。
アサインの削除制御
Section titled “アサインの削除制御”protected boolean beforeDelete (){ // Can't delete if assignment is confirm if (isConfirmed()) return false; return true;}拡張ポイント(カスタマイズ箇所)
Section titled “拡張ポイント(カスタマイズ箇所)”Callout
Section titled “Callout”S_Resource / S_ResourceUnAvailable / S_ResourceAssignment のカラムには Callout の登録がありません(AD_Column.Callout はすべて未設定)。
OSGi Model Validator(推奨)
Section titled “OSGi Model Validator(推奨)”public class CustomResourceValidator implements ModelValidator { @Override public int modelChange(PO po, int type) throws Exception { if (po instanceof MResourceAssignment && type == TYPE_BEFORE_NEW) { MResourceAssignment ra = (MResourceAssignment) po; // 例: 稼働不可期間と重なる予約を拒否する if (MResourceUnAvailable.isUnAvailable( MResource.get(ra.getCtx(), ra.getS_Resource_ID()), ra.getAssignDateFrom())) { throw new AdempiereException("この期間はリソースが稼働不可です"); } } return null; }}🔧 カスタマイズ:
MResource.get()はイミュータブルなインスタンスを返す場合があります。値を更新する処理ではMResource.getCopy(ctx, id, trxName)を使ってください。markImmutable()済みのオブジェクトへの setter 呼び出しは例外になります。
予約重複チェックの追加
Section titled “予約重複チェックの追加”S_ResourceType.IsSingleAssignment(重複アサインなし)はリソースタイプ側のフラグですが、MResourceAssignment に重複検証の実装はありません。ダブルブッキングを厳密に防ぐ場合は Model Validator で AssignDateFrom / AssignDateTo の重なりを検査する実装を追加します。
関連ドキュメント
Section titled “関連ドキュメント”iDempiereカスタマイズのご相談
Section titled “iDempiereカスタマイズのご相談”リソースは品目と密結合し、予約の重複チェックはコアに実装されていません。会議室予約・要員アサインなどを実運用するには、稼働不可期間との突合や重複防止の実装が有効です。
As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。