validacion NIT y RUT de la DIAN

Hola ccasilla, la funcion AlineaD sirve para alinear un array a la derecha y realiza un relleno en el queda libre. Voy a buscar el código de alinead, se que es una sola linea, y luego lo subo.

Saludos
 
Yo tengo la de validacion del RUC, esta hecha en C++ y solo debes crear un arreglo que se llame RUC lo llenas con el numero del RUC y solo lo validas asi


if (strlen(RUC) == 11 && ValidarRUC() == 1)
{
// HACER ALGO

}


int ValidarRUC()
{
//Declaraciones
int i, Residuo, Val;
int iRUC[11], Auxi[11], Mult[11];

//Se almacena el RUC en un vector Entero
for(i = 0; i <= 10; i++)
iRUC = (int)RUC & 0x0F;

//Se llena vector auxiliar para operacion
Auxi[0] = 5;
Auxi[1] = 4;
Auxi[2] = 3;
Auxi[3] = 2;
Auxi[4] = 7;
Auxi[5] = 6;
Auxi[6] = 5;
Auxi[7] = 4;
Auxi[8] = 3;
Auxi[9] = 2;
Auxi[10] = 0;

//Se llena vector de evaluacion
Mult[10] = 0;
for(i = 0; i <= 9; i++)
{
Mult = iRUC * Auxi;
Mult[10] += Mult;
}

//Se evalua el resultado
Residuo = Mult[10] % 11;
Val = 11 - Residuo;

if (Val == 11)
Val = 1;
if (Val == 10)
Val = 0;

if (Val == iRUC[10])
return 1;
else
return 0;
}
 
buen día, disculpen mi ignorancia... q es el RUC, busque en google y nada...



Registro Único de Contribuyentes (RUC) es el registro informático a cargo de la SUNAT que contiene los datos de identificación y de las obligaciones tributarias de los contribuyentes de los tributos administrados y/o recaudados por la SUNAT, de la información vinculada a sus actividades económicas, así como la información de sus responsables. (Esto es en Peru)
 
hago mi aporte en PHP para calcular el NIT en Colombia:
PHP:
function zero_fill($nit)
{
	$relleno = '';	
	
	for ($i=1; $i < 15; $i++)
	{
		$total_char = strlen($nit) + $i;
		if ($total_char <= 15)
			$relleno .= "0";
		else
			break;
	}

	$nit = $relleno.$nit;

	return $nit;
	
}

function calcularDV($nit)
{
	$pesos = array(71,67,59,53,47,43,41,37,29,23,19,17,13,7,3);	
	$nit_fmt = zero_fill($nit);
	$suma = 0;
	
	for ($i=0; $i<=14; $i++)
		$suma += substr($nit_fmt, $i, 1) * $pesos[$i];
		
	$resto = $suma % 11;
	
	if ($resto == 0 || $resto == 1)
		$digitov = $resto;
	else
		$digitov = 11 - $resto;
		
	echo $digitov;	
}
 
