Last active
May 7, 2025 07:37
-
-
Save vupot/855f898ddfae5d30ad8f62a622fba20d to your computer and use it in GitHub Desktop.
[Calcular y Validar CUIT] Calcular y Validar el número de CUIT/CUIL en Argentina
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Cálculo de CUIT/CUIL. La función no tiene en cuenta la posibilidad | |
* de CUITs repetidos ya que no tiene acceso a la DB de registros (puede | |
* ocurrir ya que algunos DNI coinciden con las LE y LC) | |
* | |
* @param char $tipo: tipo de CUIT, puede valer H, M y E (hombre, mujer, empresa) | |
* @param string $dni: número de DNI (a las empresas, la AFIP les asigna un nro.) | |
* @return string con el CUIT sin guiones o false en caso de error | |
*/ | |
function calcular_cuit ( $tipo, $dni ) { | |
$base = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]; | |
$dni = (string)$dni; | |
if ( strlen($dni) == 7 ) { | |
$dni = '0' . $dni; | |
} elseif ( strlen($dni) != 8 ) { | |
return false; | |
} | |
switch ( $tipo ) { | |
case 'H': $cuit = '20' . $dni; break; | |
case 'M': $cuit = '27' . $dni; break; | |
case 'E': $cuit = '30' . $dni; break; | |
default: | |
return false; | |
} | |
$aux = 0; | |
for ( $i = 0; $i < 10; $i++ ) { | |
$aux += $base[$i] * (int)$cuit[$i]; | |
} | |
$verif = 11 - ($aux % 11); | |
if ( $verif == 11 ) { | |
$verif = 0; | |
} elseif ( $verif == 10 ) { | |
switch ( $tipo ) { | |
case 'H': | |
$nuevoTipo = '23'; | |
$verif = 9; | |
break; | |
case 'M': | |
$nuevoTipo = '23'; | |
$verif = 4; | |
break; | |
case 'E': | |
$nuevoTipo = '33'; | |
$verif = 9; | |
break; | |
} | |
$cuit = $nuevoTipo . $dni; | |
} | |
return $cuit . (string)$verif; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
function validar_cuit ( $cuit ) { | |
$len = strlen( (string)$cuit ); | |
if ( $len == 13 ) { | |
$nro = (string)$cuit; | |
if ( $nro[2] != '-' || $nro[11] != '-' ) { | |
return false; | |
} else { | |
$nro = str_replace( '-', '', $nro ); | |
} | |
} elseif ( $len == 11 ) { | |
$nro = (string)$cuit; | |
} else { | |
return false; | |
} | |
$base = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2]; | |
$aux = 0; | |
for ( $i = 0; $i < 10; $i++ ) { | |
$aux += $base[$i] * (int)$nro[$i]; | |
} | |
$verif = 11 - ($aux % 11); | |
if ( $verif == 11 ) { | |
$verif = 0; | |
} elseif ( $verif == 10 ) { | |
// nunca debería dar 10 porque, en ese caso, se tiene que recalcular | |
// cambiando el prefijo (si es un CUIT bien formado, no debería dar | |
// 10, aunque tengo dudas en como se recalculan los CUIT repetidos, | |
// los cuales pueden tener prefijos 24, 25, 26, 27 y 34) | |
return false; | |
} | |
return $nro[10] == (string)$verif; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment