# Examples of Default Process Change ListenerS

## Kernel

### Add customer link to a created process

    onProcessEvent.{@inc:cnt}.events=created
    onProcessEvent.{@cnt}.doExpression=<<END
        customerId = 1;
        customerTitle = "Customer Title";
        dao=new("ru.bgcrm.dao.process.ProcessLinkDAO", conSet.getConnection());
        link=new("ru.bgcrm.model.CommonObjectLink", "process", process.getId(), "customer", customerId, customerTitle);
        dao.addLink(link);
    END

### Разрешение на правку процесса при различных условиях

В различных статусах различным группам, исполнителю либо администратору и запрет правки закрытого процесса.

    onProcessEvent.{@inc:cnt}.checkExpression=process.getStatusId() !~ [9, 13, 36,39] or 8 =~ user.getGroupIds()
    onProcessEvent.{@cnt}.checkErrorMessage=В этом статусе разрешена правка только сотрудникам КС
    onProcessEvent.{@inc:cnt}.checkExpression=process.getStatusId() != 9 or user.getId()  =~ process.getExecutorIds() or 33 =~ user.getPermsetIds()
    onProcessEvent.{@cnt}.checkErrorMessage=В этом статусе разрешена правка только исполнителем процесса либо администратором КС
    onProcessEvent.{@inc:cnt}.checkExpression=process.getCloseTime() == null
    onProcessEvent.{@cnt}.checkErrorMessage=Запрещена правка закрытого процесса

### Добавление пользователя в исполнители и смена статуса

Добавление текущего пользователя в исполнители и установка в статус с кодом 40, если процесс создан как привязанный к другому процессу.

    onProcessEvent.{@inc:cnt}.events=createdAsLink
    onProcessEvent.{@cnt}.doExpression=addExecutors({user.getId()});setStatus(40, "")

### Установка статуса

Изменение статуса процесса на 3 при получении в него нового сообщения.

    onProcessEvent.{@inc:cnt}.events=messageAdded
    onProcessEvent.{@cnt}.ifExpression=process.getStatusId() != 3
    onProcessEvent.{@cnt}.doExpression=setStatus(3, "")

### Установка значения параметра типа text

    onProcessEvent.{@inc:cnt}.doExpression=<<END
        dao = new("org.bgerp.dao.param.ParamValueDAO", conSet.getConnection());
        dao.updateParamText(process.getId(), 63, "тест");
    END

### Установка значения параметра типа list

    onProcessEvent.{@inc:cnt}.doExpression=<<END
        dao = new("org.bgerp.dao.param.ParamValueDAO", conSet.getConnection());
        dao.updateParamList(process.getId(), 63, {1});
    END

После изменения статуса если списковый параметр процесса 63 не содержит значений с кодами 1, 2 и 3 установка значения 1 в этот параметр.

    onProcessEvent.{@inc:cnt}.events=statusChanged
    onProcessEvent.{@cnt}.ifExpression=empty(cu.intersection(processParam.listValueIds(63), {1,2,3}))
    onProcessEvent.{@cnt}.doExpression=<<END
        dao = new("org.bgerp.dao.param.ParamValueDAO", conSet.getConnection());
        dao.updateParamList(process.getId(), 63, {1});
    END

### Удаление из процесса исполнителей и групп решения

C кодом 2 и группы с кодом 37.

    onProcessEvent.{@inc:cnt}.doExpression=<<END
        deleteExecutors({2});
        deleteGroups({37});
    END

### При создании процесса установка параметра типа date

При создании процесса внесение в параметр типа "date" с кодом 51 значения текущей даты + два дня, не учитывая вторников.

    onProcessEvent.{@inc:cnt}.events=created
    onProcessEvent.{@cnt}.doExpression=<<END
        dao = new("org.bgerp.dao.param.ParamValueDAO", conSet.getConnection());
        cal = new("java.util.GregorianCalendar");
        addDays = 2;
        while (addDays > 0) {
            var dw = cal.get(cal.DAY_OF_WEEK);
            if (dw != cal.TUESDAY)
                addDays = addDays - 1;
            cal.add(cal.DAY_OF_YEAR, 1);
        }
        dao.updateParamDate(process.getId(), 51, cal.getTime());
    END

