Как на javascript написать тариф для такси

Как на javascript написать тариф для такси

Расчёт стоимости поездки в такси зависит от множества параметров: базовая цена, стоимость за километр, время ожидания, ночной коэффициент. Все эти составляющие можно формализовать в виде тарифной модели и реализовать на JavaScript.

Для начала нужно определить структуру тарифа. Например: baseFare – фиксированная стоимость посадки, perKmRate – цена за километр, perMinRate – цена за минуту в пути или ожидания. Также часто применяется множитель nightMultiplier для ночного времени, и surgeMultiplier – при повышенном спросе.

Логика расчёта может быть обёрнута в функцию, принимающую параметры поездки: пройденное расстояние, длительность, время суток. Используя объект с тарифами, можно гибко менять конфигурацию и адаптировать логику под разные регионы или классы авто (эконом, комфорт, бизнес).

Реализация тарифа не ограничивается арифметикой. Важно учесть валидность входных данных, погрешности GPS и возможные исключения (например, минимальная цена поездки, округление итоговой суммы до целых). Всё это делается средствами JavaScript без сторонних библиотек.

Расчёт стоимости поездки по времени и расстоянию

Расчёт стоимости поездки по времени и расстоянию

Базовая формула расчёта выглядит так: стоимость = базовая_цена + (цена_за_км × километры) + (цена_за_минуту × минуты). Все значения должны быть заданы явно и учитываться при каждой итерации расчёта.

Рекомендуется использовать GPS-данные для измерения расстояния. Например, через API браузера или внешний сервис. Расстояние можно получить по координатам с помощью формулы хаверсинуса или библиотек наподобие geolib.

Для времени используйте разницу между временем старта и окончания поездки. Если требуется учитывать время в пути с высокой точностью, фиксируйте промежуточные точки и используйте интервальные таймеры.

Пример на JavaScript: расстояние вычисляется через geolib.getDistance(), время – через Date.now(). Все расчёты сводятся в одну функцию, которая возвращает итоговую стоимость с учётом заданных тарифов.

Для динамической тарификации следует использовать коэффициенты, применяемые при определённых условиях: пиковые часы, плохая погода, высокий спрос. Их также включают в формулу: стоимость × коэффициент.

Округление итоговой суммы делается после всех вычислений. Используйте Math.ceil() или toFixed(2), если важна точность до копеек.

Учёт времени суток и повышенных коэффициентов

Для расчёта тарифа необходимо учитывать час суток. Например, с 22:00 до 06:00 может применяться надбавка 1.5. Это реализуется через проверку текущего времени и выбор соответствующего коэффициента. Используйте объект Date и метод getHours():


const hour = new Date().getHours();
let timeMultiplier = 1;
if (hour >= 22 || hour < 6) timeMultiplier = 1.5;

Дополнительно могут использоваться временные интервалы с разными значениями. Например, вечерний трафик (17:00–20:00) – коэффициент 1.2, ночное время – 1.5. Учитывайте пересечение интервалов и приоритеты. Рекомендуется использовать массив с объектами:


const timeCoefficients = [
  { from: 6, to: 10, multiplier: 1.2 },
  { from: 17, to: 20, multiplier: 1.3 },
  { from: 22, to: 6, multiplier: 1.5 }
];

Для определения коэффициента:


function getTimeMultiplier(hour) {
  for (const range of timeCoefficients) {
    if (range.from < range.to) {       if (hour >= range.from && hour < range.to) return range.multiplier;     } else {       if (hour >= range.from || hour < range.to) return range.multiplier;     }   }   return 1; }

Для динамических надбавок по спросу (повышенный трафик, погода, события) коэффициенты можно хранить на сервере и обновлять через API. Пример:


fetch('/api/multiplier')
  .then(res => res.json())
  .then(data => {
    const demandMultiplier = data.multiplier || 1;
    const finalPrice = basePrice * getTimeMultiplier(hour) * demandMultiplier;
  });

Рекомендуется округлять итоговую сумму после применения всех коэффициентов. Используйте Math.round() или toFixed(2) в зависимости от формата.

Реализация тарифа с минимальной стоимостью поездки

Реализация тарифа с минимальной стоимостью поездки

Минимальная стоимость поездки – фиксированная сумма, которую платит пассажир даже при коротком маршруте. Реализация на JavaScript требует учёта базовой логики тарификации и проверки итоговой стоимости перед выставлением счёта.

  • Определите переменные:
    • baseFare – минимальная стоимость поездки, например, 150 рублей
    • pricePerKm – стоимость за километр, например, 20 рублей
    • distance – фактическое расстояние в километрах
  • Рассчитайте предварительную стоимость:
    let fare = distance * pricePerKm;
  • Сравните с минимальной:
    if (fare < baseFare) fare = baseFare;
  • Верните итоговое значение:
    return fare;

