SET TERM ^ ;

CREATE OR ALTER trigger ttbconferencia_item_b02i for tbconferencia_item
active before insert position 1
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);

DECLARE VARIABLE PEDIDO_ITEM_SEQ VARCHAR(500);
DECLARE VARIABLE PEDIDO VARCHAR(500);
BEGIN

    :HISTORICO = '';

    SELECT FIRST 1
        FN_LPAD(A.SEQUENCIA, 3, '0'),
        FN_LPAD(A.PEDIDO, 8, '0')
    FROM TBPEDIDO_ITEM A
    WHERE A.CONTROLE = NEW.TABELA_ITEM_ID INTO :PEDIDO_ITEM_SEQ, :PEDIDO;

    IF (NEW.ID > 0) THEN
    BEGIN
        :HISTORICO = :HISTORICO||'ITEM: '||:PEDIDO_ITEM_SEQ||' INCLUIDO NA CONFERENCIA: '||FN_LPAD(NEW.CONFERENCIA_ID, 6, '0')||' DO PEDIDO: '||:PEDIDO||'. QTD.TOTAL: '||FN_FORMAT_NUMBER2(NEW.QTD_TOTAL, 2)||', QTD.CONFERIDA: '||FN_FORMAT_NUMBER2(NEW.QTD_CONFERIDA, 2);
    END

    IF (:HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBCONFERENCIA_ITEM', NEW.CONFERENCIA_ID, :HISTORICO);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbconferencia_item_b01u for tbconferencia_item
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(5000);

DECLARE VARIABLE PEDIDO_ITEM_SEQ VARCHAR(500);
DECLARE VARIABLE PEDIDO VARCHAR(500);
BEGIN
    
    :HISTORICO = '';

    IF (OLD.ID <> NEW.ID) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' ID:'||OLD.ID||'->'||NEW.ID;
    END

    IF (OLD.CONFERENCIA_ID <> NEW.CONFERENCIA_ID) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' CONF.ID:'||OLD.CONFERENCIA_ID||'->'||NEW.CONFERENCIA_ID;
    END

    IF (OLD.PRODUTO_ID <> NEW.PRODUTO_ID) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' PRODUTO:'||OLD.PRODUTO_ID||'->'||NEW.PRODUTO_ID;
    END

    IF (OLD.TAMANHO <> NEW.TAMANHO) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' TAM:'||OLD.TAMANHO||'->'||NEW.TAMANHO;
    END

    IF (OLD.QTD_TOTAL <> NEW.QTD_TOTAL) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' QTD.TOTAL:'||OLD.QTD_TOTAL||'->'||NEW.QTD_TOTAL;
    END

    IF (OLD.QTD_CONFERIDA <> NEW.QTD_CONFERIDA) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' QTD.CONFERIDA:'||OLD.QTD_CONFERIDA||'->'||NEW.QTD_CONFERIDA;
    END

    IF (OLD.TABELA_ITEM_ID <> NEW.TABELA_ITEM_ID) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' ITEM PEDIDO:'||OLD.TABELA_ITEM_ID||'->'||NEW.TABELA_ITEM_ID;
    END

    IF (OLD.QTD_ALOCADA <> NEW.QTD_ALOCADA) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' QTD.ALOCADA:'||OLD.QTD_ALOCADA||'->'||NEW.QTD_ALOCADA;
    END

    IF (OLD.QTD_DISPONIVEL <> NEW.QTD_DISPONIVEL) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' QTD.DISPONIVEL:'||OLD.QTD_DISPONIVEL||'->'||NEW.QTD_DISPONIVEL;
    END

    IF (OLD.STATUS <> NEW.STATUS) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' STATUS:'||OLD.STATUS||'->'||NEW.STATUS;
    END

    IF (OLD.NF_ID <> NEW.NF_ID) THEN
    BEGIN
        :HISTORICO = :HISTORICO||' NF:'||OLD.NF_ID||'->'||NEW.NF_ID;
    END

    IF (HISTORICO <> '') THEN
    BEGIN

        SELECT FIRST 1
            FN_LPAD(A.SEQUENCIA, 3, '0'),
            FN_LPAD(A.PEDIDO, 8, '0')
        FROM TBPEDIDO_ITEM A
        WHERE A.CONTROLE = NEW.TABELA_ITEM_ID INTO :PEDIDO_ITEM_SEQ, :PEDIDO;
        
        :HISTORICO = 'ITEM: '||:PEDIDO_ITEM_SEQ||' ALTERADO NA CONFERENCIA: '||FN_LPAD(NEW.CONFERENCIA_ID, 6, '0')||' DO PEDIDO: '||:PEDIDO||:HISTORICO;
        EXECUTE PROCEDURE SPI_HISTORICO('TBCONFERENCIA_ITEM', OLD.CONFERENCIA_ID, FN_ELIPSE(:HISTORICO, 500));
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbconferencia_item_b01d for tbconferencia_item
active before delete position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);

