Sv Community El Salvador
Soporte y Tecnología => Programación => Topic started by: Chero on October 26, 2011, 11:52:54 pm
-
¿Alguien sabe cómo calcular el dígito verificador del DUI y NIT? Busqué en Google y no encontré nada.
Esto sería para verificar los números cuando se registra una persona en un programa/tarea de la U que me está tocando hacer. No es un requisito que me hayan pedido, pero siempre he tenido curiosidad de cómo se hace.
-
No se que queres decir con esto: cómo calcular el dígito verificador
pero podes verificar si los digitos siguen un formato predeterminado con expressiones regulares.
Por ejemplo el DUI creo que sigue este formato
12345678-1
Solo tendrias que evaluar la cadena de texto y hacer un test como este (en JavaScript):
var regex = /^\d{8}-\d$/;
regex.test("12345678-1") // true
regex.test("12345678") // false
regex.test("123456789-1") // false
regex.test("12345678-12") // false
Varios lenguajes de programacion comparten la misma syntax para las expressiones regulares, con cambios minimos en la manera de instanciarlas y ejecutarlas.
Ahora, para el NIT, que sigue este formato 1234-123456-123-0, el processo seria bastante familiar y te lo dejo de tarea para que te familiarizes con las expressiones regulares.
pd: Yo no tengo ninguno de esos documentos, asi que no estoy seguro del formato
-
creo que lo que chero busca es validar si un dui es válido o no....
adjunto un bloc de notas con el codigo de una funcion en pl para verificar eso... ahí están los procesos matematicos que se realizan, espero te sirva de algo
con los permisos de alberto, porque no puso sus términos legales de usar la función, es que lo comparto...
-
no soy muy bueno en pascual
alguien podria poner el algoritmo ya sacado?
-
No se que queres decir con esto: cómo calcular el dígito verificador
pero podes verificar si los digitos siguen un formato predeterminado con expressiones regulares.
Lo que pasa es que para documentos de este tipo no solo siguen un patron o formato, sino que al final tienen un numero verificador que es calculado con referencia a los otros numeros, para valga la redundancia validar el número final.
no soy muy bueno en pascual
alguien podria poner el algoritmo ya sacado?
No es pascual, es PL/SQL, lenguaje de programacion con sentencias TSQL para oracle.
Para el del DUI el proceso que recuerdo es este:
-el numero que esta a la derecha del guion se conoce como digito verificador
-se coloca el numero sin guiones y con ceros a la izquierda
-deben ser 9 caracters
-se toman los primeros 8 caracteres (sin el digito verificador) y a cada uno se le multiplica por la posicion en la que se encuentra. Partiendo que la posicion 9 es el primer numero de la izquierda.
-se suman todos los resultados
-se hace un mod de la suma dividido por 10 (osea toma el remanente de esa division)
-Resta 10 menos el remanente de la division
-si la resta da 0 el DUI es correcto
-si la resta es igual al digito verificador el DUI es correcto
-si la resta es distinta al digito verificador el DUI es incorrecto
-
Pongamolo en practica, tomemos como ejemplo el DUI de este simpatico señor que encontre en google images.
(http://www.elsalvador.com/noticias/2005/05/11/nacional/img/dui.JPG)
El DUI del sonriente señor es:
00016297-5
Digito verificador: 5
Ahora asignemos las posiciones
Posicion -> 9 8 7 6 5 4 3 2
DUI -> 0 0 0 1 6 2 9 7
SUMA: (9*0)+(8*0)+(7*0)+(6*1)+(5*6)+(4*2)+(3*9)+(2*7) = 85
DIVISION: MOD(85/10) = 5
RESTA: 10 - 5 = 5
Digito Verificador = 5 = Resta = 5 = DUI valido.
Intentenlo con su DUI, verificare si aca en la BD hay alguna funcion para verificar el NIT.
-
Exelente explicación Camus.... :):)
-
Para el NIT existe un procedimiento similar como el que ha explicado Camus...el ultimo digito es un verificador.
Lo unico que desconozco es si el algoritmo para calcular ese digito es alguna especie de secreto de estado, mañana hare la pregunta a mi jefe y sino hay ningun problema publicare aca todo el procedimiento.
-
No estaba familiar con el bendito digito verificador, me recuerda a la validacion de tarjetas de credito. Por si alguna ves alguien necesita hacer la verificacion del lado del cliente aqui les va mi implementacion (colaboracion para verificarla es bienvenida):
https://gist.github.com/1321329 (https://gist.github.com/1321329)
var isDUI = function(str){
var regex = /(^\d{8})-(\d$)/,
parts = str.match(regex);
// verficar formato y extraer digitos junto al digito verificador
if(parts !== null){
var digits = parts[1],
dig_ve = parseInt(parts[2], 10),
sum = 0;
// sumar producto de posiciones y digitos
for(var i = 0, l = digits.length; i < l; i++){
var d = parseInt(digits[i], 10);
sum += ( 9 - i ) * d;
}
return dig_ve === 10 - ( sum % 10 );
}else{
return false;
}
};
Uso
isDUI('00016297-5'); // true
isDUI('12345678-1'); // false
isDUI('123456789-1'); // false
isDUI('12345678-12'); // false
-
Para el NIT existe un procedimiento similar como el que ha explicado Camus...el ultimo digito es un verificador.
Lo unico que desconozco es si el algoritmo para calcular ese digito es alguna especie de secreto de estado, mañana hare la pregunta a mi jefe y sino hay ningun problema publicare aca todo el procedimiento.
Yo creo que la tengo, mas tarde la publico
No estaba familiar con el bendito digito verificador, me recuerda a la validacion de tarjetas de credito.
Exacto, es la misma idea, casi todo tipo de documentos asi se generan con un algoritmo, llamese numero de tarjeta, numero de documento unico (DUI, DIU, NIT), numeros electorales, licencias, NIT, hasta para el pasaporte creo que hay
-
Yo creo que la tengo, mas tarde la publico
Publicala y la comparo con la version que se usa en hacienda (llamemola la version "oficial")
-
Gracias por compartir el algoritmo de la validación del DUI :thumbsup:
El proyecto en el que estoy trabajando está en Visual Basic (decisión de los compañeros de la U, no mía xD), cuando escriba la función en VB la voy a subir acá para quien la necesite.
-
Quiero ver si entendi, esta funcion consiste en verificar si el DUI ingresado esta asignado a una persona y por lo tanto es real.
-
Quiero ver si entendi, esta funcion consiste en verificar si el DUI ingresado esta asignado a una persona y por lo tanto es real.
No exactamente, es más para verificar que el número se escribió correctamente.
Muchos números que se elaboran por computadora se les agrega un último dígito que actúa como dígito verificador. Este dígito se calcula aplicando un algoritmo a todos los demás dígitos del número.
Por ejemplo, el último dígito de los códigos de barra es un dígito verificador, el scanner puede verificar si leyó correctamente el número calculando el dígito verificador y comparando con el núemro que leyo. También se usan en el NIT, tarjetas de crédito y otros tipos de documento.
-
No exactamente, es más para verificar que el número se escribió correctamente.
Muchos números que se elaboran por computadora se les agrega un último dígito que actúa como dígito verificador. Este dígito se calcula aplicando un algoritmo a todos los demás dígitos del número.
Por ejemplo, el último dígito de los códigos de barra es un dígito verificador, el scanner puede verificar si leyó correctamente el número calculando el dígito verificador y comparando con el núemro que leyo. También se usan en el NIT, tarjetas de crédito y otros tipos de documento.
Ahora si...Gracias :thumbsup: :D
-
Mis mas sentido: lo siento, la funcion que vi para validar el NIT no tiene ni mi$$rda jajajajajajaja alli esta el cascaron nomas
CREATE OR REPLACE PROCEDURE INTERFAZ.Validar_NIT_ESV( pNIT NUMBER) AS
BEGIN
NULL;
END;
/
gran baje que me dieron jajajajajajajaja
-
Mis mas sentido: lo siento, la funcion que vi para validar el NIT no tiene ni mi$$rda jajajajajajaja alli esta el cascaron nomas
gran baje que me dieron jajajajajajajaja
El código es bastante sencillo y elegante... faskj asfdklfdfdas
-
Mis mas sentido: lo siento, la funcion que vi para validar el NIT no tiene ni mi$$rda jajajajajajaja alli esta el cascaron nomas
gran baje que me dieron jajajajajajajaja
p$$ta... en mi vida había encontrado una función tan fumada :rasta:
acá esta la función del nit... a la espera de kdejo pa ver lo oficial....
-
Después de tanto buscar....
Gracias TEKUN
-
Y yo nunca puse la oficial x_x pero la de Tekun esta bien
-
Al igual que el ejemplo de virguliña yo solo validaba el formato de la cadena
Gracias esto me servira de mucho
Enviado desde mi GT-I5700 usando Tapatalk
-
Pongamolo en practica, tomemos como ejemplo el DUI de este simpatico señor que encontre en google images.
(http://www.elsalvador.com/noticias/2005/05/11/nacional/img/dui.JPG)
El DUI del sonriente señor es:
00016297-5
Digito verificador: 5
Ahora asignemos las posiciones
Posicion -> 9 8 7 6 5 4 3 2
DUI -> 0 0 0 1 6 2 9 7
SUMA: (9*0)+(8*0)+(7*0)+(6*1)+(5*6)+(4*2)+(3*9)+(2*7) = 85
DIVISION: MOD(85/10) = 5
RESTA: 10 - 5 = 5
Digito Verificador = 5 = Resta = 5 = DUI valido.
Intentenlo con su DUI, verificare si aca en la BD hay alguna funcion para verificar el NIT.
Que es el MOD en la division del 85 entre el diez para que te de 5? Es alguna constante o solo es que ya tengo sueño.....?
Estoy haciendolo en una tabla de excel, solo por curiosidad no programo nada, solo algunas cositas pero mi calculadora HP 50g :yao_ming:
-
Yo no sabia que varios codigos que usamos en nuestro diario vivir tiene un código verificador. :thumbsup:
A la espera del algoritmo del NIT.
-
Que es el MOD en la division del 85 entre el diez para que te de 5? Es alguna constante o solo es que ya tengo sueño.....?
Estoy haciendolo en una tabla de excel, solo por curiosidad no programo nada, solo algunas cositas pero mi calculadora HP 50g :yao_ming:
La función MOD(m,n) te retorna el residuo de la división entre m y n.
85 /10
5 8
-
Que es el MOD en la division del 85 entre el diez para que te de 5? Es alguna constante o solo es que ya tengo sueño.....?
Estoy haciendolo en una tabla de excel, solo por curiosidad no programo nada, solo algunas cositas pero mi calculadora HP 50g :yao_ming:
En excel, el MOD equivale a residuo, si es excel 2007 se usa la función RESIDUO(), si es excel 2010 se usa RESTO().
La fórmula para validar DUI en excel es la siguiente: (asumiendo que el DUI se escribe en la celda A1
=SI(VALOR(MED(A1,10,1))=(RESTO(MED(A1,1,1)*9+MED(A1,2,1)*8+MED(A1,3,1)*7+MED(A1,4,1)*6+MED(A1,5,1)*5+MED(A1,6,1)*4+MED(A1,7,1)*3+MED(A1,8,1)*2,10)),"VALIDO","NO VALIDO")
-
Hey reviviendo a la vida este tema les queria preguntar: lo estuve probando mi DUI pero el residuo de la division me dio 0. por lo que si hago 10-0 es 10 ahi como seria? se ignora el 1 o que ondas?
-
-se hace un mod de la suma dividido por 10 (osea toma el remanente de esa division)
-Resta 10 menos el remanente de la division
Una pregunta?? y este numero 10 de donde sale?
-
Alguno pudo traducir el algoritmo de tekun para usarlo en Excel 2010 asi como gcastellanos??????
-
Yo lo pude hacer funcionar en el office 2007 de esta manera
=SI(VALOR(EXTRAE(A1,10,1))=(10-RESIDUO(EXTRAE(A1,1,1)*9+EXTRAE(A1,2,1)*8+EXTRAE(A1,3,1)*7+EXTRAE(A1,4,1)*6+EXTRAE(A1,5,1)*5+EXTRAE(A1,6,1)*4+EXTRAE(A1,7,1)*3+EXTRAE(A1,8,1)*2,10)),"VALIDO","NO VALIDO")
El DUI lo puse en la celda A1 y la formula en la B1 y va bien. Solo es esa duda la que me queda, porque cuando la division el residuo es 0.
Y como se supone que a 10 le tenes que quitar el residuo para que te de el digito verificador. Pero en mi caso queda 10 - 0 = 10 el digito verificador es 0, entonces me queda la duda si es que cuando el residuo sea 0 de un solo es 0 o que ondas.
-
Yo lo pude hacer funcionar en el office 2007 de esta manera
=SI(VALOR(EXTRAE(A1,10,1))=(10-RESIDUO(EXTRAE(A1,1,1)*9+EXTRAE(A1,2,1)*8+EXTRAE(A1,3,1)*7+EXTRAE(A1,4,1)*6+EXTRAE(A1,5,1)*5+EXTRAE(A1,6,1)*4+EXTRAE(A1,7,1)*3+EXTRAE(A1,8,1)*2,10)),"VALIDO","NO VALIDO")
El DUI lo puse en la celda A1 y la formula en la B1 y va bien. Solo es esa duda la que me queda, porque cuando la division el residuo es 0.
Y como se supone que a 10 le tenes que quitar el residuo para que te de el digito verificador. Pero en mi caso queda 10 - 0 = 10 el digito verificador es 0, entonces me queda la duda si es que cuando el residuo sea 0 de un solo es 0 o que ondas.
Esta es la forma para usar la validacion de DUI, me refiero al NIT
-
Ya la entendi, pero que despelote porque vaya el NIT esta en este formato: XXXX-XXXXXX-XXX-X si lo dividimos en bloques serian los bloques A, B, C y D respectivamente.
Si el bloque C, los 3 numeros esos leidos juntos son menor que 100, entonces se calcula parecido al DUI, pero si es mayor que 100 hay que multiplicar por un factor todo raro.
ya de otro rato lo tradusco a excel 2007
-
Esperando interesadamente estimado cedlink
-
Es raro yo probe con mi DUI y el resultado del MOD es 5 y el digito validador es 6, sera que me han dado un dui chafa en el DUICENTRO :yao_ming:
-
Vaya que valida de verda, pero creo que funciona
el NIT lo puse en la celda A2 y con sus guiones o sea en formato XXXX-XXXXXX-XXX-X
Como hacerlo todo junto salia demasiado largo lo dividi en 3 pasos:
Primer paso saber que camino usar:
En la celda B2 extraje los 3 numeros que estan antes del ultimo digito
=EXTRAE(A2,13,3)
Nada del otro mundo, luego en la celda C2 puse lo siguiente (que se usa si esos 3 numeros forman una cantidad mayor que 100)
=SI(ENTERO(B2)>100,RESIDUO((EXTRAE(A2,1,1)*((3+(6*REDONDEAR.MENOS((ABS((1+4)/6)),0)))-1)+EXTRAE(A2,2,1)*((3+(6*REDONDEAR.MENOS((ABS((2+4)/6)),0)))-2)+EXTRAE(A2,3,1)*((3+(6*REDONDEAR.MENOS((ABS((3+4)/6)),0)))-3)+EXTRAE(A2,4,1)*((3+(6*REDONDEAR.MENOS((ABS((4+4)/6)),0)))-4)+EXTRAE(A2,6,1)*((3+(6*REDONDEAR.MENOS((ABS((5+4)/6)),0)))-5)+EXTRAE(A2,7,1)*((3+(6*REDONDEAR.MENOS((ABS((6+4)/6)),0)))-6)+EXTRAE(A2,8,1)*((3+(6*REDONDEAR.MENOS((ABS((7+4)/6)),0)))-7)+EXTRAE(A2,9,1)*((3+(6*REDONDEAR.MENOS((ABS((8+4)/6)),0)))-8)+EXTRAE(A2,10,1)*((3+(6*REDONDEAR.MENOS((ABS((9+4)/6)),0)))-9)+EXTRAE(A2,11,1)*((3+(6*REDONDEAR.MENOS((ABS((10+4)/6)),0)))-10)+EXTRAE(A2,13,1)*((3+(6*REDONDEAR.MENOS((ABS((11+4)/6)),0)))-11)+EXTRAE(A2,14,1)*((3+(6*REDONDEAR.MENOS((ABS((12+4)/6)),0)))-12)+EXTRAE(A2,15,1)*((3+(6*REDONDEAR.MENOS((ABS((13+4)/6)),0)))-13)),11),0)
gran letania, en D2 se coloca una condicional y el resultado (en teoria) es el digito validador
=SI(ENTERO(C2)>1,11-C2,0)
En la C3 puse lo que se debe hacer si la catidad en B2 es menor o igual a 100
=SI(ENTERO(B2)<=100,RESIDUO((EXTRAE(A2,1,1)*14+EXTRAE(A2,2,1)*13+EXTRAE(A2,3,1)*12+EXTRAE(A2,4,1)*11+EXTRAE(A2,6,1)*10+EXTRAE(A2,7,1)*9+EXTRAE(A2,8,1)*8+EXTRAE(A2,9,1)*7+EXTRAE(A2,10,1)*6+EXTRAE(A2,11,1)*5+EXTRAE(A2,13,1)*4+EXTRAE(A2,14,1)*3+EXTRAE(A2,15,1)*2),11),0)
Y en D3 lo mismo solo para hacer unas comparaciones
=SI(ENTERO(C3)=10,0,C3)
Espero les sirva.
NOTA: eso si el proceso esta basado en el que puso TEKUN y ahi mismo dice que tiene excepciones, ose a que algunos NIT seguramente no van a pegar.
-
Vaya que valida de verda, pero creo que funciona
el NIT lo puse en la celda A2 y con sus guiones o sea en formato XXXX-XXXXXX-XXX-X
Excepcional maestro!
-
chivo, ya voy a buscar el de los dui para que lo traduzcan porque lo tengo en un PL o no se si ya esta... ya le perdi el hilo al thread
-
chivo, ya voy a buscar el de los dui para que lo traduzcan porque lo tengo en un PL o no se si ya esta... ya le perdi el hilo al thread
Acá puse la explicación detallada para poder se aplicadas en cualquier lenguaje.
http://www.svcommunity.org/forum/programacioacuten/como-calcular-digito-verificador-del-dui-y-nit/msg820981/#msg820981 (http://www.svcommunity.org/forum/programacioacuten/como-calcular-digito-verificador-del-dui-y-nit/msg820981/#msg820981)
-
Buenas, aquí les dejo el los algoritmos en PHP.
=============
Actualización: 05 - Junio - 2013:
Corrijo un error en el proceso de validación del NIT.
function validar_dui($dui){
if(preg_match('/(^\d{9})/',$dui)){
$verificador = (int) substr($dui,8,1);
$suma = 0;
for($i = 9; $i > 1; $i--){
$suma += ((int) substr($dui,(9-$i),1)) * $i;
}
if(($mod = ($suma%10)) == 0){
$mod = 10;
}
$valida = 10 - $mod;
if($valida == $verificador) return true;
}
return false;
}
public function validar_nit($nit){
if(preg_match('/(^\d{14})/',$nit)){
$verificador = (int) substr($nit,13,1);
$valida = false;
$suma = 0;
if(( (int)substr($nit,10,3) ) <= 100){
for($i = 1; $i <= 13; $i++){
$suma += ( (int) substr($nit,( $i - 1 ),1) ) * ( 15 - $i );
}
$valida = ($suma%11);
if($valida == 10){
$valida = 0;
}
}else{
for($i = 1; $i <= 13; $i++){
$factor = (3 + (6 * floor(abs(( $i + 4 ) / 6)))) - $i;
$suma += ( (int) substr($nit,( $i - 1 ),1) ) * $factor;
}
$mod = ($suma%11);
if($mod > 1){
$valida = 11 - $mod;
}else{
$valida = 0;
}
}
if($valida == $verificador) return true;
}
return false;
}
-
Yo se los dejos en Javascript por si a alguien les sirven
function dui_ver(numero){
var x=document.getElementById(numero).value;
var resultado = 0;
resultado = x.charAt(0)*9;
resultado = resultado + x.charAt(1)*8;
resultado = resultado + x.charAt(2)*7;
resultado = resultado + x.charAt(3)*6;
resultado = resultado + x.charAt(4)*5;
resultado = resultado + x.charAt(5)*4;
resultado = resultado + x.charAt(6)*3;
resultado = resultado + x.charAt(7)*2;
resultado = resultado % 10;
resultado = 10 - resultado;
var a=parseInt(x.charAt(9));
if(!(resultado == a))
alert("Posiblemente el numero de DUI este mal, favor revisarlo.");
}
NIT
function nit_ver(numero){
var x=document.getElementById(numero).value;
var resultado = 0;
var part;
var factor=0;
var cal = 0;
var i;
var n;
part=x.substring(12,15);
part=parseInt(part);
if(part<=100){
n=14;
for(i=0;i<=14;i++){
if(!(i===4||i===11)){
cal=cal+parseInt(x.charAt(i))*n;
}
cal=cal%11;
if(y==10)
y=0;
}
}else{
n=1;
for(i=0;i<=14;i++){
if(!(i===4||i===11)){
factor=(3+6*Math.floor(Math.abs((n+4)/6)))-n;
cal=cal+(parseInt(x.charAt(i))*factor);
n++;
}
}
cal=cal%11;
if(cal>1)
cal=11-cal;
else
cal=0;
}
var a=parseInt(x.charAt(16));
if(a!=cal)
alert("El numero de NIT posiblemente este equivocado, favor revisarlo antes de continuar.");
}
-
buenas señor@s estado queriendo hacer la verificacion del nit y dui en vb.nte y no e podido pasar el codigo a vb la pregunta es si alguien lo paso o sabe como hacerlo en vb, estare muy agradecido si me orientan como hacer lo
-
Saludos a todos alli..
Pära los que tiene experiencia en esto del DUI:
Saben que tipo de pistola laser y que programa usar para la captura de datos por medio del codigo de barras del DUI?
Que sea compatible con los codigos viejos y actuales.
Leyendo he encontrado que usan el formato PDF417
Pero que se sabe no es compatible con caracteres en español copmo la Ñ o las ovcales tildadas.
Me gustaria saber como es solo para captura de datos y ponerlas a un formulario.
Necesito recomendacion: Que pistola laser usar y como es el programa o programa afin.
Saludos.
:drinks:
-
Yo se los dejos en Javascript por si a alguien les sirven
NIT
function nit_ver(numero){
var x=document.getElementById(numero).value;
var resultado = 0;
var part;
var factor=0;
var cal = 0;
var i;
var n;
part=x.substring(12,15);
part=parseInt(part);
if(part<=100){
n=14;
for(i=0;i<=14;i++){
if(!(i===4||i===11)){
cal=cal+parseInt(x.charAt(i))*n;
}
cal=cal%11;
if(y==10)
y=0;
}
}else{
n=1;
for(i=0;i<=14;i++){
if(!(i===4||i===11)){
factor=(3+6*Math.floor(Math.abs((n+4)/6)))-n;
cal=cal+(parseInt(x.charAt(i))*factor);
n++;
}
}
cal=cal%11;
if(cal>1)
cal=11-cal;
else
cal=0;
}
var a=parseInt(x.charAt(16));
if(a!=cal)
alert("El numero de NIT posiblemente este equivocado, favor revisarlo antes de continuar.");
}
Perdón por revivir muertos pero corrigiendo la función del NIT del comuno (pues tiene un pequeño errorcillo :D que me estaba dando lata :D ) aqui esta ya con el FIX.
function nit_ver(numero) {
var Valido = true;
var x = numero;
var resultado = 0;
var part;
var factor = 0;
var cal = 0;
var i;
var n;
part = x.substring(12, 15);
part = parseInt(part);
if (part <= 100) {
n = 1;
for (i = 0; i <= 14; i++) {
if (!(i === 4 || i === 11)) {
cal = cal + parseInt(x.charAt(i)) * (15 - n);
n++;
}
}
cal = cal % 11;
if (cal == 10)
cal = 0;
} else {
n = 1;
for (i = 0; i <= 14; i++) {
if (!(i === 4 || i === 11)) {
factor = (3 + 6 * Math.floor(Math.abs((n + 4) / 6))) - n;
cal = cal + (parseInt(x.charAt(i)) * factor);
n++;
}
}
cal = cal % 11;
if (cal > 1)
cal = 11 - cal;
else
cal = 0;
}
var a = parseInt(x.charAt(16));
if (a != cal) {
//alert("El numero de NIT posiblemente este equivocado, favor revisarlo antes de continuar.");
Valido = false;
}
return Valido;
}
Saludos
-
Para el amigo hkadejo, si pudieras enviarme la rutina del nit y si la tienes la del nrc, yo trabaje en Hacienda y tengo ambas rutinas, pero el disco donde estan no lo puedo accesar, muchas gracias
-
Para el amigo hkadejo, si pudieras enviarme la rutina del nit y si la tienes la del nrc, yo trabaje en Hacienda y tengo ambas rutinas, pero el disco donde estan no lo puedo accesar, muchas gracias
Leete este tema, aqui estan las rutinas que necesitas.
-
Buenas, aquí les dejo el los algoritmos en PHP.
=============
Actualización: 05 - Junio - 2013:
Corrijo un error en el proceso de validación del NIT.
function validar_dui($dui){
if(preg_match('/(^\d{9})/',$dui)){
$verificador = (int) substr($dui,8,1);
$suma = 0;
for($i = 9; $i > 1; $i--){
$suma += ((int) substr($dui,(9-$i),1)) * $i;
}
if(($mod = ($suma%10)) == 0){
$mod = 10;
}
$valida = 10 - $mod;
if($valida == $verificador) return true;
}
return false;
}
public function validar_nit($nit){
if(preg_match('/(^\d{14})/',$nit)){
$verificador = (int) substr($nit,13,1);
$valida = false;
$suma = 0;
if(( (int)substr($nit,10,3) ) <= 100){
for($i = 1; $i <= 13; $i++){
$suma += ( (int) substr($nit,( $i - 1 ),1) ) * ( 15 - $i );
}
$valida = ($suma%11);
if($valida == 10){
$valida = 0;
}
}else{
for($i = 1; $i <= 13; $i++){
$factor = (3 + (6 * floor(abs(( $i + 4 ) / 6)))) - $i;
$suma += ( (int) substr($nit,( $i - 1 ),1) ) * $factor;
}
$mod = ($suma%11);
if($mod > 1){
$valida = 11 - $mod;
}else{
$valida = 0;
}
}
if($valida == $verificador) return true;
}
return false;
}
Pues este no me funciono creo que alguna de las funciones ya no son compatibles con php 5 :dumb:
-
amigos.. colgandome del tema.. alguien me puede ayudar con algo parecido.. pero para verificar los numero de registro de IVA??
http://www.svcommunity.org/forum/chat-general/codigo-verificador-de-numero-de-iva-%28cualquier-lenguaje%29/
-
Gracias MauricioG, entonces solo para confirmar los checkdigit de NRC y DUI, tienen el mismo algoritmo?
un saludo :thumbsup:
-
:yahoo: :sur: Aca esta la rutina del NIT, desarrollada en VFP
*--- Funcion Validar NIT Rutina comprobada para viejos y nuevos MAG 30/10/2014
*--- Funcion NIT Proposito Validar si el NIT es valido
LOCAL vnit, vsum, vdig, vfac
vnit = '11070806771015'
STORE 0 TO vsum, vdig, vfac
* Valida la longitud del NIT
IF LEN(vnit) # 14
MESSAGEBOX('Longitud de NIT erronea',0,'Valida NIT')
RETURN
ENDIF
* Valida que todos sean numeros
FOR I = 1 TO 14
IF !ISDIGIT(SUBST(vnit,i,1))
MESSAGEBOX('NIT erroneo contiene alfabeticos',0,'Valida NIT')
RETURN
ENDIF
ENDFOR
*--- Valida si es NIT viejo(<= 100) o nuevo (>= 100)
IF INT(VAL(SUBS(vnit,11,3))) <= 100 && Rutina Vieja
FOR I = 1 TO 13
vsum = vsum + (INT(VAL(SUBS(vnit,i,1))) * (15 - i))
ENDFOR
vdig = MOD(vsum,11)
IF vdig = 10
vdig = 0
ENDIF
ELSE && Rutina Nueva
FOR I = 1 TO 13
vfac = (3 + (6 * FLOOR(ABS(I + 4) / 6))) - I
vsum = vsum + (INT(VAL(SUBS(vnit,i,1))) * vfac)
ENDFOR
vdig = MOD(vsum,11)
IF vdig > 1
vdig = 11 - vdig
ELSE
vdig = 0
ENDIF
ENDIF
RETURN
-
Señores primero disculpas por revivir algo tan antigüo.
Segundo, podría alguien ser tan amable de explicar el proceso para validar el NIT?
ya copie las formulas en excel que dejo cedlink, y lo adapte a mi conveniencia pero no entiendo para nada que es lo que dicho proceso hace.
En cambio con lo del DUI si me quedó todo claro gracias a la explicación que dió Camus.
Gracias.
-
Hola, tengo unas consultas y es que estoy haciendo la parte de validadores de NIT, DUI y Pasaporte, para NIT y DUI tengo los dígitos validadores y ya funciona todo bien, pero para el pasaporte no he encontrado nada sobre digito validador, de momento solo tengo que me valide el formato, que hasta donde se es 1 letra seguida de 8 números, mis consultas serian si la letra del inicio puede ser de la A a la Z o solo un rango especifico y si existe digito validador para este y procedimiento matemático para comprobarlo.
De momento uso el siguiente regex : "^[A-Z]{1}[0-9]{8}$"
-
Hola, tengo unas consultas y es que estoy haciendo la parte de validadores de NIT, DUI y Pasaporte, para NIT y DUI tengo los dígitos validadores y ya funciona todo bien, pero para el pasaporte no he encontrado nada sobre digito validador, de momento solo tengo que me valide el formato, que hasta donde se es 1 letra seguida de 8 números, mis consultas serian si la letra del inicio puede ser de la A a la Z o solo un rango especifico y si existe digito validador para este y procedimiento matemático para comprobarlo.
De momento uso el siguiente regex : "^[A-Z]{1}[0-9]{8}$"
-
Aca la rutina del DUI (que tambien se usaria para el NCR) en VFP:
*--- validar_dui
*PARAMETERS vdui
vdui= '005096917'
LOCAL vsum, vdig, vfac
*
STORE 0 TO vsum, vdig, vfac
* Valida la longitud del NIT
IF LEN(vdui) # 9
MESSAGEBOX('Longitud de DUI erronea',0,'Valida DUI')
verr = .T.
RETURN
ENDIF
* Valida que todos sean numeros
FOR I = 1 TO 9
IF !ISDIGIT(SUBST(vdui,i,1))
MESSAGEBOX('DUI erroneo contiene alfabeticos',0,'Valida DUI')
verr = .T.
RETURN
ENDIF
ENDFOR
*
FOR I = 1 TO 8
vsum = vsum + (INT(VAL(SUBSTR(vdui,i,1))) * (9 - i))
ENDFOR
*
vdig = MOD(vsum,10)
vdig = 10 - vdig
IF vdig = 10
vdig = 0
ENDIF
*
IF STR(vdig,1) # SUBSTR(vdui,9,1)
MESSAGEBOX('Digito Verificador Erroneo',0,'Verificacion de DUI')
xerr = .T.
ELSE
xerr = .F.
ENDIF
-
Hola. alquien logro la formulA NCR
6 DIGITOS NRC 47424
Cadena Texto 0047424
DV 10
NRC 4742410
DESCOMPONER MULTIPLICAR PRODUCTO
4 2 8
2 3 6
4 4 16
7 5 35
4 6 24
0 7 0
0 8 0
0
89 11
RESIDUO 1
DV 10
-
SiKa acá te dejo mi snippet :drinks:
<?php
function isDUI($dui) {
if ((bool)preg_match("/(^\d{8})-(\d$)/", $dui) === true) {
[$digits, $verificator] = explode("-", $dui);
$sum = 0;
for ($i = 0, $l = strlen($digits); $i < $l; $i++) {
$sum += (9 - $i) * (int)$digits[$i];
}
return (bool)((int)$verificator === (int) (10 - ($sum % 10)) % 10);
}
return false;
}
echo "<br>".var_dump(isDUI("12345678-1")); // false
echo "<br>".var_dump(isDUI("123456789-1")); // false
echo "<br>".var_dump(isDUI("12345678-12")); // false
Probado con muchos DUIs y aun funciona perfecto :yahoo: :hi:
-
SiKa acá te dejo mi snippet :drinks:
<?php
function isDUI($dui) {
if ((bool)preg_match("/(^\d{8})-(\d$)/", $dui) === true) {
[$digits, $verificator] = explode("-", $dui);
$sum = 0;
for ($i = 0, $l = strlen($digits); $i < $l; $i++) {
$sum += (9 - $i) * (int)$digits[$i];
}
return (bool)((int)$verificator === (int) (10 - ($sum % 10)) % 10);
}
return false;
}
echo "<br>".var_dump(isDUI("12345678-1")); // false
echo "<br>".var_dump(isDUI("123456789-1")); // false
echo "<br>".var_dump(isDUI("12345678-12")); // false
Probado con muchos DUIs y aun funciona perfecto :yahoo: :hi:
eres grande bro! muchas gracias!!!
-
eres grande bro! muchas gracias!!!
Con gusto :hi: