Skip to content

Instantly share code, notes, and snippets.

@vupot
Last active May 7, 2025 07:37
Show Gist options
  • Save vupot/855f898ddfae5d30ad8f62a622fba20d to your computer and use it in GitHub Desktop.
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
<?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;
}
<?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