## Функциональные требования функционала отправки сообщений между пользователями внутри уже созданной информационной системы

## 1. Общие сведения о Заявке

### 1.1. Наименование информационной системы

...

### 1.2. Наименование подсистемы информационной системы:

Система Отправки Сообщений "Ничатка" (СОС "НИЧАТКА")

### 1.3. Функциональный заказчик

...

### 1.4. Автор

Еремин Сергей

### 1.5. Компонент(ы) подсистемы, подлежащий развитию, обработке

Система Запросов и Заданий "Вехно" (СЗЗ "ВЕХНО")

### 1.6. Приоритет заявки

...

### 1.7. Предлагаемый срок исполнения работ по заявке

...

## 2. Цели и обоснование необходимости реализации

### 2.1. Цель создания подсистемы: 

Модернизация СЗЗ "ВЕХНО" с целью реализация функционала отправки сообщений между пользователями.

### 2.2. Описание проблемы, решение которой требуется разработать

Необходимо обеспечить возможность обмениваться сообщениями между пользователями в рамках информационной СЗЗ "ВЕХНО".

### 2.3. Описание ожидаемых результатов от реализации подсистемы

Пользователи смогут обмениваться сообщениями в рамках СЗЗ "ВЕХНО", что позволит улучшить коммуникацию между пользователями и повысить эффективность работы в рамках проектов.   

### 3. Нормативные и методические документы влияющие на выполнение заявки

#### 3.1. Нормативные правовые акты: ____

#### 3.2. Методические и иные документы определяющие требования и ограничения процессам, подлежащим автоматизации: ____

### 4. Требования к результату

### 4.1. Бизнес- или функциональные требования

Модернизация СЗЗ "ВЕХНО", с целью привнесения функционала обмена сообщениями между пользователями (СОС "НИЧАТКА").

СОС "НИЧАТКА" должна быть реализована как надстройка над СЗЗ "ВЕХНО" и обеспечивать возможность обмена сообщениями между пользователями.

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

СОС "НИЧАТКА" должна быть реализована как надстройка над СЗЗ "ВЕХНО". Основной код и БД не должны быть изменены. Рефакторинг кода СЗЗ "ВЕХНО" допускается. Изменения дизайн (фронтэнд) допускается в минимальных объемах.

### 4.2. Общее описание автоматизируемых бизнес-процессов и их участников, модели взаимодействия и порядка обработки данных
 
#### 4.2.1. Наименование бизнес-процесса

СОС "НИЧАТКА" -- Система обмен сообщениями между пользователями СЗЗ "ВЕХНО"
 
#### 4.2.2. Описание (логика бизнес-процесса)

СОС "НИЧАТКА" должна быт разработана как отдельное приложение (django app), работающее в рамках СЗЗ "ВЕХНО". Никакие таблицы БД СЗЗ "ВЕХНО" не должны быть измены. Все таблицы  СОС "НИЧАТКА" должны быть созданы в отдельной схеме БД.

Доработка дизайна (фронтэнд) СЗЗ "ВЕХНО" ограничивается добавлением двух элементов: иконка <колокольчик> в верхнем меню и скрытый блок для AJAX-подгрузки (виджета).
```
   +--------------------------------------------------------------------------+
   | ВЕРХНЕЕ МЕНЮ СЗЗ "ВЕХНО"                             <колокольчик> {user}|
   +--------------------------------------------------------------------------+
   | ОСНОВНОЙ ИНТЕРФЕЙС СЗЗ "ВЕХНО"                    | ПАНЕЛЬ СОС "НИЧАТКА" |
   |                                                   | (блок открыт)        |
   |                                                   |                      |
   |                                                   |                      |
   |                                                   |                      |
   |                                                   |                      |
   |                                                   |                      |
   |                                                   +----------------------|
   |                                                                          |
   |                                                                          |
   |                                                                          |
   +--------------------------------------------------------------------------+
```

Псевдокод BPMN диаграммы:

