Digito verificador o algoritmo de control, es un mecanismo de autenticación que se utiliza para verificar y validar la autenticidad de un valor numérico y así evitar fraudes o errores de transmisión o de tipeado.
Consiste en uno o mas algoritmos agregados al valor original y calculados por medio de un determinado algoritmo. Números de documentos de identificación, chapas, cartones de crédito, RUC, o cualquier otro tipo de documento que requiera que los números tengan mayor seguridad. Para esto se utilizan los dígitos verificadores.
Para el calculo del digito verificador del RUC se utiliza al algoritmo llamado Módulo 11.
Para calcular el primer digito verificador, cada dígito del número, comenzando desde la derecha para izquierda (del dígito menos significativo para el mas significativo) se multiplica en el orden por 2, por 3, luego por 4 y así sucesivamente, hasta llegar al primer dígito del número. La sumatoria de esa multiplicación se divide por 11. El resto de esa división (módulo 11) se substrae de la base (11) y el resultado es el digito verificador. Para calcular el próximo digito, se considera el anterior como parte del numero y se efectúa el mismo proceso.
FUNCION PARA EL CALCULO DEL DIGITO VERIFICADOR EN PL/SQL
CREATE OR REPLACE FUNCTION Pa_Calcular_Dv_11_A ( p_numero IN VARCHAR2, p_basemax IN NUMBER DEFAULT 11) RETURN NUMBER IS /* Calcula Digito Verificador numérico con entrada alfanumérica y basemax 11*/ v_total v_resto k v_numero_aux NUMBER(1); v_numero_al VARCHAR2(255); v_caracter VARCHAR2(1); v_digit NUMBER; BEGIN -- Cambia la ultima letra por ascii en caso que la cedula termine en letra FOR i IN 1 .. LENGTH(p_numero) LOOP v_caracter := UPPER(SUBSTR(p_numero,i,1)); IF ASCII(v_caracter) NOT BETWEEN 48 AND 57 THEN -- de 0 a 9 v_numero_al := v_numero_al || ASCII(v_caracter); ELSE v_numero_al := v_numero_al || v_caracter; END IF; END LOOP; -- Calcula el DV k := 2; v_total := 0; FOR i IN REVERSE 1 .. LENGTH(v_numero_al) LOOP IF k > p_basemax THEN k := 2; END IF; v_numero_aux := TO_NUMBER(SUBSTR(v_numero_al,i,1)); v_total := v_total + (v_numero_aux * k); k := k + 1; END LOOP; v_resto := MOD(v_total,11); IF v_resto > 1 THEN v_digit := 11 - v_resto; ELSE v_Digit := 0; END IF; RETURN v_Digit; END;
FUNCION PARA EL CALCULO DEL DIGITO VERIFICADOR EN VISUAL BASIC
Function getDV(RUC As String) As String NUMBER(6); NUMBER(2); NUMBER(2); getDV = calcular(RUC, 11) End Function Function calcular(numero As String, basemax As Integer) As String Dim codigo As Long Dim numero_al As String Dim i For i = 1 To Len(numero) Dim c c = Mid$(numero, i, 1) codigo = Asc(UCase(c)) If Not (codigo >= 48 And codigo <= 57) Then numero_al = numero_al & codigo Else numero_al = numero_al & c End If Next Dim k: Dim total k=2 total = 0 For i = Len(numero_al) To 1 Step -1 If (k > basemax) Then k = 2 Dim numero_aux numero_aux = Val(Mid(numero_al, i, 1)) total = total + (numero_aux * k) k=k+1 Next Dim resto: Dim digito resto = total Mod 11 If (resto > 1) Then digito = 11 - resto Else digito = 0 End If calcular = digito End Function
FUNCION PARA EL CALCULO DEL DIGITO VERIFICADOR EN LENGUAJE C
#include #include #include int Pa_Calcular_Dv_11_A (const char *p_numero, int p_basemax) { // CALCULO Digito verificador - RUC // AUTOR: Luis Francou. int v_total, v_resto, k, v_numero_aux, v_digit; char *v_numero_al, *p; char v_caracter; int i; v_numero_al = (char *) malloc (strlen(p_numero) + 1); memset(v_numero_al, 0, strlen(p_numero)+1); while (v_caracter = *p_numero++, v_caracter != 0) { if (v_caracter >= '0' && v_caracter <= '9') sprintf(v_numero_al, "%s%c", v_numero_al, v_caracter); else { sprintf(v_numero_al, "%s%d", v_numero_al, v_caracter); } } k = 2; v_total = 0; i = strlen(v_numero_al) - 1 ; p = v_numero_al + i++; while (i--) { k = k > p_basemax ? 2 : k; v_numero_aux = *(p--) - 48; v_total += v_numero_aux * k++; } v_resto = v_total % 11; v_digit = v_resto > 1 ? 11 - v_resto : 0; free(v_numero_al); return v_digit; }
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;
¿Y esto para qué país es? Panamá? Paraguay? Ecuador? Nicaragua? Perú?
Es para Paraguay, pero la base seria lo mismo para otros paises pues es un estandar
que ocurre en caso de tener un documento alfanumerico ?
Y cuál es la consulta que hay que utilizar para ultilizar la función?
Alguien me ayuda con el código para postgresql por fa
//Funcion en PHP
function digitoVerificador($numero){
$suma = 0;
for ($i = 0; $i 1 ? 11 – $resto : 0;
}
echo $numero = 4658651;echo ‘-‘;
echo digitoVerificador($numero);
Alguien que me ayude a pasar este código php a función sql.
function validarRuc($valor) {
$valor = trim($valor);
if ($valor) {
if (strlen($valor) == 11) { // RUC
$suma = 0;
$x = 6;
for ($i = 0; $i = 10) {
$resto = $resto – 10;
}
if ($resto == $valor[strlen($valor) – 1]) {
return true;
}
}
}
return false;
}
Po favor.
Calculado como se indica en: https://es.wikipedia.org/wiki/C%C3%B3digo_de_control
/** PHP **/
function digitoVerificador ($cedula) {
$sumatoria = 0;
$factor = 2;
for ($i = strlen($cedula) – 1; $i >= 0; $i–) {
$sumatoria += $factor * substr($cedula, $i, 1);
$factor++;
if ($factor > 7) {
$factor = 2;
}
}
$digito = 11 – $sumatoria % 11;
if ($digito < 10) {
return $digito;
} elseif ($digito == 11) {
return 0;
} else { // El resultado es 10
return 1;
}
}
SERIA MUY INTERESANTE PUDIESES PONER || Función para calcular el dígito verificador del RUC || EN PYTON.
Saludos
Excelente!, muchas Gracias!! me resuelve totalmente varias cuestiones