Adobe Acrobat Sign for Salesforce: Руководство для разработчиков

Последнее обновление 20 февр. 2024 г.

Обзор

Adobe Acrobat Sign для Salesforce: руководство для разработчиков призвано помочь разработчикам Salesforce узнать об объектах и параметрах, необходимых для интеграции вашего пакета Salesforce с Adobe Acrobat Sign.

Дополнительные сведения см. в следующих разделах:

Внимание!

Объекты Adobe Acrobat Sign for Salesforce могут измениться в будущем выпуске. Если вы создаете пользовательское решение, которое зависит от измененных объектов, вам может потребоваться обновить вашу настройку.

Руководство разработчика

  • Если вам нужно знать, когда соглашение полностью подписано, реализуйте триггер Apex на объекте echosign_dev1__SIGN_Agreement__c, после или до обновления (в зависимости от сценария использования и требований). Когда поле echosign_dev1__Status__c изменится на Подписано или Утверждено или другие окончательные статусы, соглашение будет завершено. 
  • Если вам нужно знать, когда каждый отдельный подписанный PDF вставлен, например, если вам нужно получить каждый промежуточный подписанный PDF, то реализуйте Apex триггер на объектах Attachment или ContentVersion, после вставки, и следите за родительским соглашением и именем, которое заканчивается на «- signed.pdf» или «- approved.pdf» или другим окончательным статусом.
  • Если вам нужно знать, когда отдельный получатель подписал или одобрил, реализуйте триггер Apex на объекте echosign_dev1__SIGN_Recipients__c, после или до обновления (в зависимости от сценария использования и требований). Когда поле echosign_dev1__Status__c изменит статус Подписано или Утверждено или другие окончательные статусы, получатель будет завершен.  
  • Если вам нужно знать, когда происходит определенное событие, которое является частью процесса подписания, например, договор отправлен на подпись или отправлено напоминание, можно создать триггер на объекте событий договора (echosign_dev1__SIGN_AgreementEvent__c) и проверить тип события.
  • Имена окончательного статуса соглашения для завершенного соглашения следующие: «Подписано», «Одобрено», «Принято», «Форма заполнена» и «Доставлено».
  • Имена статусов окончательного соглашения для расторгнутого соглашения следующие: «Отменено/отказано», «Отменено/отказано», «Истекло».

Порядок обновлений

В версии 21 порядок обновлений изменился. Ниже приведена последовательность обновления соглашения и связанных с ним объектов:

  1. Вложения 
  2. Получатели 
  3. Документ (состояние и другие атрибуты)
  4. События соглашения 
  5. Каналы Chatter 

Службы Apex

Используемый метод Apex

Начиная с Acrobat Sign for Salesforce V 21.0, все асинхронные процессы (включая автоматические обновления и сопоставления данных) используют метод Queueable вместо метода Future, как рекомендует Salesforce.
С этим изменением все задания настройки, которые добавляются в очередь Salesforce для процесса автоматического обновления или сопоставления данных, будут завершаться с ошибкой: "System.LimitException: Too many queueable jobs added to queue:2."

Сбой происходит потому, что процесс с возможностью постановки в очередь может добавить только одно дочернее задание с возможностью постановки в очередь, которое уже занято Acrobat Sign. Подробности см. в разделе Лимиты очередей Apex

Если состояние соглашения не изменяется или сопоставление данных выполняется некорректно, может отобразиться следующая ошибка: «При создании цепочки заданий можно добавить только одно задание из выполняемого задания с помощью System.enqueueJob. Это означает, что у каждого родительского задания, добавляемого в очередь, может быть только одно дочернее задание. Запуск нескольких дочерних заданий из одного и того же задания, добавляемого в очередь, не поддерживается».

Чтобы устранить эту ошибку, найдите ошибочный триггер, построитель процесса или рабочий процесс и деактивируйте его или переключите его на использование синхронного вызова или запланируйте его на более позднее время.

Служба шаблона соглашения

Служба шаблона соглашения отображается как глобальная служба Apex в управляемом пакете. Это позволяет коду Apex за пределами управляемого пакета загружать соглашения на основе существующих шаблонов соглашений. Класс и все открытые методы помечены как глобальные, чтобы разрешить такой доступ.

