iDempiere リソースタイプの使い方|取引先管理 操作マニュアル・技術仕様
This content is not available in your language yet.
📖 取引先管理の全体像: 取引先管理の全体図 も合わせてご覧ください。
リソースタイプは、リソースマスタの分類であると同時に、そのリソースがいつ使えるか(稼働時間帯・稼働曜日)を決める設定です。ここで定義した時間帯と曜日から、リソースの可用時間が算出されます。
📌 ポイント: 数量単位・品目カテゴリ・税カテゴリはリソースタイプで指定します。リソースを登録すると自動生成される品目に、これらの値がそのまま引き継がれます。リソースを作る前にリソースタイプを整備しておくのが正しい手順です。
リソースタイプでできること
Section titled “リソースタイプでできること”- リソースの分類定義(会議室・機材・要員など)
- 稼働時間帯の指定(
時間指定+開始時間/終了時間) - 稼働曜日の指定(
曜日指定+ 日曜〜土曜の各フラグ) - 重複アサイン(ダブルブッキング)の禁止設定
- 数量単位と小数点入力可否の指定
- 品目カテゴリ・税カテゴリの既定値指定(自動生成される品目へ引き継ぎ)
- 課金対象数量(
計量単位小数点入力許可と併用)の定義
リソースタイプは1タブ構成のシンプルなマスタです。
| タブ名 | テーブル | 項目数 | 役割 |
|---|---|---|---|
| リソースタイプ | S_ResourceType | 23項目 | 分類・稼働ルール・品目既定値 |
💡 ヒント: 曜日フラグ(月〜木・金)は既定で
Y、土日は既定でNです。平日稼働のリソースであれば、曜日指定にチェックを入れるだけで意図した設定になります。
基本操作手順
Section titled “基本操作手順”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 “新規登録(必須項目ベースの手順)”- ツールバーの「新規」ボタンをクリック
- 必須項目を入力:
- 検索キー: タイプコード(40文字以内)
- 名称: タイプ名(60文字以内、例:
会議室) - 数量単位: 予約の単位(時間・日など)
- 品目カテゴリ: 自動生成される品目のカテゴリ
- 税カテゴリ: 自動生成される品目の税カテゴリ
- 計量単位小数点入力許可: 小数を許すか(既定 N)
- 重複アサインなし / 時間指定 / 曜日指定: 稼働ルールのフラグ
- 時間指定にチェックを入れた場合は、開始時間と終了時間を必ず入力
- 曜日指定にチェックを入れた場合は、稼働する曜日にチェック
- 「保存」をクリック
⚠️ 注意: 「時間指定」にチェックを入れたまま開始時間・終了時間を空欄にすると、必須入力エラーになります。また 開始時間 ≧ 終了時間 の設定も保存時に拒否されます(
@TimeSlotStart@ > @TimeSlotEnd@)。日をまたぐ稼働時間帯(例: 22:00〜翌6:00)は標準では表現できません。
既存リソースへの反映
Section titled “既存リソースへの反映”リソースタイプを更新して保存すると、そのタイプに属するすべてのリソースの品目情報が自動的に再同期されます(新規作成時は対象なし)。数量単位やカテゴリを変更した場合、リソース側の操作なしで品目に反映されます。
項目リファレンス
Section titled “項目リファレンス”リソースタイプタブ
Section titled “リソースタイプタブ”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| クライアント | 必須 | 選択 | テナント |
| 組織 | 必須 | 選択 | 組織 |
| 検索キー | 必須 | 文字列(40) | タイプコード |
| 名称 | 必須 | 文字列(60) | タイプ名 |
| 説明 | - | 文字列(255) | 補足説明 |
| 有効 | 必須 | チェック | レコードが有効か(既定 Y) |
| 数量単位 | 必須 | 選択 | 予約・課金の単位 |
| 計量単位小数点入力許可 | 必須 | チェック | 小数の入力を許すか(既定 N) |
| 品目カテゴリ | 必須 | 選択 | 生成される品目のカテゴリ |
| 税カテゴリ | 必須 | 選択 | 生成される品目の税カテゴリ |
| 重複アサインなし | 必須 | チェック | 同時に1件しか割り当てない |
| 時間指定 | 必須 | チェック | 稼働時間帯を設定するか |
| 開始時間 | - | 時刻 | 稼働開始時刻(時間指定時は必須) |
| 終了時間 | - | 時刻 | 稼働終了時刻(時間指定時は必須) |
| 曜日指定 | 必須 | チェック | 稼働曜日を設定するか |
| 日曜日 | 必須 | チェック | 日曜に稼働するか(既定 N) |
| 月曜日〜金曜日 | 必須 | チェック | 各曜日に稼働するか(既定 Y) |
| 土曜日 | 必須 | チェック | 土曜に稼働するか(既定 N) |
よくある質問(FAQ)
Section titled “よくある質問(FAQ)”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 型ではありません。
アーキテクチャ概要
Section titled “アーキテクチャ概要”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
パッケージ: org.compiere.model
ソースファイル: org.adempiere.base/src/org/compiere/model/MResourceType.java
関連DBテーブル
Section titled “関連DBテーブル”S_ResourceType(リソースタイプ)
Section titled “S_ResourceType(リソースタイプ)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| S_ResourceType_ID | ID | PK | リソースタイプID | 主キー |
| S_ResourceType_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 | String(60) | Y | 名称 | |
| Description | String(255) | N | 説明 | |
| IsActive | Yes-No | Y | 有効 | 既定 Y |
| C_UOM_ID | Table Direct | Y | 数量単位 | 品目へ引き継ぎ |
| AllowUoMFractions | Yes-No | Y | 計量単位小数点入力許可 | 既定 N |
| M_Product_Category_ID | Table Direct | Y | 品目カテゴリ | 品目へ引き継ぎ |
| C_TaxCategory_ID | Table Direct | Y | 税カテゴリ | 品目へ引き継ぎ |
| IsSingleAssignment | Yes-No | Y | 重複アサインなし | フラグのみ・検証未実装 |
| IsTimeSlot | Yes-No | Y | 時間指定 | |
| TimeSlotStart | Time | N | 開始時間 | 時間指定時は必須 |
| TimeSlotEnd | Time | N | 終了時間 | 時間指定時は必須 |
| IsDateSlot | Yes-No | Y | 曜日指定 | |
| OnSunday | Yes-No | Y | 日曜日 | 既定 N |
| OnMonday〜OnThursday | Yes-No | Y | 月〜木曜日 | 既定 Y |
| OnFriday | Yes-No | Y | 金曜日 | 既定 Y |
| OnSaturday | Yes-No | Y | 土曜日 | 既定 N |
| ChargeableQty | Integer | N | 課金数量 |
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"
ビジネスロジック
Section titled “ビジネスロジック”beforeSave() — 時間帯の検証
Section titled “beforeSave() — 時間帯の検証”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() の判定順序:
IsActive=Nなら falseIsDateSlot=Nなら true(曜日制限なし)Calendar.DAY_OF_WEEKに対応する曜日フラグ(OnSunday〜OnSaturday)の値を返す
isAvailable() は「有効であり、かつ稼働日が1日以上あり、かつ稼働時間が1時間以上ある」ことを判定します。
拡張ポイント(カスタマイズ箇所)
Section titled “拡張ポイント(カスタマイズ箇所)”Callout
Section titled “Callout”S_ResourceType のカラムには Callout の登録がありません(AD_Column.Callout はすべて未設定)。「時間指定」チェック時に開始・終了時間を必須表示にするなどの動的挙動が必要なら、独自 Callout を登録します。
OSGi Model Validator(推奨)
Section titled “OSGi Model Validator(推奨)”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_ResourceAssignment の TYPE_BEFORE_NEW / TYPE_BEFORE_CHANGE で、同一リソースの既存アサインと AssignDateFrom〜AssignDateTo の重なりを検査し、isSingleAssignment() が true なら例外を投げる実装を追加します。あわせて MResourceType.isDayAvailable() と MResourceUnAvailable.isUnAvailable() を併用すると、稼働曜日外・稼働不可期間の予約も同時に弾けます。
🔧 カスタマイズ:
MResourceType.get()はイミュータブルなインスタンスを返す場合があります。更新処理ではMResourceType.getCopy(ctx, id, trxName)を使用してください。
日跨ぎ時間帯への対応
Section titled “日跨ぎ時間帯への対応”beforeSave() が開始 ≧ 終了を拒否するため、夜勤帯などを表現するには「日跨ぎを2つのリソースタイプに分割する」運用回避か、MResourceType を継承した独自 M クラスを IModelFactory で登録する実装が必要です。
関連ドキュメント
Section titled “関連ドキュメント”iDempiereカスタマイズのご相談
Section titled “iDempiereカスタマイズのご相談”リソースタイプは稼働ルールの起点ですが、重複アサインの禁止や日跨ぎ稼働はコアでは実装されていません。会議室・要員の予約運用に必要な検証ロジックの追加をご相談いただけます。
As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。