
UPDATE OR INSERT INTO TBMENU (CONTROLE, GRUPO, SUBGRUPO, TIPO, URL, DESCRICAO, SUB_GRUPO)
    VALUES (23411, 'RH', 'RH', '1', '', 'REGISTRO DE AUTORIZAÇÃO DE ENTRADA/SAÍDA DE COLABORADORES/PRESTADORES', '2')
    MATCHING (CONTROLE);

UPDATE OR INSERT INTO TBMENU (CONTROLE, GRUPO, SUBGRUPO, TIPO, URL, DESCRICAO, SUB_GRUPO)
    VALUES (23410, 'RH', 'RH', '0', '23411', 'REGISTRO DE AUTORIZAÇÃO DE ENTRADA/SAÍDA DE COLABORADORES/PRESTADORES', '2')
    MATCHING (CONTROLE);


INSERT INTO TBMENU_DETALHE (MENU_ID, USUARIO_ID, INCLUIR, ALTERAR, EXCLUIR, IMPRIMIR, NEGAR)
SELECT
    23411,
    T.USUARIO_ID,
    T.INCLUIR,
    T.ALTERAR,
    T.EXCLUIR,
    T.IMPRIMIR,
    T.NEGAR

FROM TBMENU_DETALHE T
WHERE T.MENU_ID = 23410
AND T.USUARIO_ID NOT IN (
    SELECT
        T.USUARIO_ID
    FROM TBMENU_DETALHE T
    WHERE T.MENU_ID = 23411
);

INSERT INTO TBUSUARIO_PERFIL_MENU (PERFIL_ID, MENU_CONTROLE, INCLUIR, ALTERAR, EXCLUIR, IMPRIMIR, DATAHORA_INSERT, DATAHORA_UPDATE, DATAHORA_DELETE, NEGAR)
SELECT                                                       
    T.PERFIL_ID,                                             
    23411,
    T.INCLUIR,
    T.ALTERAR,
    T.EXCLUIR,
    T.IMPRIMIR,
    CURRENT_TIMESTAMP,
    NULL,
    NULL,
    T.NEGAR

FROM TBUSUARIO_PERFIL_MENU T
WHERE T.MENU_CONTROLE = 23410
AND T.PERFIL_ID NOT IN (
    SELECT
        T.PERFIL_ID
    FROM TBUSUARIO_PERFIL_MENU T
    WHERE T.MENU_CONTROLE = 23411
);


INSERT INTO TBMENU_FAVORITO (USUARIO_ID, MENU_ID, TIPO)
SELECT
    T.USUARIO_ID,
    23411,
    T.TIPO

FROM TBMENU_FAVORITO T
WHERE T.MENU_ID = 23410
AND T.USUARIO_ID NOT IN (
    SELECT
        T.USUARIO_ID
    FROM TBMENU_FAVORITO T
    WHERE T.MENU_ID = 23411
);

DELETE FROM TBMENU_FAVORITO WHERE MENU_ID = 23410;

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

UPDATE OR INSERT INTO TBPARAMETRO (TABELA, CODIGO, DESCRICAO, VALOR, OBSERVACAO, GRUPO)
    VALUES ('TBUSUARIO', 'AUTORIZADORES_NIVEL', 'AUTORIZADORES DE ENTRADA DE COLAB/PROVEDORES', '', 'SE VAZIO = NAO PODE AUTORIZAR; AUTORIZACAO E POR NIVEL E NIVEL 0 E O MAIS ALTO', 'WEB23411')
    MATCHING (TABELA, CODIGO);

	
UPDATE TBPARAMETRO A
    SET A.DESCRICAO = 'PERMITE MARCAR HORARIO DE ENTRADA/SAIDA DE COLABORAODRES/PRESTADORES',
        A.GRUPO = 'WEB23411'

    WHERE A.TABELA = 'TBUSUARIO'
    AND A.CODIGO = 'REG_ENTRADA_SAIDA_COLAB';

