В event sourcing мы сохраняем изменения как последовательность событий. Актуальная сделка получается с помощью fold: события применяются по порядку и формируют её текущее состояние.
Здесь важна простая аксиома: в сделке может измениться любой параметр.
Может появиться отсутствующее поле, измениться портфель, продукт, контрагент, направление или статус. Поэтому система должна накапливать события и поддерживать полную актуальную модель сделки.
Для каждого события нужно ответить на три разных вопроса:
| Вопрос | Ответ |
|---|---|
| Нужно ли сохранить новое состояние сделки? | Да |
| Нужно ли применить событие к folded-модели? | Да |
| Нужно ли добавить сделку в расчёт? | Зависит от её текущей релевантности |
Таким образом, «не учитывать сделку» не означает «не обрабатывать событие».
Когда сделка не учитывается
Причины можно объединить в несколько групп.
Сделка находится вне риск-периметра. Например, исключены её продукт, портфель, контрагент или экономическое направление.
Сделка неактивна для конкретного вида риска. Универсального понятия «финального статуса» недостаточно: один статус может завершать один риск, но оставлять обязательства по другому.
Для расчёта недостаточно данных. Например, отсутствует идентификатор контрагента или другое обязательное поле.
Наконец, система может не поддерживать продукт или не суметь однозначно определить для него класс риска.
Во всех этих случаях сделка не участвует в текущем расчёте, но её состояние продолжает сохраняться.
Следующая amendment может сделать её релевантной. Возможен и обратный переход: ранее учтённую сделку потребуется удалить из расчётной группы и пересчитать результат без неё.
Главный принцип можно сформулировать так:
Состояние сделки сохраняем всегда. В расчёт включаем только её релевантную текущую версию.