...

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

Тема в разделе "Примеры сценариев", создана пользователем evgeneva, 7 окт 2021.

  1. evgeneva

    evgeneva Участник

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

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

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

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

    Сценарий на данном шаге будет вычислять премию, исходя из суммы заказа и процента ответственного пользователя. Премия за каждый выполненный заказ суммируется с общими накоплениями сотрудника. Текст сценария:
    Код:
    
    // Расчет бонуса исполнителя
    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.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 файла для расчета заработной платы. Для этого создадим следующий бизнес-процесс:
    [​IMG]
    Бизнес-процесс состоит из следующих шагов:

    1. Сценарий определяет пользователей, у которых есть накопления.
    Текст сценария:
    Код:
    
    // Получаем пользователей, у которых есть накопления
    async function getBonuses(): Promise {
        
    Context.data.procent_ot_zakazov await Application.search()
            .
    where(=> f.acc.gt(0))
            .
    all();
    }
    Генерируется Excel файл отчета по премиям.
    [​IMG]
    [​IMG]

    2. Сценарий обнуляет накопления пользователей. Текст сценария:
    Код:
    
    // Обнуляем накопления у выбранных пользователей
    async function pruneBonuses(): Promise {
        const 
    bonuses await Context.fields.procent_ot_zakazov.fetchAll();
        for (
    let i 0bonuses.lengthi++) {
            
    bonuses[i].data.acc = new Money(0'RUB');
            
    await bonuses[i].save();
        }
    }
    3. Файл отчета выводится в задачу пользователя.
    Последнее редактирование модератором: 12 окт 2021