UPDATE TBPARAMETRO A
    SET A.DESCRICAO = 'LISTA DE USUARIOS AUTORIZADORES DE SOLICITACOES DE ENTRADA/SAIDA DE COLABORADORES/PRESTADORES',
        A.OBSERVACAO = 'USUARIOS QUE TEM PERMISSAO, POR NIVEL, DE AUTORIZAR A ENTRADA/SAIDA DE COLABORADORES/PRESTADORES. OS NIVEIS SAO EM ORDEM DECRESCENTE SENDO 0 O MAIOR NIVEL DE AUTORIZACAO'

    WHERE A.TABELA = 'TBUSUARIO'
    AND A.CODIGO = 'AUTORIZADORES_NIVEL';


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

ALTER TABLE TBAUTORIZACAO
    ADD STATUS INTEGER DEFAULT 0;


ALTER TABLE TBAUTORIZACAO ALTER COLUMN DATAHORA_REGISTRO
SET DEFAULT 'NOW';


CREATE INDEX ITBAUTORIZACAO_04
ON TBAUTORIZACAO (GESTOR_ID);

CREATE INDEX ITBAUTORIZACAO_03
ON TBAUTORIZACAO (USUARIO_ID);

CREATE INDEX ITBAUTORIZACAO_02
ON TBAUTORIZACAO (CCUSTO_CODIGO);

CREATE INDEX ITBAUTORIZACAO_01
ON TBAUTORIZACAO (ESTABELECIMENTO_ID);

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

ALTER TABLE TBAUTORIZACAO_DETALHE
    ADD COLABORADOR_ID INTEGER DEFAULT 0;


CREATE INDEX IAUTORIZACAO_DETALHE_02
ON TBAUTORIZACAO_DETALHE (COLABORADOR_ID);

CREATE INDEX IAUTORIZACAO_DETALHE_01
ON TBAUTORIZACAO_DETALHE (AUTORIZACAO_ID);

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

CREATE GENERATOR GTBAUTORIZACAO_AUTORIZADOR;

CREATE TABLE TBAUTORIZACAO_AUTORIZADOR (
    ID              INTEGER NOT NULL,
    AUTORIZACAO_ID  INTEGER,
    USUARIO_ID      INTEGER,
    STATUS          INTEGER DEFAULT 0,
    DATA_APROVACAO  TIMESTAMP,
    NIVEL           INTEGER
);




/******************************************************************************/
/****                             Primary keys                             ****/
/******************************************************************************/

ALTER TABLE TBAUTORIZACAO_AUTORIZADOR ADD CONSTRAINT PK_TBAUTORIZACAO_AUTORIZADOR PRIMARY KEY (ID);


/******************************************************************************/
/****                               Indices                                ****/
/******************************************************************************/

CREATE INDEX ITBAUTORIZACAO_AUTORIZADOR_01 ON TBAUTORIZACAO_AUTORIZADOR (AUTORIZACAO_ID);
CREATE INDEX ITBAUTORIZACAO_AUTORIZADOR_02 ON TBAUTORIZACAO_AUTORIZADOR (USUARIO_ID);
CREATE INDEX ITBAUTORIZACAO_AUTORIZADOR_03 ON TBAUTORIZACAO_AUTORIZADOR (STATUS);
CREATE INDEX ITBAUTORIZACAO_AUTORIZADOR_04 ON TBAUTORIZACAO_AUTORIZADOR (NIVEL);


/******************************************************************************/
/****                               Triggers                               ****/
/******************************************************************************/



SET TERM ^ ;



/******************************************************************************/
/****                         Triggers for tables                          ****/
/******************************************************************************/



/* Trigger: TTBAUTORIZACAO_AUTORIZADOR_B01I */
CREATE OR ALTER TRIGGER TTBAUTORIZACAO_AUTORIZADOR_B01I FOR TBAUTORIZACAO_AUTORIZADOR
ACTIVE BEFORE INSERT POSITION 0
as
begin
    if (new.id is null) then
        new.id = gen_id(gtbautorizacao_autorizador, 1);
end
^


