Скрипт для определения пользователя из доп. поля как участника процесса (пример скрипта для дизайнера)

В рамках процесса необходимо чтобы пользователь с ролью “Ответственный” автоматически добавлялся в список согласующих на одноименную роль. Брать его надо из доп. поля “Ответственный” на вкладке “Детали”.

В скрипте необходимо указать код доп. поля, имя роли и код процесса. Пример дизайна, где используется скрипт.

Скрипт

import com.haulmont.cuba.core.global.AppBeans
import com.haulmont.cuba.core.global.DataManager
import com.haulmont.cuba.core.global.LoadContext
import com.haulmont.cuba.core.global.Metadata
import com.haulmont.cuba.security.entity.User
import com.haulmont.thesis.core.entity.Doc
import com.haulmont.workflow.core.entity.CardRole
import com.haulmont.workflow.core.entity.ProcRole
import groovy.transform.Field
  
Doc doc = card;
@Field DataManager dataManager = AppBeans.get(DataManager.NAME)
  
clearChiefRoles();
  
User user = doc.getValue("+123");
if (user != null) {
    ProcRole procRole = getProcRoleByCode("Ответственный");
    Metadata metadata = AppBeans.get(Metadata.NAME);
    CardRole chiefCardRole = metadata.create(CardRole.class);
    chiefCardRole.setCard(doc);
    chiefCardRole.setProcRole(procRole);
    chiefCardRole.setCode(procRole.getCode());
    chiefCardRole.setUser(user);
    chiefCardRole.setSortOrder(1);
    dataManager.commit(chiefCardRole);
}
return true;
  
def void clearChiefRoles() {
    ProcRole procRole = getProcRoleByCode("Ответственный");
    for (CardRole cardRole : card.getRoles()) {
        if (cardRole.getProcRole().equals(procRole)) {
            dataManager.remove(cardRole);
        }
    }
}
  
def ProcRole getProcRoleByCode(String code) {
    LoadContext context = new LoadContext(ProcRole.class)
            .setView("task-edit");
context.setQueryString("select pr from wf\$ProcRole pr where pr.code = :code and pr.proc.code = :procCode")
            .setParameter("code", code)
            .setParameter("procCode", "ubi");
    return dataManager.load(context);
}