Рассмотрим задачу начисления премий сотрудникам, например, на основе выполненных ими заказов.
Для реализации такого функционала создадим приложение «Процент от заказов» с тремя полями: Пользователь, Процент (число) и Накопление (деньги). Код приложения «Процент от заказов» — procent_ot_zakazov, а само приложение находится в разделе с кодом motiv.
Также создадим приложение «Заказ» с полями Исполнитель (пользователь) и Сумма заказа (деньги).
Далее нам потребуется добавить шаг Сценарий в процесс обработки заказа.
Сценарий на данном шаге будет вычислять премию, исходя из суммы заказа и процента ответственного пользователя. Премия за каждый выполненный заказ суммируется с общими накоплениями сотрудника. Текст сценария:
Код:
// Расчет бонуса исполнителя
async function calculateBonus(): Promise <void> {
// Проверим, есть ли заказ в контексте процесса
if (Context.data.orders) {
// Получаем заказ
const order = await Context.data.orders.fetch();
// Ищем в приложении "Процент от заказов" по исполнителю
const motiv = await Global.ns.motiv.app.procent_ot_zakazov.search()
.where(f => f.user.eq(order.data.executor!))
.first();
// Если исполнитель найден и у него не нулевой процент
if (motiv && motiv.data.percent) {
// Рассчитываем бонус
const bonus = order.data.sum!.multiply(motiv.data.percent / 100);
// Добавляем бонус к текущим накоплениям исполнителя
motiv.data.acc = motiv.data.acc
? motiv.data.acc.add(bonus)
: bonus;
// Сохраняем процент заказов исполнителя
await motiv.save();
}
}
}
Например, если создать заказ, указав исполнителя и сумму, то по завершении бизнес-процесса элемент приложения «Процент от заказов» с соответствующим пользователем будет изменен с учетом нового бонуса.
Информацию о накоплениях пользователей можно выгрузить в виде Excel файла для расчета заработной платы. Для этого создадим следующий бизнес-процесс:
Бизнес-процесс состоит из следующих шагов:
1. Сценарий определяет пользователей, у которых есть накопления.
Текст сценария:
Код:
// Получаем пользователей, у которых есть накопления
async function getBonuses(): Promise {
Context.data.procent_ot_zakazov = await Application.search()
.where(f => f.acc.gt(0))
.all();
}
Генерируется Excel файл отчета по премиям.
2. Сценарий обнуляет накопления пользователей. Текст сценария:
Код:
// Обнуляем накопления у выбранных пользователей
async function pruneBonuses(): Promise {
const bonuses = await Context.fields.procent_ot_zakazov.fetchAll();
for (let i = 0; i < bonuses.length; i++) {
bonuses[i].data.acc = new Money(0, 'RUB');
await bonuses[i].save();
}
}
3. Файл отчета выводится в задачу пользователя.