コンテンツにスキップ

iDempiere リソースタイプの使い方|取引先管理 操作マニュアル・技術仕様

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

リソースタイプは、リソースマスタの分類であると同時に、そのリソースがいつ使えるか(稼働時間帯・稼働曜日)を決める設定です。ここで定義した時間帯と曜日から、リソースの可用時間が算出されます。

📌 ポイント: 数量単位・品目カテゴリ・税カテゴリはリソースタイプで指定します。リソースを登録すると自動生成される品目に、これらの値がそのまま引き継がれます。リソースを作る前にリソースタイプを整備しておくのが正しい手順です。

  • リソースの分類定義(会議室・機材・要員など)
  • 稼働時間帯の指定(時間指定 + 開始時間 / 終了時間
  • 稼働曜日の指定(曜日指定 + 日曜〜土曜の各フラグ)
  • 重複アサイン(ダブルブッキング)の禁止設定
  • 数量単位と小数点入力可否の指定
  • 品目カテゴリ・税カテゴリの既定値指定(自動生成される品目へ引き継ぎ)
  • 課金対象数量(計量単位小数点入力許可 と併用)の定義

リソースタイプは1タブ構成のシンプルなマスタです。

タブ名テーブル項目数役割
リソースタイプS_ResourceType23項目分類・稼働ルール・品目既定値

💡 ヒント: 曜日フラグ(月〜木・金)は既定で Y、土日は既定で N です。平日稼働のリソースであれば、曜日指定 にチェックを入れるだけで意図した設定になります。

graph TD
    A["🚀 メニューから開く<br/>取引先管理 > サービス > リソースタイプ"] --> B["➕ 新規で基本情報を入力<br/>(検索キー・名称)"]
    B --> C["📏 数量単位を選択<br/>(時間・日など)"]
    C --> D["📦 品目カテゴリ・税カテゴリを選択<br/>(品目へ引き継がれる)"]
    D --> E{稼働時間帯を<br/>決めるか}
    E -->|決める| F["⏰ 時間指定にチェック<br/>開始時間・終了時間を入力(必須)"]
    E -->|終日利用可| G["時間指定のチェックを外す"]
    F --> H{稼働曜日を<br/>決めるか}
    G --> H
    H -->|決める| I["📅 曜日指定にチェック<br/>稼働する曜日を選択"]
    H -->|毎日利用可| J["曜日指定のチェックを外す"]
    I --> K{ダブルブッキングを<br/>禁止するか}
    J --> K
    K -->|禁止| L["🔒 重複アサインなしにチェック"]
    K -->|許可| M["💾 保存"]
    L --> M
    M --> N["🏢 リソースマスタで<br/>このタイプを選択して登録"]

メニューから開く 取引先管理 > サービス > リソースタイプ 新規で基本情報を入力 (検索キー・名称) 数量単位を選択 (時間・日など) 品目カテゴリ・税カテゴリを選択 (品目へ引き継がれる) ⏰ 時間指定にチェック 開始時間・終了時間を入力(必須) 時間指定のチェックを外す 曜日指定にチェック 稼働する曜日を選択 曜日指定のチェックを外す 重複アサインなしにチェック 保存 リソースマスタで このタイプを選択して登録 稼働時間帯を 決めるか 稼働曜日を 決めるか ダブルブッキングを 禁止するか 決める 終日利用可 毎日利用可 禁止 許可

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

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

メニューから「取引先管理 > サービス > リソースタイプ」を開きます。

新規登録(必須項目ベースの手順)

Section titled “新規登録(必須項目ベースの手順)”
  1. ツールバーの「新規」ボタンをクリック
  2. 必須項目を入力:
    • 検索キー: タイプコード(40文字以内)
    • 名称: タイプ名(60文字以内、例: 会議室
    • 数量単位: 予約の単位(時間・日など)
    • 品目カテゴリ: 自動生成される品目のカテゴリ
    • 税カテゴリ: 自動生成される品目の税カテゴリ
    • 計量単位小数点入力許可: 小数を許すか(既定 N)
    • 重複アサインなし / 時間指定 / 曜日指定: 稼働ルールのフラグ
  3. 時間指定にチェックを入れた場合は、開始時間終了時間を必ず入力
  4. 曜日指定にチェックを入れた場合は、稼働する曜日にチェック
  5. 保存」をクリック

⚠️ 注意: 「時間指定」にチェックを入れたまま開始時間・終了時間を空欄にすると、必須入力エラーになります。また 開始時間 ≧ 終了時間 の設定も保存時に拒否されます(@TimeSlotStart@ > @TimeSlotEnd@)。日をまたぐ稼働時間帯(例: 22:00〜翌6:00)は標準では表現できません。

リソースタイプを更新して保存すると、そのタイプに属するすべてのリソースの品目情報が自動的に再同期されます(新規作成時は対象なし)。数量単位やカテゴリを変更した場合、リソース側の操作なしで品目に反映されます。

項目名必須説明
クライアント必須選択テナント
組織必須選択組織
検索キー必須文字列(40)タイプコード
名称必須文字列(60)タイプ名
説明-文字列(255)補足説明
有効必須チェックレコードが有効か(既定 Y)
数量単位必須選択予約・課金の単位
計量単位小数点入力許可必須チェック小数の入力を許すか(既定 N)
品目カテゴリ必須選択生成される品目のカテゴリ
税カテゴリ必須選択生成される品目の税カテゴリ
重複アサインなし必須チェック同時に1件しか割り当てない
時間指定必須チェック稼働時間帯を設定するか
開始時間-時刻稼働開始時刻(時間指定時は必須)
終了時間-時刻稼働終了時刻(時間指定時は必須)
曜日指定必須チェック稼働曜日を設定するか
日曜日必須チェック日曜に稼働するか(既定 N)
月曜日〜金曜日必須チェック各曜日に稼働するか(既定 Y)
土曜日必須チェック土曜に稼働するか(既定 N)

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

Q. 「時間指定」を使わないとどうなりますか?

Section titled “Q. 「時間指定」を使わないとどうなりますか?”

時間指定IsTimeSlot)のチェックを外すと、時間帯による制限がない扱いになります。可用時間の算出では、時間帯が未指定の場合に24時間分として扱われます。日単位でしか予約しないリソースであればチェック不要です。

Q. 「曜日指定」を使わないとどうなりますか?

Section titled “Q. 「曜日指定」を使わないとどうなりますか?”

曜日指定IsDateSlot)が外れている場合、MResourceType.isDayAvailable()曜日を問わず常に true を返します(レコードが有効である限り)。土日祝を含めて毎日稼働するリソースに使います。

