SET TERM ^ ;

CREATE OR ALTER procedure SPU_SALDO_ADIANT_PRE (
    PDV_CFE_ID integer)
as
declare variable AGRUPAMENTO_ID integer;
declare variable PRE_PEDIDO_ID integer;
declare variable ADIANTAMENTO_PRE_PEDIDOS_ID integer;
declare variable SALDO numeric(15,2);
declare variable CALC_ADIAN_PRE numeric(15,2);
declare variable SALDO_ADIAN_AUX numeric(15,2);
declare variable SALDO_UTILIZADO numeric(15,2);
declare variable VALOR_PRE_PEDIDO numeric(15,2);
declare variable SALDO_SOMADO_ADIANTAMENTO numeric(15,2);
declare variable TOTAL_SOMADO_ADIANTAMENTO numeric(15,2);
BEGIN

    /* VALOR TOTAL DE ADIANTAMENTOS DO DOCUMENTO */
    :TOTAL_SOMADO_ADIANTAMENTO = COALESCE((SELECT DISTINCT
        SUM(T.SALDO) AS SALDO
    FROM TBPDV_CFE_ANTECIPACAO_SALDO T
    WHERE T.PDV_CFE_ID = :PDV_CFE_ID), 0);

    IF(:TOTAL_SOMADO_ADIANTAMENTO > 0) THEN
    BEGIN

        :SALDO_SOMADO_ADIANTAMENTO = 0;
    
    
        FOR SELECT DISTINCT
            T.AGRUPAMENTO_ID,
            SUM(T.SALDO) AS SALDO
        FROM TBPDV_CFE_ANTECIPACAO_SALDO T
        WHERE T.PDV_CFE_ID = :PDV_CFE_ID
        GROUP BY 1
        INTO :AGRUPAMENTO_ID, :SALDO
        DO BEGIN

            FOR SELECT DISTINCT
                W.CONFERENCIA_ID
            FROM TBPDV_CFE_ITEM W
            WHERE W.PDV_CFE_ID = :PDV_CFE_ID
            GROUP BY 1
            INTO :PRE_PEDIDO_ID
            DO BEGIN

                :SALDO_ADIAN_AUX            = 0;

                :VALOR_PRE_PEDIDO           = COALESCE((SELECT FIRST 1 SUM(K.VALOR) FROM TBADIANTAMENTO_PRE_PEDIDOS K WHERE K.ADIANTAMENTO_ID = :AGRUPAMENTO_ID AND K.PRE_PEDIDO_ID = :PRE_PEDIDO_ID), 0);
                :SALDO_UTILIZADO            = 0;

                IF(:VALOR_PRE_PEDIDO > 0)THEN
                BEGIN   

                    IF(:SALDO_SOMADO_ADIANTAMENTO < :TOTAL_SOMADO_ADIANTAMENTO) THEN
                    BEGIN

                        :CALC_ADIAN_PRE     = :VALOR_PRE_PEDIDO - :SALDO_SOMADO_ADIANTAMENTO - :SALDO_ADIAN_AUX;


                        IF(:CALC_ADIAN_PRE <= :SALDO AND :CALC_ADIAN_PRE >= 0) THEN
                        BEGIN

                            :SALDO_UTILIZADO = :VALOR_PRE_PEDIDO;

                            IF(:VALOR_PRE_PEDIDO > :SALDO) THEN
                            BEGIN
                                :SALDO_UTILIZADO = :SALDO;
                            END


                        END ELSE IF(:CALC_ADIAN_PRE > :SALDO) THEN
                        BEGIN
                            :SALDO_UTILIZADO = :SALDO - :SALDO_ADIAN_AUX;

                            IF(:SALDO_UTILIZADO < 0) THEN
                            BEGIN
                                :SALDO_UTILIZADO = 0;
                            END
                        END ELSE IF(:CALC_ADIAN_PRE < 0) THEN
                        BEGIN

                            IF(:VALOR_PRE_PEDIDO <= :SALDO) THEN
                            BEGIN
                                :SALDO_UTILIZADO = :VALOR_PRE_PEDIDO;
                            END ELSE
                            BEGIN
                                :SALDO_UTILIZADO = :SALDO - :SALDO_ADIAN_AUX;
                            END
                        END
                        

                        :SALDO_ADIAN_AUX    = :SALDO_ADIAN_AUX + :SALDO_UTILIZADO;

                        UPDATE TBADIANTAMENTO_PRE_PEDIDOS K SET K.VALOR = :SALDO_UTILIZADO, K.SALDO = 0, K.FLAG_FATURAMENTO = 1 WHERE K.ADIANTAMENTO_ID = :AGRUPAMENTO_ID AND K.PRE_PEDIDO_ID = :PRE_PEDIDO_ID;
                    END

                END


            END
            

            
            :SALDO_SOMADO_ADIANTAMENTO  = :SALDO_SOMADO_ADIANTAMENTO + :SALDO;
        END

        /* DELETANDO ADIANTAMENTOS QUE NAO FORAM UTILIZADOS NESSES PRE-PEDIDOS */
        FOR SELECT
            A.ID
        FROM
        (
            SELECT DISTINCT
                W.CONFERENCIA_ID
            FROM TBPDV_CFE_ITEM W

            WHERE W.PDV_CFE_ID = :PDV_CFE_ID
        ) V
        INNER JOIN TBADIANTAMENTO_PRE_PEDIDOS A ON A.PRE_PEDIDO_ID = V.CONFERENCIA_ID
        WHERE A.FLAG_FATURAMENTO = 0
        INTO :ADIANTAMENTO_PRE_PEDIDOS_ID
        DO BEGIN
            DELETE FROM TBADIANTAMENTO_PRE_PEDIDOS A WHERE A.ID = :ADIANTAMENTO_PRE_PEDIDOS_ID;
        END

    END

END
^

SET TERM ; ^