Если тариф включает разные ставки (день/ночь, городской/междугородний), минимальную стоимость задают отдельно для каждой категории. В этом случае используют объект с ключами по типу тарифа:


const tariffs = {
day: { minFare: 150, rate: 20 },
night: { minFare: 200, rate: 25 }
};
function calculateFare(type, distance) {
const tariff = tariffs[type];
let cost = distance * tariff.rate;
return cost < tariff.minFare ? tariff.minFare : cost;
}

Функция возвращает итоговую сумму с учётом минимального порога. Этот подход предотвращает занижение стоимости на коротких маршрутах.

Добавление платных опций: багаж, детское кресло, ожидание

Добавление платных опций: багаж, детское кресло, ожидание

Для расчёта стоимости дополнительных услуг необходимо добавить отдельные параметры к итоговой цене поездки. Каждая опция должна быть чётко идентифицирована и иметь фиксированную или зависимую от времени/количества стоимость.

Багаж: Если клиент везёт багаж, можно добавить фиксированную надбавку, например, 100 рублей за каждую единицу. В JavaScript это реализуется так:

const baggageCount = 2;
const baggagePrice = 100;
const baggageFee = baggageCount * baggagePrice;

Детское кресло: Обычно устанавливается как одна платная опция, независимо от расстояния. Стоимость может составлять, например, 150 рублей. Учитывается как логическое значение:

const childSeatRequested = true;
const childSeatFee = childSeatRequested ? 150 : 0;

Ожидание: Рассчитывается поминутно. Допустим, 10 рублей за каждую минуту простоя. Важно учитывать начальное бесплатное время (например, 5 минут):

const waitingTime = 12; // минут
const freeWaiting = 5;
const waitingRate = 10;
const waitingFee = Math.max(0, waitingTime - freeWaiting) * waitingRate;

Все дополнительные сборы складываются с основной стоимостью поездки:

const baseFare = 300;
const total = baseFare + baggageFee + childSeatFee + waitingFee;

Необходимо отразить каждую опцию в пользовательском интерфейсе, чтобы избежать недопонимания и споров. Используйте чекбоксы и числовые поля для ввода параметров.

Обработка зон и различных тарифов по районам

Обработка зон и различных тарифов по районам

Для поддержки тарифов по районам необходимо реализовать систему геозон. Каждая зона представляет собой полигон с набором координат. При поступлении заказа координаты точки отправления сравниваются с границами всех зон. Это можно сделать через алгоритм определения попадания точки в полигон, например, с использованием алгоритма «Ray Casting».

Зоны хранятся в виде массива объектов с названием района и списком координат. Например:

const zones = [
{ name: 'Центр', polygon: [[55.75, 37.61], [55.76, 37.62], [55.75, 37.63], [55.74, 37.62]] },
{ name: 'Север', polygon: [[55.80, 37.60], [55.81, 37.61], [55.80, 37.62], [55.79, 37.61]] }
];

После определения зоны отправления и зоны прибытия определяется тариф по маршруту. Храните тарифные правила в виде матрицы или словаря с ключами по парам зон. Например:

const tariffs = {
'Центр-Север': 500,
'Север-Центр': 480,
'Центр-Центр': 300
};

Если маршрут не входит в предопределённые комбинации, можно применять базовый тариф или рассчитывать стоимость по километражу. Используйте библиотеки вроде turf.js для точной географической проверки и расчётов расстояний.

Важно кэшировать зоны и тарифы в памяти приложения, чтобы избежать избыточных обращений к базе данных. Также стоит предусмотреть механизм обновления конфигурации без перезапуска сервиса.

Интеграция расчёта тарифа в форму заказа такси

Для интеграции расчёта тарифа в форму заказа необходимо подключить модуль, отвечающий за вычисление стоимости, к обработчику событий формы. Например, при изменении поля адреса отправления или назначения следует заново пересчитывать тариф с учётом расстояния, времени суток и выбранного тарифа.

Исходные данные: координаты точек, тип тарифа (эконом, комфорт, бизнес), коэффициенты (ночной, погодный, загруженность дорог). Все значения должны передаваться в функцию расчёта через параметры. Пример:


calculateFare({
startLat: 59.9311,
startLng: 30.3609,
endLat: 59.9500,
endLng: 30.3167,
tariff: 'comfort',
isNight: true,
trafficLevel: 2
});