/* Trigger: TTBAUTORIZACAO_AUTORIZADOR_B01U */
CREATE OR ALTER TRIGGER TTBAUTORIZACAO_AUTORIZADOR_B01U FOR TBAUTORIZACAO_AUTORIZADOR
ACTIVE BEFORE UPDATE POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(5000);
DECLARE VARIABLE PENDENTES INTEGER;
DECLARE VARIABLE LISTA VARCHAR(5000);
BEGIN

    :HISTORICO = '';

    IF (OLD.STATUS <> NEW.STATUS) THEN
    BEGIN

        SELECT
            COUNT(A.ID) AS PENDENTES,
            LIST(FN_LPAD(A.USUARIO_ID, 4, '0')||' - '||IIF(CHAR_LENGTH(U.NOME) > 0, U.NOME, U.USUARIO)) AS LISTA
        FROM TBAUTORIZACAO_AUTORIZADOR A
        LEFT JOIN TBUSUARIO U ON U.CODIGO = A.USUARIO_ID
        WHERE A.AUTORIZACAO_ID = NEW.AUTORIZACAO_ID
        AND A.NIVEL > NEW.NIVEL
        AND A.STATUS <> 1
        AND A.USUARIO_ID <> NEW.USUARIO_ID
            INTO :PENDENTES, :LISTA;

        IF (COALESCE(:PENDENTES, 0) > 0) THEN
        BEGIN
            IF (OLD.STATUS <> 1 AND NEW.STATUS = 1) THEN
            BEGIN
                EXCEPTION "..." 'AUTORIZACAO NAO PODE SER CONCLUIDA! '||IIF(:PENDENTES = 1, 'O USUARIO DE NIVEL INFERIOR ', 'OS USUARIOS DE NIVEL INFERIOR ')|| LISTA ||IIF(PENDENTES = 1, ' AINDA NAO AUTORIZOU.', ' AINDA NAO AUTORIZARAM.');
            END
        END
		
		
		SELECT
            COUNT(A.ID) AS PENDENTES,
            LIST(FN_LPAD(A.USUARIO_ID, 4, '0')||' - '||IIF(CHAR_LENGTH(U.NOME) > 0, U.NOME, U.USUARIO)) AS LISTA
        FROM TBAUTORIZACAO_AUTORIZADOR A
        LEFT JOIN TBUSUARIO U ON U.CODIGO = A.USUARIO_ID
        WHERE A.AUTORIZACAO_ID = NEW.AUTORIZACAO_ID
        AND A.NIVEL < NEW.NIVEL
        AND A.STATUS <> 0
        AND A.USUARIO_ID <> NEW.USUARIO_ID
            INTO :PENDENTES, :LISTA;

        IF (COALESCE(:PENDENTES, 0) > 0) THEN
        BEGIN
            IF (OLD.STATUS <> 0 AND NEW.STATUS = 0) THEN
            BEGIN
                EXCEPTION "..." 'AUTORIZACAO/NEGACAO NAO PODE DESFEITA! '||IIF(:PENDENTES = 1, 'O USUARIO DE NIVEL SUPERIOR ', 'OS USUARIOS DE NIVEL SUPERIOR ')|| LISTA ||IIF(PENDENTES = 1, ' JA AUTORIZOU/NEGOU.', ' JA AUTORIZARAM/NEGARAM.');
            END
        END


        IF (OLD.STATUS <> 1 AND NEW.STATUS = 1) THEN
        BEGIN
            :HISTORICO = :HISTORICO||' AUTORIZADA';
        END
        
        IF (OLD.STATUS <> 2 AND NEW.STATUS = 2) THEN
        BEGIN
            :HISTORICO = :HISTORICO||' RECUSADA';
        END
        
        IF (OLD.STATUS <> 0 AND NEW.STATUS = 0) THEN
        BEGIN
            :HISTORICO = :HISTORICO||' STATUS:'||OLD.STATUS||'->'||NEW.STATUS;
        END

    END


    IF (:HISTORICO <> '') THEN
    BEGIN
        :HISTORICO = 'AUTORIZACAO ALTERADA:'||:HISTORICO;
        EXECUTE PROCEDURE SPI_HISTORICO('TBAUTORIZACAO', NEW.AUTORIZACAO_ID, FN_ELIPSE(:HISTORICO, 500));
    END
