28 mar 2007

Validación de cédula, ruc y pasaporte ecuatorianos 2da. parte

Estimados camaradas linuxeros.

Hace algún tiempo alguien necesitaba un código para validar la cédula, ruc o pasaporte ecuatoriano.

Yo hice un pequeño aporte en javaScript en este enlace.

Ahora adjunto en este mensaje un archivo comprimido en formato zip que se llama "validaCedula.zip.txt", el cual contiene los siguientes archivos:

validaCedulaJS.htm

Simple html que tiene una función en javaScript para validar y probar un número ingresado. Al ejecutarlo se carga el programa. Si desean ver el fuente abran el archivo con un editor de texto. Este formato es útil para mis estimados linuxeros programadores html, php, perl, cgi, etc.

validaCedulaVB.txt

Procedimiento en Visual Basic (para los que aún siguen en el lado oscuro), para que lo peguen en su código y ojalá algún día prueben otras cosas (software libre), con todo el debido respeto del caso. Alguna vez yo programaba en fox y ya saben sobre que OS, jeje.

validaCedulaJava.txt

Ejemplo sencillo de una clase del tipo swing (J2SE) que invoca a un método para validar el número ingresado que se dispara por medio de un oyente o listener. El usuario debe ajustar este fragmento a su código. Además el txtRuc (JTextField) debe ser agregado a un componente.

validaCedulaPhp.txt

Implementación en php del validador. En este archivo encontrarán tres funciones que validan la cédula, el ruc y el pasaporte respectivamente. Muchas gracias a Eduardo Jordán G. por la conversión al lenguaje php. Seguro que muchos programadores en php también se lo agradecerán.

Por favor colegas, descarguen el archivo y cambien la extensión a (.zip) ya que está actualmente como (.zip.txt) desde este enlace (ejecuten "grabar como" o "save as" para guardar el archivo en su pc).

Con mucha alegría en mi corazón comparto este pequeño trabajo, como programador que soy, y espero ayudar en algo a la comunidad de software libre que es muy útil, del cual he aprendido mucho y seguiré aprendiendo.

Saludos cordiales desde Guayaquil/Manta-Ecuador

40 comentarios:

Anónimo dijo...

buena loco me sirvio la bola tus validaciones

Ismael

Carlos Julio dijo...

De nada compadre.

Saludos y gracias por escribir

Anónimo dijo...

Hola yo tengo un problema necesito q antes de que digite el numero de documento haya elegido desde un select el tipo ya sea cedula, ruc o pasaporte; me explico si elijo cedula me llame a esa validacion y asi sucesivamente pero no logro conseguir eso si me puedes ayudar en eso porfa mi mail es bombon2482@hotmail.com

Anónimo dijo...

Un de estos dias te voy a pasar todas las validaciones de cedula, ruc pasaporte hechas en Oracle, para hacerte un aporte, ojala y te sirvan

Carlos Julio dijo...

Gracias Anónimo.

El aporte tuyo en oracle sería muy bueno.

Muchas gracias por visitar y por el interés.

Bendiciones.

Anónimo dijo...

Muy buenas, te escribo desde España, al otro ladito del charco ya ves... Aunque no soy Ecuatoriano, sino Español, me encanta ver como Linux avanza en la comunidad Ibero-Americana. Necesitaria me remitieras, sino te es molestia el codigo de comprobación a mi e-mail (jmpg73@hotmail.com). Pues me encuentro desarrollando para unos amigos Ecuatorianos unos aplicativos hechos en Gambas2.

Saludos

Anónimo dijo...

Gracias pana nos ayudó un montón
Especialmente lo del RUC

Blog de mi Familia dijo...

Muy bien pana por publicar esas validaciones... la verdad que sirven de mucho... Muchas gracias.

Anónimo dijo...

Hola una observación segun las nuevs versiones del SRI los ultimos digitos validadores no son estaticos 001 o 0001 como pones en la solucion y eso te puede generar un error.

Angeluz.arkanus dijo...