Для получения координат адресов используйте геокодирование через API (например, Yandex или Google Maps). Не сохраняйте координаты в localStorage, если они меняются при каждом заказе.

Обновление формы должно быть асинхронным, без перезагрузки страницы. Используйте fetch или XMLHttpRequest для взаимодействия с серверной частью, если расчёт происходит на бэкенде. При этом отправляйте минимально необходимый набор данных.

Тестирование расчёта тарифа с разными параметрами

Тестирование расчёта тарифа с разными параметрами

Для проверки корректности расчёта тарифа необходимо протестировать все возможные комбинации входных параметров: расстояние, время простоя, тип тарифа (дневной/ночной), коэффициенты (пиковые часы, праздничные дни), начальная цена и минимальная стоимость поездки.

Пример базовой формулы:


function calculateFare(distance, idleTime, rate) {
const baseFare = rate.base;
const distanceCost = distance * rate.perKm;
const idleCost = idleTime * rate.perMinute;
const rawTotal = baseFare + distanceCost + idleCost;
return Math.max(rawTotal, rate.minFare);
}

Тестирование проводится по следующим сценариям:

  • Короткая поездка без простоя: расстояние 1.5 км, 0 минут ожидания, дневной тариф.
  • Долгая поездка с простоем: 18 км, 10 минут ожидания, ночной тариф с повышенным коэффициентом.
  • Минимальная стоимость: 0.5 км, 0 минут, дневной тариф (результат должен быть не ниже минимального тарифа).
  • Пиковые часы: 7 км, 3 минуты, дневной тариф с коэффициентом 1.5.
  • Праздничный день: 10 км, 5 минут, базовый тариф, праздничный коэффициент 2.0.

Для каждого случая сравниваются ожидаемое значение и результат функции. Ошибки округления проверяются с допуском ±0.01.

Рекомендуется использовать unit-тесты с использованием фреймворков вроде Mocha или Jest. Каждый тест должен содержать точные входные значения, используемый тариф и ожидаемый результат:


describe('calculateFare', () => {
it('короткая поездка, дневной тариф', () => {
const rate = { base: 50, perKm: 20, perMinute: 5, minFare: 100 };
const fare = calculateFare(1.5, 0, rate);
expect(fare).toBe(100); // minFare применяется
});
});

Также проверяются граничные значения: нулевые параметры, очень большие значения, отрицательные входные данные (должны выбрасывать исключения или игнорироваться).

Вопрос-ответ:

Как рассчитать стоимость поездки в зависимости от времени суток?

Для расчёта стоимости с учётом времени суток можно использовать проверку текущего времени и применять разные коэффициенты. Например, если поездка происходит ночью (с 22:00 до 6:00), можно увеличить базовый тариф на заданный процент. В JavaScript это делается через объект `Date`, из которого берётся текущий час (`new Date().getHours()`), и на основании этого подбирается соответствующий множитель.

Какие параметры тарифа обычно используются при расчёте стоимости?

Обычно используются такие параметры: базовая стоимость посадки, стоимость за километр, стоимость за минуту, а также коэффициенты на погодные условия, трафик или праздничные дни. Иногда добавляется минимальная стоимость поездки, ниже которой итог не может опуститься. В коде эти параметры удобно задать в виде объекта, где каждому значению присвоено своё ключевое имя.

Как учесть пробки при расчёте тарифа на JavaScript?

Чтобы учесть пробки, можно использовать данные о скорости движения или задержке в пути. Обычно такие данные приходят с внешнего API (например, от картографических сервисов), и по ним рассчитывается дополнительное время. Это время умножается на стоимость минуты и добавляется к общей сумме. В коде это реализуется через асинхронный запрос и последующее обновление расчёта при получении данных.

Можно ли на JavaScript сделать калькулятор тарифа, который работает прямо в браузере без сервера?

Да, можно. Весь расчёт может происходить в браузере — для этого достаточно HTML-формы, скрипта на JavaScript и, возможно, CSS для оформления. Пользователь вводит начальную и конечную точку, примерное время и расстояние, а скрипт проводит вычисления на основе заданных формул. Однако без сторонних данных, таких как координаты или пробки, точность будет условной.

Как избежать дублирования кода при расчётах с разными тарифами?

Можно вынести общую логику расчёта в отдельную функцию, которая принимает параметры тарифа как аргументы. Например, функция `calculateFare(distance, duration, rate)` может использовать значения из переданного объекта `rate`, где будут заданы нужные коэффициенты и базовая цена. Это избавит от повторений и упростит добавление новых тарифов — достаточно передать другой объект с нужными значениями.

Ссылка на основную публикацию