iDempiere 販売地域の使い方|販売管理 操作マニュアル・技術仕様
📖 販売管理の全体像: 販売管理の全体図 も合わせてご覧ください。
販売地域は、営業活動をエリア単位で区切って管理するためのマスタです。取引先の住所に割り当てることで伝票に地域が引き継がれ、地域別の売上集計・販売手数料計算・会計ディメンションとしての分析に利用できます。
📌 ポイント: 販売地域は保存時に自動で 地域ツリー(
AD_Treeの TreeType=SalesRegion)へ登録されます。「サマリレベル」にチェックした地域を上位ノードにすることで、東日本 ▸ 関東 ▸ 東京 のような階層集計が可能になります。
販売地域でできること
Section titled “販売地域でできること”- 販売エリアのコード化と階層(ツリー)管理
- 取引先住所(
C_BPartner_Location)への地域割当 - 地域ごとの担当営業(社内担当者)の設定
- 会計ディメンションとしての利用(
C_AcctSchema_Elementに地域を追加すると仕訳に地域が付与される) - 販売手数料の対象を地域で絞り込む条件指定(
C_CommissionLine.C_SalesRegion_ID) - GL 配賦(
GL_Distribution)の配賦キーとしての利用 - 地域名称の多言語対応(翻訳タブ)
販売地域は 2 タブ構成です。
| タブ名 | テーブル | 項目数 | 役割 |
|---|---|---|---|
| 販売地域 | C_SalesRegion | 9項目 | 検索キー・名称・担当者・サマリレベル |
| 翻訳 | C_SalesRegion_Trl | 8項目 | 地域名称の多言語翻訳 |
💡 ヒント: 翻訳タブは多言語運用(クライアントに複数言語を登録している場合)でのみ使用します。日本語単一運用であれば販売地域タブだけで設定が完了します。
基本操作手順
Section titled “基本操作手順”graph TD
A["🚀 メニューから開く<br/>販売管理 > 販売管理設定 > 販売地域"] --> B["➕ 新規ボタンをクリック"]
B --> C["🔑 検索キー・名称を入力"]
C --> D{"上位ノードにする?"}
D -->|する| E["📂 サマリレベルにチェック<br/>(集計用の親ノード)"]
D -->|しない| F["👤 社内担当者を設定(任意)"]
E --> F
F --> G["💾 保存<br/>(地域ツリーへ自動登録)"]
G --> H["🌳 ツリーメンテナンスで<br/>親子関係を整理"]
H --> I["🏢 取引先の住所タブで<br/>販売地域を割当"]
I --> J["📄 受注・請求伝票に地域が引継がれ<br/>地域別集計が可能に"]
アクセス方法(メニューパス)
Section titled “アクセス方法(メニューパス)”メニューから「販売管理 > 販売管理設定 > 販売地域」を開きます。
- ツールバーの「新規」ボタンをクリック
- 必須項目を入力:
- 検索キー: 地域コード(最大 40 文字。一意にする必要があります)
- 名称: 地域名(最大 60 文字。例:
関東)
- 必要に応じて任意項目を入力:
- 説明: 補足説明
- 社内担当者: 当該地域の担当営業
- サマリレベル: 集計専用の上位ノードにする場合にチェック
- デフォルト: 既定の販売地域として使う場合にチェック
- 「保存」をクリック
⚠️ 注意: 検索キー(
Value)を後から変更すると、afterSave()で地域ツリーの並び順更新と会計組合せ(C_ValidCombination)の名称・説明の再生成が走ります。会計期間の締め後にコード体系を変更すると過去仕訳の表示名にも影響するため、コード体系は運用開始前に確定させてください。
階層(ツリー)の設定
Section titled “階層(ツリー)の設定”- 上位ノードにする地域を サマリレベル = チェック で登録
- 下位の地域を通常どおり登録
- メニューの「ツリーメンテナンス」で TreeType が 販売地域 のツリーを開く
- 下位地域を上位ノードへドラッグして親子関係を組む
💡 ヒント: サマリレベルの地域は集計専用です。取引先住所に割り当てるのは末端(サマリレベル未チェック)の地域にしてください。
取引先への割当
Section titled “取引先への割当”- 取引先マスタを開く
- 「住所」タブで対象の住所行を選択
- 「販売地域」に登録済みの地域を選択して保存
項目リファレンス
Section titled “項目リファレンス”販売地域タブ
Section titled “販売地域タブ”| 項目名 | カラム | 必須 | 型 | 説明 |
|---|---|---|---|---|
| クライアント | AD_Client_ID | 必須 | 選択 | テナント(自動セット) |
| 組織 | AD_Org_ID | 必須 | 選択 | 組織(自動セット) |
| 検索キー | Value | 必須 | 文字列(40) | 地域コード。一意である必要あり |
| 名称 | Name | 必須 | 文字列(60) | 地域名(識別子) |
| 説明 | Description | - | 文字列(255) | 補足説明 |
| 有効 | IsActive | 必須 | チェック | 無効化する場合はチェックを外す |
| デフォルト | IsDefault | 必須 | チェック | 既定の販売地域 |
| 社内担当者 | SalesRep_ID | - | 選択 | 担当営業(ユーザー) |
| サマリレベル | IsSummary | 必須 | チェック | 集計用の上位ノード |
| 項目名 | カラム | 必須 | 型 | 説明 |
|---|---|---|---|---|
| 販売地域 | C_SalesRegion_ID | 必須 | 選択 | 翻訳対象の地域(親) |
| 言語 | AD_Language | 必須 | 選択 | 翻訳先の言語 |
| 翻訳する | IsTranslated | 必須 | チェック | 翻訳済みかどうか |
| 名称 | Name | 必須 | 文字列 | 当該言語での地域名 |
| 説明 | Description | - | 文字列 | 当該言語での説明 |
業務フロー上の位置づけ
Section titled “業務フロー上の位置づけ”graph TD
A["販売地域<br/>C_SalesRegion"] --> B["取引先住所<br/>C_BPartner_Location"]
A --> C["会計ディメンション<br/>C_AcctSchema_Element"]
A --> D["手数料詳細<br/>C_CommissionLine"]
A --> E["GL配賦<br/>GL_Distribution"]
B --> F["受注伝票 / 売上請求伝票"]
C --> G["会計仕訳<br/>Fact_Acct"]
F --> G
D --> H["販売手数料計算<br/>C_CommissionRun"]
G --> I["地域別の財務レポート"]
よくある質問(FAQ)
Section titled “よくある質問(FAQ)”Q. 販売地域は伝票のどこに入りますか?
Section titled “Q. 販売地域は伝票のどこに入りますか?”伝票ヘッダーの入力欄としてではなく、取引先住所(C_BPartner_Location)に設定した地域が伝票・仕訳の分析軸として引き継がれます。会計ディメンションとして有効化していれば Fact_Acct にも C_SalesRegion_ID が記録され、地域別の財務レポートが作成できます。
Q. 保存しただけでツリーに現れるのはなぜですか?
Section titled “Q. 保存しただけでツリーに現れるのはなぜですか?”MSalesRegion.afterSave() が新規レコードのときに insert_Tree(MTree_Base.TREETYPE_SalesRegion) を実行し、販売地域ツリーへノードを自動追加するためです。削除時も afterDelete() の delete_Tree() でノードが除去されます。階層の親子関係だけはツリーメンテナンス画面で手動設定します。
Q. 検索キーを変更したら会計の表示名も変わりました。仕様ですか?
Section titled “Q. 検索キーを変更したら会計の表示名も変わりました。仕様ですか?”仕様です。afterSave() は既存レコードで Value または Name が変更された場合に MAccount.updateValueDescription() を呼び、その地域を含む会計組合せ(C_ValidCombination)の組合せ名・説明を再生成します。仕訳データそのものは変わりませんが、表示名は更新されます。
Q. サマリレベルの地域を取引先に割り当てられますか?
Section titled “Q. サマリレベルの地域を取引先に割り当てられますか?”システム上は選択できてしまいますが、サマリレベルは集計用の上位ノードとして設計されているため推奨しません。集計ノードに実データを紐づけると、階層集計時に上位と下位で二重計上のような読みにくい結果になります。
Q. 販売手数料の条件に地域を使えますか?
Section titled “Q. 販売手数料の条件に地域を使えますか?”使えます。販売手数料及びロイヤリティー計算の「手数料詳細」タブに C_SalesRegion_ID があり、対象取引を地域で絞り込めます。ただし絞り込みは取引先住所に設定された地域を経由して判定されるため、住所への地域割当が前提になります。
🛠 技術仕様(開発者向け)
販売地域はマスタデータ型のウィンドウ(AD_Window_ID: 152)で、C_SalesRegion テーブルに格納されます。テーブル属性は IsDeleteable=Y / IsHighVolume=N / AccessLevel=3(クライアント+組織レベル)。ビジネスロジックは MSalesRegion クラス(172行)が担い、ツリー登録・会計組合せ名称の再生成・イミュータブルキャッシュを実装しています。翻訳テーブル C_SalesRegion_Trl は IsDeleteable=N です。
アーキテクチャ概要
Section titled “アーキテクチャ概要”classDiagram
class MSalesRegion {
+get(int) MSalesRegion$
+get(Properties, int) MSalesRegion$
+afterSave(boolean, boolean) boolean
+afterDelete(boolean) boolean
+markImmutable() MSalesRegion
}
class X_C_SalesRegion {
<<generated>>
}
class PO {
<<abstract>>
}
class ImmutablePOSupport {
<<interface>>
}
MSalesRegion --|> X_C_SalesRegion
X_C_SalesRegion --|> PO
MSalesRegion ..|> ImmutablePOSupport
MSalesRegion --> MTree_Base : insert/update/delete tree
MSalesRegion --> MAccount : updateValueDescription
パッケージ: org.compiere.model
ソースファイル: org.adempiere.base/src/org/compiere/model/MSalesRegion.java
関連DBテーブル
Section titled “関連DBテーブル”C_SalesRegion(販売地域)
Section titled “C_SalesRegion(販売地域)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| C_SalesRegion_ID | ID | PK | 販売地域ID | 主キー |
| C_SalesRegion_UU | UUID | N | UUID | |
| AD_Client_ID | Table Direct | Y | クライアント | default @#AD_Client_ID@ |
| AD_Org_ID | Table Direct | Y | 組織 | default @#AD_Org_ID@ |
| Value | String(40) | Y | 検索キー | 一意。変更時にツリー・会計名称を更新 |
| Name | String(60) | Y | 名称 | 識別子(IsIdentifier=Y) |
| Description | String(255) | N | 説明 | |
| IsActive | Yes-No | Y | 有効 | default Y |
| IsDefault | Yes-No | Y | デフォルト | |
| IsSummary | Yes-No | Y | サマリレベル | 集計用の上位ノード |
| SalesRep_ID | Table | N | 社内担当者 | AD_User への参照 |
C_SalesRegion_Trl(販売地域翻訳)
Section titled “C_SalesRegion_Trl(販売地域翻訳)”| カラム名 | 型 | 必須 | 説明 |
|---|---|---|---|
| C_SalesRegion_ID | Search | PK | 販売地域FK |
| AD_Language | Table | PK | 言語コード |
| Name | String | Y | 翻訳後の名称 |
| Description | String | N | 翻訳後の説明 |
| IsTranslated | Yes-No | Y | 翻訳済みフラグ |
erDiagram
C_SalesRegion ||--o{ C_SalesRegion_Trl : "translations"
C_SalesRegion ||--o{ C_BPartner_Location : "region of address"
C_SalesRegion ||--o{ C_CommissionLine : "commission filter"
C_SalesRegion ||--o{ C_ValidCombination : "accounting dimension"
C_SalesRegion ||--o{ Fact_Acct : "posted dimension"
C_SalesRegion ||--o{ GL_Distribution : "distribution key"
C_SalesRegion ||--o{ GL_JournalLine : "journal dimension"
C_AcctSchema_Element }o--o| C_SalesRegion : "enables dimension"
ビジネスロジック
Section titled “ビジネスロジック”afterSave() の処理
Section titled “afterSave() の処理”MSalesRegion.afterSave(newRecord, success) は成功時に次の 3 段階を実行します。
- ツリー登録:
newRecordの場合insert_Tree(MTree_Base.TREETYPE_SalesRegion)で販売地域ツリーへノードを追加 - ツリー更新:
newRecordまたはValueが変更された場合にupdate_Tree(TREETYPE_SalesRegion) - 会計組合せの名称再生成: 既存レコードで
ValueまたはNameが変更された場合、MAccount.updateValueDescription(ctx, "C_SalesRegion_ID=<ID>", trxName)を呼び、当該地域を含むC_ValidCombinationの組合せ名・説明を更新
afterDelete() の処理
Section titled “afterDelete() の処理”削除成功時に delete_Tree(MTree_Base.TREETYPE_SalesRegion) を実行し、ツリーノードを除去します。
キャッシュ(ImmutablePOSupport)
Section titled “キャッシュ(ImmutablePOSupport)”MSalesRegion は静的メソッド get(int C_SalesRegion_ID) / get(Properties ctx, int C_SalesRegion_ID) を提供し、markImmutable() によるイミュータブル化に対応しています。明細行の一括処理などで繰り返し参照する場合は、new MSalesRegion(...) ではなく MSalesRegion.get() を使うと DB アクセスを削減できます。
⚠️ 注意:
markImmutable()で不変化されたインスタンスは setter が使えません。更新用途では必ずコンストラクタ(MSalesRegion(ctx, copy, trxName)を含むコピーコンストラクタ)で可変インスタンスを取得してください。
拡張ポイント(カスタマイズ箇所)
Section titled “拡張ポイント(カスタマイズ箇所)”OSGi Model Validator(推奨)
Section titled “OSGi Model Validator(推奨)”public class CustomSalesRegionValidator implements ModelValidator { @Override public int modelChange(PO po, int type) throws Exception { if (po instanceof MSalesRegion) { MSalesRegion region = (MSalesRegion) po; if (type == TYPE_BEFORE_NEW || type == TYPE_BEFORE_CHANGE) { // 例: 地域コードの命名規則チェック(JP-XX 形式) if (region.getValue() != null && !region.getValue().matches("JP-[A-Z]{2}")) { throw new AdempiereException("販売地域コードは「JP-XX」形式で入力してください"); } // 例: サマリレベルには担当者を設定させない if (region.isSummary() && region.getSalesRep_ID() > 0) { throw new AdempiereException("サマリレベルの地域に社内担当者は設定できません"); } } } return null; }
@Override public String docValidate(PO po, int timing) { return null; // C_SalesRegion は Document 型ではないため不要 }}Callout
Section titled “Callout”C_SalesRegion の各カラムには標準の Callout が設定されていません。取引先住所への割当時に既定の担当営業を伝票へ引き当てるといった連動は、IColumnCallout を OSGi サービスとして実装するか、C_Order 側の Model Validator で行います。
会計ディメンションとしての有効化
Section titled “会計ディメンションとしての有効化”会計スキーマの C_AcctSchema_Element に販売地域を要素として追加すると、仕訳生成時に C_SalesRegion_ID が Fact_Acct へ書き込まれ、地域別の財務レポートが作成可能になります。要素の追加後は既存の会計組合せの再生成が必要です。
関連プロセス
Section titled “関連プロセス”このウィンドウ固有の標準プロセス(ボタン)はありません。階層の編集はツリーメンテナンス画面(AD_Tree)で行います。
関連ドキュメント
Section titled “関連ドキュメント”iDempiereカスタマイズのご相談
Section titled “iDempiereカスタマイズのご相談”販売地域は会計ディメンションと販売手数料の双方に効いてくるマスタです。自社のエリア区分に合わせた階層設計と、地域別 P/L の作り込みは導入初期に固めておくと後戻りがありません。
As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。