Q. 「重複アサインなし」にチェックすると予約が自動でブロックされますか?

Section titled “Q. 「重複アサインなし」にチェックすると予約が自動でブロックされますか?”

いいえ。IsSingleAssignment はフラグとして保持されますが、MResourceAssignment に重複検証の実装はありません。ダブルブッキングを確実に防ぐには Model Validator などによる実装追加が必要です(技術仕様参照)。

Q. 稼働時間帯を変更したら、既存の予約はどうなりますか?

Section titled “Q. 稼働時間帯を変更したら、既存の予約はどうなりますか?”

既存の S_ResourceAssignment レコードは変更されません。リソースタイプの更新で自動的に再同期されるのは品目情報のみです。稼働時間帯外の予約が残る可能性があるため、変更後に予約状況の棚卸しを行ってください。

Q. 22時から翌6時までの夜間稼働を設定できますか?

Section titled “Q. 22時から翌6時までの夜間稼働を設定できますか?”

標準では設定できません。beforeSave()開始時間 < 終了時間 を強制するため、日をまたぐ時間帯は保存できません。夜間帯を扱う場合は、時間指定を使わずに運用するか、カスタマイズが必要です。

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

リソースタイプは S_ResourceType テーブル(アクセスレベル 3 = クライアント/組織、削除可)に格納されます。モデルクラスは MResourceType(407行)で、ImmutablePOSupport を実装します。稼働時間帯・稼働曜日の検証に加え、可用時間を算出するユーティリティ群(日の開始/終了時刻、1日の所要ミリ秒、時間帯の時間数、週あたりの稼働日数)を提供する点が特徴です。Document 型ではありません。

