ALTER TABLE TBPDV_CONFERENCIA_ITEM
    ADD EM_DEVOLUCAO INTEGER DEFAULT 0 NOT NULL;

SET TERM ^ ;

CREATE OR ALTER trigger ttbpdv_conferencia_item_b10u for tbpdv_conferencia_item
active before update or delete position 10
AS
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE PERMISSAO_USUARIO INTEGER;
DECLARE VARIABLE CHECK_TROCA INTEGER;
BEGIN

    IF(UPDATING) THEN
    BEGIN

        IF(OLD.QUANTIDADE <> NEW.QUANTIDADE AND OLD.DATA <> CURRENT_DATE AND NEW.EM_DEVOLUCAO = 0) THEN
        BEGIN

            FOR SELECT FIRST 1
                T.TIPO
            FROM TBPDV_CONFERENCIA T
            WHERE T.ID = NEW.PDV_CONFERENCIA_ID
            INTO :TIPO
            DO BEGIN
                IF(:TIPO = 2) THEN
                BEGIN
                    :PERMISSAO_USUARIO = CAST(FN_PARAMETRO('TBUSUARIO.EXCLUIR_ITEM_POR_DATA', FN_CURRENT_USER_ID()) AS INTEGER);
    
                    IF(:PERMISSAO_USUARIO = 0) THEN
                    BEGIN
                       EXCEPTION "..."'USUARIO NAO POSSUI PERMISSAO PARA EXCLUIR ITENS DA DATA '||FORMATDATE(OLD.DATA);
                    END
    
                END
    
            END

        END

        NEW.EM_DEVOLUCAO = 0;
    END

    IF(DELETING) THEN
    BEGIN

        IF(OLD.DATA <> CURRENT_DATE) THEN
        BEGIN
            FOR SELECT FIRST 1
                T.TIPO
            FROM TBPDV_CONFERENCIA T
            WHERE T.ID = OLD.PDV_CONFERENCIA_ID
            INTO :TIPO
            DO BEGIN
                IF(:TIPO = 2) THEN
                BEGIN
                    :PERMISSAO_USUARIO = CAST(FN_PARAMETRO('TBUSUARIO.EXCLUIR_ITEM_POR_DATA', FN_CURRENT_USER_ID()) AS INTEGER);
    
                    IF(:PERMISSAO_USUARIO = 0) THEN
                    BEGIN
                       EXCEPTION "..."'USUARIO NAO POSSUI PERMISSAO PARA EXCLUIR ITENS DA DATA '||FORMATDATE(OLD.DATA);
                    END
    
                END
    
            END
        END
    END

END
^

SET TERM ; ^



SET TERM ^ ;

