⛽ Розрахунок витрат пального

Нормативний розрахунок витрати ПММ для транспортних засобів за подорожнім листом — лінійна норма, сезонні надбавки, причепи, ГБО, спецтехніка.

Зміст

📋Огляд 🔑Автентифікація 📥Запит 🧮Формули 📤Відповідь 💡Приклади ⚠️Помилки 🔧ГБО

Огляд Fuel Consumption API

Нормативний розрахунок витрати пально-мастильних матеріалів (ПММ)

Fuel Consumption API — універсальний сервіс розрахунку нормативної витрати ПММ для транспортних засобів за подорожнім листом. Розрахунок виконується згідно з методикою, що враховує лінійну норму, сезонні надбавки, умови експлуатації, вагу причепів, спецроботи та інші фактори.

Базова URL: https://geodataua.runasp.net/api/fuel
🚛

Будь-який тип ТЗ

Вантажівки, спецтехніка без спідометра, автомобілі з ГБО, причепи-самоскиди

🧮

Повна розшифровка

Розбивка по компонентам: пробіг, простій, мотогодини, транспортна робота, опалювач

📊

Всі надбавки

Сезонна, температурна, умови роботи, індивідуальна надбавка ТЗ

🔗

Готова інтеграція

Норми передаються у запиті — API не зберігає довідники. Сумісно з 1С, SAP, власною БД

🔑 Автентифікація

Усі запити вимагають API-ключа

API-ключ передається у заголовку кожного запиту:

X-API-Key: <YOUR_API_KEY>

API-ключ видається при реєстрації клієнта в особистому кабінеті.

⚙️ Ендпоінти

Два ендпоінти для одиночного та пакетного розрахунку

МетодURLОпис
POST /api/fuel/consumption/calculate Розрахунок для одного ТЗ / одного подорожнього листа
Content-Type: application/json

Коди відповідей

КодОпис
200Успішний розрахунок
400Невалідні вхідні дані
401Невалідний або відсутній API-ключ
422Лінійна норма не задана або дорівнює 0

📥 Структура запиту

Опис усіх вхідних об'єктів

Верхній рівень

ПолеТипОбов'язк.Опис
vehicleVehicle✅Транспортний засіб
fuelFuel✅Вид пального для розрахунку
tripSheetTripSheet✅Дані подорожнього листа
consumptionNormsConsumptionNorms✅Норми витрат пального для моделі ТЗ
trailersTrailer[]❌Причепи / спецобладнання
optionsOptions❌Додаткові параметри

Vehicle — Транспортний засіб

ПолеТипОбов'язк.Опис
idstring✅Ідентифікатор ТЗ
modelNamestring❌Назва моделі (для документації)
hasSpeedometerbool✅Наявність спідометра. true → розрахунок за пробігом; false → за мотогодинами
ownWeightdecimal❌Власна вага ТЗ (кг), якщо відрізняється від моделі
vehicleSurchargedecimal❌Індивідуальна надбавка ТЗ (%, знос, техстан). За замовч. 0
dualFuelbool❌Двопаливний режим. За замовч. false
lpgModelLpgModel❌Параметри ГБО (якщо є)

LpgModel — Газобалонне обладнання

ПолеТипОбов'язк.Опис
primaryFuelIdstring✅ID основного пального ГБО
primaryFuelRemainingdecimal✅Залишок ГБО (при виїзді + видано), л
mainFuelRemainingdecimal✅Залишок основного пального ТЗ, л
secondaryFuelRemainingdecimal✅Залишок додаткового пального ТЗ, л

Fuel — Вид пального

ПолеТипОбов'язк.Опис
idstring✅Ідентифікатор пального
namestring❌Назва (ДП, АІ-95, LPG тощо)

TripSheet — Подорожній лист

