Como funciona o carácter de control
O último carácter de todo NIF é un carácter de control, calculado a partir do resto do número, para detectar as gralladas. Esta páxina explica como se calcula cada un e de onde sae cada regra. Non todos os pasos teñen o mesmo tipo de fonte: algúns son lei, outros só criterio oficial e un é unha convención. Os niveis explícanse na páxina de fontes oficiais.
DNI: o número módulo 23
Sección titulada «DNI: o número módulo 23»A letra de control dun DNI é o resto de dividir o seu número de 8 díxitos entre 23, buscado nesta táboa (DNI-2):
| Resto | Letra | Resto | Letra | Resto | Letra |
|---|---|---|---|---|---|
| 0 | T | 8 | P | 16 | Q |
| 1 | R | 9 | D | 17 | V |
| 2 | W | 10 | X | 18 | H |
| 3 | A | 11 | B | 19 | L |
| 4 | G | 12 | N | 20 | C |
| 5 | M | 13 | J | 21 | K |
| 6 | Y | 14 | Z | 22 | E |
| 7 | F | 15 | S |
Para 12345678: 12345678 = 23 × 536768 + 14, e a letra do 14 é a Z, así que o DNI é 12345678Z.
import { computeControlCharacter } from "nif-dni-nie-cif-validation";
const LETTERS = "TRWAGMYFPDXBNJZSQVHLCKE";
12345678 % 23; // 14LETTERS[12345678 % 23]; // "Z"computeControlCharacter("12345678"); // "Z"As letras I, Ñ, O e U non están na táboa, así que un DNI nunca remata nelas (DNI-3). Se unha persoa usuaria escribe unha delas, validate() indica que regra non se cumpre e que letra se esperaba:
import { validate } from "nif-dni-nie-cif-validation";
validate("12345678I").error?.rule; // "DNI-3"validate("12345678I").error?.expected; // "Z"Fonte. O formato do DNI é lei: Real decreto 1065/2007, art. 19 (nivel T1). O algoritmo do módulo 23 non figura en ningunha lei: publícao o Ministerio do Interior, e tamén a nota técnica da AEAT sobre o NIF (niveis T2 e T3).
NIF K/L/M: só os 7 díxitos
Sección titulada «NIF K/L/M: só os 7 díxitos»Un NIF K, L ou M usa a mesma táboa, sobre os seus 7 díxitos. A letra inicial non se converte nun díxito, así que K, L e M cos mesmos díxitos teñen a mesma letra de control (KLM-2):
import { computeControlCharacter } from "nif-dni-nie-cif-validation";
computeControlCharacter("K1234567"); // "L": 1234567 % 23 é 19computeControlCharacter("M1234567"); // "L"Fonte. A nota técnica da AEAT sobre o NIF (T3). A lei di que os 7 caracteres son «alfanuméricos», pero o algoritmo só funciona con díxitos, así que a biblioteca segue a nota e esixe díxitos (KLM-3, un conflito coñecido entre fontes).
NIE: substitúese o prefixo e aplícase o módulo 23
Sección titulada «NIE: substitúese o prefixo e aplícase o módulo 23»Nun NIE, o prefixo convértese nun díxito (X → 0, Y → 1, Z → 2), e o número de 8 díxitos resultante pasa pola táboa do DNI (NIE-2). Así, Y1234567 convértese en 11234567, cuxo resto é 10, letra X:
import { computeControlCharacter, isValidNie } from "nif-dni-nie-cif-validation";
11234567 % 23; // 10computeControlCharacter("Y1234567"); // "X"computeControlCharacter("X1234567"); // "L": igual que o DNI 01234567isValidNie("Y1234567L"); // false: o prefixo cambia a letraO NIE antigo de 10 caracteres (X0 + 7 díxitos + letra) ten a mesma letra que a súa forma de 9 caracteres, porque o cero inicial non cambia o número (NIE-3).
Fonte. A páxina do Ministerio do Interior e a nota técnica da AEAT (T2 e T3); as series X, Y e Z están na Orde INT/2058/2008 (T1).
CIF: un díxito ou unha letra, segundo a clave de entidade
Sección titulada «CIF: un díxito ou unha letra, segundo a clave de entidade»O carácter de control dun CIF é un díxito ou unha letra, e a clave de entidade decide cal (CIF-3):
- un díxito para A, B, C, D, E, F, G, H, J, U e V (sociedades e outras entidades españolas);
- unha letra para N, P, Q, R, S e W (entidades estranxeiras, corporacións locais, organismos públicos, institucións relixiosas, órganos do Estado e establecementos permanentes).
O valor calcúlase a partir dos 7 díxitos (CIF-4):
- Súmanse os díxitos das posicións pares (a 2.ª, a 4.ª e a 6.ª).
- Multiplícase por dous cada díxito das posicións impares (a 1.ª, a 3.ª, a 5.ª e a 7.ª) e súmanse as cifras de cada resultado (14 conta como 1 + 4).
- Súmanse as dúas cantidades. O díxito de control é 10 menos a última cifra do total, ou 0 se a última cifra é 0.
- Se a clave leva letra, o díxito convértese en letra: 0 → J, 1 → A, 2 → B, … 9 → I (
JABCDEFGHI).
Para B1234567: as posicións pares dan 2 + 4 + 6 = 12; as impares, 2 + 6 + (1 + 0) + (1 + 4) = 14; o total é 26, así que o díxito de control é 10 − 6 = 4, e o CIF é B12345674. Unha clave que levase letra tería a D, a quinta letra de JABCDEFGHI.
import { computeControlCharacter, isValidCif } from "nif-dni-nie-cif-validation";
computeControlCharacter("B1234567"); // "4"computeControlCharacter("N1234567"); // "D": N leva letracomputeControlCharacter("P2807900"); // "B": Concello de Madrid, P2807900BisValidCif("B1234567D"); // false: B leva díxitoFonte. As claves de entidade son lei: Orde EHA/451/2008 (T1). Que claves levan díxito e cales letra só figura na nota técnica interna da AEAT (T3). A aritmética non está publicada en ningún texto oficial que atopásemos: é unha convención (T4), que seguen todas as implementacións e que se comprobou con NIF reais de organismos públicos, como P2807900B (Concello de Madrid) e Q2826000H (a propia AEAT).
Resumo das fontes
Sección titulada «Resumo das fontes»| Paso | Regra | Nivel |
|---|---|---|
| Formato do DNI: 8 díxitos e unha letra | DNI-1 | T1 lei, T2 páxina oficial |
| Letra do DNI: módulo 23 | DNI-2 | T2 páxina oficial, T3 nota da AEAT |
| Letra K/L/M: os 7 díxitos | KLM-2 | T3 nota da AEAT |
| Prefixo do NIE: X → 0, Y → 1, Z → 2 | NIE-2 | T2 páxina oficial, T3 nota da AEAT |
| Claves de entidade do CIF | CIF-2 | T1 lei |
| Control do CIF: díxito ou letra segundo a clave | CIF-3 | T3 nota da AEAT |
| Aritmética do control do CIF | CIF-4 | T4 convención |