SET TERM ^ ;

CREATE OR ALTER trigger dlf_ttbestoque_trans_item_a2i for tbestoque_transacao_item
active before insert position 2
AS
declare variable DATAHORA TIMESTAMP;
declare variable USUARIO VARCHAR(200);
declare variable OPERACAO VARCHAR(144);
declare variable PRODUTO VARCHAR(436); 
declare variable QUANTIDADE NUMERIC(18,5); 
declare variable MOTIVO VARCHAR(80);
declare variable OBSERVACAO VARCHAR(400);

declare variable USUARIO_ID 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 notificar_email integer;
declare variable notificar_web integer;
begin

  if ((new.tipo = 'S' and new.localizacao_codigo = 20 and new.operacao_codigo = 'SPD' and new.motivo_baixa_id > 0)  or
      (new.tipo = 'S' and new.localizacao_codigo = 20 and new.operacao_codigo = 'SIR')  or
      (new.tipo = 'S' and new.localizacao_codigo = 20 and new.operacao_codigo = 'SRP')) then
        begin

                :USUARIO  = (SELECT FIRST 1 NOME FROM TBUSUARIO  WHERE CODIGO = NEW.USUARIO_CODIGO);
                :OPERACAO = (SELECT FIRST 1 CODIGO||' - '||DESCRICAO FROM TBOPERACAO WHERE CODIGO = NEW.OPERACAO_CODIGO);
                :PRODUTO  = (SELECT FIRST 1 LPAD(CODIGO,6,'0')||' - '||DESCRICAO FROM TBPRODUTO  WHERE CODIGO = NEW.PRODUTO_CODIGO);
                :MOTIVO   = (SELECT FIRST 1 DESCRICAO FROM TBSOBRA_SAIDA_MOTIVO WHERE ID = NEW.MOTIVO_BAIXA_ID);
                :DATAHORA = NEW.DATAHORA;
                :QUANTIDADE = NEW.QUANTIDADE;
                :OBSERVACAO = NEW.OBSERVACAO;

                USUARIO         = FN_CAPITALIZE(coalesce(USUARIO, ''));
                MOTIVO          = FN_CAMEL_CASE(coalesce(MOTIVO, ''));
                OBSERVACAO      = FN_CAMEL_CASE(coalesce(OBSERVACAO, ''));
                --PRODUTO         = FN_CAMEL_CASE(coalesce(PRODUTO, ''));
                --OPERACAO        = FN_CAMEL_CASE(coalesce(OPERACAO, ''));
        
                notificar_email = coalesce(notificar_email, 0);
                notificar_web   = coalesce(notificar_web, 0);
            
                ASSUNTO = 'Baixa Avulsa de Bloco de Espuma';
                ASSUNTO_EMAIL = 'Baixa Avulsa de Bloco de Espuma - '||PRODUTO;
            
                CORPO = '<div style="display: -webkit-inline-box;">';
                CORPO = CORPO||' <span style="font-weight: bold;">Data/Hora:</span>'||fn_timestamp_to_string(DATAHORA)||'<br>';
                CORPO = CORPO||' <span style="font-weight: bold;">Usuario:</span>'||USUARIO||'<br>';
                CORPO = CORPO||' <span style="font-weight: bold;">Operação:</span> '||OPERACAO||'<br>';
                CORPO = CORPO||' <span style="font-weight: bold;">Produto:</span> '||PRODUTO||'<br>';
                CORPO = CORPO||' <span style="font-weight: bold;">Quant:</span> '||QUANTIDADE||'<br>';
                CORPO = CORPO||' <span style="font-weight: bold;">Motivo:</span> '||MOTIVO||'<br>';
                CORPO = CORPO||' <span style="font-weight: bold;">Observação:</span> '||OBSERVACAO||'<br>';
                CORPO = CORPO||'</div>';

                  FOR
                    SELECT U.CODIGO, U.EMAIL FROM TBUSUARIO U WHERE U.SETOR = 'PCP' AND U.STATUS = '1'
                     INTO :USUARIO_ID, :DESTINATARIO
                     DO BEGIN
                            EMAIL_ID = (SELECT GEN_ID(GTBEMAIL,1) FROM RDB$DATABASE);
            
                            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,
                                MODULO_EMAIL
                            ) VALUES (
                                :EMAIL_ID,
                                :DESTINATARIO,
                                0,
                                :ASSUNTO_email,
                                :CORPO,
                                0,
                                CURRENT_TIMESTAMP,
                                16
                            );
            
                       END
            
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger tbocorrencia_web_freed_b03i for tbocorrencia_web_freed
active before insert position 3
AS
declare variable id integer;
declare variable corpo1 blob sub_type 1 segment size 80;
declare variable corpo2 blob sub_type 1 segment size 80;
declare variable corpo3 blob sub_type 1 segment size 80;
declare variable html1 varchar(4000);
declare variable html2 varchar(4000);
declare variable tipo integer;
declare variable linha integer;
declare variable assunto varchar(100);
declare variable descricao blob sub_type 1 segment size 80;
declare variable json blob sub_type 1 segment size 80;
declare variable campos_tabela_web varchar(300);
declare variable campos_sql_web varchar(300);
declare variable descricao_web varchar(300);
declare variable campo varchar(300);
declare variable tipo_descricao varchar(300);
declare variable motivo_descricao varchar(300);
declare variable email varchar(300);
declare variable usuario_abertura varchar(300);
declare variable usuario_email varchar(100);
begin

    if(new.origem = 1 and new.usuario_id > 0)then
    begin

        html1 = (SELECT first 1 p.conteudo FROM TBHTML_ELEMENTO p where p.id = 13);
        html2 = (SELECT first 1 p.conteudo FROM TBHTML_ELEMENTO p where p.id = 14);

        select
            e.tipo_id,
            e.assunto,
            e.descricao,
            fn_execute_sql( replace(s.where_web1,':VINCULO_ID', e.vinculo_id) ) as JSON,
            s.campos_tabela_web,
            s.campos_sql_web,
            s.descricao_web,
            t.descricao,
            m.descricao,
            t.email,
            coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = e.usuario_id),'') as usuario_abertura
        from tbocorrencia_web e,  tbocorrencia_web_sql s, tbocorrencia_web_tipo t, tbocorrencia_web_motivo m
        where e.id = new.ocorrencia_web_id
        and s.ocorrencia_web_tipo_id = e.tipo_id
        and t.id = e.tipo_id
        and m.id = e.motivo_id
        into
            :tipo,
            :assunto,
            :descricao,
            :json,
            :campos_tabela_web,
            :campos_sql_web,
            :descricao_web,
            :tipo_descricao,
            :motivo_descricao,
            :email,
            :usuario_abertura;

        corpo1 = '';
        corpo2 = '';
        corpo3 = '';
        

        corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
        corpo1 = corpo1 ||'<p>'||new.mensagem||'</p>';
        corpo1 = corpo1 || '<br>Feed aberto por: '||coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = new.usuario_id),'')||'<br>';
        corpo1 = corpo1 || '<p><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_26110?TIPO='||:tipo||'&ID='||new.ocorrencia_web_id||'" target="_blank">[ABRIR OCORR??NCIA NA WEB]</a></p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || html1;
        
        corpo2 = corpo2||'<p style="font-weight: bold;"><u>Ocorr??ncia aberta por '||:usuario_abertura||':</u></p>';
        corpo2 = corpo2||'<p><u>Assunto</u>: '||:assunto||'</p>';
        corpo2 = corpo2||'<p><u>Descri????o</u>: '||:descricao||'</p>';
        corpo2 = corpo2||'<br>';
        corpo2 = corpo2||'<p style="font-weight: bold;"><u>'||:descricao_web||'</u></p>';

        for
          select OSPLIT, (row_number() over()) as LINHA from split2(:campos_sql_web,',')
        into
          :campo,
          :linha
        do begin
          corpo2 = corpo2||'<p><u>'|| FN_CAMEL_CASE(fn_array(:campos_tabela_web,:linha,',')) ||'</u>: '||fn_json_v3(:json, :campo)||'</p>';
        end

        corpo3 = corpo3 || html2 || '</body></html>';

        id = Gen_ID(gtbemail,1);
        :USUARIO_EMAIL = COALESCE((SELECT FIRST 1 US.EMAIL FROM TBUSUARIO US WHERE US.CODIGO = NEW.USUARIO_ID), NULL);

        if(coalesce(:corpo1 || :corpo2 || :corpo3, '') <> '' and char_length(new.para) > 0)then
        begin

            insert into tbemail (id, status, email, assunto, corpo, usuario_id, cc, cco, painel_id, datahora, de, MODULO_EMAIL)
               values (
                :id,
                0,
                new.para,
                :descricao_web ||' [OCORR??NCIA:'||lpad(new.ocorrencia_web_id,8,'0')||'] - '||FN_CAMEL_CASE(:motivo_descricao),
                :corpo1 || :corpo2 || :corpo3,
                new.usuario_id,
                new.em_copia,
                new.em_copia_oculta,
                0,
                current_timestamp,
                :USUARIO_EMAIL,
                1
             );
       end

    end
end
^

SET TERM ; ^

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, MODULO_EMAIL)
                    VALUES (GEN_ID(GTBEMAIL, 1), :AUT_EMAIL, 0, :ASSUNTO_EMAIL, :CORPO, 0, CURRENT_TIMESTAMP, 1);

            END

        END

    END

END
^

SET TERM ; ^

SET TERM ^ ;

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="'|| fn_parametro('SISTEMA.URL_SERVER') ||'/_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, MODULO_EMAIL)
                    VALUES (:EMAIL_ID, :DESTINATARIO, 0, :ASSUNTO_EMAIL, :CORPO, 0, CURRENT_TIMESTAMP, 1);

            END

        END

    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbcaso_feed_b02i for tbcaso_feed
active before insert position 0
AS
  declare variable corpo1 varchar(8000);
  declare variable corpo2 varchar(8000);
  declare variable corpo3 varchar(8000);
  declare variable id integer;
  declare variable ARQUIVO_ID integer;
begin

  if(new.origem = 0)then
  begin

    if(new.de <> '' and new.para <> '' and new.assunto <> '' and new.mensagem <> '' and (new.tipo = 1 /*or new.tipo = 4*/) and new.usuario_id > 0 and new.subfeed = 0)then
    begin

        for
           select * from SPC_EMAIL_CASO(new.caso_id, new.painel_id, new.mensagem)
        into
          :corpo1,
          :corpo2,
          :corpo3
        do
        begin

        end
    
        id = Gen_ID(gtbemail,1);

        insert into tbemail (id, status, email, assunto, corpo, usuario_id, cc, cco, painel_id, datahora, de, caso_feed_id, MODULO_EMAIL)
           values (
            :id,
            0,
            new.para,
            new.assunto,
            :corpo1 || :corpo2 || :corpo3,
            new.usuario_id,
            new.em_copia,
            new.em_copia_oculta,
            new.painel_id,
            current_timestamp,
            (SELECT FIRST 1 CP.EMAIL FROM TBCASO_PAINEL CP WHERE CP.ID = NEW.PAINEL_ID),
            new.id,
            0
         );

         if(char_length(new.lista_file) > 0)then
         begin
           for
             select OSPLIT from split_blob(new.lista_file,',')
           into
             :ARQUIVO_ID
           do begin
              INSERT INTO TBEMAIL_ANEXO (EMAIL_ID, ARQUIVO_ID, DESCRICAO) VALUES (:id, :ARQUIVO_ID, '');
           end
         end

    end
  end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbccusto_cota_b0u_01 for tbccusto_cota
