Заполнение в процесс переменной dueDate из длительности этапа (пример скрипта для дизайнера)

Для работы таймера возможно выбрать время “из процесса”. В этом случае таймер смотрит в переменную dueDate, которая проставляется в формах процесса из поля “Завершить до”. В случае настройки в процессе “Разрешить задание длительности этапа”, поле “Завершить до” скрывается и никак в процессе не заполняется. Скрипт проставляет в переменную процесса dueDate вычисленную по рабочему календарю дату на основании длительности этапа. Если срок не указан, то проставляет 7 календарных дней. Использовали для настройки автоперехода в процессе по таймеру.

Скрипт

import com.haulmont.cuba.core.Persistence
import com.haulmont.cuba.core.Transaction
import com.haulmont.cuba.core.global.AppBeans
import com.haulmont.cuba.core.global.TimeSource
import com.haulmont.workflow.core.app.WfService
import com.haulmont.workflow.core.app.WorkCalendarAPI
import com.haulmont.workflow.core.entity.CardRole
import org.apache.commons.logging.Log
import org.apache.commons.logging.LogFactory
 
Log log = LogFactory.getLog("123");
Persistence persistence = AppBeans.get(Persistence.class);
Transaction tx = persistence.createTransaction()
CardRole cardRole = null;
try {
    cardRole = persistence.getEntityManager().createQuery("select c from wf\$CardRole c where c.card.id=:cardId and c.code=:code")
            .setParameter("cardId", card.id)
            .setParameter("code", "Initiator2").getFirstResult()
    tx.commit()
} finally {
    tx.end()
}
if (cardRole != null) {
    WfService wfService = AppBeans.get(WfService.class)
    Map<String, Object> processVariables = wfService.getProcessVariables(card);
    WorkCalendarAPI workCalendar = AppBeans.get(WorkCalendarAPI.NAME);
    def dueDate;
    if (cardRole.duration == null || cardRole.duration == 0) {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DAY_OF_YEAR, 7)
        dueDate = calendar.getTime();
    } else {
        dueDate = workCalendar.addInterval(AppBeans.get(TimeSource.class).currentTimestamp(), cardRole.duration, cardRole.timeUnit)
    }
    processVariables.put("dueDate", dueDate)
    wfService.setProcessVariables(card, processVariables)
}