Расчётный ускоритель смен ночного режима для мэрии

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

8

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

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

Функциональность
  • отслеживает активные минуты для вахт городских служб ночного контура и наносит данные на ночную сетку Watcher
  • управляет датчики присутствия Loom через панель Ledger без задержек
  • прогнозирует задержки выплат и заранее предупреждает финансовых контролёров

Внедрение
  • прописать табели бригад и ночные ключи доступа перед вводом
  • сверить старт сменных таймеров с марки Chronos
  • назначить ответственных за бонусный пул и ночной резерв каналов
  • загрузить сценарии шаблон перерасчёта и ночные регламенты

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

#define MODULE_TAG "MUN_LEDGER_WAVE_NIGHT"

new MUN_ShiftMinutes[MAX_PLAYERS];
new MUN_BonusPool[MAX_PLAYERS];
new bool:MUN_OnDuty[MAX_PLAYERS];

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

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

stock MUN_CalcPay(playerid)
{
    return (MUN_ShiftMinutes[playerid] / 5) * 7 + MUN_BonusPool[playerid];
}

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

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

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

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

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

Сверху