CREATE OR ALTER PROCEDURE SP_CFE_FORMA_PAGAMENTO (
    PDV_CFE_ID INTEGER,
    ACAO INTEGER = 1)
AS
DECLARE VARIABLE VALOR_LIQUIDO NUMERIC(15,2);
DECLARE VARIABLE PDV_DEVOLUCAO_TROCA_ID INTEGER;
DECLARE VARIABLE PDV_MOVIMENTO_DETALHE_ID INTEGER;

DECLARE VARIABLE OLD_SALDO_DEVOLUCAO NUMERIC(15,2);
DECLARE VARIABLE NEW_SALDO_DEVOLUCAO NUMERIC(15,2);
DECLARE VARIABLE OLD_SALDO_DEPOSITO NUMERIC(15,2);
DECLARE VARIABLE NEW_SALDO_DEPOSITO NUMERIC(15,2);

BEGIN

    FOR SELECT
        CAST(ROUND(A.VALOR_LIQUIDO - A.TROCO, 2) AS NUMERIC(15,2)) AS VALOR_LIQUIDO,
        COALESCE(A.PDV_DEVOLUCAO_TROCA_ID, 0) AS PDV_DEVOLUCAO_TROCA_ID,
        COALESCE(A.PDV_MOVIMENTO_DETALHE_ID, 0) AS PDV_MOVIMENTO_DETALHE_ID
    FROM TBPDV_CFE_FORMA_PAGAMENTO A
    WHERE A.PDV_CFE_ID = :PDV_CFE_ID
    INTO :VALOR_LIQUIDO, :PDV_DEVOLUCAO_TROCA_ID, :PDV_MOVIMENTO_DETALHE_ID
    DO BEGIN
        IF(:ACAO = 1) THEN /* DESFAZER BAIXA DE SALDO PARA DEVOLUÇÕES */
        BEGIN
            IF(:PDV_DEVOLUCAO_TROCA_ID > 0) THEN
            BEGIN
    
                UPDATE TBPDV_DEVOLUCAO_TROCA SET VALOR_SALDO = VALOR_SALDO + :VALOR_LIQUIDO
                        WHERE ID = :PDV_DEVOLUCAO_TROCA_ID;
    
            END ELSE IF(:PDV_MOVIMENTO_DETALHE_ID > 0) THEN
            BEGIN
                
                UPDATE TBPDV_MOVIMENTO_DETALHE SET VALOR_SALDO = VALOR_SALDO + :VALOR_LIQUIDO
                        WHERE ID = :PDV_MOVIMENTO_DETALHE_ID;
    
            END

        END ELSE
        IF(:ACAO = 2) THEN /* REALIZAR BAIXA DE DEVOLUÇÕES */
        BEGIN
            
            IF(:PDV_DEVOLUCAO_TROCA_ID > 0) THEN
            BEGIN
                SELECT
                T.VALOR_SALDO
                FROM TBPDV_DEVOLUCAO_TROCA T
                WHERE T.ID = :PDV_DEVOLUCAO_TROCA_ID
                INTO :OLD_SALDO_DEVOLUCAO;
        
                IF(COALESCE(:OLD_SALDO_DEVOLUCAO, 0) > 0) THEN
                BEGIN
                    :NEW_SALDO_DEVOLUCAO = ROUND(:OLD_SALDO_DEVOLUCAO - :VALOR_LIQUIDO, 2);
        
                    IF(:NEW_SALDO_DEVOLUCAO >= 0) THEN
                    BEGIN
                        UPDATE TBPDV_DEVOLUCAO_TROCA SET VALOR_SALDO = :NEW_SALDO_DEVOLUCAO
                            WHERE ID = :PDV_DEVOLUCAO_TROCA_ID;

                    END
                END

            END ELSE
            IF(:PDV_MOVIMENTO_DETALHE_ID > 0) THEN
            BEGIN
                SELECT
                    T.VALOR_SALDO
                    FROM TBPDV_MOVIMENTO_DETALHE T
                    WHERE T.ID = :PDV_MOVIMENTO_DETALHE_ID
                    INTO :OLD_SALDO_DEPOSITO;
            
                    IF(COALESCE(:OLD_SALDO_DEPOSITO, 0) > 0) THEN
                    BEGIN
                        :NEW_SALDO_DEPOSITO = ROUND(:OLD_SALDO_DEPOSITO - :VALOR_LIQUIDO, 2);
            
                        IF(:NEW_SALDO_DEPOSITO >= 0) THEN
                        BEGIN
            
                            UPDATE TBPDV_MOVIMENTO_DETALHE SET VALOR_SALDO = :NEW_SALDO_DEPOSITO
                                WHERE ID = :PDV_MOVIMENTO_DETALHE_ID;
            
            
                        END
                    END

              END
        END



    END


END;