ПолеТипОбов'язк.Опис
datestring (date)✅Дата подорожнього листа
temperaturedecimal❌Температура повітря (°C). За замовч. 0
heaterWorkTimeSecondsint❌Час роботи автономного опалювача (сек)
defaultWorkConditionSurchargedecimal❌Надбавка на умови роботи зі шапки ПЛ (%)
tripTypestring❌ standard (за замовч.) або special.
При special для ТЗ без спідометра до НормаНаОборудование та НормаНаОперації додатково застосовується множник (1 + (seasonal + temperature) / 100)
fuelMileagedecimal❌ Пробіг на поточному паливі (для dualFuel = true). Замінює S у формулі пробігу. SS3 коригується пропорційно: SS3 × fuelMileage / S
performancePerformance[]✅Виробіток ТЗ та причепів
tasksTask[]❌Завдання маршруту для середньозваженої надбавки
idlePeriodsIdlePeriod[]❌Простої з увімкненим двигуном

Performance — Виробіток

ПолеТипОбов'язк.Опис
vehicleIdstring✅ID ТЗ або причепа/навісного
parameterstring (enum)✅Тип показника (таблиця нижче)
valuedecimal✅Значення показника
Значення parameterОдиницяОпис
totalMileageкмЗагальний пробіг ТЗ або причепа
workTimeSecondsсекЧас у роботі — для ТЗ без спідометра або навісного без бака
tripCountштКількість їздок
operationCountштКількість операцій (підйом кузова тощо)
specialMileageкмПробіг спецроботи (тип 1)
specialMileage2кмПробіг спецроботи (тип 2)
specialMileage3кмПробіг спецроботи (тип 3)
tonKmт·кмТранспортна робота

Task — Завдання маршруту

ПолеТипОбов'язк.Опис
completedbool✅Чи виконано (невиконані ігноруються)
loadedKmdecimal✅Пробіг з вантажем (км)
emptyKmdecimal✅Пробіг порожнім (км)
workConditionSurchargedecimal❌Надбавка умов роботи для цього завдання (%)

IdlePeriod — Простій з увімкненим двигуном

ПолеТипОбов'язк.Опис
durationSecondsint✅Тривалість простою (сек)
engineRunningbool✅Двигун увімкнено (тільки такі впливають на норму)

Trailer — Причіп / спецобладнання

ПолеТипОбов'язк.Опис
idstring✅Ідентифікатор
isVehiclebool✅ true — причіп (має колеса); false — навісне обладнання. Впливає на розрахунок S_Gpr: навісне використовує пробіг основного ТЗ
ownWeightdecimal✅Власна вага (кг)
hasFuelTankbool✅ Має власний паливний бак. Якщо false — витрата за specialNormPerHour з norms нараховується на основний ТЗ (НормаНаОборудование). Час роботи береться з Performance.workTimeSeconds для цього причепа
typestring❌ standard (за замовч.) або dumpTrailer (причіп-самоскид)
capacitydecimal❌ Вантажопідйомність (кг) — для dumpTrailer. Враховується в S_Gpr: (ownWeight + capacity × normalizedLoad / 100) / 1000 × mileage
normalizedLoaddecimal❌Нормований % завантаження самоскида (0–100)
normsConsumptionNorms❌Норми витрат обладнання. Обов'язкове якщо hasFuelTank = false і є specialNormPerHour > 0
Примітка: tonKm від причепа-самоскида не додається до транспортної роботи W. Для звичайного причепа — додається.

ConsumptionNorms — Норми витрат пального

Передаються клієнтом у запиті — API не зберігає довідники норм.

ПолеОдиницяОпис
linearNormл/100 кмОбов'язкова. Базова лінійна норма
seasonalSurcharge%Сезонна надбавка
specialNormPerHourл/годНорма на мотогодину (ТЗ без спідометра / обладнання без бака)
idleNormAsSpeedкм/годЕквівалентна швидкість простою з увімкненим двигуном
weightChangeNormл/т·кмНорма на зміну власної ваги (причепи)
transportWorkNormл/т·кмНорма на транспортну роботу
specialNormPerKmл/кмНорма на км спецроботи (тип 1)
specialNormPerKm2л/кмНорма на км спецроботи (тип 2)
specialNormPerKm3л/кмНорма на км спецроботи (тип 3)
operationNormл/операціюНорма на одну операцію
tripNormл/їздкуНорма на одну їздку
heaterNormл/годНорма на роботу автономного опалювача
startupNormлНорма на запуск двигуна (ГБО). Використовується якщо startupTemperaturePercent не задано
startupTemperaturePercent% Відсоток від лінійної норми на запуск при даній температурі. Якщо передано і temperature ≠ 0 — використовується замість startupNorm. За замовч. null

