ALTER TABLE TBCONSUMO_REQUISICAO
	ADD STATUSEXCLUSAO CHAR(1) DEFAULT '0',
	ADD DATAHORA_INSERT TIMESTAMP DEFAULT 'NOW',
	ADD DATAHORA_UPDATE TIMESTAMP,
	ADD DATAHORA_DELETE TIMESTAMP;
	
--
--

ALTER TABLE TBESTOQUE_BAIXA
    ADD STATUSEXCLUSAO CHAR(1) DEFAULT '0',
    ADD DATAHORA_INSERT TIMESTAMP DEFAULT 'NOW',
    ADD DATAHORA_UPDATE TIMESTAMP,
    ADD DATAHORA_DELETE TIMESTAMP;
	
--
--

SET TERM ^ ;

CREATE OR ALTER TRIGGER TTBESTOQUE_BAIXA_B2U_03 FOR TBESTOQUE_BAIXA
ACTIVE BEFORE INSERT OR UPDATE POSITION 2
AS
/* BAIXA DE ESTOQUE */
DECLARE VARIABLE ESTOQUE_ID INTEGER;
DECLARE VARIABLE ESTABELECIMENTO_ID INTEGER;
DECLARE VARIABLE PRODUTO_ID INTEGER;
DECLARE VARIABLE TAMANHO INTEGER;
DECLARE VARIABLE DOCUMENTO INTEGER;
DECLARE VARIABLE TURNO_ID INTEGER;
DECLARE VARIABLE CCUSTO VARCHAR(10);
DECLARE VARIABLE RESPOSTA VARCHAR(100);
BEGIN

    IF (NEW.TIPO = 'R') THEN
    BEGIN
        
        IF (((OLD.QUANTIDADE IS NULL) OR (NEW.QUANTIDADE <> OLD.QUANTIDADE))
           OR ((OLD.OPERACAO_CODIGO IS NULL) OR (NEW.OPERACAO_CODIGO <> OLD.OPERACAO_CODIGO))
           OR ((OLD.LOCALIZACAO_ID IS NULL) OR (NEW.LOCALIZACAO_ID <> OLD.LOCALIZACAO_ID)))
        THEN
        BEGIN
		
            RESPOSTA =  COALESCE((SELECT FIRST 1
                            LPAD(COALESCE(C.ESTABELECIMENTO_ID, 0), 4, '0')||
                            LPAD(COALESCE(C.PRODUTO_ID, 0), 6, '0')||
                            LPAD(COALESCE(C.TAMANHO, 0), 2, '0')||
                            LPAD(COALESCE(C.DOCUMENTO, 0), 6, '0')||
                            LPAD(COALESCE(C.TURNO_ID, 0), 2, '0')||
                            LPAD(COALESCE(C.CCUSTO, 0), 8, '0')
                        FROM TBCONSUMO_REQUISICAO C
                        WHERE
                            C.ID = NEW.TABELA_ID), 0);
    
            ESTABELECIMENTO_ID  = CAST(SUBSTRING(RESPOSTA FROM  1 FOR 4) AS INTEGER);
            PRODUTO_ID          = CAST(SUBSTRING(RESPOSTA FROM  5 FOR 6) AS INTEGER);
            TAMANHO             = CAST(SUBSTRING(RESPOSTA FROM 11 FOR 2) AS INTEGER);
            DOCUMENTO           = CAST(SUBSTRING(RESPOSTA FROM 13 FOR 6) AS INTEGER);
            TURNO_ID            = CAST(SUBSTRING(RESPOSTA FROM 19 FOR 2) AS INTEGER);
            CCUSTO              = SUBSTRING(RESPOSTA FROM 21 FOR 8);
    
            IF (OLD.ESTOQUE_ID IS NULL) THEN
            BEGIN
                ESTOQUE_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
            END
            ELSE
            BEGIN
                ESTOQUE_ID = OLD.ESTOQUE_ID;
            END
    
            EXECUTE PROCEDURE SPU_ESTOQUE_SALDO4 (
            :ESTABELECIMENTO_ID,NEW.LOCALIZACAO_ID,
            :PRODUTO_ID,'S',CURRENT_DATE,
            NEW.QUANTIDADE,
            IIF(:TAMANHO = 1,NEW.QUANTIDADE,0),
            IIF(:TAMANHO = 2,NEW.QUANTIDADE,0),
            IIF(:TAMANHO = 3,NEW.QUANTIDADE,0),
            IIF(:TAMANHO = 4,NEW.QUANTIDADE,0),
            IIF(:TAMANHO = 5,NEW.QUANTIDADE,0),
            IIF(:TAMANHO = 6,NEW.QUANTIDADE,0),
            IIF(:TAMANHO = 7,NEW.QUANTIDADE,0),
            IIF(:TAMANHO = 8,NEW.QUANTIDADE,0),
            IIF(:TAMANHO = 9,NEW.QUANTIDADE,0),
            IIF(:TAMANHO =10,NEW.QUANTIDADE,0),
            IIF(:TAMANHO =11,NEW.QUANTIDADE,0),
            IIF(:TAMANHO =12,NEW.QUANTIDADE,0),
            IIF(:TAMANHO =13,NEW.QUANTIDADE,0),
            IIF(:TAMANHO =14,NEW.QUANTIDADE,0),
            IIF(:TAMANHO =15,NEW.QUANTIDADE,0),
            IIF(:TAMANHO =16,NEW.QUANTIDADE,0),
            IIF(:TAMANHO =17,NEW.QUANTIDADE,0),
            IIF(:TAMANHO =18,NEW.QUANTIDADE,0),
            IIF(:TAMANHO =19,NEW.QUANTIDADE,0),
            IIF(:TAMANHO =20,NEW.QUANTIDADE,0),
            :ESTOQUE_ID,:DOCUMENTO,
            NULL,NULL,NEW.OPERACAO_CODIGO,
            NULL,NULL,'0',0,NEW.USUARIO_ID,
            CURRENT_DATE,:TURNO_ID,:CCUSTO,
            'REQUISICAO DE CONSUMO',
            '0',0,0,0,0);
    
            NEW.ESTOQUE_ID = :ESTOQUE_ID;
        END
    END