Служба Apex доступна через класс вызова: echosign_dev1.AgreementTemplateService

Методы

global

static Id load()

Загружает соглашение с использованием шаблона соглашения, помеченного как шаблон по умолчанию и не имеющего типа основного объекта.

global

static Id load(String templateId)

Загружает соглашение, используя указанный идентификатор шаблона соглашения, который не имеет типа основного объекта.

 

global

static Id load(String templateId, String masterId)

Загружает соглашение, используя указанный идентификатор шаблона соглашения и указанный идентификатор основной записи, тип которой должен соответствовать типу основного объекта, настроенного в указанном шаблоне соглашения.

global

static Id load(String templateId, String masterId, Map<String,AgreementTemplateVariable> agreementTemplateVariables)

Загружает соглашение, используя указанный идентификатор шаблона соглашения и указанный идентификатор основной записи, тип которой должен соответствовать типу основного объекта, настроенного в указанном шаблоне соглашения. Также передает указанные переменные времени выполнения в виде пар имя-значение.

 

global

static List<AgreementTemplateService.AgreementTemplateBasicInfo> getAgreementTemplateList(AgreementTemplateListOptions options)

Получает список шаблонов соглашений на основе параметров фильтрации. Возвращает пустой список, если не найдено ни одного шаблона соглашения с заданными параметрами фильтрации.

global

static AgreementTemplateService.AgreementTemplateDetails getAgreementTemplateDetails(String templateId)

Получает сведения о шаблоне соглашения для указанного идентификатора шаблона соглашения.

Возвращает пустой объект, если шаблон соглашения не найден.

global

static String getAgreementTemplateUrl(String templateId)

Получает url для редактирования шаблона соглашения, заданный идентификатором шаблона соглашения.

global

static String getNewAgreementTemplateUrl()

Получает url для создания нового шаблона соглашения в Adobe Sign.

 Конструкторы

Доступ

Подпись

global

AgreementTemplateListOptions()

global

AgreementTemplateListOptions(String masterObjectType, Boolean isActive, Boolean hasAttachment, Boolean hasRecipient, Boolean autoSend)

Свойства глобального класса

Глобальный класс: AgreementTemplateService.AgreementTemplateListOptions

Доступ

Имя

global

masterObjectType

global

isActive

global

hasAttachment

global

hasRecipient

global

autoSend

Примечание

При запросе шаблонов договоров, если поле, указанное выше, имеет нулевое значение, фильтр по соответствующему полю не применяется.

ГЛОБАЛЬНЫЙ КЛАСС: AGREEMENTTEMPLATESERVICE.AGREEMENTTEMPLATEBASICINFO

Доступ

Имя

global

name

global

recordId

global

url

global

isDefault

global

daysUntilExpiration

global

language

ГЛОБАЛЬНЫЙ КЛАСС: AGREEMENTTEMPLATESERVICE.AGREEMENTTEMPLATEDETAILS

Доступ

Имя

global

message

global

ccList

global

dataMappingName

global

mergeMappingName

global

url

global

получатели

ГЛОБАЛЬНЫЙ КЛАСС: AGREEMENTTEMPLATESERVICE.RECIPIENTINFO

Доступ

Имя

global

recipientRole

global

recipientType

global

recipientName

global

signOrder

Переменные среды выполнения

У глобального класса echosign_dev1.AgreementTemplateVariable есть два следующих глобальных поля:

  • name: имя переменной, которое должно совпадать с именем переменной времени выполнения, настроенной в шаблоне соглашения.
  • value: значение переменной, используемое во время загрузки шаблона. Значение зависит от того, где была использована переменная. Например, для получателя это должен быть идентификатор записи контакта, потенциального клиента или пользователя либо адрес электронной почты. Для переменной документа это должен быть идентификатор записи вложения.

Результат

Каждый метод либо возвращает идентификатор вновь созданной записи соглашения, либо вызывает исключение с подробным сообщением об ошибке, если что-то пошло не так во время операции загрузки.

