Salesforce:ソフトフォン（ Lightning Open CTI ）の環境構築方法について

この記事は [Salesforce Platform Advent Calendar 2020 - Qiita](https://qiita.com/advent-calendar/2020/salesforce-platform) 第4日目の投稿です。


## 事の発端
とある業務にて、Salesforceにソフトフォンを導入している組織が存在しておりました。
そのためソフトフォンを含んだ開発組織作りが必要となり、今回は調べた内容を忘備録のつもりで投稿します。


## そもそもソフトフォンって何？って人向け情報
パソコンに専用のソフトをインストールし、インターネットを介して通話をする機能です。
音声コミュニケーションツールでいうと、SkypeやZoom、Google MeetやMicrosoft Teamsなどありますが、ここでいうソフトフォンは、少し違います。
取引先の相手が電話機で、通話を受け取れる仕組みです。
詳しいことは、IP-PBX（Private Branch Exchange）`・・・企業内ネットワーク上にIP電話機を接続して内線と外線を中継するシステム`について調べてもらえると理解度が深まると思います。

簡単なイメージでいうと、Salesforceの取引先や取引先責任者には、電話番号が登録されていますが、この電話番号クリック一つで電話できるサービスを提供しているものがソフトフォンです。
営業職の人には大変便利なサービスですね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/ed317de9-c6a7-d4e0-25d2-46dd44d5567a.png)

※注意※
改めて、ここで記載している内容は **デモ環境** です。
実際のソフトフォンを導入する方法は記載していません。ただ、少しは参考になるかもしれないです。


## 開発組織にデモ用のソフトフォンをインストールする手順
基本的に、サイト [Lightning Open CTI ](https://developer.salesforce.com/ja/wiki/lightning_open_cti) の流れに基本的に従う事で構築完了できます。
今回は、一連の手順に補足してます。

### 1. Salesforce組織にログイン
インストールしたい組織にログインします。

### 2. デモ用ソフトフォンパッケージのインストールと確認
#### 2.1. パッケージをインストール
https://login.salesforce.com/packaging/installPackage.apexp?p0=04t41000000bSXh 
※注意※Sandboxにインストールする時は 以下のパッケージを利用してください。
https://test.salesforce.com/packaging/installPackage.apexp?p0=04t41000000bSXh

こちらのリンクをクリックすると以下のような画面が出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/1c29866c-0f8b-5a38-2c54-f19f70ee7efb.png)
#### 2.2.インストールの確認
Salesforce組織の`インストール済みパッケージ`画面を開くと、インストールされたことが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/e85ea954-254d-f67b-8a03-b0e02cf96d98.png)
設定にて`コールセンター`をクイック検索すると、`Demo Call Center Adapter`が追加されていることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/b70ea8e9-6109-091e-d7d1-9e195cc93113.png)
初回の状態で以下のようなコールセンター定義となっております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/a6d99fc8-3d76-b0f8-0846-a8aca1ab262e.png)

※この時注意すべきは、インストールされたパッケージには `demoAdapterPage2` ページが存在しないのに、コールセンター 定義ファイルには、 `CTI Adapter URL2 ：/apex/demoAdapterPage2` という記述が存在することです。
このままでは動きませんので修正が必要です。
（ほんとトラップだよ・・・これ・・・。。）
この修正は、`5. 設定状況確認と必要に合わせてコールセンター の定義修正`にて追加の解説します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/9811c252-0794-2a26-592a-f9b522032b77.png)



### 3. コールセンター に ユーザーを追加
コールセンターの詳細の下の方に`コールセンターユーザーの管理` ボタンがあるのでそちらをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/8061e60b-4155-2f87-95de-0fdb26f1799e.png)

コールセンター ユーザーの管理画面が表示されるため、`ユーザー追加`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/40161f39-14ca-f03a-c375-5dd4f0ded464.png)

条件にあわせてユーザーを検索してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/4ddf31f9-851a-4ca4-b46f-ca739b264c08.png)

リストに出てきたユーザーをチェックして、`コールセンターに追加`ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/e1511e10-5d83-7169-c97f-37b1f1d1ae90.png)

これでユーザーが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/8954372b-4e1b-e7af-8900-01153964746f.png)

以上です。