active before update position 0
As
/*********************************************
           Verifica se bloqueia
           lan??amentos na cota            
*********************************************/
Declare variable vEmail  varchar(200);
Declare variable vCCusto varchar(200);
Declare variable vConta  varchar(200);
Declare variable Corpo_Email BLOB SUB_TYPE 0 SEGMENT SIZE 80;
Begin

    If (Old.Utilizado + Old.Outros < New.Utilizado + New.Outros) Then
        begin
            vConta = Coalesce((Select First 1 C.Descricao  from TbContaContabil C Where C.Conta = New.ContaContabil),'');
            vCCusto= Coalesce((Select First 1 CC.Descricao from TbCentro_De_Custo CC Where CC.Codigo = New.CCusto),'');

            If (
                 (New.Notificacao = '1') and
                 (New.StatusExclusao = '0') and
                 (Round(New.Valor + New.Extra - New.Outros - New.Utilizado,2) < 0)  and
                 (Round(New.Valor + New.Extra - New.Outros - New.Utilizado,2) < Round(Old.Valor + Old.Extra - Old.Outros - Old.Utilizado,2))
               ) Then
            Begin
               -- Enviar Email --
                vEmail = Coalesce((Select First 1 CC.Email     from TbCentro_De_Custo CC Where CC.Codigo = New.CCusto),'');
                CORPO_EMAIL = ' MES/ANO:  '||NEW.MES||'/'||NEW.ANO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                              ' CONTA:  '||FN_CCONTABIL_MASK(NEW.CONTACONTABIL)||' - '||(SELECT PS_TEXTO FROM SP_REMOVE_ACENTO (:vConta))||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                              ' C.CUSTO:  '||FN_CCUSTO_MASK(NEW.CCUSTO)||' - '||(SELECT PS_TEXTO FROM SP_REMOVE_ACENTO (:vCCusto))||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                              ' VR.DISPONIVEL:  R$ '||Cast(Old.Saldo AS NUMERIC(15,2))||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                              ' VR.DIFERENCA: R$ '||Cast(New.Utilizado-Old.Saldo AS NUMERIC(15,2))||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                              ''||ASCII_CHAR(13)||ASCII_CHAR(10)||COALESCE(NEW.OBSERVACAO,'');
        
                --CORPO_EMAIL = (SELECT PS_TEXTO FROM SP_REMOVE_ACENTO (:CORPO_EMAIL));
        
                if (vEmail <> '' and New.Bloqueio = '1') then
                    Begin
                --  Exception "..." '1'||:CORPO_EMAIL;
                    IN AUTONOMOUS TRANSACTION DO
                       Begin
                        Insert Into tbemail (id, email, usuario_id, assunto, corpo, status, datahora, MODULO_EMAIL)
                        Values ((Select Gen_Id(GTBEMAIL,1) From RDB$DataBase), :vEmail, 0, 'GCWeb! CONTROLE ORCAMENTARIO - SALDO INDISPONIVEL', :CORPO_EMAIL, 0, Current_TimeStamp, 13);
                       End
                    End else
                if (vEmail <> '' and New.Bloqueio = '0') then
                    Begin
                --  Exception "..." '2'||:CORPO_EMAIL;
                    Insert Into tbemail (id, email, usuario_id, assunto, corpo, status, datahora, MODULO_EMAIL)
                    Values ((Select Gen_Id(GTBEMAIL,1) From RDB$DataBase), :vEmail, 0, 'GCWeb! CONTROLE ORCAMENTARIO - SALDO EXCEDIDO', :CORPO_EMAIL, 0, Current_TimeStamp, 13);
                    End
        
            End

            -- exception "..." 'Novo'||New.Valor||'+'||New.Extra||'-'||New.Outros||'-'||New.Utilizado||' Anterior: '||Old.Valor||'+'||Old.Extra||'-'||Old.Outros||'-'||Old.Utilizado;

            If (
                 (New.Bloqueio = '1') and
                 (New.StatusExclusao = '0') and
                 (Round(New.Valor + New.Extra - New.Outros - New.Utilizado,2) < 0) and
                 (Round(New.Valor + New.Extra - New.Outros - New.Utilizado,2) < Round(Old.Valor + Old.Extra - Old.Outros - Old.Utilizado,2))
               ) Then       --  100                                 110 = -10               100                                   120  = -20
            Begin
                Exception "..." 'SALDO INDISPONIVEL DA COTA DO CONTROLE ORCAMENTARIO.'||'<br>'||
                                ' CONTA: '||FN_CCONTABIL_MASK(NEW.CONTACONTABIL)||' - '||vCONTA||'<br>'||
                                ' C.CUSTO: '||FN_CCUSTO_MASK(NEW.CCUSTO)||' - '||vCCUSTO||'<br>'||
                                ' VR.DISPONIVEL: '||FN_FORMAT_NUMBER(Old.Saldo,2)||'<br>'||
                                ' VR.LANCAMENTO: '||FN_FORMAT_NUMBER(New.Utilizado,2)||'<br>'||
                                ' VR.DIFERENCA: '||FN_FORMAT_NUMBER(New.Utilizado-Old.Saldo,2)
                                ;
            End
        
            NEW.OBSERVACAO = '';
        End

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbcliente_b1i_02 for tbcliente
active before insert position 2
as
declare variable MENSAGEM1 Varchar(7000);
declare variable MENSAGEM2 Varchar(7000);
declare variable descricao1 Varchar(200);
declare variable descricao2 Varchar(200);
declare variable empresa Varchar(100);
declare variable produto Varchar(100);
declare variable usuario_id integer;
declare variable email Varchar(300);
declare variable url Varchar(300);
declare variable uf Varchar(10);
declare variable user_notificar Varchar(300);
declare variable flag Varchar(50);
begin

  if (new.ecommerce = 1 or new.ecommerce = 2) then
  begin

    if (new.ecommerce = 1) then
    begin
       :user_notificar = coalesce(FN_PARAMETRO('SISTEMA.USUARIOS_NOTIFICAR_ECOMMERCE'),0);
       :flag = 'ECOMMERCE';
    end

    if (new.ecommerce = 2) then
    begin
       :user_notificar = coalesce(FN_PARAMETRO('SISTEMA.USUARIOS_NOTIFICAR_LACLOFIT'),0);
       :flag = 'LACLOFIT';
    end

    :empresa = coalesce(new.razaosocial,'');
    :uf      = coalesce(new.uf,'');

    :url = coalesce((select first 1 n.valor_ext from tbcontrole_n n where n.id = 279 ),'https://gc.delfa.com.br');

    :descricao1 = 'Novo Cliente Cadastrado ('||:flag||')';
    :descricao2 = 'Novo Cliente Cadastrado ('||:flag||'), Cliente:'||:empresa||', UF:'||:uf;

    :MENSAGEM1  = 'Cliente: '||:empresa||'<br>'||
                  '<a href="'||:url||'/_12360?CLIENTE_ID='||new.codigo||'" target="_blank">Abrir Cliente</a>';
    
     :MENSAGEM2 = '';
    
     for
         select
            u.codigo,
            u.email
        from tbusuario u, (select OSPLIT from split(:user_notificar,',')) n
        
        where u.codigo = n.OSPLIT
     into
        :usuario_id,
        :email
     do 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, :descricao1, 0, 0, current_timestamp, -1, current_timestamp, 0, 'TBCLIENTE', new.codigo, :MENSAGEM1||:MENSAGEM2);
    
    
        INSERT INTO TBEMAIL (EMAIL, USUARIO_ID, ASSUNTO, STATUS, DATAHORA, DATAHORA_ENVIO, FLAG, PAINEL_ID, CORPO, MODULO_EMAIL)
             VALUES (:email, 0, :descricao2, 0, current_timestamp, null, 0, 0, :MENSAGEM1||:MENSAGEM2, 5);
    
    
     end
  end

  if (NEW.BLOQUEIA_PEDIDO = '1' or NEW.BLOQUEIA_NOTAFISCAL = '1') then
      Begin
      New.Data_Bloqueio = Current_Date;
      End

  if (New.Etiqueta is NUll or Char_Length(New.Etiqueta) = 0) then
      New.Etiqueta = Left(Replace(New.razaosocial,' ',''),6);

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbcontacontabil_b03i for tbcontacontabil
active before insert position 3
AS
declare variable email varchar(300);
declare variable USUARIO_ID integer;
declare variable ASSUNTO varchar(300);
declare variable CORPO varchar(300);
declare variable STATUS integer;
begin

    if(substring(new.conta from 1 for 1) = 3 or substring(new.conta from 1 for 1) = 4)then
    begin
      email = coalesce((select n.valor_ext from tbcontrole_n n where n.id = 266),'');
    
      if(email <> '')then
      begin
         STATUS     = 0;
         USUARIO_ID = 0;
         ASSUNTO    = 'NOVA CONTA CONTÁBIL CADASTRADA';
         CORPO      = 'FOI CADASTRADA UMA NOVA CONTA CONTÁBIL ('||coalesce(NEW.conta,'')||' - '||coalesce(new.descricao,'')||') POR '||CURRENT_USER||' EM '||formatdatetime(current_timestamp);
    
         INSERT INTO TBEMAIL (EMAIL, USUARIO_ID, ASSUNTO, CORPO, STATUS, MODULO_EMAIL) VALUES (:EMAIL, :USUARIO_ID, :ASSUNTO, :CORPO, :STATUS, 6);
      end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbemail_b03iu for tbemail
active before insert or update position 3
AS
DECLARE VARIABLE CONFIG_EMAIL_MOD INTEGER;
BEGIN

    IF(INSERTING OR (UPDATING AND NEW.MODULO_EMAIL <> OLD.MODULO_EMAIL)) THEN
    BEGIN
        /* BUSCAR CONFIG DO MODULO DO EMAIL INSERIDO */
        :CONFIG_EMAIL_MOD = COALESCE((SELECT FIRST 1 T.ID FROM TBCONFIGURACAO_EMAIL T WHERE T.MODULO_EMAIL = NEW.MODULO_EMAIL AND T.STATUS = 1 AND NEW.MODULO_EMAIL <> 0), 0);
    
        IF(:CONFIG_EMAIL_MOD = 0) THEN
        BEGIN
            /* CASO NAO ENCONTRAR CONFIG PARA O MODULO, DEFINIR A CONFIG PADRAO PARA OS EMAILS */
            NEW.CONFIGURACAO_EMAIL_ID = COALESCE((SELECT FIRST 1 T.ID FROM TBCONFIGURACAO_EMAIL T WHERE T.MODULO_EMAIL = 0 AND T.STATUS = 1), 0);
            NEW.MODULO_EMAIL = 0;
        END ELSE
        BEGIN
            NEW.CONFIGURACAO_EMAIL_ID = :CONFIG_EMAIL_MOD;
        END
    END

    IF(NEW.DE IS NULL) THEN
    BEGIN
        NEW.DE = COALESCE((SELECT FIRST 1 T.EMAIL_RESPOSTAS FROM TBCONFIGURACAO_EMAIL T WHERE T.ID = NEW.CONFIGURACAO_EMAIL_ID), '');
    END
    
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbemail_b02i for tbemail
inactive before insert position 2
AS
BEGIN   
    IF(NEW.DE IS NULL) THEN
    BEGIN
        NEW.DE = FN_PARAMETRO('TBEMAIL.EMAIL');
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbferramentaria_b7u for tbferramentaria
active before update position 7
AS
declare variable vEMAIL VarChar(500);
declare variable vCORPO_EMAIL BLOB SUB_TYPE 0 SEGMENT SIZE 80;
BEGIN
  if (New.Status <> Old.Status) then
      Begin

        vEMAIL = Coalesce((Select First 1 CC.VALOR_EXT from TbControle_N CC Where CC.ID = 236),'');
        if (vEMAIL <> '') then
            Begin
            vCORPO_EMAIL = ' FERRAMENTA: '||NEW.ID||' - '||NEW.DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                           ' SERIE: '||NEW.SERIE||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                           ' DATA/HORA EMISSAO: '||FORMATDATETIME(Current_TimeStamp)||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                           ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                           ' STATUS: '||IIF(NEW.STATUS='1','FERRAMENTA REATIVADA','FERRAMENTA INATIVADA')||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                           IIF(NEW.STATUS='1','','MOTIVO: '||COALESCE(NEW.MOTIVO_INATIVACAO,''));
    
            Insert Into tbemail (email, usuario_id, assunto, corpo, status, datahora, MODULO_EMAIL)
            Values (:vEmail, 0, 'GC - ALTERACAO DE STATUS DE FERRAMENTA - '||NEW.SERIE, :vCORPO_EMAIL, 0, Current_TimeStamp, 1);
            End

      End
End
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER trigger ttbocorrencia_web_a01i for tbocorrencia_web
active after insert position 0
AS
declare variable id integer;
declare variable corpo1 blob sub_type 1 segment size 80;
declare variable corpo2 blob sub_type 1 segment size 80;
declare variable corpo3 blob sub_type 1 segment size 80;
declare variable html1 varchar(4000);
declare variable html2 varchar(4000);
declare variable tipo integer;
declare variable linha integer;
declare variable usuario_id integer;
declare variable assunto varchar(100);
declare variable descricao blob sub_type 1 segment size 80;
declare variable json blob sub_type 1 segment size 80;
declare variable campos_tabela_web varchar(300);
declare variable campos_sql_web varchar(300);
declare variable descricao_web varchar(300);
declare variable campo varchar(300);
declare variable tipo_descricao varchar(300);
declare variable motivo_descricao varchar(300);
declare variable de varchar(300);
declare variable para varchar(3000);
declare variable em_copia varchar(3000);
declare variable em_copia_oculta varchar(3000);
declare variable usuario_abertura varchar(300);
declare variable existe_cliente_id_visita integer;
declare variable cliente_prospeccao_visita varchar(300);
declare variable visita_cliente_titulo varchar(300);
declare variable usuario_email varchar(100);
begin

    if(new.id > 0)then
    begin

        :para            = lower(coalesce((select list(u.email,', ') as email from tbocorrencia_web_usuarios g, tbusuario u where u.codigo = g.usuario_id and g.ocorrencia_web_id = new.id and coalesce(u.email,'') <> '' /*and g.usuario_id <> new.usuario_id*/),''));
        :em_copia        = '';
        :em_copia_oculta = '';

        if(char_length(coalesce(new.EMAIL_ABERTURA,'')) > 0)then
        begin
          :para = coalesce(new.EMAIL_ABERTURA,'');
        end

        html1 = (SELECT first 1 p.conteudo FROM TBHTML_ELEMENTO p where p.id = 13);
        html2 = (SELECT first 1 p.conteudo FROM TBHTML_ELEMENTO p where p.id = 14);

        select
            e.tipo_id,
            e.assunto,
            e.descricao,
            fn_execute_sql( replace(s.where_web1,':VINCULO_ID', e.vinculo_id) ) as JSON,
            s.campos_tabela_web,
            s.campos_sql_web,
            s.descricao_web,
            t.descricao,
            m.descricao,
            t.email,
            coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = e.usuario_id),'') as usuario_abertura
        from tbocorrencia_web e,  tbocorrencia_web_sql s, tbocorrencia_web_tipo t, tbocorrencia_web_motivo m
        where e.id = new.id
        and s.ocorrencia_web_tipo_id = e.tipo_id
        and t.id = e.tipo_id
        and m.id = e.motivo_id
        into
            :tipo,
            :assunto,
            :descricao,
            :json,
            :campos_tabela_web,
            :campos_sql_web,
            :descricao_web,
            :tipo_descricao,
            :motivo_descricao,
            :de,
            :usuario_abertura;

        corpo1 = '';
        corpo2 = '';
        corpo3 = '';
        
        corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
        corpo1 = corpo1 ||'<p> Foi registrada uma nova ocorr??ncia e voc?? esta envolvido.</p>';
        corpo1 = corpo1 || '<br><br>';
        corpo1 = corpo1 || '<p><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_26110?TIPO='||:tipo||'&ID='||new.id||'" target="_blank">[ABRIR OCORR??NCIA NA WEB]</a></p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || html1;
        
        corpo2 = corpo2||'<p style="font-weight: bold;"><u>Ocorr??ncia aberta por '||:usuario_abertura||':</u></p>';
        corpo2 = corpo2||'<p><u>Assunto</u>: '||:assunto||'</p>';
        corpo2 = corpo2||'<p><u>Descri????o</u>: '||:descricao||'</p>';
        corpo2 = corpo2||'<br>';
        corpo2 = corpo2||'<p style="font-weight: bold;"><u>'||:descricao_web||'</u></p>';

        for
          select OSPLIT, (row_number() over()) as LINHA from split2(:campos_sql_web,',')
        into
          :campo,
          :linha
        do begin
          corpo2 = corpo2||'<p><u>'|| FN_CAMEL_CASE(fn_array(:campos_tabela_web,:linha,',')) ||'</u>: '||fn_json_v3(:json, :campo)||'</p>';
        end

        corpo3 = corpo3 || html2 || '</body></html>';

        id = Gen_ID(gtbemail,1);

        IF(NEW.TIPO_ID = 1) THEN
        BEGIN
            :EXISTE_CLIENTE_ID_VISITA = COALESCE((SELECT FIRST 1 V.CLIENTE_ID FROM TBREGISTRO_VISITA V WHERE V.ID = NEW.VINCULO_ID), 0);
            :CLIENTE_PROSPECCAO_VISITA = COALESCE((SELECT FIRST 1 V.CLIENTE_PROSPECCAO_NOME FROM TBREGISTRO_VISITA V WHERE V.ID = NEW.VINCULO_ID), '');

            IF(:EXISTE_CLIENTE_ID_VISITA > 0) THEN
            BEGIN
                :VISITA_CLIENTE_TITULO = COALESCE((SELECT FIRST 1 C.RAZAOSOCIAL FROM TBCLIENTE C WHERE C.CODIGO = :EXISTE_CLIENTE_ID_VISITA), '');
            END ELSE
            BEGIN
                :VISITA_CLIENTE_TITULO = COALESCE(:CLIENTE_PROSPECCAO_VISITA, '');
            END
        END

        for
            select usuario_id from
            SP_NOTIFICACAO_OCORRENCIA(
                :descricao_web||' '||:VISITA_CLIENTE_TITULO||' - Nova Ocorr??ncia aberta ('||new.id||')',
                'Uma nova ocorr??ncia foi aberta e voc?? esta envolvido.<br><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_26110?TIPO='||:tipo||'&ID='||new.id||'" target="_blank">[ABRIR OCORR??NCIA]</a></p>',                new.id,
                new.usuario_id
            )
        into
         :usuario_id
        do begin

       end

       :USUARIO_EMAIL = (SELECT FIRST 1 U.EMAIL FROM TBUSUARIO U WHERE U.CODIGO = NEW.USUARIO_ID);

       if(coalesce(:corpo1 || :corpo2 || :corpo3, '') <> '' and char_length(:para) > 0)then
       begin
        insert into tbemail (id, status, email, assunto, corpo, usuario_id, cc, cco, painel_id, datahora, de, modulo_email)
           values (
            :id,
            0,
            :para,
            :descricao_web ||' [OCORR??NCIA:'||lpad(new.id,8,'0')||'] - '||FN_CAMEL_CASE(:motivo_descricao),
            :corpo1 || :corpo2 || :corpo3,
            0,
            :em_copia,
            :em_copia_oculta,
            0,
            current_timestamp,
            :USUARIO_EMAIL,
            1
         );
       end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbocorrencia_web_a01u for tbocorrencia_web