CREATE OR ALTER trigger tbpdv_conf_troca_item_b01d for tbpdv_conferencia_troca_item
active before delete position 3
AS
declare VARIABLE ITEM_ENCERRADO_ID  INTEGER;
declare VARIABLE pdv_conferencia_id INTEGER;
declare variable quantidade_alocado numeric(15,2);
declare variable novo_quantidade    numeric(15,2);
declare variable antiga_quantidade  numeric(15,2);
declare variable saldo_item         numeric(15,2);
declare variable base_desconto      numeric(15,2);
declare variable novo_valor_desc    numeric(15,2);
declare variable valor_unitario     numeric(15,2);
declare variable novo_valor_total   numeric(15,2);
begin
  IF(OLD.pre_pedido_item_id > 0)THEN
  BEGIN
       :ITEM_ENCERRADO_ID = COALESCE((SELECT FIRST 1 B.ID FROM TBPDV_CONFERENCIA_ITEM B WHERE B.PDV_CONFERENCIA_TROCA_ITEM_ID = OLD.ID AND B.ID <> OLD.PRE_PEDIDO_ITEM_ORIGEM),0);

       IF(:ITEM_ENCERRADO_ID > 0)THEN
       BEGIN

          --exception "..." ' antes da atualizacao';

          UPDATE TBPDV_CONFERENCIA_ITEM B SET B.excluindo_troca = 1 WHERE B.ID = :ITEM_ENCERRADO_ID;

          --exception "..." ' antes da exclusao';

          DELETE FROM TBPDV_CONFERENCIA_ITEM B WHERE B.ID = :ITEM_ENCERRADO_ID;

       END

       FOR SELECT FIRST 1
            A.QUANTIDADE,
            b.QUANTIDADE,
            IIF(A.VALOR_DESCONTO > 0,FN_CALC_PRECISION_V2(FN_CALC_PRECISION_V2(A.VALOR_DESCONTO,100.00,'*'),A.VALOR_TOTAL,'/'),0.00) AS PESO_DESCONTO,
            A.valor_unitario,
            A.valor_total,
            A.pdv_conferencia_id,
            a.qtd_estoque

            FROM TBPDV_CONFERENCIA_ITEM A, TBPDV_CONFERENCIA_ITEM_SALDO B
            WHERE A.ID = B.pdv_conferencia_item_id
              AND A.pdv_conferencia_id = B.pdv_conferencia_id
              AND A.ID                 = OLD.pre_pedido_item_origem
              INTO :antiga_quantidade, :saldo_item, :base_desconto, :valor_unitario, :novo_valor_total, :pdv_conferencia_id, :quantidade_alocado DO
              BEGIN
                 :novo_valor_desc  = 0;
                 :NOVO_QUANTIDADE  = :antiga_quantidade+OLD.QUANTIDADE;
                 :novo_valor_total = (:NOVO_QUANTIDADE*:valor_unitario);

                 if(:base_desconto > 0)THEN
                  BEGIN
                     :novo_valor_desc = FN_CALC_PRECISION_V2(FN_CALC_PRECISION_V2(:base_desconto,100.00,'/'),:novo_valor_total,'*',2);--CAST(((:base_desconto/100.00)*:novo_valor_total) AS NUMERIC(15,2));
                  END
                 IF((:saldo_item+OLD.QUANTIDADE) = :antiga_quantidade)THEN
                 BEGIN
                    update tbpdv_conferencia_item B set b.situacao = 0, b.PDV_CONFERENCIA_TROCA_ITEM_ID = 0 where b.id = OLD.pre_pedido_item_origem;

                    UPDATE tbpdv_conferencia_item_saldo B SET B.quantidade = (:saldo_item+OLD.QUANTIDADE)
                       WHERE B.pdv_conferencia_item_id = OLD.pre_pedido_item_origem;
                    --exception "..." ' qtd_estoque: '||:quantidade_alocado;
                    if(OLD.PRE_PEDIDO_ITEM_ALOCADO > 0)then
                    begin
                        EXECUTE PROCEDURE SPU_CONFERENCIA_ESTOQUE(:pdv_conferencia_id, OLD.pre_pedido_item_origem, 'D');

                        EXECUTE PROCEDURE SPU_CONFERENCIA_ESTOQUE(:pdv_conferencia_id, OLD.pre_pedido_item_origem, 'A');
                    end
                 END ELSE
                 BEGIN

                 
                    if(OLD.PRE_PEDIDO_ITEM_ALOCADO > 0)then
                    begin
                        EXECUTE PROCEDURE SPU_CONFERENCIA_ESTOQUE(:pdv_conferencia_id, OLD.pre_pedido_item_origem, 'D');
                    end

                    UPDATE tbpdv_conferencia_item B
                        SET B.quantidade     = :novo_quantidade,
                            B.EM_DEVOLUCAO   = 1,
                            B.valor_total    = :novo_valor_total,
                            B.valor_LIQUIDO  = (:novo_valor_total-:novo_valor_desc),
                            B.VALOR_DESCONTO = :novo_valor_desc

                       WHERE B.ID = OLD.pre_pedido_item_origem;
        
                    UPDATE tbpdv_conferencia_item_saldo B SET B.quantidade = (:saldo_item+OLD.QUANTIDADE)
                       WHERE B.pdv_conferencia_item_id = OLD.pre_pedido_item_origem;

                    if(OLD.PRE_PEDIDO_ITEM_ALOCADO > 0)then
                    begin
                        EXECUTE PROCEDURE SPU_CONFERENCIA_ESTOQUE(:pdv_conferencia_id, OLD.pre_pedido_item_origem, 'A');
                    end
                 END
              END
  END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger tbpdv_conf_troca_item_b01u for tbpdv_conferencia_troca_item
active before update position 3
AS
declare VARIABLE pdv_conferencia_id    INTEGER;
declare variable pre_pedido_item_id    integer;
DECLARE VARIABLE DIFF_QUANTIDADE       NUMERIC(15,2);
declare variable novo_quantidade       numeric(15,2);
declare variable novo_quantidade2      numeric(15,2);
declare variable antiga_quantidade     numeric(15,2);
declare variable quantidade_original   numeric(15,2);
declare variable saldo_item            numeric(15,2);
declare variable base_desconto         numeric(15,2);
declare variable novo_valor_desc       numeric(15,2);
declare variable valor_unitario        numeric(15,2);
declare variable novo_valor_total      numeric(15,2);

