DELIMITER $$
DROP PROCEDURE IF EXISTS iuInpc;
CREATE PROCEDURE iuInpc
(periodo$ INT, mes$ INT, valor$ FLOAT)
BEGIN
	IF NOT EXISTS (SELECT *FROM inpc WHERE periodo = periodo$) THEN
		INSERT INTO inpc() VALUES(periodo$, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
	END IF;
	CASE mes$
		WHEN 1 THEN UPDATE inpc SET enero = valor$ WHERE periodo = periodo$;
		WHEN 2 THEN UPDATE inpc SET febrero = valor$ WHERE periodo = periodo$;
		WHEN 3 THEN UPDATE inpc SET marzo = valor$ WHERE periodo = periodo$;
		WHEN 4 THEN UPDATE inpc SET abril = valor$ WHERE periodo = periodo$;
		WHEN 5 THEN UPDATE inpc SET mayo = valor$ WHERE periodo = periodo$;
		WHEN 6 THEN UPDATE inpc SET junio = valor$ WHERE periodo = periodo$;
		WHEN 7 THEN UPDATE inpc SET julio = valor$ WHERE periodo = periodo$;
		WHEN 8 THEN UPDATE inpc SET agosto = valor$ WHERE periodo = periodo$;
		WHEN 9 THEN UPDATE inpc SET septiembre = valor$ WHERE periodo = periodo$;
		WHEN 10 THEN UPDATE inpc SET octubre = valor$ WHERE periodo = periodo$;
		WHEN 11 THEN UPDATE inpc SET noviembre = valor$ WHERE periodo = periodo$;
		WHEN 12 THEN UPDATE inpc SET diciembre = valor$ WHERE periodo = periodo$;
		ELSE SELECT '';
	END CASE;
    update mantto set indice = obtieneIndice(periodo, curdate()) where recibo < 0;
END
$$

-- >>> registra los conceptos de servicio
/*DELIMITER $$
DROP PROCEDURE IF EXISTS cobranzaServicio;
CREATE PROCEDURE cobranzaServicio
(servicio$ VARCHAR(10), cantidad$ INT, usuario$ VARCHAR(10))
BEGIN
	-- variable para id del servicio
	DECLARE servicio_$ INT;
	SET servicio_$ := (SELECT id FROM servicios WHERE clave = servicio$ AND estado = 11);
	IF NOT EXISTS (SELECT *FROM servicio WHERE estado = usuario$ AND recibo = 0) THEN
		INSERT INTO servicio(recibo, concepto, cantidad, estado)
		VALUES(0, servicio_$, cantidad$, usuario$);
	ELSE
		UPDATE servicio SET concepto = servicio_$, cantidad = cantidad$ WHERE estado = usuario$ AND recibo = 0;
	END IF;
	SELECT ss.descripcion AS servicio, moneda(ss.importe) AS importe, s.cantidad AS cantidad, moneda(ss.importe*s.cantidad) AS total
	FROM servicio AS s JOIN servicios AS ss ON s.concepto = ss.id WHERE s.estado = usuario$;
END
$$

-- >>> limpia la cobranza por usuario, todo o por periodo
DELIMITER $$
DROP PROCEDURE IF EXISTS dCobranza;
CREATE PROCEDURE dCobranza
(usuario$ VARCHAR(10), periodo$ DATE)
BEGIN
	-- elimina un periodo
	IF periodo$ = '0000-00-00' THEN
		DELETE FROM mantto WHERE recibo = 0 AND estado = usuario$;
	ELSEIF periodo$ = '0000-08-08' THEN
		DELETE FROM servicio WHERE estado = usuario$;
	ELSE
		DELETE FROM mantto WHERE recibo = 0 AND estado = usuario$ AND periodo = periodo$;
	END IF;
END
$$*/

-- >>> realiza calculo de cobranza
DELIMITER $$
DROP PROCEDURE IF EXISTS cobranzaMantto;
CREATE PROCEDURE cobranzaMantto
(predio$ varchar(8), inicio$ DATE, fin$ DATE, usuario$ varchar(10))
BEGIN
	set inicio$ = date_format(inicio$, '%y-%m-01');
    set fin$ = date_format(fin$, '%y-%m-01');
    update mantto set estado = '' where estado = usuario$;
    update mantto set descuento = obtieneDescuento(inicio$, fin$), estado = usuario$ where recibo = (predio$*-1) and periodo between inicio$ and fin$;
    drop temporary table if exists deuda_mantto;
    create temporary table deuda_mantto(
        concepto varchar(30) not null,
        periodo date not null,
        cuota decimal(10,2) not null,
        descuento decimal(10,2) not null,
        actualizacion decimal(10,2) not null,
        recargo decimal(10,2) not null,
        total decimal(10,2) null,
        pago decimal(10,2) not null
    );
    insert into deuda_mantto(concepto, periodo, cuota, descuento, actualizacion, recargo, total, pago)
    select fechas(m.periodo, 2), m.periodo, case when m.pago = 1 then c.cuota else m.pago end, calculaDescuento(m.descuento, case when m.pago = 1 then c.cuota else m.pago end), calculaActualizacion(m.indice, case when m.pago = 1 then c.cuota else m.pago end), calculaRecargo(m.periodo, curdate(), case when m.pago = 1 then c.cuota else m.pago end, m.recargo, m.indice), null, m.pago
    from mantto as m
    inner join cuotas as c on m.cuota = c.id
    where m.recibo = (predio$*-1) and m.periodo between inicio$ and fin$;
    update deuda_mantto set total = (cuota-descuento+actualizacion+recargo);
    select *from deuda_mantto;
    select sum(cuota) as cuotas, sum(descuento) as descuentos, sum(actualizacion) as actualizaciones, sum(recargo) as recargo, sum(total) as total from deuda_mantto;
    drop temporary table deuda_mantto;
end
$$

-- >>> busca los servicios por descripcion
DELIMITER $$
DROP PROCEDURE IF EXISTS mapServicios;
CREATE PROCEDURE mapServicios
(map$ VARCHAR(100))
BEGIN
	-- variable para buscar
	DECLARE map_$ VARCHAR(100);
	SET map_$ = CONCAT('%', map$, '%');
	SELECT clave AS clave, descripcion AS servicio, importe AS valor FROM servicios WHERE descripcion LIKE map_$ AND estado = 11 ORDER BY descripcion;
END
$$

-- >>> consulta el historico de servicios
DELIMITER $$
DROP PROCEDURE IF EXISTS cHistoricoServicio;
CREATE PROCEDURE cHistoricoServicio
(servicio$ VARCHAR(10))
BEGIN
	-- consulta los costos que ah tenido el producto
	SELECT importe AS importe, estados(estado) AS estado, fechas(registro, 3) AS registro
	FROM servicios WHERE clave = servicio$ ORDER BY estado;
END
$$

-- >>> registra los servicios
DELIMITER $$
DROP PROCEDURE IF EXISTS iServicio;
CREATE PROCEDURE iServicio
(clave$ VARCHAR(10), descripcion$ VARCHAR(100), importe$ FLOAT)
BEGIN
	-- si la clave esta vacia es un nuevo servicio
	IF clave$ = '' THEN
		INSERT INTO servicios(clave, descripcion, importe)
		VALUES(clave(), UPPER(descripcion$), importe$);
		IF (ROW_COUNT()) = 1 THEN
			SELECT 800 AS estado, 'Se registró el servicio' AS mssg;
		ELSE
			SELECT 500 AS estado, 'Intenta de nuevo' AS mssg;
		END IF;
	ELSE
		UPDATE servicios SET estado = 80 WHERE clave = clave$;
		INSERT INTO servicios(clave, descripcion, importe)
		VALUES(clave$, UPPER(descripcion$), importe$);
		IF (ROW_COUNT()) = 1 THEN
			SELECT 800 AS estado, 'Se actualizó el costo del servicio' AS mssg;
		ELSE
			SELECT 500 AS estado, 'Intenta de nuevo' AS mssg;
		END IF;
	END IF;
END	
$$

-- >>> registra la tasa de recargo
DELIMITER $$
DROP PROCEDURE IF EXISTS iRecargo;
CREATE PROCEDURE iRecargo
(recargo$ FLOAT)
BEGIN
	-- cambia de estado los registros y registra la nueva tasa
	UPDATE recargos SET estado = 80;
	INSERT INTO recargos(recargo)
	VALUES(recargo$);
	IF (ROW_COUNT()) = 1 THEN
		SELECT 800 AS estado, 'Se actualizó la tasa de recargo' AS mssg;
    update mantto set recargo = obtieneRecargo(periodo) where recibo < 0;
	ELSE
		SELECT 500 AS estado, 'Intenta de nuevo' AS mssg;
	END IF;
END
$$

-- >>> registra los descuentos
DELIMITER $$
DROP PROCEDURE IF EXISTS iDescuento;
CREATE PROCEDURE iDescuento
(descuento$ FLOAT, inicio$ DATE, fin$ DATE, vigencia$ DATE)
BEGIN
	-- valida que el descuento no exists
	IF NOT EXISTS (SELECT id FROM descuentos WHERE inicio = inicio$ AND fin = fin$ AND vigencia = vigencia$) THEN
		INSERT INTO descuentos(descuento, inicio, fin, vigencia)
		VALUES(descuento$, inicio$, fin$, vigencia$);
		IF (ROW_COUNT()) = 1 THEN
			SELECT 800 AS estado, 'Se registró el descuento' AS mssg;
		ELSE
			SELECT 500 AS estado, 'Intenta de nuevo' AS mssg;
		END IF;
	ELSE
		SELECT 500 AS estado, CONCAT('Ya existe el descuento con vigencia al: ', fechas(vigencia$, 3)) AS mssg;
	END IF; 
END
$$

-- >>> registra las cuotas de mantenimiento
DELIMITER $$
DROP PROCEDURE IF EXISTS iCuota;
CREATE PROCEDURE iCuota
(periodo$ INT, cuota$ FLOAT, uso$ VARCHAR(10))
BEGIN
	-- valida que no exista la cuota del periodo
	IF NOT EXISTS (SELECT id FROM cuotas WHERE periodo = periodo$ AND uso = uso$) THEN
		INSERT INTO cuotas(periodo, cuota, uso)
		VALUES(periodo$, cuota$, uso$);
		IF (ROW_COUNT()) = 1 THEN
			SELECT 800 AS estado, 'Se registró la cuota' AS mssg;
		ELSE
			SELECT 500 AS estado, 'Intenta de nuevo' AS mssg;
		END IF;
	ELSE
		SELECT 500 AS estado, 'Ya existe la cuota del periodo' AS mssg;
	END IF;
END
$$
