Данная синхронизация предназначена для автоматизации заполнения данных контрагентов, включая ящики ЭДО.
Логика работы:
При создании синхронизации, стандартными средствами ECOS создается FutureTask, привязанный к определенному триггеру, который завязан на крон, или на переодический таймер
При вызове созданной ранее FutureTask, выполняется метод
execute
, вызывающий запуск синхронизации.В методе
execute
, вызывается методexecuteImpl
, в котором:
Производится поиск зарегистрированного CounterpartiesSyncService, интерфейс которого определен в ecos-edi-commons, а реализация описывается в отдельном бандле для каждого ЭДО провайдера. К примеру :ref:`ecos-edi-kontur-lib<ecos-edi-kontur-lib>`
Если CounterpartiesSyncService не найден, выбрасывается исключение.
Запускается синхронизация контрагентов, на основе описанной в синхронизации конфигурации.
Логика работы синхронизационного сервиса KonturDiadocCounterpartiesSyncService:
- Валидируются и извлекаются параметры, из конфигурации синхронизации
- Происходит отправка запроса в Контур.Диадок, для получения всех контрагентов, для заданного ящика. В данном случае видна разница между этой синхронизацией и синхронизацией документов. В данном случае, мы получаем всех контрагентов, так как у Контура нет никакой событийной системы для них.
- Производится маппинг данных, полученных из Контура в dto Counterparty, описанное в ecos-edi-commons
- Полученные и обработанные данные передаются в camel route, описанный в настройках синхронизации
Бандл устроен достаточно просто:
- Активатор, в котором, в момент загрузки бандла инициализируется фабрика ApplicationCamelContextFactory. В момент его удаления происходит её уничтожение
- Класс фабрики для инициализации camel routes и всех необходимых сервисов
- Классы самих роутов, в которых производится фильтрация, передача данных в другие роуты и делегирование обработки классам процессорам
- Классы процессоры, которые обрабатывают данные по необходимому алгоритму
Классы роутов устроены достаточно однотипно и их логика не будет меняться, если нет необходимости исключить какие-то статусы из обработки.
Классы процессоры обрабатывают данные, согласно заложенному в них алгоритму.
Пример обработчика контрагентов в статусах IsMyCounteragent, RejectsMe, IsRejectedByMe:
Производится поиск контрагента, на основе полученных данных. Например, по ИНН
- Если контрагент не найден, в лог пишется информация, об этом, процессор завершает обработку полученных данных
Производится заполнение запроса на мутацию с полученными данными. Отдельно производится заполнение данных ящиков, так как это ассоциация
Отправляется запрос на мутацию
Процессор завершает обработку полученных данных
Пример обработчика контрагентов в статусе InvitesMe:
На примере заполнения “Заявок на ЭДО”:
Производится поиск контрагента, на основе полученных данных. Например, по ИНН.
- Если контрагент найден, производится обновление его данных, для последующего прикрепления к карточке.
Производится поиск карточки “Заявки на ЭДО”, по полученным данным.
- Если такая заявка найдена, её данные обновляются, процессор завершает обработку полученных данных.
Заполняется запрос на мутацию карточки “Заявка на ЭДО”. Отдельно создаются сопутствующие документы-приглашения, если они есть(к карточке привязывается процесс и если пользователь принимает заявку, при наличии, их необходимо подписать), после чего они привязываются к карточке.
Отправляется запрос на мутацию.
Процессор завершает обработку полученных данных.
Шаги по настройке:
Открываем журнал “Синхронизации”
Нажимаем кнопку +
В выпадающем списке находим “Синхронизация контрагентов(ЭДО)”, нажимаем на этот пункт выпадающего списка
Заполняем открывшуюся форму
Параметры:
Идентификатор – идентификатор синхронизации. На саму синхронизацию не влияет, нужен только для понимания, за что эта интеграция отвечает. Если обработка происходит для конкретного статуса контрагента, лучше указывать
идентификатор статуса + sync
. Если все контрагенты обрабатываются в одном роуте, можно указатьdiadoc-counterparties-sync
.Наименование – наименование синхронизации. Так же не влияет на саму интеграцию, нужно для понимания. Обычно, совпадает с идентификатором.
Включена – включена ли синхронизация.
Необходимо перезагрузить – перезапуск интеграции сразу после сохранения.
Ящик ЭДО – отвечает за то, для какого ящика будет проводиться синхронизация, как и в случае с документооборотом Контур.Диадок.
Время наложения блокировки – необходимо задавать для того, чтобы одновременно не запускалось более 2х интеграций для одного и того же ящика. Если значение не задано - блокировка будет накладываться на 2 часа.
Camel endpoint – описанный ранее роут для обработки контрагентов.
Cron expression – Подробнее здесь: org.springframework.scheduling.support.CronTrigger
Trigger period – Используется, если не задан Cron expression. Должен быть задан, если не задан Cron expression, иначе могут проблемы при работе синхронизации
Use fixed rate – отсчет времени до следующего триггирования будет начинаться только после того как завершилась работа по предыдущему триггированию. Подробнее здесь: org.springframework.scheduling.support.PeriodicTrigger
Initial delay – джоба не будет триггериться первые N миллисекунд
Для синхронизации данных по контрагентам с Контур.Диадок, при получении данных используется Protobuf диадока.
Описание данных по контрагентам: Counteragent — документация Диадок 1.87.0
Для преобразования полученных данных, в ECOS используются следующие DTO:
Counterparty:
Тип поля | Название поля | Примечание |
---|---|---|
OrgId | myOrgId | Идентификатор организации, от лица которой совершался запрос на получение контрагента. |
OurId | ourId | Идентификатор ящика, с которого совершался запрос на получение контрагента. |
OrgId | orgId | Идентификатор организации контрагента. |
String | fullName | Полное наименование организации контрагента. |
String | shortName | Сокращенное/альтернативное наименование организации контрагента. |
String | inn | ИНН организации контрагента. |
String | kpp | КПП организации контрагента. |
String | ogrn | ОГРН организации контрагента. |
String | address | Почтовый адрес организации контрагента. |
String | status | Статус организации контрагента. |
String | fnsParticipantId | Налоговый идентификатор организации контрагента. |
Long | lastEventTimestamp | Время последнего события, произошедшего между нашей организацией и организацией контрагента (изменение статуса). |
InvitationDocument | InvitationDocument | Структура документа-приглашения. Опциональный. |
List<EdiBoxDto> | boxDtos | Структура ящиков контрагента в Контур.Диадок. Может быть множественным. |
ObjectData | data | Дополнительные параметры, которые не определены в основной структуре. Опциональный. |
InvitationDocument:
Тип поля | Название поля | Примечание |
---|---|---|
DocumentEdiIdentifier | docId | Идентификатор документа приглашения в Контур.Диадок |
SignedContent | signedContent | Подписанный контрагентом контент документа-приглашения |
FileContent | docContent | Контент документа-приглашения |
boolean | НsignatureRequested | Флаг, указывающий на то, запросил контрагент от нас подписание документа-приглашения, или нет. Дефолтное значение – false |
ObjectData | data | Дополнительные параметры, которые не определены в основной структуре. Опциональный |
SignedContent:
Тип поля | Название поля | Примечание |
---|---|---|
Signature | signature | Подписанный контент документа. |
ObjectData | data | Дополнительные параметры, которые не определены в основной структуре. Опциональный. |
EdiBoxDto:
Тип поля | Название поля | Примечание |
---|---|---|
String | id | Идентификатор ящика Контур.Диадок. |
String | title | Заголовок ящика Контур.Диадок. |
OurId | ourId | Идентификатор нашей организации. Опциональный. |
EdiProviderType | ediProviderType | Тип ЭДО провайдера. В нашем случае, – KONTUR. Другое значение принимать не может. |
RecordRef | datasourceRef | Ссылка на запись источника, для синхронизации. Опциональный. |
RecordRef | credentialsRef | Ссылка на данные учетной записи для синхронизации. Опциональный. |
ObjectData | specialInfo | Дополнительные параметры, которые не определены в основной структуре. Опциональный. Обычно там хранится идентификатор ящика организации контрагента. |