classDiagram
    class MResourceType {
        +get(ctx, S_ResourceType_ID) MResourceType
        +getCopy(ctx, id, trxName) MResourceType
        +beforeSave(boolean) boolean
        +afterSave(boolean, boolean) boolean
        +getDayStart(Timestamp) Timestamp
        +getDayEnd(Timestamp) Timestamp
        +getDayDurationMillis() long
        +getTimeSlotHours() int
        +getAvailableDaysWeek() int
        +isDayAvailable(Timestamp) boolean
        +isAvailable() boolean
        +markImmutable() MResourceType
    }
    class X_S_ResourceType {
        <<generated>>
    }
    class ImmutablePOSupport {
        <<interface>>
    }
    class PO {
        <<abstract>>
    }
    MResourceType --|> X_S_ResourceType
    X_S_ResourceType --|> PO
    MResourceType ..|> ImmutablePOSupport
    MResourceType --> MResource : classifies
    MResourceType --> MProduct : syncs product info

+get(ctx, S_ResourceType_ID) MResourceType +getCopy(ctx, id, trxName) MResourceType +beforeSave(boolean) boolean +afterSave(boolean, boolean) boolean +getDayStart(Timestamp) Timestamp +getDayEnd(Timestamp) Timestamp +getDayDurationMillis() long +getTimeSlotHours() int +getAvailableDaysWeek() int +isDayAvailable(Timestamp) boolean +isAvailable() boolean +markImmutable() MResourceType <> <> <> > X_S_ResourceType X_S_ResourceType --

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

カラム名必須説明備考
S_ResourceType_IDIDPKリソースタイプID主キー
S_ResourceType_UUUUID(36)NUUID
AD_Client_IDTable DirectYクライアント既定 @#AD_Client_ID@
AD_Org_IDTable DirectY組織既定 @#AD_Org_ID@
ValueString(40)Y検索キー
NameString(60)Y名称
DescriptionString(255)N説明
IsActiveYes-NoY有効既定 Y
C_UOM_IDTable DirectY数量単位品目へ引き継ぎ
AllowUoMFractionsYes-NoY計量単位小数点入力許可既定 N
M_Product_Category_IDTable DirectY品目カテゴリ品目へ引き継ぎ
C_TaxCategory_IDTable DirectY税カテゴリ品目へ引き継ぎ
IsSingleAssignmentYes-NoY重複アサインなしフラグのみ・検証未実装
IsTimeSlotYes-NoY時間指定
TimeSlotStartTimeN開始時間時間指定時は必須
TimeSlotEndTimeN終了時間時間指定時は必須
IsDateSlotYes-NoY曜日指定
OnSundayYes-NoY日曜日既定 N
OnMonday〜OnThursdayYes-NoY月〜木曜日既定 Y
OnFridayYes-NoY金曜日既定 Y
OnSaturdayYes-NoY土曜日既定 N
ChargeableQtyIntegerN課金数量
erDiagram
    S_ResourceType ||--o{ S_Resource : "classifies"
    S_ResourceType }o--|| C_UOM : "unit of measure"
    S_ResourceType }o--|| M_Product_Category : "product category"
    S_ResourceType }o--|| C_TaxCategory : "tax category"
    S_Resource ||--|| M_Product : "auto-created product"

unit of measure product category tax category auto-created product

protected boolean beforeSave(boolean newRecord)
{
// Validate TimeSlotEnd > TimeSlotStart and both is fill
if (isTimeSlot())
{
Timestamp start = getTimeSlotStart();
if (start == null) throw new FillMandatoryException(COLUMNNAME_TimeSlotStart);
Timestamp end = getTimeSlotEnd();
if (end == null) throw new FillMandatoryException(COLUMNNAME_TimeSlotEnd);
if (start.compareTo(end) >= 0)
throw new AdempiereException("@TimeSlotStart@ > @TimeSlotEnd@");
}
return true;
}
  • 時間指定 が有効なときのみ検証が走ります
  • 開始・終了のどちらが欠けても FillMandatoryException
  • 開始 ≧ 終了は例外。日跨ぎの時間帯は表現できません