Options — Додаткові параметри

ПолеЗа замовч.Опис
precision3Кількість знаків після коми у результаті
isLpgfalseРозрахунок для ГБО (газового палива)
temperatureCoefficientnullТемпературний коефіцієнт (%). Якщо null — визначається автоматично за таблицею

🧮 Формули розрахунку

Алгоритм нарахування нормативних витрат

Загальний множник надбавок

totalMultiplier = 1 + (seasonal + temperature + workCondition + vehicleSpecific) / 100
🌨️
Сезонна
seasonalSurcharge
🌡️
Температурна
автоматично за таблицею
🛣️
Умови роботи
середньозважена по завданнях
🚛
Надбавка ТЗ
vehicleSurcharge
Увага: workCondition не застосовується до мотогодин та обладнання без бака. До норми на простій та операції застосовується лише (1 + (seasonal + temperature) / 100).

Середньозважена надбавка на умови роботи

workCondition = Σ (task[i].surcharge × (task[i].loadedKm + task[i].emptyKm)) / totalMileage

Нерозподілений пробіг (поза завданнями) отримує надбавку з поля defaultWorkConditionSurcharge шапки ПЛ.

ТЗ зі спідометром (hasSpeedometer = true)

НормаНаПробіг = (Seff - SS - SS2 - SS3eff) × linearNorm × totalMultiplier / 100 НормаНаПростій = (idleSeconds / 3600) × idleNormAsSpeed × linearNorm × (1 + (seasonal + temperature) / 100) / 100 НормаНаВагуПричепів = S_Gpr × weightChangeNorm × totalMultiplier / 100 НормаНаТранспРоботу = W × transportWorkNorm × totalMultiplier / 100 НормаНаСпецПробіг1 = SS × specialNormPerKm × totalMultiplier / 100 НормаНаСпецПробіг2 = SS2 × specialNormPerKm2 × totalMultiplier / 100 НормаНаСпецПробіг3 = SS3eff × specialNormPerKm3 × totalMultiplier / 100 НормаНаОперації = OP × operationNorm × (1 + (seasonal + temperature) / 100) НормаНаЇздки = Z × tripNorm НормаНаОпалювач = heaterSeconds / 3600 × heaterNorm

ТЗ без спідометра (hasSpeedometer = false)

НормаНаМотогодини = TT_hours × specialNormPerHour × (1 + (seasonal + temperature + vehicleSpecific) / 100) НормаНаОборудование = TT_hours_equip × specialNormPerHour_equip × (1 + (seasonal + temperature) / 100) НормаНаОперації = OP × operationNorm × (1 + (seasonal + temperature) / 100) # при tripType="special" — додатково множиться на seasonTempMultiplier НормаНаЇздки = Z × tripNorm
tripType = "special": при цьому типі ПЛ до НормаНаОборудование і НормаНаОперації додатково застосовується (1 + (seasonal + temperature) / 100).

Позначення змінних

ЗміннаОпис
SЗагальний пробіг ТЗ (км) з totalMileage в Performance
SeffЕфективний пробіг: при dualFuel = true = fuelMileage; інакше = S
SS, SS2, SS3Пробіг спецробіт 1/2/3 (км)
SS3effПри dualFuel = true: SS3 × fuelMileage / S; інакше: SS3
TT_hoursЧас роботи ТЗ (год) = workTimeSeconds / 3600
TT_hours_equipЧас роботи причепа/навісного без бака (год) — з Performance workTimeSeconds цього причепа / 3600
S_Gpr Сума по всіх причепах (т·км):
— standard причіп: ownWeight / 1000 × mileage_trailer
— standard навісне: ownWeight / 1000 × S
— dumpTrailer: (ownWeight + capacity × normalizedLoad / 100) / 1000 × mileage_trailer
WТранспортна робота (т·км); tonKm від причепа-самоскида не враховується
OPКількість операцій
ZКількість їздок