active after update position 0
AS
declare variable id integer;
declare variable corpo1 blob sub_type 1 segment size 80;
declare variable corpo2 blob sub_type 1 segment size 80;
declare variable corpo3 blob sub_type 1 segment size 80;
declare variable html1 varchar(4000);
declare variable html2 varchar(4000);
declare variable tipo integer;
declare variable tipo_status integer;
declare variable linha integer;
declare variable usuario_id integer;
declare variable assunto varchar(100);
declare variable descricao blob sub_type 1 segment size 80;
declare variable json blob sub_type 1 segment size 80;
declare variable campos_tabela_web varchar(300);
declare variable campos_sql_web varchar(300);
declare variable descricao_web varchar(300);
declare variable campo varchar(300);
declare variable tipo_descricao varchar(300);
declare variable motivo_descricao varchar(300);
declare variable de varchar(300);
declare variable para varchar(3000);
declare variable em_copia varchar(3000);
declare variable em_copia_oculta varchar(3000);
declare variable existe_cliente_id_visita integer;
declare variable cliente_prospeccao_visita varchar(300);
declare variable visita_cliente_titulo varchar(300);
declare variable usuario_email varchar(100);
begin


    if(old.status_id <> new.status_id)then
    begin
        tipo_status = coalesce((select first 1 iif(t.inicio = 1, 1, iif(t.fim = 1, 2, iif(t.abertura = 1, 3, 0))) from tbocorrencia_web_status t where t.id =  new.status_id),0);

        if(tipo_status = 2)then
        begin

                :para            = lower(coalesce((select list(u.email,', ') as email from tbocorrencia_web_usuarios g, tbusuario u where u.codigo = g.usuario_id and g.ocorrencia_web_id = new.id and coalesce(u.email,'') <> ''),''));
                :em_copia        = '';
                :em_copia_oculta = '';
        
                html1 = (SELECT first 1 p.conteudo FROM TBHTML_ELEMENTO p where p.id = 13);
                html2 = (SELECT first 1 p.conteudo FROM TBHTML_ELEMENTO p where p.id = 14);
        
                select
                    e.tipo_id,
                    e.assunto,
                    e.descricao,
                    fn_execute_sql( replace(s.where_web1,':VINCULO_ID', e.vinculo_id) ) as JSON,
                    s.campos_tabela_web,
                    s.campos_sql_web,
                    s.descricao_web,
                    t.descricao,
                    m.descricao,
                    t.email
                from tbocorrencia_web e,  tbocorrencia_web_sql s, tbocorrencia_web_tipo t, tbocorrencia_web_motivo m
                where e.id = new.id
                and s.ocorrencia_web_tipo_id = e.tipo_id
                and t.id = e.tipo_id
                and m.id = e.motivo_id
                into
                    :tipo,
                    :assunto,
                    :descricao,
                    :json,
                    :campos_tabela_web,
                    :campos_sql_web,
                    :descricao_web,
                    :tipo_descricao,
                    :motivo_descricao,
                    :de;
        
                corpo1 = '';
                corpo2 = '';
                corpo3 = '';
                
                corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
                corpo1 = corpo1 ||'<p> Ocorr??ncia foi fechada.</p>';
                corpo1 = corpo1 || '<br><br>';
                corpo1 = corpo1 || '<p><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_26110?TIPO='||:tipo||'&ID='||new.id||'" target="_blank">[ABRIR OCORR??NCIA NA WEB]</a></p>';
                corpo1 = corpo1 || '<br>';
                corpo1 = corpo1 || html1;
                
                corpo2 = corpo2||'<p style="font-weight: bold;"><u>Ocorr??ncia:</u></p>';
                corpo2 = corpo2||'<p><u>Assunto</u>: '||:assunto||'</p>';
                corpo2 = corpo2||'<p><u>Descri????o</u>: '||:descricao||'</p>';
                corpo2 = corpo2||'<br>';
                corpo2 = corpo2||'<p style="font-weight: bold;"><u>'||:descricao_web||'</u></p>';
        
                for
                  select OSPLIT, (row_number() over()) as LINHA from split2(:campos_sql_web,',')
                into
                  :campo,
                  :linha
                do begin
                  corpo2 = corpo2||'<p><u>'|| FN_CAMEL_CASE(fn_array(:campos_tabela_web,:linha,',')) ||'</u>: '||fn_json_v3(:json, :campo)||'</p>';
                end
        
                corpo3 = corpo3 || html2 || '</body></html>';
        
                id = Gen_ID(gtbemail,1);
        
                IF(NEW.TIPO_ID = 1) THEN
                BEGIN
                    :EXISTE_CLIENTE_ID_VISITA = COALESCE((SELECT FIRST 1 V.CLIENTE_ID FROM TBREGISTRO_VISITA V WHERE V.ID = NEW.VINCULO_ID), 0);
                    :CLIENTE_PROSPECCAO_VISITA = COALESCE((SELECT FIRST 1 V.CLIENTE_PROSPECCAO_NOME FROM TBREGISTRO_VISITA V WHERE V.ID = NEW.VINCULO_ID), '');
        
                    IF(:EXISTE_CLIENTE_ID_VISITA > 0) THEN
                    BEGIN
                        :VISITA_CLIENTE_TITULO = COALESCE((SELECT FIRST 1 C.RAZAOSOCIAL FROM TBCLIENTE C WHERE C.CODIGO = :EXISTE_CLIENTE_ID_VISITA), '');
                    END ELSE
                    BEGIN
                        :VISITA_CLIENTE_TITULO = COALESCE(:CLIENTE_PROSPECCAO_VISITA, '');
                    END
                END

                for
                    select usuario_id from
                    SP_NOTIFICACAO_OCORRENCIA(
                        :descricao_web||' '||:VISITA_CLIENTE_TITULO||' - Ocorr??ncia fechada ('||new.id||')',
                        'Uma ocorr??ncia foi fechada e voc?? estava envolvido.<br><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_26110?TIPO='||:tipo||'&ID='||new.id||'" target="_blank">[ABRIR OCORR??NCIA]</a></p>',
                        new.id,
                        new.usuario_id
                    )
                into
                 :usuario_id
                do begin

                end

                :USUARIO_EMAIL = (SELECT FIRST 1 U.EMAIL FROM TBUSUARIO U WHERE U.CODIGO = NEW.USUARIO_ID);

                insert into tbemail (id, status, email, assunto, corpo, usuario_id, cc, cco, painel_id, datahora, de, modulo_email)
                   values (
                    :id,
                    0,
                    :para,
                    :descricao_web ||' [OCORR??NCIA:'||lpad(new.id,8,'0')||'] - '||FN_CAMEL_CASE(:motivo_descricao),
                    :corpo1 || :corpo2 || :corpo3,
                    0,
                    :em_copia,
                    :em_copia_oculta,
                    0,
                    current_timestamp,
                    :USUARIO_EMAIL,
                    1
                 );
        end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_b7i for tbpedido
inactive before insert position 7
AS
declare variable vEMAIL VarChar(500);
declare variable vREPRESENTANTE VarChar(100);
declare variable vCLIENTE VarChar(100);
declare variable vCORPO_EMAIL BLOB SUB_TYPE 0 SEGMENT SIZE 80;
BEGIN
  if (New.Chave_Liberacao > 0) then
      Begin

        vEMAIL = Coalesce((Select First 1 CC.VALOR_EXT from TbControle_N CC Where CC.ID = 235),'');
        if (vEMAIL <> '') then
            Begin
            vREPRESENTANTE = (Select First 1 NomeFantasia From TbEmpresa E Where E.Codigo = New.Representante_Codigo);
            vCLIENTE = (Select First 1 NomeFantasia From TbEmpresa E Where E.Codigo = New.Cliente_Codigo);
    
            vCORPO_EMAIL = ' PEDIDO:  '||NEW.PEDIDO ||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                           ' DATA/HORA EMISSAO: '||FORMATDATETIME(New.Usuario_Data)||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                           ' REPRESENTANTE: '||NEW.REPRESENTANTE_CODIGO||' - '||:vREPRESENTANTE||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                           ' CLIENTE: '||NEW.CLIENTE_CODIGO||' - '||:vCLIENTE||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                           ' FORMA DE TRATAMENTO: '||IIF(NEW.FORMA_ANALISE='0','IMEDIATAMENTE','AGUARDAR 24 HORAS')||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                           ' OBSERVACOES: '||COALESCE(NEW.OBSERVACAO,'');
    
            Insert Into tbemail (email, usuario_id, assunto, corpo, status, datahora, modulo_email)
            Values (:vEmail, 0, 'GCWEB - ENTRADA DE PEDIDO AGUARDANDO CONFIRMACAO - '||NEW.PEDIDO, :vCORPO_EMAIL, 0, Current_TimeStamp, 5);
            End

      End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbregistro_parada_b2i for tbregistro_parada
active before insert position 2
AS
declare variable vEMAIL VarChar(500);
declare variable vCORPO_EMAIL BLOB SUB_TYPE 0 SEGMENT SIZE 80;
declare variable VJUSTIFICATIVA VarChar(200);
declare variable vOPERADOR_NOME VarChar(20);
declare variable VTEMPOORIGINAL Integer;

declare variable LINHA_ID INTEGER;
declare variable LINHA_DESCRICAO VARCHAR(50);
declare variable MODELO_ID INTEGER;                                                
declare variable MODELO_DESCRICAO VARCHAR(50);
declare variable COR_ID INTEGER;
declare variable COR_DESCRICAO VARCHAR(20);
declare variable TAMANHO INTEGER;
declare variable TAM_DESCRICAO VARCHAR(10);
declare variable FERRAMENTA_ID INTEGER;
declare variable FERRAMENTA_DESCRICAO VARCHAR(100);
declare variable GP_ID INTEGER;
declare variable GP_DESCRICAO VARCHAR(20);
declare variable UP_ID INTEGER;
declare variable UP_DESCRICAO VARCHAR(20);
declare variable ESTACAO INTEGER;
declare variable ESTACAO_DESCRICAO VARCHAR(20);
declare variable REMESSA_ID INTEGER;
declare variable TALAO_ID INTEGER;
declare variable TALAO INTEGER;
declare variable QUANTIDADE NUMERIC(18,4);
declare variable UM VARCHAR(10);

BEGIN

  if (New.Status > 0 and New.tabela = 'INEFICIENCIA') then -- ID da Justificativa
      Begin

      For
        Select first 1 P.Linha_Codigo Linha_Id,
            (Select First 1 L.Descricao From TbModelo_Linha L Where L.Codigo = P.Linha_Codigo) Linha_Descricao,
             P.Modelo_Codigo Modelo_Id,
            (Select First 1 M.Descricao From TbModelo M Where M.Codigo = P.Modelo_Codigo) Modelo_Descricao,
             P.Cor_Codigo Cor_ID,
            (Select First 1 C.Descricao From TbCor C Where C.Codigo = P.Cor_Codigo) Cor_Descricao,
             PR.Tamanho,
            (Select First 1 Tam_Descricao From SP_TAMANHO_GRADE (P.Grade_Codigo,PR.Tamanho)) Tam_Descricao,
             PR.Ferramenta_ID,
            (Select First 1 F.Serie||'-'||F.Descricao From TbFerramentaria F Where F.ID = PR.Ferramenta_ID) Ferramenta_Descricao,
             PR.GP_Id,
            (Select First 1 G.Descricao From TBGP G Where G.ID = PR.Gp_ID) GP_Descricao,
             PR.UP_Id,
            (Select First 1 U.Descricao From TbUP U Where U.ID = PR.UP_ID) UP_Descricao,
             PR.Estacao,
            (Select First 1 S.Descricao From TbSub_UP S Where S.Up_ID = PR.Up_ID and S.ID = PR.Estacao) Estacao_Descricao,
             PR.Remessa_ID,
             PR.Tabela_ID Talao_ID,
            (Select First 1 R.Controle From TbRemessa_Item_Processado R Where R.Id = PR.Tabela_ID) Talao,
             PR.Quantidade, P.UNIDADEMEDIDA_SIGLA UM
        From TbProgramacao PR, TbProduto P
       Where PR.Produto_ID = P.Codigo
         and PR.ID = NEW.Tabela_ID
        Into :LINHA_ID,:LINHA_DESCRICAO,:MODELO_ID,:MODELO_DESCRICAO,:COR_ID,
             :COR_DESCRICAO,:TAMANHO,:TAM_DESCRICAO,:FERRAMENTA_ID,
             :FERRAMENTA_DESCRICAO,:GP_ID,:GP_DESCRICAO,:UP_ID,:UP_DESCRICAO,
             :ESTACAO,:ESTACAO_DESCRICAO,:REMESSA_ID,:TALAO_ID,:TALAO,:QUANTIDADE,:UM

          Do Begin

             vEMAIL         = Coalesce((Select First 1 CC.VALOR_EXT from TbControle_N CC Where CC.ID = 239),'');
             vOPERADOR_NOME = Coalesce((Select First 1 O.Nome From TbOperador O Where O.Codigo = New.Operador_ID),'');
             VJUSTIFICATIVA = Coalesce((Select First 1 J.Descricao From TbJustificativa J Where J.ID = New.Status),'');
             VTEMPOORIGINAL = COALESCE((Select sum(MF.TM) from tbup_fluxo pf, TBMODELO_FLUXO_PRODUCAO mf
                                         where mf.fluxo_id  = pf.fluxo_id and pf.up_id = :UP_ID
                                           and mf.modelo_id = :MODELO_ID and mf.cor_id = :COR_ID
                                           and mf.tamanho   = :TAMANHO),0);

             if (vEMAIL <> '') then
                 Begin
                     vCORPO_EMAIL = ' LINHA: '||:LINHA_ID||' - '||:LINHA_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                    ' MODELO: '||:MODELO_ID||' - '||:MODELO_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                    ' COR: '||:COR_ID||' - '||:COR_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                    ' TAMANHO: '||:TAM_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                    ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                    ' FERRAMENTA: '||:FERRAMENTA_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                    ' GP/UP/ESTACAO: '||:GP_DESCRICAO||'/'||:UP_DESCRICAO||'/'||:ESTACAO_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                    ' REMESSA/TALAO: '||:REMESSA_ID||' - '||:TALAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                    ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                    ' QUANTIDADE: '||Trunc(:QUANTIDADE)||' '||:UM||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                    ' OPERADOR: '||NEW.OPERADOR_ID||' - '||vOPERADOR_NOME||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                    ' DATA/HORA REGISTRO: '||FORMATDATETIME(Current_TimeStamp)||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                    ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                    ' TEMPO MAQUINA ATUAL: '||Trunc(:VTEMPOORIGINAL)||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                    ' JUSTIFICATIVA: '||:vJustificativa||': '||NEW.OBSERVACAO
                                    --||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                    ;
    
                     Insert Into tbemail (email, usuario_id, assunto, corpo, status, datahora, modulo_email)
                     Values (:vEmail, 0, 'GC - REGISTRO DE JUSTIFICATIVA: '||:vJustificativa, :vCORPO_EMAIL, 0, Current_TimeStamp, 16);
                 End
    
             End
      End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_baixa_est_a01i for tbrequisicao_baixa_estoque