END
^


/* Trigger: TTBAUTORIZACAO_AUTORIZADOR_B02U */
CREATE OR ALTER TRIGGER TTBAUTORIZACAO_AUTORIZADOR_B02U FOR TBAUTORIZACAO_AUTORIZADOR
ACTIVE BEFORE UPDATE POSITION 1
AS
DECLARE VARIABLE PENDENTES INTEGER;
DECLARE VARIABLE LISTA VARCHAR(5000);
DECLARE VARIABLE STATUS VARCHAR(5000);
BEGIN

    IF (OLD.STATUS <> NEW.STATUS)THEN
    BEGIN

        :STATUS = COALESCE((SELECT FN_DATE_TO_STRING( COALESCE(MAX(C.ENTRADA), MAX(C.SAIDA)) ) FROM TBAUTORIZACAO B, TBAUTORIZACAO_DETALHE C WHERE B.ID = C.AUTORIZACAO_ID AND B.ID = NEW.AUTORIZACAO_ID), '');

        IF (COALESCE(:STATUS, '') = '') THEN
        BEGIN

            IF (NEW.STATUS = 1) THEN
            BEGIN

                SELECT
                    COUNT(R.ID) AS PENDENTES,
                    LIST(IIF(CHAR_LENGTH(U.NOME) > 0, U.NOME, U.USUARIO), ', ') AS LISTA
                FROM TBAUTORIZACAO_AUTORIZADOR R, TBUSUARIO U
                WHERE R.AUTORIZACAO_ID = NEW.AUTORIZACAO_ID
                AND R.ID <> NEW.ID
                AND R.STATUS <> 1
                AND U.CODIGO = R.USUARIO_ID
                    INTO :PENDENTES, :LISTA;

                IF (:PENDENTES = 0 OR NEW.NIVEL = 0) THEN
                BEGIN
                    UPDATE TBAUTORIZACAO B SET B.STATUS = 1 WHERE B.ID = NEW.AUTORIZACAO_ID;
                END
                
            END ELSE
            BEGIN

                IF (NEW.STATUS = 2) THEN
                BEGIN

                    UPDATE TBAUTORIZACAO B SET B.STATUS = 2 WHERE B.ID = NEW.AUTORIZACAO_ID;

                END ELSE
                BEGIN

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

                        UPDATE TBAUTORIZACAO B SET B.STATUS = 0 WHERE B.ID = NEW.AUTORIZACAO_ID;

                    END

                END

            END

        END ELSE
        BEGIN

            EXCEPTION "..." 'AUTORIZACAO JA CONTEM REGISTROS DE ENTRADA';

        END
    END

END
^


/* Trigger: TTBAUTORIZACAO_AUTORIZADOR_B03U */
CREATE OR ALTER TRIGGER TTBAUTORIZACAO_AUTORIZADOR_B03U FOR TBAUTORIZACAO_AUTORIZADOR
ACTIVE BEFORE UPDATE POSITION 2
AS
DECLARE VARIABLE USUARIO_ID INTEGER;
DECLARE VARIABLE NIVEL INTEGER;
DECLARE VARIABLE EMAIL_ID INTEGER;
DECLARE VARIABLE DESTINATARIO VARCHAR(500);
DECLARE VARIABLE ASSUNTO VARCHAR(500);
DECLARE VARIABLE ASSUNTO_EMAIL VARCHAR(500);
DECLARE VARIABLE CORPO BLOB SUB_TYPE 1 SEGMENT SIZE 80;

DECLARE VARIABLE MAX_NIVEL INTEGER;
DECLARE VARIABLE PENDENTES INTEGER;
DECLARE VARIABLE REPROVACOES INTEGER;
DECLARE VARIABLE LISTA VARCHAR(300);