declare variable item_encerrado_id     integer;
declare variable item_encerrado_qtd    numeric(15,2);
declare variable item_quantidade       numeric(15,2);
declare variable item_nova_quantidade  numeric(15,2);
declare variable item_base_desconto    numeric(15,2);
declare variable item_valor_desc       numeric(15,2);
declare variable item_valor_unitario   numeric(15,2);
declare variable item_novo_valor_total numeric(15,2);
declare variable quantidade_alocado    numeric(15,2);
begin

  IF(OLD.QUANTIDADE <> NEW.QUANTIDADE AND NEW.pre_pedido_item_id > 0)THEN
  BEGIN

       FOR SELECT FIRST 1
            A.QUANTIDADE,
            b.QUANTIDADE,
            a.quantidade_original,
            IIF(A.VALOR_DESCONTO > 0,FN_CALC_PRECISION_V2(FN_CALC_PRECISION_V2(A.VALOR_DESCONTO,100.00,'*'),A.VALOR_TOTAL,'/'),0.00) AS PESO_DESCONTO,
            A.valor_unitario,
            A.valor_total,
            coalesce((SELECT FIRST 1 B.ID FROM TBPDV_CONFERENCIA_ITEM B WHERE B.PDV_CONFERENCIA_TROCA_ITEM_ID = OLD.ID AND B.ID <> NEW.pre_pedido_item_origem),0) AS item_encerrado_id,
            coalesce((SELECT FIRST 1 B.quantidade FROM TBPDV_CONFERENCIA_ITEM B WHERE B.PDV_CONFERENCIA_TROCA_ITEM_ID = OLD.ID),0) AS item_encerrado_qtd,
            A.pdv_conferencia_id,
            a.qtd_estoque

            FROM TBPDV_CONFERENCIA_ITEM A, TBPDV_CONFERENCIA_ITEM_SALDO B
            WHERE A.ID                 = B.pdv_conferencia_item_id
              AND A.pdv_conferencia_id = B.pdv_conferencia_id
              AND A.ID                 = OLD.pre_pedido_item_origem
              INTO :antiga_quantidade, :saldo_item, :quantidade_original, :base_desconto, :valor_unitario, :novo_valor_total,
              :item_encerrado_id, :item_encerrado_qtd, :pdv_conferencia_id, :quantidade_alocado DO
              BEGIN
                 :novo_valor_desc      = 0;
                 :item_nova_quantidade = 0;
                 :DIFF_QUANTIDADE      = (OLD.QUANTIDADE - NEW.QUANTIDADE);
                 :NOVO_QUANTIDADE      = IIF(old.QUANTIDADE = :quantidade_original,:DIFF_QUANTIDADE,:antiga_quantidade+:DIFF_QUANTIDADE);
                 :novo_quantidade2     = (OLD.QUANTIDADE - NEW.QUANTIDADE);
                 :novo_valor_total     = (:NOVO_QUANTIDADE*:valor_unitario);

                 if(OLD.pre_pedido_item_origem <> NEW.pre_pedido_item_id)then
                 begin
                    NEW.pre_pedido_item_id = cast(OLD.pre_pedido_item_origem as integer);
                 end

                 
                 if(:NOVO_QUANTIDADE <> :quantidade_original)then
                 begin
                   :item_nova_quantidade = :quantidade_original - :NOVO_QUANTIDADE;
                 end


                 if(:base_desconto > 0)THEN
                 BEGIN
                    :novo_valor_desc = FN_CALC_PRECISION_V2(FN_CALC_PRECISION_V2(:base_desconto,100.00,'/'),:novo_valor_total,'*',2);--CAST(((:base_desconto/100.00)*:novo_valor_total) AS NUMERIC(15,2));
                 END

                 IF(:ITEM_ENCERRADO_ID > 0)THEN
                 BEGIN
                    DELETE FROM TBPDV_CONFERENCIA_ITEM B WHERE B.ID = :ITEM_ENCERRADO_ID;
                 END

                 if(:quantidade_alocado > 0)then
                 begin
                    EXECUTE PROCEDURE SPU_CONFERENCIA_ESTOQUE(:pdv_conferencia_id, OLD.pre_pedido_item_origem, 'D');
                 end

                 IF(NEW.QUANTIDADE <> :quantidade_original) then
                 begin
                   --exception "..." 'nova quantidade do item '||:novo_quantidade;

                   UPDATE tbpdv_conferencia_item B
                     SET B.quantidade     = :novo_quantidade,
                         B.EM_DEVOLUCAO   = 1,
                         B.valor_total    = :novo_valor_total,
                         B.valor_LIQUIDO  = (:novo_valor_total-:novo_valor_desc),
                         B.VALOR_DESCONTO = :novo_valor_desc
    
                    WHERE B.ID           = OLD.pre_pedido_item_origem;


                   UPDATE tbpdv_conferencia_item_saldo B
                     SET B.quantidade              = (:saldo_item+:DIFF_QUANTIDADE)
                     WHERE B.pdv_conferencia_item_id = OLD.pre_pedido_item_origem;
                 end
    


                if(:quantidade_alocado > 0)then
                 begin
                    EXECUTE PROCEDURE SPU_CONFERENCIA_ESTOQUE(:pdv_conferencia_id, OLD.pre_pedido_item_origem, 'A');
                 end

                 if(:item_nova_quantidade = 0)then
                 begin
                 
                     if(:quantidade_alocado > 0)then
                     begin
                        EXECUTE PROCEDURE SPU_CONFERENCIA_ESTOQUE(:pdv_conferencia_id, OLD.pre_pedido_item_origem, 'D');
                     end
                 
                     UPDATE tbpdv_conferencia_item B
                        SET B.SITUACAO                      = 4, 
                            b.pdv_conferencia_troca_item_id = new.id
                     WHERE B.ID           = OLD.pre_pedido_item_origem;

                 end else
                 begin

                     UPDATE tbpdv_conferencia_item B
                        SET B.SITUACAO      = 0,
                            b.pdv_conferencia_troca_item_id = 0
                        WHERE B.ID           = OLD.pre_pedido_item_origem;

                     :item_valor_desc       = 0;
                     :item_novo_valor_total = (:item_nova_quantidade*:valor_unitario);
                     if(:base_desconto > 0)THEN
                     BEGIN
                        :item_valor_desc = FN_CALC_PRECISION_V2(FN_CALC_PRECISION_V2(:base_desconto,100.00,'/'),:item_novo_valor_total,'*',2);--CAST(((:base_desconto/100.00)*:novo_valor_total) AS NUMERIC(15,2));
                     END

                     :pre_pedido_item_id = IIF(:ITEM_ENCERRADO_ID > 0,:ITEM_ENCERRADO_ID,GEN_ID(GTBPDV_CONFERENCIA_ITEM,1));

                     INSERT INTO TBPDV_CONFERENCIA_ITEM(
                             ID
                            ,PDV_CONFERENCIA_ID
                            ,SEQUENCIA
                            ,PRODUTO_ID
                            ,PRODUTO_DESCRICAO
                            ,TAM_DESCRICAO
                            ,EAN
                            ,QUANTIDADE
                            ,VALOR_UNITARIO
                            ,VALOR_DESCONTO
                            ,VALOR_TOTAL
                            ,VALOR_LIQUIDO
                            ,SITUACAO
                            ,OFFLINE_ID
                            ,TAMANHO
                            ,QTD_ESTOQUE
                            ,MODELO_ID
                            ,MODELO_DESCRICAO
                            ,COR_ID
                            ,COR_DESCRICAO
                            ,PDV_CONFERENCIA_TROCA_ITEM_ID)
                            SELECT 
                                CAST(:pre_pedido_item_id as integer) AS ID
                                ,A.PDV_CONFERENCIA_ID
                                ,(COALESCE((SELECT MAX(B.SEQUENCIA) FROM TBPDV_CONFERENCIA_ITEM B WHERE B.pdv_conferencia_id = A.PDV_CONFERENCIA_ID),0)+1) AS SEQUENCIA
                                ,A.PRODUTO_ID
                                ,A.PRODUTO_DESCRICAO
                                ,A.TAM_DESCRICAO
                                ,A.EAN
                                ,:item_nova_quantidade AS QUANTIDADE
                                ,A.VALOR_UNITARIO
                                ,:item_valor_desc AS VALOR_DESCONTO
                                ,:item_novo_valor_total AS VALOR_TOTAL
                                ,CAST((:item_novo_valor_total - :item_valor_desc) AS NUMERIC(15,2)) AS VALOR_LIQUIDO
                                ,4 AS SITUACAO
                                ,A.OFFLINE_ID
                                ,A.TAMANHO
                                ,0 AS QTD_ESTOQUE
                                ,A.MODELO_ID
                                ,A.MODELO_DESCRICAO
                                ,A.COR_ID
                                ,A.COR_DESCRICAO
                                ,NEW.ID AS PDV_CONFERENCIA_TROCA_ITEM_ID
    
                                FROM TBPDV_CONFERENCIA_ITEM A
                                WHERE A.ID = NEW.pre_pedido_item_origem;

                      NEW.pre_pedido_item_ID = :pre_pedido_item_id;
                 end


              END
  END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpdv_conf_troca_item_b0i for tbpdv_conferencia_troca_item
