【iDempiere Lab】異なる取引先マスタ間での債権債務の消込み(iDempiere ver12)

iDempiere ver12(IDEMPIERE-6838:Allow a BP to pay invoices from a different BP)で異なる取引先マスタ間での債権債務の消込が正式に実装されました。これまで異なる取引先マスタ間で債権債務の消込を行うためにJPiere独自のカスタマイズで対応していた(【JPIERE-0026】異なる取引先マスタ間での消込処理)ので、JPiereで施したそれらのカスタマイズが不要になるかどうか確認するために、調査及び研究し、その成果をここにまとめておきたいと思います。

事前準備

異なる取引先マスタ間で債権債務の消込を行いたい場合、事前に取引先関係を設定しておく必要があります。

取引先関係設定

入金先[IsPayFrom]フラグをONにして下さい。

上記のイメージでは、得意先01の売上請求伝票の支払い(入金)は、得意先03から行われるような設定になります。この設定が無い状態で、異なる取引先マスタ間で債権債務の消込を行おうとすると下記のように「売上/仕入請求伝票と取引先マスタが異なります。」と表示されエラーになります。

エラー:売上/仕入請求伝票と取引先マスタが異なります。
エラー:売上/仕入請求伝票と取引先マスタが異なります。

IDEMPIERE-6838:Allow a BP to pay invoices from a different BPにおいて下記のようにMPayment.beforeSave()メソッドで、異なる取引先マスタ間で債権債務の消込を行おうとした時に取引先関係が設定されていないとエラーになるようなチェックロジックが実装されています。

MPayment.beforeSave()
MPayment.beforeSave()

 

【ポイント】支払いの場合も入金先[IsPayFrom]フラグをONにする

異なる取引先間の債務の消込み(仕入請求伝票と支払伝票の消込み)の場合であっても取引先関係設定タブの入金先[IsPayFrom]フラグをONにします。

支払いの場合は、通常仕入請求伝票を送付してきた先に支払う事になるので、異なる取引先間で債務の消込みを行う必要性は無いかなと思います。

そのためこの債務においては、この機能はほとんど使用するケースは無いのではないかと思われますが、もし支払いの場合も入金先[IsPayFrom]フラグをONにするというのに違和感がある場合には、"入金先"という[IsPayFrom]フラグの名称を"入金先/支払先"というような感じに変更しても良いのではないかと思います。

【ポイント】支払いの場合も入金先[IsPayFrom]フラグをONにする
【ポイント】支払いの場合も入金先[IsPayFrom]フラグをONにする

入金/支払処理

入金/支払伝票での処理

◆入金伝票

入金伝票の場合は売上請求伝票フィールドで先に消込対象となる売上請求伝票を選択入力した後で、取引先マスタフィールドを入金してきた取引先に変更します。

消込伝票の自動仕訳で、異なる取引先マスタ間の債権債務の消込みであっても辻褄が合うようになっています。

消込伝票の自動仕訳
消込伝票の自動仕訳

 

◆支払伝票での処理

支払伝票も同様に、仕入請求伝票フィールドで先に消込対象となる仕入請求伝票を選択して、その後に取引先マスタフィールドを変更します。

仕入請求伝票
仕入請求伝票

消込伝票の自動仕訳で、異なる取引先マスタ間の債権債務の消込みであっても辻褄が合うようになっています。

消込伝票の自動仕訳
消込伝票の自動仕訳

 

消込処理タブでの処理

入金伝票/支払伝票ウィンドウの子タブにある消込処理タブでも異なる取引先マスタ間での債権債務の消込が行えます。

入金伝票/支払伝票の取引先フィールドには、取引先関係設定に登録されている取引先を入力して、子タブの消込処理タブでは、消込を行いたい売上請求伝票もしくは仕入請求伝票を入力します。

 

消込処理フォームでの処理

取引先フィールドには、取引先関係設定に登録されている取引先を入力します。そうすると入金/支払伝票の欄には、その取引先の入金伝票と支払伝票が表示されます。

売上/仕入請求伝票の欄には、その取引先の売上請求伝票と仕入請求伝票が表示されます。

そして”同取引先”フラグをOFFにすると、取引先関係設定がされている取引先の売上請求伝票と仕入請求伝票も表示されて消込処理が行えるようになっています。

消込処理フォームでは、入金/支払伝票と売上/仕入請求伝票が同じ組織である必要があります。

マイグレーションスクリプトの更新内容

202602052238_IDEMPIERE-6838.sqlの更新内容

ダイナミックバリデーション:C_Invoice of Paymentの更新

UPDATE AD_Val_Rule SET Code='C_Invoice.DocStatus IN (''CO'', ''CL'') AND C_Invoice.C_Currency_ID=@C_Currency_ID@ AND C_Invoice.IsSOTrx=''@IsReceipt@'' AND (C_Invoice.C_BPartner_ID=@C_BPartner_ID@ OR C_Invoice.C_BPartner_ID IN (SELECT C_BPartner_ID FROM C_BP_Relation br WHERE C_BPartnerRelation_ID=@C_BPartner_ID@ AND IsPayFrom=''Y'' AND IsActive=''Y''))',Updated=TO_TIMESTAMP('2026-02-05 22:38:46','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Val_Rule_ID=240

◆変更後

C_Invoice.DocStatus IN ('CO', 'CL') AND C_Invoice.C_Currency_ID=@C_Currency_ID@ AND C_Invoice.IsSOTrx='@IsReceipt@' AND (C_Invoice.C_BPartner_ID=@C_BPartner_ID@ OR C_Invoice.C_BPartner_ID IN (SELECT C_BPartner_ID FROM C_BP_Relation br WHERE C_BPartnerRelation_ID=@C_BPartner_ID@ AND IsPayFrom='Y' AND IsActive='Y'))

◆変更前

C_Invoice.DocStatus IN ('CO', 'CL') AND C_Invoice.C_Currency_ID=@C_Currency_ID@ AND C_Invoice.C_BPartner_ID=@C_BPartner_ID@ AND C_Invoice.IsSOTrx='@IsReceipt@'

 

エレメント:IsPayFromの更新

※エレメントの更新に伴いフィールドとプロセスパラメーター、検索ウィンドウ、印刷書式の名称等の修正も行われるSQLが別途ある

-- Feb 5, 2026, 10:44:09 PM CET UPDATE AD_Element SET Name='Pay-From', Description='Business Partner can pay invoices from the related Business Partner', Help='Proxy business partner is allowed to pay and allocate payments from the related Business Partner', PrintName='Pay-From',Updated=TO_TIMESTAMP('2026-02-05 22:44:09','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Element_ID=925 ;

 

-- Feb 5, 2026, 10:44:09 PM CET UPDATE AD_Column SET ColumnName='IsPayFrom', Name='Pay-From', Description='Business Partner can pay invoices from the related Business Partner', Help='Proxy business partner is allowed to pay and allocate payments from the related Business Partner', Placeholder=NULL WHERE AD_Element_ID=925

◆変更前

◆変更後