DECLARE VARIABLE ESTABELECIMENTO VARCHAR(500);
DECLARE VARIABLE CCUSTO VARCHAR(500);
DECLARE VARIABLE GESTOR VARCHAR(500);
DECLARE VARIABLE DATAHORA_REGISTRO TIMESTAMP;
DECLARE VARIABLE STATUS INTEGER;
DECLARE VARIABLE QTD INTEGER;
DECLARE VARIABLE DT_ENTRADA TIMESTAMP;
DECLARE VARIABLE DT_SAIDA TIMESTAMP;
BEGIN

    SELECT
        MAX(A.NIVEL) AS MAX_NIVEL
    FROM TBAUTORIZACAO_AUTORIZADOR A
    WHERE A.STATUS = 0
    AND A.NIVEL < NEW.NIVEL
    AND A.AUTORIZACAO_ID = NEW.AUTORIZACAO_ID
        INTO :MAX_NIVEL;

    :MAX_NIVEL = COALESCE(:MAX_NIVEL, -1);

    SELECT
        COUNT(R.ID) AS PENDENTES,
        LIST(IIF(CHAR_LENGTH(U.NOME) > 0, U.NOME, U.USUARIO), ', ') AS LISTA
    FROM TBAUTORIZACAO_AUTORIZADOR R, TBUSUARIO U
    WHERE R.AUTORIZACAO_ID = NEW.AUTORIZACAO_ID
    AND R.ID <> NEW.ID
    AND R.STATUS = 0
    AND R.NIVEL  = NEW.NIVEL
    AND U.CODIGO = R.USUARIO_ID
        INTO :PENDENTES, :LISTA;

    :PENDENTES = COALESCE(:PENDENTES, 0);

    SELECT
        COUNT(R.ID) AS PENDENTES
    FROM TBAUTORIZACAO_AUTORIZADOR R
    WHERE R.AUTORIZACAO_ID = NEW.AUTORIZACAO_ID
    AND R.STATUS = 2
        INTO :REPROVACOES;

    :REPROVACOES = COALESCE(:REPROVACOES, 0);

    IF (:MAX_NIVEL >= 0 AND :PENDENTES = 0 AND NEW.STATUS <> 2 AND :REPROVACOES = 0) THEN
    BEGIN

        SELECT FIRST 1
            IIF(CHAR_LENGTH(B.NOMEFANTASIA) > 0, B.NOMEFANTASIA, B.RAZAOSOCIAL) AS ESTABELECIMENTO,
            FN_MASK_V2(C.CODIGO, 'CC')||' - '||C.DESCRICAO AS CCUSTO,
            IIF(CHAR_LENGTH(D.NOME) > 0, D.NOME, D.USUARIO) AS GESTOR,
            A.DATAHORA_REGISTRO,
            A.STATUS,

            COALESCE((SELECT COUNT(AD.ID) FROM TBAUTORIZACAO_DETALHE AD WHERE AD.AUTORIZACAO_ID = A.ID), 0) AS QTD,
            COALESCE((SELECT MIN(AD.DATAHORA_ENTRADA) FROM TBAUTORIZACAO_DETALHE AD WHERE AD.AUTORIZACAO_ID = A.ID), NULL) AS MIN_DT_ENTRADA,
            COALESCE((SELECT MAX(AD.DATAHORA_SAIDA) FROM TBAUTORIZACAO_DETALHE AD WHERE AD.AUTORIZACAO_ID = A.ID), NULL) AS MAX_DT_SAIDA

        FROM TBAUTORIZACAO A
        INNER JOIN TBESTABELECIMENTO B ON B.CODIGO = A.ESTABELECIMENTO_ID
        LEFT JOIN TBCENTRO_DE_CUSTO C ON C.CODIGO = A.CCUSTO_CODIGO
        LEFT JOIN TBUSUARIO D ON D.CODIGO = A.GESTOR_ID
        WHERE A.ID = NEW.AUTORIZACAO_ID
            INTO :ESTABELECIMENTO, :CCUSTO, :GESTOR, :DATAHORA_REGISTRO, :STATUS, :QTD, :DT_ENTRADA, :DT_SAIDA;

        :ESTABELECIMENTO        = FN_CAMEL_CASE(COALESCE(:ESTABELECIMENTO, ''));
        :CCUSTO                 = FN_CAMEL_CASE(COALESCE(:CCUSTO, ''));
        :GESTOR                 = FN_CAMEL_CASE(COALESCE(:GESTOR, ''));
        :DATAHORA_REGISTRO      = COALESCE(:DATAHORA_REGISTRO, NULL);
        :STATUS                 = COALESCE(:STATUS, 0);
        :QTD                    = COALESCE(:QTD, 0);
        :DT_ENTRADA             = COALESCE(:DT_ENTRADA, NULL);
        :DT_SAIDA               = COALESCE(:DT_SAIDA, NULL);


        ASSUNTO = 'Nova Autorizacao de Entrada';
        ASSUNTO_EMAIL = 'Nova Autorizacao de Entrada, Estabelecimento:'||:ESTABELECIMENTO||', C.Custo:'||:CCUSTO||', Gestor:'||:GESTOR;
    
        CORPO = '<div style="display: -webkit-inline-box;">';
        CORPO = CORPO||' <span style="font-weight: bold;">O Gestor: </span>'||:GESTOR||' <span style="font-weight: bold;">Solicita: </span> AUTORIZACAO DE ENTRADA/SAIDA DE COLABORADORES/PRESTADORES<br>';
        CORPO = CORPO||' <span style="font-weight: bold;">Estabelecimento: </span>'||:ESTABELECIMENTO||'<br>';
        CORPO = CORPO||' <span style="font-weight: bold;">C.Custo: </span>'||:CCUSTO||'<br>';
        CORPO = CORPO||' <span style="font-weight: bold;">Período: </span>'||FORMATDATETIME(:DT_ENTRADA)||' a '||FORMATDATETIME(:DT_SAIDA)||'<br>';
        CORPO = CORPO||' <span style="font-weight: bold;">Qtd.: </span>'||:QTD||'<br>';
        CORPO = CORPO||'<br><a class="msg-balao-fechar" href="https://gc.delfa.com.br/_23411?ID='||NEW.AUTORIZACAO_ID||'" target="_blank" >Clique aqui para ver</a>';
        CORPO = CORPO||'</div>';

        FOR
            SELECT
                A.USUARIO_ID,
                A.NIVEL
            FROM TBAUTORIZACAO_AUTORIZADOR A
            WHERE A.STATUS = 0
            AND A.AUTORIZACAO_ID = NEW.AUTORIZACAO_ID
            AND A.NIVEL = :MAX_NIVEL
        INTO
            :USUARIO_ID,
            :NIVEL
        DO
        BEGIN

            :EMAIL_ID = (SELECT GEN_ID(GTBEMAIL, 1) FROM RDB$DATABASE);
            :DESTINATARIO = COALESCE((SELECT FIRST 1 U.EMAIL FROM TBUSUARIO U WHERE U.CODIGO = :USUARIO_ID), '');

            IF (:MAX_NIVEL = :NIVEL) THEN
            BEGIN
    
                INSERT INTO TBNOTIFICACAO (TIPO, USUARIO_ID, TODOS, MENU_ID, TITULO, LEITURA, ENVIO, DATA_HORA, EMITENTE, AGENDAMENTO, EXECUTADO, TABELA, TABELA_ID, MENSAGEM)
                    VALUES (1, :USUARIO_ID, 0, 0, :ASSUNTO, 0, 0, CURRENT_TIMESTAMP, FN_CURRENT_USER_ID(), CURRENT_TIMESTAMP, 0, '', 0, :CORPO);
    
                INSERT INTO TBEMAIL (ID, EMAIL, USUARIO_ID, ASSUNTO, CORPO, STATUS, DATAHORA)
                    VALUES (:EMAIL_ID, :DESTINATARIO, 0, :ASSUNTO_EMAIL, :CORPO, 0, CURRENT_TIMESTAMP);

            END

        END

    END
