SET TERM ^ ;

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 PDV_TIPO integer;
declare variable COLABORADOR_ID integer;
declare variable NATUREZA integer;
declare variable CHEQUE_ID integer;
declare variable CHEQUE_ONLINE_ID integer;
declare variable OFFLINE_ID integer;
declare variable PDV_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);
declare variable OLD_SALDO_CHEQUE numeric(15,2);
declare variable VALOR_CHEQUE numeric(15,2);
declare variable NEW_SALDO_CHEQUE numeric(15,2);
declare variable SALDO_JA_UTILIZADO numeric(15,2);
declare variable TEMP_UTILIZADO numeric(15,2);
declare variable OLD_PRE_PEDIDO_ID integer;
declare variable VOUCHER_ID integer;
declare variable TRANSACAO_PIX_ID integer;
declare variable ANTECIPACAO_AGRUPAMENTO_ID integer;
declare variable ANTECIPACAO_ID integer;
declare variable ANTECIPACAO_VALOR numeric(15,2);
declare variable ANTECIPACAO_SALDO numeric(15,2);
declare variable VALOR_TEMP numeric(15,2);
declare variable VALOR_AUX numeric(15,2);
declare variable DEVOLUCAO_MAIOR_VENDA integer;
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,
        PF.PDV_TIPO,
        COALESCE(C.COLABORADOR_ID, 0) AS COLABORADOR_ID,
        COALESCE(C.NATUREZA, 1) AS NATUREZA,
        COALESCE(A.CHEQUE_ID, 0) AS CHEQUE_ID,
        COALESCE(C.PDV_ID, 0) AS PDV_ID,
        COALESCE(C.OFFLINE_ID, 0) AS OFFLINE_ID,
        COALESCE(A.VOUCHER_ID, 0) AS VOUCHER_ID,
        COALESCE(A.TRANSACAO_PIX_ID, 0) AS TRANSACAO_PIX_ID,
        COALESCE(A.ANTECIPACAO_AGRUPAMENTO_ID, 0) AS ANTECIPACAO_AGRUPAMENTO_ID
    FROM TBPDV_CFE_FORMA_PAGAMENTO A
    INNER JOIN TBPDV_CFE C ON C.ID = A.PDV_CFE_ID
    INNER JOIN TBPAGAMENTO_FORMA PF ON PF.CODIGO = A.PAGAMENTO_FORMA_ID
    WHERE A.PDV_CFE_ID = :PDV_CFE_ID
    AND C.SITUACAO IN (2,3)
    INTO :VALOR_LIQUIDO, :PDV_DEVOLUCAO_TROCA_ID, :PDV_MOVIMENTO_DETALHE_ID,
    :PDV_TIPO, :COLABORADOR_ID, :NATUREZA, :CHEQUE_ID, :PDV_ID, :OFFLINE_ID, :VOUCHER_ID,
    :TRANSACAO_PIX_ID, :ANTECIPACAO_AGRUPAMENTO_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 ELSE IF(:VOUCHER_ID > 0) THEN
            BEGIN
                UPDATE TBVOUCHER SET SALDO = SALDO + :VALOR_LIQUIDO
                        WHERE ID = :VOUCHER_ID;
            END ELSE IF(:TRANSACAO_PIX_ID > 0) THEN
            BEGIN
                 UPDATE TBTRANSACAO_PIX SET STATUS = 0
                        WHERE ID = :TRANSACAO_PIX_ID;
            END ELSE IF(:ANTECIPACAO_AGRUPAMENTO_ID > 0) THEN
            BEGIN
                FOR SELECT
                    ANT.PDV_MOVIMENTO_ANTECIPACAO_ID,
                    ANT.SALDO
                FROM TBPDV_CFE_ANTECIPACAO_SALDO ANT
                WHERE ANT.PDV_CFE_ID = :PDV_CFE_ID
                INTO :ANTECIPACAO_ID, :ANTECIPACAO_SALDO
                DO BEGIN
                    UPDATE TBPDV_MOVIMENTO_ANTECIPACAO T SET T.SALDO = T.SALDO + :ANTECIPACAO_SALDO WHERE T.ID = :ANTECIPACAO_ID;
                END

                DELETE FROM TBPDV_CFE_ANTECIPACAO_SALDO T WHERE T.PDV_CFE_ID = :PDV_CFE_ID;
            END

            /* IF(:PDV_TIPO = 6) THEN
            BEGIN
                UPDATE TBCOLABORADOR_CREDITO SET SALDO = SALDO + :VALOR_LIQUIDO
                    WHERE COLABORADOR_ID = :COLABORADOR_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,
                T.pre_pedido_id
                FROM TBPDV_DEVOLUCAO_TROCA T
                WHERE T.ID = :PDV_DEVOLUCAO_TROCA_ID
                INTO :OLD_SALDO_DEVOLUCAO, :OLD_PRE_PEDIDO_ID;
        
                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
                        
                        :DEVOLUCAO_MAIOR_VENDA  = CAST(FN_PARAMETRO('SISTEMA.DEVOLUCAO_MAIOR_VENDA') AS INTEGER);

                        IF(:DEVOLUCAO_MAIOR_VENDA = 1) THEN
                        BEGIN
                            UPDATE TBPDV_DEVOLUCAO_TROCA SET VALOR_SALDO = 0, VALOR_ENCERRADO = :NEW_SALDO_DEVOLUCAO
                            WHERE ID = :PDV_DEVOLUCAO_TROCA_ID;
                        END ELSE
                        BEGIN
                            UPDATE TBPDV_DEVOLUCAO_TROCA SET VALOR_SALDO = :NEW_SALDO_DEVOLUCAO
                            WHERE ID = :PDV_DEVOLUCAO_TROCA_ID;
                        END

                    END ELSE
                    BEGIN
                        UPDATE TBPDV_DEVOLUCAO_TROCA SET VALOR_SALDO = 0
                            WHERE ID = :PDV_DEVOLUCAO_TROCA_ID;
                    END
                END

                IF(COALESCE(:OLD_PRE_PEDIDO_ID,0) = 0)THEN
                BEGIN
                      UPDATE TBPDV_DEVOLUCAO_TROCA TROCA
                        SET TROCA.PRE_PEDIDO_ID = COALESCE((SELECT FIRST 1 ITEM.conferencia_id FROM TBPDV_CFE_ITEM ITEM WHERE ITEM.pdv_cfe_id = :PDV_CFE_ID AND ITEM.conferencia_id > 0),0)
                         WHERE ID = :PDV_DEVOLUCAO_TROCA_ID;
                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 ELSE
              IF(:CHEQUE_ID > 0) THEN
              BEGIN
                :SALDO_JA_UTILIZADO = :VALOR_LIQUIDO;

                FOR SELECT
                    CI.ID,
                    CI.VALOR,
                    CAST((CI.VALOR - COALESCE((SELECT FIRST 1 SUM(VV.VALOR) FROM TBCHEQUE_ITEM VV WHERE VV.CHEQUE_ID = K.ID AND VV.ID <> CI.ID), 0)) AS NUMERIC(15,2)) AS SALDO
                FROM TBCHEQUE K, TBCHEQUE_ITEM CI
                WHERE
                K.ID = CI.CHEQUE_ID
                AND K.CHEQUE_PDV_ID = :CHEQUE_ID
                AND K.PDV_ID = :PDV_ID
                AND K.SALDO > 0
                AND IIF(:OFFLINE_ID = 1, K.FLAG_ONLINE = 0, K.FLAG_ONLINE = 1)
                AND CI.PDV_CFE_ID = :PDV_CFE_ID
                INTO :CHEQUE_ONLINE_ID, :VALOR_CHEQUE, :OLD_SALDO_CHEQUE
                DO BEGIN
                    
                    IF(:OLD_SALDO_CHEQUE = 0) THEN
                    BEGIN
                        :OLD_SALDO_CHEQUE = :VALOR_CHEQUE;
                    END

                    IF(:OLD_SALDO_CHEQUE <= :SALDO_JA_UTILIZADO) THEN
                    BEGIN
                        :NEW_SALDO_CHEQUE   = :OLD_SALDO_CHEQUE;
                        :TEMP_UTILIZADO     = ROUND(:VALOR_LIQUIDO - :NEW_SALDO_CHEQUE, 2);
                    END ELSE
                    BEGIN
                        :TEMP_UTILIZADO   = 0;
                        :NEW_SALDO_CHEQUE = :SALDO_JA_UTILIZADO;
                    END

                    IF(:SALDO_JA_UTILIZADO > 0) THEN
                    BEGIN
                         UPDATE TBCHEQUE_ITEM SET VALOR = :NEW_SALDO_CHEQUE
                            WHERE ID = :CHEQUE_ONLINE_ID;

                         IF(:OFFLINE_ID = 0) THEN
                         BEGIN
                             UPDATE TBCHEQUE_PDV SET SALDO = (SALDO - :NEW_SALDO_CHEQUE)
                                WHERE ID = :CHEQUE_ID;
                         END

                    END ELSE
                    BEGIN
                        UPDATE TBCHEQUE_ITEM SET VALOR = 0
                            WHERE ID = :CHEQUE_ONLINE_ID;
                    END

                    :SALDO_JA_UTILIZADO = :TEMP_UTILIZADO;

                END

              END ELSE
              IF(:VOUCHER_ID > 0) THEN
              BEGIN
                    UPDATE TBVOUCHER SET SALDO = SALDO - :VALOR_LIQUIDO
                    WHERE ID = :VOUCHER_ID;

              END ELSE
              IF(:TRANSACAO_PIX_ID > 0) THEN
              BEGIN
                    UPDATE TBTRANSACAO_PIX SET STATUS = 1
                        WHERE ID = :TRANSACAO_PIX_ID;
              END ELSE
              IF(:ANTECIPACAO_AGRUPAMENTO_ID > 0) THEN
              BEGIN
                    :VALOR_TEMP = :VALOR_LIQUIDO;

                    FOR SELECT
                        ANT.ID,
                        ANT.VALOR,
                        ANT.SALDO
                    FROM TBPDV_MOVIMENTO_ANTECIPACAO ANT
                    WHERE ANT.CLIENTE_ID = :ANTECIPACAO_AGRUPAMENTO_ID
                    ORDER BY ANT.DATAHORA ASC
                    INTO :ANTECIPACAO_ID, :ANTECIPACAO_VALOR, :ANTECIPACAO_SALDO
                    DO BEGIN

                        IF(:VALOR_TEMP >= 0) THEN
                        BEGIN

                            :VALOR_AUX = :VALOR_TEMP - :ANTECIPACAO_SALDO;
    
                            IF(:VALOR_AUX >= 0) THEN
                            BEGIN

                                INSERT INTO TBPDV_CFE_ANTECIPACAO_SALDO (PDV_CFE_ID, PDV_MOVIMENTO_ANTECIPACAO_ID, SALDO)
                                VALUES (:PDV_CFE_ID, :ANTECIPACAO_ID, :ANTECIPACAO_SALDO);
                                
                                UPDATE TBPDV_MOVIMENTO_ANTECIPACAO T SET T.SALDO = T.SALDO - :ANTECIPACAO_SALDO WHERE T.ID = :ANTECIPACAO_ID;
                            END ELSE
                            BEGIN
                                
                                INSERT INTO TBPDV_CFE_ANTECIPACAO_SALDO (PDV_CFE_ID, PDV_MOVIMENTO_ANTECIPACAO_ID, SALDO)
                                VALUES (:PDV_CFE_ID, :ANTECIPACAO_ID, :VALOR_TEMP);

                                UPDATE TBPDV_MOVIMENTO_ANTECIPACAO T SET T.SALDO = T.SALDO - :VALOR_TEMP WHERE T.ID = :ANTECIPACAO_ID;
                            END

                            :VALOR_TEMP = :VALOR_AUX;

                        END



                    END
                      


              END

              IF(:PDV_TIPO = 6) THEN
              BEGIN
                UPDATE TBCOLABORADOR_CREDITO SET SALDO = SALDO - :VALOR_LIQUIDO
                    WHERE COLABORADOR_ID = :COLABORADOR_ID;

              END
        END



    END


END
^

SET TERM ; ^