### Смена статуса привязанного процесса

Поиск процесса, к которому привязан текущий процесс и если он найден - смена его статуса.

    onProcessEvent.{@inc:cnt}.events=statusChanged
    onProcessEvent.{@cnt}.doExpression=<<END
        pld = new("ru.bgcrm.dao.process.ProcessLinkDAO", conSet.getConnection());
        linked = u.getFirst(pld.getLinkedProcessList(process.getId(), null, false, {1}));
        if (linked != null) {
            change = new("ru.bgcrm.model.process.StatusChange");
            change.setDate(new("java.util.Date"));
            change.setProcessId(linked.getId());
            change.setUserId(event.getUser().getId());
            change.setStatusId(9);
            change.setComment("Автоматическая смена статуса");

            pa = org.bgerp.action.ProcessAction;
            pa.processStatusUpdate(event.getForm(), conSet.getConnection(), linked, change);
        }
    END

### Изменение приоритета процесса при смене статуса

При смене статуса на 10 или 12 установка приоритета 5.

    onProcessEvent.{@inc:cnt}.events=statusChanged:10,12
    onProcessEvent.{@cnt}.doExpression=setPriority(5);

### Проверка класса события

    if (event.getClass().getName() == "ru.bgcrm.event.process.ProcessMessageAddedEvent") {
        text += '<b>Сообщение</b>: ' + u.maskNull(event.getMessage().getText()) + ';';
    }

### Добавление текста в описание процесса при смене статуса

    onProcessEvent.{@inc:cnt}.events=statusChanging
    onProcessEvent.{@cnt}.doExpression=<<END
        dao = new("ru.bgcrm.dao.process.ProcessDAO", conSet.getConnection());

        change = event.getStatusChange();
        change = ctxUserMap[change.getUserId()].getTitle() + " => " + ctxProcessStatusMap[change.getStatusId()].getTitle() + " [" + change.getComment() + "]";

        process.setDescription(process.getDescription() + NEW_LINE + change);
        dao.updateProcess(process);
    END

## Плагин BGBilling

### Копирование параметров договора BGBilling

Копирование параметра адрес с кодом 8 из привязанного договора в параметр процесса с кодом 4.

    onProcessEvent.{@inc:cnt}.events=linkAdded;createdAsLink
    onProcessEvent.{@cnt}.doExpression=bgbilling.cp(8, '', 4)

## Плагин SMS

### Отправка СМС

Отправка СМС сообщения по созданию процесса, в случае наличия в значениях спискового параметра с кодом 26 1, 2 или 3. Используется операция пересечения множеств. Номер для СМС получается из параметра с кодом 20 типа Phone.

    onProcessEvent.{@inc:cnt}.events=createFinished
    onProcessEvent.{@cnt}.ifExpression=cu.intersection(processParam.listValueIds(26), {1,2,3}).size() > 0
    onProcessEvent.{@cnt}.doExpression=<<END
        phone=processParam.getParamPhoneNoFormat(20);
        if (phone) {
            sms.sendSms(phone, "Заявка №".concat( process.getId().toString() ).concat(" принята"));
        }
    END

## Плагин Mobile

### Отправка Push уведомления

Отправлка уведомление с параметрами процесса диспетчеру аварийной бригады. Установлена проверка типа работ из параметра list id 26, передаются номер процесса, адрес, телефоны, тип работ, дата и время приема, комментарий.

    onProcessEvent.{@inc:cnt}.events=createFinished
    onProcessEvent.5.ifExpression=cu.intersection(processParam.listValueIds(26), {2,3,7}).size() > 0
    onProcessEvent.5.doExpression=<<END
        body=process.getTypeTitle();
        text="№ " + process.getId().toString() + " Адрес: " + processParam.getValue(1) + " т. " + processParam.getValue(20) + " " + processParam.getValue(26) + " Принята: " + process.getCreateTime() + " Комментарий: " + process.getDescription();
        mobile.sendMessageToUsers(body, text, {5});
    END