afterSave() — 配下リソースの品目再同期

Section titled “afterSave() — 配下リソースの品目再同期”
if (!newRecord)
{
MProduct[] products = MProduct.get(getCtx(), "S_Resource_ID IN "
+ "(SELECT S_Resource_ID FROM S_Resource WHERE S_ResourceType_ID="
+ getS_ResourceType_ID() + ")", get_TrxName());
for (MProduct product : products) {
if (product.setResource(this))
product.saveEx(get_TrxName());
}
}

更新時のみnewRecord=false)、このタイプに属する全リソースの品目を再同期します。リソース数が多いタイプの更新は、その分だけ品目の更新が走る点に注意してください。

⚠️ 注意: リソースタイプの更新は配下の品目を一括更新します。多数のリソースを抱えるタイプで数量単位やカテゴリを変更すると、大量の M_Product 更新が同一トランザクションで発生します。本番環境では業務時間外の実施を推奨します。

可用時間の算出ユーティリティ

Section titled “可用時間の算出ユーティリティ”
メソッド返却内容
getDayStart(Timestamp date)指定日の稼働開始時刻
getDayEnd(Timestamp date)指定日の稼働終了時刻
getDayDurationMillis()1日あたりの稼働時間(ミリ秒)
getTimeSlotHours()時間帯の時間数
getAvailableDaysWeek()週あたりの稼働日数
isDayAvailable(Timestamp)指定日時の曜日が稼働日か
isAvailable()このタイプのリソースが一般に利用可能か

isDayAvailable() の判定順序:

  1. IsActive=N なら false
  2. IsDateSlot=N なら true(曜日制限なし)
  3. Calendar.DAY_OF_WEEK に対応する曜日フラグ(OnSundayOnSaturday)の値を返す

isAvailable() は「有効であり、かつ稼働日が1日以上あり、かつ稼働時間が1時間以上ある」ことを判定します。

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

Section titled “拡張ポイント(カスタマイズ箇所)”

S_ResourceType のカラムには Callout の登録がありませんAD_Column.Callout はすべて未設定)。「時間指定」チェック時に開始・終了時間を必須表示にするなどの動的挙動が必要なら、独自 Callout を登録します。

public class CustomResourceTypeValidator implements ModelValidator {
@Override
public int modelChange(PO po, int type) throws Exception {
if (po instanceof MResourceType && (type == TYPE_BEFORE_NEW || type == TYPE_BEFORE_CHANGE)) {
MResourceType rt = (MResourceType) po;
// 例: 曜日指定ありなのに全曜日オフを禁止
if (rt.isDateSlot() && rt.getAvailableDaysWeek() == 0) {
throw new AdempiereException("稼働する曜日を1日以上選択してください");
}
}
return null;
}
}

重複アサイン(ダブルブッキング)の実装

Section titled “重複アサイン(ダブルブッキング)の実装”

IsSingleAssignment はコアで検証されないフラグです。実効性を持たせるには、S_ResourceAssignmentTYPE_BEFORE_NEW / TYPE_BEFORE_CHANGE で、同一リソースの既存アサインと AssignDateFromAssignDateTo の重なりを検査し、isSingleAssignment() が true なら例外を投げる実装を追加します。あわせて MResourceType.isDayAvailable()MResourceUnAvailable.isUnAvailable() を併用すると、稼働曜日外・稼働不可期間の予約も同時に弾けます。

🔧 カスタマイズ: MResourceType.get() はイミュータブルなインスタンスを返す場合があります。更新処理では MResourceType.getCopy(ctx, id, trxName) を使用してください。

beforeSave() が開始 ≧ 終了を拒否するため、夜勤帯などを表現するには「日跨ぎを2つのリソースタイプに分割する」運用回避か、MResourceType を継承した独自 M クラスを IModelFactory で登録する実装が必要です。


リソースタイプは稼働ルールの起点ですが、重複アサインの禁止や日跨ぎ稼働はコアでは実装されていません。会議室・要員の予約運用に必要な検証ロジックの追加をご相談いただけます。

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

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