2024-01-15 11:31:03 +00:00
|
|
|
DELIMITER $$
|
2024-07-22 09:52:42 +00:00
|
|
|
CREATE OR REPLACE DEFINER=`vn-admin`@`localhost` FUNCTION `vn`.`testCIF`(vCIF VARCHAR(9))
|
2024-01-15 11:31:03 +00:00
|
|
|
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 ;
|