Как было описано в документе [Сохранение задачи в кеш CouchDB](./Сохранение%20задачи%20в%20кеш%20CouchDB.md) специфика работы с данными из issue такова что есть два состояния - предыдущее и текущее состояние.

Значит есть возможность сравнения двух состояний и построение дополнительной логики на основе сравнения.

Это позволило реализовать рассылку уведомлений при обнаружении в задачах изменений.

Функции сохранения данных в CouchDB с вычислением изменений реализована в `libs/event-emitter/src/issue-cache-writer/redmine-issues-cache-writer.service.ts`.

Затем с помощью пайплайнов rxjs реализован дополнительный анализ изменений:

1. `src/notifications/personal-notifications.service.ts` - поиск упоминаний пользователей redmine в комментариях для пересылки личных уведомлений в чат-бот
2. `src/notifications/status-change-notifications.service.ts` - поиск изменений статусов для рассылки уведомлений согласно изменениям ответственного за дальнейшую работу над задачей
3. `src/changes-cache-writer/changes-cache-writer.service.ts` - сохранение изменений в дополнительный журнал активностей в коллекцию в CouchDB

Сам пайплайн rxjs определяется в инициализирующей функции в `src/app.module.ts`.

Для правильности работы функций анализа нужно выполнить правильно конфигугирование.

Статусы используемые в вашем экземпляре redmine определяются в конфигурационном файле `configs/redmine-statuses-config.jsonc`. Они имеет следующий вид:

```json
[
  {
    "id": 1,
    "name": "New"
  },
  {
    "id": 2,
    "name": "In Progress"
  },
  {
    "id": 3,
    "name": "Closed",
    "is_closed": true
  }
  // ...
]
```

Идентификаторы и name должны соответствовать статусам настроенным в основном redmine.

Правила для определения изменений в статусах определяются с помощью конфигурационного файла `configs/redmine-status-changes-config.jsonc`. Он имеет следующий вид:

```json
[
  {
    "default": false,
    "from": "New",
    "to": "In Progress",
    "messages": [
      {
        "recipient": "<field_name>",
        // Handlebars - template engine
        "changes_message": "{{qa.name}} got issue #{{issue_id}} after development {{dev.name}}",
        "notification_message": "<a href=\"{{ issue_url }}\">{{ issue_tracker }} #{{ issue_id }}</a> {{ issue_subject }}:\n{{dev.name}} finished development. You can test issue.\n\n{{journal_note}}"
      }
      // ...
    ]
  }
  // ...
]
```

Это набор правил для формирования уведомлений и сообщений для журнала изменений. Поля "from" и "to" - указывают на возможные статусы задачи. "messages" - это набор сообщений. Тут можно определить варианты сообщений для различных получателей задаваемых полем "recipient", а тексты сообщений с помощью шаблонизатора [Handlebars](https://handlebarsjs.com).