Синхронизация данных контрагентов и их ящиков с Контур.Диадок
Данная синхронизация предназначена для автоматизации заполнения данных контрагентов, включая ящики ЭДО.
Логика работы:
При создании синхронизации, стандартными средствами ECOS создается FutureTask, привязанный к определенному триггеру, который завязан на крон, или на переодический таймер
При вызове созданной ранее FutureTask, выполняется метод
execute
, вызывающий запуск синхронизации.В методе
execute
, вызывается методexecuteImpl
, в котором:
Производится поиск зарегистрированного CounterpartiesSyncService, интерфейс которого определен в ecos-edi-commons, а реализация описывается в отдельном бандле для каждого ЭДО провайдера. К примеру 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 миллисекунд
DTO для механизма синхронизации контрагентов
Для синхронизации данных по контрагентам с Контур.Диадок, при получении данных используется 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 |
Дополнительные параметры, которые не определены в основной структуре. Опциональный. Обычно там хранится идентификатор ящика организации контрагента. |