hola amigo..gracias igual por esos aportes..sirven de mucho,...ahora tengo una inquietud he visto no se si tu es la persona q tienes estas mismas validaciones en oracle..si puedes publicarlos te argadeceria muchisimo..o si sabes de quien pueda facilitar si...un abrazo y felicitaciones de nuevo espero tu pronta respuesta..


pd. por cierto dejo mi mail si por alguien puede ayudar...
angeluz.arkanus.eptc@gmail.com

Carlos Julio dijo...

Saludos Angeluz.arkanus

La validación que necesitas está en la versión de Java que está en el archivo comprimido.

Solo ajústala a tus controles de oracle y listo.

Saludos cordiales.

Unknown dijo...

Gracias por tu aporte; realmente me ha salvado en este momento que necesito que todo funcione perfectamente.

En realidad, es un gran aporte el que ha hecho y espero que sigas haciendolo; porque ayudas mucho a la comunidad.

Carlos Julio dijo...

Gracias cerberox

A las órdenes

Saludos cordiales

Unknown dijo...

hola amigo...gracias por tu contestacion...pero ahora lo que pasa es que no me funciona no se en que este fallando no se si podrias por favor mas o menos explicarme detallado de como poder acoplarlo o si tu me puedes enviar el codigo ya acoplado a Oracle especialmente para la version 6i.....gracias de antemano por tu atencion prestada

Anónimo dijo...

super bueno tu aporte... esas personas se necesitan el mundo de la programacion.

Gracias

Anónimo dijo...

Gracias amigo

Hace unos años que buscaba esto solo encontraba de otros países, tu aporte me sirve de mucho

Unknown dijo...

gracias... creo que resume el sentimiento de esta comunidad libre que comparte.. Acciones como la de compartir el codigo es lo que a nuestro pais hace grande

Humberto F. dijo...

GRACIAS DOCTOR ME SALVASTE.. TE DEBO UNA DE TROPICO GRANDE JEJE

Alejandro dijo...

Excelente maestro, muchísimas gracias por la validación

Carlos Julio dijo...

Gracias Humberto y Alejandro por sus palabras.

Es un gusto aportar con un granito de arena al menos...

Saludos cordiales.

Unknown dijo...

GRACIAS MIL GRACIAS MAÑANA DEFIENDO MI TESIS Y ME FALTABA ESTA VALIDACION FUNCIONO DE PELICULA
NUEVAMENTE GRACIAS..

Carlos Julio dijo...

De nada viejo.

Saludos cordiales.

Anónimo dijo...

Me puedes ayudar, esq necesito que me expliques como le hago funcionar el validador de la cedula en php, osea para que me salga en el navegador, y poder introducir la cedula, te agradecería, gracias...

Carlos Julio dijo...

Hola anónimo 06/09/2010 17:51:00

Aquí mismo está la versión en PHP que otra hizo basándose en mi código.

Ajústala a tu código y listo. Puedes guiarte en la versión JavaScript que también está en este enlace.

Suerte.

Anónimo dijo...

Gracias brother, una ayuda inmensa para un apuro...

Carlos Julio dijo...

De nada compadre.

¡Qué bueno que te haya servido!

Saludos cordiales

Anónimo dijo...

hola Carlos Julio....te cuento q me estoy me familiarisanado con esto.....pero me gustaria q me expliques xq pones Me.txtcampos(6).....y xq no declaras los c1...etc... y los p1...etc... te agradeceria si me explicaras....gracias...

Unknown dijo...

Excelente Aporte pana!

me fallaban algunos RUCs hasta que aplique tu Rutina

(por basarme en la pagina del SRI, parece que estaba incompleto)

Gracias MIL !!!

PD. Sería bueno que resaltaras el link, casi no se nota (Acostumbrado a ver LETROTAS)

diegol dijo...

Carlos Julio

Esta es la version del validador para Borland C++. Gracias por publicar tu código. Y si deseas publicar lo mío puedes hacerlo

