DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`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 ;