Автоматизированный расчет зарплат для полиции

Активный
Статус
Сообщения
516
Лайки
32

8

месяц на сайте

Контекст
Комплекс учитывает дежурства, минуту за минутой считает стаж и сразу готовит выплаты. Решение поддерживает дежурную часть полиции.

Функциональность
  • копит активные минуты смены у каждого сотрудника
  • поддерживает бонусный пул за особые операции
  • выдает расчетные листы прямо в игре

Внедрение
  • включите отслеживание статуса дежурства в OnPlayerStateChange
  • запланируйте ежеминутный таймер начислений
  • заведите справочник базовых тарифов
  • утвердите процедуру внеплановых бонусов

Код
Код:
#include <a_samp>
#include <zcmd>
#include <sscanf2>

#define MODULE_TAG "PD_PAYROLL_DISPATCH"

new PD_ShiftMinutes[MAX_PLAYERS];
new PD_BonusPool[MAX_PLAYERS];
new bool:PD_OnDuty[MAX_PLAYERS];

public OnGameModeInit()
{
    SetTimer("PDPayrollTick", 60000, true);
    return 1;
}

forward PDPayrollTick();
public PDPayrollTick()
{
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
        if(!IsPlayerConnected(i) || !PD_OnDuty[i]) continue;
        PD_ShiftMinutes[i]++;
        if(PD_ShiftMinutes[i] % 30 == 0)
        {
            SendClientMessage(i, 0x00FFFFFF, "[%s] Добавлены минуты стажа.", MODULE_TAG);
        }
    }
    return 1;
}

stock PD_CalcPay(playerid)
{
    return (PD_ShiftMinutes[playerid] / 5) * 6 + PD_BonusPool[playerid];
}

CMD:payrollpd(playerid, const params[])
{
    new msg[128];
format(msg, sizeof(msg), "[%s] Минуты: %d | Бонус: %d | Выплата: %d$", MODULE_TAG, PD_ShiftMinutes[playerid], PD_BonusPool[playerid], PD_CalcPay(playerid));
    SendClientMessage(playerid, 0x6A5ACDFF, msg);
    return 1;
}

CMD:payadjustpd(playerid, const params[])
{
    new target, minutes, bonus, duty;
    if(sscanf(params, "uiii", target, minutes, bonus, duty)) return SendClientMessage(playerid, -1, "Используй: /payadjustpd [id] [мин] [бонус] [дежурство 0/1]");
    PD_ShiftMinutes[target] = minutes;
    PD_BonusPool[target] = bonus;
    PD_OnDuty[target] = (duty != 0);
    SendClientMessage(target, 0x32CD32FF, "[%s] Запись обновлена. Дежурство: %d.", MODULE_TAG, PD_OnDuty[target]);
    return 1;
}

Тест-кейсы
  • запустите тестовую смену на 10 минут и сравните начисление
  • проверьте обработку выхода со службы без команды
  • выдайте бонус вручную и убедитесь что он добавился

Эксплуатация
  • блокируйте начисления при простоях сервера
  • выгружайте итоговые суммы в бухгалтерию
  • ежеквартально обновляйте тарифы
  • отчеты автоматически попадают в полиция
 

1 человек читают эту тему (Всего: 1, Пользователей: 0, Гостей: 1)

Сверху