DECLARE VARIABLE PEDIDO_ITEM_SEQ VARCHAR(500);
DECLARE VARIABLE PEDIDO VARCHAR(500);
BEGIN

    :HISTORICO = '';

    SELECT FIRST 1
        FN_LPAD(A.SEQUENCIA, 3, '0'),
        FN_LPAD(A.PEDIDO, 8, '0')
    FROM TBPEDIDO_ITEM A
    WHERE A.CONTROLE = OLD.TABELA_ITEM_ID INTO :PEDIDO_ITEM_SEQ, :PEDIDO;

    IF (OLD.ID > 0) THEN
    BEGIN
        :HISTORICO = :HISTORICO||'ITEM: '||:PEDIDO_ITEM_SEQ||' INCLUIDO NA CONFERENCIA: '||FN_LPAD(OLD.CONFERENCIA_ID, 6, '0')||' DO PEDIDO: '||:PEDIDO||'. QTD.TOTAL: '||FN_FORMAT_NUMBER2(OLD.QTD_TOTAL, 2)||', QTD.CONFERIDA: '||FN_FORMAT_NUMBER2(OLD.QTD_CONFERIDA, 2);
    END

    IF (:HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBCONFERENCIA_ITEM', OLD.CONFERENCIA_ID, :HISTORICO);
    END
END
^

SET TERM ; ^

/**************************************************************************/
/**************************************************************************/

SET TERM ^ ;

CREATE OR ALTER trigger ttbconferencia_b02i for tbconferencia
active before insert position 1
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
DECLARE VARIABLE DESC_STTS_NEW VARCHAR(500);
DECLARE VARIABLE HISTORICO_ID INTEGER;
BEGIN

    HISTORICO = '';
    
    IF (NEW.ID > 0) THEN
    BEGIN
        :DESC_STTS_NEW = '';
        
        IF (NEW.STATUS = 0) THEN
        BEGIN
            :DESC_STTS_NEW = 'NAO REALIZADA';
        END ELSE IF (NEW.STATUS = 1) THEN
        BEGIN
            :DESC_STTS_NEW = 'INICIADA';
        END ELSE IF (NEW.STATUS = 2) THEN
        BEGIN
            :DESC_STTS_NEW = 'FINALIZADA OK';
        END ELSE IF (NEW.STATUS = 3) THEN
        BEGIN
            :DESC_STTS_NEW = 'FINALIZADA COM DIVERGÊNCIAS';
        END ELSE IF (NEW.STATUS = 4) THEN
        BEGIN
            :DESC_STTS_NEW = 'FATURADA';
        END ELSE IF (NEW.STATUS = 5) THEN
        BEGIN
            :DESC_STTS_NEW = 'PARCIALMENTE FATURADA';
        END

        IF (NEW.TABELA = 'PED') THEN
        BEGIN
            :DESC_STTS_NEW = FN_LPAD(NEW.TABELA_ID, 8, '0')||FN_IS_EMPTY(NEW.SEQUENCIA)||' INCLUIDA';
        END
    
        HISTORICO = HISTORICO||'CONFERENCIA '||:DESC_STTS_NEW;
    END
    
    IF (HISTORICO <> '') THEN
    BEGIN
        IF (NEW.TABELA = 'NFE') THEN
        BEGIN
            :HISTORICO_ID = '01'||NEW.TABELA_ID;
        END ELSE IF (NEW.TABELA = 'NFS') THEN
        BEGIN
            :HISTORICO_ID = '02'||NEW.TABELA_ID;
        END ELSE IF (NEW.TABELA = 'PED') THEN
        BEGIN
            :HISTORICO_ID = '03'||NEW.TABELA_ID;
        END
    
        IF (NEW.TABELA = 'PED') THEN
        BEGIN
            EXECUTE PROCEDURE SPI_HISTORICO('TBCONFERENCIA', NEW.ID, :HISTORICO);
        END ELSE
        BEGIN
            EXECUTE PROCEDURE SPI_HISTORICO('TBCONFERENCIA', :HISTORICO_ID, :HISTORICO);
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbconferencia_b01u for tbconferencia
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(5000);

DECLARE VARIABLE HISTORICO_ID INTEGER;
DECLARE VARIABLE OLD_STATUS VARCHAR(500);
DECLARE VARIABLE NEW_STATUS VARCHAR(500);
DECLARE VARIABLE OLD_USUARIO VARCHAR(500);
DECLARE VARIABLE NEW_USUARIO VARCHAR(500);
BEGIN

    :HISTORICO = '';

    OLD_STATUS  = IIF(OLD.STATUS = '0', 'NAO REALIZADA', IIF(OLD.STATUS = '1', 'INICIADA', IIF(OLD.STATUS = '2', 'FINALIZADA OK', IIF(OLD.STATUS = '3', 'FINALIZADA COM DIVERGÊNCIAS', IIF(OLD.STATUS = '4', 'FATURADA', IIF(OLD.STATUS = '5', 'PARCIALMENTE FATURADA', ''))))));
    NEW_STATUS  = IIF(NEW.STATUS = '0', 'NAO REALIZADA', IIF(NEW.STATUS = '1', 'INICIADA', IIF(NEW.STATUS = '2', 'FINALIZADA OK', IIF(NEW.STATUS = '3', 'FINALIZADA COM DIVERGÊNCIAS', IIF(NEW.STATUS = '4', 'FATURADA', IIF(NEW.STATUS = '5', 'PARCIALMENTE FATURADA', ''))))));
    OLD_USUARIO = COALESCE((SELECT FIRST 1 FN_LPAD(A.CODIGO, 4, '0')||' - '||A.USUARIO FROM TBUSUARIO A WHERE A.CODIGO = OLD.USUARIO_ID), '');
    NEW_USUARIO = COALESCE((SELECT FIRST 1 FN_LPAD(A.CODIGO, 4, '0')||' - '||A.USUARIO FROM TBUSUARIO A WHERE A.CODIGO = NEW.USUARIO_ID), '');

    IF (OLD.TABELA <> NEW.TABELA) THEN
    BEGIN
        HISTORICO = HISTORICO||' TABELA:'||OLD.TABELA||'->'||NEW.TABELA;
    END

    IF (OLD.TABELA_ID <> NEW.TABELA_ID) THEN
    BEGIN
        HISTORICO = HISTORICO||' CODIGO:'||FN_LPAD(OLD.TABELA_ID, 8, '0')||'->'||FN_LPAD(NEW.TABELA_ID, 8, '0');
    END

    IF ((OLD.DATAHORA IS NULL AND NEW.DATAHORA IS NOT NULL) OR (OLD.DATAHORA IS NOT NULL AND NEW.DATAHORA IS NULL) OR (OLD.DATAHORA <> NEW.DATAHORA)) THEN
    BEGIN
        HISTORICO = HISTORICO||' DT.HORA INI:'||FN_TIMESTAMP_TO_STRING(OLD.DATAHORA)||'->'||FN_TIMESTAMP_TO_STRING(NEW.DATAHORA);
    END

    IF (OLD.USUARIO_ID <> NEW.USUARIO_ID) THEN
    BEGIN
        HISTORICO = HISTORICO||' USUARIO:'||OLD_USUARIO||'->'||NEW_USUARIO;
    END

    IF (OLD.STATUS <> NEW.STATUS) THEN
    BEGIN
        HISTORICO = HISTORICO||' STATUS:'||OLD_STATUS||'->'||NEW_STATUS;
    END

    IF (OLD.JUSTIFICATIVA <> NEW.JUSTIFICATIVA) THEN
    BEGIN
        HISTORICO = HISTORICO||' JUSTIF:'||OLD.JUSTIFICATIVA||'->'||NEW.JUSTIFICATIVA;
    END

    IF ((OLD.DATAHORA_FIM IS NULL AND NEW.DATAHORA_FIM IS NOT NULL) OR (OLD.DATAHORA_FIM IS NOT NULL AND NEW.DATAHORA_FIM IS NULL) OR (OLD.DATAHORA_FIM <> NEW.DATAHORA_FIM)) THEN
    BEGIN
        HISTORICO = HISTORICO||' DT.HORA FIM:'||FN_TIMESTAMP_TO_STRING(OLD.DATAHORA_FIM)||'->'||FN_TIMESTAMP_TO_STRING(NEW.DATAHORA_FIM);
    END

    IF (OLD.SEQUENCIA <> NEW.SEQUENCIA) THEN
    BEGIN
        HISTORICO = HISTORICO||' SEQ:'||OLD.SEQUENCIA||'->'||NEW.SEQUENCIA;
    END

    -- GRAVAR HISTORICO
    IF (HISTORICO <> '') THEN
    BEGIN
        IF (OLD.TABELA = 'NFE') THEN
        BEGIN
          :HISTORICO_ID = '01'||OLD.TABELA_ID;
        END ELSE IF (OLD.TABELA = 'NFS') THEN
        BEGIN
          :HISTORICO_ID = '02'||OLD.TABELA_ID;
        END ELSE IF (OLD.TABELA = 'PED') THEN
        BEGIN
          :HISTORICO_ID = '03'||OLD.TABELA_ID;
        END
    
        HISTORICO = 'CONFERENCIA '||FN_LPAD(NEW.TABELA_ID, 8, '0')||FN_IS_EMPTY(NEW.SEQUENCIA)||' ALTERADA:'||HISTORICO;
        IF (OLD.TABELA = 'PED') THEN
        BEGIN
            EXECUTE PROCEDURE SPI_HISTORICO('TBCONFERENCIA', OLD.ID, FN_ELIPSE(:HISTORICO, 500));
        END ELSE
        BEGIN
            EXECUTE PROCEDURE SPI_HISTORICO('TBCONFERENCIA', :HISTORICO_ID, FN_ELIPSE(:HISTORICO, 500));
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbconferencia_b01d for tbconferencia
active before delete position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
DECLARE VARIABLE HISTORICO_ID INTEGER;
BEGIN
    
    HISTORICO = '';
    
    IF ((OLD.STATUS = 4) OR (OLD.STATUS = 5)) THEN
    BEGIN
        EXCEPTION "..." 'ESTA CONFERENCIA JÁ FOI FATURADA. EXCLUSAO NAO AUTORIZADA!';
    END
    
    IF (OLD.ID > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'CONFERENCIA '||FN_LPAD(OLD.TABELA_ID, 8, '0')||FN_IS_EMPTY(OLD.SEQUENCIA)||' EXCLUIDA';
    END
    
    IF (HISTORICO <> '') THEN
    BEGIN
        IF (OLD.TABELA = 'NFE') THEN
        BEGIN
            :HISTORICO_ID = '01'||OLD.TABELA_ID;
        END ELSE IF (OLD.TABELA = 'NFS') THEN
        BEGIN
            :HISTORICO_ID = '02'||OLD.TABELA_ID;
        END ELSE IF (OLD.TABELA = 'PED') THEN
        BEGIN
            :HISTORICO_ID = '03'||OLD.TABELA_ID;
        END
    
        IF (OLD.TABELA = 'PED') THEN
        BEGIN
            EXECUTE PROCEDURE SPI_HISTORICO('TBCONFERENCIA', OLD.ID, :HISTORICO);
        END ELSE
        BEGIN
            EXECUTE PROCEDURE SPI_HISTORICO('TBCONFERENCIA', :HISTORICO_ID, :HISTORICO);
        END
    END
END
^

SET TERM ; ^

/*************************************************************************************************************/
/*************************************************************************************************************/

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_a01u for tbpedido_item
active after update position 1
AS
DECLARE VARIABLE CONFERENCIA_ITEM_ID INTEGER;
DECLARE VARIABLE CONFERENCIA_ID INTEGER;

DECLARE VARIABLE SALDO_DISPONIVEL NUMERIC(15,4);
BEGIN
    
    IF(OLD.QTD_EST <> NEW.QTD_EST) THEN
    BEGIN
    
        SELECT FIRST 1
            K.ID,
            K.CONFERENCIA_ID
        FROM TBCONFERENCIA_ITEM K
        WHERE COALESCE(K.STATUS, '0') <> '1'
        AND K.TABELA_ITEM_ID = NEW.CONTROLE INTO :CONFERENCIA_ITEM_ID, :CONFERENCIA_ID;

        IF(COALESCE(:CONFERENCIA_ITEM_ID, 0) > 0) THEN
        BEGIN
    
            IF (NEW.QTD_EST = 0) THEN
            BEGIN
            
                :SALDO_DISPONIVEL = COALESCE((SELECT FIRST 1
                    IIF((FN_ESTOQUE_SALDO_DISPONIVEL(B.ESTABELECIMENTO_CODIGO, B.LOCALIZACAO_ID, B.PRODUTO_CODIGO, B.TAMANHO)) > B.QUANTIDADE, B.QUANTIDADE, (FN_ESTOQUE_SALDO_DISPONIVEL(B.ESTABELECIMENTO_CODIGO, B.LOCALIZACAO_ID, B.PRODUTO_CODIGO, B.TAMANHO)))
                FROM TBCONFERENCIA A, TBCONFERENCIA_ITEM T
                INNER JOIN TBPEDIDO_ITEM B ON B.CONTROLE = T.TABELA_ITEM_ID
                WHERE A.ID = T.CONFERENCIA_ID
                AND A.TABELA = 'PED'
                AND T.ID = :CONFERENCIA_ITEM_ID), 0);
            
            END ELSE
            BEGIN
            
                :SALDO_DISPONIVEL = NEW.QTD_EST;
            
            END
    
            UPDATE TBCONFERENCIA_ITEM T SET
                T.QTD_ALOCADA       = NEW.QTD_EST,
                T.QTD_DISPONIVEL    = :SALDO_DISPONIVEL
            WHERE T.ID = :CONFERENCIA_ITEM_ID;
        
        END
    
    END
END
^

SET TERM ; ^

/********************************************************************************************/
/********************************************************************************************/

SET TERM ^ ;

CREATE OR ALTER trigger ttbconferencia_item_b01iu for tbconferencia_item
active before insert or update position 0
AS
DECLARE VARIABLE SEQUENCIA VARCHAR(500);
DECLARE VARIABLE PEDIDO VARCHAR(500);
DECLARE VARIABLE PRODUTO VARCHAR(500);
DECLARE VARIABLE TAMANHO VARCHAR(500);
BEGIN
    
    IF (NEW.QTD_CONFERIDA > NEW.QTD_TOTAL) THEN
    BEGIN

        SELECT FIRST 1
            FN_LPAD(A.SEQUENCIA, 3, '0'),
            FN_LPAD(A.PEDIDO, 8, '0')
        FROM TBPEDIDO_ITEM A
        WHERE A.CONTROLE = NEW.TABELA_ITEM_ID INTO :SEQUENCIA, :PEDIDO;

        SELECT FIRST 1
            FN_LPAD(B.CODIGO, 7, '0')||' - '||B.DESCRICAO,
            IIF(NEW.TAMANHO > 0, (SELECT X.TAM_DESCRICAO FROM SP_TAMANHO_GRADE(B.GRADE_CODIGO, NEW.TAMANHO) X), '')
        FROM TBPRODUTO B
        WHERE B.CODIGO = NEW.PRODUTO_ID INTO :PRODUTO, :TAMANHO;
        
        EXCEPTION "..." 'ITEM: '||:SEQUENCIA||' DO PEDIDO: '||:PEDIDO||' DA CONFERENCIA: '||FN_LPAD(NEW.CONFERENCIA_ID, 6, '0')||' <br>PRODUTO: '||:PRODUTO||' TAMANHO: '||:TAMANHO||' <br>QUANTIDADE A FATURAR: '||FN_FORMAT_NUMBER2(NEW.QTD_TOTAL, 4)||' <br>QUANTIDADE CONFERIDA: '||FN_FORMAT_NUMBER2(NEW.QTD_CONFERIDA, 4)||' <br><br>QUANTIDADE CONFERIDA NAO PODE SER SUPERIOR A QUANTIDADE A FATURAR.';
    END

END
^

SET TERM ; ^

