Алгоритм проверки контрольного числа ИНН и страхового номера ПФ
Автор: Камбалов Андрей
Модуль содержит две функции для проверки контрольного числа ИНН и страхового номера ПФ
CheckINN
- Функция вычисляет контрольное число ИНН и возвращает True если ИНН введен правильно или False в противном случае
В качестве параметра передается проверяемый ИНН
Для справки: структура ИНН
- 10-ти разрядный ИНН - NNNNXXXXXC
- 12-ти разрядный ИНН - NNNNXXXXXXCC где:
- NNNN - номер налоговой инспекции
- XXXXX, XXXXXX - порядковый номер налогоплательщика (номер записи в госреестре)
- C - контрольное число в 10-ти разрядном ИНН
- CC - контрольное число в 12-ти разрядном ИНН (фактически, идущие подряд две контрольные цифры)
CheckPFCertificate
- Функция вычисляет контрольное число страхового номера ПФ и возвращает True если оно введено правильно или False в противном случае
В качестве параметра передается страховой номер ПФ без разделителей
Проверка контрольного числа Страхового номера проводится только для номеров больше номера 001-001-998.
Контрольное число Страхового номера рассчитывается следующим образом: каждая цифра Страхового номера умножается на номер своей позиции (позиции отсчитываются с конца), полученные произведения суммируются, сумма делится на 101, последние две цифры остатка от деления являются Контрольным числом.
unit INN_PF;
// ===========================================
// Камбалов А.Н.
// ACampball@mail.ru
// ===========================================
interface
function CheckINN(const INN: string): Boolean;
function CheckPFCertificate(const PF: string): Boolean;
implementation
uses SysUtils;
// ==================================================================================================
// Функция вычисляет контрольное число ИНН и возвращает True если ИНН
// введен правильно или False в противном случае
// В качестве параметра передается проверяемый ИНН
// Для справки: структура ИНН
// 10-ти разрядный ИНН - NNNNXXXXXC
// 12-ти разрядный ИНН - NNNNXXXXXXCC
// где: NNNN - номер налоговой инспекции
// XXXXX, XXXXXX - порядковый номер налогоплательщика (номер записи в госреестре)
// C - контрольное число в 10-ти разрядном ИНН
// CC - контрольное число в 12-ти разрядном ИНН
// (фактически, идущие подряд две контрольные цифры)
// ==================================================================================================
function CheckINN(const INN: string): Boolean;
const
factor1: array[0..8] of byte = (2, 4, 10, 3, 5, 9, 4, 6, 8);
factor2: array[0..9] of byte = (7, 2, 4, 10, 3, 5, 9, 4, 6, 8);
factor3: array[0..10] of byte = (3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8);
var
i: byte;
sum: word;
sum2: word;
begin
Result := False;
try
if Length(INN) = 10 then begin
sum := 0;
for i := 0 to 8 do
sum := sum + StrToInt(INN[i + 1]) * factor1[i];
sum := sum mod 11;
sum := sum mod 10;
Result := StrToInt(INN[10]) = sum;
end
else if Length(INN) = 12 then begin
sum := 0;
for i := 0 to 9 do
sum := sum + StrToInt(INN[i + 1]) * factor2[i];
sum := sum mod 11;
sum := sum mod 10;
sum2 := 0;
for i := 0 to 10 do
sum2 := sum2 + StrToInt(INN[i + 1]) * factor3[i];
sum2 := sum2 mod 11;
sum2 := sum2 mod 10;
Result := (StrToInt(INN[11]) = sum) and
(StrToInt(INN[12]) = sum2);
end; //
except
Result := False;
end; // try
end;
// ===========================================
// Функция вычисляет контрольное число страхового номера ПФ и возвращает True если
// оно введено правильно или False в противном случае
// В качестве параметра передается страховой номер ПФ без разделителй
//
// Проверка контрольного числа Страхового номера проводится только для
// номеров больше номера 001-001-998.
// Контрольное число Страхового номера рассчитывается следующим образом:
// каждая цифра Страхового номера умножается на номер своей позиции (позиции
// отсчитываются с конца), полученные произведения суммируются, сумма делится
// на 101, последние две цифры остатка от деления являются Контрольным числом.
// ===========================================
function CheckPFCertificate(const PF: string): Boolean;
var
sum: Word;
i: Byte;
begin
Result := False;
sum := 0;
if Length(PF) <> 11 then Exit;
try
for i := 1 to 9 do
sum := sum + StrToInt(PF[i]) * (9 - i + 1);
sum := sum mod 101;
Result := StrToInt(Copy(PF, 10, 2)) = sum;
except
Result := False;
end; // try
end;
end.
|