active after insert 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 USUARIO VARCHAR(50);
declare variable DATA VARCHAR(16);
declare variable PRODUTO VARCHAR(150);
declare variable MOTIVO VARCHAR(50);
declare variable TIPO CHAR(50);
declare variable OPERACAO VARCHAR(200);
declare variable DESCRICAO VARCHAR(200);
declare variable QTD VARCHAR(50);
declare variable observacao blob sub_type 1 segment size 80;
declare variable notificar_email integer;
declare variable notificar_web integer;
declare variable max_nivel integer;
begin

    SELECT first 1
        coalesce(o4.nome, o4.usuario) as USUARIO,
        formatdatetime(t.data_inserte) as DATA,
        o5.codigo||' - '||o5.descricao as PRODUTO,
        o3.descricao as MOTIVO,
        iif(o2.tipo = 0, 'Tranfer??nncia de estoque', iif(o2.tipo = 1, 'Baixa de estoque', '')) as TIPO,
        o2.descricao as OPERACAO,
        o1.descricao,
        (select FN_FORMAT_NUMBER(QUANTIDADE_SALDO ,4,',','.')||' '|| UNIDADEMEDIDA_SIGLA FROM SPC_STATUS_PECA(T.tipo, T.peca_id)) QTD,
        t.observacao,
        o1.notificar_email,
        01.NOTIFICAR_MSG
    FROM
        TBREQUISICAO_BAIXA_ESTOQUE T
        LEFT JOIN TBREGRA_REQ_BAIXA O1 ON O1.id = T.regra_id
        LEFT JOIN tbregra_req_baixa_operacao O2 ON O2.id = T.operacao_id AND O2.regra_req_baixa_id = T.regra_id
        LEFT JOIN TBSOBRA_SAIDA_MOTIVO O3 ON O3.id = T.motivo_id
        LEFT JOIN TBUSUARIO O4 ON O4.codigo = T.usuario_id
        LEFT JOIN tbproduto O5 ON O5.codigo = T.produto_id

    where t.id = new.id
    into
        USUARIO,
        DATA,
        PRODUTO,
        MOTIVO,
        TIPO,
        OPERACAO,
        DESCRICAO,
        QTD,
        observacao,
        notificar_email,
        notificar_web;

    USUARIO         = FN_CAPITALIZE(coalesce(USUARIO, ''));
    DATA            = coalesce(DATA, '');
    PRODUTO         = FN_CAMEL_CASE(coalesce(PRODUTO, ''));
    MOTIVO          = FN_CAMEL_CASE(coalesce(MOTIVO, ''));
    TIPO            = FN_CAMEL_CASE(coalesce(TIPO, ''));
    OPERACAO        = FN_CAMEL_CASE(coalesce(OPERACAO, ''));
    DESCRICAO       = FN_CAMEL_CASE(coalesce(DESCRICAO, ''));
    QTD             = coalesce(QTD, '');
    observacao      = FN_CAMEL_CASE(coalesce(observacao, ''));
    notificar_email = coalesce(notificar_email, 0);
    notificar_web   = coalesce(notificar_web, 0);

    ASSUNTO = 'Nova Requisi????o de Estoque';
    ASSUNTO_email = 'Nova Requisi????o de Estoque, Usu??rio:'||USUARIO||', Produto:'||PRODUTO||', Quantidade:'||QTD;

    CORPO = '<div style="display: -webkit-inline-box;">';
    CORPO = CORPO||' <span style="font-weight: bold;">O Usu??rio: </span>'||USUARIO||' <span style="font-weight: bold;">Solicita: </span>'||TIPO||'<br>';
    CORPO = CORPO||' <span style="font-weight: bold;">Produto: </span>'||PRODUTO||'<br>';
    CORPO = CORPO||' <span style="font-weight: bold;">Quantidade: </span>'||QTD||'<br>';
    CORPO = CORPO||' <span style="font-weight: bold;">Data: </span>'||DATA||'<br>';
    CORPO = CORPO||' <span style="font-weight: bold;">Motivo: </span>'||MOTIVO||'<br>';
    CORPO = CORPO||' <span style="font-weight: bold;">Opera????o: </span>'||OPERACAO||'<br>';
    CORPO = CORPO||' <span style="font-weight: bold;">Observa????o: </span>'||observacao||'<br>';
    CORPO = CORPO||'<br><a class="msg-balao-fechar" href="'|| fn_parametro('SISTEMA.URL_SERVER') ||'/_15220?ID='||new.id||'" target="_blank" >Clique aqui para ver</a>';
    CORPO = CORPO||'</div>';


    select
            max(a.nivel)
    from TBREQUISICAO_AUTORIZADORES a
    where a.status = 1
    and a.requisicao_id = new.regra_id
    into :max_nivel;

  for
    select
        a.usuario_id,
        a.nivel
    from TBREQUISICAO_AUTORIZADORES a
    where a.status = 1
    and a.requisicao_id = new.regra_id
  into
    :usuario_id,
    :nivel
  do begin

    INSERT INTO TBREQ_BAIXA_AUTORIZADOR (REQUISICAO_BAIXA_ESTOQUE_ID, USUARIO_ID, STATUS, DATA_APROVACAO, NIVEL)
                             VALUES (new.id, :usuario_id, 0, null, :nivel );

    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(notificar_web = 1 and :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);
    end

    if(notificar_email = 1 and :max_nivel = :nivel)then
    begin
        INSERT INTO TBEMAIL (
            ID,
            EMAIL,
            USUARIO_ID,
            ASSUNTO,
            CORPO,
            STATUS,
            DATAHORA,
            MODULO_EMAIL
        ) VALUES (
            :EMAIL_ID,
            :DESTINATARIO,
            0,
            :ASSUNTO_email,
            :CORPO,
            0,
            CURRENT_TIMESTAMP,
            16
        );
   end

  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_baixa_est_a01u for tbrequisicao_baixa_estoque
active after update position 0
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 USUARIO VARCHAR(50);
declare variable DATA VARCHAR(16);
declare variable PRODUTO VARCHAR(150);
declare variable MOTIVO VARCHAR(50);
declare variable TIPO CHAR(50);
declare variable OPERACAO VARCHAR(200);
declare variable LABEL VARCHAR(200);
declare variable DESCRICAO VARCHAR(200);
declare variable QTD VARCHAR(50);
declare variable observacao blob sub_type 1 segment size 80;
declare variable notificar_email integer;
declare variable notificar_web integer;
begin

    if((new.status = 1 or new.status = 3) and old.status <> 2)then
    begin

        SELECT first 1
            coalesce(o4.nome, o4.usuario) as USUARIO,
            formatdatetime(t.data_inserte) as DATA,
            o5.codigo||' - '||o5.descricao as PRODUTO,
            o3.descricao as MOTIVO,
            iif(o2.tipo = 0, 'Tranfer??nncia de estoque', iif(o2.tipo = 1, 'Baixa de estoque', '')) as TIPO,
            o2.descricao as OPERACAO,
            o1.descricao,
            (select FN_FORMAT_NUMBER(QUANTIDADE_SALDO ,4,',','.')||' '|| UNIDADEMEDIDA_SIGLA FROM SPC_STATUS_PECA(T.tipo, T.peca_id)) QTD,
            t.observacao,
            o1.notificar_email,
            01.NOTIFICAR_MSG
        FROM
            TBREQUISICAO_BAIXA_ESTOQUE T
            LEFT JOIN TBREGRA_REQ_BAIXA O1 ON O1.id = T.regra_id
            LEFT JOIN tbregra_req_baixa_operacao O2 ON O2.id = T.operacao_id AND O2.regra_req_baixa_id = T.regra_id
            LEFT JOIN TBSOBRA_SAIDA_MOTIVO O3 ON O3.id = T.motivo_id
            LEFT JOIN TBUSUARIO O4 ON O4.codigo = T.usuario_id
            LEFT JOIN tbproduto O5 ON O5.codigo = T.produto_id
    
        where t.id = new.id
        into
            USUARIO,
            DATA,
            PRODUTO,
            MOTIVO,
            TIPO,
            OPERACAO,
            DESCRICAO,
            QTD,
            observacao,
            notificar_email,
            notificar_web;
    
        USUARIO         = FN_CAPITALIZE(coalesce(USUARIO, ''));
        DATA            = coalesce(DATA, '');
        PRODUTO         = FN_CAMEL_CASE(coalesce(PRODUTO, ''));
        MOTIVO          = FN_CAMEL_CASE(coalesce(MOTIVO, ''));
        TIPO            = FN_CAMEL_CASE(coalesce(TIPO, ''));
        OPERACAO        = FN_CAMEL_CASE(coalesce(OPERACAO, ''));
        DESCRICAO       = FN_CAMEL_CASE(coalesce(DESCRICAO, ''));
        QTD             = coalesce(QTD, '');
        observacao      = FN_CAMEL_CASE(coalesce(observacao, ''));
        notificar_email = coalesce(notificar_email, 0);
        notificar_web   = coalesce(notificar_web, 0);
    
        if(new.status = 1)then
        begin
            LABEL = 'AUTORIZADA';
        end else
        begin
            LABEL = 'RECUSADA';
        end

        ASSUNTO = 'Requisi????o de Estoque '||LABEL;
        ASSUNTO_email = 'Requisi????o de Estoque '||LABEL||', Produto:'||PRODUTO||', Quantidade:'||QTD;
    
        CORPO = '<div style="display: -webkit-inline-box;">';
        CORPO = CORPO||' <span style="font-weight: bold;">Produto: </span>'||PRODUTO||'<br>';
        CORPO = CORPO||' <span style="font-weight: bold;">Quantidade: </span>'||QTD||'<br>';
        CORPO = CORPO||' <span style="font-weight: bold;">Data: </span>'||DATA||'<br>';
        CORPO = CORPO||' <span style="font-weight: bold;">Motivo: </span>'||MOTIVO||'<br>';
        CORPO = CORPO||' <span style="font-weight: bold;">Opera????o: </span>'||OPERACAO||'<br>';
        CORPO = CORPO||' <span style="font-weight: bold;">Observa????o: </span>'||observacao||'<br>';
        CORPO = CORPO||'<br><a class="msg-balao-fechar" href="'|| fn_parametro('SISTEMA.URL_SERVER') ||'/_15200?ID='||new.id||'" target="_blank" >Clique aqui para ver</a>';
        CORPO = CORPO||'</div>';

        EMAIL_ID = (SELECT GEN_ID(GTBEMAIL,1) FROM RDB$DATABASE);
        DESTINATARIO = coalesce((select first 1 u.email from tbusuario u where u.codigo = new.usuario_id),'');
    
        if(notificar_web = 1)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,
                new.usuario_id,
                0,
                0,
                :ASSUNTO,
                0,
                0,
                current_timestamp,
                fn_current_user_id(),
                current_timestamp,
                0,
                '',
                0,
                :CORPO);
        end
    
        if(notificar_email = 1)then
        begin
            INSERT INTO TBEMAIL (
                ID,
                EMAIL,
                USUARIO_ID,
                ASSUNTO,
                CORPO,
                STATUS,
                DATAHORA,
                MODULO_EMAIL
            ) VALUES (
                :EMAIL_ID,
                :DESTINATARIO,
                0,
                :ASSUNTO_email,
                :CORPO,
                0,
                CURRENT_TIMESTAMP,
                16
            );
       end

    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_baixa_est_b03u for tbrequisicao_baixa_estoque
active before update position 0
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 USUARIO VARCHAR(50);
DECLARE VARIABLE DATA VARCHAR(16);
DECLARE VARIABLE PRODUTO VARCHAR(150);
DECLARE VARIABLE MOTIVO VARCHAR(50);
DECLARE VARIABLE TIPO CHAR(50);
DECLARE VARIABLE OPERACAO VARCHAR(200);
DECLARE VARIABLE DESCRICAO VARCHAR(200);
DECLARE VARIABLE QTD VARCHAR(50);
DECLARE VARIABLE OBSERVACAO BLOB SUB_TYPE 1 SEGMENT SIZE 80;
DECLARE VARIABLE NOTIFICAR_EMAIL INTEGER;
DECLARE VARIABLE NOTIFICAR_WEB INTEGER;
DECLARE VARIABLE MAX_NIVEL INTEGER;
BEGIN
    IF(NEW.REGRA_ID <> OLD.REGRA_ID)THEN
    BEGIN

        DELETE FROM TBREQ_BAIXA_AUTORIZADOR X WHERE X.REQUISICAO_BAIXA_ESTOQUE_ID = OLD.ID;
        
        SELECT FIRST 1
            COALESCE(O4.NOME, O4.USUARIO) AS USUARIO,
            FORMATDATETIME(T.DATA_INSERTE) AS DATA,
            O5.CODIGO||' - '||O5.DESCRICAO AS PRODUTO,
            O3.DESCRICAO AS MOTIVO,
            IIF(O2.TIPO = 0, 'Tranfer??nncia de estoque', IIF(O2.TIPO = 1, 'Baixa de estoque', '')) AS TIPO,
            O2.DESCRICAO AS OPERACAO,
            O1.DESCRICAO,
            (SELECT FN_FORMAT_NUMBER(QUANTIDADE_SALDO ,4,',','.')||' '|| UNIDADEMEDIDA_SIGLA FROM SPC_STATUS_PECA(T.TIPO, T.PECA_ID)) QTD,
            T.OBSERVACAO,
            O1.NOTIFICAR_EMAIL,
            01.NOTIFICAR_MSG
        FROM
            TBREQUISICAO_BAIXA_ESTOQUE T
            LEFT JOIN TBREGRA_REQ_BAIXA O1 ON O1.ID = T.REGRA_ID
            LEFT JOIN TBREGRA_REQ_BAIXA_OPERACAO O2 ON O2.ID = T.OPERACAO_ID AND O2.REGRA_REQ_BAIXA_ID = T.REGRA_ID
            LEFT JOIN TBSOBRA_SAIDA_MOTIVO O3 ON O3.ID = T.MOTIVO_ID
            LEFT JOIN TBUSUARIO O4 ON O4.CODIGO = T.USUARIO_ID
            LEFT JOIN TBPRODUTO O5 ON O5.CODIGO = T.PRODUTO_ID
    
        WHERE T.ID = NEW.ID
        INTO
            USUARIO,
            DATA,
            PRODUTO,
            MOTIVO,
            TIPO,
            OPERACAO,
            DESCRICAO,
            QTD,
            OBSERVACAO,
            NOTIFICAR_EMAIL,
            NOTIFICAR_WEB;
    
        USUARIO         = FN_CAPITALIZE(COALESCE(USUARIO, ''));
        DATA            = COALESCE(DATA, '');
        PRODUTO         = FN_CAMEL_CASE(COALESCE(PRODUTO, ''));
        MOTIVO          = FN_CAMEL_CASE(COALESCE(MOTIVO, ''));
        TIPO            = FN_CAMEL_CASE(COALESCE(TIPO, ''));
        OPERACAO        = FN_CAMEL_CASE(COALESCE(OPERACAO, ''));
        DESCRICAO       = FN_CAMEL_CASE(COALESCE(DESCRICAO, ''));
        QTD             = COALESCE(QTD, '');
        OBSERVACAO      = FN_CAMEL_CASE(COALESCE(OBSERVACAO, ''));
        NOTIFICAR_EMAIL = COALESCE(NOTIFICAR_EMAIL, 0);
        NOTIFICAR_WEB   = COALESCE(NOTIFICAR_WEB, 0);
    
        ASSUNTO = 'Nova Requisi????o de Estoque';
        ASSUNTO_email = 'Nova Requisi????o de Estoque, Usu??rio:'||USUARIO||', Produto:'||PRODUTO||', Quantidade:'||QTD;
    
        CORPO = '<div style="display: -webkit-inline-box;">';
        CORPO = CORPO||' <span style="font-weight: bold;">O Usu??rio: </span>'||USUARIO||' <span style="font-weight: bold;">Solicita: </span>'||TIPO||'<br>';
        CORPO = CORPO||' <span style="font-weight: bold;">Produto: </span>'||PRODUTO||'<br>';
        CORPO = CORPO||' <span style="font-weight: bold;">Quantidade: </span>'||QTD||'<br>';
        CORPO = CORPO||' <span style="font-weight: bold;">Data: </span>'||DATA||'<br>';
        CORPO = CORPO||' <span style="font-weight: bold;">Motivo: </span>'||MOTIVO||'<br>';
        CORPO = CORPO||' <span style="font-weight: bold;">Opera????o: </span>'||OPERACAO||'<br>';
        CORPO = CORPO||' <span style="font-weight: bold;">Observa????o: </span>'||observacao||'<br>';
        CORPO = CORPO||'<br><a class="msg-balao-fechar" href="'|| fn_parametro('SISTEMA.URL_SERVER') ||'/_15220?ID='||new.id||'" target="_blank" >Clique aqui para ver</a>';
        CORPO = CORPO||'</div>';
    
    
        SELECT
                MAX(A.NIVEL)
        FROM TBREQUISICAO_AUTORIZADORES A
        WHERE A.STATUS = 1
        AND A.REQUISICAO_ID = NEW.REGRA_ID
        INTO :MAX_NIVEL;
    
      FOR
        SELECT
            A.USUARIO_ID,
            A.NIVEL
        FROM TBREQUISICAO_AUTORIZADORES A
        WHERE A.STATUS = 1
        AND A.REQUISICAO_ID = NEW.REGRA_ID
      INTO
        :USUARIO_ID,
        :NIVEL
      DO BEGIN
    
        INSERT INTO TBREQ_BAIXA_AUTORIZADOR (REQUISICAO_BAIXA_ESTOQUE_ID, USUARIO_ID, STATUS, DATA_APROVACAO, NIVEL)
                                 VALUES (NEW.ID, :USUARIO_ID, 0, NULL, :NIVEL );
    
        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(NOTIFICAR_WEB = 1 AND :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);
        END
    
        IF(NOTIFICAR_EMAIL = 1 AND :MAX_NIVEL = :NIVEL)THEN
        BEGIN
            INSERT INTO TBEMAIL (
                ID,
                EMAIL,
                USUARIO_ID,
                ASSUNTO,
                CORPO,
                STATUS,
                DATAHORA,
                MODULO_EMAIL
            ) VALUES (
                :EMAIL_ID,
                :DESTINATARIO,
                0,
                :ASSUNTO_EMAIL,
                :CORPO,
                0,
                CURRENT_TIMESTAMP,
                16
            );
       END
    
      END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbreq_baixa_autorizador_b03u for tbreq_baixa_autorizador