Автоматичний температурний коефіцієнт

Якщо options.temperatureCoefficient не задано — визначається за таблицею (перший рядок де поріг > temperature):

Діапазон °CКоефіцієнт (%)
нижче −15+10
−15 … −5+6
−5 … +5+3
+5 … +15+1
вище +150

Загальна витрата

totalConsumption = Σ (усі ненульові компоненти)

Результат округлюється до кількості знаків, заданих у options.precision (за замовч. 3).

📤 Структура відповіді

HTTP 200 — успішний розрахунок

Верхній рівень

ПолеТипОпис
totalConsumptiondecimalЗагальна нормативна витрата пального (літри)
breakdownNormItem[]Розшифровка по складовим. Містить лише елементи з value > 0
appliedSurchargesSurchargesЗастосовані надбавки та загальний множник

NormItem — Складова норми

ПолеТипОпис
namestringНазва складової (для відображення)
codestringМашинний код (для інтеграції)
valuedecimalРозрахована витрата (літри)

Можливі значення code

codeНазваКоли виникає
mileageНа пробігТЗ зі спідометром, S > 0
engineHoursНа мотогодиниОсновний ТЗ без спідометра
equipmentНа роботу спецобладнанняНавісне / причіп без паливного бака
idleНа простій з вкл. двигуномЄ idlePeriods з engineRunning = true
weightChangeНа зміну власної вагиЄ причепи, weightChangeNorm > 0
transportWorkНа транспортну роботуW > 0, transportWorkNorm > 0
specialMileageНа пробіг спецроботи (тип 1)SS > 0, specialNormPerKm > 0
specialMileage2На пробіг спецроботи (тип 2)SS2 > 0, specialNormPerKm2 > 0
specialMileage3На пробіг спецроботи (тип 3)SS3 > 0, specialNormPerKm3 > 0
operationsНа операціїOP > 0, operationNorm > 0
tripsНа їздкиZ > 0, tripNorm > 0
heaterНа опалювачheaterWorkTimeSeconds > 0, heaterNorm > 0
startupНа запуск двигуна (ГБО)isLpg = true, lpgModel заповнено

Surcharges — Застосовані надбавки

ПолеТипОпис
seasonaldecimalСезонна надбавка (%)
temperaturedecimalТемпературний коефіцієнт (%)
workConditiondecimalСередньозважена надбавка умов роботи (%)
vehicleSpecificdecimalІндивідуальна надбавка ТЗ (%)
totalMultiplierdecimalЗагальний множник: 1 + (seasonal + temperature + workCondition + vehicleSpecific) / 100

💡 Приклади

Три типових сценарії використання API

Приклад 1: Вантажівка з причепом, зимовий період

МАЗ-5340, стандартний причіп 5500 кг, температура −12°C, 250 км пробігу, 1800 т·км транспортної роботи.

Запит