END
^

SET TERM ; ^



/******************************************************************************/
/****                         Fields descriptions                          ****/
/******************************************************************************/

COMMENT ON COLUMN TBAUTORIZACAO_AUTORIZADOR.STATUS IS 
'0 - PENDENTE;
1 - AUTORIZADO;
2 - NEGADO;';

COMMENT ON COLUMN TBAUTORIZACAO_AUTORIZADOR.NIVEL IS 
'0 - Nivel mais alto;

As solicitacoes seguem dos maiores numeros para os menores ate chegar a 0';

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

SET TERM ^ ;

CREATE OR ALTER trigger ttbautorizacao_a01i for tbautorizacao
active after insert position 0
AS
DECLARE VARIABLE USUARIO_ID INTEGER;
DECLARE VARIABLE VALOR VARCHAR(500);
BEGIN

    FOR
        SELECT
            T.TABELA_ID AS USUARIO_ID,
            COALESCE(T.VALOR, '') AS VALOR
        
        FROM TBPARAMETRO_DETALHE T
        INNER JOIN TBPARAMETRO A ON A.ID = T.PARAMETRO_ID
        WHERE A.CODIGO = 'AUTORIZADORES_NIVEL'
        
        ORDER BY T.VALOR

    INTO
        :USUARIO_ID,
        :VALOR

    DO
    BEGIN

        UPDATE OR INSERT INTO TBAUTORIZACAO_AUTORIZADOR (AUTORIZACAO_ID, USUARIO_ID, NIVEL)
            VALUES (NEW.ID, :USUARIO_ID, :VALOR)
            MATCHING (AUTORIZACAO_ID, USUARIO_ID);

    END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbautorizacao_b01u for tbautorizacao
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(5000);
BEGIN

    HISTORICO = '';


	IF (OLD.STATUS = 1 AND NEW.STATUS = 1) THEN
    BEGIN
        EXCEPTION "..." 'REGISTRO JA AUTORIZADO. ALTERACAO NAO AUTORIZADA!';
    END


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

    IF (OLD.CCUSTO_CODIGO <> NEW.CCUSTO_CODIGO) THEN
    BEGIN
        HISTORICO = HISTORICO||' C.CUSTO:'||FN_MASK_V2(OLD.CCUSTO_CODIGO, 'CC')||'->'||FN_MASK_V2(NEW.CCUSTO_CODIGO, 'CC');
    END

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

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

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


    IF (HISTORICO <> '') THEN
    BEGIN
        HISTORICO = ' REGISTRO ALTERADO:'||HISTORICO;
        EXECUTE PROCEDURE SPI_HISTORICO('TBAUTORIZACAO', OLD.ID, FN_ELIPSES(:HISTORICO, 500));
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbautorizacao_b01d for tbautorizacao
active before delete position 0
AS
    DECLARE VARIABLE AUT_DETALHE_ENT TIMESTAMP;
    DECLARE VARIABLE AUT_DETALHE_SAI TIMESTAMP;
