create or alter procedure verifica_documento_esp_nif (
numero_documento varchar(20))
returns (
valido smallint,
mensaje_error varchar(100))
AS
declare variable digito_verificador varchar(1);
declare variable digito_documento varchar(1);
declare variable aux varchar(20);
declare variable letra_principio varchar(1);
declare variable letra_final varchar(1);
declare variable numero varchar(20);
declare variable contador integer;
declare variable fin_contador integer;
declare variable sumatoria integer;
declare variable resto integer;
begin
-- Inicializamos variables
valido = 1;
mensaje_error = '';
if (char_length(numero_documento) > 0) then
begin
-- Limpieza de documento (solo letras y numeros)
numero_documento = upper(numero_documento);
contador = 1;
aux = '';
while (contador <= char_length(numero_documento)) do
begin
digito_documento = substring(numero_documento from contador for 1);
if ((digito_documento between 'A' and 'Z') or
((digito_documento between '0' and '9'))) then
aux = aux || digito_documento;
contador = contador + 1;
end
numero_documento = aux;
if (char_length(numero_documento) > 0) then
begin
if (substring(numero_documento from 1 for 2) = 'ES') then
numero_documento = substring(numero_documento from 3 for char_length(numero_documento));
letra_principio = substring(numero_documento from 1 for 1);
letra_final = substring(numero_documento from char_length(numero_documento) for 1);
if (letra_principio between '0' and '9') then
letra_principio = '';
if (letra_final between '0' and '9') then
letra_final = '';
if (letra_principio = '') then
contador = 1;
else
contador = 2;
if (letra_final = '') then
fin_contador = char_length(numero_documento);
else
fin_contador = char_length(numero_documento) - 1;
numero = '';
while (contador <= fin_contador) do
begin
digito_documento = substring(numero_documento from contador for 1);
if (digito_documento between '0' and '9') then
numero = numero || digito_documento;
else
begin
valido = 0;
mensaje_error = '(1) El formato del numero es incorrecto';
end
contador = contador + 1;
end
if ((valido = 1) and
(char_length(numero_documento) = 9)) then
begin
if ((letra_principio = '') or
((letra_principio in ('X', 'Y', 'Z')))) then
begin
-- Es un NIE. (Numero de identificacion de extranjero)
if (letra_principio = 'X') then
numero = '0' || numero;
if (letra_principio = 'Y') then
numero = '1' || numero;
if (letra_principio = 'Z') then
numero = '2' || numero;
resto = numero - (trunc(numero / 23) * 23);
digito_verificador = substring('TRWAGMYFPDXBNJZSQVHLCKET' from 1 + resto for 1);
if (digito_verificador <> letra_final) then
begin
valido = 0;
mensaje_error = '(3) NIE no valido' || ' - ' || digito_verificador || '<>' || letra_final;
end
end
else
if (letra_principio in ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K',
'L', 'M', 'N', 'P', 'Q', 'S', 'U', 'V', 'W', 'R')) then
begin
-- Es un NIF (Numero de identificacion fiscal
if (letra_final > '') then
begin
if (letra_final in ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J')) then
-- Convierte la letra final en un numero (es el dig. control)
letra_final = substring('0123456789' from position(letra_final, 'JABCDEFGHI') for 1);
else
begin
valido = 0;
mensaje_error = '(4) NIF no valido';
end
end
else
begin
letra_final = substring(numero_documento from char_length(numero_documento) for 1);
numero_documento = substring(numero_documento from 1 for char_length(numero_documento) - 1);
end
if (valido = 1) then
begin
-- Sumamos posiciones pares
sumatoria = substring(numero_documento from 3 for 1) + substring(numero_documento from 5 for 1) + substring(numero_documento from 7 for 1);
contador = substring(numero_documento from 2 for 1) * 2;
if (contador > 9) then
contador = substring(contador from 1 for 1) + substring(contador from 2 for 1);
sumatoria = sumatoria + contador;
contador = substring(numero_documento from 4 for 1) * 2;
if (contador > 9) then
contador = substring(contador from 1 for 1) + substring(contador from 2 for 1);
sumatoria = sumatoria + contador;
contador = substring(numero_documento from 6 for 1) * 2;
if (contador > 9) then
contador = substring(contador from 1 for 1) + substring(contador from 2 for 1);
sumatoria = sumatoria + contador;
contador = substring(numero_documento from 8 for 1) * 2;
if (contador > 9) then
contador = substring(contador from 1 for 1) + substring(contador from 2 for 1);
sumatoria = sumatoria + contador;
if (sumatoria > 9) then
sumatoria = substring(sumatoria from 2 for 1);
sumatoria = 10 - sumatoria;
if (sumatoria = 10) then
sumatoria = 0;
if (sumatoria <> letra_final) then
begin
valido = 0;
mensaje_error = '(5) NIF no valido';
end
end
end
else
begin
valido = 0;
mensaje_error = '(6) Letra inicial invalida';
end
end
else
begin
valido = 0;
mensaje_error = '(2) Longitud incorrecta';
end
end
end
suspend;
end