1. Создать пул для системы.
2. Добавить дорожки для "Пользователь" и "Система".
   * Добавить задачи и события:
      * Начальное событие: "Загрузка страницы"
      * Задача: "Запрос статуса из СОС 'НИЧАТКА'"
      * Задача: "Отобразить колокольчик со статусом"
   * Промежуточное событие: "Клик на колокольчик"
   * Исключающее условие: "Панель видима?"
      * Если нет:
         * Задача: "Загрузить контент из СОС 'НИЧАТКА'" (по web-api)
         * Задача: "Показать панель"
      * Если да:
         * Задача: "Скрыть панель"
   * Конечное событие: "Конец"

Диаграмма:
```bpmn
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL">
  <bpmn:process id="message_system_status" name="Статус системы сообщений">
    <bpmn:laneSet>
      <bpmn:lane id="user_lane" name="Пользователь">
        <bpmn:flowNodeRef>click_bell_event</bpmn:flowNodeRef>
      </bpmn:lane>
      <bpmn:lane id="system_lane" name="Система">
        <bpmn:flowNodeRef>request_status_task</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>display_bell_task</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>load_content_task</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>show_panel_task</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>hide_panel_task</bpmn:flowNodeRef>
      </bpmn:lane>
    </bpmn:laneSet>
    <bpmn:startEvent id="start_event" name="Загрузка страницы"/>
    <bpmn:task id="request_status_task" name="Отправить запрос на получение статуса из СОС 'НИЧАТКА"/>
    <bpmn:task id="display_bell_task" name="Отобразить колокольчик и число сообщений"/>
    <bpmn:intermediateCatchEvent id="click_bell_event" name="Нажатие на колокольчик">
      <bpmn:timerEventDefinition/>
    </bpmn:intermediateCatchEvent>
    <bpmn:exclusiveGateway id="is_panel_visible" name="Панель видима?"/>
    <bpmn:task id="load_content_task" name="Загрузить контент из СОС 'НИЧАТКА'"/>
    <bpmn:task id="show_panel_task" name="Показать панель"/>
    <bpmn:task id="hide_panel_task" name="Скрыть панель"/>
    <bpmn:endEvent id="end_event" name="Конец"/>
    <bpmn:sequenceFlow id="flow1" sourceRef="start_event" targetRef="request_status_task"/>
    <bpmn:sequenceFlow id="flow2" sourceRef="request_status_task" targetRef="display_bell_task"/>
    <bpmn:sequenceFlow id="flow3" sourceRef="display_bell_task" targetRef="click_bell_event"/>
    <bpmn:sequenceFlow id="flow4" sourceRef="click_bell_event" targetRef="is_panel_visible"/>
    <bpmn:sequenceFlow id="flow5" sourceRef="is_panel_visible" targetRef="load_content_task">
      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">No</bpmn:conditionExpression>
    </bpmn:sequenceFlow>
    <bpmn:sequenceFlow id="flow6" sourceRef="load_content_task" targetRef="show_panel_task"/>
    <bpmn:sequenceFlow id="flow7" sourceRef="show_panel_task" targetRef="end_event"/>
    <bpmn:sequenceFlow id="flow8" sourceRef="is_panel_visible" targetRef="hide_panel_task">
      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">Yes</bpmn:conditionExpression>
    </bpmn:sequenceFlow>
    <bpmn:sequenceFlow id="flow9" sourceRef="hide_panel_task" targetRef="end_event"/>
  </bpmn:process>
</bpmn:definitions>
```