END
^

SET TERM ; ^

--
--

SET TERM ^ ;

CREATE OR ALTER TRIGGER TTBESTOQUE_BAIXA_B1U_02 FOR TBESTOQUE_BAIXA
ACTIVE BEFORE UPDATE POSITION 1
AS
/* ATUALIZAR SALDO DO ESTOQUE */
BEGIN
    /* UPDATE */
    IF (NEW.STATUSEXCLUSAO = '0' AND OLD.STATUSEXCLUSAO = '0') THEN
    BEGIN
        IF ((OLD.ESTOQUE_ID > 0) AND(
           (NEW.QUANTIDADE <> OLD.QUANTIDADE)
        OR (NEW.OPERACAO_CODIGO <> OLD.OPERACAO_CODIGO)
        OR (NEW.LOCALIZACAO_ID <> OLD.LOCALIZACAO_ID)
        )) THEN
        BEGIN
            DELETE FROM TBESTOQUE_TRANSACAO_ITEM E
            WHERE CONTROLE = OLD.ESTOQUE_ID;
        END
    END
    
    /* DELETE */
    IF (NEW.STATUSEXCLUSAO = '1' AND OLD.STATUSEXCLUSAO = '0') THEN
    BEGIN
        IF (OLD.ESTOQUE_ID > 0) THEN
        BEGIN
            DELETE FROM TBESTOQUE_TRANSACAO_ITEM E
            WHERE CONTROLE = OLD.ESTOQUE_ID;
        END
    END
END
^

SET TERM ; ^



--
--

SET TERM ^ ;

CREATE OR ALTER TRIGGER TTBESTOQUE_BAIXA_B3U_04 FOR TBESTOQUE_BAIXA
ACTIVE BEFORE UPDATE POSITION 3
AS
/* ATUALIZAR O SALDO NA REQUISICAO DE CONSUMO */
BEGIN
    /* UPDATE */
    IF (NEW.STATUSEXCLUSAO = '0' AND OLD.STATUSEXCLUSAO = '0') THEN
    BEGIN
        IF (OLD.QUANTIDADE <> NEW.QUANTIDADE) THEN
        BEGIN
            UPDATE TBCONSUMO_REQUISICAO C
            SET C.SALDO = IIF((OLD.QUANTIDADE > NEW.QUANTIDADE),
                            (C.SALDO + (OLD.QUANTIDADE - NEW.QUANTIDADE)),
                            (C.SALDO - (NEW.QUANTIDADE - OLD.QUANTIDADE)))
            WHERE C.ID = OLD.TABELA_ID;
        END
    END
    /* DELETE */
    ELSE IF (NEW.STATUSEXCLUSAO = '1' AND OLD.STATUSEXCLUSAO = '0') THEN
    BEGIN
        UPDATE TBCONSUMO_REQUISICAO C
        SET C.SALDO = C.SALDO + OLD.QUANTIDADE
        WHERE C.ID = OLD.TABELA_ID;
    END
