FreightIQ
Калькулятор, який показує перевізнику, чи заробить він на рейсі Європою — після палива, толів і годин, які водієві дозволено бути за кермом.
- Моя роль
- Ідея, дизайн, код
- Термін
- Кілька тижнів
- Стек
- HTML, CSS, vanilla JS
- Статус
- Живий, у розробці
Звідки взялася задача
У родині фірма міжнародних перевезень, що возить Україною та Європою, тож досліджувати цю галузь мені не довелося — я виріс поруч із нею. Картина, яка повторюється щоразу: диспетчер отримує пропозицію на рейс і, щоб зрозуміти, чи варто його брати, відкриває таблицю. Паливо прикидає приблизно. Толи вгадує, бо в кожній країні платять по-своєму. Чи встигне водій законно проїхати відстань за обіцяний час — рахує подумки.
Кожна з цих трьох відповідей десь існує. Але жодної немає в одному місці, і жодну не отримати швидко. Саме цей розрив і закриває FreightIQ.
Що він рахує
Ви вводите маршрут, ставку фрахту та інші свої витрати. У відповідь отримуєте цифри, від яких залежить рішення брати вантаж:
- Паливо — із витрати на 100 км і ціни дизеля, з довідковою ціною для кожної з 28 країн.
- Толи — з розкладкою по країнах маршруту.
- Прибуток, маржа та прибуток на кілометр — три показники, навколо яких і точиться торг.
- Строк доставки в добах — виведений із ліміту керма ЄС 561/2006, а не з побажань.
- CO₂ — європейські замовники питають про це дедалі частіше.
Маршрути можна зберігати й порівнювати до трьох поруч, а будь-який результат експортується в PDF, щоб надіслати клієнту.
Найважче: толи
Саме тут пішла більшість часу, і варто пояснити чому — бо складність тут не технічна.
Єдиного способу брати плату з вантажівок у Європі не існує. Німеччина бере за кілометр, і ставка залежить від кількості осей та екокласу. Нідерланди за кілометр не беруть узагалі — там погодинна віньєтка Eurovignette. Швейцарія рахує за тонно-кілометри. Змоделювати це все чесно означало б набір даних більший за сам калькулятор, який ще треба тримати актуальним по 28 юрисдикціях.
Тому я зробив компроміс явним, а не сховав його. У довіднику лежить одна усереднена ставка €/км на країну, і нуль для семи країн, де плата за кілометр не діє — біля кожного нуля коментар у даних, що там замість неї. Припущення описані в шапці файлу й у дисклеймері на самій сторінці.
Але важливіше інше: калькулятор нікому не навʼязує мої числа. Толи можна ввести трьома способами: сумою за рейс, власною ставкою €/км або лишити довідкову як запасний варіант. Диспетчер, який знає, скільки насправді коштує Польща, вводить своє число й отримує правильну відповідь незалежно від моєї таблиці.
Висновок, який я звідси виніс: коли предметна область опирається точному моделюванню, чесний хід — не імітувати точність. Треба зробити припущення видимим і дати користувачеві спосіб його обійти.
Як влаштований код
Близько 4900 рядків, без збірки — проєкт відкривається подвійним кліком по файлу. Це обмеження сформувало архітектуру, а не виправдало її відсутність.
data.js— лише довідкові числа: ціни дизеля, толи й обмеження руху для 28 країн та матриця відстаней на 43 пари. Жодної логіки.engine.js— сам розрахунок, чисті функції, які взагалі не торкаються DOM. Модуль експортує себе і в браузер, і в Node, тож математику можна запускати поза сторінкою.app.js— єдиний файл, якому дозволено чіпати інтерфейс. Власних розрахунків не містить.
Кілька рішень, які я повторив би й на клієнтському проєкті: увесь динамічний контент будується через createElement і textContent, а не innerHTML, а введені користувачем посилання проходять білий список протоколів — тож набраний текст ніколи не стане розміткою. Ввід прощає помилки: кома працює як десятковий роздільник, а транзитні країни приймаються і кодами, і українськими назвами. Весь інтерфейс поважає prefers-reduced-motion, а результат озвучується через aria-live, щоб зчитувач екрана промовив перерахований показник.
Перевірка на практиці
Показав людині, яка тримає фірму міжнародних перевезень. Вердикт: корисно — але ставки толів для Польщі неточні.
Це найцінніший зворотний звʼязок, який проєкт отримав. Помилка в даних саме того типу, який неможливо побачити без досвіду в галузі, знайдена за кілька хвилин людиною, що цей досвід має. Уточнення польських ставок — наступне в роботі.
Що далі
Проєкт у розробці, і я радше перелічу, чого бракує, ніж вдаватиму, що він завершений:
- Ставки толів для Польщі — та сама відома помилка.
- Повніший режим праці водія. Зараз строк доставки рахується за лімітом 9 годин керма на добу. Перерва 45 хвилин після 4,5 годин і добовий відпочинок описані в коді, але на результат ще не впливають.
- Ціни палива по країнах маршруту. Ціни зберігаються для всіх 28 країн, але наразі до всього рейсу застосовується одна.
- Тести. Рушій навмисно написаний придатним до тестування — чисті функції, експорт у Node. Самі тести ще не написані.