SET TERM ^ ;

CREATE OR ALTER trigger tbpdv_confer_item_saldo_b01u for tbpdv_conferencia_item_saldo
active before update position 1
AS
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE QUANTIDADE NUMERIC(15,4);
DECLARE VARIABLE QUANT_ALOC NUMERIC(15,4);
DECLARE VARIABLE SALDO NUMERIC(15,4);
DECLARE VARIABLE ESTOQUE_DETALHE_ID INTEGER;
DECLARE VARIABLE DET_ITEM VARCHAR(1000);
BEGIN

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

      QUANTIDADE = ABS(OLD.QUANTIDADE - NEW.QUANTIDADE);
    
      IF (:QUANTIDADE > 0) THEN
          BEGIN
            FOR
            SELECT A.ID, A.QUANTIDADE, A.SALDO, A.ESTOQUE_DETALHE_ID
            FROM TBESTOQUE_DETALHE_ALOCACAO A
            WHERE A.TABELA_ID = OLD.PDV_CONFERENCIA_ID
              AND A.TAB_ITEM_ID = OLD.PDV_CONFERENCIA_ITEM_ID
              AND A.TAMANHO = OLD.TAMANHO
              AND A.TIPO = 'O'
            INTO :ID, :QUANT_ALOC, :SALDO, :ESTOQUE_DETALHE_ID
            DO
            BEGIN
              --SAIDA/BAIXA
              IF (NEW.QUANTIDADE < OLD.QUANTIDADE) THEN
                  BEGIN
                  IF (:QUANTIDADE > 0 AND :SALDO > 0) THEN
                      BEGIN
                          IF (:SALDO <= :QUANTIDADE) THEN
                          BEGIN
                            UPDATE TBESTOQUE_DETALHE_ALOCACAO A
                                SET SALDO = 0
                            WHERE ID = :ID AND TABELA_ID = OLD.PDV_CONFERENCIA_ID
                            AND TAB_ITEM_ID = OLD.PDV_CONFERENCIA_ITEM_ID
                            AND TAMANHO = OLD.TAMANHO AND TIPO = 'O';
        
                            QUANTIDADE = :QUANTIDADE - :SALDO;
                          END ELSE
                          IF (:SALDO > :QUANTIDADE) THEN
                          BEGIN
                            UPDATE TBESTOQUE_DETALHE_ALOCACAO A
                                SET SALDO = SALDO - :QUANTIDADE
                            WHERE ID = :ID AND TABELA_ID = OLD.PDV_CONFERENCIA_ID
                            AND TAB_ITEM_ID = OLD.PDV_CONFERENCIA_ITEM_ID
                            AND TAMANHO = OLD.TAMANHO AND TIPO = 'O';
        
                            QUANTIDADE = 0;
                          END
                      END
                  END ELSE
              --ENTRADA/CANCELAMENTO DA SA??DA
              IF (NEW.QUANTIDADE > OLD.QUANTIDADE) THEN
                  BEGIN
                  IF (:QUANTIDADE > 0 AND :SALDO < :QUANT_ALOC) THEN
                      BEGIN
                          IF (:QUANT_ALOC-:SALDO <= :QUANTIDADE) THEN
                          BEGIN
                            UPDATE TBESTOQUE_DETALHE_ALOCACAO A SET
                                SALDO = QUANTIDADE
                            WHERE ID = :ID AND TABELA_ID = OLD.PDV_CONFERENCIA_ID
                            AND TAB_ITEM_ID = OLD.PDV_CONFERENCIA_ITEM_ID
                            AND TAMANHO = OLD.TAMANHO AND TIPO = 'O';
                            QUANTIDADE = :QUANTIDADE - (:QUANT_ALOC-:SALDO);
                          END ELSE
                          IF (:QUANT_ALOC-:SALDO > :QUANTIDADE) THEN
                          BEGIN
                            UPDATE TBESTOQUE_DETALHE_ALOCACAO A SET
                                SALDO = SALDO + :QUANTIDADE
                            WHERE ID = :ID AND TABELA_ID = OLD.PDV_CONFERENCIA_ID
                            AND TAB_ITEM_ID = OLD.PDV_CONFERENCIA_ITEM_ID
                            AND TAMANHO = OLD.TAMANHO AND TIPO = 'O';
                            QUANTIDADE = 0;
                          END
                      END
                  END
            END
        END
    END

    IF(OLD.QUANTIDADE IS DISTINCT FROM NEW.QUANTIDADE)THEN
    BEGIN
        
        :DET_ITEM = COALESCE((SELECT FIRST 1 ITEM.ID||' - EAN: '||ITEM.EAN||IIF(ITEM.PDV_CONFERENCIA_MOVIMENTACAO_ID > 0, ' - MOV. '||ITEM.PDV_CONFERENCIA_MOVIMENTACAO_ID, '')
        FROM TBPDV_CONFERENCIA_ITEM ITEM WHERE ITEM.ID = NEW.PDV_CONFERENCIA_ITEM_ID AND ITEM.PDV_CONFERENCIA_ID = NEW.PDV_CONFERENCIA_ID),'000');

        
        EXECUTE PROCEDURE SPI_HISTORICO('TBPDV_CONFERENCIA', NEW.PDV_CONFERENCIA_ID, 'SALDO DO ITEM '||:DET_ITEM||' ALTERADO '||COALESCE(OLD.QUANTIDADE,0.00)||' -> '||COALESCE(NEW.quantidade,0.00));
    end
END
^

SET TERM ; ^

