Скрипт для модуля "Выбор" при согласовании в параллельных ветках "Ветвление" (пример скрипта для дизайнера)

Скрипт для параллельного согласования карточки с именными ролями и состояниями. Пример, такой схемы на скриншоте.


Из-за специфики работы модуля “Ветвление” и “Объединение” с наскока такую схему реализовать не получится. Требуется скриптом вычислять, было ли отклонение и если да, то выводить карточку на доработку. В противном случае вести процесс дальше.

Ниже скриншот правильной схемы. Суть - добавляются состояния по каждому выходу, выходы группируются в пустой модуль и таким образом достигаем правила “сколько веток в ветвлении столько входов в объединение”.


Так же добавляется модуль “Выбор”, в котором вычисляется направление движения по процессу. Ниже скрипт.

ToImprovement

import com.haulmont.cuba.core.EntityManager
import com.haulmont.cuba.core.Persistence
import com.haulmont.cuba.core.Query
import com.haulmont.cuba.core.global.AppBeans
 
EntityManager em = AppBeans.get(Persistence.class).getEntityManager();
Query query = em.createNativeQuery("select a.id from wf_Assignment a where a.card_id = '" + card.id + "' and a.outcome in('Otkloneno_IT','Otkloneno_VB','Otkloneno_RI') and a.name in ('Na_soglasovanii_u_IT_direktora', 'Na_soglasovanii_u_vladelca_budzheta', 'Na_soglasovanii_u_ruk__iniciatora') and a.iteration = (select MAX(ass.iteration) from wf_Assignment ass where ass.card_id = '" + card.id + "' and ass.name = a.NAME)");
 
Object result = query.getFirstResult();
 
return result != null || card.state.contains("Otkloneno_IT") || card.state.contains("Otkloneno_VB") || card.state.contains("Otkloneno_RI") ;

В a.outcome указываются имена неуспешных выходов, a.name - имена этапов из ветвления, card.state.contains - перечислить состояния при неуспешных переходах.

Если есть хотя бы одно неуспешное состояние, то идем по ветке “Да” в доработку. Если иначе, то движемся дальше по процессу.