Skip to content

iDempiere 関心トピックの使い方|取引先管理 操作マニュアル・技術仕様

This content is not available in your language yet.

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

関心トピック(Interest Area)は、連絡先がどの話題に興味を持っているかを登録し、購読(Subscribe)と配信停止(Opt-out)を記録するマスタです。メールマガジンや営業活動(キャンペーン)の配信対象を絞り込むための基礎データになります。

📌 ポイント: 購読状態は「有効フラグ(IsActive)が ON」かつ「解除日付(OptOutDate)が未設定」のときだけ購読中と判定されます(MContactInterest.isSubscribed())。解除日付が入っている連絡先は、有効フラグが ON でも配信対象外です。

  • 話題・分野ごとの関心トピックを定義する(例: 新製品情報、セミナー案内)
  • 連絡先ごとの購読状況を「購読者」タブで管理する
  • 購読日付(SubscribeDate)と解除日付(OptOutDate)を記録し、オプトアウトの証跡を残す
  • セルフサービス(Web 経由での購読・解除)の可否をトピック単位で制御する
  • LDAP プロセッサ経由の外部システム認証ログを、トピックに紐付けて確認する
  • 営業活動(キャンペーン)の配信対象抽出に利用する

親タブ 1 つと子タブ 2 つの構成です。

タブ名テーブル項目数役割
関心トピックR_InterestArea7項目トピックの基本定義(検索キー・名称・セルフサービス)
購読者R_ContactInterest7項目連絡先ごとの購読状態(購読日付・解除日付)
LDAPアクセスAD_LdapAccess9項目LDAP プロセッサ経由のアクセスログ(読み取り用)

💡 ヒント: 「LDAPアクセス」タブは、iDempiere を LDAP サーバとして外部システムの認証に使う場合のログ表示です。メールマーケティング目的だけで使う場合は参照する必要はありません。

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["📧 キャンペーン配信対象として利用"]

メニューから開く 取引先管理 > リクエスト管理 > 関心トピック 新規でトピックを作成 (検索キー・名称) Web から購読させるか セルフサービスを ON セルフサービスを OFF 保存 購読者タブで 連絡先を追加 購読日付を設定 (購読開始) 配信停止の申し出 解除日付を設定 (以後は配信対象外) キャンペーン配信対象として利用 させる 社内管理のみ あり なし

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

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

