Сценарии в бизнес-процессах / Расчет бонуса и генерация отчета по заработной плате

Расчет бонуса и генерация отчета по заработной плате

Рассмотрим задачу начисления премий сотрудникам, например, на основе выполненных ими заказов.

Для реализации такого функционала создадим приложение «Процент от заказов» с тремя полями: Пользователь, Процент (число) и Накопление (деньги). Код приложения «Процент от заказов» – procent_ot_zakazov, а само приложение находится в разделе с кодом motiv.

Также создадим приложение "Заказ" с полями Исполнитель (пользователь) и Сумма заказа (деньги).

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

01.png

Сценарий на данном шаге будет вычислять премию, исходя из суммы заказа и процента ответственного пользователя. Премия за каждый выполненный заказ суммируется с общими накоплениями сотрудника. Текст сценария:

// Расчет бонуса исполнителя
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();
        }
    }
}

Например, если создать заказ, указав исполнителя и сумму, то по завершении бизнес-процесса элемент приложения «Процент от заказов» с соответствующим пользователем будет изменен с учетом нового бонуса.

1.png

Информацию о накоплениях пользователей можно выгрузить в виде Excel файла для расчета заработной платы. Для этого создадим следующий бизнес-процесс:

03.png

Бизнес-процесс состоит из следующих шагов:

Сценарий определяет пользователей, у которых есть накопления.

Текст сценария:

// Получаем пользователей, у которых есть накопления
async function getBonuses(): Promise {
    Context.data.procent_ot_zakazov = await Application.search()
        .where(f => f.acc.gt(0))
        .all();
}

Генерируется Excel файл отчета по премиям:

5.png

05.png

Сценарий обнуляет накопления пользователей.

Текст сценария:

// Обнуляем накопления у выбранных пользователей
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();
    }
}

Файл отчета выводится в задачу пользователя.