BEGIN
    AUT_DETALHE_ENT = (SELECT FIRST 1 A.ENTRADA FROM TBAUTORIZACAO_DETALHE A WHERE A.AUTORIZACAO_ID = OLD.ID AND A.ENTRADA IS NOT NULL);
    AUT_DETALHE_SAI = (SELECT FIRST 1 A.SAIDA FROM TBAUTORIZACAO_DETALHE A WHERE A.AUTORIZACAO_ID = OLD.ID AND A.SAIDA IS NOT NULL);

    IF((AUT_DETALHE_ENT IS NOT NULL) OR (AUT_DETALHE_SAI IS NOT NULL)) THEN
    BEGIN
        EXCEPTION  "..." 'Autorização não pode ser excluída. Entrada/Saída já registrada em um dos Colaboradors/Prestadores cadastrados. ';
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbautorizacao_b03d for tbautorizacao
active before delete position 2
AS
BEGIN
  DELETE FROM TBAUTORIZACAO_DETALHE A WHERE A.AUTORIZACAO_ID = OLD.ID;          -- EXCLUI REGISTROS RELACIONADOS AO PAINEL DELETADO.
  DELETE FROM TBAUTORIZACAO_AUTORIZADOR B WHERE B.AUTORIZACAO_ID = OLD.ID;      -- ESCLUIR REGISTROS RELACIOANADOS A AUTORIZACAO DO PAINEL.
