Вопрос: Как проверить правильность формата перуанского RUC?
Что такое РУК? Единый реестр налогоплательщиков ( RUC ) — это компьютерный реестр , в котором зарегистрированы налогоплательщики со всего Перу. Это налоговый кодекс для физических лиц и компаний, выпущенный SUNAT ( Национальное управление таможенного и налогового управления ), с записями с 1993 года и регулируемый с 2004 года [1] .
Это уникальный ключ, имеющий постоянный характер и обязательный для использования всеми физическими или юридическими лицами (национальными или иностранными) [2] . SUNAT ведет реестр налогоплательщиков, связывая RUC с личными данными [3] .
Каждый налогоплательщик идентифицируется 11-значным номером. Первые 2 цифры идентифицируют тип человека, следующие 8 — это DNI или номер, присвоенный компании, а последняя — проверочная цифра [4] [5] .
Что я пробовал: я использовал тот же код, который SUNAT использует на своем веб-сайте для проверки RUC. Однако он принимает неправильные RUC и, по-видимому, имеет избыточные вычисления.
//Validación de SUNAT
function valruc(valor){
valor = trim(valor)
if ( esnumero( valor ) ) {
if ( valor.length == 8 ){
suma = 0
for (i=0; i<valor.length-1;i++){
digito = valor.charAt(i) - '0';
if ( i==0 ) suma += (digito*2)
else suma += (digito*(valor.length-i))
}
resto = suma % 11;
if ( resto == 1) resto = 11;
if ( resto + ( valor.charAt( valor.length-1 ) - '0' ) == 11 ){
return true
}
} else if ( valor.length == 11 ){
suma = 0
x = 6
for (i=0; i<valor.length-1;i++){
if ( i == 4 ) x = 8
digito = valor.charAt(i) - '0';
x--
if ( i==0 ) suma += (digito*x)
else suma += (digito*x)
}
resto = suma % 11;
resto = 11 - resto
if ( resto >= 10) resto = resto - 10;
if ( resto == valor.charAt( valor.length-1 ) - '0' ){
return true
}
}
}
return false
}
function trim(cadena){
cadena2 = "";
len = cadena.length;
for ( var i=0; i <= len ; i++ )
if (cadena.charAt(i) != " "){
cadena2+=cadena.charAt(i);
}
return cadena2;
}
function esnumero(campo){
return (!(isNaN( campo )));
}
//Prueba
var ruc = '12345678903',
valido = valruc(ruc);
console.log('El RUC', ruc,
'es', (valido?'válido':'inválido'),
'para SUNAT.');
Цель: я заинтересован в проверке формата RUC, введенного пользователем, который может принимать такие символы, как дефисы или другие знаки препинания между цифрами. Я бы использовал его как предварительный этап перед отправкой формы.
Кроме того, если бы был способ проверить, существует ли и активен ли RUC, было бы еще лучше.
Я тестирую на JavaScript, но можно и на любом популярном языке. Главное алгоритм.
Тесты: я нашел следующий список компаний-производителей на сайте company.regioncallao.gob.pe (? PDF) , которые можно использовать в качестве тестовых данных.
F̲u̲e̲n̲t̲e̲s̲:
① Законодательный декрет № 943 – http://www.elperuano.com.pe/NormasElperuano/2015/06/16/1251160-1.html
② SUNAT – Единый реестр налогоплательщиков – http://www.sunat.gob .pe/legislacion/ruc/
③ Законодательство RUC (?PDF) – http://mariano.freevar.com/ruc/REGLAMENTO%20DE%20LA%20LEY%20DEL%20RUC.pdf
④ Что такое SUNAT? Что такое РУК? - http://conexiontributaria.blogspot.com.ar/2011/10/que-es-la-sunat-que-es-el-ruc-que_9779.html
⑤ Бухгалтерский форум - другие цифры RUC - http://www. perucontable.com/modules/newbb/viewtopic.php?post_id=57226
Код:
Мы используем 3 функции (каждая вызывает следующую, если результат правильный):
validarInput(input)
rucValido(ruc)
obtenerDatosSUNAT(ruc)
Demo para móviles
Описание:
Первый шаг — удалить символы, которые нас не интересуют (
-.,[]() \t\r\n\f
):Затем мы проверяем, что у нас осталось целое число:
И с целым числом мы вызываем основную функцию:
Внутри функции мы видим, что это 11 цифр, и они начинаются с 10, 15, 16, 17 или 20:
И, если все вышеперечисленное верно, мы можем проверить правильность последней цифры (верификатора).
Как проверяется проверочная цифра RUC?
SUNAT использует адаптацию метода для управляющих кодов под названием Module 11 или ISBN 10 . В этих случаях это широко используемый метод для обнаружения ошибок в одной цифре, одиночном или двойном обмене (в основном, опечаток). Состоит из:
suma % 11
).11 - resto
).if (ruc % 10 == complemento % 10)
).Другими словами, для каждой цифры мы собираемся добавить последнюю цифру RUC (
ruc % 10
) и умножить ее на ее коэффициент (i % 7 + (i/7|0) + 1
) - да, это дает нам 1, 2, 3, 4, 5, 6, 7, 2 , 3, 4 , 5 для каждого значенияi
.В каждой итерации
i
мы удаляем последнюю цифру (ruc = ruc/10|0
).Следует отметить, что для еще большего упрощения операции мы включаем контрольную цифру в тот же счет (с коэффициентом 1 для
i=0
). Нам нужно настроить только в тех случаях, когда на шаге 4 получены значения больше 9. Если это 10 или 11, это означает, что последняя цифра 0 или 1, и в этих случаях 1 вычитается из общей суммы (suma = -(ruc%10<2)
).Итак, нам осталось:
И проверяется, когда:
Если это последнее условие истинно, то проверяется контрольная цифра, и RUC действителен.