Смена статусов в случае использования приоритетов статусов и неперекрывающихся статусовАхтунг! Сейчас уже неактуально!Имеется возможность усложнить логику автоматического перетирания статусов путём установки для каждого статуса некоего приоритета. Сделать это можно для трёх отдельных случаев:
1) для случая смены статуса руками из клиента,
2) для случая смены статуса сервером,
3) для случая смены статуса пользователем из web (речь о возможности приостановить договор).
Статусы устанавливаются именно на каждый из шести статусов, а не на каждый временной промежуток каждого договора.
Возможность включается прописываением в конфигурации сервера нескольких параметров.
Код:
#
# Приоритеты статусов для смены статусов бОльшая цифра - бОльший приоритет. Статус с меньшим приоритетом не перетирает статус с бОльшим. С одинаковыми - перетираются.
# Шесть цифр подряд, через запятую, соотвественно для статусов:
#CONTRACT_STATUS_ACTIVE = 0
#CONTRACT_STATUS_IN_DISCONNECT = 1
#CONTRACT_STATUS_DISCONNECTED = 2
#CONTRACT_STATUS_CLOSED = 3
#CONTRACT_STATUS_SUSPENDED = 4
#CONTRACT_STATUS_IN_CONNECT = 5
# по умолчанию все нули, т.е. все приоритетные одинаково, всё работает как было - все всех перетирают.
# для смены вручную менеджером
contract.status.user.priority=0,0,0,0,1,0
# для автоматической смены сервером
contract.status.server.priority=0,0,0,0,1,0
# для смены юзером через web
contract.status.web.priority=0,0,0,0,1,0
#
Без каких-либо параметров (всех трёх или каждого по-отдельности) все приоритеты считаются равными 0, то есть поведение будет как описано в оригинальной документации - все друг друга перетирают.
После настройки этих параметров статусы будут перетираться избирательно. Кроме того, усложняется логика событий и скриптов.
В случае наличия неперекрывающихся статусов возможны ситуации, когда изначальный статус укорачивается, разбивается другим промежутком(-ами) на несколько частей или совсем вырождается, если перекрывается уже находящимся промежутком с высоким приотиретом.
Обратите внимание, что в события передаётся изначальный статус, без учёта разбиений или иных изменений изначального статуса. В событии ContractStatusChangingEvent также существует поле, содержащее список всех кусочков изначального статуса после обработки операции перекрытия промежутков разных статусов.
Код:
/**
* Возвращает кусочки исходного статуса, они будут отличаться от основного,
* если статус был разбит при пересечении с разными кусками неперетираемых
* статусов.
*
* @return коллекция объектов ContractStatus.
*/
public Collection<ContractStatus> getStatusParts();
Учёт того, что, возможно, устанавливаемый статус не начал действовать или вообще никогда не начнёт надо делать вручную, внутри скрипта, опираясь на список этих кусочков.
Более подробно о алгоритме и логике метода -- ниже.