Commit c33343da authored by Sergey Korobitsin's avatar Sergey Korobitsin

Import mobile-spec without history

parent 5991b852
# Генератор документации
#
SRC=src
DOCBOOKOPTS=--template=conf/pandoc/book.docbook --smart -t docbook -V lang=ru
.PHONY: clean
mobile-spec.md:
gpp -H -I$(SRC) $(SRC)/index.md > mobile-spec.md
mobile-spec.xml: mobile-spec.md
ifdef VCSREV
pandoc $(DOCBOOKOPTS) mobile-spec.md \
| xsltproc --encoding utf8 \
--stringparam vcs.revision $(VCSREV) \
--stringparam vcs.changedby "$(VCSCHANGEDBY)" \
conf/vcs/insert-revision-and-build-date.xsl - > mobile-spec.xml
else
pandoc $(DOCBOOKOPTS) mobile-spec.md -o mobile-spec.xml
endif
rm mobile-spec.md
html: mobile-spec.xml
rm -rf bin/html
mkdir bin/html
LC_ALL=en_US.UTF-8 xmlto xhtml -m conf/html/settings.xsl -o bin/html mobile-spec.xml
tar --exclude-vcs -c resources | tar x -C bin/html
rm -f mobile-spec.xml
pdf: mobile-spec.xml
@echo Creating pdf docuemnt
# SP_ENCODING="UTF-8" docbook2pdf -o bin all.xml
dblatex -b xetex -o bin/mobile-spec.pdf -c conf/pdf/dblatex.conf mobile-spec.xml
rm -f mobile-spec.xml
clean:
@echo Remove all
rm -rf bin/html/* bin/*.pdf *.xml *.md *.tmp
version:
@sed -n -e '/^version: / s/^version: //p' "src/index.md" | sed 's/\s*//g'
name:
@echo $(dir $(realpath $(firstword $(MAKEFILE_LIST)))) | xargs basename
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version='1.0'>
<xsl:output encoding="UTF-8" indent="yes"/>
<xsl:param name="use.id.as.filename" select="1"/>
<xsl:param name="generate.revhistory.link" select="1"/>
<xsl:param name="html.stylesheet">resources/css/main.css</xsl:param>
<xsl:param name="toc.section.depth" select="4"/>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8" ?>
$if(mathml)$
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook EBNF Module V1.1CR1//EN"
"http://www.oasis-open.org/docbook/xml/mathml/1.1CR1/dbmathml.dtd">
$else$
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
$endif$
$if(lang)$
<book lang="$lang$">
$else$
<book>
$endif$
<bookinfo>
<title>$title$</title>
$for(author)$
<author>
$author$
</author>
$endfor$
$if(subtitle)$
<subtitle>$subtitle$</subtitle>
$endif$
$if(date)$
<date>$date$</date>
$endif$
$if(copyright)$
<legalnotice>
<para>$copyright$</para>
</legalnotice>
$endif$
</bookinfo>
$for(include-before)$
$include-before$
$endfor$
$body$
$for(include-after)$
$include-after$
$endfor$
</book>
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output
indent="yes"
doctype-system="http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"
doctype-public="-//OASIS//DTD DocBook XML V4.4//EN"/>
<!-- Copy all -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- Add releaseinfo if not present -->
<!-- Maybe we should explictly replace it?
It seems we have to
add another template in that case -->
<xsl:template match="/book/bookinfo[not(pubdate)][not(releaseinfo)]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<pubdate>Дата сборки документа:
<xsl:processing-instruction name="dbtimestamp">
format="Y.m.d H:M:S"
</xsl:processing-instruction>
</pubdate>
<releaseinfo>Ревизия VCS: <xsl:value-of select="$vcs.revision" /></releaseinfo>
<releaseinfo>Последним изменил: <xsl:value-of select="$vcs.changedby" /></releaseinfo>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<!-- Deal with chapters -->
<xsl:template match="/book/chapter[not(chapterinfo)]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<chapterinfo>
<pubdate>Дата сборки документа:
<xsl:processing-instruction name="dbtimestamp">
format="Y.m.d H:M:S"
</xsl:processing-instruction>
</pubdate>
<releaseinfo>Ревизия VCS: <xsl:value-of select="$vcs.revision" /></releaseinfo>
</chapterinfo>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<!-- Deal with sections -->
<xsl:template match="/book/chapter/section[not(sectioninfo)]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<sectioninfo>
<pubdate>Дата сборки документа:
<xsl:processing-instruction name="dbtimestamp">
format="Y.m.d H:M:S"
</xsl:processing-instruction>
</pubdate>
<releaseinfo>Ревизия VCS: <xsl:value-of select="$vcs.revision" /></releaseinfo>
</sectioninfo>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
img {
max-width: 100%;
width: auto;
height: auto;
}
Авторизация пользователя {#sec.autorise}
=========================================
Входные данные, необходимые для авторизации пользователя:
* адрес приложения (обяз.)
* логин (обяз.)
* пароль (обяз.)
Процесс авторизации разделен на 2 экрана: в первом вводятся
[адрес приложения (хост) и логин пользователя](#sec.autorise.part1),
во втором - только [пароль пользователя](#sec.autorise.part2).
<#include "autorise/autorise_part1.md">
<#include "autorise/autorise_part2.md">
<#include "autorise/autorise_part3.md">
<#include "autorise/autorise_part4.md">
Экран авторизации с вводом адреса и логина {#sec.autorise.part1}
-----------------------------------------------------------------
При первом входе в приложение должен открываться экран с вводом
адреса и логина (илл. «Авторизация, ввод адреса и логина»).
![Авторизация, ввод адреса и логина](resources/img/autorise/authorization1.png)
**Элементы управления экрана.**
+---------------------------------------------------+--------------------------------+-----------------------------------------------+
| Элемент управления | Расположение на экране | Описание |
+===================================================+================================+===============================================+
| ![](resources/img/autorise/elements/icon_qr.png)\ | Верхняя половина, левая часть | Иконка |
+---------------------------------------------------+--------------------------------+-----------------------------------------------+
| Войти с помощью QR-кода | Верхняя половина, правая часть | Лейбл |
+---------------------------------------------------+--------------------------------+-----------------------------------------------+
| Сканировать код | Под лейблом | Кнопка запуска камеры для сканирования |
| | | QR-кода (илл. «Сканирование QR-кода») |
+---------------------------------------------------+--------------------------------+-----------------------------------------------+
| Либо ввести данные вручную | По центру экрана | Лейбл |
+---------------------------------------------------+--------------------------------+-----------------------------------------------+
| Адрес | Нижняя половина | Содержит лейбл "Адрес", подпись в скобках |
| | | "например: synergy.tm" и поле для ввода хоста |
| | | (placeholder отсутствует) |
+---------------------------------------------------+--------------------------------+-----------------------------------------------+
| Логин | Ниже адреса | Содержит лейбл "Логин" и поле для ввода |
| | | логина (placeholder отсутствует) |
+---------------------------------------------------+--------------------------------+-----------------------------------------------+
| Далее | Ниже логина | Кнопка для перехода на следующий экран |
| | | авторизации (илл. «Авторизация, ввод пароля») |
+---------------------------------------------------+--------------------------------+-----------------------------------------------+
| | Самый низ экрана | Фиксированная область для вывода ошибок |
+---------------------------------------------------+--------------------------------+-----------------------------------------------+
В поле *"Адрес"* вводится URL приложения (причем регистр букв не
имеет значения). Если сервер работает не на дефолтном порту (80),
то указывается "Хост:порт". Например, *somehost* или
*somehost:8080*.
В поле *"Логин"* вводится логин пользователя.
При наличии введенных символов в указанных полях справа должна
появляться иконка "крестика"
![](resources/img/autorise/elements/icon_clear.png), по нажатию
которой поле должно очиститься, а курсор установиться в его
начало (+ автоматическое открытие клавиатуры).
По нажатию на кнопку *"Далее"* (как вручную, так и автоматически
после сканирования QR-кода) приложение должно попытаться
привести введенный URL к рабочему по правилам, описанным ниже.
* Если не введен протокол (*http://* или *https://*), то
добавлять его при отправке запросов. Сперва *https*
(шифрованное соединение), возможно исполнение альтернативного
потока событий №3. Если сервер не поддерживает шифрование, то
затем необходимо добавить *http*, возможно исполнение
альтернативного потока событий №4.
* Если введен протокол *http://*, но сервером поддерживется
шифрованное соединение, то заменить протокол на *https://*.
* Если введен протокол *https://*, но сервером не поддерживется
шифрованное соединение, то заменить протокол на *http://*.
* Если адрес не заканчивается на "/", то добавлять его
автоматически.
* Если не удается подключиться по адресу, указанному в строке,
попробовать подключиться к серверу по адресу
*"хост" + "/" (если необходимо) + Synergy*.
* Если не удается подключиться по адресу, указанному в строке
и преобразованному согласно вышеописанным правилам,
попробовать подключиться к серверу по адресу:
* *"хост" + "/" (если необходимо) + Synergy* (если порт
был введен);
* *"хост" + ":8443" + "/Synergy"* (наоборот, если порт не
был введен, для шифрованного соединения).
* *"хост" + ":8080" + "/Synergy"* (если порт не был
введен, для нешифрованного соединения).
Если не заполнены обязательные поля адреса и логина, исполняется
альтернативный поток событий 1. Если в результате всех правил
преобразования URL не удалось получить доступ к серверу - №2.
Корректность логина проверяется на следующем шаге авторизации.
По нажатию на кнопку "Назад" на экране ввода адреса и логина
происходит [выход из приложения](#sec.app_exit).
В результате успешного прохождения валидации обоих полей
открывается следующий экран для ввода пароля.
***Альтернативные потоки событий.***
*Альтернативный поток №1. Не заполнены обязательные поля адреса
приложения и/или логина.*
Действие не осуществляется, выходит ошибка:
`Заполните все поля`
*Альтернативный поток №2. Некорректно введен адрес приложения.*
Действие не осуществляется, выходит ошибка:
`Невозможно подключиться к серверу`
Ошибки должны выводиться в фиксированной области внизу экрана.
Текст ошибки должен быть обрамлен в рамку красного цвета.
Кроме того, соответствующее ошибке поле должно подсветиться
красным цветом (илл. «Авторизация, вывод ошибки»).
![Авторизация, вывод ошибки](resources/img/autorise/authorization4.png)
*Альтернативные потоки событий, связанные с наличием
шифрованного соединения.*
> Примечание:
>
> В связи с особенностями iOS, альтернативные потоки 3-6 для
> данной ОС будут отсутствовать. Если настроено http соединение,
> то произойдет нешифрованное соединение (см. альтернативный
> поток №7). Если не настроено, то выйдет ошибка подключения к
> серверу, останется открытым данный экран авторизации.
* Альтернативный поток №3. Если сертификат не является
безопасным (в т.ч. является самоподписанным), то
необходимо отобразить системное диалоговое окно с
кнопками "Принять" и "Отменить" и сообщением:
`Сертификат безопасности не является доверенным`
* Альтернативный поток №4. Если сертификат просрочен, то
необходимо отобразить системное диалоговое окно с
кнопками "Принять" и "Отменить" и сообщением:
`Сертификат безопасности является просроченным`
* Альтернативный поток №5. Если сертификат выписан не на
введенный адрес, то необходимо отобразить системное
диалоговое окно с кнопками "Принять" и "Отменить" и
сообщением:
`Сертификат безопасности данного адреса был выдан для
другого адреса`
* Альтернативный поток №6. В случае, если выполняются
одновременно несколько альтернативных потоков событий
3-5, то необходимо выполнять альтернативный поток №3.
Во всех этих случаях по нажатию на кнопку "Принять"
необходимо продолжить авторизацию по нешифрованному соединению,
по нажатию на кнопку "Отменить" - не выполнять действие и
оставаться на данном экране.
*Альтернативный поток событий №7.* Если происходит авторизация
по нешифрованному соединению, то необходимо отобразить
системное диалоговое окно с кнопками "Принять" и "Отменить" и
сообщением:
`Ваше подключение не защищено. Продолжить?`
По нажатию на кнопку "Принять" необходимо продолжить авторизацию
по нешифрованному соединению, по нажатию на кнопку "Отменить" -
не выполнять действие и оставаться на данном экране.
Экран авторизации с вводом пароля {#sec.autorise.part2}
-------------------------------------------------------
Если авторизация по введенному в предыдущем экране логину и
адресу уже проводилась, то экран с вводом пароля отображает
следующую информацию.
![Авторизация, ввод пароля](resources/img/autorise/authorization2.png)
**Элементы управления экрана.**
+---------------------------+---------------------------+------------------------------------------------+
| Элемент управления | Расположение на экране | Описание |
+===========================+===========================+================================================+
| ARTA | Верхняя половина | Лейбл, обозначающий наименование системы |
+---------------------------+---------------------------+------------------------------------------------+
| synergy.company.com | Под наименованием системы | Лейбл, обозначающий адрес приложения |
+---------------------------+---------------------------+------------------------------------------------+
| Фото в круглой рамке | По центру экрана | Фотография пользователя |
+---------------------------+---------------------------+------------------------------------------------+
| Абдрешен Леонид | Под фотографией | Лейбл, обозначающий Фамилию и Имя пользователя |
+---------------------------+---------------------------+------------------------------------------------+
| l.abdreshen | Ниже адреса | Лейбл, обозначающий логин пользователя |
+---------------------------+---------------------------+------------------------------------------------+
| Пароль | Ниже адреса | Содержит лейбл "Логин" и поле для ввода |
| | | логина (placeholder отсутствует) |
+---------------------------+---------------------------+------------------------------------------------+
| Войти | Ниже логина | Кнопка для перехода на следующий экран |
| | | авторизации (илл. «Авторизация, ввод пароля») |
+---------------------------+---------------------------+------------------------------------------------+
| Изменить параметры входа | Ниже адреса | Содержит лейбл "Логин" и поле для ввода |
| | | логина (placeholder отсутствует) |
+---------------------------+---------------------------+------------------------------------------------+
| | Самый низ экрана | Фиксированная область для вывода ошибок |
+---------------------------+---------------------------+------------------------------------------------+
В качестве *наименования системы* необходимо использовать
значение, полученное при загрузке приложения. Поле присутствует
только при наличии успешной авторизации ранее.
В качестве *адреса приложения* необходимо использовать значение
поля "Адрес" из предыдущего экрана. При этом необходимо
отображать только хост и порт (при наличии), очистив адрес от
протокола, порта и концовки "/Synergy".
> Пример №1: для адреса приложения
>
> `https://synergy.arta.pro/Synergy`
>
> в лейбле должно отображаться
>
> `synergy.arta.pro`
>
> Пример №2: для адреса приложения
>
> `http://192.168.1.79:8080/Synergy`
>
> в лейбле должно отображаться
>
> `192.168.1.79`
В качестве *фотографии* должна использоваться фотография
профиля ранее авторизованного пользователя. Если у данного
пользователя отсутствует фото профиля, необходимо
использовать стандартное изображение
![](resources/img/autorise/elements/icon_user.png).
В качестве *ФИО* необходимо использовать значение фамилии и
имени пользователя, полученное после успешной авторизации ранее.
В качестве *логина пользователя* необходимо использовать
значение поля "Логин" из предыдущего экрана.
В поле *"Пароль"* вводится пароль пользователя.
По нажатию на кнопку "Войти" проверяется введенная пара
логин/пароль. Возможно исполнение альтернативных потоков
событий 1 и 2.
В случае успешной авторизации пользователь попадает на главную
страницу модуля по умолчанию, указанного в
[настройках приложения](#sec.settings). В результате успешной
авторизации возможно исполнение альтернативного потока событий
3.
Параметры авторизации должны записываться в менеджер аккаунтов
на устройстве и при следующем входе в приложение авторизация
должна происходить автоматически и в фоне.
> **Примечание**
>
> Мобильный клиент не поддерживает одновременную авторизацию
> двух и более пользователей на одном устройстве.
По нажатию на кнопку *"Изменить параметры входа"* необходимо
очистить поле "Пароль" (независимо от его содержания) и
возвращать [предыдущий экран авторизации](#sec.autorise.part1),
в котором должны быть заполнены поля адреса и логина.
Если авторизация по введенному в предыдущем экране логину и
адресу еще не проводилась проводилась, то экран с вводом пароля
должен отображать следующую усеченную информацию.
+-----------------------------------------------------+------------------------+------------------------------------------------+
| Элемент управления | Расположение на экране | Описание |
+=====================================================+========================+================================================+
| synergy.company.com | Вверху экрана | Лейбл, обозначающий адрес приложения |
+-----------------------------------------------------+------------------------+------------------------------------------------+
| ![](resources/img/autorise/elements/icon_user.png)\ | По центру экрана | Стандартное изображение (заглушка фото) |
+-----------------------------------------------------+------------------------+------------------------------------------------+
| l.abdreshen | Под фотографией | Лейбл, обозначающий логин пользователя |
+-----------------------------------------------------+------------------------+------------------------------------------------+
| Пароль | Ниже адреса | Содержит лейбл "Логин" и поле для ввода |
| | | логина (placeholder отсутствует) |
+-----------------------------------------------------+------------------------+------------------------------------------------+
| Войти | Ниже логина | Кнопка для перехода на следующий экран |
| | | авторизации (илл. «Авторизация, ввод пароля») |
+-----------------------------------------------------+------------------------+------------------------------------------------+
| Изменить параметры входа | Ниже адреса | Содержит лейбл "Логин" и поле для ввода |
| | | логина (placeholder отсутствует) |
+-----------------------------------------------------+------------------------+------------------------------------------------+
| | Самый низ экрана | Фиксированная область для вывода ошибок |
+-----------------------------------------------------+------------------------+------------------------------------------------+
Логика данных полей не отличается от описанных выше.
***Альтернативные потоки событий.***
*Альтернативный поток 1. Не заполнено поле пароля.*
Действие не осуществляется, выходит ошибка:
`Введите пароль`
*Альтернативный поток 2. Некорректно введена пара логин/пароль.*
Действие не осуществляется, выходит ошибка:
`Неверный логин/пароль`
Ошибки из событий №1-2 должны выводиться в фиксированной области
внизу экрана. Текст ошибки должен быть обрамлен в рамку красного
цвета. Кроме того, соответствующее ошибке поле должно подсветиться
красным цветом (илл. «Авторизация, вывод ошибки»).
*Альтернативный поток 3. Версия основного приложения Synergy ниже
требуемой (см. подробнее в ["Общие сведения"](#chapter_2)).*
Поверх открытого модуля выходит уведомление:
`Внимание! На сервере *имя_хоста* используется версия ARTA Synergy
ниже *требуемая_версия*. Возможна нестабильная работа приложения.`
> **Примечание**
>
> Метод API для получения настроек системы
> kz.arta.synergy.server.api.rest.common#getSettings
>
> Метод API для получения ФИО пользователя
> kz.arta.synergy.server.api.rest.person#getUser
>
> Сервлет для получения фотографии пользователя
> kz.arta.synergy.server.api.rest.person.UserPhotoServlet
Авторизация с помощью сканирования QR-кода {#sec.autorise.part3}
-----------------------------------------------------------------
Имеется возможность автоматического заполнения полей адреса и
логина с помощью считывания QR-кода из пользовательских настроек
Synergy (илл. «Параметры авторизации пользователя с QR-кодом»).
По нажатию на кнопку *"Сканировать код"* на экране авторизации
для ввода адреса и логина должен запуститься экран считывания
QR-кода (илл. «Сканирование QR-кода»).
![Сканирование QR-кода](resources/img/autorise/authorization3.png)
В верхней части экрана должен отображаться текст с картинкой:
![Расположение настроек](resources/img/autorise/elements/qr_settings.png)
Всю остальную область должен занимать сканер.
![Параметры авторизации пользователя с QR-кодом](resources/img/autorise/settings_qr_code.png)
При успешном считывании на экране авторизации в фоне должны
заполниться поля адреса и логина, независимо от предыдущего
содержания данных полей, а также автоматически нажаться
кнопка "Далее".
Авторизация по приглашению {#sec.autorise.part4}
-------------------------------------------------
Мобильный клиент (только для ОС Android) должен уметь
ассоциировать открытие файлов с расширением `asmobile`
мобильным клиентом.
По нажатию на такой файл ОС должна предложить пользователю
открыть его, помимо прочего, с помощью мобильного приложения
Synergy. При таком выборе и при `action_type`: `auth_fill`
необходимо открыть мобильное приложение, автоматически
заполнить поля адреса и логина из параметра `value`, и также
автоматически нажать на кнопку "Далее". Т.е. если в файле
были указаны верные параметры адреса и логина, то
пользователь должен сразу попасть в экран авторизации для
[ввода пароля](#sec.autorise.part2).
Пример содержимого файла `asmobile`:
```xml
{
"action_type": "auth_fill",
"value": {
"host":"http://synergy.company.com",
"login":"Бобров"
}
}
```
Общие сведения {#chapter_2}
==============
**Мобильный клиент должен предоставлять модули:**
- Авторизация
- Потоки работ
- Документы
- Файлы
- Настройки приложения
**Общие требования:**
- Для корректной работы мобильного приложения версия основного
приложения Synergy на сервере должна быть не ниже 3.10.
- Приложение должно поддерживать локализацию (казахский, русский и
английский языки). По умолчанию берется значение текущей локали
пользователя. В дальнейшем пользователь должен иметь возможность
изменить локаль приложения в настройках приложения.
- Во время выполнения запросов к серверу приложение должно отображать
анимированное изображение.
- Приложение должно предоставлять возможность шифрования канала
передачи данных (SSL).
- Приложение должно предоставлять возможность оффлайн-доступа с
синхронизацией данных.
- В случае, если подключение к локальному серверу (к которому
отсутствует настроенное подключение через интернет) происходит
не через локальную сеть (например, с мобильных данных), необходимо
не отображать никаких данных, выведя при этом сообщение-ошибку:
`Отсутствует соединение с сервером`
Функционал, описанный в данной спецификации, должен быть реализован в
нативных приложениях для каждой из платформ. Считается, что
пользовательский интерфейс будет идентичен для всех платформ за
небольшими исключениями:
- Так как у мобильных устройств на базе ОС Android есть системная
кнопка "Назад", в пользовательском интерфейсе она должна
отсутствовать.
> **Примечание**
>
> На всех изображениях спецификации первая иллюстрация - для ОС Android,
> вторая - для iOS. На изображениях, где только одна иллюстрация -
> макеты совпадают для обеих ОС.
При загрузке приложения должны быть загружены следующие настройки,
которые далее будут использованы приложением:
- наименование системы;
- начало и завершение рабочего дня;
- длительность рабочего дня (в часах);
- список форм завершения;
- разрешено ли ставить работы по резолюции, завершающиеся позже
документа;
- обязательно ли подписание документов перед отправкой;
- отображать ли поле "автор" при создании работы;
- разрешено ли добавлять соисполнителей к работам, не являющихся
подчиненными;
- разрешено ли передавать работы другим исполнителям;
- ставить ли работы исполнителям от имени ответственного;
- длительность на выполнение работ по умолчанию;
- подпись поля "Отписано";
- список приоритетов;
- список диалогов создания;
- доступные пункты меню (модуль "Потоки работ");
- доступные пункты меню (модуль "Документы");
- доступные пункты меню (модуль "Файлы");
- названия кнопок действий с работой (согласование / утверждение /
ознакомление / перепоручение / передача);
- список типов работ для резолюций (по умолчанию: работа,
согласование, утверждение, ознакомление, резолюция, отправка
документа);
- список типов работ для редактора маршрута (работа, согласование,
утверждение, ознакомление, отправка документа, блокирующий процесс,
регистрация, маршрут);
- список пунктов создания документов, формы реестров которых имеют
мобильное представление и которые доступны авторизованному
пользователю;
- маппинг прогрессов работ на текстовые значения;
- подставлять ли дату завершения документа в пункты резолюции;
- разрешено ли накладывать дополнительные резолюции;
- отображать ли конечных пользователей на исполнении;
- подписывать ли согласования, утверждения, ознакомления;
- требовать ли ключ и сертификат.
Введение {#introduction}
========
Данный документ является описанием функциональных требований к системе
ARTA Synergy Mobile Client. ARTA Synergy Mobile Client является
составляющей частью программного комплекса ARTA Synergy и представяляет
собой инструмент для доступа к функционалу модулей "Потоки работ",
"Документы", "Файлы" с мобильных устройств на базе платформ Android
версии 4.0 и выше, iOS версии 9.0 и выше.
Создание документов {#sec.document_creation}
-------------------
На экране со списком документов по нажатию на кнопку "+"
и выбору избранного пункта меню, а также при выборе
любого пункта (не группы) в диалоге "Избранное" (илл.
«Список избранных пунктов создания документов», илл.
«Список всех пунктов создания документов»), открывается
экран [проигрывателя формы](#forms_view).
> **Примечание**
>
> Для версий мобильного приложения 3.6 и ниже открывается
> экран создания документа. При открытии экрана API должно
> возвращать следующую информацию:
>
> - `registryName` - наименование реестра;
>
> - `asfDataID` - форма в мобильном представлении;
>
> Метод получения информации для данного экрана описан в
> javadoc:
>
> kz.arta.synergy.server.api.rest.docs#getDocumentInfo.
>
> Вверху экрана отображается лейбл с полным наименованием
> реестра. Далее идет панель, внутри которой располагается
> форма в мобильном представлении. Далее кнопка "Сохранить"
> (с идентификатором NOT_PREFFERED). Лейбл и панель не имеют
> фиксированной высоты (контентозависимы), экран
> прокручивается.
Нажатие "Назад" в данном случае возвращает пользователя
в [список документов](#sec.documents_list).
В результате успешного сохранения выдается сообщение
"Данные сохранены", документ сохраняется, открывается
экран [информации о документе](#sec.documents_docinfo) с
единственной управляющей кнопкой запуска маршрута
([Запуск маршрута](#sec.documents_route_starting)).
Документы {#chap.documents}
=========
<#include "documents/documents_list.md">
<#include "documents/documents_list_tablet.md">
<#include "documents/documents_subsidiary_docs.md">
<#include "documents/documents_filters.md">
<#include "documents/document_creation.md">
<#include "documents/documents_hide.md">
<#include "documents/documents_docinfo.md">
### Действия с документом {#sec.documents_actions}
Набор управляющих кнопок зависит от просматриваемой работы по документу,
либо от отсутствия таковой:
- документ не по реестру, отсутствуют работы;
- документ не по реестру, присутствуют работы;
- документ по реестру, отсутствует реестр ответа;
- документ по реестру, присутствует реестр ответа.
Для каждого варианта API будет возвращать информацию о доступном наборе
кнопок, для каждой кнопки указываются: цвета, название, идентификатор
действия, идентификатор операции и значение лейбла.
+------------------------+------------------------+--------------------------------+----------------------------------------------------+
| Идентификатор действия | Идентификатор операции | Значение лейбла | Примечание |
+========================+========================+================================+====================================================+
| REGISTRY | RUN | согласно API (запуск маршрута) | отображается только для документов по реестру |
+------------------------+------------------------+--------------------------------+----------------------------------------------------+
| REGISTRY | ANSWER | согласно API (создание ответа) | отображается только для документов по реестру |
+------------------------+------------------------+--------------------------------+----------------------------------------------------+
| RESOLUTION | | Резолюция | |
+------------------------+------------------------+--------------------------------+----------------------------------------------------+
| COMPLETE | PROCESS | Завершить | отображается только при наличии работ по документу |
+------------------------+------------------------+--------------------------------+----------------------------------------------------+
| COMPLETE | PROGRESS | Ответить | отображается только при наличии работ по документу |
+------------------------+------------------------+--------------------------------+----------------------------------------------------+
| COMPLETE | STATUS | Завершить | отображается только при наличии работ по документу |
+------------------------+------------------------+--------------------------------+----------------------------------------------------+
| COMPLETE | POINT_RESULT | Завершить | отображается только при наличии работ по документу |
+------------------------+------------------------+--------------------------------+----------------------------------------------------+
| RESULT | | Результат | отображается только при наличии работ по документу |
+------------------------+------------------------+--------------------------------+----------------------------------------------------+
| SEND | AGREEMENT | согласно API (согласование) | |
+------------------------+------------------------+--------------------------------+----------------------------------------------------+
| SEND | APPROVAL | согласно API (утверждение) | |
+------------------------+------------------------+--------------------------------+----------------------------------------------------+
| SEND | ACQUAINTANCE | согласно API (ознакомление) | |
+------------------------+------------------------+--------------------------------+----------------------------------------------------+
| REASSIGN | | согласно API (перепоручение) | |
+------------------------+------------------------+--------------------------------+----------------------------------------------------+
| TRANSMIT | | согласно API (передача) | отображается только при наличии работ по документу |
+------------------------+------------------------+--------------------------------+----------------------------------------------------+
По нажатию кнопки с идентификатором операции `RUN` открывается экран
запуска маршрута ([Запуск маршрута](#sec.documents_route_starting)).
В мобильном клиенте возможны следующие 2 варианта запуска маршрута:
* документ по реестру еще не активирован (поле `activate` = false) и не
находится в процессе (поле `processing` = false): в окне информации о
документе имеется кнопка с идентификатором операции `RUN`, по нажатию
которой открывается / запускается маршрут *активации* элемента;
* документ по реестру активирован (поле `activate` = true) и не
находится в процессе (поле `processing` = false): в окне редактирования
файла по форме имеется кнопка "Сохранить", по нажатию которой открывается
/ запускается маршрут *изменения* элемента;
* маршрут *удаления* элемента посредством мобильного клиента вызвать
нельзя ввиду отсутствия модуля «Реестры», откуда это действие выполняется.
Кнопка с идентификатором операции `ANSWER` может отображаться, только если
документ по реестру активирован (поле `activate` = true) и только если
форма реестра ответа имеет мобильное представление. По нажатию этой кнопки
открывается экран создания документа по реестру ответа
([Создание документов](#sec.document_creation)).
Остальные действия аналогичны действиям в потоках работ
([Действия с работой](#sec.workflow_work_actions)), включая действие
подписания документа, но за тем исключением, что вместо названия работы
необходимо использовать краткое содержание документа.
<#include "documents/documents_route_starting.md">
### Файлы документа {#sec.documents_attachments}
Панель вложений аналогична таковой в потоках работ
([Вложения работы](#sec.workflow_attachments)).
### Комментарии к документу {#sec.documents_comments}
Панель комментариев для документа с работой(-ами) содержит 3 (три) вкладки:
"Работа", "Документ" и "Личные". Переключение между вкладками может происходить
двумя способами: по нажатию соответствующей шапки и с помощью свайпа вправо/влево
(для активной левой вкладки свайп вправо должен отсутстовать, аналогично для
активной правой вкладки свайп влево должен отсутствовать):
* во вкладке "Работа" должны содержаться комментарии к работе, которая была
активна в панели с параметрами работы в момент вызова данной функции;
* во вкладке "Документ", соответственно, должны содержаться комментарии ко
всему документу;
* во вкладке "Личные" должны отображаться личные комментарии авторизованного
пользователя к работе, которая была активна в панели с параметрами работы в
момент вызова данной функции.
Панель комментариев для документа без работ должна содержать единственную вкладку
"Документ" (без возможности переключений между вкладками), который должен
отображать комментарии ко всему документу.
Описание панели комментариев и работы с ней аналогично таковому в потоках работ
([Комментарии работы](#sec.workflow_comments)) с учетом того, что:
* каждый раз при открытии информации о документе по умолчанию должна быть
выделена вкладка "Документы";
* комментарий, добавленный через вкладку "Работа", должен добавиться как к той
ветке работ, которая была активна в панели с параметрами работы в момент
вызова данной функции, так и к документу.
\ No newline at end of file
Информация о документе {#sec.documents_docinfo}
----------------------
По нажатию на плашку документа открывается экран информации о документе.
<#include "documents/documents_work_information.md">
<#include "documents/documents_comments.md">
<#include "documents/documents_attachments.md">
<#include "documents/documents_actions.md">
Фильтры документов {#sec.documents_filters}
------------------
По нажатию на кнопку "Фильтры", а также проведя пальцем от левой
стороны экрана со списком документов к правой, раскрывается левая
панель навигатора фильтров (илл. «Фильтры документов»).
![Фильтры документов](resources/img/documents/filters.png)
Верхняя панель содержит кнопку ["Настройки"](#sec.settings) и
надпись "Навигатор". Нижняя панель отображается только для
включенного флажка "Синхронизировать данные для оффлайн-работы" и
содержит кнопку синхронизации.
Кнопка синхронизации содержит иконку и один из вариантов подписи
к ней:
- "Синхронизация не производилась" - для варианта, когда на
устройстве отсутствуют данные синхронизации;
- "Идёт синхронизация" - для активного
[процесса синхронизации](#sec.offline);
- "Последняя синхронизация: ДД месяц ЧЧ:ММ" - во всех
остальных случаях (указывается дата и время последней
успешной синхронизации).
Параметры фильтров:
Параметр Поле API
-------------------------------------- -------------
Название фильтра name
Тип фильтра filterType
Количество документов внутри фильтра count
Наличие дочерних фильтров hasChildren
При каждом новом запуске приложения, а также после переключения
модулей все основные фильтры должны быть свернуты, а выделенным
являться первый фильтр навигатора. В остальных случаях
развернутость дерева и последний выделенный фильтр должны
сохранять свои значения.
Если фильтр содержит вложенные фильтры, то в правой части
отображается иконка
![](resources/img/workflow/elements/filters_undetailed.png) для
свернутого фильтра и
![](resources/img/workflow/elements/filters_detailed.png) для
развернутого. По нажатию на квадратную область (кликабельная
область аналогична фильтрам в работах) вокруг иконки свернутого
фильтра он разворачивается, и наоборот. Одновременно не может
быть раскрыто более одного фильтра. В этом случае предыдущий
развернутый фильтр сворачивается.
Справа от названия каждого из фильтров и вложенных подфильтров
в скобках указывается счетчик в формате '(N1)', где N1 - общее
количество документов в данном фильтре. При отсутствии
документов в фильтре счетчик не отображается вовсе.
Если название фильтра (с счетчиком) полностью не помещается на
плашке, с правого края оно должно быть затемнено градиентом из
прозрачного в цвет фона.
По нажатию на название фильтра левая панель скрывается и
пользователю отображается список документов согласно выбранного
фильтра.
**Переходы на другие экраны.**
С панели фильтров документов можно перейти в
[настройки приложения](#sec.settings), нажав на кнопку
"Настройки" либо вернуться к
[списку документов](#sec.documents_list). Левую панель можно
скрыть тремя способами:
1. проведя пальцем от правой стороны экрана к левой;
2. нажав по любому месту правой стороны экрана (там, где
отображается часть экрана списка документов);
3. нажав на кнопку "Назад" (для ОС Android).
Скрытие документов {#sec.documents_hide}
------------------
В результате долгого нажатия по плашке документа активного узла дерева "Все"
появляется меню, в котором присутствует пункт:
* "Скрыть" - для активного документа;
* "Восстановить" - для скрытого документа.
Пользователь нажимает на этот пункт меню и приложение запрашивает
подтверждение выполнения действия с сообщением:
* `Вы действительно хотите скрыть данный документ?` - для активного
документа;
* `Вы действительно хотите восстановить данный документ?` - для скрытого
документа.
Если пользователь подтверждает скрытие документа, отправляется запрос на
сервер для скрытия. В случае успешного выполнения документу устанавливается
соответствующее свойство (отображение в списке определяется условиями
просматриваемого фильтра), иначе - отображается сообщение об ошибке.
Кроме того, данное действие недоступно для экрана со списком дочерних документов,
включая родительскую плашку (данный пункт меню отсутствует).
Список документов для смартфона {#sec.documents_list}
-------------------------------
Экран со списком документов для смартфона представлен на илл.
«Список документов журнала для смартфона» и илл. «Список
документов пользователя для смартфона».
![Список документов журнала для смартфона](resources/img/documents/main.png)
![Список документов пользователя для смартфона](resources/img/documents/main1.png)
**Элементы управления экрана со списком документов.**
+--------------------------------------------------------------+------------------------+-----------------------------------------------------+
| Элемент управления | Расположение на экране | Описание |
+==============================================================+========================+=====================================================+
| *Верхняя панель* | | |
+--------------------------------------------------------------+------------------------+-----------------------------------------------------+
| ![](resources/img/workflow/elements/button_filters.png)\ | Слева | "Навигатор" - кнопка перехода к |
| | | [фильтрам документов](#sec.documents_filters) |
+--------------------------------------------------------------+------------------------+-----------------------------------------------------+
| "Документы" | По центру | Выпадающий список для переключения между модулями |
+--------------------------------------------------------------+------------------------+-----------------------------------------------------+
| ![](resources/img/workflow/elements/button_work_create.png)\ | Справа | "Создать" - кнопка |
| | | [создания документа](#sec.workflow_document_create) |
+--------------------------------------------------------------+------------------------+-----------------------------------------------------+
| *Рабочая область* | | |
+--------------------------------------------------------------+------------------------+-----------------------------------------------------+
| | Вся рабочая область | Плашки, отображающие информацию о документе |
| | ниже верхней панели | |
+--------------------------------------------------------------+------------------------+-----------------------------------------------------+
По нажатию на "Документы" на верхней панели не отображаются
все кнопки, под панелью открывается выпадающий список с
модулями:
* [Работы](#chap_workflow);
* [Документы](#chap.documents);
* [Файлы](#chap.files).
До вызова выпадающего списка стрелка отображается указателем
вниз, по вызову меняется указателем вверх. По нажатию вне
области выпадающего списка, а также по указателю и шапке
списка, он скрывается. По нажатию на текущий модуль список
обновляется, на другой модуль - открывается соответствующий
модуль.
Документы в списке отображаются с постепенной догрузкой.
Изначально подгружается такое количество документов, чтобы
список был полностью заполнен и появился скролл (минимум 30).
При прокрутке пользователем вниз и достижении конца списка,
список документов дополняется (количество документов в новой
"порции" должно быть равно количеству документов в первой
"порции").
При прокрутке пользователем в начале списка вверх (действие
dropdown) список документов обновляется.
Список документов сортируется согласно условиям
просматриваемого фильтра.
По нажатию на кнопку "+" вызывается меню (аналогичное в
модуле «Работы»), в построении которого участвуют пункты
параметра `document_items`:
* `favorite_documents`;
* `all_documents`.
В остальном, логика этого меню и экрана «Избранное» не
отличается от таковой в [работах](#sec.workflow_create_menu).
**Неполная плашка документа.**
Плашка документа - это компонент, отображающий информацию о
документе. Плашки могут быть разных размеров.
Неполные плашки документа бывают двух видов (в зависимости
от просматриваемого фильтра):
- Плашка документа журнала (фильтры "Журналы" и "Дела")
![Документ "на регистрации"](resources/img/documents/elements/plashka_document_for_registration.png)
!["Зарегистрированный" документ](resources/img/documents/elements/plashka_document_registered.png)
!["Бракованный" документ](resources/img/documents/elements/plashka_document_defective.png)
!["Отклоненный" документ](resources/img/documents/elements/plashka_document_draft.png)
- Плашка документа пользователя (фильтр «Все»)
!["Созданный" пользователем документ](resources/img/documents/elements/plashka_document_new.png)
!["Полученный" документ](resources/img/documents/elements/plashka_document_inbox.png)
!["Отправленный" документ](resources/img/documents/elements/plashka_document_outbox.png)
> **Примечание**
>
> Если созданный / полученный / отправленный документ
> зарегистрирован, то плашка должна отображаться:
>
> - для активного узла дерева "Журналы" и "Дела" - как
> плашка документа журнала;
>
> - для активного узла дерева "Все" - как плашка
> документа пользователя.
*Элементы неполной плашки документа журнала.*
+-----------------------------------------------------------------+-----------------------------------+--------------------+
| Элемент | Описание | Поле API |
+=================================================================+===================================+====================+
| *Левый блок, 1 строка* | | |
+-----------------------------------------------------------------+-----------------------------------+--------------------+
| ![](resources/img/documents/elements/system_document.png)\ | Признак происхождения / Признак | type / |
| | наложенной на документ резолюции | hasResolution |
+-----------------------------------------------------------------+-----------------------------------+--------------------+
| ![](resources/img/documents/elements/document_on_proccess.png)\ | Признак нахождения документа в | inProgress |
| | процессе | |
+-----------------------------------------------------------------+-----------------------------------+--------------------+
| NNNNN | Номер документа (только для | number |
| | зарегистрированных документов) | |
+-----------------------------------------------------------------+-----------------------------------+--------------------+
| Фамилия И.О. | Автор / Корреспондент (только для | author / |
| | зарегистрированных документов) | correspondentOrg / |
| | зарегистрированных документов) | correspondent |
+-----------------------------------------------------------------+-----------------------------------+--------------------+
| *Левый блок, 2-4 строки* | | |
+-----------------------------------------------------------------+-----------------------------------+--------------------+
| | Краткое содержание документа, в | name, content |
| | т.ч. со значащим содержимым | |
+-----------------------------------------------------------------+-----------------------------------+--------------------+
| *Правый блок* | | |
+-----------------------------------------------------------------+-----------------------------------+--------------------+
| ![](resources/img/workflow/elements/progress_done_icon.png)\ | Статус зарегистрированного | statusID / |
| | документа / признак бракованности | defective |
| | документа | |
+-----------------------------------------------------------------+-----------------------------------+--------------------+
| ![](resources/img/documents/elements/registered_document.png)\ | Признак зарегистрированности | registered / |
| | документа / признак отклоненности | statusID = |
| | документа | REJECTED |
+-----------------------------------------------------------------+-----------------------------------+--------------------+
| ![](resources/img/workflow/elements/hook.png)\ | Признак наличия дочерних | hasChildren |
| | документов | |
+-----------------------------------------------------------------+-----------------------------------+--------------------+
*Элементы неполной плашки документа пользователя.*
+-----------------------------------------------------------------+----------------------------------+---------------+
| Элемент | Описание | Поле API |
+=================================================================+==================================+===============+
| *Левый блок, 1 строка* | | |
+-----------------------------------------------------------------+----------------------------------+---------------+
| ![](resources/img/documents/elements/system_document.png)\ | Признак происхождения / Признак | type / |
| | наложенной на документ резолюции | hasResolution |
+-----------------------------------------------------------------+----------------------------------+---------------+
| ![](resources/img/documents/elements/document_on_proccess.png)\ | Признак нахождения документа в | inProgress |
| | процессе | |
+-----------------------------------------------------------------+----------------------------------+---------------+
| От: Фамилия И.О. | Список адресатов | from / to |
+-----------------------------------------------------------------+----------------------------------+---------------+
| *Левый блок, 2-4 строки* | | |
+-----------------------------------------------------------------+----------------------------------+---------------+
| | Краткое содержание документа, в | name, content |
| | т.ч. со значащим содержимым | |
+-----------------------------------------------------------------+----------------------------------+---------------+
| *Правый блок* | | |
+-----------------------------------------------------------------+----------------------------------+---------------+
| ДД.ММ.ГГ ЧЧ:ММ | Дата создания / получения / | createDate |
| | отправления документа | |
+-----------------------------------------------------------------+----------------------------------+---------------+
| ![](resources/img/workflow/elements/hook.png)\ | Признак наличия дочерних | hasChildren |
| | документов | |
+-----------------------------------------------------------------+----------------------------------+---------------+
*Признак происхождения* отображается в виде пиктограммы, выбор
пиктограммы зависит от поля API "type":
+------------------------------------------------------------+--------------------+-----------+
| Иконка | Описание | Константа |
+============================================================+====================+===========+
| ![](resources/img/documents/elements/system_document.png)\ | Документ системы | DOCUMENT |
+------------------------------------------------------------+--------------------+-----------+
| ![](resources/img/documents/elements/email_document.png)\ | Электронное письмо | EMAIL |
+------------------------------------------------------------+--------------------+-----------+
Если на документ наложена резолюция (поле API "hasResolution"),
то, независимо от признака, должна отображаться иконка
резолюции ![](resources/img/documents/elements/resolution.png)
вместо иконки признака происхождения.
*Признак нахождения документа в процессе* отображается в виде
пиктограммы
![](resources/img/documents/elements/document_on_proccess.png)
и присутствует только для документов со свойством "inProgress".
*Номер документа* отображается только для зарегистрированных
документов журнала (поле API "number"). Если номер документа
полностью не помещается на строке плашки, с правого края он
должен быть затемнен градиентом из прозрачного в цвет фона.
*Автор / Корреспондент* отображается только для
зарегистрированных документов журнала после номера
(разделителем между номером и автором/корреспондентом должен
быть знак "тире" с пробелами по обе стороны), заполняется:
- для журнала внутренних документов - автором (в формате
"Фамилия И.О.", поле API "author");
- для журнала входящих / исходящих документов -
корреспондентом-организацией (поле API "correspondentOrg")
/ корреспондентом (поле API "correspondent", при
отсутствии корреспондента-организации) / пусто (при
отсутствии обоих полей корреспондента).
Если автор/корреспондент полностью не помещается на строке
плашки, с правого края он должен быть затемнен градиентом из
прозрачного в цвет фона.
*Статус зарегистрированного документа журнала (поле API
"statusID"):*
- завершенный - константа "FINISHED" (статус "Завершен") -
отображается в виде пиктограммы
![](resources/img/workflow/elements/progress_done_icon.png)
- незавершенный - константа "IN\_PROGRESS" (статусы "В
работе" / "Истекает срок" / "Есть просроченные") -
отображается в виде пиктограммы
![](resources/img/documents/elements/calendar.png)
Если документ бракованный (поле API "defective"), то
независимо от того, завершенный или незавершенный документ,
его краткое содержание выделяется цветом `#b7b7b7` и
отображается пиктограмма
![](resources/img/documents/elements/defective_document.png).
*Признак зарегистрированности документа журнала* (поле API
"registered") отображается в виде пиктограммы, выбор
пиктограммы зависит от того, зарегистрирован ли документ
журнала:
+----------------------------------------------------------------------+--------------------------+-----------+
| Иконка | Описание | Константа |
+======================================================================+==========================+===========+
| ![](resources/img/documents/elements/registered_document.png)\ | Документ зарегистрирован | true |
+----------------------------------------------------------------------+--------------------------+-----------+
| ![](resources/img/documents/elements/document_for_registration.png)\ | Документ на регистрации | false |
+----------------------------------------------------------------------+--------------------------+-----------+
Если документ отклоненный (поле API "statusID" =
"REJECTED"), то независимо от признака
зарегистрированности, его краткое содержание выделяется
цветом `#487cc2` и отображается пиктограмма
![](resources/img/documents/elements/draft_document.png).
> **Примечание**
>
> Если документ одновременно отклоненный и бракованный,
> краткое содержание документа выделяется цветом
> бракованного `#b7b7b7`, последовательность иконок
> следующая: сначала бракованность, потом отклоненность.
*Список адресатов/адресантов* отображается только для
полученных/отправленных документов пользователя:
- фильтр "Полученные" (поле API "from") - подпись "От:"
и список пользователей в формате "Фамилия И.О.",
перечисленных через запятую;
- фильтр "Отправленные" (поле API "to") - подпись
"Кому:" и список пользователей в формате
"Фамилия И.О.", перечисленных через запятую;
- остальные фильтры (включая "Все"):
- только полученный документ (поле API "from") -
подпись "От:" и список пользователей в формате
"Фамилия И.О.", перечисленных через запятую;
- только отправленный документ (поле API "to") -
подпись "Кому:" и список пользователей в формате
"Фамилия И.О.", перечисленных через запятую;
- и полученный, и отправленный документ - подписи
"От:" и "Кому:" (на две строки) и список
пользователей в формате "Фамилия И.О.",
перечисленных через запятую.
Если весь список адресатов/адресантов полностью не
помещается на строке плашки, с правого края он должен
быть затемнен градиентом из прозрачного в цвет фона.
*Дата создания / получения / отправления документа*
отображается только для документов пользователя (поле
API "createDate") и заполняется датой и временем
последнего выполненного действия с документом в формате
"ДД.ММ.ГГ ЧЧ:ММ".
*Краткое содержание документа (поле API "name"), через
дефис значащее содержимое (поле API "content"),*
отображаются максимум на 3 (три) строки. Если текст
краткого содержания содержит менее трех строк, то должна
меняться минимальная высота плашки в соответствии с
количеством строк краткого содержания (но не более трех
строк). Если же полностью не помещается на плашке, то с
правого края третьей строки оно должно быть затемнено
градиентом из прозрачного в цвет фона.
Цвет краткого содержания документа журнала зависит от
его свойств и времени, оставшегося до завершения работ
по документу:
+-----------------------------------------+-----------------+--------------------------+
| Условие | Поле API | Цвет краткого содержания |
+=========================================+=================+==========================+
| если хотя бы одна работа по маршруту | is_expired | `#be3d3d` |
| документа просрочена | | |
+-----------------------------------------+-----------------+--------------------------+
| если хотя бы у одной работы по маршруту | is_soon_expired | `#a57020` |
| документа истекает срок | | |
+-----------------------------------------+-----------------+--------------------------+
| если документ бракованный | defective | `#b7b7b7` |
+-----------------------------------------+-----------------+--------------------------+
| иначе | | `#487cc2` |
+-----------------------------------------+-----------------+--------------------------+
Краткое содержание документов пользователя (раздел "Все")
всегда выделяются цветом `#487cc2`. Значащее содержимое
всегда и везде выделяется только цветом `#83aade`
(независимо от любых других условий).
Если по данному документу имеются непросмотренные
уведомления (поле API "is_new" = true), документ должен
быть выделен полужирным.
Жирное выделение документа снимется тогда, когда
пользователь просмотрит информацию о нем.
**Полная плашка документа.**
Посмотреть больше информации о документе (илл. «Полная
плашка документа (смартфон)»), не открывая его полную
информацию, можно следующими тремя способами:
1. двойным нажатием по неполной плашке;
2. масштабированием плашки разведением пальцев (сведением
пальцев для обратного действия);
3. выбрав пункт контекстного меню "Показать информацию"
(пункт "Скрыть информацию" для обратного действия).
![Полная плашка документа (смартфон)](resources/img/documents/main2.png)
Порядок отображения полей:
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| Элемент | Описание | Поле API |
+=================================================================+===================================+=====================+
| *1 строка* | | |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| ![](resources/img/documents/elements/system_document.png)\ | Признак происхождения | type |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| ![](resources/img/documents/elements/resolution.png)\ | Признак наложенной на документ | hasResolution |
| | резолюции | |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| ![](resources/img/documents/elements/document_on_proccess.png)\ | Признак нахождения документа в | inProgress |
| | процессе | |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| ![](resources/img/documents/elements/control_document.png)\ | Признак контрольности документа | controlled |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| ![](resources/img/documents/elements/defective_document.png)\ | Признак бракованности документа | defective |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| ![](resources/img/documents/elements/draft_document.png)\ | Признак отклоненности документа | statusID = REJECTED |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| *2 строка* | | |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| NNNNN | Номер документа (только для | number |
| | зарегистрированных документов) | |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| Фамилия И.О. | Автор / Корреспондент (только для | author / |
| | зарегистрированных документов) | correspondentOrg / |
| | зарегистрированных документов) | correspondent |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| *3 строка* | | |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| | Краткое содержание документа, в | name, content |
| | т.ч. со значащим содержимым | |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| *4 строка* | | |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| Создано: ДД.ММ.ГГ ЧЧ:ММ | Дата создания / получения / | createDate |
| | отправления документа | |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| *5 строка* | | |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| От: Фамилия И.О. | Список адресатов | from / to |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| *6 строка* | | |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| Регистрация | Статическая подпись, | |
| | сигнализирующая о начале блока | |
| | информации о зарегистрированном | |
| | документе (только для | |
| | зарегистрированных документов) | |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| ![](resources/img/documents/elements/calendar.png)\ | Статус зарегистрированного | statusID |
| | документа | |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| ![](resources/img/documents/elements/registered_document.png)\ | Признак зарегистрированности | registered |
| | документа | |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| *7 строка* | | |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| Зарегистрировал: Фамилия И.О. | Пользователь, зарегистрировавший | regUser |
| | документ (только для | |
| | зарегистрированных документов) | |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| Дата: ДД.ММ.ГГ | Дата регистрации документа | regDate |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| *8 строка* | | |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| Отписано: Фамилия И.О. | Пользователь, которому отписан | user |
| | документ (только для | |
| | зарегистрированных незавершенных | |
| | документов) | |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| *9 строка* | | |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
| На исполнении: Фамилия И.О. | Список пользователей, у которых | resUsers |
| | документ находится на исполнении | |
| | (только для зарегистрированных | |
| | незавершенных документов) | |
+-----------------------------------------------------------------+-----------------------------------+---------------------+
Полное описание полей представлено в
[Список документов для планшета](#sec.documents_list_tablet),
при этом вся информация (в т.ч. краткое содержание, список
адресатов и пользователей на исполнении) отображается полностью.
**Возможные действия с плашкой документа:**
1. При выделении плашки (tap) открывается экран с информацией
о документе (независимо от прав пользователя).
2. При двойном нажатии по плашке смартфона (double tap), а
также при масштабировании плашки сведением и разведением
пальцев (`pinch-to-zoom`), она переключается между режимами
"полная" / "неполная".
3. В результате долгого нажатия по плашке документа появляется
меню с пунктами, доступными для любого пользователя:
1. "Показать информацию" / "Скрыть информацию" - для
переключения между режимами плашки "полная" /
"неполная";
2. "Скрыть" / "Восстановить" (поле hide) - только для
активного узла дерева "Все".
**Переходы на другие экраны.**
Чтобы перейти к
[дочерним документам](#sec.documents_subsidiary_docs),
пользователь проводит пальцем от правой стороны плашки к левой.
По нажатию на кнопку "Фильтры", а также проведя пальцем от
левой стороны экрана к правой, раскрывается панель навигатора
[фильтров документов](#sec.documents_filters).
По нажатию на кнопку "Создать" открывается выпадающий список с
пунктами, по нажатию которого открывается экран
[создания документов](#sec.document_creation).
По нажатию на плашку документа открывается экран полной
[информации о документе](#sec.documents_docinfo).
В результате долгого нажатия по плашке активного узла дерева
"Все" появляется меню с
[пунктом "Скрыть" / "Восстановить"](#sec.documents_hide).
По нажатию на кнопку "Назад":
* для переключателя "Запомнить меня" со значением "Выкл" -
открывается экран [авторизации](#sec.autorise);
* для переключателя "Запомнить меня" со значением "Вкл" -
происходит [закрытие приложения](#sec.app_exit).
> **Примечание**
>
> Метод получения списка документов описан в javadoc:
>
> kz.arta.synergy.server.api.rest.docs#getDocumentsList.
>
> http://tdd.lan.arta.kz/docs/synergy/trunk/sdk-doc/javadoc/kz/arta/synergy/server/api/rest/storage/StorageService.html#listFiles%28java.lang.String,%20boolean,%20java.lang.String%29
Список документов для планшета {#sec.documents_list_tablet}
------------------------------
Экран со списком документов представлен на илл. «Список документов для
планшета (журналы, дела)» и илл. «Список документов для планшета
(документы)».
![Список документов для планшета (журналы,
дела)](resources/img/documents/iOS/ipad_documents.png)
![Список документов для планшета
(документы)](resources/img/documents/iOS/ipad_documents_2.png)
**Элементы управления экрана со списком документов** аналогичны списку
документов для смартфона ([Список документов для
смартфона](#sec.documents_list)).
**Полная плашка документа (планшет).**
Плашки документа также бывают двух видов (в зависимости от
просматриваемого фильтра):
- Плашка документа журнала (фильтры "Журналы" и "Дела")
- Плашка документа пользователя (фильтр "Все")
*Элементы плашки документа журнала.*
Элемент Описание Поле API
------------------------------------------------------------------------ --------------------------------------------------------------------------------------------------------------------------- -------------------------------------------
*Левый блок, 1 строка*
![](resources/img/documents/elements/system_document.png) Признак происхождения type
![](resources/img/documents/elements/resolution.png) Признак наложенной на документ резолюции hasResolution
![](resources/img/documents/elements/document_on_proccess.png) Признак нахождения документа в процессе inProgress
NNNNN Номер документа (только для зарегистрированных документов) number
Фамилия И.О. Автор / Корреспондент (только для зарегистрированных документов) author / correspondentOrg / correspondent
*Левый блок, 2-4 строки*
Краткое содержание документа, в т.ч. со значащим содержимым name, content
*Левый блок, 5 строка*
На исполнении: Фамилия И.О. Список пользователей, у которых документ находится на исполнении (только для зарегистрированных незавершенных документов) resUsers
*Правый блок, 1 строка*
![](resources/img/documents/elements/calendar.png) Статус зарегистрированного документа statusID
![](resources/img/documents/elements/registered_document.png) ДД.ММ.ГГ Признак зарегистрированности документа registered / regDate
![](resources/img/documents/elements/control_document.png) Признак контрольности документа controlled
![](resources/img/documents/elements/defective_document.png) Признак бракованности документа defective
![](resources/img/documents/elements/draft_document.png) Признак отклоненности документа statusID = REJECTED
*Правый блок, 2 строка*
![](resources/img/documents/elements/registered_user.png) Фамилия И.О. Пользователь, зарегистрировавший документ (только для зарегистрированных документов) regUser
*Правый блок, 5 строка*
Отписано: Фамилия И.О. Пользователь, которому отписан документ (только для зарегистрированных незавершенных документов) user
*Правый нижний блок*
![](resources/img/workflow/elements/hook.png) Признак наличия дочерних документов hasChildren
*Элементы плашки документа пользователя.*
Элемент Описание Поле API
---------------------------------------------------------------- ------------------------------------------------------------- ---------------
*Левый блок, 1 строка*
![](resources/img/documents/elements/system_document.png) Признак происхождения type
![](resources/img/documents/elements/resolution.png) Признак наложенной на документ резолюции hasResolution
![](resources/img/documents/elements/document_on_proccess.png) Признак нахождения документа в процессе inProgress
От: Фамилия И.О. Список адресатов from / to
Левый блок, 2-4 строки
Краткое содержание документа, в т.ч. со значащим содержимым name, content
Правый блок
Создано: ДД.ММ.ГГ ЧЧ:ММ Дата создания / получения / отправления документа createDate
![](resources/img/workflow/elements/hook.png) Признак наличия дочерних документов hasChildren
*Признак происхождения* отображается в виде пиктограммы, выбор
пиктограммы зависит от поля API "type":
Иконка Описание Константа
----------------------------------------------------------- -------------------- -----------
![](resources/img/documents/elements/system_document.png) Документ системы
![](resources/img/documents/elements/email_document.png) Электронное письмо
*Признак наложенной на документ резолюции (поле API "hasResolution")*
отображается в виде пиктограммы
![](resources/img/documents/elements/resolution.png) и присутствует
только для документов со свойством \_\_\_\_\_\_\_.
*Признак нахождения документа в процессе* отображается в виде
пиктограммы
![](resources/img/documents/elements/document_on_proccess.png) и
присутствует только для документов со свойством "inProgress".
*Номер документа* отображается только для зарегистрированных документов
журнала (поле API "number").
*Автор / Корреспондент* отображается только для зарегистрированных
документов журнала после номера (разделителем между номером и
автором/корреспондентом должен быть знак "тире" с пробелами по обе
стороны), заполняется:
- для журнала внутренних документов - автором (в формате"Фамилия
И.О.", поле API "author");
- для журнала входящих / исходящих документов -
корреспондентом-организацией (поле API "correspondentOrg") /
корреспондентом (поле API "correspondent", при отсутствии
корреспондента-организации) / пусто (при отсутствии обоих полей
корреспондента).
*Статус зарегистрированного документа журнала (поле API "statusID"):*
- завершенный - константа "FINISHED" (статус "Завершен") -
отображается в виде пиктограммы
![](resources/img/workflow/elements/progress_done_icon.png)
- незавершенный - константа "IN\_PROGRESS" (статусы "В работе" /
"Истекает срок" / "Есть просроченные") - отображается в виде
пиктограммы ![](resources/img/documents/elements/calendar.png)
*Признак зарегистрированности документа журнала* (поле API "registered")
отображается в виде пиктограммы и даты регистрации (для
зарегистрированного документа, (поле API "regDate") в формате
"ДД.ММ.ГГ". Выбор пиктограммы зависит от того, зарегистрирован ли
документ журнала:
Иконка Описание Константа
--------------------------------------------------------------------- -------------------------- -----------
![](resources/img/documents/elements/registered_document.png) Документ зарегистрирован true
![](resources/img/documents/elements/document_for_registration.png) Документ на регистрации false
*Признак контрольности документа* отображается в виде пиктограммы
![](resources/img/documents/elements/control_document.png) и
присутствует только для документов со свойством "controlled".
*Признак бракованности документа* присутствует только для документов со
свойством "defective", его краткое содержание выделяется цветом \#b7b7b7
и отображается пиктограмма
![](resources/img/documents/elements/defective_document.png).
*Признак отклоненности документа* присутствует только для документов со
свойством "statusID"="REJECTED", его краткое содержание выделяется
цветом \#487cc2 и отображается пиктограмма
![](resources/img/documents/elements/draft_document.png).
> **Замечание**
>
> Если документ одновременно отклоненный и бракованный, краткое
> содержание документа выделяется цветом бракованного \#b7b7b7,
> последовательность иконок следующая: сначала бракованность, потом
> отклоненность.
*Пользователь, зарегистрировавший документ* отображается только для
зарегистрированных документов журнала (поле API "regUser") с иконкой
![](resources/img/documents/elements/registered_user.png) и текстом в
формате "Фамилия И.О."
*Пользователь, которому отписан документ* отображается только для
зарегистрированных документов журнала (поле API "user") с подписью,
загруженной при авторизации (например "Отписано:") и текстом в формате
"Фамилия И.О.", занимает не более 1/3 ширины плашки (выравнивание по
правому краю).
*Список пользователей, у которых документ находится на исполнении*
отображается только для зарегистрированных документов журнала (поле API
"resUsers") и содержит подпись "На исполнении:" и список пользователей
(в зависимости от настройки "отображать ли конечных пользователей на
исполнении") в формате "Фамилия И.О." через запятую. Занимает не более
2/3 ширины плашки (выравнивание по левому краю).
*Список адресатов/адресантов* отображается только для
полученных/отправленных документов пользователя:
- фильтр "Полученные" (поле API "from") - подпись "От:" и список
пользователей в формате "Фамилия И.О.", перечисленных через запятую;
- фильтр "Отправленные" (поле API "to") - подпись "Кому:" и список
пользователей в формате "Фамилия И.О.", перечисленных через запятую;
- остальные фильтры (включая "Все"):
- только полученный документ (поле API "from") - подпись "От:" и
список пользователей в формате "Фамилия И.О.", перечисленных
через запятую;
- только отправленный документ (поле API "to") - подпись "Кому:" и
список пользователей в формате "Фамилия И.О.", перечисленных
через запятую;
- и полученный, и отправленный документ - подписи "От:" и "Кому:"
(на одну строку) и список пользователей в формате "Фамилия
И.О.", перечисленных через запятую.
Если весь список адресатов/адресантов полностью не помещается на строке
плашки, с правого края он должен быть затемнен градиентом из прозрачного
в цвет фона.
*Дата создания / получения / отправления документа* отображается только
для документов пользователя (поле API "createDate") и заполняется
подписью:
- "Создано:" - если на плашке нет полей "От" и "Кому";
- "Получено:" - если на плашке есть только поле "От";
- "Отправлено:" - если на плашке есть только поле "Кому";
соответственно и датой и временем последнего выполненного действия с
документом в формате "ДД.ММ.ГГ ЧЧ:ММ".
*Краткое содержание документа (поле API "name"), через дефис значащее
содержимое (поле API "content"),* отображаются максимум на 3 (три)
строки. Если текст краткого содержания содержит менее трех строк, то
должна меняться минимальная высота плашки в соответствии с количеством
строк краткого содержания (но не более трех строк). Если же полностью не
помещается на плашке, то с правого края третьей строки оно должно быть
затемнено градиентом из прозрачного в цвет фона.
Цвет краткого содержания документа журнала зависит от его свойств и
времени, оставшегося до завершения работ по документу:
Условие Поле API Цвет краткого содержания
----------------------------------------------------------------- ------------------- --------------------------
Если хотя бы одна работа по маршруту документа просрочена is\_expired \#be3d3d
Если хотя бы у одной работы по маршруту документа истекает срок is\_soon\_expired \#a57020
Если документ бракованный defective \#b7b7b7
Иначе \#487cc2
Краткое содержание документов пользователя (раздел "Все") всегда
выделяются цветом \#487cc2. Значащее содержимое всегда и везде
выделяется только цветом \#83aade (независимо от любых других условий).
Если по данному документу имеются непросмотренные уведомления (поле API
"is\_new"=true), документ должен быть выделен полужирным.
Жирное выделение документа снимется тогда, когда пользователь просмотрит
информацию о нем.
**Возможные действия с плашкой документа:**
1. При выделении плашки (tap) открывается экран с информацией о
документе (не зависимо от прав пользователя).
2. Двойное нажатие по плашке (double tap), а также масштабирование
плашки сведением и разведением пальцев (pinch-to-zoom) отсутствует.
3. В результате долгого нажатия по плашке документа появляется меню с
пунктом, доступным для любого пользователя:
1. "Скрыть" / "Восстановить" (поле hide) - только для активного
узла дерева "Все".
**Переходы на другие экраны** аналогичны списку документов для смартфона
([Список документов для смартфона](#sec.documents_list)).
#### Запуск маршрута {#sec.documents_route_starting}
По нажатию управляющей кнопки при отсутствии настроенного маршрута сообщается
"Данные сохранены" и запускается пустой маршрут (запись должна сразу получить
статус "активирована", поле `activate` = true). При наличии же маршрута, в
зависимости от настроек этого маршрута события, возможны следующие 2 варианта:
* если в каждом из блоков (предварительный `before` / действия `action` /
последующий `after`) значение настройки "Отображать ли при сохранении" =
false, то без открытия экранов должно происходить действие запуска
маршрута;
* если же хотя бы в одном из блоков (предварительный `before` / действия
`action` / последующий `after`) значение настройки "Отображать ли при
сохранении" = true, то открывается экран запуска маршрута (илл. «Запуск
маршрута»).
> **Примечание**
>
> В случае, если в РКК документа работы настроена валидация его полей
> перед отправкой, то по нажатию на кнопку запуска маршрута действие не
> произойдет (экран "Запуск маршрута" не откроется) с ошибкой (-ами):
>
> `Данный тип документа требует указание дела. Выберите его в карточке и
> отправьте повторно. Если список пуст, обратитесь к методологу`
>
> `Данный тип документа требует определения исполнителя. Выберите его в
> карточке и отправьте повторно`
> **Примечание**
>
> Метод получения описания маршрутов реестра описан в javadoc:
>
> kz.arta.synergy.server.api.rest.registry#route.
**Экран запуска маршрута.**
При открытии экрана API должно возвращать следующую информацию:
- `name` - краткое содержание документа (из метода
kz.arta.synergy.server.api.rest.docs#getDocumentInfo;
- описание маршрута по событию, определенный в конфигураторе для
данного реестра (из метода
kz.arta.synergy.server.api.rest.registry#route;
- закрывать ли окно документа после отправки на активацию (из метода
kz.arta.synergy.server.api.rest.registry#route.
![Запуск маршрута](resources/img/documents/route_running.png)
![Запуск маршрута](resources/img/documents/iOS/route_running_iOS.png)
Заголовок экрана - «Запуск маршрута». Вверху экрана отображается поле
«Формулировка», заполненное по умолчанию значением поля "Краткое
содержание" в РКК документа. Поле редактируемо.
Далее идут панели согласно предварительно настроенного в конфигураторе
маршрута. Для каждого из блоков отображается отдельная панель с
соответствующим заголовком:
* `before` - «Предварительные этапы»;
* `action` - «Действия»;
* `after` - «Последующие этапы».
Панель содержит все элементы всех этапов маршрута.
Если значение настройки "Отображать ли при сохранении" (поле `showOnSave`)
= true, то панель соответствующей части маршрута должна отображаться (даже
в случае отсутствия в ней этапов), иначе - не отображаться.
Каждый элемент этапа содержит следующую информацию об этапе:
> *Полное_название_этапа*
>
> Ответственный: *Фамилия И.О.*
>
> либо
>
> Адресат: *Фамилия И.О.*
>
> Тип работы: *Тип_работы`*
Поле "Ответственный" всегда (даже при отсутствии значения) должно
отображаться только для следующих типов работ:
* работа (`ASSIGNMENT_ITEM`);
* согласование (`AGREEMENT_ITEM`);
* утверждение (`APPROVAL_ITEM`);
* ознакомление (`ACQUAINTANCE_ITEM`);
* резолюция (`RESOLUTION_ACTION`).
Поле "Адресат", в свою очередь, для типа:
* отправка документа (`SEND_DOCUMENT`).
Для всех остальных типов работ строчка с ответственным никогда
отображаться не должна.
Поле "Тип работы" заполняется названием процесса (поле API `name`).
> **Примечание**
>
> Метод получения настроек процессов описан в javadoc:
>
> kz.arta.synergy.server.api.rest.settings#getProcesses.
Далее отображается управляющая кнопка «Запустить» (с идентификатором
PREFERRED). Она имеет фиксированное положение, остальные поля и панели
данного экрана не имеют фиксированного положения, прокручиваются (если все
поля вмещаются в экран, то кнопка должна быть внизу экрана, а не сразу за
контентом).
1. В результате нажатия по любой панели (в т.ч. по заголовку) открывается
экран редактирования соответствующей части маршрута (илл. «Редактируемый
блок»).
2. Если пользователь нажимает на кнопку "Назад", возвращается экран
информации о документе
([Информация о документе](#sec.documents_docinfo)) в том же состоянии,
которое было до вызова данного экрана.
3. Для выполнения действия пользователь нажимает на кнопку "Запустить".
Действие выполняется при выполнении следующих условий:
* заполнено поле формулировки, иначе необходимо выдавать ошибку:
`Необходимо заполнить краткое содержание`
* во всех редактируемых блоках указаны пользователи - ответственные
за этапы маршрута, иначе необходимо выдавать ошибку:
`Необходимо заполнить ответственного в некоторых этапах маршрута`
> **Примечание**
>
> В случае, если требуется подпись перед отправкой, то по нажатию на
> кнопку "Запустить" действие не произойдет (маршрут не запустится)
> с ошибкой:
>
> `Необходимо подписать документ до того как вы его сможете отослать.`
В случае успешного сохранения сообщается "Данные сохранены", экран
запуска маршрута закрывается, открывается:
* если значение настройки "закрывать ли окно документа после
отправки на активацию" (поле `closeAfterActivation`) = false, то
экран информации о документе
([Информация о документе](#sec.documents_docinfo));
* иначе - экран со списком документов
([Список документов для смартфона](#sec.documents_list)) либо
([Список документов для планшета](#sec.documents_list_tablet)).
Данные при этом обновляются, запускается настроенный маршрут.
**Редактирование маршрута.**
По нажатию на любой блок маршрута открывается экран редактирования
соответствующей части маршрута (илл. «Редактируемый блок»). Заголовок
экрана берется из заголовка блока.
![Блок маршрута](resources/img/documents/unit_edited.png)
![Блок маршрута](resources/img/documents/iOS/unit_edited_iOS.png)
Для блоков с предварительными и последующими этапами вверху экрана
отображается кнопка "Добавить этап" (с идентификатором NOT_PREFFERED), по
нажатию которой открывается экран редактирования этапа маршрута (илл.
«Новый этап маршрута»). В блоке с действия такой конпки быть не должно.
Далее отображаются панели. Панель содержит элементы, в зависимости от
количества подэтапов в ней. Каждая панель означает последовательные этапы
данной части маршрута (последовательность сверху вниз), каждая плашка
внутри панели - параллельные элементы этапа.
Каждый элемент панели содержит аналогичную информацию об этапе/подэтапе,
как и на экране запуска маршрута.
Далее отображается управляющяя кнопка «Готово» (с идентификатором
PREFERRED). Она имеет фиксированное положение, остальные кнопки и панели
данного экрана не имеют фиксированного положения, прокручиваются (если все
поля вмещаются в экран, то кнопка должна быть внизу экрана, а не сразу за
контентом).
Следующие пункты 1 и 2 действительны только для блоков с предварительными и
последующими этапами, т.к. блок с действиями нередактируемый.
1. В результате нажатия (действие tap) по элементу панели открывается экран
редактирования данного этапа маршрута (илл. «Редактирование этапа
маршрута») с заполненными данными.
2. В результате долгого нажатия по элементу панели вызывается меню со
следующими пунктами:
* "Добавить элемент этапа": открывается экран создания нового этапа
маршрута (илл. «Новый этап маршрута»).
* "Переместить этап выше": выбранная панель перемещается выше на одну
позицию. Пункт меню недоступен для первой в списке панели.
* "Переместить этап ниже": выбранная панель перемещается ниже на одну
позицию. Пункт меню недоступен для последней в списке панели.
* "Удалить элемент этапа": запрашивается подтверждение удаления с
сообщением:
`Вы действительно хотите удалить данный элемент этапа?`
Если пользователь подтверждает удаление, выбранный элемент панели
удаляется. Пункт меню недоступен для панели с единственным элементом.
* "Удалить этап": запрашивается подтверждение удаления с сообщением:
`Вы действительно хотите удалить данный этап?`
Если пользователь подтверждает удаление, выбранная панель удаляется
из списка этапов данного блока.
3. Если пользователь нажимает на кнопку "Назад", мобильный клиент возвращает
экран запуска маршрута (илл. «Запуск маршрута») в том состоянии, которое
было до вызова данного экрана.
4. Для сохранения маршрута пользователь нажимает на кнопку "Готово".
Сохранение локальное. Действие выполняется при выполнении следующего
условия:
* во всех редактируемых блоках указаны пользователи - ответственные
за этапы маршрута, иначе необходимо выдавать ошибку:
`Необходимо заполнить ответственного в некоторых этапах маршрута`
В случае успешного сохранения сообщается "Данные сохранены", открывается
экран запуска маршрута (илл. «Запуск маршрута»). Данные в этом экране
обновляются согласно введеным изменениям.
**Создание и редактирование этапа маршрута.**
По нажатию на экране редактирования маршрута на кнопку «Добавить этап» / на
экране редактирования маршрута на пункт контекстного меню «Добавить элемент
этапа» / на экране редактирования этапа маршрута на кнопку «Добавить
параллельный» открывается экран создания нового этапа маршрута (илл. «Новый
этап маршрута»). Заголовок экрана всегда "Новый этап".
![Новый этап маршрута](resources/img/documents/route_stage_new.png)
![Новый этап маршрута](resources/img/documents/iOS/route_stage_new_iOS.png)
По нажатию на экране редактирования маршрута на какой-либо элемент панели
открывается экран редактирования соответствующего элемента этапа маршрута
(илл. «Редактирование этапа маршрута»). Заголовок экрана всегда "Этап".
![Редактирование этапа маршрута](resources/img/documents/route_stage_edit.png)
![Редактирование этапа маршрута](resources/img/documents/iOS/route_stage_edit_iOS.png)
Все поля экрана не имеют фиксированной высоты, экран прокручивается. Вверху
экрана редактирования этапа маршрута отображается кнопка "Добавить параллельный"
(с идентификатором NOT_PREFFERED). По его нажатию открывается экран создания
этапа мрашрута (илл. «Новый этап маршрута»).
Параметры экрана:
+------------------------------+--------------------------------------------------------------------------------+---------------------------------------------------------+
| Параметр | Описание | Значение по умолчанию |
+==============================+================================================================================+=========================================================+
| Номер этапа | Отображается для всех типов действий. Нередактируемое поле ввода. | *Создание* и *Редактирование* - текущий номер этапа. |
+------------------------------+--------------------------------------------------------------------------------+---------------------------------------------------------+
| Тип действия (`typeID`) | Отображается для всех типов действий. Открывается список из возможных значений | *Создание* - первый вариант из списка. |
| | (полученных при загрузке приложения). | |
| | | *Редактирование* - тип действия текущего этапа. |
+------------------------------+--------------------------------------------------------------------------------+---------------------------------------------------------+
| Название (`name`) | Отображается для всех типов действий, обязательно для заполнения. Вводится | *Создание* - поле пустое, placeholder - "Введите |
| | полное название этапа (автоматический подбор согласно выбранного действия, | название". Для типа действия "блокирующий процесс" |
| | как в платформе, не поддерживается). | заполняется значением по умолчанию `event.blocking.`. |
| | | Для типа действия "маршрут" заполняется названием |
| | | выбранного маршрута. |
| | | |
| | | *Редактирование* - текущее название этапа. |
+------------------------------+--------------------------------------------------------------------------------+---------------------------------------------------------+
| Ответственный либо Адресат | Не отображается для типов действий "блокирующий процесс", "регистрация", | *Создание* - поле пустое, placeholder - "Выберите |
| (`userID`) | "маршрут", для остальных типов обязательно для заполнения. Открывается экран | ответственного". |
| | "Пользователи" с параметрами: | |
| | | *Редактирование* - текущий ответственный этапа. |
| | * множественный выбор пользователей; | |
| | * если значение настройки "разрешено ли ставить работы неподчиненным" = | |
| | true, отображать всех пользователей, иначе - только подчиненных. | |
+------------------------------+--------------------------------------------------------------------------------+---------------------------------------------------------+
| Длительность/Дата завершения | Не отображается для типов действий "блокирующий процесс", "маршрут", "отправка | *Создание* - в списке первый вариант, в поле ввода - |
| (`lengthType` и `length`) | документа", для остальных типов обязательно для заполнения. Состоит из двух | значение по умолчанию, placeholder при необходимости - |
| | компонентов. В первом открывается список со значениями: | "Введите длительность" для первых двух вариантов из |
| | | списка. |
| | * `Длительность (ч)` | |
| | * `Длительность (д)` | *Редактирование* - текущие значения длительности либо |
| | * `Дата завершения` в формате ДД/ММ/ГГГГ | даты завершения этапа. |
| | | |
| | Для первых двух вариантов второй компонент - числовое поле ввода, для | |
| | последнего варианта - стандартный компонент выбора даты. | |
+------------------------------+--------------------------------------------------------------------------------+---------------------------------------------------------+
| Нагрузка (`workLoadType` и | Не отображается для типов действий "блокирующий процесс", "маршрут", "отправка | *Создание* - в списке первый вариант, в поле ввода - |
| `workloadValue`) | документа", "регистрация", для остальных типов обязательно для заполнения. | значение по умолчанию, placeholder при необходимости - |
| | Состоит из двух компонентов. В первом открывается список со значениями, | "Введите нагрузку". |
| | настроенными в конфигураторе. Для выбранного типа нагрузки второй компонент | |
| | (числовое поле ввода) заполняется значением по умолчанию. | *Редактирование* - текущее значение нагрузки |
+------------------------------+--------------------------------------------------------------------------------+---------------------------------------------------------+
| Возврат (`returnNumber`) | Отображается только для типов действий "согласование", "утверждение", | *Создание* - "Нет". |
| | "блокирующий процесс" и "регистраци". Открывается список из возможных | |
| | значений. | *Редактирование* - текущее значение возврата. |
+------------------------------+--------------------------------------------------------------------------------+---------------------------------------------------------+
| Форма завершения | Отображается только для типа действия "работа". Открывается список из | *Создание* - "Нет". |
| (`completionFormID`) | возможных значений (полученных при загрузке приложения) и значения "Нет", | |
| | значение "Нет" должно быть в списке первым. Если список форм завершения пуст, | *Редактирование* - текущая форма завершения этапа. |
| | поле не должно быть отображено. | |
+------------------------------+--------------------------------------------------------------------------------+---------------------------------------------------------+
| Код (`code`) | Отображается для всех типов действий, не обязательно для заполнения. Поле | *Создание* - поле пустое, placeholder - "Введите код". |
| | ввода. Должно содержать уникальное в рамках всего маршрута значение. | |
| | | *Редактирование* - текущий код этапа. |
+------------------------------+--------------------------------------------------------------------------------+---------------------------------------------------------+
> **Примечание**
>
> Метод получения нагрузок по умолчанию описан в javadoc:
>
> kz.arta.synergy.server.api.rest.projects#getWorkLoads.
*"Номер этапа"* должен формироваться на клиенте по следующему принципу:
* каждому этапу присвается номер по порядку их следования;
* каждый элемент этапа имеет номер этапа, в котором он расположен;
* при добавлении нового этапа ему присваивается номер `N+1`, где N - это
последний номер этапа в данном блоке маршрута;
* при добавлении нового (параллельного) элемента этапа ему присваивается
номер текущего этапа, откуда было вызвано создание данного элемента;
* при перемещении этапов выше / ниже порядковый номер этапа должен,
соответственно, уменьшиться / увеличиться на единицу;
* при удалении этапа у всех последующих этапов номер должен уменьшиться на
единицу.
Поле *"Тип действия"* содержит процессы, название и порядок следования в списке
которых определяется API.
> **Примечание**
>
> Метод получения настроек процессов описан в javadoc:
>
> kz.arta.synergy.server.api.rest.settings#getProcesses.
При выборе пункта выбора маршрута (тип `ROUTE_ITEM`) открывается экран «Выбор
маршрута» (илл. «Выбор маршрута»).
Поле *"Длительность/Дата завершения"* должно заполняться значениями по следующему
принципу:
* по умолчанию выбран вариант «Длительность (ч)», значением должно являться:
* `default_work_length` - для типов действий «Работа», «Резолюция»,
«Регистрация»;
* `default_agreement_length` - для типа действия «Согласование»;
* `default_approvement_length` - для типа действия «Утверждение»;
* `default_acquaintance_length` - для типа действия «Ознакомление».
* значение варианта «Длительность (д)» должно рассчитываться относительно
значения, введенного в варианте «Длительность (ч)», по формуле:
> «Длительность (ч)» / «Длительность рабочего дня» (поле API `day_length`)
* при возврате в вариант «Длительность (ч)» значение должно рассчитываться уже
относительно значения, введенного в варианте «Длительность (д)», по формуле:
> «Длительность (д)» * «Длительность рабочего дня» (поле API `day_length`)
* значение варианта «Дата завершения» значение должно рассчитываться
относительно значения, введенного в варианте «Длительность (д)», по формуле:
> «Длительность (д)» + текущая дата
* при возврате из варианта «Дата завершения» в любой другой вариант, значение
длительности не должно перерассчитываться относительно значения, введенного
в варианте «Дата завершения», т.е. должны сохранять предыдущие значения.
> **Примечание**
>
> Метод получения значений длительности по умолчанию описан в javadoc:
>
> kz.arta.synergy.server.api.rest.settings#getSettings.
Поле *"Нагрузка"* пока должно содержать единственное поле ввода (без выпадающего
списка), в которое вводится как значение нагрузки, так и её тип. Возможные варианты
типов нагрузки:
* `%` (пример: «20%» «20 %»)
* `ч` (пример: «8ч» или «8 ч»)
* `д` (пример: «1.5д» «1.5 д»)
Дробная часть должна быть отделена точкой, само значение обязательно должно
заканчиваться на один из трех вышеперечисленных символов.
Содержимое выпадающего списка *"Возврат"* должно формироваться на клиенте по
следующему принципу:
* первым в списке всегда должен быть пункт «Нет»;
* далее должны отображаться номера предшествующих этапов;
* если после удаления какого-либо этапа номер возврата ссылается на
несуществующий номер этапа, автоматически должен произойти сброс значения
возврата на «Нет»;
* аналогично, если после перемещения выше / ниже какого-либо этапа номер
возврата ссылается на несуществующий номер этапа, автоматически должен
произойти сброс значения возврата на «Нет».
Значение поля *"Код"* присвается этапу целиком, а не только элементу этапа.
Таким образом, если у любого элемента этапа заполняется поле кода, у остальных
элементов данного этапа необходимо автоматически отображать данный же код.
Соответственно, при удалении кода в одном из элементов этапа, он удаляется у
всех элементов данного этапа.
С учетом всех описаний каждый тип действия должен содержать следующий набор
полей:
* работа (тип `ASSIGNMENT_ITEM`):
* Номер этапа
* Тип действия
* Название
* Ответственный
* Длительность/Дата завершения
* Нагрузка
* Форма завершения
* Код
* согласование (тип `AGREEMENT_ITEM`) и утверждение (тип `APPROVAL_ITEM`):
* Номер этапа
* Тип действия
* Название
* Ответственный
* Длительность/Дата завершения
* Нагрузка
* Возврат
* Код
* ознакомление (тип `ACQUAINTANCE_ITEM`) и резолюция (тип `RESOLUTION_ACTION`):
* Номер этапа
* Тип действия
* Название
* Ответственный
* Длительность/Дата завершения
* Нагрузка
* Код
* блокирующий процесс (тип `BLOCKING_PROCESS`):
* Номер этапа
* Тип действия
* Название
* Возврат
* Код
* отправка документа (тип `SEND_DOCUMENT`):
* Номер этапа
* Тип действия
* Название
* Адресат
* Код
* регистрация (тип `REGISTRATION_ITEM`):
* Номер этапа
* Тип действия
* Название
* Длительность/Дата завершения
* Возврат
* Код
* маршрут (тип `ROUTE_ITEM`):
* Номер этапа
* Тип действия
* Название
* Код
Далее отображается управляющяя кнопка «Готово» (с идентификатором
PREFERRED).
1. Если пользователь на экране редактирования этапа маршрута нажимает на
кнопку "Назад", мобильный клиент возвращает экран редактирования маршрута
(илл. «Блок маршрута») в том состоянии, которое было до вызова данного
экрана.
2. Для сохранения этапа пользователь нажимает на кнопку "Готово". Сохранение
локальное. Действие выполняется, только если заполнены обязательные поля.
Ошибки валидации:
* не заполнено поле "Название":
`Введите название`
* не заполнено поле "Ответственный":
`Введите ответственного`
* не заполнено поле "Длительность/Дата завершения" с выбранным значением
"Длительность (ч)" либо "длительность (д)":
`Введите длительность`
* не заполнено поле "Длительность/Дата завершения" с выбранным значением
"Дата завершения":
`Введите дату завершения`
* в поле "Длительность/Дата завершения" с выбранным значением "Дата
завершения" указана уже прошедшая дата:
`Некорректная дата завершения`
* не заполнено поле "Нагрузка", либо заполнено не по формату:
`Укажите нагрузку`
* значение поля "Код" уже присвоено другому этапу:
`Данный код уже используется`
В случае неуспешного сохранения поле выделяется красным цветом `#c02929` и
выдается сообщение об ошибке, пользователь остается на экране создания /
редактирования этапа маршрута. В случае же успешного сохранения сообщается
"Данные сохранены", открывается экран редактирования маршрута (илл. «Блок
маршрута»).
Новый добавленный этап добавляется в список последним. При выборе нескольких
пользователей необходимо создавать группу параллельных этапов с дублирующейся
информацией.
Отредактированный же этап обновляет соответствующую плашку панели.
**Выбор маршрута.**
Для выбранного действия "Маршрут" открывается экран выбора маршрута
(илл. «Выбор маршрута»). При открытии экрана API должно возвращать
следующую информацию:
* `routeName` - список маршрутов, доступных авторизованному пользователю;
* `authorName` - ФИО автора каждого из маршрутов.
![Выбор маршрута](resources/img/documents/route_choose.png)
![Выбор маршрута](resources/img/documents/iOS/route_choose.png)
Внизу экрана отображается управляющая кнопка "Добавить этап" «Готово» (с
идентификатором PREFERRED). Она имеет фиксированное положение, остальную
часть экрана занимает панель со списком маршрутов. Прокрутка списка
скроллом осуществляется внутри панели, если панель вмещаются в экран, то
кнопка должна быть внизу экрана, а не сразу за контентом.
Каждый элемент списка состоит из: "Фамилия И.О." автора маршрута на первой
строке, на второй и далее - полное название маршрута.
По нажатию на элемент списка он выделяется.
1. Если пользователь на экране выбора маршрута нажимает на кнопку "Назад",
мобильный клиент возвращает экран создания / редактирования этапа
маршрута (илл. «Новый этап маршрута», илл. «Редактирование этапа
маршрута») в том состоянии, которое было до вызова данного экрана (в
поле "Тип действия" должен отображаться предыдущий выбранный тип).
2. Для сохранения выбранного маршрута пользователь нажимает на кнопку
"Готово". Сохранение локальное. Действие выполняется, только если
выделен маршрут, иначе необходимо не выполнять действие и выдавать
ошибку:
`Выберите маршрут`
В случае успешного сохранения сообщается "Данные сохранены",
открывается экран создания / редактирования этапа маршрута (илл.
«Новый этап маршрута», илл. «Редактирование этапа маршрута»). Данные в
этом экране обновляются согласно введеным изменениям, а именно:
* в поле "Тип действия" добавляется новый пункт в список - выбранный
маршрут
* он же сменяет предыдущее значение в поле "Тип действия";
* набор полей экрана переопределяется согласно выбранного типа.
> **Примечание**
>
> Метод получения списка маршрутов, доступных пользователю по умолчанию описан
> в javadoc:
>
> kz.arta.synergy.server.api.rest.docflow.doc#getRoutes.
Дочерние документы {#sec.documents_subsidiary_docs}
------------------
Для того, чтобы просмотреть дочерние документы для данного, пользователь
должен провести пальцем от правой стороны плашки документа к левой, при
этом раскроется правая панель дочерних документов к данному (илл.
«Дочерние документы для смартфона», илл. «Дочерние документы для
планшета»).
![Дочерние документы для смартфона](resources/img/documents/subsidiary_docs_smartphone.png)
![Дочерние документы для планшета](resources/img/documents/subsidiary_docs_tablet.png)
Родительский документ отличается от дочерних фоном (#efefef) и
полужирным выделением (всегда, независимо от значения поля "is_new"),
отображается в самом начале списка.
Логика отображения остальных плашек аналогична главному экрану со
списком документов
([Список документов для смартфона](#sec.documents_list),
[Список документов для планшета](#sec.documents_list_tablet)).
**Возможные действия с плашкой документа:**
1. При выделении плашки (tap) открывается экран с информацией о документе
(независимо от прав пользователя).
2. При двойном нажатии по плашке смартфона (double tap), а также при
масштабировании плашки сведением и разведением пальцев (`pinch-to-zoom`,
не поддерживается в sencha), она переключается между режимами "полная"
/ "неполная".
3. В результате долгого нажатия по плашке документа появляется меню с
пунктами, доступными для любого пользователя: "Показать информацию" /
"Скрыть информацию" - для переключения между режимами плашки "полная"
/ "неполная".
**Переходы на другие экраны.**
Чтобы перейти к дочерним документам данного дочернего документа,
пользователь проводит пальцем от правой стороны плашки к левой
([Дочерние документы](#sec.documents_subsidiary_docs)).
По нажатию на плашку документа открывается экран полной информации о
документе ([Информация о документе](#sec.documents_docinfo)).
По нажатию на кнопку "Назад" пользователь возвращается на 1 (один)
уровень вложенности вверх.
Панель можно скрыть двумя способами (переход из любого уровня вложенности
на главный экран со списком документов):
1. проведя пальцем от левой стороны экрана к правой;
2. нажав по любому месту левой стороны экрана (там, где отображается
часть экрана списка документов).
\ No newline at end of file
### Панель с параметрами документа, панель с параметрами работы по документу {#sec.documents_work_information}
**Верхняя панель** идентична таковой в потоках работ
([Панель с параметрами работы, панель формы завершения](#sec.workflow_work_information)).
**Панель с параметрами документа** может быть в двух состояниях.
- С неполной информацией о документе - содержит краткое содержание
(поле API "name"), через дефис значащее содержимое (поле API
"content") документа и кнопку "Подробнее" (илл. «Панель неполной
информации о документе, а также пример информации о документе
без работ»). Текст краткого содержанияотображается максимум на 3
(три) строки. Если текста менее трех строк, то должна меняться
минимальная высота панели в соответствии с количеством строк
краткого содержания (но не более трех строк). Если же полностью
не помещается на плашке, то с правого края третьей строки оно
должно быть затемнено градиентом из прозрачного в цвет фона.
![Панель неполной информации о документе, а также пример информации о документе без работ](resources/img/documents/documents_witout_works.png)
![Панель неполной информации о документе, а также пример информации о документе без работ](resources/img/documents/iOS/documents_witout_works.png)
- С полной информацией о документе - содержимое полностью
аналогично таковому в полной плашке смартфона
([Список документов для смартфона](#sec.documents_list), раздел
"Полная плашка документа), а также кнопка "Скрыть" (илл.
«Панель полной информации о документе»).
![Панель полной информации о документе](resources/img/documents/documents_full_information.png)
![Панель полной информации о документе](resources/img/documents/iOS/documents_full_information.png)
Переключение между состояниями панели происходит только по нажатию
кнопок "Подробнее" и "Скрыть".
**Панель с параметрами работы по документу** также аналогична
таковой в потоках работ
([Панель с параметрами работы, панель формы завершения](#sec.workflow_work_information)),
но со следующими двумя дополнениями:
1. Если открыта информация о документе без работ (илл. «Панель
неполной информации о документе, а также пример информации о
документе без работ»), то панель не отображается.
2. Если пользователь по данному документу имеет несколько работ,
то к панели добавляется индикация в виде набора маркеров (илл.
«Несколько работ по документу»), где выделенный маркер
показывает номер текущей работы, а их общее количество равно
количеству работ по документу. Переключаться между работами
можно с помощью жеста "swipe" вправо и влево по панели. При
переключении между работами набор управляющих кнопок меняется
согласно активной работе по документу.
![Несколько работ по документу](resources/img/documents/documents_neskolko_works.png)
![Несколько работ по документу](resources/img/documents/iOS/documents_neskolko_works.png)
\ No newline at end of file
Закрытие приложения {#sec.app_exit}
===================
**Закрытие приложения для платформы Android:**
1. По нажатию на кнопку "Домой" - приложение сворачивается, в памяти
остается активный процесс.
2. По нажатию на кнопку "Назад" с экрана авторизации / с экрана со
списком работ - приложение закрывается, в памяти удаляется активный
процесс, но остается фоновый.
**Закрытие приложения для платформы iOS:** по нажатию на кнопку
"Домой" - приложение сворачивается, в памяти остается активный процесс.
Файлы {#chap.files}
=========
<#include "files/files_list.md">
<#include "files/files_navigator.md">
<#include "files/files_search.md">
<#include "files/files_actions.md">
Действия в хранилище {#sec.files_actions}
------------------
В модуле «Файлы» доступны следующие действия.
<#include "files/files_add.md">
<#include "files/files_create.md">
<#include "files/files_rename.md">
<#include "files/files_move.md">
<#include "files/files_download.md">
<#include "files/files_delete.md">
### Добавление файла в хранилище {#sec.files_add}
Функция добавления файла в хранилище доступна только в меню
«Создать» и соответствует пункту `upload_document` параметра
API `files_items`. В соответствии с этим параметром название
группового пункта меню может быть произвольным. Названия двух
подпунктов неизменяемы: «С устройства» и «Сфотографировать».
Кроме наличия параметра в методе API для добавления файла
необходимо наличие права «Добавление нового элемента» (`ADD`)
на папку, в которой он будет расположен.
* При выборе подпункта добавления файла «С устройства»
приложение выдает стандартное (системное) диалоговое окно
выбора файла.
* При выборе подпункта добавления файла «Сфотографировать»
вызывается встроенный фотомодуль устройства. При таком
добавлении файла приложение должно задавать имя файлу в
следующем формате: `Снимок dd MM yyyy HH:mm`.
В случае успешного добавления сразу создается новая плашка
файла в списке (по общепринятым правилам сортировки), иначе -
отображается сообщение об ошибке:
* Если введенное название файла совпадает с уже
существующим в данной родительской папке файлом:
`Файл %название% уже существует. Действие не выполнено`
По нажатию "Отмена" действие не выполняется.
> **Примечание**
>
> Метод для добавления файла в хранилище описан в javadoc:
>
> kz.arta.synergy.server.api.rest.storage#add.
>
> http://tdd.lan.arta.kz/docs/synergy/trunk/sdk-doc/javadoc/kz/arta/synergy/server/api/rest/storage/StorageService.html#add%28java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String%29
### Создание папки хранилища {#sec.files_create}
Функция создания новой папки доступна только в меню
«Создать» и соответствует пункту `new_folder` параметра API
`files_items`. В соответствии с этим параметром название
пункта меню может быть произвольным.
Кроме наличия параметра в методе API для создания новой
папки необходимо наличие права «Добавление нового элемента»
(`ADD`) на папку, в которой она будет расположена.
Пользователь нажимает на пункт меню создания новой папки и
приложение выдает стандартное (системное) диалоговое окно
"Новая папка" для ввода названия. В поле ввода по умолчанию
пусто.
По нажатию "ОК" пользователь подтверждает создание,
отправляется запрос на сервер. В случае успешного выполнения
сразу создается новая плашка папки в списке (по общепринятым
правилам сортировки), иначе - диалог закрывается, действие не
выполняется и отображается сообщение об ошибке:
* Если не введено название папки:
`Введите название папки`
* Если введено некорректное название папки (например, с
символами `* [ ] { } \ | / :`):
`Введите корректное название папки`
* Если введенное название папки совпадает с уже
существующей в данной родительской папке:
`Папка с таким названием уже существует`
По нажатию "Отмена" действие не выполняется.
> **Примечание**
>
> Метод для создания новой папки хранилища описан в javadoc:
>
> kz.arta.synergy.server.api.rest.storage#create.
>
> http://tdd.lan.arta.kz/docs/synergy/trunk/sdk-doc/javadoc/kz/arta/synergy/server/api/rest/storage/StorageService.html#create%28java.lang.String,%20java.lang.String,%20java.lang.String%29
### Удаление элемента хранилища {#sec.files_delete}
Функция удаления доступна как для папок, так и для файлов,
только в контекстном меню соответствующего элемента «Действия»,
пункт «Удалить».
Для удаления элемента необходимо наличие права «Удаление
элемента» (`DELETE`) на папку, в которой он расположен.
Пользователь нажимает на этот пункт меню и приложение
запрашивает подверждение выполнения действия "Удаление
элемента" с сообщением:
* для элемента-папки: `Вы действительно хотите удалить
папку "%название_папки%"?`
* для элемента-файла: `Вы действительно хотите удалить
файл "%название_файла.расширение%"?`
Если пользователь подтверждает удаление, отправляется запрос
на сервер для удаления. В случае успешного выполнения плашка
удаляется из списка, иначе - отображается сообщение об ошибке.
> **Примечание**
>
> Метод для удаления элемента хранилища описан в javadoc:
>
> kz.arta.synergy.server.api.rest.storage#remove.
>
> http://tdd.lan.arta.kz/docs/synergy/trunk/sdk-doc/javadoc/kz/arta/synergy/server/api/rest/storage/StorageService.html#remove%28java.lang.String,%20java.lang.String%29
### Скачивание файла из хранилища {#sec.files_download}
В мобильном приложении доступно 2 вида скачивания файлов: обычное
и в версии PDF.
*Обычное скачивание* вызывается следующими действиями:
* по нажатию (tap) на плашку файла;
* при выборе пункта «Скачать» контекстного меню файла
«Действия».
*Скачивание в версии PDF* доступно только в контекстном меню
файла «Действия», пункт «Скачать как PDF».
Для скачивания файлов необходимо наличие права «Загрузка файла
документа» (`LOAD_DOCUMENT`) на папку, в которой он расположен.
Даже при наличии такого права пункт «Скачать как PDF» может
отсутствовать, если файл не является текстовым.
В первом случае происходит скачивание файла в исходном формате,
во втором - в формате PDF. Скачанный файл открывается
системными средствами устройства.
При отсутствии права на загрузку файлов и по нажатию (tap) на
плашку файла необходимо не выполнять действие и не отображать
никаких ошибок.
> **Примечание**
>
> Метод для скачивания файла:
>
> `rest/api/storage/file/get?identifier=node_id`
>
> Метод для получения PDF-версии файла:
>
> `rest/api/storage/pdf/get?identifier=node_id`
>
> В обоих случаях `node_id` - идентификатор файла. Полная
> ссылка должна выглядеть следующим образом:
>
> `http(s)://user_login:user_pass@host:port/Synergy/rest/api/storage/file/get?identifier=node_id`
>
> или
>
> `http(s)://user_login:user_pass@host:port/Synergy/rest/api/storage/pdf/get?identifier=node_id`
>
> где `user_login` - логин авторизованного пользователя,
> `user_pass` - пароль авторизованного пользователя. Без
> авторизации доступ к файлам запрещен.
Список файлов {#sec.files_list}
-------------------------------
Экран со списком файлов представлен на илл. «Список файлов».
![Список файлов](resources/img/files/main.png)
**Элементы управления экрана со списком файлов.**
+--------------------------------------------------------------+------------------------+--------------------------------------------------------+
| Элемент управления | Расположение на экране | Описание |
+==============================================================+========================+========================================================+
| *Верхняя панель* | | |
+--------------------------------------------------------------+------------------------+--------------------------------------------------------+
| ![](resources/img/workflow/elements/button_filters.png)\ | Слева | "Навигатор" - кнопка перехода к |
| | | [навигатору хранилища](#sec.files_navigator) |
+--------------------------------------------------------------+------------------------+--------------------------------------------------------+
| "Файлы" | По центру | Выпадающий список для переключения между модулями |
+--------------------------------------------------------------+------------------------+--------------------------------------------------------+
| ![](resources/img/workflow/elements/button_work_create.png)\ | Справа | "Создать" - кнопка [добавления файла](#sec.files_add), |
| | | [создания новой папки](#sec.files_create) и |
| | | и [создания документа](#sec.workflow_document_create) |
+--------------------------------------------------------------+------------------------+--------------------------------------------------------+
| ![](resources/img/files/elements/search.png)\ | Левее кнопки "Создать" | "Поиск" - кнопка для перехода к |
| | | [поиску по файлам](#sec.files_search) |
+--------------------------------------------------------------+------------------------+--------------------------------------------------------+
| *Компонент "Путь"* | Ниже верхней панели | Компонент, отображающий путь до текущей открытой папки |
+--------------------------------------------------------------+------------------------+--------------------------------------------------------+
| *Рабочая область* | | |
+--------------------------------------------------------------+------------------------+--------------------------------------------------------+
| | Вся рабочая область | Плашки, отображающие информацию о папке / файле |
| | ниже пути | |
+--------------------------------------------------------------+------------------------+--------------------------------------------------------+
По нажатию на "Файлы" на верхней панели не отображаются все
кнопки, под панелью открывается выпадающий список с модулями
(илл. «Переключение между модулями»):
* [Работы](#chap_workflow);
* [Документы](#chap.documents);
* [Файлы](#chap.files).
![Переключение между модулями](resources/img/files/main_menu.png)
До вызова выпадающего списка стрелка отображается указателем
вниз, по вызову меняется указателем вверх. По нажатию вне
области выпадающего списка, а также по указателю и шапке
списка, он скрывается. По нажатию на текущий модуль список
обновляется, на другой модуль - открывается соответствующий
модуль.
Компонент *"Путь"* содержит полный путь до папки хранилища
(`path`). Содержимое компонента: полные названия папок от
корневой родительской до текущей открытой, включая её саму.
При этом путь должен быть не абсолютным согласно хранилища,
а относительным согласно его расположения в дереве папок.
> Например, из структуры папок Хранилище -> Папка 1 -> Папка
> 1.1 пользователю согласно его ролям доступна только Папка
> 1.1. В качестве пути будет отображаться не полный
> (абсолютный) путь `Хранилище -> Папка 1 -> Папка 1.1`, а
> относительный `Папка 1.1`.
Каждый элемент пути, кроме последнего, отделен от предыдущего
/ следующего символом
![](resources/img/files/elements/icon_breadcrumbs.png). Если
все элементы не помещаются на ширину экрана, только в данном
компоненте должен активироваться горизонтальный скролл, при
этом слева и справа невмещающиеся названия должны затемняться
градиентом из прозрачного в цвет фона.
Кроме того, каждый элемент пути является кликабельной ссылкой
на соответствующую папку. Таким образом, навигация по
хранилищу возможна тремя способами:
* переход в любую папку хранилища, используя навигатор;
* переход только в дочерние папки из общего списка папок и
файлов;
* переход в родительские папки, используя компонент "Путь".
> *Пример навигации, используя компонент "Путь":*
>
> Для того, чтобы вернуться "на уровень выше", необходимо в
> пути выбрать предпоследний элемент и нажать на него.
>
> Для того, чтобы вернуться "домой" (т.е. в корневой элемент),
> необходимо в пути выбрать самый первый элемент (при
> необходимости прокрутив компонент по горизонтали) и нажать
> на него.
*Папки и файлы в списке* отображаются все сразу. При
прокрутке пользователем в начале списка вверх (действие
dropdown) список обновляется.
Список папок и файлов сортируется следующим образом. Сначала
отображаются папки, затем файлы, между собой элементы должны
быть отсортированы по названию в порядке возрастания (сначала
0-9, затем A-Z, затем А-Я).
**Плашка элемента хранилища.**
Плашка папки / файла - это компонент, отображающий информацию
об элементе хранилища. Плашки могут быть разных размеров.
![Плашка папки](resources/img/files/elements/folder_billet.png)
![Плашка файла](resources/img/files/elements/file_billet.png)
+-----------------------------------------------+-----------------------------+-------------------------------------+-------------+
| Элемент | Расположение | Описание | Поле API |
+===============================================+=============================+=====================================+=============+
| ![](resources/img/files/elements/folder.png)\ | В левой части всей плашки | Тип элемента хранилища | `is_folder` |
+-----------------------------------------------+-----------------------------+-------------------------------------+-------------+
| | Справа от иконки; все | Полное название папки или файла | `name` |
| | строки, кроме последней | | |
+-----------------------------------------------+-----------------------------+-------------------------------------+-------------+
| Абдрешен Л.С. | Справа от иконки; последняя | ФИО пользователя, выполнившего | `userName` |
| | строка плашки, слева | последнее изменение папки или файла | |
+-----------------------------------------------+-----------------------------+-------------------------------------+-------------+
| 01.01.16 09:00:00 | Справа от иконки; последняя | Дата и время последнего изменения | `modified` |
| | строка плашки, справа | папки или файла | |
+-----------------------------------------------+-----------------------------+-------------------------------------+-------------+
*Тип элемента хранилища* отображается в виде пиктограммы папки
(`is_folder` = true) или файла (`is_folder` = false). Пример
иконки папки приведен в таблице выше. Иконки файлов зависят от
расширения, они аналогичны таковым в панели вложений
[работы](#sec.workflow_attachments).
*Пользователь*, выполнивший последнее изменение элемента
хранилища. Отображается в формате %Фамилия И.О.%
*Дата и время* последнего изменения элемента хранилища.
Отображается в формате %ДД.ММ.ГГ ЧЧ:ММ:СС%.
**Возможные действия на экране.**
По нажатию на кнопку "Навигатор", а также проведя пальцем от
левой стороны экрана к правой, раскрывается левая панель
[навигатора по хранилищу](#sec.files_navigator)).
По нажатию на кнопку "+" вызывается меню «Создать» (аналогичное
в модуле «Работы»), в построении которого участвуют пункты
параметра `files_items`:
* `favorite_documents`;
* `all_documents`;
* `upload_document`;
* `new_folder`.
![Меню создания в модуле "Файлы"](resources/img/files/main_create.png)
Действия `favorite_documents` и `all_documents` соответствуют
пунктам [создания документов](#sec.document_creation).
Действие `upload_document` соответствует групповому пункту
[добавления файла в хранилище](#sec.files_add), который по
умолчанию всегда раскрыт, а также двум подпунктам «С
устройства» и «Сфотографировать».
Действие `new_folder` соответствует пункту
[создания новой папки](#sec.files_create).
Кнопка "+" может отсутствовать вовсе, см. подробнее в разделе
[Действия в хранилище](#sec.files_actions). В таком случае
кнопка "Поиск" должна переместиться на место кнопки "Создать".
В целом же логика меню «Создать» и экрана «Избранное» не
отличается от таковой в [работах](#sec.workflow_create_menu).
По нажатию на кнопку поиска открывается отдельный экран
[«Поиск»](#sec.files_search).
По нажатию на элемент пути обновляется список: в нем должно
отображаться содержимое соответствующей папки.
По нажатию на кнопку "Назад":
* для переключателя "Запомнить меня" со значением "Выкл" -
открывается [экран авторизации](#sec.autorise);
* для переключателя "Запомнить меня" со значением "Вкл" -
происходит [закрытие приложения](#sec.app_exit).
*Возможные действия с плашкой папки:*
1. При выделении папки (tap) обновляется список: в нем должно
отображаться содержимое выделенной папки.
2. В результате долгого нажатия по плашке возможно появление
меню для осуществления дополнительных действий с папкой.
Набор пунктов меню зависит от прав пользователя на папку.
Если нет прав для совершения ни одного действия - меню не
отображается. Возможные пункты меню:
1. [Переименовать](#sec.files_rename);
2. [Переместить](#sec.files_move);
3. [Удалить](#sec.files_delete).
*Возможные действия с плашкой файла:*
1. При выделении файла (tap) он скачивается на устройство и
открывается системными средствами.
2. В результате долгого нажатия по плашке возможно появление
меню для осуществления дополнительных действий с папкой.
Набор пунктов меню зависит от прав пользователя на папку,
в которой лежит данный файл. Если нет прав для совершения
ни одного действия - меню не отображается. Возможные
пункты меню:
1. [Переименовать](#sec.files_rename);
2. [Переместить](#sec.files_move);
3. [Скачать](#sec.files_download);
4. [Скачать как PDF](#sec.files_download);
5. [Удалить](#sec.files_delete).
> **Примечание**
>
> Метод получения содержимого папок хранилища описан в javadoc:
>
> kz.arta.synergy.server.api.rest.stotage#listFiles.
>
> http://tdd.lan.arta.kz/docs/synergy/trunk/sdk-doc/javadoc/kz/arta/synergy/server/api/rest/storage/StorageService.html#listFiles%28java.lang.String,%20boolean,%20java.lang.String%29
### Перемещение элемента хранилища {#sec.files_move}
Функция перемещения доступна как для папок, так и для файлов,
только в контекстном меню соответствующего элемента «Действия»,
пункт «Переместить».
Для перемещения элемента необходимо наличие права
«Переименование / Перемещение элемента» (`MOVE`) на папку,
в которой он расположен, а также «Добавление нового элемента»
(`ADD`) на папку месторасположения.
Пользователь нажимает на этот пункт меню и приложение выдает
экран "Переместить".
![Перемещение элемента хранилища](resources/img/files/move.png)
![Перемещение элемента хранилища](resources/img/files/iOS/move_ios.png)
Панель со списком по центру и кнопка "Выбрать" внизу экрана
имеют фиксированное положение, прокрутка списка скроллом
осуществляется внутри панели. Внутри панели отображается
все доступное данному пользователю хранилище системы. Каждая
запись содержит полное название папки.
Панель со списком папок имеет следующие особенности:
* С понижением уровня папки смещаются вправо (при этом
уровни вложенности, начиная с 8-й, должны иметь отступ
как для 7-го уровня).
* Если папка содержит вложенные папки, то в правой части
отображается иконка
![](resources/img/workflow/elements/favorite_undetailed.png)
для свернутой папки и
![](resources/img/workflow/elements/favorite_detailed.png)
для развернутой. По нажатию на квадратную область
(кликабельная область аналогична навигатору в файлах)
вокруг иконки свернутой папки он разворачивается, и
наоборот. Одновременно может быть раскрыто несколько
деревьев папок. Развернутая папка должна содержать либо
вложенные папки (по умолчанию, каждый раз они свернуты),
либо содержащиеся в ней файлы.
> **Примечание**
>
> По умолчанию, каждая папка всегда отображается с
> иконкой «Развернуть», даже если вложенные папки у
> неё отсутствуют (особенность поведения в платформе).
> Таким образом, только после разворачивания папки без
> вложенных папок иконка «Свернуть» / «Развернуть»
> исчезнет, и это не является ошибкой мобильного
> приложения.
* В любой строке (за исключением области иконок свернуть /
развернуть) папки присутствует выделение (действие tap).
После выделения папки пользователь нажимает на кнопку
«Выбрать». Действие выполняется, только если выделена
какая-либо папка, иначе необходимо выдавать сообщение:
`Папка не выбрана`
и не выполнять действие.
В случае успешного перемещения содержимое исходной папки
обновляется - перемещенный элемент в списке более не
отображается, иначе - выходит сообщение об ошибке:
* Если на папку месторасположения отсутствует право
добавления нового элемента:
`Недостаточно прав для выполнения действия`
действие не осуществляется, экран перемещения остается
открытым;
* Если название перемещаемого элемента (папки или файла)
совпадает с уже существующим в папке месторасположения
элементом:
`Объект уже существует`
действие не осуществляется, экран перемещения
закрывается.
> **Примечание**
>
> Метод для перемещения элемента хранилища описан в
> javadoc:
>
> kz.arta.synergy.server.api.rest.storage#move.
>
> http://tdd.lan.arta.kz/docs/synergy/trunk/sdk-doc/javadoc/kz/arta/synergy/server/api/rest/storage/StorageService.html#move%28java.lang.String,%20java.lang.String,%20java.lang.String%29
Навигатор хранилища {#sec.files_navigator}
------------------
По нажатию на кнопку "Навигатор", а также проведя пальцем от левой
стороны экрана со списком документов к правой, раскрывается левая
панель навигатора хранилища (илл. «Навигатор хранилища»).
![Навигатор хранилища](resources/img/files/navigator.png)
Верхняя панель содержит кнопку ["Настройки"](#sec.settings) и
надпись "Навигатор". Нижняя панель отображается только для
включенного флажка "Синхронизировать данные для оффлайн-работы" и
содержит кнопку синхронизации.
Кнопка синхронизации содержит иконку и один из вариантов подписи
к ней:
- "Синхронизация не производилась" - для варианта, когда на
устройстве отсутствуют данные синхронизации;
- "Идёт синхронизация" - для активного
[процесса синхронизации](#sec.offline);
- "Последняя синхронизация: ДД месяц ЧЧ:ММ" - во всех
остальных случаях (указывается дата и время последней
успешной синхронизации).
Навигатор состоит из двух основных частей:
* избранные папки пользователя;
* сплит;
* основное дерево хранилища.
*Избранная папка хранилища* - это закладка на папку из основного
дерева. По нажатию на закладку в основном дереве необходимо
автоматически выделять указанную папку с раскрытием соответствующих
ей веток. Таким образом, в навигаторе могут являться выделенными
одновременно 2 ноды дерева, и это не будет являться ошибкой.
После выделения папки в навигаторе необходимо автоматически
переходить в список содержимого этой папки.
Ветка избранных папок, по умолчанию, всегда раскрыта. По нажатию
на ноду "Избранное" ничего происходить не должно.
> *Примечание:*
>
> Если закладка ссылается на недоступную данному пользователю
> папку необходимо не выполнять действие и выдавать ошибку:
>
> `Элемент был удален либо у вас нет прав на просмотр`
>
> Если закладка ссылается на несуществующую (удаленную) папку в
> основном дереве необходимо удалять данную закладку с ошибкой:
>
> `Элемент был удален либо у вас нет прав на просмотр`
>
> Если удаленная закладка являлась единственной, то отображать
> всю ветку избранных папок хранилища более не нужно.
Для построения *основного дерева* используются только параметры
`is_folder` со значением «true» и `name` в качестве их названия.
При каждом новом запуске приложения, а также после переключения
модулей все папки основного дерева, кроме личной («Мои документы»),
должны быть свернуты, а выделенной являться первая папка
навигатора. В остальных случаях развернутость дерева и последняя
выделенная папка должны сохранять свои значения.
Кроме того, ввиду возможности навигации по папкам также из списка
и компонента "Путь", при каждом открытии навигатора необходимо
учитывать текущую открытую папку и выделять её.
Если папка содержит вложенные папки, то в правой части
отображается иконка
![](resources/img/workflow/elements/filters_undetailed.png) для
свернутой папки и
![](resources/img/workflow/elements/filters_detailed.png) для
развернутой. По нажатию на квадратную область (кликабельная
область аналогична фильтрам в работах) вокруг иконки свернутой
папки он разворачивается, и наоборот. Одновременно может быть
раскрыто несколько деревьев папок.
> **Примечание**
>
> По умолчанию, каждая папка всегда отображается с иконкой
> «Развернуть», даже если вложенные папки у неё отсутствуют
> (особенность поведения в платформе). Таким образом, только
> после разворачивания папки без вложенных папок иконка
> «Свернуть» / «Развернуть» исчезнет, и это не является
> ошибкой мобильного приложения.
>
> Сворачивание папки в навигаторе сопровождается одновременным
> обновлением списка файлов без автоматического перехода
> непосредственно к списку.
Если название папки полностью не помещается на строке, с правого
края оно должно быть затемнено градиентом из прозрачного в цвет
фона.
По нажатию на название папки левая панель скрывается и
пользователю отображается список вложенных папок и файлов
согласно выбранной папки хранилища.
**Переходы на другие экраны.**
С панели навигатора можно перейти в
[настройки приложения](#sec.settings), нажав на кнопку
"Настройки" либо вернуться к [списку файлов](#sec.files_list).
Левую панель можно скрыть тремя способами:
1. проведя пальцем от правой стороны экрана к левой;
2. нажав по любому месту правой стороны экрана (там, где
отображается часть экрана списка файлов);
3. нажав на кнопку "Назад" (для ОС Android).
> **Примечание**
>
> Метод для построения избранных папок хранилища описан в
> javadoc:
>
> kz.arta.synergy.server.api.rest.stotage#listFavoriteFolders.
>
> http://tdd.lan.arta.kz/docs/synergy/trunk/sdk-doc/javadoc/kz/arta/synergy/server/api/rest/storage/StorageService.html#listFavoriteFolders%28%29
>
> Метод для построения основного дерева хранилища описан в
> javadoc:
>
> kz.arta.synergy.server.api.rest.stotage#listFiles.
>
> http://tdd.lan.arta.kz/docs/synergy/trunk/sdk-doc/javadoc/kz/arta/synergy/server/api/rest/storage/StorageService.html#listFiles%28java.lang.String,%20boolean,%20java.lang.String%29
### Переименование элемента хранилища {#sec.files_rename}
Функция переименования доступна как для папок, так и для
файлов, только в контекстном меню соответствующего элемента
«Действия», пункт «Переименовать».
Для переименования элемента необходимо наличие права
«Переименование / Перемещение элемента» (`MOVE`) на папку,
в которой он расположен.
Пользователь нажимает на этот пункт меню и приложение
выдает стандартное (системное) диалоговое окно
"Переименование" для редактирования названия. В поле ввода
должно содержаться текущее название элемента (для
элемента-файла с его расширением).
По нажатию "ОК" пользователь подтверждает переименование,
отправляется запрос на сервер. В случае успешного выполнения
название в плашке сразу обновляется, иначе - диалог
закрывается, действие не выполняется и отображается
сообщение об ошибке:
* Если не введено название элемента:
`Введите название элемента`
* Если введено некорректное название элемента (например, с
символами `* [ ] { } \ | / :`):
`Введите корректное название элемента`
* Если введенное название папки / файла совпадает с уже
существующим в данной родительской папке элементом:
`Элемент '%название%' уже существует. Выберите другое имя`
действие не осуществляется;
По нажатию "Отмена" действие не выполняется.
> **Примечание**
>
> Метод для переименования элемента хранилища описан в
> javadoc:
>
> kz.arta.synergy.server.api.rest.storage#rename.
>
> http://tdd.lan.arta.kz/docs/synergy/trunk/sdk-doc/javadoc/kz/arta/synergy/server/api/rest/storage/StorageService.html#rename%28java.lang.String,%20java.lang.String,%20java.lang.String%29
Поиск файлов {#sec.files_search}
-------------------------------
По нажатию в модуле «Файлы» на кнопку "Поиск" открывается экран
«Поиск» (илл. «Поиск файлов в хранилище»).
![Поиск файлов в хранилище](resources/img/files/search.png)
![Поиск файлов в хранилище](resources/img/files/iOS/search_ios.png)
Поле с поиском и кнопка "Параметры поиска"
![](resources/img/files/elements/search_parameters.png)
вверху и панель со списком по центру экрана имеют фиксированное
положение, прокрутка списка скроллом осуществляется внутри
панели. Внутри панели отображаются результаты поиска в виде
плашек файла. Плашка должна быть аналогичной таковой в списке,
за следующим исключением: на месте пользователя, выполнившего
последнее изменение файла должна отображаться дата и время
последнего изменения файла.
*Особенности поиска:*
* поиск осуществляется в папке, которая была открыта в момент
перехода к данному экрану;
* при открытии данного экрана должен автоматически происходить
пустой запрос поиска;
* поиск не является "живым", т.е. он должен производиться
только после нажатия кнопки "Ввод" на клавиатуре либо иконки
лупы в поле поиска;
* каждый новый поисковый запрос сбрасывает настроенные
параметры поиска до значений по умолчанию;
* если количество результатов в категории "Все результаты" =
0, то кнопка "Параметры поиска" должна быть недоступна для
нажатия.
Пользователь нажимает по полю поиска и вводит текст запроса,
при вводе текста иконка лупы ничем не заменяется. Пустой запрос
поиска - отображается список со всеми файлами папки.
По нажатию на плашку файла должно происходить действие
[скачивания файла](#sec.files_download), если есть соответствующее
право на этот файл. Кроме того, у каждой плашки должно быть
контектсное меню "Действия" с единственным пунктом «Перейти к
папке». По нажатию на данный пункт меню необходимо закрывать экран
поиска, в общем списке папок и файлов открывать папку, которая
содержит этот файл.
Файлы - результаты поиска - отображаются с постепенной догрузкой.
Изначально подгружается такое количество файлов, чтобы список
был полностью заполнен и появился скролл (минимум 30). При
прокрутке пользователем вниз список дополняется (количество
файлов в новой "порции" должно быть равно количеству файлов в
первой "порции").
Результаты, фильтрация и их сортировка должны подчиняться
выставленным параметрам поиска, а если параметры поиска не
задавались - их значениям по умолчанию.
По нажатию на кнопку *"Параметры поиска"* открывается экран
"Параметры" (илл. «Параметры поиска»).
![Параметры поиска](resources/img/files/advanced_search.png)
![Параметры поиска](resources/img/files/iOS/advanced_search_ios.png)
Управляющая кнопка имеет фиксированное положение. Вся остальная
область экрана прокручиваема. Содержимое экрана:
+--------------+---------------------+---------------+--------------------------------------------------------+
| Параметр | Возможные значения | API | Описание |
+==============+=====================+===============+========================================================+
| По категории | * Все результаты | aiType | Документы - тип `AI_DOCUMENT`, картинки - `AI_IMAGE`, |
| | * Документы | | видео - `AI_VIDEO`, аудио - `AI_AUDIO`, другие - |
| | * Картинки | | `AI_APPLICATION`. "Все результаты" (значение по |
| | * Видео | | умолчанию) содержит в себе файлы всех типов. |
| | * Аудио | | Категории, по которым результаты поиска отсутствуют, |
| | * Другие | | не должны отображаться в данном списке |
+--------------+---------------------+---------------+--------------------------------------------------------+
| По дате (с | * За все время | modifiedFrom, | За день: ДД.ММ.ГГГГ - ДД.ММ.ГГГГ, за неделю: |
| устройства) | * За день | modifiedTo | ДД.ММ.ГГГГ - (ДД-6).ММ.ГГГГ, за месяц: ДД.ММ.ГГГГ - |
| | * За неделю | | ДД.(ММ-1).ГГГГ, ДД.ММ.ГГГГ - ДД.ММ.(ГГГГ-1). "За все |
| | * За месяц | | время" (значение по умолчанию) содержит в себе файлы |
| | * За год | | за любую дату и время изменения |
+--------------+---------------------+---------------+--------------------------------------------------------+
| Сортировка | * По релевантности | sortType | По релевантности (значение по умолчанию) - |
| | * По полулярности | | `SORT_RELEVANCE`, по популярности - `SORT_READSCOUNT`, |
| | * По дате | | по дате - `SORT_DATE` |
+--------------+---------------------+---------------+--------------------------------------------------------+
По нажатию на кнопку "Выбрать" результаты поиска должны
обновиться согласно измененных параметров. Если
пользователь на экране «Параметры» нажимает на кнопку
"Назад", мобильный клиент возвращает экран поиска в том
состоянии, которое было до вызова данного экрана.
Измененные параметры поиска должны сохраняться только для
текущей сессии поиска, т.е. после очередного нажатия на
иконку лупы все параметры должны принять значения по
умолчанию.
> **Примечание**
>
> Метод для выполнения поиска в хранилище и возврата списка
> найденных файлов описан в javadoc:
>
> kz.arta.synergy.server.api.rest.storage#search.
>
> http://tdd.lan.arta.kz/docs/synergy/trunk/sdk-doc/javadoc/kz/arta/synergy/server/api/rest/storage/StorageService.html#search%28java.lang.String,%20java.lang.String,%20java.util.List,%20java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String,%20int,%20int,%20boolean,%20boolean,%20boolean,%20int,%20int,%20java.lang.String%29
### Компонент для выбора записи адресной книги {#address_book_chooser}
Компонент формы "Ссылка на адресную книгу" позволяет
добавлять на форму кликабельную ссылку на определенную
запись адресной книги.
В режиме просмотра файла по форме является активной ссылкой,
в режиме редактирования - поле с кнопкой, по нажатию которой
открывается нативный экран «Адресная книга».
![Экран "Люди"](resources/img/forms/adress_book_chooser.png)
![Экран "Люди"](resources/img/forms/iOS/adress_book_chooser_ios.png)
![Экран "Организации"](resources/img/forms/adress_book_org_chooser.png)
![Экран "Организации"](resources/img/forms/iOS/adress_book_org_chooser_ios.png)
**Элементы управления экрана "Адресная книга".**
+---------------------------+------------------------+--------------------------------------------+
| Элемент управления | Расположение на экране | Описание |
+===========================+========================+============================================+
| "Люди" либо "Организации" | Верхняя панель | Заголовок экрана, также является |
| | | выпадающим списком |
+---------------------------+------------------------+--------------------------------------------+
| Поле поиска | Вверху основной | Поле ввода с плейсхолдером "Поиск записей" |
| | области | и иконкой лупы справа |
+---------------------------+------------------------+--------------------------------------------+
| Панель со списком | Вся основная область | Плашки, отображающие информацию о |
| контактов | | контактах адресной книги |
+---------------------------+------------------------+--------------------------------------------+
| Выбрать | Внизу | Кнопка |
+---------------------------+------------------------+--------------------------------------------+
Поле поиска и кнопка "Выбрать" имеют фиксированное
положение. В оставшейся области находится прокручиваемый
список контактов.
По нажатию на *заголовок экрана* открывается стандартный
[выпадающий список](#combobox) с двумя типами контактов:
* `Люди` (выбран по умолчанию)
* `Организации`
Отображаемый *список контактов* зависит от того, какой
тип контактов необходимо отображать согласно значению
заголовка экрана, и содержит:
* для типа контактов "Люди":
* первый блок - %Фамилия% %Имя% %Отчество%;
* второй блок - %Организация%.
* для типа контактов "Организации":
* первый блок - %Организация%;
* второй блок - %Адрес%.
> Примечание.
>
> Для контактов типа "Люди" блок с организацией
> отображает только первое значение в списке
> организаций, указанных для данного контакта.
Невмещающиеся по ширине ФИО и названия переносятся на
новую строку. Некоторые значения (например, отчества
либо организации у "Людей" либо адрес у "Организаций")
могут отсутствовать.
В список контактов попадают как общедоступные, так и
личные контакты авторизованного пользователя. Данный
список отображается с постепенной догрузкой. Изначально
подгружается 30 контактов. При прокрутке пользователем
вниз список дополняется новыми 30 контактами.
Между собой контакты в списке сортируются согласно их
следованию в модуле "Адресная книга", а именно по
возрастанию фамилии для "Людей" и названия для
"Организаций". Изменять данную сортировку нельзя.
*Поведение экрана:*
* Для выбора контакта необходимо нажать на строку,
вся строка выделится фоном.
* Повторное нажатие на строку не снимает выделение.
* При выделении контакта в списке, выделение
предыдущего элемента снимается.
*Поиск записей* осуществляется по всем контактам
выбранного типа и только начиная с 4-го символа в
поисковом запросе. Поиск является "живым" и производится
по всем отображаемым полям плашки, его результаты
фильтруют отображаемый список. При вводе текста иконка
лупы заменяется на иконку крестика. Очистить поле ввода
можно, нажав на крестик (крестик заменяется на иконку
лупы). Пустой запрос поиска - отображается список со
всеми контактами.
При смене типа контакта (люди/организации) поле поиска
очищается.
Если пользователь на экране "Адресная книга" нажимает
на *кнопку "Назад"*, мобильный клиент возвращает
пользователя в [проигрыватель форм](#forms_view) в том
состоянии, которое было у компонента до вызова данного
экрана.
После выделения записи списка пользователь нажимает на
*кнопку «Выбрать»*. Действие выполняется, только если
выделен какой-либо контакт, иначе необходимо выдавать
сообщение:
`Запись не выбрана`
и не выполнять действие.
В результате же успешного выполнения действия мобильный
клиент также возвращает пользователя в
[проигрыватель форм](#forms_view), в поле компонента
отображается выбранный элемент списка.
*Проигрыватель форм. Переход по ссылкам.*
По нажатию на ссылку выводится сообщение о
невозможности ее открытия:
`В мобильной версии просмотр адресной книги не
поддерживается`
Ссылка не открывается.
### Компонент для выбора подразделений {#departmentchooser}
Компонент для выбора подразделений представляет собой
кликабельное поле ввода, по нажатию которой открывается
нативный экран «Подразделения».
Компонент может иметь состояния: активен и не активен.
Последнее означает, что значение данного экземпляра
компонента менять нельзя и по клику по нему не должен
открываться экран выбора подразделения (-ий).
Для построения экрана компонент принимает следующие
параметры:
* имеется ли связь с компонентом;
* единственный или множественный выбор.
**Элементы управления экрана "Подразделения".**
+----------------------------------------------------------+------------------------+--------------------------------------------+
| Элемент управления | Расположение на экране | Описание |
+==========================================================+========================+============================================+
| *Верхняя панель* | | |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| ![](resources/img/workflow/elements/button_filters.png)\ | Справа | "Навигатор" - кнопка перехода к |
| | | навигатору экрана |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| *Компонент "Путь"* | Ниже верхней панели | Компонент, отображающий путь до выделенной |
| | | ноды навигатора, согласно которой |
| | | отображается текущий список подразделений |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| *Рабочая область* | | |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| Поле поиска | Вверху основной | Поле ввода с плейсхолдером "Поиск |
| | области | подразделений" и иконкой лупы справа |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| Панель со списком подразделений | Вся основная область | Плашки, отображающие информацию о |
| | | подразделениях |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| Выбрать | Внизу | Кнопка |
+----------------------------------------------------------+------------------------+--------------------------------------------+
Путь, поле поиска и кнопка "Выбрать" имеют фиксированное
положение. В оставшейся области находится прокручиваемый
список подразделений.
В целом, логика выбора подразделения аналогична выбору
[пользователя(-ей)](#userchooser).
По нажатию на кнопку *навигатора*, а также проведя
пальцем от правой стороны экрана к левой, раскрывается
правая панель навигатора (илл. «Навигатор выбора
пользователей»).
Верхняя панель содержит только надпись "Навигатор". Сам
навигатор может содержать следующий набор узлов, каждый
из которых отделен от предыдущего сплитом:
* `Выбранные`
* `%Название_организации%` (выделен по умолчанию при
открытии экрана) - содержит дерево всей орг.структуры.
Компонент *"Путь"* содержит полный путь до выделенного
узла навигатора. Содержимое компонента: полные названия
узлов от корневой родительской до текущей открытой,
включая ее саму.
*Отображаемый список подразделений* зависит от того,
что выделено в навигаторе:
* `Выбранные` - все текущие подразделения, напротив
которых установлен флажок выбора;
* `%Название_организации%` - список подразделений,
принадлежащих выбранному подразделению орг.
структуры.
Если имеется связь с другим компонентом, то необходимо
сужать отображаемый список согласно связи (передав в API
соответствующий параметр).
Плашки могут отличаться, в зависимости от отображаемой
информации:
* Плашка подразделения содержит:
* первый блок - полное название подразделения;
* второй блок - полное название ближайшего
родительского подразделения, к которому
относится данное подразделение (для подразделения
первого уровня - отсутствует).
* Плашка произвольного текста содержит:
* первый блок - произвольный текст;
* второй блок содержит лейбл `Введен вручную` (цвет
`#ff4800`).
Во всех вариантах невмещающиеся по ширине названия
подразделений переносятся на новую строку.
Список отображается с постепенной догрузкой. Изначально
подгружается 30 подразделений. При прокрутке пользователем
вниз список дополняется новыми 30 подразделениями.
Список подразделений сортируется по убыванию уровня орг.
структуры вне зависимости от уровня подразделения.
*Поведение экрана:*
* Для компонента с единственным выбором:
* Для выбора подразделения необходимо нажать
на строку, вся строка выделится фоном.
* Повторное нажатие на строку не снимает
выделение.
* При выделении подразделения в списке,
выделение предыдущего элемента снимается.
* Для компонента с множественным выбором:
* Для выбора подразделения необходимо нажать на
строку или флажок, находящийся справа
соответствующего элемента списка.
* Удалить подразделение из списка выбранных
можно, выключив флажок, подразделение
удаляется из списка выбранных без
подтверждения.
* В контекстное меню любой плашки (во всех
узлах навигатора, кроме "Выбранные")
добавляется пункт "Выбрать всех". По его
нажатию происходит выделение всех еще
невыделенных подразделений отображаемого
списка.
Если все подразделения отображаемого списка
выделены, пункт меню заменяется на "Снять
выделение". По его нажатию происходит
развыделение всех подразделений списка
(пункт меню снова принимает вид "Выбрать
всех").
*Поиск подразделений* осуществляется только внутри
отображаемого списка и только в узле навигатора
"%Название_организации%" (отсутствует для узла
"Выбранные"). Поиск является "живым", его результаты
фильтруют отображаемый список. При вводе текста иконка
лупы заменяется на иконку крестика. Очистить поле ввода
можно, нажав на крестик (крестик заменяется на иконку
лупы). Пустой запрос поиска - отображается список со
всеми подразделениями данного узла навигатора.
Если пользователь на экране "Подразделения" нажимает
на *кнопку "Назад"*, мобильный клиент возвращает
пользователя к экрану, из которого он был вызван.
Если пользователь нажимает на *кнопку "Выбрать"*,
мобильный клиент возвращает пользователя к предыдущему
экрану, в поле компонента отображаются выбранные
подразделения:
* в нативных диалогах приложения - через запятую;
* иначе - согласно проигрывателю формы.
> **Примечание**
>
> Метод получения списка должностей описан в javadoc:
>
> kz.arta.synergy.server.api.rest.userchooser#getPositions
>
> Метод получения списка подразделений описан в javadoc:
>
> kz.arta.synergy.server.api.rest.userchooser#getDepartments
### Компонент выбора файла {#file}
Компонент формы "Файл" позволяет прикреплять к форме копию
файла из хранилища или с мобильного устройства.
По нажатию на кнопку "Выбрать файл" открывается
[выпадающий список](#combobox) с вариантами:
* `С устройства`
* `Из хранилища`
> Примечание.
>
> Пункты меню "Создать новый" и "Сканировать", которые
> отображаются в платформе в данном компоненте, в
> мобильном клиенте никогда не отображаются, независимо
> от настроек самого компонента.
Пункт «С устройства» соответствует варианту добавления
файла «С компьютера». По его нажатию открывается системный
экран / окно выбора файла с устройства, аналогичный
таковому, например, в окне
[информации о работе](#sec.workflow_work_information).
Если компонент обладает свойством *отображения содержимого
загруженного файла*, то в обеих ОС должна открываться
галерея изображений (должна быть возможность выбора только
изображения в формате GIF, JPЕG, PNG).
По нажатию на пункт «Из хранилища» открывается нативный
экран выбора файла [из хранилища](#file_storage).
Если компонент обладает свойством *отображения содержимого
загруженного файла*, то диалог выбора должны содержать
фильтр, при котором отображаются только изображения в
формате GIF, JPЕG, PNG.
*Проигрыватель форм. Переход по ссылкам.*
По нажатию на ссылку с названием файла он скачивается на
устройство и открывается системными средствами.
### Компонент выбора файла из хранилища {#file_storage}
Компонент формы "Ссылка на файл в Хранилище" позволяет
добавлять на форму ссылку на файл, открывать как файл,
так и его местоположение в хранилище.
По нажатию на кнопку "Выбрать файл" открывается
нативный экран «С хранилища» (илл. «Экран "С хранилища"»).
![Экран "С хранилища"](resources/img/forms/from_storage.png)
![Экран "С хранилища"](resources/img/forms/iOS/from_storage_ios.png)
Панель со списком по центру и кнопка "Выбрать" внизу
экрана имеют фиксированное положение, прокрутка списка
скроллом осуществляется внутри панели. Внутри панели
отображается все доступное данному пользователю хранилище
системы. Каждая запись содержит полное название папки /
файла (для файлов - с расширением).
Панель со списком папок и файлов имеет следующие
особенности:
* *Папки:*
* С понижением уровня папки и файлы смещаются
вправо (при этом уровни вложенности, начиная с
8-й, должны иметь отступ как для 7-го уровня).
* В правой части папок отображается иконка
![](resources/img/workflow/elements/favorite_undetailed.png)
в свернутом состоянии и
![](resources/img/workflow/elements/favorite_detailed.png)
в развернутом. По нажатию в любой области строки
со свернутой папкой иконка разворачивается, и
наоборот (выделение строки отсутствует).
Развернутая папка должна содержать либо вложенные
папки (по умолчанию, каждый раз они свернуты),
либо содержащиеся в ней файлы.
* *Файлы:*
* Каждый файл располагается правее группы самого
нижнего уровня, в которой он находится.
* Только в строке файла присутствует выделение
строки (действие tap).
После выделения файла пользователь нажимает на кнопку
«Выбрать». Действие выполняется, только если выделен
какой-либо файл, иначе необходимо выдавать сообщение:
`Файл не выбран`
и не выполнять действие.
*Проигрыватель форм. Переход по ссылкам.*
По нажатию на ссылку с названием файла он скачивается
на устройство и открывается системными средствами.
По нажатию на ссылку с путем (независимо от того,
необходимо ли открывать ссылку в отдельном окне)
происходит открытие модуля "Файлы" с автоматическим
переходом к конечной папке пути, с выделением файла.
Формы {#chap.forms}
=========
<#include "forms/forms_view.md">
<#include "forms/forms_components.md">
Компоненты формы {#forms_components}
----------------------------------
<#include "forms/system_pickers.md">
<#include "forms/file.md">
<#include "forms/link.md">
<#include "forms/user_chooser.md">
<#include "forms/position_chooser.md">
<#include "forms/department_chooser.md">
<#include "forms/repeat_period.md">
<#include "forms/project_chooser.md">
<#include "forms/registry_chooser.md">
<#include "forms/address_book_chooser.md">
<#include "forms/file_storage.md">
Проигрыватель формы {#forms_view}
----------------------------------
Экран "Форма" открывается для отображения и/или редактирования
файлов по форме.
**Элементы управления экрана "Форма".**
+-------------------------------------------------------+------------------------+------------------------------------------+
| Элемент управления | Расположение на экране | Описание |
+=======================================================+========================+==========================================+
| *Верхняя панель* | | |
+-------------------------------------------------------+------------------------+------------------------------------------+
| ![](resources/img/forms/elements/button_options.png)\ | Справа | Кнопка открытия дополнительного меню |
+-------------------------------------------------------+------------------------+------------------------------------------+
| ![](resources/img/forms/elements/button_save.png)\ | Левее кнопки меню | Кнопка "Сохранить" (может отсутствовать) |
+-------------------------------------------------------+------------------------+------------------------------------------+
| *Вся рабочая область* | | Проигрыватель формы в мобильном или |
| | | основном представлении |
+-------------------------------------------------------+------------------------+------------------------------------------+
| Перейти к документу | Внизу | Кнопка выхода из проигрывателя форм |
| | | (может отсутствовать) |
+-------------------------------------------------------+------------------------+------------------------------------------+
Проигрыватель форм занимает всю область от верхней панели
до конца экрана. Слева и справа отступы отсутствуют.
Горизонтальный и вертикальный скроллы, при наличии,
находятся в данной области.
Кнопка "Перейти к документу" внизу экрана является "плавающей".
При первом открытии экрана она всегда отображается. Далее
только при прокрутке пользователем вверх кнопка "уезжает"
вниз за экран. Только при последующей прокрутке вниз
кнопка возвращается на место. Если весь контент меньше
высоты экрана, кнопка имеет фиксированное положение внизу
экрана и не "уезжает" (т.к. отсутствует вертикальный
скролл).
Форма может иметь *2 представления*:
* мобильное
* основное
> **Примечание**
>
> Для версий мобильного приложения 3.6 и ниже используется
> только мобильное представление формы.
Мобильное представление всегда находится в режиме
редактирования. Основное, в свою очередь может находиться
в одном из *двух режимов*:
* режим просмотра
* режим редактирования
При этом режим редактирования может отсутствовать, в
зависимости от текущих свойств документа, в котором
находится данный файл по форме. Параметр в API для этого
должен быть `is_editable = false`.
> **Примечание.**
>
> Методы API, передающие данный параметр:
>
> * `rest/api/workflow/work/{workID}/attachments` -
> получение списка всех файлов работы;
> * `rest/api/workflow/work/{workID}/last_attachments` -
> получение отсортированного в обратном порядке (по
> дате добавления) списка файлов работы;
> * `rest/api/docflow/doc/attachments` - получение
> списка всех файлов документа;
> * `rest/api/doc/last_attachments` - получение
> отсортированного в обратном порядке (по дате
> добавления) списка файлов документа.
Кнопка "Сохранить" отображается только в режиме
редактирования (как в мобильном, так и в основном
представлении).
*Рассмотрим варианты отображения контента в проигрывателе
формы, в зависимости от представления и режима формы.*
Различается набор пунктов дополнительного меню:
+------------------------+----------------------------+------------------------+----------------------------+------------------------+
| Текущее представление: | Текущее представление: | Текущее представление: | Текущее представление: | Текущее представление: |
| основное (просмотр), | основное (редактирование), | основное (просмотр), | основное (редактирование), | мобильное, основное |
| мобильное доступно | мобильное доступно | мобильное недоступно | мобильное недоступно | доступно всегда |
+========================+============================+========================+============================+========================+
| Мобильная версия | Мобильная версия | Режим редактирования | Режим просмотра | Полная версия |
+------------------------+----------------------------+------------------------+----------------------------+------------------------+
| Режим редактирования | Режим просмотра | Скачать PDF | Информация | Информация |
+------------------------+----------------------------+------------------------+----------------------------+------------------------+
| Скачать PDF | Информация | Скачать ODT | | |
+------------------------+----------------------------+------------------------+----------------------------+------------------------+
| Скачать ODT | | Скачать DOCX | | |
+------------------------+----------------------------+------------------------+----------------------------+------------------------+
| Скачать DOCX | | Скачать DOC | | |
+------------------------+----------------------------+------------------------+----------------------------+------------------------+
| Скачать DOC | | Информация | | |
+------------------------+----------------------------+------------------------+----------------------------+------------------------+
| Информация | | | | |
+------------------------+----------------------------+------------------------+----------------------------+------------------------+
При первом открытии экрана открывается, при наличии,
мобильное представление формы.
![Мобильное представление формы](resources/img/forms/form_mobile.png)
![Мобильное представление формы](resources/img/forms/iOS/form_mobile_ios.png)
При отсутствии мобильного представления и если
создается новый документ по форме открывается основное
представление в режиме редактирования, а если
открывается уже существующий файл по форме - основное
представление в режиме просмотра.
Переключение между представлениями доступно с помощью
пунктов меню "Мобильная версия" / "Полная версия".
При переключении представления с мобильного в основное,
оно открывается в режиме просмотра.
По умолчанию, форма масштабируется по наименьшей стороне.
Изменение масштаба осуществляется с помощью двойного тапа
либо сведением / разведением пальцев.
![Основное представление формы (режим просмотра)](resources/img/forms/form_view.png)
![Основное представление формы (режим просмотра)](resources/img/forms/iOS/form_view_ios.png)
![Основное представление формы (режим просмотра), масштаб](resources/img/forms/form_view_enlarged.png)
![Основное представление формы (режим просмотра), масштаб](resources/img/forms/iOS/form_view_enlarged_ios.png)
Переключение между режимами основного представления
доступно с помощью пунктов меню "Режим просмотра" /
"Режим редактирования".
В режиме редактирования все открываемые диалоговые
окна, вызываемые по нажатию на тот или иной компонент
формы, должны быть [нативными](#forms_components).
![Основное представление формы (режим редактирования)](resources/img/forms/form_edit.png)
![Основное представление формы (режим редактирования)](resources/img/forms/iOS/form_edit_ios.png)
![Основное представление формы (режим редактирования), масштаб](resources/img/forms/form_edit_enlarged.png)
![Основное представление формы (режим редактирования), масштаб](resources/img/forms/iOS/form_edit_enlarged_ios.png)
Только в режиме просмотра основного представления
доступна возможность формирования печатного
представления формы с помощью пунктов меню "Скачать".
Точный набор пунктов (PDF, ODT, DOCX, DOC) зависит
от настроек самого печатного представления.
Последним пунктом меню всегда является "Информация".
По его нажатию открывается одноименное системное
окно, содержащее наименование формы. Единственной
кнопкой в диалоге является "ОК", по нажатию которой
окно закрывается.
**Сохранение и выход из формы.**
По нажатию на иконку "Сохранить" и при переключении
между режимами основного представления происходит
валидация формы:
* для мобильного представления - на заполненность
обязательных полей (только среди отображаемых);
* для основного представления - на заполненность
обязательных полей и корректность заполнения
других (определяется настройками компонентов).
В случае неуспешной валидации обязательности
отображается общая ошибка формы:
`Заполните обязательные поля`
В иных случаях неуспешного сохранения выдается
сообщение об ошибке, пользователь остается на данном
экране.
В случае же успешного сохранения выдается сообщение
"Данные сохранены", документ сохраняется, пользователь
остается на данном экране.
Если текущая версия данных уже была сохранена, то
кнопка "Сохранить" должна быть недоступна для нажатия.
По нажатию на кнопку "Перейти к документу" происходит
открывается экран
[информации о документе](#sec.documents_docinfo).
При этом, если текущая форма имеет несохраненные
изменения, выдается системное предупреждающее диалоговое
окно с текстом:
`Документ был изменен. Сохранить произведенные
изменения?`
и кнопками:
* "Да" - происходит сохранение формы и, при успешном
сохранении, открытие экрана
[информации о документе](#sec.documents_docinfo);
* "Нет" - последние изменения отменяются, открывается
предыдущий экран;
* "Отмена" - окно закрывается, пользователь остается
в проигрывателе формы.
Если после внесения изменений в форме пользователь
нажимает на кнопку "Назад", выдается системное
предупреждающее диалоговое окно с текстом:
`Документ был изменен. Сохранить произведенные
изменения?`
и кнопками:
* "Да" - происходит сохранение формы и, при успешном
сохранении, открывается предыдущий экран;
* "Нет" - последние изменения отменяются, открывается
предыдущий экран;
* "Отмена" - окно закрывается, пользователь остается
в проигрывателе формы.
Если же изменений не было и пользователь нажимает на
кнопку "Назад", сразу возвращается предыдущий экран.
В целом, поведение проигрывателя в основном
представлении, все его альтернативные потоки,
полностью идентичны
[платформе](http://tdd.lan.arta.kz/docs/additional/spec/html/sec.conf_processes.html#sec.conf_redactor_form).
Альтернативные потоки нативных диалоговых окон описаны
отдельно в соответствующем [разделе](#forms_components).
### Компонент настройки ссылки {#link}
Компонент формы "Ссылка" позволяет добавлять произвольную
кликабельную ссылку, которую можно открывать в отдельной
вкладке мобильного браузера по умолчанию.
В режиме просмотра файла по форме является активной ссылкой,
в режиме редактирования - открывает нативный экран «Настройки
ссылки» (илл. «Экран "Настройки ссылки"»).
Компонент может иметь состояния: активен и не активен.
Последнее означает, что значение данного экземпляра
компонента в режиме редактирования менять нельзя и по клику
по нему должен открываться не экран «Настройки ссылки», а
непосредственно ссылка (как и в режиме просмотра).
![Экран "Настройки ссылки"](resources/img/forms/link_settings.png)
![Экран "Настройки ссылки"](resources/img/forms/iOS/link_settings_ios.png)
**Элементы управления экрана "Настройки ссылки".**
+----------------------------+------------------------+----------------------------+
| Элемент управления | Расположение на экране | Описание |
+============================+========================+============================+
| URL | Вверху основной | Поле ввода с плейсхолдером |
| | области | "Введите URL ссылки" |
+----------------------------+------------------------+----------------------------+
| Надпись | После URL | Поле ввода с плейсхолдером |
| | | "Введите надпись к ссылке" |
+----------------------------+------------------------+----------------------------+
| Открывать в отдельном окне | После надписи | Флажок |
+----------------------------+------------------------+----------------------------+
| Готово | Внизу | Кнопка |
+----------------------------+------------------------+----------------------------+
Все поля ввода являются необязательными для заполнения,
могут содержать пустые значения. Кнопка "Готово" имеет
фиксированное положение. В оставшейся области находится
прокручиваемый набор полей.
*Проигрыватель форм. Переход по ссылкам.*
По нажатию на ссылку (независимо от того, необходимо ли
открывать ссылку в отдельном окне) она открывается в
новой вкладке мобильного браузера.
### Компонент для выбора должности {#positionchooser}
Компонент для выбора должности представляет собой
кликабельное поле ввода, по нажатию которой открывается
нативный экран «Должности».
Компонент может иметь состояния: активен и не активен.
Последнее означает, что значение данного экземпляра
компонента менять нельзя и по клику по нему не должен
открываться экран выбора должности.
Для построения экрана компонент принимает следующие
параметры:
* имеется ли связь с компонентом;
* отображать ли вакантные должности.
**Элементы управления экрана "Должности".**
+----------------------------------------------------------+------------------------+--------------------------------------------+
| Элемент управления | Расположение на экране | Описание |
+==========================================================+========================+============================================+
| *Верхняя панель* | | |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| ![](resources/img/workflow/elements/button_filters.png)\ | Справа | "Навигатор" - кнопка перехода к |
| | | навигатору экрана |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| *Компонент "Путь"* | Ниже верхней панели | Компонент, отображающий путь до выделенной |
| | | ноды навигатора, согласно которой |
| | | отображается текущий список должностей |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| *Рабочая область* | | |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| Поле поиска | Вверху основной | Поле ввода с плейсхолдером "Поиск |
| | области | должностей" и иконкой лупы справа |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| Панель со списком должностей | Вся основная область | Плашки, отображающие информацию о |
| | | должностях |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| Выбрать | Внизу | Кнопка |
+----------------------------------------------------------+------------------------+--------------------------------------------+
Путь, поле поиска и кнопка "Выбрать" имеют фиксированное
положение. В оставшейся области находится прокручиваемый
список должностей.
В целом, логика выбора должности аналогична выбору одного
[пользователя](#userchooser).
По нажатию на кнопку *навигатора*, а также проведя
пальцем от правой стороны экрана к левой, раскрывается
правая панель навигатора.
Верхняя панель содержит только надпись "Навигатор". Сам
навигатор содержит следующий набор узлов, каждый из которых
отделен от предыдущего сплитом:
* `Выбранные`
* `%Название_организации%` (выделен по умолчанию при
открытии экрана) - содержит дерево всей орг.структуры.
Компонент *"Путь"* содержит полный путь до выделенного
узла навигатора. Содержимое компонента: полные названия
узлов от корневой родительской до текущей открытой,
включая ее саму.
*Список* отображает должности, принадлежащие выбранному
подразделению орг.структуры. Включенная настройка компонента
"Отображать только вакантные должности" ограничивает список
только вакантными должностями.
Если имеется связь с другим компонентом, то необходимо
сужать отображаемый список согласно связи (передав в API
соответствующий параметр).
Плашки могут отличаться, в зависимости от отображаемой
информации:
* Плашка должности содержит:
* первый блок - полное название должности;
* второй блок - полное название ближайшего
родительского подразделения, к которому
относится данная должность.
* Плашка произвольного текста содержит:
* первый блок - произвольный текст;
* второй блок содержит лейбл `Введен вручную` (цвет
`#ff4800`).
Во всех вариантах невмещающиеся по ширине названия
должностей / подразделений переносятся на новую строку.
Список отображается с постепенной догрузкой. Изначально
подгружается 30 должностей. При прокрутке пользователем
вниз список дополняется новыми 30 должностями.
Список должностей сортируется следующим образом:
* должности сортируются по убыванию уровня орг.
структуры вне зависимости от уровня должности;
* должности в одном подразделении сортируются в
следующем порядке:
* руководитель;
* и.о. руководителя;
* заместитель руководителя;
* специалист.
*Поведение экрана:*
* Для выбора должности необходимо нажать на строку,
вся строка выделится фоном.
* Повторное нажатие на строку не снимает выделение.
* При выделении должности в списке, выделение
предыдущего элемента снимается.
*Поиск должностей* осуществляется только внутри
отображаемого списка и только в узле навигатора
"%Название_организации%" (отсутствует для узла
"Выбранные"). Поиск является "живым", его результаты
фильтруют отображаемый список. При вводе текста
иконка лупы заменяется на иконку крестика. Очистить
поле ввода можно, нажав на крестик (крестик
заменяется на иконку лупы). Пустой запрос поиска -
отображается список со всеми должностями данного
узла навигатора.
Если пользователь на экране "Должности" нажимает
на *кнопку "Назад"*, мобильный клиент возвращает
пользователя к экрану, из которого он был вызван.
Если пользователь нажимает на *кнопку "Выбрать"*,
мобильный клиент возвращает пользователя к предыдущему
экрану, в поле компонента отображается выбранная
должность:
* в нативных диалогах приложения - как текст;
* иначе - согласно проигрывателю формы.
> **Примечание**
>
> Метод получения списка пользователей описан в javadoc:
>
> kz.arta.synergy.server.api.rest.userchooser#getPositions
>
> Метод получения списка подразделений описан в javadoc:
>
> kz.arta.synergy.server.api.rest.userchooser#getDepartments
### Компонент для выбора портфеля или проекта {#project_chooser}
Компонент формы "Ссылка на проект/портфель" позволяет
добавлять на форму ссылку на проект или портфель, открывать
их местоположение в модуле "Проекты".
В режиме просмотра файла по форме является активной ссылкой,
в режиме редактирования - поле с кнопкой, по нажатию которой
открывается нативный экран «Портфели и проекты».
![Экран "Портфели и проекты"](resources/img/forms/project_chooser.png)
![Экран "Портфели и проекты"](resources/img/forms/iOS/project_chooser_ios.png)
**Элементы управления экрана "Портфели и проекты".**
+----------------------------------------------------------+------------------------+--------------------------------------------+
| Элемент управления | Расположение на экране | Описание |
+==========================================================+========================+============================================+
| *Верхняя панель* | | |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| ![](resources/img/workflow/elements/button_filters.png)\ | Справа | "Навигатор" - кнопка перехода к |
| | | навигатору экрана |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| *Компонент "Путь"* | Ниже верхней панели | Компонент, отображающий путь до выделенной |
| | | ноды навигатора, согласно которой |
| | | отображается текущий список портфелей и |
| | | проектов |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| *Рабочая область* | | |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| Панель со списком портфелей и проектов | Вся основная область | Плашки, отображающие название и тип |
| | | элемента выбора |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| Выбрать | Внизу | Кнопка |
+----------------------------------------------------------+------------------------+--------------------------------------------+
Путь и кнопка "Выбрать" имеют фиксированное положение.
В оставшейся области находится прокручиваемый список.
По нажатию на кнопку *навигатора*, а также проведя
пальцем от правой стороны экрана к левой, раскрывается
правая панель навигатора (илл. «Навигатор выбора
портфелей»).
![Навигатор выбора портфелей](resources/img/forms/project_chooser_navigator.png)
Верхняя панель содержит только надпись "Навигатор". Сам
навигатор содержит дерево портфелей из модуля "Проекты"
(исключая избранное и личные проекты пользователя),
доступных данному пользователю минимум на чтение.
Корневая нода дерева соответствует названию орг.
структуры.
Сортировка в дереве соответствует модулю "Проекты". По
умолчанию, в нем выделена и раскрыта корневая нода,
остальное дерево свернуто.
В остальном, навигатор повторяет поведение аналогичных
навигаторов, например, в [хранилище](#sec.files_navigator):
* после выделения узла в навигаторе необходимо
автоматически отображать соответствующий список;
* при каждом новом открытии экрана "Портфели и проекты"
все узлы должны быть свернуты, кроме первого уровня;
* в текущем открытом экране развернутость дерева и
последний выделенный узел должны сохранять свои
значения;
* иконки свернутости и развернутости, их кликабельная
область;
* отступы дочерних элементов дерева (включая вариант,
при котором уровни вложенности, начиная с 8-й, должны
иметь отступ как для 7-го уровня);
* градиент невмещающегося текста;
* скрытие навигатора свайпом от левой стороны экрана
к правой, нажатием по левой стороне экрана либо
кнопкой "Назад" (для ОС Android).
Компонент *"Путь"* содержит полный путь до выделенного
узла навигатора. Содержимое компонента: полные названия
узлов от корневой родительской (см. пример) до текущей
открытой, включая ее саму.
В целом, компонент повторяет поведение пути в модуле
["Файлы"](#sec.files_list) (наличие горизонтального
скролла и градиентов, кликабельность элементов пути).
> Пример.
>
> Для выбранного портфеля путь отображает:
>
> * `Фонд поддержки молодежи > Спортивные мероприятия`
Отображаемый *список портфелей и проектов* зависит от
того, какая выделена нода дерева, и содержит:
* сначала дочерние портфели первого уровня вложенности
относительно выделенной;
* затем проекты, принадлежащие непосредственно
выделенному портфелю.
Данный список также формируется согласно правам
пользователя, вызвавшего данный диалог. Список сразу
отображает все портфели и проекты (без постепенной
догрузки). Выбор корневого элемента недоступен (в
списке он всегда отсутствует). Между собой портфели и
проекты в списке сортируются согласно их следованию в
модуле "Проекты".
Плашка списка отображает информацию:
* первый блок - полное название портфеля или проекта;
* второй блок - статичная надпись `Портфель` или
`Проект`, показывающий тип элемента списка.
Невмещающиеся по ширине названия переносятся на новую
строку.
*Поведение экрана:*
* Для выбора портфеля или проекта необходимо нажать
на строку, вся строка выделится фоном.
* Повторное нажатие на строку не снимает выделение.
* При выделении портфеля или проекта в списке,
выделение предыдущего элемента снимается.
Если пользователь на экране "Портфели и проекты"
нажимает на *кнопку "Назад"*, мобильный клиент
возвращает пользователя в
[проигрыватель форм](#forms_view) в том состоянии,
которое было у компонента до вызова данного экрана.
После выделения записи списка пользователь нажимает на
*кнопку «Выбрать»*. Действие выполняется, только если
выделен какой-либо проект или портфель, иначе
необходимо выдавать сообщение:
`Запись не выбрана`
и не выполнять действие.
В результате же успешного выполнения действия мобильный
клиент также возвращает пользователя в
[проигрыватель форм](#forms_view), в поле компонента
отображается выбранный элемент списка.
*Проигрыватель форм. Переход по ссылкам.*
По нажатию на ссылку выводится сообщение о
невозможности ее открытия:
`В мобильной версии просмотр портфеля и проекта не
поддерживается`
Ссылка не открывается.
### Окно сортировки записей реестра {#sec.registries_sort}
По нажатию на кнопку "Сортировка" открывается меню
`Сортировать по полю` (для ОС Android) либо `Сортировать`
(для iOS). Внешний вид меню - системный, с доработками.
В построении меню участвуют те столбцы реестра, которые
удовлетворяют следующим требованиям.
* Во-первых, в меню попадают только те столбцы,
по которым возможна сортировка, т.е. сюда не
должны входить столбцы на основе компонентов:
* Таблица (статическая, динамическая)
* Страница
* Неизменяемый текст
* Выбор вариантов
* Изображение
* Файл
* Лист подписей
* Ход выполнения
* Ссылка на документ
* Свойства документа
* Ссылка на файл в хранилище
Кроме того, компоненты внутри статической таблицы
сюда попадают, а внутри динамической - нет.
* Во-вторых, в меню попадают только те столбцы,
которые отображаются в плашке на момент открытия
окна. Т.е. для "краткого" вида - это только те
отображаемые столбцы, помеченные как значащее
содержимое, а для "полного" - уже все отображаемые
столбцы. В обоих случаях - с учетом пункта выше.
Пункты меню отсортированы в порядке следования
соответствующих столбцов в настройках реестра.
Если название пункта меню полностью не помещается на
строке, с правого края оно должно быть обрезано с
добавлением многоточие. Если количество отображаемых
пунктов меню больше высоты экрана, появляется
вертикальный скролл на все меню, исключая «шапку»
(т.е. список должен уходить под «шапку»).
*Для ОС Android.*
Окно разделено на заголовок, содержимое с пунктами и
нижними кнопками "Отмена" и "Принять". Пункты в данном
случае есть столбцы реестра (с учетом требований выше).
При открытии окна справа от пункта, по которому
отсортирован список записей в данный момент,
отображается иконка направления сортировки. При
первом открытии иконка отсутствует вовсе.
Поведение окна "Сортировать по полю":
* Для выбора пункта необходимо нажать на строку либо
иконку, справа отобразится иконка направления
сортировки:
* по убыванию (по умолчанию):
![](resources/img/forms/elements/sort_down.png)
* по возрастанию:
![](resources/img/forms/elements/sort_up.png)
* Повторное нажатие на строку меняет направление
сортировки на противоположное.
* При выделении пункта, выделение предыдущего пункта
снимается.
Кнопка "Сортировка" может быть в одном из следующих видов:
* сортировка, настроенная в реестре (отображается
по умолчанию при первом входе в компонент и пока
не изменили сортировку):
![](resources/img/forms/elements/sort.png)
* сортировка по убыванию, настроенная в данном экране:
![](resources/img/forms/elements/sort_desc.png)
* сортировка по возрастанию, настроенная в данном экране:
![](resources/img/forms/elements/sort_asc.png)
![Сортировка в ОС Android, начало списка](resources/img/forms/register_chooser_sort_1.png)
![Сортировка в ОС Android, середина списка](resources/img/forms/register_chooser_sort_2.png)
![Сортировка в ОС Android, конец списка](resources/img/forms/register_chooser_sort_3.png)
*Для iOS.*
Окно разделено на заголовок с кнопками "Отмена" и
"Принять", а также содержимое со столбцами реестра
(с учетом требований выше).
При открытии окна справа от пункта, по которому
отсортирован список записей в данный момент,
отображается иконка направления сортировки. При
первом открытии иконка отсутствует вовсе.
Поведение окна "Сортировать":
* Для выбора пункта необходимо нажать на строку либо
иконку, справа отобразится иконка направления
сортировки:
* по убыванию (по умолчанию):
![](resources/img/forms/elements/sort_down.png)
* по возрастанию:
![](resources/img/forms/elements/sort_up.png)
* Повторное нажатие на строку меняет направление
сортировки на противоположное.
* При выделении пункта, выделение предыдущего пункта
снимается.
![Сортировка в iОS](resources/img/forms/iOS/register_chooser_sort_ios.png)
*Для обеих ОС.*
После выбора пункта меню и направления сортировки
необходимо нажать на кнопку подтверждения действия
"Принять". Если выбор пункта отсутствует, то действие
должно быть аналогично "Отмене".
Для того, чтобы отменить действие и закрыть окно,
необходимо нажать на кнопку "Отмена" либо в пустой
области экрана, дополнительно для ОС Android - с
помощью кнопки "Назад".
### Компонент для выбора записи реестра {#registry_chooser}
Компонент формы "Ссылка на реестр" позволяет добавлять на
форму кликабельную ссылку на определенную запись
определенного реестра.
В режиме просмотра файла по форме является активной ссылкой,
в режиме редактирования - поле с кнопкой, по нажатию которой
открывается нативный экран «Записи реестра».
Если в настройках компонента не выбран реестр, то по нажатию
на эту кнопку необходимо не открывать диалог и выводить
системную ошибку:
`Не выбран реестр. Обратитесь к методологу.`
![Записи реестра: сортировка по убыванию и неполные плашки](resources/img/forms/register_chooser_short_list.png)
![Записи реестра, сортировка по убыванию и неполные плашки](resources/img/forms/iOS/register_chooser_short_list_ios.png)
![Записи реестра, сортировка по возрастанию и полные плашки](resources/img/forms/register_chooser_long_list.png)
![Записи реестра, сортировка по возрастанию и полные плашки](resources/img/forms/iOS/register_chooser_long_list_ios.png)
**Элементы управления экрана "Записи реестра".**
+--------------------------------------------------+------------------------+--------------------------------------------+
| Элемент управления | Расположение на экране | Описание |
+==================================================+========================+============================================+
| Записи реестра | Верхняя панель | Заголовок экрана |
+--------------------------------------------------+------------------------+--------------------------------------------+
| ![](resources/img/forms/elements/list_long.png)\ | Верхняя панель, справа | "Вид" - кнопка переключения между двумя |
| | | видами плашек списка (краткий либо полный) |
+--------------------------------------------------+------------------------+--------------------------------------------+
| ![](resources/img/forms/elements/sort.png)\ | Верхняя панель, левее | "Сортировка" - кнопка перехода к |
| | кнопки "Вид" | настройкам сортировки списка |
+--------------------------------------------------+------------------------+--------------------------------------------+
| Поле поиска | Вверху основной | Поле ввода с плейсхолдером "Поиск записей" |
| | области | и иконкой лупы справа |
+--------------------------------------------------+------------------------+--------------------------------------------+
| Панель со списком записей реестра | Вся основная область | Плашки, отображающие информацию о |
| | | записях конкретного реестра |
+--------------------------------------------------+------------------------+--------------------------------------------+
| Выбрать | Внизу | Кнопка |
+--------------------------------------------------+------------------------+--------------------------------------------+
Поле поиска и кнопка "Выбрать" имеют фиксированное
положение. В оставшейся области находится прокручиваемый
список записей реестра.
Отображаемый *список* содержит записи преднастроенного
реестра. Каждая запись содержит данные в следующем
формате:
`%Название_столбца%: %значение%`
Количество данных в плашке зависит от того, какой
используется вид просмотра:
* Краткий (по умолчанию): плашка отображает только
те отображаемые столбцы, которые помечены как
значащее содержимое. При отображении краткого
списка кнопка "Вид" принимает значение
![](resources/img/forms/elements/list_long.png)
для переключения в полный вид.
* Полный: плашка отображает все отображаемые столбцы.
При отображении полного списка кнопка "Вид"
принимает значение
![](resources/img/forms/elements/list_short.png)
для переключения в краткий вид.
В обоих случаях невмещающиеся по ширине названия и
значения переносятся на новую строку. При этом один
столбец должен занимать не более двух строк, иначе
текст обрезается с добавлением многоточие. Некоторые
значения столбцов могут отсутствовать, это не будет
являться ошибкой платформы или мобильного клиента.
Список записей отображается с постепенной догрузкой.
Изначально подгружается 30 записей. При прокрутке
пользователем вниз список дополняется новыми 30
записями.
При открытии экрана записи в списке сортируются
согласно преднастройкам реестра. Кнопка "Сортировка"
может быть в одном из следующих видов:
* сортировка, настроенная в реестре (отображается
по умолчанию при первом входе в компонент и пока
не изменили сортировку):
![](resources/img/forms/elements/sort.png)
* сортировка по убыванию, настроенная в данном
экране:
![](resources/img/forms/elements/sort_desc.png)
* сортировка по возрастанию, настроенная в данном
экране:
![](resources/img/forms/elements/sort_asc.png)
Изменять данную сортировку можно, нажав на
соответствующую кнопку (см. ниже).
*Поведение экрана "Записи реестра":*
* Для выбора записи необходимо нажать на строку,
вся строка выделится фоном.
* Повторное нажатие на строку не снимает выделение.
* При выделении записи в списке, выделение
предыдущего элемента снимается.
*Поиск записей* осуществляется по всем записям реестра.
Поиск является "живым" и производится по всем полям
плашки (за исключением тех полей, по которым не
осуществляется сортировка), его результаты фильтруют
отображаемый список. При вводе текста иконка лупы
заменяется на иконку крестика. Очистить поле ввода
можно, нажав на крестик (крестик заменяется на иконку
лупы). Пустой запрос поиска - отображается список со
всеми записями.
Если пользователь на экране "Записи реестра" нажимает
на *кнопку "Назад"*, мобильный клиент возвращает
пользователя в [проигрыватель форм](#forms_view) в том
состоянии, которое было у компонента до вызова данного
экрана.
После выделения записи списка пользователь нажимает на
*кнопку «Выбрать»*. Действие выполняется, только если
выделен какой-либо элемент списка, иначе необходимо
выдавать сообщение:
`Запись не выбрана`
и не выполнять действие.
В результате же успешного выполнения действия мобильный
клиент также возвращает пользователя в
[проигрыватель форм](#forms_view), в поле компонента
отображается выбранный элемент списка.
**Проигрыватель форм. Переход по ссылкам.**
По нажатию на ссылку открывается
[экран информации](#sec.documents_docinfo) о документе
реестра.
<#include "forms/registries_sort.md">
### Компонент периода повторения {#repeat}
Компонент формы "Период повторения" позволяет задавать
период повторения.
В режиме редактирования представляет собой
[выпадающий список](#combobox) с вариантами периода:
* Нет
* По дням недели
* По дням месяца
* Ежегодно
Для варианта, отличного от "Нет", добавляется компонент
для выбора значений периода. По нажатию на кнопку
календаря открывается соответствующий нативный экран.
Содержимое экрана зависит от того, какой выбран вариант
периода повторения.
**Общее для всех вариантов экранов**
Во всех экранах заголовок содержит название варианта
периода повторения. Кнопка "Готово" имеет фиксированное
положение. Вся остальная область экрана прокручиваема.
Выбор значений в экране не является обязательным -
проверка на обязательность заполнения данного
компонента осуществляется на этапе сохранения формы
либо переключении режима формы.
При открытии экрана в нем уже являются выделенными
плашки / ячейки только тех значений, что сохранены в
форме. Т.е. выбранные, но еще не сохраненные в форме,
значения при переключении вариантов периода обнулятся.
Все варианты периода повторения поддерживают
множественный выбор путем выделения (действие tap)
соответствующих значений.
**По дням недели.**
![По дням недели](resources/img/forms/repeat_week.png)
![По дням недели](resources/img/forms/iOS/repeat_week_ios.png)
+---------------------+-------------------------+------------------------------+
| Элемент управления | Расположение на экране | Описание |
+=====================+=========================+==============================+
| По дням недели | Верхняя панель | Заголовок экрана |
+---------------------+-------------------------+------------------------------+
| %сетка_дней_недели% | Вверху основной области | Панель с днями недели |
+---------------------+-------------------------+------------------------------+
| Готово | Внизу | Кнопка |
+---------------------+-------------------------+------------------------------+
Панель содержит список дней недели:
* `Понедельник`
* `Вторник`
* `Среда`
* `Четверг`
* `Пятница`
* `Суббота`
* `Воскресенье`
В правой части каждого элемента списка находится
флажок, показывающий, выбран данный день недели или
нет. Нажатие по любой области плашки включает /
выключает данный флажок.
**По дням месяца.**
![По дням месяца](resources/img/forms/repeat_month.png)
![По дням месяца](resources/img/forms/iOS/repeat_month_ios.png)
+---------------------+-------------------------+------------------------------+
| Элемент управления | Расположение на экране | Описание |
+=====================+=========================+==============================+
| По дням месяца | Верхняя панель | Заголовок экрана |
+---------------------+-------------------------+------------------------------+
| %сетка_31_дня% | Вверху основной области | Панель с 31 календарными |
| | | днями |
+---------------------+-------------------------+------------------------------+
| Готово | Внизу | Кнопка |
+---------------------+-------------------------+------------------------------+
Панель содержит календарные дни с `1` по `31`.
Разделение на дни недели отсутствует, сетка всегда
заполнена строго от верхнего левого угла панели.
Выделение и выбор дня месяца осуществляется нажатием
на число (действие tap), соответствующая ячейка сетки
выделяется фоном. Повторное выделение снимает этот
выбор.
**Ежегодно.**
![Ежегодно](resources/img/forms/repeat_year.png)
![Ежегодно](resources/img/forms/iOS/repeat_year_ios.png)
+---------------------+-------------------------+------------------------------+
| Элемент управления | Расположение на экране | Описание |
+=====================+=========================+==============================+
| Ежегодно | Верхняя панель | Заголовок экрана |
+---------------------+-------------------------+------------------------------+
| `<` | Вверху основной области | Кнопка перехода к |
| | (слева) | предыдущему месяцу |
+---------------------+-------------------------+------------------------------+
| %название_месяца% | Вверху основной области | Выпадающий список месяцев |
+---------------------+-------------------------+------------------------------+
| `>` | Вверху основной области | Кнопка перехода к следующему |
| | (справа) | месяцу |
+---------------------+-------------------------+------------------------------+
| %сетка_дней_месяца% | После месяца | Панель с днями выбранного |
| | | месяца |
+---------------------+-------------------------+------------------------------+
| Выбрано: | После панели с днями | Список выбранных дней (в |
| | | виде тегов) |
+---------------------+-------------------------+------------------------------+
| Готово | Внизу | Кнопка |
+---------------------+-------------------------+------------------------------+
Панель содержит календарные дни выбранного месяца.
Выбор месяца осуществляется несколькими способами:
* при каждом открытии экрана в нем, по умолчанию,
выбран текущий месяц на сервере;
* [выпадающий список](#combobox) над панелью
отображает текущий выбранный месяц, по его
нажатию можно выбрать другой месяц:
* `Январь`
* `Февраль`
* `Март`
* `Апрель`
* `Май`
* `Июнь`
* `Июль`
* `Август`
* `Сентябрь`
* `Октябрь`
* `Ноябрь`
* `Декабрь`
* возможно переключение на предыдущий месяц
(относительно выбранного) с помощью кнопки
![](resources/img/forms/elements/prev_month.png)
либо свайпом слева направо;
* аналогично, возможно переключение на следующий
месяц (относительно выбранного) с помощью кнопки
![](resources/img/forms/elements/next_month.png)
либо свайпом справа налево;
* прокрутка вкладок циклическая: если выбрать
месяц декабрь и переключиться на следующий месяц,
то отобразится январь, и наоборот.
Разделение на дни недели отсутствует, сетка всегда
заполнена строго от верхнего левого угла панели.
Количество дней зависит от месяца (при этом февраль
всегда содержит 29 дней).
Выделение и выбор дня месяца осуществляется нажатием
на число (действие tap): соответствующая ячейка сетки
выделяется фоном, в список выбранных добавляется тег,
при этом фокус остается на панели (это актуально для
случая, когда количество тегов таково, что экран
прокручивается). Повторное выделение снимает этот
выбор, а также удаляет тег. Смена месяца не отменяет
предыдущий выбор в других месяцах.
Надпись "Выбрано:" отображается только в том случае,
когда выбрано хотя бы одно значение в сетке (иначе
отсутствует вовсе). Каждому выбранному значению
соответствует тег в данном списке в формате:
`%день_(простой_формат)% %мес%`
где простой формат означает использование числа 1
вместо 01, а `%мес%` - это первые три буквы месяца.
Все теги имеют одинаковую ширину: такую, чтобы на
одну строку поместилось 4 тега. Они сортируются в
порядке возрастания даты на календаре. Например,
`1 мар` будет расположено левее и/или выше `1 апр`.
> Примечание.
>
> Таким образом, выделение новых значений компонента
> может добавлять тег не только в конец списка, но и
> в его начало и/или середину, и это не является
> ошибкой платформы или мобильного клиента.
По нажатию на тег необходимо выдавать системное
диалоговое окно подтверждения его удаления:
`Вы действительно хотите удалить тег %тег%?`
Утвердительный ответ удаляет тег и снимает
соответствующее выделение в сетке календаря.
### Системные компоненты выбора (выпадающий список, дата/время) {#system_pickers}
В данном разделе объединены компоненты выбора, в которых
будут использоваться системные компоненты:
* выпадающий список
* дата
* время
#### Выпадающий список {#combobox}
По нажатию в проигрывателе на компонент *"Выпадающий
список"* открывается системный выпадающий список.
Внешний вид списка идентичен, например, таковому в
поле приоритета
[диалога создания работы](#sec.workflow_work_create),
но в котором отсутствует заголовок списка.
Выбор (действие tap) значения никак не выделяет строку,
сам список в таком случае закрывается. При открытии
списка выбранное значение также никак не выделено.
#### Дата/время {#date_time}
По нажатию в проигрывателе на компонент *"Дата"*
открывается системный диалог выбора конкретной даты
(день/месяц/год) календаря. Внешний вид идентичен
таковому в поле изменения сроков
[диалога создания работы](#sec.workflow_work_create).
При открытии данного компонента календарь отображает
либо уже выбранную дату (при наличии), либо текущую
дату (если значение у компонента еще отсутствует).
Аналогично, по нажатию в проигрывателе на компонент
*"Время"* открывается системный диалог выбора
конкретного времени (часы/минуты). Внешний вид
идентичен таковому в поле изменения сроков того же
[диалога создания работы](#sec.workflow_work_create).
При открытии данного компонента отображается либо
уже выбранное время (при наличии), либо 00:00 (если
значение у компонента еще отсутствует).
Выбранные значения даты и времени должны отобразиться
в компоненте по формату, определенному самой формой.
*Вся остальная логика этих компонентов - на стороне
проигрывателя форм.*
### Компонент для выбора пользователей {#userchooser}
Компонент для выбора пользователей представляет собой
кликабельное поле ввода, по нажатию которой открывается
нативный экран «Пользователи».
При открытии экрана в нем уже являются выделенными
плашки выбранных ранее значений.
![Экран "Пользователи" с множественным выбором](resources/img/forms/user_chooser.png)
![Экран "Пользователи" с множественным выбором](resources/img/forms/iOS/user_chooser_ios.png)
![Экран "Пользователи" с единственным выбором](resources/img/forms/user_chooser_2.png)
![Экран "Пользователи" с единственным выбором](resources/img/forms/iOS/user_chooser_2_ios.png)
Для построения экрана компонент принимает следующие
параметры:
* имеется ли связь с компонентом;
* единственный или множественный выбор;
* отображать ли группы;
* отображать ли пользователей из резерва;
* отображать подчиненных или всех пользователей;
* идентификатор действия.
**Элементы управления экрана "Пользователи".**
+----------------------------------------------------------+------------------------+--------------------------------------------+
| Элемент управления | Расположение на экране | Описание |
+==========================================================+========================+============================================+
| *Верхняя панель* | | |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| ![](resources/img/workflow/elements/button_filters.png)\ | Справа | "Навигатор" - кнопка перехода к |
| | | навигатору экрана |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| *Компонент "Путь"* | Ниже верхней панели | Компонент, отображающий путь до выделенной |
| | | ноды навигатора, согласно которой |
| | | отображается текущий список пользователей |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| *Рабочая область* | | |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| Поле поиска | Вверху основной | Поле ввода с плейсхолдером "Поиск |
| | области | пользователей" и иконкой лупы справа |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| Панель со списком пользователей | Вся основная область | Плашки, отображающие информацию о |
| | | пользователях |
+----------------------------------------------------------+------------------------+--------------------------------------------+
| Выбрать | Внизу | Кнопка |
+----------------------------------------------------------+------------------------+--------------------------------------------+
Путь, поле поиска и кнопка "Выбрать" имеют фиксированное
положение. В оставшейся области находится прокручиваемый
список пользователей.
По нажатию на кнопку *навигатора*, а также проведя
пальцем от правой стороны экрана к левой, раскрывается
правая панель навигатора (илл. «Навигатор выбора
пользователей»).
![Навигатор выбора пользователей](resources/img/forms/user_chooser_navigator.png)
Верхняя панель содержит только надпись "Навигатор". Сам
навигатор может содержать следующий набор узлов, каждый
из которых отделен от предыдущего сплитом:
* `Выбранные`
* `Часто выбираемые`
* `Группы` (присутствует только, если необходимо
отображать группы)
* `%Название_организации%` (выделен по умолчанию при
открытии экрана)
Первые две ноды не имеют дочерних элементов. "Группы"
содержат дерево групп всех уровней.
"%Название_организации%", в свою очередь, - дерево всей
орг.структуры.
В остальном, навигатор повторяет поведение аналогичных
навигаторов, например, в [хранилище](#sec.files_navigator):
* после выделения узла в навигаторе необходимо
автоматически отображать соответствующий список;
* при каждом новом открытии экрана "Пользователи" все
узлы должны быть свернуты, кроме первого уровня
орг.структуры;
* в текущем открытом экране развернутость дерева и
последний выделенный узел должны сохранять свои
значения;
* иконки свернутости и развернутости, их кликабельная
область;
* отступы дочерних элементов дерева (включая вариант,
при котором уровни вложенности, начиная с 8-й, должны
иметь отступ как для 7-го уровня);
* градиент невмещающегося текста;
* скрытие навигатора свайпом от левой стороны экрана
к правой, нажатием по левой стороне экрана либо
кнопкой "Назад" (для ОС Android).
Компонент *"Путь"* содержит полный путь до выделенного
узла навигатора. Содержимое компонента: полные названия
узлов от корневой родительской (см. примеры) до текущей
открытой, включая ее саму.
В целом, компонент повторяет поведение пути в модуле
["Файлы"](#sec.files_list) (наличие горизонтального
скролла и градиентов, кликабельность элементов пути).
> Примеры.
>
> Для ноды "Выбранные", "Часто выбираемые" путь,
> соответственно, отображает:
>
> * `Выбранные`
> * `Часто выбираемые`
>
> Для выбранной группы путь отображает:
>
> * `Группы > ДРТ > Разработчики`
>
> Для выбранного подразделения орг.структуры путь
> отображает:
>
> * `Фонд поддержки молодежи > Административный отдел >
> Снабжение`
*Отображаемый список пользователей* зависит от того,
что выделено в навигаторе:
* `Выбранные` - все текущие пользователи, напротив
которых установлен флажок выбора;
* `Часто выбираемые` - список часто выбираемых
пользователей;
* `Группы` - список групп и/или пользователей;
* `%Название_организации%` - список пользователей,
принадлежащих выбранному подразделению орг.
структуры.
Если имеется связь с другим компонентом, то необходимо
сужать отображаемый список согласно связи (передав в API
соответствующий параметр).
Отображение групп работает следующим образом. Если
недоступен множественный выбор, то возможен выбор
только пользователей из списка групп (но не самих
групп). Если же множественный выбор доступен, то,
соответственно, возможен выбор группы в качестве
выбранного элемента.
Плашки могут отличаться, в зависимости от отображаемой
информации:
* Плашка пользователя содержит:
* первый блок - ФИО (полное либо с инициалами -
зависит от настройки конфигуратора "Отображать
полное ФИО пользователя в компоненте выбора
пользователя");
* второй блок - список должностей пользователя
через запятую (для пользователей из резерва -
отсутствует);
* третий блок - статус календаря (при наличии, цвет
определяется настройками статуса).
* Плашка группы содержит:
* первый блок - полное название группы;
* второй блок - полное название родительской
группы (для групп первого уровня - отсутствует).
* Плашка контакта из адресной книги содержит:
* первый блок - ФИО либо название организации +
`<электронная почта>`;
* второй блок содержит лейбл `Контакт из адресной
книги` (цвет `#ff4800`).
* Плашка произвольного текста содержит:
* первый блок - произвольный текст;
* второй блок содержит лейбл `Введен вручную` (цвет
`#ff4800`).
Во всех вариантах невмещающиеся по ширине ФИО и названия
должностей / групп / статусов переносятся на новую
строку. В правой части каждого элемента списка может
находиться флажок, показывающий, выбран данный
пользователь или нет (только для компонента с
множественным выбором).
Список отображается с постепенной догрузкой. Изначально
подгружается 30 пользователей. При прокрутке
пользователем вниз список дополняется новыми 30
пользователями.
Список пользователей сортируется по возрастанию ФИО.
Список групп и пользователей, в свою очередь, так:
сначала группы, затем пользователи, между собой по
возрастанию названия / ФИО.
*Поведение экрана:*
* Для компонента с единственным выбором:
* Для выбора пользователя необходимо нажать
на строку, вся строка выделится фоном.
* Повторное нажатие на строку не снимает
выделение.
* При выделении пользователя в списке,
выделение предыдущего элемента снимается.
* Для компонента с множественным выбором:
* Для выбора пользователя необходимо нажать на
строку или флажок, находящийся справа
соответствующего элемента списка.
* Удалить пользователя из списка выбранных
можно, выключив флажок, пользователь
удаляется из списка выбранных без
подтверждения.
* В контекстное меню любой плашки (во всех
узлах навигатора, кроме "Выбранные")
добавляется пункт "Выбрать всех". По его
нажатию происходит выделение всех еще
невыделенных пользователей отображаемого
списка.
Если все пользователи отображаемого списка
выделены, пункт меню заменяется на "Снять
выделение". По его нажатию происходит
развыделение всех пользователей списка
(пункт меню снова принимает вид "Выбрать
всех").
*Поиск пользователей* осуществляется только внутри
отображаемого списка и только в узлах навигатора
"%Название_организации%" и "Группы" (а также их подузлах,
в остальных узлах поле отсутствует вовсе). Поиск является
"живым" и производится по названию (для групп) либо ФИО
(для пользователей), его результаты фильтруют отображаемый
список. При вводе текста иконка лупы заменяется на иконку
крестика. Очистить поле ввода можно, нажав на крестик
(крестик заменяется на иконку лупы). Пустой запрос поиска -
отображается список со всеми пользователями данного узла
навигатора.
Если пользователь на экране "Пользователи" нажимает
на *кнопку "Назад"*, мобильный клиент возвращает
пользователя к экрану, из которого он был вызван.
Если пользователь нажимает на *кнопку "Выбрать"*,
мобильный клиент возвращает пользователя к предыдущему
экрану, в поле компонента отображаются выбранные
пользователи:
* в нативных диалогах приложения - через запятую,
имя каждого пользователя в формате
`%Фамилия И.О.%`;
* иначе - согласно проигрывателю формы.
> **Примечание**
>
> Метод получения списка пользователей описан в javadoc:
>
> kz.arta.synergy.server.api.rest.userchooser#getUsersExt
>
> Метод получения списка должностей описан в javadoc:
>
> kz.arta.synergy.server.api.rest.userchooser#getPositions
>
> Метод получения списка подразделений описан в javadoc:
>
> kz.arta.synergy.server.api.rest.userchooser#getDepartments
>
> Метод получения списка часто выбираемых пользователей
> описан в javadoc:
>
> kz.arta.synergy.server.api.rest.userchooser#getOftenChosenUsers
>
> Метод получения списка групп описан в javadoc:
>
> kz.arta.synergy.server.api.rest.groups#getGroups
---
author:
- Данир Тлепов
date: 30.11.2016
title: Спецификация на мобильный клиент ARTA SYNERGY
version: 4.1
subtitle: Версия 4.1 Development
copyright: Для внутреннего использования
...
<#include "base/introduction.md">
<#include "base/base.md">
<#include "autorise/autorise.md">
<#include "workflow/workflow.md">
<#include "files/files.md">
<#include "documents/documents.md">
<#include "registries/registries.md">
<#include "forms/forms.md">
<#include "sizes_and_spacing/index.md">
<#include "push/push_notifications.md">
<#include "offline/offline_index.md">
<#include "settings/settings.md">
<#include "exit/app_exit.md">
#### Добавление файла к документу {#sec.offline_document_add_file}
Исходное поведение [здесь](#sec.documents_attachments).
В режиме оффлайн доступны пункты меню добавления нового файла "Файл
с устройства" и "Фото" (но не "Файл с хранилища") как на экране
информации о документе, так и на экране всех вложений. Необходимо
фиксировать время добавления нового файла на устройстве. Добавление
на сервер должно происходить по следующему алгоритму.
1. Если на стороне сервера доступ к добавлению файла в папку
"Приложения" был закрыт, то действие выполнять частично: этот
файл необходимо добавить, но в папку "Прочие". В журнал
синхронизации при этом должна произойти запись в формате:
- условно успешная синхронизация:
`Новый файл "название_файла.расширение" к документу
"название_документа" добавлен в папку "Прочие": Отсутствует
доступ к папке "Приложения"`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Новый файл "название_файла.расширение" к документу
"название_документа": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Во всех остальных случаях действие добавления нового файла должно
всегда выполняться:
- необходимо фиксировать время добавления на сервере;
- в качестве времени добавления файла считать время применения
действия на сервере;
- в журнал синхронизации при применении должна произойти запись
в формате:
- успешная синхронизация:
`Новый файл "название_файла.расширение" к документу
"название_документа" добавлен`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Новый файл "название_файла.расширение" к документу
"название_документа": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
\ No newline at end of file
#### Удаление комментария документа {#sec.offline_document_delete_comment}
Исходное поведение [здесь](#sec.documents_comments).
В режиме оффлайн доступен пункт меню "Удалить" комментария, при его
наличии, как на экране информации о документе, так и на экране всех
комментариев. Необходимо фиксировать время удаления комментария на
устройстве. Удаление с сервера должно происходить по следующему
алгоритму.
1. Если на стороне сервера данный комментарий был удален, то действие
не выполнять. В журнал синхронизации при этом должна произойти
запись в формате:
- условно успешная синхронизация:
`Удаление комментария "текст_комментария" к документу
"название_документа" не синхронизировано: Комментарий
невозможно удалить, так как он уже удален`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Удаление комментария "текст_комментария" к документу
"название_документа": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Если на стороне сервера комментарий не был удален, то:
- необходимо фиксировать время удаления на сервере;
- удаленный комментарий должен удалиться и на сервере;
- в качестве времени удаления комментария считать время удаления
на сервере;
- в журнал синхронизации при применении должна произойти запись в
формате:
- успешная синхронизация:
`Удаление комментария "текст_комментария" к документу
"название_документа" синхронизировано`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Удаление комментария "текст_комментария" к документу
"название_документа": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
\ No newline at end of file
#### Удаление файла документа {#sec.offline_document_delete_file}
Исходное поведение [здесь](#sec.documents_attachments).
В режиме оффлайн доступен пункт меню "Удалить" вложения, при его
наличии, как на экране информации о документе, так и на экране всех
вложений. Необходимо фиксировать время удаления вложения на устройстве.
Удаление с сервера должно происходить по следующему алгоритму.
1. Если на стороне сервера данный файл был удален, то действие не
выполнять. В журнал синхронизации при этом должна произойти запись
в формате:
- условно успешная синхронизация:
`Удаление файла "название_файла.расширение" документа
"название_документа" не синхронизировано: Файл удален`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Удаление файла "название_файла.расширение" документа
"название_документа": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Если на стороне сервера доступ к удалению файла в папке "Приложения"
был закрыт, то действие не выполнять. В журнал синхронизации при
этом должна произойти запись в формате:
- условно успешная синхронизация:
`Удаление файла "название_файла.расширение" документа
"название_документа" не синхронизировано: Отсутствует доступ к
папке "Приложения"`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Удаление файла "название_файла.расширение" документа
"название_документа": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
3. Если на стороне сервера файл не был удален и есть доступ на его
удаление, то:
- необходимо фиксировать время удаления на сервере;
- удаленный файл должен удалиться и на сервере;
- в качестве времени удаления файла считать время удаления на
сервере;
- в журнал синхронизации при применении должна произойти запись в
формате:
- успешная синхронизация:
`Удаление файла "название_файла.расширение" документа
"название_документа" синхронизировано`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Удаление файла "название_файла.расширение" документа
"название_документа": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
### Автономная работа модуля «Документы» {#sec.offline_document_index}
<#include "offline/documents/offline_edit_progress.md">
<#include "offline/documents/offline_end_work.md">
<#include "offline/documents/offline_new_comment.md">
<#include "offline/documents/offline_edit_comment.md">
<#include "offline/documents/offline_delete_comment.md">
<#include "offline/documents/offline_add_file.md">
<#include "offline/documents/offline_delete_file.md">
#### Редактирование комментария документа {#sec.offline_document_edit_comment}
Исходное поведение [здесь](#sec.documents_comments).
В режиме оффлайн доступен пункт меню "Изменить" комментария, при его
наличии, как на экране информации о документу, так и на экране всех
комментариев. Необходимо фиксировать время изменения комментария на
устройстве и использовать его в качестве отображаемого времени последнего
изменения на плашке комментария в формате "ДД месяца ЧЧ:ММ". Применение
изменений на сервер должно происходить по следующему алгоритму.
1. Если на стороне сервера данный комментарий был удален, то действие
не выполнять. В журнал синхронизации при этом должна произойти
запись в формате:
- условно успешная синхронизация:
`Изменение комментария "текст_комментария" к документу
"название_документа" не синхронизировано: Комментарий невозможно
изменить, так как он удален`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Изменение комментария "текст_комментария" к документу
"название_документа": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Если на стороне сервера комментарий не был удален, то:
- необходимо фиксировать время применения действия на сервере;
- измененный комментарий должен примениться, даже если комментарий
на сервере не совпадает с исходным комментарием в оффлайне;
- в качестве времени изменения комментария считать время
применения действия на сервере;
- в журнал синхронизации при применении должна произойти запись в
формате:
- успешная синхронизация:
`Изменение комментария к документу "название_документа"
синхронизировано, новое значение: "текст_комментария"`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Изменение комментария "текст_комментария" к документу
"название_документа": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
#### Изменение прогресса работы по документу {#sec.offline_document_edit_progress}
Исходное поведение [здесь](#sec.documents_work_information).
В режиме оффлайн ползунок прогресса работы, при его наличии, доступен
для редактирования. Необходимо фиксировать время последнего изменения
прогресса на устройстве. Применение измененного в оффлайне значения
прогресса должно происходить по следующему алгоритму.
1. Если на стороне сервера данная работа уже завершена (хоть статусом,
хоть прогрессом), то действие не выполнять. В журнал синхронизации
при этом должна произойти запись в формате:
- условно успешная синхронизация:
`Изменение прогресса работы "название_работы" не
синхронизировано: Действие не может быть выполнено, так как
процесс завершен`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Изменение прогресса работы "название_работы": ошибка
синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Если на стороне сервера данная работа не завершена, то:
- необходимо фиксировать время применения действия на сервере;
- значение измененного прогресса должно примениться, даже если
значение прогресса на сервере не совпадает с исходным значением
прогресса в оффлайне;
- в качестве времени изменения прогресса считать время применения
действия на сервере;
- в журнал синхронизации при применении должна произойти запись в
формате:
- успешная синхронизация:
`Изменение прогресса работы "название_работы"
синхронизировано, новое значение - NN%`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Изменение прогресса работы "название_работы": ошибка
синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
\ No newline at end of file
#### Завершение работы {#sec.offline_document_end_work}
Исходное поведение [здесь](#sec.documents_actions).
В режиме оффлайн доступны, при наличии, кнопки "Завершить"
(идентификаторы операции PROGRESS, POINT_RESULT, RESOLUTION_ACTION),
"Ответить" (идентификатор операции PROCESS), "Результат" (идентификатор
действия RESULT) и ползунок прогресса работы для выставления 100%.
Необходимо фиксировать время завершения на устройстве. Применение
статуса завершенности работы должно происходить по следующему алгоритму.
1. Для работ без формы завершения, а также с формой завершения "форма":
если на стороне сервера данная работа была завершена (хоть статусом,
хоть прогрессом), то действие не выполнять. В журнал синхронизации
при этом должна произойти запись в формате:
- условно успешная синхронизация:
`Завершение работы "название_работы" не синхронизировано:
Действие не может быть выполнено, так как процесс завершен`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Завершение работы "название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Для работ с формой завершения "файл": если на стороне сервера данная
работа была завершена (хоть статусом, хоть прогрессом), то действие
выполнять частично: этот файл или форму необходимо добавить в
"Прочие". В журнал синхронизации при этом должна произойти запись в
формате:
- условно успешная синхронизация:
`Завершение работы "название_работы" не синхронизировано:
Действие не может быть выполнено, так как процесс завершен (в
"Прочие" добавлен файл формы завершения)`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Завершение работы "название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
> **Замечание**
>
> Файл в "Прочие" должен добавляться в любом случае. Если файл с
> таким же названием существует в "Приложениях", то он должен просто
> добавиться в "Прочие". Если же в "Прочих" существует файл с таким
> названием, то он все равно должен добавиться как отдельный файл с
> обновленным названием *'исходное-имя-файла_ГГГГ-ММ-ДД
> ЧЧ_ММ.расширение'*.
3. Для работ с формой завершения "комментарий": если на стороне сервера
данная работа была завершена (хоть статусом, хоть прогрессом), то
действие выполнять частично: этот комментарий необходимо добавить к
работе как "обычный" комментарий. В журнал синхронизации при этом
должна произойти запись в формате:
- условно успешная синхронизация:
`Завершение работы "название_работы" не синхронизировано:
Действие не может быть выполнено, так как процесс завершен
(комментарий добавлен к работе как обычный)`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Завершение работы "название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
4. Для работ без формы завершения, а также с формой завершения "форма":
если на стороне сервера данная работа была удалена, то действие не
выполнять. В журнал синхронизации при этом должна произойти запись в
формате:
- условно успешная синхронизация:
`Завершение работы "название_работы" не синхронизировано:
Действие не может быть выполнено, так как процесс завершен`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Завершение работы "название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
5. Для работ с формой завершения "файл": если на стороне сервера данная
работа была удалена, то действие выполнять частично: этот файл или
форму необходимо добавить в "Прочие". В журнал синхронизации при
этом должна произойти запись в формате:
- условно успешная синхронизация:
`Завершение работы "название_работы" не синхронизировано:
Действие не может быть выполнено, так как процесс завершен (в
"Прочие" добавлен файл формы завершения)`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Завершение работы "название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
> **Замечание**
>
> Файл в "Прочие" должен добавляться в любом случае. Если файл с
> таким же названием существует в "Приложениях", то он должен просто
> добавиться в "Прочие". Если же в "Прочих" существует файл с таким
> названием, то он все равно должен добавиться как отдельный файл с
> обновленным названием *'исходное-имя-файла_ГГГГ-ММ-ДД
> ЧЧ_ММ.расширение'*.
6. Для работ с формой завершения "комментарий": если на стороне сервера
данная работа была удалена, то действие не выполнять. В журнал
синхронизации при этом должна произойти запись в формате:
- условно успешная синхронизация:
`Завершение работы "название_работы" не синхронизировано:
Действие не может быть выполнено, так как процесс завершен
(комментарий не добавлен к работе)`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Завершение работы "название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
7. Для всех остальных случаев:
- необходимо фиксировать время применения действия на сервере;
- должен примениться статус завершенности со всеми сопутствующими
параметрами завершения:
- идентификаторы операции PROGRESS / RESOLUTION_ACTION:
результат операции (завершено);
- идентификаторы операции POINT_RESULT: форма завершения
комментарий, файл (в т.ч. выбранный из работы, добавленный с
устройства или с камеры), форма;
*Примечание:* в список завершения работы "Из работы" (для
формы завершения - файла) попадают как синхронизированные
данные, так и файлы, добавленные в режиме оффлайна (пункт
"Перепорученные" при этом недоступен, нельзя выбрать
результат перепорученных работ).
- идентификаторы операции PROCESS: добавлены ли подпись и
комментарий и результат операции (ознакомился, согласен/не
согласен, утвердил/не утвердил);
- идентификатор действия RESULT: результат действия
подтверждено или отклонено (включая измененные сроки и
прогресс, комментарий-причина);
- в качестве времени изменения прогресса считать время применения
действия на сервере;
- в журнал синхронизации при применении должна произойти запись в
формате:
- успешная синхронизация:
`Завершение работы "название_работы" синхронизировано`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Завершение работы "название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
\ No newline at end of file
#### Добавление нового комментария к документу {#sec.offline_document_new_comment}
Исходное поведение [здесь](#sec.documents_comments).
В режиме оффлайн доступен пункт меню "Комментарий" для добавления нового
комментария как на экране информации о документе, так и на экране всех
комментариев. Необходимо фиксировать время добавления нового комментария
на устройстве и использовать его в качестве отображаемого времени
на плашке комментария в формате "ДД месяца ЧЧ:ММ". Добавление на сервер
должно происходить по следующему алгоритму.
*Примечание: необходимо учитывать, что комментарий, добавленный к
документу, добавляется и к открытой ветке работ. Но если работа была
удалена, комментарий все равно добавится (но только во вкладку
"Документ"). Ошибки синхронизации при этому будут отсутствовать, и это
не является ошибкой мобильного приложения.*
1. Действие добавления комментария к документу выполнять всегда:
- необходимо фиксировать время добавления на сервере;
- в качестве времени добавления комментария считать время
применения действия на сервере;
- в журнал синхронизации при применении должна произойти запись в
формате:
- успешная синхронизация:
`Новый комментарий "текст_комментария" к документу
"название_документа" добавлен`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Новый комментарий "текст_комментария" к документу
"название_документа": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
\ No newline at end of file
#### Добавление файла в хранилище {#sec.offline_add_file}
Исходное поведение [здесь](#sec.files_add).
В режиме оффлайн доступны пункты добавления нового файла "С
устройства" и "Сфотографировать", при их наличии, в меню создания
(`upload_document`). Необходимо фиксировать время добавления
нового файла на устройстве. Добавление файла на сервер должно
происходить по следующему алгоритму.
1. Если на стороне сервера отсутствует доступ к добавлению файла
в указанную папку (отсутствует право «Добавление нового
элемента» / `ADD`), то действие не выполнять. В журнал
синхронизации при этом должна произойти запись в формате:
- условно успешная синхронизация:
`Новый файл "название_файла.расширение" в папку
"название_папки" не добавлен: Недостаточно прав для
выполнения действия`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Новый файл "название_файла.расширение" в папку
"название_папки": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Если на стороне сервера имеется доступ, но в указанной папке
существует файл с таким названием, то действие выполнять
частично: файл должен добавиться с обновленным названием
*'исходное-имя-файла_ГГГГ-ММ-ДД ЧЧ_ММ.расширение'*. В журнал
синхронизации при этом должна произойти запись в формате:
- условно успешная синхронизация:
`Новый файл "итоговое_название_файла.расширение" в папку
"название_папки" добавлен`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Новый файл "итоговое_название_файла.расширение" в папку
"название_папки": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
3. Во всех остальных случаях действие добавления нового файла
должно всегда выполняться:
- необходимо фиксировать время добавления на сервере;
- в качестве времени добавления файла считать время
применения действия на сервере;
- в журнал синхронизации при применении должна произойти
запись в формате:
- успешная синхронизация:
`Новый файл "название_файла.расширение" в папку
"название_папки" добавлен`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Новый файл "название_файла.расширение" в папку
"название_папки": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
\ No newline at end of file
#### Создание папки хранилища {#sec.offline_create_folder}
Исходное поведение [здесь](#sec.files_create).
В режиме оффлайн доступен пункт создания новой папки хранилища,
при наличии, в меню создания (`new_folder`). Валидация на пустое,
некорректное либо совпадающее название папки должно производиться
в момент выполнения действия (а не синхронизации). Необходимо
фиксировать время создания папки на устройстве. Создание
папки на сервере должно происходить по следующему алгоритму.
1. Если на стороне сервера отсутствует доступ к добавлению папки
в указанную папку (отсутствует право «Добавление нового
элемента» / `ADD`), то действие не выполнять. В журнал
синхронизации при этом должна произойти запись в формате:
- условно успешная синхронизация:
`Новая папка "название_папки" в папку "название_папки"
не добавлена: Недостаточно прав для выполнения действия`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Новая папка "название_папки" в папку "название_папки":
ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Если на стороне сервера имеется доступ, но в указанной папке
существует дочерняя папка с таким названием, то действие
выполнять частично: папка должна создаться с обновленным
названием *'исходное-имя-папки_ГГГГ-ММ-ДД ЧЧ_ММ'*. В журнал
синхронизации при этом должна произойти запись в формате:
- условно успешная синхронизация:
`Новая папка "итоговое_название_папки" в папку
"название_папки" добавлена`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Новая папка "итоговое_название_папки" в папку
"название_папки": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
3. Во всех остальных случаях действие создания новой папки
должно всегда выполняться:
- необходимо фиксировать время создания на сервере;
- в качестве времени создания папки считать время
применения действия на сервере;
- в журнал синхронизации при применении должна произойти
запись в формате:
- успешная синхронизация:
`Новая папка "итоговое_название_папки" в папку
"название_папки" добавлена`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Новая папка "итоговое_название_папки" в папку
"название_папки": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
#### Удаление элемента хранилища {#sec.offline_delete_element}
Исходное поведение [здесь](#sec.files_delete).
В режиме оффлайн доступен пункт удаления папки / файла хранилища,
в контекстном меню самого элемента. Необходимо фиксировать время
удаления элемента на устройстве. Удаление на сервере должно
происходить по следующему алгоритму.
*Для элемента - папки.*
1. Если на стороне сервера отсутствует доступ на удаление
папки в указанной папке (отсутствует право «Удаление
элемента» / `DELETE`), то действие не выполнять. В журнал
синхронизации при этом должна произойти запись в формате:
- условно успешная синхронизация:
`Папка "название_папки" не удалена: Недостаточно прав
для выполнения действия`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Удаление папки "название_папки": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Во всех остальных случаях действие удаления папки должно
всегда выполняться:
- необходимо фиксировать время удаления на сервере;
- в качестве времени удаления папки считать время
применения действия на сервере;
- в журнал синхронизации при применении должна произойти
запись в формате:
- успешная синхронизация:
`Удаление папки "название_папки" синхронизировано`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Удаление папки "название_папки": ошибка
синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
*Для элемента - файла.*
1. Если на стороне сервера отсутствует доступ на удаление
файла в указанной папке (отсутствует право «Удаление
элемента» / `DELETE`), то действие не выполнять. В журнал
синхронизации при этом должна произойти запись в формате:
- условно успешная синхронизация:
`Файл "название_файла.расширение" не удален:
Недостаточно прав для выполнения действия`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Удаление файла "название_файла.расширение": ошибка
синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Во всех остальных случаях действие удаления файла должно
всегда выполняться:
- необходимо фиксировать время удаления на сервере;
- в качестве времени удаления файла считать время
применения действия на сервере;
- в журнал синхронизации при применении должна произойти
запись в формате:
- успешная синхронизация:
`Удаление файла "название_файла.расширение"
синхронизировано`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Удаление файла "название_файла.расширение":
ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
### Автономная работа модуля «Файлы» {#sec.offline_files_index}
<#include "offline/files/offline_add_file.md">
<#include "offline/files/offline_create_folder.md">
<#include "offline/files/offline_rename_element.md">
<#include "offline/files/offline_move_element.md">
<#include "offline/files/offline_delete_element.md">
#### Перемещение элемента хранилища {#sec.offline_move_element}
Исходное поведение [здесь](#sec.files_move).
В режиме оффлайн доступен пункт меню "Переместить" папки / файла
хранилища, в контекстном меню самого элемента. Валидация на
совпадающий элемент в папке месторасположения должно производиться
в момент выполнения действия (а не синхронизации). Необходимо
фиксировать время перемещения на устройстве. Перемещение элемента
на сервере должно происходить по следующему алгоритму.
*Для элемента - папки.*
1. Если на стороне сервера отсутствует доступ для перемещения
папки в исходной папке (отсутствует право «Переименование /
Перемещение элемента» / `MOVE`), и/или доступ для добавления
новой папки в папку месторасположения (отсутствует право
«Добавление нового элемента» / `ADD`), то действие не выполнять.
В журнал синхронизации при этом должна произойти запись в
формате:
- условно успешная синхронизация:
`Перемещение папки "название_папки" не синхронизировано:
Недостаточно прав для выполнения действия`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Перемещение папки "итоговое_название_папки":
ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Если на стороне сервера имеется доступ, но при этом в папке
месторасположения существует дочерняя с совпадающим названием
перемещаемой папки, то действие выполнять частично: папка
должна добавиться с обновленным названием
*'переименованное-имя-папки_ГГГГ-ММ-ДД ЧЧ_ММ'*. В журнал
синхронизации при этом должна произойти запись в формате:
- условно успешная синхронизация:
`Папка "итоговое_название_папки" перемещена в
"папка_месторасположения"`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Перемещение папки "итоговое_название_папки": ошибка
синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
3. Во всех остальных случаях действие перемещения папки
должно всегда выполняться:
- необходимо фиксировать время перемещения на сервере;
- в качестве времени перемещения папки считать время
применения действия на сервере;
- в журнал синхронизации при применении должна произойти
запись в формате:
- успешная синхронизация:
`Папка "название_папки" перемещена в
"папка_месторасположения"`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Перемещение папки "название_папки": ошибка
синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
*Для элемента - файла.*
1. Если на стороне сервера отсутствует доступ для перемещения
файла в исходной папке (отсутствует право «Переименование /
Перемещение элемента» / `MOVE`), и/или доступ для добавления
нового файла в папку месторасположения (отсутствует право
«Добавление нового элемента» / `ADD`), то действие не выполнять.
В журнал синхронизации при этом должна произойти запись в
формате:
- условно успешная синхронизация:
`Перемещение файла "название_файла.расширение" не
синхронизировано: Недостаточно прав для выполнения
действия`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Перемещение файла "название_файла.расширение": ошибка
синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Если на стороне сервера имеется доступ, но при этом в папке
месторасположения существует файл с совпадающим названием
перемещаемого файла, то действие выполнять частично:
файл должен добавиться с обновленным названием
*'переименованное-имя-файла_ГГГГ-ММ-ДД ЧЧ_ММ.расширение'*.
В журнал синхронизации при этом должна произойти запись в
формате:
- условно успешная синхронизация:
`Файл "итоговое_название_файла.расширение" перемещен в
"папка_месторасположения"`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Перемещение файла "итоговое_название_файла.расширение":
ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
3. Во всех остальных случаях действие перемещения файла
должно всегда выполняться:
- необходимо фиксировать время перемещения на сервере;
- в качестве времени перемещения файла считать время
применения действия на сервере;
- в журнал синхронизации при применении должна произойти
запись в формате:
- успешная синхронизация:
`Файл "название_файла.расширение" перемещен в
"папка_месторасположения"`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Перемещение файла
"итоговое_название_файла.расширение": ошибка
синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
\ No newline at end of file
#### Переименование элемента хранилища {#sec.offline_rename_element}
Исходное поведение [здесь](#sec.files_rename).
В режиме оффлайн доступен пункт меню "Переименовать" папки /
файла хранилища, в контекстном меню самого элемента. Валидация
на пустое, некорректное либо совпадающее название элемента
должно производиться в момент выполнения действия (а не
синхронизации). Необходимо фиксировать время переименования
на устройстве. Переименование элемента на сервере должно
происходить по следующему алгоритму.
*Для элемента - папки.*
1. Если на стороне сервера отсутствует доступ для переименования
папки в указанной папке (отсутствует право «Переименование /
Перемещение элемента» / `MOVE`), то действие не выполнять. В
журнал синхронизации при этом должна произойти запись в
формате:
- условно успешная синхронизация:
`Переименование папки "итоговое_название_папки" не
синхронизировано: Недостаточно прав для выполнения
действия`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Переименование папки "итоговое_название_папки":
ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Если на стороне сервера имеется доступ, но при этом в
родительской папке существует дочерняя с совпадающим
названием переименованной папки, то действие выполнять
частично: папка должна добавиться с обновленным названием
*'переименованное-имя-папки_ГГГГ-ММ-ДД ЧЧ_ММ'*. В журнал
синхронизации при этом должна произойти запись в формате:
- условно успешная синхронизация:
`Переименование папки синхронизировано, новое значение:
"итоговое_название_папки"`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Переименование папки "итоговое_название_папки": ошибка
синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
3. Во всех остальных случаях действие переименование папки
должно всегда выполняться:
- необходимо фиксировать время переименования на сервере;
- изменение названия папки хранилища должно примениться,
даже если название на сервере не совпадает с исходным
названием в оффлайне;
- в качестве времени переименования папки считать время
применения действия на сервере;
- в журнал синхронизации при применении должна произойти
запись в формате:
- успешная синхронизация:
`Переименование папки синхронизировано, новое
значение: "итоговое_название_папки"`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Переименование папки "итоговое_название_папки":
ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
*Для элемента - файла.*
1. Если на стороне сервера отсутствует доступ для переименования
файла в указанной папке (отсутствует право «Переименование /
Перемещение элемента» / `MOVE`), то действие не выполнять. В
журнал синхронизации при этом должна произойти запись в
формате:
- условно успешная синхронизация:
`Переименование файла "итоговое_название_файла.расширение"
не синхронизировано: Недостаточно прав для выполнения
действия`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Переименование файла "итоговое_название_файла.расширение":
ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Если на стороне сервера имеется доступ, но при этом в
родительской папке существует файл с совпадающим названием
переименованного файла, то действие выполнять частично:
файл должен добавиться с обновленным названием
*'переименованное-имя-файла_ГГГГ-ММ-ДД ЧЧ_ММ.расширение'*.
В журнал синхронизации при этом должна произойти запись в
формате:
- условно успешная синхронизация:
`Переименование файла синхронизировано, новое значение:
"итоговое_название_файла.расширение"`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Переименование файла "итоговое_название_файла.расширение":
ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
3. Во всех остальных случаях действие переименование файла
должно всегда выполняться:
- необходимо фиксировать время переименования на сервере;
- изменение названия файла хранилища должно примениться,
даже если название на сервере не совпадает с исходным
названием в оффлайне;
- в качестве времени переименования файла считать время
применения действия на сервере;
- в журнал синхронизации при применении должна произойти
запись в формате:
- успешная синхронизация:
`Переименование файла синхронизировано, новое
значение: "итоговое_название_файла.расширение"`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Переименование файла
"итоговое_название_файла.расширение": ошибка
синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
Полная синхронизация {#sec.offline_full_synchronization}
--------------------
Под полной синхронизацией будем понимать синхронизацию следующих данных:
* по модулю "Работы":
- [список фильтров потоков работ](#sec.workflow_filters):
- загружаются все основные фильтры;
- загружаются все остальные подфильтры пользователя любого
уровня вложенности;
- [список работ](#sec.workflow_works):
- загружаются весь список работ пользователя всех его корневых
фильтров;
- загружаются последние 30 работ каждого из остальных
подфильтров;
- загружается вся информация с плашки загружаемой работы;
- дочерние работы не загружаются;
- [информация о работе](#sec.workflow_workinfo):
- панель с параметрами работы;
- панель формы завершения;
- панель комментариев;
- панель вложений;
- управляющие кнопки;
* по модулю "Документы":
- [список фильтров документов](#sec.documents_filters):
- загружаются все основные фильтры;
- загружаются все остальные подфильтры пользователя любого
уровня вложенности;
- список документов [для смартфона](#sec.documents_list),
[для планшета](#sec.documents_list_tablet):
- загружаются последние 30 документов каждого из основных
фильтров и всех остальных подфильтров;
- загружается вся информация с плашки загружаемого документа;
- дочерние документы не загружаются;
- [информация о документе](#sec.documents_docinfo):
- панель с параметрами документа;
- панель с параметрами работ по документу;
- панель формы завершения;
- панель комментариев;
- панель вложений;
- управляющие кнопки;
* по модулю "Файлы":
- [список папок хранилища](#sec.documents_filters):
- загружаются все папки хранилища любого уровня вложенности;
- [список файлов](#sec.workflow_works):
- загружается весь список файлов всех папок;
- загружается вся информация с плашки загружаемого файла.
Данные в *панели с параметрами документа* должны синхронизироваться
полностью: все формулировки, пользователи и прочие данные (которые
аналогичны плашке документа смартфона).
Данные в *панели с параметрами работы* должны синхронизироваться
полностью: полная формулировка работы, автор и ответственный, сроки и
прогресс работы.
Данные в *панели формы завершения* должны синхронизироваться следующим
образом - форма завершения должна синхронизироваться полностью, а
результат завершения:
- "комментарий" - должен синхронизироваться полностью;
- "файл" - иконка и название файла должны синхронизироваться
всегда и полностью, а сам файл - согласно настройки загрузки
вложений;
- "форма" - иконка и название файла должны синхронизироваться
всегда и полностью, а сама форма - не загружается.
Данные в *панели комментариев* должны синхронизироваться полностью:
иконки, автор, текст и время написания комментария, а также их общее
количество с возможностью перейти ко всем комментариям. Должны
синхронизироваться все комментарии из всех категорий.
Данные в *панели вложений* должны синхронизироваться следующим образом:
- иконка и название файла должны синхронизироваться всегда и
полностью, а также их общее количество с возможностью перейти ко
всем вложениям;
- сами файлы (исключая файлы по форме) - согласно настройки загрузки
вложений.
Таким образом должны синхронизироваться все вложения (исключая файлы
по форме) всех загружаемых работ пользователя.
> *Примечание.*
>
> Файлы в модуле "Файлы" не должны синхронизироваться, независимо от
> настроек приложения.
Данные *управляющих кнопок* должны синхронизироваться полностью: ее
наличие, название и цвет. По их нажатию в режиме оффлайн ничего
происходить не должно.
Полная синхронизация должна происходить в следующих случаях:
- по заданному периоду синхронизации (период рассчитывается
относительно последней успешной синхронизации);
- при ручном запуске синхронизации через навигатор.
Запуск процесса синхронизации никакими сообщениями пользователя не
уведомляет. Прогресс можно видеть только в нижней панели навигатора
любого модуля. Сам же процесс синхронизации должен
[логироваться](#sec.offline_journal_synchronization).
![Прогресс процесса синхронизации](resources/img/offline/navigator_in_process.png)
В случае неуспешного завершения процесса (в т.ч. обрыв соединения /
отказ сервера / отказ устройства) нижняя панель навигатора должна
отобразить предыдущее сообщение, какие-либо уведомления отсутствуют.
В случае же успешного завершения процесса синхронизации нижняя панель
навигатора должна отобразить новое сообщение, какие-либо уведомления
также отсутствуют.
Оффлайн-работа с приложением {#sec.offline}
============================
> **Примечание**
>
> Оффлайн-работа с мобильным клиентом осуществляется только для
> включенного флажка "Синхронизировать данные для автономной работы"
> ([Настройки приложения](#sec.settings)) и только при наличии данных
> хотя бы одной успешной синхронизации.
<#include "offline/offline_full_synchronization.md">
<#include "offline/offline_partial_synchronization.md">
<#include "offline/offline_work.md">
<#include "offline/offline_journal_synchronization.md">
Журнал синхронизации {#sec.offline_journal_synchronization}
--------------------
Один процесс синхронизации должен оформляться в отдельную панель. Каждая
панель содержит заголовок в формате:
`Синхронизация от ГГГГ-ММ-ДД ЧЧ:ММ`,
где ГГГГ-ММ-ДД ЧЧ:ММ - дата и время завершения процесса синхронизации.
Каждую панель можно сворачивать/разворачивать, нажимая по заголовку
самой панели. Ограничений на количество одновременно развернутых панелей
нет.
Свернутая панель содержит только заголовок с иконкой разворачивания.
Развернутая панель, в свою очередь, содержит заголовок с иконкой
сворачивания и содержимое панели. Иконка:
![](resources/img/offline/collapse_expand.png).
По умолчанию, при открытии экрана все панели свернуты (илл. «Журнал
синхронизации, вид по умолчанию»).
![Журнал синхронизации, вид по умолчанию](resources/img/offline/journal_android_2.png)
![Журнал синхронизации, вид по умолчанию](resources/img/offline/journal_ios_2.png)
Содержимое развернутой панели (илл. «Журнал синхронизации»):
- `Синхронизация начата`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- В зависимости от успешности синхронизации:
- успешная синхронизация:
`Работа "название_работы" синхронизирована`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Работа "название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
*Такая запись на каждую синхронизируемую работу*
- успешная синхронизация:
`Документ "название_документа" синхронизирован`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Документ "название_документа": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
*Такая запись на каждый синхронизируемый документ*
- успешная синхронизация:
`Элемент хранилища "название_папки_или_файла_с_расширением"
синхронизирован`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Элемент хранилища "название_папки_или_файла_с_расширением":
ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
*Такая запись на каждую синхронизируемую папку или файл хранилища*
- В зависимости от успешности всех записей синхронизации:
- успешная синхронизация (когда каждая запись имеет статус
"успешная" либо "условно успешная"):
`Синхронизация завершена успешно`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация (когда хотя бы одна запись имеет статус
"неуспешная"):
`Синхронизация завершена не успешно`
`ГГГГ-ММ-ДД ЧЧ:ММ`
Каждая запись (кроме первой и последней) синхронизации имеет иконку
согласно статуса успешности:
- успешная синхронизация - зеленая галочка
![](resources/img/offline/success.png)
- условно успешная синхронизация - желтая галочка
![](resources/img/offline/almost_success.png)
- неуспешная синхронизация - красный перечеркнутый круг
![](resources/img/offline/unsuccess.png)
![Журнал синхронизации](resources/img/offline/journal_android.png)
![Журнал синхронизации](resources/img/offline/journal_ios.png)
Журнал должен заполняться в режиме реального времени. В случае 5 подряд
неуспешных записей процесс синхронизации должен прерваться как
"неуспешный".
Экран имеет фиксированную высоту, в конце экрана всегда располагается
кнопка "Очистить" (серого цвета, идентификатор NOT_PREFERRED). Область
между верхней панелью и данной кнопкой прокручивается. По нажатию на
кнопку выдается сообщение "Очистить журнал синхронизации?" и при
положительном ответе очищается весь экран логов.
В журнале синхронизации необходимо хранить данные максимум 20-ти
последних успешных процессов синхронизации. На количество хранимых
неуспешных процессов синхронизации накладывается только одно
ограничение: неуспешная синхронизация по времени завершения должна
находиться в промежутке между первой по времени успешной и любой
последней. Каждый новый успешный процесс синхронизации удаляет первый по
времени успешный процесс, а также все неуспешные, которые оказались в
промежутке между 19-м и 20-м успешными процессами.
### Добавление нового комментария к работе {#sec.offline_new_comment}
В режиме оффлайн доступна кнопка добавления нового комментария как на
экране информации о работе, так и на экране всех комментариев.
Необходимо фиксировать время добавления нового комментария на
устройстве и использовать его в качестве отображаемого времени последнего
изменения на плашке комментария в формате "ДД месяца ЧЧ:ММ". Добавление
на сервер должно происходить по следующему алгоритму.
1. Если комментарий добавляется к удаленной работе, то действие не
выполнять. В журнал синхронизации при этом должна произойти запись в
формате:
- условно успешная синхронизация:
`Новый комментарий "текст_комментария" к работе
"название_работы" не добавлен: Вы не можете создавать
комментарии для удаленной работы`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Новый комментарий "текст_комментария" к работе
"название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Если комментарий добавляется не к удаленной работе, то действие
выполнять:
- необходимо фиксировать время добавления на сервере;
- в качестве времени добавления комментария считать время
применения действия на сервере;
- в журнал синхронизации при применении должна произойти запись в
формате:
- успешная синхронизация:
`Новый комментарий "текст_комментария" к работе
"название_работы" добавлен`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Новый комментарий "текст_комментария" к работе
"название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
\ No newline at end of file
Синхронизация по запросу пользователя {#sec.offline_partial_synchronization}
-------------------------------------
Под синхронизацией по запросу пользователя будем понимать синхронизацию
списка работ и документов (но не файлов) того фильтра, из которого был
вызван сам процесс. Процесс может быть осуществлен только при наличии
данных полной синхронизации, иначе необходимо выдавать сообщение:
`На устройстве отсутствуют данные синхронизации`
Процесс синхронизации по запросу пользователя может быть вызван только
вручную, при обновлении списка работ / документов свайпом вниз в любом
из фильтров.
Если синхронизация по запросу пользователя вызывается в момент, когда
идет процесс любой другой синхронизации, необходимо не выполнять действие
и выдавать сообщение:
`Синхронизация в данный момент невозможна`
Отображение прогресса и журнала синхронизации полностью аналогичны
процессу [полной синхронизации](#sec.offline_full_synchronization).
Автономная работа {#sec.offline_work}
-----------------
*1. Отсутствует соединение с сервером и при этом открывается приложение.*
Приложение сразу загружается в автономном режиме, авторизация
происходит по сохраненным на устройстве данным (из менеджера
аккаунтов).
*2. Приложение открыто и работает в режиме онлайн, соединение с сервером
пропало.*
После обрыва соединения с сервером (обрыв соединения / отказ сервера)
выполнение любого следующего действия (обновление списка, открытие
дочерних элементов / навигатора / информации о работе либо документе /
вызов меню / нажатие на любую кнопку) приводит к тому, что приложение
должно переключиться в автономный режим и должны загрузиться данные
синхронизации. При этом на 10 секунд под верхней панелью любого
экрана (за исключением экрана авторизации) на всю ширину экрана должна
отобразиться полоска с иконкой ![](resources/img/offline/icon_offline.png)
и сообщением:
`Включен автономный режим`
![Сообщение о переходе в автономный режим](resources/img/offline/offline_message.png)
![Сообщение о переходе в автономный режим](resources/img/offline/offline_message_ios.png)
*3. Приложение открыто и работает в режиме оффлайн, установилось
соединение с сервером.*
Аналогично предыдущему пункту: после установления соединения с
сервером выполнение любого следующего действия (обновление списка,
открытие дочерних элементов / навигатора / информации о работе либо
документе / вызов меню / нажатие на любую кнопку) приводит к тому,
что приложение должно переключиться в режим онлайн и должны сначала
отправиться измененные в автономном режиме данные на сервер, затем
загрузиться актуальные данные с сервера. При этом на 10 секунд под
верхней панелью любого экрана (за исключением экрана авторизации)
на всю ширину экрана должна отобразиться полоска с иконкой
![](resources/img/offline/icon_online.png) и сообщением:
`Связь восстановлена`
![Сообщение о переходе в режим онлайн](resources/img/offline/online_message.png)
![Сообщение о переходе в режим онлайн](resources/img/offline/online_message_ios.png)
> **Примечание**
>
> Размер, шрифт и цвет текста для оффлайна - 7pt, HelveticaNeueCyr
> Light, #e7eafa.
>
> Размер, шрифт и цвет текста для онлайна - 7pt, HelveticaNeueCyr
> Light, #8fdd94.
>
> Цвет фона сообщения - #05091f с прозрачностью 50 %, высота - 42px.
>
> Цвет линии после фона - #121927, размер - 1px.
Работа приложения в автономном режиме подразумевает:
* В модуле «Работы»:
* отображение и выбор любого из фильтров навигатора модуля;
* отображение списка работ согласно выбранного фильтра;
* отображение информации о работе;
* отображение всех комментариев любой из трех категорий,
возможность добавления / изменения / удаления комментариев;
* отображение списка и, опционально, содержимого всех
вложений к работе, возможность добавления / удаления
вложений;
* изменение прогресса работы;
* завершение работы (в т.ч. с формой завершения).
* В модуле «Документы»:
* отображение и выбор любого из фильтров навигатора модуля;
* отображение списка документов согласно выбранного фильтра
(как в неполном виде, так и в полном);
* отображение информации о документе, в т.ч. о работах по
документу;
* отображение всех комментариев любой из трех категорий,
возможность добавления / изменения / удаления комментариев;
* отображение списка и, опционально, содержимого всех
вложений к документу, возможность добавления / удаления
вложений;
* изменение прогресса работы по документу;
* завершение работы по документу (в т.ч. с формой
завершения).
* В модуле «Файлы»:
* отображение и выбор любой ноды дерева хранилища;
* отображение списка (но не содержимого) файлов выбранной
папки;
* добавление файла в хранилище;
* создание папки хранилища;
* переименование элемента хранилища;
* перемещение элемента хранилища;
* удаление элемента хранилища.
По нажатию на незагруженные при синхронизации файлы хранилища /
вложения работы или документа ничего происходить не должно (ни
скачивания, ни ошибок).
При этом по нажатию на файлы и вложения, загруженные в режиме
оффлайн, должно происходить их открытие.
Аналогично для всех прочих неописанных кнопок и пунктов меню:
по их нажатию ничего происходить не должно (ни выполнение
действия, ни ошибок).
Выполнение любого из пунктов, в результате действия которого
должно изменяться состояние соответствующего объекта, должно
изменять эти атрибуты и в автономном режиме также, как это
происходит в режиме онлайн.
Например, изменение прогресса работы в экране информации о
работе должно изменить прогресс и на плашке соответствующей
работы.
<#include "offline/work/offline_work_index.md">
<#include "offline/documents/offline_document_index.md">
<#include "offline/files/offline_files_index.md">
#### Добавление файла к работе {#sec.offline_work_add_file}
Исходное поведение [здесь](#sec.workflow_attachments).
В режиме оффлайн доступны пункты меню добавления нового файла "Файл
с устройства" и "Фото" (но не "Файл с хранилища") как на экране
информации о работе, так и на экране всех вложений. Необходимо
фиксировать время добавления нового файла на устройстве. Добавление
на сервер должно происходить по следующему алгоритму.
1. Если на стороне сервера доступ к добавлению файла в папку
"Приложения" был закрыт, то действие выполнять частично: этот
файл необходимо добавить, но в папку "Прочие". В журнал
синхронизации при этом должна произойти запись в формате:
- условно успешная синхронизация:
`Новый файл "название_файла.расширение" к работе
"название_работы" добавлен в папку "Прочие": Отсутствует
доступ к папке "Приложения"`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Новый файл "название_файла.расширение" к работе
"название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Во всех остальных случаях действие добавления нового файла должно
всегда выполняться:
- необходимо фиксировать время добавления на сервере;
- в качестве времени добавления файла считать время применения
действия на сервере;
- в журнал синхронизации при применении должна произойти запись
в формате:
- успешная синхронизация:
`Новый файл "название_файла.расширение" к работе
"название_работы" добавлен`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Новый файл "название_файла.расширение" к работе
"название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
\ No newline at end of file
#### Удаление комментария работы {#sec.offline_work_delete_comment}
Исходное поведение [здесь](#sec.workflow_comments).
В режиме оффлайн доступен пункт меню "Удалить" комментария, при его
наличии, как на экране информации о работе, так и на экране всех
комментариев. Необходимо фиксировать время удаления комментария на
устройстве. Удаление с сервера должно происходить по следующему
алгоритму.
1. Если на стороне сервера данный комментарий был удален, то действие
не выполнять. В журнал синхронизации при этом должна произойти
запись в формате:
- условно успешная синхронизация:
`Удаление комментария "текст_комментария" к работе
"название_работы" не синхронизировано: Комментарий невозможно
удалить, так как он уже удален`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Удаление комментария "текст_комментария" к работе
"название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Если на стороне сервера комментарий не был удален, то:
- необходимо фиксировать время удаления на сервере;
- удаленный комментарий должен удалиться и на сервере;
- в качестве времени удаления комментария считать время удаления
на сервере;
- в журнал синхронизации при применении должна произойти запись в
формате:
- успешная синхронизация:
`Удаление комментария "текст_комментария" к работе
"название_работы" синхронизировано`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Удаление комментария "текст_комментария" к работе
"название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
\ No newline at end of file
#### Удаление файла работы {#sec.offline_work_delete_file}
Исходное поведение [здесь](#sec.workflow_attachments).
В режиме оффлайн доступен пункт меню "Удалить" вложения, при его
наличии, как на экране информации о работе, так и на экране всех
вложений. Необходимо фиксировать время удаления вложения на устройстве.
Удаление с сервера должно происходить по следующему алгоритму.
1. Если на стороне сервера данный файл был удален, то действие не
выполнять. В журнал синхронизации при этом должна произойти запись в
формате:
- условно успешная синхронизация:
`Удаление файла "название_файла.расширение" работы
"название_работы" не синхронизировано: Файл удален`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Удаление файла "название_файла.расширение" работы
"название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Если на стороне сервера доступ к удалению файла в папке "Приложения"
был закрыт, то действие не выполнять. В журнал синхронизации при
этом должна произойти запись в формате:
- условно успешная синхронизация:
`Удаление файла "название_файла.расширение" работы
"название_работы" не синхронизировано: Отсутствует доступ к
папке "Приложения"`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Удаление файла "название_файла.расширение" работы
"название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
3. Если на стороне сервера файл не был удален и есть доступ на его
удаление, то:
- необходимо фиксировать время удаления на сервере;
- удаленный файл должен удалиться и на сервере;
- в качестве времени удаления файла считать время удаления на
сервере;
- в журнал синхронизации при применении должна произойти запись в
формате:
- успешная синхронизация:
`Удаление файла "название_файла.расширение" работы
"название_работы" синхронизировано`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Удаление файла "название_файла.расширение" работы
"название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
#### Редактирование комментария работы {#sec.offline_work_edit_comment}
Исходное поведение [здесь](#sec.workflow_comments).
В режиме оффлайн доступен пункт меню "Изменить" комментария, при его
наличии, как на экране информации о работе, так и на экране всех
комментариев. Необходимо фиксировать время изменения комментария на
устройстве и использовать его в качестве отображаемого времени последнего
изменения на плашке комментария в формате "ДД месяца ЧЧ:ММ". Применение
изменений на сервер должно происходить по следующему алгоритму.
1. Если на стороне сервера данный комментарий был удален, то действие
не выполнять. В журнал синхронизации при этом должна произойти
запись в формате:
- условно успешная синхронизация:
`Изменение комментария "текст_комментария" к работе
"название_работы" не синхронизировано: Комментарий невозможно
изменить, так как он удален`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Изменение комментария "текст_комментария" к работе
"название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Если на стороне сервера комментарий не был удален, то:
- необходимо фиксировать время применения действия на сервере;
- измененный комментарий должен примениться, даже если комментарий
на сервере не совпадает с исходным комментарием в оффлайне;
- в качестве времени изменения комментария считать время
применения действия на сервере;
- в журнал синхронизации при применении должна произойти запись в
формате:
- успешная синхронизация:
`Изменение комментария к работе "название_работы"
синхронизировано, новое значение: "текст_комментария"`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Изменение комментария "текст_комментария" к работе
"название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
#### Изменение прогресса работы {#sec.offline_work_edit_progress}
Исходное поведение [здесь](#sec.workflow_work_information).
В режиме оффлайн ползунок прогресса работы, при его наличии, доступен
для редактирования. Необходимо фиксировать время последнего изменения
прогресса на устройстве. Применение измененного в оффлайне значения
прогресса должно происходить по следующему алгоритму.
1. Если на стороне сервера данная работа уже завершена (хоть статусом,
хоть прогрессом), то действие не выполнять. В журнал синхронизации
при этом должна произойти запись в формате:
- условно успешная синхронизация:
`Изменение прогресса работы "название_работы" не
синхронизировано: Действие не может быть выполнено, так как
процесс завершен`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Изменение прогресса работы "название_работы": ошибка
синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Если на стороне сервера данная работа не завершена, то:
- необходимо фиксировать время применения действия на сервере;
- значение измененного прогресса должно примениться, даже если
значение прогресса на сервере не совпадает с исходным значением
прогресса в оффлайне;
- в качестве времени изменения прогресса считать время применения
действия на сервере;
- в журнал синхронизации при применении должна произойти запись в
формате:
- успешная синхронизация:
`Изменение прогресса работы "название_работы"
синхронизировано, новое значение - NN%`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Изменение прогресса работы "название_работы": ошибка
синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
\ No newline at end of file
#### Завершение работы {#sec.offline_work_end_work}
Исходное поведение [здесь](#sec.workflow_work_end) и
[здесь](#sec.workflow_work_result).
В режиме оффлайн доступны, при наличии, кнопки "Завершить"
(идентификаторы операции PROGRESS, POINT_RESULT, RESOLUTION_ACTION),
"Ответить" (идентификатор операции PROCESS), "Результат" (идентификатор
действия RESULT) и ползунок прогресса работы для выставления 100%.
Необходимо фиксировать время завершения на устройстве. Применение
статуса завершенности работы должно происходить по следующему алгоритму.
1. Для работ без формы завершения: если на стороне сервера данная
работа была завершена (хоть статусом, хоть прогрессом), то
действие не выполнять. В журнал синхронизации при этом должна
произойти запись в формате:
- условно успешная синхронизация:
`Завершение работы "название_работы" не синхронизировано:
Действие не может быть выполнено, так как процесс завершен`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Завершение работы "название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Для работ с формой завершения "файл": если на стороне сервера данная
работа была завершена (хоть статусом, хоть прогрессом), то действие
выполнять частично: этот файл или форму необходимо добавить в
"Прочие". В журнал синхронизации при этом должна произойти запись в
формате:
- условно успешная синхронизация:
`Завершение работы "название_работы" не синхронизировано:
Действие не может быть выполнено, так как процесс завершен (в
"Прочие" добавлен файл формы завершения)`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Завершение работы "название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
> **Замечание**
>
> Файл в "Прочие" должен добавляться в любом случае. Если файл с
> таким же названием существует в "Приложениях", то он должен просто
> добавиться в "Прочие". Если же в "Прочих" существует файл с таким
> названием, то он все равно должен добавиться как отдельный файл с
> обновленным названием *'исходное-имя-файла_ГГГГ-ММ-ДД
> ЧЧ_ММ.расширение'*.
3. Для работ с формой завершения "комментарий": если на стороне сервера
данная работа была завершена (хоть статусом, хоть прогрессом), то
действие выполнять частично: этот комментарий необходимо добавить к
работе как "обычный" комментарий. В журнал синхронизации при этом
должна произойти запись в формате:
- условно успешная синхронизация:
`Завершение работы "название_работы" не синхронизировано:
Действие не может быть выполнено, так как процесс завершен
(комментарий добавлен к работе как обычный)`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Завершение работы "название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
4. Для работ без формы завершения: если на стороне сервера данная
работа была удалена, то действие не выполнять. В журнал
синхронизации при этом должна произойти запись в формате:
- условно успешная синхронизация:
`Завершение работы "название_работы" не синхронизировано:
Действие не может быть выполнено, так как процесс завершен`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Завершение работы "название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
5. Для работ с формой завершения "файл": если на стороне сервера данная
работа была удалена, то действие выполнять частично: этот файл или
форму необходимо добавить в "Прочие". В журнал синхронизации при
этом должна произойти запись в формате:
- условно успешная синхронизация:
`Завершение работы "название_работы" не синхронизировано:
Действие не может быть выполнено, так как процесс завершен (в
"Прочие" добавлен файл формы завершения)`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Завершение работы "название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
> **Замечание**
>
> Файл в "Прочие" должен добавляться в любом случае. Если файл с
> таким же названием существует в "Приложениях", то он должен просто
> добавиться в "Прочие". Если же в "Прочих" существует файл с таким
> названием, то он все равно должен добавиться как отдельный файл с
> обновленным названием *'исходное-имя-файла_ГГГГ-ММ-ДД
> ЧЧ_ММ.расширение'*.
6. Для работ с формой завершения "комментарий": если на стороне сервера
данная работа была удалена, то действие не выполнять. В журнал
синхронизации при этом должна произойти запись в формате:
- условно успешная синхронизация:
`Завершение работы "название_работы" не синхронизировано:
Действие не может быть выполнено, так как процесс завершен
(комментарий не добавлен к работе)`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Завершение работы "название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
7. Работы с формой завершения "форма" в режиме оффлайн завершить
никак нельзя, т.к. содержимое файлов по форме никогда не
синхронизируется.
8. Для всех остальных случаев:
- необходимо фиксировать время применения действия на сервере;
- должен примениться статус завершенности со всеми сопутствующими
параметрами завершения:
- идентификаторы операции PROGRESS / RESOLUTION_ACTION:
результат операции (завершено);
- идентификаторы операции POINT_RESULT: форма завершения
комментарий, файл (в т.ч. выбранный из работы, добавленный с
устройства или с камеры);
*Примечание:* в список завершения работы "Из работы" (для
формы завершения - файла) попадают как синхронизированные
данные, так и файлы, добавленные в режиме оффлайна (пункт
"Перепорученные" при этом недоступен, нельзя выбрать
результат перепорученных работ).
- идентификаторы операции PROCESS: добавлены ли подпись и
комментарий и результат операции (ознакомился, согласен/не
согласен, утвердил/не утвердил);
- идентификатор действия RESULT: результат действия
подтверждено или отклонено (включая измененные сроки и
прогресс, комментарий-причина);
- в качестве времени изменения прогресса считать время применения
действия на сервере;
- в журнал синхронизации при применении должна произойти запись в
формате:
- успешная синхронизация:
`Завершение работы "название_работы" синхронизировано`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Завершение работы "название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
\ No newline at end of file
#### Добавление нового комментария к работе {#sec.offline_work_new_comment}
Исходное поведение [здесь](#sec.workflow_comments).
В режиме оффлайн доступен пункт меню "Комментарий" для добавления нового
комментария как на экране информации о работе, так и на экране всех
комментариев. Необходимо фиксировать время добавления нового комментария
на устройстве и использовать его в качестве отображаемого времени
на плашке комментария в формате "ДД месяца ЧЧ:ММ". Добавление на сервер
должно происходить по следующему алгоритму.
1. Если комментарий добавляется к удаленной работе, то действие не
выполнять. В журнал синхронизации при этом должна произойти запись в
формате:
- условно успешная синхронизация:
`Новый комментарий "текст_комментария" к работе
"название_работы" не добавлен: Вы не можете создавать
комментарии для удаленной работы`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Новый комментарий "текст_комментария" к работе
"название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
2. Если комментарий добавляется не к удаленной работе, то действие
выполнять:
- необходимо фиксировать время добавления на сервере;
- в качестве времени добавления комментария считать время
применения действия на сервере;
- в журнал синхронизации при применении должна произойти запись в
формате:
- успешная синхронизация:
`Новый комментарий "текст_комментария" к работе
"название_работы" добавлен`
`ГГГГ-ММ-ДД ЧЧ:ММ`
- неуспешная синхронизация:
`Новый комментарий "текст_комментария" к работе
"название_работы": ошибка синхронизации`
`ГГГГ-ММ-ДД ЧЧ:ММ`
\ No newline at end of file
### Автономная работа модуля «Работы» {#sec.offline_work_index}
<#include "offline/work/offline_edit_progress.md">
<#include "offline/work/offline_end_work.md">
<#include "offline/work/offline_new_comment.md">
<#include "offline/work/offline_edit_comment.md">
<#include "offline/work/offline_delete_comment.md">
<#include "offline/work/offline_add_file.md">
<#include "offline/work/offline_delete_file.md">
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<chapter id="sec.autorise">
<title>Авторизация пользователя</title>
<para>Входные данные, необходимые для авторизации пользователя (<xref linkend="fig.autorise_window"/>):</para>
<itemizedlist>
<listitem>
<para>логин (обяз.)</para>
</listitem>
<listitem>
<para>пароль (обяз.)</para>
</listitem>
<listitem>
<para>хост (обяз.)</para>
<para>Элементы на экране - поля ввода. Поля ввода должны иметь соответствующие плейсхолдеры:</para>
</listitem>
</itemizedlist>
<figure id="fig.autorise_window">
<title>Экран авторизации</title>
<graphic fileref="resources/img/autorise/authorization.png" align="center"/>
</figure>
<para>В поле &quot;Хост&quot; должен быть указан только хост сервера и название приложения. Если сервер работает не на дефолтном порту (80), то указывается &quot;Хост:порт&quot;. Например, <emphasis role="italic">somehost/Synergy</emphasis> или <emphasis role="italic">somehost:8080/Synergy</emphasis>.</para>
<para>При первом подключении приложение должно попытаться привести URL, введенный пользователем, к рабочему по правилам описанным ниже:</para>
<itemizedlist>
<listitem>
<para>если не введен протокол (<emphasis role="italic">http://</emphasis> или <emphasis role="italic">https://</emphasis>) приложение должно добавлять его при отправке запросов (<emphasis role="italic">http</emphasis> для выключенного переключателя &quot;Шифрованное соединение&quot;, и в обратном случае - <emphasis role="italic">https</emphasis>);</para>
</listitem>
<listitem>
<para>если адрес не заканчивается на &quot;/&quot;, то добавлять его автоматически;</para>
</listitem>
<listitem>
<para>если не удается подключиться по адресу, указанному в строке, попробовать подключиться к серверу по адресу
<emphasis role="italic">&quot;значение_поля_хост&quot; + (&quot;/&quot; если необходимо) + Synergy</emphasis>.</para>
</listitem>
</itemizedlist>
<para>Ниже поля &quot;Хост&quot; находится элемент - переключатель &quot;Шифрованное соединение&quot;, показывающий необходимо ли использовать шифрованный канал. Значение по умолчанию - &quot;Вкл&quot;.</para>
<para>Ниже переключателя &quot;Шифрованное соединение&quot; находится элемент - переключатель &quot;Запомнить меня&quot;. Значение по умолчанию - &quot;Выкл&quot;. Для включенного флажка параметры авторизации должны записаться в менеджер аккаунтов на устройстве и при следующем входе в приложение авторизация должна происходить автоматически и в фоне. Для выключенного флажка - это же окно авторизации.</para>
<para>Имеется возможность автоматического заполнения полей &quot;Логин&quot; и &quot;Хост&quot; с помощью считывания QR-кода из пользовательских настроек Synergy (<xref linkend="fig.autorise_settings_qr_code"/>). По нажатию на кнопку в поле хоста с иконкой камеры должен запуститься считыватель QR-кодов. При успешном считывании на экране авторизации автоматически должны заполниться поля логина и хоста, независимо от предыдущего содержания данных полей. </para>
<figure id="fig.autorise_settings_qr_code">
<title>Параметры авторизации пользователя с QR-кодом</title>
<graphic fileref="resources/img/autorise/settings_qr_code.png" align="center" arch=""/>
</figure>
<para>Пользователь нажимает на кнопку &quot;Войти&quot;. Возможно исполнение альтернативных потоков событий 1, 2. Если пользователь ввел протокол <emphasis role="italic">https</emphasis>, то переключателю &quot;Шифрованное соединение&quot; должно автоматически присваиваться значение &quot;Вкл&quot;. В случае успешной аутентификации пользователь попадает на главную страницу модуля по умолчанию, указанного в настройках приложения (<xref linkend="sec.settings"/>). После успешной авторизации возможно исполнение альтернативного потока событий 3.</para>
<note>
<para>Мобильный клиент не поддерживает одновременную авторизацию двух и более пользователей на одном устройстве.</para>
</note>
<para>По нажатию на кнопку &quot;Назад&quot; происходит выход из приложения (<xref linkend="sec.app_exit"/>).</para>
<para><emphasis role="bold">
<emphasis role="underline">Альтернативные потоки событий.</emphasis>
</emphasis></para>
<para><emphasis role="italic">Альтернативный поток 1. Не заполнены обязательные поля.</emphasis></para>
<para>Клиент информирует &quot;Заполните все поля&quot;, действие не осуществляется.</para>
<para><emphasis role="italic">Альтернативный поток 2. Некорректные введенные данные.</emphasis></para>
<para>При ошибке в поле хоста система информирует &quot;Невозможно подключиться к серверу&quot;, действие не выполняется.</para>
<para>Для корректного хоста, но при ошибке в паре логин/пароль система информирует &quot;Вход невозможен. Неверный логин/пароль&quot;, действие не выполняется..</para>
<para><emphasis role="italic">Альтернативный поток 3. Версия основного приложения Synergy ниже требуемой (<xref linkend="chapter_2"/>).</emphasis></para>
<para>Выводится уведомление &quot;Внимание! На сервере <emphasis role="italic">имя_хоста</emphasis> используется версия ARTA Synergy ниже <emphasis role="italic">требуемая_версия</emphasis>. Возможна нестабильная работа приложения.&quot;</para>
</chapter>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<chapter id="chapter_2">
<title>Общие сведения</title>
<para><emphasis role="bold">Мобильный клиент должен предоставлять модули:</emphasis></para>
<itemizedlist>
<listitem>
<para>Авторизация</para>
</listitem>
<listitem>
<para>Потоки работ</para>
</listitem>
<listitem>
<para>Документы</para>
</listitem>
<listitem>
<para>Настройки приложения</para>
</listitem>
</itemizedlist>
<para><emphasis role="bold">Общие требования:</emphasis></para>
<itemizedlist>
<listitem>
<para>Для коректной работы мобильного приложения версия основного приложения Synergy на сервере должна быть не ниже 2.62.</para>
</listitem>
<listitem>
<para>Приложение должно поддерживать локализацию (казахский, русский и английский языки). По умолчанию берется значение текущей локали пользователя. В дальнейшем пользователь должен иметь возможность изменить локаль приложения в настройках приложения.</para>
</listitem>
<listitem>
<para>Во время выполнения запросов к серверу приложение должно отображать анимированное изображение.</para>
</listitem>
<listitem>
<para>Приложение должно предоставлять возможность шифрования канала передачи данных (SSL).</para>
</listitem>
<listitem>
<para>Приложение должно предоставлять возможность оффлайн-доступа с синхронизацией данных.</para>
</listitem>
</itemizedlist>
<para>Функционал, описанный в данной спецификации, должен быть реализован в нативных приложениях для каждой из платформ. Считается, что пользовательский интерфейс будет идентичен для всех платформ за небольшими исключениями:</para>
<itemizedlist>
<listitem>
<para>Так как у мобильных устройств на базе ОС Android есть системная кнопка &quot;Назад&quot;, в пользовательском интерфейсе она должна отсутствовать.</para>
</listitem>
</itemizedlist>
<note>
<para>На всех изображениях спецификации иллюстрация слева - для ОС Android, справа - для iOS. На изображениях, где только одна иллюстрация - макеты совпадают для обеих ОС.</para>
</note>
<para>Дополнительно: поверх иконки приложения должно отображаться количество непросмотренных изменений.</para>
<para>При загрузке приложения должны быть загружены следующие настройки, которые далее будут использованы приложением:</para>
<itemizedlist>
<listitem>
<para>начало и завершение рабочего дня;</para>
</listitem>
<listitem>
<para>список форм завершения;</para>
</listitem>
<listitem>
<para>список приоритетов;</para>
</listitem>
<listitem>
<para>названия кнопок действий с работой (согласование / утверждение / ознакомление / пеепоручение / передача);</para>
</listitem>
<listitem>
<para>список типов работ для резолюций (работа, согласование, утверждение, ознакомление, отправка документа);</para>
</listitem>
<listitem>
<para>список типов работ для редактора маршрута (работа, согласование, утверждение, ознакомление, отправка документа, блокирующий процесс, регистрация, маршрут);</para>
</listitem>
<listitem>
<para>список пунктов создания документов, формы реестров которых имеют мобильное представление и которые доступны авторизованному пользователю;</para>
</listitem>
<listitem>
<para>обязательно ли подписание согласований / утверждений / ознакомлений;</para>
</listitem>
<listitem>
<para>маппинг прогрессов работ на текстовые значения;</para>
</listitem>
<listitem>
<para>отображать ли поле &quot;автор&quot; при создании работы;</para>
</listitem>
<listitem>
<para>обязательно ли подписание документов перед отправкой;</para>
</listitem>
<listitem>
<para>разрешено ли передавать работы другим исполнителям;</para>
</listitem>
<listitem>
<para>разрешено ли добавлять соисполнителей к работам, не являющихся подчиненными;</para>
</listitem>
<listitem>
<para>ставить ли работы исполнителям от имени ответственного;</para>
</listitem>
<listitem>
<para>подставлять ли дату завершения документа в пункты резолюции;</para>
</listitem>
<listitem>
<para>разрешено ли ставить работы по резолюции, завершающиеся позже документа;</para>
</listitem>
<listitem>
<para>разрешено ли накладывать дополнительные резолюции;</para>
</listitem>
<listitem>
<para>отображать ли конечных пользователей на исполнении;</para>
</listitem>
<listitem>
<para>подпись поля &quot;Отписано&quot;.</para>
</listitem>
</itemizedlist>
</chapter>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<chapter>
<title>Введение</title>
<para>Данный документ является описанием функциональных требований к системе
ARTA Synergy Mobile Client. ARTA Synergy Mobile Client является составляющей частью программного
комплекса ARTA Synergy и представяляет собой инструмент для доступа к функционалу модулей &quot;Потоки работ&quot;, &quot;Документы&quot;, &quot;Хранилище&quot;, &quot;Ежедневник&quot; с мобильных устройств на базе платформ Android версии 4.0 и выше, iOS версии 6.0 и выше.</para>
<para>Текущая версия документа описывает модули &quot;Потоки работ&quot; и &quot;Документы&quot;.</para>
</chapter>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<chapter id="chap.documents">
<title>Документы</title>
<!--Список документов для смартфона--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="documents_list.xml" encoding="UTF-8"/>
<!--Список документов для планшета--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="documents_list_tablet.xml" encoding="UTF-8"/>
<!--Дочерние документы--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="documents_subsidiary_docs.xml" encoding="UTF-8"/>
<!--Фильтры документов--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="documents_filters.xml" encoding="UTF-8"/>
<!--Создание документов--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="documents_creation.xml" encoding="UTF-8"/>
<!--Скрытие документов--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="documents_hide.xml" encoding="UTF-8"/>
<!--Полная информация о документе--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="documents_docinfo.xml" encoding="UTF-8"/>
</chapter>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.documents_actions">
<title>Действия с документом</title>
<para>Набор управляющих кнопок зависит от просматриваемой работы по документу, либо от отсутствия таковой:</para>
<itemizedlist>
<listitem>
<para>документ не по реестру, отсутствуют работы;</para>
</listitem>
<listitem>
<para>документ не по реестру, присутствуют работы;</para>
</listitem>
<listitem>
<para>документ по реестру, отсутствуют работы, отсутствует реестр ответа;</para>
</listitem>
<listitem>
<para>документ по реестру, отсутствуют работы, присутствует реестр ответа.</para>
</listitem>
</itemizedlist>
<para>Для каждого варианта API будет возвращать информацию о доступном наборе кнопок, для каждой кнопки указываются: цвета, название, идентификатор действия, идентификатор операции и значение лейбла.</para>
<informaltable>
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<colspec colname="c3"/>
<thead>
<row>
<entry align="center">Идентификатор действия</entry>
<entry align="center">Идентификатор операции</entry>
<entry align="center">Значение лейбла</entry>
</row>
</thead>
<tbody>
<row>
<entry>REGISTRY</entry>
<entry>RUN</entry>
<entry>согласно API (запуск маршрута)</entry>
</row>
<row>
<entry>REGISTRY</entry>
<entry>ANSWER</entry>
<entry>согласно API (создание ответа)</entry>
</row>
<row>
<entry>RESOLUTION</entry>
<entry/>
<entry>Резолюция</entry>
</row>
<row>
<entry>COMPLETE</entry>
<entry>PROCESS</entry>
<entry>Завершить</entry>
</row>
<row>
<entry>COMPLETE</entry>
<entry>PROGRESS</entry>
<entry>Ответить</entry>
</row>
<row>
<entry>COMPLETE</entry>
<entry>STATUS</entry>
<entry>Завершить</entry>
</row>
<row>
<entry>COMPLETE</entry>
<entry>POINT_RESULT</entry>
<entry>Завершить</entry>
</row>
<row>
<entry>RESULT</entry>
<entry/>
<entry>Результат</entry>
</row>
<row>
<entry>SEND</entry>
<entry>AGREEMENT</entry>
<entry>согласно API (согласование)</entry>
</row>
<row>
<entry>SEND</entry>
<entry>APPROVAL</entry>
<entry>согласно API (утверждение)</entry>
</row>
<row>
<entry>SEND</entry>
<entry>ACQUAINTANCE</entry>
<entry>согласно API (ознакомление)</entry>
</row>
<row>
<entry>REASSIGN</entry>
<entry/>
<entry>согласно API (перепоручение)</entry>
</row>
<row>
<entry>TRANSMIT</entry>
<entry/>
<entry>согласно API (передача)</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>По нажатию кнопки с идентификатором операции RUN открывается экран запуска маршрута (<xref linkend="sec.documents_route_starting"/>).</para>
<para>Кнопка с идентификатором операции ANSWER может отображаться, только если форма реестра ответа имеет мобильное представление. По нажатию этой кнопки открывается экран создания документа (<xref linkend="sec.document_creation"/>).</para>
<para>Остальные действия аналогичны действиям в потоках работ (<xref linkend="sec.workflow_work_actions"/>), за тем исключением, что вместо названия работы необходимо использовать краткое содержание документа.</para>
<!--Запуск маршрута--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="documents_route_starting.xml" encoding="UTF-8"/>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.documents_attachments">
<title>Файлы документа</title>
<para>Панель вложений аналогична таковой в потоках работ (<xref linkend="sec.workflow_attachments"/>).</para>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.documents_comments">
<title>Комментарии к документу</title>
<para>Панель комментариев аналогична таковой в потоках работ (<xref linkend="sec.workflow_comments"/>), за тем исключением, что отображаются все комментарии к документу и ко всем работам документа.</para>
<para>Новый комментарий, добавленный через модуль &quot;Документы&quot;, сразу отображается в списке комментариев, при этом для документа с работами комментарий должен добавиться как к документу, так и непосредственно к той работе, которая была активна в панели с параметрами работы в момент вызова данной функции.</para>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.document_creation">
<title>Создание документов</title>
<para>На экране со списком работ по нажатию на кнопку &quot;+&quot; и выбору избранного пункта меню, а также при выборе любого пункта (не группы) в диалоге &quot;Избранное&quot; (<xref linkend="fig.workflow_work_create_menu_other"/>, <xref linkend="fig.workflow_work_create_menu_other_2"/>), открывается экран создания документа (<xref linkend="fig.documents_create"/>). При открытии экрана API должно возвращать следующую информацию:</para>
<itemizedlist>
<listitem>
<para>наименование реестра;</para>
</listitem>
<listitem>
<para>форму в мобильном представлении;</para>
</listitem>
<listitem>
<para>название действия по документу реестра (управляющая кнопка);</para>
</listitem>
<listitem>
<para>признак отсутствия либо наличия маршрута запуска.</para>
</listitem>
</itemizedlist>
<figure id="fig.documents_create">
<title>Экран создания документа</title>
<graphic fileref="resources/img/documents/document_create.png" align="center"/>
<graphic fileref="resources/img/documents/iOS/document_create_ios.png" align="center"/>
</figure>
<para>Вверху экрана отображается лейбл с полным наименованием реестра. Далее идет панель, внутри которой располагается форма в мобильном представлении (аналогично форме завершения - &quot;форме&quot;). Далее кнопка &quot;Сохранить&quot; (с идентификатором NOT_PREFFERED). Лейбл и панель не имеют фиксированной высоты (контентозависимы), экран прокручивается.</para>
<para>Если пользователь нажимает на кнопку &quot;Назад&quot;, возвращается экран со списком документов в том же состоянии, которое было до вызова данного экрана.</para>
<para>Для выполнения действия пользователь нажимает на кнопку &quot;Сохранить&quot;. Действие выполняется только при заполнении обязательных полей формы (наличие таких полей определяется самой формой).</para>
<para>В случае неуспешного сохранения выдается сообщение об ошибке, пользователь остается на экране создания документа. В случае же успешного сохранения выдается сообщение &quot;Данные сохранены&quot;, документ сохраняется, открывается экран информации о документе (<xref linkend="sec.documents_docinfo"/>) с единственной управляющей кнопкой запуска маршрута (<xref linkend="sec.documents_route_starting"/>).</para>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.documents_docinfo">
<title>Информация о документе</title>
<para>По нажатию на плашку документа открывается экран информации о документе.</para>
<!--Панель с параметрами работы по документу--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="documents_work_information.xml" encoding="UTF-8"/>
<!--Комментарии к документу--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="documents_comments.xml" encoding="UTF-8"/>
<!--Файлы документа--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="documents_attachments.xml" encoding="UTF-8"/>
<!--Действия с документом--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="documents_actions.xml" encoding="UTF-8"/>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.documents_filters">
<title>Фильтры документов</title>
<para>По нажатию на кнопку &quot;Фильтры&quot;, а также проведя пальцем от левой стороны экрана со списком документов к правой, раскрывается левая панель навигатора фильтров (<xref linkend="fig.documents_filters"/>).</para>
<figure id="fig.documents_filters">
<title>Фильтры документов</title>
<graphic fileref="resources/img/documents/filters.png" align="center"/>
</figure>
<para>Верхняя панель содержит кнопку &quot;Настройки&quot; (<xref linkend="sec.settings"/>) и надпись &quot;Навигатор&quot;. Нижняя панель отображается только для включенного флажка &quot;Синхронизировать данные для оффлайн-работы&quot; и содержит кнопку синхронизации.</para>
<para>Кнопка синхронизации содержит иконку и один из вариантов подписи к ней:</para>
<itemizedlist>
<listitem>
<para>&quot;Синхронизация не производилась&quot; - для варианта, когда на устройстве отсутствуют данные синхронизации;</para>
</listitem>
<listitem>
<para>&quot;Идёт синхронизация&quot; - для активного процесса синхронизации (см. подробнее в <xref linkend="sec.offline"/>);</para>
</listitem>
<listitem>
<para>&quot;Последняя синхронизация: ДД месяц ЧЧ:ММ&quot; - во всех остальных случаях (указывается дата и время последней успешной синхронизации).</para>
</listitem>
</itemizedlist>
<para>Параметры фильтров:</para>
<informaltable frame="all" id="table.workflow_filter_parameters_1">
<tgroup cols="2">
<colspec colname="c1"/>
<colspec colname="c2"/>
<thead>
<row>
<entry align="center">Параметр</entry>
<entry align="center">Поле API</entry>
</row>
</thead>
<tbody>
<row>
<entry>Название фильтра</entry>
<entry>name</entry>
</row>
<row>
<entry>Тип фильтра</entry>
<entry>filterType</entry>
</row>
<row>
<entry>Количество документов внутри фильтра</entry>
<entry>count</entry>
</row>
<row>
<entry>Наличие дочерних фильтров</entry>
<entry>hasChildren</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>При каждом новом запуске приложения, а также после переключения модулей все основные фильтры должны быть свернуты, а выделенным являться первый фильтр навигатора. В остальных случаях развернутость дерева и последний выделенный фильтр должны сохранять свои значения.</para>
<para>Если фильтр содержит вложенные фильтры, то в правой части отображается иконка <graphic fileref="resources/img/workflow/elements/filters_undetailed.png"/> для свернутого фильтра и <graphic fileref="resources/img/workflow/elements/filters_detailed.png"/> для развернутого. По нажатию на квадратную область (кликабельная область аналогична фильтрам в работах) вокруг иконки свернутого фильтра он разворачивается, и наоборот. Одновременно не может быть раскрыто более одного фильтра. В этом случае предыдущий развернутый фильтр сворачивается.</para>
<para>Справа от названия каждого из фильтров и вложенных подфильтров в скобках указывается счетчик в формате &apos;(N1)&apos;, где N1 - общее количество документов в данном фильтре. При отсутствии документов в фильтре счетчик не отображается вовсе.</para>
<para>Если название фильтра (с счетчиком) полностью не помещается на плашке, с правого края оно должно быть затемнено градиентом из прозрачного в цвет фона.</para>
<para>По нажатию на название фильтра левая панель скрывается и пользователю отображается список документов согласно выбранного фильтра.</para>
<para><emphasis role="bold">Переходы на другие экраны.</emphasis></para>
<para>С панели фильтров документов можно только вернуться к списку документов. Левую панель можно скрыть тремя способами:</para>
<orderedlist>
<listitem>
<para>проведя пальцем от правой стороны экрана к левой;</para>
</listitem>
<listitem>
<para>нажав по любому месту правой стороны экрана (там, где отображается часть экрана списка документов);</para>
</listitem>
<listitem>
<para>нажав на кнопку &quot;Назад&quot; (для ОС Android).</para>
</listitem>
</orderedlist>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.documents_hide">
<title>Скрытие документов</title>
<para>В результате долгого нажатия по плашке
документа появляется меню, в котором присутствует пункт:</para>
<itemizedlist>
<listitem>
<para>&quot;Скрыть&quot; - для активного документа;</para>
</listitem>
<listitem>
<para>&quot;Восстановить&quot; - для скрытого документа.</para>
</listitem>
</itemizedlist>
<para>Пользователь нажимает на
этот пункт меню и приложение запрашивает подтверждение выполнения действия с сообщением</para>
<itemizedlist>
<listitem>
<para>&quot;Вы действительно хотите скрыть данный документ?&quot; - для активного документа;</para>
</listitem>
<listitem>
<para>&quot;Вы действительно хотите восстановить данный документ?&quot; - для скрытого документа.</para>
</listitem>
</itemizedlist>
<para>Если пользователь подтверждает скрытие документа, отправляется запрос на сервер для скрытия. В случае успешного
выполнения плашка скрывается из списка, иначе - отображается сообщение об ошибке.</para>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.documents_list">
<title>Список документов для смартфона</title>
<para>Экран со списком документов для смартфона представлен на <xref linkend="fig.documents_main"/> и <xref linkend="fig.documents_main_1"/>.</para>
<figure id="fig.documents_main">
<title>Список документов журнала для смартфона</title>
<graphic fileref="resources/img/documents/main.png" align="center"/>
</figure>
<figure id="fig.documents_main_1">
<title>Список документов пользователя для смартфона</title>
<graphic fileref="resources/img/documents/main1.png" align="center"/>
</figure>
<para>
<emphasis role="bold">Элементы управления экрана со списком документов.</emphasis>
</para>
<informaltable frame="all" id="table.workflow_work_spisok_1">
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<colspec colname="c3"/>
<thead>
<row>
<entry align="center">Элемент управления</entry>
<entry align="center">Расположение на экране</entry>
<entry align="center">Описание</entry>
</row>
</thead>
<tbody>
<row>
<entry namest="c1" nameend="c3" align="center">
<emphasis role="italic">Верхняя панель</emphasis>
</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/button_filters.png"/>
</entry>
<entry>Слева</entry>
<entry>&quot;Фильтры&quot; - кнопка перехода к фильтрам (<xref linkend="sec.documents_filters"/>)</entry>
</row>
<row>
<entry align="center">&quot;Документы&quot;</entry>
<entry>По центру</entry>
<entry>Выпадающий список для переключения между модулями</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/button_work_create.png"/>
</entry>
<entry>Справа</entry>
<entry>&quot;Создать&quot; - кнопка создания документа (<xref linkend="sec.document_creation"/>)</entry>
</row>
<row>
<entry namest="c1" nameend="c3" align="center">
<emphasis role="italic">Рабочая область</emphasis>
</entry>
</row>
<row>
<entry align="center"/>
<entry>Вся рабочая область ниже верхней панели</entry>
<entry>Плашки, отображающие информацию о документе</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>По нажатию на &quot;Документы&quot; открывается выпадающий список с модулями (аналогично <xref linkend="fig.workflow_module_switch"/>):</para>
<itemizedlist>
<listitem>
<para>&quot;Работы&quot; - <xref linkend="chap_workflow"/>;</para>
</listitem>
<listitem>
<para>&quot;Документы&quot; - текущий модуль.</para>
</listitem>
</itemizedlist>
<para>До вызова выпадающего списка стрелка отображается указателем вниз, по вызову меняется указателем вверх. По нажатию вне области выпадающего списка, а также по указателю и шапке списка, он скрывается. По нажатию на текущий модуль список обновляется, на другой модуль - открывается соответствующий модуль.</para>
<para>Документы в списке отображаются с постепенной догрузкой. Изначально подгружается такое количество документов, чтобы список был полностью заполнен и появился скролл (минимум 30). При прокрутке пользователем вниз и достижении конца списка, список документов дополняется (количество документов в новой &quot;порции&quot; должно быть равно количеству документов в первой &quot;порции&quot;).</para>
<para>При прокрутке пользователем в начале списка вверх (действие dropdown) список документов обновляется.</para>
<para>Список документов сортируется согласно условиям просматриваемого фильтра.</para>
<para>По нажатию на кнопку &quot;+&quot; вызывается меню (аналогичное, например, выбору формы завершения), в котором (<xref linkend="fig.workflow_work_create_menu"/>) содержатся:</para>
<itemizedlist>
<listitem>
<para>группы первого уровня вложенности, содержащие избранные пункты, с иконкой <graphic fileref="resources/img/workflow/elements/icon_group.png"/>, по нажатию которых открывается экран со списком избранных пунктов создания документа (<xref linkend="fig.workflow_work_create_menu_other"/>);</para>
</listitem>
<listitem>
<para>избранные пункты создания документов первого уровня вложенности с иконкой <graphic fileref="resources/img/workflow/elements/icon_item.png"/>, по нажатию которых открывается экран создания документа (<xref linkend="sec.document_creation"/>);</para>
</listitem>
<listitem>
<para>последним пунктом стоит &quot;Еще...&quot; (с иконкой группы), по нажатию которого вызывается экран со списком всех пунктов создания документов (<xref linkend="fig.workflow_work_create_menu_other_2"/>).</para>
</listitem>
</itemizedlist>
<note>
<para>Порядок следования групп и пунктов определяется API.</para>
</note>
<para>Если список пунктов создания документов пуст, то кнопка &quot;+&quot; должна отсутствовать.</para>
<para>Экраны со списком избранных пунктов создания документа (<xref linkend="fig.workflow_work_create_menu_other"/>) и со списком всех пунктов создания документов (<xref linkend="fig.workflow_work_create_menu_other_2"/>) полностью аналогичны таковым в потоках работ (<xref linkend="sec.workflow_works"/>).</para>
<para>Если пользователь на экране со списком избранных пунктов создания документов нажимает на кнопку &quot;Назад&quot;, мобильный клиент возвращает экран со списком документов в том состоянии, которое было до вызова данного экрана.</para>
<para>Если пользователь на экране со списком всех пунктов создания документов нажимает на кнопку &quot;Назад&quot;, мобильный клиент возвращает пользователя к предыдущему экрану, откуда был вызван данный экран:</para>
<itemizedlist>
<listitem>
<para>если по нажатию кнопки &quot;Отобразить все&quot; - то в экран со списком избранных пунктов создания документов (<xref linkend="fig.workflow_work_create_menu_other"/>);</para>
</listitem>
<listitem>
<para>если по нажатию на пункт меню &quot;Еще&quot; - то в экран со списком документов.</para>
</listitem>
</itemizedlist>
<para>В обоих экранах после выделения пункта (действие tap) пользователь нажимает на кнопку &quot;Выбрать&quot;. Действие выполняется, только если выделен какой-либо пункт (не группа). В случае неуспешного выполнения действия выдается сообщение об ошибке, пользователь остается на экране. В случае же успешного выполнения действия открывается экран создания документа (<xref linkend="sec.document_creation"/>).</para>
<para><emphasis role="bold">Неполная плашка документа.</emphasis>
</para>
<para>Плашка документа - это компонент, отображающий информацию о документе. Плашки могут быть разных размеров.</para>
<para>Неполные плашки документа бывают двух видов (в зависимости от просматриваемого фильтра):</para>
<itemizedlist>
<listitem>
<para>Плашка документа журнала (фильтры &quot;Журналы&quot; и &quot;Дела&quot;)</para>
<figure id="fig.documents_plashka_document_for_registration">
<title>Документ &quot;на регистрации&quot;</title>
<graphic fileref="resources/img/documents/elements/plashka_document_for_registration.png" width="300" align="center"/>
</figure>
<figure id="fig.documents_plashka_document_registered">
<title>&quot;Зарегистрированный&quot; документ</title>
<graphic fileref="resources/img/documents/elements/plashka_document_registered.png" width="300" align="center"/>
</figure>
<figure id="fig.documents_plashka_document_defective">
<title>&quot;Бракованный&quot; документ</title>
<graphic fileref="resources/img/documents/elements/plashka_document_defective.png" width="300" align="center"/>
</figure>
<figure id="fig.documents_plashka_document_defective_1">
<title>&quot;Отклоненный&quot; документ</title>
<graphic fileref="resources/img/documents/elements/plashka_document_draft.png" width="300" align="center"/>
</figure>
</listitem>
<listitem>
<para>Плашка документа пользователя (фильтр &laquo;Все&raquo;)</para>
<figure id="fig.documents_plashka_document_new">
<title>&quot;Созданный&quot; пользователем документ</title>
<graphic fileref="resources/img/documents/elements/plashka_document_new.png" width="300" align="center"/>
</figure>
<figure id="fig.documents_plashka_document_inbox">
<title>&quot;Полученный&quot; документ</title>
<graphic fileref="resources/img/documents/elements/plashka_document_inbox.png" width="300" align="center"/>
</figure>
<figure id="fig.documents_plashka_document_outbox">
<title>&quot;Отправленный&quot; документ</title>
<graphic fileref="resources/img/documents/elements/plashka_document_outbox.png" width="300" align="center"/>
</figure>
</listitem>
</itemizedlist>
<note>
<para>Если созданный / полученный / отправленный документ зарегистрирован, то плашка должна отображаться:</para>
<itemizedlist>
<listitem>
<para>для активного узла дерева &quot;Журналы&quot; и &quot;Дела&quot; - как плашка документа журнала;</para>
</listitem>
<listitem>
<para>для активного узла дерева &quot;Все&quot; - как плашка документа пользователя.</para>
</listitem>
</itemizedlist>
</note>
<para>
<emphasis role="italic">Элементы неполной плашки документа журнала.</emphasis>
</para>
<informaltable frame="all">
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<colspec colname="c3"/>
<thead>
<row>
<entry align="center">Элемент</entry>
<entry align="center">Описание</entry>
<entry align="center">Поле API</entry>
</row>
</thead>
<tbody>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">Левый блок, 1 строка</emphasis>
</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/system_document.png"/>
</entry>
<entry>Признак происхождения / Признак наложенной на документ резолюции</entry>
<entry>type / hasResolution</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/document_on_proccess.png"/>
</entry>
<entry>Признак нахождения документа в процессе</entry>
<entry>inProgress</entry>
</row>
<row>
<entry align="center">NNNNN</entry>
<entry>Номер документа (только для зарегистрированных документов)</entry>
<entry>number</entry>
</row>
<row>
<entry align="center">Фамилия И.О.</entry>
<entry>Автор / Корреспондент (только для зарегистрированных документов)</entry>
<entry>author / correspondentOrg / correspondent</entry>
</row>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">Левый блок, 2-4 строки</emphasis>
</entry>
</row>
<row>
<entry align="center"/>
<entry>Краткое содержание документа, в т.ч. со значащим содержимым</entry>
<entry>name, content</entry>
</row>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">Правый блок</emphasis>
</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/progress_done_icon.png"/>
</entry>
<entry>Статус зарегистрированного документа / признак бракованности документа</entry>
<entry>statusID / defective</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/registered_document.png"/>
</entry>
<entry>Признак зарегистрированности документа / признак отклоненности документа</entry>
<entry>registered / statusID = REJECTED</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/hook.png"/>
</entry>
<entry>Признак наличия дочерних документов</entry>
<entry>hasChildren</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>
<emphasis role="italic">Элементы неполной плашки документа пользователя.</emphasis>
</para>
<informaltable frame="all">
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<colspec colname="c3"/>
<thead>
<row>
<entry align="center">Элемент</entry>
<entry align="center">Описание</entry>
<entry align="center">Поле API</entry>
</row>
</thead>
<tbody>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">Левый блок, 1 строка</emphasis>
</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/system_document.png"/>
</entry>
<entry>Признак происхождения / Признак наложенной на документ резолюции</entry>
<entry>type / hasResolution</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/document_on_proccess.png"/>
</entry>
<entry>Признак нахождения документа в процессе</entry>
<entry>inProgress</entry>
</row>
<row>
<entry align="center">От: Фамилия И.О.</entry>
<entry>Список адресатов</entry>
<entry>from / to</entry>
</row>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">Левый блок, 2-4 строки</emphasis>
</entry>
</row>
<row>
<entry align="center"/>
<entry>Краткое содержание документа, в т.ч. со значащим содержимым</entry>
<entry>name, content</entry>
</row>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">Правый блок</emphasis>
</entry>
</row>
<row>
<entry align="center">ДД.ММ.ГГ ЧЧ:ММ</entry>
<entry>Дата создания / получения / отправления документа</entry>
<entry>createDate</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/hook.png"/>
</entry>
<entry>Признак наличия дочерних документов</entry>
<entry>hasChildren</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para><emphasis role="italic">Признак происхождения</emphasis> отображается в виде пиктограммы, выбор пиктограммы зависит от поля
API &quot;type&quot;:</para>
<informaltable>
<tgroup cols="3">
<thead>
<colspec/>
<colspec/>
<colspec/>
<row>
<entry align="center">Иконка</entry>
<entry align="center">Описание</entry>
<entry align="center">Константа</entry>
</row>
</thead>
<tbody>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/system_document.png"/>
</entry>
<entry>Документ системы</entry>
<entry>DOCUMENT</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/email_document.png"/>
</entry>
<entry>Электронное письмо</entry>
<entry>EMAIL</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Если на документ наложена резолюция (поле API &quot;hasResolution&quot;), то, независимо от признака, должна отображаться иконка резолюции <graphic fileref="resources/img/documents/elements/resolution.png"/> вместо иконки признака происхождения.</para>
<para><emphasis role="italic">Признак нахождения документа в процессе</emphasis> отображается в виде пиктограммы <graphic fileref="resources/img/documents/elements/document_on_proccess.png"/> и присутствует только для документов со свойством &quot;inProgress&quot;.</para>
<para><emphasis role="italic">Номер документа</emphasis> отображается только для зарегистрированных документов журнала (поле API &quot;number&quot;). Если номер документа полностью не помещается на строке плашки, с правого края он должен быть затемнен
градиентом из прозрачного в цвет фона.</para>
<para><emphasis role="italic">Автор / Корреспондент</emphasis> отображается только для зарегистрированных документов журнала после номера (разделителем между номером и автором/корреспондентом должен быть знак &quot;тире&quot; с пробелами по обе стороны), заполняется:</para>
<itemizedlist>
<listitem>
<para>для журнала внутренних документов - автором (в формате&quot;Фамилия И.О.&quot;, поле API &quot;author&quot;);</para>
</listitem>
<listitem>
<para>для журнала входящих / исходящих документов - корреспондентом-организацией (поле API &quot;correspondentOrg&quot;) / корреспондентом (поле API &quot;correspondent&quot;, при отсутствии корреспондента-организации) / пусто (при отсутствии обоих полей корреспондента).</para>
</listitem>
</itemizedlist>
<para>Если автор/корреспондент полностью не помещается на строке плашки, с правого края он должен быть затемнен
градиентом из прозрачного в цвет фона.</para>
<para><emphasis role="italic">Статус зарегистрированного документа журнала (поле API &quot;statusID&quot;):</emphasis>
</para>
<itemizedlist>
<listitem>
<para>завершенный - константа &quot;FINISHED&quot; (статус &quot;Завершен&quot;) - отображается в виде пиктограммы <graphic fileref="resources/img/workflow/elements/progress_done_icon.png"/></para>
</listitem>
<listitem>
<para>незавершенный - константа &quot;IN_PROGRESS&quot; (статусы &quot;В работе&quot; / &quot;Истекает срок&quot; / &quot;Есть просроченные&quot;) - отображается в виде пиктограммы <graphic fileref="resources/img/documents/elements/calendar.png"/></para>
</listitem>
</itemizedlist>
<para>Если документ бракованный (поле API &quot;defective&quot;), то независимо от того, завершенный или незавершенный документ, его краткое содержание выделяется цветом #b7b7b7 и отображается пиктограмма <graphic fileref="resources/img/documents/elements/defective_document.png"/>.</para>
<para><emphasis role="italic">Признак зарегистрированности документа журнала</emphasis> (поле API &quot;registered&quot;) отображается в виде пиктограммы, выбор пиктограммы зависит от того, зарегистрирован ли документ журнала:</para>
<informaltable>
<tgroup cols="3">
<thead>
<colspec/>
<colspec/>
<colspec/>
<row>
<entry align="center">Иконка</entry>
<entry align="center">Описание</entry>
<entry align="center">Константа</entry>
</row>
</thead>
<tbody>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/registered_document.png"/>
</entry>
<entry>Документ зарегистрирован</entry>
<entry>true</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/document_for_registration.png"/>
</entry>
<entry>Документ на регистрации</entry>
<entry>false</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Если документ отклоненный (поле API &quot;statusID&quot;=&quot;REJECTED&quot;), то независимо от признака зарегистрированности, его краткое содержание выделяется цветом #487cc2 и отображается пиктограмма <graphic fileref="resources/img/documents/elements/draft_document.png"/>.</para>
<note>
<para>Если документ одновременно отклоненный и бракованный, краткое содержание документа выделяется цветом бракованного #b7b7b7, последовательность иконок следующая: сначала бракованность, потом отклоненность.</para>
</note>
<para><emphasis role="italic">Список адресатов/адресантов</emphasis> отображается только для полученных/отправленных документов пользователя:</para>
<itemizedlist>
<listitem>
<para>фильтр &quot;Полученные&quot; (поле API &quot;from&quot;) - подпись &quot;От:&quot; и список пользователей в формате &quot;Фамилия И.О.&quot;, перечисленных через запятую;</para>
</listitem>
<listitem>
<para>фильтр &quot;Отправленные&quot; (поле API &quot;to&quot;) - подпись &quot;Кому:&quot; и список пользователей в формате &quot;Фамилия И.О.&quot;, перечисленных через запятую;</para>
</listitem>
<listitem>
<para>остальные фильтры (включая &quot;Все&quot;):</para>
<itemizedlist>
<listitem>
<para>только полученный документ (поле API &quot;from&quot;) - подпись &quot;От:&quot; и список пользователей в формате &quot;Фамилия И.О.&quot;, перечисленных через запятую;</para>
</listitem>
<listitem>
<para>только отправленный документ (поле API &quot;to&quot;) - подпись &quot;Кому:&quot; и список пользователей в формате &quot;Фамилия И.О.&quot;, перечисленных через запятую;</para>
</listitem>
<listitem>
<para>и полученный, и отправленный документ - подписи &quot;От:&quot; и &quot;Кому:&quot; (на две строки) и список пользователей в формате &quot;Фамилия И.О.&quot;, перечисленных через запятую.</para>
</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
<para>Если весь список адресатов/адресантов полностью не помещается на строке плашки, с правого края он должен быть затемнен
градиентом из прозрачного в цвет фона.</para>
<para><emphasis role="italic">Дата создания / получения / отправления документа</emphasis> отображается только для документов пользователя (поле API &quot;createDate&quot;) и заполняется датой и временем последнего выполненного действия с документом в формате &quot;ДД.ММ.ГГ ЧЧ:ММ&quot;.</para>
<para><emphasis role="italic">Краткое содержание документа (поле API &quot;name&quot;), через дефис значащее содержимое (поле API &quot;content&quot;),</emphasis> отображаются максимум на 3 (три) строки. Если текст краткого содержания содержит менее трех строк, то должна меняться минимальная высота плашки в соответствии с количеством строк краткого содержания (но не более трех строк). Если же полностью не помещается на плашке, то с правого края третьей строки оно должно быть затемнено
градиентом из прозрачного в цвет фона.</para>
<para>Цвет краткого содержания документа журнала зависит от его свойств и времени, оставшегося до завершения работ по документу:</para>
<informaltable frame="all" id="table.workflow_work_processes_1">
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<colspec colname="c3"/>
<thead>
<row>
<entry align="center">Условие</entry>
<entry align="center">Поле API</entry>
<entry align="center">Цвет краткого содержания</entry>
</row>
</thead>
<tbody>
<row>
<entry>Если хотя бы одна работа по маршруту документа просрочена</entry>
<entry>is_expired</entry>
<entry class="background-color=red">#be3d3d</entry>
</row>
<row>
<entry>Если хотя бы у одной работы по маршруту документа истекает срок</entry>
<entry>is_soon_expired</entry>
<entry>#a57020</entry>
</row>
<row>
<entry>Если документ бракованный</entry>
<entry>defective</entry>
<entry>#b7b7b7</entry>
</row>
<row>
<entry>Иначе</entry>
<entry/>
<entry>#487cc2</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Краткое содержание документов пользователя (раздел &quot;Все&quot;) всегда выделяются цветом #487cc2. Значащее содержимое всегда и везде выделяется только цветом #83aade (независимо от любых других условий).</para>
<para>Если по данному документу имеются непросмотренные уведомления (поле API &quot;is_new&quot;=true), документ должен быть выделен полужирным.</para>
<para>Жирное выделение документа снимется тогда, когда пользователь просмотрит информацию о нем.</para>
<para><emphasis role="bold">Полная плашка документа.</emphasis>
</para>
<para>Посмотреть больше информации о документе (<xref linkend="fig.documents_full_plashka"/>), не открывая его полную информацию, можно следующими тремя способами:</para>
<orderedlist>
<listitem>
<para>двойным нажатием по неполной плашке;</para>
</listitem>
<listitem>
<para>масштабированием плашки разведением пальцев (сведением пальцев для обратного действия);</para>
</listitem>
<listitem>
<para>выбрав пункт контекстного меню &quot;Показать информацию&quot; (пункт &quot;Скрыть информацию&quot; для обратного действия).</para>
</listitem>
</orderedlist>
<figure id="fig.documents_full_plashka">
<title>Полная плашка документа (смартфон)</title>
<graphic fileref="resources/img/documents/main2.png" align="center"/>
</figure>
<para>Порядок отображения полей:</para>
<informaltable frame="all">
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<colspec colname="c3"/>
<thead>
<row>
<entry align="center">Элемент</entry>
<entry align="center">Описание</entry>
<entry align="center">Поле API</entry>
</row>
</thead>
<tbody>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">1 строка</emphasis>
</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/system_document.png"/>
</entry>
<entry>Признак происхождения</entry>
<entry>type</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/resolution.png"/>
</entry>
<entry>Признак наложенной на документ резолюции</entry>
<entry>hasResolution</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/document_on_proccess.png"/>
</entry>
<entry>Признак нахождения документа в процессе</entry>
<entry>inProgress</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/control_document.png"/>
</entry>
<entry>Признак контрольности документа</entry>
<entry>controlled</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/defective_document.png"/>
</entry>
<entry>Признак бракованности документа</entry>
<entry>defective</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/draft_document.png"/>
</entry>
<entry>Признак отклоненности документа</entry>
<entry>statusID = REJECTED</entry>
</row>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">2 строка</emphasis>
</entry>
</row>
<row>
<entry align="center">NNNNN</entry>
<entry>Номер документа (только для зарегистрированных документов)</entry>
<entry>number</entry>
</row>
<row>
<entry align="center">Фамилия И.О.</entry>
<entry>Автор / Корреспондент (только для зарегистрированных документов)</entry>
<entry>author / correspondentOrg / correspondent</entry>
</row>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">3 строка</emphasis>
</entry>
</row>
<row>
<entry align="center"/>
<entry>Краткое содержание документа, в т.ч. со значащим содержимым</entry>
<entry>name, content</entry>
</row>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">4 строка</emphasis>
</entry>
</row>
<row>
<entry align="center">Создано: ДД.ММ.ГГ ЧЧ:ММ</entry>
<entry>Дата создания / получения / отправления документа</entry>
<entry>createDate</entry>
</row>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">5 строка</emphasis>
</entry>
</row>
<row>
<entry align="center">От: Фамилия И.О.</entry>
<entry>Список адресатов</entry>
<entry>from / to</entry>
</row>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">6 строка</emphasis>
</entry>
</row>
<row>
<entry align="center">
<para>Регистрация</para>
</entry>
<entry>Статическая подпись, сигнализирующая о начале блока информации о зарегистрированном документе (только для зарегистрированных документов) </entry>
<entry/>
</row>
<row>
<entry align="center">
<para><graphic fileref="resources/img/documents/elements/calendar.png"/></para>
</entry>
<entry>Статус зарегистрированного документа</entry>
<entry>statusID</entry>
</row>
<row>
<entry align="center">
<para>
<graphic fileref="resources/img/documents/elements/registered_document.png"/>
</para>
</entry>
<entry>Признак зарегистрированности документа</entry>
<entry>registered</entry>
</row>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">7 строка</emphasis>
</entry>
</row>
<row>
<entry align="center">
<para>Зарегистрировал: Фамилия И.О.</para>
</entry>
<entry>Пользователь, зарегистрировавший документ (только для зарегистрированных документов)</entry>
<entry>regUser</entry>
</row>
<row>
<entry align="center">
<para>Дата: ДД.ММ.ГГ</para>
</entry>
<entry>Дата регистрации документа</entry>
<entry>regDate</entry>
</row>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">8 строка</emphasis>
</entry>
</row>
<row>
<entry align="center">Отписано: Фамилия И.О.</entry>
<entry>Пользователь, которому отписан документ (только для зарегистрированных незавершенных документов)</entry>
<entry>user</entry>
</row>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">9 строка</emphasis>
</entry>
</row>
<row>
<entry align="center">На исполнении: Фамилия И.О.</entry>
<entry>Список пользователей, у которых документ находится на исполнении (только для зарегистрированных незавершенных документов)</entry>
<entry>resUsers</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Полное описание полей представлено в <xref linkend="sec.documents_list_tablet"/>, при этом вся информация (в т.ч. краткое содержание, список адресатов и пользователей на исполнении) отображается полностью.</para>
<para><emphasis wordsize="" role="bold">Возможные действия с плашкой документа:</emphasis>
</para>
<orderedlist>
<listitem>
<para>При выделении плашки (tap) открывается экран с информацией о документе (не зависимо от прав пользователя).</para>
</listitem>
<listitem>
<para>При двойном нажатии по плашке смартфона (double tap), а также при масштабировании плашки сведением и разведением пальцев (pinch-to-zoom, не поддерживается в sencha), она переключается между режимами &quot;полная&quot; / &quot;неполная&quot;.</para>
</listitem>
<listitem>
<para>В результате долгого нажатия по плашке документа появляется меню с пунктами, доступными для любого пользователя:</para>
<orderedlist>
<listitem>
<para>&quot;Показать информацию&quot; / &quot;Скрыть информацию&quot; - для переключения между режимами плашки &quot;полная&quot; / &quot;неполная&quot;;</para>
</listitem>
<listitem>
<para>&quot;Скрыть&quot; / &quot;Восстановить&quot; (поле hide) - только для активного узла дерева &quot;Все&quot;.</para>
</listitem>
</orderedlist>
</listitem>
</orderedlist>
<para><emphasis role="bold">Переходы на другие экраны.</emphasis>
</para>
<para>Чтобы перейти к дочерним документам, пользователь проводит пальцем от правой стороны плашки к левой (<xref linkend="sec.documents_subsidiary_docs"/>).</para>
<para>По нажатию на кнопку &quot;Фильтры&quot;, а также проведя пальцем от левой стороны экрана к правой, раскрывается левая панель навигатора фильтров документов (<xref linkend="sec.documents_filters"/>).</para>
<para>По нажатию на кнопку &quot;Создать&quot; открывается выпадающий список с пунктами, по нажатию которого открывается экран создания документов (<xref linkend="sec.document_creation"/>).</para>
<para>По нажатию на плашку документа открывается экран полной информации о документе (<xref linkend="sec.documents_docinfo"/>).</para>
<para>В результате долгого нажатия по плашке активного узла дерева &quot;Мои&quot; появляется меню с пунктом &quot;Скрыть&quot; / &quot;Восстановить&quot; (<xref linkend="sec.documents_hide"/>).</para>
<para>По нажатию на кнопку &quot;Назад&quot; происходит выход из приложения (<xref linkend="sec.app_exit"/>).</para>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.documents_list_tablet">
<title>Список документов для планшета</title>
<para>Экран со списком документов представлен на <xref linkend="fig.documents_main_2"/> и <xref linkend="fig.documents_main_3"/>.</para>
<figure id="fig.documents_main_2">
<title>Список документов для планшета (журналы, дела)</title>
<graphic fileref="resources/img/documents/iOS/ipad_documents.png" align="center"/>
</figure>
<figure id="fig.documents_main_3">
<title>Список документов для планшета (документы)</title>
<graphic fileref="resources/img/documents/iOS/ipad_documents_2.png" align="center"/>
</figure>
<para><emphasis role="bold">Элементы управления экрана со списком документов</emphasis> аналогичны списку документов для смартфона (<xref linkend="sec.documents_list"/>).</para>
<para><emphasis role="bold">Полная плашка документа (планшет).</emphasis></para>
<para>Плашки документа также бывают двух видов (в зависимости от просматриваемого фильтра):</para>
<itemizedlist>
<listitem>
<para>Плашка документа журнала (фильтры &quot;Журналы&quot; и &quot;Дела&quot;)</para>
</listitem>
<listitem>
<para>Плашка документа пользователя (фильтр &quot;Все&quot;)</para>
</listitem>
</itemizedlist>
<para><emphasis role="italic">Элементы плашки документа журнала.</emphasis></para>
<informaltable frame="all">
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<colspec colname="c3"/>
<thead>
<row>
<entry align="center">Элемент</entry>
<entry align="center">Описание</entry>
<entry align="center">Поле API</entry>
</row>
</thead>
<tbody>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">Левый блок, 1 строка</emphasis>
</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/system_document.png"/>
</entry>
<entry>Признак происхождения</entry>
<entry>type</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/resolution.png"/>
</entry>
<entry>Признак наложенной на документ резолюции</entry>
<entry>hasResolution</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/document_on_proccess.png"/>
</entry>
<entry>Признак нахождения документа в процессе</entry>
<entry>inProgress</entry>
</row>
<row>
<entry align="center">NNNNN</entry>
<entry>Номер документа (только для зарегистрированных документов)</entry>
<entry>number</entry>
</row>
<row>
<entry align="center">Фамилия И.О.</entry>
<entry>Автор / Корреспондент (только для зарегистрированных документов)</entry>
<entry>author / correspondentOrg / correspondent</entry>
</row>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">Левый блок, 2-4 строки</emphasis>
</entry>
</row>
<row>
<entry align="center"/>
<entry>Краткое содержание документа, в т.ч. со значащим содержимым</entry>
<entry>name, content</entry>
</row>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">Левый блок, 5 строка</emphasis>
</entry>
</row>
<row>
<entry align="center">На исполнении: Фамилия И.О.</entry>
<entry>Список пользователей, у которых документ находится на исполнении (только для зарегистрированных незавершенных документов)</entry>
<entry>resUsers</entry>
</row>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">Правый блок, 1 строка</emphasis>
</entry>
</row>
<row>
<entry align="center">
<para><graphic fileref="resources/img/documents/elements/calendar.png"/></para>
</entry>
<entry>Статус зарегистрированного документа</entry>
<entry>statusID</entry>
</row>
<row>
<entry align="center">
<para><graphic fileref="resources/img/documents/elements/registered_document.png"/> ДД.ММ.ГГ</para>
</entry>
<entry>Признак зарегистрированности документа</entry>
<entry>registered / regDate</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/control_document.png"/>
</entry>
<entry>Признак контрольности документа</entry>
<entry>controlled</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/defective_document.png"/>
</entry>
<entry>Признак бракованности документа</entry>
<entry>defective</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/draft_document.png"/>
</entry>
<entry>Признак отклоненности документа</entry>
<entry>statusID = REJECTED</entry>
</row>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">Правый блок, 2 строка</emphasis>
</entry>
</row>
<row>
<entry align="center">
<para><graphic fileref="resources/img/documents/elements/registered_user.png"/> Фамилия И.О.</para>
</entry>
<entry>Пользователь, зарегистрировавший документ (только для зарегистрированных документов)</entry>
<entry>regUser</entry>
</row>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">Правый блок, 5 строка</emphasis>
</entry>
</row>
<row>
<entry align="center">Отписано: Фамилия И.О.</entry>
<entry>Пользователь, которому отписан документ (только для зарегистрированных незавершенных документов)</entry>
<entry>user</entry>
</row>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">Правый нижний блок</emphasis>
</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/hook.png"/>
</entry>
<entry>Признак наличия дочерних документов</entry>
<entry>hasChildren</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para><emphasis role="italic">Элементы плашки документа пользователя.</emphasis></para>
<informaltable frame="all">
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<colspec colname="c3"/>
<thead>
<row>
<entry align="center">Элемент</entry>
<entry align="center">Описание</entry>
<entry align="center">Поле API</entry>
</row>
</thead>
<tbody>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">Левый блок, 1 строка</emphasis>
</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/system_document.png"/>
</entry>
<entry>Признак происхождения</entry>
<entry>type</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/resolution.png"/>
</entry>
<entry>Признак наложенной на документ резолюции</entry>
<entry>hasResolution</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/document_on_proccess.png"/>
</entry>
<entry>Признак нахождения документа в процессе</entry>
<entry>inProgress</entry>
</row>
<row>
<entry align="center">От: Фамилия И.О.</entry>
<entry>Список адресатов</entry>
<entry>from / to</entry>
</row>
<row>
<entry namest="c1" nameend="c3">Левый блок, 2-4 строки</entry>
</row>
<row>
<entry align="center"/>
<entry>Краткое содержание документа, в т.ч. со значащим содержимым</entry>
<entry>name, content</entry>
</row>
<row>
<entry namest="c1" nameend="c3">Правый блок</entry>
</row>
<row>
<entry align="center">Создано: ДД.ММ.ГГ ЧЧ:ММ</entry>
<entry>Дата создания / получения / отправления документа</entry>
<entry>createDate</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/hook.png"/>
</entry>
<entry>Признак наличия дочерних документов</entry>
<entry>hasChildren</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para><emphasis role="italic">Признак происхождения</emphasis> отображается в виде пиктограммы, выбор пиктограммы зависит от поля
API &quot;type&quot;:</para>
<informaltable>
<tgroup cols="3">
<thead>
<colspec/>
<colspec/>
<colspec/>
<row>
<entry align="center">Иконка</entry>
<entry align="center">Описание</entry>
<entry align="center">Константа</entry>
</row>
</thead>
<tbody>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/system_document.png"/>
</entry>
<entry>Документ системы</entry>
<entry/>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/email_document.png"/>
</entry>
<entry>Электронное письмо</entry>
<entry/>
</row>
</tbody>
</tgroup>
</informaltable>
<para><emphasis role="italic">Признак наложенной на документ резолюции (поле API &quot;hasResolution&quot;)</emphasis> отображается в виде пиктограммы <graphic fileref="resources/img/documents/elements/resolution.png"/> и присутствует только для документов со свойством _______.</para>
<para><emphasis role="italic">Признак нахождения документа в процессе</emphasis> отображается в виде пиктограммы <graphic fileref="resources/img/documents/elements/document_on_proccess.png"/> и присутствует только для документов со свойством &quot;inProgress&quot;.</para>
<para><emphasis role="italic">Номер документа</emphasis> отображается только для зарегистрированных документов журнала (поле API &quot;number&quot;).</para>
<para><emphasis role="italic">Автор / Корреспондент</emphasis> отображается только для зарегистрированных документов журнала после номера (разделителем между номером и автором/корреспондентом должен быть знак &quot;тире&quot; с пробелами по обе стороны), заполняется:</para>
<itemizedlist>
<listitem>
<para>для журнала внутренних документов - автором (в формате&quot;Фамилия И.О.&quot;, поле API &quot;author&quot;);</para>
</listitem>
<listitem>
<para>для журнала входящих / исходящих документов - корреспондентом-организацией (поле API &quot;correspondentOrg&quot;) / корреспондентом (поле API &quot;correspondent&quot;, при отсутствии корреспондента-организации) / пусто (при отсутствии обоих полей корреспондента).</para>
</listitem>
</itemizedlist>
<para><emphasis role="italic">Статус зарегистрированного документа журнала (поле API &quot;statusID&quot;):</emphasis>
</para>
<itemizedlist>
<listitem>
<para>завершенный - константа &quot;FINISHED&quot; (статус &quot;Завершен&quot;) - отображается в виде пиктограммы <graphic fileref="resources/img/workflow/elements/progress_done_icon.png"/></para>
</listitem>
<listitem>
<para>незавершенный - константа &quot;IN_PROGRESS&quot; (статусы &quot;В работе&quot; / &quot;Истекает срок&quot; / &quot;Есть просроченные&quot;) - отображается в виде пиктограммы <graphic fileref="resources/img/documents/elements/calendar.png"/></para>
</listitem>
</itemizedlist>
<para><emphasis role="italic">Признак зарегистрированности документа журнала</emphasis> (поле API &quot;registered&quot;) отображается в виде пиктограммы и даты регистрации (для зарегистрированного документа, (поле API &quot;regDate&quot;) в формате &quot;ДД.ММ.ГГ&quot;. Выбор пиктограммы зависит от того, зарегистрирован ли документ журнала:</para>
<informaltable>
<tgroup cols="3">
<thead>
<colspec/>
<colspec/>
<colspec/>
<row>
<entry align="center">Иконка</entry>
<entry align="center">Описание</entry>
<entry align="center">Константа</entry>
</row>
</thead>
<tbody>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/registered_document.png"/>
</entry>
<entry>Документ зарегистрирован</entry>
<entry>true</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/documents/elements/document_for_registration.png"/>
</entry>
<entry>Документ на регистрации</entry>
<entry>false</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para><emphasis role="italic">Признак контрольности документа</emphasis> отображается в виде пиктограммы <graphic fileref="resources/img/documents/elements/control_document.png"/> и присутствует только для документов со свойством &quot;controlled&quot;.</para>
<para><emphasis role="italic">Признак бракованности документа</emphasis> присутствует только для документов со свойством &quot;defective&quot;, его краткое содержание выделяется цветом #b7b7b7 и отображается пиктограмма <graphic fileref="resources/img/documents/elements/defective_document.png"/>.</para>
<para><emphasis role="italic">Признак отклоненности документа</emphasis> присутствует только для документов со свойством &quot;statusID&quot;=&quot;REJECTED&quot;, его краткое содержание выделяется цветом #487cc2 и отображается пиктограмма <graphic fileref="resources/img/documents/elements/draft_document.png"/>.</para>
<note>
<para>Если документ одновременно отклоненный и бракованный, краткое содержание документа выделяется цветом бракованного #b7b7b7, последовательность иконок следующая: сначала бракованность, потом отклоненность.</para>
</note>
<para><emphasis role="italic">Пользователь, зарегистрировавший документ</emphasis> отображается только для зарегистрированных документов журнала (поле API &quot;regUser&quot;) с иконкой <graphic fileref="resources/img/documents/elements/registered_user.png"/> и текстом в формате &quot;Фамилия И.О.&quot;</para>
<para><emphasis role="italic">Пользователь, которому отписан документ</emphasis> отображается только для зарегистрированных документов журнала (поле API &quot;user&quot;) с подписью, загруженной при авторизации (например &quot;Отписано:&quot;) и текстом в формате &quot;Фамилия И.О.&quot;, занимает не более 1/3 ширины плашки (выравнивание по правому краю).</para>
<para><emphasis role="italic">Список пользователей, у которых документ находится на исполнении</emphasis> отображается только для зарегистрированных документов журнала (поле API &quot;resUsers&quot;) и содержит подпись &quot;На исполнении:&quot; и список пользователей (в зависимости от настройки &quot;отображать ли конечных пользователей на исполнении&quot;) в формате &quot;Фамилия И.О.&quot; через запятую. Занимает не более 2/3 ширины плашки (выравнивание по левому краю).</para>
<para><emphasis role="italic">Список адресатов/адресантов</emphasis> отображается только для полученных/отправленных документов пользователя:</para>
<itemizedlist>
<listitem>
<para>фильтр &quot;Полученные&quot; (поле API &quot;from&quot;) - подпись &quot;От:&quot; и список пользователей в формате &quot;Фамилия И.О.&quot;, перечисленных через запятую;</para>
</listitem>
<listitem>
<para>фильтр &quot;Отправленные&quot; (поле API &quot;to&quot;) - подпись &quot;Кому:&quot; и список пользователей в формате &quot;Фамилия И.О.&quot;, перечисленных через запятую;</para>
</listitem>
<listitem>
<para>остальные фильтры (включая &quot;Все&quot;):</para>
<itemizedlist>
<listitem>
<para>только полученный документ (поле API &quot;from&quot;) - подпись &quot;От:&quot; и список пользователей в формате &quot;Фамилия И.О.&quot;, перечисленных через запятую;</para>
</listitem>
<listitem>
<para>только отправленный документ (поле API &quot;to&quot;) - подпись &quot;Кому:&quot; и список пользователей в формате &quot;Фамилия И.О.&quot;, перечисленных через запятую;</para>
</listitem>
<listitem>
<para>и полученный, и отправленный документ - подписи &quot;От:&quot; и &quot;Кому:&quot; (на одну строку) и список пользователей в формате &quot;Фамилия И.О.&quot;, перечисленных через запятую.</para>
</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
<para>Если весь список адресатов/адресантов полностью не помещается на строке плашки, с правого края он должен быть затемнен
градиентом из прозрачного в цвет фона.</para>
<para><emphasis role="italic">Дата создания / получения / отправления документа</emphasis> отображается только для документов пользователя (поле API &quot;createDate&quot;) и заполняется подписью:</para>
<itemizedlist>
<listitem>
<para>&quot;Создано:&quot; - если на плашке нет полей &quot;От&quot; и &quot;Кому&quot;;</para>
</listitem>
<listitem>
<para>&quot;Получено:&quot; - если на плашке есть только поле &quot;От&quot;;</para>
</listitem>
<listitem>
<para>&quot;Отправлено:&quot; - если на плашке есть только поле &quot;Кому&quot;;</para>
</listitem>
</itemizedlist>
<para>соответственно и датой и временем последнего выполненного действия с документом в формате &quot;ДД.ММ.ГГ ЧЧ:ММ&quot;.</para>
<para><emphasis role="italic">Краткое содержание документа (поле API &quot;name&quot;), через дефис значащее содержимое (поле API &quot;content&quot;),</emphasis> отображаются максимум на 3 (три) строки. Если текст краткого содержания содержит менее трех строк, то должна меняться минимальная высота плашки в соответствии с количеством строк краткого содержания (но не более трех строк). Если же полностью не помещается на плашке, то с правого края третьей строки оно должно быть затемнено
градиентом из прозрачного в цвет фона.</para>
<para>Цвет краткого содержания документа журнала зависит от его свойств и времени, оставшегося до завершения работ по документу:</para>
<informaltable frame="all" id="table.workflow_work_processes_3">
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<colspec colname="c3"/>
<thead>
<row>
<entry align="center">Условие</entry>
<entry align="center">Поле API</entry>
<entry align="center">Цвет краткого содержания</entry>
</row>
</thead>
<tbody>
<row>
<entry>Если хотя бы одна работа по маршруту документа просрочена</entry>
<entry>is_expired</entry>
<entry class="background-color=red">#be3d3d</entry>
</row>
<row>
<entry>Если хотя бы у одной работы по маршруту документа истекает срок</entry>
<entry>is_soon_expired</entry>
<entry>#a57020</entry>
</row>
<row>
<entry>Если документ бракованный</entry>
<entry>defective</entry>
<entry>#b7b7b7</entry>
</row>
<row>
<entry>Иначе</entry>
<entry/>
<entry>#487cc2</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Краткое содержание документов пользователя (раздел &quot;Все&quot;) всегда выделяются цветом #487cc2. Значащее содержимое всегда и везде выделяется только цветом #83aade (независимо от любых других условий).</para>
<para>Если по данному документу имеются непросмотренные уведомления (поле API &quot;is_new&quot;=true), документ должен быть выделен полужирным.</para>
<para>Жирное выделение документа снимется тогда, когда пользователь просмотрит информацию о нем.</para>
<para><emphasis wordsize="" role="bold">Возможные действия с плашкой документа:</emphasis></para>
<orderedlist>
<listitem>
<para>При выделении плашки (tap) открывается экран с информацией о документе (не зависимо от прав пользователя).</para>
</listitem>
<listitem>
<para>Двойное нажатие по плашке (double tap), а также масштабирование плашки сведением и разведением пальцев (pinch-to-zoom) отсутствует.</para>
</listitem>
<listitem>
<para>В результате долгого нажатия по плашке документа появляется меню с пунктом, доступным для любого пользователя:</para>
<orderedlist>
<listitem>
<para>&quot;Скрыть&quot; / &quot;Восстановить&quot; (поле hide) - только для активного узла дерева &quot;Все&quot;.</para>
</listitem>
</orderedlist>
</listitem>
</orderedlist>
<para><emphasis role="bold">Переходы на другие экраны</emphasis> аналогичны списку документов для смартфона (<xref linkend="sec.documents_list"/>).</para>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.documents_route_starting">
<title>Запуск маршрута</title>
<para><emphasis role="bold">Запуск маршрута.</emphasis></para>
<para>По нажатию управляющей кнопки открывается экран запуска маршрута (<xref linkend="fig.documents_route_running"/>). При открытии экрана API должно возвращать следующую информацию:</para>
<itemizedlist>
<listitem>
<para>наименование формы документа;</para>
</listitem>
<listitem>
<para>маршрут активации документа, определенный в конфигураторе для данного реестра;</para>
</listitem>
<listitem>
<para>заголовок блока (для каждой из частей маршрута);</para>
</listitem>
<listitem>
<para>отображать ли при сохранении (для каждой из частей маршрута);</para>
</listitem>
<listitem>
<para>закрывать ли окно документа после отправки на активацию.</para>
</listitem>
</itemizedlist>
<figure id="fig.documents_route_running">
<title>Запуск маршрута</title>
<graphic fileref="resources/img/documents/route_running.png" align="center"/>
<graphic fileref="resources/img/documents/iOS/route_running.png" align="center"/>
</figure>
<para>Все поля экрана не имеют фиксированной высоты (контентозависимы), экран прокручивается.</para>
<para>Вверху экрана отображается поле &quot;Формулировка&quot;, заполненное по умолчанию полным названием формы. Поле редактируемо.</para>
<para>Далее идут панели согласно предварительно настроенного в конфигураторе маршрута. Для каждого из блоков (редактируемый / нередактируемый) отображается отдельная панель с соответствующим заголовком. Панель содержит этапы / подэтапы маршрута.</para>
<para>Если значение настройки &quot;отображать ли при сохранении&quot; = true, то панель соответствующей части маршрута должна отображаться (даже в случае отсутствия в ней этапов), иначе - не отображаться.</para>
<para>Каждый элемент панели содержит следующую информацию об этапе:</para>
<itemizedlist>
<listitem>
<para>Название: <emphasis role="italic">&apos;Название_этапа&apos;</emphasis></para>
</listitem>
<listitem>
<para>Ответственный: <emphasis role="italic">Фамилия И.О.</emphasis> (если пользователь один)</para>
<para>либо</para>
<para>Ответственные: <emphasis role="italic">Фамилия И.О., Фамилия И.О.</emphasis> и т.д. (если пользователей несколько)</para>
</listitem>
<listitem>
<para>Тип работы: <emphasis role="italic">&apos;Тип_работы&apos;</emphasis></para>
</listitem>
</itemizedlist>
<para>Для редактируемых блоков в результате нажатия по этой панели (в т.ч. по заголовку) открывается экран редактирования соответствующей части маршрута (<xref linkend="fig.documents_unit_edited"/>).</para>
<para>Если пользователь нажимает на кнопку &quot;Назад&quot;, возвращается экран создания документа (<xref linkend="sec.document_creation"/>) в том же состоянии, которое было до вызова данного экрана.</para>
<para>Для выполнения действия пользователь нажимает на кнопку &quot;Запустить&quot;. Действие выполняется при выполнении следующих условий:</para>
<itemizedlist>
<listitem>
<para>заполнено поле формулировки;</para>
</listitem>
<listitem>
<para>во всех редактируемых блоках указаны пользователи - ответственные за этап маршрута.</para>
</listitem>
</itemizedlist>
<para>В случае неуспешного сохранения выдается сообщение об ошибке, пользователь остается на экране запуска маршрута. В случае же успешного сохранения сообщается &quot;Данные сохранены&quot;, экран запуска маршрута закрывается, открывается:</para>
<itemizedlist>
<listitem>
<para>если значение настройки &quot;закрывать ли окно документа после отправки на активацию&quot; = false, то экран информации о документе (<xref linkend="sec.documents_docinfo"/>);</para>
</listitem>
<listitem>
<para>иначе - экран со списком документов (<xref linkend="sec.documents_list"/>).</para>
</listitem>
</itemizedlist>
<para>Данные при этом обновляются.</para>
<para><emphasis role="bold">Редактирование маршрута.</emphasis></para>
<para>По нажатию на редактируемый блок открывается экран редактирования соответствующей части маршрута (<xref linkend="fig.documents_unit_edited"/>). Заголовок экрана берется из заголовка блока.</para>
<figure id="fig.documents_unit_edited">
<title>Редактируемый блок</title>
<graphic fileref="resources/img/documents/unit_edited.png" align="center"/>
<graphic fileref="resources/img/documents/iOS/unit_edited.png" align="center"/>
</figure>
<para>Вверху экрана отображается кнопка &quot;Добавить этап&quot; (с идентификатором NOT_PREFFERED), по нажатию которой открывается экран редактирования этапа маршрута (<xref linkend="fig.documents_route_stage_edit"/>). Далее отображаются панели. Панель содержит элементы, в зависимости от количества подэтапов в ней. Каждая панель означает последовательные этапы маршрута (последовательность сверху вниз), каждая плашка внутри панели - параллельные элементы этапа.</para>
<para>Каждый элемент панели содержит аналогичную информацию об этапе/подэтапе, как и на экране запуска маршрута.</para>
<para>В результате нажатия по элементу панели открывается экран редактирования данного этапа маршрута (<xref linkend="fig.documents_route_stage_edit"/>) с заполненными данными. Если пользователь в этом случае на экране редактирования этапа маршрута нажимает на кнопку &quot;Назад&quot;, мобильный клиент возвращает экран редактирования той части маршрута и в том состоянии, которое было до вызова данного экрана.</para>
<para>В результате долгого нажатия по элементу панели вызывается меню со следующими пунктами &quot;Добавить элемент этапа&quot;, &quot;Переместить этап выше&quot;, &quot;Переместить этап ниже&quot;, &quot;Удалить элемент этапа&quot;, &quot;Удалить этап&quot;.</para>
<itemizedlist>
<listitem>
<para>По нажатию &quot;Добавить элемент этапа&quot; открывается экран редактирования этапа маршрута (<xref linkend="fig.documents_route_stage_edit"/>).</para>
</listitem>
<listitem>
<para>По нажатию &quot;Переместить этап выше&quot; выбранная панель перемещается выше на одну позицию. Пункт меню недоступен для первой в списке панели.</para>
</listitem>
<listitem>
<para>По нажатию &quot;Переместить этап ниже&quot; выбранная панель перемещается ниже на одну позицию. Пункт меню недоступен для последней в списке панели.</para>
</listitem>
<listitem>
<para>По нажатию &quot;Удалить элемент этапа&quot; запрашивается подтверждение удаления с сообщением &quot;Вы действительно хотите удалить данный элемент этапа?&quot; Если пользователь подтверждает удаление, выбранный элемент панели удаляется из выбранной панели. Пункт меню недоступен для панели с единственным элементом.</para>
</listitem>
<listitem>
<para>По нажатию &quot;Удалить этап&quot; запрашивается подтверждение удаления с сообщением &quot;Вы действительно хотите удалить данный этап?&quot; Если пользователь подтверждает удаление, выбранная панель удаляется из списка этапов маршрута.</para>
</listitem>
</itemizedlist>
<para>Каждый новый добавленный этап добавляется в список последним.</para>
<para>Если пользователь на экране редактирования маршрута нажимает на кнопку &quot;Назад&quot;, мобильный клиент возвращает экран запуска маршрута (<xref linkend="fig.documents_route_running"/>) в том состоянии, которое было до вызова данного экрана.</para>
<para>Для сохранения маршрута пользователь нажимает на кнопку &quot;Готово&quot;. Сохранение локальное. В случае неуспешного сохранения выдается сообщение об ошибке, пользователь остается на экране редактирования маршрута. В случае же успешного сохранения сообщается &quot;Данные сохранены&quot;, экран редактирования маршрута закрывается, открывается экран запуска маршрута (<xref linkend="fig.documents_route_running"/>). Данные в этом экране обновляются согласно введеным изменениям.</para>
<para><emphasis role="bold">Редактирование этапа маршрута.</emphasis></para>
<para>По нажатию на какой-либо элемент панели открывается экран редактирования соответствующего элемента этапа маршрута (<xref linkend="fig.documents_route_stage_edit"/>). Заголовок экрана всегда &quot;Этап&quot;.</para>
<figure id="fig.documents_route_stage_edit">
<title>Редактор этапа маршрута</title>
<graphic fileref="resources/img/documents/route_stage_edit.png" align="center"/>
<graphic fileref="resources/img/documents/iOS/route_stage_edit.png" align="center"/>
</figure>
<para>Все поля экрана не имеют фиксированной высоты, экран прокручивается.</para>
<para>Параметры редактирования:</para>
<informaltable frame="all">
<tgroup cols="4">
<colspec colname="c1"/>
<colspec colname="c2"/>
<thead>
<row>
<entry align="center">Параметр</entry>
<entry align="center">Описание при добавлении нового этапа</entry>
<entry align="center">Значение по умолчанию</entry>
<entry align="center">Описание при изменении уже созданного этапа</entry>
</row>
</thead>
<tbody>
<row>
<entry>Название</entry>
<entry>Вводится полное название этапа (автоматический подбор согласно выбранного действия, как в десктопном клиенте, не поддерживается).</entry>
<entry>Поле пустое, placeholder - &quot;Введите название&quot;.</entry>
<entry>Отображается сохраненное название, поле редактируемо.</entry>
</row>
<row>
<entry>Ответственный</entry>
<entry>Открывается экран &quot;Пользователи&quot; (<xref linkend="fig.workflow_user_chooser_1"/>), параметры: <itemizedlist>
<listitem>
<para>множественный выбор пользователей;</para>
</listitem>
<listitem>
<para>если значение настройки &quot;разрешено ли ставить работы неподчиненным&quot; = true, отображать всех пользователей, иначе - только подчиненных.</para>
</listitem>
</itemizedlist></entry>
<entry>Флажок включен, поле пустое, placeholder - &quot;Введите ответственного&quot;.</entry>
<entry>Открывается экран &quot;Пользователи&quot; (<xref linkend="fig.workflow_user_chooser_1"/>), параметры: <itemizedlist>
<listitem>
<para>множественный выбор пользователей;</para>
</listitem>
<listitem>
<para>если значение настройки &quot;разрешено ли ставить работы неподчиненным&quot; = true, отображать всех пользователей, иначе - только подчиненных.</para>
</listitem>
</itemizedlist></entry>
</row>
<row>
<entry>Действие</entry>
<entry>Открывается список из возможных значений (полученных при загрузке приложения).</entry>
<entry>&quot;Работа&quot;</entry>
<entry>Открывается список из возможных значений (полученных при загрузке приложения).</entry>
</row>
<row>
<entry>Нагрузка</entry>
<entry>Поле пока будет недоступным.</entry>
<entry>&quot;20%&quot;</entry>
<entry>Поле пока будет недоступным.</entry>
</row>
<row>
<entry>Возврат</entry>
<entry>Поле пока будет недоступным.</entry>
<entry>&quot;Нет&quot;</entry>
<entry>Поле пока будет недоступным.</entry>
</row>
<row>
<entry>Длительность</entry>
<entry>Поле пока будет недоступным.</entry>
<entry>&quot;&quot;</entry>
<entry>Поле пока будет недоступным.</entry>
</row>
<row>
<entry>Форма завершения</entry>
<entry>Открывается список из возможных значений (полученных при загрузке приложения) и значения &quot;Нет&quot;, значение &quot;Нет&quot; должно быть в списке первым. Если список форм завершения пуст, поле не должно быть отображено.</entry>
<entry>&quot;Нет&quot;</entry>
<entry>Открывается список из возможных значений (полученных при загрузке приложения) и значения &quot;Нет&quot;, значение &quot;Нет&quot; должно быть в списке первым. Если список форм завершения пуст, поле не должно быть отображено.</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Обязательность заполнения полей зависит от выбранного типа действия (форма завершения всегда необязательна):</para>
<itemizedlist>
<listitem>
<para>&quot;Работа&quot; / &quot;Согласование&quot; / &quot;Утверждение&quot; / &quot;Ознакомление&quot; / &quot;Отправка документа&quot;: название и ответственный;</para>
</listitem>
<listitem>
<para>&quot;Блокирующий процесс&quot;: название (&quot;event.&quot; заполняются по умолчанию), поле ответственного недоступно;</para>
</listitem>
<listitem>
<para>&quot;Регистрация&quot;: название, поле ответственного недоступно;</para>
</listitem>
<listitem>
<para>&quot;Маршрут&quot; (<xref linkend="fig.documents_route_choose"/>): поля названия и ответственного недоступно.</para>
</listitem>
</itemizedlist>
<para>Если пользователь на экране редактирования этапа маршрута нажимает на кнопку &quot;Назад&quot;, мобильный клиент возвращает экран редактирования маршрута (<xref linkend="fig.documents_unit_edited"/>) в том состоянии, которое было до вызова данного экрана.</para>
<para>Для сохранения выбранного маршрута пользователь нажимает на кнопку &quot;Готово&quot;. Сохранение локальное. Действие выполняется, только если заполнены обязательные поля. В случае неуспешного сохранения выдается сообщение об ошибке, пользователь остается на экране редактирования этапа маршрута. В случае же успешного сохранения сообщается &quot;Данные сохранены&quot;, экран редактирования этапа маршрута закрывается, открывается экран редактирования маршрута (<xref linkend="fig.documents_unit_edited"/>). Данные в этом экране обновляются согласно введеным изменениям (обновляются содержимое панелей).</para>
<para><emphasis role="bold">Выбор маршрута.</emphasis></para>
<para>Для выбранного действия &quot;Маршрут&quot; открывается экран выбора маршрута (<xref linkend="fig.documents_route_choose"/>). При открытии экрана API должно возвращать следующую информацию:</para>
<itemizedlist>
<listitem>
<para>список маршрутов, доступных авторизованному пользователю;</para>
</listitem>
<listitem>
<para>ФИО пользователя - автора каждого из маршрутов.</para>
</listitem>
</itemizedlist>
<figure id="fig.documents_route_choose">
<title>Выбор маршрута</title>
<graphic fileref="resources/img/documents/route_choose.png" align="center"/>
<graphic fileref="resources/img/documents/iOS/route_choose.png" align="center"/>
</figure>
<para>Панель со списком имеет фиксированное положение, прокрутка списка скроллом осуществляется внутри панели. Отображается &quot;Фамилия И.О.&quot; автора маршрута и полное название маршрута.</para>
<para>Если пользователь на экране выбора маршрута нажимает на кнопку &quot;Назад&quot;, мобильный клиент возвращает экран редактирования этапа маршрута (<xref linkend="fig.documents_route_stage_edit"/>) в том состоянии, которое было до вызова данного экрана.</para>
<para>Для сохранения выбранного маршрута пользователь нажимает на кнопку &quot;Готово&quot;. Сохранение локальное. Действие выполняется, только если выделен маршрут. В случае неуспешного сохранения выдается сообщение об ошибке, пользователь остается на экране выбора маршрута. В случае же успешного сохранения сообщается &quot;Данные сохранены&quot;, экран выбора маршрута закрывается, открывается экран редактирования этапа маршрута (<xref linkend="fig.documents_route_stage_edit"/>). Данные в этом экране обновляются согласно введеным изменениям, а именно в поле &quot;Действие&quot; добавляется новый пункт в список - выбранный маршрут, он же сменяет предыдущее значение.</para>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.documents_subsidiary_docs">
<title>Дочерние документы</title>
<para>Для того, чтобы просмотреть дочерние документы для данного, пользователь должен провести пальцем от правой стороны плашки документа к левой, при этом раскроется правая панель дочерних документов к данному (<xref linkend="fig.documents_subsidiary_docs"/>, <xref linkend="fig.documents_subsidiary_docs_1"/>).</para>
<figure id="fig.documents_subsidiary_docs">
<title>Дочерние документы для смартфона</title>
<graphic fileref="resources/img/documents/subsidiary_docs_smartphone.png" align="center"/>
</figure>
<figure id="fig.documents_subsidiary_docs_1">
<title>Дочерние документы для планшета</title>
<graphic fileref="resources/img/documents/subsidiary_docs_tablet.png" align="center"/>
</figure>
<para>Родительский документ отличается от дочерних фоном (#efefef) и полужирным выделением (всегда, независимо от значения поля &quot;is_new&quot;), отображается в самом начале списка. </para>
<para>Логика отображения остальных плашек аналогична главному экрану со списком документов (<xref linkend="sec.documents_list"/>, <xref linkend="sec.documents_list_tablet"/>).</para>
<para><emphasis role="bold">Переходы на другие экраны.</emphasis></para>
<para>Чтобы перейти к дочерним документам данного дочернего документа, пользователь проводит пальцем от правой стороны плашки к левой (<xref linkend="sec.documents_subsidiary_docs"/>).</para>
<para>По нажатию на плашку документа открывается экран полной информации о документе (<xref linkend="sec.documents_docinfo"/>).</para>
<para>По нажатию на кнопку &quot;Назад&quot; пользователь возвращается на 1 (один) уровень вложенности вверх.</para>
<para>Панель можно скрыть двумя способами (переход из любого уровня вложенности на главный экран со списком документов):</para>
<orderedlist>
<listitem>
<para>проведя пальцем от левой стороны экрана к правой;</para>
</listitem>
<listitem>
<para>нажав по любому месту левой стороны экрана (там, где отображается часть экрана списка документов).</para>
</listitem>
</orderedlist>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.documents_work_information">
<title>Верхняя панель, панель с параметрами документа и панель с параметрами работы по документу</title>
<para><emphasis role="bold">Верхняя панель</emphasis> идентична таковой в потоках работ (<xref linkend="sec.workflow_work_information"/>).</para>
<para><emphasis role="bold">Панель с параметрами документа</emphasis> может быть в двух состояниях.</para>
<itemizedlist>
<listitem>
<para>С неполной информацией о документе - содержит краткое содержание (поле API &quot;name&quot;), через дефис значащее содержимое (поле API &quot;content&quot;) документа и кнопку &quot;Подробнее&quot; (<xref linkend="fig.documents_witout_works"/>). Текст краткого содержанияотображается максимум на 3 (три) строки. Если текста менее трех строк, то должна меняться минимальная высота панели в соответствии с количеством строк краткого содержания (но не более трех строк). Если же полностью не помещается на плашке, то с правого края третьей строки оно должно быть затемнено
градиентом из прозрачного в цвет фона.</para>
<figure id="fig.documents_witout_works">
<title>Панель неполной информации о документе, а также пример информации о документе без работ</title>
<graphic fileref="resources/img/documents/documents_witout_works.png" align="center"/>
<graphic fileref="resources/img/documents/iOS/documents_witout_works.png" align="center"/>
</figure>
</listitem>
<listitem>
<para>С полной информацией о документе - содержимое полностью аналогично таковому в полной плашке смартфона (<xref linkend="sec.documents_list"/>, раздел &quot;Полная плашка документа), а также кнопка &quot;Скрыть&quot; (<xref linkend="fig.documents_full_information"/>).</para>
<figure id="fig.documents_full_information">
<title>Панель полной информации о документе</title>
<graphic fileref="resources/img/documents/documents_full_information.png" align="center"/>
<graphic fileref="resources/img/documents/iOS/documents_full_information.png" align="center"/>
</figure>
</listitem>
</itemizedlist>
<para>Переключение между состояниями панели происходит только по нажатию кнопок &quot;Подробнее&quot; и &quot;Скрыть&quot;.</para>
<para><emphasis role="bold">Панель с параметрами работы по документу</emphasis> также аналогична таковой в потоках работ (<xref linkend="sec.workflow_work_information"/>), но со следующими двумя дополнениями:</para>
<orderedlist>
<listitem>
<para>Если открыта информация о документе без работ (<xref linkend="fig.documents_witout_works"/>), то панель не отображается.</para>
</listitem>
<listitem>
<para>Если пользователь по данному документу имеет несколько работ, то к панели добавляется индикация в виде набора маркеров (<xref linkend="fig.documents_neskolko_works"/>, <xref linkend="fig.documents_neskolko_works_sencha"/>), где выделенный маркер показывает номер текущей работы, а их общее количество равно количеству работ по документу. Переключаться между работами можно с помощью жеста &quot;swipe&quot; вправо и влево по панели (для Sencha жест &quot;swipe&quot; недоступен, переключение должно происходить по нажатию кнопок вправо и влево). При переключении между работами набор управляющих кнопок меняется согласно активной работе по документу.</para>
<figure id="fig.documents_neskolko_works">
<title>Несколько работ по документу</title>
<graphic fileref="resources/img/documents/documents_neskolko_works.png" align="center"/>
<graphic fileref="resources/img/documents/iOS/documents_neskolko_works.png" align="center"/>
</figure>
<figure id="fig.documents_neskolko_works_sencha">
<title>Несколько работ по документу (Sencha)</title>
<graphic fileref="resources/img/documents/iOS/documents_neskolko_works_sencha.png" align="center"/>
</figure>
</listitem>
</orderedlist>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<chapter id="sec.app_exit">
<title>Закрытие приложения</title>
<para><emphasis role="bold">Закрытие приложения для платформы Android:</emphasis></para>
<orderedlist>
<listitem>
<para>По нажатию на кнопку &quot;Домой&quot; - приложение сворачивается, в памяти остается активный процесс.</para>
</listitem>
<listitem>
<para>По нажатию на кнопку &quot;Назад&quot; с экрана авторизации / с экрана со списком работ - приложение закрывается, в памяти удаляется активный процесс, но остается фоновый.</para>
</listitem>
</orderedlist>
<para><emphasis role="bold">Закрытие приложения для платформы iOS:</emphasis> по нажатию на кнопку &quot;Домой&quot; - приложение сворачивается, в памяти остается активный процесс.</para>
</chapter>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<book lang="ru">
<bookinfo>
<title> Спецификация на мобильный клиент ARTA SYNERGY</title>
<subtitle>Система для координации работы на предприятии &quot;ARTA SYNERGY&quot;</subtitle>
<authorgroup>
<author>
<surname>Тлепов</surname>
<firstname>Данир</firstname>
<email>d.tlepov@arta.kz</email>
</author>
</authorgroup>
<revhistory>
<revision>
<revnumber>0.1 </revnumber>
<date>16.06.2013</date>
<revremark>Первая версия документа (модуль &quot;Потоки работ&quot;)</revremark>
</revision>
<revision>
<revnumber>1.0</revnumber>
<date>09.07.2013</date>
<revremark>Финальная версия документа (модуль &quot;Потоки работ&quot;)</revremark>
</revision>
<revision>
<revnumber>1.1</revnumber>
<date>05.11.2013</date>
<revremark>Финальная исправленная версия документа (модуль &quot;Потоки работ&quot;)</revremark>
</revision>
<revision>
<revnumber>1.2</revnumber>
<date>10.02.2014</date>
<revremark>Дополнения: push-уведомления (раздел 5) и считывание QR-кода при авторизации (раздел 3)</revremark>
</revision>
<revision>
<revnumber>1.3</revnumber>
<date>30.04.2014</date>
<revremark>Дополнения: наложение резолюций</revremark>
</revision>
<revision>
<revnumber>1.4</revnumber>
<date>30.05.2014</date>
<revremark>Дополнения: новый модуль &quot;Документы&quot;</revremark>
</revision>
<revision>
<revnumber>1.5</revnumber>
<date>15.09.2014</date>
<revremark>Дополнения: новый модуль &quot;Оффлайн-работа с приложением&quot;</revremark>
</revision>
</revhistory>
</bookinfo>
<!--Введение--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="base/introduction.xml" encoding="UTF-8"/>
<!--Общие сведения--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="base/base.xml" encoding="UTF-8"/>
<!--Авторизация--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="autorise/autorise.xml" encoding="UTF-8"/>
<!--Потоки работ--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow/workflow.xml" encoding="UTF-8"/>
<!--Документы--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="documents/documents.xml" encoding="UTF-8"/>
<!--Размеры и отступы--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="sizes_and_spacing/index.xml" encoding="UTF-8"/>
<!--Уведомления--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="push/push_notifications.xml" encoding="UTF-8"/>
<!--Оффлайн-работа с приложением--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="offline/offline_index.xml" encoding="UTF-8"/>
<!--Настройки--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="settings/settings.xml" encoding="UTF-8"/>
<!--Выход из приложения--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="exit/app_exit.xml" encoding="UTF-8"/>
</book>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<chapter id="sec.offline">
<title>Оффлайн-работа с приложением</title>
<note>
<para>Оффлайн-работа с мобильным клиентом осуществляется только для включенного флажка &quot;Синхронизировать данные для автономной работы&quot; (<xref linkend="sec.settings"/>) и только при наличии данных хотя бы одной успешной синхронизации.</para>
</note>
<section id="sec.offline_full_synchronization">
<title>Полная синхронизация</title>
<para>Под полной синхронизацией будем понимать синхронизацию следующих данных:</para>
<itemizedlist>
<listitem>
<para>список фильтров потоков работ (<xref linkend="sec.workflow_filters"/>):</para>
<itemizedlist>
<listitem>
<para>загружаются все основные фильтры;</para>
</listitem>
<listitem>
<para>загружаются все остальные подфильтры пользователя любого уровня вложенности;</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>список работ (<xref linkend="sec.workflow_works"/>):</para>
<itemizedlist>
<listitem>
<para>загружаются весь список работ пользователя всех его корневых фильтров;</para>
</listitem>
<listitem>
<para>загружаются последние 30 работ каждого из остальных подфильтров;</para>
</listitem>
<listitem>
<para>загружается вся информация с плашки загружаемой работы;</para>
</listitem>
<listitem>
<para>дочерние работы не загружаются;</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>информация о работе (<xref linkend="sec.workflow_workinfo"/>):</para>
<itemizedlist>
<listitem>
<para>панель с параметрами работы;</para>
</listitem>
<listitem>
<para>панель формы завершения;</para>
</listitem>
<listitem>
<para>панель комментариев;</para>
</listitem>
<listitem>
<para>панель вложений;</para>
</listitem>
<listitem>
<para>управляющие кнопки.</para>
</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
<para>Данные в <emphasis role="italic">панели с параметрами работы</emphasis> должны синхронизироваться полностью: полная формулировка работы, автор и ответственный, сроки и прогресс работы.</para>
<para>Данные в <emphasis role="italic">панели формы завершения</emphasis> должны синхронизироваться следующим образом - форма завершения должна синхронизироваться полностью, а результат завершения:</para>
<itemizedlist>
<listitem>
<para>&quot;комментарий&quot; - должен синхронизироваться полностью;</para>
</listitem>
<listitem>
<para>&quot;файл&quot; и &quot;форма&quot; - иконка и название файла должны синхронизироваться всегда и полностью, а сам файл - согласно настройки загрузки вложений.</para>
</listitem>
</itemizedlist>
<para>Данные в <emphasis role="italic">панели комментариев</emphasis> должны синхронизироваться полностью: иконки, автор, текст и время написания комментария, а также их общее количество с возможностью перейти ко всем комментариям. Должны синхронизироваться все комментарии всех загружаемых работ пользователя.</para>
<para>Данные в <emphasis role="italic">панели вложений</emphasis> должны синхронизироваться следующим образом:</para>
<itemizedlist>
<listitem>
<para>иконка и название файла должны синхронизироваться всегда и полностью, а также их общее количество с возможностью перейти ко всем вложениям;</para>
</listitem>
<listitem>
<para>сами файлы - согласно настройки загрузки вложений.</para>
</listitem>
</itemizedlist>
<para>Таким образом должны синхронизироваться все вложения всех загружаемых работ пользователя.</para>
<para>Данные <emphasis role="italic">управляющих кнопок</emphasis> должны синхронизироваться полностью: ее наличие, название и цвет. По их нажатию в режиме оффлайн ничего происходить не должно.</para>
<para>Полная синхронизация должна происходить в следующих случаях:</para>
<itemizedlist>
<listitem>
<para>при каждом входе в приложение при наличии доступа к сети;</para>
</listitem>
<listitem>
<para>по заданному периоду синхронизации (период рассчитывается относительно последней успешной синхронизации); </para>
</listitem>
<listitem>
<para>при ручном запуске синхронизации через навигатор.</para>
</listitem>
</itemizedlist>
<para>При запуске процесса синхронизации мобильный клиент должен отправить системное уведомление &quot;Началась синхронизация&quot;. По нажатию на это уведомление должен открыться мобильный клиент с открытым навигатором, само уведомление при этом должно удалиться. Нижняя панель навигатора при этом должна отображать прогресс процесса синхронизации (<xref linkend="fig.offline_navigator_in_process"/>). Сам процесс должен логироваться.</para>
<figure id="fig.offline_navigator_in_process">
<title>Прогресс процесса синхронизации</title>
<graphic fileref="resources/img/offline/navigator_in_process.png" align="center"/>
</figure>
<para>В случае неуспешного завершения процесса (в т.ч. обрыв соединения / отказ сервера / отказ устройства) нижняя панель навигатора должна отобразить предыдущее сообщение, мобильный клиент должен отправить системное уведомление &quot;Процесс синхронизации завершен неуспешно&quot;. По нажатию на это уведомление должен открыться экран журнала синхронизации (<xref linkend="sec.offline_journal_synchronization"/>), само уведомление при этом должно удалиться.</para>
<para>В случае же успешного завершения процесса синхронизации нижняя панель навигатора должна отобразить новое сообщение, мобильный клиент должен отправить системное уведомление &quot;Процесс синхронизации завершен успешно&quot;. По нажатию на это уведомление должен открыться экран журнала синхронизации, аналогичный предыдущему (<xref linkend="sec.offline_journal_synchronization"/>), само уведомление при этом должно удалиться.</para>
</section>
<section id="sec.offline_partial_synchronization">
<title>Синхронизация по запросу пользователя</title>
<para>Под синхронизацией по запросу пользователя будем понимать синхронизацию списка работ того фильтра, из которого был вызван сам процесс. Процесс может быть осуществлен только при наличии данных полной синхронизации.</para>
<para>Процесс синхронизации по запросу пользователя может быть вызван только вручную, при обновлении списка работ любого из фильтров.</para>
<para>Отображение прогресса, уведомлений и журнала полностью аналогичны процессу полной синхронизации (<xref linkend="sec.offline_full_synchronization"/>).</para>
</section>
<section id="sec.offline_work">
<title>Автономная работа</title>
<para><emphasis role="italic">1. Отсутствует соединение с сервером и при этом открывается приложение.</emphasis></para>
<para>Приложение сразу загружается в автономном режиме, авторизация происходит по сохраненным на устройстве данным (из менеджера аккаунтов).</para>
<para><emphasis role="italic">2. Приложение открыто и работает в режиме онлайн, соединение с сервером пропало.</emphasis></para>
<para>После обрыва соединения с сервером выполнение любого следующего действия (обновление списка работ, открытие дочерних работ / навигатора / информации о работе, нажатие на любую кнопку) приводит к тому, что приложение должно переключиться в автономный режим и должны загрузиться данные синхронизации. При этом на 10 секунд под верхней панелью любого экрана (за исключением экрана авторизации) на всю ширину экрана должна отобразиться полоска с иконкой <graphic fileref="resources/img/offline/icon_offline.png"/> и сообщением &quot;Включен автономный режим&quot; (<xref linkend="fig.offline_message"/>).</para>
<figure id="fig.offline_message">
<title>Сообщение о переходе в автономный режим</title>
<graphic fileref="resources/img/offline/offline_message.png" align="center"/>
<graphic fileref="resources/img/offline/offline_message_ios.png" align="center"/>
</figure>
<para><emphasis role="italic">3. Приложение открыто и работает в режиме оффлайн, установилось соединение с сервером.</emphasis></para>
<para>Аналогично с п.2: после установления соединения с сервером выполнение любого следующего действия (обновление списка работ, открытие дочерних работ / навигатора / информации о работе, нажатие на любую кнопку) приводит к тому, что приложение должно переключиться в режим онлайн и должны сначала отправиться измененные в автономном режиме данные на сервер, затем загрузиться актуальные данные с сервера. При этом на 10 секунд под верхней панелью любого экрана (за исключением экрана авторизации) на всю ширину экрана должна отобразиться полоска с иконкой <graphic fileref="resources/img/offline/icon_online.png"/> и сообщением &quot;Связь восстановлена&quot; (<xref linkend="fig.online_message"/>).</para>
<figure id="fig.online_message">
<title>Сообщение о переходе в режим онлайн</title>
<graphic fileref="resources/img/offline/online_message.png" align="center"/>
<graphic fileref="resources/img/offline/online_message_ios.png" align="center"/>
</figure>
<note>
<para>Размер, шрифт и цвет текста для оффлайна - 7pt, HelveticaNeueCyr Light, #e7eafa.</para>
<para>Размер, шрифт и цвет текста для онлайна - 7pt, HelveticaNeueCyr Light, #8fdd94.</para>
<para>Цвет фона сообщения - #05091f с прозрачностью 50 %, высота - 42px.</para>
<para>Цвет линии после фона - #121927, размер - 1px.</para>
</note>
<para>Работа приложения в автономном режиме подразумевает:</para>
<itemizedlist>
<listitem>
<para>отображение и выбор любого из фильтров навигатора модуля потоков работ;</para>
</listitem>
<listitem>
<para>отображение списка работ согласно выбранного фильтра;</para>
</listitem>
<listitem>
<para>отображение информации о работе;</para>
</listitem>
<listitem>
<para>отображение всех комментариев к работе (в т.ч. возможность изменения / удаления комментариев);</para>
</listitem>
<listitem>
<para>отображение списка и, опционально, содержимого всех вложений к работе (в т.ч. возможность удаления вложений);</para>
</listitem>
<listitem>
<para>изменение прогресса работы;</para>
</listitem>
<listitem>
<para>завершение работы (в т.ч. с формой завершения);</para>
</listitem>
<listitem>
<para>добавление / изменение / удаление комментариев работы;</para>
</listitem>
<listitem>
<para>добавление / удаление файлов работы.</para>
</listitem>
</itemizedlist>
<note>
<para>Выполнение любого из 4 последних пунктов должно изменять атрибуты работы и в автономном режиме также, как это происходит в режиме онлайн.</para>
</note>
<section id="sec.offline_edit_progress">
<title>Изменение прогресса работы</title>
<para>В режиме оффлайн ползунок прогресса работы, при его наличии, доступен для редактирования. Необходимо фиксировать время последнего изменения прогресса на устройстве. Применение измененного в оффлайне значения прогресса должно происходить по следующему алгоритму.</para>
<orderedlist>
<listitem>
<para>Если на стороне сервера данная работа уже завершена (хоть статусом, хоть прогрессом), то действие не выполнять. В журнал синхронизации при этом должна произойти запись в формате:</para>
<itemizedlist>
<listitem>
<para>условно успешная синхронизация:</para>
<para>Изменение прогресса работы &quot;название_работы&quot; не синхронизировано: Действие не может быть выполнено, так как процесс завершен</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация:</para>
<para>Изменение прогресса работы &quot;название_работы&quot;: ошибка синхронизации</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>Если на стороне сервера данная работа не завершена, то:</para>
<itemizedlist>
<listitem>
<para>необходимо фиксировать время применения действия на сервере;</para>
</listitem>
<listitem>
<para>значение измененного прогресса должно примениться, даже если значение прогресса на сервере не совпадает с исходным значением прогресса в оффлайне;</para>
</listitem>
<listitem>
<para>в качестве времени изменения прогресса считать время применения действия на сервере;</para>
</listitem>
<listitem>
<para>в журнал синхронизации при применении должна произойти запись в формате:</para>
<itemizedlist>
<listitem>
<para>успешная синхронизация:</para>
<para>Изменение прогресса работы &quot;название_работы&quot; синхронизировано, новое значение - NN%</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация:</para>
<para>Изменение прогресса работы &quot;название_работы&quot;: ошибка синхронизации</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
</listitem>
</orderedlist>
</section>
<section id="sec.offline_end_work">
<title>Завершение работы</title>
<para>В режиме оффлайн доступны, при наличии, кнопки &quot;Завершить&quot; (идентификаторы операции PROGRESS, POINT_RESULT), &quot;Ответить&quot; (идентификатор операции PROCESS), &quot;Результат&quot; (идентификатор действия RESULT) и ползунок прогресса работы для выставления 100%. Необходимо фиксировать время завершения на устройстве. Применение статуса завершенности работы должно происходить по следующему алгоритму.</para>
<orderedlist>
<listitem>
<para>Для работ без формы завершения, а также с формой завершения &quot;форма&quot;: если на стороне сервера данная работа была завершена (хоть статусом, хоть прогрессом), то действие не выполнять. В журнал синхронизации при этом должна произойти запись в формате:</para>
<itemizedlist>
<listitem>
<para>условно успешная синхронизация:</para>
<para>Завершение работы &quot;название_работы&quot; не синхронизировано: Действие не может быть выполнено, так как процесс завершен</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация:</para>
<para>Завершение работы &quot;название_работы&quot;: ошибка синхронизации</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>Для работ с формой завершения &quot;файл&quot;: если на стороне сервера данная работа была завершена (хоть статусом, хоть прогрессом), то действие выполнять частично: этот файл или форму необходимо добавить в &quot;Прочие&quot;. В журнал синхронизации при этом должна произойти запись в формате:</para>
<itemizedlist>
<listitem>
<para>условно успешная синхронизация:</para>
<para>Завершение работы &quot;название_работы&quot; не синхронизировано: Действие не может быть выполнено, так как процесс завершен (в &quot;Прочие&quot; добавлен файл формы завершения)</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация:</para>
<para>Завершение работы &quot;название_работы&quot;: ошибка синхронизации</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
<note>
<para>Файл в &quot;Прочие&quot; должен добавляться в любом случае. Если файл с таким же названием существует в &quot;Приложениях&quot;, то он должен просто добавиться в &quot;Прочие&quot;. Если же в &quot;Прочих&quot; существует файл с таким названием, то он все равно должен добавиться как отдельный файл с обновленным названием <emphasis role="italic">&apos;исходное-имя-файла_ГГГГ-ММ-ДД ЧЧ_ММ.расширение&apos;</emphasis>.</para>
</note>
</listitem>
<listitem>
<para>Для работ с формой завершения &quot;комментарий&quot;: если на стороне сервера данная работа была завершена (хоть статусом, хоть прогрессом), то действие выполнять частично: этот комментарий необходимо добавить к работе как &quot;обычный&quot; комментарий. В журнал синхронизации при этом должна произойти запись в формате:</para>
<itemizedlist>
<listitem>
<para>условно успешная синхронизация:</para>
<para>Завершение работы &quot;название_работы&quot; не синхронизировано: Действие не может быть выполнено, так как процесс завершен (комментарий добавлен к работе как обычный)</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация:</para>
<para>Завершение работы &quot;название_работы&quot;: ошибка синхронизации</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>Для работ без формы завершения, а также с формой завершения &quot;форма&quot;: если на стороне сервера данная работа была удалена, то действие не выполнять. В журнал синхронизации при этом должна произойти запись в формате:</para>
<itemizedlist>
<listitem>
<para>условно успешная синхронизация:</para>
<para>Завершение работы &quot;название_работы&quot; не синхронизировано: Действие не может быть выполнено, так как процесс завершен</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация:</para>
<para>Завершение работы &quot;название_работы&quot;: ошибка синхронизации</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>Для работ с формой завершения &quot;файл&quot;: если на стороне сервера данная работа была удалена, то действие выполнять частично: этот файл или форму необходимо добавить в &quot;Прочие&quot;. В журнал синхронизации при этом должна произойти запись в формате:</para>
<itemizedlist>
<listitem>
<para>условно успешная синхронизация:</para>
<para>Завершение работы &quot;название_работы&quot; не синхронизировано: Действие не может быть выполнено, так как процесс завершен (в &quot;Прочие&quot; добавлен файл формы завершения)</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация:</para>
<para>Завершение работы &quot;название_работы&quot;: ошибка синхронизации</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
<note>
<para>Файл в &quot;Прочие&quot; должен добавляться в любом случае. Если файл с таким же названием существует в &quot;Приложениях&quot;, то он должен просто добавиться в &quot;Прочие&quot;. Если же в &quot;Прочих&quot; существует файл с таким названием, то он все равно должен добавиться как отдельный файл с обновленным названием <emphasis role="italic">&apos;исходное-имя-файла_ГГГГ-ММ-ДД ЧЧ_ММ.расширение&apos;</emphasis>.</para>
</note>
</listitem>
<listitem>
<para>Для работ с формой завершения &quot;комментарий&quot;: если на стороне сервера данная работа была удалена, то действие не выполнять. В журнал синхронизации при этом должна произойти запись в формате:</para>
<itemizedlist>
<listitem>
<para>условно успешная синхронизация:</para>
<para>Завершение работы &quot;название_работы&quot; не синхронизировано: Действие не может быть выполнено, так как процесс завершен (комментарий не добавлен к работе)</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация:</para>
<para>Завершение работы &quot;название_работы&quot;: ошибка синхронизации</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>Для всех остальных случаев:</para>
<itemizedlist>
<listitem>
<para>необходимо фиксировать время применения действия на сервере;</para>
</listitem>
<listitem>
<para>должен примениться статус завершенности со всеми сопутствующими параметрами завершения:</para>
<itemizedlist>
<listitem>
<para>идентификаторы операции PROGRESS: результат операции (завершено);</para>
</listitem>
<listitem>
<para>идентификаторы операции POINT_RESULT: форма завершения комментарий, файл (в т.ч. выбранный из работы, добавленный с устройства или с камеры), форма;</para>
<para><emphasis role="italic">Примечание:</emphasis> в список завершения работы &quot;Из работы&quot; (для формы завершения - файла) попадают как синхронизированные данные, так и файлы, добавленные в режиме оффлайна (пункт &quot;Перепорученные&quot; при этом недоступен, нельзя выбрать результат перепорученных работ).</para>
</listitem>
<listitem>
<para>идентификаторы операции PROCESS: добавлены ли подпись и комментарий и результат операции (ознакомился, согласен/не согласен, утвердил/не утвердил);</para>
</listitem>
<listitem>
<para>идентификатор действия RESULT: результат действия подтверждено или отклонено (включая измененные сроки и прогресс, комментарий-причина);</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>в качестве времени изменения прогресса считать время применения действия на сервере;</para>
</listitem>
<listitem>
<para>в журнал синхронизации при применении должна произойти запись в формате:</para>
<itemizedlist>
<listitem>
<para>успешная синхронизация:</para>
<para>Завершение работы &quot;название_работы&quot; синхронизировано</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация:</para>
<para>Завершение работы &quot;название_работы&quot;: ошибка синхронизации</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
</listitem>
</orderedlist>
</section>
<section id="sec.offline_new_comment">
<title>Добавление нового комментария к работе</title>
<para>В режиме оффлайн доступна кнопка добавления нового комментария как на экране информации о работе, так и на экране всех комментариев. Необходимо фиксировать время добавления нового комментария на устройстве. Добавление на сервер должно происходить по следующему алгоритму.</para>
<orderedlist>
<listitem>
<para>Если комментарий добавляется к удаленной работе, то действие не выполнять. В журнал синхронизации при этом должна произойти запись в формате:</para>
<itemizedlist>
<listitem>
<para>условно успешная синхронизация:</para>
<para>Новый комментарий &quot;текст_комментария&quot; к работе &quot;название_работы&quot; не добавлен: Вы не можете создавать комментарии для удаленной работы</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация:</para>
<para>Новый комментарий &quot;текст_комментария&quot; к работе &quot;название_работы&quot;: ошибка синхронизации</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>Если комментарий добавляется не к удаленной работе, то действие выполнять:</para>
<itemizedlist>
<listitem>
<para>необходимо фиксировать время добавления на сервере;</para>
</listitem>
<listitem>
<para>в качестве времени добавления комментария считать время применения действия на сервере;</para>
</listitem>
<listitem>
<para>в журнал синхронизации при применении должна произойти запись в формате:</para>
<itemizedlist>
<listitem>
<para>успешная синхронизация:</para>
<para>Новый комментарий &quot;текст_комментария&quot; к работе &quot;название_работы&quot; добавлен</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация:</para>
<para>Новый комментарий &quot;текст_комментария&quot; к работе &quot;название_работы&quot;: ошибка синхронизации</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
</listitem>
</orderedlist>
</section>
<section id="sec.offline_edit_comment">
<title>Редактирование комментария работы</title>
<para>В режиме оффлайн доступен пункт меню &quot;Изменить&quot; комментария, при его наличии, как на экране информации о работе, так и на экране всех комментариев. Необходимо фиксировать время изменения комментария на устройстве. Применение изменений на сервер должно происходить по следующему алгоритму.</para>
<orderedlist>
<listitem>
<para>Если на стороне сервера данный комментарий был удален, то действие не выполнять. В журнал синхронизации при этом должна произойти запись в формате:</para>
<itemizedlist>
<listitem>
<para>условно успешная синхронизация:</para>
<para>Изменение комментария &quot;текст_комментария&quot; к работе &quot;название_работы&quot; не синхронизировано: Комментарий невозможно изменить, так как он удален</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация:</para>
<para>Изменение комментария &quot;текст_комментария&quot; к работе &quot;название_работы&quot;: ошибка синхронизации</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>Если на стороне сервера комментарий не был удален, то:</para>
<itemizedlist>
<listitem>
<para>необходимо фиксировать время применения действия на сервере;</para>
</listitem>
<listitem>
<para>измененный комментарий должен примениться, даже если комментарий на сервере не совпадает с исходным комментарием в оффлайне;</para>
</listitem>
<listitem>
<para>в качестве времени изменения комментария считать время применения действия на сервере;</para>
</listitem>
<listitem>
<para>в журнал синхронизации при применении должна произойти запись в формате:</para>
<itemizedlist>
<listitem>
<para>успешная синхронизация:</para>
<para>Изменение комментария к работе &quot;название_работы&quot; синхронизировано, новое значение: &quot;текст_комментария&quot;</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация:</para>
<para>Изменение комментария &quot;текст_комментария&quot; к работе &quot;название_работы&quot;: ошибка синхронизации</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
</listitem>
</orderedlist>
</section>
<section id="sec.offline_delete_comment">
<title>Удаление комментария работы</title>
<para>В режиме оффлайн доступен пункт меню &quot;Удалить&quot; комментария, при его наличии, как на экране информации о работе, так и на экране всех комментариев. Необходимо фиксировать время удаления комментария на устройстве. Удаление с сервера должно происходить по следующему алгоритму.</para>
<orderedlist>
<listitem>
<para>Если на стороне сервера данный комментарий был удален, то действие не выполнять. В журнал синхронизации при этом должна произойти запись в формате:</para>
<itemizedlist>
<listitem>
<para>условно успешная синхронизация:</para>
<para>Удаление комментария &quot;текст_комментария&quot; к работе &quot;название_работы&quot; не синхронизировано: Комментарий невозможно удалить, так как он уже удален</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация:</para>
<para>Удаление комментария &quot;текст_комментария&quot; к работе &quot;название_работы&quot;: ошибка синхронизации</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>Если на стороне сервера комментарий не был удален, то:</para>
<itemizedlist>
<listitem>
<para>необходимо фиксировать время удаления на сервере;</para>
</listitem>
<listitem>
<para>удаленный комментарий должен удалиться и на сервере;</para>
</listitem>
<listitem>
<para>в качестве времени удаления комментария считать время удаления на сервере;</para>
</listitem>
<listitem>
<para>в журнал синхронизации при применении должна произойти запись в формате:</para>
<itemizedlist>
<listitem>
<para>успешная синхронизация:</para>
<para>Удаление комментария &quot;текст_комментария&quot; к работе &quot;название_работы&quot; синхронизировано</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация:</para>
<para>Удаление комментария &quot;текст_комментария&quot; к работе &quot;название_работы&quot;: ошибка синхронизации</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
</listitem>
</orderedlist>
</section>
<section id="sec.offline_add_file">
<title>Добавление файла к работе</title>
<para>В режиме оффлайн доступна кнопки добавления нового файла (&quot;С устройства&quot; и &quot;Сфотографировать&quot;) как на экране информации о работе, так и на экране всех вложений. Необходимо фиксировать время добавления нового файла на устройстве. Добавление на сервер должно происходить по следующему алгоритму.</para>
<orderedlist>
<listitem>
<para>Если на стороне сервера доступ к добавлению файла в папку &quot;Приложения&quot; был закрыт, то действие выполнять частично: этот файл необходимо добавить, но в папку &quot;Прочие&quot;. В журнал синхронизации при этом должна произойти запись в формате:</para>
<itemizedlist>
<listitem>
<para>условно успешная синхронизация:</para>
<para>Новый файл &quot;название_файла.расширение&quot; к работе &quot;название_работы&quot; добавлен в папку &quot;Прочие&quot;: Отсутствует доступ к папке &quot;Приложения&quot;</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация:</para>
<para>Новый файл &quot;название_файла.расширение&quot; к работе &quot;название_работы&quot;: ошибка синхронизации</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>Во всех остальных случаях действие добавления нового файла должно всегда выполняться:</para>
<itemizedlist>
<listitem>
<para>необходимо фиксировать время добавления на сервере;</para>
</listitem>
<listitem>
<para>в качестве времени добавления файла считать время применения действия на сервере;</para>
</listitem>
<listitem>
<para>в журнал синхронизации при применении должна произойти запись в формате:</para>
<itemizedlist>
<listitem>
<para>успешная синхронизация:</para>
<para>Новый файл &quot;название_файла.расширение&quot; к работе &quot;название_работы&quot; добавлен</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация:</para>
<para>Новый файл &quot;название_файла.расширение&quot; к работе &quot;название_работы&quot;: ошибка синхронизации</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
</listitem>
</orderedlist>
</section>
<section id="sec.offline_delete_file">
<title>Удаление файла работы</title>
<para>В режиме оффлайн доступен пункт меню &quot;Удалить&quot; вложения, при его наличии, как на экране информации о работе, так и на экране всех вложений. Необходимо фиксировать время удаления вложения на устройстве. Удаление с сервера должно происходить по следующему алгоритму.</para>
<orderedlist>
<listitem>
<para>Если на стороне сервера данный файл был удален, то действие не выполнять. В журнал синхронизации при этом должна произойти запись в формате:</para>
<itemizedlist>
<listitem>
<para>условно успешная синхронизация:</para>
<para>Удаление файла &quot;название_файла.расширение&quot; работы &quot;название_работы&quot; не синхронизировано: Файл удален</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация:</para>
<para>Удаление файла &quot;название_файла.расширение&quot; работы &quot;название_работы&quot;: ошибка синхронизации</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>Если на стороне сервера доступ к удалению файла в папке &quot;Приложения&quot; был закрыт, то действие не выполнять. В журнал синхронизации при этом должна произойти запись в формате:</para>
<itemizedlist>
<listitem>
<para>условно успешная синхронизация:</para>
<para>Удаление файла &quot;название_файла.расширение&quot; работы &quot;название_работы&quot; не синхронизировано: Отсутствует доступ к папке &quot;Приложения&quot;</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация:</para>
<para>Удаление файла &quot;название_файла.расширение&quot; работы &quot;название_работы&quot;: ошибка синхронизации</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>Если на стороне сервера файл не был удален и есть доступ на его удаление, то:</para>
<itemizedlist>
<listitem>
<para>необходимо фиксировать время удаления на сервере;</para>
</listitem>
<listitem>
<para>удаленный файл должен удалиться и на сервере;</para>
</listitem>
<listitem>
<para>в качестве времени удаления файла считать время удаления на сервере;</para>
</listitem>
<listitem>
<para>в журнал синхронизации при применении должна произойти запись в формате:</para>
<itemizedlist>
<listitem>
<para>успешная синхронизация:</para>
<para>Удаление файла &quot;название_файла.расширение&quot; работы &quot;название_работы&quot; синхронизировано</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация:</para>
<para>Удаление файла &quot;название_файла.расширение&quot; работы &quot;название_работы&quot;: ошибка синхронизации</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
</listitem>
</orderedlist>
</section>
</section>
<section id="sec.offline_journal_synchronization">
<title>Журнал синхронизации</title>
<para>Один процесс синхронизации должен оформляться в отдельную панель. Каждая панель содержит заголовок в формате:</para>
<itemizedlist>
<listitem>
<para>Синхронизация от ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
<para>где ГГГГ-ММ-ДД ЧЧ:ММ - дата и время завершения процесса синхронизации.</para>
<para>Каждую панель можно сворачивать/разворачивать, нажимая по заголовку самой панели. Ограничений на количество одновременно развернутых панелей нет.</para>
<para>Свернутая панель содержит только заголовок с иконкой разворачивания. Развернутая панель, в свою очередь, содержит заголовок с иконкой сворачивания и содержимое панели. Иконка: <graphic fileref="resources/img/offline/collapse_expand.png"/>.</para>
<para>По умолчанию, при открытии экрана все панели свернуты (<xref linkend="fig.offline_journal_2"/>). </para>
<figure id="fig.offline_journal_2">
<title>Журнал синхронизации, вид по умолчанию</title>
<graphic fileref="resources/img/offline/journal_android_2.png" align="center"/>
<graphic fileref="resources/img/offline/journal_ios_2.png" align="center"/>
</figure>
<para>Содержимое развернутой панели (<xref linkend="fig.offline_journal"/>):</para>
<itemizedlist>
<listitem>
<para>Синхронизация начата</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>В зависимости от успешности синхронизации:</para>
<itemizedlist>
<listitem>
<para>успешная синхронизация:</para>
<para>Работа &quot;название_работы&quot; синхронизирована</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация:</para>
<para>Работа &quot;название_работы&quot;: ошибка синхронизации</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
<para><emphasis role="italic">Такая запись на каждую синхронизируемую работу</emphasis></para>
</listitem>
<listitem>
<para>В зависимости от успешности всех записей синхронизации:</para>
<itemizedlist>
<listitem>
<para>успешная синхронизация (когда каждая запись имеет статус &quot;успешная&quot; либо &quot;условно успешная&quot;):</para>
<para>Синхронизация завершена успешно</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
<listitem>
<para>неуспешная синхронизация (когда хотя бы одна запись имеет статус &quot;неуспешная&quot;):</para>
<para>Синхронизация завершена не успешно</para>
<para>ГГГГ-ММ-ДД ЧЧ:ММ</para>
</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
<para>Каждая запись (кроме первой и последней) синхронизации имеет иконку согласно статуса успешности:</para>
<itemizedlist>
<listitem>
<para>успешная синхронизация - зеленая галочка <graphic fileref="resources/img/offline/success.png"/></para>
</listitem>
<listitem>
<para>условно успешная синхронизация - желтая галочка <graphic fileref="resources/img/offline/almost_success.png"/></para>
</listitem>
<listitem>
<para>неуспешная синхронизация - красный перечеркнутый круг <graphic fileref="resources/img/offline/unsuccess.png"/></para>
</listitem>
</itemizedlist>
<figure id="fig.offline_journal">
<title>Журнал синхронизации</title>
<graphic fileref="resources/img/offline/journal_android.png" align="center"/>
<graphic fileref="resources/img/offline/journal_ios.png" align="center"/>
</figure>
<para>Журнал должен заполняться в режиме реального времени. В случае 5 подряд неуспешных записей процесс синхронизации должен прерваться как &quot;неуспешный&quot;.</para>
<para>Экран имеет фиксированную высоту, в конце экрана всегда располагается кнопка &quot;Очистить&quot; (серого цвета, идентификатор NOT_PREFERRED). Область между верхней панелью и данной кнопкой прокручивается. По нажатию на кнопку выдается сообщение &quot;Очистить журнал синхронизации?&quot; и при положительном ответе очищается весь экран логов.</para>
<para>В журнале синхронизации необходимо хранить данные максимум 20-ти последних успешных процессов синхронизации. На количество хранимых неуспешных процессов синхронизации накладывается только одно ограничение: неуспешная синхронизация по времени завершения должна находиться в промежутке между первой по времени успешной и любой последней. Каждый новый успешный процесс синхронизации удаляет первый по времени успешный процесс, а также все неуспешные, которые оказались в промежутке между 19-м и 20-м успешными процессами.</para>
</section>
</chapter>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<chapter label="" id="sec.push_notifications">
<title id="sec.push_notifications.title">Уведомления</title>
<para>Мобильный клиент должен позволять принимать push-уведомления, настроенные в основном клиентском приложении, для авторизованного пользователя.</para>
<para>Условия для работы push-уведомлений:</para>
<itemizedlist>
<listitem>
<para>успешно авторизованный пользователь;</para>
</listitem>
<listitem>
<para>в окне авторизации был включен переключатель &quot;Запомнить меня&quot;.</para>
</listitem>
</itemizedlist>
<para>Настройка push-уведомлений в мобильном клиенте не осуществляется. Push-уведомления формируются согласно &quot;Уведомлениям по работе&quot;, настроенным пользователем в его настройках (<xref linkend="fig.push_notifications_settings"/>).</para>
<figure id="fig.push_notifications_settings">
<title>Настройки уведомлений по работам</title>
<graphic fileref="resources/img/push/notifications_settings.png" align="center"/>
</figure>
<para>Текст push-уведомлений не отличается от десктопных (приходящих пользователю на почту). Форматирование текста игнорируется. В push&apos;е отображается только одна строка текста, невмещающийся текст должен затемняться градиентом и уходить за пределы экрана.</para>
<para>При подключении к интернету пользователь, у которого настроена доставка push-уведомлений, получит все эти последние push-уведомления, стоявшие на сервере в очереди на отправку, всем списком. По нажатию на любое push-уведомление должен открываться мобильный клиент, экран со списком работ (<xref linkend="sec.workflow_works"/>) авторизованного пользователя, остальные push-уведомления должны стереться.</para>
</chapter>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<chapter id="sec.settings">
<title>Настройки приложения</title>
<para>Настройки вызываются в самом мобильном клиенте по нажатию на кнопку &quot;Настройки&quot; (<xref linkend="fig.settings_window_android"/>) внутри фильтров потоков работ и документов.</para>
<figure id="fig.settings_window_android">
<title>Экран настроек</title>
<graphic fileref="resources/img/settings/settings_android.png" align="center"/>
<graphic fileref="resources/img/settings/settings_ios.png" align="center"/>
</figure>
<note>
<para>В планшетной версии мобильного клиента настройки должны открываться по центру экрана в том же размере, что и в версии для смартфонов. При этом пространство вне экрана настроек должно быть недоступно.</para>
</note>
<informaltable>
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<colspec colname="c3"/>
<thead>
<row>
<entry align="center">Лейбл</entry>
<entry align="center">Элемент</entry>
<entry align="center">Значения</entry>
</row>
</thead>
<tbody>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">Общие</emphasis>
</entry>
</row>
<row>
<entry>Адрес сервера</entry>
<entry>поле ввода</entry>
<entry/>
</row>
<row>
<entry>Шифрованное соединение</entry>
<entry>флажок</entry>
<entry>
<itemizedlist>
<listitem>
<para>Вкл //по умолчанию</para>
</listitem>
<listitem>
<para>Выкл</para>
</listitem>
</itemizedlist>
</entry>
</row>
<row>
<entry>Модуль по умолчанию</entry>
<entry>выбор вариантов</entry>
<entry>
<itemizedlist>
<listitem>
<para>Потоки работ //по умолчанию</para>
</listitem>
<listitem>
<para>Документы</para>
</listitem>
</itemizedlist>
</entry>
</row>
<row>
<entry>Язык</entry>
<entry>выбор вариантов</entry>
<entry>
<itemizedlist>
<listitem>
<para>Казахский</para>
</listitem>
<listitem>
<para>Русский //по умолчанию</para>
</listitem>
<listitem>
<para>Английский</para>
</listitem>
</itemizedlist>
</entry>
</row>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">Учетная запись</emphasis>
</entry>
</row>
<row>
<entry>Синхронизировать данные для автономной работы</entry>
<entry>флажок</entry>
<entry>
<itemizedlist>
<listitem>
<para>Вкл</para>
</listitem>
<listitem>
<para>Выкл //по умолчанию</para>
</listitem>
</itemizedlist>
</entry>
</row>
<row>
<entry>Период синхронизации</entry>
<entry>выбор вариантов</entry>
<entry>
<itemizedlist>
<listitem>
<para>Никогда //по умолчанию</para>
</listitem>
<listitem>
<para>30 минут</para>
</listitem>
<listitem>
<para>1 час</para>
</listitem>
<listitem>
<para>2 часа</para>
</listitem>
<listitem>
<para>4 часа</para>
</listitem>
<listitem>
<para>8 часов</para>
</listitem>
<listitem>
<para>24 часа</para>
</listitem>
<listitem>
<para>Настроить период</para>
</listitem>
</itemizedlist>
</entry>
</row>
<row>
<entry>Загружать вложения при синхронизации</entry>
<entry>выбор вариантов</entry>
<entry>
<itemizedlist>
<listitem>
<para>Никогда //по умолчанию</para>
</listitem>
<listitem>
<para>Всегда (может взиматься плата за передачу данных)</para>
</listitem>
<listitem>
<para>Только через Wi-Fi</para>
</listitem>
</itemizedlist>
</entry>
</row>
<row>
<entry>Журнал синхронизации</entry>
<entry>кнопка</entry>
<entry/>
</row>
<row>
<entry>Выйти</entry>
<entry>кнопка</entry>
<entry/>
</row>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">Прочее</emphasis>
</entry>
</row>
<row>
<entry>Перезапустить приложение</entry>
<entry>кнопка</entry>
<entry/>
</row>
<row>
<entry>О программе</entry>
<entry>лейбл</entry>
<entry/>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Включить флажок <emphasis role="italic">&quot;Синхронизировать данные для автономной работы&quot;</emphasis> можно только для значения переключателя &quot;Запомнить меня&quot;, равное &quot;Вкл&quot;, иначе необходимо выдавать сообщение &quot;На экране авторизации переключатель &quot;Запомнить меня&quot; должен быть включен&quot;.</para>
<para>При выключении флажка &quot;Синхронизировать данные для автономной работы&quot; и наличии на устройстве данных синхронизации пользователю должно отобразиться уведомление &quot;При отключении данной опции будут удалены все данные синхронизации на устройстве. Продолжить?&quot; и варианты &quot;Да&quot; / &quot;Нет&quot;. При положительном ответе данные синхронизации удаляются, флажок выключается. При отрицательном ответе - ничего не изменяется.</para>
<para>Поля <emphasis role="italic">&quot;Период синхронизации&quot;</emphasis>, <emphasis role="italic">&quot;Загружать вложения при синхронизации&quot;</emphasis> и кнопка <emphasis role="italic">&quot;Журнал синхронизации&quot;</emphasis> доступны на редактирование только для включенного флажка &quot;Синхронизировать данные для автономной работы&quot;.</para>
<para>По нажатию на &quot;Настроить период...&quot; открывается системный диалог &quot;Период синхронизации&quot; (аналогичный, например, настройке времени при создании работы). Значение по умолчанию - 1 час 00 минут. Указанное значение должно стать периодом синхронизации.</para>
<para>Под опцией &quot;Период синхронизации&quot; отображается фиксированная подпись &quot;Никогда&quot; (для выбранного варианта периода синхронизации &quot;Никогда&quot;) либо &quot;Каждые:&quot; + значение периода в формате &quot;1 час 30 минут&quot; (для остальных вариантов периода).</para>
<para>По нажатию на &quot;Загружать вложения при синхронизации&quot; открывается системный диалог &quot;Загружать вложения&quot; (аналогичный, например, выбору формы завершения при создании работы). Значение по умолчанию - &quot;Никогда&quot;.</para>
<para>По нажатию на кнопку <emphasis role="italic">&quot;Журнал синхронизации&quot;</emphasis> открывается экран логов (<xref linkend="fig.offline_journal"/>).</para>
<para>Под кнопкой <emphasis role="italic">&quot;Выйти&quot;</emphasis> отображается фамилия и имя авторизованного пользователя. По нажатию на эту кнопку должно отобразиться сообщение &quot;При выходе из учетной записи из устройства будут удалены все связанные с ней данные и кэш. Продолжить?&quot; При согласии происходит выход из системы (в т.ч. из менеджера аккаунтов), удаляются все данные (в т.ч. данные синхронизации, при наличии) и сохраненный на устройстве кэш.</para>
<para>По нажатию на кнопку <emphasis role="italic">&quot;Перезапустить приложение&quot;</emphasis> (присутствует только для ОС Android) приложение должно выгрузиться из памяти и снова запуститься. При этом должны примениться все новые настройки.</para>
<para>Лейбл <emphasis role="italic">&quot;О программе&quot;</emphasis> содержит значение текущей версии приложения.</para>
<para>Все настройки, за исключением языка, применяются сразу (для iOS - после нажатия кнопки &quot;Готово&quot;). Для смены языка необходимо перезапустить приложение.</para>
<para>Закрыть окно настроек можно (происходит возврат к модулю, откуда были вызваны настройки, не навигатор):</para>
<itemizedlist>
<listitem>
<para>для ОС Android - кнопкой устройства &quot;Назад&quot;;</para>
</listitem>
<listitem>
<para>для iOS - кнопками &quot;Назад&quot; (без применения изменений) и &quot;Готово&quot; (с применением изменений).</para>
</listitem>
</itemizedlist>
<para>В генеральных настройках Synergy на iOS должна отображаться только текущая версия приложения.</para>
</chapter>
<?xml version="1.0" encoding="UTF-8"?>
<!-- This document was created with Syntext Serna Free. -->
<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd">
<section id="sec.sizes_and_spacing.documents">
<title>Документы</title>
<section id="sec.sizes_and_spacing.documents.plates">
<title>Плашки</title>
<para>Плашки документов используются в списках документов
и делятся по тому, какой основной фильтр открыт на просмотр («Журналы» или «Все»),
а также имеют разный вид в зависимости от устройства, на котором отображаются - планшет или смартфон.
</para>
<figure id="fig.size_and_spacing.plate_registers">
<title>Плашка документа, раздел «Журналы»</title>
<graphic fileref="resources/img/size_and_spacing/documents/maximalnii_razmer_plashki.png" align="center"/>
</figure>
<figure id="fig.size_and_spacing.plate_registers_tablet">
<title>Плашка документа, раздел «Журналы» - планшет</title>
<graphic fileref="resources/img/size_and_spacing/documents/maximalnii_razmer_plashki_ipad.png" align="center"/>
</figure>
<para>
Размер, шрифт и цвет номера,
подписи времени, оставшегося до завершения работ по документу и
ФИО пользователей в "Отписано" и "На исполнении"
- 13sp, Helvetica Neue Cyrillic Roman, #9b9b9b.</para>
<para>Цвет шрифта подписей "Отписано" и "На исполнении" - #707070.</para>
<para>Размер и шрифт краткого содержания непрочитанного документа - 17sp, Helvetica Neue Cyrillic Bold.</para>
<para>Размер и шрифт краткого содержания прочитанного документа - 17sp, Helvetica Neue Cyrillic.</para>
<para>Цвет шрифта краткого содержания обычного документа - #487cc2.</para>
<para>Цвет шрифта краткого содержания документа, по работам которого заканчивается срок - #a57020.</para>
<para>Цвет шрифта краткого содержания просроченного документа - #be3d3d.</para>
<para>Цвет фона списка документов - #f3f3f3.</para>
<para>Цвет фона плашки - #ffffff.</para>
<figure id="fig.size_and_spacing.plate_documents">
<title>Плашка документа, раздел «Все»</title>
<graphic fileref="resources/img/size_and_spacing/documents/maximalnii_razmer_plashki_v_documentax.png" align="center"/>
</figure>
<figure id="fig.size_and_spacing.plate_documents_tablet">
<title>Плашка документа, раздел «Все» - Планшет</title>
<graphic fileref="resources/img/size_and_spacing/documents/plashka_documentov_ipad.png" align="center"/>
</figure>
<para>
Параметры для этих плашек аналогичны тем, что указаны выше, за исключением того, что
цвет шрифта текста значащего содержимого документа - #487cc2.
</para>
<figure id="fig.size_and_spacing.plate_uncollapsed">
<title>Полная плашка документа</title>
<graphic fileref="resources/img/size_and_spacing/documents/razvernutoe_info.png" align="center"/>
</figure>
<para>Полная (развёрнутая) плашка документа используется только на смартфонах.</para>
<para>Цвет шрифта подписей "Отправлено", "От" и т.д. - #9b9b9b.</para>
<para>Цвет шрифта содержимого подписей "Отправлено", "От" и т.д., а также надписи "Регистрация" - #707070.</para>
</section>
<section id="sec.sizes_and_spacing.documents.view_document">
<title>Просмотр документа</title>
<para>Экран просмотра документа аналогичен экрану просмотра работы, за исключением того, что на экране
просмотра документа имеется сворачиваемый/разворачиваемый блок с информацией, относящейся к документу
</para>
<figure id="fig.size_and_spacing.view_document_noworks">
<title>Просмотр документа без работ</title>
<graphic fileref="resources/img/size_and_spacing/documents/documents_without_works_sizes.png" align="center"/>
</figure>
<figure id="fig.size_and_spacing.view_document_several_works">
<title>Просмотр документа - несколько работ</title>
<graphic fileref="resources/img/size_and_spacing/documents/documents_neskolko_works_sizes.png" align="center"/>
</figure>
<figure id="fig.size_and_spacing.view_document_full_info">
<title>Просмотр документа - подробная информация</title>
<graphic fileref="resources/img/size_and_spacing/documents/documents_full_information_sizes.png" align="center"/>
</figure>
<para>Цвет шрифта подписей "Показать", "Скрыть" - #c0c0c0.</para>
</section>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.sizes_and_spacing.general">
<title>Общие элементы</title>
<section id="sec.sizes_and_spacing.general.top_panel">
<title>Верхняя панель</title>
<figure>
<title>Верхняя панель</title>
<graphic fileref="resources/img/size_and_spacing/workflow/menu_bar.png" width="200" align="center"/>
</figure>
<para>Цвет фона шапки &quot;Навигатор&quot; / &quot;Дочерние&quot; - #3f4659.</para>
<para>Размер, шрифт и цвет текста &quot;Навигатор&quot; / &quot;Дочерние&quot; - 14sp, Helvetica Neue Cyr Medium, #c4cad6.</para>
<para>Цвет фона обычной шапки - #303030.</para>
<para>Размер, шрифт и цвет текста обычной шапки - 14sp, Helvetica Neue Cyr Medium, #ffffff.</para>
<note>
<para>Данные для верхней панели экрана настроек отличаются и описаны в <xref linkend="sec.sizes_and_spacing.general.settings"/>.</para>
</note>
</section>
<section id="sec.sizes_and_spacing.general.buttons">
<title>Кнопки</title>
<figure>
<title>Кнопки</title>
<graphic fileref="resources/img/size_and_spacing/workflow/ui_button.png" width="200" align="center"/>
</figure>
<para>Размер, шрифт и цвет для текста внутри кнопок: 21sp, Helvetica Neue Cyr Medium, #ffffff.</para>
<para>Цвета кнопок: зеленая: #5f8f15,
красная: #a52929,
серая: #868487.</para>
</section>
<section id="sec.sizes_and_spacing.general.textfields">
<title>Поля ввода</title>
<figure>
<title>Поля ввода</title>
<graphic fileref="resources/img/size_and_spacing/workflow/ui_input.png" width="200" align="center"/>
</figure>
<para>Размер, шрифт и цвет для placeholder&apos;a и введенного текста - 15sp, Helvetica Neue Cyr Medium, #999999.</para>
<para>Размер, шрифт и цвет для текста выбранного значения - 15sp, Helvetica Neue Cyr Medium, #3f75bf.</para>
</section>
<section id="sec.sizes_and_spacing.general.lists">
<title>Списки</title>
<figure>
<title>Списки</title>
<graphic fileref="resources/img/size_and_spacing/workflow/ui_lister.png" width="200" align="center"/>
</figure>
<para>Размер, шрифт и цвет для текста &quot;перейти к комментариям&quot; / &quot;Перейти к вложениям&quot; - 11sp, Helvetica Neue Cyr Bold, #494949.</para>
<para>Размер, шрифт и цвет для подписи с количеством комментариев / вложений - 11sp, Helvetica Neue Cyr Bold, #929292.</para>
<para>Размер, шрифт и цвет для текста &quot;Из работы / Перепорученные&quot; (невыделенный элемент) - 12sp, Helvetica Neue Cyr Medium, #808080. Фон кнопки - #eaeaea.</para>
<para>Размер, шрифт и цвет для текста &quot;Из работы / Перепорученные&quot; (выделенный элемент) - 12sp, Helvetica Neue Cyr Medium, #353535. Фон кнопки - #d9eaf1.</para>
<para>Размер, шрифт и цвет ФИО в user-chooser&apos;е - 13sp, Helvetica Neue Cyr Medium, #3c74bf.</para>
<para>Размер, шрифт и цвет
текста должности в user-chooser&apos;е - 11sp, Helvetica Neue Cyr Roman, #707070.</para>
</section>
<section id="sec.sizes_and_spacing.general.switchers">
<title>Переключатели</title>
<figure>
<title>Переключатели</title>
<graphic fileref="resources/img/size_and_spacing/workflow/ui_switcher.png" width="200" align="center"/>
</figure>
<para>Фон переключателя определяется цветом:</para>
<itemizedlist>
<listitem>
<para>Синий (для окна авторизации):</para>
<para>#889bce - цвет центральной точки градиента;</para>
<para>#5d6d97 - цвет крайней точки градиента;</para>
<para>#7f7f7f - цвет фона переключателя.</para>
</listitem>
<listitem>
<para>Серый (для всех остальных случаев):</para>
<para>#f0f0f0 - цвет центральной точки градиента;</para>
<para>#d6d6d6 - цвет крайней точки градиента;</para>
<para>#4c4c4c- цвет фона переключателя.</para>
</listitem>
</itemizedlist>
<para>Размер, шрифт и цвет надписи переключателя &quot;Вкл / Выкл&quot; - Helvetica Neue Cyr Bold, #ffffff.</para>
</section>
<section id="sec.sizes_and_spacing.general.checkboxes">
<title>Чекбоксы</title>
<figure>
<title>Чекбоксы</title>
<graphic fileref="resources/img/size_and_spacing/workflow/ui_checkbox.png" width="200" align="center"/>
</figure>
<para>Чекбокс должен передаваться иконкой: <graphic fileref="resources/img/workflow/elements/checkbox.png"/>.</para>
<para>Галочка чекбокса также должна передаваться иконкой: <graphic fileref="resources/img/workflow/elements/checker.png"/>.</para>
</section>
<section id="sec.sizes_and_spacing.general.comment">
<title>Плашка комментария</title>
<figure id="fig.workflow_size_spacing_plashka_comment">
<title>Плашка комментария</title>
<graphic fileref="resources/img/size_and_spacing/workflow/comment_billet.png" width="300" align="center"/>
</figure>
<para>Размер, шрифт и цвет ФИО - 12sp, Helvetica Neue Cyr Medium, #3c74bf.</para>
<para>Размер, шрифт и цвет текста комментария - 12sp, Helvetica Neue Cyr Medium, #707070.</para>
<para>Размер, шрифт и цвет подписи времени добавления комментария - 12sp, Helvetica Neue Cyr Medium, #979797.</para>
</section>
<section id="sec.sizes_and_spacing.general.file">
<title>Плашка файла</title>
<figure>
<title>Плашка файла</title>
<graphic fileref="resources/img/size_and_spacing/workflow/file_billet.png" width="300" align="center"/>
</figure>
<para>Размер, шрифт и цвет названия файла - 14sp, Helvetica Neue Cyr Medium, #3c74bf.</para>
</section>
<section id="sec.sizes_and_spacing.general.filters">
<title>Фильтры</title>
<figure id="fig.sizes_filters">
<title>Фильтры</title>
<graphic fileref="resources/img/size_and_spacing/workflow/filter_dim.png" width="400" align="center"/>
</figure>
<para>Размер, шрифт и цвет для:
</para>
<itemizedlist>
<listitem>
<para>фильтра первого уровня - 13sp, Helvetica Neue Cyr Bold, #9093a6;</para>
</listitem>
<listitem>
<para>выделенного фильтра первого уровня - 13sp, Helvetica Neue Cyr Bold, #d9dced;</para>
</listitem>
<listitem>
<para>фильтра второго уровня - 14sp, Helvetica Neue Cyr Light, #9093a6;</para>
</listitem>
<listitem>
<para>выделенного фильтра второго уровня - 14sp, Helvetica Neue Cyr Medium, #d9dced.</para>
</listitem>
</itemizedlist>
<para>Цвет фона основной области - #282e3c.</para>
<para>Панель синхронизации:</para>
<itemizedlist>
<listitem>
<para>цвет панели в обычном состоянии - #1c212c;</para>
</listitem>
<listitem>
<para>цвет панели в процессе синхронизации - #495162;</para>
</listitem>
<listitem>
<para>размер, шрифт и цвет текста в обычном состоянии - 10pt, Helvetica Neue Cyr Light, #828594;</para>
</listitem>
<listitem>
<para>размер, шрифт и цвет текста в процессе синхронизации - 10pt, Helvetica Neue Cyr Light, #12161f.</para>
</listitem>
</itemizedlist>
</section>
<section id="sec.sizes_and_spacing.general.settings">
<title>Настройки</title>
<note>
<para>Размер в единицах sp - для ОС Android, pt - для iOS.</para>
</note>
<para>Размер, шрифт и цвет текста верхней панели &quot;Настройки&quot; - 20sp/17pt, Helvetica Neue Cyr Bold, #c5ccd6.</para>
<para>Размер, шрифт и цвет текста верхней панели &quot;Готово&quot; и &quot;Отмена&quot; - 14pt, Helvetica Neue Cyr Medium, #c5ccd6.</para>
<para>Размер, шрифт и цвет для:
</para>
<itemizedlist>
<listitem>
<para>заголовков категорий - 18sp/15pt, Helvetica Neue Cyr Medium, #353535;</para>
</listitem>
<listitem>
<para>названия опций - 16sp/12pt, Helvetica Neue Cyr Medium, #707070;</para>
</listitem>
<listitem>
<para>значения настроек - 12sp/10pt, Helvetica Neue Cyr Medium, #999999;</para>
</listitem>
</itemizedlist>
<para>Цвет разделительной линии после заголовка категории - #707070.</para>
<para>Цвет разделительной между опциями - #dddddd.</para>
<para>Выбор языка:</para>
<itemizedlist>
<listitem>
<para>перечисление языков - 14pt, Helvetica Neue Cyr Medium, #707070;</para>
</listitem>
</itemizedlist>
<figure>
<title>iOS: Выбор языка</title>
<graphic fileref="resources/img/size_and_spacing/settings/ios_language_choose.png" align="center"/>
</figure>
<para>Выбор периода синхронизации:</para>
<itemizedlist>
<listitem>
<para>перечисление периодов - 14pt, Helvetica Neue Cyr Medium, #707070;</para>
</listitem>
</itemizedlist>
<figure>
<title>iOS: Выбор периода синхронизации</title>
<graphic fileref="resources/img/size_and_spacing/settings/ios_period_choose.png" align="center"/>
<graphic fileref="resources/img/size_and_spacing/settings/ios_period_choose_2.png" align="center"/>
</figure>
<para>Выбор периода синхронизации:</para>
<itemizedlist>
<listitem>
<para>перечисление вариантов загрузки вложений - 14pt, Helvetica Neue Cyr Medium, #707070;</para>
</listitem>
</itemizedlist>
<figure>
<title>iOS: Выбор варианта загрузки вложений при синхронизации</title>
<graphic fileref="resources/img/size_and_spacing/settings/ios_files_download.png" align="center"/>
</figure>
</section>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<chapter id="sizes_and_spacing">
<title>Размеры, отступы и цвета элементов мобильного клиента</title>
<!--Общие--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="general.xml" encoding="UTF-8"/>
<!--Работы--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="works.xml" encoding="UTF-8"/>
<!--Документы--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="documents.xml" encoding="UTF-8"/>
</chapter>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.sizes_and_spacing.works">
<title>Работы</title>
<figure id="fig.workflow_size_spacing_plashka_work">
<title>Плашка работы</title>
<graphic fileref="resources/img/size_and_spacing/workflow/work_billet.png" width="300" align="center"/>
</figure>
<figure id="fig.workflow_size_spacing_plashka_work_with_resolution">
<title>Плашка работы с резолюцией</title>
<graphic fileref="resources/img/size_and_spacing/workflow/work_billet_with_resolution.png" width="300" align="center"/>
</figure>
<para>Размер, шрифт и цвет ФИО и подписи времени, оставшегося до завершения работы - 13sp, Helvetica Neue Cyrillic Roman, #9b9b9b.</para>
<para>Размер и шрифт выделенной работы - 17sp, Helvetica Neue Cyrillic Bold.</para>
<para>Размер и шрифт невыделенной работы - 17sp, Helvetica Neue Cyrillic Roman.</para>
<para>Цвет родительской работы (для дочерних) - #efefef.</para>
<para>Цвет фона списка работ - #f3f3f3.</para>
<para>Цвет фона плашки - #ffffff.</para>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section>
<title>Компонент для выбора пользователей</title>
<para>Компонент для выбора пользователей является нестандартным компонентом мобильного приложения, он должен выглядеть как стандартное поле ввода, не имеющее фиксированной высоты (высота зависит от содержимого поля) и недоступное для редактирования. </para>
<para>Компонент должен принимать следующие параметры:</para>
<itemizedlist>
<listitem>
<para>единственный или множественный выбор (влияет на количество пользователей, которых можно выбрать);</para>
</listitem>
<listitem>
<para>отображать подчиненных или всех пользователей (влияет на формирование списка пользователей на сервере);</para>
</listitem>
<listitem>
<para>идентификатор действия (влияет на формирование списка пользователей на сервере).</para>
</listitem>
</itemizedlist>
<para>По клику по нему открывается экран выбора пользователя/пользователей (<xref linkend="fig.workflow_user_chooser_1"/>):</para>
<figure id="fig.workflow_user_chooser_1">
<title>Экран &quot;Пользователи&quot; со скрытыми тегами</title>
<graphic fileref="resources/img/workflow/user_chooser.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/User_chooser.jpg" align="center"/>
</figure>
<para>Экран &quot;Пользователи&quot; предоставляет список всех доступных для выбора пользователей. Отображаются полные ФИО пользователя и его должность. Если ФИО или название должности не вмещается по ширине экрана, надпись переносится на следующую строку. </para>
<para>Область для тегов, поле поиска и кнопка &quot;Готово&quot; имеют фиксированное положение. В оставшейся области находится скролл со списком пользователей.</para>
<para>В правой части каждого элемента списка находится пиктограмма, показывающая, выбран данный пользователь или нет.</para>
<para>Пользователи в списке отображаются с постепенной догрузкой. Изначально подгружается такое количество пользователей, чтобы список был полностью заполнен и появился скролл (минимум 30). При прокрутке пользователем вниз список дополняется (количество пользователей в новой &quot;порции&quot; должно быть равно количеству пользователей в первой &quot;порции&quot;). Список сортируется по ФИО.</para>
<para>На экране &quot;Пользователи&quot; есть возможность &quot;живого&quot; поиска по ФИО (<xref linkend="fig.workflow_user_chooser_2"/>). Для этого пользователь нажимает по полю поиска и вводит текст запроса, при вводе текста иконка лупы заменяется на иконку крестика. Очистить поле ввода можно, нажав на крестик (крестик заменяется на иконку лупы). Пустой запрос поиска - отображается список со всеми пользователями. </para>
<para>В области тегов отображаются выбранные на данном экране пользователи. Если теги не помещаются на одной строке, они скрываются за кликабельной надписью на второй строке &quot;и еще ХХ других пользователей&quot;. По нажатию на эту надпись раскрывается весь список тегов, который смещает все остальные поля и кнопку &quot;Готово&quot; ниже (<xref linkend="fig.workflow_user_chooser_2"/>), при этом весь контент экрана должен быть скроллируемым. Кликабельная надпись после тегов меняет название на &quot;Скрыть&quot;, по нажатию на которую список тегов примет скрытый вид.</para>
<para>Выбор пользователя означает, что:</para>
<itemizedlist>
<listitem>
<para>меняется пиктограмма в правой части элемента списка;</para>
</listitem>
<listitem>
<para>имя пользователя добавляется в область тегов в верхней части экрана.</para>
</listitem>
</itemizedlist>
<para>Аналогично, при удалении пользователя из списка выбранных:</para>
<itemizedlist>
<listitem>
<para>меняется пиктограмма в правой части элемента списка;</para>
</listitem>
<listitem>
<para>имя пользователя удаляется из области с тегами.</para>
</listitem>
</itemizedlist>
<para>Для выбора пользователя необходимо нажать на пиктограмму, находящуюся справа соотвествующего элемента списка. </para>
<para>Удалить пользователя из списка выбранных можно двумя способами:</para>
<itemizedlist>
<listitem>
<para>Нажать на пиктограмму в правой части плашки, при этом пользователь удаляется из списка выбранных без подтверждения.</para>
</listitem>
<listitem>
<para>Нажать на тег, соответствующий имени пользователя. При этом приложение запросит подтверждение удаления пользователя (&quot;Вы действительно хотите удалить &apos;Фамилия И.О.&apos; из списка выбранных пользователей?&quot;). В случае подтверждения пользователь будет удален из списка выбранных.</para>
</listitem>
</itemizedlist>
<para>Если в данном компоненте должен быть выбран один пользователь (согласно входным параметрам) при выделении пользователя в списке, выделение предыдущего выделенного снимается, т.е. снимается выделение в списке и удаляется соответствующий тег.</para>
<figure id="fig.workflow_user_chooser_2">
<title>Экран &quot;Пользователи&quot; с раскрытыми тегами и живым поиском</title>
<graphic fileref="resources/img/workflow/user_chooser1.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/User_chooser1.jpg" align="center"/>
</figure>
<para>Если пользователь на экране &quot;Пользователи&quot; нажимает на кнопку &quot;Назад&quot;, мобильный клиент возращает пользователя к экрану, из которого он был вызван.</para>
<para>Если пользователь нажимает на кнопку &quot;Готово&quot;, мобильный клиент возращает пользователя к предыдущему экрану, в поле компонента отображаются выбранные пользователи через запятую, имя каждого пользователя в формате &apos;Фамилия И.О.&apos;</para>
<para>Компонент может иметь состояния: активен и не активен. Последнее означает, что значение данного экземпляра компонента менять нельзя и по клику по нему не должен открываться экран выбора пользователя/пользователей.</para>
<note>
<para>Метод получения списка пользователей описан в javadoc kz.arta.synergy.server.api.rest.userchooser#getUsers</para>
</note>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_work_delete">
<title>Удаление работы</title>
<para>Если у пользователя есть право на удаление работы, в результате долгого нажатия по плашке работы
появляется меню, в котором присутствует пункт &quot;Удалить&quot;. Пользователь нажимает на этот пункт меню и
приложение запрашивает подтверждение выполнения действия с сообщением &quot;Вы действительно хотите удалить данную
работу &apos;формулировка_работы&apos;?&quot;
Если пользователь подтверждает удаление работы, отправляется запрос на сервер для удаления. В случае успешного
выполнения плашка удаляется из списка, иначе - отображается сообщение об ошибке.</para>
<note>
<para>Метод удаления работы kz.arta.synergy.server.api.rest.works.WorkFlowService#deleteWork</para>
</note>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<chapter id="chap_workflow">
<title>Потоки работ</title>
<!--Список работ--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_works.xml" encoding="UTF-8"/>
<!--Дочерние работы--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_subsidiary_works.xml" encoding="UTF-8"/>
<!--Фильтры потоков работ--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_filters.xml" encoding="UTF-8"/>
<!--user-chooser--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="user-chooser.xml" encoding="UTF-8"/>
<!--Создание и редактирование работы--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_work_create.xml" encoding="UTF-8"/>
<!--Создание документов--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_document_create.xml" encoding="UTF-8"/>
<!--Удаление работы--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="work-delete.xml" encoding="UTF-8"/>
<!--Информация о работе--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_workinfo.xml" encoding="UTF-8"/>
</chapter>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_attachments">
<title>Вложения работы</title>
<para>Далее, при наличии вложений к работе, располагается панель вложений.</para>
<para>Панель вложений отображает максимум 3 (три) последних вложения (не важно, из &quot;Приложений&quot; или &quot;Прочих&quot;) к работе, каждое из которых представляет собой плашку.</para>
<para>Элементы плашки вложения:</para>
<informaltable frame="all" id="table.workflow_attachment_plashka">
<tgroup cols="2">
<colspec colname="c1"/>
<colspec colname="c2"/>
<thead>
<row>
<entry align="center">Элемент</entry>
<entry align="center">Поле API</entry>
</row>
</thead>
<tbody>
<row>
<entry>иконка изображения для предпросмотра, в случае его отсутствия - иконка типа файла</entry>
<entry>icon (32x32)</entry>
</row>
<row>
<entry>название файла</entry>
<entry>name</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<note>
<para>Ссылка на иконку передается относительная. Доступ по этому URL-у без авторизации запрещен, поэтому полная ссылка должна выглядеть так: http(s)://user_login:user_pass@host:port/Synergy + относительная ссылка из json, где:</para>
<itemizedlist>
<listitem>
<para><emphasis role="italic">user_login</emphasis> - логин авторизованного пользователя;</para>
</listitem>
<listitem>
<para><emphasis role="italic">user_pass</emphasis> - пароль авторизованного пользователя.</para>
</listitem>
</itemizedlist>
</note>
<para>В конце панели вложений отображается строка &quot;Перейти к вложениям&quot; с указанием общего количества вложений к работе (<graphic fileref="resources/img/workflow/elements/plashka_attachment_number.png"/>). По нажатию только по этой строчке мобильный клиент открывает список всех вложений (<xref linkend="fig.workflow_attachments_view"/>).</para>
<note>
<para>Для получения последних вложений работы необходимо использовать метод</para>
<para>kz.arta.synergy.server.api.rest.works.WorkFlowService#getAttachments</para>
<para>Ссылка для просмотра файла вложений rest/api/storage/pdf/get?identifier=node_id, где node_id - идентификатор файла. Полная ссылка должна выглядеть следующим образом: http(s)://user_login:user_pass@host:port/Synergy/rest/api/storage/pdf/get?identifier=node_id, где user_login - логин авторизованного пользователя, user_pass - пароль авторизованного пользователя. Без авторизации доступ к файлам запрещен.</para>
</note>
<figure id="fig.workflow_attachments_view">
<title>Список всех вложений</title>
<graphic fileref="resources/img/workflow/attachements.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/attachements.jpg" align="center"/>
</figure>
<para>На данном экране все вложенные файлы разделены на 2 панели: &quot;Приложения&quot; и &quot;Прочие&quot;.</para>
<para>При прокрутке пользователем в начале списка вверх список вложений обновляется.</para>
<para>Список вложений сортируется в алфавитном порядке.</para>
<para>Для добавления нового вложения пользователь нажимает на кнопку на верхней панели:</para>
<itemizedlist>
<listitem>
<para>&quot;С устройства&quot; - <graphic fileref="resources/img/workflow/elements/add_file.png"/></para>
</listitem>
<listitem>
<para>&quot;Сфотографировать&quot; - <graphic fileref="resources/img/workflow/elements/add_photo.png"/></para>
</listitem>
</itemizedlist>
<note>
<para>Ограничения для Sencha, описанные в <xref linkend="sec.workflow_work_information"/>, актуальны и для данного экрана.</para>
</note>
<para>Действия данных кнопок аналогичны описанным выше. Файл добавляется, если есть доступ, в панель &quot;Приложения&quot;, и в &quot;Прочие&quot;, если доступа нет.</para>
<para>В результате нажатия по плашке вложения выбранный файл скачивается на устройство и открывается его системными средствами. Файлы с расширением <emphasis role="italic">ASFDOCX</emphasis> должны скачитьваться в pdf-версии.</para>
<para>Если вложение имеет расширение <emphasis role="italic">ASFDOCX</emphasis> и сама форма имеет мобильное представление, а также если у пользователя есть право редактирования файла, в результате долгого нажатия по плашке вложения
в меню первым в списке добавляется пункт &quot;Изменить&quot;. Пользователь нажимает на этот пункт меню и
приложение открывает экран редактирования файла по форме в мобильном представлении, аналогичный форме завершения &quot;форма&quot; (<xref linkend="fig.workflow_form_end_form"/>). Если были внесены изменения, то в случае успешного сохранения на сервере должна сохраниться текущая версия формы, но увеличиться версия данных.</para>
<para>Если у пользователя есть право на удаление вложения, в результате долгого нажатия по плашке вложения
появляется меню, в котором присутствует пункт &quot;Удалить&quot;. Пользователь нажимает на этот пункт меню и
приложение запрашивает подверждение выполнения действия с сообщением &quot;Вы действительно хотите удалить данный
файл?&quot;
Если пользователь подтверждает удаление, отправляется запрос на сервер для удаления. В случае успешного
выполнения плашка удаляется из списка, иначе - отображается сообщение об ошибке.</para>
<para>По нажатию в списке вложений на кнопку &quot;Назад&quot; мобильный клиент возвращается на экран информации о работе. В случае, если было хотя бы одно изменение, информация обновляется.</para>
<note>
<para>Для получения всех вложений необходимо использовать метод</para>
<para>kz.arta.synergy.server.api.rest.works.WorkFlowService#getFullAttachments</para>
<para>Метод для удаления вложения</para>
<para>kz.arta.synergy.server.api.rest.works.WorkFlowService#deleteAttachment</para>
</note>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_comments">
<title>Комментарии работы</title>
<para>Далее, при наличии комментариев к работе, располагается панель комментариев.</para>
<para>Панель комментариев отображает максимум 3 (три) последних полных комментария к работе, каждый из которых представляет собой плашку. Элементы плашки комментария:</para>
<informaltable frame="all" id="table.workflow_comment_plashka">
<tgroup cols="4">
<colspec colname="c1"/>
<colspec colname="c2"/>
<thead>
<row>
<entry align="center">Элемент</entry>
<entry align="center">Расположение</entry>
<entry align="center">Описание</entry>
<entry align="center">Поле API</entry>
</row>
</thead>
<tbody>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/comment_icon.png"/>
</entry>
<entry>В левом верхнем углу плашки</entry>
<entry>Тип комментария</entry>
<entry>type</entry>
</row>
<row>
<entry align="center">Фамилия И.О.</entry>
<entry>Вверху справа от типа комментария</entry>
<entry>Автор комментария</entry>
<entry>author</entry>
</row>
<row>
<entry align="center">28 минут назад</entry>
<entry>В левом нижнем углу плашки после текста комментария</entry>
<entry>Время, когда был оставлен комментарий</entry>
<entry>created</entry>
</row>
<row>
<entry align="center"/>
<entry>В основной области плашки</entry>
<entry>Текст комментария</entry>
<entry>comment</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para><emphasis role="italic">Тип комментария</emphasis> отображается в виде пиктограммы. API возвращает идентификатор пиктограммы (comment_icon).</para>
<informaltable frame="all" id="table.workflow_comment_icons">
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<colspec colname="c3"/>
<thead>
<row>
<entry align="center">Иконка</entry>
<entry align="center">Описание</entry>
<entry align="center">Идентификатор</entry>
</row>
</thead>
<tbody>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/comment_icon.png"/>
</entry>
<entry>комментарий самого пользователя</entry>
<entry>comment_icon</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/comment_icon_gray.png"/>
</entry>
<entry>комментарий другого пользователя</entry>
<entry>comment_icon_gray</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/comment_icon_green.png"/>
</entry>
<entry>комментарий согласования / утверждения</entry>
<entry>comment_icon_green</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/comment_icon_red.png"/>
</entry>
<entry>комментарий отказа в согласовании / утверждении</entry>
<entry>comment_icon_red</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/comment_icon_result.png"/>
</entry>
<entry>комментарий результата работы</entry>
<entry>comment_icon_result</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para><emphasis role="italic">Автор комментария</emphasis> - пользователь, который оставил данный комментарий. Отображается в формате &quot;Фамилия И.О.&quot;</para>
<para><emphasis role="italic">Время, когда был оставлен комментарий</emphasis>. Значение времени отображается по следующему принципу:</para>
<informaltable frame="all" id="table.workflow_comment_terms">
<tgroup cols="2">
<colspec colname="c1"/>
<colspec colname="c2"/>
<thead>
<row>
<entry align="center">Время, когда был оставлен комментарий</entry>
<entry align="center">Формат отображения</entry>
</row>
</thead>
<tbody>
<row>
<entry namest="c1" nameend="c2">
<emphasis role="italic">Сегодня</emphasis>
</entry>
</row>
<row>
<entry>в течение часа</entry>
<entry>&quot;ХХ минут(ы) назад&quot;</entry>
</row>
<row>
<entry>более часа назад, но в течение дня</entry>
<entry>&quot;Сегодня в ЧЧ:ММ&quot;</entry>
</row>
<row>
<entry namest="c1" nameend="c2">
<emphasis role="italic">Вчера</emphasis>
</entry>
</row>
<row>
<entry>в течение предыдущего дня</entry>
<entry>&quot;Вчера в ЧЧ:ММ&quot;</entry>
</row>
<row>
<entry namest="c1" nameend="c2">
<emphasis role="italic">В течение текущей рабочей недели</emphasis>
</entry>
</row>
<row>
<entry>более двух дней назад, но в течение текущей рабочей недели</entry>
<entry>
<itemizedlist>
<listitem>
<para>&quot;В понедельник в ЧЧ:ММ&quot; (при просмотре комментария со среды по воскресенье текущей рабочей недели)</para>
</listitem>
<listitem>
<para>&quot;Во вторник в ЧЧ:ММ&quot; (четверг - воскресенье)</para>
</listitem>
<listitem>
<para>&quot;В среду в ЧЧ:ММ&quot; (пятница - воскресенье)</para>
</listitem>
<listitem>
<para>&quot;В четверг в ЧЧ:ММ&quot; (суббота - воскресенье)</para>
</listitem>
<listitem>
<para>&quot;В пятницу в ЧЧ:ММ&quot; (только воскресенье)</para>
</listitem>
</itemizedlist>
</entry>
</row>
<row>
<entry namest="c1" nameend="c2">
<emphasis role="italic">Более недели назад</emphasis>
</entry>
</row>
<row>
<entry>предыдущая рабочая неделя и более</entry>
<entry>&quot;ДД месяц ГГГГ ЧЧ:ММ&quot;</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>В конце панели комментариев отображается строка &quot;Перейти к комментариям&quot; с указанием общего количества комментариев к работе (<graphic fileref="resources/img/workflow/elements/plashka_comment_number.png"/>). По нажатию только по этой строчке мобильный клиент открывает экран со списком всех комментариев работы (<xref linkend="fig.workflow_comments_view"/>).</para>
<figure id="fig.workflow_comments_view">
<title>Список всех комментариев</title>
<graphic fileref="resources/img/workflow/comments_view.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/comments_view.jpg" align="center"/>
</figure>
<para>Комментарии в списке отображаются с постепенной догрузкой. Изначально подгружается такое количество комментариев, чтобы список был полностью заполнен и появился скролл (минимум 30). При прокрутке пользователем вниз список комментариев дополняется (количество комментариев в новой &quot;порции&quot; должно быть равно количеству комментаиев в первой &quot;порции&quot;).</para>
<para>При прокрутке пользователем в начале списка вверх список комментариев обновляется.</para>
<para>Список комментариев сортируется по времени добавления по убыванию (т.е. последние добавленные - в начале списка).</para>
<para>Для добавления нового комментария пользователь нажимает на кнопку <graphic fileref="resources/img/workflow/elements/add_comment.png"/> на верхней панели. Открывается экран для ввода текста (<xref linkend="fig.workflow_comments_add"/>). Ввод комментария завершается нажатием на кнопку &quot;Готово&quot;. Добавленный комментарий сразу добавляется первым в список комментариев.</para>
<figure id="fig.workflow_comments_add">
<title>Добавление комментария</title>
<graphic fileref="resources/img/workflow/comment_add.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/comment_add.jpg" align="center"/>
</figure>
<para>Если у пользователя есть право на редактирование комментария, в результате долгого нажатия по плашке комментария
появляется меню, в котором присутствует пункт &quot;Изменить&quot;. Пользователь нажимает на этот пункт меню, открывается системное окно ввода текста с текущей формулировкой комментария. В случае успешного
сохранения комментарий в списке изменяется, иначе - отображается сообщение об ошибке.</para>
<para>Если у пользователя есть право на удаление комментария, в результате долгого нажатия по плашке комментария
появляется меню, в котором присутствует пункт &quot;Удалить&quot;. Пользователь нажимает на этот пункт меню и
приложение запрашивает подтверждение выполнения действия с сообщением &quot;Вы действительно хотите удалить данный
комментарий?&quot;
Если пользователь подтверждает удаление, отправляется запрос на сервер для удаления. В случае успешного
выполнения плашка удаляется из списка, иначе - отображается сообщение об ошибке.</para>
<para>По нажатию в списке комментариев на кнопку &quot;Назад&quot; мобильный клиент возвращается на экран информации о работе. В случае, если было хотя бы одно изменение, информация обновляется.</para>
<note>
<para>Для получения трех последних и всех комментариев необходимо использоватеь метод API:</para>
<para>kz.arta.synergy.server.api.rest.works.WorkFlowService#getComments</para>
</note>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_document_create">
<title>Создание документов</title>
<para>На экране со списком работ по нажатию на кнопку &quot;+&quot; и выбору избранного пункта меню (не &quot;Работа&quot;), а также при выборе любого пункта (не группы) в диалоге &quot;Избранное&quot; (<xref linkend="fig.workflow_work_create_menu_other"/>, <xref linkend="fig.workflow_work_create_menu_other_2"/>), открывается экран создания документа, полностью аналогичный таковому в <xref linkend="sec.document_creation"/> за тем исключением, что вместо возврата в список документов, в данном модуле должен происходить возврат на экран со списком работ.</para>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_filters">
<title>Фильтры потоков работ</title>
<para>По нажатию на кнопку &quot;Фильтры&quot;, а также проведя пальцем от левой стороны экрана со списком работ к правой, раскрывается левая панель навигатора фильтров (<xref linkend="fig.workflow_filters_1"/>).</para>
<figure id="fig.workflow_filters_1">
<title>Фильтры работ</title>
<graphic fileref="resources/img/workflow/filters.png" align="center"/>
</figure>
<para>Верхняя панель содержит кнопку &quot;Настройки&quot; (<xref linkend="sec.settings"/>) и надпись &quot;Навигатор&quot;. Нижняя панель отображается только для включенного флажка &quot;Синхронизировать данные для оффлайн-работы&quot; и содержит кнопку синхронизации.</para>
<para>Кнопка синхронизации содержит иконку и один из вариантов подписи к ней:</para>
<itemizedlist>
<listitem>
<para>&quot;Синхронизация не производилась&quot; - для варианта, когда на устройстве отсутствуют данные синхронизации;</para>
</listitem>
<listitem>
<para>&quot;Идёт синхронизация&quot; - для активного процесса синхронизации (см. подробнее в <xref linkend="sec.offline"/>);</para>
</listitem>
<listitem>
<para>&quot;Последняя синхронизация: ДД месяц ЧЧ:ММ&quot; - во всех остальных случаях (указывается дата и время последней успешной синхронизации).</para>
</listitem>
</itemizedlist>
<para>Параметры фильтров:</para>
<informaltable frame="all" id="table.workflow_filter_parameters_2">
<tgroup cols="2">
<colspec colname="c1"/>
<colspec colname="c2"/>
<thead>
<row>
<entry align="center">Параметр</entry>
<entry align="center">Поле API</entry>
</row>
</thead>
<tbody>
<row>
<entry>Название фильтра</entry>
<entry>name</entry>
</row>
<row>
<entry>Тип фильтра</entry>
<entry>filterType</entry>
</row>
<row>
<entry>Количество документов внутри фильтра</entry>
<entry>count</entry>
</row>
<row>
<entry>Наличие дочерних фильтров</entry>
<entry>hasChildren</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>При каждом новом запуске приложения, а также после переключения модулей все основные фильтры должны быть свернуты, а выделенным являться первый фильтр навигатора. В остальных случаях развернутость дерева и последний выделенный фильтр должны сохранять свои значения.</para>
<para>Если фильтр содержит вложенные фильтры, то в правой части отображается иконка <graphic fileref="resources/img/workflow/elements/filters_undetailed.png"/> для свернутого фильтра и <graphic fileref="resources/img/workflow/elements/filters_detailed.png"/> для развернутого. По нажатию на квадратную область (<xref linkend="fig.sizes_filters"/>) вокруг иконки свернутого фильтра он разворачивается, и наоборот. Одновременно не может быть раскрыто более одного фильтра. В этом случае предыдущий развернутый фильтр сворачивается.</para>
<para>Справа от названия каждого из фильтров и вложенных подфильтров &quot;На исполнении&quot; и &quot;На контроле&quot; в скобках указывается счетчик в формате &apos;(N1/N2)&apos;, где N1 - количество непросмотренных уведомлений, N2 - общее количество работ в данном фильтре. При отсутствии значения N1 формат отображения счетчика - &apos;(N2)&apos;, при отсутствии работ в фильтре счетчик не отображается вовсе.</para>
<para>Если название фильтра (с счетчиком) полностью не помещается на плашке, с правого края оно должно быть затемнено градиентом из прозрачного в цвет фона.</para>
<para>По нажатию на название фильтра левая панель скрывается и пользователю отображается список работ согласно выбранного фильтра. Также панель можно скрыть тремя способами:</para>
<orderedlist>
<listitem>
<para>проведя пальцем от правой стороны экрана к левой;</para>
</listitem>
<listitem>
<para>нажав по любому месту правой стороны экрана (там, где отображается часть экрана списка работ);</para>
</listitem>
<listitem>
<para>нажав на кнопку &quot;Назад&quot;.</para>
</listitem>
</orderedlist>
<note>
<para>API для получения фильтров описан в javadoc kz.arta.synergy.server.api.rest.works#getFilters.</para>
<para>API для получения счетчиков фильтров kz.arta.synergy.server.api.rest.works#getCounters</para>
</note>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_resolution">
<title>Работа с резолюциями</title>
<para>Для создания резолюции пользователь нажимает на кнопку &quot;Резолюция&quot; - открывается экран резолюции (<xref linkend="fig.workflow_resolution"/>).</para>
<figure id="fig.workflow_resolution">
<title>Экран резолюции</title>
<graphic fileref="resources/img/workflow/resolution.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/resolution_ios.png" align="center"/>
</figure>
<para>Вверху экрана отображаются:</para>
<itemizedlist>
<listitem>
<para>кнопка &quot;Добавить пункт&quot; (с идентификатором NOT_PREFERRED), по нажатию которой открывается экран редактирования пункта резолюции (<xref linkend="fig.workflow_edit_resolution_punkt"/>);</para>
</listitem>
<listitem>
<para>флажок &quot;Является контрольным&quot; (по умолчанию, выключен).</para>
</listitem>
</itemizedlist>
<para>Далее отображаются панели пунктов резолюции в режиме просмотра. Каждая панель содержит информацию в следующем порядке:</para>
<itemizedlist>
<listitem>
<para><emphasis role="italic">&apos;Полная_формулировка_пункта_резолюции&apos;</emphasis></para>
</listitem>
<listitem>
<para>Ответственный: <emphasis role="italic">Фамилия И.О.</emphasis></para>
</listitem>
<listitem>
<para>Исполнители: <emphasis role="italic">Фамилия И.О., Фамилия И.О.</emphasis> и т.д.</para>
</listitem>
<listitem>
<para>Завершение: <emphasis role="italic">ДД месяц ГГГГ ЧЧ:ММ</emphasis></para>
</listitem>
<listitem>
<para>Тип работы: <emphasis role="italic">&apos;Тип_работы&apos;</emphasis></para>
</listitem>
<listitem>
<para>Форма завершения: <emphasis role="italic">&apos;Форма_завершения&apos;</emphasis></para>
</listitem>
</itemizedlist>
<note>
<para>Если &quot;Ответственный&quot; или &quot;Исполнители&quot; содержат пустое значение, после двоеточего ничего не должно отображаться.</para>
<para>Если значение поля &quot;Форма завершения&quot; = &quot;Результат работы&quot;, то данная строчка в панели пункта резолюции не должна отображаться.</para>
</note>
<para>Далее отображаются управляющие кнопки. Для новой резолюции это кнопки &quot;Принять&quot; (с идентификатором PREFERRED) и &quot;Сохранить&quot; (с идентификатором NOT_PREFERRED).</para>
<para>Управляющие кнопки внизу экрана имеют фиксированное положение, остальные поля и кнопки данного экрана не имеют фиксированного положения, прокручиваются (если все поля вмещаются в экран, то управляющие кнопки должны быть внизу экрана, а не сразу за контентом).</para>
<orderedlist>
<listitem>
<para>Для еще не принятой резолюции в результате нажатия по плашке пункта резолюции открывается экран редактирования данного пункта резолюции (<xref linkend="fig.workflow_edit_resolution_punkt"/>) с заполненными данными. Если пользователь в этом случае на экране редактирования пункта резолюции нажимает на кнопку &quot;Назад&quot;, мобильный клиент возвращает экран резолюции в том состоянии, которое было до вызова данного экрана.</para>
</listitem>
<listitem>
<para>Для еще не принятой резолюции в результате долгого нажатия по плашке запрашивается подтверждение удаления с сообщением &quot;Вы действительно хотите удалить данный пункт резолюции?&quot; Если пользователь подтверждает удаление, плашка удаляется из списка, при неуспешном удалении отображается сообщение об ошибке.</para>
</listitem>
<listitem>
<para>Если пользователь на экране резолюции (<xref linkend="fig.workflow_resolution"/>) нажимает на кнопку &quot;Назад&quot;, мобильный клиент возвращает экран информации о работе в том состоянии, которое было до вызова данного экрана.</para>
</listitem>
</orderedlist>
<para><emphasis role="italic">Экран редактирования пункта резолюции.</emphasis></para>
<figure id="fig.workflow_edit_resolution_punkt">
<title>Экран редактирования пункта резолюции</title>
<graphic fileref="resources/img/workflow/edit_resolution_punkt.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/edit_resolution_punkt.png" align="center"/>
</figure>
<para>Все поля и кнопки данного экрана не имеют фиксированной высоты, контентозависимы (если все поля вмещаются в экран, то управляющие кнопки должны быть внизу экрана, а не сразу за контентом).</para>
<para>Параметры пункта резолюции:</para>
<informaltable frame="all">
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<thead>
<row>
<entry align="center">Параметр</entry>
<entry align="center">Описание</entry>
<entry align="center">Значение по умолчанию</entry>
</row>
</thead>
<tbody>
<row>
<entry>Формулировка пункта</entry>
<entry>Вводится полное название пункта резолюции (автоматический подбор по совпадениям, как в основном приложении, не поддерживается).</entry>
<entry>Поле пустое, placeholder - &quot;Введите формулировку пункта резолюции&quot;.</entry>
</row>
<row>
<entry>Ответственный</entry>
<entry>Открывается экран &quot;Пользователи&quot; (<xref linkend="fig.workflow_user_chooser_1"/>), параметры: <itemizedlist>
<listitem>
<para>выбор одного пользователя;</para>
</listitem>
<listitem>
<para>если значение настройки &quot;разрешено ли добавлять соисполнителей к работам, не являющихся подчиненными&quot; = true, отображать всех пользователей, иначе - только подчиненных.</para>
</listitem>
</itemizedlist>Поле должно автоматически очиститься и стать неактивным (независимо от его заполненности), если выключается флажок.</entry>
<entry>Флажок включен, поле пустое, placeholder - &quot;Выберите ответственного&quot;.</entry>
</row>
<row>
<entry>Исполнители</entry>
<entry>Открывается экран &quot;Пользователи&quot; (<xref linkend="fig.workflow_user_chooser_1"/>), параметры:<itemizedlist>
<listitem>
<para>множественный выбор пользователей;</para>
</listitem>
<listitem>
<para>если значение настройки &quot;разрешено ли добавлять соисполнителей к работам, не являющихся подчиненными&quot; = true, отображать всех пользователей, если false:</para>
<itemizedlist>
<listitem>
<para>для значения настройки &quot;ставить ли работы исполнителям от имени ответственного&quot; = true, отображать подчиненных ответственного (если таковой выбран);</para>
</listitem>
<listitem>
<para>иначе (для значения настройки &quot;ставить ли работы исполнителям от имени ответственного&quot; = false либо если не был выбран ответственный) - отображать подчиненных данного пользователя.</para>
</listitem>
</itemizedlist>
</listitem>
</itemizedlist>Поле должно автоматически очиститься, если сменили ответственного.</entry>
<entry>Поле пустое, placeholder - &quot;Выберите исполнителей&quot;.</entry>
</row>
<row>
<entry>Изменить срок</entry>
<entry>Открывается системное окно ввода даты / времени.</entry>
<entry>Если значение настройки &quot;подставлять ли дату завершения документа в пункты резолюции&quot; = true, значения запрашиваются с сервера при открытии экрана, иначе - поля пустые.</entry>
</row>
<row>
<entry>Тип работы</entry>
<entry>Открывается список из возможных значений (полученных при загрузке приложения).</entry>
<entry>&quot;Работа&quot;</entry>
</row>
<row>
<entry>Форма завершения</entry>
<entry>Открывается список из возможных значений (полученных при загрузке приложения) и значения &quot;Результат работы&quot;, значение &quot;Результат работы&quot; должно быть в списке первым. Если список форм завершения пуст, поле не должно быть отображено. </entry>
<entry>&quot;Результат работы&quot;</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Если пользователь на экране редактирования пункта резолюции нажимает на кнопку &quot;Назад&quot;, мобильный клиент возвращает экран резолюции в том состоянии, которое было до вызова данного экрана.</para>
<para>После ввода всех необходимых параметров пункта резолюции пользователь нажимает на кнопку &quot;Готово&quot;. Сохранение локальное. Действие выполняется при выполнении следующих условий:</para>
<itemizedlist>
<listitem>
<para>для типа &quot;Работа&quot;: название, ответственный / исполнители и сроки обязательны для заполнения, форма завершения доступна для выбора;</para>
</listitem>
<listitem>
<para>для типов &quot;Согласование&quot; / &quot;Утверждение&quot; / &quot;Ознакомление&quot;: название, исполнители и сроки обязательны для заполнения, ответственный и форма завершения недоступны для выбора;</para>
</listitem>
<listitem>
<para>для типа &quot;Резолюция&quot;: название, ответственный / исполнители и сроки обязательны для заполнения, форма завершения недоступна для выбора;</para>
</listitem>
<listitem>
<para>для типа &quot;Отправка документа&quot;: название и исполнители обязательны для заполнения, ответственный, сроки и форма завершения недоступны для выбора.</para>
</listitem>
</itemizedlist>
<note>
<para>Подписи к недоступным полям должны выделяться серым цветом (#7f7f7f).</para>
<para>Для включенного флажка поле &quot;Ответственный&quot; обязательно для заполнения, для выключенного - обязательно для заполнения поле &quot;Исполнители&quot;.</para>
<para>Если дата завершения пункта резолюции меньше текущей даты, то необходимо выдавать сообщение &quot;Дата завершения некоторых элементов меньше текущей даты&quot; и не выполнять действие, иначе - действие выполнять.</para>
<para>Если значение настройки &quot;разрешено ли ставить работы по резолюции, завершающиеся позже документа&quot; = false, то для даты завершения в пунктах резолюции &gt; даты завершения документа необходимо выдавать сообщение &quot;Дата завершения каждого из пунктов резолюции не должна превышать срок документа&quot; и не выполнять действие, иначе - действие выполнять.</para>
</note>
<para>В случае неуспешного сохранения выдается сообщение об ошибке, пользователь остается на экране редактирования пункта резолюции. В случае же успешного сохранения открывается экран резолюции (<xref linkend="fig.workflow_resolution"/>), новый созданный пункт резолюции добавляется в конец списка.</para>
<para><emphasis role="bold">Сохранение резолюции.</emphasis></para>
<para>Для сохранения черновика резолюции пользователь нажимает на кнопку &quot;Сохранить&quot;. Сохранение с отправкой данных сервер. Действие выполняется при выполнении следующего условия:</para>
<itemizedlist>
<listitem>
<para>создан хотя бы один пункт резолюции.</para>
</listitem>
</itemizedlist>
<para>При неуспешном сохранении отображается сообщение об ошибке &quot;Резолюция должна содержать хотя бы один элемент&quot;, пользователь остается на экране резолюции. При успешном сообщается &quot;Данные сохранены&quot;, экран резолюции закрывается, открывается экран информации о работе.</para>
<para><emphasis role="bold">Редактирование черновика резолюции.</emphasis></para>
<para>Если у пользователя есть право редактирования черновика резолюции, то чтобы редактировать черновик резолюции, он в окне информации о работе нажимает на кнопку &quot;Резолюция&quot; - открывается экран резолюции с плашками сохраненных пунктов резолюции и кнопками &quot;Принять&quot; и &quot;Сохранить&quot;. Возможные действия аналогичны описанным выше 1-3.</para>
<para><emphasis role="bold">Принятие резолюции.</emphasis></para>
<para>Для принятия резолюции пользователь нажимает на кнопку &quot;Принять&quot;. При принятии резолюции выполняется ее сохранение (с соответствующим условием). При неуспешном сохранении отображается сообщение об ошибке, пользователь остается на экране резолюции. При успешном сообщается &quot;Резолюция принята&quot;, экран резолюции закрывается, открывается экран информации о работе.</para>
<para>Кроме того, обновляется список работ (удаляется предыдущая работа, создаются новые, присваивается свойство контрольности). На плашку работы справа от иконки приоритета добавляется иконка наличия резолюции (&quot;штамп&quot;). Пример плашки работы с наложенной резолюцией см. в <xref linkend="fig.workflow_size_spacing_plashka_work_with_resolution"/>.</para>
<para><emphasis role="bold">Просмотр принятой резолюции.</emphasis></para>
<para>Если у пользователя нет права редактирования принятой резолюции (только просмотр), то чтобы просмотреть принятую резолюцию, он в окне информации о работе нажимает на кнопку &quot;Резолюция&quot; - открывается экран резолюции с плашками принятых пунктов резолюции, в котором:</para>
<itemizedlist>
<listitem>
<para>отсутствует кнопка &quot;Сохранить&quot;;</para>
</listitem>
<listitem>
<para>недоступны для нажатия кнопки &quot;Добавить пункт&quot; и &quot;Принять&quot;, а также флажок &quot;Является контрольным&quot;;</para>
</listitem>
<listitem>
<para>отсутствуют действия нажатия по плашке (редактирование пункта резолюции) и долгого нажатия по плашке (удаление пункта резолюции).</para>
</listitem>
</itemizedlist>
<para><emphasis role="bold">Редактирование принятой резолюции.</emphasis></para>
<para>Если у пользователя есть право редактирования принятой резолюции, то чтобы редактировать принятую резолюцию, он в окне информации о работе нажимает на кнопку &quot;Резолюция&quot; - открывается экран резолюции с плашками принятых пунктов резолюции. Управляющая кнопка для принятой резолюции одна - &quot;Принять&quot; (с идентификатором PREFERRED).</para>
<para>При добавлении новых пунктов резолюции возможные действия с ними аналогичны описанным выше 1-3.</para>
<orderedlist>
<listitem>
<para>Для принятой резолюции в результате нажатия по плашке пункта резолюции открывается экран редактирования данного пункта резолюции (<xref linkend="fig.workflow_edit_resolution_punkt"/>) с заполненными данными. Поля ответственного и типа работы недоступны на редактирование, остальные доступны.</para>
<para>Если пользователь в этом случае на экране редактирования пункта резолюции нажимает на кнопку &quot;Назад&quot;, мобильный клиент возвращает экран резолюции в том состоянии, которое было до вызова данного экрана.</para>
</listitem>
<listitem>
<para>Для принятой резолюции в результате долгого нажатия по плашке запрашивается подтверждение удаления с сообщением &quot;Вы действительно хотите удалить данный пункт резолюции?&quot; Если пользователь подтверждает удаление, плашка удаляется из списка, при неуспешном удалении отображается сообщение об ошибке.</para>
</listitem>
</orderedlist>
<para>Для принятия отредактированной резолюции пользователь нажимает на кнопку &quot;Принять&quot;. При неуспешном сохранении отображается сообщение об ошибке, пользователь остается на экране резолюции. При успешном сообщается &quot;Резолюция принята&quot;, экран резолюции закрывается, открывается экран информации о работе. Кроме того, обновляется список работ согласно введенным изменениям.</para>
<para><emphasis role="bold">Создание нескольких резолюций на документ.</emphasis></para>
<note>
<para>Работает, только если значение настройки &quot;разрешено ли накладывать дополнительные резолюции&quot; = true.</para>
</note>
<para>По нажатию на кнопку &quot;Резолюция&quot; должно вызываться меню (аналогичное, например, выбору формы завершения, <xref linkend="fig.workflow_resolution_menu"/>), с первым пунктом &quot;Создать новую&quot; (действие из подраздела &quot;Создание резолюции&quot;). Пользователи - ответственные и исполнители уже наложенной резолюции, которые, в свою очередь, могут создавать резолюцию, - получают возможность накладывать собственную резолюцию. Один пользователь может создать только одну резолюцию, т.е. если пользователь уже создал резолюцию для документа, то пункт меню &quot;Создать новую&quot; у него должен отсутствовать.</para>
<figure id="fig.workflow_resolution_menu">
<title>Меню пунктов резолюции</title>
<graphic fileref="resources/img/workflow/resolution_menu.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/resolution_menu_ios.png" align="center"/>
</figure>
<para>Далее идут пункты, соответствующие уже наложенным на документ резолюциям в порядке их создания, в формате <emphasis role="italic">&quot;Резолюция от Фамилия И.О.&quot;</emphasis> По нажатию на один из пунктов выполняется действие подразделов &quot;Просмотр принятой резолюции&quot; либо &quot;Редактирование принятой резолюции&quot; (в зависимости от прав).</para>
<para>Если резолюцию накладывает ответственный пункта уже имеющейся резолюции, то система сначала должна предупреждать пользователя сообщением &quot;Наложение дополнительной резолюции приведет к удалению работ ваших исполнителей. Вы действительно хотите это сделать?&quot; По нажатию на кнопку &quot;Нет&quot; действие не выполняется и пользователь возвращается к окну информации о работе. По нажатию же &quot;Да&quot; действие выполняется: см. подраздел &quot;Создание резолюции&quot;.</para>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_subsidiary_works">
<title>Дочерние работы</title>
<para>Для того, чтобы просмотреть дочерние работы для данной, пользователь должен провести пальцем от правой стороны плашки работы к левой, при этом раскроется правая панель дочерних работ к данной (<xref linkend="fig.workflow_subsidiary_works"/>).</para>
<figure id="fig.workflow_subsidiary_works">
<title>Дочерние работы</title>
<graphic fileref="resources/img/workflow/subsidiary_works.png" align="center"/>
</figure>
<para>Родительская работа отличается от дочерних фоном (#efefef) и полужирным выделением (всегда, независимо от значения поля is_new), отображается в самом начале списка. </para>
<para>Логика отображения остальных плашек аналогична главному экрану со списком работ (<xref linkend="sec.workflow_works"/>).</para>
<para><emphasis role="bold">Переходы на другие экраны.</emphasis></para>
<para>Чтобы перейти к дочерним работам данной дочерней работы, пользователь проводит пальцем от правой стороны плашки к левой (<xref linkend="sec.workflow_subsidiary_works"/>).</para>
<para>По нажатию на плашку работы открывается экран информации о работе (<xref linkend="sec.workflow_workinfo"/>).</para>
<para>Если у пользователя есть права на редактирование работы, в результате долгого нажатия по плашке работы
появляется меню, в котором присутствует пункт &quot;Изменить&quot; (<xref linkend="sec.workflow_work_create"/>).</para>
<para>Если у пользователя есть права на удаление работы, в результате долгого нажатия по плашке работы
появляется меню, в котором присутствует пункт &quot;Удалить&quot; (<xref linkend="sec.workflow_work_delete"/>).</para>
<para>По нажатию на кнопку &quot;Назад&quot; пользователь возвращается на 1 (один) уровень вложенности вверх.</para>
<para>Панель можно скрыть двумя способами (переход из любого уровня вложенности на главный экран со списком работ):</para>
<orderedlist>
<listitem>
<para>проведя пальцем от левой стороны экрана к правой;</para>
</listitem>
<listitem>
<para>нажав по любому месту левой стороны экрана (там, где отображается часть экрана списка работ).</para>
</listitem>
</orderedlist>
<note>
<para>Метод получения списка работ описан в javadoc kz.arta.synergy.server.api.rest.works#getSubWorks.</para>
</note>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_work_actions">
<title>Действия с работой</title>
<para>Далее располагаются управляющие кнопки.</para>
<para>Для каждой работы API будет возвращать информацию о доступном наборе кнопок, для каждой кнопки указываются: цвета, название, идентификатор действия, идентификатор операции и значение лейбла.</para>
<informaltable>
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<colspec colname="c3"/>
<thead>
<row>
<entry align="center">Идентификатор действия</entry>
<entry align="center">Идентификатор операции</entry>
<entry align="center">Значение лейбла</entry>
</row>
</thead>
<tbody>
<row>
<entry>RESOLUTION</entry>
<entry/>
<entry>Резолюция</entry>
</row>
<row>
<entry>COMPLETE</entry>
<entry>PROCESS</entry>
<entry>Ответить</entry>
</row>
<row>
<entry>COMPLETE</entry>
<entry>PROGRESS</entry>
<entry>Завершить</entry>
</row>
<row>
<entry>COMPLETE</entry>
<entry>POINT_RESULT</entry>
<entry>Завершить</entry>
</row>
<row>
<entry>COMPLETE</entry>
<entry>RESOLUTION_ACTION</entry>
<entry>Завершить</entry>
</row>
<row>
<entry>RESULT</entry>
<entry/>
<entry>Результат</entry>
</row>
<row>
<entry>SEND</entry>
<entry>AGREEMENT</entry>
<entry>согласно API (согласование)</entry>
</row>
<row>
<entry>SEND</entry>
<entry>APPROVAL</entry>
<entry>согласно API (утверждение)</entry>
</row>
<row>
<entry>SEND</entry>
<entry>ACQUAINTANCE</entry>
<entry>согласно API (ознакомление)</entry>
</row>
<row>
<entry>REASSIGN</entry>
<entry/>
<entry>согласно API (перепоручение)</entry>
</row>
<row>
<entry>TRANSMIT</entry>
<entry/>
<entry>согласно API (передача)</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Кнопки управления могут быть двух типов: одна, выполнение действия которой является наиболее ожидаемым (зеленого цвета, идентификатор PREFERRED), и остальные, выполнение действия которых является менее ожидаемым (серого цвета, идентификатор NOT_PREFERRED).</para>
<para>Пример экрана информации о работе без панелей комментариев и вложений показан на <xref linkend="fig.workflow_workinfo_5"/>.</para>
<figure id="fig.workflow_workinfo_5">
<title>Информация о работе без комментариев и вложений</title>
<graphic fileref="resources/img/workflow/work_view5.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/work_view5.png" align="center"/>
</figure>
<!--Резолюция--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_resolution.xml" encoding="UTF-8"/>
<!--Завершение работы--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_work_end.xml" encoding="UTF-8"/>
<!--Результат работы--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_work_result.xml" encoding="UTF-8"/>
<!--Отправка работы--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_work_send.xml" encoding="UTF-8"/>
<!--Перепоручение работы--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_work_reassign.xml" encoding="UTF-8"/>
<!--Передача работы--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_work_transmit.xml" encoding="UTF-8"/>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_work_create">
<title>Создание и редактирование работы</title>
<para>На экране со списком работ по нажатию на кнопку &quot;+&quot; и выбору пункта меню &quot;Работа&quot; открывается экран создания работы (<xref linkend="fig.workflow_work_new"/>).</para>
<figure id="fig.workflow_work_new">
<title>Создание работы</title>
<graphic fileref="resources/img/workflow/new_work.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/new_work.png" align="center"/>
</figure>
<para>Если у пользователя есть право на редактирование работы, в результате долгого нажатия по плашке работы
появляется меню, в котором присутствует пункт &quot;Изменить&quot;. Пользователь нажимает на этот пункт меню, открывается экран редактирования работы (<xref linkend="fig.workflow_work_edit"/>).</para>
<figure id="fig.workflow_work_edit">
<title>Редактирование работы</title>
<graphic fileref="resources/img/workflow/edit_work.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/edit_work.png" align="center"/>
</figure>
<para>Все поля экрана не имеют фиксированной высоты, экран прокручивается.</para>
<para>Параметры работы.</para>
<informaltable frame="all" id="table.workflow_work_parameters">
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<thead>
<row>
<entry align="center">Параметр работы</entry>
<entry align="center">Описание</entry>
<entry align="center">Значение по умолчанию</entry>
</row>
</thead>
<tbody>
<row>
<entry>Формулировка работы</entry>
<entry>
<para>Вводится полное название работы.</para>
</entry>
<entry>
<para><emphasis role="italic">Создание </emphasis>- поле пустое, placeholder - &quot;Введите формулировку работы&quot;.</para>
<para><emphasis role="italic">Редактирование</emphasis> - текущее название работы.</para>
</entry>
</row>
<row>
<entry>Ответственный</entry>
<entry>Открывается экран &quot;Пользователи&quot; (<xref linkend="fig.workflow_user_chooser_1"/>), параметры: <itemizedlist>
<listitem>
<para>выбор одного пользователя;</para>
</listitem>
<listitem>
<para>если значение настройки &quot;разрешено ли передавать работы другим исполнителям&quot; = true, отображать всех пользователей, иначе - только подчиненных;</para>
</listitem>
<listitem>
<para>идентификатор действия не указывается.</para>
</listitem>
</itemizedlist>Поле должно автоматически очиститься и стать неактивным (независимо от его заполненности), если выключается флажок.</entry>
<entry>
<para><emphasis role="italic">Создание</emphasis> - флажок включен, поле пустое, placeholder - &quot;Выберите ответственного&quot;.</para>
<para><emphasis role="italic">Редактирование</emphasis> - флажок отсутствует, заполнено значением текущего ответственного.</para>
</entry>
</row>
<row>
<entry>Автор</entry>
<entry>Открывается экран &quot;Пользователи&quot; (<xref linkend="fig.workflow_user_chooser_1"/>), параметры: <itemizedlist>
<listitem>
<para>выбор одного пользователя;</para>
</listitem>
<listitem>
<para>отображать неподчиненных или нет не указывается;</para>
</listitem>
<listitem>
<para>идентификатор действия: 101.</para>
</listitem>
</itemizedlist>Если настройка приложения &quot;отображать поле &quot;автор&quot; при создании работы&quot; = false, поле не должно быть отображено.</entry>
<entry>
<para><emphasis role="italic">Создание</emphasis> - авторизованный пользователь, активно.</para>
<para><emphasis role="italic">Редактирование</emphasis> - текущий автор работы, неактивно.</para>
</entry>
</row>
<row>
<entry>Исполнители</entry>
<entry>Открывается экран &quot;Пользователи&quot; (<xref linkend="fig.workflow_user_chooser_1"/>), параметры: <itemizedlist>
<listitem>
<para>множественный выбор пользователей;</para>
</listitem>
<listitem>
<para>если значение настройки &quot;разрешено ли добавлять соисполнителей к работам, не являющихся подчиненными&quot; = true, отображать всех пользователей, если false:</para>
<itemizedlist>
<listitem>
<para>для значения настройки &quot;ставить ли работы исполнителям от имени ответственного&quot; = true, отображать подчиненных ответственного (если таковой выбран);</para>
</listitem>
<listitem>
<para>иначе (для значения настройки &quot;ставить ли работы исполнителям от имени ответственного&quot; = false либо если не был выбран ответственный) - отображать подчиненных данного пользователя;</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>идентификатор действия не указывается.</para>
</listitem>
</itemizedlist>Поле должно автоматически очиститься, если сменили ответственного. Поле должно отсутствовать если значение настройки &quot;обязательно ли подписание документов перед отправкой&quot; = true.</entry>
<entry>
<para><emphasis role="italic">Создание</emphasis> - поле пустое, placeholder - &quot;Выберите исполнителей&quot;.</para>
<para><emphasis role="italic">Редактирование</emphasis> - поле отсутствует.</para>
</entry>
</row>
<row>
<entry>Изменить срок</entry>
<entry>Открывается системное окно ввода даты / времени. </entry>
<entry>
<para><emphasis role="italic">Создание</emphasis> - значения запрашиваются с сервера при открытии экрана.</para>
<para><emphasis role="italic">Редактирование</emphasis> - время начала и завершения текущей работы.</para>
</entry>
</row>
<row>
<entry>Приоритет</entry>
<entry>Открывается список для выбора одного из значений, полученных при загрузке приложения (параметр &apos;current_priorities&apos;).</entry>
<entry>
<para><emphasis role="italic">Создание</emphasis> - значение запрашивается с сервера при загрузке приложения (параметр &apos;prority&apos;).</para>
<para><emphasis role="italic">Редактирование</emphasis> - значение приоритета текущей работы.</para>
</entry>
</row>
<row>
<entry>Форма завершения</entry>
<entry>Открывается список из возможных значений, полученных при загрузке приложения (параметр &apos;work_completion_forms&apos;) и значения &quot;Нет&quot;, значение &quot;Нет&quot; должно быть в списке первым. Если список форм завершения пуст, поле не должно быть отображено.</entry>
<entry>
<para><emphasis role="italic">Создание</emphasis> - &quot;Нет&quot;.</para>
<para><emphasis role="italic">Редактирование</emphasis> - форма завершения текущей работы. Если текущая форма завершения работы отсутствует в списке - &quot;Нет&quot;.</para>
</entry>
</row>
<row>
<entry>Комментарий к работе</entry>
<entry>Вводится комментарий к работе.</entry>
<entry>
<para><emphasis role="italic">Создание</emphasis> - пустое поле.</para>
<para><emphasis role="italic">Редактирование</emphasis> - поле отсутствует.</para>
</entry>
</row>
<row>
<entry>Добавить файл</entry>
<entry>Выбирается вариант добавления: &quot;С устройства&quot; / &quot;Сфотографировать&quot;. Добавленные файлы отображаются сразу после кнопок. Отображается только название файла.</entry>
<entry>
<para>При <emphasis role="italic">создании</emphasis> и <emphasis role="italic">редактировании</emphasis> поля пустые.</para>
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>При создании работы файл добавляется в папку &quot;Приложения&quot;, при редактировании работы - в &quot;Приложения&quot;, если есть доступ, в &quot;Прочие&quot;, если доступа нет (выбор в какую папку файлы должны быть добавлены осуществляется на сервере, указывать на клиенте это не нужно).</para>
<para>Для удаления только что добавленного файла пользователь долго нажимает на плашку вложения и выбирает единственный пункт &quot;Удалить&quot;. Открывается окно подтверждения удаления с сообщением &quot;Вы действительно хотите удалить данный файл?&quot;. Если пользователь подтверждает удаление - файл удаляется, &quot;Отмена&quot; - не удаляется.</para>
<para>Если пользователь на экране нажимает на кнопку &quot;Назад&quot;, мобильный клиент возвращает экран со списком работ в том состоянии, которое было до вызова данного экрана.</para>
<para>После ввода всех необходимых параметров работы пользователь нажимает на кнопку &quot;Создать&quot; / &quot;Сохранить&quot;. Действие создания/сохранения выполняется при выполнении следующих условий:</para>
<itemizedlist>
<listitem>
<para>заполнена формулировка работы;</para>
</listitem>
<listitem>
<para>для включенного флажка заполнено поле &quot;Ответственный&quot;, для выключенного - поле &quot;Исполнители&quot;;</para>
</listitem>
<listitem>
<para>заполнено поле &quot;Автор&quot; работы;</para>
</listitem>
<listitem>
<para>заполнены сроки, причем дата начала меньше даты завершения;</para>
</listitem>
<listitem>
<para>в поле &quot;Приоритет&quot; выбран нескрытый приоритет.</para>
</listitem>
</itemizedlist>
<para>В случае успешного сохранения открывается экран со списком работ. Если была создана новая работа - она вставляется в верх списка. Плашка измененной работы обновляется (обновление всего списка не требуется).</para>
<para>В случае неуспешного - выдается сообщение об ошибке, действие выполняться не должно, пользователь остается на экране создания / редактирования работы.</para>
<itemizedlist>
<listitem>
<para>Если не введены формулировка работы и/или ответственный (для включенного флажка) - ошибка &quot;Заполните все поля&quot;.</para>
</listitem>
<listitem>
<para>Если для выключенного флажка не выбрано ни одного исполнителя - ошибка &quot;Работа не может быть создана: не указан ни ответственный, ни исполнители&quot;.</para>
</listitem>
<listitem>
<para>Если у просроченной работы был изменен ответственный - ошибка &quot;Вы не можете изменить ответственного у просроченной работы. Измените дату завершения.&quot;</para>
</listitem>
<listitem>
<para>Если у обычной (непросроченной) работы был изменен ответственный - предупреждающее сообщение &quot;Вы действительно хотите изменить ответственного?
Данная работа будет удалена.
Вместо нее будет создана аналогичная для нового пользователя с датой начала от текущего числа.&quot; с действиями &quot;Да&quot; и &quot;Нет&quot;.</para>
</listitem>
<listitem>
<para>Работы, для которых уже был назначен приоритет, который впоследствии скрыли, сохраняют его значение и цвет до тех пор, пока работу не откроют на редактирование (он все еще должен являться значением компонента, но при этом должен отсутствовать в выпадающем списке). Ошибка: &quot;Выбранный приоритет работы отсутствует в справочнике приоритетов. Выберите другое значение.&quot;</para>
</listitem>
</itemizedlist>
<note>
<para>Метод получения дефолтных полей для создания новой работы - kz.arta.synergy.server.api.rest.works.WorkFlowService#getDefaultWorkFields</para>
<para>Метод добавления работы - kz.arta.synergy.server.api.rest.works.WorkFlowService#createWork</para>
<para>Метод изменения работы - kz.arta.synergy.server.api.rest.works.WorkFlowService#saveWork</para>
<para>Метод добавления файла - kz.arta.synergy.server.api.rest.works.WorkFlowService#createAttachment (параметр path должен отсутсвовать)</para>
<para>Метод добавления комментария - kz.arta.synergy.server.api.rest.works.WorkFlowService#addComment</para>
</note>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_work_edit">
<title>Редактирование работы</title>
<para/>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_work_end">
<title>Завершение работы (идентификатор действия COMPLETE)</title>
<para>В зависимости от атрибутов работы, завершение может быть осуществлено одним из следующих способов:</para>
<itemizedlist>
<listitem>
<para>Идентификатор операции - <emphasis role="bold">PROCESS</emphasis>: завершение с выполнением действия (согласования, ознакомления или утверждения);</para>
</listitem>
<listitem>
<para>Идентификатор операции - <emphasis role="bold">PROGRESS</emphasis>: завершение выставлением прогресса;</para>
</listitem>
<listitem>
<para>Идентификатор операции - <emphasis role="bold">POINT_RESULT</emphasis>: завершение с выбором результата работы;</para>
</listitem>
<listitem>
<para>Идентификатор операции - <emphasis role="bold">RESOLUTION_ACTION</emphasis>: завершение процесса резолюции.</para>
</listitem>
</itemizedlist>
<!--Завершение с действием--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_work_end_with_proccess.xml" encoding="UTF-8"/>
<!--Завершение выставлением прогресса--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_work_end_without_forma.xml" encoding="UTF-8"/>
<!--Завершение с результатом работы--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_work_end_with_forma.xml" encoding="UTF-8"/>
<!--Завершение процесса резолюции--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_work_end_resolution.xml" encoding="UTF-8"/>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="se.workflow_work_end_resolution">
<title>Завершение процесса резолюции</title>
<para>Пользователь нажимает на кнопку &quot;Завершить&quot; - открывается экран &quot;Внимание&quot; (<xref linkend="fig.workflow_work_end_resolution_1"/>, <xref linkend="fig.workflow_work_end_resolution_2"/>). Для завершения действия по процессу резолюции API будет возвращать следующую информацию:</para>
<itemizedlist>
<listitem>
<para>информация о наборе функциональных кнопок и для каждой из них: название, цвет, действие;</para>
</listitem>
<listitem>
<para>текст сообщения.</para>
</listitem>
</itemizedlist>
<figure id="fig.workflow_work_end_resolution_1">
<title>Завершение процесса &quot;резолюция&quot;, вариант 1</title>
<graphic fileref="resources/img/workflow/attention_1.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/attention_1_ios.png" align="center"/>
</figure>
<figure id="fig.workflow_work_end_resolution_2">
<title>Завершение процесса &quot;резолюция&quot;, вариант 2</title>
<graphic fileref="resources/img/workflow/attention_2.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/attention_2_ios.png" align="center"/>
</figure>
<para>Функциональные кнопки имеют фиксированное положение. Вся остальная область экрана прокручиваема.</para>
<para>Параметры завершения процесса резолюции. Вариант 1 - нет ни одной принятой резолюции на документе для выключенной опции конфигуратора &quot;Разрешить накладывать дополнительные резолюции&quot; либо данная опция включена, при этом пользователь имеет право принятия резолюции.</para>
<informaltable frame="all">
<tgroup cols="2">
<colspec colname="c1"/>
<colspec colname="c2"/>
<thead>
<row>
<entry align="center">Параметр</entry>
<entry align="center">Значение</entry>
</row>
</thead>
<tbody>
<row>
<entry>Текстовое сообщение (формулировка текста передается API):</entry>
<entry>
<para><emphasis role="bold">Данный тип работы предполагает принятие резолюции. Вы хотите сделать это сейчас?</emphasis></para>
<para>Для принятия резолюции нажмите кнопку &quot;Резолюция&quot;, для завершения работы - кнопку &quot;Завершить&quot;.</para>
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Цвет первого абзаца - #717171, второго - #353535.</para>
<para>Для варианта 1 функциональных кнопок должно быть две: &quot;Резолюция&quot; (с идентификатором PREFERRED) и &quot;Завершить&quot; (с идентификатором NOT_PREFERRED).</para>
<para>Параметры завершения процесса резолюции. Вариант 2 - на документе есть одна принятая резолюция для выключенной опции конфигуратора &quot;Разрешить накладывать дополнительные резолюции&quot;, либо принятие резолюции недоступно согласно хода выполнения документа, либо у пользователя отсутствует право принятия резолюции. </para>
<informaltable frame="all">
<tgroup cols="2">
<colspec colname="c1"/>
<colspec colname="c2"/>
<thead>
<row>
<entry align="center">Параметр</entry>
<entry align="center">Значение</entry>
</row>
</thead>
<tbody>
<row>
<entry>Текстовое сообщение (формулировка текста передается API):</entry>
<entry>
<para><emphasis role="bold">Завершить работу? Действие &quot;Резолюция&quot; по этому документу недоступно.</emphasis></para>
<para>Возможные причины:</para>
<orderedlist>
<listitem>
<para>У вас недостаточно прав для принятия резолюции.</para>
</listitem>
<listitem>
<para>Одна резолюция на документе уже имеется, а принятие нескольких резолюций не допускается согласно текущим настройкам системы.</para>
</listitem>
</orderedlist>
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Цвет первого абзаца - #717171, второго - #353535.</para>
<para>Для варианта 2 функциональная кнопак должна быть одна: &quot;Завершить&quot; (с идентификатором PREFERRED).</para>
<para>Если пользователь нажимает на кнопку &quot;Назад&quot;, возвращается экран информации о работе в том же состоянии, что и до завершения работы.</para>
<para>По нажатию на кнопку &quot;Резолюция&quot; должен открываться экран резолюции (<xref linkend="sec.workflow_resolution"/>):</para>
<itemizedlist>
<listitem>
<para>если данный пользователь еще не принимал резолюцию на данный документ - экран создания новой резолюции;</para>
</listitem>
<listitem>
<para>если данный пользователь сохранял черновик резолюции на данном документе - экран редактирования черновика резолюции;</para>
</listitem>
<listitem>
<para>если данный пользователь уже принимал резолюцию на данный документ - экран редактирования принятой резолюции.</para>
</listitem>
</itemizedlist>
<para>В случае успешного выполнения действия открывается экран информации о работе, информация обновляется. В случае неуспешного - выдается сообщение об ошибке, пользователь остается на данном экране.</para>
<para>По нажатию на кнопку &quot;Завершить&quot; работа сразу (без подтверждения действия) должна завершиться. В результате успешного выполнения действия происходит возврат к списку работ, в котором обновляется плашка данной работы. В случае неудачного выполнения пользователь остается на этом же экране.</para>
<note>
<para>Метод API для получения информации о построении окна rest/api/workflow/screen_resolution_info. </para>
</note>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_work_end_with_forma">
<title>Завершение с результатом работы (идентификатор операции POINT_RESULT)</title>
<!--Форма завершения - файл--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_work_end_with_forma_file.xml" encoding="UTF-8"/>
<!--Форма завершения - комментарий--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_work_end_with_forma_comment.xml" encoding="UTF-8"/>
<!--Форма завершения - форма--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_work_end_with_forma_form.xml" encoding="UTF-8"/>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_work_end_with_forma_comment">
<title>Форма завершения - комментарий</title>
<para>Внешний вид экрана зависит от того, есть ли подтвержденные результаты дочерних работ или нет. Для того, чтобы это узнать, необходимо вызвать метод API kz.arta.synergy.server.api.rest.works#getWorkCompletionData. Если список previous_results не пустой - значит существуют подтвержденные результаты дочерних работ, иначе - не существуют.</para>
<para>Метод API для выставления результата один и тот же как для работ, у которых есть результат дочерних работ, так и для тех у которых нет: kz.arta.synergy.server.api.rest.works#setWorkResult.</para>
<para><emphasis role="bold">Завершение работы, у которой нет результатов дочерних работ.</emphasis></para>
<para>Пользователь выставляет 100% прогресса либо нажимает на кнопку &quot;Завершить&quot; - открывается экран &quot;Результат&quot; для ввода комментария в качестве формы завершения (<xref linkend="fig.workflow_form_end_comment"/>).</para>
<figure id="fig.workflow_form_end_comment">
<title>Завершение работы, у которой нет результатов дочерних работ (форма завершения - комментарий)</title>
<graphic fileref="resources/img/workflow/work_result_comment.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/work_result_comment.jpg" align="center"/>
</figure>
<para>Лейбл &quot;Введите комментарий&quot; и кнопка &quot;Готово&quot; имеют фиксированное положение. Панель для ввода комментария прокручиваема.</para>
<para>Пользователь вводит текст комментария.</para>
<para>Если пользователь нажимает на кнопку &quot;Назад&quot;, возвращается экран информации о работе в том же состоянии, что и до завершения работы.</para>
<para>Если пользователь нажимает на кнопку &quot;Готово&quot;, но результат работы не выбран, приложение отображает сообщение &quot;Выберите результат работы&quot; и не выполняет действие.</para>
<para>Если пользователь нажимает на кнопку &quot;Готово&quot;, мобильный клиент возвращает пользователя к экрану информации о работе, информация обновляется.</para>
<note>
<para>Метод API для задания результата такой же как и для формы завершения &quot;файл&quot; kz.arta.synergy.server.api.rest.works#setWorkResult</para>
</note>
<para><emphasis role="bold">Завершение работы, у которой есть результаты дочерних работ.</emphasis></para>
<para>Пользователь выставляет 100% прогресса либо нажимает на кнопку &quot;Завершить&quot; - открывается экран &quot;Результат&quot; для ввода/указания комментария в качестве формы завершения (<xref linkend="fig.workflow_reassign_work_end_comment"/>).</para>
<figure id="fig.workflow_reassign_work_end_comment">
<title>Завершение работы, у которой есть результаты дочерних работ (форма завершения - комментарий)</title>
<graphic fileref="resources/img/workflow/work_result_comment2.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/work_result_comment2.jpg" align="center"/>
</figure>
<para>Кнопка &quot;Готово&quot; имеет фиксированное положение. Обе панели данного экрана (&quot;Выберите из перепорученных&quot; и &quot;Или введите комментарий&quot;) прокручиваемы каждая внутри и должны занимать по 50% площади экрана.</para>
<para>Результат работы может быть введен тем же способом, как и для работы без дочерних результатов, а так же выбран из результатов дочерних работ.</para>
<para>Если пользователь в качестве результата выбирает результат дочерней работы, на сервер должен быть передан идентификатор результата дочерней работы.</para>
<para>Для этого пользователю необходимо на панели &quot;Выберите из перепорученных&quot; нажать на один из результатов, при этом выбранный результат отмечается в списке фоном, его название копируется в поле &quot;Результат работы&quot;, если до этого был выделен другой комментарий работы, то выделение его в списке отменяется.</para>
<para>Если пользователь выбирает в качестве результата результат дочерней работы и вносит в него изменения, считается, что это новый результат и выделение ранее выбранного результата в списке отменяется.</para>
<para>Если пользователь нажимает на кнопку &quot;Назад&quot;, возвращается экран информации о работе в том же состоянии, что и до завершения работы.</para>
<para>Если пользователь нажимает на кнопку &quot;Готово&quot;, но комментарий-результат не задан, приложение должно отобразить сообщение &quot;Выберите результат работы&quot; и не выполнять действие.</para>
<para>Если пользователь нажимает на кнопку &quot;Готово&quot;, мобильный клиент возвращает пользователя к экрану информации о работе, информация обновляется.</para>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_work_end_with_forma_file">
<title>Форма завершения - файл</title>
<para>Внешний вид экрана зависит от того, есть ли подтвержденные результаты дочерних работ или нет. Для того, чтобы это узнать, необходимо вызвать метод API kz.arta.synergy.server.api.rest.works#getWorkCompletionData. Если список previous_results не пустой - значит существуют подтвержденные результаты дочерних работ, иначе - не существуют.</para>
<para>Метод API для выставления результата один и тот же как для работ, у которых есть результат дочерних работ, так и для тех у которых нет: kz.arta.synergy.server.api.rest.works#setWorkResult.</para>
<para><emphasis role="bold">Завершение работы, у которой нет результатов дочерних работ.</emphasis></para>
<para>Пользователь выставляет 100% прогресса либо нажимает на кнопку &quot;Завершить&quot; - открывается экран &quot;Результат&quot; для выбора файла в качестве формы завершения (<xref linkend="fig.workflow_form_end_file"/>).</para>
<figure id="fig.workflow_form_end_file">
<title>Завершение работы, у которой нет результатов дочерних работ (форма завершения - файл)</title>
<graphic fileref="resources/img/workflow/work_result_file.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/work_result_file.jpg" align="center"/>
</figure>
<para>Кнопка &quot;Готово&quot; не имеет фиксированного положения. Весь экран прокручиваемый.</para>
<para>Результат работы может быть выбран следующими способами.</para>
<orderedlist>
<listitem>
<para>Из файлов работы. При выделении файла (tap) в списке фон соответствующего элемента меняется, в поле &quot;Результат работы&quot; копируется название выделенного файла. При долгом нажатии (долгий tap) файл открывается для просмотра (просмотр осуществляется системными средствами устройства). Если ранее был выбран файл из списка, его выделение отменяется.</para>
</listitem>
<listitem>
<para>&quot;С устройства&quot; - пользователь выбирает один из файлов, имеющихся на устройстве, при этом название выбранного файла копируется в поле &quot;Результат работы&quot;. Если ранее был выбран файл из списка, его выделение отменяется.</para>
</listitem>
<listitem>
<para>&quot;Сфотографировать&quot; - пользователь делает новый снимок, используя фотовозможности устройства, при этом название выбранного файла копируется в поле &quot;Результат работы&quot;. Если ранее был выбран файл из списка, его выделение отменяется.</para>
</listitem>
</orderedlist>
<note>
<para>При выборе нового файла как результата выполнения работы (выбор с устройства) отображать иконку файла не нужно. При добавлении новой фотографии необходимо отображать вместо иконки превью изображения.</para>
</note>
<para>Уже выбранный файл в поле &quot;Результат работы&quot; также можно просмотреть, нажав по нему (tap). Просмотр также осуществляется системными средствами устройства.</para>
<para>Если пользователь нажимает на кнопку &quot;Назад&quot;, возвращается экран информации о работе в том же состоянии, что и до завершения работы.</para>
<para>Если пользователь нажимает на кнопку &quot;Готово&quot;, но файл результата не задан, приложение должно отобразить сообщение &quot;Выберите результат работы&quot; и не выполнять действие.</para>
<para>Если пользователь нажимает на кнопку &quot;Готово&quot;, мобильный клиент возвращает пользователя к экрану информации о работе, информация обновляется.</para>
<para><emphasis role="bold">Завершение работы, у которой есть результаты дочерних работ.</emphasis></para>
<para>Пользователь выставляет 100% прогресса либо нажимает на кнопку &quot;Завершить&quot; - открывается экран &quot;Результат&quot; для выбора файла в качестве формы завершения (<xref linkend="fig.workflow_reassign_work_end_file"/>).</para>
<figure id="fig.workflow_reassign_work_end_file">
<title>Завершение работы, у которой есть результаты дочерних работ (форма завершения - файл)</title>
<graphic fileref="resources/img/workflow/work_result_file2.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/work_result_file2.jpg" align="center"/>
</figure>
<para>Кнопка &quot;Готово&quot; не имеет фиксированного положения. Весь экран прокручиваемый.</para>
<para>Результат работы может быть выбран теми же способами, как и для работы без дочерних результатов, а так же выбором одного из результатов дочерних работ.</para>
<para>Если пользователь в качестве результата выбирает результат дочерней работы, на сервер должен быть передан идентификатор результата дочерней работы.</para>
<para>Для этого пользователю необходимо перейти к вкладке результатов дочерних работ &quot;Перепорученные&quot; и нажать (tap) на один из результатов, при этом выбранный результат отмечается в списке фоном, его название копируется в поле &quot;Результат работы&quot;. При долгом нажатии (долгий tap) файл открывается для просмотра (просмотр осуществляется системными средствами устройства).</para>
<para>Если до этого был выделен другой файл работы (будь то из вкладки &quot;Из работы&quot; или &quot;Перепорученные&quot;), его выделение в списке отменяется.</para>
<para>Если пользователь нажимает на кнопку &quot;Назад&quot;, возвращается экран информации о работе в том же состоянии, что и до завершения работы.</para>
<para>Если пользователь нажимает на кнопку &quot;Готово&quot;, но файл результата не задан, приложение должно отобразить сообщение &quot;Выберите результат работы&quot; и не выполнять действие.</para>
<para>Если пользователь нажимает на кнопку &quot;Готово&quot;, мобильный клиент возвращает пользователя к экрану информации о работе, информация обновляется.</para>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_work_end_with_forma_form">
<title>Форма завершения - форма</title>
<para>Внешний вид экрана зависит от того, есть ли подтвержденные результаты дочерних работ или нет. Для того, чтобы это узнать, необходимо вызвать метод API kz.arta.synergy.server.api.rest.works#getWorkCompletionData. Если список previous_results не пустой - значит существуют подтвержденные результаты дочерних работ, иначе - не существуют.</para>
<para>Метод API для выставления результата один и тот же как для работ, у которых есть результат дочерних работ, так и для тех у которых нет: kz.arta.synergy.server.api.rest.works#setWorkResult.</para>
<para><emphasis role="bold">Завершение работы, у которой нет результатов дочерних работ.</emphasis></para>
<para>Пользователь выставляет 100% прогресса либо нажимает на кнопку &quot;Завершить&quot;. Далее необходимо вызвать метод API rest/api/asforms/form/{formID}. Если значение параметра <emphasis role="bold">isMobile</emphasis> = false, то выдавать сообщение-ошибку &quot;Действие не может быть выполнено, т.к. форма не имеет мобильного представления&quot; и не выполнять действие. Если <emphasis role="bold">isMobile</emphasis> = true, то необходимо открывать экран &quot;Результат&quot; для заполнения файла по форме в мобильном представлении (<xref linkend="fig.workflow_form_end_form"/>).</para>
<figure id="fig.workflow_form_end_form">
<title>Завершение работы, у которой нет результатов дочерних работ (форма завершения - форма)</title>
<graphic fileref="resources/img/workflow/work_result_form.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/work_result_form_ios.png" align="center"/>
</figure>
<para>Чтобы получить форму, необходимо вызвать метод API rest/api/asforms/form/{formID}, чтобы получить данные формы - rest/api/asforms/data/{formID}. Мобильное представление поддерживает только 4 компонента (лейбл, однострочное и мносрочное поле, выпадающий список), все они должны отрисовываться как стандартные компоненты в любом другом экране приложения.</para>
<para>Кнопка &quot;Готово&quot; имеет фиксированное положение, вся остальная область экрана прокручиваема.</para>
<para>Если пользователь нажимает на кнопку &quot;Назад&quot;, возвращается экран информации о работе в том же состоянии, что и до завершения работы.</para>
<para>Если пользователь нажимает на кнопку &quot;Готово&quot;, данные по форме должны сохраниться в отдельный файл в &quot;Прочих&quot;. Имя такого файла должно быть составлено по формату &quot;%Название формы% - %Фамилия И.О. сохранившего%&quot;. Мобильный клиент возвращает пользователя к экрану информации о работе, информация обновляется.</para>
<para><emphasis role="bold">Завершение работы, у которой есть результаты дочерних работ.</emphasis></para>
<para>Пользователь выставляет 100% прогресса либо нажимает на кнопку &quot;Завершить&quot;. Далее необходимо вызвать метод API rest/api/asforms/form/{formID}. Если значение параметра <emphasis role="bold">isMobile</emphasis> = false, то выдавать сообщение-ошибку &quot;Действие не может быть выполнено, т.к. форма не имеет мобильного представления&quot; и не выполнять действие. Если <emphasis role="bold">isMobile</emphasis> = true, то необходимо открывать экран &quot;Результат&quot; для выбора/заполнения файла по форме в мобильном представлении (<xref linkend="fig.workflow_reassign_work_end_form"/>).</para>
<figure id="fig.workflow_reassign_work_end_form">
<title>Завершение работы, у которой есть результаты дочерних работ (форма завершения - форма)</title>
<graphic fileref="resources/img/workflow/work_result_form2.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/work_result_form2_ios.png" align="center"/>
</figure>
<para>Кнопка &quot;Готово&quot; имеет фиксированное положение, вся остальная область экрана (панели &quot;Перепорученные&quot; и &quot;Результат работы:&quot;) прокручиваема.</para>
<para>Результат работы может быть введен тем же способом, как и для работы без дочерних результатов (файл по форме в данном случае обрамлен панелью), а так же выбран из результатов дочерних работ.</para>
<para>Если пользователь в качестве результата выбирает результат дочерней работы, на сервер должен быть передан идентификатор результата дочерней работы.</para>
<para>Для этого пользователю необходимо на панели &quot;Перепорученные&quot; нажать на один из результатов, при этом выбранный результат отмечается в списке фоном, его данные копируются в поле &quot;Результат работы:&quot;, если до этого был выделен другой файл по форме, то выделение его в списке отменяется.</para>
<para>Если пользователь выбирает в качестве результата результат дочерней работы и вносит в него изменения, считается, что это новый результат и выделение ранее выбранного результата в списке отменяется.</para>
<para>Если пользователь нажимает на кнопку &quot;Назад&quot;, возвращается экран информации о работе в том же состоянии, что и до завершения работы.</para>
<para>Если пользователь нажимает на кнопку &quot;Готово&quot;:</para>
<itemizedlist>
<listitem>
<para>если пользователь вносил изменения в панели &quot;Результат работы:&quot;, то данные по форме должны сохраниться в отдельный файл в &quot;Прочих&quot;, имя такого файла должно быть составлено по формату &quot;%Название формы% - %Фамилия И.О. сохранившего%&quot;;</para>
</listitem>
<listitem>
<para>если пользователь ничего не изменял в выбранном из перепорученных файле по форме, то результатом данной работы необходимо считать тот выбранный файл по форме.</para>
</listitem>
</itemizedlist>
<para>Мобильный клиент при этом возвращает пользователя к экрану информации о работе, информация обновляется.</para>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_work_end_with_process">
<title>Завершение с действием (идентификатор операции PROCESS)</title>
<para>Пользователь нажимает на кнопку &quot;Ответить&quot; - открывается экран (<xref linkend="fig.workflow_podpisat_1"/>). Для каждого действия API будет возвращать следующую информацию:</para>
<itemizedlist>
<listitem>
<para>информация о наборе функциональных кнопок и для каждой из них: название, цвет, действие;</para>
</listitem>
<listitem>
<para>необходимо ли наличие поля для комментария;</para>
</listitem>
<listitem>
<para>обязателен ли ввод комментария.</para>
</listitem>
</itemizedlist>
<figure id="fig.workflow_podpisat_1">
<title>Экран утверждения</title>
<graphic fileref="resources/img/workflow/subscribe.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/subscribe.jpg" align="center"/>
</figure>
<para>Функциональные кнопки имеют фиксированное положение. Вся остальная область экрана прокручиваема.</para>
<para>Параметры завершения с действием.</para>
<informaltable frame="all">
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<thead>
<row>
<entry align="center">Параметр работы</entry>
<entry align="center">Описание</entry>
<entry align="center">Значение по умолчанию</entry>
</row>
</thead>
<tbody>
<row>
<entry>Добавить подпись</entry>
<entry>Переключатель; может быть недоступен в зависимости от настроек, полученных при загрузке приложения.</entry>
<entry>&quot;Выкл&quot;</entry>
</row>
<row>
<entry>Комментарий</entry>
<entry>
<para>Вводится комментарий, placeholder - &quot;Введите комментарий&quot;.</para>
</entry>
<entry>Поле пустое.</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Если пользователь нажимает на кнопку &quot;Назад&quot;, возвращается экран информации о работе в том же состоянии, что и до завершения работы.</para>
<para>Если пользователь нажимает на функциональную кнопку, и для данного действия обязателен ввод комментария, приложение должно отобразить сообщение &quot;Введите комментарий&quot; и не выполнять действие.</para>
<para>Пользователь нажимает на функциональную кнопку. В случае успешного сохранения открывается экран информации о работе, информация обновляется. В случае неуспешного - выдается сообщение об ошибке, пользователь остается на данном экране.</para>
<note>
<para>Метод API для получения информации о построении окна kz.arta.synergy.server.api.rest.works#getProcessFinishInfo. </para>
<para>Метод API для завершения процесса: kz.arta.synergy.server.api.rest.works#finishProcess</para>
</note>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_work_end_without_forms">
<title>Завершение выставлением прогресса (идентификатор операции PROGRESS)</title>
<para>При выставлении прогресса 100% либо нажатии на кнопку &quot;Завершить&quot; работе либо должен выставиться прогресс 100%, либо работа должна завершиться. В результате успешного выполнения происходит возврат к списку работ, в котором обновляется плашка данной работы. В случае неудачного выполнения пользователь остается на этом же экране.</para>
<note>
<para>Метод API для выставления прогресса</para>
<para>kz.arta.synergy.server.api.rest.works.WorkFlowService# setWorkProgress</para>
</note>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_work_information">
<title>Верхняя панель и панель с параметрами работы</title>
<para><emphasis role="bold">Верхняя панель</emphasis> содержит 3 (три) кнопки:</para>
<informaltable frame="all" id="table.workflow_top_panel_buttons">
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<colspec colname="c3"/>
<thead>
<row>
<entry align="center">Кнопка</entry>
<entry align="center">Название кнопки</entry>
<entry align="center">Действие кнопки</entry>
</row>
</thead>
<tbody>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/add_file.png"/>
</entry>
<entry>&quot;С устройства&quot;</entry>
<entry>добавляется файл с устройства системными средствами</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/add_photo.png"/>
</entry>
<entry>&quot;Сфотографировать&quot;</entry>
<entry>вызывается встроенный фотомодуль устройства</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/add_comment.png"/>
</entry>
<entry>&quot;Добавить комментарий&quot;</entry>
<entry>открывается системное окно ввода текста</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>В Sencha должна отсутствовать кнопка &quot;Сфотографировать&quot;, по нажатию на кнопку &quot;С устройства&quot; должно открываться меню с пунктами &quot;Снять фото&quot; (вызывается встроенный фотомодуль уствройства) и &quot;Выбрать имеющееся&quot; (вызывается диалог выбора файла с устройства).</para>
<note>
<para>Для Sencha, открытой в браузере ОС Android, исключая меню, должен сразу открываться встроенный фотомодуль уствройства.</para>
<para>Для Sencha, открытой в браузере ПК, исключая меню, должен открываться браузерный диалог выбора файла с компьютера.</para>
</note>
<para>При добавлении файла вложения с камеры устройства приложение должно задавать имя файлу в следующем формате: &quot;Снимок dd MM yyyy HH:mm&quot;.</para>
<para><emphasis role="bold">Панель с параметрами работы.</emphasis></para>
<para>Ниже верхней панели располагается панель с параметрами работы. Панель не имеет фиксированной высоты, не прокручивается.</para>
<para>Параметры, которые отображаются на данной панели:</para>
<informaltable frame="all" id="table.workflow_parameters_info_2">
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<colspec colname="c3"/>
<thead>
<row>
<entry align="center">Параметры работы</entry>
<entry align="center">Описание</entry>
<entry align="center">Поле API</entry>
</row>
</thead>
<tbody>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">Всегда:</emphasis>
</entry>
</row>
<row>
<entry>&apos;Формулировка_работы&apos;</entry>
<entry>полное название работы</entry>
<entry>name</entry>
</row>
<row>
<entry>&quot;Поставил: Фамилия И.О.&quot;</entry>
<entry>автор работы</entry>
<entry>author</entry>
</row>
<row>
<entry>&quot;Ответственный: Фамилия И.О.&quot;</entry>
<entry>исполнитель работы</entry>
<entry>user</entry>
</row>
<row>
<entry namest="c1" nameend="c3">
<emphasis role="italic">Дополнительно:</emphasis>
</entry>
</row>
<row>
<entry>&quot;ДД месяц ГГГГ - ДД месяц ГГГГ&quot;</entry>
<entry>сроки исполнения для незавершенной работы</entry>
<entry>start_date, finish_date</entry>
</row>
<row>
<entry>&apos;Значение_прогресса&apos;</entry>
<entry>показывает текущий прогресс работы</entry>
<entry>См. таблицу &quot;Идентификаторы для обозначения прогресса&quot; в <xref linkend="sec.workflow_works"/> (столбец &quot;Полное значение&quot;).</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<figure id="fig.workflow_workinfo_1">
<title>Параметры работы с прогрессом и назначенной формой завершения</title>
<graphic fileref="resources/img/workflow/work_view1.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/work_view1.jpg" align="center"/>
</figure>
<figure id="fig.workflow_workinfo_2">
<title>Параметры работы с действием</title>
<graphic fileref="resources/img/workflow/work_view2.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/work_view2.jpg" align="center"/>
</figure>
<figure id="fig.workflow_workinfo_6">
<title>Параметры работы по процессу резолюции</title>
<graphic fileref="resources/img/workflow/work_view6.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/work_view6_ios.png" align="center"/>
</figure>
<para><emphasis role="italic">Значение прогресса - слайдер.</emphasis></para>
<para>Слайдер доступен, если у пользователя есть право на изменение значение прогресса (can_change_progress), иначе - недоступен.</para>
<para>Для доступного слайдера пользователь передвигает ползунок. При этом подпись прогресса под слайдером меняет свое значение на всем протяжении времени, пока пользователь не отпустит ползунок. Если конечное значение прогресса не равно начальному, то после того, как пользователь отпустит ползунок, приложение запрашивает подверждение выполнения действия с сообщением &quot;Вы действительно хотите изменить значение прогресса?&quot;
Если пользователь подтверждает изменение прогресса, отправляется запрос на сервер для изменения, иначе - значение слайдера устанавливается в исходное. В случае успешного
выполнения информация о работе обновляется, иначе - отображается сообщение об ошибке.</para>
<note>
<para>Метод API для изменения прогресса работы:</para>
<para>kz.arta.synergy.server.api.rest.works.WorkFlowService#setWorkProgress</para>
<para>Метод для добавления вложения:</para>
<para>kz.arta.synergy.server.api.rest.works.WorkFlowService#createAttachment (параметр path должен отсутсвовать)</para>
<para>Метод для добавления комментария:</para>
<para>kz.arta.synergy.server.api.rest.works.WorkFlowService#addComment</para>
</note>
<para><emphasis role="bold">Панель формы завершения.</emphasis></para>
<para>Ниже панели с параметрами работы, при наличии у работы формы завершения, располагается панель формы завершения.</para>
<para>Для завершенной работы на вкладке отображается надпись &quot;Результат завершения&quot; и ниже непосредственно результат работы. Результат работы &quot;файл&quot; и &quot;форма&quot; можно просмотреть системными средствами, нажав по нему. Для &quot;формы&quot; должна скачиваться pdf-версия формы. Никаких других действий в данной панели быть не должно.</para>
<para>Наличие формы завершения у работы определяется полем <emphasis role="bold">completionFormID</emphasis>, если его нет или значение является пустой строкой, значит форма завершения не задана. </para>
<para>Наличие результата завершения работы определяется полем <emphasis role="bold">completionResultID</emphasis>, если его нет или значение является пустой строкой, значит результат завершения не задан.</para>
<para>Если форма завершения задана, но результат отсутствует необходимо отображать название формы завершения &quot;Форма завершения - &apos;Значение_формы&apos;&quot; (<xref linkend="fig.workflow_workinfo_1"/>), название можно взять по идентификатору <emphasis role="bold">completionFormID</emphasis> из значений справочника, полученных при загрузке приложения.</para>
<para>Если результат завершения работы задан, его необходимо запросить с сервера.</para>
<para>Способ отображения результата работы зависит от типа:</para>
<itemizedlist>
<listitem>
<para>если результат формы - файл (поле <emphasis role="bold">type</emphasis> = file), тогда результат должен отображаться в виде пиктограммы и названия файла (<xref linkend="fig.workflow_workinfo_4"/>);</para>
</listitem>
<listitem>
<para>если результат формы - комментарий (поле <emphasis role="bold">type</emphasis> = comment), тогда результат должен отображаться в виде строки (<xref linkend="fig.workflow_workinfo_3"/>);</para>
</listitem>
<listitem>
<para>если результат формы - форма (поле <emphasis role="bold">type</emphasis> = form), тогда результат должен отображаться в виде пиктограммы и названия файла по форме (<xref linkend="fig.workflow_workinfo_7"/>).</para>
</listitem>
</itemizedlist>
<note>
<para>Метод получения информации о результате завершения работы:</para>
<para>kz.arta.synergy.server.api.rest.works.WorkFlowService#getWorkCompletionResult</para>
</note>
<figure id="fig.workflow_workinfo_4">
<title>Параметры работы с формой завершения - файл</title>
<graphic fileref="resources/img/workflow/work_view4.png" align="center"/>
</figure>
<figure id="fig.workflow_workinfo_3">
<title>Параметры работы с формой завершения - комментарий</title>
<graphic fileref="resources/img/workflow/work_view3.png" align="center"/>
</figure>
<figure id="fig.workflow_workinfo_7">
<title>Параметры работы с формой завершения - форма</title>
<graphic fileref="resources/img/workflow/work_view7.png" align="center"/>
</figure>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_work_reassign">
<title>Перепоручение работы (идентификатор действия reassign)</title>
<para>Пользователь нажимает на соответствующую кнопку: открывается экран &quot;Отправить&quot;. Приложение запрашивает у сервера дополнительную информацию для отображения данного экрана (зависит от действия): название родительской работы; название и цвет кнопки; отображать или нет неподчиненных пользователей в компоненте выбора пользователя, значение по умолчанию для времени завершения (<xref linkend="fig.workflow_pereporuchenie"/>).</para>
<figure id="fig.workflow_pereporuchenie">
<title>Перепоручить работу</title>
<graphic fileref="resources/img/workflow/work_delegating.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/work_delegating.png" align="center"/>
</figure>
<para>Управляющая кнопка имеет фиксированное положение. Вся остальная область экрана прокручиваема (поля не имеют фиксированной высоты и растягиваются по последнему содержимому).</para>
<para>Параметры перепоручения работы.</para>
<informaltable frame="all">
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<thead>
<row>
<entry align="center">Параметр работы</entry>
<entry align="center">Описание</entry>
<entry align="center">Значение по умолчанию</entry>
</row>
</thead>
<tbody>
<row>
<entry>Название</entry>
<entry>
<para>Вводится полное название работы.</para>
</entry>
<entry>
<para>Название работы по умолчанию: <emphasis role="italic">%Название_перепоручаемой_работы% - </emphasis></para>
<para>Рlaceholder: &quot;Введите формулировку работы&quot;</para>
</entry>
</row>
<row>
<entry>Ответственный</entry>
<entry>Открывается экран &quot;Пользователи&quot; (<xref linkend="fig.workflow_user_chooser_1"/>), параметры: <itemizedlist>
<listitem>
<para>выбор одного пользователя;</para>
</listitem>
<listitem>
<para>если значение настройки &quot;разрешено ли передавать работы другим исполнителям&quot; = true, отображать всех пользователей, иначе - только подчиненных;</para>
</listitem>
<listitem>
<para>идентификатор действия: reassign.</para>
</listitem>
</itemizedlist>Поле должно автоматически очиститься и стать неактивным (независимо от его заполненности), если выключается флажок.</entry>
<entry>Флажок выключен, поле пустое и недоступное, placeholder - &quot;Выберите ответственного&quot;.</entry>
</row>
<row>
<entry>Исполнители</entry>
<entry>Открывается экран &quot;Пользователи&quot; (<xref linkend="fig.workflow_user_chooser_1"/>), параметры: <itemizedlist>
<listitem>
<para>множественный выбор пользователей;</para>
</listitem>
<listitem>
<para>если значение настройки &quot;разрешено ли добавлять соисполнителей к работам, не являющихся подчиненными&quot; = true, отображать всех пользователей, если false:</para>
<itemizedlist>
<listitem>
<para>для значения настройки &quot;ставить ли работы исполнителям от имени ответственного&quot; = true, отображать подчиненных ответственного (если таковой выбран);</para>
</listitem>
<listitem>
<para>иначе (для значения настройки &quot;ставить ли работы исполнителям от имени ответственного&quot; = false либо если не был выбран ответственный) - отображать подчиненных данного пользователя;</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>идентификатор действия: reassign.</para>
</listitem>
</itemizedlist>Поле должно автоматически очиститься, если сменили ответственного.</entry>
<entry>Поле пустое и доступное на редактирование, placeholder - &quot;Выберите исполнителей&quot;.</entry>
</row>
<row>
<entry>Время завершения</entry>
<entry>Открывается системное окно ввода даты / времени. </entry>
<entry>Значение запрашивается с сервера при открытии экрана.</entry>
</row>
<row>
<entry>Форма завершения</entry>
<entry>Открывается список из возможных значений (полученных при загрузке приложения) и значения &quot;Нет&quot;, значение &quot;Нет&quot; должно быть в списке первым. Если список форм завершения пуст, поле не должно быть отображено.</entry>
<entry>Форма завершения текущей работы. Если текущая форма завершения работы отсутствует в списке - &quot;Нет&quot;.</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Если пользователь нажимает на кнопку &quot;Назад&quot;, возвращается экран информации о работе в том же состоянии, что и до вызова данного экрана.</para>
<para>После ввода всех необходимых параметров работы пользователь нажимает на управляющую кнопку. Действие перепоручения выполняется при выполнении следующих условий:</para>
<itemizedlist>
<listitem>
<para>заполнена формулировка перепоручаемой работы;</para>
</listitem>
<listitem>
<para>для включенного флажка заполнено поле &quot;Ответственный&quot;, для выключенного - поле &quot;Исполнители&quot;.</para>
</listitem>
</itemizedlist>
<para>В случае успешного выполнения действия открывается экран со списком работ, список обновляется.</para>
<para>В случае неуспешного - выдается сообщение об ошибке, действие выполняться не должно, пользователь остается на экране перепоручения работы. Если не введены формулировка работы и/или ответственный (для включенного флажка) - ошибка &quot;Заполните все поля&quot;. Если для выключенного флажка не выбрано ни одного исполнителя - ошибка &quot;Работа не может быть создана: не указан ни ответственный, ни исполнители&quot;.</para>
<note>
<para>Метод API для перепоручения работы kz.arta.synergy.server.api.rest.works#startRoute</para>
<para>Метод API получения информации для формирования окна kz.arta.synergy.server.api.rest.works#getSendWorkInfo</para>
</note>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_work_result">
<title>Результат работы (идентификатор действия result)</title>
<!--Результат завершения - файл--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_work_result_file.xml" encoding="UTF-8"/>
<!--Результат завершения - комментарий--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_work_result_comment.xml" encoding="UTF-8"/>
<!--Результат завершения - форма--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_work_result_form.xml" encoding="UTF-8"/>
<!--Отклонение результата работы--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_work_result_rejection.xml" encoding="UTF-8"/>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_work_result_comment">
<title>Результат завершения - комментарий</title>
<para>Пользователь нажимает на кнопку &quot;Результат&quot; работы подчиненного - открывается экран &quot;Результат&quot; просмотра результата работы (<xref linkend="fig.workflow_result_work_comment"/>).</para>
<figure id="fig.workflow_result_work_comment">
<title>Результат единичной работы (комментарий)</title>
<graphic fileref="resources/img/workflow/view_result_comment.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/view_result_comment.jpg" align="center"/>
</figure>
<para>Управляющие кнопки имеют фиксированное положение. Вся остальная область экрана прокручиваема.</para>
<para>На экране отображается лейбл &quot;Результат работы:&quot; и комментарий подчиненного, недоступный на редактирование.</para>
<para>Если пользователь нажимает на кнопку &quot;Назад&quot;, возвращается экран информации о работе в том же состоянии, что и до нажатия на кнопку &quot;Результат&quot;. Если пользователь нажимает на кнопку &quot;Подтвердить&quot;, мобильный клиент возвращает пользователя к экрану информации о работе, информация обновляется.</para>
<para>Если же пользователь нажимает на кнопку &quot;Отклонить&quot;, то открывается экран отклонения результата (<xref linkend="sec.workflow_work_result_rejection"/>).</para>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_work_result_file">
<title>Результат завершения - файл</title>
<para>Пользователь нажимает на кнопку &quot;Результат&quot; работы подчиненного - открывается экран &quot;Результат&quot; просмотра результата работы (<xref linkend="fig.workflow_result_work_file"/>).</para>
<figure id="fig.workflow_result_work_file">
<title>Результат единичной работы (файл)</title>
<graphic fileref="resources/img/workflow/view_result_file.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/view_result_file.jpg" align="center"/>
</figure>
<para>Управляющие кнопки имеют фиксированное положение. Вся остальная область экрана прокручиваема.</para>
<para>На экране отображается лейбл &quot;Результат работы:&quot;, иконка и название файла, который можно посмотреть системными средствами, нажав по нему.</para>
<para>Если пользователь нажимает на кнопку &quot;Назад&quot;, возвращается экран информации о работе в том же состоянии, что и до нажатия на кнопку &quot;Результат&quot;. Если пользователь нажимает на кнопку &quot;Подтвердить&quot;, мобильный клиент возвращает пользователя к экрану информации о работе, информация обновляется.</para>
<para>Если же пользователь нажимает на кнопку &quot;Отклонить&quot;, то открывается экран отклонения результата (<xref linkend="sec.workflow_work_result_rejection"/>).</para>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_work_result_form">
<title>Результат завершения - форма</title>
<para>Пользователь нажимает на кнопку &quot;Результат&quot; работы подчиненного - открывается экран &quot;Результат&quot; просмотра результата работы (<xref linkend="fig.workflow_result_work_form"/>).</para>
<figure id="fig.workflow_result_work_form">
<title>Результат единичной работы (форма)</title>
<graphic fileref="resources/img/workflow/view_result_form.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/view_result_form_ios.png" align="center"/>
</figure>
<para>Управляющие кнопки имеют фиксированное положение. Вся остальная область экрана прокручиваема.</para>
<para>На экране отображается лейбл &quot;Результат работы:&quot;, иконка и название файла по форме, который можно посмотреть в самом приложении, нажав по нему.</para>
<para>Если пользователь нажимает на кнопку &quot;Назад&quot;, возвращается экран информации о работе в том же состоянии, что и до нажатия на кнопку &quot;Результат&quot;. Если пользователь нажимает на кнопку &quot;Подтвердить&quot;, мобильный клиент возвращает пользователя к экрану информации о работе, информация обновляется.</para>
<para>Если же пользователь нажимает на кнопку &quot;Отклонить&quot;, то открывается экран отклонения результата (<xref linkend="sec.workflow_work_result_rejection"/>).</para>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_work_result_rejection">
<title>Отклонение результата работы</title>
<para>Пользователь нажимает на кнопку &quot;Отклонить&quot; на экране подтверждения результата работы - открывается экран отклонения результата работы (<xref linkend="fig.workflow_result_work_otklonenie"/>).</para>
<figure id="fig.workflow_result_work_otklonenie">
<title>Отклонение результата работы</title>
<graphic fileref="resources/img/workflow/result_rejection.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/result_rejection.jpg" align="center"/>
</figure>
<para>Управляющая кнопка имеет фиксированное положение. Панель для ввода комментария прокручиваема.</para>
<para>Параметры отклонения результата работы.</para>
<informaltable frame="all">
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<thead>
<row>
<entry align="center">Параметр работы</entry>
<entry align="center">Описание</entry>
<entry align="center">Значение по умолчанию</entry>
</row>
</thead>
<tbody>
<row>
<entry>Изменить срок</entry>
<entry>Открывается системное окно ввода даты / времени. </entry>
<entry>Значение запрашивается с сервера при открытии экрана.</entry>
</row>
<row>
<entry>Изменить прогресс</entry>
<entry>
<para>Обязательно изменяется значение слайдера в меньшую сторону.</para>
</entry>
<entry>100%.</entry>
</row>
<row>
<entry>Причина отклонения</entry>
<entry>Вводится комментарий отклонения.</entry>
<entry>Поле пустое.</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Если пользователь нажимает на кнопку &quot;Назад&quot;, возвращается экран подтверждения результата работы (<xref linkend="fig.workflow_result_work_file"/> либо <xref linkend="fig.workflow_result_work_comment"/>).</para>
<para>Если пользователь нажимает на кнопку &quot;Отклонить&quot;, при этом не изменено значение прогресса в меньшую сторону, приложение должно отобразить сообщение &quot;При отклонении результата работы должен быть выбран прогресс меньше 100%&quot; и не выполнять действие.</para>
<para>Если пользователь нажимает на кнопку &quot;Отклонить&quot;, в случае успешного завершения - возвращает пользователя к списку работ, список обновляется, иначе - отображает сообщение об ошибке.</para>
<note>
<para>Метод API для подтверждения результата: kz.arta.synergy.server.api.rest.works#acceptWorkResult, метод API для отклонения результата kz.arta.synergy.server.api.rest.works#rejectWorkResult</para>
</note>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_work_send">
<title>Отправка работы (идентификатор действия send)</title>
<para>Пользователь нажимает на соответствующую кнопку: открывается экран &quot;Отправить&quot;. Приложение запрашивает у сервера дополнительную информацию для отображения данного экрана (зависит от действия): название родительской работы; название и цвет кнопки; отображать или нет неподчиненных пользователей в компоненте выбора пользователя, значение по умолчанию для времени завершения (<xref linkend="fig.workflow_soglasovanie"/>).</para>
<figure id="fig.workflow_soglasovanie">
<title>Отправить на согласование</title>
<graphic fileref="resources/img/workflow/work_matching.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/work_matching_ios.png" align="center"/>
</figure>
<para>Управляющая кнопка имеет фиксированное положение. Вся остальная область экрана прокручиваема (поля не имеют фиксированной высоты и растягиваются по последнему содержимому).</para>
<para>Параметры отправки работы.</para>
<informaltable frame="all">
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<thead>
<row>
<entry align="center">Параметр работы</entry>
<entry align="center">Описание</entry>
<entry align="center">Значение по умолчанию</entry>
</row>
</thead>
<tbody>
<row>
<entry>Название</entry>
<entry>
<para>Вводится полное название работы.</para>
</entry>
<entry>
<para>Название работы по умолчанию (в зависимости от типа действия):</para>
<itemizedlist>
<listitem>
<para><emphasis role="italic">%Название_отправляемой_работы% - Согласовать</emphasis></para>
</listitem>
<listitem>
<para><emphasis role="italic">%Название_отправляемой_работы% - Утвердить</emphasis></para>
</listitem>
<listitem>
<para><emphasis role="italic">%Название_отправляемой_работы% - На ознакомление</emphasis></para>
</listitem>
</itemizedlist>
<para>Рlaceholder: &quot;Введите формулировку работы&quot;</para>
</entry>
</row>
<row>
<entry>Кому</entry>
<entry>Открывается экран &quot;Пользователи&quot; (<xref linkend="fig.workflow_user_chooser_1"/>), параметры: <itemizedlist>
<listitem>
<para>множественный выбор пользователей;</para>
</listitem>
<listitem>
<para>отображать всех пользователей;</para>
</listitem>
<listitem>
<para>идентификатор действия: send.</para>
</listitem>
</itemizedlist></entry>
<entry>Поле пустое, placeholder - &quot;Выберите исполнителей&quot;, активно.</entry>
</row>
<row>
<entry>Время завершения</entry>
<entry>Открывается системное окно ввода даты / времени. </entry>
<entry>Значение запрашивается с сервера при открытии экрана.</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Если пользователь нажимает на кнопку &quot;Назад&quot;, возвращается экран информации о работе в том же состоянии, что и до вызова данного экрана.</para>
<para>После ввода всех необходимых параметров работы пользователь нажимает на управляющую кнопку. Действие отправки выполняется при выполнении следующих условий:</para>
<itemizedlist>
<listitem>
<para>заполнена формулировка отправляемой работы;</para>
</listitem>
<listitem>
<para>заполнено поле &quot;Кому&quot;.</para>
</listitem>
</itemizedlist>
<para>В случае успешного выполнения действия открывается экран со списком работ, список обновляется.</para>
<para>В случае неуспешного - выдается сообщение об ошибке, действие выполняться не должно, пользователь остается на экране отправки работы. Если не введены формулировка работы и/или ответственный - ошибка &quot;Заполните все поля&quot;.</para>
<note>
<para>Метод API для отправки работы kz.arta.synergy.server.api.rest.works#startRoute</para>
<para>Метод API получения информации для формирования окна kz.arta.synergy.server.api.rest.works#getSendWorkInfo</para>
</note>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_work_transmit">
<title>Передача работы (идентификатор действия transmit)</title>
<para>Пользователь нажимает на соответствующую кнопку: открывается экран &quot;Отправить&quot;. Приложение запрашивает у сервера дополнительную информацию для отображения данного экрана (зависит от действия): название родительской работы; название и цвет кнопки; отображать или нет неподчиненных пользователей в компоненте выбора пользователя, значение по умолчанию для времени завершения (<xref linkend="fig.workflow_peredacha"/>).</para>
<figure id="fig.workflow_peredacha">
<title>Передать работу</title>
<graphic fileref="resources/img/workflow/work_passing.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/Work_passing.jpg" align="center"/>
</figure>
<para>Управляющая кнопка имеет фиксированное положение. Вся остальная область экрана прокручиваема (поля не имеют фиксированной высоты и растягиваются по последнему содержимому).</para>
<para>Параметры передачи работы.</para>
<informaltable frame="all">
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<thead>
<row>
<entry align="center">Параметр работы</entry>
<entry align="center">Описание</entry>
<entry align="center">Значение по умолчанию</entry>
</row>
</thead>
<tbody>
<row>
<entry>Название</entry>
<entry>
<para>Вводится полное название работы.</para>
</entry>
<entry>
<para>Название работы по умолчанию: <emphasis role="italic">Прошу Вас взять на исполнение работу &quot;%Название_исходной_работы%&quot;</emphasis></para>
<para>Рlaceholder: &quot;Введите формулировку работы&quot;</para>
</entry>
</row>
<row>
<entry>Кому</entry>
<entry>Открывается экран &quot;Пользователи&quot; (<xref linkend="fig.workflow_user_chooser_1"/>), параметры: <itemizedlist>
<listitem>
<para>выбор одного пользователя;</para>
</listitem>
<listitem>
<para>отображать всех пользователей;</para>
</listitem>
<listitem>
<para>идентификатор действия: transmit.</para>
</listitem>
</itemizedlist></entry>
<entry>Поле пустое, placeholder - &quot;Выберите ответственного&quot;, активно.</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Если пользователь нажимает на кнопку &quot;Назад&quot;, возвращается экран информации о работе в том же состоянии, что и до вызова данного экрана.</para>
<para>После ввода всех необходимых параметров работы пользователь нажимает на управляющую кнопку. Действие передачи выполняется при выполнении следующих условий:</para>
<itemizedlist>
<listitem>
<para>заполнена формулировка передаваемой работы;</para>
</listitem>
<listitem>
<para>заполнено поле &quot;Кому&quot;.</para>
</listitem>
</itemizedlist>
<para>В случае успешного выполнения действия открывается экран со списком работ, список обновляется.</para>
<para>В случае неуспешного - выдается сообщение об ошибке, действие выполняться не должно, пользователь остается на экране передачи работы. Если не введены формулировка работы и/или ответственный - ошибка &quot;Заполните все поля&quot;.</para>
<note>
<para>Метод API для передачи работы kz.arta.synergy.server.api.rest.works#transferWork</para>
<para>Метод API получения информации для формирования окна kz.arta.synergy.server.api.rest.works#getSendWorkInfo</para>
</note>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_workinfo">
<title>Информация о работе</title>
<para>По нажатию на плашку работы открывается экран информации о работе.</para>
<!--Панель с параметрами работы--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_work_information.xml" encoding="UTF-8"/>
<!--Комментарии работы--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_comments.xml" encoding="UTF-8"/>
<!--Вложения работы--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_attachments.xml" encoding="UTF-8"/>
<!--Действия с работой--> <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="workflow_work_actions.xml" encoding="UTF-8"/>
</section>
<?xml version='1.0' encoding='UTF-8'?>
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<section id="sec.workflow_works">
<title>Список работ</title>
<para>Экран со списком работ представлен на <xref linkend="fig.workflow_main"/> и <xref linkend="fig.workflow_main_2"/>.</para>
<figure id="fig.workflow_main">
<title>Список работ для смартфона</title>
<graphic fileref="resources/img/workflow/main.png" align="center"/>
</figure>
<figure id="fig.workflow_main_2">
<title>Список работ для планшета</title>
<graphic fileref="resources/img/workflow/iOS/ipad.png" align="center"/>
</figure>
<para><emphasis role="bold">Элементы управления экрана со списком работ.</emphasis></para>
<informaltable frame="all" id="table.workflow_work_spisok">
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<colspec colname="c3"/>
<thead>
<row>
<entry align="center">Элемент управления</entry>
<entry align="center">Расположение на экране</entry>
<entry align="center">Описание</entry>
</row>
</thead>
<tbody>
<row>
<entry namest="c1" nameend="c3" align="center">
<emphasis role="italic">Верхняя панель</emphasis>
</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/button_filters.png"/>
</entry>
<entry>Слева</entry>
<entry>&quot;Фильтры&quot; - кнопка перехода к фильтрам (<xref linkend="sec.workflow_filters"/>)</entry>
</row>
<row>
<entry align="center">&quot;Работы&quot;</entry>
<entry>По центру</entry>
<entry>Выпадающий список для переключения между модулями</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/button_work_create.png"/>
</entry>
<entry>Справа</entry>
<entry>&quot;Создать&quot; - кнопка создания работы (<xref linkend="sec.workflow_work_create"/>) или документа (<xref linkend="sec.workflow_document_create"/>)</entry>
</row>
<row>
<entry namest="c1" nameend="c3" align="center">
<emphasis role="italic">Рабочая область</emphasis>
</entry>
</row>
<row>
<entry align="center"/>
<entry>Вся рабочая область ниже верхней панели</entry>
<entry>Плашки, отображающие информацию о работе</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>По нажатию на &quot;Работы&quot; открывается выпадающий список с модулями (<xref linkend="fig.workflow_module_switch"/>):</para>
<itemizedlist>
<listitem>
<para>&quot;Работы&quot; - текущий модуль;</para>
</listitem>
<listitem>
<para>&quot;Документы&quot; - <xref linkend="chap.documents"/>.</para>
</listitem>
</itemizedlist>
<figure id="fig.workflow_module_switch">
<title>Переключение между модулями</title>
<graphic fileref="resources/img/workflow/main1.png" align="center"/>
</figure>
<para>До вызова выпадающего списка стрелка отображается указателем вниз, по вызову меняется указателем вверх (в Sencha данные указатели отображаются в виде текстовых стрелок &quot;&quot; и &quot;&quot;). По нажатию вне области выпадающего списка, а также по указателю и шапке списка, он скрывается. По нажатию на текущий модуль список обновляется, на другой модуль - открывается соответствующий модуль.</para>
<para>Работы в списке отображаются с постепенной догрузкой. Изначально подгружается такое количество работ, чтобы список был полностью заполнен и появился скролл (минимум 30). При прокрутке пользователем вниз и достижении конца списка, список работ дополняется (количество работ в новой &quot;порции&quot; должно быть равно количеству работ в первой &quot;порции&quot;).</para>
<para>При прокрутке пользователем в начале списка вверх (действие dropdown) список работ обновляется.</para>
<para>Список работ сортируется согласно условиям просматриваемого фильтра.</para>
<para>По нажатию на кнопку &quot;+&quot; вызывается меню (аналогичное, например, выбору формы завершения), в котором (<xref linkend="fig.workflow_work_create_menu"/>):</para>
<itemizedlist>
<listitem>
<para>первым пунктом идет &quot;Работа&quot; с иконкой <graphic fileref="resources/img/workflow/elements/icon_work.png"/>, по нажатию которого вызывается экран создания работы (<xref linkend="sec.workflow_work_create"/>);</para>
</listitem>
<listitem>
<para>далее идут</para>
<itemizedlist>
<listitem>
<para>группы первого уровня вложенности, содержащие избранные пункты, с иконкой <graphic fileref="resources/img/workflow/elements/icon_group.png"/>, по нажатию которых открывается экран со списком избранных пунктов создания документа (<xref linkend="fig.workflow_work_create_menu_other"/>);</para>
</listitem>
<listitem>
<para>избранные пункты создания документов первого уровня вложенности с иконкой <graphic fileref="resources/img/workflow/elements/icon_item.png"/>, по нажатию которых открывается экран создания документа (<xref linkend="sec.workflow_document_create"/>);</para>
</listitem>
</itemizedlist>
<note>
<para>Порядок следования групп и пунктов определяется API.</para>
</note>
</listitem>
<listitem>
<para>последним пунктом стоит &quot;Еще...&quot; (с иконкой группы), по нажатию которого вызывается экран со списком всех пунктов создания документов (<xref linkend="fig.workflow_work_create_menu_other_2"/>).</para>
</listitem>
</itemizedlist>
<figure id="fig.workflow_work_create_menu">
<title>Пункты меню &quot;Создать&quot;</title>
<graphic fileref="resources/img/workflow/work_create_menu.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/work_create_menu_ios.png" align="center"/>
</figure>
<para>Если список пунктов создания документов пуст, по нажатию кнопки &quot;+&quot;, исключая меню, должен сразу вызываться экран создания работы (<xref linkend="sec.workflow_work_create"/>).</para>
<para>По нажатию из меню на группу открывается экран со списком избранных пунктов создания документа (<xref linkend="fig.workflow_work_create_menu_other"/>).</para>
<figure id="fig.workflow_work_create_menu_other">
<title>Список избранных пунктов создания документов</title>
<graphic fileref="resources/img/workflow/work_create_favorites.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/work_create_favorites_ios.png" align="center"/>
</figure>
<para>Кнопка &quot;Отобразить все&quot; вверху экрана, панель со списком по центру и кнопка &quot;Выбрать&quot; внизу экрана имеют фиксированное положение, прокрутка списка скроллом осуществляется внутри панели. Внутри панели отображается все дерево избранных пунктов и групп, содержащих в себе хотя бы один избранный пункт. Каждая запись содержит полное название группы / пункта с соответстующими им иконками слева.</para>
<para>Если пользователь на экране со списком избранных пунктов создания документов нажимает на кнопку &quot;Назад&quot;, мобильный клиент возвращает экран со списком работ в том состоянии, которое было до вызова данного экрана.</para>
<para>По нажатию на кнопку &quot;Отобразить все&quot;, а также по выбору пункта меню &quot;Еще...&quot; открывается экран со списком всех пунктов создания документов (<xref linkend="fig.workflow_work_create_menu_other_2"/>).</para>
<figure id="fig.workflow_work_create_menu_other_2">
<title>Список всех пунктов создания документов</title>
<graphic fileref="resources/img/workflow/work_create_favorites_2.png" align="center"/>
<graphic fileref="resources/img/workflow/iOS/work_create_favorites_2_ios.png" align="center"/>
</figure>
<para>Поле с поиском вверху экрана, панель со списком всех пунктов создания документов по центру и кнопка &quot;Выбрать&quot; внизу экрана имеют фиксированное положение, прокрутка списка скроллом осуществляется внутри панели.</para>
<para>На данном экране есть возможность поиска пунктов по названиям. Для этого пользователь нажимает по полю поиска и вводит текст запроса. Вывод результатов поиска осуществляется Очистить поле ввода можно, нажав на крестик (крестик заменяется на иконку лупы). Пустой запрос поиска - отображается список со всеми возможными пунктами и группами.</para>
<para>Внутри панели отображается все дерево всех пунктов (как избранных, так и обычных) и групп. Каждая запись содержит полное название группы / пункта с соответстующими им иконками слева, а также свойство избранности справа от названия. По нажатию на &quot;звезду&quot; избранного пункта <graphic fileref="resources/img/workflow/elements/favorite.png"/> пункт становится &quot;обычным&quot; <graphic fileref="resources/img/workflow/elements/non_favorite.png"/>, и наоборот.</para>
<para>Если пользователь на экране со списком всех пунктов создания документов нажимает на кнопку &quot;Назад&quot;, мобильный клиент возвращает пользователя к предыдущему экрану, откуда был вызван данный экран:</para>
<itemizedlist>
<listitem>
<para>если по нажатию кнопки &quot;Отобразить все&quot; - то в экран со списком избранных пунктов создания документов (<xref linkend="fig.workflow_work_create_menu_other"/>);</para>
</listitem>
<listitem>
<para>если по нажатию на пункт меню &quot;Еще&quot; - то в экран со списком работ.</para>
</listitem>
</itemizedlist>
<para>В обоих экранах панель со списком групп и пунктов создания документа имеет следующие особенности:</para>
<itemizedlist>
<listitem>
<para>группы:
при выделении группы кнопка &quot;Выбрать&quot; становится неактивной,
с понижением уровня группы (вместе с иконкой) смещаются вправо;</para>
</listitem>
<listitem>
<para>пункты:
каждый пункт (вместе с иконкой) располагается правее группы самого нижнего уровня, в которой он находится.</para>
</listitem>
</itemizedlist>
<para>В обоих экранах после выделения пункта (действие tap) пользователь нажимает на кнопку &quot;Выбрать&quot;. Действие выполняется, только если выделен какой-либо пункт (не группа). В случае неуспешного выполнения действия выдается сообщение об ошибке, пользователь остается на экране. В случае же успешного выполнения действия открывается экран создания документа (<xref linkend="sec.workflow_document_create"/>).</para>
<para><emphasis role="bold">Плашка работы.</emphasis></para>
<para>Плашка работы - это компонент, отображающий информацию о работе (<xref linkend="fig.workflow_work_plashka"/>). Все плашки имеют одинаковый размер.</para>
<figure id="fig.workflow_work_plashka">
<title>Плашка работы на исполнении с прогрессом</title>
<graphic fileref="resources/img/workflow/elements/work_plashka.png" width="300" align="center"/>
</figure>
<para>Элементы плашки работы.</para>
<informaltable frame="all" id="table.workflow_work_plashka">
<tgroup cols="4">
<colspec colname="c1"/>
<colspec colname="c2"/>
<colspec colname="c3"/>
<thead>
<row>
<entry align="center">Элемент</entry>
<entry align="center">Расположение</entry>
<entry align="center">Описание</entry>
<entry align="center">Поле API</entry>
</row>
</thead>
<tbody>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/priority_green.png"/>
</entry>
<entry>В левом верхнем углу плашки</entry>
<entry>Приоритет работы</entry>
<entry>all_priorities</entry>
</row>
<row>
<entry align="center"><emphasis role="bold">Фамилия И.О.</emphasis> (полужирное выделение)</entry>
<entry>Вверху плашки, справа от приоритета</entry>
<entry>Автор работы (для работы, где авторизованный пользователь - исполнитель работы)</entry>
<entry>author</entry>
</row>
<row>
<entry align="center">Фамилия И.О (обычное выделение)</entry>
<entry>Вверху плашки, справа от приоритета</entry>
<entry>Исполнитель работы (для работы, где авторизованный пользователь - не исполнитель работы)</entry>
<entry>user</entry>
</row>
<row>
<entry align="center"><graphic fileref="resources/img/workflow/elements/plashka_terms.png"/><graphic fileref="resources/img/workflow/elements/plashka_terms_sub.png"/>2 дн</entry>
<entry>В правом верхнем углу плашки</entry>
<entry>Срок окончания работы</entry>
<entry>remained-label</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/progress_status_icon.png"/>
</entry>
<entry>Вверху плашки, слева от срока окончания работы</entry>
<entry>Иконка прогресс работы</entry>
<entry>work_state_icon; значением этого поля является идентификатор иконки</entry>
</row>
<row>
<entry align="center">15%</entry>
<entry>Вверху плашки, слева от срока окончания работы</entry>
<entry>Подпись прогресса завершения работы</entry>
<entry>work_state_label; значением этого поля является идентификатор значения</entry>
</row>
<row>
<entry align="center"/>
<entry>Вся основная область плашки</entry>
<entry>Формулировка работы</entry>
<entry>name</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/hook.png"/>
</entry>
<entry>В правом нижнем углу плашки</entry>
<entry>Наличие дочерних работ</entry>
<entry>has_subprocesses</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para><emphasis role="italic">Приоритет работы</emphasis> отображается в виде пиктограммы квадрата, залитого цветом &apos;color&apos; параметра &apos;all_priorities&apos;.</para>
<para><emphasis role="italic">Автор работы</emphasis> - пользователь, который поставил работу данному пользователю. Отображается в формате &quot;Фамилия И.О.&quot;</para>
<para><emphasis role="italic">Срок окончания работы</emphasis> отображается в виде пиктограммы календаря и подписи. API возвращает значение подписи согласно правилам, указанным в таблице. Если значение подписи приходит пустым, отображать его и пиктограмму на плашке не нужно.</para>
<informaltable frame="all" id="table.workflow_work_terms">
<tgroup cols="2">
<colspec colname="c1"/>
<colspec colname="c2"/>
<thead>
<row>
<entry align="center">Положительные сроки</entry>
<entry align="center">Отрицательные сроки</entry>
</row>
</thead>
<tbody>
<row>
<entry>&quot;ХХ мин&quot; - работы, до завершения которых осталось не более 60 минут</entry>
<entry>&quot;-ХХ мин&quot; - работы, которые просрочились не более, чем на 60 минут</entry>
</row>
<row>
<entry>&quot;ХХ ч&quot; - работы, до завершения которых осталось более 60 минут и менее одного рабочего дня</entry>
<entry>&quot;-ХХ ч&quot; - работы, которые просрочились более, чем на 60 минут, и менее, чем на 1 рабочий день</entry>
</row>
<row>
<entry>&quot;ХХ дн&quot; - работы, до завершения которых осталось более одного рабочего дня и менее одного месяца</entry>
<entry>&quot;-ХХ мин&quot; - работы, которые просрочились более, чем на 1 рабочий день, и менее, чем на 1 месяц</entry>
</row>
<row>
<entry>&quot;ХХ мес&quot; - работы, до завершения которых осталось более одного месяца и менее одного года</entry>
<entry>&quot;-ХХ мес&quot; - работы, которые просрочились более, чем на 1 месяц, и менее, чем на 1 год</entry>
</row>
<row>
<entry>&quot;ХХ г&quot; - работы, до завершения которых осталось более одного года</entry>
<entry>&quot;-ХХ г&quot; - работы, которые просрочились более, чем на 1 год</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<note>
<para>Все сроки, указанные в таблице измеряются в рабочих минутах / часах / днях / месяцах и годах.</para>
</note>
<para><emphasis role="italic">Прогресс работы</emphasis> отображается в виде пиктограммы и текстовой подписи. API возвращает идентификатор пиктограммы (work_state_icon) и идентификатор подписи (work_state_label). Конкретное значение подписи зависит от сочетания этих полей. Возможные значения перечислены в таблице. В случае, если API вернет комбинацию полей, отсутствующую в этой таблице, отображать прогресс на плашке не нужно.</para>
<informaltable frame="all" id="table.workflow_progress_icons">
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<thead>
<row>
<entry align="center">Иконка</entry>
<entry align="center">Описание</entry>
<entry align="center">Идентификатор иконки</entry>
</row>
</thead>
<tbody>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/progress_status_icon.png"/>
<graphic fileref="resources/img/workflow/elements/progress_sub_status_icon.png"/>
</entry>
<entry>цифровое значение прогресса (пиктограмма одинакова для всех значений процентов)</entry>
<entry>progress_status_icon</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/progress_result_icon.png"/>
<graphic fileref="resources/img/workflow/elements/progress_sub_result_icon.png"/>
</entry>
<entry>работа с формой завершения, которую необходимо подтвердить</entry>
<entry>progress_result_icon</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/progress_mfa_icon.png"/>
<graphic fileref="resources/img/workflow/elements/progress_sub_mfa_icon.png"/>
</entry>
<entry>работа на ознакомлении / согласовании / утверждении</entry>
<entry>progress_mfa_icon</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/progress_denied_icon.png"/>
<graphic fileref="resources/img/workflow/elements/progress_sub_denied_icon.png"/>
</entry>
<entry>работа, которую не согласовали / не утвердили</entry>
<entry>progress_denied_icon</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/progress_done_icon.png"/>
<graphic fileref="resources/img/workflow/elements/progress_sub_done_icon.png"/>
</entry>
<entry>завершенная работа</entry>
<entry>progress_done_icon, progress_resolution_done_icon</entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/progress_deleted_icon.png"/>
<graphic fileref="resources/img/workflow/elements/progress_sub_deleted_icon.png"/>
</entry>
<entry>удаленная работа</entry>
<entry>progress_deleted_icon </entry>
</row>
<row>
<entry align="center">
<graphic fileref="resources/img/workflow/elements/progress_resolution_icon.png"/>
<graphic fileref="resources/img/workflow/elements/progress_sub_resolution_icon.png"/>
</entry>
<entry>работа по процессу резолюции</entry>
<entry>progress_resolution_icon </entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Идентификаторы для обозначения прогресса:</para>
<informaltable frame="all" id="table.workflow_progress_label_1" title="Идентификаторы прогресса">
<tgroup cols="4">
<colspec colname="c1"/>
<colspec colname="cgen1"/>
<colspec colname="c2"/>
<colspec colname="c3"/>
<thead>
<row>
<entry align="center">Идентификатор подписи</entry>
<entry align="center">Идентификатор пиктограммы</entry>
<entry align="center">Сокращенное значение</entry>
<entry align="center" id="qwerty_1">Полное значение</entry>
</row>
</thead>
<tbody>
<row>
<entry>agreement</entry>
<entry>progress_mfa_icon</entry>
<entry>Согл</entry>
<entry>На согласовании</entry>
</row>
<row>
<entry>agreement</entry>
<entry>progress_done_icon</entry>
<entry>Согласовано</entry>
<entry>Согласовано</entry>
</row>
<row>
<entry>agreement</entry>
<entry>progress_denied_icon</entry>
<entry>Не согласовано</entry>
<entry>Не согласовано</entry>
</row>
<row>
<entry>agreement</entry>
<entry>progress_deleted_icon</entry>
<entry>Удалено</entry>
<entry>Удалено</entry>
</row>
<row>
<entry>approval</entry>
<entry>progress_mfa_icon</entry>
<entry>Утв</entry>
<entry>На утверждении</entry>
</row>
<row>
<entry>approval</entry>
<entry>progress_done_icon</entry>
<entry>Утверждено</entry>
<entry>Утверждено</entry>
</row>
<row>
<entry>approval</entry>
<entry>progress_denied_icon</entry>
<entry>Не утверждено</entry>
<entry>Не утверждено</entry>
</row>
<row>
<entry>approval</entry>
<entry>progress_deleted_icon</entry>
<entry>Удалено</entry>
<entry>Удалено</entry>
</row>
<row>
<entry>acquaintance</entry>
<entry>progress_mfa_icon</entry>
<entry>Озн</entry>
<entry>На ознакомлении</entry>
</row>
<row>
<entry>acquaintance</entry>
<entry>progress_deleted_icon</entry>
<entry>Удалено</entry>
<entry>Удалено</entry>
</row>
<row>
<entry>acquaintance</entry>
<entry>progress_done_icon</entry>
<entry>Ознакомлен</entry>
<entry>Ознакомлен</entry>
</row>
<row>
<entry>registration</entry>
<entry>progress_mfa_icon</entry>
<entry>Рег</entry>
<entry>На регистрации</entry>
</row>
<row>
<entry>registration</entry>
<entry>progress_deleted_icon</entry>
<entry>Удалено</entry>
<entry>Удалено</entry>
</row>
<row>
<entry>registration</entry>
<entry>progress_done_icon</entry>
<entry>Зарегистрировано</entry>
<entry>Зарегистрировано</entry>
</row>
<row>
<entry>registration</entry>
<entry>progress_denied_icon</entry>
<entry>Не зарегистрировано</entry>
<entry>Не зарегистрировано</entry>
</row>
<row>
<entry>result</entry>
<entry>progress_result_icon</entry>
<entry>Результат</entry>
<entry>100%</entry>
</row>
<row>
<entry>progress</entry>
<entry>progress_status_icon</entry>
<entry>Прогресс_работы + %</entry>
<entry>Слайдер со значением прогресса</entry>
</row>
<row>
<entry>progress</entry>
<entry>progress_deleted_icon</entry>
<entry>Удалено</entry>
<entry>Удалено</entry>
</row>
<row>
<entry>progress</entry>
<entry>progress_done_icon</entry>
<entry>Завершено</entry>
<entry>Завершено</entry>
</row>
<row>
<entry>resolution_action</entry>
<entry>progress_resolution_icon</entry>
<entry>Рассм</entry>
<entry>На рассмотрении</entry>
</row>
<row>
<entry>resolution_action</entry>
<entry>progress_resolution_done_icon</entry>
<entry>Резолюция</entry>
<entry>Резолюция принята</entry>
</row>
<row>
<entry>resolution_action</entry>
<entry>progress_done_icon</entry>
<entry>Завершено</entry>
<entry>Завершено</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para><emphasis role="italic">Формулировка работы</emphasis> отображается максимум на 3 (три) строки. Если название работы полностью не помещается на плашке, с правого края третьей строки оно должно быть затемнено градиентом из прозрачного в цвет фона.</para>
<para>Цвет текста, выделение работы зависит от времени оставшегося до завершения работы:</para>
<informaltable frame="all" id="table.workflow_work_processes">
<tgroup cols="3">
<colspec colname="c1"/>
<colspec colname="c2"/>
<colspec colname="c3"/>
<thead>
<row>
<entry align="center">Работа</entry>
<entry align="center">Поле API</entry>
<entry align="center">Цвет текста</entry>
</row>
</thead>
<tbody>
<row>
<entry>просроченная</entry>
<entry>is_expired</entry>
<entry class="background-color=red">#be3d3d</entry>
</row>
<row>
<entry>скоро истекает срок</entry>
<entry>is_soon_expired</entry>
<entry>#a57020</entry>
</row>
<row>
<entry>иначе</entry>
<entry/>
<entry>#487cc2</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>Если по данной работе имеются непросмотренные уведомления (поле is_new=true), работа должна быть выделена полужирным, в качестве пиктограммы календаря, прогресса должна быть отображена соответствующая &quot;жирная&quot; пиктограмма.</para>
<para>Жирное выделение работы снимется тогда, когда пользователь просмотрит информацию о ней.</para>
<para><emphasis role="italic">Примеры плашек работы.</emphasis></para>
<figure id="fig.workflow_plashka_na_soglasovanii">
<title>Работа на согласовании</title>
<graphic fileref="resources/img/workflow/elements/work_plashka_na_soglasovanii.png" width="300" align="center"/>
</figure>
<figure id="fig.workflow_plashka_ne_soglasovano">
<title>Несогласованная работа</title>
<graphic fileref="resources/img/workflow/elements/work_plashka_ne_soglasovano.png" width="300" align="center"/>
</figure>
<figure id="fig.workflow_plashka_approved_and_new_and_subsidiary">
<title>Утвержденная работа; работа, имеющая дочерние работы; работа с непросмотренными изменениями</title>
<graphic fileref="resources/img/workflow/elements/work_plashka_approved_and_new_and_subsidiary.png" width="300" align="center"/>
</figure>
<figure id="fig.workflow_plashka_result">
<title>Работа с результатом</title>
<graphic fileref="resources/img/workflow/elements/work_plashka_result.png" width="300" align="center"/>
</figure>
<figure id="fig.workflow_plashka_deleted">
<title>Удаленная работа</title>
<graphic fileref="resources/img/workflow/elements/work_plashka_deleted.png" width="300" align="center"/>
</figure>
<figure id="fig.workflow_plashka_done_progress">
<title>Завершенная работа с прогрессом</title>
<graphic fileref="resources/img/workflow/elements/work_plashka_done_progress.png" width="300" align="center"/>
</figure>
<figure id="fig.workflow_plashka_resolution">
<title>Работа по процессу резолюции</title>
<graphic fileref="resources/img/workflow/elements/work_plashka_resolution.png" width="300" align="center"/>
</figure>
<figure id="fig.workflow_plashka_resolution_1">
<title>Работа по процессу резолюции с принятой резолюцией</title>
<graphic fileref="resources/img/workflow/elements/work_plashka_resolution_1.png" width="300" align="center"/>
</figure>
<figure id="fig.workflow_plashka_resolution_2">
<title>Завершенная без принятия резолюции работа по процессу резолюции</title>
<graphic fileref="resources/img/workflow/elements/work_plashka_resolution_2.png" width="300" align="center"/>
</figure>
<para><emphasis wordsize="" role="bold">Возможные действия с плашкой работы:</emphasis></para>
<orderedlist>
<listitem>
<para>При выделении плашки (tap) открывается экран с информацией о работе (не зависимо от прав пользователя).</para>
</listitem>
<listitem>
<para>В результате долгого нажатия по плашке возможно появление меню для осуществления дополнительных действий с работой. Набор пунктов меню зависит от прав пользователя на работу. Если нет прав для совершения ни одного действия - меню не отображается. Возможные пункты меню:</para>
<orderedlist>
<listitem>
<para>пункт меню &quot;Изменить&quot; (поле can_edit);</para>
</listitem>
<listitem>
<para>пункт меню &quot;Удалить&quot; (поле can_delete).</para>
</listitem>
</orderedlist>
</listitem>
</orderedlist>
<para><emphasis role="bold">Переходы на другие экраны.</emphasis></para>
<para>Чтобы перейти к дочерним работам, пользователь проводит пальцем от правой стороны плашки к левой (<xref linkend="sec.workflow_subsidiary_works"/>).</para>
<para>По нажатию на кнопку &quot;Фильтры&quot;, а также проведя пальцем от левой стороны экрана к правой, раскрывается левая панель навигатора фильтров работ (<xref linkend="sec.workflow_filters"/>).</para>
<para>По нажатию на кнопку &quot;Создать&quot; открывается выпадающий список с пунктами, по нажатию которого открывается экран создания работы (<xref linkend="sec.workflow_work_create"/>) либо документа (<xref linkend="sec.document_creation"/>).</para>
<para>По нажатию на плашку работы открывается экран информации о работе (<xref linkend="sec.workflow_workinfo"/>).</para>
<para>Если у пользователя есть права на редактирование работы, в результате долгого нажатия по плашке работы
появляется меню, в котором присутствует пункт &quot;Изменить&quot; (<xref linkend="sec.workflow_work_create"/>).</para>
<para>Если у пользователя есть права на удаление работы, в результате долгого нажатия по плашке работы
появляется меню, в котором присутствует пункт &quot;Удалить&quot; (<xref linkend="sec.workflow_work_delete"/>).</para>
<para>По нажатию на кнопку &quot;Назад&quot;:</para>
<itemizedlist>
<listitem>
<para>для переключателя &quot;Запомнить меня&quot; со значением &quot;Выкл&quot; - открывается экран авторизации (<xref linkend="sec.autorise"/>);</para>
</listitem>
<listitem>
<para>для переключателя &quot;Запомнить меня&quot; со значением &quot;Вкл&quot; - происходит закрытие приложения (<xref linkend="sec.app_exit"/>).</para>
</listitem>
</itemizedlist>
<note>
<para>Метод получения списка работ описан в javadoc kz.arta.synergy.server.api.rest.works#getWorks.</para>
</note>
</section>
Уведомления {#sec.push_notifications}
===========
Мобильный клиент должен позволять принимать push-уведомления,
настроенные в основном клиентском приложении, для авторизованного
пользователя.
Условия для работы push-уведомлений:
- успешно авторизованный пользователь;
- в окне авторизации был включен переключатель "Запомнить меня".
Настройка push-уведомлений в мобильном клиенте не осуществляется.
Push-уведомления формируются согласно "Уведомлениям по работе",
настроенным пользователем в его настройках (илл. «Настройки уведомлений
по работам»).
![Настройки уведомлений по
работам](resources/img/push/notifications_settings.png)
Текст push-уведомлений не отличается от десктопных (приходящих
пользователю на почту). Форматирование текста игнорируется. В push'е
отображается только одна строка текста, невмещающийся текст должен
затемняться градиентом и уходить за пределы экрана.
При подключении к интернету пользователь, у которого настроена доставка
push-уведомлений, получит все эти последние push-уведомления, стоявшие
на сервере в очереди на отправку, всем списком. По нажатию на любое
push-уведомление должен открываться мобильный клиент, экран со списком
работ ([Список работ](#sec.workflow_works)) авторизованного
пользователя, остальные push-уведомления должны стереться.
Реестры {#chap.registries}
=========
<#include "registries/registries_list.md">
<#include "registries/registries_navigator.md">
#### Создание новой записи {#sec.registries_add}
Пользователь нажимает на кнопку "+" и выбирает пункт меню,
название которого определяется параметром `new_record`.
Приложение открывает [проигрыватель форм](#forms_view).
> **Примечание:**
> Метод создания новой записи реестра:
> kz.arta.synergy.api.rest.registry.RegistryService#createRegistryDocument
Нажатие на кнопку "Назад" возвращает пользователя
в список элементов реестра.
В результате успешного сохранения выдается сообщение
«Данные сохранены», новая запись сохраняется, и
выполняется проверка наличия у текущего реестра
маршрута активации. В случае, если он указан, то
выполняется его запуск.
> **Примечание:**
> Метод активации записи реестра (в случае отсутствия маршрута активации):
> kz.arta.synergy.api.rest.registry.RegistryService#activateRegistryDocument
> Метод запуска маршрута реестра (с активацией новой записи):
> kz.arta.synergy.api.rest.registry.RegistryService#startRoute
Если маршрут активации не указан, то открывается окно информации
о документе с единственной управляющей кнопкой запуска маршрута
[Запуск маршрута](#sec.documents_route_starting).
#### Удаление записи {#sec.registries_delete}
Пользователь нажимает на пункт меню "Удалить", приложение
запрашивает подтверждение выполнения действия с сообщением:
`Вы действительно хотите удалить запись?`
Если пользователь подтверждает удаление записи, то выполняется
проверка наличия у текущего реестра маршрута удаления.
В случае, если маршрут удаления указан, то выполняется
[Запуск маршрута](#sec.documents_route_starting).
Если маршрута удаления нет, то запись реестра удаляется.
Плашка записи реестра также удаляется из списка.
> **Примечание:**
> Метод удаления записи реестра (без запуска маршрута):
> kz.arta.synergy.api.rest.registry.RegistryService#deleteRegistryDocument
> Метод запуска маршрута реестра (с последующим удалением):
> kz.arta.synergy.api.rest.registry.RegistryService#startRoute
Список реестров {#sec.registries_list}
-------------------------------
Экран со списком реестров представлен на илл. «Список реестров».
![Список реестров](resources/img/registries/registries_group.png)
![Окно "Реестры" (вид по умолчанию)](resources/img/registries/registry_records.png)
**Элементы управления экрана со списком записей реестра.**
+--------------------------------------------------------------+------------------------+---------------------------------------------------------+
| Элемент управления | Расположение на экране | Описание |
+==============================================================+========================+=========================================================+
| *Верхняя панель* | | |
+--------------------------------------------------------------+------------------------+---------------------------------------------------------+
| ![](resources/img/workflow/elements/button_filters.png)/ | Слева | "Навигатор" - кнопка перехода к |
| | | [навигатору реестров](#sec.registries_navigator) |
+--------------------------------------------------------------+------------------------+---------------------------------------------------------+
| "Реестры" | По центру | Выпадающий список для переключения между модулями |
+--------------------------------------------------------------+------------------------+---------------------------------------------------------+
| ![](resources/img/forms/elements/button_options.png)/ | Справа | Системное меню - выпадающий список с пунктами: |
| | | |
| | | - "Полный", если отображаются краткие плашки записей |
| | | реестра, или "Краткий", если отображаются полные плашки;|
| | | |
| | | - [Сортировка](#sec.registries_sort); |
| | | |
| | | - [Поиск](#sec.registries_search) |
| | | |
| | | Элемент не отображается, если выбрана группа реестров |
+--------------------------------------------------------------+------------------------+---------------------------------------------------------+
| ![](resources/img/workflow/elements/button_work_create.png)/ | Левее кнопки "Меню" | "Создать" - кнопка |
| | | [добавления новой записи реестра](#sec.registries_add) |
| | | и [создания документа](#sec.workflow_document_create) |
| | | |
| | | Элемент не отображается, если выбрана группа реестров |
+--------------------------------------------------------------+------------------------+---------------------------------------------------------+
| *Компонент "Путь"* | Ниже верхней панели | Компонент, отображающий путь до выбранного реестра |
+--------------------------------------------------------------+------------------------+---------------------------------------------------------+
| *Рабочая область* | | |
+--------------------------------------------------------------+------------------------+---------------------------------------------------------+
| | Вся рабочая область | Плашки, отображающие информацию о записях выбранного |
| | ниже пути | реестра или реестрах, входящих в выбранную группу |
+--------------------------------------------------------------+------------------------+---------------------------------------------------------+
> **Примечание**
>
> Метод получения доступных реестров и прав пользователя на них:
> rest/api/registry/list
>
> Метод получения записей реестра:
> rest/api/registry/getRegistryData
По нажатию на "Реестры" на верхней панели не отображаются все
кнопки, под панелью открывается выпадающий список с модулями
(илл. «Переключение между модулями»):
* [Работы](#chap_workflow);
* [Файлы](#chap.files);
* [Документы](#chap.documents);
* [Реестры](#chap.registries).
![Переключение между модулями](resources/img/registries/registries_module.png)
До вызова выпадающего списка стрелка отображается указателем
вниз, по вызову меняется указателем вверх. По нажатию вне
области выпадающего списка, а также по указателю и шапке
списка, он скрывается. По нажатию на текущий модуль происходит
переход к списку реестров, на другой модуль - открывается
соответствующий модуль.
По свайпу вниз по основному экрану обновляется список в рабочей
области, по свайпу вниз по навигатору обновляется список доступных
реестров.
Компонент *"Путь"* содержит полный путь до выбранного элемента
навигатора. Содержимое компонента:
* для выбранной группы реестра - полные названия групп
реестров от корневой родительской до текущей открытой,
включая её саму;
* для выбранного реестра - полные названия групп реестров,
крайний элемент в списке - непосредственно реестр.
Каждый элемент пути, кроме крайнего, отделен от предыдущего
/ следующего символом
![](resources/img/files/elements/icon_breadcrumbs.png). Если
все элементы не помещаются на ширину экрана, только в данном
компоненте должен активироваться горизонтальный скролл, при
этом слева и справа невмещающиеся названия должны затемняться
градиентом из прозрачного в цвет фона.
Кроме того, каждый элемент пути является кликабельной ссылкой
на соответствующую группу реестров. Таким образом, навигация по
модулю реестров возможна тремя способами:
* переход в любую группу реестров / реестр, используя
навигатор;
* переход только в дочерние группы реестров / реестры из
общего списка групп реестров / реестров;
* переход в родительские группы реестров, используя компонент
"Путь".
*Список в основной области* содержит:
* для выбранной группы реестра - дочерние группы реестров и
реестры;
* для выбранного реестра - непосредственно записи реестра.
В первом случае группы реестров и реестры в списке отображаются
все сразу. При прокрутке пользователем в начале списка вверх
(действие dropdown) список обновляется.
Список записей же отображается с постепенной догрузкой.
Изначально подгружается 30 записей. При прокрутке пользователем
вниз список дополняется новыми 30 записями.
**Плашка реестра, записи реестра.**
Плашка записи реестра/ группы реестров - это компонент,
отображающий информацию об элементе реестра или название группы.
При выборе *группы реестров* отображаемый список содержит
сведения о реестрах и группах реестрах, входящих в выбранную
группу:
* для группы реестра отображается иконка группы
![](resources/img/registries/registries_group_icon.png) и
название группы (параметр `regGroupName`);
* для реестра отображается иконка реестра
![](resources/img/registries/registries_icon.png) и
название реестра (параметр `registryName`).
При выборе *реестра* отображаемый список содержит записи этого
реестра. Каждая запись содержит пиктограмму текущего статуса
записи реестра и ее данные.
*Пиктограммы статусов записи реестра:*
+--------------------------------------------------------------+------------------------+
| Пиктограмма | Статус |
+==============================================================+========================+
| пиктограмма отсутствует | Подготовка |
+--------------------------------------------------------------+------------------------+
| ![](resources/img/registries/registry_progress.png)/ | В процессе |
+--------------------------------------------------------------+------------------------+
| ![](resources/img/registries/registry_activated.png)/ | Активная |
+--------------------------------------------------------------+------------------------+
| ![](resources/img/registries/registry_denied.png)/ | Неуспешная |
+--------------------------------------------------------------+------------------------+
Данные записи реестра отображаются в следующем формате:
`%Название_столбца%: %значение%`
Количество данных в плашке зависит от того, какой
используется вид просмотра:
* Краткий (по умолчанию): плашка отображает только
те отображаемые столбцы, которые помечены как
значащее содержимое. При отображении краткого
списка пункт меню ![](resources/img/forms/elements/button_options.png)
принимает значение "Полный" для переключения в полный вид.
* Полный: плашка отображает все отображаемые столбцы.
При отображении краткого списка пункт меню
![](resources/img/forms/elements/button_options.png)
принимает значение "Краткий" для переключения в краткий вид.
> **Примечание**
>
> Если в реестре отсутствуют столбцы, помеченные как значащее
> содержимое, плашка всегда отображается в полном виде. При этом
> пункт "Краткий" не отображается в меню
> ![](resources/img/forms/elements/button_options.png).
Во всех случаях невмещающиеся по ширине названия и
значения переносятся на новую строку. При этом один
столбец должен занимать не более двух строк, иначе
текст обрезается с добавлением многоточие. Некоторые
значения столбцов могут отсутствовать, это не будет
являться ошибкой платформы или мобильного клиента.
![Окно "Реестры" (полные плашки)](resources/img/registries/registry_records_longlist.png)
При открытии экрана записи в списке сортируются
согласно преднастройкам реестра. Изменять данную
сортировку можно, выбрав соответствующий пункт меню.
**Возможные действия на экране.**
По нажатию на кнопку "Навигатор", а также проведя пальцем от
левой стороны экрана к правой, раскрывается левая панель
[навигатора по реестру](#sec.registries_navigator).
По нажатию на кнопку "+" вызывается меню «Создать» (аналогичное
в модуле «Работы»), в построении которого участвуют пункты
параметра `register_items`:
* `favorite_documents`;
* `all_documents`;
* `new_record`.
Функциональность пунктов `favorite_documents` и `all_documents`
аналогична описанной в разделе
["Создание работы / документов"](#sec.workflow_create_menu).
Если название пункта меню полностью не помещается на двух
строках, с правого края второй строки оно должно быть
затемнено градиентом из прозрачного в цвет фона. В меню
отсутствуют фиксированные элементы, при развороте группы
создания документа, оно должно пропорционально увеличиться
по вертикали. При этом если количество отображаемых пунктов
меню больше высоты экрана, появляется вертикальный скролл
на все меню, исключая «шапку» (т.е. скролл должен уходить
под «шапку»).
> **Примечание:**
>
> Метод получения настроек пунктов создания записей реестров
> описан в javadoc:
>
> kz.arta.synergy.server.api.rest.common.RegistryService#getRegisterItems
Каждая из групп пунктов должна быть отделена от следующей
видимым сплитом.
Если список создания записи / документов пуст, то кнопку «+»
отрисовывать не нужно. Если же меню содержит только один пункт,
то по нажатию кнопки «+», исключая его, должно выполняться
соответствующее действие и вызываться соответствующий экран.
При формировании списка элементов в меню "Создать" необходимо
учитывать, что если у авторизованного пользователя нет права на
создание записи в текущем реестре, то пункт `new_record` не должен
отображаться.
По нажатию на кнопку "Назад" происходит [закрытие приложения](#sec.app_exit).
> **Примечение:**
> Метод получения сведений о настроенных событиях реестра
описан в javadoc:
> kz.arta.synergy.server.api.rest.common.RegistryService#getRoute
*Возможные действия с плашкой группы реестров:*
1. При выделении папки (tap) обновляется список: в нем должны
отображаться реестры, входящие в данную группу.
>> **Примечание:**
>> Если в группу были добавлены новые реестры, то при обновлении списка
плашки этих реестров также должны быть отображены. Если же из группы
были удалены реестры, то при обновлении списка плашки этих реестров
должны быть удалены.
2. Обработка долгого нажатия отсутствует.
*Возможные действия с плашкой реестра:*
1. При выделении реестра (tap) открывается список записей реестра.
2. Обработка долгого нажатия отсутствует.
*Возможные действия с плашкой записи реестра*
1. При выделении записи реестра (tap) открывается
[проигрыватель форм](#forms_view) (при условии наличия у
авторизованного пользователя права "Просмотр данных" для
текущего реестра).
2. В результате долгого нажатия по плашке возможно появление
меню для осуществления дополнительных действий с записью. Набор
пунктов меню зависит от прав пользователя на текущий реестр.
Если нет прав для совершения ни одного действия - меню не
отображается. Возможные пункты меню:
- [Удалить](#sec.registries_delete)
<#include "registries/registries_add.md">
<#include "registries/registries_modify.md">
<#include "registries/registries_delete.md">
<#include "registries/registries_search.md">
#### Изменение записи {#sec.registries_modify}
Находясь в [проигрывателе форм](#forms_view), пользователь
нажимает на кнопку меню и выбирает пункт "Режим редактирования".
> **Примечание:**
> Отображение пункта "Режим редактирования" зависит от прав
авторизованного пользователя на текущий реестр и статуса записи
реестра:
> - «Изменение» - изменение записи со статусом «активная»;
> - «Редактирование» - изменение файлов по форме реестра (для
всех статусов, кроме "активная").
По нажатию на иконку «Сохранить» и при переключении между режимами
основного представления происходит валидация формы:
- для мобильного представления - на заполненность обязательных полей
(только среди отображаемых);
- для основного представления - на заполненность обязательных полей
и корректность заполнения других (определяется настройками компонентов).
В случае неуспешной валидации обязательности отображается общая ошибка
формы:
> `Заполните обязательные поля`
В иных случаях неуспешного сохранения выдается сообщение об ошибке,
пользователь остается на данном экране.
В случае же успешного сохранения (вне зависимости от того, по нажатию на
какую кнопку оно было выполнено) выдается сообщение «Данные сохранены»,
документ сохраняется, и происходит проверка наличия у текущего реестра
маршрута изменения. В случае, если он указан, то выполняется его запуск.
Если маршрут изменения не указан, то пользователь остается на текущем
экране.
Если текущая версия данных уже была сохранена, то кнопка «Сохранить»
должна быть недоступна для нажатия.
По нажатию на кнопку «Готово» происходит сохранение формы (если это
не было сделано). В случае успешного сохранения открывается список
элементов реестра.
Если после внесения изменений в форме пользователь нажимает на кнопку
«Назад», выдается системное предупреждающее диалоговое окно с текстом:
> `Документ был изменен. Сохранить произведенные изменения?`
и кнопками:
- «Да» - происходит сохранение формы и, при успешном сохранении, переход
к списку элементов реестра;
- «Нет» - последние изменения отменяются, открывается список элементов
реестра;
- «Отмена» - окно закрывается, пользователь остается в проигрывателе формы.
Если же изменений не было и пользователь нажимает на кнопку «Назад», сразу
происходит переход к списку элементов реестра.
> **Примечание:**
> Метод изменения записи реестра (без запуска маршрута):
> kz.arta.synergy.api.rest.registry.RegistryService#modifyRegistryDocument
> Метод запуска маршрута реестра (с изменением записи):
> kz.arta.synergy.api.rest.registry.RegistryService#startRoute
Нажатие на кнопку "Назад" возвращает пользователя в список элементов реестра.
Навигатор реестров {#sec.registries_navigator}
------------------
По нажатию на кнопку "Навигатор", а также проведя пальцем от левой
стороны экрана со списком реестров к правой, раскрывается левая
панель навигатора рестров (илл. «Навигатор реестров»).
![Навигатор реестров](resources/img/registries/navigator.png)
Верхняя панель содержит кнопку ["Настройки"](#sec.settings) и
надпись "Навигатор". Нижняя панель отображается только для
включенного флажка "Синхронизировать данные для оффлайн-работы" и
содержит кнопку синхронизации.
Кнопка синхронизации содержит иконку и один из вариантов подписи
к ней:
- "Синхронизация не производилась" - для варианта, когда на
устройстве отсутствуют данные синхронизации;
- "Идёт синхронизация" - для активного
[процесса синхронизации](#sec.offline);
- "Последняя синхронизация: ДД месяц ЧЧ:ММ" - во всех
остальных случаях (указывается дата и время последней
успешной синхронизации).
Навигатор содержит дерево реестров, доступных пользователю.
Для построения дерева используются параметры `regGroupName` и
`registryName`.
При каждом новом запуске приложения, а также после переключения
модулей все папки основного дерева, кроме личной («Мои документы»),
должны быть свернуты, а выделенной являться первая папка
навигатора. В остальных случаях развернутость дерева и последняя
выделенная папка должны сохранять свои значения.
Кроме того, ввиду возможности навигации по папкам также из списка
и компонента "Путь", при каждом открытии навигатора необходимо
учитывать текущую открытую папку и выделять её.
Если папка содержит вложенные папки, то в правой части
отображается иконка
![](resources/img/workflow/elements/filters_undetailed.png) для
свернутой папки и
![](resources/img/workflow/elements/filters_detailed.png) для
развернутой. По нажатию на квадратную область (кликабельная
область аналогична фильтрам в работах) вокруг иконки свернутой
папки он разворачивается, и наоборот. Одновременно может быть
раскрыто несколько деревьев папок.
> **Примечание**
>
> Сворачивание группы в навигаторе сопровождается одновременным
> обновлением списка реестров без автоматического перехода
> непосредственно к списку.
По нажатию на название группы реестров панель навигатора скрывается,
и пользователю отображается список реестров, входящих в выбранную
группу.
По нажатию на название реестра панель навигатора также скрывается,
и пользователю отображается список элементов выбранного реестра.
**Переходы на другие экраны.**
С панели навигатора можно перейти в
[настройки приложения](#sec.settings), нажав на кнопку
"Настройки" либо вернуться к [списку реестров](#sec.registries_list).
Левую панель можно скрыть тремя способами:
1. проведя пальцем от правой стороны экрана к левой;
2. нажав по любому месту правой стороны экрана (там, где
отображается часть экрана списка файлов);
3. нажав на кнопку "Назад" (для ОС Android).
> **Примечание**
>
> Метод получения доступных реестров, записей реестра:
> rest/api/registry/list
>
#### Поиск по реестру {#sec.registries_search}
При выборе пункта меню "Поиск" открывается окно поиска по реестру
(илл. "Окно поиска по реестру"):
![Окно поиска по реестру](resources/img/registries/search.png)
![Окно поиска по реестру](resources/img/registries/search_ios.png)
При переходе к экрану поиска отображается пустой запрос поиска.
Поле с поиском вверху и панель со списком по центру экрана имеют
фиксированное положение, прокрутка списка скроллом осуществляется
внутри панели. Внутри панели отображаются результаты поиска в виде
плашек записей реестра. Плашка должна быть аналогичной таковой в
списке записей реестра, в том числе сохраняется ранее указанный
размер плашек (краткий/полный).
Поиск записей осуществляется по всем записям реестра. Поиск является
"живым" и производится по всем полям плашки (за исключением тех полей,
по которым не осуществляется сортировка), его результаты фильтруют
отображаемый список. При вводе текста иконка лупы заменяется на иконку
крестика. Очистить поле ввода можно, нажав на крестик (крестик
заменяется на иконку лупы). Пустой запрос поиска - отображается
список со всеми записями.
Пример результатов поиска по запросу "038" приведен на рисунке
"Результаты поиска по реестру":
![Результаты поиска по реестру](resources/img/registries/search_results.png)
![Результаты поиска по реестру](resources/img/registries/search_results_ios.png)
*Возможные действия с плашкой записи реестра в окне поиска*
1. При выделении записи реестра (tap) открывается
[проигрыватель форм](#forms_view).
2. Обработка долгого нажатия отсутствует.
По нажатию на кнопку "Назад" открывается список записей текущего реестра.
### Окно сортировки записей реестра {#sec.registries_sort}
По нажатию на кнопку "Сортировка" открывается меню
`Сортировать по полю` (для ОС Android) либо `Сортировать`
(для iOS). Внешний вид меню - системный, с доработками.
В построении меню участвуют те столбцы реестра, которые
удовлетворяют следующим требованиям.
* Во-первых, в меню попадают только те столбцы,
по которым возможна сортировка, т.е. сюда не
должны входить столбцы на основе компонентов:
* Таблица (статическая, динамическая)
* Страница
* Неизменяемый текст
* Выбор вариантов
* Изображение
* Файл
* Лист подписей
* Ход выполнения
* Ссылка на документ
* Свойства документа
* Ссылка на файл в хранилище
Кроме того, компоненты внутри статической таблицы
сюда попадают, а внутри динамической - нет.
* Во-вторых, в меню попадают только те столбцы,
которые отображаются в плашке на момент открытия
окна. Т.е. для "краткого" вида - это только те
отображаемые столбцы, помеченные как значащее
содержимое, а для "полного" - уже все отображаемые
столбцы. В обоих случаях - с учетом пункта выше.
Пункты меню отсортированы в порядке следования
соответствующих столбцов в настройках реестра.
Если название пункта меню полностью не помещается на
строке, с правого края оно должно быть обрезано с
добавлением многоточие. Если количество отображаемых
пунктов меню больше высоты экрана, появляется
вертикальный скролл на все меню, исключая «шапку»
(т.е. список должен уходить под «шапку»).
*Для ОС Android.*
Окно разделено на заголовок, содержимое с пунктами и
нижними кнопками "Отмена" и "Принять". Пункты в данном
случае есть столбцы реестра (с учетом требований выше).
При открытии окна справа от пункта, по которому
отсортирован список записей в данный момент,
отображается иконка направления сортировки. При
первом открытии иконка отсутствует вовсе.
Поведение окна "Сортировать по полю":
* Для выбора пункта необходимо нажать на строку либо
иконку, справа отобразится иконка направления
сортировки:
* по убыванию (по умолчанию):
![](resources/img/forms/elements/sort_down.png)
* по возрастанию:
![](resources/img/forms/elements/sort_up.png)
* Повторное нажатие на строку меняет направление
сортировки на противоположное.
* При выделении пункта, выделение предыдущего пункта
снимается.
![Сортировка в ОС Android, начало списка](resources/img/forms/register_chooser_sort_1.png)
![Сортировка в ОС Android, середина списка](resources/img/forms/register_chooser_sort_2.png)
![Сортировка в ОС Android, конец списка](resources/img/forms/register_chooser_sort_3.png)
*Для iOS.*
Окно разделено на заголовок с кнопками "Отмена" и
"Принять", а также содержимое со столбцами реестра
(с учетом требований выше).
При открытии окна справа от пункта, по которому
отсортирован список записей в данный момент,
отображается иконка направления сортировки. При
первом открытии иконка отсутствует вовсе.
Поведение окна "Сортировать":
* Для выбора пункта необходимо нажать на строку либо
иконку, справа отобразится иконка направления
сортировки:
* по убыванию (по умолчанию):
![](resources/img/forms/elements/sort_down.png)
* по возрастанию:
![](resources/img/forms/elements/sort_up.png)
* Повторное нажатие на строку меняет направление
сортировки на противоположное.
* При выделении пункта, выделение предыдущего пункта
снимается.
![Сортировка в iОS](resources/img/forms/iOS/register_chooser_sort_ios.png)
*Для обеих ОС.*
После выбора пункта меню и направления сортировки
необходимо нажать на кнопку подтверждения действия
"Принять". Если выбор пункта отсутствует, то действие
должно быть аналогично "Отмене".
Для того, чтобы отменить действие и закрыть окно,
необходимо нажать на кнопку "Отмена" либо в пустой
области экрана, дополнительно для ОС Android - с
помощью кнопки "Назад".
Настройки приложения {#sec.settings}
=============================================================================
Настройки вызываются по нажатию на кнопку "Настройки" (илл.
«Экран настроек») внутри навигатора любого из модулей мобильного
клиента.
![Экран настроек](resources/img/settings/settings_android.png)
![Экран настроек](resources/img/settings/settings_ios.png)
> **Примечание**
>
> В планшетной версии мобильного клиента настройки должны
> открываться по центру экрана в том же размере, что и в
> версии для смартфонов. При этом пространство вне экрана
> настроек должно быть недоступно.
+--------------------------+------------------------+-------------------------------------------------------+
| Лейбл | Элемент | Значения |
+==========================+========================+=======================================================+
| *Общие* | | |
+--------------------------+------------------------+-------------------------------------------------------+
| Адрес сервера | лейбл | |
+--------------------------+------------------------+-------------------------------------------------------+
| Модуль по умолчанию | выбор вариантов | * Работы //по умолчанию |
| | | * Документы |
| | | * Файлы |
| | | * Реестры |
+--------------------------+------------------------+-------------------------------------------------------+
| Язык | выбор вариантов | * Казахский |
| | | * Русский //по умолчанию |
| | | * Английский |
+--------------------------+------------------------+-------------------------------------------------------+
| *Учетная запись* | | |
+--------------------------+------------------------+-------------------------------------------------------+
| Синхронизировать данные | флажок | * Включено |
| для автономной работы | | * Выключено //по умолчанию |
+--------------------------+------------------------+-------------------------------------------------------+
| Период синхронизации | выбор вариантов | * Никогда //по умолчанию |
| | | * 30 минут |
| | | * 1 час |
| | | * 2 часа |
| | | * 4 часа |
| | | * 8 часов |
| | | * 24 часа |
| | | * Настроить период |
+--------------------------+------------------------+-------------------------------------------------------+
| Загружать вложения | выбор вариантов | * Никогда //по умолчанию |
| при синхронизации | | * Всегда (может взиматься плата за передачу данных) |
| | | * Только через Wi-Fi |
+--------------------------+------------------------+-------------------------------------------------------+
| Журнал синхронизации | кнопка | |
+--------------------------+------------------------+-------------------------------------------------------+
| Выйти | кнопка | |
+--------------------------+------------------------+-------------------------------------------------------+
| *Местоположение* | | |
+--------------------------+------------------------+-------------------------------------------------------+
| Отправлять геоданные | флажок | * Включено |
| | | * Выключено //по умолчанию |
+--------------------------+------------------------+-------------------------------------------------------+
| Период обновления | выбор вариантов | * 1 минута |
| | | * 3 минуты //по умолчанию |
| | | * 5 минут |
| | | * 10 минут |
| | | * 15 минут |
| | | * Настроить период |
+--------------------------+------------------------+-------------------------------------------------------+
| *Прочее* | | |
+--------------------------+------------------------+-------------------------------------------------------+
| Перезапустить приложение | кнопка | |
+--------------------------+------------------------+-------------------------------------------------------+
| О программе | лейбл | |
+--------------------------+------------------------+-------------------------------------------------------+
**Общие**
Под опцией *"Адрес сервера"* отображается фиксированная нередактируемая
подпись, содержащая url сервера. Автоматически заполняется значением из
поля "Хост" окна авторизации.
Под опциями *"Модуль по умолчанию"* и *"Язык"* должны отображаться
фиксированные подписи с их текущим значением.
**Учетная запись**
Флажок *"Синхронизировать данные для автономной работы"*.
При выключении флажка "Синхронизировать данные для автономной работы" и
наличии на устройстве данных синхронизации пользователю должно
отобразиться уведомление:
`При отключении данной опции будут удалены все данные синхронизации на
устройстве. Продолжить?`
и варианты "Да" / "Нет". При положительном ответе данные синхронизации
удаляются, флажок выключается. При отрицательном ответе - ничего не
изменяется.
Фиксированная подпись для опции "Синхронизировать данные для автономной
работы" - "Включено" либо "Выключено", в зависимости от значения флажка.
Поля *"Период синхронизации"*, *"Загружать вложения при синхронизации"* и
кнопка *"Журнал синхронизации"* доступны на редактирование только для
включенного флажка "Синхронизировать данные для автономной работы".
По нажатию на "Настроить период" открывается системный диалог "Период
синхронизации" (аналогичный, например, настройке времени при создании
работы). Значение по умолчанию - `Никогда`. Указанное значение
должно стать периодом синхронизации.
При изменении данной опции для ОС Android приложение открывает модальное
окно подтверждения с сообщением:
`Чтобы изменения вступили в силу, необходимо перезапустить приложение.
Хотите сделать это сейчас?`
с кнопками «Да» - мобильный клиент перезагружается, устанавливаются
заданные ранее настройки и «Нет» - приложение закрывает окно, настройки
не применяются.
Под опцией "Период синхронизации" отображается фиксированная подпись
"Никогда" (для выбранного варианта периода синхронизации "Никогда") либо
"Каждые:" + значение периода в формате "1 час 30 минут" (для остальных
вариантов периода).
По нажатию на "Загружать вложения при синхронизации" открывается
системный диалог "Загружать вложения" (аналогичный, например, выбору
формы завершения при создании работы). Значение по умолчанию -
"Никогда". Выбранное значение должно отображаться под опцией в качестве
фиксированной подписи.
> Примечание.
>
> Если вложения при синхронизации не загружаются, то по нажатию на них
> ничего происходить не должно (ни скачивания, ни ошибок).
>
> Данная галочка не распространяется на все файлы по форме и файлы в
> модуле «Файлы»: такие файлы никогда не синхронизируются.
По нажатию на кнопку *"Журнал синхронизации"* открывается
[экран логов](#sec.offline_journal_synchronization).
Под кнопкой *"Выйти"* отображается фамилия и имя авторизованного
пользователя. По нажатию на эту кнопку должно отобразиться сообщение:
`При выходе из учетной записи из устройства будут удалены все связанные
с ней данные и кэш. Продолжить?`
При согласии необходимо удалить все данные (в т.ч. данные синхронизации,
при наличии) и сохраненный на устройстве кэш. Должен открыться
[экран авторизации](#sec.autorise.part2) с вводом пароля (т.е. поля
адреса и логина на первом шаге авторизации должны быть автоматически
введены).
**Местоположение**
При включении флажка *"Отправлять геоданные"* необходимо производить
проверку подключения GPS:
* Для Android - при выключенном GPS на устройстве, мобильный клиент
должен открывать модальное окно с сообщением:
`GPS отключен. Для получения текущего местоположения необходимо его
включить. Хотите сделать это сейчас?`
и кнопками «Да» и «Нет». При нажатии на «Да» приложение закрывает
модальное окно и открывает системные настройки геолокации.
* для iOS - при выключенном GPS на устройстве, мобильный клиент должен
открывать системное окно с сообщением:
`Программа "SYNERGY" запрашивает разрешение на использование Вашей
текущей геопозиции`
и кнопками «Запретить» и «ОК».
При выключенном GPS флажок "Отправлять геоданные" должен быть выключен.
Фиксированная подпись для опции "Отправлять геоданные" - "Включено" либо
"Выключено", в зависимости от значения флажка.
Поле *"Период обновления"* доступно на редактирование только для
включенного флажка "Отправлять геоданные".
По нажатию на "Настроить период" открывается системный диалог "Период
обновления" (аналогичныйпериоду синхронизации). Значение по умолчанию -
0 часов 01 минута. Указанное значение должно стать периодом обновления.
При изменении данной опции для ОС Android приложение открывает модальное
окно подтверждения с сообщением:
`Чтобы изменения вступили в силу, необходимо перезапустить приложение.
Хотите сделать это сейчас?`
с кнопками «Да» - мобильный клиент перезагружается, устанавливаются
заданные ранее настройки и «Нет» - приложение закрывает окно, настройки
не применяются.
Под опцией "Период обновления" отображается фиксированная подпись
"Каждые:" + значение периода в формате "1 час 30 минут".
**Прочее**
По нажатию на кнопку *"Перезапустить приложение"* (присутствует только
для ОС Android) приложение должно выгрузиться из памяти и снова
запуститься. При этом должны примениться все новые настройки.
Лейбл *"О программе"* содержит значение текущей версии приложения.
Все настройки, за исключением языка, применяются сразу (для iOS - после
нажатия кнопки "Готово"). Для смены языка необходимо перезапустить
приложение.
Закрыть окно настроек можно (происходит возврат к модулю, откуда были
вызваны настройки, не навигатор):
- для ОС Android - кнопкой устройства "Назад";
- для iOS - кнопками "Назад" (без применения изменений) и "Готово" (с
применением изменений).
В генеральных настройках Synergy на iOS должна отображаться только
текущая версия приложения.
Размеры, отступы и цвета элементов мобильного клиента {#sizes_and_spacing}
=====================================================
<#include "sizes_and_spacing/sizes_and_spacing_general.md">
<#include "sizes_and_spacing/sizes_and_spacing_works.md">
<#include "sizes_and_spacing/sizes_and_spacing_documents.md">
Документы {#sec.sizes_and_spacing.documents}
---------
<#include "sizes_and_spacing/sizes_and_spacing_documents_plates.md">
<#include "sizes_and_spacing/sizes_and_spacing_documents_view_document.md">
### Плашки {#sec.sizes_and_spacing.documents.plates}
Плашки документов используются в списках документов и делятся по тому,
какой основной фильтр открыт на просмотр («Журналы» или «Все»), а также
имеют разный вид в зависимости от устройства, на котором отображаются -
планшет или смартфон.
![Плашка документа, раздел
«Журналы»](resources/img/size_and_spacing/documents/maximalnii_razmer_plashki.png)
![Плашка документа, раздел «Журналы» -
планшет](resources/img/size_and_spacing/documents/maximalnii_razmer_plashki_ipad.png)
Размер, шрифт и цвет номера, подписи времени, оставшегося до завершения
работ по документу и ФИО пользователей в "Отписано" и "На исполнении" -
13sp, Helvetica Neue Cyrillic Roman, \#9b9b9b.
Цвет шрифта подписей "Отписано" и "На исполнении" - \#707070.
Размер и шрифт краткого содержания непрочитанного документа - 17sp,
Helvetica Neue Cyrillic Bold.
Размер и шрифт краткого содержания прочитанного документа - 17sp,
Helvetica Neue Cyrillic.
Цвет шрифта краткого содержания обычного документа - \#487cc2.
Цвет шрифта краткого содержания документа, по работам которого
заканчивается срок - \#a57020.
Цвет шрифта краткого содержания просроченного документа - \#be3d3d.
Цвет фона списка документов - \#f3f3f3.
Цвет фона плашки - \#ffffff.
![Плашка документа, раздел
«Все»](resources/img/size_and_spacing/documents/maximalnii_razmer_plashki_v_documentax.png)
![Плашка документа, раздел «Все» -
Планшет](resources/img/size_and_spacing/documents/plashka_documentov_ipad.png)
Параметры для этих плашек аналогичны тем, что указаны выше, за
исключением того, что цвет шрифта текста значащего содержимого
документа - \#487cc2.
![Полная плашка
документа](resources/img/size_and_spacing/documents/razvernutoe_info.png)
Полная (развёрнутая) плашка документа используется только на смартфонах.
Цвет шрифта подписей "Отправлено", "От" и т.д. - \#9b9b9b.
Цвет шрифта содержимого подписей "Отправлено", "От" и т.д., а также
надписи "Регистрация" - \#707070.
### Просмотр документа {#sec.sizes_and_spacing.documents.view_document}
Экран просмотра документа аналогичен экрану просмотра работы, за
исключением того, что на экране просмотра документа имеется
сворачиваемый/разворачиваемый блок с информацией, относящейся к
документу
![Просмотр документа без
работ](resources/img/size_and_spacing/documents/documents_without_works_sizes.png)
![Просмотр документа - несколько
работ](resources/img/size_and_spacing/documents/documents_neskolko_works_sizes.png)
![Просмотр документа - подробная
информация](resources/img/size_and_spacing/documents/documents_full_information_sizes.png)
Цвет шрифта подписей "Показать", "Скрыть" - \#c0c0c0.
Общие элементы {#sec.sizes_and_spacing.general}
--------------
<#include "sizes_and_spacing/sizes_and_spacing_general_top_panel.md">
<#include "sizes_and_spacing/sizes_and_spacing_general_buttons.md">
<#include "sizes_and_spacing/sizes_and_spacing_general_textfields.md">
<#include "sizes_and_spacing/sizes_and_spacing_general_lists.md">
<#include "sizes_and_spacing/sizes_and_spacing_general_checkboxes.md">
<#include "sizes_and_spacing/sizes_and_spacing_general_comment.md">
<#include "sizes_and_spacing/sizes_and_spacing_general_file.md">
<#include "sizes_and_spacing/sizes_and_spacing_general_menu.md">
<#include "sizes_and_spacing/sizes_and_spacing_general_filters.md">
<#include "sizes_and_spacing/sizes_and_spacing_general_settings.md">
### Кнопки {#sec.sizes_and_spacing.general.menu}
![Кнопки](resources/img/size_and_spacing/workflow/ui_button.png)
Размер, шрифт и цвет для текста внутри кнопок: 21sp, Helvetica Neue Cyr
Medium, \#ffffff.
Цвета кнопок: зеленая: \#5f8f15, красная: \#a52929, серая: \#868487.
### Чекбоксы {#sec.sizes_and_spacing.general.checkboxes}
![Чекбоксы](resources/img/size_and_spacing/workflow/ui_checkbox.png)
Чекбокс должен передаваться иконкой:
![](resources/img/workflow/elements/checkbox.png).
Галочка чекбокса также должна передаваться иконкой:
![](resources/img/workflow/elements/checker.png).
### Плашка комментария {#sec.sizes_and_spacing.general.comment}
![Плашка
комментария](resources/img/size_and_spacing/workflow/comment_billet.png)
Размер, шрифт и цвет ФИО - 12sp, Helvetica Neue Cyr Medium, \#3c74bf.
Размер, шрифт и цвет текста комментария - 12sp, Helvetica Neue Cyr
Medium, \#707070.
Размер, шрифт и цвет подписи времени добавления комментария - 12sp,
Helvetica Neue Cyr Medium, \#979797.
### Плашка файла {#sec.sizes_and_spacing.general.file}
![Плашка файла](resources/img/size_and_spacing/workflow/file_billet.png)
Размер, шрифт и цвет названия файла - 14sp, Helvetica Neue Cyr Medium,
\#3c74bf.
### Фильтры {#sec.sizes_and_spacing.general.filters}
![Фильтры](resources/img/size_and_spacing/workflow/filter_dim.png)
Размер, шрифт и цвет для:
- фильтра первого уровня - 13sp, Helvetica Neue Cyr Bold, \#9093a6;
- выделенного фильтра первого уровня - 13sp, Helvetica Neue Cyr Bold,
\#d9dced;
- фильтра второго уровня - 14sp, Helvetica Neue Cyr Light, \#9093a6;
- выделенного фильтра второго уровня - 14sp, Helvetica Neue Cyr
Medium, \#d9dced.
Цвет фона основной области - \#282e3c.
Панель синхронизации:
- цвет панели в обычном состоянии - \#1c212c;
- цвет панели в процессе синхронизации - \#495162;
- размер, шрифт и цвет текста в обычном состоянии - 10pt, Helvetica
Neue Cyr Light, \#828594;
- размер, шрифт и цвет текста в процессе синхронизации - 10pt,
Helvetica Neue Cyr Light, \#12161f.
\ No newline at end of file
### Списки {#sec.sizes_and_spacing.general.lists}
![Списки](resources/img/size_and_spacing/workflow/ui_lister.png)
Размер, шрифт и цвет для текста "перейти к комментариям" / "Перейти к
вложениям" - 11sp, Helvetica Neue Cyr Bold, \#494949.
Размер, шрифт и цвет для подписи с количеством комментариев / вложений -
11sp, Helvetica Neue Cyr Bold, \#929292.
Размер, шрифт и цвет для текста "Из работы / Перепорученные"
(невыделенный элемент) - 12sp, Helvetica Neue Cyr Medium, \#808080. Фон
кнопки - \#eaeaea.
Размер, шрифт и цвет для текста "Из работы / Перепорученные" (выделенный
элемент) - 12sp, Helvetica Neue Cyr Medium, \#353535. Фон кнопки -
\#d9eaf1.
Размер, шрифт и цвет ФИО в user-chooser'е - 13sp, Helvetica Neue Cyr
Medium, \#3c74bf.
Размер, шрифт и цвет текста должности в user-chooser'е - 11sp, Helvetica
Neue Cyr Roman, \#707070.
### Меню создания {#sec.sizes_and_spacing.general.buttons}
![Меню создания](resources/img/workflow/work_create_menu.png)
Цвет шапки - #c4c8cf
Цвет сплита - #adb1b9
Цвет шрифта - #3d3d3d
Цвет фона меню - #f5f5f5
Максимальные размеры меню сверху и снизу должны быть равны
размерам слева и справа. Меню, размеры сверху и снизу которого
меньше максимальных, должно центрироваться по вертикали.
### Переключатели {#sec.sizes_and_spacing.general.radiobuttons}
![Переключатели](resources/img/size_and_spacing/forms/ui_radiobutton.png)
Переключатель должен передаваться иконкой:
![](resources/img/forms/radiobutton.png).
Точка переключателя также должна передаваться иконкой:
![](resources/img/forms/button.png).
### Настройки {#sec.sizes_and_spacing.general.settings}
> **Замечание**
>
> Размер в единицах sp - для ОС Android, pt - для iOS.
Размер, шрифт и цвет текста верхней панели "Настройки" - 20sp/17pt,
Helvetica Neue Cyr Bold, \#c5ccd6.
Размер, шрифт и цвет текста верхней панели "Готово" и "Отмена" - 14pt,
Helvetica Neue Cyr Medium, \#c5ccd6.
Размер, шрифт и цвет для:
- заголовков категорий - 18sp/15pt, Helvetica Neue Cyr Medium,
\#353535;
- названия опций - 16sp/12pt, Helvetica Neue Cyr Medium, \#707070;
- значения настроек - 12sp/10pt, Helvetica Neue Cyr Medium, \#999999;
Цвет разделительной линии после заголовка категории - \#707070.
Цвет разделительной между опциями - \#dddddd.
Выбор языка:
- перечисление языков - 14pt, Helvetica Neue Cyr Medium, \#707070;
![iOS: Выбор
языка](resources/img/size_and_spacing/settings/ios_language_choose.png)
Выбор периода синхронизации:
- перечисление периодов - 14pt, Helvetica Neue Cyr Medium, \#707070;
![iOS: Выбор периода
синхронизации](resources/img/size_and_spacing/settings/ios_period_choose.png)
![iOS: Выбор периода
синхронизации](resources/img/size_and_spacing/settings/ios_period_choose_2.png)
Выбор периода синхронизации:
- перечисление вариантов загрузки вложений - 14pt, Helvetica Neue Cyr
Medium, \#707070;
![iOS: Выбор варианта загрузки вложений при
синхронизации](resources/img/size_and_spacing/settings/ios_files_download.png)
### Переключатели {#sec.sizes_and_spacing.general.switchers}
![Переключатели](resources/img/size_and_spacing/workflow/ui_switcher.png)
Фон переключателя определяется цветом:
- Синий (для окна авторизации):
\#889bce - цвет центральной точки градиента;
\#5d6d97 - цвет крайней точки градиента;
\#7f7f7f - цвет фона переключателя.
- Серый (для всех остальных случаев):
\#f0f0f0 - цвет центральной точки градиента;
\#d6d6d6 - цвет крайней точки градиента;
\#4c4c4c- цвет фона переключателя.
Размер, шрифт и цвет надписи переключателя "Вкл / Выкл" - Helvetica Neue
Cyr Bold, \#ffffff.
### Поля ввода {#sec.sizes_and_spacing.general.textfields}
![Поля ввода](resources/img/size_and_spacing/workflow/ui_input.png)
Размер, шрифт и цвет для placeholder'a и введенного текста - 15sp,
Helvetica Neue Cyr Medium, \#999999.
Размер, шрифт и цвет для текста выбранного значения - 15sp, Helvetica
Neue Cyr Medium, \#3f75bf.
### Верхняя панель {#sec.sizes_and_spacing.general.top_panel}
![Верхняя панель](resources/img/size_and_spacing/workflow/menu_bar.png)
Цвет фона шапки "Навигатор" / "Дочерние" - \#3f4659.
Размер, шрифт и цвет текста "Навигатор" / "Дочерние" - 14sp, Helvetica
Neue Cyr Medium, \#c4cad6.
Цвет фона обычной шапки - \#303030.
Размер, шрифт и цвет текста обычной шапки - 14sp, Helvetica Neue Cyr
Medium, \#ffffff.
> **Замечание**
>
> Данные для верхней панели экрана настроек отличаются и описаны в
> [Настройки](#sec.sizes_and_spacing.general.settings).
Работы {#sec.sizes_and_spacing.works}
------
![Плашка
работы](resources/img/size_and_spacing/workflow/work_billet.png)
![Плашка работы с
резолюцией](resources/img/size_and_spacing/workflow/work_billet_with_resolution.png)
Размер, шрифт и цвет ФИО и подписи времени, оставшегося до завершения
работы - 13sp, Helvetica Neue Cyrillic Roman, \#9b9b9b.
Размер и шрифт выделенной работы - 17sp, Helvetica Neue Cyrillic Bold.
Размер и шрифт невыделенной работы - 17sp, Helvetica Neue Cyrillic
Roman.
Цвет родительской работы (для дочерних) - \#efefef.
Цвет фона списка работ - \#f3f3f3.
Цвет фона плашки - \#ffffff.
Потоки работ {#chap_workflow}
============
<#include "workflow/workflow_works.md">
<#include "workflow/workflow_subsidiary_works.md">
<#include "workflow/workflow_filters.md">
<#include "workflow/workflow_create_menu.md">
<#include "workflow/workflow_work_delete.md">
<#include "workflow/workflow_workinfo.md">
### Вложения работы {#sec.workflow_attachments}
Далее, при наличии вложений к работе, располагается панель вложений.
Панель вложений отображает максимум 3 (три) последних вложения (не важно,
из "Приложений" или "Прочих") к работе, каждое из которых представляет
собой плашку.
Элементы плашки вложения:
+-------------------------------------------+--------------+
| Элемент | Поле API |
+===========================================+==============+
| иконка изображения для предпросмотра, в | icon (32x32) |
| случае его отсутствия - иконка типа файла | |
+-------------------------------------------+--------------+
| название файла | `name` |
+-------------------------------------------+--------------+
> **Примечание**
>
> Ссылка на иконку передается относительная. Доступ по этому URL-у без
> авторизации запрещен, поэтому полная ссылка должна выглядеть так:
>
> `http(s)://user_login:user_pass@host:port/Synergy`
>
> `+` относительная ссылка из `json`, где:
>
> * *user_login* - логин авторизованного пользователя;
> * *user_pass* - пароль авторизованного пользователя.
В конце панели вложений отображается строка "Перейти к вложениям" с
указанием общего количества вложений к работе
(![](resources/img/workflow/elements/plashka_attachment_number.png)).
По нажатию только по этой строчке мобильный клиент открывает экран
"Вложения" со списком всех файлов работы (илл. «Вложения»).
> **Примечание**
>
> Для получения последних вложений работы необходимо использовать метод:
>
> kz.arta.synergy.server.api.rest.works.WorkFlowService#getAttachments
>
> Ссылка для просмотра файла вложений:
>
> `rest/api/storage/pdf/get?identifier=node_id`
>
> где `node_id` - идентификатор файла. Полная ссылка должна выглядеть
> следующим образом:
>
> `http(s)://user_login:user_pass@host:port/Synergy/rest/api/storage/pdf/get?identifier=node_id`
>
> где `user_login` - логин авторизованного пользователя, `user_pass` -
> пароль авторизованного пользователя. Без авторизации доступ к файлам
> запрещен.
![Вложения](resources/img/workflow/attachements.png)
![Вложения](resources/img/workflow/iOS/attachements_ios.png)
На экране "Вложения" все вложенные файлы разделены на 2 панели:
"Приложения" и "Прочие".
При прокрутке пользователем в начале списка вверх список вложений
обновляется.
Список вложений сортируется в алфавитном порядке.
Для добавления нового вложения пользователь нажимает на кнопку "+"
на верхней панели. Открывается меню "Добавить" с пунктами:
* Файл с хранилища
* Файл с устройства
* Фото
Действия данных пунктов меню аналогичны описанным выше. Файл
добавляется, если есть доступ, в панель "Приложения", и в
"Прочие", если доступа нет.
В результате нажатия по плашке вложения выбранный файл скачивается
на устройство и открывается его системными средствами. Если вложение
имеет расширение `asfdocx`, то такой файл должен открываться в
[проигрывателе формы](#forms_view).
> **Примечание:**
>
> Для версий мобильного приложения 3.6 и ниже поведение при нажатии
> по плашке вложения, имеющего расширение `asfdocx`, следующее:
> если форма имеет печатное представление, то файл по форме должен
> скачиваться в pdf-версии согласно шаблона печатного представления,
> иначе необходимо выдавать сообщение-ошибку:
>
> `Действие не может быть выполнено, т.к. форма не имеет печатного
> представления`
>
> Для версий мобильного приложения 3.6 и ниже поведение при долгом
> нажатии по плашке вложения, имеющего расширение `asfdocx`,
> следующее: если форма имеет мобильное представление и у
> пользователя есть право редактирования файла, то появляется
> меню "Действия", в котором присутствует пункт "Изменить" (первым
> в списке). Пользователь нажимает на этот пункт меню и
> приложение открывает экран редактирования файла по форме в
> мобильном представлении, аналогичный форме завершения "форма"
> ([Проигрыватель формы](#forms_view)). Если были внесены
> изменения, то в случае успешного сохранения на сервере должна
> сохраниться текущая версия формы, но увеличиться версия данных.
Если документ с текущим файлом по форме относится к реестру, в
результате сохранения возможны следующие 2 варианта событий:
* документ по реестру еще не активирован (поле `activate` = false)
и не находится в процессе (поле `processing` = false): после
сохранения открывается окно информации о документе, в которой
имеется кнопка запуска маршрута с идентификатором операции
[`RUN`](#sec.documents_actions);
* документ по реестру активирован (поле `activate` = true) и не
находится в процессе (поле `processing` = false): после
сохранения открывается / запускается
[маршрут *изменения* элемента](#sec.documents_actions).
Если у пользователя есть право на удаление вложения, в результате
долгого нажатия по плашке вложения появляется меню "Действия", в
котором присутствует пункт "Удалить". Пользователь нажимает на этот
пункт меню и приложение запрашивает подтверждение выполнения
действия с сообщением:
`Вы действительно хотите удалить данный файл?`
Если пользователь подтверждает удаление, отправляется запрос на
сервер для удаления. В случае успешного выполнения плашка удаляется
из списка, иначе - отображается сообщение об ошибке.
По нажатию в списке вложений на кнопку "Назад" мобильный клиент
возвращается на экран информации о работе. В случае, если было
хотя бы одно изменение, информация обновляется.
> **Примечание**
>
> Для получения всех вложений необходимо использовать метод:
>
> kz.arta.synergy.server.api.rest.works.WorkFlowService#getFullAttachments
>
> Метод для удаления вложения:
>
> kz.arta.synergy.server.api.rest.works.WorkFlowService#deleteAttachment
### Комментарии работы {#sec.workflow_comments}
Далее всегда (независимо от наличия или отсутствия комментариев)
располагается панель комментариев.
Панель комментариев в окне информации о работе всегда содержит 3 (три)
вкладки: "Работа", "Документ" и "Личные". Переключение между вкладками
может происходить двумя способами: по нажатию соответствующей шапки и
с помощью свайпа вправо/влево (для активной левой вкладки свайп вправо
должен отсутстовать, аналогично для активной правой вкладки свайп
влево должен отсутствовать):
* во вкладке "Работа" должны содержаться комментарии к работе (каждый
раз при открытии информации о работе именно данная вкладка должна
быть выделена по умолчанию);
* во вкладке "Документ", соответственно, должны содержаться
комментарии ко всему документу;
* во вкладке "Личные" должны отображаться личные комментарии
авторизованного пользователя к данной работе.
![Комментарии по вкладкам](resources/img/workflow/work_view8.png)
Каждая вкладка панели комментариев отображает не более трех
соответствующих (к работе / к документу / личные) последних полных
комментария, каждый из которых представляет собой плашку. Элементы
плашки комментария:
+----------------------+-----------------------------------+----------------------+-----------+
| Элемент | Расположение | Описание | Поле API |
+======================+===================================+======================+===========+
| %иконка_комментария% | В левом верхнем углу плашки | Тип комментария | `type` |
+----------------------+-----------------------------------+----------------------+-----------+
| %Фамилия И.О.% | Вверху справа от типа комментария | Автор комментария | `author` |
+----------------------+-----------------------------------+----------------------+-----------+
| 28 минут назад | В левом нижнем углу плашки после | Время добавления | `created` |
| | текста комментария | комментария | |
+----------------------+-----------------------------------+----------------------+-----------+
| | В основной области плашки | Текст комментария | `comment` |
+----------------------+-----------------------------------+----------------------+-----------+
*Тип комментария* отображается в виде пиктограммы. API возвращает
идентификатор пиктограммы (comment_icon).
+---------------------------------------------------------------+-------------------------------------------------+-----------------------+
| Иконка | Описание | Идентификатор |
+===============================================================+=================================================+=======================+
| ![](resources/img/workflow/elements/comment_icon.png)\ | комментарий самого пользователя (неличный) | `comment_icon` |
+---------------------------------------------------------------+-------------------------------------------------+-----------------------+
| ![](resources/img/workflow/elements/comment_icon_blue.png)\ | личный комментарий пользователя | `comment_icon_blue` |
+---------------------------------------------------------------+-------------------------------------------------+-----------------------+
| ![](resources/img/workflow/elements/comment_icon_gray.png)\ | комментарий другого пользователя | `comment_icon_gray` |
+---------------------------------------------------------------+-------------------------------------------------+-----------------------+
| ![](resources/img/workflow/elements/comment_icon_green.png)\ | комментарий согласования / утверждения | `comment_icon_green` |
+---------------------------------------------------------------+-------------------------------------------------+-----------------------+
| ![](resources/img/workflow/elements/comment_icon_red.png)\ | комментарий отказа в согласовании / утверждении | `comment_icon_red` |
+---------------------------------------------------------------+-------------------------------------------------+-----------------------+
| ![](resources/img/workflow/elements/comment_icon_result.png)\ | комментарий результата работы | `comment_icon_result` |
+---------------------------------------------------------------+-------------------------------------------------+-----------------------+
*Автор комментария* - пользователь, который оставил данный
комментарий. Отображается в формате %Фамилия И.О.%
*Время добавления комментария*. Значение времени
отображается по следующему принципу:
+---------------------------------------+------------------------------------------------------+
| Время добавления комментария | Формат отображения |
+=======================================+======================================================+
| *Сегодня* | |
+---------------------------------------+------------------------------------------------------+
| в течение часа | "ХХ минут(ы) назад" |
+---------------------------------------+------------------------------------------------------+
| более часа назад, но в течение дня | "Сегодня в ЧЧ:ММ" |
+---------------------------------------+------------------------------------------------------+
| *Вчера* | |
+---------------------------------------+------------------------------------------------------+
| в течение предыдущего дня | "Вчера в ЧЧ:ММ" |
+---------------------------------------+------------------------------------------------------+
| *В течение текущей рабочей недели* | |
+---------------------------------------+------------------------------------------------------+
| более двух дней назад, но в течение | * "В понедельник в ЧЧ:ММ" (при просмотре комментария |
| текущей рабочей недели | со среды по воскресенье текущей рабочей недели) |
| | * "Во вторник в ЧЧ:ММ" (четверг - воскресенье) |
| | * "В среду в ЧЧ:ММ" (пятница - воскресенье) |
| | * "В четверг в ЧЧ:ММ" (суббота - воскресенье) |
| | * "В пятницу в ЧЧ:ММ" (только воскресенье) |
+---------------------------------------+------------------------------------------------------+
| *Более недели назад* | |
+---------------------------------------+------------------------------------------------------+
| предыдущая рабочая неделя и более | "ДД месяц ГГГГ ЧЧ:ММ" |
+---------------------------------------+------------------------------------------------------+
В конце панели комментариев (даже их количество в данной
вкладке равно нулю) отображается строка "Перейти к
комментариям" с указанием общего количества комментариев
(![](resources/img/workflow/elements/plashka_comment_number.png)).
По нажатию только по этой строчке мобильный клиент открывает
экран со списком комментариев, соответствующих той вкладке,
откуда был вызван данный экран (илл. «Список всех
комментариев»). Название экрана должно соответствовать
названию вкладки, откуда он был вызван.
![Список всех комментариев](resources/img/workflow/comments_view.png)
![Список всех комментариев](resources/img/workflow/iOS/comments_view.png)
Комментарии в списке отображаются с постепенной догрузкой.
Изначально подгружается такое количество комментариев, чтобы
список был полностью заполнен и появился скролл (минимум 30).
При прокрутке пользователем вниз список комментариев
дополняется (количество комментариев в новой "порции" должно
быть равно количеству комментариев в первой "порции").
При прокрутке пользователем в начале списка вверх список
комментариев обновляется.
Список комментариев сортируется по времени добавления по
убыванию (т.е. последние добавленные - в начале списка).
Для добавления нового комментария пользователь нажимает на
кнопку ![](resources/img/workflow/elements/add_comment.png)
на верхней панели. Открывается экран для ввода текста (илл.
«Добавление комментария»). Ввод комментария завершается
нажатием на кнопку "Готово". Новый комментарий сразу
добавляется первым в список комментариев:
* комментарий, добавленный через вкладку "Работа", должен
добавиться как к открытой ветке работ, так и к документу;
* комментарий, добавленный через вкладку "Документ", должен
добавиться как к документу, так и непосредственно к
открытой ветке работ;
* комментарий, добавленный через вкладку "Личные", должен
добавиться непосредственно к открытой работе.
![Добавление комментария](resources/img/workflow/comment_add.png)
![Добавление комментария](resources/img/workflow/iOS/comment_add.jpg)
Если у пользователя есть право на редактирование комментария,
в результате долгого нажатия по плашке комментария появляется
меню "Действия", в котором присутствует пункт "Изменить"
(первым в списке). Пользователь нажимает на этот пункт меню,
открывается системное окно ввода текста с текущей
формулировкой комментария. В случае успешного сохранения
текст комментария в списке изменяется (время при этом не
меняется), иначе - отображается сообщение об ошибке.
Если у пользователя есть право на удаление комментария, в
результате долгого нажатия по плашке комментария появляется
меню "Действия", в котором присутствует пункт "Удалить".
Пользователь нажимает на этот пункт меню и приложение
запрашивает подтверждение выполнения действия с сообщением:
`Вы действительно хотите удалить данный комментарий?`
Если пользователь подтверждает удаление, отправляется запрос
на сервер для удаления. В случае успешного выполнения плашка
удаляется из списка, иначе - отображается сообщение об ошибке.
По нажатию в списке комментариев на кнопку "Назад" мобильный
клиент возвращается на экран информации о работе. В случае,
если было хотя бы одно изменение, информация обновляется.
> **Примечание**
>
> Для получения трех последних и всех комментариев необходимо
> использовать метод API:
>
> kz.arta.synergy.server.api.rest.works.WorkFlowService#getComments
Создание работы / документов {#sec.workflow_create_menu}
-------------------
По нажатию в модуле «Работы» на кнопку "+" вызывается меню «Создать»
(илл. «Пункты меню "Создать"»).
![Пункты меню "Создать"](resources/img/workflow/work_create_menu.png)
В построении меню создания участвуют пункты параметра `work_items`
в порядке, определенном полем `position`.
* `work` - пункт создания работы по умолчанию (для параметра
`dialogs` значения полей `type` = "WORK" и `default` = "true",
название - поле `name`). По нажатию на данный пункт открывается
соответствующий экран [создания работы](#sec.workflow_work_create)
по умолчанию.
* `favorite_dialogs` - остальные пункты создания работы (для
параметра `dialogs` значения полей `type` = "WORK" и `default`
= "false", название - поле `name`). По нажатию на любой из
данных пунктов открывается соответствующий экран
[создания работы](#sec.workflow_work_create).
* `favorite_documents` - избранные пункты создания документа
и группы, содержащие такие избранные пункты.
> **Примечание**
>
> В версиях мобильного приложения 3.6 и ниже в построении меню
> создания участвуют только те избранные пункты создания документа,
> формы реестра которого имеют настроенное мобильное представление,
> и группы, содержащие такие избранные пункты.
В правой части групп отображается иконка
![](resources/img/workflow/elements/menu_undetailed.png) в
свернутом состоянии и
![](resources/img/workflow/elements/menu_detailed.png) в
развернутом. По нажатию в любой области строки со свернутой
группой иконка разворачивается, и наоборот. Развернутая группа
должна содержать либо вложенные группы (по умолчанию, каждый раз
они свернуты), либо избранные пункты создания документов. Строки
с вложенными группами и пунктами от левого края должны иметь
отступ, при этом уровни вложенности, начиная с 4-й, должны иметь
отступ как для 3-го уровня.
По нажатию на пункт (не группу) открывается соответствующий экран
[создания документа](#sec.workflow_document_create);
* `all_documents` - пункт, название которого должно браться из поля
`name`. По нажатию на данный пункт вызывается экран «Избранное»
со списком всех пунктов создания документов (илл. «Список всех
пунктов создания документов»).
Если название пункта меню полностью не помещается на двух строках, с
правого края второй строки оно должно быть затемнено градиентом из
прозрачного в цвет фона. В меню отсутствуют фиксированные элементы,
при развороте группы создания документа, оно должно пропорционально
увеличиться по вертикали. При этом если количество отображаемых
пунктов меню больше высоты экрана, появляется вертикальный скролл на
все меню, исключая "шапку" (т.е. скролл должен уходить под "шапку").
> *Примечание:*
>
> Метод получения настроек пунктов создания и диалогов создания
> работы описан в javadoc:
>
> kz.arta.synergy.server.api.rest.common.SettingsService#getSettings.
>
> Метод получения пунктов создания документа (в т.ч. только избранных)
> описан в javadoc:
>
> kz.arta.synergy.server.api.rest.common.RegistryService#getFavorite.
Каждая из групп пунктов должна быть отделена от следующей видимым
сплитом.
Если список создания работы / документов пуст, то кнопку "+"
отрисовывать не нужно. Если же меню содержит только один пункт,
то по нажатию кнопки "+", исключая его, должно выполняться
соответствующее действие и вызываться соответствующий экран.
По нажатию на пункт с идентификатором `all_documents` открывается
экран «Избранное», который содержит список всех групп и пунктов
создания документов (илл. «Список всех пунктов создания документов»).
![Список всех пунктов создания документов](resources/img/workflow/favorite.png)
![Список всех пунктов создания документов](resources/img/workflow/iOS/favorite_ios.png)
Поле с поиском вверху экрана, панель со списком всех групп и пунктов
создания документов по центру и кнопка "Выбрать" внизу экрана имеют
фиксированное положение, прокрутка списка скроллом осуществляется
внутри панели. Внутри панели отображается все дерево всех пунктов
(как избранных, так и обычных) и групп. Каждая запись содержит
полное название группы / пункта.
Панель со списком групп и пунктов создания документа имеет следующие
особенности:
* *Группы:*
* С понижением уровня группы и пункты смещаются вправо (при
этом уровни вложенности, начиная с 4-й, должны иметь отступ
как для 3-го уровня).
* В правой части групп отображается иконка
![](resources/img/workflow/elements/favorite_undetailed.png)
в свернутом состоянии и
![](resources/img/workflow/elements/favorite_detailed.png)
в развернутом. По нажатию в любой области строки со свернутой
группой иконка разворачивается, и наоборот (выделение строки
отсутствует). Развернутая группа должна содержать либо
вложенные группы (по умолчанию, каждый раз они свернуты),
либо избранные пункты создания документов.
* *Пункты:*
* Каждый пункт располагается правее группы самого нижнего
уровня, в которой он находится.
* В правой части пунктов отображается иконка избранности. По
нажатию на "звезду" избранного пункта
![](resources/img/workflow/elements/favorite.png) он
становится "обычным"
![](resources/img/workflow/elements/non_favorite.png), и
наоборот.
* Только в строке пункта присутствует выделение строки
(действие tap).
На экране «Избранное» есть возможность "живого" поиска пунктов (не
групп) по названиям (илл. «Поиск по пунктам создания документов»).
Для этого пользователь нажимает по полю поиска и вводит текст
запроса, при вводе текста иконка лупы заменяется на иконку крестика.
Очистить поле ввода можно, нажав на крестик (крестик заменяется на
иконку лупы). Пустой запрос поиска - отображается экран в
первоначальном виде (илл. «Список всех пунктов создания документов»).
![Поиск по пунктам создания документов](resources/img/workflow/favorite_search.png)
![Поиск по пунктам создания документов](resources/img/workflow/iOS/favorite_search_ios.png)
При поиске панель со списком групп и пунктов создания документа
преобразовывается:
* во-первых, теперь она содержит только пункты (не группы) создания
документов;
* во-вторых, теперь в ней не отображается дерево этих пунктов, т.е.
список пунктов любого уровня вложенности, которые удовлетворяют
условиям поиска, должен быть одноуровневым списком;
* в-третьих, после названия пункта отображается полный путь из групп
до данного пункта (если пункт не содержится ни в одной группе,
данной строки быть не должно).
В обоих состояних экрана «Избранное» после выделения пункта
пользователь нажимает на кнопку «Выбрать». Действие выполняется,
только если выделен какой-либо пункт, иначе необходимо выдавать
сообщение:
`Не выбран пункт создания документа`
и не выполнять действие. В случае успешного выполнения действия
открывается экран [создания документа](#sec.workflow_document_create).
Если пользователь на экране «Избранное» нажимает на кнопку "Назад",
мобильный клиент возвращает экран со списком работ в том состоянии,
которое было до вызова данного экрана.
<#include "workflow/workflow_work_create.md">
<#include "workflow/workflow_document_create.md">
### Создание документов {#sec.workflow_document_create}
На экране со списком работ по нажатию на кнопку "+" и
выбору избранного пункта меню (не "Работа"), а также при
выборе любого пункта (не группы) в диалоге "Избранное"
(илл. «Список избранных пунктов создания документов»,
илл. «Список всех пунктов создания документов»),
открывается экран [проигрывателя формы](#forms_view).
> **Примечание**
>
> Для версий мобильного приложения 3.6 и ниже
> открывается экран создания документа, полностью
> аналогичный таковому в [Создание документов](#sec.document_creation)
> (для таких же версий).
Нажатие "Назад" в данном случае возвращает пользователя
в [список работ](#sec.workflow_works).
В результате успешного сохранения выдается сообщение
"Данные сохранены", документ сохраняется, открывается
экран [информации о работе](#sec.workflow_workinfo) с
единственной управляющей кнопкой запуска маршрута
([Запуск маршрута](#sec.documents_route_starting)).
Фильтры потоков работ {#sec.workflow_filters}
---------------------
По нажатию на кнопку "Фильтры", а также проведя пальцем от левой стороны экрана
со списком работ к правой, раскрывается левая панель навигатора фильтров
(илл. «Фильтры работ»).
![Фильтры работ](resources/img/workflow/filters.png)
Верхняя панель содержит кнопку "Настройки" ([Настройки приложения](#sec.settings))
и надпись "Навигатор". Нижняя панель отображается только для включенного флажка
"Синхронизировать данные для оффлайн-работы" и содержит кнопку синхронизации.
Кнопка синхронизации содержит иконку и один из вариантов подписи к ней:
* `Синхронизация не производилась` - для варианта, когда на устройстве
отсутствуют данные синхронизации;
* `Идёт синхронизация` - для активного процесса синхронизации (см. подробнее
в [Оффлайн-работа с приложением](#sec.offline));
* `Последняя синхронизация: %ДД месяц ЧЧ:ММ%` - во всех остальных случаях
(указывается дата и время последней успешной синхронизации).
Параметры фильтров:
+--------------------------------------+-------------+
| Параметр | Поле API |
+======================================+=============+
| Название фильтра | name |
+--------------------------------------+-------------+
| Тип фильтра | filterType |
+--------------------------------------+-------------+
| Количество документов внутри фильтра | count |
+--------------------------------------+-------------+
| Наличие дочерних фильтров | hasChildren |
+--------------------------------------+-------------+
При каждом новом запуске приложения, а также после переключения модулей все
основные фильтры должны быть свернуты, а выделенным являться первый фильтр
навигатора. В остальных случаях развернутость дерева и последний выделенный
фильтр должны сохранять свои значения.
Если фильтр содержит вложенные фильтры, то в правой части отображается иконка
![](resources/img/workflow/elements/filters_undetailed.png) для свернутого
фильтра и ![](resources/img/workflow/elements/filters_detailed.png) для
развернутого. По нажатию на квадратную область (илл. «Фильтры») вокруг иконки
свернутого фильтра он разворачивается, и наоборот. Одновременно не может быть
раскрыто более одного фильтра. В этом случае предыдущий развернутый фильтр
сворачивается.
Справа от названия каждого из фильтров и вложенных подфильтров "На исполнении"
и "На контроле" в скобках указывается счетчик в формате `(N1/N2)`, где N1 -
количество непросмотренных уведомлений, N2 - общее количество работ в данном
фильтре. При отсутствии значения N1 формат отображения счетчика - `(N2)`,
при отсутствии работ в фильтре счетчик не отображается вовсе.
Если название фильтра (с счетчиком) полностью не помещается на плашке, с
правого края оно должно быть затемнено градиентом из прозрачного в цвет фона.
По нажатию на название фильтра левая панель скрывается и пользователю
отображается список работ согласно выбранного фильтра. Также панель можно
скрыть тремя способами:
1. проведя пальцем от правой стороны экрана к левой;
2. нажав по любому месту правой стороны экрана (там, где отображается часть
экрана списка работ);
3. нажав на кнопку "Назад".
> **Примечание**
>
> API для получения фильтров описан в javadoc:
>
> kz.arta.synergy.server.api.rest.works#getFilters.
>
> API для получения счетчиков фильтров:
>
> kz.arta.synergy.server.api.rest.works#getCounters
#### Работа с резолюциями {#sec.workflow_resolution}
Для создания резолюции пользователь нажимает на кнопку "Резолюция" -
открывается экран резолюции (илл. «Экран резолюции»).
> **Примечание**
>
> В случае, если в РКК документа работы настроена валидация его полей
> перед отправкой, то по нажатию на кнопку резолюции, кроме варианта
> просмотра принятой резолюции (см. ниже), действие не произойдет
> (экран "Резолюция" не откроется либо меню с пунктами не отобразится)
> с ошибкой (-ами):
>
> `Данный тип документа требует указание дела. Выберите его в карточке и
> отправьте повторно. Если список пуст, обратитесь к методологу`
>
> `Данный тип документа требует определения исполнителя. Выберите его в
> карточке и отправьте повторно`
![Экран резолюции](resources/img/workflow/resolution.png)
![Экран резолюции](resources/img/workflow/iOS/resolution_ios.png)
Вверху экрана отображаются:
- кнопка "Добавить пункт" (с идентификатором NOT_PREFERRED), по
нажатию которой открывается экран редактирования пункта резолюции
(илл. «Экран редактирования пункта резолюции»);
- флажок "Является контрольным" (по умолчанию, выключен).
Далее отображаются панели пунктов резолюции в режиме просмотра. Каждая
панель содержит информацию в следующем порядке:
- *'Полная_формулировка_пункта_резолюции'*
- Ответственный: *Фамилия И.О.*
- Исполнители: *Фамилия И.О., Фамилия И.О.* и т.д.
- Завершение: *ДД месяц ГГГГ ЧЧ:ММ*
- Тип работы: *'Тип_работы'*
- Форма завершения: *'Форма_завершения'*
> **Примечания:**
>
> Если "Ответственный" или "Исполнители" содержат пустое значение, после
> двоеточего ничего не должно отображаться.
>
> Если значение поля "Форма завершения" = "Результат работы", то данная
> строчка в панели пункта резолюции не должна отображаться.
Далее отображаются управляющие кнопки. Для новой резолюции это кнопки
"Принять" (с идентификатором PREFERRED) и "Сохранить" (с идентификатором
NOT_PREFERRED).
Управляющие кнопки внизу экрана имеют фиксированное положение, остальные
поля и кнопки данного экрана не имеют фиксированного положения,
прокручиваются (если все поля вмещаются в экран, то управляющие кнопки
должны быть внизу экрана, а не сразу за контентом).
1. Для еще не принятой резолюции в результате нажатия по плашке пункта
резолюции открывается экран редактирования данного пункта резолюции
(илл. «Экран редактирования пункта резолюции») с заполненными
данными. Если пользователь в этом случае на экране редактирования
пункта резолюции нажимает на кнопку "Назад", мобильный клиент
возвращает экран резолюции в том состоянии, которое было до вызова
данного экрана.
2. Для еще не принятой резолюции в результате долгого нажатия по плашке
запрашивается подтверждение удаления с сообщением "Вы действительно
хотите удалить данный пункт резолюции?" Если пользователь
подтверждает удаление, плашка удаляется из списка, при неуспешном
удалении отображается сообщение об ошибке.
3. Если пользователь на экране резолюции (илл. «Экран резолюции»)
нажимает на кнопку "Назад", мобильный клиент возвращает экран
информации о работе в том состоянии, которое было до вызова данного
экрана.
*Экран редактирования пункта резолюции.*
![Экран редактирования пункта резолюции](resources/img/workflow/edit_resolution_punkt.png)
![Экран редактирования пункта резолюции](resources/img/workflow/iOS/edit_resolution_punkt.png)
Все поля и кнопки данного экрана не имеют фиксированной высоты,
контентозависимы (если все поля вмещаются в экран, то управляющие кнопки
должны быть внизу экрана, а не сразу за контентом).
Параметры пункта резолюции:
+---------------------+--------------------------------------------------------------------+
| Параметр | Описание |
+=====================+====================================================================+
| Формулировка пункта | Вводится полное название пункта резолюции (автоматический подбор |
| | по совпадениям, как в платформе, не поддерживается). |
+---------------------+--------------------------------------------------------------------+
| Ответственный | Открывается экран "Пользователи" (илл. «Экран "Пользователи" со |
| | скрытыми тегами»), параметры: |
| | |
| | * выбор одного пользователя; |
| | |
| | * если значение настройки "разрешено ли добавлять соисполнителей |
| | к работам, не являющихся подчиненными" = true, отображать всех |
| | пользователей, иначе - только подчиненных. |
| | |
| | Поле должно автоматически очиститься и стать неактивным |
| | (независимо от его заполненности), если выключается флажок. |
+---------------------+--------------------------------------------------------------------+
| Исполнители | Открывается экран "Пользователи" (илл. «Экран "Пользователи" со |
| | скрытыми тегами»), параметры: |
| | |
| | * множественный выбор пользователей; |
| | |
| | * если значение настройки "разрешено ли добавлять соисполнителей |
| | к работам, не являющихся подчиненными" = true, отображать всех |
| | пользователей, если false: |
| | |
| | * для значения настройки "ставить ли работы исполнителям от |
| | имени ответственного" = true, отображать подчиненных |
| | ответственного (если таковой выбран); |
| | |
| | * иначе (для значения настройки "ставить ли работы |
| | исполнителям от имени ответственного" = false либо если |
| | не был выбран ответственный) - отображать подчиненных |
| | данного пользователя. |
| | |
| | Поле должно автоматически очиститься, если сменили ответственного. |
+---------------------+--------------------------------------------------------------------+
| Изменить срок | Открывается системное окно ввода даты / времени. |
+---------------------+--------------------------------------------------------------------+
| Тип работы | Открывается список из возможных значений (полученных при загрузке |
| | приложения). |
+---------------------+--------------------------------------------------------------------+
| Форма завершения | Открывается список из возможных значений (полученных при загрузке |
| | приложения) и значения "Результат работы", значение "Результат |
| | работы" должно быть в списке первым. Если список форм завершения |
| | пуст, поле не должно быть отображено. |
+---------------------+--------------------------------------------------------------------+
> *Примечания к таблице:*
>
> Подписи к недоступным полям должны выделяться серым цветом (#7f7f7f).
>
> Для включенного флажка поле "Ответственный" обязательно для
> заполнения, для выключенного - обязательно для заполнения поле
> "Исполнители".
Если пользователь на экране редактирования пункта резолюции нажимает на
кнопку "Назад", мобильный клиент возвращает экран резолюции в том
состоянии, которое было до вызова данного экрана.
После ввода всех необходимых параметров пункта резолюции пользователь
нажимает на кнопку "Готово". Сохранение локальное. Действие выполняется
при выполнении следующих условий:
- для типа "Работа": название, ответственный / исполнители и сроки
обязательны для заполнения, форма завершения доступна для выбора;
- для типов "Согласование" / "Утверждение" / "Ознакомление": название,
исполнители и сроки обязательны для заполнения, ответственный и
форма завершения недоступны для выбора;
- для типа "Резолюция": название, ответственный / исполнители и сроки
обязательны для заполнения, форма завершения недоступна для выбора;
- для типа "Отправка документа": название и исполнители обязательны
для заполнения, ответственный, сроки и форма завершения недоступны
для выбора.
Возможно выполнение альтернативных потоков событий 1-3.
*Альтернативный поток №1.* При наличии незаполненных обязательных полей
необходимо выдавать сообщение:
`Заполните все поля`
и не выполнять действие.
*Альтернативный поток №2.* Если дата завершения пункта резолюции меньше
текущей даты, то необходимо выдавать сообщение:
`Дата завершения некоторых элементов меньше текущей даты`
и не выполнять действие, иначе - действие выполнять.
*Альтернативный поток №3.* Если значение настройки "разрешено ли
ставить работы по резолюции, завершающиеся позже документа" = false,
то для даты завершения в пунктах резолюции > даты завершения документа
необходимо выдавать сообщение:
`Дата завершения каждого из пунктов резолюции не должна превышать
срок документа`
и не выполнять действие, иначе - действие выполнять.
**Сохранение резолюции.**
Для сохранения черновика резолюции пользователь нажимает на кнопку
"Сохранить". Сохранение с отправкой данных сервер. Действие выполняется,
только если создан хотя бы один пункт резолюции, иначе выполняется
альтернативный поток событий 4.
При успешном сообщается "Данные сохранены", экран резолюции закрывается,
открывается экран информации о работе.
*Альтернативный поток №4.* При сохранении резолюции без единого пункта
необходимо выдавать сообщение:
`Резолюция должна содержать хотя бы один элемент`
и не выполнять действие.
**Редактирование черновика резолюции.**
Если у пользователя есть право редактирования черновика резолюции, то
чтобы редактировать черновик резолюции, он в окне информации о работе
нажимает на кнопку "Резолюция" - открывается экран резолюции с плашками
сохраненных пунктов резолюции и кнопками "Принять" и "Сохранить".
Возможные действия аналогичны описанным выше 1-3.
*Альтернативный поток №5.* Если любая плашка / любой пункт черновика
резолюции содержит тип работы, удаленный из соответствующего
справочника системы, то тип все еще является значением компонента, но
при этом отсутствует в выпадающем списке. При попытке сохранить (как на
экране редактирования пункта, так и всей резолюции) либо принять
резолюцию с таким типом работы необходимо не выполнять действие и
выдавать ошибку:
`Выбранный тип работы по резолюции отсутствует в справочнике.
Выберите другое значение.`
**Принятие резолюции.**
Для принятия резолюции пользователь нажимает на кнопку "Принять".
> **Примечание**
>
> В случае, если требуется подпись перед отправкой, то по нажатию на
> кнопку "Принять" действие не произойдет (резолюция не примется) с
> ошибкой:
>
> `Необходимо подписать документ до того, как вы его сможете отослать.`
Возможно исполнение альтернативных потоков событий, аналогичных при
сохранении резолюции (см. выше). При неуспешном принятии отображается
сообщение об ошибке, пользователь остается на экране резолюции. При
успешном сообщается "Резолюция принята", экран резолюции закрывается,
открывается экран информации о работе.
Кроме того, обновляется список работ (удаляется предыдущая работа,
создаются новые, присваивается свойство контрольности). На плашку работы
справа от иконки приоритета добавляется иконка наличия резолюции
("штамп"). Пример плашки работы с наложенной резолюцией см. в илл.
«Плашка работы с резолюцией».
**Просмотр принятой резолюции.**
Если у пользователя нет права редактирования принятой резолюции (только
просмотр), то чтобы просмотреть принятую резолюцию, он в окне информации
о работе нажимает на кнопку "Резолюция" - открывается экран резолюции с
плашками принятых пунктов резолюции, в котором:
- отсутствует кнопка "Сохранить";
- недоступны для нажатия кнопки "Добавить пункт" и "Принять", а также
флажок "Является контрольным";
- отсутствуют действия нажатия по плашке (редактирование пункта
резолюции) и долгого нажатия по плашке (удаление пункта резолюции).
**Редактирование принятой резолюции.**
Если у пользователя есть право редактирования принятой резолюции, то
чтобы редактировать принятую резолюцию, он в окне информации о работе
нажимает на кнопку "Резолюция" - открывается экран резолюции с плашками
принятых пунктов резолюции. Управляющая кнопка для принятой резолюции
одна - "Принять" (с идентификатором PREFERRED).
При добавлении новых пунктов резолюции возможные действия с ними
аналогичны описанным выше 1-3.
1. Для принятой резолюции в результате нажатия по плашке пункта
резолюции открывается экран редактирования данного пункта резолюции
(илл. «Экран редактирования пункта резолюции») с заполненными
данными. Поля ответственного и типа работы недоступны на
редактирование, остальные доступны.
> Примечание:
> Если любая плашка / любой пункт принятой резолюции содержит тип
> работы, удаленный из соответствующего справочника системы, то он
> продолжает отображаться в качестве типа работы безо всяких
> ошибок.
Если пользователь в этом случае на экране редактирования пункта
резолюции нажимает на кнопку "Назад", мобильный клиент возвращает
экран резолюции в том состоянии, которое было до вызова данного
экрана.
2. Для принятой резолюции в результате долгого нажатия по плашке
запрашивается подтверждение удаления с сообщением "Вы действительно
хотите удалить данный пункт резолюции?" Если пользователь
подтверждает удаление, плашка удаляется из списка, при неуспешном
удалении отображается сообщение об ошибке.
Для принятия отредактированной резолюции пользователь нажимает на кнопку
"Принять". При неуспешном сохранении отображается сообщение об ошибке,
пользователь остается на экране резолюции. При успешном сообщается
"Резолюция принята", экран резолюции закрывается, открывается экран
информации о работе. Кроме того, обновляется список работ согласно
введенным изменениям.
**Создание нескольких резолюций на документ.**
> **Примечание**
>
> Работает, только если значение настройки "разрешено ли накладывать
> дополнительные резолюции" = true.
По нажатию на кнопку "Резолюция" должно вызываться меню (аналогичное,
например, выбору формы завершения, илл. «Меню пунктов резолюции»), с
первым пунктом "Создать новую" (действие из подраздела "Создание
резолюции"). Пользователи - ответственные и исполнители уже наложенной
резолюции, которые, в свою очередь, могут создавать резолюцию, -
получают возможность накладывать собственную резолюцию. Один
пользователь может создать только одну резолюцию, т.е. если пользователь
уже создал резолюцию для документа, то пункт меню "Создать новую" у него
должен отсутствовать.
![Меню пунктов резолюции](resources/img/workflow/resolution_menu.png)
![Меню пунктов резолюции](resources/img/workflow/iOS/resolution_menu_ios.png)
Далее идут пункты, соответствующие уже наложенным на документ резолюциям
в порядке их создания, в формате *"Резолюция от Фамилия И.О."* По
нажатию на один из пунктов выполняется действие подразделов "Просмотр
принятой резолюции" либо "Редактирование принятой резолюции" (в
зависимости от прав).
Если резолюцию накладывает ответственный пункта уже имеющейся резолюции,
то система сначала должна предупреждать пользователя сообщением
"Наложение дополнительной резолюции приведет к удалению работ ваших
исполнителей. Вы действительно хотите это сделать?" По нажатию на кнопку
"Нет" действие не выполняется и пользователь возвращается к окну
информации о работе. По нажатию же "Да" действие выполняется: см.
подраздел "Создание резолюции".
> **Примечание**
>
> Метод получения информации о резолюции описан в javadoc:
>
> kz.arta.synergy.server.api.rest.docs#getResolutions.
>
> Метод сохранения и принятия резолюции описан в javadoc:
>
> kz.arta.synergy.server.api.rest.docs#saveResolutionRoute.
Дочерние работы {#sec.workflow_subsidiary_works}
---------------
Для того, чтобы просмотреть дочерние работы для данной, пользователь должен
провести пальцем от правой стороны плашки работы к левой, при этом раскроется
правая панель дочерних работ к данной (илл. «Дочерние работы»).
![Дочерние работы](resources/img/workflow/subsidiary_works.png)
Родительская работа отличается от дочерних фоном (#efefef) и полужирным
выделением (всегда, независимо от значения поля is_new), отображается в
самом начале списка.
Логика отображения остальных плашек аналогична главному экрану со списком
работ ([Список работ](#sec.workflow_works)).
**Переходы на другие экраны.**
Чтобы перейти к дочерним работам данной дочерней работы, пользователь
проводит пальцем от правой стороны плашки к левой
([Дочерние работы](#sec.workflow_subsidiary_works)).
По нажатию на плашку работы открывается экран информации о работе
([Информация о работе](#sec.workflow_workinfo)).
Если у пользователя есть права на редактирование работы, в результате
долгого нажатия по плашке работы появляется меню, в котором присутствует
пункт "Изменить"
([Создание и редактирование работы](#sec.workflow_work_create)).
Если у пользователя есть права на удаление работы, в результате долгого
нажатия по плашке работы появляется меню, в котором присутствует пункт
"Удалить" ([Удаление работы](#sec.workflow_work_delete)).
По нажатию на кнопку "Назад" пользователь возвращается на 1 (один) уровень
вложенности вверх.
Панель можно скрыть двумя способами (переход из любого уровня вложенности
на главный экран со списком работ):
1. проведя пальцем от левой стороны экрана к правой;
2. нажав по любому месту левой стороны экрана (там, где отображается часть
экрана списка работ).
> **Примечание**
>
> Метод получения списка работ описан в javadoc:
>
> kz.arta.synergy.server.api.rest.works#getSubWorks.
### Действия с работой {#sec.workflow_work_actions}
Далее располагаются управляющие кнопки.
Для каждой работы API будет возвращать информацию о доступном наборе
кнопок, для каждой кнопки указываются: цвета, название, идентификатор
действия, идентификатор операции и значение лейбла.
+------------------------+------------------------+------------------------------+
| Идентификатор действия | Идентификатор операции | Значение лейбла |
+========================+========================+==============================+
| RESOLUTION | | Резолюция |
+------------------------+------------------------+------------------------------+
| COMPLETE | PROCESS | Ответить |
+------------------------+------------------------+------------------------------+
| COMPLETE | PROGRESS | Завершить |
+------------------------+------------------------+------------------------------+
| COMPLETE | POINT_RESULT | Завершить |
+------------------------+------------------------+------------------------------+
| COMPLETE | RESOLUTION_ACTION | Завершить |
+------------------------+------------------------+------------------------------+
| RESULT | | Результат |
+------------------------+------------------------+------------------------------+
| TRANSMIT | | согласно API (передача) |
+------------------------+------------------------+------------------------------+
| REASSIGN | | согласно API (перепоручение) |
+------------------------+------------------------+------------------------------+
| SEND | AGREEMENT | согласно API (согласование) |
+------------------------+------------------------+------------------------------+
| SEND | APPROVAL | согласно API (утверждение) |
+------------------------+------------------------+------------------------------+
| SEND | ACQUAINTANCE | согласно API (ознакомление) |
+------------------------+------------------------+------------------------------+
Кнопки управления могут быть двух типов: одна, выполнение действия
которой является наиболее ожидаемым (зеленого цвета, идентификатор
PREFERRED), и остальные, выполнение действия которых является менее
ожидаемым (серого цвета, идентификатор NOT_PREFERRED).
Кроме вышеперечисленных кнопок в конце данного блока может
отображаться еще одна кнопка, позволяющая подписывать документ
работы. Значение лейбла такой кнопки - "Подписать", она всегда
серого цвета. Подробнее о ее доступности и функциях см. в разделе
["Подписание документа работы"](#sec.workflow_work_sign).
Пример экрана информации о работе без панелей комментариев и вложений
показан на илл. «Информация о работе без комментариев и вложений».
![Информация о работе без комментариев и вложений](resources/img/workflow/work_view5.png)
![Информация о работе без комментариев и вложений](resources/img/workflow/iOS/work_view5.png)
<#include "workflow/workflow_resolution.md">
<#include "workflow/workflow_work_end.md">
<#include "workflow/workflow_work_result.md">
<#include "workflow/workflow_work_send.md">
<#include "workflow/workflow_work_reassign.md">
<#include "workflow/workflow_work_transmit.md">
<#include "workflow/workflow_work_sign.md">
### Создание и редактирование работы {#sec.workflow_work_create}
На экране со списком работ по нажатию на кнопку "+" и выбору пункта меню
создания работы открывается соответствующий экран создания работы
(илл. «Создание работы с 1 шагом»).
![Создание работы с 1 шагом](resources/img/workflow/new_work.png)
![Создание работы с 1 шагом](resources/img/workflow/iOS/new_work.png)
Если у пользователя есть право на редактирование работы, в результате долгого
нажатия по плашке работы появляется меню, в котором присутствует пункт
"Изменить". Пользователь нажимает на этот пункт меню, открывается экран
редактирования работы (илл. «Редактирование работы с 1 шагом»).
![Редактирование работы с 1 шагом](resources/img/workflow/edit_work.png)
![Редактирование работы с 1 шагом](resources/img/workflow/iOS/edit_work.png)
Параметры работы.
+----------------------+-------------------------------------------------------------------------------------------------+---------------------------------------------------------+
| Название параметра | Описание | Значение по умолчанию |
| (поле API) | | |
+======================+=================================================================================================+=========================================================+
| Формулировка работы | Вводится полное название работы. | *Создание* - поле пустое, placeholder - "Введите |
| (NAME) | | формулировку работы". |
| | | |
| | | *Редактирование* - текущее название работы. |
+----------------------+-------------------------------------------------------------------------------------------------+---------------------------------------------------------+
| Ответственный | Открывается экран "Пользователи" (илл. «Экран "Пользователи" со скрытыми тегами»), параметры: | *Создание* - флажок включен, поле пустое, placeholder - |
| (RESPONSIBLE) | | "Выберите ответственного". При отсутствии поля |
| | * выбор одного пользователя; | "Исполнители" флажок недоступен для выключения. |
| | * если значение настройки "разрешено ли передавать работы другим исполнителям" = true, | |
| | отображать всех пользователей, иначе - только подчиненных (включая делегированных | *Редактирование* - флажок отсутствует, само поле |
| | подчиненных); | присутствует всегда (даже если его отображение |
| | * идентификатор действия не указывается. | отключено настройками диалога), заполнено значением |
| | | текущего ответственного. |
| | Поле должно автоматически очиститься и стать неактивным (независимо от его заполненности), | |
| | если выключается флажок. | |
+----------------------+-------------------------------------------------------------------------------------------------+---------------------------------------------------------+
| Автор | Открывается экран "Пользователи" (илл. «Экран "Пользователи" со скрытыми тегами»), параметры: | *Создание* - если настройка приложения "отображать поле |
| (AUTHOR) | | автор при создании работы" = false, поле должно |
| | * выбор одного пользователя; | отсутствовать, иначе - поле активно, заполнено |
| | * отображать неподчиненных или нет не указывается; | авторизованным пользователем. |
| | * идентификатор действия: 101. | |
| | | *Редактирование* - текущий автор работы, неактивно. |
+----------------------+-------------------------------------------------------------------------------------------------+---------------------------------------------------------+
| Исполнители | Открывается экран "Пользователи" (илл. «Экран "Пользователи" со скрытыми тегами»), параметры: | *Создание* - поле пустое, placeholder - "Выберите |
| (USERS) | | исполнителей". |
| | * множественный выбор пользователей; | |
| | * если значение настройки "разрешено ли добавлять соисполнителей к работам, не являющихся | *Редактирование* - поле отсутствует всегда (даже если |
| | подчиненными" = true, отображать всех пользователей, если false: | его отображение включено настройками диалога). |
| | * для значения настройки "ставить ли работы исполнителям от имени ответственного" = | |
| | true, отображать подчиненных ответственного (если таковой выбран); | |
| | * для значения настройки "ставить ли работы исполнителям от имени ответственного" = | |
| | false либо если не был выбран ответственный - отображать подчиненных данного | |
| | пользователя (включая делегированных подчиненных); | |
| | * идентификатор действия не указывается. | |
| | | |
| | Поле должно автоматически очиститься, если сменили ответственного. Поле должно отсутствовать, | |
| | если значение настройки "обязательно ли подписание документов перед отправкой" = true. | |
+----------------------+-------------------------------------------------------------------------------------------------+---------------------------------------------------------+
| Изменить срок | Открывается системное окно ввода даты / времени. | *Создание* - значения запрашиваются с сервера при |
| (DATES) | | открытии экрана. |
| | | |
| | | *Редактирование* - время начала и завершения |
| | | текущей работы. |
+----------------------+-------------------------------------------------------------------------------------------------+---------------------------------------------------------+
| Приоритет | Открывается список для выбора одного из значений, полученных при загрузке приложения | *Создание* - значение запрашивается с сервера при |
| (PRIORITY) | (параметр `current_priorities`). | загрузке приложения (параметр `prority`). |
| | | |
| | | *Редактирование* - значение приоритета текущей работы. |
+----------------------+-------------------------------------------------------------------------------------------------+---------------------------------------------------------+
| Форма завершения | Открывается список из возможных значений, полученных при загрузке приложения (параметр | *Создание* - "Нет". |
| (COMPLETION_FORM) | `work_completion_forms`) и значения "Нет", значение "Нет" должно быть в списке первым. | |
| | Если список форм завершения пуст, поле не должно быть отображено. | *Редактирование* - форма завершения текущей работы. |
| | | Если текущая форма завершения работы отсутствует |
| | | в списке - "Нет". |
+----------------------+-------------------------------------------------------------------------------------------------+---------------------------------------------------------+
| Комментарий к работе | Вводится комментарий к работе. | *Создание* - поле пустое. |
| (COMMENT) | | |
| | | *Редактирование* - поле всегда отсутствует. |
+----------------------+-------------------------------------------------------------------------------------------------+---------------------------------------------------------+
| Добавить файл | Выбирается вариант добавления: "С устройства" / "Сфотографировать". Добавленные файлы | При *создании* и *редактировании* поля пустые. |
| (ATTACH_FILE) | отображаются сразу после кнопок. Отображается только название файла. | |
+----------------------+-------------------------------------------------------------------------------------------------+---------------------------------------------------------+
Экран создания работы может иметь несколько видов, в соответствии с выбранным
пунктом создания. В зависимости от того, какое значение у параметра `special` в
методе получения описания полей, зависит содержимое экрана создания работы:
* `false`: экран должен состоять из одного шага, последовательность параметров
должна соответствовать таблице. В таком случае экран прокручивается, кнопка
«Сохранить» не имеет фиксированного положения.
* `true`: экран может содержать несколько экранов (по количеству массивов в
параметре `steps`), разделенных между собой буллитами. В каждом экране набор
и последовательность параметров определяется API. Переключение между экранами
осуществляется с помощью свайпа вправо/влево (для активного левого экрана
свайп вправо должен отсутствовать, аналогично для активного правого экрана
свайп влево должен отсутствовать). В таком случае экран не прокручивается,
кнопка «Сохранить» и буллиты над ней имеют фиксированное положение внизу экрана.
![Создание работы с несколькими шагами](resources/img/workflow/new_work2.png)
![Создание работы с несколькими шагами](resources/img/workflow/iOS/new_work2.png)
Экран редактирования работы всегда имеет только один вид, который соответствует
дефолтному (параметр `default` = `true`) экрану создания работы. С параметром
`special` здесь аналогично:
* `false`: экран должен состоять из одного шага, последовательность параметров
должна соответствовать таблице. В таком случае экран прокручивается, кнопка
«Сохранить» не имеет фиксированного положения.
* `true`: экран может содержать несколько экранов (по количеству массивов в
параметре `steps`), разделенных между собой буллитами. В каждом экране набор
и последовательность параметров определяется API. Переключение между экранами
осуществляется с помощью свайпа вправо/влево (для активного левого экрана
свайп вправо должен отсутствовать, аналогично для активного правого экрана
свайп влево должен отсутствовать). В таком случае экран не прокручивается,
кнопка «Сохранить» и буллиты над ней имеют фиксированное положение внизу экрана.
Во всех случаях все поля экрана не имеют фиксированной высоты, а заголовком
экрана создания работы должно являться соответствующее название пункта (параметр
`name`). Заголовком же экрана редактирования всегда должно являться название
дефолтного экрана создания работы.
![Редактирование работы с несколькими шагами](resources/img/workflow/edit_work2.png)
![Редактирование работы с несколькими шагами](resources/img/workflow/iOS/edit_work2.png)
При создании работы файл добавляется в папку "Приложения", при редактировании
работы - в "Приложения", если есть доступ, в "Прочие", если доступа нет
(выбор в какую папку файлы должны быть добавлены осуществляется на сервере,
указывать на клиенте это не нужно).
В результате нажатия по вложению выбранный файл скачивается на устройство и
открывается его системными средствами. Если вложение имеет расширение
`asfdocx`, то такой файл должен открываться в [проигрывателе формы](#forms_view).
> **Примечание:**
>
> Для версий мобильного приложения 3.6 и ниже поведение при нажатии
> по плашке вложения, имеющего расширение `asfdocx`, следующее:
> если форма имеет печатное представление, то файл по форме должен
> скачиваться в pdf-версии согласно шаблона печатного представления,
> иначе необходимо выдавать сообщение-ошибку:
>
> `Действие не может быть выполнено, т.к. форма не имеет печатного
> представления`
>
> Для версий мобильного приложения 3.6 и ниже поведение при долгом
> нажатии по плашке вложения, имеющего расширение `asfdocx`,
> следующее: если форма имеет мобильное представление и у
> пользователя есть право редактирования файла, то появляется
> меню "Действия", в котором присутствует пункт "Изменить" (первым
> в списке). Пользователь нажимает на этот пункт меню и
> приложение открывает экран редактирования файла по форме в
> мобильном представлении, аналогичный форме завершения "форма"
> ([Проигрыватель формы](#forms_view)). Если были внесены
> изменения, то в случае успешного сохранения на сервере должна
> сохраниться текущая версия формы, но увеличиться версия данных.
Для удаления только что добавленного файла пользователь долго нажимает на
плашку вложения и в появившемся меню "Действия" выбирает пункт "Удалить".
Открывается окно подтверждения удаления с сообщением
`Вы действительно хотите удалить данный файл?`
Если пользователь подтверждает удаление, отправляется запрос на
сервер для удаления. В случае успешного выполнения плашка удаляется
из списка, иначе - отображается сообщение об ошибке.
Если пользователь на экране нажимает на кнопку "Назад", мобильный клиент
возвращает экран со списком работ в том состоянии, которое было до вызова
данного экрана.
После ввода всех необходимых параметров работы пользователь нажимает на
кнопку "Создать" / "Сохранить". Действие создания/сохранения выполняется
при выполнении следующих условий:
* заполнена формулировка работы;
* для включенного флажка заполнено поле "Ответственный", для выключенного
- поле "Исполнители";
* заполнено поле "Автор" работы;
* заполнены сроки, причем дата начала меньше даты завершения;
* в поле "Приоритет" выбран нескрытый приоритет.
В случае успешного сохранения открывается экран со списком работ. Если была
создана новая работа - она вставляется в верх списка. Плашка измененной
работы обновляется (обновление всего списка не требуется).
В случае неуспешного - выдается сообщение об ошибке, действие выполняться
не должно, пользователь остается на экране создания / редактирования работы.
* Если не введены формулировка работы и/или ответственный (для включенного
флажка) - ошибка:
`Заполните все поля`
* Если для выключенного флажка не выбрано ни одного исполнителя - ошибка:
`Работа не может быть создана: не указан ни ответственный, ни
исполнители`
* Если у просроченной работы был изменен ответственный - ошибка:
`Вы не можете изменить ответственного у просроченной работы. Измените
дату завершения.`
* Если у обычной (непросроченной) работы был изменен ответственный -
предупреждающее сообщение:
`Вы действительно хотите изменить ответственного? Данная работа будет
удалена. Вместо нее будет создана аналогичная для нового пользователя с
датой начала от текущего числа.`
и действиями "Да" и "Нет".
* Работы, для которых уже был назначен приоритет, который впоследствии
скрыли, сохраняют его значение и цвет до тех пор, пока работу не откроют
на редактирование (он все еще должен являться значением компонента, но
при этом должен отсутствовать в выпадающем списке). Ошибка:
`Выбранный приоритет работы отсутствует в справочнике приоритетов.
Выберите другое значение.`
> **Примечание**
>
> Метод получения описания полей диалога создания работы:
>
> kz.arta.synergy.server.api.rest.works.WorkFlowService#getWorkDialogs
>
> Метод получения дефолтных полей для создания новой работы:
>
> kz.arta.synergy.server.api.rest.works.WorkFlowService#getDefaultWorkFields
>
> Метод добавления работы:
>
> kz.arta.synergy.server.api.rest.works.WorkFlowService#createWork
>
> Метод изменения работы:
>
> kz.arta.synergy.server.api.rest.works.WorkFlowService#saveWork
>
> Метод добавления файла:
>
> kz.arta.synergy.server.api.rest.works.WorkFlowService#createAttachment
> (параметр path должен отсутсвовать)
>
> Метод добавления комментария:
>
> kz.arta.synergy.server.api.rest.works.WorkFlowService#addComment
Удаление работы {#sec.workflow_work_delete}
---------------
Если у пользователя есть право на удаление работы, в результате долгого нажатия
по плашке работы появляется меню, в котором присутствует пункт "Удалить".
Пользователь нажимает на этот пункт меню и приложение запрашивает подтверждение
выполнения действия с сообщением:
`Вы действительно хотите удалить данную работу %формулировка_работы%?`
Если пользователь подтверждает удаление работы, отправляется запрос на сервер
для удаления. В случае успешного выполнения плашка удаляется из списка, иначе -
отображается сообщение об ошибке.
> **Примечание**
>
> Метод удаления работы:
>
> kz.arta.synergy.server.api.rest.works.WorkFlowService#deleteWork
#### Завершение работы (идентификатор действия COMPLETE) {#sec.workflow_work_end}
В зависимости от атрибутов работы, завершение может быть осуществлено
одним из следующих способов:
- Идентификатор операции - **PROCESS**: завершение с выполнением
действия (согласования, ознакомления или утверждения);
- Идентификатор операции - **PROGRESS**: завершение выставлением
прогресса;
- Идентификатор операции - **POINT\_RESULT**: завершение с выбором
результата работы;
- Идентификатор операции - **RESOLUTION\_ACTION**: завершение процесса
резолюции.
<#include "workflow/workflow_work_end_with_process.md">
<#include "workflow/workflow_work_end_without_forms.md">
<#include "workflow/workflow_work_end_with_forma.md">
<#include "workflow/workflow_work_end_resolution.md">
##### Завершение процесса резолюции {#sec.workflow_work_end_resolution}
Пользователь нажимает на кнопку "Завершить" - открывается экран
"Внимание" (илл. «Завершение процесса "резолюция", вариант 1», илл.
«Завершение процесса "резолюция", вариант 2»). Для завершения действия
по процессу резолюции API будет возвращать следующую информацию:
- информация о наборе функциональных кнопок и для каждой из них:
название, цвет, действие;
- текст сообщения.
![Завершение процесса "резолюция", вариант 1](resources/img/workflow/attention_1.png)
![Завершение процесса "резолюция", вариант 1](resources/img/workflow/iOS/attention_1_ios.png)
![Завершение процесса "резолюция", вариант 2](resources/img/workflow/attention_2.png)
![Завершение процесса "резолюция", вариант 2](resources/img/workflow/iOS/attention_2_ios.png)
Функциональные кнопки имеют фиксированное положение. Вся остальная
область экрана прокручиваема.
Параметры завершения процесса резолюции. Вариант 1 - нет ни одной
принятой резолюции на документе для выключенной опции конфигуратора
"Разрешить накладывать дополнительные резолюции" либо данная опция
включена, при этом пользователь имеет право принятия резолюции.
------------------------------------------------------------------------------------------------------------------------------------------------------------
Параметр Значение
----------------------------------------------------------- ------------------------------------------------------------------------------------------------
Текстовое сообщение (формулировка текста передается API): **Данный тип работы предполагает принятие резолюции. Вы хотите сделать это сейчас?**
Для принятия резолюции нажмите кнопку "Резолюция", для завершения работы - кнопку "Завершить".
------------------------------------------------------------------------------------------------------------------------------------------------------------
Цвет первого абзаца - #717171, второго - #353535.
Для варианта 1 функциональных кнопок должно быть две: "Резолюция" (с
идентификатором PREFERRED) и "Завершить" (с идентификатором
NOT_PREFERRED).
Параметры завершения процесса резолюции. Вариант 2 - на документе есть
одна принятая резолюция для выключенной опции конфигуратора "Разрешить
накладывать дополнительные резолюции", либо принятие резолюции
недоступно согласно хода выполнения документа, либо у пользователя
отсутствует право принятия резолюции.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Параметр Значение
----------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------
Текстовое сообщение (формулировка текста передается API): **Завершить работу? Действие "Резолюция" по этому документу недоступно.**
Возможные причины:
1. У вас недостаточно прав для принятия резолюции.
2. Одна резолюция на документе уже имеется, а принятие нескольких резолюций не допускается согласно текущим настройкам системы.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Цвет первого абзаца - #717171, второго - #353535.
Для варианта 2 функциональная кнопак должна быть одна: "Завершить" (с
идентификатором PREFERRED).
Если пользователь нажимает на кнопку "Назад", возвращается экран
информации о работе в том же состоянии, что и до завершения работы.
По нажатию на кнопку "Резолюция" должен открываться экран резолюции
([Работа с резолюциями](#sec.workflow_resolution)):
- если данный пользователь еще не принимал резолюцию на данный
документ - экран создания новой резолюции;
- если данный пользователь сохранял черновик резолюции на данном
документе - экран редактирования черновика резолюции;
- если данный пользователь уже принимал резолюцию на данный документ -
экран редактирования принятой резолюции.
В случае успешного выполнения действия открывается экран информации о
работе, информация обновляется. В случае неуспешного - выдается
сообщение об ошибке, пользователь остается на данном экране.
По нажатию на кнопку "Завершить" работа сразу (без подтверждения
действия) должна завершиться. В результате успешного выполнения действия
происходит возврат к списку работ, в котором обновляется плашка данной
работы. В случае неудачного выполнения пользователь остается на этом же
экране.
> **Замечание**
>
> Метод API для получения информации о построении окна
> rest/api/workflow/screen_resolution_info.
##### Завершение с результатом работы (идентификатор операции POINT\_RESULT) {#sec.workflow_work_end_with_forma}
<#include "workflow/workflow_work_end_with_forma_file.md">
<#include "workflow/workflow_work_end_with_forma_comment.md">
<#include "workflow/workflow_work_end_with_forma_form.md">
###### Форма завершения - комментарий {#sec.workflow_work_end_with_forma_comment}
Внешний вид экрана зависит от того, есть ли подтвержденные результаты
дочерних работ или нет. Для того, чтобы это узнать, необходимо вызвать
метод API kz.arta.synergy.server.api.rest.works#getWorkCompletionData.
Если список previous_results не пустой - значит существуют
подтвержденные результаты дочерних работ, иначе - не существуют.
Метод API для выставления результата один и тот же как для работ, у
которых есть результат дочерних работ, так и для тех у которых нет:
kz.arta.synergy.server.api.rest.works#setWorkResult.
**Завершение работы, у которой нет результатов дочерних работ.**
Пользователь выставляет 100% прогресса либо нажимает на кнопку
"Завершить" - открывается экран "Результат" для ввода комментария в
качестве формы завершения (илл. «Завершение работы, у которой нет
результатов дочерних работ (форма завершения - комментарий)»).
![Завершение работы, у которой нет результатов дочерних работ (форма завершения - комментарий)](resources/img/workflow/work_result_comment.png)
![Завершение работы, у которой нет результатов дочерних работ (форма завершения - комментарий)](resources/img/workflow/iOS/work_result_comment.jpg)
Лейбл "Введите комментарий" и кнопка "Готово" имеют фиксированное
положение. Панель для ввода комментария прокручиваема.
Пользователь вводит текст комментария.
Если пользователь нажимает на кнопку "Назад", возвращается экран
информации о работе в том же состоянии, что и до завершения работы.
Если пользователь нажимает на кнопку "Готово", но результат работы не
выбран, приложение отображает сообщение "Выберите результат работы" и не
выполняет действие.
Если пользователь нажимает на кнопку "Готово", мобильный клиент
возвращает пользователя к экрану информации о работе, информация
обновляется.
> **Замечание**
>
> Метод API для задания результата такой же как и для формы завершения
> "файл" kz.arta.synergy.server.api.rest.works#setWorkResult
**Завершение работы, у которой есть результаты дочерних работ.**
Пользователь выставляет 100% прогресса либо нажимает на кнопку
"Завершить" - открывается экран "Результат" для ввода/указания
комментария в качестве формы завершения (илл. «Завершение работы, у
которой есть результаты дочерних работ (форма завершения -
комментарий)»).
![Завершение работы, у которой есть результаты дочерних работ (форма завершения - комментарий)](resources/img/workflow/work_result_comment2.png)
![Завершение работы, у которой есть результаты дочерних работ (форма завершения - комментарий)](resources/img/workflow/iOS/work_result_comment2.jpg)
Кнопка "Готово" имеет фиксированное положение. Обе панели данного экрана
("Выберите из перепорученных" и "Или введите комментарий") прокручиваемы
каждая внутри и должны занимать по 50% площади экрана.
Результат работы может быть введен тем же способом, как и для работы без
дочерних результатов, а так же выбран из результатов дочерних работ.
Если пользователь в качестве результата выбирает результат дочерней
работы, на сервер должен быть передан идентификатор результата дочерней
работы.
Для этого пользователю необходимо на панели "Выберите из перепорученных"
нажать на один из результатов, при этом выбранный результат отмечается в
списке фоном, его название копируется в поле "Результат работы", если до
этого был выделен другой комментарий работы, то выделение его в списке
отменяется.
Если пользователь выбирает в качестве результата результат дочерней
работы и вносит в него изменения, считается, что это новый результат и
выделение ранее выбранного результата в списке отменяется.
Если пользователь нажимает на кнопку "Назад", возвращается экран
информации о работе в том же состоянии, что и до завершения работы.
Если пользователь нажимает на кнопку "Готово", но комментарий-результат
не задан, приложение должно отобразить сообщение "Выберите результат
работы" и не выполнять действие.
Если пользователь нажимает на кнопку "Готово", мобильный клиент
возвращает пользователя к экрану информации о работе, информация
обновляется.
###### Форма завершения - файл {#sec.workflow_work_end_with_forma_file}
Внешний вид экрана зависит от того, есть ли подтвержденные результаты
дочерних работ или нет. Для того, чтобы это узнать, необходимо вызвать
метод API kz.arta.synergy.server.api.rest.works#getWorkCompletionData.
Если список previous_results не пустой - значит существуют
подтвержденные результаты дочерних работ, иначе - не существуют.
Метод API для выставления результата один и тот же как для работ, у
которых есть результат дочерних работ, так и для тех у которых нет:
kz.arta.synergy.server.api.rest.works#setWorkResult.
**Завершение работы, у которой нет результатов дочерних работ.**
Пользователь выставляет 100% прогресса либо нажимает на кнопку
"Завершить" - открывается экран "Результат" для выбора файла в качестве
формы завершения (илл. «Завершение работы, у которой нет результатов
дочерних работ (форма завершения - файл)»).
![Завершение работы, у которой нет результатов дочерних работ (форма завершения - файл)](resources/img/workflow/work_result_file.png)
![Завершение работы, у которой нет результатов дочерних работ (форма завершения - файл)](resources/img/workflow/iOS/work_result_file.jpg)
Кнопка "Готово" не имеет фиксированного положения. Весь экран
прокручиваемый.
Результат работы может быть выбран следующими способами.
1. Из файлов работы. При выделении файла (tap) в списке фон
соответствующего элемента меняется, в поле "Результат работы"
копируется название выделенного файла. При долгом нажатии (долгий
tap) файл открывается для просмотра (просмотр осуществляется
системными средствами устройства). Если ранее был выбран файл из
списка, его выделение отменяется.
2. "С устройства" - пользователь выбирает один из файлов, имеющихся на
устройстве, при этом название выбранного файла копируется в поле
"Результат работы". Если ранее был выбран файл из списка, его
выделение отменяется.
3. "Сфотографировать" - пользователь делает новый снимок, используя
фотовозможности устройства, при этом название выбранного файла
копируется в поле "Результат работы". Если ранее был выбран файл из
списка, его выделение отменяется.
> **Замечание**
>
> При выборе нового файла как результата выполнения работы (выбор с
> устройства) отображать иконку файла не нужно. При добавлении новой
> фотографии необходимо отображать вместо иконки превью изображения.
Уже выбранный файл в поле "Результат работы" также можно просмотреть,
нажав по нему (tap). Просмотр также осуществляется системными средствами
устройства.
Если пользователь нажимает на кнопку "Назад", возвращается экран
информации о работе в том же состоянии, что и до завершения работы.
Если пользователь нажимает на кнопку "Готово", но файл результата не
задан, приложение должно отобразить сообщение "Выберите результат
работы" и не выполнять действие.
Если пользователь нажимает на кнопку "Готово", мобильный клиент
возвращает пользователя к экрану информации о работе, информация
обновляется.
**Завершение работы, у которой есть результаты дочерних работ.**
Пользователь выставляет 100% прогресса либо нажимает на кнопку
"Завершить" - открывается экран "Результат" для выбора файла в качестве
формы завершения (илл. «Завершение работы, у которой есть результаты
дочерних работ (форма завершения - файл)»).
![Завершение работы, у которой есть результаты дочерних работ (форма завершения - файл)](resources/img/workflow/work_result_file2.png)
![Завершение работы, у которой есть результаты дочерних работ (форма завершения - файл)](resources/img/workflow/iOS/work_result_file2.jpg)
Кнопка "Готово" не имеет фиксированного положения. Весь экран
прокручиваемый.
Результат работы может быть выбран теми же способами, как и для работы
без дочерних результатов, а так же выбором одного из результатов
дочерних работ.
Если пользователь в качестве результата выбирает результат дочерней
работы, на сервер должен быть передан идентификатор результата дочерней
работы.
Для этого пользователю необходимо перейти к вкладке результатов дочерних
работ "Перепорученные" и нажать (tap) на один из результатов, при этом
выбранный результат отмечается в списке фоном, его название копируется в
поле "Результат работы". При долгом нажатии (долгий tap) файл
открывается для просмотра (просмотр осуществляется системными средствами
устройства).
Если до этого был выделен другой файл работы (будь то из вкладки "Из
работы" или "Перепорученные"), его выделение в списке отменяется.
Если пользователь нажимает на кнопку "Назад", возвращается экран
информации о работе в том же состоянии, что и до завершения работы.
Если пользователь нажимает на кнопку "Готово", но файл результата не
задан, приложение должно отобразить сообщение "Выберите результат
работы" и не выполнять действие.
Если пользователь нажимает на кнопку "Готово", мобильный клиент
возвращает пользователя к экрану информации о работе, информация
обновляется.
###### Форма завершения - форма {#sec.workflow_work_end_with_forma_form}
Внешний вид экрана зависит от того, есть ли подтвержденные
результаты дочерних работ или нет. Для того, чтобы это узнать,
необходимо вызвать метод API
`kz.arta.synergy.server.api.rest.works#getWorkCompletionData`
Если список `previous_results` не пустой - значит существуют
подтвержденные результаты дочерних работ, иначе - не
существуют.
Метод API для выставления результата один и тот же как для
работ, у которых есть результат дочерних работ, так и для
тех, у которых нет:
`kz.arta.synergy.server.api.rest.works#setWorkResult`.
**Завершение работы, у которой нет результатов дочерних работ.**
Пользователь выставляет 100% прогресса либо нажимает на
кнопку "Завершить". Открывается экран
[проигрывателя формы](#forms_view) для заполнения файла по
форме. Экран, по сравнению со стандартным проигрывателем,
урезан:
* отсутствует иконка "Сохранить", основное действие по
кнопке "Готово";
* в меню отсутствуют пункты переключения в режим
просмотра, скачивания и просмотра информации, т.е.
доступно только переключение между мобильным
представлением и основным в режиме редактирования.
> **Примечание**
>
> В версиях мобильного приложения 3.6 и ниже после того,
> как пользователь выставляет 100% прогресса либо нажимает
> на кнопку "Завершить", необходимо вызвать метод API
> rest/api/asforms/form/{formID}. Если значение параметра
> **isMobile** = false, то выдавать сообщение-ошибку:
>
> `Действие не может быть выполнено, т.к. форма не имеет
> мобильного представления`
>
> и не выполнять действие. Если **isMobile** = true, то
> необходимо открывать экран "Результат" для заполнения
> файла по форме в мобильном представлении ([Проигрыватель формы](#forms_view)).
Чтобы получить форму, необходимо вызвать метод API
`rest/api/asforms/form/{formID}`, чтобы получить данные
формы - `rest/api/asforms/data/{formID}`.
> **Примечание**
>
> В версиях мобильного приложения 3.6 и ниже
> мобильное представление поддерживает только 4 компонента
> (лейбл, однострочное и мнострочное поле, выпадающий
> список), все они должны отрисовываться как стандартные
> компоненты в любом другом экране приложения. Кнопка
> "Готово" имеет фиксированное положение, вся остальная
> область экрана прокручиваема.
Если пользователь нажимает на кнопку "Назад", возвращается
экран информации о работе в том же состоянии, что и до
завершения работы.
Если пользователь нажимает на кнопку "Готово", данные по
форме должны сохраниться в отдельный файл в "Прочих". Имя
такого файла должно быть составлено по формату
`%Название формы% - %Фамилия И.О. сохранившего%`
Мобильный клиент возвращает пользователя к экрану
информации о работе, информация обновляется.
**Завершение работы, у которой есть результаты дочерних работ.**
Пользователь выставляет 100% прогресса либо нажимает на
кнопку "Завершить". Открывается экран "Результат" для
выбора либо заполнения файла по форме.
> **Примечание**
>
> В версиях мобильного приложения 3.6 и ниже после того, как
> пользователь выставляет 100% прогресса либо нажимает на
> кнопку "Завершить", необходимо вызвать метод API
> rest/api/asforms/form/{formID}. Если значение параметра
> **isMobile** = false, то выдавать сообщение-ошибку
> "Действие не может быть выполнено, т.к. форма не имеет
> мобильного представления" и не выполнять действие.
> Если **isMobile** = true, то необходимо открывать экран
> "Результат" для выбора/заполнения файла по форме в
> мобильном представлении ([Проигрыватель формы](#forms_view)).
![Завершение работы, у которой есть результаты дочерних работ (форма завершения - форма)](resources/img/workflow/work_result_form2.png)
![Завершение работы, у которой есть результаты дочерних работ (форма завершения - форма)](resources/img/workflow/iOS/work_result_form2_ios.png)
Кнопка "Готово" имеет фиксированное положение, вся
остальная область экрана (панели "Перепорученные" и
"Результат работы") прокручиваемы.
Результат работы может быть выбран из результатов
дочерних работ: в таком случае на сервер должен быть
передан идентификатор результата дочерней работы.
Для этого пользователю необходимо на панели
"Перепорученные" нажать на один из результатов, при
этом выбранный результат отмечается в списке фоном,
его название копируется в поле «Результат работы».
При долгом нажатии (долгий tap) по результату работы
открывается [проигрыватель формы](#forms_view) только
для просмотра файла по форме. Экран, по сравнению со
стандартным проигрывателем, урезан:
* отсутствует иконка "Сохранить", основное действие по
кнопке "Готово";
* в меню отсутствуют пункты переключения в режим
редактирования, скачивания и просмотра информации,
т.е. доступно только переключение между мобильным
представлением и основным в режиме просмотра.
Кроме того, пользователь может создать новый результат
работы, используя кнопку "+" на верхней панели. По ее
нажатию открывается экран [проигрывателя формы](#forms_view)
для заполнения файла по форме. Экран, по сравнению со
стандартным проигрывателем, урезан:
* отсутствует иконка "Сохранить", основное действие по
кнопке "Готово";
* в меню отсутствуют пункты переключения в режим
просмотра, скачивания и просмотра информации, т.е.
доступно только переключение между мобильным
представлением и основным в режиме редактирования.
> **Примечание**
>
> В версиях мобильного приложения 3.6 и ниже после выбора
> пользователем на панели "Перепорученные" одного из
> результатов, выбранный результат отмечается в списке
> фоном и в панели "Результат работы" отображается данные
> файла по форме.
> ![Завершение работы, у которой есть результаты дочерних работ (форма завершения - форма) для версий 3.6 и ниже](resources/img/workflow/work_result_form2_36.png)
> ![Завершение работы, у которой есть результаты дочерних работ (форма завершения - форма) для версий 3.6 и ниже](resources/img/workflow/iOS/work_result_form2_ios_36.png)
> По нажатию на кнопку "Готово" :
>
> - если пользователь вносил изменения в панели "Результат
> работы:", то данные по форме должны сохраниться в
> отдельный файл в "Прочих", имя такого файла должно быть
> составлено по формату "%Название формы% - %Фамилия И.О.
> сохранившего%";
>
> - если пользователь ничего не изменял в выбранном из
> перепорученных файле по форме, то результатом данной
> работы необходимо считать тот выбранный файл по форме.
Если пользователь нажимает на кнопку "Назад",
возвращается экран информации о работе в том же
состоянии, что и до завершения работы.
Если пользователь нажимает на кнопку «Готово», но файл
результата не задан, приложение должно отобразить
сообщение:
`Выберите результат работы`
и не выполнять действие.
Если пользователь нажимает на кнопку «Готово», мобильный
клиент возвращает пользователя к экрану информации о
работе, информация обновляется.
##### Завершение с действием (идентификатор операции PROCESS) {#sec.workflow_work_end_with_process}
Пользователь нажимает на кнопку "Ответить" - открывается экран
(илл. «Экран утверждения»). Для каждого действия API будет
возвращать следующую информацию:
- необходимо ли подписывание действия (`demandSign`);
- информация о наборе функциональных кнопок (`buttons`) и для
каждой из них: название (`label`), цвет (`color`), действие
(`signal`);
- необходимо ли наличие поля для комментария
(`need_comment_input`);
- обязателен ли ввод комментария (`need_enter_positive_comment`
и `need_enter_negative_comment`);
- закодированная строка для идентификации подписываемых данных
(`raw_data`).
![Экран согласования без использования ЭЦП](resources/img/workflow/edi_turned_off.png)
![Экран согласования без использования ЭЦП](resources/img/workflow/iOS/edi_turned_off_ios.png)
![Экран согласования, файл ЭЦП еще не выбран](resources/img/workflow/edi_not_choosen.png)
![Экран согласования, файл ЭЦП еще не выбран](resources/img/workflow/iOS/edi_not_choosen_ios.png)
![Экран согласования, файл ЭЦП выбран](resources/img/workflow/edi_choosen.png)
![Экран согласования, файл ЭЦП выбран](resources/img/workflow/iOS/edi_choosen_ios.png)
Все кнопки имеют фиксированное положение внизу экрана. Вся
остальная область прокручиваема.
Параметры завершения с действием.
+------------------------+-----------------------------------------+
| Параметр работы | Описание |
+========================+=========================================+
| Добавить подпись | Флажок |
+------------------------+-----------------------------------------+
| Использовать ЭЦП | Флажок |
+------------------------+-----------------------------------------+
| Просмотреть информацию | Кликабельный лейбл |
| о выбранной ЭЦП | |
+------------------------+-----------------------------------------+
| Комментарий | Многострочное поле ввода, placeholder - |
| | "Введите комментарий" |
+------------------------+-----------------------------------------+
Флажок *"Добавить подпись"* для каждого из типов действия
имеет значение по умолчанию в зависимости от настройки
необходимо ли подписывание действия `demandSign`:
* "да" - флажку устанавливается значение "Вкл", его
изменение недоступно;
* "нет" - флажку устанавливается значение "Выкл", его
изменение доступно.
Добавление подписи фиксируется в метаданных документа с
сохранением его хеша.
Если функция ЭЦП настроена на стороне сервера (поле API
`enableEDS = true`), а также при наличии цифровой подписи
на устройстве, возможно его использование при подписании.
Флажок *"Использовать ЭЦП"* доступен, только если
"Добавить подпись" = "Вкл". Значение по умолчанию зависит
от настроек, полученных при загрузке приложения (требовать
ли ключ и сертификат, параметр в API: `needCert`):
* "да" - флажку устанавливается значение "Вкл", его
изменение недоступно;
* "нет" - флажку устанавливается значение "Выкл", его
изменение доступно.
> Примечание.
>
> В случае, если выключается доступный флажок "Добавить
> подпись", то флажок "Использовать ЭЦП" должен выключаться
> и становиться недоступным автоматически, независимо от
> его предыдущего состояния.
Если функция ЭЦП не настроена на стороне сервера (поле API
`enableEDS = false`), то:
* при наличии требования ключа и сертификата (`needCert =
true`) - не открывая экран необходимо вывести ошибку:
`Вы не можете использовать ЭЦП. Данная функция не
настроена. Обратитесь к администратору.`
* иначе - флажок "Использовать ЭЦП" всегда недоступен и
имеет значение "Выкл".
Кликабельный лейбл *Просмотреть информацию о выбранной ЭЦП*
отображается только в том случае, если файл ЭЦП уже выбран.
По его нажатию открывается экран с информацией (см. ниже).
Многострочное *поле для комментария*, по умолчанию, пустое и
отображает placeholder. В зависимости от настроек, может быть
обязательным для ввода.
Для значения "Использовать ЭЦП" = "Выкл" внизу экрана
отображаются только функциональные кнопки (состав, их
названия и стили возвращаются из API). Например, "Согласен"
и "Не согласен", "Утверждаю" и "Не утверждаю", "Ознакомлен".
Для значения "Использовать ЭЦП" = "Вкл" внизу экрана
отображаются:
* файл ЭЦП не выбран - только кнопка "Выбрать ЭЦП" зеленого
цвета (идентификатор PREFERRED);
* файл ЭЦП выбран - сначала функциональные кнопки, затем
кнопка "Изменить ЭЦП" серого цвета (идентификатор
NOT_PREFERRED).
**Информация о выбранной ЭЦП.**
Нажатие по кликабельному лейблу "Просмотреть информацию о
выбранной ЭЦП" открывает экран "Информация", в которой
отображаются следующие параметры:
+--------------+------------------+---------------------------+
| Поле | Параметр ЭЦП | Пример |
+==============+==================+===========================+
| ИИН | KEY_SERIALNUMBER | IIN910511450249 |
+--------------+------------------+---------------------------+
| Основное имя | KEY_CN | САРСЕМБАЕВА МЕРУЕРТ |
+--------------+------------------+---------------------------+
| Отчество | KEY_GIVENNAME | КОКЕШЕВНА |
+--------------+------------------+---------------------------+
| Организация | KEY_O | АО "НАЦИОНАЛЬНАЯ КОМПАНИЯ |
| | | "КАЗАХСКОЕ ИНФОРМАЦИОННОЕ |
| | | АГЕНТСТВО" |
+--------------+------------------+---------------------------+
| Истекает | | 31.12.2016 |
+--------------+------------------+---------------------------+
> Примечание.
>
> Если ЭЦП выдано на физическое лицо, поле "Организация"
> должно отсутствовать.
С данного экрана возможен только возврат на предыдущий экран
с помощью кнопки "Назад".
![Информация о выбранной ЭЦП](resources/img/workflow/edi_information.png)
![Информация о выбранной ЭЦП](resources/img/workflow/iOS/edi_information_ios.png)
**Кнопка "Выбрать ЭЦП".**
> Примечание.
>
> Для подписания документов с использованием ЭЦП предварительно
> необходимо загрузить файл сертификата на устройство. Мобильным
> приложением поддерживаются только ЭЦП с алгоритмом RSA.
>
> Для ОС Android достаточно скопировать файл ЭЦП в любую папку
> подключенного к компьютеру смартфона с помощью проводника.
>
> Для iOS необходимо воспользоваться фирменной утилитой iTunes.
> При подключенном смартфоне перейти в «iPhone» - «Настройки» -
> «Программы». Найти среди списка программ мобильное приложение
> Synergy и добавить файл ЭЦП в хранилище с компьютера на
> смартфон через кнопку «Добавить файл…».
После включения флажка "Использовать ЭЦП" внизу экрана
отображается единственная кнопка "Выбрать ЭЦП". По ее нажатию,
в зависимости от того, происходил ли выбор ЭЦП в приложении
ранее, открывается:
*в ОС Android:*
* ЭЦП ранее не использовалось - окно (не экран) файлового
менеджера (аналогичный выбору файла с устройства) с
фильтром, позволяющим отображать в папках только файлы
цифровых подписей (с расширением `р12` и `pfx`).
Если в данном окне пользователь нажимает на кнопку
"Назад" / "Отмена" / либо вне области окна, возвращается
экран завершения в том же состоянии, что и до нажатия
кнопки "Выбрать ЭЦП".
Если же пользователь нажимает на кнопку "Ок", не выбрав
файл, необходимо закрывать окно и выдавать сообщение:
`Выберите файл ЭЦП`
Пользователь выбирает файл ЭЦП и нажимает на кнопку
"Ок", открывается экран "Пароль ЭЦП".
* ЭЦП ранее использовалось - сразу экран "Пароль ЭЦП", в
котором уже выбран файл последнего использовавшегося
сертификата.
*в iOS:*
* ЭЦП ранее не использовалось - экран файлов приложения
"ЭЦП" (куда предварительно загружен файл ЭЦП) с
фильтром, позволяющим отображать только файлы цифровых
подписей (с расширением `р12` и `pfx`).
Если на данном экране пользователь нажимает на кнопку
"Назад", возвращается экран завершения в том же
состоянии, что и до нажатия кнопки "Выбрать ЭЦП".
Выделение строки - действие tap. После выделения
файла пользователь нажимает на кнопку "Выбрать".
Действие выполняется, только если выделен какой-либо
файл, иначе необходимо выдавать сообщение:
`Файл не выбран`
и не выполнять действие. В случае успешного выполнения
открывается экран "Пароль ЭЦП".
![Выбор ЭЦП в iOS](resources/img/workflow/iOS/edi_chooser_ios.png)
* ЭЦП ранее использовалось - сразу экран "Пароль ЭЦП",
в котором уже выбран файл последнего использовавшегося
сертификата.
В обоих вариантах под вариантом "ЭЦП ранее не использовалось"
подразумевается, в том числе, сброс текущего выбранного
значения ЭЦП при выходе из приложения (с помощью кнопки
"Выйти" в [настройках](#sec.settings)).
*Пароль ЭЦП.*
Параметры экрана ввода пароля.
+----------------------+------------------------------+
| Параметр экрана | Описание |
+======================+==============================+
| %название_файла_ЭЦП% | Поле ввода пароля, |
| | placeholder "Введите пароль" |
+----------------------+------------------------------+
| Подписать | Кнопка |
+----------------------+------------------------------+
| Изменить ЭЦП | Кнопка |
+----------------------+------------------------------+
Обязательное *поле ввода пароля* с лейблом, содержащим
полное название файла ЭЦП. В данное поле вводится пароль
к сертификату.
По нажатию на *кнопку "Подписать"* происходит валидация
пароля, и в случае успешного пароля - валидация самой
подписи. В случае успешной валидации подписи открывается
экран завершения в состоянии "выбранного ЭЦП":
* отображается кликабельный лейбл "Просмотреть
информацию о выбранной ЭЦП";
* после функциональных кнопок добавляется кнопка
"Изменить ЭЦП" серого цвета (идентификатор
NOT_PREFERRED).
Возможно исполнение альтернативных потоков событий 1-6.
Если на экране "Пароль ЭЦП" пользователь нажимает на
кнопку "Назад", возвращается экран завершения в том же
состоянии, что и до нажатия кнопки "Выбрать ЭЦП".
По нажатию на *кнопку "Изменить ЭЦП"* открывается окно/
экран выбора файла ЭЦП. При этом текущее выбранное
значение удаляется.
*Альтернативные потоки событий.*
* Альтернативный поток №1: не заполнено поле пароля.
Действие не осуществляется, выходит ошибка:
`Введите пароль`
* Альтернативный поток №2: введен некорректный пароль.
Действие не осуществляется, выходит ошибка:
`Неверный пароль`
* Альтернативный поток №3: выбранный ключ просрочен.
Действие не осуществляется, выходит ошибка:
`Указанный ключ просрочен. Выберите другой ключ и
повторите попытку.`
* Альтернативный поток №4: выбранный ключ отозван.
Действие не осуществляется, выходит ошибка:
`Указанный ключ был отозван. Выберите другой ключ
и повторите попытку.`
* Альтернативный поток №5: выбранный ключ не
действителен. Действие не осуществляется, выходит
ошибка:
`Указанный ключ не действителен. Выберите другой
ключ и повторите попытку.`
* Альтернативный поток №6: алгоритм выбранного ключа
отличается от RSA. Действие не осуществляется,
выходит ошибка:
`Указанный ключ приложением не поддерживается.
Выберите другой ключ и повторите попытку.`
![Пароль ЭЦП](resources/img/workflow/edi_password.png)
![Пароль ЭЦП](resources/img/workflow/iOS/edi_password_ios.png)
**Функциональные кнопки.**
Пользователь нажимает на функциональную кнопку. Если
для данного действия обязателен ввод комментария, для
незаполненного поля должно отобразиться сообщение:
`Введите комментарий`
и не выполняться действие.
В случае успешного сохранения открывается экран
информации о работе, информация обновляется. В
случае неуспешного - выдается сообщение об ошибке,
пользователь остается на данном экране.
Если на экране завершения пользователь нажимает на
кнопку "Назад", возвращается экран информации о работе
в том же состоянии, что и до завершения работы.
> **Примечание.**
>
> Метод API для получения информации о построении окна:
> kz.arta.synergy.server.api.rest.works#getProcessFinishInfo
>
> Метод API для верификации ЭЦП:
> kz.arta.synergy.ejb.rest.sign#verificationkey
>
> Метод API для завершения процесса:
> kz.arta.synergy.server.api.rest.works#finishProcess
>
> Метод получения настроек подписания:
> kz.arta.synergy.server.api.rest.common.SettingsService#getSettings
##### Завершение выставлением прогресса (идентификатор операции PROGRESS) {#sec.workflow_work_end_without_forms}
При выставлении прогресса 100% либо нажатии на кнопку "Завершить" работе
либо должен выставиться прогресс 100%, либо работа должна завершиться. В
результате успешного выполнения происходит возврат к списку работ, в
котором обновляется список работ. В случае неудачного выполнения
пользователь остается на этом же экране.
> **Примечание**
>
> Метод API для выставления прогресса
>
> kz.arta.synergy.server.api.rest.works.WorkFlowService#setWorkProgress
### Панель с параметрами работы, панель формы завершения {#sec.workflow_work_information}
**Верхняя панель** содержит название экрана "Информация", а также
кнопку "+", расположенную в правой ее части. По нажатию на кнопку
вызывается стандартное меню "Добавить" со следующими пунктами:
* Файл с хранилища
* Файл с устройства
* Фото
* Комментарий
По нажатию на пункт *Файл с хранилища* открывается экран
["С хранилища"](#file_storage).
Если на выбранный файл хранилища отсутствует право «Загрузка
файла документа» (`LOAD_DOCUMENT`), необходимо выдавать ошибку:
`Недостаточно прав для выполнения действия`
не выполнять действие, закрыв при этом экран "С хранилища".
По нажатию на пункт *Файл с устройства* открывается системный
экран / окно выбора файла с устройства.
По нажатию на пункт *Фото* открывается встроенный фотомодуль
устройства. Имя нового файла, полученного таким образом, должно
быть в формате "Снимок dd MM yyyy HH:mm".
По нажатию на пункт *Комментарий* открывается экран
"Комментарий" для ввода нового комментария в ту вкладку
комментариев, что выделена в момент вызова данной функции.
Во всех случах успешного выполнения действия открывается экран
информации о работе. Данные в нем обновляются: должна
добавиться либо новая плашка файла в соответствующей панели
вложений, либо только что добавленный комментарий.
Аналогично, если пользователь на экране «С хранилища» /
«Комментарий» / системных экранов добавления файла с
устройства или камеры нажимает на кнопку "Назад", мобильный
клиент возвращает экран информации о работе в том состоянии,
которое было до вызова данного экрана.
**Панель с параметрами работы.**
Ниже верхней панели располагается панель с параметрами работы.
Панель не имеет фиксированной высоты, не прокручивается.
Параметры, которые отображаются на данной панели:
+---------------------------------+------------------------+-------------------------------------+
| Параметры работы | Описание | Поле API |
+=================================+========================+=====================================+
| *Всегда:* | | |
+---------------------------------+------------------------+-------------------------------------+
| %Формулировка работы% | полное название работы | `name` |
+---------------------------------+------------------------+-------------------------------------+
| Поставил: %Фамилия И.О.% | автор работы | `author` |
+---------------------------------+------------------------+-------------------------------------+
| Ответственный: %Фамилия И.О.% | исполнитель работы | `user` |
+---------------------------------+------------------------+-------------------------------------+
| *Дополнительно:* | | |
+---------------------------------+------------------------+-------------------------------------+
| %ДД месяц ГГГГ - ДД месяц ГГГГ% | сроки исполнения для | `start_date`, `finish_date` |
| | незавершенной работы | |
+---------------------------------+------------------------+-------------------------------------+
| %Значение прогресса% | показывает текущий | cм. таблицу "Идентификаторы |
| | прогресс работы | для обозначения прогресса" в |
| | | [Список работ](#sec.workflow_works) |
| | | (столбец "Полное значение") |
+---------------------------------+------------------------+-------------------------------------+
Если у работы отсутствует какой-либо из параметров `author` /
`user`, то соответствующая строка в панели должна отсутствовать
полностью.
![Параметры работы с прогрессом и назначенной формой завершения](resources/img/workflow/work_view1.png)
![Параметры работы с прогрессом и назначенной формой завершения](resources/img/workflow/iOS/work_view1.png)
![Параметры работы с действием](resources/img/workflow/work_view2.png)
![Параметры работы с действием](resources/img/workflow/iOS/work_view2.png)
![Параметры работы по процессу резолюции](resources/img/workflow/work_view6.png)
![Параметры работы по процессу резолюции](resources/img/workflow/iOS/work_view6_ios.png)
*Значение прогресса - слайдер.*
Слайдер доступен, если у пользователя есть право на изменение
значение прогресса (`can_change_progress`), иначе - недоступен.
Для доступного слайдера пользователь передвигает ползунок. При
этом подпись прогресса под слайдером меняет свое значение на
всем протяжении времени, пока пользователь не отпустит ползунок.
Если конечное значение прогресса не равно начальному, то после
того, как пользователь отпустит ползунок, приложение запрашивает
подтверждение выполнения действия с сообщением:
`Вы действительно хотите изменить значение прогресса?`
Если пользователь подтверждает изменение прогресса, отправляется
запрос на сервер для изменения, иначе - значение слайдера
устанавливается в исходное. В случае успешного выполнения
информация о работе обновляется, иначе - отображается сообщение
об ошибке.
> **Примечание**
>
> Метод API для изменения прогресса работы:
>
> kz.arta.synergy.server.api.rest.works.WorkFlowService#setWorkProgress
>
> Метод для добавления вложения:
>
> kz.arta.synergy.server.api.rest.works.WorkFlowService#createAttachment
> (параметр path должен отсутсвовать)
>
> Метод для добавления комментария:
>
> kz.arta.synergy.server.api.rest.works.WorkFlowService#addComment
**Панель формы завершения.**
Ниже панели с параметрами работы, при наличии у работы формы
завершения, располагается панель формы завершения.
Для завершенной работы на вкладке отображается надпись "Результат
завершения" и ниже непосредственно результат работы. Результат
работы "файл" и "форма" можно просмотреть системными средствами,
нажав по нему. Для "формы" должна скачиваться pdf-версия формы.
Никаких других действий в данной панели быть не должно.
Наличие формы завершения у работы определяется полем
`completionFormID`, если его нет или значение является пустой
строкой, значит форма завершения не задана.
Наличие результата завершения работы определяется полем
`completionResultID`, если его нет или значение является пустой
строкой, значит результат завершения не задан.
Если форма завершения задана, но результат отсутствует необходимо
отображать название формы завершения "Форма завершения -
%Значение_формы%" (илл. «Параметры работы с прогрессом и
назначенной формой завершения»), название можно взять по
идентификатору `completionFormID` из значений справочника,
полученных при загрузке приложения.
Если результат завершения работы задан, его необходимо запросить
с сервера.
Способ отображения результата работы зависит от типа:
* если результат формы - файл (поле `type` = file), тогда
результат должен отображаться в виде пиктограммы и названия
файла (илл. «Параметры работы с формой завершения - файл»);
* если результат формы - комментарий (поле `type` = comment),
тогда результат должен отображаться в виде строки (илл.
«Параметры работы с формой завершения - комментарий»);
* если результат формы - форма (поле `type` = form), тогда
результат должен отображаться в виде пиктограммы и названия
файла по форме (илл. «Параметры работы с формой завершения -
форма»).
> **Примечание**
>
> Метод получения информации о результате завершения работы:
>
> kz.arta.synergy.server.api.rest.works.WorkFlowService#getWorkCompletionResult
![Параметры работы с формой завершения - файл](resources/img/workflow/work_view4.png)
![Параметры работы с формой завершения - комментарий](resources/img/workflow/work_view3.png)
![Параметры работы с формой завершения - форма](resources/img/workflow/work_view7.png)
#### Перепоручение работы (идентификатор действия reassign) {#sec.workflow_work_reassign}
Пользователь нажимает на соответствующую кнопку: открывается экран
"Отправить". Приложение запрашивает у сервера дополнительную информацию
для отображения данного экрана (зависит от действия): название
родительской работы; название и цвет кнопки; отображать или нет
неподчиненных пользователей в компоненте выбора пользователя, значение
по умолчанию для времени завершения (илл. «Перепоручить работу»).
> **Примечание**
>
> В случае, если в РКК документа работы настроена валидация его полей
> перед отправкой, то по нажатию на кнопку перепоручения действие не
> произойдет (экран "Отправить" не откроется) с ошибкой (-ами):
>
> `Данный тип документа требует указание дела. Выберите его в карточке и
> отправьте повторно. Если список пуст, обратитесь к методологу`
>
> `Данный тип документа требует определения исполнителя. Выберите его в
> карточке и отправьте повторно`
![Перепоручить работу](resources/img/workflow/work_delegating.png)
![Перепоручить работу](resources/img/workflow/iOS/work_delegating.png)
Управляющая кнопка имеет фиксированное положение. Вся остальная область
экрана прокручиваема (поля не имеют фиксированной высоты и растягиваются
по последнему содержимому).
Параметры перепоручения работы.
+------------------+--------------------------------------------------------------------+
| Параметр | Описание |
+==================+====================================================================+
| Название | Вводится полное название работы. |
+------------------+--------------------------------------------------------------------+
| Ответственный | Открывается экран "Пользователи" (илл. «Экран "Пользователи" со |
| | скрытыми тегами»), параметры: |
| | |
| | * выбор одного пользователя; |
| | |
| | * если значение настройки "разрешено ли передавать работы другим |
| | исполнителям" = true, отображать всех пользователей, иначе - |
| | только подчиненных; |
| | |
| | * идентификатор действия: reassign. |
| | |
| | Поле должно автоматически очиститься и стать неактивным |
| | (независимо от его заполненности), если выключается флажок. |
+------------------+--------------------------------------------------------------------+
| Исполнители | Открывается экран "Пользователи" (илл. «Экран "Пользователи" со |
| | скрытыми тегами»), параметры: |
| | |
| | * множественный выбор пользователей; |
| | |
| | * если значение настройки "разрешено ли добавлять соисполнителей |
| | к работам, не являющихся подчиненными" = true, отображать всех |
| | пользователей, если false: |
| | |
| | * для значения настройки "ставить ли работы исполнителям от |
| | имени ответственного" = true, отображать подчиненных |
| | ответственного (если таковой выбран); |
| | |
| | * иначе (для значения настройки "ставить ли работы |
| | исполнителям от имени ответственного" = false либо если |
| | не был выбран ответственный) - отображать подчиненных |
| | данного пользователя; |
| | |
| | * идентификатор действия: reassign. |
| | |
| | Поле должно автоматически очиститься, если сменили ответственного. |
+------------------+--------------------------------------------------------------------+
| Время завершения | Открывается системное окно ввода даты / времени. |
+------------------+--------------------------------------------------------------------+
| Форма завершения | Открывается список из возможных значений (полученных при загрузке |
| | приложения) и значения "Нет", значение "Нет" должно быть в списке |
| | первым. Если список форм завершения пуст, поле не должно быть |
| | отображено. |
+------------------+--------------------------------------------------------------------+
Если пользователь нажимает на кнопку "Назад", возвращается экран
информации о работе в том же состоянии, что и до вызова данного экрана.
После ввода всех необходимых параметров работы пользователь нажимает на
управляющую кнопку. Действие перепоручения выполняется при выполнении
следующих условий:
- заполнена формулировка перепоручаемой работы;
- для включенного флажка заполнено поле "Ответственный", для
выключенного - поле "Исполнители".
> **Примечание**
>
> В случае, если требуется подпись перед отправкой, то по нажатию на
> управляющую кнопку действие не произойдет (работа не перепоручится)
> с ошибкой:
>
> `Необходимо подписать документ до того, как вы его сможете отослать.`
В случае успешного выполнения действия открывается экран со списком
работ, список обновляется.
В случае неуспешного - выдается сообщение об ошибке, действие
выполняться не должно, пользователь остается на экране перепоручения
работы. Если не введены формулировка работы и/или ответственный (для
включенного флажка) - ошибка "Заполните все поля". Если для выключенного
флажка не выбрано ни одного исполнителя - ошибка "Работа не может быть
создана: не указан ни ответственный, ни исполнители".
> **Замечание**
>
> Метод API для перепоручения работы
> kz.arta.synergy.server.api.rest.works#startRoute
>
> Метод API получения информации для формирования окна
> kz.arta.synergy.server.api.rest.works#getSendWorkInfo
#### Результат работы (идентификатор действия result) {#sec.workflow_work_result}
<#include "workflow/workflow_work_result_file.md">
<#include "workflow/workflow_work_result_comment.md">
<#include "workflow/workflow_work_result_form.md">
<#include "workflow/workflow_work_result_rejection.md">
##### Результат завершения - комментарий {#sec.workflow_work_result_comment}
Пользователь нажимает на кнопку "Результат" работы подчиненного -
открывается экран "Результат" просмотра результата работы (илл.
«Результат единичной работы (комментарий)»).
![Результат единичной работы (комментарий)](resources/img/workflow/view_result_comment.png)
![Результат единичной работы (комментарий)](resources/img/workflow/iOS/view_result_comment.jpg)
Управляющие кнопки имеют фиксированное положение. Вся остальная область
экрана прокручиваема.
На экране отображается лейбл "Результат работы:" и комментарий
подчиненного, недоступный на редактирование.
Если пользователь нажимает на кнопку "Назад", возвращается экран
информации о работе в том же состоянии, что и до нажатия на кнопку
"Результат". Если пользователь нажимает на кнопку "Подтвердить",
мобильный клиент возвращает пользователя к экрану информации о работе,
информация обновляется.
Если же пользователь нажимает на кнопку "Отклонить", то открывается
экран отклонения результата ([Отклонение результата
работы](#sec.workflow_work_result_rejection)).
##### Результат завершения - файл {#sec.workflow_work_result_file}
Пользователь нажимает на кнопку "Результат" работы подчиненного -
открывается экран "Результат" просмотра результата работы (илл.
«Результат единичной работы (файл)»).
![Результат единичной работы (файл)](resources/img/workflow/view_result_file.png)
![Результат единичной работы (файл)](resources/img/workflow/iOS/view_result_file.jpg)
Управляющие кнопки имеют фиксированное положение. Вся остальная область
экрана прокручиваема.
На экране отображается лейбл "Результат работы:", иконка и название
файла, который можно посмотреть системными средствами, нажав по нему.
Если пользователь нажимает на кнопку "Назад", возвращается экран
информации о работе в том же состоянии, что и до нажатия на кнопку
"Результат". Если пользователь нажимает на кнопку "Подтвердить",
мобильный клиент возвращает пользователя к экрану информации о работе,
информация обновляется.
Если же пользователь нажимает на кнопку "Отклонить", то открывается
экран отклонения результата ([Отклонение результата
работы](#sec.workflow_work_result_rejection)).
##### Результат завершения - форма {#sec.workflow_work_result_form}
Пользователь нажимает на кнопку "Результат" работы подчиненного -
открывается экран "Результат" просмотра результата работы (илл.
«Результат единичной работы (форма)»).
![Результат единичной работы (форма)](resources/img/workflow/view_result_form.png)
![Результат единичной работы (форма)](resources/img/workflow/iOS/view_result_form_ios.png)
Управляющие кнопки имеют фиксированное положение. Вся остальная область
экрана прокручиваема.
На экране отображается лейбл "Результат работы:", иконка и название
файла по форме, который можно посмотреть в самом приложении, нажав по
нему.
Если пользователь нажимает на кнопку "Назад", возвращается экран
информации о работе в том же состоянии, что и до нажатия на кнопку
"Результат". Если пользователь нажимает на кнопку "Подтвердить",
мобильный клиент возвращает пользователя к экрану информации о работе,
информация обновляется.
Если же пользователь нажимает на кнопку "Отклонить", то открывается
экран отклонения результата ([Отклонение результата
работы](#sec.workflow_work_result_rejection)).
##### Отклонение результата работы {#sec.workflow_work_result_rejection}
Пользователь нажимает на кнопку "Отклонить" на экране подтверждения
результата работы - открывается экран отклонения результата работы (илл.
«Отклонение результата работы»).
![Отклонение результата работы](resources/img/workflow/result_rejection.png)
![Отклонение результата работы](resources/img/workflow/iOS/result_rejection.jpg)
Управляющая кнопка имеет фиксированное положение. Панель для ввода
комментария прокручиваема.
Параметры отклонения результата работы.
Параметр работы Описание
-------------------- ------------------------------------------------------------- -------------------------------------------------------
Изменить срок Открывается системное окно ввода даты / времени.
Изменить прогресс Обязательно изменяется значение слайдера в меньшую сторону.
Причина отклонения Вводится комментарий отклонения.
Если пользователь нажимает на кнопку "Назад", возвращается экран
подтверждения результата работы (илл. «Результат единичной работы
(файл)» либо илл. «Результат единичной работы (комментарий)»).
Если пользователь нажимает на кнопку "Отклонить", при этом не изменено
значение прогресса в меньшую сторону, приложение должно отобразить
сообщение "При отклонении результата работы должен быть выбран прогресс
меньше 100%" и не выполнять действие.
Если пользователь нажимает на кнопку "Отклонить", в случае успешного
завершения - возвращает пользователя к списку работ, список обновляется,
иначе - отображает сообщение об ошибке.
> **Замечание**
>
> Метод API для подтверждения результата:
> kz.arta.synergy.server.api.rest.works#acceptWorkResult, метод API для
> отклонения результата
> kz.arta.synergy.server.api.rest.works#rejectWorkResult
#### Отправка работы (идентификатор действия send) {#sec.workflow_work_send}
Пользователь нажимает на соответствующую кнопку: открывается экран
"Отправить". Приложение запрашивает у сервера дополнительную информацию
для отображения данного экрана (зависит от действия): название
родительской работы; название и цвет кнопки; отображать или нет
неподчиненных пользователей в компоненте выбора пользователя, значение
по умолчанию для времени завершения (илл. «Отправить на согласование»).
> **Примечание**
>
> В случае, если в РКК документа работы настроена валидация его полей
> перед отправкой, то по нажатию на соответствующую кнопку отправки на
> согласование / утверждение / ознакомление действие не произойдет
> (экран "Отправить" не откроется) с ошибкой (-ами):
>
> `Данный тип документа требует указание дела. Выберите его в карточке и
> отправьте повторно. Если список пуст, обратитесь к методологу`
>
> `Данный тип документа требует определения исполнителя. Выберите его в
> карточке и отправьте повторно`
![Отправить на согласование](resources/img/workflow/work_matching.png)
![Отправить на согласование](resources/img/workflow/iOS/work_matching_ios.png)
Управляющая кнопка имеет фиксированное положение. Вся остальная область
экрана прокручиваема (поля не имеют фиксированной высоты и растягиваются
по последнему содержимому).
Параметры отправки работы.
+------------------+--------------------------------------------------+
| Параметр | Описание |
+==================+==================================================+
| Название | Вводится полное название работы. |
+------------------+--------------------------------------------------+
| Кому | Открывается экран "Пользователи" (илл. «Экран |
| | "Пользователи" со скрытыми тегами»), параметры: |
| | |
| | * множественный выбор пользователей; |
| | |
| | * отображать всех пользователей; |
| | |
| | * идентификатор действия: send. |
+------------------+--------------------------------------------------+
| Время завершения | Открывается системное окно ввода даты / времени. |
+------------------+--------------------------------------------------+
Если пользователь нажимает на кнопку "Назад", возвращается экран
информации о работе в том же состоянии, что и до вызова данного экрана.
После ввода всех необходимых параметров работы пользователь нажимает на
управляющую кнопку. Действие отправки выполняется при выполнении
следующих условий:
- заполнена формулировка отправляемой работы;
- заполнено поле "Кому".
> **Примечание**
>
> В случае, если требуется подпись перед отправкой, то по нажатию на
> управляющую кнопку действие не произойдет (работа не отправится) с
> ошибкой:
>
> `Необходимо подписать документ до того, как вы его сможете отослать.`
В случае успешного выполнения действия открывается экран со списком
работ, список обновляется.
В случае неуспешного - выдается сообщение об ошибке, действие
выполняться не должно, пользователь остается на экране отправки работы.
Если не введены формулировка работы и/или ответственный - ошибка
"Заполните все поля".
> **Примечание**
>
> Метод API для отправки работы
> kz.arta.synergy.server.api.rest.works#startRoute
>
> Метод API получения информации для формирования окна
> kz.arta.synergy.server.api.rest.works#getSendWorkInfo
#### Подписание документа работы {#sec.workflow_work_sign}
Кнопка "Подписать" должна отображаться только при совпадении
всех следующих условий:
1. Во-первых, авторизованный пользователь должен отсутствовать
в текущем листе подписей документа. Для этого вызывается
метод API для получения списка подписей:
`kz.arta.synergy.server.api.rest.docs#getSignList`
(передается идентификатор документа работы)
и по параметру `userID` проверяется его отсутствие во всех
записях.
2. Во-вторых, подписываемая работа не должна быть незавершенным
согласованием либо утверждением либо ознакомлением. Для этого
вызывается метод API для получения информации о работе:
`kz.arta.synergy.server.api.rest.works#getWorksById`
(передается идентификатор работы)
и по параметру `parent_process` проверяется тип работы. Это
поле не должно содержать одно из следующих значений:
* `agreement-single` (согласование)
* `approval-single` (утверждение)
* `acquaintance-single` (ознакомление)
Если хотя бы одно условие не выполняется, то кнопка "Подписать"
отсутствует. Если выполняются оба условия одновременно, то
кнопка отображается последней в списке.
Пользователь нажимает на соответствующую кнопку: открывается
экран "Подписать". Для выполнения действия необходимо получить
следующую информацию:
- закодированная строка для идентификации подписываемых данных
(`rawdata` из метода API
`kz.arta.synergy.server.api.rest.docs#getDocumentInfo`);
- настроена ли функция ЭЦП (`enableEDS` из метода API
`kz.arta.synergy.server.api.rest.common#getSettings`);
- требуется ли ключ и сертификат (`needCert` из метода API
`kz.arta.synergy.server.api.rest.common#getSettings`).
> Примечание.
>
> Если отсутствует параметр `rawdata` (это возможно в том случае,
> если версия платформы ниже 3.6), то в экране "Подписать" при
> нажатии на кнопку "Подписать" либо "Выбрать ЭЦП" необходимо
> выдавать ошибку:
>
> `Данная функция недоступна, т.к. используется версия ARTA
> Synergy ниже 3.6`
>
> и не выполнять действие, остается открытым экран "Подписать".
![Подписание документа без использования ЭЦП](resources/img/workflow/sign_edi_turned_off.png)
![Подписание документа без использования ЭЦП](resources/img/workflow/iOS/sign_edi_turned_off_ios.png)
![Подписание документа, файл ЭЦП еще не выбран](resources/img/workflow/sign_edi_not_choosen.png)
![Подписание документа, файл ЭЦП еще не выбран](resources/img/workflow/iOS/sign_edi_not_choosen_ios.png)
![Подписание документа, файл ЭЦП выбран](resources/img/workflow/sign_edi_choosen.png)
![Подписание документа, файл ЭЦП выбран](resources/img/workflow/iOS/sign_edi_choosen_ios.png)
Все кнопки имеют фиксированное положение внизу экрана. Вся
остальная область прокручиваема.
Параметры завершения с действием.
+------------------------+-----------------------------------------+
| Параметр работы | Описание |
+========================+=========================================+
| Использовать ЭЦП | Флажок |
+------------------------+-----------------------------------------+
| Просмотреть информацию | Кликабельный лейбл |
| о выбранной ЭЦП | |
+------------------------+-----------------------------------------+
Если функция ЭЦП настроена на стороне сервера (поле API
`enableEDS = true`), а также при наличии цифровой подписи
на устройстве, возможно его использование при подписании.
Значение по умолчанию флажка *"Использовать ЭЦП"* зависит
от настроек, полученных при загрузке приложения (требовать
ли ключ и сертификат, параметр в API: `needCert`):
* "да" - флажку устанавливается значение "Вкл", его
изменение недоступно;
* "нет" - флажку устанавливается значение "Выкл", его
изменение доступно.
Если функция ЭЦП не настроена на стороне сервера (поле API
`enableEDS = false`), то:
* при наличии требования ключа и сертификата (`needCert =
true`) - не открывая экран необходимо вывести ошибку:
`Вы не можете использовать ЭЦП. Данная функция не
настроена. Обратитесь к администратору.`
* иначе - флажок "Использовать ЭЦП" всегда недоступен и
имеет значение "Выкл".
Кликабельный лейбл *Просмотреть информацию о выбранной ЭЦП*
отображается только в том случае, если файл ЭЦП уже выбран.
По его нажатию открывается экран с информацией (см. ниже).
Для значения "Использовать ЭЦП" = "Выкл" внизу экрана
отображается функциональная кнопки "Подписать" зеленого
цвета (идентификатор PREFERRED).
Для значения "Использовать ЭЦП" = "Вкл" внизу экрана
отображаются:
* файл ЭЦП не выбран - только кнопка "Выбрать ЭЦП"
зеленого цвета (идентификатор PREFERRED);
* файл ЭЦП выбран - сначала функциональная кнопка
"Подписать" зеленого цвета (идентификатор PREFERRED),
затем кнопка "Изменить ЭЦП" серого цвета (идентификатор
NOT_PREFERRED).
**Информация о выбранной ЭЦП.**
Нажатие по кликабельному лейблу "Просмотреть информацию о
выбранной ЭЦП" открывает экран "Информация", в которой
отображаются следующие параметры:
+--------------+------------------+---------------------------+
| Поле | Параметр ЭЦП | Пример |
+==============+==================+===========================+
| ИИН | KEY_SERIALNUMBER | IIN910511450249 |
+--------------+------------------+---------------------------+
| Основное имя | KEY_CN | САРСЕМБАЕВА МЕРУЕРТ |
+--------------+------------------+---------------------------+
| Отчество | KEY_GIVENNAME | КОКЕШЕВНА |
+--------------+------------------+---------------------------+
| Организация | KEY_O | АО "НАЦИОНАЛЬНАЯ КОМПАНИЯ |
| | | "КАЗАХСКОЕ ИНФОРМАЦИОННОЕ |
| | | АГЕНТСТВО" |
+--------------+------------------+---------------------------+
| Истекает | | 31.12.2016 |
+--------------+------------------+---------------------------+
> Примечание.
>
> Если ЭЦП выдано на физическое лицо, поле "Организация"
> должно отсутствовать.
С данного экрана возможен только возврат на предыдущий экран
с помощью кнопки "Назад".
![Информация о выбранной ЭЦП](resources/img/workflow/edi_information.png)
![Информация о выбранной ЭЦП](resources/img/workflow/iOS/edi_information_ios.png)
**Кнопка "Выбрать ЭЦП".**
> Примечание.
>
> Для подписания документов с использованием ЭЦП предварительно
> необходимо загрузить файл сертификата на устройство. Мобильным
> приложением поддерживаются только ЭЦП с алгоритмом RSA.
>
> Для ОС Android достаточно скопировать файл ЭЦП в любую папку
> подключенного к компьютеру смартфона с помощью проводника.
>
> Для iOS необходимо воспользоваться фирменной утилитой iTunes.
> При подключенном смартфоне перейти в «iPhone» - «Настройки» -
> «Программы». Найти среди списка программ мобильное приложение
> Synergy и добавить файл ЭЦП в хранилище с компьютера на
> смартфон через кнопку «Добавить файл…».
После включения флажка "Использовать ЭЦП" внизу экрана
отображается единственная кнопка "Выбрать ЭЦП". По ее нажатию,
в зависимости от того, происходил ли выбор ЭЦП в приложении
ранее, открывается:
*в ОС Android:*
* ЭЦП ранее не использовалось - окно (не экран) файлового
менеджера (аналогичный выбору файла с устройства) с
фильтром, позволяющим отображать в папках только файлы
цифровых подписей (с расширением `р12` и `pfx`).
Если в данном окне пользователь нажимает на кнопку
"Назад" / "Отмена" / либо вне области окна, возвращается
экран "Подписать" в том же состоянии, что и до нажатия
кнопки "Выбрать ЭЦП".
Если же пользователь нажимает на кнопку "Ок", не выбрав
файл, необходимо закрывать окно и выдавать сообщение:
`Выберите файл ЭЦП`
Пользователь выбирает файл ЭЦП и нажимает на кнопку
"Ок", открывается экран "Пароль ЭЦП".
* ЭЦП ранее использовалось - сразу экран "Пароль ЭЦП", в
котором уже выбран файл последнего использовавшегося
сертификата.
*в iOS:*
* ЭЦП ранее не использовалось - экран файлов приложения
"ЭЦП" (куда предварительно загружен файл ЭЦП) с
фильтром, позволяющим отображать только файлы цифровых
подписей (с расширением `р12` и `pfx`).
Если на данном экране пользователь нажимает на кнопку
"Назад", возвращается экран "Подписать" в том же
состоянии, что и до нажатия кнопки "Выбрать ЭЦП".
Выделение строки - действие tap. После выделения
файла пользователь нажимает на кнопку "Выбрать".
Действие выполняется, только если выделен какой-либо
файл, иначе необходимо выдавать сообщение:
`Файл не выбран`
и не выполнять действие. В случае успешного выполнения
открывается экран "Пароль ЭЦП".
![Выбор ЭЦП в iOS](resources/img/workflow/iOS/edi_chooser_ios.png)
* ЭЦП ранее использовалось - сразу экран "Пароль ЭЦП",
в котором уже выбран файл последнего использовавшегося
сертификата.
В обоих вариантах под вариантом "ЭЦП ранее не использовалось"
подразумевается, в том числе, сброс текущего выбранного
значения ЭЦП при выходе из приложения (с помощью кнопки
"Выйти" в [настройках](#sec.settings)).
*Пароль ЭЦП.*
Параметры экрана ввода пароля.
+----------------------+------------------------------+
| Параметр экрана | Описание |
+======================+==============================+
| %название_файла_ЭЦП% | Поле ввода пароля, |
| | placeholder "Введите пароль" |
+----------------------+------------------------------+
| Подписать | Кнопка |
+----------------------+------------------------------+
| Изменить ЭЦП | Кнопка |
+----------------------+------------------------------+
Обязательное *поле ввода пароля* с лейблом, содержащим
полное название файла ЭЦП. В данное поле вводится пароль
к сертификату.
По нажатию на *кнопку "Подписать"* происходит валидация
пароля, и в случае успешного пароля - валидация самой
подписи. В случае успешной валидации подписи открывается
экран подписания в состоянии "выбранного ЭЦП":
* отображается кликабельный лейбл "Просмотреть
информацию о выбранной ЭЦП";
* после функциональной кнопки "Подписать" добавляется
кнопка "Изменить ЭЦП" серого цвета (идентификатор
NOT_PREFERRED).
Возможно исполнение альтернативных потоков событий 1-6.
Если на экране "Пароль ЭЦП" пользователь нажимает на
кнопку "Назад", возвращается экран подписания в том же
состоянии, что и до нажатия кнопки "Выбрать ЭЦП".
По нажатию на *кнопку "Изменить ЭЦП"* открывается окно/
экран выбора файла ЭЦП. При этом текущее выбранное
значение удаляется.
*Альтернативные потоки событий.*
* Альтернативный поток №1: не заполнено поле пароля.
Действие не осуществляется, выходит ошибка:
`Введите пароль`
* Альтернативный поток №2: введен некорректный пароль.
Действие не осуществляется, выходит ошибка:
`Неверный пароль`
* Альтернативный поток №3: выбранный ключ просрочен.
Действие не осуществляется, выходит ошибка:
`Указанный ключ просрочен. Выберите другой ключ и
повторите попытку.`
* Альтернативный поток №4: выбранный ключ отозван.
Действие не осуществляется, выходит ошибка:
`Указанный ключ был отозван. Выберите другой ключ
и повторите попытку.`
* Альтернативный поток №5: выбранный ключ не
действителен. Действие не осуществляется, выходит
ошибка:
`Указанный ключ не действителен. Выберите другой
ключ и повторите попытку.`
* Альтернативный поток №6: алгоритм выбранного ключа
отличается от RSA. Действие не осуществляется,
выходит ошибка:
`Указанный ключ приложением не поддерживается.
Выберите другой ключ и повторите попытку.`
![Пароль ЭЦП](resources/img/workflow/edi_password.png)
![Пароль ЭЦП](resources/img/workflow/iOS/edi_password_ios.png)
**Функциональная кнопка.**
Пользователь нажимает на функциональную кнопку. В случае
успешного выполнения действия открывается экран информации
о работе, информация обновляется. В случае неуспешного -
выдается сообщение об ошибке, пользователь остается на
данном экране.
Если на экране подписания пользователь нажимает на кнопку
"Назад", возвращается экран информации о работе в том же
состоянии, что и до завершения работы.
> **Примечание.**
>
> Метод API для верификации ЭЦП:
> kz.arta.synergy.ejb.rest.sign#verificationkey
>
> Метод API для подписания документа:
> kz.arta.synergy.ejb.rest.docs#sign
#### Передача работы (идентификатор действия transmit) {#sec.workflow_work_transmit}
Пользователь нажимает на соответствующую кнопку: открывается экран
"Отправить". Приложение запрашивает у сервера дополнительную информацию
для отображения данного экрана (зависит от действия): название
родительской работы; название и цвет кнопки; отображать или нет
неподчиненных пользователей в компоненте выбора пользователя, значение
по умолчанию для времени завершения (илл. «Передать работу»).
> **Примечание**
>
> В случае, если в РКК документа работы настроена валидация его полей
> перед отправкой, то по нажатию на кнопку передачи действие не
> произойдет (экран "Отправить" не откроется) с ошибкой (-ами):
>
> `Данный тип документа требует указание дела. Выберите его в карточке и
> отправьте повторно. Если список пуст, обратитесь к методологу`
>
> `Данный тип документа требует определения исполнителя. Выберите его в
> карточке и отправьте повторно`
![Передать работу](resources/img/workflow/work_passing.png)
![Передать работу](resources/img/workflow/iOS/Work_passing.jpg)
Управляющая кнопка имеет фиксированное положение. Вся остальная область
экрана прокручиваема (поля не имеют фиксированной высоты и растягиваются
по последнему содержимому).
Параметры передачи работы.
+----------+--------------------------------------------------+
| Параметр | Описание |
+==========+==================================================+
| Название | Вводится полное название работы. |
+----------+--------------------------------------------------+
| Кому | Открывается экран "Пользователи" (илл. «Экран |
| | "Пользователи" со скрытыми тегами»), параметры: |
| | |
| | * выбор одного пользователя; |
| | |
| | * отображать всех пользователей; |
| | |
| | * идентификатор действия: transmit. |
+----------+--------------------------------------------------+
Если пользователь нажимает на кнопку "Назад", возвращается экран
информации о работе в том же состоянии, что и до вызова данного экрана.
После ввода всех необходимых параметров работы пользователь нажимает на
управляющую кнопку. Действие передачи выполняется при выполнении
следующих условий:
- заполнена формулировка передаваемой работы;
- заполнено поле "Кому".
В случае успешного выполнения действия открывается экран со списком
работ, список обновляется.
В случае неуспешного - выдается сообщение об ошибке, действие
выполняться не должно, пользователь остается на экране передачи работы.
Если не введены формулировка работы и/или ответственный - ошибка
"Заполните все поля".
> **Примечание**
>
> Метод API для передачи работы
> kz.arta.synergy.server.api.rest.works#transferWork
>
> Метод API получения информации для формирования окна
> kz.arta.synergy.server.api.rest.works#getSendWorkInfo
Информация о работе {#sec.workflow_workinfo}
-------------------
По нажатию на плашку работы открывается экран информации о работе.
<#include "workflow/workflow_work_information.md">
<#include "workflow/workflow_comments.md">
<#include "workflow/workflow_attachments.md">
<#include "workflow/workflow_work_actions.md">
Список работ {#sec.workflow_works}
------------
Экран со списком работ представлен на илл. «Список работ».
![Список работ](resources/img/workflow/main.png)
**Элементы управления экрана со списком работ.**
+--------------------------------------------------------------+------------------------+---------------------------------------------------+
| Элемент управления | Расположение на экране | Описание |
+==============================================================+========================+===================================================+
| *Верхняя панель* | | |
+--------------------------------------------------------------+------------------------+---------------------------------------------------+
| ![](resources/img/workflow/elements/button_filters.png)\ | Слева | "Навигатор" - кнопка перехода к |
| | | [фильтрам потоков работ](#sec.workflow_filters) |
+--------------------------------------------------------------+------------------------+---------------------------------------------------+
| "Работы" | По центру | Выпадающий список для переключения между модулями |
+--------------------------------------------------------------+------------------------+---------------------------------------------------+
| ![](resources/img/workflow/elements/button_work_create.png)\ | Справа | "Создать" - кнопка создания |
| | | [работы](#sec.workflow_work_create) и |
| | | [документа](#sec.workflow_document_create)) |
+--------------------------------------------------------------+------------------------+---------------------------------------------------+
| *Рабочая область* | | |
+--------------------------------------------------------------+------------------------+---------------------------------------------------+
| | Вся рабочая область | Плашки, отображающие информацию о работе |
| | ниже верхней панели | |
+--------------------------------------------------------------+------------------------+---------------------------------------------------+
По нажатию на "Работы" на верхней панели не отображаются все
кнопки, под панелью открывается выпадающий список с модулями
(илл. «Переключение между модулями»):
* [Работы](#chap_workflow);
* [Документы](#chap.documents);
* [Файлы](#chap.files).
![Переключение между модулями](resources/img/workflow/main1.png)
До вызова выпадающего списка стрелка отображается указателем
вниз, по вызову меняется указателем вверх. По нажатию вне
области выпадающего списка, а также по указателю и шапке
списка, он скрывается. По нажатию на текущий модуль список
обновляется, на другой модуль - открывается соответствующий
модуль.
Работы в списке отображаются с постепенной догрузкой.
Изначально подгружается такое количество работ, чтобы список
был полностью заполнен и появился скролл (минимум 30). При
прокрутке пользователем вниз и достижении конца списка,
список работ дополняется (количество работ в новой "порции"
должно быть равно количеству работ в первой "порции").
При прокрутке пользователем в начале списка вверх (действие
dropdown) список работ обновляется.
Список работ сортируется согласно условиям просматриваемого
фильтра.
По нажатию на кнопку "+" вызывается меню «Создать». Кроме
того, кнопка "+" может отсутствовать вовсе, см. подробнее в
разделе про
[создание работы / документов](#sec.workflow_create_menu).
**Плашка работы.**
Плашка работы - это компонент, отображающий информацию о
работе (илл. «Плашка работы на исполнении с прогрессом»).
Все плашки имеют одинаковый размер.
![Плашка работы на исполнении с прогрессом](resources/img/workflow/elements/work_plashka.png)
Элементы плашки работы.
+-----------------------------------------------------------------+-----------------------------+---------------------------------+-------------------------------+
| Элемент | Расположение | Описание | Поле API |
+=================================================================+=============================+=================================+===============================+
| ![](resources/img/workflow/elements/priority_green.png)\ | В левом верхнем углу плашки | Приоритет работы | `all_priorities` |
+-----------------------------------------------------------------+-----------------------------+---------------------------------+-------------------------------+
| **Фамилия И.О.** (полужирное выделение) | Вверху плашки, справа от | Автор работы (для работы, где | `author` |
| | приоритета | авторизованный пользователь - | |
| | | исполнитель работы) | |
+-----------------------------------------------------------------+-----------------------------+---------------------------------+-------------------------------+
| Фамилия И.О (обычное выделение) | Вверху плашки, справа от | Исполнитель работы (для работы, | `user` |
| | приоритета | где авторизованный пользователь | |
| | | - не исполнитель работы) | |
+-----------------------------------------------------------------+-----------------------------+---------------------------------+-------------------------------+
| ![](resources/img/workflow/elements/plashka_terms.png) | В правом верхнем углу | Срок окончания работы | `remained-label` |
| ![](resources/img/workflow/elements/plashka_terms_sub.png)\ | плашки | | |
| 2 дн | | | |
+-----------------------------------------------------------------+-----------------------------+---------------------------------+-------------------------------+
| ![](resources/img/workflow/elements/progress_status_icon.png)\ | Вверху плашки, слева от | Иконка прогресс работы | `work_state_icon`; |
| | срока окончания работы | | значением этого поля является |
| | | | идентификатор иконки |
+-----------------------------------------------------------------+-----------------------------+---------------------------------+-------------------------------+
| 15% | Вверху плашки, слева от | Подпись прогресса завершения | `work_state_label`; |
| | срока окончания работы | работы | значением этого поля является |
| | | | идентификатор значения |
+-----------------------------------------------------------------+-----------------------------+---------------------------------+-------------------------------+
| | Вся основная область плашки | Формулировка работы | `name` |
+-----------------------------------------------------------------+-----------------------------+---------------------------------+-------------------------------+
| ![](resources/img/workflow/elements/hook.png)\ | В правом нижнем углу плашки | Наличие дочерних работ | `has_subprocesses` |
+-----------------------------------------------------------------+-----------------------------+---------------------------------+-------------------------------+
*Приоритет работы* отображается в виде пиктограммы квадрата,
залитого цветом `color` параметра `all_priorities`.
*Автор работы* - пользователь, который поставил работу данному
пользователю. Отображается в формате %Фамилия И.О.%
*Срок окончания работы* отображается в виде пиктограммы
календаря и подписи. API возвращает значение подписи согласно
правилам, указанным в таблице. Если значение подписи приходит
пустым, отображать его и пиктограмму на плашке не нужно.
+------------------------------------------+------------------------------------------+
| Положительные сроки | Отрицательные сроки |
+==========================================+==========================================+
| "ХХ мин" - работы, до завершения которых | "-ХХ мин" - работы, которые просрочились |
| осталось не более 60 минут | не более, чем на 60 минут |
+------------------------------------------+------------------------------------------+
| "ХХ ч" - работы, до завершения которых | "-ХХ ч" - работы, которые просрочились |
| осталось более 60 минут и | более, чем на 60 минут, и |
| менее одного рабочего дня | менее, чем на 1 рабочий день |
+------------------------------------------+------------------------------------------+
| "ХХ дн" - работы, до завершения которых | "-ХХ мин" - работы, которые просрочились |
| осталось более одного рабочего дня и | более, чем на 1 рабочий день, и |
| менее одного месяца | менее, чем на 1 месяц |
+------------------------------------------+------------------------------------------+
| "ХХ мес" - работы, до завершения которых | "-ХХ мес" - работы, которые просрочились |
| осталось более одного месяца и | более, чем на 1 месяц, и |
| менее одного года | менее, чем на 1 год |
+------------------------------------------+------------------------------------------+
| "ХХ г" - работы, до завершения которых | "-ХХ г" - работы, которые просрочились |
| осталось более одного года | более, чем на 1 год |
+------------------------------------------+------------------------------------------+
> **Примечание**
>
> Все сроки, указанные в таблице измеряются в рабочих минутах
> / часах / днях / месяцах и годах.
*Прогресс работы* отображается в виде пиктограммы и текстовой
подписи. API возвращает идентификатор пиктограммы
(`work_state_icon`) и идентификатор подписи (`work_state_label`).
Конкретное значение подписи зависит от сочетания этих полей.
Возможные значения перечислены в таблице. В случае, если API
вернет комбинацию полей, отсутствующую в этой таблице,
отображать прогресс на плашке не нужно.
+-----------------------------------------------------------------------+-----------------------------+-------------------------------+
| Иконка | Описание | Идентификатор иконки |
+=======================================================================+=============================+===============================+
| ![](resources/img/workflow/elements/progress_status_icon.png) | цифровое значение прогресса | progress_status_icon |
| ![](resources/img/workflow/elements/progress_sub_status_icon.png) | (пиктограмма одинакова для | |
| | всех значений процентов) | |
+-----------------------------------------------------------------------+-----------------------------+-------------------------------+
| ![](resources/img/workflow/elements/progress_result_icon.png) | работа с формой завершения, | progress_result_icon |
| ![](resources/img/workflow/elements/progress_sub_result_icon.png) | которую необходимо | |
| | подтвердить | |
+-----------------------------------------------------------------------+-----------------------------+-------------------------------+
| ![](resources/img/workflow/elements/progress_mfa_icon.png) | работа на ознакомлении / | progress_mfa_icon |
| ![](resources/img/workflow/elements/progress_sub_mfa_icon.png) | согласовании / утверждении | |
+-----------------------------------------------------------------------+-----------------------------+-------------------------------+
| ![](resources/img/workflow/elements/progress_denied_icon.png) | работа, которую не | progress_denied_icon |
| ![](resources/img/workflow/elements/progress_sub_denied_icon.png) | согласовали / не утвердили | |
+-----------------------------------------------------------------------+-----------------------------+-------------------------------+
| ![](resources/img/workflow/elements/progress_done_icon.png) | завершенная работа | progress_done_icon, |
| ![](resources/img/workflow/elements/progress_sub_done_icon.png) | | progress_resolution_done_icon |
+-----------------------------------------------------------------------+-----------------------------+-------------------------------+
| ![](resources/img/workflow/elements/progress_deleted_icon.png) | удаленная работа | progress_deleted_icon |
| ![](resources/img/workflow/elements/progress_sub_deleted_icon.png) | | |
+-----------------------------------------------------------------------+-----------------------------+-------------------------------+
| ![](resources/img/workflow/elements/progress_resolution_icon.png) | работа по процессу | progress_resolution_icon |
| ![](resources/img/workflow/elements/progress_sub_resolution_icon.png) | резолюции | |
+-----------------------------------------------------------------------+-----------------------------+-------------------------------+
Идентификаторы для обозначения прогресса:
+-----------------------+-------------------------------+----------------------+---------------------+
| Идентификатор подписи | Идентификатор пиктограммы | Сокращенное значение | Полное значение |
+=======================+===============================+======================+=====================+
| agreement | progress_mfa_icon | Согл | На согласовании |
+-----------------------+-------------------------------+----------------------+---------------------+
| agreement | progress_done_icon | Согласовано | Согласовано |
+-----------------------+-------------------------------+----------------------+---------------------+
| agreement | progress_denied_icon | Не согласовано | Не согласовано |
+-----------------------+-------------------------------+----------------------+---------------------+
| agreement | progress_deleted_icon | Удалено | Удалено |
+-----------------------+-------------------------------+----------------------+---------------------+
| approval | progress_mfa_icon | Утв | На утверждении |
+-----------------------+-------------------------------+----------------------+---------------------+
| approval | progress_done_icon | Утверждено | Утверждено |
+-----------------------+-------------------------------+----------------------+---------------------+
| approval | progress_denied_icon | Не утверждено | Не утверждено |
+-----------------------+-------------------------------+----------------------+---------------------+
| approval | progress_deleted_icon | Удалено | Удалено |
+-----------------------+-------------------------------+----------------------+---------------------+
| acquaintance | progress_mfa_icon | Озн | На ознакомлении |
+-----------------------+-------------------------------+----------------------+---------------------+
| acquaintance | progress_done_icon | Ознакомлен | Ознакомлен |
+-----------------------+-------------------------------+----------------------+---------------------+
| acquaintance | progress_deleted_icon | Удалено | Удалено |
+-----------------------+-------------------------------+----------------------+---------------------+
| registration | progress_mfa_icon | Рег | На регистрации |
+-----------------------+-------------------------------+----------------------+---------------------+
| registration | progress_done_icon | Зарегистрировано | Зарегистрировано |
+-----------------------+-------------------------------+----------------------+---------------------+
| registration | progress_denied_icon | Не зарегистрировано | Не зарегистрировано |
+-----------------------+-------------------------------+----------------------+---------------------+
| registration | progress_deleted_icon | Удалено | Удалено |
+-----------------------+-------------------------------+----------------------+---------------------+
| result | progress_result_icon | Результат | 100% |
+-----------------------+-------------------------------+----------------------+---------------------+
| progress | progress_status_icon | Прогресс_работы + % | Слайдер со |
| | | | значением прогресса |
+-----------------------+-------------------------------+----------------------+---------------------+
| progress | progress_done_icon | Завершено | Завершено |
+-----------------------+-------------------------------+----------------------+---------------------+
| progress | progress_deleted_icon | Удалено | Удалено |
+-----------------------+-------------------------------+----------------------+---------------------+
| resolution_action | progress_resolution_icon | Рассм | На рассмотрении |
+-----------------------+-------------------------------+----------------------+---------------------+
| resolution_action | progress_resolution_done_icon | Резолюция | Резолюция принята |
+-----------------------+-------------------------------+----------------------+---------------------+
| resolution_action | progress_done_icon | Завершено | Завершено |
+-----------------------+-------------------------------+----------------------+---------------------+
*Формулировка работы* отображается максимум на 3 (три) строки.
Если название работы полностью не помещается на плашке, с правого
края третьей строки оно должно быть затемнено градиентом из
прозрачного в цвет фона.
Цвет текста, выделение работы зависит от времени оставшегося до
завершения работы:
+---------------------+-----------------+-------------+
| Работа | Поле API | Цвет текста |
+=====================+=================+=============+
| просроченная | is_expired | `#be3d3d` |
+---------------------+-----------------+-------------+
| скоро истекает срок | is_soon_expired | `#a57020` |
+---------------------+-----------------+-------------+
| иначе | | `#487cc2` |
+---------------------+-----------------+-------------+
Если по данной работе имеются непросмотренные уведомления (поле
`is_new` = true), работа должна быть выделена полужирным, в
качестве пиктограммы календаря, прогресса должна быть отображена
соответствующая "жирная" пиктограмма.
Жирное выделение работы снимется тогда, когда пользователь
просмотрит информацию о ней.
*Примеры плашек работы.*
![Работа на согласовании](resources/img/workflow/elements/work_plashka_na_soglasovanii.png)
![Несогласованная работа](resources/img/workflow/elements/work_plashka_ne_soglasovano.png)
![Утвержденная работа; работа, имеющая дочерние работы; работа с непросмотренными изменениями](resources/img/workflow/elements/work_plashka_approved_and_new_and_subsidiary.png)
![Работа с результатом](resources/img/workflow/elements/work_plashka_result.png)
![Удаленная работа](resources/img/workflow/elements/work_plashka_deleted.png)
![Завершенная работа с прогрессом](resources/img/workflow/elements/work_plashka_done_progress.png)
![Работа по процессу резолюции](resources/img/workflow/elements/work_plashka_resolution.png)
![Работа по процессу резолюции с принятой резолюцией](resources/img/workflow/elements/work_plashka_resolution_1.png)
![Завершенная без принятия резолюции работа по процессу резолюции](resources/img/workflow/elements/work_plashka_resolution_2.png)
**Возможные действия с плашкой работы:**
1. При выделении плашки (tap) открывается экран с информацией
о работе (не зависимо от прав пользователя).
2. В результате долгого нажатия по плашке возможно появление
меню для осуществления дополнительных действий с работой.
Набор пунктов меню зависит от прав пользователя на работу.
Если нет прав для совершения ни одного действия - меню не
отображается. Возможные пункты меню:
1. пункт меню "Изменить" (поле can_edit);
2. пункт меню "Удалить" (поле can_delete).
**Переходы на другие экраны.**
Чтобы перейти к
[дочерним работам](#sec.workflow_subsidiary_works),
пользователь проводит пальцем от правой стороны плашки к
левой).
По нажатию на кнопку "Фильтры", а также проведя пальцем от
левой стороны экрана к правой, раскрывается панель
навигатора [фильтров работ](#sec.workflow_filters).
По нажатию на кнопку "Создать" открывается выпадающий список
с пунктами
[создания работы и/или документа](#sec.workflow_create_menu).
По нажатию на плашку работы открывается экран
[информации о работе](#sec.workflow_workinfo).
Если у пользователя есть права на редактирование работы, в
результате долгого нажатия по плашке работы появляется меню,
в котором присутствует
[пункт "Изменить"](#sec.workflow_work_create).
Если у пользователя есть права на удаление работы, в
результате долгого нажатия по плашке работы появляется меню,
в котором присутствует
[пункт "Удалить"](#sec.workflow_work_delete).
По нажатию на кнопку "Назад":
* для переключателя "Запомнить меня" со значением "Выкл" -
открывается экран [авторизации](#sec.autorise);
* для переключателя "Запомнить меня" со значением "Вкл" -
происходит [закрытие приложения](#sec.app_exit).
> **Примечание**
>
> Метод получения списка работ описан в javadoc:
>
> kz.arta.synergy.server.api.rest.works#getWorks.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment