Алгоритм расчета контрольного числа в ИНН

Автор:Alexandr Solntsev
Дата:23.01.2002
Просмотров:8406
Скачиваний:2095
Оценка:, Оценок - 3
Сохранить в файле

Обсудить в форуме

Описание

Функция вычисляет контрольное число ИНН и возвращает ИНН с правильно заполненными разрядами. В качестве параметра передается проверяемый ИНН(включая контрольные разряды или без них), как 10-ти,так и 12-ти разрядный.
 Для справки: структура ИНН
  10-ти разрядный ИНН - NNNNXXXXXC
  12-ти разрядный ИНН - NNNNXXXXXXCC
   где: NNNN - номер налоговой инспекции
          XXXXX, XXXXXX - порядковый номер налогоплательщика (номер записи в госреестре)
          C - контрольное число в 10-ти разрядном ИНН
          CC - контрольное число в 12-ти разрядном ИНН (фактически, идущие подряд две контрольные цифры)

Текст примера

 /* Специфические таблицы, определенные МНС РФ */

array _m10, _m1_12, _m2_12;

/* Для 10-ти разрядного ИНН */
_m10( 0 )=0;
_m10( 1 )=2;
_m10( 2 )=4;
_m10( 3 )=10;
_m10( 4 )=3;
_m10( 5 )=5;
_m10( 6 )=9;
_m10( 7 )=4;
_m10( 8 )=6;
_m10( 9 )=8;

/* Для 1-й цифры 12-ти разрядного ИНН */
_m1_12( 0 )= 0;
_m1_12( 1 )= 7;
_m1_12( 2 )= 2;
_m1_12( 3 )= 4;
_m1_12( 4 )= 10;
_m1_12( 5 )= 3;
_m1_12( 6 )= 5;
_m1_12( 7 )= 9;
_m1_12( 8 )= 4;
_m1_12( 9 )= 6;
_m1_12( 10 )=8;

/* Для 2-й цифры 12-ти разрядного ИНН */
_m2_12( 0 )= 0;
_m2_12( 1 )= 3;
_m2_12( 2 )= 7;
_m2_12( 3 )= 2;
_m2_12( 4 )= 4;
_m2_12( 5 )= 10;
_m2_12( 6 )= 3;
_m2_12( 7 )= 5;
_m2_12( 8 )= 9;
_m2_12( 9 )= 4;
_m2_12( 10 )=6;
_m2_12( 11 )=8;

macro getKeyINN( fINN )
  var cINN:string;
  var i:integer, v:integer, s, lf, c=0, cc=0;

  fINN=trim( fINN );
  lf=strlen( fINN );
  cINN=``;
  if ( lf < 11 )
    /* 10-разрядный ИНН */
    i=1;
    while ( i < 10 )
      if ( i <= lf )
        s=substr( fINN, i, 1 );
      else
        /* Если задано короткое ИНН - дополняем справа нулями */
        s=`0`;
      end; 
      v=int( s );
      c=c+v*_m10( i );
      cINN=cINN+s;
      i=i+1;
    end;
    v=c-11*int( c/11 );
    v=v-10*int( v/10 );
    s=string( v:1 );
    cINN=cINN+s;
  else
    /* 12-разрядный ИНН */
    i=1;
    while ( i < 11 )
      if ( i <= lf )
        s=substr( fINN, i, 1 );
      else
        /* Если задано короткое ИНН - дополняем справа нулями */
        s=`0`;
      end; 
      v=int( s );
      c=c+v*_m1_12( i );
      cc=cc+v*_m2_12( i );
      cINN=cINN+s;
      i=i+1;
    end;
    v=c-11*int( c/11 );
    v=v-10*int( v/10 );
    s=string( v:1 );
    cINN=cINN+s;
    cc=cc+v*_m2_12( i );
    v=cc-11*int( cc/11 );
    v=v-10*int( v/10 );
    s=string( v:1 );
    cINN=cINN+s;
  end;
  return cINN;
end;