SET TERM ^ ;

ALTER TABLE TBPDV_CONFERENCIA_ITEM
ADD EXCLUINDO_TROCA SMALLINT
DEFAULT 0^

CREATE OR ALTER trigger tbpdv_conferencia_item_b01d for tbpdv_conferencia_item
active before delete position 1
AS
declare variable ITEM_DEVOLUCAO_ID INTEGER;
BEGIN
  IF(OLD.ID > 0) THEN
  BEGIN
    -- VALIDACAO PARA STATUS DA CONFERENCIA
    IF(OLD.SITUACAO = 3) THEN
    BEGIN
         EXCEPTION "..." 'CONFERENCIA JA VINCULADA EM UM CUPOM FISCAL. EXCLUSÃO CANCELADA.';
    END

    /*IF(OLD.SITUACAO = 4) THEN
    BEGIN
       EXCEPTION "..." 'ITEM SEQ.'||FN_LPAD(OLD.sequencia,3,0)||' ENCERRADO. EXCLUSÃO CANCELADA';
    END*/

    :ITEM_DEVOLUCAO_ID = COALESCE((SELECT FIRST 1 D.ID FROM TBPDV_CONFERENCIA_TROCA_ITEM D WHERE
                                (D.pre_pedido_item_origem = OLD.ID or D.pre_pedido_item_id = OLD.ID)
                                 AND D.pre_pedido_id = OLD.pdv_conferencia_id AND COALESCE(OLD.excluindo_troca,0) = 0),0);
    IF(ITEM_DEVOLUCAO_ID > 0)THEN
    BEGIN
       EXCEPTION "..." 'ITEM SEQ.'||FN_LPAD(OLD.sequencia,3,0)||' POSSUI TROCA VINCULADA. EXCLUSÃO CANCELADA';
    END

    EXECUTE PROCEDURE SPU_CONFERENCIA_ESTOQUE(OLD.pdv_conferencia_id, OLD.ID, 'D');
  END
END^

CREATE OR ALTER trigger tbpdv_conf_troca_item_b01d for tbpdv_conferencia_troca_item
active before delete position 0
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.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 ; ^