ROBOT PAYMENT TECH-BLOG

株式会社ROBOT PAYMENTのテックブログです

Salesforce_個人取引先仕様に悩まされた話

株式会社ROBOT PAYMENT システム課で、請求管理ロボfor Salesforce の内製化チームに所属しております。 木村です。我々ROBOT PAYMENTはAppExchangeパートナーとしてアプリを提供しておりますが、全てのSalesforceユーザーに利用していただくためには、個人取引先機能を考慮し開発する必要があります。今回はそれについて書こうと思います。

個人取引先について

 Salesforceの個人取引先機能はB2Cの顧客情報を管理するための仕組みです。ユーザー各々で、設定画面から個人取引先機能を有効にすることで使用できる機能になります。なお、有効化にあたっては取引先オブジェクトに何らかのレコードタイプがない場合、事前に設定しておく必要があります。  有効にすると、取引先オブジェクトには追加で 『個人取引先(PersonAccount)』のレコードタイプが含まれます。具体的には、取引先オブジェクトに IsPersonAccount という項目が追加され、true か falseで該当の取引先が、個人取引先であるか、法人取引先であるかが判別できます。

Salesforce上での請求管理ロボについて

 我々AppExchangeパートナーとしては、全てのSalesforceユーザーに対して等しく動作するアプリを提供する必要がありますが、そうするためにはSalesforce環境がユーザーによって設定が異なることを考慮する必要があります。  そこで、今回の個人取引先機能がそれに該当します。個人取引先設定が有効か無効はユーザーによって異なります。  請求管理ロボでの請求先は、Salesforceの標準オブジェクトの取引先オブジェクトに該当します。そのため、Salesforce上で請求管理ロボが動作する上では、標準オブジェクトとの関わりを考慮する必要があります。  請求管理ロボで請求先(Salesforceでいう取引先)を作成する際は、法人であるか、個人であるかの概念はないのですが、AppExchange 開発においてはSalesforceの標準オブジェクトを利用するため、有効か無効かは明確に判断できなければいけないシーンが発生します。

個人取引先のNameの挙動

 通常、salesforce上で取引先レコードを作成する際、取引先名を入力すると思います。しかし、個人取引先有効後、個人取引先の取引先名については、FirstNameとLastName の演算結果によってNameが作られるため、つまり個人取引先においてのNameはFirstNameとLastNameを参照する形での項目となります。  請求管理ロボの請求先名を更新した場合に、Salesforce上では個人取引先の場合に限りFirstNameとLastNameでもって取引先名を更新する処理とする必要がでてきます。

#### 取引先におけるIsPersonAccountの項目について  個人取引先を有効にしたSalesforce環境の、取引先オブジェクトにはIsPersonAccountという項目が追加されます。IsPersonAccount項目がtrueか否かで、該当の取引先が個人取引先であるかを判断します。  法人取引先については、どうでしょうか?、ややこしいことに個人取引先が無効のSalesforce環境で法人取引先レコードを作成した際、IsPersonAccountという項目は存在しません。つまり、法人取引先レコードを作成しても、IsPersonAccount == false が存在する訳ではないということになります。   #### IsPersonAccountはソースコード上に書けない そもそもなぜ書けないのか?について、Apexクラス上で、IsPersonAccountの真偽が書かれたソースコードを含むパッケージは、 個人取引先が無効のSalesforce環境を利用しているユーザーにはインストールできないためです。  そのため、IsPersonAccountを書くにあたっては慎重になる必要が出てきました。

App Exchangeパートナーとしての対策

 上記のため、個人取引先と法人取引先でNameの更新処理を変更しなければいけないが、個人取引先が無効の組織を考慮した時にIsPersonAccountの真偽を利用できない場合の対応としては、取引先オブジェクトのスキーマで判定する処理が必要になります。  以下のような判定メソッドを作成し、対応することでIsPersonAccountの概念がない組織にも、対応できるようになります。 public boolean checkPersonAccount(){ return Schema.sObjectType.Account.fields.getMap().containsKey('isPersonAccount'); }

まとめ

 上記のように、Salesforceはユーザーによって、環境の設定が異なります。 AppExchange開発を上手くしていくためには、上記のような状況の異なる環境があることを認識し、それらに対応させていくような柔軟さが必要だと感じました。 これからも、AppExchangeパートナーとして気になったポイントなど共有していけたらと思います !



We are hiring!!

ROBOT PAYMENTでは一緒に働く仲間を募集しています!!!

speakerdeck.com
www.robotpayment.co.jp