Как санкционировать RUC Перу

Спроси: Как я могу проверять, что формат перуанской RUC был действительным?

Что RUC? Единственный Реестр Налогоплательщиков (RUC) - компьютерный реестр, где являются вписанными налогоплательщики всего Перу. Это налоговый код людей и предприятий, отправленный SUNAT (Национальное Заведование Таможен и Налогового Управления), с реестрами с 1993 и отрегулированный с 2004 [1].

Это единственный ключ, постоянного символа и обязательное использование, для всех натуральных или юридических людей (соотечественники или иностранцы) [2]. SUNAT поддерживает реестр налогоплательщиков, присоединяя RUC к личным данным [3].


Каждый налогоплательщик идентифицирован с числом 11 цифр. Первые 2 цифры идентифицируют в тип человека, следующие 8 - удостоверение личности или число, распределенное предприятию, и последний - цифра инспектор [4][5].

2 ("10" Persona natural, "20" Persona jurídica) + 8 (DNI o número empresa) + 1 (dígito verificador)


Что я попробовал: Я использовал тот же код, который использует SUNAT в Вашем Вебе, чтобы санкционировать RUC. Однако, прими неправильных RUCs и он, кажется, бы имел избыточные вычисления.

//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, введенной в компьютер пользователем, который мог бы принимать такие символы как схемы или другие знаки препинания между цифрами. Он бы это использовал как предварительный этап перед тем, как посылать формуляр.
Adicionalmente, если бы существовал способ подтверждать, существует ли RUC и активный, был бы наиболее еще.

Я пытаюсь в языке сценариев JavaScript, но смоги быть в любом популярном языке. Важным является алгоритм.

Ты пытаешься: Я нашел следующий список фабричных предприятий в empresas.regioncallao.gob.pe (PDF), который может использоваться как данные о доказательстве.


F̲u̲e̲n̲t̲e̲s ̲:
Законодательный указ N ° 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? Что RUC? - 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
8
задан 08.01.2017, 21:25
0 ответов

Код:

Мы используем 3 функции (каждая называет следующую, если результат действительный):

  1. validarInput(input)

    • Удали общие знаки препинания и место
    • Проверь, что это был целое число
    • Покажи результат с форматом
  2. rucValido(ruc)

    • Прими такую RUC как число
    • Проверь, что он начался с 10, 15, 16, 17 или 20
    • Подтверди, что цифра инспектор соответствовал
  3. obtenerDatosSUNAT(ruc)

    • Используй услугу http://www.wmtechnology.org/Consultar-RUC/ для получения данных о SUNAT
    • Он делает вызов из-за AJAX и анализирует ответ, чтобы видеть, активное ли состояние.

//Handler para el evento cuando cambia el input
//Elimina cualquier caracter espacio o signos habituales y comprueba validez
function validarInput(input) {
    var ruc       = input.value.replace(/[-.,[\]()\s]+/g,""),
        resultado = document.getElementById("resultado"),
        existente = document.getElementById("existente"),
        valido;
        
    existente.innerHTML = "";
    
    //Es entero?    
    if ((ruc = Number(ruc)) && ruc % 1 === 0
    	&& rucValido(ruc)) { // ⬅️ ⬅️ ⬅️ ⬅️ Acá se comprueba
    	valido = "Válido";
        resultado.classList.add("ok");
        obtenerDatosSUNAT(ruc);
    } else {
        valido = "No válido";
    	resultado.classList.remove("ok");
    }
        
    resultado.innerText = "RUC: " + ruc + "\nFormato: " + valido;
}

// Devuelve un booleano si es un RUC válido
// (deben ser 11 dígitos sin otro caracter en el medio)
function rucValido(ruc) {
    //11 dígitos y empieza en 10,15,16,17 o 20
    if (!(ruc >= 1e10 && ruc < 11e9
       || ruc >= 15e9 && ruc < 18e9
       || ruc >= 2e10 && ruc < 21e9))
        return false;
    
    for (var suma = -(ruc%10<2), i = 0; i<11; i++, ruc = ruc/10|0)
        suma += (ruc % 10) * (i % 7 + (i/7|0) + 1);
    return suma % 11 === 0;
    
}

