npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

customs-calculator

v1.1.0

Published

Customs duty calculator for importing vehicles to Belarus (EAEU rates). TypeScript, ESM/CJS, zero dependencies.

Downloads

189

Readme

customs-calculator

Интерактивное демо

Библиотека для расчёта стоимости растаможки автомобилей в Беларуси по ставкам ЕАЭС.

  • Таможенная пошлина по трём возрастным группам (до 3, 3–5, старше 5 лет)
  • Утилизационный сбор — физические и юридические лица (Постановление №195, апрель 2026)
  • Льгота 50% по Указу №140 — для физических лиц
  • Электромобили — без пошлины, отдельные ставки утильсбора
  • Четыре вида гибридов: MHEV, HEV, PHEV, EREV
  • Гибрид EREV — пошлина 15% + НДС 20% (на стоимость с учётом пошлины)
  • НДС 20% для юридических лиц, кроме чистых электромобилей
  • Динамические фиксированные расходы в EUR / USD / BYN
  • Комиссия банковского перевода
  • Итого в EUR и USD

Установка

npm install customs-calculator

yarn add customs-calculator

Использование

TypeScript / ESM

import { calculate, Age, PersonType, EngineType, Currency } from 'customs-calculator';

const result = calculate({
  age:        Age.Under3,
  price:      15000,
  currency:   Currency.EUR,
  engineType: EngineType.Fuel,
  volume:     2000,
  face:       PersonType.Individual,
  discount:   false,
  rates:      { usd: 2.82, eur: 3.30 },
  fixedCosts: [
    { id: 'delivery',  amount: 1400, currency: Currency.EUR },
    { id: 'warehouse', amount: 200,  currency: Currency.BYN },
  ],
  commission: 1.5, // +1.5% к цене в итоге
});

console.log(result.totalEur); // итого в EUR
console.log(result.dutyEur);  // пошлина в EUR
console.log(result.utilByn);  // утильсбор в BYN

CommonJS

const { calculate, Age, EngineType, PersonType, Currency } = require('customs-calculator');

Браузер без бандлера

Подключите IIFE-сборку через CDN — она вешает все экспорты на глобальную переменную CustomsCalc:

<!-- CDN (unpkg) -->
<script src="https://unpkg.com/customs-calculator/dist/index.global.js"></script>

<!-- или jsDelivr -->
<script src="https://cdn.jsdelivr.net/npm/customs-calculator/dist/index.global.js"></script>

<script>
  const result = CustomsCalc.calculate({
    age: 'under3', price: 15000, currency: 'EUR',
    engineType: 'fuel', volume: 2000, face: 'individual',
    discount: false, rates: { usd: 2.82, eur: 3.30 }, fixedCosts: [],
  });
  console.log(result.totalEur);
</script>

Если пакет уже установлен через npm, файл доступен по пути node_modules/customs-calculator/dist/index.global.js.

Строки вместо enums (JS)

Строковые значения enums совместимы напрямую:

import { calculate } from 'customs-calculator';

const result = calculate({
  age: 'under3', currency: 'EUR', engineType: 'fuel', face: 'individual',
  price: 15000, volume: 2000, discount: false,
  rates: { usd: 2.82, eur: 3.30 }, fixedCosts: [],
});

Enums

| Enum | Значения | |------|---------| | Age | Under3 = 'under3', From3To5 = '3to5', Over5 = 'over5' | | PersonType | Individual = 'individual', Legal = 'legal' | | EngineType | Fuel = 'fuel', Electric = 'electric', HybridMhev = 'hybrid_mhev', HybridHev = 'hybrid_hev', HybridPhev = 'hybrid_phev', HybridErev = 'hybrid_erev' | | Currency | EUR = 'EUR', USD = 'USD', BYN = 'BYN' |

Типы двигателя

| Значение | Что это | Пошлина | НДС физлицо | НДС юрлицо | Утильсбор (юрлицо) | |----------|---------|---------|-------------|------------|-------------------| | Fuel | ДВС без электрической установки | таблицы возраст/объём | — | 20% | по объёму ДВС | | HybridMhev | мягкий гибрид 48 В, электромотор не ведёт ТС сам | таблицы возраст/объём | — | 20% | по объёму ДВС | | HybridHev | полный гибрид без внешней зарядки | таблицы возраст/объём | — | 20% | по объёму ДВС | | HybridPhev | подзаряжаемый гибрид | таблицы возраст/объём | — | 20% | по объёму ДВС | | HybridErev | гибрид с генератором (range extender) | 15% от стоимости | 20% | 20% | по объёму ДВС | | Electric | только электродвигатель, без ДВС | 0 | — | — | фиксированная |

Льгота 50% по Указу №140 — только для физлиц. При face: Legal параметр discount игнорируется, а не уменьшает пошлину.

Шесть типов, но на текущих ставках только три разных результата. Fuel, HybridMhev, HybridHev и HybridPhev считаются одинаково, поэтому в своём интерфейсе их можно свести в одну категорию — так сделано в демо, где три кнопки вместо шести. Отдельно стоят только HybridErev и Electric. В API типы всё равно различаются: если ставки для них разойдутся, поменяется таблица, а не подпись функций.

Строки перечня утилизационного сбора

Ставки утильсбора берутся из перечня видов и категорий транспортных средств, являющихся объектами обложения утилизационным сбором, а также ставок утилизационного сбора. Легковые автомобили — это раздел 1 перечня: «транспортные средства категории M1, в том числе повышенной проходимости категории M1G». Внутри раздела ровно три строки:

