Diferencia entre revisiones de «Código de identificación fiscal»

De Wikipedia, la enciclopedia libre
Contenido eliminado Contenido añadido
SuperBraulio13 (discusión · contribs.)
m Revertidos los cambios de 89.141.97.4 a la última edición de 62.42.179.129
Línea 522: Línea 522:
* [http://www.boe.es/g/es/bases_datos/doc.php?coleccion=iberlex&id=1998/16310&codmap= Orden de 3 de julio de 1998 por la que se modifica el anexo del Decreto 2423/1975, de 25 de septiembre, que regula el código de identificación de las personas jurídicas y entidades en general.]
* [http://www.boe.es/g/es/bases_datos/doc.php?coleccion=iberlex&id=1998/16310&codmap= Orden de 3 de julio de 1998 por la que se modifica el anexo del Decreto 2423/1975, de 25 de septiembre, que regula el código de identificación de las personas jurídicas y entidades en general.]
* [http://www.einforma.com Buscador de empresas españolas introduciendo su nº CIF]
* [http://www.einforma.com Buscador de empresas españolas introduciendo su nº CIF]
* [http://www.iberinform.es Buscador ON-LINE de empresas españolas introduciendo su nº CIF]
* [http://www.iberinform.es Buscador de empresas españolas introduciendo su nº CIF]


=== Cálculo del CIF ===
=== Cálculo del CIF ===

Revisión del 11:45 18 abr 2010

El Código de identificación fiscal (CIF) ha sido hasta 2008 el nombre del sistema de identificación tributaria utilizada en España para las personas jurídicas o entidades en general según regula el Decreto 2423/1975, de 25 de septiembre. Este Decreto queda derogado con efectos desde el 1 de enero de 2008 por el Real Decreto 1065/2007, de 27 de julio que define el uso del Número de identificación fiscal. Los valores de las letras son ampliados la Orden EHA/451/2008, de 20 de febrero de 2008 (BOE núm 49), por la que se regula la composición del número de identificación fiscal de las personas jurídicas y entidades sin personalidad jurídica.

Formato del código

El CIF se define originariamente en el Decreto 2423/1975 y es modificado en varias ocasiones. La última modificación, antes de su derogación con efectos desde el 1 de enero de 2008, corresponde a la Orden de 3 de julio de 1998 que regula el código de identificación de las personas jurídicas y entidades en general.

El CIF consta de 9 caracteres. El primero (posición 1) es una letra que sigue los siguientes criterios:

  • A. Sociedades anónimas.
  • B. Sociedades de responsabilidad limitada.
  • C. Sociedades colectivas.
  • D. Sociedades comanditarias.
  • E. Comunidades de bienes.
  • F. Sociedades cooperativas.
  • G. Asociaciones y otros tipos de sociedades civiles.
  • H. Comunidades de propietarios en régimen de propiedad horizontal.
  • J. Sociedades civiles, con o sin personalidad jurídica.
  • K. Formato antiguo.
  • L. Formato antiguo.
  • M. Formato antiguo.
  • N. Entidades no residentes.
  • P. Corporaciones locales.
  • R. Congregaciones e instituciones religiosas.
  • Q. Organismos autónomos, estatales o no, y asimilados, y congregaciones e instituciones religiosas.
  • S. Órganos de la Administración del Estado y comunidades autónomas
  • U. Uniones Temporales de Empresas.
  • V. Otros tipos no definidos en el resto de claves.
  • W. Reservado a establecimientos permanentes de entidades no residentes en territorio español.

A continuación se insertan otros ocho dígitos con las siguientes posiciones: las dos primeras indican la provincia, donde los identificadores o claves provinciales son:

   * 01 - Alava.
   * 02 - Albacete.
   * 03, 53, 54 - Alicante.
   * 04 - Almería.
   * 05 - Ávila.
   * 06 - Badajoz.
   * 07, 57 - Islas Baleares.
   * 08, 58, 59, 60, 61, 62, 63, 64, 65 - Barcelona.
   * 09 - Burgos.
   * 10 - Cáceres.
   * 11, 72 - Cádiz.
   * 12 - Castellón.
   * 13 - Ciudad Real.
   * 14, 56 - Córdoba.
   * 15, 70 - A Coruña.
   * 16 - Cuenca.
   * 17, 55 - Girona.
   * 18 - Granada.
   * 19 - Guadalajara.
   * 20, 71 - Guipúzcoa.
   * 21 - Huelva.
   * 22 - Huesca.
   * 23 - Jaén.
   * 24 - León.
   * 25 - Lleida.
   * 26 - La Rioja.
   * 27 - Lugo.
   * 28, 78, 79, 80, 81, 82, 83, 84, 85 - Madrid.
   * 29, 92, 93 - Málaga.
   * 30, 73 - Murcia.
   * 31 - Navarra.
   * 32 - Ourense.
   * 33, 74 - Asturias.
   * 34 - Palencia.
   * 35, 76 - Las Palmas.
   * 36, 94 - Pontevedra.
   * 37 - Salamanca.
   * 38, 75 - Santa Cruz de Tenerife.
   * 39 - Cantabria.
   * 40 - Segovia.
   * 41, 91 - Sevilla.
   * 42 - Soria.
   * 43, 77 - Tarragona.
   * 44 - Teruel.
   * 45 - Toledo.
   * 46, 96, 97, 98 - Valencia.
   * 47 - Valladolid.
   * 48, 95 - Vizcaya.
   * 49 - Zamora.
   * 50, 99 - Zaragoza.
   * 51 - Ceuta.
   * 52 - Melilla. 

Los cinco siguientes dígitos (posiciones 3 a 8) constituyen un número correlativo de inscripción de la organización en el registro provincial, y el último dígito (posición 9) es un código de control que puede ser un número o una letra :

   * - Será una LETRA si la clave de entidad es K, P, Q ó S.
   * - Será un NUMERO si la entidad es A, B, E ó H.
   * - Para otras claves de entidad: el dígito podrá ser tanto número como letra. 

Las operaciones para calcular el dígito de control se realizan sobre los siete dígitos centrales y son las siguientes:

- Sumar los dígitos de la posiciones pares. Suma = A

- Para cada uno de los dígitos de la posiciones impares, multiplicarlo por 2 y sumar los dígitos del resultado.

 Ej.: ( 8 * 2 = 16 --> 1 + 6 = 7 )

- Acumular el resultado. Suma = B

- Sumar A + B = C

- Tomar sólo el dígito de las unidades de C. Lo llamaremos dígito E.

- Si el dígito E es distinto de 0 lo restaremos a 10. D=10-E. Esta resta nos da D. Si no, si el dígito E es 0 y si el dígito de control ha de ser numérico entonces D=0 y no hacemos resta.


- A partir de D ya se obtiene el dígito de control.

 Si ha de ser numérico es directamente D y si se trata
 de una letra se corresponde con la relación:
 A = 1, B = 2, C= 3, D = 4, E = 5, F = 6, G = 7, H = 8, I = 9, J = 10

Ejemplo para el CIF: A58818501

- Utilizamos los siete dígitos centrales = 5881850

- Sumamos los dígitos pares: A = 8 + 1 + 5 = 14

- Posiciones impares:

   5 * 2 = 10 -> 1 + 0 = 1
   8 * 2 = 16 -> 1 + 6 = 7
   8 * 2 = 16 -> 1 + 6 = 7
   0 * 2 = 0 -> = 0
 Sumamos los resultados: B = 1 + 7 + 7 + 0 = 15

- Suma parcial: C = A + B = 14 + 15 = 29

- El dígito de las unidades de C es 9.

 Se lo restamos a 10 y nos da: D = 10 - 9 = 1

- Si el dígito de control ha de ser un número es 1

 y si ha de ser una letra es la "A"

Rutinas de cálculo

Como esta parte de obtener el dígito de control puede parecer un poco más complicada, a continuación damos diversas implementaciones.

Implementación en VBA

Public Function cifDigito(cif As String) As String

    Dim A As Integer    'Suma de impares
    Dim B As Integer    'Suma de digitos de doble de pares
    Dim C As Integer
    A = 0
    B = 0

    For i = 2 To 6 Step 2
        A = A + Mid(cif, i + 1, 1)   'Suma de posición impar
        C = 2 * Mid(cif, i, 1)       'Doble de posición par
        B = B + (C Mod 10) + Int(C / 10)   'Suma de digitos de doble de pares
    Next i
    B = B + ((2 * Mid(cif, 8, 1)) Mod 10) + Int((2 * Mid(cif, 8, 1)) / 10)
    C = (10 - ((A + B) Mod 10)) Mod 10
    
    Dim Digito As String
    Dim letras As Variant
    letras = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")
    Select Case (Left(cif, 1))
        Case "K", "P", "Q", "S": Digito = letras(C-1)
        Case "A", "B", "E", "H": Digito = C
        Case Else: Digito = C & " o " & letras(C-1)
    End Select
    cifDigito = Digito
    
End Function

Implementación en ActionScript

// Validación de CIF de la nueva normativa de la Orden EHA/451/2008, en lenguaje ActionScript para las validaciones en los PDFs

var cif = event.value;
var par = 0;
var non = 0;
var letras = "ABCDEFGHJKLMNPRQSUVW";
var caracterControlLetra = "KPQS";
var caracterControlNum = "ABEH";
var i;
var parcial;
var control;
var controlLetra = "JABCDEFGHIJ";
var letraIni = cif.charAt(0);

if (cif.length!=9) {
    app.alert("El Cif debe tener 9 dígitos",3);
    event.value="";
}
else
{
    if (letras.indexOf(letraIni.toUpperCase())==-1)
    {
        app.alert("La letra del CIF introducido no es correcta",3);
        event.value="";
    }
    for (i=2;i<8;i+=2) {
        par = par + parseInt(cif.charAt(i));
    }

    for (i=1;i<9;i+=2) {
        var nn = 2 * parseInt(cif.charAt(i));
        if (nn > 9) nn = 1 + (nn-10);
        non = non + nn;
    }

    parcial = par + non;

    control = (10 - ( parcial % 10));


    if (caracterControlLetra.indexOf(letraIni.toUpperCase()) != -1)
    {
        // El caracter de control deberá ser una letra

        if (controlLetra.charAt(control) != cif.charAt(8).toUpperCase())
        {
            app.alert("El Cif no es válido",3);
            event.value ="";
        }
    }
    if (caracterControlNum.indexOf(letraIni.toUpperCase()) != -1)
    {
        // El caracter de control deberá ser un número

        if (control == 10) control = 0;

        if (control != cif.charAt(8))
        {
            app.alert("El Cif no es válido",3);
            event.value ="";
        }
    }
    if ((caracterControlLetra.indexOf(letraIni.toUpperCase()) == -1) && (caracterControlNum.indexOf(letraIni.toUpperCase()) == -1))
    {
        // En este caso el carácter de control puede ser una letra o un número

        if (control == 10)
        {
            control = 0;
        }
        if ((controlLetra.charAt(control) != cif.charAt(8).toUpperCase()) && (control != cif.charAt(8)))
        {
            app.alert("El Cif no es válido",3);
            event.value ="";
        }
    }
}

Implementación en Java

	private static final String LETRAS_VALIDAS = "ABCDEFGHJKLMNPRQSUVW";

	private static final String LETRAS_VALIDAS_NUMERO = "ABEH";

	private static final String LETRAS_VALIDAS_LETRA = "KPQS";

	private static final Map<Character, Integer> RELACION_LETRAS_NUMEROS = new HashMap<Character, Integer>();
	static {
		RELACION_LETRAS_NUMEROS.put('J', 0);
		RELACION_LETRAS_NUMEROS.put('A', 1);
		RELACION_LETRAS_NUMEROS.put('B', 2);
		RELACION_LETRAS_NUMEROS.put('C', 3);
		RELACION_LETRAS_NUMEROS.put('D', 4);
		RELACION_LETRAS_NUMEROS.put('E', 5);
		RELACION_LETRAS_NUMEROS.put('F', 6);
		RELACION_LETRAS_NUMEROS.put('G', 7);
		RELACION_LETRAS_NUMEROS.put('H', 8);
		RELACION_LETRAS_NUMEROS.put('I', 9);
		RELACION_LETRAS_NUMEROS.put('J', 10);
	}

	public static boolean validateCif(String cif) {
		try {
			int par = 0;
			int non = 0;

			int parcial;
			Integer control;
			
			String letraIni = String.valueOf(cif.charAt(0));

			if (cif.length() != 9) {
				return false;
			}
			if (LETRAS_VALIDAS.indexOf(letraIni.toUpperCase()) == -1) {
				return false;
			}

			for (int i = 2; i < 8; i += 2) {
				par = par + Integer.parseInt(String.valueOf(cif.charAt(i)));
			}

			for (int i = 1; i < 9; i += 2) {
				int nn = 2 * Integer.parseInt(String.valueOf(cif.charAt(i)));
				if (nn > 9) {
					nn = 1 + (nn - 10);
				}
				non = non + nn;
			}

			parcial = par + non;

			control = (10 - (parcial % 10));

			if (LETRAS_VALIDAS_LETRA.indexOf(letraIni.toUpperCase()) != -1) {
				if (!RELACION_LETRAS_NUMEROS.get(cif.charAt(8)).equals(control)) {
					return false;
				}
			}
			if (LETRAS_VALIDAS_NUMERO.indexOf(letraIni.toUpperCase()) != -1) {

				if (control == 10)
					control = 0;

				if (!control.equals(Integer.parseInt(String.valueOf(cif
						.charAt(8))))) {
					return false;
				}
			}
			if ((LETRAS_VALIDAS_LETRA.indexOf(letraIni.toUpperCase()) == -1)
					&& (LETRAS_VALIDAS_NUMERO.indexOf(letraIni.toUpperCase()) == -1)) {
				if (control == 10) {
					control = 0;
				}
				if (!(String.valueOf(RELACION_LETRAS_NUMEROS.get(control))
						.equals(String.valueOf(cif.charAt(8)).toUpperCase()))
						&& (!control.equals(Integer.parseInt(String.valueOf(cif
								.charAt(8)))))) {
					return false;
				}
			}

			return true;
		} catch (NumberFormatException e) {
			return false;
		} catch (StringIndexOutOfBoundsException e) {
			return false;
		} catch (NullPointerException e) {
			return false;
		}
	}

Implementación en C#

        public bool validateCif(string cif)
        {
            if (string.IsNullOrEmpty(cif)) return false;
            cif = cif.Trim().ToUpper();

            //Debe tener una longitud igual a 9 caracteres;
            if (cif.Length != 9) return false;
            // ... y debe comenzar por una letra, la cual pasamos a mayúscula, ... 
            // 
            string firstChar = cif.Substring(0, 1); 
            // ...que necesariamente deberá de estar comprendida en 
            // en siguiente intervalo: ABCDEFGHJNPQRSUVW 
            // 
            string cadena = "ABCDEFGHJNPQRSUVW";
            if (cadena.IndexOf(firstChar) == -1) return false;
            try
            {
                Int32 sumaPar = default(Int32);
                Int32 sumaImpar = default(Int32);
                // A continuación, la cadena debe tener 7 dígitos + el dígito de control. 
                // 
                string cif_sinControl = cif.Substring(0, 8);
                string digits = cif_sinControl.Substring(1, 7);
                for (Int32 n = 0; n <= digits.Length - 1; n += 2)
                {
                    if (n < 6)
                    {
                        // Sumo las cifras pares del número que se corresponderá 
                        // con los caracteres 1, 3 y 5 de la variable «digits». 
                        // 
                        sumaPar += Convert.ToInt32(digits[n + 1].ToString());
                    }
                    // Multiplico por dos cada cifra impar (caracteres 0, 2, 4 y 6). 
                    // 
                    Int32 dobleImpar = 2 * Convert.ToInt32(digits[n].ToString());
                    // Acumulo la suma del doble de números impares. 
                    // 
                    sumaImpar += (dobleImpar % 10) + (dobleImpar / 10);
                }
                // Sumo las cifras pares e impares. 
                // 
                Int32 sumaTotal = sumaPar + sumaImpar;
                // Me quedo con la cifra de las unidades y se la resto a 10, siempre 
                // y cuando la cifra de las unidades sea distinta de cero 
                // 
                sumaTotal = (10 - (sumaTotal % 10)) % 10;
                // Devuelvo el Dígito de Control dependiendo del primer carácter 
                // del NIF pasado a la función. 
                //
                string digitoControl = "";
                switch (firstChar)
                {
                    case "N":
                    case "P":
                    case "Q":
                    case "R":
                    case "S":
                    case "W": 
                        // NIF de entidades cuyo dígito de control se corresponde 
                        // con una letra. 
                        // 
                        // Al estar los índices de los arrays en base cero, el primer 
                        // elemento del array se corresponderá con la unidad del número 
                        // 10, es decir, el número cero. 
                        // 
                        char[] characters = { 'J', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'};
                        digitoControl = characters[sumaTotal].ToString();
                        break;
                    default:
                        // NIF de las restantes entidades, cuyo dígito de control es un número. 
                        // 
                        digitoControl = sumaTotal.ToString();
                        break;
                }
                return digitoControl.Equals(cif.Substring(8, 1));
            }
            catch (Exception)
            {
                // Cualquier excepción producida, devolverá false. 
                return false;
            }
        }

Implementación en Perl

sub validar_cif {
    my $cif = shift;

    my ($sociedad, $inscripción, $control) = $cif =~ /^ (.) (\d{7}) (.)/x;

    unless ($sociedad and $inscripción and $control) {
        return 'ERROR: No está bien formado';
    }

    unless ($sociedad ~~ /[ABCDEFGHJKLMNPRQSUVW]/i) {
        return 'ERROR: La letra inicial del CIF no es correcta';
    }

    my @n     = split //, $inscripción;         # separamos los dígitos

    my $pares = $n[1] + $n[3] + $n[5];          # sumar los dígitos pares

    my $nones;                                  # sumar los dígitos impares
    for (0, 2, 4, 6) {
        my $d   = $n[$_] * 2;                   # los dígitos impares valen doble
        $nones += $d < 10 ? $d : $d - 9;        # ajuste si ese doble es superior a 10
    }

    my $c = 10 - substr($pares + $nones, -1);   # dígito de control esperado

    my $l = substr(' ABCDEFGHIJ', $c, 1);       # letra de control esperada

    given ($sociedad) {                         # según la letra inicial...

        when (/[KPQS]/i) {                      # el control debe ser una letra
            if ($l ne uc($control)) {
                return 'ERROR: El CIF no es válido: fallo en la letra de control';
            }
        }

        when (/[ABEH]/i) {                      # el control debe ser un número
            if ($c != $control) {
                return 'ERROR: El CIF no es válido: fallo en el dígito de control';
            }
        }

        default {                               # puede ser letra o número
            if ($c != $control  and  $l ne uc($control)) {
                return 'ERROR: El CIF no es válido: fallo en el dígito o letra de control';
            }
        }
    }

    return 'El CIF es correcto';
}

Abreviaturas de las sociedades

El CIF debe coincidir con la abreviación final del nombre de la empresa según la siguiente relación: ( listado parcial de Sociedades Civiles y Mercantiles en España )

 SL.... Sociedad Limitada
 SLU... Sociedad Limitada Unipersonal
 SLL... Sociedad Limitada Laboral
 SLNE.. Sociedad Limitada Nueva Empresa
 SA.... Sociedad Anónima
 SAL... Sociedad Anónima Laboral
 SAU... Sociedad Anónima Unipersonal
 SAE... Sociedad Anónima Española
 CB.... Comunidad de Bienes
 SC.... Sociedad Civil
 SRL... Sociedad de Responsabilidad Limitada
 SCP... Sociedad Civil Particular/Privada
 UTE... Unión Temporal de Empresas
 COOP.. Sociedad Cooperativa
 SCA... Sociedad Cooperativa Andaluza
 AEIE.. Agrupación Europea de Interés Económico
 SCI... Sociedad Cooperativa Industrial
 AIE... Agrupación de Interés Económico
 SCL... Sociedad Cooperativa Limitada
 SGR... Sociedad de Garantía Recíproca
 SAT... Sociedad Agraria de Transformación
 SI.... Sociedad Irregular
 SAD... Sociedad Anónima Deportiva
 SRC... Sociedad Regular Colectiva
 SEE... Sucursal en España
 SENC.. Sociedad en Comandita

Para el código de países extranjeros se usan, a partir del 1 de enero de 1981, los códigos de la Orden de 4 de agosto de 1980, así como sus diferentes correcciones (BOE NUM. 272, de 12 de noviembre de 1980, BOE núm. 298, de 12 de diciembre de 1980, Circular 860/1981, de 30 de junio).

Véase también

Enlaces externos

Cálculo del CIF