Службы API

Служба шаблона Adobe e-Sign API раскрывается как глобальная служба Apex управляемого пакета. Это позволяет коду Apex за пределами управляемого пакета вызывать набор API Adobe e-Sign через эти обертки. Обертки значительно упрощают вызов API, поскольку потребителям не нужно создавать модель данных запроса и ответа. Также потребителям не нужно обрабатывать преобразование данных Salesforce в модели данных e-Sign. Большая часть сложности абстрагируется от потребителя. Например, для отправки соглашения потребитель просто передает идентификатор записи соглашения, а сервис обрабатывает запрос, извлекает все необходимые данные, передает их по API и анализирует результат.

Класс и все открытые методы помечены как глобальные, чтобы разрешить такой доступ.

  • v17 и ниже вызывает SOAP API
  • v18 и выше использует REST API.

Служба Apex доступна через следующий класс вызова: echosign_dev1.EchoSignApiService

Улучшение Apex API для других получателей

Начиная с версии 24.14 или более поздней версии, обновленный Apex API позволяет заменить или добавить дополнительных получателей, а доступ осуществляется в рамках глобального класса EchoSignApiService. Уже введено два новых элемента:

  • Глобальная функция:

    /**

    * Input params:

    * toBeChangedRecipientId: SIGN_Recipient__c Id

    * newRecipientStr: JSON string of SIGN_Recipient__c of a new recipient for recipient replacement or alternate

    * changeType: REPLACE or ALTERNATE

    */

    global static void changeRecipient(Id toBeChangedRecipientId, String newRecipientStr, RECIPIENT_CHANGE_TYPE changeType )

  • Глобальное перечисление: RECIPIENT_CHANGE_TYPE {REPLACE, ALTERNATE}

Пример кода для вызова этого API для получателей (тип получателя: адрес электронной почты)

// сначала выполняется запрос всех получателей, связанных с соглашением

List<SIGN_Recipients__c> recipients = [SELECT Id, echosign_dev1__Agreement__c, echosign_dev1__Email_Address__c, echosign_dev1__ParticipantSet__c, echosign_dev1__Recipient_Type__c, echosign_dev1__Order_Number__c FROM echosign_dev1__SIGN_Recipients__c where echosign_dev1__Agreement__c = 'a0P7X000008Cc1GUAS'];

SIGN_Recipients__c newRecipient = null;

SIGN_Recipients__c replacedRecipient = null;

// поиск получателя, которого нужно заменить или изменить

// в этом случае поиск получателя следует выполнять по адресу электронной почты.

// Дополнительные условия можно добавить для поиска получателя, которого нужно заменить или изменить

for(SIGN_Recipients__c recipient: recipients) {

    if (rep.echosign_dev1__Email_Address__c == 'someUser@example.com') {

         newRecipient = recipient.clone(false, true, false, false);

         replacedRecipient = recipient;

    }

}

// обновление адреса электронной почты для нового получателя

newRecipient.echosign_dev1__Email_Address__c = ''someNewUser@abc.com';

// создание последовательности в строке json

String newRecipientStr = JSON.serialize(newRecipient);

Try {

    echosign_dev1.EchoSignApiService.changeRecipient(replacedRecipient.Id, newRecipientStr, EchoSignApiService.RECIPIENT_CHANGE_TYPE.REPLACE);

} catch (Exception ex) {

    // обработка исключения и повторное выведение при необходимости

}

Методы

global

static void cancelDocument(Id agreementId)

Отменяет соглашение с указанным идентификатором соглашения.

global

static echosign_dev1.EchoSignApiService.DocumentInfo getDocumentInfo(Id agreementId)

Получает подробную информацию для указанного идентификатора соглашения.

global

static List<EchoSignApiService.SigningUrl>

getSigningUrls(Id agreementId) 

Получает все URL-адреса подписания для указанного идентификатора соглашения.

global

static void removeDocument(Id agreementId)

Отменяет соглашение с указанным идентификатором соглашения и удаляет запись соглашения в Salesforce (соглашение не удаляется из учетной записи Adobe e-Sign).