### 4. ユーティリティバーにOpen CTI Softphoneを追加
ここでは、ユーティリティバーにソフトフォンが表示できるようにします。
なお、ユーティリティバーとは、以下の下部分にあるバーのことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/849883cf-73cd-bb08-c2a4-7a7725d2b645.png)
まず、`アプリケーションマネージャ`を開きます。今回ソフトフォンを追加したいアプリケーションを確認し、右側のメニュー▼を開き`編集`を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/b02f0e97-641b-e5eb-c38d-b7086aa70262.png)
`アプリケーションの設定`の中から、`ユーティリティ項目`を選択し、`ユーティリティ項目を追加`ボタンをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/cb7c6272-0dcc-6b03-5cbd-9ea475e15bc7.png)
すると、以下のように簡易メニューが開かれるので、その中から、`Open CTI ソフトフォン`を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/5b840970-f4c8-5810-0553-a34784428a73.png)
以下のように表示されます。
ラベルやアイコンなど、気になるようなら変更して、`保存`ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/bae71575-5fa0-4881-06f4-0af39937e323.png)
これで、ソフトフォンがユーティリティバーに表示されるようになります。

### 5. 設定状況確認と必要に合わせてコールセンター の定義修正
試しに、以下のユーティリティバーに表示されたPhoneをクリックしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/f11ac0dc-1916-35b6-04b3-142c98d61252.png)
以下のエラーメッセージが出てきたら定義ファイルに問題があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/c9ada416-c82f-1ae0-9749-a0bfaf639e74.png)
改めて、このエラーメッセージは定義ファイルに存在していないページを指定している場合に出るエラーメッセージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/84bca3bb-86a2-1dc7-591c-ea3fa236b380.png)
以下のように修正しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/1389cd67-207c-3e6d-fbfb-c3fc0f083ad5.png)
もう一度クリックして、以下のような画面が出てきたら問題なく設定完了できています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/ac43f950-66c4-752c-4aa5-df9f075abc1f.png)

ここから先は、Trailhead Playgroundでは問題ないのに、Sandbox上でエラーが発生して気づいた問題です。
Snadbox上では、Phoneをクリックすると、以下のようなエラー画面が出ることがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/ac4711e7-d84e-c195-0e5e-5dce6cdb8f42.png)

このような時は、demoAdapterPageを直接プレビューから開いてみてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/50cc367c-331b-5128-db0c-c76c6f0078a4.png)
 
この時、プレビュー上では問題なさそうに表示されるのに、コンソールログを見ると以下のエラーメッセージが出力されていたりします。 
`Refused to frame 'https://XXXXXXXXXXXX.visual.force.com/' because an ancestor violates the following Content Security Policy directive: "frame-ancestors 'self' https://XXXXXXXXXXXX.my.salesforce.com (https://XXXXXXXXXXXX.my.salesforce.com/)".`


この問題は、既にGithub上でissueとして上がってます。
https://github.com/developerforce/open-cti-demo-adapter/issues/36

issueのコメントを追うと解決策が書いてます。
この件は、相対パスではなく絶対パスで定義すると解決するとのことでした。

なお、手順のサイトをよく確認したら、注意事項として記載ありました。
（私は読み飛ばしてしまっておりました。反省点の一つです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/d114ac1b-8698-b5c0-08fe-383682076806.png)

この内容を踏まえて、以下のように修正することで解決できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/99c7d673-b1aa-6c44-95b5-7fce95cf4e01.png)

なお、必要に応じてContent Security Policy対策のためホワイトリストへドメインを追加しなければならない事もあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/ed69f466-a9a6-f7fb-acb4-8a3a325f2532.png)

以上の設定で、以下のような画面が出てきたら問題なく設定完了できています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/ac43f950-66c4-752c-4aa5-df9f075abc1f.png)


### 6. ソフトフォンにログイン
このソフトフォンはデモで実際には電話をかけないアプリですが、ログイン機能があります。
ユーザーIDやパスワードは何も入力せずに、`Log In`ボタンを押せば次の画面に移動します。

ログイン成功したら以下のような画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/e12a88b3-1d13-9e34-7e4c-dce47626135d.png)
ダイヤルパッドをクリックすると、ダイヤルが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/f1b07d9e-e137-6b34-8765-48f8fd322742.png)
以上です。
上記の手順を行うことで、Salesforce上の電話フィールドは全て、電話機マークがつくようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/1375a7cb-7862-84a3-e811-295c61ce35f4.png)