active before update position 3
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 USUARIO VARCHAR(50);
declare variable DATA VARCHAR(16);
declare variable PRODUTO VARCHAR(150);
declare variable MOTIVO VARCHAR(50);
declare variable TIPO CHAR(50);
declare variable OPERACAO VARCHAR(200);
declare variable DESCRICAO VARCHAR(200);
declare variable QTD VARCHAR(50);
declare variable observacao blob sub_type 1 segment size 80;
declare variable notificar_email integer;
declare variable notificar_web integer;
declare variable max_nivel integer;
declare variable PENDENTES integer;
declare variable reprovacoes integer;
declare variable LISTA varchar(300);
begin

    --proximo nivel para notificar
    select
            max(a.nivel)
        from TBREQ_BAIXA_AUTORIZADOR a
        where a.status = 0
        and a.nivel < new.nivel
        and a.requisicao_baixa_estoque_id = new.requisicao_baixa_estoque_id
    into :max_nivel;

    max_nivel = coalesce(max_nivel,-1);

    --pendentes do nivel
    select
        count(R.id) as PENDENTES,
        list(coalesce(u.nome, u.usuario),', ') as LISTA
    from TBREQ_BAIXA_AUTORIZADOR R, tbusuario u
    WHERE R.requisicao_baixa_estoque_id = NEW.requisicao_baixa_estoque_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);

    --reprovacoes
    select
        count(R.id) as PENDENTES
    from TBREQ_BAIXA_AUTORIZADOR R
    WHERE R.requisicao_baixa_estoque_id = NEW.requisicao_baixa_estoque_id
    AND R.status = 2
    into reprovacoes;

    reprovacoes = coalesce(reprovacoes,0);

  --se ainda tem niveis pendentes, se no nivel atual ja foi aprovada, se nao esta reprovando e se nao teve reprovacoes
  if(max_nivel >= 0 and PENDENTES = 0 and new.status <> 2 and reprovacoes = 0)then
  begin
        --notificar procimo nivel

        SELECT first 1
            coalesce(o4.nome, o4.usuario) as USUARIO,
            formatdatetime(t.data_inserte) as DATA,
            o5.codigo||' - '||o5.descricao as PRODUTO,
            o3.descricao as MOTIVO,
            iif(o2.tipo = 0, 'Tranfer??nncia de estoque', iif(o2.tipo = 1, 'Baixa de estoque', '')) as TIPO,
            o2.descricao as OPERACAO,
            o1.descricao,
            (select FN_FORMAT_NUMBER(QUANTIDADE_SALDO ,4,',','.')||' '|| UNIDADEMEDIDA_SIGLA FROM SPC_STATUS_PECA(T.tipo, T.peca_id)) QTD,
            t.observacao,
            o1.notificar_email,
            01.NOTIFICAR_MSG
        FROM
            TBREQUISICAO_BAIXA_ESTOQUE T
            LEFT JOIN TBREGRA_REQ_BAIXA O1 ON O1.id = T.regra_id
            LEFT JOIN tbregra_req_baixa_operacao O2 ON O2.id = T.operacao_id AND O2.regra_req_baixa_id = T.regra_id
            LEFT JOIN TBSOBRA_SAIDA_MOTIVO O3 ON O3.id = T.motivo_id
            LEFT JOIN TBUSUARIO O4 ON O4.codigo = T.usuario_id
            LEFT JOIN tbproduto O5 ON O5.codigo = T.produto_id
        
        where t.id = new.requisicao_baixa_estoque_id
        into
            USUARIO,
            DATA,
            PRODUTO,
            MOTIVO,
            TIPO,
            OPERACAO,
            DESCRICAO,
            QTD,
            observacao,
            notificar_email,
            notificar_web;
    
        USUARIO         = FN_CAPITALIZE(coalesce(USUARIO, ''));
        DATA            = coalesce(DATA, '');
        PRODUTO         = FN_CAMEL_CASE(coalesce(PRODUTO, ''));
        MOTIVO          = FN_CAMEL_CASE(coalesce(MOTIVO, ''));
        TIPO            = FN_CAMEL_CASE(coalesce(TIPO, ''));
        OPERACAO        = FN_CAMEL_CASE(coalesce(OPERACAO, ''));
        DESCRICAO       = FN_CAMEL_CASE(coalesce(DESCRICAO, ''));
        QTD             = coalesce(QTD, '');
        observacao      = FN_CAMEL_CASE(coalesce(observacao, ''));
        notificar_email = coalesce(notificar_email, 0);
        notificar_web   = coalesce(notificar_web, 0);
    
        ASSUNTO = 'Nova Requisi????o de Estoque';
        ASSUNTO_email = 'Nova Requisi????o de Estoque, Usu??rio:'||USUARIO||', Produto:'||PRODUTO||', Quantidade:'||QTD;
    
        CORPO = '<div style="display: -webkit-inline-box;">';
        CORPO = CORPO||' <span style="font-weight: bold;">O Usu??rio: </span>'||USUARIO||' <span style="font-weight: bold;">Solicita: </span>'||TIPO||'<br>';
        CORPO = CORPO||' <span style="font-weight: bold;">Produto: </span>'||PRODUTO||'<br>';
        CORPO = CORPO||' <span style="font-weight: bold;">Quantidade: </span>'||QTD||'<br>';
        CORPO = CORPO||' <span style="font-weight: bold;">Data: </span>'||DATA||'<br>';
        CORPO = CORPO||' <span style="font-weight: bold;">Motivo: </span>'||MOTIVO||'<br>';
        CORPO = CORPO||' <span style="font-weight: bold;">Opera????o: </span>'||OPERACAO||'<br>';
        CORPO = CORPO||' <span style="font-weight: bold;">Observa????o: </span>'||observacao||'<br>';
        CORPO = CORPO||'<br><a class="msg-balao-fechar" href="'|| fn_parametro('SISTEMA.URL_SERVER') ||'/_15220?ID='||new.id||'" target="_blank" >Clique aqui para ver</a>';
        CORPO = CORPO||'</div>';
    
      for
        select
            a.usuario_id,
            a.nivel
        from TBREQ_BAIXA_AUTORIZADOR a
        where a.status = 0
        and a.requisicao_baixa_estoque_id = new.requisicao_baixa_estoque_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(notificar_web = 1 and :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);
        end
    
        if(notificar_email = 1 and :max_nivel = :nivel)then
        begin
            INSERT INTO TBEMAIL (
                ID,
                EMAIL,
                USUARIO_ID,
                ASSUNTO,
                CORPO,
                STATUS,
                DATAHORA,
                MODULO_EMAIL
            ) VALUES (
                :EMAIL_ID,
                :DESTINATARIO,
                0,
                :ASSUNTO_email,
                :CORPO,
                0,
                CURRENT_TIMESTAMP,
                16
            );
       end
    
      end
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger tbpcm_registro_chamado_msg_b03i for tbpcm_registro_chamado_msg
active before insert position 3
AS
DECLARE VARIABLE SOLICITANTE        INTEGER;
DECLARE VARIABLE ATENDENTE          INTEGER;
DECLARE VARIABLE ASSUNTO            VARCHAR(500);
DECLARE VARIABLE CATEGORIA          VARCHAR(200);
DECLARE VARIABLE SUB_CATEGORIA      VARCHAR(200);
DECLARE VARIABLE STATUS_DESCRICAO   VARCHAR(200);
DECLARE VARIABLE URGENCIA           VARCHAR(1);
DECLARE VARIABLE CORPO              BLOB SUB_TYPE 1 SEGMENT SIZE 80;
DECLARE VARIABLE MENSAGENS          INTEGER;
DECLARE VARIABLE NOTIFICAR_OPERADOR_CHAMADO VARCHAR(1);
BEGIN
    /*SE O SISTEMA ESTIVER CONFIGURADO PARA NOTIFICAR O SOLICITANTE/OPERADOR DO CHAMADO*/
    :NOTIFICAR_OPERADOR_CHAMADO = COALESCE(FN_PARAMETRO('SISTEMA.NOTIFICAR_OPERADOR_CHAMADO'),'0');
    
    IF(:NOTIFICAR_OPERADOR_CHAMADO = '1')THEN
    BEGIN
        FOR
           SELECT
                CH.USUARIO_SOLICITANTE_ID AS SOLICITANTE,
                COALESCE((SELECT FIRST 1 US.CODIGO FROM TBUSUARIO US, TBPCM_SETOR_OPERADOR OP
                    WHERE OP.USUARIO_ID = US.CODIGO AND OP.ID = CH.OPERADOR_ATENDIMENTO AND CH.SETOR_ID = OP.SETOR_ID),0) AS ATENDENTE,
                COALESCE((SELECT FIRST 1 CAT.DESCRICAO FROM TBPCM_CHAMADO_CATEGORIA CAT WHERE CAT.ID = CH.CHAMADO_CATEGORIA_ID),'') AS CATEGORIA,
                COALESCE((SELECT FIRST 1 CAT2.DESCRICAO FROM TBPCM_CHAMADO_CATEGORIA CAT2 WHERE CAT2.ID = CH.CHAMADO_SUBCATEGORIA_ID),'') AS SUB_CATEGORIA,
                COALESCE(CH.URGENCIA,'0') AS URGENCIA,
                COALESCE((SELECT COUNT(MSG.ID) FROM TBPCM_REGISTRO_CHAMADO_MSG MSG WHERE MSG.ID <> NEW.ID AND MSG.REGISTRO_CHAMADO_ID = NEW.REGISTRO_CHAMADO_ID),0) AS MENSAGENS,
                COALESCE((SELECT FIRST 1 STS.DESCRICAO FROM TBPCM_SETOR_STATUS STS WHERE STS.SETOR_ID = CH.SETOR_ID AND STS.ID = CH.STATUS),'') AS STATUS_DESCRICAO
               FROM TBPCM_REGISTRO_CHAMADO CH
               WHERE CH.ID = NEW.REGISTRO_CHAMADO_ID
         INTO :SOLICITANTE, :ATENDENTE, :CATEGORIA, :SUB_CATEGORIA, :URGENCIA, :MENSAGENS, :STATUS_DESCRICAO DO
         BEGIN
            :ASSUNTO = 'CHAMADO: '||FN_LPAD(NEW.REGISTRO_CHAMADO_ID,4,0)||' '||UPPER(:STATUS_DESCRICAO)||'';
            :CORPO   = NEW.MENSAGEM;
            IF(NEW.USUARIO_ID = :SOLICITANTE)THEN
            BEGIN
               EXECUTE PROCEDURE SPI_NOTIFICAR_V2(CURRENT_TIMESTAMP,:ATENDENTE,:ASSUNTO,:CORPO,0,1, 1);
            END

            IF(NEW.USUARIO_ID = :ATENDENTE)THEN
            BEGIN                                                                                     
               EXECUTE PROCEDURE SPI_NOTIFICAR_V2(CURRENT_TIMESTAMP,:SOLICITANTE,:ASSUNTO,:CORPO,0,1, 1);
            END

         END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbestoque_transacao_item_a1i for tbestoque_transacao_item