bool TDMInventario::validaCedRUC(AnsiString documento)
{
bool valor = true;
try {
int suma = 0;
int residuo = 0;
bool privada = false;
bool publica = false;
bool natural = false;
int numeroProvincias = 24;
int digitoVerificador = 0;
int modulo = 11;

int d1, d2, d3, d4, d5, d6, d7, d8, d9, d10;
int p1, p2, p3, p4, p5, p6, p7, p8, p9;

d1 = d2 = d3 = d4 = d5 = d6 = d7 = d8 = d9 = d10 = 0;
p1 = p2 = p3 = p4 = p5 = p6 = p7 = p8 = p9 = 0;

if (documento.Length() < 10) {
valor = false;
}

// Los primeros dos digitos corresponden al codigo de la provincia
int provincia = StrToInt(documento.SubString(0, 2));


if (provincia <= 0 || provincia > numeroProvincias) {
valor = false;
}

// Aqui almacenamos los digitos de la cedula en variables.
d1 = StrToInt(documento.SubString(1,1));
d2 = StrToInt(documento.SubString(2,1));
d3 = StrToInt(documento.SubString(3,1));
d4 = StrToInt(documento.SubString(4,1));
d5 = StrToInt(documento.SubString(5,1));
d6 = StrToInt(documento.SubString(6,1));
d7 = StrToInt(documento.SubString(7,1));
d8 = StrToInt(documento.SubString(8,1));
d9 = StrToInt(documento.SubString(9,1));
d10 = StrToInt(documento.SubString(10,1));

// El tercer digito es:
// 9 para sociedades privadas y extranjeros
// 6 para sociedades publicas
// menor que 6 (0,1,2,3,4,5) para personas naturales
if (d3 == 7 || d3 == 8) {
valor = false;
}

// Solo para personas naturales (modulo 10)
if (d3 < 6) {
natural = true;
modulo = 10;
p1 = d1 * 2;
if (p1 >= 10)
p1 -= 9;
p2 = d2 * 1;
if (p2 >= 10)
p2 -= 9;
p3 = d3 * 2;
if (p3 >= 10)
p3 -= 9;
p4 = d4 * 1;
if (p4 >= 10)
p4 -= 9;
p5 = d5 * 2;
if (p5 >= 10)
p5 -= 9;
p6 = d6 * 1;
if (p6 >= 10)
p6 -= 9;
p7 = d7 * 2;
if (p7 >= 10)
p7 -= 9;
p8 = d8 * 1;
if (p8 >= 10)
p8 -= 9;
p9 = d9 * 2;
if (p9 >= 10)
p9 -= 9;
}

// Solo para sociedades publicas (modulo 11)
// Aqui el digito verficador esta en la posicion 9, en las otras 2
// en la pos. 10
if (d3 == 6) {
publica = true;
p1 = d1 * 3;
p2 = d2 * 2;
p3 = d3 * 7;
p4 = d4 * 6;
p5 = d5 * 5;
p6 = d6 * 4;
p7 = d7 * 3;
p8 = d8 * 2;
p9 = 0;
}

/* Solo para entidades privadas (modulo 11) */
if (d3 == 9) {
privada = true;
p1 = d1 * 4;
p2 = d2 * 3;
p3 = d3 * 2;
p4 = d4 * 7;
p5 = d5 * 6;
p6 = d6 * 5;
p7 = d7 * 4;
p8 = d8 * 3;
p9 = d9 * 2;
}

suma = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9;
residuo = suma % modulo;

// Si residuo=0, dig.ver.=0, caso contrario 10 - residuo
digitoVerificador = residuo == 0 ? 0 : modulo - residuo;
int longitud = documento.Length(); // Longitud del string

// ahora comparamos el elemento de la posicion 10 con el dig. ver.
if (publica ) {
if (digitoVerificador != d9) {
valor = false;
}
/* El ruc de las empresas del sector publico terminan con 0001 */
if (documento.SubString(10, 4)!="0001") {
valor = false;
}
}

if (privada ) {
if (digitoVerificador != d10) {
valor = false;
}
if (documento.SubString(11, 3)!="001") {
valor = false;
}
}

if (natural ) {
if (digitoVerificador != d10) {
valor = false;
}
if (documento.Length() > 10
&& documento.SubString(11, 3)!="001")
{
valor = false;
}
}
} catch (Exception *e) {

valor = false;
}
return valor;
}