{
  "vehicle": {
    "id": "truck-001",
    "modelName": "МАЗ-5340",
    "hasSpeedometer": true,
    "vehicleSurcharge": 5
  },
  "fuel": { "id": "diesel", "name": "ДП" },
  "tripSheet": {
    "date": "2026-01-15",
    "temperature": -12,
    "heaterWorkTimeSeconds": 3600,
    "defaultWorkConditionSurcharge": 0,
    "performance": [
      { "vehicleId": "truck-001", "parameter": "totalMileage", "value": 250 },
      { "vehicleId": "truck-001", "parameter": "tonKm",        "value": 1800 },
      { "vehicleId": "truck-001", "parameter": "tripCount",    "value": 3 },
      { "vehicleId": "trailer-01","parameter": "totalMileage", "value": 250 }
    ],
    "tasks": [
      { "completed": true, "loadedKm": 120, "emptyKm": 80, "workConditionSurcharge": 10 },
      { "completed": true, "loadedKm": 30,  "emptyKm": 20, "workConditionSurcharge": 0 }
    ],
    "idlePeriods": [
      { "durationSeconds": 1800, "engineRunning": true }
    ]
  },
  "consumptionNorms": {
    "linearNorm": 22.0,
    "seasonalSurcharge": 10,
    "idleNormAsSpeed": 5,
    "weightChangeNorm": 1.3,
    "transportWorkNorm": 1.3,
    "heaterNorm": 2.5
  },
  "trailers": [
    { "id": "trailer-01", "isVehicle": true, "ownWeight": 5500, "hasFuelTank": false, "type": "standard" }
  ],
  "options": { "precision": 3, "isLpg": false }
}

Відповідь 200

Надбавки: seasonal=10%, temperature=6% (−12°C), workCondition=8% (зважено по завданнях), vehicleSpecific=5% → totalMultiplier = 1.29
{
  "totalConsumption": 127.905,
  "breakdown": [
    { "name": "На пробіг",                  "code": "mileage",       "value": 70.950 },
    { "name": "На простій з вкл. двигуном", "code": "idle",          "value": 1.210  },
    { "name": "На зміну власної ваги",      "code": "weightChange",  "value": 23.059 },
    { "name": "На транспортну роботу",      "code": "transportWork", "value": 30.186 },
    { "name": "На опалювач",                "code": "heater",        "value": 2.500  }
  ],
  "appliedSurcharges": {
    "seasonal": 10.0, "temperature": 6.0, "workCondition": 8.0,
    "vehicleSpecific": 5.0, "totalMultiplier": 1.29
  }
}

Приклад 2: Спецтехніка без спідометра (кран)

КС-3577, 8 годин роботи (28800 сек), 45 операцій, tripType=special, літо.

Запит

{
  "vehicle": {
    "id": "crane-005",
    "modelName": "КС-3577",
    "hasSpeedometer": false,
    "vehicleSurcharge": 0
  },
  "fuel": { "id": "diesel", "name": "ДП" },
  "tripSheet": {
    "date": "2026-07-10",
    "temperature": 28,
    "tripType": "special",
    "performance": [
      { "vehicleId": "crane-005", "parameter": "workTimeSeconds", "value": 28800 },
      { "vehicleId": "crane-005", "parameter": "operationCount",  "value": 45 }
    ]
  },
  "consumptionNorms": {
    "linearNorm": 14.0,
    "seasonalSurcharge": 0,
    "specialNormPerHour": 8.5,
    "operationNorm": 0.2
  },
  "options": { "precision": 3 }
}

Відповідь 200

tripType=special: НормаНаОборудование = 8 год × 8.5 = 68.0 л; НормаНаОперації = 45 × 0.2 = 9.0 л (температура = 0%, множник не впливає).
{
  "totalConsumption": 77.000,
  "breakdown": [
    { "name": "На роботу спецобладнання", "code": "engineHours",  "value": 68.000 },
    { "name": "На операції",              "code": "operations",   "value": 9.000  }
  ],
  "appliedSurcharges": {
    "seasonal": 0, "temperature": 0, "workCondition": 0,
    "vehicleSpecific": 0, "totalMultiplier": 1.0
  }
}

Приклад 3: Авто з ГБО (газ + бензин)

ГАЗ-3302, двопаливний режим. Розрахунок витрати бензину (АІ-92) — лише норма на запуск двигуна, якщо залишку основного (газу) не вистачає.

Запит

