iDempiere 関心トピックの使い方|取引先管理 操作マニュアル・技術仕様
📖 取引先管理の全体像: 取引先管理の全体図 も合わせてご覧ください。
関心トピック(Interest Area)は、連絡先がどの話題に興味を持っているかを登録し、購読(Subscribe)と配信停止(Opt-out)を記録するマスタです。メールマガジンや営業活動(キャンペーン)の配信対象を絞り込むための基礎データになります。
📌 ポイント: 購読状態は「有効フラグ(
IsActive)が ON」かつ「解除日付(OptOutDate)が未設定」のときだけ購読中と判定されます(MContactInterest.isSubscribed())。解除日付が入っている連絡先は、有効フラグが ON でも配信対象外です。
関心トピックでできること
Section titled “関心トピックでできること”- 話題・分野ごとの関心トピックを定義する(例: 新製品情報、セミナー案内)
- 連絡先ごとの購読状況を「購読者」タブで管理する
- 購読日付(
SubscribeDate)と解除日付(OptOutDate)を記録し、オプトアウトの証跡を残す - セルフサービス(Web 経由での購読・解除)の可否をトピック単位で制御する
- LDAP プロセッサ経由の外部システム認証ログを、トピックに紐付けて確認する
- 営業活動(キャンペーン)の配信対象抽出に利用する
親タブ 1 つと子タブ 2 つの構成です。
| タブ名 | テーブル | 項目数 | 役割 |
|---|---|---|---|
| 関心トピック | R_InterestArea | 7項目 | トピックの基本定義(検索キー・名称・セルフサービス) |
| 購読者 | R_ContactInterest | 7項目 | 連絡先ごとの購読状態(購読日付・解除日付) |
| LDAPアクセス | AD_LdapAccess | 9項目 | LDAP プロセッサ経由のアクセスログ(読み取り用) |
💡 ヒント: 「LDAPアクセス」タブは、iDempiere を LDAP サーバとして外部システムの認証に使う場合のログ表示です。メールマーケティング目的だけで使う場合は参照する必要はありません。
基本操作手順
Section titled “基本操作手順”graph TD
A["🚀 メニューから開く<br/>取引先管理 > リクエスト管理 > 関心トピック"] --> B["➕ 新規でトピックを作成<br/>(検索キー・名称)"]
B --> C{"Web から購読させるか"}
C -->|させる| D["✅ セルフサービスを ON"]
C -->|社内管理のみ| E["⬜ セルフサービスを OFF"]
D --> F["💾 保存"]
E --> F
F --> G["👥 購読者タブで<br/>連絡先を追加"]
G --> H["📅 購読日付を設定<br/>(購読開始)"]
H --> I{"配信停止の申し出"}
I -->|あり| J["🚫 解除日付を設定<br/>(以後は配信対象外)"]
I -->|なし| K["📧 キャンペーン配信対象として利用"]
アクセス方法(メニューパス)
Section titled “アクセス方法(メニューパス)”メニューから「取引先管理 > リクエスト管理 > 関心トピック」を開きます(AD_Window_ID: 245)。
新規登録の手順
Section titled “新規登録の手順”- ツールバーの「新規」ボタンをクリックします
- 基本情報を入力します
- 検索キー(
Value): トピックコード(一意)— 必須、最大40文字 - 名称(
Name): トピック名(例:新製品情報)— 必須、最大60文字 - 説明: 用途の補足(最大255文字)
- セルフサービス: Web から購読・解除させる場合はチェック(既定 ON)
- 検索キー(
- 「保存」をクリックします
購読者の登録
Section titled “購読者の登録”- 「購読者」タブに移動します
- 「新規」をクリックし、以下を入力します
- ユーザー(
AD_User_ID): 購読する連絡先 — 必須 - 購読日付(
SubscribeDate): 購読開始日 - 解除日付(
OptOutDate): 配信停止日(購読中は空欄のまま)
- ユーザー(
- 「保存」をクリックします
配信停止(オプトアウト)の記録
Section titled “配信停止(オプトアウト)の記録”配信停止の申し出があった場合は、該当の購読者レコードに解除日付を入力して保存します。これにより isSubscribed() が false を返し、以後の配信対象から除外されます。レコード自体は削除せず残すことで、停止申し出があった事実の証跡になります。
⚠️ 注意:
MContactInterest.setSubscribeDate()は、購読日付をセットする際に解除日付を自動的に null に戻し、有効フラグを ON にします。再購読の処理では解除日付が消える点に注意してください。
項目リファレンス
Section titled “項目リファレンス”関心トピックタブ
Section titled “関心トピックタブ”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| 検索キー | 必須 | 文字列(40) | トピックの一意コード |
| 名称 | 必須 | 文字列(60) | トピック名 |
| 説明 | - | 文字列(255) | 補足説明 |
| セルフサービス | 必須 | チェック | Web からの購読・解除を許可(既定 Y) |
| 有効 | 必須 | チェック | レコードが有効か(既定 Y) |
| クライアント | 必須 | 選択 | テナント |
| 組織 | 必須 | 選択 | 組織 |
| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| 関心トピック | 必須 | 選択 | 親のトピック |
| ユーザー | 必須 | 選択 | 購読する連絡先(既定 @AD_User_ID@) |
| 購読日付 | - | 日付 | 購読を開始した日 |
| 解除日付 | - | 日付 | 配信停止を申し出た日 |
| 有効 | 必須 | チェック | レコードが有効か(既定 Y) |
LDAPアクセスタブ(読み取り)
Section titled “LDAPアクセスタブ(読み取り)”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| LDAPプロセッサ | 必須 | 選択 | 認証を行った LDAP プロセッサ |
| ユーザー | - | 選択 | 認証対象のユーザー |
| 関心トピック | - | 選択 | 認可判定に使われたトピック |
| 作成日 | 必須 | 日時 | アクセス日時 |
| エラー有無 | 必須 | チェック | 実行時にエラーが発生したか |
| サマリ | - | テキスト | 処理結果の要約 |
| 説明 | - | 文字列 | 補足 |
購読状態の判定ロジック
Section titled “購読状態の判定ロジック”graph TD
A["R_ContactInterest レコード"] --> B{"IsActive = Y ?"}
B -->|No| C["購読していない"]
B -->|Yes| D{"OptOutDate が null ?"}
D -->|No| C
D -->|Yes| E["購読中<br/>(配信対象)"]
よくある質問(FAQ)
Section titled “よくある質問(FAQ)”Q. 購読者レコードはあるのに配信対象になりません
Section titled “Q. 購読者レコードはあるのに配信対象になりません”MContactInterest.isSubscribed() は「有効フラグが ON」かつ「解除日付(OptOutDate)が null」の両方を満たす場合のみ true を返します。解除日付が入っていないか、有効フラグが外れていないかを確認してください。
Q. 一度配信停止した連絡先を再購読させるには?
Section titled “Q. 一度配信停止した連絡先を再購読させるには?”購読者レコードの購読日付を設定し直します。setSubscribeDate() は内部で解除日付を null にクリアし、有効フラグを ON に戻すため、これだけで再購読状態になります。プログラムからは MContactInterest.subscribe() を呼ぶことでも同じ結果になります。
Q. 購読者レコードは削除すべきですか?
Section titled “Q. 購読者レコードは削除すべきですか?”削除は推奨しません。解除日付を入れて残すことで「いつ配信停止の申し出があったか」の証跡になります。レコードを削除すると、再度うっかり配信対象に加えてしまうリスクがあります。
Q. 「セルフサービス」を OFF にするとどうなりますか?
Section titled “Q. 「セルフサービス」を OFF にするとどうなりますか?”Web(セルフサービス)画面からユーザーが自分でこのトピックを購読・解除できなくなります。社内担当者が iDempiere 上で管理するトピックには OFF を設定します。
Q. 存在しない購読レコードを参照するとどうなりますか?
Section titled “Q. 存在しない購読レコードを参照するとどうなりますか?”MInterestArea.setSubscriptionInfo(AD_User_ID) は、対象連絡先の購読レコードが無い場合に MContactInterest.get() を経由して非アクティブな MContactInterest を生成します。この状態では isSubscribed() が false を返すため、未購読として扱われます。
Q. LDAPアクセスタブは何を記録していますか?
Section titled “Q. LDAPアクセスタブは何を記録していますか?”iDempiere を LDAP サーバとして動作させた際の認証・認可ログ(AD_LdapAccess)です。どの LDAP プロセッサでどのユーザーが認証を試み、エラーが起きたかを確認できます。関心トピックは LDAP のグループ(認可単位)として使われる場合があり、その紐付けがこのタブに現れます。
🛠 技術仕様(開発者向け)
関心トピックはマスタデータ型のウィンドウ(AD_Window_ID: 245)で、親テーブル R_InterestArea(アクセスレベル 2 = クライアントのみ)と、子テーブル R_ContactInterest(アクセスレベル 3)・AD_LdapAccess(アクセスレベル 7)から構成されます。ロジックは MInterestArea(296行)と MContactInterest(257行)が担当し、購読状態の判定を MContactInterest.isSubscribed() に集約しています。AD_LdapAccess は MLdapAccess(66行)で扱われる軽量なログテーブルです。いずれも Document 型ではありません。
アーキテクチャ概要
Section titled “アーキテクチャ概要”classDiagram
class MInterestArea {
+getAll(ctx)$ MInterestArea[]
+get(ctx, R_InterestArea_ID)$ MInterestArea
+setSubscriptionInfo(int) void
+setAD_User_ID(int) void
+getAD_User_ID() int
+getSubscribeDate() Timestamp
+getOptOutDate() Timestamp
+isSubscribed() boolean
+markImmutable() MInterestArea
}
class MContactInterest {
+get(ctx, ...)$ MContactInterest
+subscribe() void
+subscribe(boolean) void
+unsubscribe() void
+isOptOut() boolean
+isSubscribed() boolean
+setSubscribeDate(Timestamp) void
+setOptOutDate(Timestamp) void
}
class MLdapAccess {
}
class PO {
<<abstract>>
}
class X_R_InterestArea {
<<generated>>
}
class X_R_ContactInterest {
<<generated>>
}
MInterestArea --|> X_R_InterestArea
MContactInterest --|> X_R_ContactInterest
X_R_InterestArea --|> PO
X_R_ContactInterest --|> PO
MInterestArea --> MContactInterest : delegates subscription
MLdapAccess --> MInterestArea : logs access
パッケージ: org.compiere.model
ソースファイル: org.adempiere.base/src/org/compiere/model/MInterestArea.java / MContactInterest.java / MLdapAccess.java
関連DBテーブル
Section titled “関連DBテーブル”R_InterestArea(関心トピック)
Section titled “R_InterestArea(関心トピック)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| R_InterestArea_ID | ID | PK | 関心トピックID | 主キー |
| AD_Client_ID | TableDirect | Y | クライアント | 既定 @#AD_Client_ID@ |
| AD_Org_ID | TableDirect | Y | 組織 | 既定 @#AD_Org_ID@ |
| Value | String(40) | Y | 検索キー | 一意コード |
| Name | String(60) | Y | 名称 | |
| Description | String(255) | N | 説明 | |
| IsSelfService | YesNo | Y | セルフサービス | 既定 Y |
| IsActive | YesNo | Y | 有効 | 既定 Y |
| R_InterestArea_UU | UUID(36) | N | UUID |
R_ContactInterest(購読者)
Section titled “R_ContactInterest(購読者)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| R_InterestArea_ID | TableDirect | Y | 関心トピックFK | 複合キーの一部 |
| AD_User_ID | TableDirect | Y | ユーザー(連絡先) | 既定 @AD_User_ID@ |
| SubscribeDate | Date | N | 購読日付 | セット時に OptOutDate をクリア |
| OptOutDate | Date | N | 解除日付 | null なら購読中 |
| AD_Client_ID | TableDirect | Y | クライアント | 既定 @AD_Client_ID@ |
| AD_Org_ID | TableDirect | Y | 組織 | 既定 0 |
| IsActive | YesNo | Y | 有効 | 既定 Y |
| R_ContactInterest_UU | UUID(36) | N | UUID |
AD_LdapAccess(LDAPアクセスログ)
Section titled “AD_LdapAccess(LDAPアクセスログ)”| カラム名 | 型 | 必須 | 説明 |
|---|---|---|---|
| AD_LdapAccess_ID | ID | PK | アクセスログID |
| AD_LdapProcessor_ID | TableDirect | Y | LDAP プロセッサ |
| AD_User_ID | TableDirect | N | 認証対象ユーザー |
| R_InterestArea_ID | TableDirect | N | 認可判定に使うトピック |
| IsError | YesNo | Y | エラー発生有無 |
| Summary | Text | N | 処理結果の要約 |
| Description | String | N | 補足 |
| Created | Date+Time | Y | 作成日時(既定 SYSDATE) |
erDiagram
R_InterestArea ||--o{ R_ContactInterest : "subscribers"
R_InterestArea ||--o{ AD_LdapAccess : "ldap group"
R_ContactInterest }o--|| AD_User : "contact"
AD_LdapAccess }o--|| AD_LdapProcessor : "processor"
AD_User }o--o| C_BPartner : "bp contact"
ビジネスロジック
Section titled “ビジネスロジック”購読状態の判定(MContactInterest)
Section titled “購読状態の判定(MContactInterest)”public boolean isSubscribed(){ return isActive() && getOptOutDate() == null;}有効フラグと解除日付の 2 条件のみで判定します。購読日付(SubscribeDate)は判定に使われず、記録用の値です。
購読・解除の副作用
Section titled “購読・解除の副作用”flowchart TD
A["subscribe()"] --> B["setSubscribeDate(null)"]
B --> C["null なら現在時刻を採用"]
C --> D["super.setSubscribeDate"]
D --> E["super.setOptOutDate(null)<br/>解除日付をクリア"]
E --> F["setIsActive(true)"]
G["unsubscribe()"] --> H["setOptOutDate<br/>→ isSubscribed が false に"]
setSubscribeDate(Timestamp) は次の副作用を持ちます。
- 引数が null の場合、現在時刻を購読日付に採用
- 親クラスの
setSubscribeDate()を呼び出し - 解除日付(
OptOutDate)を null にクリア - 有効フラグを true にセット
subscribe(boolean subscribe) は、true なら setSubscribeDate(null)、false なら setOptOutDate(null) を呼びます(後者は現在時刻での解除日付セットに相当)。
MInterestArea 側の購読情報の委譲
Section titled “MInterestArea 側の購読情報の委譲”MInterestArea は購読状態を自身では保持せず、内部フィールド m_ci(MContactInterest)へ委譲します。
setSubscriptionInfo(int AD_User_ID): 対象連絡先のMContactInterestを取得(存在しなければ非アクティブなインスタンスを生成)して保持getSubscribeDate()/getOptOutDate():m_ciから取得。m_ciが null なら null を返すisSubscribed():m_AD_User_ID <= 0またはm_ci == nullの場合は false。それ以外はm_ci.isSubscribed()を返す
⚠️ 注意:
MInterestArea.isSubscribed()を使う前に、必ずsetSubscriptionInfo()またはsetAD_User_ID()でユーザーを設定してください。未設定のままだと常に false が返ります。
不変オブジェクト対応
Section titled “不変オブジェクト対応”MInterestArea は markImmutable() を実装しており、キャッシュ経由で取得したインスタンスは変更不可としてマークされます。getAll(ctx) / get(ctx, id) で取得した結果を変更する場合は可変コピーを作成してください。
拡張ポイント(カスタマイズ箇所)
Section titled “拡張ポイント(カスタマイズ箇所)”Callout
Section titled “Callout”R_InterestArea / R_ContactInterest / AD_LdapAccess のいずれにも、AD_Column に登録された Callout はありません。
OSGi Model Validator(推奨)
Section titled “OSGi Model Validator(推奨)”オプトアウトの取り消しを禁止するなど、コンプライアンス要件は Model Validator で強制できます。
public class CustomContactInterestValidator implements ModelValidator { @Override public int modelChange(PO po, int type) throws Exception { if (po instanceof MContactInterest && type == TYPE_BEFORE_CHANGE) { MContactInterest ci = (MContactInterest) po; // 例: 一度オプトアウトした連絡先の再購読を管理者以外に禁止 Object oldOptOut = ci.get_ValueOld("OptOutDate"); if (oldOptOut != null && ci.getOptOutDate() == null) { throw new AdempiereException("配信停止の取り消しには管理者承認が必要です"); } } return null; }}配信対象抽出のカスタマイズ
Section titled “配信対象抽出のカスタマイズ”キャンペーン配信の対象抽出では、R_ContactInterest に対し IsActive='Y' AND OptOutDate IS NULL の条件を必ず含めてください。独自の配信プロセスを OSGi プロセスとして実装する場合も、この 2 条件を判定の基準にします。
関連プロセス
Section titled “関連プロセス”| プロセス名 | 説明 |
|---|---|
| LDAPプロセッサ | 関心トピックをグループとして扱い、外部システムの認証・認可を処理(ログは AD_LdapAccess に記録) |
関連ドキュメント
Section titled “関連ドキュメント”iDempiereカスタマイズのご相談
Section titled “iDempiereカスタマイズのご相談”関心トピックは、メール配信の同意管理(オプトイン・オプトアウト)を記録として残せる仕組みです。 個人情報保護の要件に合わせた同意履歴の保持や配信対象抽出の自動化も、OSGi プラグインで安全に追加できます。
As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。