SET TERM ^ ;

CREATE OR ALTER procedure SPC_ADIANTAMENTOS_PRE_PEDIDOS (
    PRE_PEDIDO_ID integer,
    PDV_CFE_ID integer)
returns (
    ANTECIPACAO_ID integer,
    ANTECIPACAO_VALOR numeric(15,2),
    ANTECIPACAO_SALDO numeric(15,2),
    AGRUPAMENTO_ID integer)
as
declare variable ADIANTAMENTO_ID integer;
declare variable VALOR_MAXIMO_PRE numeric(15,2);
declare variable VALOR_TEMP numeric(15,2);
declare variable ANTECIPACAO_ID_AUX integer;
declare variable ANTECIPACAO_VALOR_AUX numeric(15,2);
declare variable ANTECIPACAO_SALDO_AUX numeric(15,2);
declare variable VALOR_TOTAL_PRE_PEDIDO numeric(15,2);
declare variable VALOR_UTILIZADO numeric(15,2);
declare variable VALOR_UTILIZADO_ADI numeric(15,2);
declare variable VALOR_ADD_TEMP numeric(15,2);
declare variable VALOR_AUX_TEMP2 numeric(15,2);
BEGIN

    :VALOR_TOTAL_PRE_PEDIDO = COALESCE((SELECT FIRST 1 SUM(T.VALOR_LIQUIDO) FROM TBPDV_CFE_ITEM I, TBPDV_CONFERENCIA_ITEM T WHERE I.CONFERENCIA_ITEM_ID = T.ID AND I.PDV_CFE_ID = :PDV_CFE_ID), 0);

    :VALOR_UTILIZADO        = 0;
    :VALOR_UTILIZADO_ADI    = 0;

    FOR SELECT  
        X.ADIANTAMENTO_ID,
        X.VALOR AS VALOR_MAXIMO_PRE
    FROM TBADIANTAMENTO_PRE_PEDIDOS X
    WHERE X.PRE_PEDIDO_ID = :PRE_PEDIDO_ID
    AND X.SALDO > 0
    ORDER BY X.VALOR ASC
    INTO :ADIANTAMENTO_ID, :VALOR_MAXIMO_PRE
    DO BEGIN

        IF((:VALOR_MAXIMO_PRE + :VALOR_UTILIZADO) > :VALOR_TOTAL_PRE_PEDIDO) THEN
        BEGIN
            :VALOR_UTILIZADO = :VALOR_TOTAL_PRE_PEDIDO - (:VALOR_MAXIMO_PRE + :VALOR_UTILIZADO);

            IF(:VALOR_UTILIZADO <= 0) THEN
            BEGIN
                IF(:VALOR_UTILIZADO_ADI > :VALOR_MAXIMO_PRE) THEN
                BEGIN
                    :VALOR_UTILIZADO = :VALOR_UTILIZADO_ADI - :VALOR_MAXIMO_PRE;
                END ELSE
                BEGIN
                    :VALOR_UTILIZADO = :VALOR_MAXIMO_PRE - :VALOR_UTILIZADO_ADI;
                END

            END
        END ELSE
        BEGIN
            :VALOR_UTILIZADO = :VALOR_MAXIMO_PRE;
        END

        :VALOR_UTILIZADO_ADI    = :VALOR_UTILIZADO_ADI + :VALOR_UTILIZADO;

        :VALOR_TEMP             = :VALOR_UTILIZADO;
        :VALOR_ADD_TEMP         = 0;

        FOR SELECT
            ANT.ID,
            ANT.VALOR,
            ANT.SALDO
        FROM TBPDV_MOVIMENTO_ANTECIPACAO ANT
        WHERE ANT.AGRUPAMENTO_ID = :ADIANTAMENTO_ID
        AND ANT.SALDO > 0
        ORDER BY ANT.SALDO ASC
        INTO :ANTECIPACAO_ID_AUX, :ANTECIPACAO_VALOR_AUX, :ANTECIPACAO_SALDO_AUX
        DO BEGIN
            :VALOR_TEMP = :VALOR_TEMP - :ANTECIPACAO_SALDO_AUX;

            /*IF(:VALOR_TEMP <= 0) THEN
            BEGIN
                :VALOR_TEMP = :VALOR_UTILIZADO;
            END*/

            IF(:VALOR_TEMP >= 0) THEN
            BEGIN
                :ANTECIPACAO_ID     = :ANTECIPACAO_ID_AUX;
                :ANTECIPACAO_VALOR  = :ANTECIPACAO_VALOR_AUX;
                :ANTECIPACAO_SALDO  = :ANTECIPACAO_SALDO_AUX;
                :AGRUPAMENTO_ID     = :ADIANTAMENTO_ID;
                :VALOR_ADD_TEMP     = :VALOR_ADD_TEMP + :ANTECIPACAO_SALDO_AUX;
                SUSPEND;
            END ELSE IF(:VALOR_TEMP < 0) THEN
            BEGIN
                IF(:VALOR_ADD_TEMP < :VALOR_UTILIZADO) THEN
                BEGIN
                    :VALOR_AUX_TEMP2 = :VALOR_UTILIZADO - :VALOR_ADD_TEMP;

                    IF(:VALOR_AUX_TEMP2 <= :ANTECIPACAO_SALDO_AUX) THEN
                    BEGIN
                        :ANTECIPACAO_ID     = :ANTECIPACAO_ID_AUX;
                        :ANTECIPACAO_VALOR  = :VALOR_AUX_TEMP2;
                        :ANTECIPACAO_SALDO  = :VALOR_AUX_TEMP2;
                        :AGRUPAMENTO_ID     = :ADIANTAMENTO_ID;
                        :VALOR_ADD_TEMP     = :VALOR_ADD_TEMP + :VALOR_AUX_TEMP2;
                        SUSPEND;
                    END ELSE IF(:VALOR_AUX_TEMP2 > :ANTECIPACAO_SALDO_AUX) THEN
                    BEGIN
                        :ANTECIPACAO_ID     = :ANTECIPACAO_ID_AUX;
                        :ANTECIPACAO_VALOR  = :ANTECIPACAO_VALOR_AUX;
                        :ANTECIPACAO_SALDO  = :ANTECIPACAO_SALDO_AUX;
                        :AGRUPAMENTO_ID     = :ADIANTAMENTO_ID;
                        :VALOR_ADD_TEMP     = :VALOR_ADD_TEMP + :ANTECIPACAO_SALDO_AUX;
                        SUSPEND;
                    END

                END
            END
        END
        

    END

END
^

SET TERM ; ^