Carlos Julio dijo...

Gracias Diego por tu aporte.

En cuanto pueda, lo incluyo en el zip y lo publico en Ecualug.

Saludos cordiales.

Freddy dijo...

Nunca entenderé por qué los programadores novatos hacen códigos como:
return ($intVerificador == $intUltimo? TRUE: FALSE);

Esto significa "evalua la expresión y si el resultado es true, retorna true y si es false retorna false.
entonces por qué no simplemente hacer lo lógico:
return ($intVerificador == $intUltimo);

Carlos Julio dijo...

Hola Fraddy

Gracias por comentar.

Aunque este no es un espacio dedicado a temas de desarrollo ni a buenas prácticas de programación me permito comentar acerca de tu punto.

El tipo de dato primitivo de varios lenguajes varían bastante. En Java es "true/false", en VB es "True/False", en C cero es falso y diferente de cero es verdadero, etc.

Así que el resultado de un boolean esperado no es tan trivial ya que éste varía en cada lenguaje. Luego, habría que analizar si el código que pones como ejemplo en realidad da verdadero solamente con la ayuda del operador "==".

Saludos cordiales.

Anónimo dijo...

Excelente trabajo....! servio de mucho, gracias.

Anónimo dijo...

SAludos, alguien tiene el codigo para validar el Pasaporte Ecuatoriano, ya que en este foro dice que eso esta en el archivo validaCedulaPhp.txt pero lo baje y solo contiene para validar la cedula y ruc, no veo por ningun lado para validar el pasaporte..si alguien lo tiene q lo comparta por favor este es mi mail celopuma@yahoo.com desde ya gracias....

Sydderf dijo...

Hola carlos julio por fa si me puedes ayudar con el codigo para php del validador de cedula y ruc o si me puedes axplicar un poco el codigo q lo tienes publ en ecualug por q ai sta en javascrip por fa mi mail es kapo.kato@gmail.com

Carlos Julio dijo...

Hola Sydderf

El código en PHP no lo hice yo, pero está claramente legible.

Saludos.

prueba dijo...

Gracias por los aportes de las validaciones.. modifique el de la cedula en php por ciertas correciones espero que sirva

public function validarCI($strCedula)
{
$suma = 0;
$strOriginal = $strCedula;
$intProvincia = substr($strCedula,0,2);
$intTercero = substr($strCedula,2,1);//$strCedula[2];
$intUltimo = substr($strCedula,8,1);//$strCedula[9];
if (! settype($strCedula,"float")) return FALSE;
if (strlen($str) != 10) return FALSE;
if ((int) $intProvincia < 1 || (int) $intProvincia > 24) return FALSE;
if ((int) $intTercero > 6 ) return FALSE;
for($indice = 0; $indice < 9; $indice++) {
switch($indice) {
case 0:
case 2:
case 4:
case 6:
case 8:
$arrProducto[$indice] = $strOriginal[$indice] * 2;
if ($arrProducto[$indice] >= 10) $arrProducto[$indice] -= 9;
break;
case 1:
case 3:
case 5:
case 7:
$arrProducto[$indice] = $strOriginal[$indice] * 1;
if ($arrProducto[$indice] >= 10) $arrProducto[$indice] -= 9;
break;
}
}
foreach($arrProducto as $indice => $producto) $suma += $producto;
$residuo = $suma % 10;
$intVerificador = $residuo==0 ? 0: 10 - $residuo;
return ($intVerificador == $intUltimo? TRUE: FALSE);
}

depacheco dijo...

Carlos Julio, me tomé el atrevimiento de añadir un par de líneas que creí faltaban, así como una pequeñísima validación. Espero sirva a quienes buscan validar para VB .Net

Actualización

Ricardo Nieves dijo...

Gracias buen aporte

Jorge Rodriguez dijo...

Excelente para validar la cedula y el RUC en PHP, felicitaciones me srivio mucho. Saludos