【AWS】【Salesforce】CTIフローからApexクラスのメソッドを呼び出す

# 1.はじめに
どうも、ARIの名古屋支社に勤務している愛知県民です♪
(/・ω・)/

[前回の記事](https://qiita.com/Aichi_Lover/items/06573a82d9af2f982b7f)ではApexクラスの作成について記載したので、
**今回はCTIフローからApexクラスのメソッドを呼び出す方法について記事にしたいと思います。**

この記事がCTI Adapter、Salesforceについて勉強中の方の参考になれば幸いです♪
(*^^)v

# 2.用語の説明
## 2.1.Apexとは
Apexとは、JavaベースのSalesforce独自のプログラム言語です。

Salesforce内のオブジェクトの検索や作成をするメソッド等が提供されており、
それらを組み合わせて処理を記述することができます。

Apexクラスとは、オブジェクト指向におけるクラスと同様のものとなります。

## 2.2.CTI Adapterとは
AmazonConnectとSalesforceを連携させる際に使用するクラウドサービスのことです。
（厳密にはAWSのサービスです。）

CTI Adapterを使用することで、Salesforceのコンソールからソフトフォンを開いたり、
着信時にSalesforceの取引先責任者をポップアップしたりすることができます。

## 2.3.CTIフローとは
CTIフローとはCTI Adapterの機能の1つで、
ボタンのクリックや着信をトリガーとして特定のレコードを作成したり、
ポップアップを表示したりすることができます。
（Salesforce内のコンタクトフロー的なものという認識です。）

ちなみに、他のCTI Adapterの機能としては以下の3種類があります。

* Attributes
* Presence Sync Rules
* Features

# 3.前提条件
以下に前提条件を示します。

* Apexクラスが作成済であること
* CTI Adapterのインストールが完了していること
※本記事におけるCTI Adapterのバージョンは5.17です

# 4.概要
今回は例として、**CTIフローからApexクラス「HelloWorld」のメソッド「helloworld」に引数「key=Message」を渡し、
戻り値として「HelloWorld!」をポップアップとして表示したい**と思います。

使用するApexクラス「HelloWorld」は以下となります。

```
global class HelloWorld {
    public String helloworld(String key) {
        Map<String, String> mapTest = new Map<String, String>();
        mapTest.put('Status', 'OK');
        mapTest.put('Message', 'HelloWorld!');
        System.debug(mapTest);
        
        String res = (String)mapTest.get(key);
        
        if(res == null){
            return 'エラー：キーが見つかりませんでした';
        }            
        return res;
    }
}
```

また、Apexクラス「HelloWorld」のテストクラスは以下となります。

```
@isTest
private class HelloWorldTest {

    @isTest static void hello() {
        HelloWorld hello_world = new HelloWorld();
        String result = hello_world.helloworld('Status');
        System.debug('結果=' + result);
        
        result = hello_world.helloworld('Message');
        System.debug('結果=' + result);

        result = hello_world.helloworld('Test');
        System.debug('結果=' + result);        
    }
}
```

# 5.CTIフローの設定
5.1.CTI Adapterの管理画面から「CTI Flows」を選択し、「新規」を選択します。

|![CTIフローを新規作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/bd29e293-f078-4ee2-c41a-e4835ebbbf9a.png)|
|:--|

5.2.以下のように設定し、「保存」を選択します。

|項目|設定内容|
|---|---|
|CTI Flow Name | 任意（例では「Apex検証01」としました） |
|Source |CTI Action|
|Description |任意|
|Active |チェックあり|

※今回は例としてCIT ActionからApexクラスのメソッドを呼び出しますが、
　「Source」や「Event」の値を変更することで、着信時や応答時等にも呼び出すことができます

|![000_CTI_Actionの設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/a91ccc57-bfa5-49d9-2c87-a45435e7050d.png)|
|:--|

5.3.CTIフローの左側にある「開始」「終了」「CTIフロー」をドラッグアンドドロップし、図のように接続します。

|![010_CTIフローの詳細.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/08ed02b2-c48a-b27e-1ec2-830d514b0be0.png)|
|:--|

ブロック1つ1つの設定については以下となります。

|番号|項目|設定内容|
|---|---|---|
|①|apexClass | Apexクラス名（例では「HelloWorld」としました） |
|①|methodName | メソッド名（例では「helloworld」としました） |
|①|methodParams | メソッドに渡す引数（例では「key=Message」としました）|
|②|message | $.actions.uid-（ブロック①のID）.results.runApex |
|③|message | エラー |

※①のブロックの「methodParams」について、メソッドに渡す引数がない場合は「null」を入力します。
※ブロックのIDはブロックにカーソルをあてると確認できます。以下の図のIDは36となります。

|![uidの確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/b89de327-e29c-ef0a-8d73-f6dc05381826.png)|
|:--|

5.4.「保存」を選択します。

|![020_CTIフローの保存.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/81ee0713-cfe4-23d1-a15b-2393f3fd5ade.png)|
|:--|

5.5.CTI Actionを有効化します。
詳細な手順は以下記事の「6.2.CTI Actionの設定」をご確認ください。

https://qiita.com/Aichi_Lover/items/6eeb9acdb7893a24e8e8#62cti-action%E3%81%AE%E8%A8%AD%E5%AE%9A

# 6.動作確認
6.1.Salesforce上でCCP開き、右側にある「<」を選択します。

|![030_CCPの＜マークを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/efe725af-f046-21b7-5b86-84a8b26d95d0.png)|
|:--|

6.2.手順5.5で有効化したCTI Actionの右の「Execute」を選択します。

|![040_CTI_Actionを起動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/5e3f5299-2d73-84f3-51d7-c9fd7467e014.png)|
|:--|

6.3.画面上部にポップアップが表示されることを確認します。

|![050_CTI_Action起動結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/7c09d9c3-24be-3f4f-7e16-c534001a572f.png)|
|:--|

ちなみに、手順5.3にて「key=Message」と設定した部分を「key=Status」とすると、
以下のポップアップが表示されます。

|![050_CTI_Action起動結果_引数を変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/9cb48be6-5681-d40a-6370-e495334e21dd.png)|
|:--|

# 7.おわりに
ここまで読んで下さり、ありがとうございます！！！
(^^)

CTIフローからApexクラスのメソッドを呼び出すことで、
CTIフロー単独では扱えないSalesforceの複雑な操作も実現できると思いました。

次はVisualforceからApexクラスを呼び出す方法、
もしくはApexクラスからLambda関数を呼び出す方法について書く・・・かもしれません。
(:3_ヽ)_