Всем привет!
Столкнулся с проблемой запрета перехода на стадии Продажи при определенных условиях. Например, в карточке Продажи если деталь Товары. Мне нужно запретить пользователям переходить на определенную стадию есть в детали Товары не добавлено ни одного товара. В стадийной модели, насколько я понял, задается только матрица переходов и нет возможности задать какие-нибудь условия.
Как реализовать данный функционал?
С уважением.
Нравится
Пока механизмов пользовательской настройки условий перехода нет, но она запланирована. Сейчас делали это разработкой, следующим алгоритмом. Алгоритм позволяет делать асинхронные проверки, потому выглядит достаточно сложным, если именно асинхронные проверки не нужны, и все проверки можно сделать синхронно, можете его упростить:
1. Создаете атрибут на странице с названием вроде "ПереходНаТакуюТоСтадиюРазрешен": ложь
2. Создаете атрибут на странице с названием вроде "АсинхроннаяПроверкаВыполнена": ложь
3. Замещаете метод save: , в нем проверяеете какую сейчас выбрали стадию, если ту что требует проверок, и атрибут АсинхроннаяПроверкаВыполнена = ложь, то проверка не выполнена, запускаете метод проверки (4).
4. Пишите метод проверки который проверяет нужные вам условия, и в результате выполнения устанавливаете ПереходНаТакуюТоСтадиюРазрешен согласно ваших проверок, а АсинхроннаяПроверкаВыполнена в истину. В этом же методе вызываете снова метод save();
5. Метод сейв дописываете так, что если АсинхроннаяПроверкаВыполнена = истина, а ПереходНаТакуюТоСтадиюРазрешен = ложь, то выводите пользователю сообщение что сохранение запрещено потому что потому... А если АсинхроннаяПроверкаВыполнена = истина, а ПереходНаТакуюТоСтадиюРазрешен = истина, то, вызываете родительскую реализацию через this.callParent(arguments).
Вот и все, так же можно доработать алгоритм визуальным откатом на предыдущую стадию, для этого нужно будет внести атрибуты для кеширования стадий, но это не обязательно, ведь в БД и так стадию не сохранило.
Пока механизмов пользовательской настройки условий перехода нет, но она запланирована. Сейчас делали это разработкой, следующим алгоритмом. Алгоритм позволяет делать асинхронные проверки, потому выглядит достаточно сложным, если именно асинхронные проверки не нужны, и все проверки можно сделать синхронно, можете его упростить:
1. Создаете атрибут на странице с названием вроде "ПереходНаТакуюТоСтадиюРазрешен": ложь
2. Создаете атрибут на странице с названием вроде "АсинхроннаяПроверкаВыполнена": ложь
3. Замещаете метод save: , в нем проверяеете какую сейчас выбрали стадию, если ту что требует проверок, и атрибут АсинхроннаяПроверкаВыполнена = ложь, то проверка не выполнена, запускаете метод проверки (4).
4. Пишите метод проверки который проверяет нужные вам условия, и в результате выполнения устанавливаете ПереходНаТакуюТоСтадиюРазрешен согласно ваших проверок, а АсинхроннаяПроверкаВыполнена в истину. В этом же методе вызываете снова метод save();
5. Метод сейв дописываете так, что если АсинхроннаяПроверкаВыполнена = истина, а ПереходНаТакуюТоСтадиюРазрешен = ложь, то выводите пользователю сообщение что сохранение запрещено потому что потому... А если АсинхроннаяПроверкаВыполнена = истина, а ПереходНаТакуюТоСтадиюРазрешен = истина, то, вызываете родительскую реализацию через this.callParent(arguments).
Вот и все, так же можно доработать алгоритм визуальным откатом на предыдущую стадию, для этого нужно будет внести атрибуты для кеширования стадий, но это не обязательно, ведь в БД и так стадию не сохранило.
Есть вариант с "безотканой" проверкой,
[color=green]Соответственно данный подход работает именно при клике юзера по "колбасе", если стадии будут двигаться бизнес-процессами этот вариант не подойдет[/color]
Вам необходимо будет расширять/перекрывать методы класса BaseStageControl (схема BaseStageControl как ни странно :))
В частности его метода onStageItemMenuClick
Куда вы можете внедрить вызов любых необходимых Вам проверок, и соответственно прервать или "отпустить" выполнение дальнейшей логики по смене стадии.
PS: Очень важный момент в данном случае, это что в контексте экземпляра этого класса Вам будет доступны значения как стадии с которой переходят, так и стадия на которую планируется переход
изучив схему вы быстрой поймете что где, если понимаете как такие классы устроены концептуально.