機械翻訳について

Genesysでの着信コールの切断または拒否

メディア・ツールバー・アプリケーションは、マイクロサービスから公開された様々なイベントをリスニングします。

コールを切断するには、次の3つの方法があります:
  1. メディア・ツールバー・アプリケーションから。
  2. Fusionアプリケーションから。
  3. Genesys用に構成されたソフト・フォンから。

シナリオ1および2: メディア・ツールバーおよびFusionアプリケーションからのコールの切断

次のフロー図は、エージェントがFusionまたはメディア・ツールバー・アプリケーションからコールを切断した後に実行される一連の操作を示しています:

Genesysのメディア・ツールバーおよびFusionアプリケーション・シナリオからの切断コール。

  1. エージェントは、Fusionアプリケーションまたはメディア・ツールバー・アプリケーションからコールを切断できます。
    • エージェントがFusionアプリケーションの「拒否」ボタンをクリックすると、onToolbarInteractionCommandイベントがコマンド rejectで起動されます。

      エージェントがFusionアプリケーションの「コール終了」ボタンをクリックすると、onToolbarInteractionCommandイベントがコマンドwrapupで起動されます。

      エージェントがメディア・ツールバー・アプリケーションからのコールを拒否すると、コールが拒否されたことがマイクロサービスに通知されます。

      エージェントがメディア・ツールバー・アプリケーションからのコールを終了すると、コールが終了したことがマイクロサービスに通知されます。

  2. メディア・ツールバー・アプリケーションは、このイベントを受信し、イベントがコールを切断する場合、コールを切断するようにマイクロサービスに通知されます。
  3. マイクロサービスは、通知を受信したら、com.genesyslab.platform.voice.protocol.tserver.requests.party.RequestReleaseCallリクエストを使用してGenesysサーバーにコールの切断をリクエストする必要があります。
  4. RequestReleaseCall リクエストが成功すると、EventReleasedメッセージがGenesysからマイクロサービスを介してメディア・ツールバー・アプリケーションに伝播されます。
  5. メディア・ツールバー・アプリケーションは、webソケットを介してEventReleasedメッセージを受信し、コールが拒否された場合はreject、コールが終了した場合はwrapupという理由のcloseCommEventアクションを起動します。
  6. Fusionアプリケーションでこのアクションが識別されると、理由がrejectの場合はコール・ダイアログ・ボックスがUIから破棄され、理由がwrapupの場合はラップ・アップ・ウィンドウがUIに表示されます。

エージェントは、アプリケーションFusionまたはメディア・ツールバー・アプリケーションからコールを切断

エージェントは、Fusionアプリケーションまたはメディア・ツールバー・アプリケーションからコールを切断できます。

  • エージェントがFusionアプリケーションの「拒否」ボタンをクリックすると、onToolbarInteractionCommandイベントがコマンドrejectで起動されます。
  • エージェントがFusionアプリケーションの「コール終了」ボタンをクリックすると、onToolbarInteractionCommandイベントがコマンドwrapupで起動されます。
  • エージェントがメディア・ツールバー・アプリケーションからのコールを拒否すると、コールが拒否されたことがマイクロサービスに通知されます。
  • エージェントがメディア・ツールバー・アプリケーションからのコールを終了すると、コールが終了したことがマイクロサービスに通知されます。

マイクロサービスにコールの切断を通知

エージェントがメディア・ツールバー・アプリケーションまたはFusionアプリケーションからコールを切断する場合、エージェントがコールを切断したことをマイクロサービスに通知する必要があります。 そのためには、次の例に示すように、vendorHandler.tsファイルのrejectCall 関数を更新します:

public async rejectCall(): Promise<void> {
        const headers: Headers = (new Headers()) as Headers;
        headers.set('Content-type', 'application/json');
        const message: any = {
            "type": "Reject",
            "connectionId": VendorHandler.connectionId
        };
        const request: Request = new Request(`${VendorHandler.REST_ENDPOINT_URL}`, {
            method: 'POST',
            headers: headers,
            body: JSON.stringify(message)
        }) as Request;
        await fetch(request);
    }
 
    public async hangupCall(): Promise<void> {
        const headers: Headers = (new Headers()) as Headers;
        headers.set('Content-type', 'application/json');
        const message: any = {
            "type": "Reject",
            "connectionId": VendorHandler.connectionId
        };
        const request: Request = new Request(`${VendorHandler.REST_ENDPOINT_URL}`, {
            method: 'POST',
            headers: headers,
            body: JSON.stringify(message)
        }) as Request;
        await fetch(request);
    }

マイクロサービスによるコール切断リクエストの作成

マイクロサービスは、PSDKを使用して、コールを切断するリクエストを作成します。

マイクロサービスはEventReleasedメッセージを受信

コール切断のリクエストが成功すると、GenesysサーバーはwithEventReleasedメッセージで応答し、マイクロサービスを介してメディア・ツールバー・アプリケーションに伝播されます。

メディア・ツールバー・アプリケーションからcloseCommEventをコール

