Salesforce のマルチ通貨の注意事項を検証してみた

# マルチ通貨とは
Salesforce には「マルチ通貨」という機能がある。

この機能は商談、見積、取引先などの一部標準オブジェクトと、カスタムオブジェクトで利用できる。

既に運用されている既存Salesforce組織で有効化したい理由が出てきたが、ヘルプに記載されている注意事項を読んで少し不安になったので、検証してみた。

Salesforceヘルプ: [マルチ通貨の有効化に関する考慮事項](https://help.salesforce.com/s/articleView?id=sf.admin_enable_multicurrency_implications.htm&type=5)

以下、記載の各項目について検証してみた。

# 検証結果
> * 組織でマルチ通貨を有効化すると、無効化できません。

「組織情報」設定画面で「マルチ通貨の有効化」チェックボックスをチェックして保存するだけで有効化できるが、その後は変更できなくなる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19683/0e59b690-0a11-0f65-6de9-78388eb694e9.png)

今回はこれを見て慎重になりました。

- - -
> * 複数の通貨が有効化されている場合、レポートの項目間の絞り込みでは通貨項目 (金額など) はサポートされません。

Salesforceヘルプ: [項目間の絞り込みによる項目の比較を使用したレポートの絞り込み](https://help.salesforce.com/s/articleView?id=sf.reports_builder_filtering_field_to_field.htm&type=5)

これ↑が通貨型のフィールドで使えなくなる。

レポートでフィルターを設定するときに、対象フィールドのデータ型が「日付」「日付時刻」「数値」「通貨」のいずれかの場合、同じデータ型の他のフィールドと比較するような条件を設定できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19683/6fe1eefd-1805-4fa5-71d7-1cd713178152.png)

マルチ通貨を有効化すると、これが通貨型フィールドで使えなくなる。
そのようなフィルターを含むレポートが既に存在する場合、開こうとするとエラーになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19683/88dbd27f-7c99-12bd-6b04-880645981690.png)

- - -
> * 有効化を行うと、有効化要求で指定したデフォルトの通貨コードを使用して、既存のレコードにスタンプが付けられます。たとえば、USD および EUR を使用するレコードが組織に含まれている場合、有効化を行う前にそれらのレコードをすべて同じデフォルト通貨に切り替えます。Salesforce の有料実装サービスでは、このような変換のサポートもご利用いただけます。

既に存在する通貨型の値は、全てデフォルト通貨の金額とみなされますよ、ということ。

マルチ通貨を有効にしないまま通貨型フィールドに異なる通貨の金額を入れ、「通貨」を表すカスタムフィールドとかで実際の通貨を判別しているようなケースだと困るってことなのかな。

- - -
> * 取引先、リード、ケース、商談、商談商品、商談商品スケジュール、キャンペーン商談などの標準オブジェクトとカスタムオブジェクトには、マルチ通貨がサポートされる通貨項目があります。これらのオブジェクトと項目に関連するレポートでもマルチ通貨がサポートされます。デフォルトでは、これらのオブジェクトのページレイアウトにマルチ通貨と互換性のある項目があります。この項目により、レコードの通貨を指定できます。通常、これらの項目は、レコードの作成時または既存レコードの編集時にのみ使用できます。選択した通貨は、主金額項目に使用されます。

マルチ通貨に対応するオブジェクトには、各レコードが持つ金額の通貨を示すための「通貨」フィールドが追加されますよ、ということ。

- - -
> * パッケージを作成してテストする場合、一時的なビルド組織では USD のみが設定されています。テストで USD 以外の通貨コードを使用すると、エラーが発生します。

自分のところの事情には当てはまらないので検証スキップ。
パッケージのテストコードは USD 前提で書け、ってことか。

- - -
> * 有効化の後、カスタム通貨項目で定義された小数部の桁数は無視されます。代わりに [設定] の [通貨の管理] を使用して、小数点の位置を通貨ごとに設定します。

カスタムフィールドの作成時には相変わらず「小数点の位置」を指定できますが、マルチ通貨を有効化するとウォーニングが出るようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19683/720aea4c-25c8-9f9c-7b07-9f1abbcc7733.png)

代わりに各通貨に設定された「小数点の位置」が採用されます。

- - -
> * 有効化の後、主通貨は通常どおり表示され、必要に応じてその後に第 2 通貨金額が括弧内に表示されます。通常、レコードレベルで上書きしない限り、主通貨がデフォルトのマスター通貨になります。括弧内に表示される金額は、ユーザーの個人設定のデフォルト通貨であり、組織で定義された換算レート設定に基づいて計算されます。換算した通貨金額を表示するかどうかを制御するには、[通貨の管理] ページから括弧内の通貨換算を有効化または無効化します。

個人の通貨設定とレコードに設定された通貨が同一ならこんな感じで表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19683/471b756b-4c87-57db-b8df-4d73c006c527.png)

レコードの通貨が USD、個人設定が JPY だとこうなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19683/64581f17-2298-e638-9978-9a1459a7fdb5.png)

ただしカッコ内の換算金額表示を消すこともできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19683/695a0829-84fd-4b58-d2e5-c721c2e3fe23.png)