END
^

SET TERM ; ^

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

SET TERM ^ ;

CREATE OR ALTER trigger ttbusuario_b01u for tbusuario
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(1000);
BEGIN

    HISTORICO = '';

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

    IF(OLD.NOME <> NEW.NOME) THEN
    BEGIN
       HISTORICO = HISTORICO||', Nome Alterado';
    END

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

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

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

    IF(OLD.SKYPE <> NEW.SKYPE) THEN
    BEGIN
       HISTORICO = HISTORICO||', Skype Alterado';
    END

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

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

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

    IF(OLD.NIVEL_OC <> NEW.NIVEL_OC) THEN
    BEGIN
       HISTORICO = HISTORICO||', Nivel OC: '||OLD.NIVEL_OC||' -> '||NEW.NIVEL_OC;
    END

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

    IF(OLD.EMAIL_SMTP <> NEW.EMAIL_SMTP) THEN
    BEGIN
       HISTORICO = HISTORICO||', Email SMTP: '||OLD.EMAIL_SMTP||' -> '||NEW.EMAIL_SMTP;
    END

    IF(OLD.EMAIL_USERNAME <> NEW.EMAIL_USERNAME) THEN
    BEGIN
       HISTORICO = HISTORICO||', User Alterado';
    END

    IF(OLD.EMAIL_PASS <> NEW.EMAIL_PASS) THEN
    BEGIN
       HISTORICO = HISTORICO||', Password Alterado';
    END

    IF(OLD.PORTA_SMTP <> NEW.PORTA_SMTP) THEN
    BEGIN
       HISTORICO = HISTORICO||', Porta SMTP: '||OLD.PORTA_SMTP||' -> '||NEW.PORTA_SMTP;
    END

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

    IF(OLD.SSL_TLS <> NEW.SSL_TLS) THEN
    BEGIN
       HISTORICO = HISTORICO||', Con.Segura: '||OLD.SSL_TLS||' -> '||NEW.SSL_TLS;
    END

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

    IF(OLD.VENDEDOR_ID IS DISTINCT FROM NEW.VENDEDOR_ID) THEN
    BEGIN
       HISTORICO = HISTORICO||', VENDEDOR: '||COALESCE(OLD.VENDEDOR_ID, 0)||' -> '||COALESCE(NEW.VENDEDOR_ID, 0);
    END

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

    IF(OLD.CCUSTO <> NEW.CCUSTO) THEN
    BEGIN
       HISTORICO = HISTORICO||', C.Custo: '||OLD.CCUSTO||' -> '||NEW.CCUSTO;
    END

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

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

    IF(OLD.TIPO_ID <> NEW.TIPO_ID) THEN
    BEGIN
       HISTORICO = HISTORICO||', Tipo Usuario: '||OLD.TIPO_ID||' -> '||NEW.TIPO_ID;
    END

    IF (OLD.HABILITA_INCLUIR_CHAMADO <> NEw.HABILITA_INCLUIR_CHAMADO) THEN
    BEGIN
        HISTORICO = HISTORICO||', Inc.Chamdo: '||OLD.HABILITA_INCLUIR_CHAMADO||' -> '||NEW.HABILITA_INCLUIR_CHAMADO;
    END

    IF(HISTORICO <> '') THEN
    BEGIN
       historico = FN_ELIPSES(historico,500);
       EXECUTE PROCEDURE SPI_HISTORICO('TBUSUARIO',NEW.CODIGO, HISTORICO);
    END
END
^

SET TERM ; ^