global static void replaceSigner(Id replacementRecipientId)
Устарел с версии V 24.14. Версии пакетов до v24.14 все еще могут использовать их, поскольку они полагаются на API V5.
global static void replaceSigner(Id replacementRecipientId, String message)
Устарел с версии V 24.14. Версии пакетов до v24.14 все еще могут использовать их, поскольку они полагаются на API V5.

global

static echosign_dev1.EchoSignApiService.

SendDocumentResult sendDocument(Id agreementId)

Отправляет соглашение с указанным идентификатором соглашения, возвращает результат с ключом документа и URL-адресами.

global

static void sendReminder(Id agreementId)

Отправляет напоминание текущему подписанту для указанного идентификатора соглашения.

global static void updateAgreement(Id agreementId)  Обновляет соглашение с указанным идентификатором agreementId
global static EchoSignApiService.AgreementViewUrl getViewAgreementUrl(Id agreementId)
Извлекает страницу просмотра/управления из Sign для указанного ID соглашения, которое имеет свойство просмотра.
Примечание. По соображениям безопасности созданный URL соглашения имеет только временный срок действия, поэтому система генерирует REST-HTTPS вызов для получения нового URL из служб Adobe Sign.
global static void changeRecipient(Id toBeChangedRecipientId, String newRecipientStr, EchoSignApiService.RECIPIENT_CHANGE_TYPE changeType ) Доступно, начиная с версии 24.14. Этот API-интерфейс изменяет получателей соглашения.

Внутренние классы

  • Глобальный класс: DocumentHistoryEvent
СВОЙСТВА (2)

Доступ

Имя

global

String eventType

global

String participantEmail

КОНСТРУКТОРЫ (1)

Доступ

Подпись

global

DocumentHistoryEvent()

  • Глобальный класс: DocumentInfo
СВОЙСТВА (5)

Доступ

Имя

global

Map<string,list> historyByEmail

global

Map<String,EchoSignApiService.ParticipantInfo>
participantsByEmail

global

Map<String,EchoSignApiService.ParticipantInfo>
participantsByName

global

String senderEmail

global

String status

КОНСТРУКТОРЫ (1)

Доступ

Подпись

global

DocumentInfo()

  • Глобальный класс: ParticipantInfo
СВОЙСТВА (5)

Доступ

Имя

global

String company

global

String email

global

String name

global

String status

global

String title

КОНСТРУКТОРЫ (1)

Доступ

Подпись

global

ParticipantInfo()

  • Глобальный класс: SendDocumentResult
СВОЙСТВА (3)

Доступ

Имя

global

String documentKey

global

Exception error

global

String url

КОНСТРУКТОРЫ (1)

Доступ

Подпись

global

SendDocumentResult()

  • Глобальный класс: SigningUrl
СВОЙСТВА (3)

Доступ

Имя

global

String email

global

String esignUrl

global

String simpleEsignUrl

КОНСТРУКТОРЫ (1)

Доступ

Подпись

Global

 

Службы пакетной обработки Apex

Представляет основные действия с соглашениями e-Sign на массовом уровне, позволяя выполнить операцию над набором соглашений. Этот класс реализует интерфейс Salesforce Database.Batchable. Он может обрабатывать любое количество записей, которые будут разбиты на наборы по 5 и обрабатывать каждый набор как отдельную транзакцию, что позволяет соблюдать ограничения губернатора.

Служба пакетной обработки Apex доступна через следующий класс вызова: echosign_dev1.EchoSignActionBatch

Параметры

Для инициализации пакетной операции необходимо указать следующие параметры.

  • Список идентификаторов записей соглашений, над которыми следует выполнить указанное действие: у действия могут быть любые из поддерживаемых значений: напомнить, отправить, отменить, удалить или обновить.
  • Идентификатор сеанса текущего пользователя: требуется только для типа действия «Обновить».
  • Запись пользователя отправителя: используется для уведомления этого пользователя по электронной почте после завершения массовой обработки.

Пример использования

User submitterUser = UserInfo.getUserId();