換算金額を非表示にするには「通貨の管理」設定で「括弧内の通貨換算」を無効化します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19683/a3ff861a-5349-d799-f9cb-41e29311ddc8.png)

後述するが、換算レートの運用管理は面倒なので、単に異なる通貨の金額を登録したいだけなら、これはありかも。

- - -
> * レポートでは、デフォルトのマスター通貨またはレコード用に選択された通貨のどちらかが主通貨に反映されます。第 2 通貨には、レポートを実行しているユーザーの個人設定のデフォルト通貨またはレポート条件で使用された通貨が反映されます。

実画面で確認できないんですが、もしかしたらこれは Classic UI の話かもしれません。
Lightning Experience のレポート画面で確認すると、以下のような感じ。

レポート作成時、通貨フィールドについては換算前金額と換算後金額のどちらか、または両方を表示できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19683/1c508cf9-ccc9-2122-d76c-3256b759af55.png)

換算後金額をどの通貨で表示するかは、レポート作成時に右下のリストで選択できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19683/1f62dc87-46ed-2b29-2ec0-76d3306bb8d1.png)

- - -
> * ユーザーは [個人情報] ページで個人設定のデフォルト通貨を指定できます。括弧内の通貨換算が有効な場合、個人設定のデフォルト通貨は第 2 通貨金額 (換算後の金額) として表示されます。個人設定のデフォルト通貨を変更すると、換算後の金額がリアルタイムで更新されます。

どの通貨に換算するかは個人別に設定できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19683/f7ee052c-7a43-4996-9cfb-22dca5c1c7da.png)

- - -
> * 組織でサポートする通貨リストに通貨を追加した後は、その通貨が無効になっていてもシステム管理者の通貨リストから削除できません。システム管理者のリストに無効な通貨が表示されても、外見上の問題であり、エンドユーザーに影響はありません。無効にされた通貨は、エンドユーザーには表示されませんが、システム管理者には引き続き表示されます。テスト時にはこの点に注意し、最終的に組織で使用する通貨のみを使用することをお勧めします。

一度有効化した通貨は、無効化はできるが削除はできない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19683/a0d70081-872a-bcf7-08b5-9d52adae7204.png)

- - -
> * 有効化の後、すべての通貨項目には、通貨の ISO コードが金額の前に表示されます。たとえば、$100 は USD 100 と表示されます。
> :::note info
> メモ マルチ通貨組織が 1 つの通貨のみを使用する場合は、ISO コードではなく通貨記号を表示するように設定できます。通貨記号を表示するには、[設定] でユーザーインターフェースを検索し、[ユーザーインターフェース設定] ページの [通貨表示設定] セクションで [ISO コードではなく通貨記号を表示する] を選択します。組織で後から他の通貨も有効にすると、ISO コードが表示され、この設定が使用できなくなります。この設定は、標準の Salesforce ユーザーインターフェースにのみ適用されます。
> :::

マルチ通貨を有効化する前はこんな表示。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19683/74ac3e15-90ce-5321-9d79-6a22de4ea70f.png)

マルチ通貨を有効化するとこんな表示に変わる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19683/471b756b-4c87-57db-b8df-4d73c006c527.png)

ただし、登録済みの通貨が1つだけのうちは、ユーザーインターフェース設定で「ISO コードではなく通貨記号を表示する」をチェックすると、元の通貨記号の表示に戻る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19683/0b8f5316-04cc-02f5-bc04-99712f000910.png)

この設定はマルチ通貨を有効化すると見えるようになる。
ただし2つ目の通貨を有効化した時点で見えなくなる。無効化しても再び見えるようにはならない。

- - -
> * デフォルトでは、組織内の換算後の金額はすべて、組織で定義された現在の換算レートに依存します。換算レートの設定および更新は、手動で行う必要があります。換算レートを変更すると、完了した商談を含む、すべてのレコードの換算金額が自動的に更新されます。
高度な通貨管理を使用して換算レートの履歴を追跡し、期間指定換算レートを使用することを選択できます。高度な通貨管理では、日付範囲別換算レートのリストを管理できます。商談の換算後の通貨金額は、商談のフェーズに関係なく、指定された完了予定日に基づいて表示されます。完了予定日が別の換算レート期間に変更された場合、換算後の金額に影響が及びます。
> :::note info
> メモ 期間指定換算レートは、売上予測、他のオブジェクト内の通貨項目、または他の種別のレポートの通貨項目では使用されません。
> :::

換算レートを設定する画面がある。履歴管理はできない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19683/c36cc3a7-ed52-a678-4048-a05cb868f2dc.png)

「[高度な通貨管理](https://help.salesforce.com/s/articleView?id=sf.administration_about_advanced_currency_management.htm&type=5)」を有効化すると、商談と関連オブジェクトに関してのみ換算レートを履歴管理できるようになり、例えば商談では「完了予定日」時点の換算レートが適用されるようになる。

換算レートを更新するための API はあるようなので、これを使って自動化することはできそうだが、ソースデータをどこから持ってくるとか考えるのも面倒そう。