delimiter $$
drop function if exists saldo_cuotas_predio;
/*create function saldo_cuotas_predio
(inicio$ int, fin$ int, predio$ varchar(8))
returns decimal(10,2)
begin
    declare periodo_$ int default(inicio$);
    declare cuota_$ decimal(8,2);
    declare fecha_$ date;
    declare resultset decimal(10,2);
    declare estado_$ int;
    declare predio_$ int default(select id from predios where descifrar(predio) = predio$ and estado_registro = 11);
    declare mes_$ int;
    declare pagado_$ decimal(8,2);
    declare parcial_$ decimal(8,2);
    set resultset = 0;
    periodo: loop
    set mes_$ = 1;
    set cuota_$ := (select cuota from cuotas where id = obtieneCuota(predio_$, periodo_$));
    while mes_$ <= 12 do
        set fecha_$ = concat(periodo_$,'-',mes_$,'-01');
        set estado_$ = estadoPeriodo(fecha_$, predio$);
        if estado_$ = 404 then
            set resultset = resultset + cuota_$;
        elseif estado_$ = 100 then
            set pagado_$ := (select sum(m.pago) from mantto as m inner join recibos as r on m.recibo = r.id inner join predios as p on r.predio = p.id where descifrar(p.predio) = predio$ and m.periodo = fecha_$);
            set parcial_$ = (cuota_$ - pagado_$);
            set resultset = resultset + parcial_$;
        end if;
        set mes_$ = mes_$ + 1;
    end while;
    if periodo_$ = fin$ then
        leave periodo;
    end if;
    set periodo_$ = periodo_$ + 1;
    end loop;
    return resultset;
end*/
$$

DELIMITER $$
DROP FUNCTION IF EXISTS saldo_predio;
CREATE FUNCTION saldo_predio
(predio$ int)
RETURNS DECIMAL(10, 2)
BEGIN
    declare resultset decimal(10, 2) default(0);
    declare cuotas float;
    declare actualizaciones float;
    declare recargos float;
    
    if exists (select 88 from mantto where recibo = predio$ and periodo <= last_day(curdate())) then
    set cuotas := (select sum(case when m.pago = 1 then c.cuota else m.pago end) from mantto as m inner join cuotas as c on m.cuota = c.id where m.recibo = predio$ and m.periodo <= last_day(curdate()));
    set actualizaciones := (select sum(calculaActualizacion(m.indice, case when m.pago = 1 then c.cuota else m.pago end)) from mantto as m inner join cuotas as c on m.cuota = c.id where m.recibo = predio$ and m.periodo <= last_day(curdate()));
    set recargos := (select sum(calculaRecargo(m.periodo, curdate(), case when m.pago = 1 then c.cuota else m.pago end, m.recargo, m.indice)) from mantto as m inner join cuotas as c on m.cuota = c.id where m.recibo = predio$ and m.periodo <= last_day(curdate()));
    set resultset = cast((cuotas+actualizaciones+recargos) as decimal(10,2));
end if;
    return resultset;
END
$$
