diadoc / diadocapi-docs

HTTP API documentation - http://api-docs.diadoc.ru/
40 stars 92 forks source link

Docflow API (версия 3) Когда планируется релиз и вопросы по содержанию ответов методов. #645

Open dmitry4er opened 4 years ago

dmitry4er commented 4 years ago

Добрый день!

  1. Когда планируется релиз Docflow API (версии 3) ? Нам нужно планировать для использования его на продуктиве.

  2. При получении документов методом GetDocflowEvents (версия 3) непонятно как правильно следует интерпретировать некоторые требования документооборота, указанные в описании вида документооборота: https://diadoc-sdk.readthedocs.io/ru/latest/proto/DocumentWorkflow.html для полей "По запросу".

Например - требуется ли ответная подпись, требуется ли извещение о получении титулов получателя и отправителя.

UPD. Дополнительные вопросы: https://github.com/diadoc/diadocapi-docs/issues/645#issuecomment-689025059

dmitry4er commented 4 years ago

Предлагаю добавить необходимые сведения (по вопросу 2) в структуру DocumentInfoV3 (https://diadoc-sdk.readthedocs.io/ru/latest/proto/DocumentInfoV3.html)

UPD. Вопрос является следствием закрытого вопроса: https://github.com/diadoc/diadocapi-docs/issues/582

aeremina88 commented 4 years ago

Добрый день! по 2-ому вопросу: "По запросу" - означает, что отправитель решает, нужна ему ответная подпись или извещение о получении, устанавливая соответствующий флаг в DocumentAttachment.
Можете привести пример из ответа метода GetDocflowEvents, когда непонятно, как интерпретировать с учетом Workflow?

dmitry4er commented 4 years ago

Самый простой пример: Отправляю произвольный документ и указываю "требуется ответная подпись". На стороне получателя вижу документооборот 1, а где увидеть требуется ли подпись или нет - не понятно. Пролистал (в ходе реализации, т.е. подробно) и не увидел ни в одной структуре свойства, которое могло бы содержать данную информацию. Тоже самое (и даже в особенности) касается Извещение о получении титула отправителя (по запросу) и Извещение о получении титула получателя (по запросу).

Привожу часть ответа по такому документу: image

dmitry4er commented 4 years ago

В описанном случае, конечно, можно сделать косвенный вывод о требовании подписи из поля: DocflowEvents.Events[14].Document.Docflow.RecipientResponse.ResponseStatus = "WaitingForRecipientSignature"

Но судя по подходу к интеграции методом GetNewEvents - такой способ неверный. Тем более, что о требовании извещений совсем непонятно откуда можно сделать вывод о необходимости. Очень похоже на то, что в модель Docflow API (версия 3) эти данные забыли включить.

UPD. В терминах GetNewEvents информация о данном документе (частично) выглядит так: image

В ветке ветке DocumentInfo указан вид документооборота (если развернуть эту ветку - скриншот получается слишком большим): Events[16].Message.Entities[0].DocumentInfo.WorkflowId = 1

NataliaShumikhina commented 4 years ago

Добрый день! Вы правильно определили поле, по которому нужно смотреть - запрошена ответная подпись или нет. Аналогично и по другим сущностям. В ответе GetDocflowEvents информация сгруппирована по сущностям, которые участвуют в документообороте - титул отправителя, ответное действие, извещение о получении и т.д. (все структуры приведены здесь https://api-docs.diadoc.ru/ru/latest/proto/DocflowV3.html). В каждой структуре есть свой статус, по которому можно определить, требуется какое-то действие, связанное с данной сущностью или нет. Но нужно понимать, что статус в ответе GetDocflowEvents всегда соответствует текущему состоянию документа, т.е. если подпись запрошена, но еще не сформирована, то статус будет RecipientResponse.ResponseStatus = "WaitingForRecipientSignature". Но после того, как документ будет подписан, статус изменится на WithRecipientSignature, и тогда из текущего состояния (и текущего ответа GetDocflowEvents) нельзя будет понять, была запрошена подпись изначально или подпись поставили без запроса. Могу порекомендовать только постоянно читать историю и запоминать какие-то данные у себя в учетной системе

dmitry4er commented 4 years ago

Хм. Получается, если у нас невзначай закончится интернет, или наш сотрудник быстро подпишет входящий документ из личного кабинета, то интеграция получится ненадёжной в этих местах? Звучит как "костыль" ))

З.Ы. Мы в обязательном порядке у себя запоминаем бОльшую часть ленты.

NataliaShumikhina commented 4 years ago

Если вы используете GetDocflowEvents, то в ответе вам будет приходить массив событий, которые произошли в ящике, за указанный период времени, и в этом массиве вы сможете найти события-состояния по конкретному документу. Если за указанный период с документом произошло несколько событий, то все они будут в ответе метода. Если вы на своей стороне читаете ленту подряд (т.е. если произошел сбой, то после восстановления работы продолжаете читать с того места, где остановились), то вы не пропустите нужное вам событие. Также в GetDocflowEvents можно возвращать не только текущее, но и предыдущее состояние документооборота

dmitry4er commented 4 years ago

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

Если в DocflowV3 имеется структура "RecipientResponse" и в ней ResponseStatus не равен "RecipientResponseStatusNotAcceptable", то документ требует ответной подписи.

В принципе такая проверка (должна) годится на любом этапе жизни документа.

Продолжу вопросы. Помимо отсутствующих полей, описанных выше, ещё не хватает "для полного счастья":

  1. Структуры DocflowStatus (Это очень важно, т.к. данная информация была одной из ключевых - отсутствующих в GetNewEvents и присутствующей в GetDocflowEvents)
  2. Структуры RoamingNotification (нет структуры, возможно и не заложены события по ней. Как отслеживать?)
  3. Идентификатора пакета "PacketId" (Про него чуть подробнее - ниже)

Идентификатор пакета в принципе заявлен в DocumentInfoV3: DocumentInfo.PacketInfo.PacketId Смущает, что в определении структуры DocumentInfoV3 указано: Структура DocumentInfoV3 представляет данные документа, которые не меняются в течение его жизненного цикла (метаданные). Но ведь идентификатор пакета меняется и мы использовали ленту GetDocflowEvents для отслеживания его изменения.

Получается, что наш (планируемый) переход на DocflowAPIv3 в принципе затевается для того, чтобы у нас была возможность согласованно получать данные "значимых сущностей" документооборота (предоставляемые GetNewEvents) и метаданные, в особенности представление статуса и идентификатор пакета (предоставляемые GetDocflowEvents) - оказывается в текущей реализации напрасным. Считаем эти данные надо как-то добавить в DocflowAPIv3. Спасибо за понимание.

i82 commented 4 years ago

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

dmitry4er commented 4 years ago

Спасибо!

И ещё небольшое несоответствие описанию. https://diadoc-sdk.readthedocs.io/ru/latest/proto/AmendmentRequestDocflow.html

В тексте указано: required SignedAttachmentV3 AmendmentRequest = 2;

По факту вижу, что при AmendmentFlags = 2 (Revised), структура "AmendmentRequest" - отсутствует.

image