# 💰 IEE ECM | Интеграция с Диадок

# Настройка и администрирование

# Настройка интеграции

Для подключения интеграции необходимо приобрести у "СКБ Контур" API ключ. Подробнее о центах и условиях можно ознакомиться здесь: [Подробнее о тарифах Диадок](https://www.diadoc.ru/price)

[![image-1630996581790.png](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/scaled-1680-/2GSFyIcn7lDuQdVV-image-1630996581790.png)](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/2GSFyIcn7lDuQdVV-image-1630996581790.png)

После приобретения API ключа необходимо для пользователя в Диадоке, который будет использован для входа при интеграции в обязательном порядке предоставить права, указанные ниже:

[![image-1630996832610.png](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/scaled-1680-/tNbceZzxi22YCfED-image-1630996832610.png)](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/tNbceZzxi22YCfED-image-1630996832610.png)

Далее в ELMA необходимо зайти в секцию **Администрирование** ➜ **Задачи по документам**:

[![image-1630996968905.png](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/scaled-1680-/jantDApA58U5x3Q0-image-1630996968905.png)](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/jantDApA58U5x3Q0-image-1630996968905.png)

Блок **Настройки интеграции с Диадок** показывает состояние подключения к сервису:

[![image-1630997115968.png](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/scaled-1680-/LrZthCXnbFrUBkYW-image-1630997115968.png)](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/LrZthCXnbFrUBkYW-image-1630997115968.png)

Если указан неверный API ключ. либо некорректные логин/пароль, будет выведен следующий статус:

[![image-1630997247119.png](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/scaled-1680-/HYSaoGu9CWX0DSSR-image-1630997247119.png)](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/HYSaoGu9CWX0DSSR-image-1630997247119.png)

Если не указан API ключ, то интеграция считается отключенной (никакой статус не выводится):

[![image-1630997323927.png](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/scaled-1680-/eyOBK43I81OFfKXg-image-1630997323927.png)](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/eyOBK43I81OFfKXg-image-1630997323927.png)

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

[![image-1630997431607.png](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/scaled-1680-/ny4bnDXoYkdKvaYn-image-1630997431607.png)](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/ny4bnDXoYkdKvaYn-image-1630997431607.png)

# Управление Организациями Диадока

TODO

# Импорт архива документов Диадока

TODO

# Импорт существующего документа в Диадоке

TODO

# Управление клиентами (CRM)

Отображение информации у контрагентов по связи с Диадоком

# Вкладка Диадок у контрагентов

При включенной интеграции с Диадоком и установленной связи с сервисом у контрагента появляется вкладка Диадок, на которой отображаются:

1. Перечень возможных подключений Контрагента в операторам ЭДО со статусами.
2. Статус обмена с нашим организациями.
3. Перечень входящих документов, поступивших при включенной интеграции.
4. Перечень исходящих документов при включенной интеграции.

##### Подключение контрагента к различным операторам

[![image-1630995433825.png](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/scaled-1680-/i9XBsdciUJN4mqJ7-image-1630995433825.png)](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/i9XBsdciUJN4mqJ7-image-1630995433825.png)

##### Статус обмена с нашими организациями

[![image-1630995493661.png](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/scaled-1680-/ueU6mHl8YeZsUTah-image-1630995493661.png)](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/ueU6mHl8YeZsUTah-image-1630995493661.png)

##### Входящие документы

[![image-1630995559077.png](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/scaled-1680-/Y4WK3vGLv7U1gQ15-image-1630995559077.png)](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/Y4WK3vGLv7U1gQ15-image-1630995559077.png)

##### Исходящие документы

[![image-1630996263096.png](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/scaled-1680-/afsmrb75fbccYG5Y-image-1630996263096.png)](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/afsmrb75fbccYG5Y-image-1630996263096.png)

# Документооборот (ECM)

# Отправка документа на подписание в Диадок

TODO

# Отображение статусов и истории по Диадоку

TODO

# Точки расширения

Реализация точек расширения для обработки входящих и исходящих документов для Диадока

# ReceivableDiadocDocument

Данная точка расширения позволяет настроить поведение обработчика входящих из Диадока документов.

<p class="callout warning">Наследование необходимо делать именно от класса **ReceivableDiadocDocument**, а не от интерфейса **IReceivableDiadocDocument**.</p>

<p class="callout info">namespace ITino.ELMA.Documents.Diadoc.Components</p>

```C#
/// <summary>
/// Точка расширения для документов, которые можно отправить в Диадок
/// </summary>
public class ReceivableDiadocDocument : IReceivableDiadocDocument
{
	/// <summary>
    /// Обработчик включен
    /// </summary>
    public virtual bool Enabled { get; }

    /// <summary>
    /// Тип документа Диадок
    /// </summary>
    public virtual DiadocDocumentType DocumentType { get; }

    /// <summary>
    /// Тип документа в системе
    /// </summary>
    public virtual Guid TypeUid { get; }

    /// <summary>
    /// Типы документа в системе
    /// </summary>
    public virtual IEnumerable<Guid> TypeUids { get; }

    /// <summary>
    /// Обработать кастомные поля (если есть)
    /// </summary>
    /// <param name="doc">Документ Диадока (справочник в ELMA)</param>
    /// <param name="items">Кастомные поля Диадока</param>
    public virtual void ProcessCustomData(ICODiadocDocument doc, IEnumerable<CustomDataItem> items);
}
```

Пример реализации: [Обработка входящего Договора](https://kb.randmgroup.ru/books/iee-ecm-integratsiya-s-diadok/page/obrabotka-vkhodyashchego-dogovora "Обработка входящего Договора")

# SendableDiadocDocument

Данная точка расширения позволяет настроить поведение обработчика исходящих в Диадок документов.

<p class="callout warning">Наследование необходимо делать именно от класса **SendableDiadocDocument**, а не от интерфейса **ISendableDiadocDocument**.</p>

<p class="callout info">namespace ITino.ELMA.Documents.Diadoc.Components</p>

```C#
/// <summary>
/// Точка расширения для документов, которые можно отправить в Диадок
/// </summary>
public class SendableDiadocDocument : ISendableDiadocDocument
{
    /// <summary>
    /// Обработчик включен
    /// </summary>
    public virtual bool Enabled { get; }

    /// <summary>
    /// Тип документа Диадок
    /// </summary>
    public virtual DiadocDocumentType DocumentType { get; }

    /// <summary>
    /// Тип документа в системе
    /// </summary>
    public virtual Guid TypeUid { get; }

    /// <summary>
    /// Типы документа в системе
    /// </summary>
    public virtual IEnumerable<Guid> TypeUids { get; }

    /// <summary>
    /// Можно ли отправить документ
    /// </summary>
    /// <param name="doc">Документ</param>
    public virtual EODiadocCanSendStatus CanSendDocument(IDocument doc);

    /// <summary>
    /// Получить отправителя (наша организация)
    /// </summary>
    /// <param name="doc">Документ</param>
    public virtual IContractor GetSender(IDocument doc);

    /// <summary>
    /// Отправить документ в Диадок в Головное подразделение
    /// </summary>
    /// <param name="doc">Документ</param>
    /// <param name="comment">Комментарий (опционально)</param>
    public virtual ICODiadocDocument Send(IDocument doc, string comment = null);

    /// <summary>
    /// Отправить документ в Диадок в подразделении любому с правом подписи
    /// </summary>
    /// <param name="doc">Документ</param>
    /// <param name="departmentId">Подразделение в Диадоке</param>
    /// <param name="comment">Комментарий (опционально)</param>
    public virtual ICODiadocDocument Send(IDocument doc, Guid? departmentId, string comment = null);

    /// <summary>
    /// Отправить документ в Диадок
    /// </summary>
    /// <param name="doc">Документ</param>
    /// <param name="departmentId">Подразделение в Диадоке</param>
    /// <param name="userId">Сотрудник в Диадоке</param>
    /// <param name="comment">Комментарий (опционально)</param>
    public virtual ICODiadocDocument Send(IDocument doc, Guid? departmentId, Guid? userId, string comment = null);
}
```

Пример реализации: [Обработка исходящего Договора с физ. лицом](https://kb.randmgroup.ru/books/iee-ecm-integratsiya-s-diadok/page/obrabotka-iskhodyashchego-dogovora-s-fiz-litsom "Обработка исходящего Договора с физ. лицом")

# Примеры

# Обработка входящего Договора

В веб дизайнере ELMA4 (в ELMA3 обычном дизайнере) реализуем Глобальный модуль, где определяем нужную точку расширения, например, **ReceivableContract**.

[![image-1630992751383.png](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/scaled-1680-/XU9FrodakTXWfQsP-image-1630992751383.png)](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/XU9FrodakTXWfQsP-image-1630992751383.png)

Реализация:

```C#
using System;
using EleWise.ELMA.ComponentModel;
using EleWise.ELMA.Documents.Contracts.Models;
using EleWise.ELMA.Model.Services;
using ITino.ELMA.Documents.Diadoc.Components;
using ITino.ELMA.Documents.Diadoc.Models;

namespace HMS.Configuration.Diadoc
{
    /// <inheritdoc />
    [Component]
    public class ReceivableContract : ReceivableDiadocDocument
    {
        /// <inheritdoc />
        public override bool Enabled
        {
        	// Точка расширения включена и обрабатывается
            get { return true; }
        }

        /// <inheritdoc />
        public override DiadocDocumentType DocumentType
        {
        	// Какой тип документа Диадока обрабатываем
            get { return DiadocDocumentType.Contract; }
        }

        /// <inheritdoc />
        public override Guid TypeUid
        {
        	// К какому типу документа в ELMA привязываем
            get {  return InterfaceActivator.UID<IContractIncoming>(); }
        }
    }
}
```

<p class="callout warning">Атрибут \[Component\] обязателен.</p>

# Обработка исходящего Договора с физ. лицом

В веб дизайнере ELMA4 (в ELMA3 обычном дизайнере) реализуем Глобальный модуль, где определяем нужную точку расширения, например, **SendableRNMOutContractInd**.

[![image-1630994410780.png](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/scaled-1680-/KLNmjzSgKCUtc9SL-image-1630994410780.png)](https://kb.randmgroup.ru/uploads/images/gallery/2021-09/KLNmjzSgKCUtc9SL-image-1630994410780.png)

Реализация:

```C#
using System;
using EleWise.ELMA.ComponentModel;
using EleWise.ELMA.ConfigurationModel;
using EleWise.ELMA.Documents.Models;
using EleWise.ELMA.CRM.Models;
using EleWise.ELMA.Model.Services;
using EleWise.ELMA.Services;
using ITino.ELMA.Documents.Diadoc.Components;
using ITino.ELMA.Documents.Diadoc.Exceptions;
using ITino.ELMA.Documents.Diadoc.Managers;
using ITino.ELMA.Documents.Diadoc.Models;
using ITino.ELMA.Documents.Diadoc.Services;

namespace HMS.Configuration
{
	/// <inheritdoc />
	[Component]
    public class SendableRNMOutContractInd : SendableDiadocDocument
    {
        /// <inheritdoc />
        public override bool Enabled
        {
        	// Точка расширения включена и обрабатывается
            get { return true; }
        }

        /// <inheritdoc />
        public override DiadocDocumentType DocumentType
        {
        	// Какой тип документа Диадока обрабатываем
            get { return DiadocDocumentType.Contract; }
        }

        /// <inheritdoc />
        public override Guid TypeUid
        {
        	// К какому типу документа в ELMA привязываем
            get { return InterfaceActivator.UID<RNMOutContractInd>(); }
        }
        
        public override IContractor GetSender(IDocument doc)
        {
        	// Получить отправителя документа
        	var contract = doc as RNMOutContractInd;
			return contract != null ? contract.Contractor : null;
        }
		
        /// <inheritdoc />
        public override EODiadocCanSendStatus CanSendDocument(IDocument doc)
        {
        	// Проверить, можно ли отправить документ в Диадок
            if (doc == null)
                return EODiadocCanSendStatus.DocIsNull;
            var service = Locator.GetServiceNotNull<IDiadocService>();
            var contract = doc as RNMOutContractInd;
            if (contract != null)
                return service.CanSendDocument(contract.Contractor, contract.Executor);
            return base.CanSendDocument(doc);
        }

        /// <inheritdoc />
        public override ICODiadocDocument Send(IDocument doc, Guid? departmentId, Guid? userId, string comment = null)
        {
        	// Отправить документв Диадок на подписание нами
            var contract = doc as RNMOutContractInd;
            if (contract == null)
                throw new DiadocException("Договор не может быть null");
            var edata = DiadocDocumentManager.Instance.CheckContractors(contract.Contractor, contract.Executor, null, null);
            var result = edata.Service.SendContract(edata.FormBoxId, edata.ToBoxId, doc, contract.Number, contract.ContractDate.Value, "ГПХ/Физ.лицо/Самозанятый", null, departmentId, userId, comment);
            return DiadocDocumentManager.Instance.SendDocHistory(result, doc, contract.Contractor, contract.Executor, contract.Number, contract.ContractDate);
        }
    }
}
```

<p class="callout warning">Атрибут \[Component\] обязателен.</p>

# Отправка документа сценарием на подписание в Диадок

TODO

# Добавление скан-копии

В веб дизайнере ELMA4 (в ELMA3 обычном дизайнере) реализуем Глобальный модуль, где определяем нужную точку расширения, например, **DiadocIntegration**.

[![image-1634021415131.png](https://kb.randmgroup.ru/uploads/images/gallery/2021-10/scaled-1680-/Db2hvaSR7ehLxNgN-image-1634021415131.png)](https://kb.randmgroup.ru/uploads/images/gallery/2021-10/Db2hvaSR7ehLxNgN-image-1634021415131.png)

Реализация:

```C#
using EleWise.ELMA.ComponentModel;
using EleWise.ELMA.Documents.Models;
using EleWise.ELMA.Files;
using ITino.ELMA.Documents.Diadoc.Extensions;
using ITino.ELMA.Documents.Models;
using ITino.ELMA.Documents.Managers;

namespace HMS.Configuration.Diadoc
{
    [Component]
    public class DiadocIntegration : BaseDiadocIntegration
    {
        public override void AddScanCopy(IDocument document, BinaryFile file, string comment = null)
        {
        	// Реализация собственной логики добавления скан-копии к кокументу, например:
            DocumentExtManager.Instance.AddScanCopy(document as IDODocument, file, checkUseScanCopy: false);
        }
    }
}
```

<p class="callout warning">Атрибут \[Component\] обязателен.</p>

# Автоматический переход в процессной задаче

<p class="callout success">Начиная с 4.0.28 и 3.15.48</p>

При обработке документов Диадока в процессе может потребоваться отслеживать состояние подписания (как для входящих, так и исходящих). Чтобы задача автоматически выполнилась по нужному переходу при наступлении события по документу в Диадоке, необходимо реализовать в сценарии процесса следующий код:

```C#
using ITino.ELMA.Diadoc.Helpers;

public override void OnTaskCreate(ITaskBase task, Context context)
{
  	// Где,
	// 13b27a4a-b94f-4bc9-9390-d7ff4fcb58bd - идентификатор задачи на диаграмме процесса
  	// 309f52b9-087d-4971-9fc0-9cbffc61c737 - идентификатор перехода в случае, если документ Подписан
	task.LinkDiadocEvents(new Guid("13b27a4a-b94f-4bc9-9390-d7ff4fcb58bd"), context.DiadocDocument, new Guid("309f52b9-087d-4971-9fc0-9cbffc61c737"));
}
```

Указанный пример обрабатывает событие **Подписан**. При необходимости можно указать переходы для событий **Отклонен** и **Удален**.

# Хелперы

TODO

# DiadocHelper

```C#
/// <summary>
/// Получить информацию в Диадоке о нашей организации
/// </summary>
/// <param name="owner">Наша организация</param>
/// <returns></returns>
public static IDictionary<string, string> GetOwnContractorInfo(IContractor owner)
```

```C#
/// <summary>
/// Можно ли отправить документ
/// </summary>
/// <param name="owner">Наша организация</param>
/// <param name="contractor">Контрагент</param>
/// <param name="doc">Существующий привязанный документ в системе</param>
/// <returns></returns>
public static EODiadocCanSendStatus CanSendDocument(IContractor owner, IContractor contractor, IDocument doc = null)
```

```C#
/// <summary>
/// Получить список подразделений в Диадоке
/// </summary>
/// <param name="ownorg">Наша организация</param>
/// <returns></returns>
public static DropDownItemList GetDepartments(IContractor ownorg)
```

```C#
/// <summary>
/// Получить подписантов для подразделения в Диадоке
/// </summary>
/// <param name="ownorg">Наша организация</param>
/// <param name="departmentId">Подразделение в Диадоке</param>
/// <returns></returns>
public static DropDownItemList GetSigners(IContractor ownorg, string departmentId)
```

<p class="callout success">Начиная с 4.0.28 и 3.15.48</p>

```C#
/// <summary>
/// Привязать к переходам задачи события документа в Диадоке
/// </summary>
/// <param name="task">Задача в процессе</param>
/// <param name="taskElementUid">Uid задачи на диаграмме процесса</param>
/// <param name="document">Документ в Диадоке</param>
/// <param name="signedConnectorUid">Uid перехода при подписании документа в Диадоке</param>
/// <param name="rejectedConnectorUid">Uid перехода при отказе в подписании документа в Диадоке</param>
/// <param name="deletedConnectorUid">Uid перехода при удалении документа в Диадоке</param>
public static void LinkDiadocEvents(this ITaskBase task, Guid taskElementUid, ICODiadocDocument document, Guid? signedConnectorUid = null, Guid? rejectedConnectorUid = null, Guid? deletedConnectorUid = null)
```

# Менеджеры

TODO

# Сервисы

Сервисы для обмена с Диадоком

# IDiadocService

Чтобы получить указанный сервис, необходимо реализовать следующий код:

```C#
var service = Locator.GetServiceNotNull<IDiadocService>();
```

Описание свойств и методов сервиса:

<p class="callout info">namespace ITino.ELMA.Documents.Diadoc.Services</p>

```C#
/// <summary>
/// Сервис работы с Диадок
/// </summary>
public interface IDiadocService
{
    /// <summary>
    /// Сервис инициализирован и авторизован
    /// </summary>
    bool Initialized { get; }

    /// <summary>
    /// Отключить интеграцию
    /// </summary>
    void Shutdown();

    /// <summary>
    /// Ожидание операции по отправке документа в Диадок
    /// </summary>
    bool WaitSendingOps { get; set; }

    /// <summary>
    /// Получить информацию о контрагенте по ИНН
    /// </summary>
    /// <param name="inn"></param>
    /// <param name="kpp"></param>
    /// <returns></returns>
    // ReSharper disable once InconsistentNaming
    IEnumerable<Organization> GetContractorInfoByINN(string inn, string kpp = null);

    /// <summary>
    /// Получить информацию о контрагенте
    /// </summary>
    /// <param name="contractor"></param>
    /// <returns></returns>
    IEnumerable<Organization> GetContractorInfo(IContractor contractor);

    /// <summary>
    /// Получить свою организацию по контрагенту
    /// </summary>
    /// <param name="contractor"></param>
    /// <returns></returns>
    Organization GetOwnContractorInfo(IContractor contractor);

    /// <summary>
    /// Получить контрагента если он есть в активном списке
    /// </summary>
    /// <param name="owner"></param>
    /// <param name="contractor"></param>
    /// <returns></returns>
    Organization GetContractorInList(IContractor owner, IContractor contractor);

    /// <summary>
    /// Получить контрагента по ящику если он есть в списке
    /// </summary>
    /// <param name="owner"></param>
    /// <param name="boxId"></param>
    /// <returns></returns>
    IContractor GetContractorInList(IContractor owner, string boxId);

    /// <summary>
    /// Получить контрагента и статус списка для нашей организации
    /// </summary>
    /// <param name="org"></param>
    /// <param name="contractor"></param>
    /// <returns></returns>
    Counteragent GetContractorInfoForTab(Organization org, IContractor contractor);

    /// <summary>
    /// Получить данные организации по ящику
    /// </summary>
    /// <param name="boxId"></param>
    /// <returns></returns>
    Organization GetOrganizationByBox(string boxId);

    /// <summary>
    /// Можно ли отправить документ
    /// </summary>
    /// <param name="owner"></param>
    /// <param name="contractor"></param>
    /// <returns></returns>
    EODiadocCanSendStatus CanSendDocument(IContractor owner, IContractor contractor);

    /// <summary>
    /// Получить список документов по фильтру
    /// </summary>
    /// <param name="owner"></param>
    /// <param name="filterCategory"></param>
    /// <param name="lastCheck"></param>
    /// <param name="alterIndexKey"></param>
    /// <param name="count"></param>
    /// <returns></returns>
    DocumentList GetDocuments(IContractor owner, string filterCategory, DateTime? lastCheck, string alterIndexKey = null, int? count = null);

    /// <summary>
    /// Получить данные о документе в Диадоке
    /// </summary>
    /// <param name="entity"></param>
    /// <returns></returns>
    Document GetDocument(ICODiadocDocument entity);

    /// <summary>
    /// Получить данные о документе в Диадоке
    /// </summary>
    Document GetDocument(string boxId, string messageId, string documentId);

    /// <summary>
    /// Получить строковое содержимое сущности
    /// </summary>
    /// <param name="boxId"></param>
    /// <param name="messageId"></param>
    /// <param name="entityId"></param>
    /// <returns></returns>
    string GetEntityContentString(string boxId, string messageId, string entityId);

    /// <summary>
    /// Получить содержимое сущности
    /// </summary>
    /// <param name="boxId"></param>
    /// <param name="messageId"></param>
    /// <param name="entityId"></param>
    /// <returns></returns>
    byte[] GetEntityContent(string boxId, string messageId, string entityId);

    /// <summary>
    /// Сериализовать данные формализованного документа
    /// </summary>
    /// <param name="doc"></param>
    /// <returns></returns>
    object SerializeData(Document doc);

    /// <summary>
    /// Получить сообщение по документу
    /// </summary>
    /// <param name="entity"></param>
    /// <returns></returns>
    Message GetMessage(ICODiadocDocument entity);

    /// <summary>
    /// Генерация печатной формы документа
    /// </summary>
    /// <param name="entity"></param>
    /// <returns></returns>
    BinaryFile GeneratePrintForm(ICODiadocDocument entity);

    /// <summary>
    /// Сформировать документооборот целиком
    /// </summary>
    /// <param name="entity"></param>
    /// <returns></returns>
    BinaryFile GenerateDocumentZip(ICODiadocDocument entity);
        
    /// <summary>
    /// Получить информацию о подписи
    /// </summary>
    /// <param name="entity"></param>
    /// <param name="own">Наша подпись</param>
    /// <returns></returns>
    SignatureInfo GetSignatureInfo(ICODiadocDocument entity, bool own = true);

    /// <summary>
    /// Получить сущность по идентификатору
    /// </summary>
    /// <param name="entity"></param>
    /// <param name="entityId"></param>
    /// <returns></returns>
    Entity GetEntity(ICODiadocDocument entity, string entityId);

    /// <summary>
    /// Получить информацию об отказе в подписании
    /// </summary>
    /// <param name="entity"></param>
    /// <returns></returns>
    SignatureRejectionInfo ParseSignatureRejectionXml(ICODiadocDocument entity);

    /// <summary>
    /// Получить информацию об отказе в подписании
    /// </summary>
    /// <param name="boxId"></param>
    /// <param name="messageId"></param>
    /// <param name="entityId"></param>
    /// <returns></returns>
    SignatureRejectionInfo ParseSignatureRejectionXml(string boxId, string messageId, string entityId);

    /// <summary>
    /// Получить информацию о запросе на аннулирование
    /// </summary>
    /// <param name="entity"></param>
    /// <returns></returns>
    RevocationRequestInfo ParseRevocationRequestXml(ICODiadocDocument entity);

    /// <summary>
    /// Получить последнее событие для ящика
    /// </summary>
    /// <param name="boxId"></param>
    /// <returns></returns>
    BoxEvent GetLastEvent(string boxId);

    /// <summary>
    /// Получить новые события для ящика
    /// </summary>
    /// <param name="boxId"></param>
    /// <param name="lastEventId"></param>
    /// <returns></returns>
    BoxEventList GetNewEvents(string boxId, string lastEventId);

    /// <summary>
    /// Получить подразделения для ящика
    /// </summary>
    /// <param name="boxId"></param>
    /// <returns></returns>
    DepartmentList GetDepartments(string boxId);

    /// <summary>
    /// Получить сотрудников для подразделения
    /// </summary>
    /// <param name="boxId"></param>
    /// <param name="departmentId"></param>
    /// <returns></returns>
    IEnumerable<Employee> GetEmployees(string boxId, string departmentId);


    /// <summary>
    /// Отправить не формализованный документ
    /// </summary>
    /// <param name="doc">Документ</param>
    /// <param name="fromBoxId">Ящик отправителя</param>
    /// <param name="toBoxId">Ящик получателя</param>
    /// <param name="departmentId">Подразделение</param>
    /// <param name="userId">Сотрудник</param>
    /// <param name="needRecipientSignature">Требуется подпись контрагента</param>
    /// <param name="comment">Комментарий</param>
    /// <returns></returns>
    DiadocMessageResult SendNonformalized(string fromBoxId, string toBoxId, EleWise.ELMA.Documents.Models.IDocument doc, Guid? departmentId = null, Guid? userId = null, bool needRecipientSignature = true, string comment = null);

    /// <summary>
    /// Отправить счет
    /// </summary>
    /// <param name="doc">Документ</param>
    /// <param name="fromBoxId">Ящик отправителя</param>
    /// <param name="toBoxId">Ящик получателя</param>
    /// <param name="docNumber">Номер счета</param>
    /// <param name="docDate">Дата счета</param>
    /// <param name="total">Сумма</param>
    /// <param name="vat">НДС, если есть</param>
    /// <param name="departmentId">Подразделение</param>
    /// <param name="userId">Сотрудник</param>
    /// <param name="comment">Комментарий</param>
    DiadocMessageResult SendProformaInvoice(string fromBoxId, string toBoxId,
        EleWise.ELMA.Documents.Models.IDocument doc, string docNumber, DateTime docDate, Money total,
        Money? vat = null, Guid? departmentId = null, Guid? userId = null, string comment = null);

    /// <summary>
    /// Отправить договор
    /// </summary>
    /// <param name="fromBoxId">Ящик отправителя</param>
    /// <param name="toBoxId">Ящик получателя</param>
    /// <param name="doc">Документ</param>
    /// <param name="docNumber">Номер договора</param>
    /// <param name="docDate">Дата договора</param>
    /// <param name="contractType">Тип договора</param>
    /// <param name="contractPrice">Цена договора,если есть</param>
    /// <param name="departmentId">Подразделение</param>
    /// <param name="userId">Сотрудник</param>
    /// <param name="comment">Комментарий</param>
    /// <returns></returns>
    DiadocMessageResult SendContract(string fromBoxId, string toBoxId, EleWise.ELMA.Documents.Models.IDocument doc,
        string docNumber, DateTime docDate, string contractType, 
        Money? contractPrice = null, Guid? departmentId = null, Guid? userId = null, string comment = null);

    /// <summary>
    /// Отправить дополнительное соглашение
    /// </summary>
    /// <param name="fromBoxId">Ящик отправителя</param>
    /// <param name="toBoxId">Ящик получателя</param>
    /// <param name="doc">Документ</param>
    /// <param name="docNumber">Номер ДС</param>
    /// <param name="docDate">Дата ДС</param>
    /// <param name="contractNumber">Номер договора</param>
    /// <param name="contractDate">Дата договора</param>
    /// <param name="contractType">Тип договора</param>
    /// <param name="total">Цена ДС, если есть</param>
    /// <param name="departmentId">Подразделение</param>
    /// <param name="userId">Сотрудник</param>
    /// <param name="comment">Комментарий</param>
    /// <returns></returns>
    DiadocMessageResult SendSupplementaryAgreement(string fromBoxId, string toBoxId, EleWise.ELMA.Documents.Models.IDocument doc,
        string docNumber, DateTime docDate,
        string contractNumber, DateTime contractDate, string contractType = "",
        Money? total = null, Guid? departmentId = null, Guid? userId = null, string comment = null);
  
	/// <summary>
	/// Отправить протокол согласования цены
	/// </summary>
	/// <param name="fromBoxId">Ящик отправителя</param>
	/// <param name="toBoxId">Ящик получателя</param>
	/// <param name="doc">Документ</param>
	/// <param name="docNumber">Номер ДС</param>
	/// <param name="docDate">Дата ДС</param>
	/// <param name="departmentId">Подразделение</param>
	/// <param name="userId">Сотрудник</param>
	/// <param name="comment">Комментарий</param>
	/// <returns></returns>
	DiadocMessageResult SendPriceListAgreement(string fromBoxId, string toBoxId, EleWise.ELMA.Documents.Models.IDocument doc,
		string docNumber, DateTime docDate,
		Guid? departmentId = null, Guid? userId = null, string comment = null);
}
```