2018年5月29日に実施したJPIERE-0083住所入力関係のカスタマイズの一貫として、住所データのラベル情報を保存するために、C_LocationテーブルにJP_Location_Label(住所ラベル)カラムを追加しました。
そして、その住所ラベルでデータを一意に識別できるように、必須入力の設定とAD_Client_IDとJP_Location_Labelで複合ユニーク制約を設定しています。しかし、その対応だけでは新規クライアント作成時に、iDempiereのクライアント作成処理で住所ラベルの情報が入力されず、エラーとなってしまいます。同様に、iDempiereの標準のLocationリファレンスを使用して住所データを登録する際にも、住所ラベルの情報が入力できないためエラーとなってしまいます。
そのような事が無いように、住所ラベルにモデルバリデータで入力チェックと住所ラベルが入力が無い場合の自動入力処理を実装しました。
住所ラベルの自動入力の処理概要
住所ラベルの入力あり
住所ラベルの入力をユーザーが行った場合には、同じ住所ラベルのデータがあるかどうかチェックして、無ければそのまま登録します。ある場合にはユーザーが入力した住所ラベルに"(2)"を追加して登録します。
住所ラベルの入力なし
住所ラベルの入力が無い場合、住所1と住所2にデータの入力があれば、その住所1と住所2の値を住所ラベルに登録します。既に同じ値の住所ラベルが登録されている場合は"(2)"を追加して登録します。住所1と住所2にデータの入力が無ければ、主キーの値を住所ラベルに設定します。
主キーの値をラベルにするために次のような処理を実装しています。
新規登録の際には、beforeSave()メソッドでは主キーの値を取得できないので、代わりにトランザクション処理を識別する情報であるTrxNameの値をJP_Location_Labelに設定します。そしてafterSave()メソッドで、TrxNameの値がJP_Location_Labelに設定されているデータに対して、主キーの値を再セットしています。
カスタマイズ情報
関連するクラス
◆jpiere.base.plugin.org.adempiere.base.JPiereLocationModelValidator
-> 住所ラベルの自動入力のロジックが記述されているクラス
◆jpiere.base.plugin.util.JPiereLocationUtil
->住所データを登録する際に使用するユーティリティクラス。同じ住所ラベルが登録されていないかどうか判定するメソッドや、住所データを登録するメソッドが用意されている。