active before insert position 1
AS
declare variable verifica_pre_pedido INTEGER;
declare variable pre_pedido_id       INTEGER;
declare variable pre_pedido_item_id  integer;
declare VARIABLE pdv_conferencia_id  INTEGER;
declare variable FSEQUENCIA          VARCHAR(10);
declare variable FPREPEDIDO          VARCHAR(10);
declare variable DESC_PRODUTO        VARCHAR(500);
declare variable TAM_DESCRICAO       VARCHAR(10);
declare variable novo_quantidade     numeric(15,2);
declare variable antiga_quantidade   numeric(15,2);
declare variable saldo_item          numeric(15,2);
declare variable base_desconto       numeric(15,2);
declare variable novo_valor_desc     numeric(15,2);
declare variable novo_valor_desc2    numeric(15,2);
declare variable valor_unitario      numeric(15,2);
declare variable novo_valor_total    numeric(15,2);
declare variable novo_valor_total2   numeric(15,2);
declare variable quantidade_alocado  numeric(15,2);
DECLARE VARIABLE VALOR_ORIGINAL  NUMERIC(15,2);
declare variable PROMOCIONAL  INTEGER;

BEGIN

  if(new.pdv_conferencia_troca_id > 0)then
  begin
    verifica_pre_pedido = coalesce((SELECT FIRST 1 A.PRE_PEDIDO_ID FROM tbpdv_conferencia_troca A WHERE A.pre_pedido_id > 0 AND A.id = NEW.pdv_conferencia_troca_id),0);
    IF(verifica_pre_pedido > 0)THEN
    BEGIN
       EXCEPTION "..." 'EXISTEM PRE-PEDIDOS VINCULADOS A ESTE REGISTRO DE TROCA, INCLUSAO DE ITENS CANCELADA!';
    END
  end

  IF(NEW.pre_pedido_item_id > 0)THEN
  BEGIN

      NEW.pre_pedido_item_origem = NEW.pre_pedido_item_id;

      FOR SELECT FIRST 1
            FN_LPAD(A.sequencia,3,0) AS FSEQUENCIA,
            FN_LPAD(A.pdv_conferencia_id,6,0) AS FPREPEDIDO,
            FN_LPAD(A.produto_id,6,0)||' - '||A.produto_descricao AS DESC_PRODUTO,
            FN_TAMANHO_PRODUTO(A.produto_id,A.tamanho) AS TAM_DESCRICAO,
            A.QUANTIDADE,
            b.QUANTIDADE,
            IIF(A.VALOR_DESCONTO > 0,FN_CALC_PRECISION_V2(FN_CALC_PRECISION_V2(A.VALOR_DESCONTO,100.00,'*'),A.VALOR_TOTAL,'/'),0.00) AS PESO_DESCONTO,
            A.valor_unitario,
            A.VALOR_DESCONTO,
            A.valor_total,
            A.pdv_conferencia_id,
            a.qtd_estoque,
            A.PROMOCIONAL

            FROM TBPDV_CONFERENCIA_ITEM A, TBPDV_CONFERENCIA_ITEM_SALDO B
            WHERE A.ID = B.pdv_conferencia_item_id
              AND A.pdv_conferencia_id = B.pdv_conferencia_id
              AND A.ID                 = NEW.pre_pedido_item_id
              INTO :fsequencia, :fprepedido, :DESC_PRODUTO, :TAM_DESCRICAO, :antiga_quantidade, :saldo_item, :base_desconto,
                :valor_unitario, :novo_valor_desc, :novo_valor_total, :pdv_conferencia_id, :quantidade_alocado, :PROMOCIONAL DO
              BEGIN
                  :novo_valor_desc   = 0;
                  :novo_valor_desc2  = 0;
                  :novo_quantidade   = :antiga_quantidade-new.quantidade;
                  :novo_valor_total  = CAST((:valor_unitario*NEW.QUANTIDADE) AS NUMERIC(15,2));
                  :novo_valor_total2 = CAST((:valor_unitario*:novo_quantidade) AS NUMERIC(15,2));
                  if(:base_desconto > 0)THEN
                  BEGIN
                     :novo_valor_desc = FN_CALC_PRECISION_V2(FN_CALC_PRECISION_V2(:base_desconto,100.00,'/'),:novo_valor_total,'*',2);--CAST(((:base_desconto/100.00)*:novo_valor_total) AS NUMERIC(15,2));
                  END

                  IF(:base_desconto > 0)THEN
                  BEGIN
                     :novo_valor_desc2 = FN_CALC_PRECISION_V2(FN_CALC_PRECISION_V2(:base_desconto,100.00,'/'),:novo_valor_total2,'*',2);
                  END

                  if(:saldo_item <= 0) then
                  begin
                    EXCEPTION "..." '<h4>ATENCAO</h4>PRE-PEDIDO: '||:fprepedido||',ITEM SEQ.'||:fsequencia||'<BR> PRODUTO: <br> <strong>'||:DESC_PRODUTO||' '||:TAM_DESCRICAO||' COM SALDO NEGATIVO!<BR>OPERACAO CANCELADA!</strong>';
                  end

                  IF(NEW.ID IS NULL) THEN
                  BEGIN
                    NEW.ID = GEN_ID(GTBPDV_CONFERENCIA_TROCA_ITEM,1);
                  END

                  IF(:saldo_item <> NEW.QUANTIDADE)THEN
                  BEGIN
                      :pre_pedido_item_id = GEN_ID(GTBPDV_CONFERENCIA_ITEM,1);
                      /*INSERIR QUANTIDADE DA DEVOLUCAO COMO ENCERRADA*/
                      INSERT INTO TBPDV_CONFERENCIA_ITEM (
                             ID
                            ,PDV_CONFERENCIA_ID
                            ,SEQUENCIA
                            ,PRODUTO_ID
                            ,PRODUTO_DESCRICAO
                            ,TAM_DESCRICAO
                            ,EAN
                            ,QUANTIDADE
                            ,VALOR_UNITARIO
                            ,VALOR_DESCONTO
                            ,VALOR_TOTAL
                            ,VALOR_LIQUIDO
                            ,SITUACAO
                            ,OFFLINE_ID
                            ,TAMANHO
                            ,QTD_ESTOQUE
                            ,MODELO_ID
                            ,MODELO_DESCRICAO
                            ,COR_ID
                            ,COR_DESCRICAO
                            ,PDV_CONFERENCIA_TROCA_ITEM_ID
                            ,PROMOCIONAL
                            ,VALOR_ORIGINAL)
                            SELECT 
                                :pre_pedido_item_id AS ID
                                ,A.PDV_CONFERENCIA_ID
                                ,(COALESCE((SELECT MAX(B.SEQUENCIA) FROM TBPDV_CONFERENCIA_ITEM B WHERE B.pdv_conferencia_id = A.PDV_CONFERENCIA_ID),0)+1) AS SEQUENCIA
                                ,A.PRODUTO_ID
                                ,A.PRODUTO_DESCRICAO
                                ,A.TAM_DESCRICAO
                                ,A.EAN
                                ,NEW.QUANTIDADE AS QUANTIDADE
                                ,A.VALOR_UNITARIO
                                ,:novo_valor_desc AS VALOR_DESCONTO
                                ,:novo_valor_total AS VALOR_TOTAL
                                ,CAST((:novo_valor_total - :novo_valor_desc) AS NUMERIC(15,2)) AS VALOR_LIQUIDO
                                ,4 AS SITUACAO
                                ,A.OFFLINE_ID
                                ,A.TAMANHO
                                ,0 AS QTD_ESTOQUE
                                ,A.MODELO_ID
                                ,A.MODELO_DESCRICAO
                                ,A.COR_ID
                                ,A.COR_DESCRICAO
                                ,NEW.ID AS PDV_CONFERENCIA_TROCA_ITEM_ID
                                ,A.PROMOCIONAL
                                ,A.VALOR_ORIGINAL
    
                                FROM TBPDV_CONFERENCIA_ITEM A
                                WHERE A.ID = NEW.pre_pedido_item_id;

                       /*ATUALIZAR SALDO E QUANTIDADE DO ITEM ORIGINAL*/

                       if(:quantidade_alocado > 0)then
                        begin
                            NEW.PRE_PEDIDO_ITEM_ALOCADO = 1;
                            EXECUTE PROCEDURE SPU_CONFERENCIA_ESTOQUE(:pdv_conferencia_id, NEW.pre_pedido_item_id, 'D');
                        end

                       UPDATE tbpdv_conferencia_item B
                        SET B.quantidade     = :novo_quantidade,
                            B.EM_DEVOLUCAO   = 1,
                            B.VALOR_TOTAL    = :novo_valor_total2,
                            B.VALOR_LIQUIDO  = CAST(((:novo_valor_total2)-:novo_valor_desc2) AS NUMERIC(15,2)),
                            B.VALOR_DESCONTO = :novo_valor_desc2

                          WHERE B.ID = NEW.pre_pedido_item_id;

                       UPDATE tbpdv_conferencia_item_saldo B SET B.quantidade = (:saldo_item-NEW.quantidade)
                          WHERE B.pdv_conferencia_item_id = NEW.pre_pedido_item_id;

                          
                       if(:quantidade_alocado > 0)then
                       begin
                            EXECUTE PROCEDURE SPU_CONFERENCIA_ESTOQUE(:pdv_conferencia_id, NEW.pre_pedido_item_id, 'A');
                       end

                       /* TROCA ID DO ITEM REFERENCIADO PARA O NOVO ITEM ENCERRADO */
                       NEW.pre_pedido_item_id     = :pre_pedido_item_id;

                   END ELSE
                   BEGIN
                       /*SE QUANTIDADE DEVOLVIDA FOR IGUAL AO SALDO E O ITEM NAO POSSUIR SALDO UTILIZADO*/
                      if(:antiga_quantidade = :saldo_item)then
                      begin
                      
                        if(:quantidade_alocado > 0)then
                        begin
                            NEW.PRE_PEDIDO_ITEM_ALOCADO = 1;
                            EXECUTE PROCEDURE SPU_CONFERENCIA_ESTOQUE(:pdv_conferencia_id, NEW.pre_pedido_item_id, 'D');
                        end

                         update tbpdv_conferencia_item B set b.situacao = 4, b.pdv_conferencia_troca_item_id = new.id where b.id = new.pre_pedido_item_id;

                        
                        /*if(:quantidade_alocado > 0)then
                        begin
                            EXECUTE PROCEDURE SPU_CONFERENCIA_ESTOQUE(:pdv_conferencia_id, NEW.pre_pedido_item_id, 'A');
                        end*/
                      end else
                      begin
                         /*SE QUANTIDADE DEVOLVIDA FOR IGUAL AO SALDO E O ITEM POSSUIR SALDO UTILIZADO*/
                         
                          if(:quantidade_alocado > 0)then
                          begin
                            NEW.PRE_PEDIDO_ITEM_ALOCADO = 1;
                            EXECUTE PROCEDURE SPU_CONFERENCIA_ESTOQUE(:pdv_conferencia_id, NEW.pre_pedido_item_id, 'D');
                          end

                          UPDATE tbpdv_conferencia_item B
                            SET B.quantidade     = :novo_quantidade,
                                B.EM_DEVOLUCAO   = 1,
                                B.VALOR_TOTAL    = :novo_valor_total2,
                                B.VALOR_LIQUIDO  = CAST(((:novo_valor_total2)-:novo_valor_desc2) AS NUMERIC(15,2)),
                                B.VALOR_DESCONTO = :novo_valor_desc2
    
                              WHERE B.ID = NEW.pre_pedido_item_id;
    
                           UPDATE tbpdv_conferencia_item_saldo B SET B.quantidade = (:saldo_item-NEW.quantidade)
                              WHERE B.pdv_conferencia_item_id = NEW.pre_pedido_item_id;

                         if(:quantidade_alocado > 0)then
                         begin
                            EXECUTE PROCEDURE SPU_CONFERENCIA_ESTOQUE(:pdv_conferencia_id, NEW.pre_pedido_item_id, 'A');
                         end
                      end

                   END
              END
  END
END
^

SET TERM ; ^