END
^

SET TERM ; ^


--
--

SET TERM ^ ;

CREATE TRIGGER TTBCONSUMO_REQUISICAO_B0U_02 FOR TBCONSUMO_REQUISICAO
ACTIVE BEFORE UPDATE POSITION 0
AS
/**************************************************
   ATUALIZA OS CAMPOS DATAHORA UPDATE E DELETE E
   REGISTRA HISTORICO DE EXCLUSAO/RECUPERACAO
**************************************************/
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

	/* UPDATE */
    IF ( NEW.STATUSEXCLUSAO = '0' AND OLD.STATUSEXCLUSAO = '0' ) THEN
    BEGIN
        NEW.DATAHORA_UPDATE = CURRENT_TIMESTAMP;
    END
	/* DELETE */
    ELSE IF ( NEW.STATUSEXCLUSAO = '1' AND OLD.STATUSEXCLUSAO = '0' ) THEN
    BEGIN
        NEW.DATAHORA_DELETE = CURRENT_TIMESTAMP;
        HISTORICO = 'REG. EXCLUIDO.';
    END
	/* RECUPERAR */
    ELSE IF ( NEW.STATUSEXCLUSAO = '0' AND OLD.STATUSEXCLUSAO = '1' ) THEN
    BEGIN
        NEW.DATAHORA_UPDATE = CURRENT_TIMESTAMP;
        HISTORICO = 'REG. RECUPERADO.';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        INSERT INTO TBHISTORICO (
            TABELA,
            TABELA_ID,
            USUARIO,
            IP,
            HISTORICO
        ) VALUES (
            'TBCONSUMO_REQUISICAO',
            NEW.ID,
            (SELECT FIRST 1 MON$USER FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION),
            (SELECT FIRST 1 MON$REMOTE_ADDRESS FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION),
            :HISTORICO
        );
    END
END
^

SET TERM ; ^


--
--

SET TERM ^ ;

CREATE TRIGGER TTBESTOQUE_BAIXA_B0U_01 FOR TBESTOQUE_BAIXA
ACTIVE BEFORE UPDATE POSITION 0
AS
/**************************************************
   ATUALIZA OS CAMPOS DATAHORA UPDATE E DELETE E
   REGISTRA HISTORICO DE EXCLUSAO/RECUPERACAO
**************************************************/
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

	/* UPDATE */
    IF ( NEW.STATUSEXCLUSAO = '0' AND OLD.STATUSEXCLUSAO = '0' ) THEN
    BEGIN
        NEW.DATAHORA_UPDATE = CURRENT_TIMESTAMP;
    END
	/* DELETE */
    ELSE IF ( NEW.STATUSEXCLUSAO = '1' AND OLD.STATUSEXCLUSAO = '0' ) THEN
    BEGIN
        NEW.DATAHORA_DELETE = CURRENT_TIMESTAMP;
        HISTORICO = 'REG. EXCLUIDO.';
    END
	/* RECUPERAR */
    ELSE IF ( NEW.STATUSEXCLUSAO = '0' AND OLD.STATUSEXCLUSAO = '1' ) THEN
    BEGIN
	    NEW.DATAHORA_UPDATE = CURRENT_TIMESTAMP;
        HISTORICO = 'REG. RECUPERADO.';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        INSERT INTO TBHISTORICO (
            TABELA,
            TABELA_ID,
            USUARIO,
            IP,
            HISTORICO
        ) VALUES (
            'TBESTOQUE_BAIXA',
            NEW.ID,
            (SELECT FIRST 1 MON$USER FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION),
            (SELECT FIRST 1 MON$REMOTE_ADDRESS FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION),
            :HISTORICO
        );
    END
END
^

SET TERM ; ^


--
--

SET TERM ^ ;