```text
Пул: Система
  +------------------------------------------------------+
  | Дорожка: Пользователь                                |
  |  +-----------------------------+                     |
  |  | Начальное событие:          |                     |
  |  | "Загрузка страницы"         |                     |
  |  +-------------+---------------+                     |
  |                |                                     |
  |                v                                     |
  |  +-------------+---------------+                     |
  |  | Задача:                      |                    |
  |  | "Запрос статуса из СОС       |-----------------+  |
  |  | 'НИЧАТКА'"                   |                 |  |
  |  +-------------+---------------+                  |  |
  |                |                                  |  |
  |                v                                  |  |
  |  +-------------+---------------+                  |  |
  |  | Задача:                      |<----------------+  |
  |  | "Отобразить колокольчик      |                    |
  |  | со статусом"                 |                    |
  |  +-------------+---------------+                     |
  |                |                                     |
  |                v                                     |
  |  +-------------+---------------+                     |
  |  | Промежуточное событие:       |                    |
  |  | "Клик на колокольчик"        |                    |
  |  +-------------+---------------+                     |
  |                |                                     |
  |                v                                     |
  |  +-------------+---------------+                     |
  |  | Исключающее условие:         |                    |
  |  | "Панель видима?"             |                    |
  |  +------+------------+----------+                    |
  |         |            |                               |
  |         | Нет        | Да                            |
  |         |            |                               |
  |         v            v                               |
  |  +------+------------+----------+                    |
  |  | Задача:                      |                    |
  |  | "Загрузить контент из СОС    |-----------------+  |
  |  | 'НИЧАТКА'"                   |                 |  |
  |  +------+------------+----------+                 |  |
  |         |                                  +------+  |
  |         |                                  |         |
  |         v                                  v         |
  |  +------+------------+---------+  +------+----------+|
  |  | Задача:                     |  | Задача:         ||
  |  | "Показать панель"           |  | "Скрыть панель" ||
  |  +-------------+---------------+  +------+----------+|
  |                |                                     |
  |                v                                     |
  |  +-------------+---------------+                     |
  |  | Конечное событие:           |                     |
  |  | "Конец"                     |                     |
  |  +-----------------------------+                     |
  +------------------------------------------------------+
  | Дорожка: Система                                     |
  |  +-----------------------------+                     |
  |  | Начальное событие:          |                     |
  |  | "Запрос статуса из СОС      |<-----------------+  |
  |  | 'НИЧАТКА'"                  |                     |
  |  +-------------+---------------+                     |
  |                |                                     |
  |                v                                     |
  |  +-------------+---------------+                     |
  |  | Задача:                     |                     |
  |  | "Отправить запрос к СОС     |                     |
  |  | 'НИЧАТКА'"                  |                     |
  |  +-------------+---------------+                     |
  |                |                                     |
  |                v                                     |
  |  +-------------+---------------+                     |
  |  | Задача:                     |                     |
  |  | "Получить статус"           |                     |
  |  +-------------+---------------+                     |
  |                |                                     |
  |                v                                     |
  |  +-------------+---------------+                     |
  |  | Задача:                     |                     |
  |  | "Передать статус в дорожку  |------------------+  |
  |  | 'Пользователь'"             |                  |  |
  |  +-------------+---------------+                  |  |
  |                |                                  |  |
  |                v                                  |  |
  |  +-------------+---------------+                  |  |
  |  | Задача:                     |                  |  |
  |  | "Загрузить контент из СОС   |<----=------------+  |
  |  | 'НИЧАТКА'"                  |                  |  |
  |  +-------------+---------------+                  |  |
  |                |                                  |  |
  |                v                                  |  |
  |  +-------------+---------------+                  |  |
  |  | Задача:                      |                 |  |
  |  | "Передать контент в дорожку  |-----------------+  |
  |  | 'Пользователь'"              |                    |
  |  +-------------+---------------+                     |
  +------------------------------------------------------+

```

СОС "НИЧАТКА" должна быть реализована как отдельное приложение (django app), работающее в рамках СЗЗ "ВЕХНО". Никакие таблицы БД СЗЗ "ВЕХНО" не должны быть измены. Все таблицы  СОС "НИЧАТКА" должны быть созданы в отдельной схеме БД.

