CustomsCalc
Библиотека для расчёта стоимости растаможки автомобилей в Беларуси по ставкам ЕАЭС. Не знает ничего о DOM и не имеет зависимостей — подходит для любого окружения.
Установка
npm install customs-calculator
TypeScript / ESM:
import { calculate, calcDutyEur, calcUtil, Age, PersonType, EngineType, Currency } from 'customs-calculator';
CommonJS:
const { calculate, Age, EngineType } = require('customs-calculator');
CustomsCalc:<script src="https://unpkg.com/customs-calculator/dist/index.global.js"></script><script> const result = CustomsCalc.calculate({ ... }); </script>При наличии npm:
node_modules/customs-calculator/dist/index.global.js
Быстрый старт
Три шага: задайте курсы валют, опишите расходы, вызовите calculate().
import { calculate, Age, PersonType, EngineType, Currency } from 'customs-calculator';
// 1. Курсы BYN (например, от НБРБ)
const rates = { usd: 2.82, eur: 3.3 };
// 2. Фиксированные расходы — любой набор в любой валюте
const fixedCosts = [
{ id: 'delivery', amount: 1400, currency: 'EUR' },
{ id: 'warehouse', amount: 200, currency: 'BYN' },
{ id: 'epts', amount: 70, currency: 'BYN' },
];
// 3. Расчёт
const result = calculate({
age: 'under3', // возраст авто
price: 15000, // стоимость
currency: 'EUR', // валюта цены
engineType: 'fuel', // тип двигателя
volume: 2000, // объём, см³
face: 'individual', // физ. лицо
discount: false, // льгота 50%
fixedCosts,
rates,
});
console.log(result.totalEur); // итого в EUR
TypeScript с Enums
import { calculate, Age, PersonType, EngineType, Currency } from 'customs-calculator';
// те же rates и fixedCosts...
const result = calculate({
age: Age.Under3,
price: 15000,
currency: Currency.EUR,
engineType: EngineType.Fuel,
volume: 2000,
face: PersonType.Individual,
discount: false,
fixedCosts,
rates,
});
С комиссией банковского перевода
const result = calculate({
// ...остальные параметры...
commission: 1.5, // +1.5% к цене авто в totalEur
fixedCosts,
rates,
});
Прямой вызов низкоуровневых функций
import { calcDutyEur, calcUtil } from 'customs-calculator';
// Только пошлина, без остального
const duty = calcDutyEur('under3', 15000, 2000);
// Только утилизационный сбор
const util = calcUtil('individual', 'fuel', 2000, 'under3');
Типы данных
Enums
Строковые значения совместимы с обычным JS — можно передавать литералы 'under3' вместо Age.Under3.
| Enum | Значения |
|---|---|
| Age | Under3 = 'under3', From3To5 = '3to5', Over5 = 'over5' |
| PersonType | Individual = 'individual', Legal = 'legal' |
| EngineType | Fuel = 'fuel', Electric = 'electric' |
| Currency | EUR = 'EUR', USD = 'USD', BYN = 'BYN' |
import { Age, PersonType, EngineType, Currency } from 'customs-calculator';
FixedCostItem
Описывает один фиксированный расход. Передаётся в массиве fixedCosts.
| Поле | Тип | Описание |
|---|---|---|
| id | string | Произвольный идентификатор. Используется UI-слоем для привязки к элементу вывода. |
| amount | number | Сумма расхода. |
| currency | 'EUR' | 'USD' | 'BYN' | Валюта суммы. Библиотека автоматически конвертирует в EUR для итогового расчёта. |
{ id: 'delivery', amount: 1400, currency: 'EUR' }
{ id: 'warehouse', amount: 200, currency: 'BYN' }
Rates
Курсы валют — рублей (BYN) за единицу. Получаются, например, из API НБРБ.
| Поле | Тип | Описание |
|---|---|---|
| usd | number | Сколько BYN стоит 1 USD. |
| eur | number | Сколько BYN стоит 1 EUR. |
{ usd: 2.82, eur: 3.3 }
CalcResult
Объект, который возвращает calculate(). Все суммы — числа с плавающей точкой; округляйте по необходимости.
| Поле | Тип | Описание |
|---|---|---|
| priceEur | number | Стоимость авто в EUR (без комиссии). |
| priceUsd | number | Стоимость авто в USD (без комиссии). |
| dutyEur | number | Таможенная пошлина, EUR. 0 для электромобилей. |
| dutyNote | string | Пояснение к пошлине: '(электромобиль)', '(−50% Указ №140)' или пустая строка. |
| utilByn | number | Утилизационный сбор, BYN. Постановление №195 (апрель 2026). |
| commissionEur | number | Сумма комиссии банковского перевода в EUR. 0, если commission не задана. |
| totalEur | number | Итоговая стоимость в EUR: цена + комиссия + пошлина + все фиксированные расходы + утилсбор. |
| totalUsd | number | Итоговая стоимость в USD. |
API Reference
calculate(params)
Основная функция. Принимает все параметры сделки, возвращает полный расчёт.
calculate(params: CalculateParams): CalculateResult
Параметры
| Параметр | Тип | Описание | |
|---|---|---|---|
| age | Age | req | Возраст автомобиля. Определяет таблицу ставок пошлины и ключ утилсбора. |
| price | number | req | Стоимость авто в валюте, указанной в currency. |
| currency | Currency | req | Валюта параметра price. Регистр не важен. |
| engineType | EngineType | req | Тип двигателя. Для 'electric' пошлина равна 0; утилсбор — по отдельной строке таблицы. |
| volume | number | req* | Объём двигателя, см³. Игнорируется, если engineType === 'electric'. |
| face | PersonType | req | Физическое ('individual') или юридическое ('legal') лицо. Влияет на таблицу утилсбора. |
| discount | boolean | req | Таможенная льгота 50% по Указу №140. Применяется только к пошлине, не к утилсбору. |
| fixedCosts | FixedCostItem[] | req | Массив фиксированных расходов. Может быть пустым. Каждый расход конвертируется в EUR для расчёта итога. |
| rates | Rates | req | Курсы USD и EUR к BYN. Используются для конвертации цены, фиксированных расходов в BYN и утилсбора. |
| commission | number | opt | Комиссия банковского перевода, %. Прибавляется к цене в итоге: priceEur × commission / 100. На пошлину не влияет. |
totalEur = priceEur + commissionEur + dutyEur + Σ(fixedCosts → EUR) + utilByn / rates.eur
Ставки пошлины (встроенные таблицы)
Ставки соответствуют решению Совета ЕЭК для физических лиц.
До 3 лет — MAX(% от стоимости в EUR, EUR × см³):
| До, EUR | % от цены | EUR/см³ |
|---|---|---|
| 8 500 | 54% | 2.50 |
| 16 700 | 48% | 3.50 |
| 42 300 | 48% | 5.50 |
| 84 500 | 48% | 7.50 |
| 169 000 | 48% | 15.00 |
| ∞ | 48% | 20.00 |
От 3 до 5 лет и старше 5 лет — EUR × см³ (ставка по объёму):
| До, см³ | 3–5 лет (EUR/см³) | >5 лет (EUR/см³) |
|---|---|---|
| 1 000 | 1.50 | 3.00 |
| 1 500 | 1.70 | 3.20 |
| 1 800 | 2.50 | 3.50 |
| 2 300 | 2.70 | 4.80 |
| 3 000 | 3.00 | 5.00 |
| ∞ | 3.60 | 5.70 |
calcDutyEur(age, priceEur, volumeCc)
Низкоуровневая функция. Вычисляет таможенную пошлину только для топливных автомобилей. Полезна, если нужно узнать пошлину в отрыве от остальных расходов.
calcDutyEur(age: Age, priceEur: number, volumeCc: number): number
| Параметр | Тип | Описание |
|---|---|---|
| age | Age | Возраст автомобиля. |
| priceEur | number | Стоимость авто в EUR. |
| volumeCc | number | Объём двигателя, см³. |
Возвращает: пошлину в EUR.
0.// BMW X5, 3.0 л, возраст 1 год, цена 50 000 EUR
calcDutyEur('under3', 50000, 3000);
// → MAX(50000 × 0.48, 3000 × 5.5) = MAX(24000, 16500) = 24000
// VW Golf, 1.6 л, возраст 4 года, цена 12 000 EUR
calcDutyEur('3to5', 12000, 1600);
// → 1600 × 2.5 = 4000
calcUtil(face, engineType, volumeCc, age)
Возвращает утилизационный сбор в BYN по Постановлению №195 (апрель 2026). Ставки для физических лиц зависят только от возраста; для юридических — от типа двигателя, объёма и возраста.
calcUtil(face: PersonType, engineType: EngineType, volumeCc: number, age: Age): number
| Параметр | Тип | Описание |
|---|---|---|
| face | PersonType | Физическое или юридическое лицо. |
| engineType | EngineType | Тип двигателя. Для 'electric' применяется отдельная строка таблицы юрлиц. |
| volumeCc | number | Объём двигателя, см³. Для электромобилей игнорируется. |
| age | Age | Возраст авто. '3to5' и 'over5' попадают в группу «от 3 лет». |
Возвращает: утилизационный сбор в BYN.
Ставки утилизационного сбора (физические лица, BYN)
| Возраст | Сумма |
|---|---|
| До 3 лет | 624.92 |
| От 3 лет | 1 282.02 |
Ставки утилизационного сбора (юридические лица, BYN)
| Тип | Объём, см³ | До 3 лет | От 3 лет |
|---|---|---|---|
| Электро | — | 1 229.28 | 2 950.38 |
| Топливо | до 1 000 | 6 811.16 | 17 386.97 |
| Топливо | до 2 000 | 25 226.22 | 44 374.56 |
| Топливо | до 3 000 | 70 885.91 | 107 322.94 |
| Топливо | до 3 500 | 81 393.68 | 124 611.62 |
| Топливо | ∞ | 103 649.00 | 136 253.33 |
// Физлицо, авто до 3 лет
calcUtil('individual', 'fuel', 2000, 'under3'); // → 624.92
// Юрлицо, топливо 1.6 л, старше 3 лет
calcUtil('legal', 'fuel', 1600, 'over5'); // → 44374.56
// Юрлицо, электромобиль до 3 лет
calcUtil('legal', 'electric', 0, 'under3'); // → 1229.28
Интерактивное демо
Меняйте параметры — расчёт и фрагмент кода обновляются мгновенно.