webソケットを介してEventReleasedメッセージを受信すると、次の例に示すように、callHangupHandlerファンクションがintegrationEventsHandler.tsファイルからコールされます:

public webSocketOnMessage(event: MessageEvent): void {
        const jsonMessage = JSON.parse(event.data);
        console.log(jsonMessage);
        if (jsonMessage.eventName === "EventRegistered") {
            // Genesys notifies that the agent is ready
            this.integrationEventsHandler.makeAgentAvailable();
        } else if (jsonMessage.eventName === "EventRinging") {
            // Show incoming call notification
            this.integrationEventsHandler.incomingCallHandler(jsonMessage.ANI, jsonMessage.eventId);
            VendorHandler.connectionId = jsonMessage.connectionId;
        } else if (jsonMessage.eventName === "EventEstablished") {
            // Genesys notifies that the call is accepted
            this.integrationEventsHandler.callAcceptedHandler(jsonMessage.eventId);
        } else if (jsonMessage.eventName === "EventReleased") {
            // Genesys notifies that the call is disconnected
            this.integrationEventsHandler.callHangupHandler(jsonMessage.eventId);
        }
        console.log("Message is received");
    }

コールがFusionアプリケーションで切断されました

Fusionアプリケーションは、コールが拒否された場合に着信コール通知を削除します。コールが終了すると、WRAPUPウィンドウが表示されます。 メディア・ツールバーのアプリケーションUIが更新され、エージェントがコールに使用できることが示されます。

シナリオ3: ソフト・フォンからの通話の切断

エージェントがソフト・フォンからのコールを受け入れると、EventEstablishedイベントによって、コールが受け入れられたという通知が送信されます。 次の図に示すように、コールが受け入れられたシナリオを処理するためのロジックをEventEstablishedイベントに追加できます。 フロー図は、エージェントがソフト・フォンからの着信コールを受け入れると実行される一連の操作を示しています:

Genesysのソフト・フォン・シナリオからの切断。

  1. エージェントがソフト・フォン・アプリケーションからコールを切断すると、Genesysサーバーにはコールの切断が通知され、切断が成功すると、GenesysサーバーはEventReleasedメッセージをマイクロサービスに送信し、webソケットを介してこのメッセージをメディア・ツールバー・アプリケーションに伝播します。
  2. メディア・ツールバー・アプリケーションは、このイベントを受信し、closeCommEvent アクションを起動します。
  3. Fusionアプリケーションがアクションを識別すると、その理由がrejectの場合はコール・ダイアログ・ボックスがUIから破棄され、コールが終了した場合はWRAPUPウィンドウが破棄されます。

マイクロサービスは、EventReleasedメッセージをメディア・ツールバー・アプリケーションに伝播

エージェントがソフト・フォン・アプリケーションからコールを切断すると、コールを切断するようにGenesysサーバーに通知され、コールが切断されると、GenesysサーバーはEventReleasedメッセージをマイクロサービスに送信し、このメッセージをwebソケットを介してメディア・ツールバー・アプリケーションに伝播します。

メディア・ツールバー・アプリケーションからcloseCommEventをコール

EventReleasedメッセージがwebソケットを介して受信されると、次の例に示すように、callHangupHandlerファンクションがintegrationEventsHandler.tsファイルで起動されます:

public webSocketOnMessage(event: MessageEvent): void {
        const jsonMessage = JSON.parse(event.data);
        console.log(jsonMessage);
        if (jsonMessage.eventName === "EventRegistered") {
            // Genesys notifies that the agent is ready
            this.integrationEventsHandler.makeAgentAvailable();
        } else if (jsonMessage.eventName === "EventRinging") {
            // Show incoming call notification
            this.integrationEventsHandler.incomingCallHandler(jsonMessage.ANI, jsonMessage.eventId);
            VendorHandler.connectionId = jsonMessage.connectionId;
        } else if (jsonMessage.eventName === "EventEstablished") {
            // Genesys notifies that the call is accepted
            this.integrationEventsHandler.callAcceptedHandler(jsonMessage.eventId);
        } else if (jsonMessage.eventName === "EventReleased") {
            // Genesys notifies that the call is disconnected
            this.integrationEventsHandler.callHangupHandler(jsonMessage.eventId);
        }
        console.log("Message is received");
    }

コールがFusionアプリケーションで切断されました

Fusionアプリケーションは、コールが拒否された場合に着信コール通知を削除します。コールが終了すると、WRAPUPウィンドウが表示されます。 メディア・ツールバーのアプリケーションUIが更新され、エージェントがコールに使用できることが示されます。

完全なコード

呼出しを切断するためのvendorHandler.tsファイルの完全なコードを次に示します。

import { ICtiVendorHandler } from './ICtiVendorHandler';
import { IntegrationEventsHandler } from '../integrationEventsHandler';
 
export class VendorHandler implements ICtiVendorHandler {
    public static connectionId: string;
    private static REST_ENDPOINT_URL: string = 'http://localhost:8087/genesys/events';
    private static WS_ENDPOINT_URL: string = 'ws://localhost:8087/genesysWs';
    private integrationEventsHandler: IntegrationEventsHandler;
 