CREATE TRIGGER TTBCONSUMO_REQUISICAO_B0U_03 FOR TBCONSUMO_REQUISICAO
ACTIVE BEFORE UPDATE POSITION 1
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

   HISTORICO = '';

   IF (OLD.USUARIO_ID <> NEW.USUARIO_ID) THEN
       BEGIN
       HISTORICO = HISTORICO||' USUARIO:'||OLD.USUARIO_ID||'->'||NEW.USUARIO_ID;
       END
   IF (OLD.ESTABELECIMENTO_ID <> NEW.ESTABELECIMENTO_ID) THEN
       BEGIN
       HISTORICO = HISTORICO||' ESTAB.:'||OLD.ESTABELECIMENTO_ID||'->'||NEW.ESTABELECIMENTO_ID;
       END
   IF (OLD.DOCUMENTO <> NEW.DOCUMENTO) THEN
       BEGIN
       HISTORICO = HISTORICO||' DOC.:'||OLD.DOCUMENTO||'->'||NEW.DOCUMENTO;
       END
   IF (OLD.CCUSTO <> NEW.CCUSTO) THEN
       BEGIN
       HISTORICO = HISTORICO||' CCUSTO:'||OLD.CCUSTO||'->'||NEW.CCUSTO;
       END
   IF (OLD.TURNO_ID <> NEW.TURNO_ID) THEN
       BEGIN
       HISTORICO = HISTORICO||' TURNO:'||OLD.TURNO_ID||'->'||NEW.TURNO_ID;
       END
   IF (OLD.PRODUTO_ID <> NEW.PRODUTO_ID) THEN
       BEGIN
       HISTORICO = HISTORICO||' PROD.:'||OLD.PRODUTO_ID||'->'||NEW.PRODUTO_ID;
       END
   IF (OLD.QUANTIDADE <> NEW.QUANTIDADE) THEN
       BEGIN
       HISTORICO = HISTORICO||' QTD.:'||OLD.QUANTIDADE||'->'||NEW.QUANTIDADE;
       END
   IF (OLD.TAMANHO <> NEW.TAMANHO) THEN
       BEGIN
       HISTORICO = HISTORICO||' TAM.:'||OLD.TAMANHO||'->'||NEW.TAMANHO;
       END
   IF (OLD.OBSERVACAO <> NEW.OBSERVACAO) THEN
       BEGIN
       HISTORICO = HISTORICO||' OBS.:'||OLD.OBSERVACAO||'->'||NEW.OBSERVACAO;
       END
   IF (OLD.SALDO <> NEW.SALDO) THEN
       BEGIN
       HISTORICO = HISTORICO||' SALDO:'||OLD.SALDO||'->'||NEW.SALDO;
       END

   IF (OLD.STATUS <> NEW.STATUS) THEN
       BEGIN
       IF (NEW.STATUS = '0') THEN
           HISTORICO = HISTORICO||' STATUS BAIXADO';
       IF (NEW.STATUS = '1') THEN
           HISTORICO = HISTORICO||' STATUS PENDENTE';
       END

   IF (HISTORICO <> '') THEN
       BEGIN
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBCONSUMO_REQUISICAO', OLD.ID,
      (SELECT FIRST 1 MON$USER FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION),
      (SELECT FIRST 1 MON$REMOTE_ADDRESS FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION),
       :HISTORICO);
       END
END
^

SET TERM ; ^

--
--

SET TERM ^ ;

CREATE TRIGGER TTBESTOQUE_BAIXA_B4U_05 FOR TBESTOQUE_BAIXA
ACTIVE BEFORE UPDATE POSITION 4
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

   HISTORICO = '';

   IF (OLD.LOCALIZACAO_ID <> NEW.LOCALIZACAO_ID) THEN
       BEGIN
       HISTORICO = HISTORICO||' LOC.:'||OLD.LOCALIZACAO_ID||'->'||NEW.LOCALIZACAO_ID;
       END
   IF (OLD.OPERACAO_CODIGO <> NEW.OPERACAO_CODIGO) THEN
       BEGIN
       HISTORICO = HISTORICO||' OPER.:'||OLD.OPERACAO_CODIGO||'->'||NEW.OPERACAO_CODIGO;
       END
   IF (OLD.QUANTIDADE <> NEW.QUANTIDADE) THEN
       BEGIN
       HISTORICO = HISTORICO||' QTD.:'||OLD.QUANTIDADE||'->'||NEW.QUANTIDADE;
       END
   IF (OLD.USUARIO_ID <> NEW.USUARIO_ID) THEN
       BEGIN
       HISTORICO = HISTORICO||' USU.:'||OLD.USUARIO_ID||'->'||NEW.USUARIO_ID;
       END
   IF (OLD.ESTOQUE_ID <> NEW.ESTOQUE_ID) THEN
       BEGIN
       HISTORICO = HISTORICO||' ESTOQUE:'||OLD.ESTOQUE_ID||'->'||NEW.ESTOQUE_ID;
       END

   IF (HISTORICO <> '') THEN
       BEGIN
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBESTOQUE_BAIXA', OLD.ID,
      (SELECT FIRST 1 MON$USER FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION),
      (SELECT FIRST 1 MON$REMOTE_ADDRESS FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION),
       :HISTORICO);
       END
END
^

SET TERM ; ^

