salix/db/routines/vn/functions/testCIF.sql

74 lines
1.5 KiB
SQL

DELIMITER $$
CREATE OR REPLACE DEFINER=`vn-admin`@`localhost` FUNCTION `vn`.`testCIF`(vCIF VARCHAR(9))
RETURNS varchar(10) CHARSET utf8mb3 COLLATE utf8mb3_unicode_ci
DETERMINISTIC
BEGIN
DECLARE vLetraInicial VARCHAR(1);
DECLARE vLetraFinal VARCHAR(1);
DECLARE vParteNumerica VARCHAR(7);
DECLARE vSuma INT DEFAULT 0;
DECLARE vNumero INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
DECLARE vResult BOOL DEFAULT FALSE;
SET vLetraInicial = SUBSTR(vCIF, 1, 1);
SET vLetraFinal = SUBSTR(vCIF, 9, 1);
SET vParteNumerica = SUBSTR(vCIF, 2, 7);
WHILE i < 7 DO
SET i = i + 1;
SET vNumero = CAST(SUBSTR(vParteNumerica, i, 1) AS DECIMAL(1,0));
IF i MOD 2 THEN
SET vNumero = vNumero * 2;
SET vNumero = vNumero MOD 10 + FLOOR(vNumero/10);
END IF;
SET vSuma = vSuma + vNumero;
END WHILE;
SET vSuma = vSuma MOD 10;
IF vSuma > 0 THEN
SET vSuma = 10 - vSuma;
END IF;
-- Comprobación de dígito de control
IF CAST(vLetraFinal AS DECIMAL(1,0)) = vSuma THEN
SET vResult = TRUE;
END IF;
IF vSuma = 0 THEN
SET vSuma = 10;
END IF;
IF CHAR(64 + vSuma) = vLetraFinal THEN
SET vResult = TRUE;
END IF;
-- Sólo se aceptan letras como caracter inicial
IF ASCII(vLetraInicial) < 65 OR ASCII(vLetraInicial) > 87 THEN -- Ha de ser entre la A y la W
SET vResult = FALSE;
END IF;
RETURN vResult;
END$$
DELIMITER ;