{
  "vehicle": {
    "id": "car-010",
    "modelName": "ГАЗ-3302",
    "hasSpeedometer": true,
    "vehicleSurcharge": 0,
    "dualFuel": true,
    "lpgModel": {
      "primaryFuelId": "lpg",
      "primaryFuelRemaining": 30,
      "mainFuelRemaining": 5,
      "secondaryFuelRemaining": 12
    }
  },
  "fuel": { "id": "ai92", "name": "АІ-92" },
  "tripSheet": {
    "date": "2026-02-03",
    "temperature": -5,
    "performance": [
      { "vehicleId": "car-010", "parameter": "totalMileage", "value": 180 }
    ]
  },
  "consumptionNorms": {
    "linearNorm": 16.5,
    "seasonalSurcharge": 8,
    "startupNorm": 1.5
  },
  "options": { "precision": 3, "isLpg": true }
}

Відповідь 200

ГБО логіка: основний пробіг списується на газ. На АІ-92 нараховується лише норма на запуск, оскільки залишку основного пального (5 л) менше за норму на запуск (~1.5 л × 1.11 ≈ 1.67 л) — додаткове паливо покриває різницю: min(1.67 − 5, 12) = 0... але залишок ГБО (30 л) > 0, тому норма на запуск = 5.000 л (залишок основного).
{
  "totalConsumption": 5.000,
  "breakdown": [
    { "name": "На запуск двигуна", "code": "startup", "value": 5.000 }
  ],
  "appliedSurcharges": {
    "seasonal": 8.0, "temperature": 3.0, "workCondition": 0,
    "vehicleSpecific": 0, "totalMultiplier": 1.11
  }
}

⚠️ Коди помилок

Формат та перелік помилок API

Формат помилки

{
  "error": {
    "code": "NORMS_NOT_FOUND",
    "message": "Лінійна норма витрат не задана для ТЗ truck-001, пальне ДП"
  }
}
HTTPКодОпис
400 MISSING_NORMS Не вказані норми витрат пального (consumptionNorms відсутній)
400 INVALID_VEHICLE Некоректні дані ТЗ (відсутній id, невалідний vehicleSurcharge тощо)
400 NO_PERFORMANCE_DATA Масив performance порожній або не містить запис для основного ТЗ
400 INVALID_TEMPERATURE Температура поза допустимим діапазоном
401 UNAUTHORIZED Невалідний або відсутній API-ключ у заголовку X-API-Key
422 NORMS_NOT_FOUND Лінійна норма (linearNorm) = 0 або не задана

🔧 Алгоритм ГБО

Двопаливний режим — логіка нарахування норми на запуск

Застосовується при isLpg = true та наявності vehicle.lpgModel. Основний пробіг завжди списується на газ (ГБО). На поточне паливо нараховується лише норма на запуск двигуна.

Крок 1. Розрахунок базової НормаНаЗапуск

ЯКЩО temperature ≠ 0 І startupTemperaturePercent ≠ null: НормаНаЗапуск = linearNorm × startupTemperaturePercent / 100 ІНАКШЕ: НормаНаЗапуск = startupNorm × (1 + (seasonal + temperature) / 100)
startupTemperaturePercent береться з довідника температурних коефіцієнтів режиму «Запуск» (перший рядок де поріг > temperature). Якщо запис не знайдено — повертається null, використовується startupNorm.
Аналогічно розраховується НормаНаЗапускОсновного — за нормами основного палива ТЗ (lpgModel.primaryFuelId).

Крок 2. Розподіл між видами пального

1
Залишок ГБО = 0 НормаНаЗапуск = 0 — нема чого прогрівати
2
Залишок основного ≥ НормаНаЗапускОсновного Якщо поточне = основне → НормаНаЗапуск = НормаНаЗапускОсновного
Якщо поточне = додаткове → НормаНаЗапуск = 0 (основного вистачає)
3
Залишок основного < НормаНаЗапускОсновного Якщо поточне = основне → НормаНаЗапуск = залишок основного (mainFuelRemaining)
Якщо поточне = додаткове → НормаНаЗапуск = min(НормаНаЗапускОсновного − залишок основного, secondaryFuelRemaining)

💡 Рекомендації щодо інтеграції