5-3-2. 複数の書類を一括送信する

送信処理の1回の呼び出しで、1件以上の書類を一括で送信する Apex クラス実装例を示します。
例では、1件以上の取引先責任者に対して、取引先責任者ごとに [ファイル] 関連リストにアップロードされた添付ファイルを送信します。

注意事項

この例を実行するには、ユーザ設定に Apex クラス実行ユーザのクラウドサインクライアント ID を保存しておく必要があります。
ガバナ制限を超えると実行時例外が発生します。「送信処理APIで書類を送信する」より、 [送信およびリマインド処理で消費するコールアウト数] を参考に、コールアウト数を考慮の上でご利用ください。

解説

ApiExecutor.beforeExecute() で送信に必要な事前設定をチェックします。
エラーがない場合は、取引先責任者ごとに、送信先および添付ファイルの情報から ApiExecutor.Document オブジェクトを生成し、送信パラメータをリストに設定します。ApiExecutor.send() で書類の送信に成功すると、送信した書類情報がクラウドサイン管理に追加されます。
書類送信後、取引先責任者ごとに、ApiExecutor.Result オブジェクトを確認し、成功した場合はクラウドサイン管理の追加属性(カスタム項目)の更新、失敗した場合はエラーメッセージの表示などを行います。

クラスやメソッドの詳細は、「API リファレンス」をご参照ください。

// 送信処理APIインスタンス生成
CloudSign.ApiExecutor apiExecutor = new CloudSign.ApiExecutor();

// 送信処理API実行前処理
List<String> messages = apiExecutor.beforeExecute();
if (messages.size() > 0) {
    System.debug(String.join(messages, '\r\n'));
    return;
}

// 取引先責任者を【送信先】にする
List<Contact> contacts = new List<Contact>([SELECT Id, Name, Email, Account.Name
                                            FROM Contact
                                            WHERE Name LIKE '山田%']);

// 【送信先】に関連付けられたファイルの最新バージョンを取得
List<Id> sendObjectIds = new List<Id>(new Map<Id, Contact>(contacts).keySet());
List<ContentDocumentLink> contentDocumentLinks = [SELECT Id, LinkedEntityId, ContentDocument.LatestPublishedVersionId
                                                  FROM ContentDocumentLink
                                                  WHERE LinkedEntityId IN :sendObjectIds
                                                  ORDER BY ContentDocument.CreatedDate ASC];

// 送信パラメータリスト
List<CloudSign.ApiExecutor.SendParam> sendParams = new List<CloudSign.ApiExecutor.SendParam>();
// 【送信先】ごとに書類情報を生成
for (Contact contact : contacts) {

    // 送信先
    CloudSign.ApiExecutor.Participant participant = new CloudSign.ApiExecutor.Participant();
    participant.setId(contact.Id);
    participant.setName(contact.Name);
    participant.setEmail(contact.Email);
    participant.setOrganization(contact.Account.Name);
    // 送信先リスト
    List<CloudSign.ApiExecutor.Participant> participants = new List<CloudSign.ApiExecutor.Participant>();
    participants.add(participant);

    // 添付ファイルリスト
    List<Id> contentVersionIds = new List<Id>();
    for (ContentDocumentLink contentDocumentLink : contentDocumentLinks) {
        if (contact.Id == contentDocumentLink.LinkedEntityId) {
            contentVersionIds.add(contentDocumentLink.ContentDocument.LatestPublishedVersionId);
        }
    }

    // 書類
    CloudSign.ApiExecutor.Document document = new CloudSign.ApiExecutor.Document();
    document.setTitle('契約書の送付 ' + contact.Name);
    document.setAccessCode('3txqufj7o0');
    document.setLanguageCode(CloudSign.ApiExecutor.MailLanguage.JAPANESE);
    document.setCanTransfer(false);
    document.setParticipants(participants);
    document.setContentVersionIds(contentVersionIds);

    // 送信パラメータを生成(【送信先】と書類情報を設定)
    CloudSign.ApiExecutor.SendParam sendParam = new CloudSign.ApiExecutor.SendParam();
    sendParam.setSendObjectId(contact.Id);
    sendParam.setDocument(document);

    // 送信パラメータリストにパラメータを追加
    sendParams.add(sendParam);
}

// 送信処理API実行(複数処理)
List<CloudSign.ApiExecutor.Result> results = apiExecutor.send(sendParams);

// 結果取得
for (CloudSign.ApiExecutor.Result result : results) {
    if (result.isSuccess()) {
        // 成功
        System.debug('クラウドサイン管理レコードID:' + String.valueOf(result.getCloudSignControlId()));
    } else {
        // パラメータエラー
        for (String error : result.getParamErrors()) {
            System.debug(error);
        }
        // クラウドサインWebAPIレスポンス
        if (result.getApiResponse() != null) {
            CloudSign.ApiExecutor.ApiResponse response = result.getApiResponse();
            System.debug('method:' + response.getMethod());
            System.debug('endpoint:' + response.getEndpoint());
            System.debug('code:' + response.getCode());
            System.debug('error:' + response.getError());
            System.debug('message:' + response.getMessage());
        }
        // DML エラー
        if (result.getDmlErrors().size() > 0) {
            for (Database.Error error : result.getDmlErrors()) {
                System.debug('DMLError statusCode:' + error.getStatusCode());
                System.debug('DMLError message:' + error.getMessage());
                System.debug('DMLError fields:' + error.getFields());
            }
        }
    }
}