
INSERT INTO TBPARAMETRO (TABELA, CODIGO, DESCRICAO, VALOR, OBSERVACAO, GRUPO) VALUES ('TBUSUARIO', 'AUTORIZADORES_NIVEL_DIAS_UTEIS', 'LISTA DE USUARIOS AUTORIZADORES DE SOLICITACOES DE ENTRADA/SAIDA DE COLABORADORES/PRESTADORES EM DIAS UTEIS', '', 'UTILIZADO PARA DIAS UTEIS - SEG A SEX

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', 'WEB23411');


ALTER TABLE TBAUTORIZACAO
    ADD DATABASE_INFO DATE;

ALTER TABLE TBAUTORIZACAO
    ADD V_ALT INTEGER DEFAULT 0;




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

COMMENT ON COLUMN TBAUTORIZACAO.DATABASE_INFO IS
'Data utilizada para verificacao em trigger durante alteracao de valores';

COMMENT ON COLUMN TBAUTORIZACAO.V_ALT IS
'0 - NAO ESTA ATUALIZANDO POR TRIGGER;
1 - ESTA ATUALIZANDO POR TRIGGER;';

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

DROP TRIGGER TTBAUTORIZACAO_A01I;

SET TERM ^ ;

CREATE OR ALTER trigger ttbautorizacao_a01iu for tbautorizacao
active after insert or update position 0
AS
DECLARE VARIABLE USUARIO_ID INTEGER;
DECLARE VARIABLE VALOR VARCHAR(500);
DECLARE VARIABLE AUTORIZADORES VARCHAR(5000);
DECLARE VARIABLE DATA_BASE DATE;
DECLARE VARIABLE ASSUNTO VARCHAR(50);
DECLARE VARIABLE ASSUNTO_EMAIL VARCHAR(300);
DECLARE VARIABLE CORPO BLOB SUB_TYPE 0 SEGMENT SIZE 80;
DECLARE VARIABLE AUT_USUARIO_ID INTEGER;
DECLARE VARIABLE AUT_EMAIL VARCHAR(50);
DECLARE VARIABLE AUT_URL_SERVER VARCHAR(500);
DECLARE VARIABLE AUT_QTD_ITENS INTEGER;
DECLARE VARIABLE AUT_MIN_DATA VARCHAR(50);
DECLARE VARIABLE AUT_MAX_DATA VARCHAR(50);
BEGIN

    :DATA_BASE = COALESCE((SELECT IIF(MIN(Y.DATAHORA_ENTRADA) IS NOT NULL, MIN(Y.DATAHORA_ENTRADA), MAX(Y.DATAHORA_SAIDA)) FROM TBAUTORIZACAO_DETALHE Y WHERE Y.AUTORIZACAO_ID = NEW.ID), NULL);

    IF (INSERTING) THEN
    BEGIN

        IF (EXTRACT(WEEKDAY FROM :DATA_BASE) = 0 OR EXTRACT(WEEKDAY FROM :DATA_BASE) = 6) THEN
        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
        
                IF (COALESCE(:VALOR, '') <> '' AND FN_ISNUMBER(:VALOR) = TRUE) THEN
                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
        
        
            :AUTORIZADORES = COALESCE((SELECT LIST(X.USUARIO_ID||'|'||X.NIVEL) FROM TBAUTORIZACAO_AUTORIZADOR X WHERE X.AUTORIZACAO_ID = NEW.ID), '');
        
            IF (COALESCE(:AUTORIZADORES, '') = '') THEN
            BEGIN
        
                UPDATE TBAUTORIZACAO
                    SET STATUS = 1,
                        DATABASE_INFO = :DATA_BASE,
                        V_ALT = 1
                    WHERE ID = NEW.ID;
        
            END ELSE
            BEGIN

                UPDATE TBAUTORIZACAO
                    SET STATUS = 0,
                        DATABASE_INFO = :DATA_BASE,
                        V_ALT = 1
                    WHERE ID = NEW.ID;

            END

        END ELSE
        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_DIAS_UTEIS'
                
                ORDER BY T.VALOR
        
            INTO
                :USUARIO_ID,
                :VALOR
        
            DO
            BEGIN
        
                IF (COALESCE(:VALOR, '') <> '' AND FN_ISNUMBER(:VALOR) = TRUE) THEN
                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
        
        
            :AUTORIZADORES = COALESCE((SELECT LIST(X.USUARIO_ID||'|'||X.NIVEL) FROM TBAUTORIZACAO_AUTORIZADOR X WHERE X.AUTORIZACAO_ID = NEW.ID), '');
        
            IF (COALESCE(:AUTORIZADORES, '') = '') THEN
            BEGIN
        
                UPDATE TBAUTORIZACAO
                    SET STATUS = 1,
                        DATABASE_INFO = :DATA_BASE,
                        V_ALT = 1
                    WHERE ID = NEW.ID;
        
            END ELSE
            BEGIN

                UPDATE TBAUTORIZACAO
                    SET STATUS = 0,
                        DATABASE_INFO = :DATA_BASE,
                        V_ALT = 1
                    WHERE ID = NEW.ID;

            END    

        END

    END ELSE
    IF (UPDATING) THEN
    BEGIN

        IF (OLD.DATABASE_INFO IS DISTINCT FROM :DATA_BASE) THEN
        BEGIN

            DELETE FROM TBAUTORIZACAO_AUTORIZADOR WHERE AUTORIZACAO_ID = NEW.ID;

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

            IF (EXTRACT(WEEKDAY FROM :DATA_BASE) = 0 OR EXTRACT(WEEKDAY FROM :DATA_BASE) = 6) THEN
            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
            
                    IF (COALESCE(:VALOR, '') <> '' AND FN_ISNUMBER(:VALOR) = TRUE) THEN
                    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
            
            
                :AUTORIZADORES = COALESCE((SELECT LIST(X.USUARIO_ID||'|'||X.NIVEL) FROM TBAUTORIZACAO_AUTORIZADOR X WHERE X.AUTORIZACAO_ID = NEW.ID), '');

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

                    UPDATE TBAUTORIZACAO
                        SET STATUS = 1,
                            DATABASE_INFO = :DATA_BASE,
                            V_ALT = 1
                        WHERE ID = NEW.ID;
            
                END ELSE
                BEGIN

                    UPDATE TBAUTORIZACAO
                        SET STATUS = 0,
                            DATABASE_INFO = :DATA_BASE,
                            V_ALT = 1
                        WHERE ID = NEW.ID;

                END
    
            END ELSE
            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_DIAS_UTEIS'
                    
                    ORDER BY T.VALOR
            
                INTO
                    :USUARIO_ID,
                    :VALOR
            
                DO
                BEGIN
            
                    IF (COALESCE(:VALOR, '') <> '' AND FN_ISNUMBER(:VALOR) = TRUE) THEN
                    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
            
            
                :AUTORIZADORES = COALESCE((SELECT LIST(X.USUARIO_ID||'|'||X.NIVEL) FROM TBAUTORIZACAO_AUTORIZADOR X WHERE X.AUTORIZACAO_ID = NEW.ID), '');
            
                IF (COALESCE(:AUTORIZADORES, '') = '') THEN
                BEGIN

                    UPDATE TBAUTORIZACAO
                        SET STATUS = 1,
                            DATABASE_INFO = :DATA_BASE,
                            V_ALT = 1
                        WHERE ID = NEW.ID;
            
                END ELSE
                BEGIN

                    UPDATE TBAUTORIZACAO
                        SET STATUS = 0,
                            DATABASE_INFO = :DATA_BASE,
                            V_ALT = 1
                        WHERE ID = NEW.ID;

                END
    
            END

            /******************************************************************/
            /* Envio de Notificação */

            :ASSUNTO        = '';   
            :ASSUNTO_EMAIL  = '';
            :CORPO          = '';


            FOR
                SELECT
                    U.CODIGO AS ID,
                    U.EMAIL,

                    FN_PARAMETRO_V2('SISTEMA.URL_SERVER') AS URL_SERVER,
                    COALESCE((SELECT COUNT(Y.ID) FROM TBAUTORIZACAO_DETALHE Y WHERE Y.AUTORIZACAO_ID = A.AUTORIZACAO_ID), 0) QTD_ITENS,
    
                    FORMATDATETIME( COALESCE((SELECT MIN(Y.DATAHORA_ENTRADA) FROM TBAUTORIZACAO_DETALHE Y WHERE Y.AUTORIZACAO_ID = A.AUTORIZACAO_ID), NULL) ) AS MIN_DATA,
                    FORMATDATETIME( COALESCE((SELECT MAX(Y.DATAHORA_SAIDA) FROM TBAUTORIZACAO_DETALHE Y WHERE Y.AUTORIZACAO_ID = A.AUTORIZACAO_ID), NULL) ) AS MAX_DATA
    
                FROM (
                    SELECT
                        A.AUTORIZACAO_ID,
                        MAX(A.NIVEL) AS MAX_NIVEL
                    FROM TBAUTORIZACAO_AUTORIZADOR A
                    WHERE A.STATUS = 0
                    AND A.AUTORIZACAO_ID = NEW.ID

                    GROUP BY A.AUTORIZACAO_ID
                ) X, TBAUTORIZACAO_AUTORIZADOR A, TBUSUARIO U
                WHERE X.MAX_NIVEL = A.NIVEL
                AND A.USUARIO_ID = U.CODIGO
                AND A.AUTORIZACAO_ID = X.AUTORIZACAO_ID

            INTO
                :AUT_USUARIO_ID,
                :AUT_EMAIL,
                :AUT_URL_SERVER,
                :AUT_QTD_ITENS,
                :AUT_MIN_DATA,
                :AUT_MAX_DATA

            DO
            BEGIN

                :ASSUNTO = 'Nova Autorizacao de Entrada';
                :ASSUNTO_EMAIL = 'Nova Autorizacao de Entrada, Estabelecimento: '|| COALESCE((SELECT FIRST 1 IIF(CHAR_LENGTH(ESTAB.NOMEFANTASIA) > 0, ESTAB.NOMEFANTASIA, ESTAB.RAZAOSOCIAL) FROM TBESTABELECIMENTO ESTAB WHERE ESTAB.CODIGO = NEW.ESTABELECIMENTO_ID), '') ||', C.Custo: '|| COALESCE((SELECT FIRST 1 FN_MASK_V2(CCUSTO.CODIGO, 'CC')||' - '||CCUSTO.DESCRICAO FROM TBCENTRO_DE_CUSTO CCUSTO WHERE CCUSTO.CODIGO = NEW.CCUSTO_CODIGO), '') ||', Gestor: '|| COALESCE((SELECT FIRST 1 IIF(CHAR_LENGTH(USU.NOME) > 0, USU.NOME, USU.USUARIO) FROM TBUSUARIO USU WHERE USU.CODIGO = NEW.GESTOR_ID), '');

                :CORPO = '<div style="display: -webkit-inline-box;">';
                :CORPO = :CORPO ||' <span style="font-weight: bold;">O Gestor: </span>'|| COALESCE((SELECT FIRST 1 IIF(CHAR_LENGTH(USU.NOME) > 0, USU.NOME, USU.USUARIO) FROM TBUSUARIO USU WHERE USU.CODIGO = NEW.GESTOR_ID), '') ||' <span style="font-weight: bold;">Solicita: </span> AUTORIZACAO DE ENTRADA/SAIDA DE COLABORADORES/PRESTADORES<br>';
                :CORPO = :CORPO ||' <span style="font-weight: bold;">Estabelecimento: </span>'|| COALESCE((SELECT FIRST 1 IIF(CHAR_LENGTH(ESTAB.NOMEFANTASIA) > 0, ESTAB.NOMEFANTASIA, ESTAB.RAZAOSOCIAL) FROM TBESTABELECIMENTO ESTAB WHERE ESTAB.CODIGO = NEW.ESTABELECIMENTO_ID), '') ||'<br>';
                :CORPO = :CORPO ||' <span style="font-weight: bold;">C.Custo: </span>'|| COALESCE((SELECT FIRST 1 FN_MASK_V2(CCUSTO.CODIGO, 'CC')||' - '||CCUSTO.DESCRICAO FROM TBCENTRO_DE_CUSTO CCUSTO WHERE CCUSTO.CODIGO = NEW.CCUSTO_CODIGO), '') ||'<br>';
                :CORPO = :CORPO ||' <span style="font-weight: bold;">Período: </span>'|| COALESCE(:AUT_MIN_DATA, '') ||' a '|| COALESCE(:AUT_MAX_DATA, '') ||'<br>';
                :CORPO = :CORPO ||' <span style="font-weight: bold;">Qtd.: </span>'|| :AUT_QTD_ITENS ||'<br>';
                :CORPO = :CORPO ||'<br><a class="msg-balao-fechar" href="'|| :AUT_URL_SERVER ||'/_23411?ID='|| NEW.ID ||'" target="_blank" >Clique aqui para ver</a>';
                :CORPO = :CORPO ||'</div>';


                INSERT INTO TBNOTIFICACAO (TIPO, USUARIO_ID, TODOS, MENU_ID, TITULO, LEITURA, ENVIO, DATA_HORA, EMITENTE, AGENDAMENTO, EXECUTADO, TABELA, TABELA_ID, MENSAGEM)
                    VALUES (1, :AUT_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 (GEN_ID(GTBEMAIL, 1), :AUT_EMAIL, 0, :ASSUNTO_EMAIL, :CORPO, 0, CURRENT_TIMESTAMP);

            END

        END

    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 AND NEW.V_ALT = 0) THEN
    BEGIN
        EXCEPTION "..." 'REGISTRO JA AUTORIZADO. ALTERACAO NAO AUTORIZADA!';
    END ELSE
    BEGIN
        NEW.V_ALT = 0;
    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 ; ^

