Руководство пользователя Отмена

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

  1. Интеграции Adobe Acrobat Sign
  2. Новые возможности
  3. Версии и жизненный цикл продуктов
  4. Acrobat Sign для Salesforce
    1. Установка пакета
    2. Настройка пакета
    3. Руководство пользователя
    4. Руководство разработчика
    5. Руководство по расширенной настройке
    6. Руководство по сопоставлению и шаблонам полей
    7. Руководство пользователя мобильного приложения
    8. Руководство по автоматизации потоков
    9. Руководство для Document Builder
    10. Настройка больших документов
    11. Руководство по обновлению
    12. Заметки о выпуске
    13. Часто задаваемые вопросы
    14. Руководство по устранению неполадок
    15. Дополнительные статьи
  5. Acrobat Sign для Microsoft
    1. Acrobat Sign для Microsoft 365
      1. Руководство по установке
    2. Acrobat Sign для Outlook
      1. Руководство пользователя
    3. Acrobat Sign для Word/PowerPoint
      1. Руководство пользователя
    4. Acrobat Sign для Teams
      1. Руководство пользователя
      2. Руководство по Live Sign
      3. Руководство пользователя мобильных приложений
      4. Заметки о выпуске
      5. Разрешения Microsoft Teams
    5. Acrobat Sign для Microsoft PowerApps и Power Automate
      1. Руководство пользователя
      2. Заметки о выпуске
    6. Соединитель Acrobat Sign для Microsoft Search
      1. Руководство пользователя
      2. Заметки о выпуске
    7. Acrobat Sign для Microsoft Dynamics
      1. Обзор
      2. Dynamics Online: Руководство по установке
      3. Dynamics Online: Руководство пользователя
      4. Dynamics On-Prem: Руководство по установке
      5. Dynamics On-Prem: Руководство пользователя
      6. Руководство по рабочему процессу Dynamics
      7. Dynamics 365 для Talent
      8. Руководство по обновлению
      9. Заметки о выпуске
    8. Acrobat Sign для Microsoft SharePoint
      1. Обзор
      2. SharePoint On-Prem: Руководство по установке
      3. SharePoint On-Prem: Руководство по сопоставлению шаблонов
      4. SharePoint On-Prem: Руководство пользователя
      5. SharePoint On-Prem: Заметки о выпуске
      6. SharePoint Online: Руководство по установке
      7. SharePoint Online: Руководство по сопоставлению шаблонов
      8. SharePoint Online: Руководство пользователя
      9. SharePoint Online: Руководство по сопоставлению веб-форм
      10. SharePoint Online: Заметки о выпуске
  6. Acrobat Sign для ServiceNow
    1. Обзор
    2. Руководство по установке
    3. Руководство пользователя
    4. Заметки о выпуске
  7. Acrobat Sign для HR ServiceNow
    1. Руководство по установке
  8. Acrobat Sign для SAP SuccessFactors
    1. Руководство по установке панели (не используется)
    2. Руководство по установке средства для помощи в найме кадров (не используется)
    3. Руководство пользователя средства для помощи в найме кадров
    4. Руководство по установке Cloud Foundry
    5. Заметки о выпуске
  9. Acrobat Sign для Workday
    1. Руководство по установке
    2. Краткое руководство
    3. Справочник по конфигурации
  10. Acrobat Sign для NetSuite
    1. Руководство по установке
    2. Заметки о выпуске
  11. Acrobat Sign для SugarCRM
  12. Acrobat Sign для VeevaVault
    1. Руководство по установке
    2. Руководство пользователя
    3. Руководство по обновлению
    4. Заметки о выпуске
  13. Acrobat Sign для Coupa BSM Suite
    1. Руководство по установке
  14. Документация для разработчиков Acrobat Sign
    1. Обзор
    2. Веб-перехватчики
    3. Текстовые теги

Обзор

Adobe Acrobat Sign for 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, все асинхронные процессы (к которым относятся автоматические обновления и сопоставление данных) были переведены с будущих методов на метод очереди, рекомендованный Salesforce.