//Buscar datos del RUC y si existe
function obtenerDatosSUNAT(ruc) {
    //Init
    var url = "https://cors-anywhere.herokuapp.com/wmtechnology.org/Consultar-RUC/?modo=1&btnBuscar=Buscar&nruc=" + ruc,
        existente = document.getElementById("existente"),
        xhr = false;
    if (window.XMLHttpRequest) //Crear XHR
        xhr = new XMLHttpRequest();
    else if (window.ActiveXObject)
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    else return false;
    //handler para respuesta
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) { //200 OK
            var doc = document.implementation.createHTMLDocument()
                    .documentElement,
                res = "",
                txt, campos,
                ok = false;
                
            doc.innerHTML = xhr.responseText;
            //Sólo el texto de las clases que nos interesa
            campos = doc.querySelectorAll(".list-group-item");
            if (campos.length) {
                for (txt of campos)
                    res += txt.innerText + "\n";
                //eliminar blancos por demás
                res = res.replace(/^\s+\n*|(:) *\n| +$/gm,"$1");
                //buscar si está el texto "ACTIVO" en el estado
                ok = /^Estado: *ACTIVO *$/m.test(res);
            } else
                res = "RUC: " + ruc + "\nNo existe.";
                
            //mostrar el texto formateado
            if (ok)
                existente.classList.add("ok");
            else 
                existente.classList.remove("ok");
            existente.innerText = res;
        }
    } //falta verificar errores en conexión
    xhr.open("POST", url, true);
    xhr.send(null);
}
#resultado, #existente {
    background-color: red;
    color: white;
    font-weight: bold;
    margin-top: 20px;
}
#resultado.ok, #existente.ok {
    background-color: green;
}
<label>RUC:</label>
<input type="text" id="input_ruc" style="width:100%;"
       oninput="validarInput(this)"
       placeholder="Ingrese su RUC">
<pre id="resultado"></pre>
<pre id="existente"></pre>

Demo для мобильных телефонов



Описание:

Первый шаг состоит в том, чтобы удалять символы, которые не интересуют нас (-.,[]() \t\r\n\f):

var ruc = input.value.replace(/[-.,[\]()\s]+/g,"");
  • внутри квадратных скобок возможно добавлять любой характер, который хотелось бы игнорировать.


Потом, мы подтверждаем, что у нас осталось целое число:

if ((ruc = Number(ruc)) && ruc % 1 === 0) {


И с целым числом, мы звоним в главную функцию:

rucValido(ruc);


Внутри функции, мы видим, что это было 11 цифр, и что он начинался в 10, 15, 16, 17 или 20:

if (!(ruc >= 1e10 && ruc < 11e9
   || ruc >= 15e9 && ruc < 18e9
   || ruc >= 2e10 && ruc < 21e9)) {

И, если выполняется все предыдущее, мы можем проверять, что последняя цифра (инспектор) была правильной.


Как санкционирует цифру инспектор RUC?

SUNAT использует корректирование метода для кодов контроля так называемый Модуль 11 или ISBN 10. Это метод, очень использованный в этих случаях, чтобы обнаруживать ошибки в единственной цифре, или простых или двойных подкачках (главным образом, ошибки tipeo). Состой в:

  1. Умножать каждый первые 10 dígitoa на установленный фактор, согласно Вашему положению (первая цифра из-за 5, второго из-за 4, *3, *2, *7, *6, *5, *4, *3, *2).
  2. Складывать каждый из результатов предыдущей точки.
  3. Вычислять оставшуюся часть разделения этого по 11 (suma % 11).
  4. Получать дополнение в 11 (11 - resto).
  5. Проверять, последняя цифра предыдущей точки совпадает ли с последней цифрой RUC (if (ruc % 10 == complemento % 10)).

Diagrama ejemplificando los pasos

А именно, что, для каждой цифры, мы будем складывать последнюю цифру 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)).

Тогда он у нас остается:

for (var suma = -(ruc%10<2), i = 0; i<11; i++, ruc = ruc/10|0)
    suma += (ruc % 10) * (i % 7 + (i/7|0) + 1);

И он подтверждается когда:

suma % 11 === 0;

Если вышеупомянутое условие истинное, тогда подтверждает цифру инспектор, и RUC действительная.

11
ответ дан 03.12.2019, 17:50
  • 1
    Большое спасибо Относящийся к Богородице! Твой có я говорю, что я помогаю себя много. ¿ В function obtenerDatosSUNAT (ruc) , cuá l - наличие консультаций в этом mé все? ¿ Cuá ntas проверки данных я могу делать? Привет. –  26.02.2018, 14:59
  • 2
    @Lucas - услуга, которая не mí или, что está место só это подобно примеру. Не sé... Я рекомендую тебе контактировать с ними, чтобы спрашивать их. –  26.02.2018, 16:38
  • 3
    @Mariano Превосходная работа –  03.11.2018, 13:32