-- >>> obtiene el valor de INPC
DELIMITER $$
DROP FUNCTION IF EXISTS obtieneInpc;
CREATE FUNCTION obtieneInpc
(periodo$ DATE)
RETURNS FLOAT
BEGIN
	-- variable que retorna
	DECLARE resultset FLOAT;
	CASE MONTH(periodo$)
		WHEN 01 THEN SET resultset := (SELECT diciembre FROM inpc WHERE periodo = YEAR(periodo$) - 1);
		WHEN 02 THEN SET resultset := (SELECT enero FROM inpc WHERE periodo = YEAR(periodo$));
		WHEN 03 THEN SET resultset := (SELECT febrero FROM inpc WHERE periodo = YEAR(periodo$));
		WHEN 04 THEN SET resultset := (SELECT marzo FROM inpc WHERE periodo = YEAR(periodo$));
		WHEN 05 THEN SET resultset := (SELECT abril FROM inpc WHERE periodo = YEAR(periodo$));
		WHEN 06 THEN SET resultset := (SELECT mayo FROM inpc WHERE periodo = YEAR(periodo$));
		WHEN 07 THEN SET resultset := (SELECT junio FROM inpc WHERE periodo = YEAR(periodo$));
		WHEN 08 THEN SET resultset := (SELECT julio FROM inpc WHERE periodo = YEAR(periodo$));
		WHEN 09 THEN SET resultset := (SELECT agosto FROM inpc WHERE periodo = YEAR(periodo$));
		WHEN 10 THEN SET resultset := (SELECT septiembre FROM inpc WHERE periodo = YEAR(periodo$));
		WHEN 11 THEN SET resultset := (SELECT octubre FROM inpc WHERE periodo = YEAR(periodo$));
		WHEN 12 THEN SET resultset := (SELECT noviembre FROM inpc WHERE periodo = YEAR(periodo$));
		ELSE SET resultset = 0;
	END CASE;
	RETURN resultset;
END
$$

-- >>> da formato a las fechas
DELIMITER $$
DROP FUNCTION IF EXISTS fechas;
CREATE FUNCTION fechas
(fecha$ DATE, formato$ INT)
RETURNS VARCHAR(30)
BEGIN
	CASE formato$
	WHEN 2 THEN RETURN CONCAT(mes(MONTH(fecha$)), ' del ', YEAR(fecha$));
	WHEN 3 THEN RETURN CONCAT(DAY(fecha$), ' de ', mes(MONTH(fecha$)), ' del ', YEAR(fecha$));
	ELSE RETURN '';
	END CASE;
END
$$

-- >>> mes en texto
DELIMITER $$
DROP FUNCTION IF EXISTS mes;
CREATE FUNCTION mes
(mes$ INT)
RETURNS VARCHAR(20)
BEGIN
	CASE mes$
	WHEN 1 THEN RETURN 'Enero';
	WHEN 2 THEN RETURN 'Febrero';
	WHEN 3 THEN RETURN 'Marzo';
	WHEN 4 THEN RETURN 'Abril';
	WHEN 5 THEN RETURN 'Mayo';
	WHEN 6 THEN RETURN 'Junio';
	WHEN 7 THEN RETURN 'Julio';
	WHEN 8 THEN RETURN 'Agosto';
	WHEN 9 THEN RETURN 'Septiembre';
	WHEN 10 THEN RETURN 'Octubre';
	WHEN 11 THEN RETURN 'Noviembre';
	WHEN 12 THEN RETURN 'Diciembre';
	ELSE RETURN '';
	END CASE;
END
$$

-- >>> da formato de pesos
DELIMITER $$
DROP FUNCTION IF EXISTS moneda;
CREATE FUNCTION moneda
(valor$ FLOAT)
RETURNS VARCHAR(20)
BEGIN
	-- variable que retorna
	DECLARE resultset VARCHAR(20);
	SET resultset = CONCAT('$', FORMAT(valor$, 2));
	RETURN resultset;
END
$$

-- >>> genera string aleatorio de 8 caracteres
DELIMITER $$
DROP FUNCTION IF EXISTS clave;
CREATE FUNCTION clave
()
RETURNS VARCHAR(8)
BEGIN
	-- variable que retorna
	DECLARE resultset VARCHAR(8);
	-- genera clave
	SET resultset := (SELECT LPAD(CONV(FLOOR(RAND() * POW(36, 10)), 10, 36), 8, '0'));
	RETURN resultset;
END
$$

-- >>> estados de las columnas estado
DELIMITER $$
DROP FUNCTION IF EXISTS estados;
CREATE FUNCTION estados
(estado$ INT)
RETURNS VARCHAR(100)
BEGIN
	-- switch
	CASE estado$
		WHEN 11 THEN RETURN 'Activo';
		WHEN 10 THEN RETURN 'Inactivo';
		WHEN 80 THEN RETURN 'Histórico';
		WHEN 30 THEN RETURN 'Cancelado';
		WHEN 211 THEN RETURN 'Terreno';
		WHEN 212 THEN RETURN 'Casa';
		WHEN 213 THEN RETURN 'Casa Condominio / En Renta';
		WHEN 66 THEN RETURN 'No Socio';
		WHEN 88 THEN RETURN 'Socio';
		WHEN 51 THEN RETURN 'Sin Acreditar';
		WHEN 52 THEN RETURN 'En Construcción';
		WHEN 53 THEN RETURN 'Litigo';
		WHEN 54 THEN RETURN 'Normal';
		WHEN 55 THEN RETURN 'En Remodelación';
		WHEN 56 THEN RETURN 'Sin Escriturar';
		WHEN 18 THEN RETURN 'Teléfono';
		WHEN 184 THEN RETURN 'Teléfono Principal';
		WHEN 181 THEN RETURN 'Correo';
		WHEN 1814 THEN RETURN 'Correo Principal';
		WHEN 1 THEN RETURN 'Teléfono de Casa';
		WHEN 33 THEN RETURN 'Bloqueado';
        WHEN 800 THEN RETURN 'Baja';
		ELSE RETURN ''; 
	END CASE;
END
$$

-- >>> descifra datos
DELIMITER $$
DROP FUNCTION IF EXISTS descifrar;
CREATE FUNCTION descifrar
(dato$ BLOB)
RETURNS VARCHAR(200)
BEGIN
	-- variable que retorna
	DECLARE resultset VARCHAR(200);
	-- desifra el datos
	SET resultset = CAST(AES_DECRYPT(dato$, 'Iapsah123.colinas') AS VARCHAR(200));
	-- retorna valor en string
	RETURN resultset;
END
$$

-- >>> cifra datos
DELIMITER $$
DROP FUNCTION IF EXISTS cifrar;
CREATE FUNCTION cifrar
(dato$ VARCHAR(200))
RETURNS BLOB
BEGIN
	-- variable que retorna
	DECLARE resultset BLOB;
	-- cifra el datos enviado
	SET resultset = AES_ENCRYPT(dato$, 'Iapsah123.colinas');
	-- retorna el valor cifrado
	RETURN resultset;
END
$$