active after insert position 1
AS
declare variable ID INTEGER;
declare variable tabela varchar(300);
declare variable PRODUTO_ID INTEGER;
declare variable LOCALIZACAO_ID INTEGER;
declare variable STATUS INTEGER;
declare variable TAMANHO INTEGER;
declare variable ESTABELECIMENTO_ID INTEGER;
declare variable DESCRICAO VARCHAR(100);
declare variable OPERACAO VARCHAR(10);
begin

    IF(NEW.tipo = 'E')THEN
    BEGIN
        FOR
            select first 1
                ID,
                PRODUTO_ID,
                LOCALIZACAO_ID,
                STATUS,
                DESCRICAO,
                operacao_saida,
                ESTABELECIMENTO_ID
            FROM tbestoque_baixa_automatica A
            WHERE A.produto_id          = new.produto_codigo
            AND A.localizacao_id        = new.localizacao_codigo
            and a.estabelecimento_id    = new.estabelecimento_codigo
            and a.operacao_entrada      = new.operacao_codigo
            AND A.status = 1
        INTO
            ID,
            PRODUTO_ID,
            LOCALIZACAO_ID,
            STATUS,
            DESCRICAO,
            OPERACAO,
            ESTABELECIMENTO_ID
        DO BEGIN

            :TAMANHO = iif(new.t01 > 0,  1,
                       iif(new.t02 > 0,  2,
                       iif(new.t03 > 0,  3,
                       iif(new.t04 > 0,  4,
                       iif(new.t05 > 0,  5,
                       iif(new.t06 > 0,  6,
                       iif(new.t07 > 0,  7,
                       iif(new.t08 > 0,  8,
                       iif(new.t09 > 0,  9,
                       iif(new.t10 > 0, 10,
                       iif(new.t11 > 0, 11,
                       iif(new.t12 > 0, 12,
                       iif(new.t13 > 0, 13,
                       iif(new.t14 > 0, 14,
                       iif(new.t15 > 0, 15,
                       iif(new.t16 > 0, 16,
                       iif(new.t17 > 0, 17,
                       iif(new.t18 > 0, 18,
                       iif(new.t19 > 0, 19,
                       iif(new.t20 > 0, 20,
                       0))))))))))))))))))));
            
            EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO(
                'TBESTOQUE_BAIXA_AUTOMATICA',
                0,
                :ID,
                :ESTABELECIMENTO_ID,
                :LOCALIZACAO_ID,
                FN_DATA_PRODUCAO(),
                :PRODUTO_ID,
                :TAMANHO,
                new.QUANTIDADE,
                'S',
                :OPERACAO,
                1,
                new.centro_de_custo,
                'BAIXA AUTOMATICA DE ESTOQUE',
                null, 
                new.documento
            );

            for
               select trim(s.tabela) as tabela, s.id from SPC_PECA(new.peca_id) s
            into
              :tabela,
              :id
            do begin

               execute procedure spi_notificar(current_timestamp, 186,'Baixa Automática de Peças 2','Tabela:'||:tabela||'<br>Peça:'||:id||'',1,1, 16);

               if(tabela = 'VWREMESSA_TALAO_DETALHE')then
               begin
                    --update VWREMESSA_TALAO_DETALHE d set d.quantidade_saldo = 0 where d.id = :id;
                    FN_SQL_EXEC('update VWREMESSA_TALAO_DETALHE d set d.quantidade_saldo = 0 where d.id = '||:ID, 2);
               end

               if(tabela = 'TBREVISAO')then
               begin
                    --update TBREVISAO r set r.saldo = 0 where r.id = :id;
                    FN_SQL_EXEC('update TBREVISAO r set r.saldo = 0 where r.id = '||:ID, 2);
               end

            end
        END
    END

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_b11u for tbpedido
inactive before update position 13
AS
declare variable supervisor integer;
declare variable supervisores varchar(300);
declare variable REPROVADO integer;
declare variable primeiro_pedido varchar(10);
declare variable url varchar(500);
declare variable corpo1 blob sub_type 1 segment size 80;
declare variable motivo blob sub_type 1 segment size 80;
declare variable usuario_id integer;
begin

  --se pedido gravado pelo representante
  if(new.autorizacao_supervisor = 1 and (old.autorizacao_supervisor = 0 or old.autorizacao_supervisor = 2))then
  begin

    supervisor = coalesce((select
                                r.supervisor_id
                            from TBREPRESENTANTE r where r.codigo = new.representante_codigo),0);

    if(supervisor > 0)then
    begin

        corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
        corpo1 = corpo1 || '<p></p>';
        corpo1 = corpo1 || '<p><a href="'||coalesce(fn_parametro('SISTEMA.URL_SERVER')||'/_12200?PEDIDO='||coalesce(new.pedido,0),'')||'" target="_blank">[ABRIR PEDIDO NA WEB]</a></p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '<p style="font-weight: bold;"><u>Pedido: '||coalesce(new.pedido,0)||'</u></p>';
        corpo1 = corpo1 || '<p><u>Digitado por</u>: '||coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = new.usuario_codigo),'')||'</p>';
        corpo1 = corpo1 || '<p><u>Observação</u>: '||coalesce(new.observacao,'')||'</p>';
        corpo1 = corpo1 || '<p><u>Cliente</u>: '||coalesce((select first 1 fn_lpad(c.codigo,6,'0')||' - '||c.razaosocial from tbcliente c where c.codigo = new.cliente_codigo),'')||'</p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '</body></html>';

        usuario_id = coalesce((select
                                s.usuario_id
                                from TBSUPERVISOR s where s.id = :supervisor),0);

        if(usuario_id > 0)then
        begin
            execute procedure SPI_NOTIFICAR(
                current_timestamp,
                :usuario_id,
                'Pedido pendente de aprovação (SUPERVISOR)',
                :corpo1,
                1,
                1,
                5
            );
        end
    end

  end

  --se reprovado pelo supervisor
  if((old.autorizacao_supervisor = 1 or old.autorizacao_supervisor = 3) and new.autorizacao_supervisor = 2)then
  begin

    EXECUTE PROCEDURE SPI_HISTORICO('TBPEDIDO',new.pedido, 'Reprovado (Supervisor)');

    supervisor = coalesce((select
                                r.supervisor_id
                            from TBREPRESENTANTE r where r.codigo = new.representante_codigo),0);

    if(new.usuario_codigo > 0)then
    begin

        select first 1 s.motivo, S.usuario_id from TBPEDIDO_APROVACAO s where s.pedido_id = new.pedido and s.tipo = 1 order by ID desc
        INTO motivo, REPROVADO;

        corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
        corpo1 = corpo1 || '<p></p>';
        corpo1 = corpo1 || '<p><a href="'||coalesce(fn_parametro('SISTEMA.URL_SERVER')||'/_12200?PEDIDO='||new.pedido,'')||'" target="_blank">[ABRIR PEDIDO NA WEB]</a></p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '<p style="font-weight: bold;"><u>Pedido: '||coalesce(new.pedido,0)||'</u></p>';
        corpo1 = corpo1 || '<p><u>Reprovador por</u>: '||coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = :REPROVADO),'')||'</p>';
        corpo1 = corpo1 || '<p><u>Motivo:</u>: '||coalesce(:motivo,'')||'</p>';
        corpo1 = corpo1 || '<p><u>Observação</u>: '||new.observacao||'</p>';
        corpo1 = corpo1 || '<p><u>Cliente</u>: '||coalesce((select first 1 fn_lpad(c.codigo,6,'0')||' - '||c.razaosocial from tbcliente c where c.codigo = new.cliente_codigo),'')||'</p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '</body></html>';

        execute procedure SPI_NOTIFICAR(
            current_timestamp,
            new.usuario_codigo,
            'Pedido reprovado (SUPERVISOR)',
            :corpo1,
            1,
            1
        );
    end

  end

  --se aprovado pelo supervisor
  if(new.autorizacao_supervisor = 3 and new.autorizacao_financeiro = 1 and (old.autorizacao_supervisor = 1 or old.autorizacao_supervisor = 2))then
  begin

    EXECUTE PROCEDURE SPI_HISTORICO('TBPEDIDO',new.pedido, 'Aprovado (Supervisor)');

    supervisores = coalesce((select LIST(U.usuario_id,',') FROM tbcontrole_usuario U WHERE  U.id = 897 and u.valor_ext = '1'),'186');

    --se cliente tem um pedido já confirmado
    primeiro_pedido = coalesce((select first 1 p.pedido from tbpedido p where p.pedido <> new.pedido and p.cliente_codigo = new.cliente_codigo and p.situacao = 1),0);
    if(primeiro_pedido = 0)then
    begin
       primeiro_pedido = 'Sim';
    end else
    begin
       primeiro_pedido = 'Não';
    end

    if( char_length(coalesce(supervisores,'')) > 0)then
    begin

        corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
        corpo1 = corpo1 || '<p></p>';
        corpo1 = corpo1 || '<p><a href="'||coalesce(fn_parametro('SISTEMA.URL_SERVER')||'/_12200?PEDIDO='||new.pedido,'')||'" target="_blank">[ABRIR PEDIDO NA WEB]</a></p>';
        corpo1 = corpo1 || '<p><a href="'||coalesce(fn_parametro('SISTEMA.URL_SERVER')||'/_12090?EMPRESA_ID='||new.cliente_codigo,'')||'" target="_blank">[ABRIR CLIENTE NA WEB]</a></p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '<p style="font-weight: bold;"><u>Pedido: '||coalesce(new.pedido,0)||'</u></p>';
        corpo1 = corpo1 || '<p><u>Primeiro Pedido</u>: '||coalesce(primeiro_pedido,'')||'</p>';
        corpo1 = corpo1 || '<p><u>Digitado por</u>: '||coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = new.usuario_codigo),'')||'</p>';
        corpo1 = corpo1 || '<p><u>Observação</u>: '||coalesce(new.observacao,0)||'</p>';
        corpo1 = corpo1 || '<p><u>Cliente</u>: '||coalesce((select first 1 fn_lpad(c.codigo,6,'0')||' - '||c.razaosocial from tbcliente c where c.codigo = new.cliente_codigo),'')||'</p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '</body></html>';

        FOR
            select OSPLIT FROM split2(:supervisores,',')
        INTO
            :supervisores
        do BEGIN
            execute procedure SPI_NOTIFICAR(
                current_timestamp,
                :supervisores,
                'Pedido pendente de aprovação (FINANCEIRO)',
                :corpo1,
                1,
                1
            );
       END
    end

  end

  --se aprovado pelo supervisor automaticamente
  if(new.autorizacao_supervisor = 3 and new.autorizacao_financeiro = 1 and old.autorizacao_supervisor = 0 and old.autorizacao_financeiro = 0)then
  begin

    EXECUTE PROCEDURE SPI_HISTORICO('TBPEDIDO',new.pedido, 'Aprovado (Supervisor)');

    supervisores = coalesce((select LIST(U.usuario_id,',') FROM tbcontrole_usuario U WHERE  U.id = 897 and u.valor_ext = '1'),'186');

    --se cliente tem um pedido já confirmado
    primeiro_pedido = coalesce((select first 1 p.pedido from tbpedido p where p.pedido <> new.pedido and p.cliente_codigo = new.cliente_codigo and p.situacao = 1),0);
    if(primeiro_pedido = 0)then
    begin
       primeiro_pedido = 'Sim';
    end else
    begin
       primeiro_pedido = 'Não';
    end

    if( char_length(coalesce(supervisores,'')) > 0)then
    begin

        corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
        corpo1 = corpo1 || '<p></p>';
        corpo1 = corpo1 || '<p><a href="'||coalesce(fn_parametro('SISTEMA.URL_SERVER')||'/_12200?PEDIDO='||new.pedido,'')||'" target="_blank">[ABRIR PEDIDO NA WEB]</a></p>';
        corpo1 = corpo1 || '<p><a href="'||coalesce(fn_parametro('SISTEMA.URL_SERVER')||'/_12090?EMPRESA_ID='||new.cliente_codigo,'')||'" target="_blank">[ABRIR CLIENTE NA WEB]</a></p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '<p style="font-weight: bold;"><u>Pedido: '||coalesce(new.pedido,0)||'</u></p>';
        corpo1 = corpo1 || '<p><u>Primeiro Pedido</u>: '||coalesce(primeiro_pedido,'')||'</p>';
        corpo1 = corpo1 || '<p><u>Digitado por</u>: '||coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = new.usuario_codigo),'')||'</p>';
        corpo1 = corpo1 || '<p><u>Observação</u>: '||coalesce(new.observacao,0)||'</p>';
        corpo1 = corpo1 || '<p><u>Cliente</u>: '||coalesce((select first 1 fn_lpad(c.codigo,6,'0')||' - '||c.razaosocial from tbcliente c where c.codigo = new.cliente_codigo),'')||'</p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '</body></html>';

        FOR
            select OSPLIT FROM split2(:supervisores,',')
        INTO
            :supervisores
        do BEGIN
            execute procedure SPI_NOTIFICAR(
                current_timestamp,
                :supervisores,
                'Pedido pendente de aprovação (FINANCEIRO)',
                :corpo1,
                1,
                1
            );
       END
    end

  end

  --se reprovado pelo financeiro
  if(new.autorizacao_financeiro = 2 and (old.autorizacao_financeiro = 1 or old.autorizacao_financeiro = 3))then
  begin

    EXECUTE PROCEDURE SPI_HISTORICO('TBPEDIDO',new.pedido, 'Reprovado (Financeiro)');

    supervisor = coalesce((select
                                r.supervisor_id
                            from TBREPRESENTANTE r where r.codigo = new.representante_codigo),0);

    if(supervisor > 0)then
    begin

        select first 1 s.motivo, S.usuario_id from TBPEDIDO_APROVACAO s where s.pedido_id = new.pedido and s.tipo = 2 order by ID desc
        INTO motivo, REPROVADO;

        corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
        corpo1 = corpo1 || '<p></p>';
        corpo1 = corpo1 || '<p><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_12200?PEDIDO='||new.pedido||'" target="_blank">[ABRIR PEDIDO NA WEB]</a></p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '<p style="font-weight: bold;"><u>Pedido: '||new.pedido||'</u></p>';
        corpo1 = corpo1 || '<p><u>Reprovador por</u>: '||coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = :REPROVADO),'')||'</p>';
        corpo1 = corpo1 || '<p><u>Digitado por</u>: '||coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = new.usuario_codigo),'')||'</p>';
        corpo1 = corpo1 || '<p><u>Motivo:</u>: '||:motivo||'</p>';
        corpo1 = corpo1 || '<p><u>Observação</u>: '||new.observacao||'</p>';
        corpo1 = corpo1 || '<p><u>Cliente</u>: '||coalesce((select first 1 fn_lpad(c.codigo,6,'0')||' - '||c.razaosocial from tbcliente c where c.codigo = new.cliente_codigo),'')||'</p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '</body></html>';

        execute procedure SPI_NOTIFICAR(
            current_timestamp,
            new.usuario_codigo,
            'Pedido reprovado (FINANCEIRO)',
            :corpo1,
            1,
            1
        );
    end

  end

  --se aprovado
  if(new.autorizacao_supervisor = 3 and new.autorizacao_financeiro = 3 and (old.autorizacao_supervisor <> 3 or old.autorizacao_financeiro <> 3))then
  begin

    EXECUTE PROCEDURE SPI_HISTORICO('TBPEDIDO',new.pedido, 'Aprovado (Financeiro)');

    supervisores = coalesce((select LIST(U.usuario_id,',') FROM tbcontrole_usuario U WHERE  U.id = 898 and u.valor_ext = '1'),'186');

    if( char_length(coalesce(supervisores,'')) > 0)then
    begin

        corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
        corpo1 = corpo1 || '<p></p>';
        corpo1 = corpo1 || '<p><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_12200?PEDIDO='||new.pedido||'" target="_blank">[ABRIR PEDIDO NA WEB]</a></p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '<p style="font-weight: bold;"><u>Pedido: '||new.pedido||'</u></p>';
        corpo1 = corpo1 || '<p><u>Digitado por</u>: '||coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = new.usuario_codigo),'')||'</p>';
        corpo1 = corpo1 || '<p><u>Observação</u>: '||new.observacao||'</p>';
        corpo1 = corpo1 || '<p><u>Cliente</u>: '||coalesce((select first 1 fn_lpad(c.codigo,6,'0')||' - '||c.razaosocial from tbcliente c where c.codigo = new.cliente_codigo),'')||'</p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '</body></html>';

        FOR
            select OSPLIT FROM split2(:supervisores,',')
        INTO
            :supervisores
        do BEGIN
            execute procedure SPI_NOTIFICAR(
                current_timestamp,
                :supervisores,
                'Novo Pedido Digitado',
                :corpo1,
                1,
                1
            );
       END
    end

  end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_processado_b99u for tbpedido_item_processado