| Строка | Формулировка в перечне | Когда применяется | |--------|------------------------|-------------------| | 1.1 | «с электродвигателями, за исключением транспортных средств, оснащенных различными типами гибридных силовых установок» | Юрлицо, Electric | | 1.2 | «с объемом двигателя: …» — пять диапазонов | Юрлицо, ДВС и все четыре вида гибридов | | 1.3 | «ввозимые (ввезенные) физическими лицами для личного пользования» | Любое физлицо, независимо от типа двигателя |

Оговорка в строке 1.1 и есть причина, по которой гибриды считаются по объёму: она прямо исключает ТС с гибридными силовыми установками любого типа, а строка 1.2 никаких оговорок о приводе не содержит. Отдельных строк для гибридов в перечне нет, поэтому для них обязательно задавать volume.

Ставки соответствуют категориям M1 и M1G и действуют с 29.04.2026 — дата доступна как UTIL_RATES_EFFECTIVE_FROM, ссылка на источник как UTIL_RATES_SOURCE. Категории M2/M3 и N1—N3 не реализованы.

API

calculate(params): CalculateResult

Основная функция. Принимает все параметры сделки и возвращает полный расчёт.

Параметры:

| Параметр | Тип | Описание | |----------|-----|---------| | age | Age | Возраст авто. Определяет таблицу ставок пошлины. | | price | number | Стоимость авто в валюте currency. | | currency | Currency | Валюта параметра price. | | engineType | EngineType | Тип двигателя. См. таблицу выше. | | volume | number | Объём двигателя ДВС, см³. Игнорируется только для Electric. Для гибридов на пошлину HybridErev не влияет, но нужен для утильсбора. | | face | PersonType | Физическое или юридическое лицо. Влияет на утильсбор, НДС и применимость льготы. | | rates | Rates | Курсы BYN: { usd: number, eur: number }. | | discount | boolean? | Льгота 50% по Указу №140. К пошлине и НДС. Игнорируется при face: Legal — у юрлиц льготы нет. | | fixedCosts | FixedCost[]? | Фиксированные расходы. Конвертируются в EUR для итога. | | commission | number? | Комиссия банковского перевода, %. Добавляется к итогу. |

Возвращает CalculateResult:

| Поле | Тип | Описание | |------|-----|---------| | priceEur | number | Стоимость авто в EUR. | | priceUsd | number | Стоимость авто в USD. | | dutyEur | number | Таможенная пошлина, EUR. | | dutyNote | string | Уточнение к пошлине отдельным полем и без оформления — скобки и прочую подачу добавляйте сами: 'электромобиль', 'гибрид PHEV', 'гибрид EREV, −50% Указ №140', '−50% Указ №140' или ''. | | vatEur | number | НДС, EUR — 20% от стоимости с учётом пошлины. Когда начисляется — см. таблицу выше. Утильсбор в базу НДС не входит. | | utilByn | number | Утилизационный сбор, BYN. | | commissionEur | number | Комиссия в EUR. 0 если не задана. | | totalEur | number | Итого: цена + комиссия + пошлина + расходы + утильсбор. | | totalUsd | number | Итого в USD. |

Формула:

totalEur = priceEur + commissionEur + dutyEur + vatEur + Σ(fixedCosts → EUR) + utilByn / rates.eur

calcDutyEur(age, priceEur, volumeCc, engineType?): number

Вычисляет таможенную пошлину. engineType необязателен, по умолчанию Fuel.

import { calcDutyEur, Age, EngineType } from 'customs-calculator';

calcDutyEur(Age.Under3, 50000, 3000);
// → MAX(50000 × 0.48, 3000 × 5.5) = 24000

calcDutyEur(Age.From3To5, 12000, 1600);
// → 1600 × 2.5 = 4000

calcDutyEur(Age.Over5, 20000, 1500, EngineType.HybridPhev);
// → 1500 × 3.2 = 4800 — как обычный ДВС

calcDutyEur(Age.Over5, 20000, 1500, EngineType.HybridErev);
// → 20000 × 0.15 = 3000

calcDutyEur(Age.Over5, 20000, 1500, EngineType.Electric);
// → 0

calcUtil(face, engineType, volumeCc, age): number

Возвращает утилизационный сбор в BYN для категорий M1 / M1G (Постановление №195, апрель 2026).

import { calcUtil, Age, PersonType, EngineType } from 'customs-calculator';

calcUtil(PersonType.Individual, EngineType.Fuel, 2000, Age.Under3); // → 624.92
calcUtil(PersonType.Legal,      EngineType.Fuel, 1600, Age.Over5);  // → 44374.56

// Электро — строка 1.1 перечня, объём не важен
calcUtil(PersonType.Legal, EngineType.Electric, 0, Age.Under3);     // → 1229.28

// Любой гибрид — строка 1.2 перечня, по объёму ДВС
calcUtil(PersonType.Legal, EngineType.HybridErev, 1500, Age.Under3); // → 25226.22
calcUtil(PersonType.Legal, EngineType.HybridPhev, 1500, Age.Under3); // → 25226.22

Метаданные ставок

| Экспорт | Значение | |---------|----------| | UTIL_RATES_EFFECTIVE_FROM | Дата вступления ставок утильсбора: '2026-04-29' | | UTIL_RATES_SOURCE | Источник ставок утильсбора | | DUTY_RATES_SOURCE | Источник ставок пошлины — Приложение 2 к Решению Совета ЕЭК №107 |


Тесты

npm test        # сборка + node --test (27 тестов, без зависимостей)
npm run typecheck

Покрыты: границы всех диапазонов объёма и стоимости, эквивалентность MHEV/HEV/PHEV обычному ДВС, ставка EREV, утильсбор по всем типам и лицам, конвертация валют, формула итога и строки dutyNote.