Me tome la molestia de pasar el algoritmo de PHP a Perl, ahí deje partes comentadas del algoritmo (empiezan por #) se pueden remover sin problemas. Que tengan un feliz dia.

sub calcularDV()
{
my $nit=$_[0];
$nit=~s/\n$//;#elimina salto de linea al final cuando se prueba por consola
my @pesos = (71,67,59,53,47,43,41,37,29,23,19,17,13,7,3);
#$nit_fmt = &zero_fill($nit);
my $nit_fmt=('0'x(15-length($nit))).$nit; # Agrega ceros a la izquierda hasta completar 15 digitos
my $suma = 0;

for (my $i=0; $i<=14; $i++){
$suma += substr($nit_fmt, $i, 1) * $pesos[$i];
}
my $resto = $suma % 11;
my $digitov = ($resto == 0 || $resto == 1)?$resto:11 - $resto; # validacion descrita seguidamente
#if ($resto == 0 || $resto == 1){
#$digitov = $resto;
#}else{
#$digitov = 11 - $resto;
#}
print $digitov;
}
my $numero=<>;
&calcularDV($numero);
 
estimados,

gracias por sus funciones, muy útiles, pero tengo un par de dudas con su sistema de identificación personal(soy chileno).

he visto en varias paginas que ocupan distintos números de identificación, el CC, el NIT, el NUIP

también hay diferencias entre las cédulas dependiendo de la edad. cual es el numero ocupado para identificarse como mayor de 18 años en Colombia? el NIT, el NUIP ?? todos???

según, he buscado y no tengo claro cual, deberia ser el NUIP pero es muy nuevo y se supone que desde el 2010 todos deberían tener este numero, pero formular para validar un NUIP o un CC no puedo encontrar.

Si fueran tan amables de indicarme como puedo obtener estas formulas o si con el nit es suficiente.

Saludos
 
estimados,

gracias por sus funciones, muy útiles, pero tengo un par de dudas con su sistema de identificación personal(soy chileno).

he visto en varias paginas que ocupan distintos números de identificación, el CC, el NIT, el NUIP

también hay diferencias entre las cédulas dependiendo de la edad. cual es el numero ocupado para identificarse como mayor de 18 años en Colombia? el NIT, el NUIP ?? todos???

según, he buscado y no tengo claro cual, deberia ser el NUIP pero es muy nuevo y se supone que desde el 2010 todos deberían tener este numero, pero formular para validar un NUIP o un CC no puedo encontrar.

Si fueran tan amables de indicarme como puedo obtener estas formulas o si con el nit es suficiente.

Saludos

para el NUIP puedes mirar esto
http://www.registraduria.gov.co/El-NUIP-es-el-numero-que-permite.html

La cedula de ciudadania (CC) es el documento de personas mayores de edad (18 años o mas), El Numero de identificacion Tibutaria (NIT) es la identificacion ante DIAN (Impuestos nacionales) para las personas naturales el NIT vendria siendo la Cedula seguida con digito de verificacion (DV) que arriba se menciona, para las personas judicas (Sociedades o empresas) vendria siendo un numero de 9 digitos seguido del digito de verificacion (XXX.XXX.XXX - Y) http://es.wikipedia.org/wiki/Número_de_Identificación_Tributaria
 
Mi aporte en Código SAP ABAP

REPORT zoespinoza.

PARAMETERS pa_conit TYPE char16.

START-OF-SELECTION.

DATA nit TYPE char16.
DATA e TYPE i.
DATA s TYPE i.
DATA c TYPE i.
DATA v TYPE i.
DATA m TYPE TABLE OF i WITH HEADER LINE.

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = pa_conit
IMPORTING
output = nit.

APPEND 71 TO m.
APPEND 67 TO m.
APPEND 59 TO m.
APPEND 53 TO m.
APPEND 47 TO m.
APPEND 43 TO m.
APPEND 41 TO m.
APPEND 37 TO m.
APPEND 29 TO m.
APPEND 23 TO m.
APPEND 19 TO m.
APPEND 17 TO m.
APPEND 13 TO m.
APPEND 07 TO m.
APPEND 03 TO m.

DO 16 TIMES.
READ TABLE m INDEX sy-index.
COMPUTE e = sy-index - 1.
IF sy-index EQ 16.
MOVE nit+e(1) TO v.
ELSE.
COMPUTE s = s + m * nit+e(1).
ENDIF.
ENDDO.

COMPUTE s = s MOD 11.

IF s EQ 0 OR s EQ 1.
MOVE s TO c.
ELSE.
COMPUTE c = 11 - s.
ENDIF.

END-OF-SELECTION.

WRITE / 'nit'.
WRITE pa_conit.

WRITE / 'a Validar'.
WRITE v.

IF c NE v.
WRITE 'Error en Digito Verificador'.
ELSE.
WRITE 'Digito Verificador, Correcto'.
ENDIF.

WRITE / 'Calculado'.
WRITE c.
 
Algoritmo en JavaScript

Hola laneros!

Anexo mi aporte en JavaScript.

Mil gracias a todos los que han aportado a este tema, me solucionaron un problema muy importante que tengo en un proyecto.

El código está basado en el script publicado por acehart.

Que lo disfruten!!

================================

function zero_fill(i_valor, num_ceros) {
relleno = ""
i = 1
salir = 0
while ( ! salir ) {
total_caracteres = i_valor.length + i
if ( i > num_ceros || total_caracteres > num_ceros )
salir = 1
else
relleno = relleno + "0"
i++
}


i_valor = relleno + i_valor
return i_valor
}


function calcularDV(i_rut) {
var pesos = new Array(71,67,59,53,47,43,41,37,29,23,19,17,13,7,3);
rut_fmt = zero_fill(i_rut, 15)
suma = 0
for ( i=0; i<=14; i++ )
suma += rut_fmt.substring(i, i+1) * pesos

resto = suma % 11
if ( resto == 0 || resto == 1 )
digitov = resto
else
digitov = 11 - resto


return(digitov)
}

hola mira soy nueva en este arte y al usar tu codigo no me esta generando el digito de verificacion, se quiebra al entrar al for y el resultado es NaN, depronto me podrias ayudar, estoy trabajando en angular 6, porfis :'(
 
Este codigo esta desarrollado en vue js: Vue.js es un framework de JS.

checkDigit() {
this.messageDv = [];
const myNit = this.$refs.nit.value;
const digit = this.$refs.verify.value;

let vector, accumulator, residue, number, counter, temp;

vector = new Array(15);
vector[0] = 3;
vector[1] = 7;
vector[2] = 13;
vector[3] = 17;
vector[4] = 19;
vector[5] = 23;
vector[6] = 29;
vector[7] = 37;
vector[8] = 41;
vector[9] = 43;
vector[10] = 47;
vector[11] = 53;
vector[12] = 59;
vector[13] = 67;
vector[14] = 71;

number = myNit.length;

accumulator, residue = 0;


for (counter = 0; counter < number; counter++) {
temp = parseInt(myNit[(number - 1) - counter].toString());
accumulator = accumulator + (temp * vector[counter]);
}

residue = accumulator % 11;

if (residue > 1) {
residue = 11 - residue;
} else {
residue;
}

if (digit !== residue) {
this.messageDv.push('El dígito de verificación no es correcto.');
this.$refs.verify.focus();
}
},
 
Hola, les aporto mi solución con office 365 la siguiente función Lambda:

=LAMBDA(Nit_CC;LET(sNIT;--EXTRAE(Nit_CC;SECUENCIA(LARGO(Nit_CC));1); Factor;ELEGIR(ORDENAR(SECUENCIA(LARGO(Nit_CC));;-1);3;7;13;17;19;23;29;37;41;43;47;53;59;67;71); mFactor;SUMAPRODUCTO(sNIT;Factor); SI(RESIDUO(mFactor;11)=0;0;SI(RESIDUO(mFactor;11)=1;1;11-RESIDUO(mFactor;11)))))

Desde la pestaña formulas asignas un nombre "el que desees" por ejemplo Dig_Verif, en hace referencia a: pegas la formula, guardas y listo.
 
Última edición:

Los últimos temas