inactive before update position 99
AS
begin

  if(
        new.situacao = 3
    and new.data_producao is null
    and new.quantidade_producao = 0
    and new.quantidade_pedido > 0
  )then
  begin
     execute procedure spi_notificar(current_timestamp, 186, 'Talão sem registro de estoque','Remessa: '||new.remessa||', Controle:'||new.controle,1,1, 16);
  end

  if(
        old.situacao <> 3
    and new.situacao = 3
    and new.data_producao is null
    and new.quantidade_producao = 0
    and new.quantidade_pedido > 0
  )then
  begin
     exception "..." 'Quantidade do talão('||new.controle||') detalhado deve ser maior que 0, click no botão "Gravar Todos" e tente novamente!"';
  end

  if(new.data_producao is not null and coalesce(new.quantidade_pedido,0) > 0 and coalesce(new.quantidade_producao,0) > 0 and (coalesce(new.quantidade_pedido,0) * 50) < coalesce(new.quantidade_producao,0))then
  begin
        exception "..." 'Quantidade produzida do talão('||new.controle||') mais de 50x o programado, Q:'||coalesce(new.quantidade_pedido,0)||', P:'||coalesce(new.quantidade_producao,0)||'. Tente novamente!"';
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbtaloes_avulsos_b02i for tbtaloes_avulsos
active before insert or update position 1
AS
declare variable data_prod_1 date;
declare variable data_prod_2 date;
declare variable status_prod_1 integer;
declare variable status_prod_2 integer;
declare variable nova_remessa integer;
declare variable ANO integer;
declare variable MES integer;
declare variable PERFIL_UP varchar(10);
declare variable FAMILIA_ID varchar(10);
declare variable ABREVGP varchar(10);
declare variable ESTABELECIMENTO_CODIGO integer;
declare variable TALAO_ID integer;
declare variable quantidade_producao numeric(15,4);
declare variable quantidade_alternativa numeric(15,4);
declare variable espessura numeric(15,4);
declare variable densidade numeric(15,4);
declare variable produto_id integer;
declare variable um varchar(10);
declare variable uma varchar(10);
declare variable fator numeric(15,4);
declare variable linha_codigo integer;
declare variable densidade_espessura integer;
declare variable ITEM_PROCESSADO integer;
declare variable localizacao_id integer;
declare variable perfil_sku varchar(10);
declare variable programacao_id integer;
declare variable TEMPO_TOTAL numeric(18,8);
declare variable TEMPO_SETUP numeric(18,8);
declare variable autorizaCAO varchar(300);
declare variable gerar_taloes integer;
declare variable USUARIO_NOTIFICAR integer;
declare variable corpo1 blob sub_type 1 segment size 80;
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

    ESTABELECIMENTO_CODIGO = 1;

    select
        g.familia_id,
        p.id as PERFIL,
        FN_REPLACE(substring(g.descricao from 1 for 3),'.|-|1|2|3|4|5|6|7||9|0','') as ABREVGP
    from TBGP_UP s, tbgp g, tbup u, tbperfil p, tbfamilia f
    where g.id = new.gp_id
        and g.id = s.gp_id
        and s.up_id = u.id
        and u.perfil = p.id
        and p.tabela = 'UP'
        and u.id = new.up_id
        and f.codigo = g.familia_id
    into FAMILIA_ID, PERFIL_UP, ABREVGP;

    gerar_taloes = 0;

    IF(inserting)THEN
    BEGIN

        autorizaCAO = trim(fn_parametro('TBFAMILIA.AUTORIZAR_AVULSOS', :FAMILIA_ID));

        IF(autorizaCAO = '0')THEN
        BEGIN
          NEW.autorizacao = 1;
          gerar_taloes = 1;
        end ELSE
        BEGIN
          NEW.autorizacao = 0;
          gerar_taloes = 0;

          for
            select OSPLIT FROM split(:autorizaCAO, ',')
          INTO
            :USUARIO_NOTIFICAR
          DO BEGIN

            corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
            corpo1 = corpo1 || '<p></p>';
            corpo1 = corpo1 || '<p><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_22450?ID='||new.id||'" target="_blank">[ABRIR NA WEB]</a></p>';
            corpo1 = corpo1 || '<br>';
            corpo1 = corpo1 || '<p style="font-weight: bold;"><u>ID: '||new.id||'</u></p>';
            corpo1 = corpo1 || '<p><u>Usu??rio</u>: '||coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = fn_current_user_id() ),'')||'</p>';
            corpo1 = corpo1 || '<p><u>Produto</u>: '||(coalesce((select first 1 j.codigo||' - '||j.descricao from tbproduto j where j.modelo_codigo = new.modelo_id and j.cor_codigo = new.cor_id),''))||'</p>';
            corpo1 = corpo1 || '<p><u>Quantidade</u>: '||replace(new.quantidade||'','.',',')||'</p>';
            corpo1 = corpo1 || '<p><u>Observa????o</u>: '||new.observacao||'</p>';
            corpo1 = corpo1 || '<br>';
            corpo1 = corpo1 || '</body></html>';

            execute procedure SPI_NOTIFICAR(current_timestamp, :USUARIO_NOTIFICAR, 'Tal??o Avulso Pendente de autoriza????o', :corpo1,1,1,16);

          END
        END

    END

    IF(updating)THEN
    BEGIN

        corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
        corpo1 = corpo1 || '<p></p>';
        corpo1 = corpo1 || '<p><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_22450?ID='||new.id||'" target="_blank">[ABRIR NA WEB]</a></p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '<p style="font-weight: bold;"><u>ID: '||new.id||'</u></p>';
        corpo1 = corpo1 || '<p><u>Usu??rio</u>: '||coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = fn_current_user_id() ),'')||'</p>';
        corpo1 = corpo1 || '<p><u>Produto</u>: '||(coalesce((select first 1 j.codigo||' - '||j.descricao from tbproduto j where j.modelo_codigo = new.modelo_id and j.cor_codigo = new.cor_id),''))||'</p>';
        corpo1 = corpo1 || '<p><u>Quantidade</u>: '||replace(new.quantidade||'','.',',')||'</p>';
        corpo1 = corpo1 || '<p><u>Observa????o</u>: '||new.observacao||'</p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '</body></html>';

      IF(OLD.autorizacao = 0 AND NEW.autorizacao = 1)THEN
      BEGIN
        HISTORICO = 'Aprovado';
        execute procedure SPI_HISTORICO('TBTALOES_AVULSOS', new.id, :HISTORICO);

        execute procedure SPI_NOTIFICAR(current_timestamp, new.usuario_id, 'Tal??o Avulso Aprovado', :corpo1,1,1,16);

        gerar_taloes = 1;
      END ELSE
      BEGIN
        gerar_taloes = 0;
      END

      IF(OLD.autorizacao <> 2 AND NEW.autorizacao = 2)THEN
      BEGIN
        HISTORICO = 'Reprovado';
        execute procedure SPI_HISTORICO('TBTALOES_AVULSOS', new.id, :HISTORICO);
        gerar_taloes = 0;

        execute procedure SPI_NOTIFICAR(current_timestamp, new.usuario_id, 'Tal??o Avulso Reprovado', :corpo1,1,1,16);

      END

    END

    IF(gerar_taloes = 1)THEN
    BEGIN
        ABREVGP = fn_lpad(new.up_id, 4, '0');
    
        ANO = extract(year from current_timestamp);
        MES = extract(month from current_timestamp);
    
        nova_remessa =  coalesce((select first 1 s.remessa_id from TBTALOES_AVULSOS_REMESSAS s, tbremessa r where r.numero = s.remessa_id and s.ANO = :ANO and s.MES = :MES and s.gp_id = new.gp_id and s.up_id = new.up_id),0);
    
        if(nova_remessa = 0)then
        begin
            nova_remessa = GEN_ID(GTBREMESSA,1);
    
            INSERT INTO TBTALOES_AVULSOS_REMESSAS (REMESSA_ID, ANO, MES, GP_ID, PERFIL_UP, UP_ID) VALUES (:nova_remessa, :ANO, :MES, new.gp_id, :PERFIL_UP, new.up_id);
    
            --########################## - remessa - ###############################
            INSERT INTO TBREMESSA (
                NUMERO,
                ESTABELECIMENTO_CODIGO,
                FAMILIA_CODIGO,
                TURNO_CODIGO,
                DATA,
                USUARIO_CODIGO,
                TIPO,
                TONALIDADE,
                PROJECAO,
                OC,
                BLOQ,
                STATUS,
                REMESSA,
                AGRUPAMENTO_ID,
                FAMILIA_MP,
                REQUISICAO,
                DESCRICAO,
                DATA_BSC,
                DATAHORA,
                GP_ID,
                CONTROLE_TALAO,
                COMPONENTE,
                WEB,
                AMOSTRA,
                DATA_DISPONIBILIDADE,
                OBSERVACAO,
                EMPRESA_ID,
                DATA_PREVISAO,
                PERFIL,
                CLASSIFICACAO
            ) VALUES (
                :nova_remessa,
                :ESTABELECIMENTO_CODIGO,
                :FAMILIA_ID,
                NULL,
                '01.'||lpad(:mes, 2)||'.'||lpad(:ano, 4),
                new.usuario_id,
                '1',
                '',
                '0',
                '0',
                '0',
                '1',
                :ABREVGP||'_'||lpad(:ano, 4)||lpad(:mes, 2),
                0,
                0,
                '0',
                NULL,
                fn_start_of_month('01.'||lpad(:mes, 2)||'.'||lpad(:ano, 4)),
                fn_start_of_month('01.'||lpad(:mes, 2)||'.'||lpad(:ano, 4)),
                new.gp_id,
                '',
                '0',
                '1',
                '0',
                NULL,
                '',
                0,
                NULL,
                '1',
                ''
            );
        end
    
        if(nova_remessa = 0)then
        begin
          exception "..." 'Erro ao gerar remessa.';
        end
    
        new.talao_id = coalesce((select max(t.talao_id) from TBTALOES_AVULSOS t where t.remessa_id = :nova_remessa),0) + 1;
    
        new.remessa_id = :nova_remessa;
    
        -- ################################ - talao acumulado - ########################################
    
        select
            p.codigo,
            f.UNIDADEMEDIDA_SIGLA,
            f.UNIDADEMEDIDA_ALTERNATIVO,
            m.linha_codigo,
            m.densidade,
            m.espessura,
            f.densidade_espessura
        from tbproduto p, tbfamilia f, tbmodelo m
            where p.modelo_codigo = new.modelo_id
            and p.cor_codigo = new.cor_id
            and f.codigo = p.familia_codigo
            and m.codigo = new.modelo_id
            and p.status = '1'
            and m.status = '1'
            and f.status = '1'
        into :produto_id, um, uma, linha_codigo, densidade, espessura, densidade_espessura;
    
        produto_id = coalesce(produto_id,0);
    
        if(produto_id = 0)then
        begin
           exception "..." 'Produto n??o encontrado. Verifique se tem um produto ativo com esse modelo e cor.';
        end
    
        quantidade_producao    = new.quantidade;
        quantidade_alternativa = 0;
        fator                  = coalesce(fn_parametro('TBMODELO_LINHA.FATOR_CONVERSAO', :linha_codigo),0);
    
    
        if(char_length(trim(uma)) > 0)then
        begin
    
            if(fator = 0)then
            begin
              exception "..." 'Fam??lia com unidade de medida alternativa, mais fator n??o foi encontrado na linha. Linha:'||:linha_codigo||', Parametro:604 da linha.';
            end
    
            quantidade_producao    = new.quantidade / fator;
            quantidade_alternativa = new.quantidade;
        end
    
        if(coalesce(densidade_espessura,0) = 0)then
        begin
            Select
                Cast(Substring(Dens_Esp from 1 for 5) as Integer) Densidade,
                Cast(Substring(Dens_Esp from 6 for 5) as Numeric(15,2)) Espessura
            From (
                Select First 1
                Coalesce((Select First 1 lPad(M.Densidade,5,'0')||lPad(M.Espessura,5,'0')
                From TbModelo M Where M.Codigo = P2.Modelo_Codigo),'0000000000') Dens_Esp
                From TbModelo_Consumo_Cor MC, TbFamilia F, TbProduto P2
                Where MC.Modelo_Id = new.modelo_id
                and MC.Cor_Id = new.cor_id
                and MC.Produto_Id = P2.Codigo
                and P2.Familia_Codigo = F.Codigo
                and F.Densidade_Espessura = '1'
                and((new.tamanho = 1 and MC.T01 > 0) or
                (new.tamanho = 2 and MC.T02 > 0) or
                (new.tamanho = 3 and MC.T03 > 0) or
                (new.tamanho = 4 and MC.T04 > 0) or
                (new.tamanho = 5 and MC.T05 > 0) or
                (new.tamanho = 6 and MC.T06 > 0) or
                (new.tamanho = 7 and MC.T07 > 0) or
                (new.tamanho = 8 and MC.T08 > 0) or
                (new.tamanho = 9 and MC.T09 > 0) or
                (new.tamanho =10 and MC.T10 > 0) or
                (new.tamanho =11 and MC.T11 > 0) or
                (new.tamanho =12 and MC.T12 > 0) or
                (new.tamanho =13 and MC.T13 > 0) or
                (new.tamanho =14 and MC.T14 > 0) or
                (new.tamanho =15 and MC.T15 > 0) or
                (new.tamanho =16 and MC.T16 > 0) or
                (new.tamanho =17 and MC.T17 > 0) or
                (new.tamanho =18 and MC.T18 > 0) or
                (new.tamanho =19 and MC.T19 > 0) or
                (new.tamanho =20 and MC.T20 > 0))
            ) into densidade, espessura;
    
        end
    
        TALAO_ID = GEN_ID(GTBREMESSA_ITEM_PROCESSADO,1);
    
        data_prod_1   = null;
        data_prod_2   = null;
        status_prod_1 = 1;
        status_prod_2 = 1;

        INSERT INTO TBREMESSA_ITEM_PROCESSADO (
            REMESSA,
            CONTROLE,
            ESTABELECIMENTO_CODIGO,
            FAMILIA_CODIGO,
            MODELO_CODIGO,
            MATRIZ_CODIGO,
            OPERADOR_CODIGO,
            PRODUTO_CODIGO,
            DATA_LIBERACAO,
            DATA_PRODUCAO,
            HORA_PRODUCAO,
            HORA_LIBERACAO,
            TAMANHO,
            QUANTIDADE,
            CHAPAS,
            PLACAS,
            SOBRAS,
            CONSUMO_MEDIO,
            OBSERVACAO,
            SITUACAO,
            PROGRAMACAO_CONTROLE,
            PROGRAMACAO_SEQUENCIA,
            ESPESSURA,
            SOBRAS_,
            PLACAS_,
            DENSIDADE,
            TOLERANCIA,
            OPERADOR_LIBERACAO,
            PROGRAMACAO_ESTEIRA,
            PROGRAMACAO_BOCA,
            PLANOMESTRE_ID,
            LIB,
            UP_ID,
            OPERADOR_PRODUCAO,
            LOCALIZACAO_ID,
            TURNO,
            REQUISICAO_ID,
            PERC_SOBRA,
            QUANTIDADE_SOBRA,
            APROVEITAMENTO,
            ESTOQUE_ID,
            SEQ,
            ID,
            DATAHORA,
            QUANTIDADE_ALTERNATIVA,
            VIA_ETIQUETA,
            OPERADOR_GP,
            PERCENTUAL_TALAO_EXTRA,
            TALAO_EXTRA,
            TALAO_VINCULO,
            FERRAMENTA_ID,
            REPROCESSAR,
            FLAG_DATA,
            PERFIL
        ) VALUES (
            new.remessa_id,
            new.talao_id,
            :ESTABELECIMENTO_CODIGO,
            0,
            new.modelo_id,
            NULL,
            NULL,
            :produto_id,
            :data_prod_1,
            :data_prod_1,
            :data_prod_2,
            NULL,
            new.tamanho,
            :quantidade_producao,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            :status_prod_1,
            0,
            0,
            coalesce(:espessura,0),
            NULL,
            NULL,
            coalesce(:densidade,0),
            NULL,
            0,
            new.gp_id,
            1,
            0,
            '1',
            new.up_id,
            NULL,
            0,
            '',
            0,
            0,
            0,
            0,
            0,
            '',
            :TALAO_ID,
            current_timestamp,
            :quantidade_alternativa,
            0,
            0,
            NULL,
            NULL,
            NULL,
            NULL,
            0,
            0,
            NULL
        );
    
        --############################### - talao detalhado - ########################################
    
        ITEM_PROCESSADO = GEN_ID(GERADOR1_ID,1);
    
        localizacao_id = coalesce((select first 1 f.localizacao_codigo from TBFAMILIA f where f.codigo = :familia_id),0);
    
        :perfil_sku    = coalesce((select first 1 k.perfil from vwsku k where k.modelo_id = new.modelo_id and k.cor_id = new.cor_id and k.tamanho = new.tamanho),'');
    
        if(:perfil_sku = '')then
        begin
            exception "..." 'Erro ao consultar perfil do produto '||:produto_id;
        end
    
        INSERT INTO TBPEDIDO_ITEM_PROCESSADO (
            PEDIDO_ITEM_CONTROLE,
            CONTROLE,
            ESTABELECIMENTO_CODIGO,
            FAMILIA_CODIGO,
            MODELO_CODIGO,
            CLIENTE_CODIGO,
            PEDIDO,
            REMESSA,
            REMESSA_ACUMULADO_CONTROLE,
            TURNO_LIBERACAO,
            TURNO_PRODUCAO,
            ESTEIRA_LIBERACAO,
            ESTEIRA_PRODUCAO,
            SETOR_CODIGO,
            PRODUTO_CODIGO,
            EXPEDICAO_PRODUTO_CODIGO,
            DATA_PROCESSAMENTO,
            DATA_EXPEDICAO,
            DATA_LIBERACAO,
            DATA_PRODUCAO,
            HORA_EXPEDICAO,
            HORA_LIBERACAO,
            HORA_PRODUCAO,
            LOTE,
            TAMANHO,
            QUANTIDADE_PEDIDO,
            QUANTIDADE_PRODUCAO,
            QUANTIDADE_SALDO,
            SITUACAO,
            OPERADOR_ID_PRODUCAO,
            OPERADOR,
            PROGRAMACAO_CONTROLE,
            PROGRAMACAO_SEQUENCIA,
            PROGRAMACAO_TURNO,
            COR_ID,
            VOLUME,
            PECA_CONJUNTO,
            PROGRAMACAO_ESTEIRA,
            PROGRAMACAO_BOCA,
            VIA_ETIQUETA,
            LIB,
            LOCALIZACAO_CODIGO,
            REG_ESTOQUE,
            STATUS_PRODUCAO,
            AGRUPAMENTO_ID,
            COLETA_ID,
            ESTOQUE_ID,
            DATAHORA,
            QUANTIDADE_PRODUCAO_TMP,
            QUANTIDADE_ALTERN,
            QUANTIDADE_ALTERN_PRODUCAO,
            QUANTIDADE_ALTERN_SALDO,
            QUANTIDADE_ALTERN_PRODUCAO_TMP,
            QUANTIDADE_SOBRA_TMP,
            QUANTIDADE_SOBRA,
            ESTOQUE_ID_BAIXA,
            QUANTIDADE_BAIXA,
            TURNO,
            ACRESCIMO,
            TALAO_DESMEMBRAMENTO,
            ESTOQUE_ID_S_TRANSF,
            ESTOQUE_ID_E_TRANSF,
            MOTIVO_BAIXA,
            TIPO_BAIXA,
            CCUSTO_BAIXA,
            OBSERVACAO,
            FERRAMENTA_ID,
            ENDERECAMENTO_ID,
            FLAG_DATA,
            MOTIVO_BAIXA_ID,
            PERFIL
        )VALUES (
            0,
            :ITEM_PROCESSADO,
            :estabelecimento_codigo,
            0,
            new.modelo_id,
            NULL,
            NULL,
            new.remessa_id,
            new.talao_id,
            NULL,
            1,
            NULL,
            NULL,
            NULL,
            :produto_id,
            NULL,
            NULL,
            NULL,
            :data_prod_1,
            :data_prod_1,
            NULL,
            NULL,
            NULL,
            NULL,
            new.tamanho,
            :quantidade_producao,
            :quantidade_producao,
            :quantidade_producao,
            :status_prod_2,
            NULL,
            NULL,
            0,
            0,
            0,
            new.cor_id,
            0,
            1,
            new.gp_id,
            1,
            0,
            '0',
            :localizacao_id,
            '0',
            '0',
            0,
            NULL,
            0,
            current_timestamp,
            iif(:familia_id = 12, :quantidade_producao ,0),
            :quantidade_alternativa,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            1,
            0,
            NULL,
            NULL,
            NULL,
            '',
            '',
            '',
            NULL,
            NULL,
            NULL,
            0,
            0,
            :perfil_sku
        );
    
        localizacao_id = coalesce((select LOCALIZACAO_ID from SPC_ESTOQUE_TRANSACAO_REGRA(5,new.gp_id, :perfil_up, :produto_id, 'E', :ITEM_PROCESSADO)),0);
    
        if(:localizacao_id = 0)then
        begin
            exception "..." 'Erro ao consultar localiza????o. Produto: '||:produto_id||', GP: '||new.gp_id||', Tipo: "E", Perfil: '||:perfil_up||' Regra: 5';
        end
    
        update TBPEDIDO_ITEM_PROCESSADO t set t.localizacao_codigo = :localizacao_id where t.controle = :ITEM_PROCESSADO;
    
    
        --################### - programacao - ####################
    
            TEMPO_TOTAL = 0;
            TEMPO_SETUP = 0;
            DELETE FROM TMP22040;
    
    
            INSERT INTO
            TMP22040 (
                UP_ID, 
                MODELO_ID, 
                COR_ID, 
                TAMANHO, 
                QUANTIDADE
            ) VALUES (
               new.up_id,
               new.modelo_id,
               new.cor_id,
               new.tamanho,
               iif(coalesce(:quantidade_alternativa,0) = 0, :quantidade_producao, :quantidade_alternativa)
            );
                         
            --TEMPO_TOTAL = COALESCE((SELECT FIRST 1 T.TOTAL FROM SPC_PROGRAMACAO_TEMPO_NOVO T),1);

            SELECT FIRST 1 T.TOTAL, t.totalsetup FROM SPC_PROGRAMACAO_TEMPO_NOVO T
            into :TEMPO_TOTAL, :TEMPO_SETUP;
    
            TEMPO_TOTAL = COALESCE(:TEMPO_TOTAL,1);
            TEMPO_SETUP = COALESCE(:TEMPO_SETUP,0);
    
            IF ( TEMPO_TOTAL = 0 ) THEN
            BEGIN
                TEMPO_TOTAL = 1;
            END
    
            EXECUTE PROCEDURE SPI_PROGRAMACAO2(
                :estabelecimento_codigo,
                'A',
                new.gp_id,
                new.up_id,
                1,
                :TALAO_ID,
                0,
                0,
                :quantidade_producao,
                :TEMPO_TOTAL,
                new.remessa_id,
                current_date,
                :TEMPO_SETUP
            );

            if(false)then
            begin

                PROGRAMACAO_ID = COALESCE((SELECT FIRST 1 ID FROM TBPROGRAMACAO
                                           WHERE ESTABELECIMENTO_ID = :estabelecimento_codigo
                                             AND TIPO = 'A'
                                             AND TABELA_ID  = :TALAO_ID
                                             AND REMESSA_ID = new.remessa_id),0);

                data_prod_1   = current_date;
                data_prod_2   = current_timestamp;

                update tbremessa_item_processado l set l.situacao = 1 where l.remessa = new.remessa_id and l.controle = new.talao_id;
                update tbpedido_item_processado  h set h.quantidade_producao_tmp = h.quantidade_pedido, h.situacao = 2 where h.remessa = new.remessa_id and h.remessa_acumulado_controle = new.talao_id;
                update TBPROGRAMACAO a set a.status = '2', a.datahora_inicio = current_date, a.datahora_fim = current_date, a.operador_id = new.operador_id where a.id = :PROGRAMACAO_ID;

                update tbremessa_item_processado l set l.data_producao = :data_prod_1, l.data_liberacao = :data_prod_1, l.hora_producao  = :data_prod_2, l.situacao = 2 where l.remessa = new.remessa_id and l.controle = new.talao_id;
                update tbpedido_item_processado  h set h.quantidade_producao_tmp = h.quantidade_pedido, h.data_producao = :data_prod_1, h.data_liberacao = :data_prod_1, h.hora_producao  = :data_prod_2, h.situacao = 3 where h.remessa = new.remessa_id and h.remessa_acumulado_controle = new.talao_id;
                update TBPROGRAMACAO a set a.status = '3', a.datahora_inicio = current_date, a.datahora_fim = current_date, a.operador_id = new.operador_id where a.id = :PROGRAMACAO_ID;
            end
    
            --########################### - consumo - ############################
            execute procedure SPI_REM_CONSUMO_INSUMO_TALAO(:estabelecimento_codigo, new.remessa_id, new.talao_id);
     END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbesteira_b03i for tbesteira
