Notas de ingeniería · Calidad de datos
El carácter de control no es validación de entrada: es un instrumento de medida
Nos llegó una consulta por el NIF B42413283. Respondimos algo cierto, hasta donde
llegaba:
Cada frase es exacta y el conjunto es una mentira por omisión. B42413283 no es
un NIF que nos falte. No es un NIF en absoluto, y no lo tiene ningún proveedor
del mundo, porque la Agencia Tributaria no ha podido emitirlo. Se demuestra con
una calculadora de bolsillo.
El último carácter no es un dato
Según la Orden EHA/451/2008, el noveno carácter de un NIF español se calcula a partir de los ocho anteriores. Se duplican las cifras de las posiciones impares y se suman sus dígitos, se suman las cifras de las posiciones pares, y el carácter de control cierra la suma al múltiplo de diez siguiente:
B 4 2 4 1 3 2 8 ?
↑ ↑ ↑ ↑ duplicadas: 8, 8, 6, 16→7 = 29
↑ ↑ ↑ tal cual: 2 + 1 + 2 = 5
total = 34
dígito de control = 10 − 4 = 6
El identificador es, por tanto, B42413286, y el que nos pasaron termina en 3.
Uno de los nueve caracteres no aporta información propia: existe únicamente para
decirte que los otros ocho han llegado intactos.
Qué entidades llevan dígito y cuáles letra es una maraña aparte: A, B, E y
H llevan el dígito; N, P, Q, R, S y W una letra de JABCDEFGHI;
C, D, F, G, J, U y V admiten cualquiera de las dos. Los
identificadores de persona física siguen otro algoritmo: el DNI son ocho cifras
módulo 23 sobre TRWAGMYFPDXBNJZSQVHLCKE, y el NIE lo mismo leyendo X, Y,
Z como 0, 1 y 2. Sobre K, L y M no nos pronunciamos, porque sus reglas se
han movido y un «inválido» equivocado es peor que un «no lo sé» honesto.
Validar en la frontera. Nunca rechazar antes de mirar.
La tentación es rechazar un carácter de control erróneo en la puerta. No lo hacemos, deliberadamente, y la razón es que guardamos datos recolectados de fuentes que tampoco son perfectas. Si una correspondencia de nuestra tabla tiene el control roto, negarse a buscarla significa negarse a devolver una fila que sí tenemos: un falso negativo introducido por la validación, que es el peor tipo.
Así que la aritmética se ejecuta solo después de que la consulta falle. Un acierto se devuelve diga lo que diga su carácter de control. Un fallo recibe la razón honesta:
{
"error": "nif_check_character_failed",
"nif": "B42413283",
"format_valid": true,
"check_character_valid": false,
"corrected_check_character": "B42413286",
"note": "…para B4241328 es 6, no 3. Este identificador no ha podido emitirse a
nadie: es una errata o una invención, no un hueco de cobertura, y no
lo tendrá ninguna fuente."
}
Cero falsos negativos, y quien consulta sabe ya que debe revisar su propia factura en lugar de buscar un proveedor de datos mejor.
Después lo apuntamos contra nosotros mismos
Esa es la mitad aburrida. La interesante es lo que ocurre cuando pasas la misma aritmética por tu propia tabla.
Guardamos 527.318 correspondencias NIF→empresa, cruzadas desde dieciocho fuentes, porque el BORME no publica ningún identificador fiscal. Diecinueve fallan su propio carácter de control: un 0,0036%, que suena a error de redondeo hasta que preguntas dónde están esas diecinueve.
| Tipo de fuente | Correspondencias | Erróneas | Tasa |
|---|---|---|---|
| Registros y catálogos oficiales estructurados | 432.860 | 0 | 0% |
| Portales de contratación pública | 91.436 | 4 | 0,004% |
| Avisos legales de webs de empresa | 780 | 1 | 0,128% |
| Nuestro analizador sobre el texto libre del BORME | 2.242 | 14 | 0,624% |
Todos los registros y catálogos oficiales estructurados —432.860 correspondencias, GLEIF, BDNS y AEAT entre ellas— están perfectamente limpios. No «suficientemente limpios». Cero.
Y la única fuente que lee el identificador de una frase en lugar de una columna clave acumula 14 de los 19 fallos, a 173 veces la tasa general.
Más que una sorpresa, es una confirmación con un número al lado. Cuando un registro guarda un NIF, lo guarda como identificador: algo lo validó al entrar y desde entonces ha sido clave primaria. Cuando nuestro propio analizador extrae un NIF de una frase del boletín —una frase que ha pasado por composición tipográfica, generación de PDF y nuestra expresión regular— nada entre la notaría y nosotros ha comprobado jamás la aritmética. El carácter de control es el único sitio donde esa corrupción se vuelve visible.
Tres de los cuatro fallos de los portales de contratación son un problema de
otra naturaleza. B0011479C está sobre MOOG SARL, B0041480E sobre RÖSLER
INTERNATIONAL GMBH & CO KG, W48083521 sobre QBE EUROPE SA/NV. No son NIF
españoles corrompidos: son identificadores extranjeros escritos en un campo
etiquetado como NIF, por un proveedor que no tenía ninguno español que poner ahí.
La aritmética no puede decírtelo, pero sí puede decirte dónde mirar.
La trampa del «quizá quiso decir»
La función obvia que viene después son las sugerencias, y es mejor de lo que
parece a primera vista. Bajo el algoritmo del CIF, cada posición del cuerpo
admite exactamente un dígito de reemplazo que cierra la aritmética, así que un
identificador de nueve caracteres tiene justo ocho correcciones de un solo
carácter: una lista corta, no un espacio de búsqueda. B42413283 da B42413286
y siete más.
Entonces cruzamos esos candidatos con la tabla, y los datos replicaron. De las diecinueve correspondencias rotas que guardamos, ninguna tenía su corrección del carácter de control en la tabla. Tres tenían un vecino a un dígito sin relación alguna. BROS MAQUINARIA SL tenía tres vecinos a la vez —CERTIS CORP SL, NARANJAS DEL SURESTE SL y SOFTWARE MAQUINARIA Y MANTENIMIENTO SL— y ninguna lectura de esos nombres los convierte en la misma empresa.
La aritmética hace justo lo que cabe esperar. Guardamos del orden de medio millón de identificadores; un prefijo admite diez millones. Un candidato a un dígito de distancia cae por tanto sobre alguna empresa real quizá una de cada veinte veces, por pura coincidencia, y ofrecer siete le da a la coincidencia siete oportunidades. Así que las sugerencias se publican con su procedencia al lado: la corrección del carácter de control se ofrece sin más, y un vecino a un dígito va etiquetado como tal y con el aviso de que tiene tantas papeletas de ser un desconocido como tu empresa.
Si cruzas identificadores de más de una fuente, pasa la aritmética por tu tabla entera una vez. La nuestra tardó menos de un minuto y señaló la fuente débil sin discusión.