Delphi World - Алгоритм проверки контрольного числа ИНН и страхового номера ПФ
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Алгоритм проверки контрольного числа ИНН и страхового номера ПФ

Автор: Камбалов Андрей

Модуль содержит две функции для проверки контрольного числа ИНН и страхового номера ПФ

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.

Скачать архив INN_PF.zip (1.2K)

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования