CREATE OR REPLACE FUNCTION isos.fn_cancelar_compra(
        p_id_empresa integer,
        p_id_compra integer,
        p_usuario character varying
    ) RETURNS boolean AS $BODY$
DECLARE 
    p_id_empresa alias for $1;
    p_id_compra alias for $2;
    p_usuario alias for $3;
    f0 record;
    v_total numeric := 0;
    v_total_pagos numeric := 0;
    v_id_deuda bigint := 0;
BEGIN FOR f0 IN (
    SELECT tp.nombre
    FROM isos.compra c
    INNER JOIN isos.tipo_pago tp ON (c.id_tipopago = tp.id_tipopago)
    WHERE c.cod_estado <> 'CA' AND c.id_empresa = p_id_empresa AND c.id_compra = p_id_compra
) LOOP
	SELECT T1.total,
    COALESCE(SUM(T1.monto), 0) INTO v_total,
    v_total_pagos
    FROM (
        SELECT CASE WHEN c0.id_tipomoneda = mp0.id_tipomoneda THEN mp0.monto_cobrado
                ELSE CASE
                    WHEN tm0.es_base = 1 THEN mp0.monto_cobrado * mp0.tasa_cambio
                    ELSE mp0.monto_cobrado / mp0.tasa_cambio
                END
            END AS monto,
            c0.total,
            mp0.id_movimiento,
            mp0.item
        FROM isos.compra c0
        LEFT JOIN isos.movimiento mo0 ON (mo0.id_referencia = c0.id_compra AND mo0.tabla_referencia = 'COMPRA'  AND mo0.estado = 'A' AND mo0.id_empresa = p_id_empresa)
        LEFT JOIN isos.movimiento_pago mp0 ON (mp0.id_movimiento = mo0.id_movimiento)
        LEFT JOIN isos.tipo_moneda tm0 ON (c0.id_tipomoneda = tm0.id_tipomoneda)
        WHERE c0.id_compra = p_id_compra
        UNION
        SELECT CASE WHEN c1.id_tipomoneda = mp1.id_tipomoneda THEN 
                    mp1.monto_cobrado
                ELSE 
                    CASE WHEN tm1.es_base = 1 THEN 
                        mp1.monto_cobrado * mp1.tasa_cambio
                    ELSE mp1.monto_cobrado / mp1.tasa_cambio
                END
            END AS monto,
            c1.total,
            mp1.id_movimiento,
            mp1.item
        FROM isos.compra c1
        LEFT JOIN isos.deuda de on (de.id_compra = c1.id_compra AND de.estado = 'A')
        LEFT JOIN isos.movimiento mo1 ON (mo1.id_referencia = de.id_deuda AND mo1.tabla_referencia = 'DEUDA' AND mo1.estado = 'A' AND mo1.id_empresa = p_id_empresa)
        LEFT JOIN isos.movimiento_pago mp1 ON (mp1.id_movimiento = mo1.id_movimiento)
        LEFT JOIN isos.tipo_moneda tm1 ON (de.id_tipomoneda = tm1.id_tipomoneda)
        WHERE c1.id_compra = p_id_compra
        UNION
        SELECT CASE
                WHEN c2.id_tipomoneda = mp2.id_tipomoneda THEN mp2.monto_cobrado
                ELSE CASE
                    WHEN tm2.es_base = 1 THEN mp2.monto_cobrado * mp2.tasa_cambio
                    ELSE mp2.monto_cobrado / mp2.tasa_cambio
                END
            END AS monto,
            c2.total,
            mp2.id_movimiento,
            mp2.item
        FROM isos.orden_compra oc
            INNER JOIN isos.compra c2 ON (oc.id_ordencompra = c2.id_ordencompra)
            LEFT JOIN isos.movimiento mo2 ON (mo2.id_referencia = oc.id_ordencompra AND mo2.tabla_referencia = 'ORDEN_COMPRA' AND mo2.id_empresa = p_id_empresa)
            LEFT JOIN isos.movimiento_pago mp2 ON (mp2.id_movimiento = mo2.id_movimiento)
            LEFT JOIN isos.tipo_moneda tm2 ON (oc.id_tipomoneda = tm2.id_tipomoneda)
        WHERE c2.id_compra = p_id_compra
    ) T1
    GROUP BY T1.total;
    -- RAISE NOTICE 'v_total_pagos: %', v_total_pagos;
    v_total = ROUND(v_total, 2);
    v_total_pagos = ROUND(v_total_pagos, 2);
    IF(v_total <= v_total_pagos) THEN 
        IF(f0.nombre = 'CREDITO') THEN
            SELECT id_deuda INTO v_id_deuda
            FROM isos.deuda
            WHERE id_compra = p_id_compra;
            UPDATE isos.deuda
            SET cod_estado = 'CA'
            WHERE id_deuda = v_id_deuda;
            UPDATE isos.deuda_detalle
            SET cod_estado = 'CA'
            WHERE id_deuda = v_id_deuda;
        END IF;
            UPDATE isos.compra
            SET cod_estado = 'CA',
                usuario_modificacion = p_usuario,
                fecha_modificacion = NOW()
            WHERE id_empresa = p_id_empresa AND id_compra = p_id_compra;
            RETURN TRUE;
        END IF;
    END LOOP;
RETURN FALSE;
END;
$BODY$ LANGUAGE plpgsql VOLATILE COST 100;