メニューから「取引先管理 > リクエスト管理 > 関心トピック」を開きます(AD_Window_ID: 245)。

  1. ツールバーの「新規」ボタンをクリックします
  2. 基本情報を入力します
    • 検索キー(Value: トピックコード(一意)— 必須、最大40文字
    • 名称(Name: トピック名(例: 新製品情報)— 必須、最大60文字
    • 説明: 用途の補足(最大255文字)
    • セルフサービス: Web から購読・解除させる場合はチェック(既定 ON)
  3. 保存」をクリックします
  1. 購読者」タブに移動します
  2. 新規」をクリックし、以下を入力します
    • ユーザー(AD_User_ID: 購読する連絡先 — 必須
    • 購読日付(SubscribeDate: 購読開始日
    • 解除日付(OptOutDate: 配信停止日(購読中は空欄のまま)
  3. 保存」をクリックします

配信停止(オプトアウト)の記録

Section titled “配信停止(オプトアウト)の記録”

配信停止の申し出があった場合は、該当の購読者レコードに解除日付を入力して保存します。これにより isSubscribed() が false を返し、以後の配信対象から除外されます。レコード自体は削除せず残すことで、停止申し出があった事実の証跡になります。

⚠️ 注意: MContactInterest.setSubscribeDate() は、購読日付をセットする際に解除日付を自動的に null に戻し、有効フラグを ON にします。再購読の処理では解除日付が消える点に注意してください。

項目名必須説明
検索キー必須文字列(40)トピックの一意コード
名称必須文字列(60)トピック名
説明-文字列(255)補足説明
セルフサービス必須チェックWeb からの購読・解除を許可(既定 Y)
有効必須チェックレコードが有効か(既定 Y)
クライアント必須選択テナント
組織必須選択組織
項目名必須説明
関心トピック必須選択親のトピック
ユーザー必須選択購読する連絡先(既定 @AD_User_ID@
購読日付-日付購読を開始した日
解除日付-日付配信停止を申し出た日
有効必須チェックレコードが有効か(既定 Y)
項目名必須説明
LDAPプロセッサ必須選択認証を行った LDAP プロセッサ
ユーザー-選択認証対象のユーザー
関心トピック-選択認可判定に使われたトピック
作成日必須日時アクセス日時
エラー有無必須チェック実行時にエラーが発生したか
サマリ-テキスト処理結果の要約
説明-文字列補足

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

graph TD
    A["R_ContactInterest レコード"] --> B{"IsActive = Y ?"}
    B -->|No| C["購読していない"]
    B -->|Yes| D{"OptOutDate が null ?"}
    D -->|No| C
    D -->|Yes| E["購読中<br/>(配信対象)"]

R_ContactInterest レコード IsActive = Y ? 購読していない OptOutDate が null ? 購読中 (配信対象)

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_LdapAccessMLdapAccess(66行)で扱われる軽量なログテーブルです。いずれも Document 型ではありません。

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

+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 +get(ctx, ...)$ MContactInterest +subscribe() void +subscribe(boolean) void +unsubscribe() void +isOptOut() boolean +isSubscribed() boolean +setSubscribeDate(Timestamp) void +setOptOutDate(Timestamp) void <> <> > X_R_InterestArea MContactInterest -- > PO X_R_ContactInterest --

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

カラム名必須説明備考
R_InterestArea_IDIDPK関心トピックID主キー
AD_Client_IDTableDirectYクライアント既定 @#AD_Client_ID@
AD_Org_IDTableDirectY組織既定 @#AD_Org_ID@
ValueString(40)Y検索キー一意コード
NameString(60)Y名称
DescriptionString(255)N説明
IsSelfServiceYesNoYセルフサービス既定 Y
IsActiveYesNoY有効既定 Y
R_InterestArea_UUUUID(36)NUUID
カラム名必須説明備考
R_InterestArea_IDTableDirectY関心トピックFK複合キーの一部
AD_User_IDTableDirectYユーザー(連絡先)既定 @AD_User_ID@
SubscribeDateDateN購読日付セット時に OptOutDate をクリア
OptOutDateDateN解除日付null なら購読中
AD_Client_IDTableDirectYクライアント既定 @AD_Client_ID@
AD_Org_IDTableDirectY組織既定 0
IsActiveYesNoY有効既定 Y
R_ContactInterest_UUUUID(36)NUUID
カラム名必須説明
AD_LdapAccess_IDIDPKアクセスログID
AD_LdapProcessor_IDTableDirectYLDAP プロセッサ
AD_User_IDTableDirectN認証対象ユーザー
R_InterestArea_IDTableDirectN認可判定に使うトピック
IsErrorYesNoYエラー発生有無
SummaryTextN処理結果の要約
DescriptionStringN補足
CreatedDate+TimeY作成日時(既定 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"

ldap group bp contact

購読状態の判定(MContactInterest)

Section titled “購読状態の判定(MContactInterest)”
public boolean isSubscribed()
{
return isActive() && getOptOutDate() == null;
}

有効フラグと解除日付の 2 条件のみで判定します。購読日付(SubscribeDate)は判定に使われず、記録用の値です。

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 に"]

subscribe() setSubscribeDate(null) null なら現在時刻を採用 super.setSubscribeDate super.setOptOutDate(null) 解除日付をクリア setIsActive(true) unsubscribe() setOptOutDate → isSubscribed が false に

setSubscribeDate(Timestamp) は次の副作用を持ちます。

  1. 引数が null の場合、現在時刻を購読日付に採用
  2. 親クラスの setSubscribeDate() を呼び出し
  3. 解除日付(OptOutDate)を null にクリア
  4. 有効フラグを true にセット

subscribe(boolean subscribe) は、true なら setSubscribeDate(null)、false なら setOptOutDate(null) を呼びます(後者は現在時刻での解除日付セットに相当)。

MInterestArea は購読状態を自身では保持せず、内部フィールド m_ciMContactInterest)へ委譲します。

  • 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 が返ります。

MInterestAreamarkImmutable() を実装しており、キャッシュ経由で取得したインスタンスは変更不可としてマークされます。getAll(ctx) / get(ctx, id) で取得した結果を変更する場合は可変コピーを作成してください。

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

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

R_InterestArea / R_ContactInterest / AD_LdapAccess のいずれにも、AD_Column に登録された Callout はありません。

オプトアウトの取り消しを禁止するなど、コンプライアンス要件は 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;
}
}

キャンペーン配信の対象抽出では、R_ContactInterest に対し IsActive='Y' AND OptOutDate IS NULL の条件を必ず含めてください。独自の配信プロセスを OSGi プロセスとして実装する場合も、この 2 条件を判定の基準にします。

プロセス名説明
LDAPプロセッサ関心トピックをグループとして扱い、外部システムの認証・認可を処理(ログは AD_LdapAccess に記録)

関心トピックは、メール配信の同意管理(オプトイン・オプトアウト)を記録として残せる仕組みです。 個人情報保護の要件に合わせた同意履歴の保持や配信対象抽出の自動化も、OSGi プラグインで安全に追加できます。

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

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