С этим изменением все настройки в организации подписчика, которые добавляют задания в очередь Salesforce как часть процесса автоматического обновления или сопоставления данных, будут завершаться с ошибкой «System.LimitException: Слишком много заданий, добавленных в очередь: 2». 

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

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

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

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

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

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

Примечание.

Загрузка шаблона соглашения с помощью шаблонов библиотеки e-Sign в настоящее время не поддерживается. Мы предлагаем перенести шаблоны документов в библиотеку документов Salesforce.

  Методы

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.

 Конструкторы (1)

Доступ

Подпись

global

AgreementTemplateListOptions()

global

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

global class AgreementTemplateService.AgreementTemplateListOptions

Properties (5)

Доступ

Имя

global

masterObjectType

global

isActive

global

hasAttachment

global

hasRecipient

global

autoSend

Примечание.

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

global class AgreementTemplateService.AgreementTemplateBasicInfo

Properties (6)

Доступ

Имя

global

name

global

recordId

global

url

global

isDefault

global

daysUntilExpiration

global

language

global class AgreementTemplateService.AgreementTemplateDetails

Properties (6)

Доступ

Имя

global

message

global

ccList

global

dataMappingName

global

mergeMappingName

global

url

global

получатели

global class AgreementTemplateService.RecipientInfo

Properties (4)

Доступ

Имя

global

recipientRole

global

recipientType

global

recipientName

global

signOrder

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

Глобальный класс echosign_dev1.AgreementTemplateVariable имеет два глобальных поля.

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

Результат

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

Служба 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

Методы

global

static void cancelDocument(Id agreementId)

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

global

static void delegateSigner(Id agreementId, String delegatedEmail)

Делегирует подписание на указанный адрес электронной почты.

global

static void delegateSigner(Id agreementId, String delegatedEmail, String message)

Делегирует подписание на указанный email с указанным сообщением.

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)

Заменяет указанного подписанта.

global

static void replaceSigner(Id replacementRecipientId, String message)

Заменяет указанного подписанта на указанное сообщение.

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 соглашения, которое имеет свойство viewURL.
Примечание:  В целях безопасности сгенерированный URL-адрес соглашения имеет только временное время жизни, поэтому генерируется вызов REST-HTTPS для получения свежего URL-адреса от службы Adobe Sign.

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

global class DocumentHistoryEvent

Свойства (2)

Доступ

Имя

global

String eventType

global

String participantEmail

Конструкторы (1)

Доступ

Подпись

global

DocumentHistoryEvent()


global class DocumentInfo

Свойства (5)

Доступ

Имя

global

Map<string,list> historyByEmail

global

Map participantsByEmail

global

Map participantsByName

global

String senderEmail

global

String status

  Конструкторы (1)

Доступ

Подпись

global

DocumentInfo()

global class ParticipantInfo

Свойства (5)

Доступ

Имя

global

String company

global

String email

global

String name

global

String status

global

String title

  Конструкторы (1)

Доступ

Подпись

global

ParticipantInfo()

global class SendDocumentResult

Свойства (3)

Доступ

Имя

global

String documentKey

global

Exception error

global

String url

Конструкторы (1)

Доступ

Подпись

global

SendDocumentResult()

global class 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); syncProcessId = Database.executeBatch(batch, 5);

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

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

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

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

echosign_dev1.AgreementTemplateBatch

Параметры

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

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

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

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

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); 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');
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 больше не будет добавляться дескриптор (-подписано или -утверждено).

 Adobe

Получайте помощь быстрее и проще

Новый пользователь?

Adobe MAX 2024

Adobe MAX
— творческая конференция

С 14 по 16 октября очно в Майами-Бич и онлайн

Adobe MAX

Творческая конференция

С 14 по 16 октября очно в Майами-Бич и онлайн

Adobe MAX 2024

Adobe MAX
— творческая конференция

С 14 по 16 октября очно в Майами-Бич и онлайн

Adobe MAX

Творческая конференция

С 14 по 16 октября очно в Майами-Бич и онлайн