この時、電話マークをクリックすると、電話が発信される仕組みです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/7f4bb003-d421-c031-d1fd-80975e3b6f4e.png)

## カスタムコンポーネント上での実装について
LWCカスタムコンポーネント上にて、電話番号をCTI連携する方法は以下の通りです。

```
<lightning-click-to-dial value="000-1111-2222" record-id="5003000000D9duF"></lightning-click-to-dial>
```
標準レイアウト上の電話番号は自動的にSalesforceが切り替えて表示してくれるが、カスタムコンポーネント上では意図的に実装しないとソフトフォンが起動しません。
`record-id` 属性を指定することで、電話の宛先`Name`をポップアップに表示できるようになります。
なお、これを実装すると、**<font color="HotPink">必ず電話アイコン（📞）が表示されるようになるため</font> 要注意** です。
必要に応じて、以下のようなロジックを呼び出し、`lightning-click-to-dial`を利用しないようなロジックも検討が必要です。

```
/**
 * コールセンターが利用できるかどうかを返す
 */
@AuraEnabled(cacheable=true)
public static Boolean isAvailableCallCenter() {
  User user = [
    SELECT Id, Name, CallCenterId
    FROM User WHERE Id = :UserInfo.getUserId()
  ];
  return (user.CallCenterId != null);
}
```

※補足※
ユーティリティ上に表示するように設定したソフトフォンは、ユーザーがコールセンターに追加されていないと連動して表示されない仕組みとなっています。
よって、ユーザーにコールセンターId情報が内部的に紐づいているかどうかを判断条件にできます。
参考：[User  | Salesforce および Lightning プラットフォームのオブジェクトリファレンス](https://developer.salesforce.com/docs/atlas.ja-jp.226.0.object_reference.meta/object_reference/sforce_api_objects_user.htm)

## 参考リンク
* [Lightning Open CTI ](https://developer.salesforce.com/ja/wiki/lightning_open_cti)
    * デモ用のソフトフォンアプリのインストール方法が記載されている。
        * デモというだけあって実際に電話はしない。

* [Trailhead:Module:Lightning Experience のコールセンターインテグレーション ](https://trailhead.salesforce.com/ja/content/learn/modules/service_call)
    * この単元に従うと空のソフトフォンをセットアップできる。
        * 設定前と設定後の違い
            * ”電話”のフィールドに対して、電話番号の前に、斜線の入った電話マークがつく
            
             ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/6faff0f6-5580-69dd-02da-35817ae0cbe7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504068/91cb66bb-6e57-a488-a956-f55f48724300.png)

    * 注意：このTrailhead単元に沿って作成したコールセンター の定義と [Lightning Open CTI ](https://developer.salesforce.com/ja/wiki/lightning_open_cti) の指示に従って作るコールセンター の定義はAPI参照名が同じであるため、既に片方実装されていると片方がまともに動かない。この場合、Trailhead単元に従って作成したコールセンター の定義を削除するとよい。

* [lightning-click-to-dial - example - Salesforce Lightning Component Library ](https://developer.salesforce.com/docs/component-library/bundle/lightning-click-to-dial/example)
    * システム的に`click-to-dial`を実装したい時の解説ページ。この通りに記載すると、電話アイコンが付与される。



## 最後に、今回の調べて思ったことは、、、
そもそもソフトフォンという存在を知らなかったので、すごく学びになった気がする。
実際にソフトフォンを導入して使ってみたいという気持ちが調べながらだと凄く盛り上がりはしたが、冷静に考えると、ソフトフォンが導入されても、私はソフトフォンを使って電話する可能性が１割も無いのでは？と改めて感じたため、盛り上がった気持ちはすぐに鎮火しました。
改めて特定の分野で働く人の業務効率を改善するようなサービスって色々あるんだなぁという感想となりました。
この知識が、どこかでまた役に立つことがあるのだろうか・・？という気持ちもありつつ、日本語向けの資料が少なかったので今回、思い切って、記事にしてみました。
いつか誰かの助けになれば良いな・・・。

以上です。ではでは。