Профессиональная валидация ИНН и КПП согласно официальным требованиям ФНС РФ.
Поддерживает новые правила с 01.01.2026 (Приказ № ЕД-7-14/559@) и обратную совместимость со старыми ИНН.
Ivan Kalugin
npm install inn-validator
# или
yarn add inn-validator- ✅ Zero dependencies - никаких лишних библиотек
- ✅ Соответствие законодательству - Приказ ФНС № ЕД-7-14/559@ от 26.06.2025
- ✅ Поддержка новых правил (с 01.01.2026) и обратная совместимость
- ✅ Валидация ИНН (10 и 12 цифр)
- ✅ Валидация КПП (9 символов, включая буквы)
- ✅ Проверка контрольного числа по алгоритму ФНС
- ✅ Проверка кода региона (коды управлений ФНС)
- ✅ Поддержка иностранных организаций
- ✅ TypeScript - полная типизация
- ✅ Vue.js миксины - для легкой интеграции в формы
- ✅ Подробные сообщения об ошибках - для UX
- ✅ Всего 7KB - легковесная
import { validateINN } from "inn-validator";
// Валидация ИНН организации (10 цифр)
const result1 = validateINN("7707083893");
console.log(result1.isValid); // true
// Валидация ИНН физлица (12 цифр)
const result2 = validateINN("123456789047");
console.log(result2.isValid); // false (неправильное КЧ)
console.log(result2.errorMessage); // "Неверное контрольное число"
// Полная информация
if (result1.isValid) {
console.log(result1.details);
// {
// type: 'organization',
// regionCode: 77,
// yyIndex: 7,
// isForeignOrg: false,
// isNewFormat: true
// }
}import { validateINNForUI } from "inn-validator";
const validation = validateINNForUI("7707083893", "ИНН организации");
console.log(validation.message); // "" (пусто, если валидно)
console.log(validation.isValid); // true
const invalid = validateINNForUI("123", "ИНН");
console.log(invalid.message); // "ИНН должен содержать 10 или 12 цифр"import { validateKPP } from "inn-validator";
const kpp = validateKPP("770701001");
console.log(kpp.isValid); // true
const invalidKpp = validateKPP("7707A1001");
console.log(invalidKpp.errorMessage); // "Неверный формат КПП"import { validateINNWithKPP } from "inn-validator";
const result = validateINNWithKPP("7707083893", "770701001");
console.log(result.isValid); // true
console.log(result.details); // детали по ИНН<template>
<form @submit.prevent="handleSubmit">
<div class="form-group">
<label>ИНН организации</label>
<input
v-model="user.inn"
@input="validateINNField('inn', user.inn)"
:class="{ 'is-invalid': getFieldError('inn') }"
/>
<div class="error" v-if="getFieldError('inn')">
{{ getFieldError('inn') }}
</div>
</div>
<div class="form-group">
<label>КПП</label>
<input
v-model="user.kpp"
@input="validateKPPField('kpp', user.kpp)"
/>
</div>
<button type="submit" :disabled="!canSubmit()">
Сохранить
</button>
</form>
</template>
<script>
import { formValidationMixin } from 'inn-validator';
export default {
mixins: [formValidationMixin],
data() {
return {
user: {
inn: '',
kpp: ''
}
};
},
methods: {
handleSubmit() {
if (!this.canSubmit()) return;
const result = this.validateINNWithKPP({
inn: this.user.inn,
kpp: this.user.kpp
});
if (result.isValid) {
// Отправка на сервер
console.log('Данные корректны:', this.getFormData());
}
}
}
};
</script><template>
<div class="input-wrapper">
<label>{{ label }}</label>
<input
v-bind="$attrs"
:value="value"
@input="onInput"
@blur="onBlur"
:class="inputClasses"
/>
<div v-if="shouldShowError" class="error-message">
{{ inputState.errorMessage }}
</div>
</div>
</template>
<script>
import { inputValidationMixin } from 'inn-validator';
export default {
mixins: [inputValidationMixin],
props: {
value: String,
label: String
}
};
</script>| Функция | Описание | Возвращает |
|---|---|---|
validateINN(inn, options) |
Базовая валидация ИНН | InnValidationResult |
validateINNForUI(inn, fieldName, options) |
Для UI с сообщениями | InnUIValidationResult |
validateINNLegacy(inn) |
Без проверки структуры | InnValidationResult |
validateKPP(kpp) |
Валидация КПП | KPPValidationResult |
validateINNWithKPP(inn, kpp) |
ИНН + КПП вместе | InnWithKPPResult |
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
validateStructure |
boolean |
true |
Проверять структуру (NNYY) |
allowForeignOrgs |
boolean |
true |
Разрешать иностранные ИНН |
strictMode |
boolean |
false |
Строгий режим |
fieldLabel |
string |
'ИНН' |
Название поля для сообщений |
| Код | Значение | Сообщение |
|---|---|---|
EMPTY |
1 | "ИНН не может быть пустым" |
NOT_DIGITS |
2 | "ИНН должен содержать только цифры" |
INVALID_LENGTH |
3 | "ИНН должен содержать 10 или 12 цифр" |
INVALID_CHECKSUM |
4 | "Неверное контрольное число" |
INVALID_REGION_CODE |
5 | "Неверный код управления ФНС" |
INVALID_YY_INDEX |
6 | "Неверный индекс ФНС" |
FOREIGN_ORG_INVALID |
7 | "Неверный формат ИНН иностранной организации" |
INVALID_PP_CODE |
8 | "Неверный код причины постановки на учет" |
inn-validator/
├── __tests__/ # Тесты
├── src/
│ ├── core/ # Ядро валидации
│ │ └── innValidator.js
│ ├── mixins/ # Миксины
│ │ ├── formValidationMixin.js
│ │ └── inputValidationMixin.js
├── tests/
│ └── utils/
│ └── generateInn.js # Только для тестов
├── index.d.ts # TypeScript типы
├── README.md # Описание
├── LICENSE # MIT лицензия
└── package.json # Конфигурация
└── package_tests.json # Конфигурация для тестовДля тестирования вы можете использовать утилиту generateInn.js (находится в tests/utils/):
import { generateINN } from './tests/utils/generateInn';
// Сгенерировать ИНН физлица (12 цифр)
const individualINN = generateINN.generateIndividual();
// Сгенерировать ИНН юрлица (10 цифр)
const legalINN = generateINN.generateLegal();
// Сгенерировать 5 случайных ИНН для тестов
const testINNs = generateINN.generateForTests(5, 'both');# Установить dev-зависимости (только для тестирования)
npm install --save-dev @babel/core @babel/preset-env @vue/test-utils babel-jest jest jest-environment-jsdom vue vue-template-compiler
# Очистить кэш
npx jest --clearCache
# Запустить тесты
npm test
# Запустить с покрытием
npm run test:coverageЕсли вы хотите изолировать тестовые зависимости, используйте отдельный файл package_tests.json:
- переимеуйте его в
package.json, - установите зависимости:
npm install, - запустите тестирование:
npm test.
Пройдено 94% тестов
| Метрика | Значение |
|---|---|
| Пройдено тестов | 124/132 (94%) |
| Покрытие кода | ~74% |
| Критическая функциональность | 100% |
| Зависимости | 0 (zero dependencies) |
| Размер пакета | ~7KB |
- Валидация ИНН организаций (10 знаков) - 100%
- Валидация ИНН физических лиц (12 знаков) - 100% (с реальными тестовыми данными)
- Валидация структуры NNYY - 100%
- Валидация контрольных чисел - 100%
- Валидация КПП - 96% (один тест на уточнение формата)
- Vue миксины для форм - 100%
- Интеграция с существующими проектами - 100%
- ✅ Соответствует законодательству РФ (Приказ № ЕД-7-14/559@)
- ✅ Zero dependencies
- ✅ Vue интеграция
- ✅ TypeScript поддержка
- ✅ 94% тестов пройдено
MIT © Ivan Kalugin
Если вам нравится этот проект, поставьте звезду на GitHub!