Псевдокод BPMN диаграммы:
1. Создать пул для системы.
2. Добавить дорожки для "Статус" и "Панель".
   * Добавить задачи и события:
      * Начальное событие: "Запрос статуса {user}"
        * Задача: "Отправить ответ на запрос статуса: число сообщений и наивысший приоритет"
           * Промежуточное событие: "Получение списка приоритетов непрочитанных сообщений"
           * Задача: "Посчитать общее количество непрочитанных сообщений (через список статусов)"
           * Задача: "Найти наивысший приоритет среди списка статусов"
   * Добавить задачу и событие:
      * Начальное событие: "Оправить рендер (web-api) для Панели Сообщений"
        * Задача: "Отобразить элемент управления: фильтры"
        * Задача: "Получить и отобразить список сообщений"
          * Промежуточное событие: "Получение списка сообщений в соответствии с фильтрами и пейджинацией"
          * Задача: "Отобразить список -- сообщение-отправитель-дата-время-получатели"
            * Промежуточное событие: "Отобразить дополнительные элементы управления сообщением"
            * Задача: "Отобразить элементы управления: прочитано (скрыть)"
            * Задача: "Отобразить элементы управления: цветовые метки"
            * Задача: "Отобразить элементы управления: ответить"
        * Задача: "Отобразить пейджинатор" 
        * Задача: "Отобразить элемент управления: создать и отправить сообщение"
          * Промежуточное событие: "Получение списка адресатов (пользователей)"
          * Задача: "Отобразить элемент управления: список и выбора адресатов"
          * Задача: "Отобразить элемент управления: список и выбора приоритета"
          * Задача: "Отобразить элемент управления: ввести сообщение (текст)"
          * Задача: "Отобразить элемент управления: Отменить"
          * Задача: "Отобразить элемент управления: Отправить"
           
И так далее... не уверен, что все правильно с точки зрения BPMN (никогда не использовал), но думаю, что идея понятна.


#### 4.2.3 Участники взаимодействия и их роли

Учаcтники: все пользователи СЗЗ "ВЕХНО".

Роли: СОС "НИЧАТКА" -- одноранговая. Каждый может отправить сообщение любому, и ответить на любое полученное сообщение или скрыть его.


#### 4.2.4. Схема взаимодействия

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

Схема взаимодействия пользователей представлена на блок-схеме:

```mermaid
graph TD
    А[Пользователь] -->|Запрос статуса| B(Система)
    B -->|Отправить статус| А
    А -->|Клик на колокольчик (Запросить контент/список сообщений)| B
    B -->|Отобразить список сообщений (в соответсвии с фильтрами и паджинацией)| А
    A -->|Создать сообщение| B
    А -->|Указать адресата или адресатов| --> B
    А -->|Указать приоритет| --> B
    A -->|Отправить сообщение| --> B
```    


#### 4.2.5. Описание смежных видов деятельности

Каждый пользователь при создании сообщения может установить его приоритет. Приоритеты: критично, важно, обычно. Адресат не может изменить приоритет сообщения. Ответив на сообщение, приоритет сохраняется.

Каждый пользователь может установить свои цветовые метки для сообщений. Установленные метки видны только установившему их пользователю.


#### 4.2.6. Описание основных сущностей

Сущности:
* сообщение
* адресат/адресаты (пользователь)
* отправитель (пользователь)
* приоритет сообщения
* цветовая метка сообщения в привязке к пользователю
* статус сообщения (новое, прочитанное, скрытое)
* родительское сообщение (в случае, если сообщение является ответом)
* штамп времени


### 4.3. Входные данные

Весь обмен данными между СОС "НИЧАТКА" и СЗЗ "ВЕХНО" должен осуществляться через web-api. Состав данных определяется через URL-запроса. 

  
### 4.3.1. Состав входной информации 

Запрос статуса:
* Параметры:
    * Уникальный ник-нейм пользователя СЗЗ "ВЕХНО"
    * Токен верификации
* Метод: GET
* Исключения: В случае отсутствия данных, система должна вернуть ошибку 401.

Запрос панели сообщений:
* Поля:
    * Уникальный ник-нейм пользователя СЗЗ "ВЕХНО"
    * Токен верификации
    * Параметры фильтрации
    * Параметры пейджинации.