EchoSignActionBatch batch = new EchoSignActionBatch( agreementIds, 'Remind', UserInfo.getSessionId(), submitterUser); Id syncProcessId = Database.executeBatch(batch, 5);

Пакет шаблонов соглашения

Принимает SOQL-запрос и идентификатор записи шаблона соглашения. Запрос выполняется для получения набора записей основных объектов, каждая из которых затем проходит через предоставленный шаблон соглашения для создания записи соглашения. Этот класс реализует интерфейс Salesforce Database.Batchable. Он может обрабатывать любое количество записей, которые будут разбиты на наборы по 5 и обрабатывать каждый набор как отдельную транзакцию, что позволяет соблюдать ограничения губернатора.

Типы записей, возвращаемые запросом SOQL, должны соответствовать типу основного объекта шаблона соглашения. Для каждой записи вызывается служба шаблона соглашения.

Служба пакетной обработки Apex отображается через следующий класс вызова:

echosign_dev1.AgreementTemplateBatch

Параметры

Для инициализации пакетной операции необходимо указать следующие параметры.

  • SOQL-запрос для выполнения: должен содержать идентификатор записи в качестве выбранного поля. Остальные поля не являются обязательными.
  • Идентификатор записи шаблона соглашения: используется вместе с идентификатором основной записи для загрузки соглашения.

Пример использования

String agreementTemplateId = [SELECT Id from echosign_dev1__Agreement_Template__c where Name = 'Default Template']; String soqlQuery = 'SELECT Id from Contact where Account.IsActive = true';

AgreementTemplateBatch batch = new AgreementTemplateBatch(soqlQuery, agreementTemplateId); Id syncProcessId = Database.executeBatch(batch, 5);

Пакетная служба шаблонов соглашений

Принимает список идентификаторов записей основных объектов и тип основного объекта, которые затем запрашиваются, и каждый из них затем прогоняется через предоставленный шаблон соглашения для создания записи соглашения. Этот класс реализует интерфейс Salesforce Database.Batchable. Он может обрабатывать любое количество записей, которые будут разбиты на наборы по 5 и обрабатывать каждый набор как отдельную транзакцию, что позволяет соблюдать ограничения губернатора.

Предоставленный тип основного объекта должен соответствовать предоставленному типу основного объекта шаблона соглашения. Для каждой записи вызывается служба шаблона соглашения.

Служба пакетной обработки Apex отображается через следующий класс вызова:

echosign_dev1.AgreementTemplateServiceBatch

Параметры

Для инициализации пакетной операции необходимо указать следующие параметры.

  • Список идентификаторов основных записей.
  • Идентификатор записи шаблона соглашения: используется вместе с основными записями для загрузки соглашения.
  • Имя основного объекта для запроса основных записей.

Пример использования

String agreementTemplateId = [SELECT Id from echosign_dev1__Agreement_Template__c where Name = 'Default Template'];

AgreementTemplateBatch batch = new AgreementTemplateServiceBatch(new List<Id>{'01p50000000HoMB'}, agreementTemplateId, 'Contact');
Id syncProcessId = Database.executeBatch(batch, 5);

Службы REST

Служба шаблона соглашения

Служба шаблонов соглашений отображается как веб-служба Salesforce REST в управляемом пакете. Это позволяет внешним системам за пределами Salesforce org загружать соглашения на основе существующих шаблонов соглашений. Обратитесь к статье Создание REST API с помощью Apex REST для получения более подробной информации о том, как получить доступ и вызвать пользовательские REST Apex сервисы из Salesforce. При вызове необходимо предоставить действительный идентификатор сеанса для аутентификации и авторизации.

Веб-служба открывается по следующему URL-адресу:

https://<instance_name>.salesforce.com/services/apexrest/echosign_dev1/template/load/<template_id>?masterId=<master_id>&varName1=var Value1&varName2=varValue2

Примечание
  • Имя экземпляра зависит от вашего экземпляра org.
  • https://_<instance_name>_.salesforce.com/services/apexrest/echosign_dev1/template/load/<template_id> is a POST HTTP method for package versions 20.0 and later.
    • В версиях до v20 используется метод GET.

