Недавно узнал, что ИНН это оказывается не просто уникальная последовательность цифр, но и последовательность сгенерированная по определенным правилам.
Идея не моя - взял здесь:
http://www.delphikingdom.com/treasury/inn_pf.htm
Я всего лишь перевел код с Дельфи на X++.
Все это дело оформлено в виде функции. Функция вычисляет контрольное число ИНН и возвращает true если ИНН введен правильно или false в противном случае.
В качестве параметра передается проверяемый ИНН:
PHP код:
boolean checkINN(str INN)
{
int factor1[9];
int factor2[10];
int factor3[11];
int sm, sm2;
int i;
factor1[1] = 2; factor1[2] = 4; factor1[3] = 10; factor1[4] = 3; factor1[5] = 5;
factor1[6] = 9; factor1[7] = 4; factor1[8] = 6; factor1[9] = 8;
factor2[1] = 7; factor2[2] = 2; factor2[3] = 4; factor2[4] = 10; factor2[5] = 3;
factor2[6] = 5; factor2[7] = 9; factor2[8] = 4; factor2[9] = 6; factor2[10] = 8;
factor3[1] = 3; factor3[2] = 7; factor3[3] = 2; factor3[4] = 4; factor3[5] = 10;
factor3[6] = 3; factor3[7] = 5; factor3[8] = 9; factor3[9] = 4; factor3[10] = 6;
factor3[11] = 8;
if (strlen(INN) == 10)
{
sm = 0;
for (i=1; i<10; i++)
sm = sm + str2int(substr(INN,i,1))*factor1[i];
sm = sm mod 11;
sm = sm mod 10;
if (str2int(substr(INN,10,1)) == sm) return true;
else return false;
}
else if (strlen(INN) == 12)
{
sm = 0;
for (i=1; i<11; i++)
sm = sm + str2int(substr(INN,i,1))*factor2[i];
sm = sm mod 11;
sm = sm mod 10;
sm2 = 0;
for (i=1; i<12; i++)
sm2 = sm2 + str2int(substr(INN,i,1))*factor3[i];
sm2 = sm2 mod 11;
sm2 = sm2 mod 10;
if ((str2int(substr(INN,11,1)) == sm) && (str2int(substr(INN,12,1)) == sm2)) return true;
else return false;
}
else return false;
}
Кстати, неужели в Аксапте нет более удобного способа инициализировать массивы ?