* Метод: GET
* Исключения: В случае отсутствия данных, система должна вернуть ошибку 401.

Передача сообщения:
* Поля:
    * Уникальный ник-нейм пользователя СЗЗ "ВЕХНО"
    * Токен верификации
    * Адресат/адресаты (если есть, для первичного сообщения)
    * Приоритет
    * Текст сообщения
    * ID родительского сообщения (если есть, для ответа)
* Метод: POST
* Исключения: В случае ошибки данных, система должна вернуть статус 401.

Передача изменения состояния:
* Поля:
    * Уникальный ник-нейм пользователя СЗЗ "ВЕХНО"
    * Токен верификации
    * ID сообщения
    * Параметры изменения: цветовая метка, приоритет, статус
    * Параметры статуса сообщения: прочитано, скрыть
    * Статус "происходит ввод текста" (для предотвращения перезагрузки виджета в момент ввода нового сообщения)
* Метод: PATCH (GET)
* Исключения: В случае ошибки данных, система должна вернуть статус 401.


##### 4.3.2. Наименование набора данных

Никакие данные, кроме уникального ник-нейма пользователя СЗЗ "ВЕХНО" и токена верификации, не должны быть переданы в запросе к СОС "НИЧАТКА". Все прочие запросы и ответы являются частью СОС "НИЧАТКА", и осуществляются внутри блока (виджета) СОС "НИЧАТКА".


###### 4.3.2.1.  Описание входной информации

Все данные из СОС "НИЧАТКА" должны быть переданы в формате составе URL и методом GET или POST.


###### 4.3.2.2.  Формат

Переменные GET или POST.


###### 4.3.2.3. Способ загрузки 

Загрузка данных должна осуществляться через web-api. Витжет СОС "НИЧАТКА" отправляет периодически запрос статуса и запрос на обновление панели сообщений (виджета) в случае если панель открыта.


###### 4.3.2.4.  Владелец

СОС "НИЧАТКА" одноранговая. Сообщения не имеют владельца. И отправитель, и адресата -- равноправные участники, никто не имеет права изменять или удалять сообщения )ни свои. ни других участников).


#### 4.4. Выходные данные

Все данные из СОС "НИЧАТКА" должны быть переданы в формате web-api (готовые фрагменты HTML для обработки внутри виджета). Протокол передачи данных: HTTPS, сжатые gzip, кодировка utf-16.


### 4.5. Нефункциональные требования

Цветовые и стилевые решения внутри виджета СОС "НИЧАТКА" должны быть согласованы с дизайном СЗЗ "ВЕХНО". Виджет должен быть адаптивным и поддерживать все современные браузеры. Виджет должен быть легковесным и не замедлять работу СЗЗ "ВЕХНО". Виджет должен быть удобным в использовании и интуитивно понятным.


## 5. Роли и права доступа пользователей

Роли и права доступа пользователей в СОС "НИЧАТКА" не регламентируются. Все пользователи равноправны и могут обмениваться сообщениями между собой. Права доступа к сообщениям и их изменениям не регламентируются. Пользователь может изменить цветовую метку, приоритет и статус сообщения, а также скрыть его. Эти изменения касаются только отображения сообщений для конкретного пользователя.

## 6. Критерии проверки результатов работ

* Результаты работ должны быть проверены на соответствие бизнес-требованиям и функциональным требованиям.
* Результаты работ должны быть проверены на соответствие нефункциональным требованиям.
* Результаты работ должны быть проверены на соответствие дизайну СЗЗ "ВЕХНО".
* Результаты работ должны быть проверены на соответствие стандартам безопасности и качества кода.
* Результаты работ должны быть проверены на соответствие стандартам производительности и оптимизации кода.
* Результаты работ должны быть проверены на соответствие стандартам адаптивности и кросс-браузерности.
* Результаты работ должны быть проверены на соответствие стандартам доступности и удобства использования.
* Результаты работ должны быть проверены на соответствие стандартам тестирования и отладки.
* Результаты работ должны быть проверены на соответствие стандартам документирования и комментирования кода.