ID шаблона

Последняя часть URL — это ID записи шаблона соглашения в текущей организации Salesforce, которая должна использоваться для загрузки соглашения. Эта часть URL является необязательной. Если она опущена, будет загружен шаблон соглашения, отмеченный как шаблон по умолчанию. Если идентификатор шаблона опущен и не существует идентификатора шаблона соглашения по умолчанию, будет выдана ошибка.

Идентификатор шаблона может быть в формате 15 или 18 символов.

Идентификатор основной записи

Параметр masterId указывает, какая основная запись должна использоваться для загрузки соглашения из конкретного шаблона соглашения. Этот параметр является необязательным, но должен быть указан для любого шаблона соглашения, который определяет тип мастер-объекта и ссылается на этот мастер-объект в шаблоне.

Идентификатор основной записи может быть в формате 15 или 18 символов.

Переменные среды выполнения

Любые дополнительные параметры используются как переменные времени выполнения, как пары имя-значение, используемые для заполнения любых переменных времени выполнения, указанных в шаблоне соглашения.

Результат

Веб-служба REST возвращает объект LoadResult, который содержит следующие поля:

  • agreementId : Если операция загрузки соглашения прошла успешно, это поле содержит идентификатор вновь созданной записи соглашения.
  • error : Если во время загрузки соглашения произошла какая-либо ошибка, это поле будет содержать подробное сообщение об ошибке.

Фоновая служба

Возможность фонового обслуживания позволяет потребителям пакета вызывать различные действия над объектом соглашения путем обновления поля Background Action (echosign_dev1 Background_Actions c) до соответствующего значения. Как только значение поля изменяется с пустого значения или другого значения на одно из следующих значений, действие запускается от триггера, который является частью управляемого пакета e-Sign.

  • Напомнить
  • Отправить
  • Отменить
  • Удалить
  • Обновить

Все действия выполняются в асинхронном режиме будущего, поэтому статус будет сохранен в поле Ошибка в соглашении.

Изменения обратной совместимости

  • Состояние соглашения теперь обновляется после обновления документа и получателей.
    • До версии 21 состояние обновлялось заранее.
  • Объект подписанного документа (в нем сохранены URL-адреса изображений) теперь не вставляется.
    • До версии 21 он вставлялся после завершения всех остальных обновлений.
  • Максимальный размер запроса или ответа выноски ограничен до 12 МБ для асинхронного Apex в пределах возможностей руководителя Salesforce: https://developer.salesforce.com/docs/atlas.ru-ru.210.0.apexcode.meta/apexcode/apex_gov_limits.htm
    • Документы размером более 12 МБ невозможно получить из Sign из-за указанного выше ограничения.
  • Описания события документа изменены. Теперь оно совпадает с описанием, возвращенным Sign API, и содержит отчеты об аудите.
  • Процесс обновления теперь выполняется как встроенный пакетный процесс Apex (асинхронный процесс) в приложении Salesforce.
    • Ранее обновление выполнялось с помощью API-вызовов за пределами Salesforce.
    • Триггеры этих обновлений состояния, которые запускают асинхронные процессы, теперь не выполняются, поскольку Salesforce ограничивает вызов другого асинхронного процесса из уже запущенного асинхронного процесса.
  • До версии 21 обновления атрибутов документа разделялись на несколько вызовов; теперь объект документа обновляется одной операцией.
  • До версии 21 документы со сбоями повторно запускались только путем обновления вручную в приложении Salesforce.
    • Теперь обновления стали более надежными, так как внутренний сервер Sign повторяет попытку запуска событий со сбоями указанное число раз.
  • Обновление, запускаемое вручную, теперь включает все аспекты документов, включая связанные объекты.
  • Передача документов теперь запускается в асинхронном режиме (так же, как регулярные обновления); при этом аналогично регулярным обновлениям дополнительные атрибуты обновляются.
  • Реализованы новые параметры, которые позволяют включить и отключить обновление различных аспектов документа.
  • После сохранения подписанного документа в Salesforce в конце имени файла PDF больше не будет добавляться дескриптор (-подписано или -утверждено).