<?
function UfValidStrCuit($cuit,&$resultado)
{
$coeficiente[0]=5;
$coeficiente[1]=4;
$coeficiente[2]=3;
$coeficiente[3]=2;
$coeficiente[4]=7;
$coeficiente[5]=6;
$coeficiente[6]=5;
$coeficiente[7]=4;
$coeficiente[8]=3;
$coeficiente[9]=2;
$resultado=1;
for ($i=0; $i < strlen($cuit); $i= $i +1) { //separo cualquier caracter que no tenga que ver con numeros
if ((Ord(substr($cuit, $i, 1)) >= 48) && (Ord(substr($cuit, $i, 1)) <= 57))
{
$cuit_rearmado = $cuit_rearmado . substr($cuit, $i, 1);
}
}
If (strlen($cuit_rearmado) <> 11) { // si to estan todos los digitos
$resultado=0;
} Else {
$sumador = 0;
$verificador = substr($cuit_rearmado, 10, 1); //tomo el digito verificador
For ($i=0; $i <=9; $i=$i+1) {
$sumador = $sumador + (substr($cuit_rearmado, $i, 1)) * $coeficiente[$i];//separo cada digito y lo multiplico por el coeficiente
}
$resultado = $sumador % 11;
$resultado = 11 - $resultado; //saco el digito verificador
$veri_nro = intval($verificador);
If ($veri_nro <> $resultado) {
$resultado=0;
} else {
$cuit_rearmado = substr($cuit_rearmado, 0, 2) . "-" . substr($cuit_rearmado, 2, 8) . "-" . substr($cuit_rearmado, 10, 1);
}
}
}
?>
Comentarios sobre la versión: Versión 1 (8)
AOMR-730725-93B
Las primeras son 4 letras unicamente letras la segunda seccion son números y la tercera seccion puede se alfanumericos, tendras alguna validacion en PHP o bien javascrip, gracias
Gracias por el código y espero sirva el parche.
Saludos.
function valida_cuit($cuit,$resultado=0)
{
/* se considera un cuit valido si es un entero de 11 digitos y el ultimo digito verifica. */
$coeficiente[0]=5;
$coeficiente[1]=4;
$coeficiente[2]=3;
$coeficiente[3]=2;
$coeficiente[4]=7;
$coeficiente[5]=6;
$coeficiente[6]=5;
$coeficiente[7]=4;
$coeficiente[8]=3;
$coeficiente[9]=2;
$resultado=1;
for ($i=0; $i < strlen($cuit); $i= $i +1) { //separo cualquier caracter que no tenga que ver con numeros
if ((Ord(substr($cuit, $i, 1)) >= 48) && (Ord(substr($cuit, $i, 1)) <= 57))
{
$cuit_rearmado = $cuit_rearmado . substr($cuit, $i, 1);
}
}
If (strlen($cuit_rearmado) <> 11) { // si to estan todos los digitos
$resultado=0;
} Else {
$sumador = 0;
$verificador = substr($cuit_rearmado, 10, 1); //tomo el digito verificador
For ($i=0; $i <=9; $i=$i+1) {
$sumador = $sumador + (substr($cuit_rearmado, $i, 1)) * $coeficiente[$i];//separo cada digito y lo multiplico por el coeficiente }
$resultado = $sumador % 11;
$resultado = 11 - $resultado; //saco el digito verificador
$veri_nro = intval($verificador);
If ($veri_nro <> $resultado) {
$resultado=0;
} else {
$cuit_rearmado = substr($cuit_rearmado, 0, 2) . "-" . substr($cuit_rearmado, 2, 8) . "-" . substr($cuit_rearmado, 10, 1);
}
}
// PARCHE:
// MANEJA EL CASO DE QUE EL DIGITO DA 0, COMO $resultado DA 0, PARA QUE LA
// FUNCION NO DEVUELVA FALSE FUERZO A QUE DEVUELVA 1
if ($veri_nro == 0) {
$resultado = 1;
}
return($resultado);
}
if ($resultado===11){
$resultado=0;
}else if($resultado===10){
$resultado=9;
}
20-24123123-1 es valido pero 20-2412312-31 también!!! lo cual es un error,
les paso la funcion completa agregando la correccion de "einacion"
function validarCuit($cuit) {
// valido el formato xx-xxxxxxxx-xx (2-8-1)
$ex = explode('-',$cuit);
if(strlen($ex[0])!=2
|| strlen($ex[1]!=8)
|| strlen($ex[2])!=1) {
return false;
}
$coeficiente[0]=5;
$coeficiente[1]=4;
$coeficiente[2]=3;
$coeficiente[3]=2;
$coeficiente[4]=7;
$coeficiente[5]=6;
$coeficiente[6]=5;
$coeficiente[7]=4;
$coeficiente[8]=3;
$coeficiente[9]=2;
$resultado=1;
$cuit_rearmado = "";
for ($i=0; $i < strlen($cuit);$i= $i +1) {
//separo cualquier caracter que no tenga que ver con numeros
if ((Ord(substr($cuit, $i, 1)) >= 48) && (Ord(substr($cuit, $i, 1)) <= 57)) {
$cuit_rearmado = $cuit_rearmado . substr($cuit, $i, 1);
}
}
if (strlen($cuit_rearmado) <> 11) {
// si to estan todos los digitos
$resultado=0; }
else {
} $sumador = 0;
$verificador = substr($cuit_rearmado, 10, 1);
//tomo el digito verificador
for ($i=0; $i <=9; $i=$i+1) {
$sumador = $sumador + (substr($cuit_rearmado, $i, 1)) * $coeficiente[$i];
//separo cada digito y lo multiplico por el coeficiente }
$resultado = $sumador % 11;
$resultado = 11 - $resultado;
//saco el digito verificador
$veri_nro = intval($verificador);
if ($resultado===11){
$resultado=0;
}else if($resultado===10){
$resultado=9;
}
if ($veri_nro <> $resultado) {
$resultado=0;
} else {
$cuit_rearmado = substr($cuit_rearmado, 0, 2) . "-" . substr($cuit_rearmado, 2, 8) . "-" . substr($cuit_rearmado, 10, 1);
}
}
return $resultado;
}
reemplazar x esto
// valido el formato xx-xxxxxxxx-xx (2-8-1)
$ex = explode('-',$cuit);
if(strlen($ex[0])!=2
|| strlen($ex[1])!=8
|| strlen($ex[2])!=1) {
echo "no es un codigo valido";
return false;
}
//retira cualquier caracter especial que se le haya ocurrido al cliente
$cuit = preg_replace('/[^0-9]/', '', $cuit);
// ahora que tengo los numeros solamente, chequeo que sean 11
if(strlen($cuit) != 11){
return false;
}
En el final, si lo que querés es que la respuesta sea true o false agregar hay que reemplazar el return por:
//Ya valide que tiene 11 caracteres, puedo utilizar el offset de manera segura
return ($cuit[10] == $resultado);
$cuil = str_replace('-','',trim($cuil));
if (is_numeric($cuil)) return false;
if (strlen($cuil) !== 11) return false;
$factores = array(5,4,3,2,7,6,5,4,3,2);
$sumatoria = 0;
for ($i=0; $i < strlen($cuil)-1; $i++) {
$sumatoria += (substr($cuil, $i, 1))*$factores[$i];
}
$resto = $sumatoria % 11;
$digitoVerificador = ($resto != 0) ? (11 - $resto) : $resto;
return ($digitoVerificador == substr($cuil, strlen($cuil)-1));
}