
El CIF (Código de Identificación Fiscal) es un elemento de identificación administrativa para organizaciones y consta de 9 dígitos:
_ _ _ _ _ _ _ _ _ |_| |_|_|_|_|_|_|_| |_| ^ ^ ^ ^ | |_ Números _| | | | | Dígito de control, un número ó letra: | {Aó1,Bó2,Có3,Dó4,Eó5,Fó6,Gó7,Hó8,Ió9,Jó0} | Letra de tipo de Organización, una de las siguientes: {A,B,C,D,E,F,G,H,K,L,M,N,P,Q,S}
El primer dígito es una letra que indica el tipo de la organización y puede ser una de los siguientes:
- A – Sociedad Anónima.
- B – Sociedad de responsabilidad limitada.
- C – Sociedad colectiva.
- D – Sociedad comanditaria.
- E – Comunidad de bienes.
- F – Sociedad cooperativa.
- G – Asociación.
- H – Comunidad de propietarios.
- K – Formato antiguo.
- L – Formato antiguo.
- M – Formato antiguo.
- N – Formato antiguo.
- P – Corporación local.
- Q – Organismo autónomo
- S – Organo de la administración.
Los siete dígitos siguientes son números y el último es el dígito de control que puede ser un número ó una letra.
Las operaciones para calcular el dígito de control se realizan sobre los siete dígitos centrales. Vamos a ver qué operaciones son y como podemos implementarlas con Javascript:
- Sumar los dígitos de la posiciones pares. La suma la dejaremos en una primera variable A
- Para cada uno de los dígitos de la posiciones impares, multiplicarlo por 2 y sumar los dígitos del resultado.Acumular el resultado en la variable B.
El código que utilizamos para este primer paso es sencillo. El acceso al número del CIF lo realizamos mediante el uso de la función substr tanto para los números pares como para los impares.
// Sumamos los A y B
a = 0;
b = 0;
var calculo = new Array(0,2,4,6,8,1,3,5,7,9);
for(x=2;x<=6;x+=2) {
a = a + parseInt(cif.substr(x,1));
b = b + calculo[parseInt(cif.substr(x-1,1))];
}
b = b + calculo[parseInt(cif.substr(x-1,1))];
Para los números impares hemos visto que hay que hacer alguna cosa adicional (multiplicarlos por dos y sumar los dígitos). Como esto nos puede resultar costoso de programar, utilizamos un pequeño truco. Y es que dado un número, en un array cargamos su resultado.
Así tenemos el siguiente array:
var calculo = new Array(0,2,4,6,8,1,3,5,7,9);
Y por qué el array es así. Pues es el resultado del cálculo expresado anteriormente:
0 x 2 = 0 1 x 2 = 2 2 x 2 = 4 3 x 2 = 6 4 x 2 = 8 5 x 2 = 10; 1 + 0 = 1 6 x 2 = 12; 1 + 2 = 3 7 x 2 = 14; 1 + 4 = 5 8 x 2 = 16; 1 + 6 = 7 9 x 2 = 18; 1 + 8 = 9
- Sumamos A + B = C
- Tomar sólo el dígito de las unidades de C y restárselo a 10. Esta resta nos da D.
El código de esta última acción sería el siguiente:
d = (10 -(c%10));
- 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 = 0
Veamos como ejemplo para el número de C.I.F. : 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"
x7iBiT
Buen algoritmo, mucho más optimizado que otros que he visto por ahí. Sin embargo faltan algunas letras a comprobar en el primer carácter (entidad), como por ejemplo Q,V y W. La función de validar el formato (sin tener en cuenta el carácter de control) se podría reducir a:
/^[[A-H][J-N][P-S]UVW][0-9]{7}[0-9A-J]$/.test(cif)
Y por último tener en cuenta que el carácter de control será:
– una LETRA si la clave de entidad es K, P, Q ó S
– un NUMERO si la entidad es A, B, E ó H
– podrá ser tanto número como letra para el resto de entidades
javi
hola, este algoritmo lo estoy utilizando con éxito, pero hay cifs de Organismos que dan cif incorrecto..por ejemplo este…Q7855018C
Raul
Hola, una pregunta, sabrías decirme si en algún BOE o en algún sitio oficial tienen descrito el modo de validar un CIF/NIF/NIE, por más que lo busco me es imposible encontrarlo.
Muchas gracias.