active before insert position 3
AS
begin
  if(new.familia_codigo = 3 and new.perfil = 'N')then
  begin
     UPDATE OR INSERT INTO TBTV_AGENDAMENTO ("DESC", GP_ID)  VALUES (new.descricao, new.codigo) MATCHING ("DESC", GP_ID);
     UPDATE OR INSERT INTO TBAGRUPAMENTO_GP_DETALHE ( AGRUPAMENTO_GP_ID, GP_ID)  VALUES (0  , new.codigo) MATCHING (AGRUPAMENTO_GP_ID, GP_ID);
     UPDATE OR INSERT INTO TBAGRUPAMENTO_GP_DETALHE ( AGRUPAMENTO_GP_ID, GP_ID)  VALUES (14 , new.codigo) MATCHING (AGRUPAMENTO_GP_ID, GP_ID);
  end

  execute procedure SPI_EMAIL(
    fn_parametro('SISTEMA.EMAIL_NOVO_GP'),
    'Atenção - Novo Grupo de Produção Cadastrado',
    'Novo Grupo de Produção Cadastrado, providenciar:<br>- Criação de regras de transação de estoque<br>- Inclusão de Familia, Grupo, Perfil. Na localização de Estoque<br>- Verificar o Link da TV do BSC Geral.<br><br>GP: '||new.codigo||'-'||new.descricao||'<br>Data:'||formatdatetime(current_timestamp)||'<br>Usuário:'||fn_current_user_id()||'-'||current_user,
    0,
    16
  );

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbmfe_item_b01i for tbmfe_item
active before insert or update position 0
AS
declare variable OPERACAO varchar(10);
declare variable SITUACAO varchar(10);
declare variable ESTABELECIMENTO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable TAMANHO integer;
declare variable TRANSACAO_ID integer;
declare variable SALDO integer;
declare variable CTR_ESTOQUE integer;
declare variable email varchar(300);
declare variable corpo varchar(1000);
declare variable data_emissao date;
begin

    if(inserting)then
    begin
        new.tamanho  = coalesce((select first 1 e.tamanho from TBEAN e where e.prefixo||e.codigo = substring(new.gtin from 1 for 12)),0);
    end

    if(new.controlar_estoque = 1 )then
    begin
        CTR_ESTOQUE = coalesce((select q.controla_estoque from tbquiosque q where q.id = new.caixa_id),0);
    
        if(fn_parametro('SISTEMA.ESTOQUE_PDV') = 1 and CTR_ESTOQUE = 1)then
        begin
            NEW.estoque_id = coalesce(NEW.estoque_id,0);
        
            SITUACAO = '';
    
            Select E.Situacao, E.Data_Emissao
              From Tbmfe e
             Where E.Serie = new.serie
               and E.Numero = new.numero
               and e.caixa_id = new.caixa_id
              into :SITUACAO, :data_emissao;
        
            if(SITUACAO = 'E' and new.estoque_id = 0 and new.quantidade > new.qtd_cancelada)then
            begin
                /*
                select
                    Q.estabelecimento_id,
                    Q.localizacao_estoque,
                    Q.operacao_saida
                 from tbmfe e, tbquiosque Q, tbmfe_caixa_movimento M
                    where e.serie  = new.serie
                    and e.numero   = new.numero
                    and e.caixa_id = new.caixa_id
                    AND M.id_caixa_movimento = E.id_caixa_movimento
                    AND Q.id = M.id_caixa
                    */
                Select FF.Estabelecimento_Codigo,
                       FF.Localizacao_PDV,
                       FF.Operacao_PDV
                  From TbProduto P, TbQuiosque Q, TbFamilia_Ficha FF
                 Where P.Codigo = New.ID_Produto
                   and Q.Id = New.Caixa_Id
                   and P.Familia_Codigo = FF.Familia_Codigo
                   and Q.Estabelecimento_id = FF.Estabelecimento_Codigo
                into
                    :ESTABELECIMENTO_ID,
                    :LOCALIZACAO_ID,
                    :OPERACAO;
        
                    :TAMANHO = coalesce((select first 1 e.tamanho from TBEAN e where e.prefixo||e.codigo = substring(new.gtin from 1 for 12)),0);
        
                    if(:TAMANHO = 0 or :TAMANHO > 20 )then
                    begin
                        exception "..." 'Tamanho não encontrado, MFE:'||new.numero||', SERIE:'||new.serie||' ITEM:'||new.item||', CAIXA:'||new.caixa_id;
                    end

                    :SALDO = fn_array(coalesce((select
                                            s.t01_saldo||'|'||
                                            s.t02_saldo||'|'||
                                            s.t03_saldo||'|'||
                                            s.t04_saldo||'|'||
                                            s.t05_saldo||'|'||
                                            s.t06_saldo||'|'||
                                            s.t07_saldo||'|'||
                                            s.t08_saldo||'|'||
                                            s.t09_saldo||'|'||
                                            s.t10_saldo||'|'||
                                            s.t11_saldo||'|'||
                                            s.t12_saldo||'|'||
                                            s.t13_saldo||'|'||
                                            s.t14_saldo||'|'||
                                            s.t15_saldo||'|'||
                                            s.t16_saldo||'|'||
                                            s.t17_saldo||'|'||
                                            s.t18_saldo||'|'||
                                            s.t19_saldo||'|'||
                                            s.t20_saldo
        
                                            from tbestoque_saldo s
                                            where s.localizacao_codigo = :LOCALIZACAO_ID
                                            and s.estabelecimento_codigo = :ESTABELECIMENTO_ID
                                            and s.produto_codigo = new.id_produto),'0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0'), :TAMANHO,'|');
        
                    if(:SALDO < new.quantidade)then
                    begin
                       email = fn_parametro('SISTEMA.EMAIL_FURO_EST_PDV');
        
                       corpo = 'SEM SALDO DE ESTOQUE PARA IMPORTAÇÃO DE ITENS DO MFE:'||NEW.numero||'-'||NEW.serie||'<BR>';
                            corpo = corpo||'ESTABELECIMENTO:'||:ESTABELECIMENTO_ID||'<BR>';
                            corpo = corpo||'LOCALIZAÇÃO:'||:LOCALIZACAO_ID||'<BR>';
                            corpo = corpo||'PRODUTO:'||new.id_produto||' - '||NEW.descricao||'<BR>';
                            corpo = corpo||'TAMANHO:'||:TAMANHO||'<BR>';


        
                       if(char_length(email) > 0)then
                       begin
                            IN AUTONOMOUS TRANSACTION DO
                            BEGIN
                                execute procedure SPI_EMAIL(:email, 'ERRO DE ESTOQUE NO PDV ESTB:'||:estabelecimento_id||', LOC:'||:localizacao_id||', PROD:'||new.id_produto, :corpo, 1, 20);
                            END
                       end
        
                       exception "..." 'ERRO DE ESTOQUE NO PDV ESTB:'||:estabelecimento_id||', LOC:'||:localizacao_id||', PROD:'||new.id_produto;
        
                    end

                    :TRANSACAO_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);

                    EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO(
                        'TBMFE_ITEM',
                        0,
                        NEW.tag_id,
                        :ESTABELECIMENTO_ID,
                        :LOCALIZACAO_ID,
                        :data_emissao,
                        new.id_produto,
                        :TAMANHO,
                        new.quantidade,
                        'S',
                        :OPERACAO,
                        0,
                        '',
                        'BAIXA AUTOMATICA DE ESTOQUE',
                        :TRANSACAO_ID,
                        new.tag_id,
                        null,
                        null,
                        0,
                        0,
                        new.tag_id,
                        0
                    );
        
                    new.estoque_id = :TRANSACAO_ID;
        
            end else
            begin
    
                if(SITUACAO = 'E' and new.estoque_id > 0 and new.quantidade = new.qtd_cancelada)then
                begin
                    delete from tbestoque_transacao_item i where i.controle = new.estoque_id;
                    new.estoque_id = 0;
                end
        
                if(SITUACAO = 'C' and new.estoque_id > 0 )then
                begin
                    delete from tbestoque_transacao_item i where i.controle = new.estoque_id;
                    new.estoque_id = 0;
                end
        
            end
        end
    end
end
^

SET TERM ; 
