Validación de RUC’s SUNAT (Perú) sin internet – Algoritmo
-->Validación de RUC’s SUNAT (Perú) sin internet – Algoritmo: Con la ayuda de la macro que publicó SUNAT sobre el PLE 4.0 LIBROS ELECTRÓNICOS he podido visualizar y mejorar (en el tema de la creación de una función personalizada) el algoritmo de SUNAT para validar RUC’s; probablemente se han dado cuenta que al intentar colocar cualquier número aleatorio simulando un RUC desde cualquier PDT este es rechazado inmediatamente, esto sucede aún sin estar conectado a internet debido a un juego de números con condiciones que deben cumplirse, lo que se conoce como algoritmo, cabe recalcar que con este algoritmo comprobaremos la validez de los RUC’s, puede darse el caso en que un RUC es válido de acuerdo al algoritmo sin embargo este aun no existe en la base de datos (Ruc Libre).
He preparado un archivo con todos los cálculos y pasos para validar RUC’s usando fórmulas simples, así también he creado una función personalizada =ValidarRucSunat(celda) la que te recomiendo revisar, como material adicional he preparado una macro para generar RUC’s de forma aleatoria. El desarrollo de todo este archivo es como agradecimiento a todas las personas que visitan la web, gracias por su apoyo.
Para que tengan una idea del material que he preparado, a continuación dejo unas capturas.
Validación de RUC SUNAT mediante formulas.
Función personalizada para Validación de RUC SUNAT
Macro para generar de RUC’s de forma aleatoria
ALGORITMO PARA VALIDAR RUC
A continuación te detallo los cálculos que se necesitan hacer para saber si un número de RUC es correcto o no. Analizando el RUC 20512333797
- Lo primero es revisar los dos primeros dígitos, estos solo pueden ser 10,15,17 y 20, para el caso los dos primeros son 20512333797.
- Luego vamos a multiplicar los 10 primeros dígitos en este orden y por estos valores, finalizamos haciendo una suma de los totales: Multiplicamos el primer dígito por 5 –>(2*5=10)
Multiplicamos el segundo dígito por 4–>(0*4=0)
Multiplicamos el tercero dígito por 3–>(5*3=15)
Multiplicamos el cuarto dígito por 2–>(1*2=2)
Multiplicamos el quinto dígito por 7–>(2*7=14)
Multiplicamos el sexto dígito por 6–>(3*6=18)
Multiplicamos el sétimo dígito por 5–>(3*5=15)
Multiplicamos el octavo dígito por 4–>(3*4=12)
Multiplicamos el noveno dígito por 3–>(7*3=21)
Multiplicamos el décimo dígito por 2–>(9*2=18)
La suma Total sería 10+0+15+2+14+18+15+12+21+18 = 125 - Dividimos la suma total entre 11 y tomamos solo la parte entera: 125/11=11.36
- Hacemos este sencillo cálculo: 11 – (suma total – el valor entero que obtuvimos x 11) para nuestro caso sería: 11 – (125–11x11) = 7 ; Hacemos la aclaración que los valores de color naranja son fijos y por coincidencia es 11 el valor de color verde.
- Como resultado final tenemos 7, este valor lo comparamos con el último dígito del RUC 20512333797 si estos valores coinciden entonces el RUC es Válido.
- NOTA: si el resultado de 11 – (125–11x11) hubiera sido 10 u 11 se toman como valores 0 o 1 respectivamente y estos se comparan con el ultimo dígito del RUC a validar.
Y como sería para validar los dni?
CREATE OR REPLACE FUNCTION XXR_VALIDA_RUC(P_numero_RUC VARCHAR2) RETURN VARCHAR2 IS
ln_start INTEGER := 1;
ln_max INTEGER := 6;
ln_curr INTEGER;
ln_base INTEGER := 11;
ln_total INTEGER := 0;
ln_last_digit INTEGER;
BEGIN
FOR I IN 1..10 LOOP
if ln_curr > ln_max or ln_curr is null then
ln_curr := ln_start + 1;
else
ln_curr := ln_curr + 1;
end if;
ln_total := ln_total + (ln_curr *substr(P_numero_RUC,(ln_base-i),1));
END LOOP;
ln_last_digit :=ln_base-(ln_total-FLOOR((ln_total/ ln_base))*ln_base);
IF ln_last_digit > 9 THEN
ln_last_digit := SUBSTR(ln_last_digit,2,1);
END IF;
IF SUBSTR(P_numero_RUC,11,1) = ln_last_digit THEN
RETURN ‘Y’;
ELSE
RETURN ‘N’;
END IF;
END;
Te faltó inicializar antes del FOR, li_curr = 1
Felicitaciones, muy bueno y servicial
Gracias por sus palabras, tenemos mas archivos que pueden ser de su interés. Saludos
hola
he visto el calculo y el ultimo digito sería solo el residuo por exceso de la suma total y 11
en el caso mostrado
125 L 11
132 12
7
ultimo digito=7
si correcto.
Gracias por el aporte , una pequenha contribucion , los puntos 3 y 4 se puede reducir a MOD(11-MOD(sumaTotal,11),10) o para los desarrolladores : (11-(sumatotal%11))%10
Gracias por la recomendación.
Los RUC que inician con los numeros 15 y 17 corresponden a Sucesiones Indivisas u otros tipos de entidades no consideradas naturales o juridicas. Sobre el post, lo mejor seria que la sunat revele publicamente cual es la estructura del ruc y su rutina validadora, si ya lo está haciendo mediante el PLE no faltaria mucho para que se les prenda la luz y aprendan que los usuarios contribuyentes necesitan todas las herramientas necesaria para elaborar correctamente sus declaraciones.
no ha revelado exactamente pero ya se sabe como es.
Que significan los primeros 2 dígitos que pueden ser 10, 15, 17 y 20?
Son los dos primeros dígitos del ruc.
Ok, pero por ejemplo el si empieza con 10, significa que es persona natural? si empieza con 20 puede ser de una persona o es de una empresa? con el resto de los numeros 15 y 17 que diferencia tienen?
Excelente herramienta.
MUY BUENO LAS HERRAMIENTAS