    constructor(integrationEventsHandler: IntegrationEventsHandler) {
        this.integrationEventsHandler = integrationEventsHandler;
    }
 
    public async webSocketOnOpenHandler(): Promise<void> {
        console.log("WebSocket opened");
        const headers: Headers = (new Headers()) as Headers;
        headers.set('Content-type', 'application/json');
        const message: any = {
            "type": "initialize"
        };
        const request: Request = new Request(`${VendorHandler.REST_ENDPOINT_URL}`, {
            method: 'POST',
            headers: headers,
            body: JSON.stringify(message)
        }) as Request;
        await fetch(request);
    }
    public webSocketErrorHandler(error: any): void {
        console.log("WebSocket error", error);
    }
    public webSocketCloseHandler(event: Event): void {
        console.log("WebSocket is closed", event);
    }
 
    public webSocketOnMessage(event: MessageEvent): void {
        const jsonMessage = JSON.parse(event.data);
        console.log(jsonMessage);
        if (jsonMessage.eventName === "EventRegistered") {
            // Genesys notifies that the agent is ready
            this.integrationEventsHandler.makeAgentAvailable();
        } else if (jsonMessage.eventName === "EventRinging") {
            // Show incoming call notification
            this.integrationEventsHandler.incomingCallHandler(jsonMessage.ANI, jsonMessage.eventId);
            VendorHandler.connectionId = jsonMessage.connectionId;
        } else if (jsonMessage.eventName === "EventEstablished") {
            // Genesys notifies that the call is accepted
            this.integrationEventsHandler.callAcceptedHandler(jsonMessage.eventId);
            VendorHandler.connectionId = jsonMessage.connectionId;
        } else if (jsonMessage.eventName === "EventReleased") {
            // Genesys notifies that the call is disconnected
            this.integrationEventsHandler.callHangupHandler(jsonMessage.eventId);
        }
        console.log("Message is received");
    }
    public async makeAgentAvailable(): Promise<void> {
        let webSocket: WebSocket = new WebSocket(`${VendorHandler.WS_ENDPOINT_URL}`);
        webSocket.onopen = this.webSocketOnOpenHandler.bind(this);
        webSocket.onmessage = this.webSocketOnMessage.bind(this);
        webSocket.onclose = this.webSocketCloseHandler.bind(this);
        webSocket.onerror = this.webSocketErrorHandler.bind(this);
    }
 
    public async makeAgentUnavailable(): Promise<void> {
        // TODO: call the vendor specific api to make the agent available
    }
    public async makeOutboundCall(phoneNumber: string, eventId: string): Promise<void> {
        // TODO: call the vendor specific api to make the make an outbound call
    }
    public async acceptCall(): Promise<void> {
        const headers: Headers = (new Headers()) as Headers;
        headers.set('Content-type', 'application/json');
        const message: any = {
            "type": "Accept",
            "connectionId": VendorHandler.connectionId
        };
        const request: Request = new Request(`${VendorHandler.REST_ENDPOINT_URL}`, {
            method: 'POST',
            headers: headers,
            body: JSON.stringify(message)
        }) as Request;
        await fetch(request);
    }
    public async rejectCall(): Promise<void> {
        const headers: Headers = (new Headers()) as Headers;
        headers.set('Content-type', 'application/json');
        const message: any = {
            "type": "Reject",
            "connectionId": VendorHandler.connectionId
        };
        const request: Request = new Request(`${VendorHandler.REST_ENDPOINT_URL}`, {
            method: 'POST',
            headers: headers,
            body: JSON.stringify(message)
        }) as Request;
        await fetch(request);
    }
 
    public async hangupCall(): Promise<void> {
        const headers: Headers = (new Headers()) as Headers;
        headers.set('Content-type', 'application/json');
        const message: any = {
            "type": "Reject",
            "connectionId": VendorHandler.connectionId
        };
        const request: Request = new Request(`${VendorHandler.REST_ENDPOINT_URL}`, {
            method: 'POST',
            headers: headers,
            body: JSON.stringify(message)
        }) as Request;
        await fetch(request);
    }
}

進捗の確認

これらのステップが終了したら、OJETサーバーを使用してアプリケーションを起動し、Fusionアプリケーションにサインインします。 メディア・ツールバーを開き、「エージェント可用性」ボタンをクリックしてエージェントをコールに使用できるようにします。 次に、カスタマ・ケア番号へのコールを開始します。 着信コール通知は、メディア・ツールバー・アプリケーションおよびFusionアプリケーション・ウィンドウで受信します。 メディア・ツールバー・アプリケーションから、またはFusionアプリケーションから、またはSoftphoneアプリケーションからコールを受け入れることができます。 コールを受け入れると、メディア・ツールバーの状態がACCEPTED状態に変わり、エンゲージメントがFusionアプリケーションで開きます。 通話は、メディア・ツールバー・アプリケーションから、またはFusionアプリケーションから、またはソフト・フォンから切断できます。 コールを切断すると、メディア・ツールバーの状態がDISCONNECTED状態に変更されます。