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)
                    VALUES (:EMAIL_ID, :DESTINATARIO, 0, :ASSUNTO_EMAIL, :CORPO, 0, CURRENT_TIMESTAMP);

            END

        END

    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbcaso_registro_b02i for tbcaso_registro
active after insert position 0
AS
    declare variable tipo integer;
    declare variable descricao varchar(500);
    declare variable PAINEL varchar(500);
    declare variable USUARIO_CAD varchar(500);
    declare variable monitor varchar(500);
    declare variable motivo varchar(500);
    declare variable valor varchar(5000);
    declare variable corpo varchar(8000);
    declare variable html1 varchar(4000);
    declare variable html2 varchar(4000);
begin
    
    PAINEL      = coalesce((select first 1 FN_LPAD(C.ID, 4, '0')||' - '||C.TITULO from tbcaso_painel c where c.id = new.painel_id), '');
    USUARIO_CAD = coalesce((select first 1 u.nome from tbcaso_historico h, tbusuario u where h.caso_id = new.id and h.painel_id = new.painel_id and u.codigo = h.usuario_id),'');

    monitor = (SELECT first 1 p.email_monitor FROM tbcaso_painel p where p.id = new.painel_id);

    html1 = (SELECT first 1 p.html FROM tbcaso_html p where p.id = 1);
    html2 = (SELECT first 1 p.html FROM tbcaso_html p where p.id = 2);

--    corpo = '<html><body><p><a href="https://gc.delfa.com.br/_11150/'||new.painel_id||'/'||new.id||'" target="_blank">Abrir '||new.id||' na web</a></p>';
    corpo = '<html><body><p><a href="'|| fn_parametro('SISTEMA.URL_SERVER') ||'/_11160/'||new.painel_id||'?CASO_ID='||new.id||'" target="_blank">Abrir '||new.id||' na web</a></p>';
    corpo = corpo || html1;
    corpo = corpo || '<p><u>Painel:</u>: '||:PAINEL||'</p><br>';
    corpo = corpo || '<p><u>Data</u>: '||formatdatetime(current_timestamp)||'</p>';
    corpo = corpo || '<p><u>Aberto por:</u>: '||:USUARIO_CAD||'</p>';

    for
       select
            TIPO,
            DESCRICAO,
            coalesce(VALOR,'&nbsp;') as VALOR
       from CASO_DETALHE(new.painel_id, new.id)
    into
        :tipo,
        :descricao,
        :valor
    do
    begin
        corpo = corpo||'<p><u>'||descricao||'</u>: '||:valor||'</p>';

        if(descricao = 'Motivo')then
        begin
            motivo = valor;
        end
    end

    corpo = corpo || html2;

    insert into tbemail (status, email, assunto, corpo, usuario_id, cc, cco, painel_id)
    values (
        0,
        :monitor,
        FN_ELIPSE(('NOVO - [CASO:'|| FN_LPAD(NEW.id, 8, '0') ||'] Aberto : '|| :motivo), 300),
        :corpo,
        0,
        coalesce((select c.email_monitor  from TBCASO_PAINEL c where c.id = new.painel_id),''), --(select u.email from tbusuario u where u.codigo = new.usuario_id),
        '',
        new.painel_id
    );

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
        ) VALUES (
            :EMAIL_ID,
            :DESTINATARIO,
            0,
            :ASSUNTO_email,
            :CORPO,
            0,
            CURRENT_TIMESTAMP
        );
   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
            ) VALUES (
                :EMAIL_ID,
                :DESTINATARIO,
                0,
                :ASSUNTO_email,
                :CORPO,
                0,
                CURRENT_TIMESTAMP
            );
       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
            ) VALUES (
                :EMAIL_ID,
                :DESTINATARIO,
                0,
                :ASSUNTO_EMAIL,
                :CORPO,
                0,
                CURRENT_TIMESTAMP
            );
       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
            ) VALUES (
                :EMAIL_ID,
                :DESTINATARIO,
                0,
                :ASSUNTO_email,
                :CORPO,
                0,
                CURRENT_TIMESTAMP
            );
       end
    
      end
  end
end
^

SET TERM ; ^

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

SET TERM ^ ;

CREATE OR ALTER procedure SPI_EMAIL (
    DESTINATARIO varchar(500),
    ASSUNTO varchar(500),
    CORPO blob sub_type 0 segment size 80,
    NOTIFICAR_USUARIO integer = null)
as
declare variable EMAIL varchar(500);
declare variable USUARIO_ID integer;
declare variable EMAIL_ID integer;
begin

    NOTIFICAR_USUARIO = COALESCE(NOTIFICAR_USUARIO,0);

    EMAIL_ID = (SELECT GEN_ID(GTBEMAIL,1) FROM RDB$DATABASE);

    IF ( NOTIFICAR_USUARIO = 1 ) THEN
    BEGIN
        FOR
            SELECT EMAIL
              FROM SPC_EMAIL_VALIDO(:DESTINATARIO)
             WHERE VALIDO = 1
        INTO
            EMAIL
        DO
        BEGIN
            USUARIO_ID = (SELECT FIRST 1 CODIGO FROM TBUSUARIO U WHERE U.EMAIL = :EMAIL);
    
            IF ( USUARIO_ID > 0 ) 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,
                    'Voce recebeu um novo email do sistema!',
                    0,
                    0,
                    current_timestamp,
                    :USUARIO_ID,
                    current_timestamp,
                    0,
                    '',
                    0,
                    'Assunto: <br/>' || :ASSUNTO ||'<br/><a class="msg-balao-fechar" href="'|| fn_parametro('SISTEMA.URL_SERVER') ||'/_11340/'||:EMAIL_ID||'" target="_blank" >Clique aqui para ver</a><br>Dt/Hr: '|| FN_DATE(current_timestamp));
            END
            
        END
    END


    INSERT INTO TBEMAIL (
        ID,
        EMAIL,
        USUARIO_ID,
        ASSUNTO,
        CORPO,
        STATUS,
        DATAHORA
    ) VALUES (
        :EMAIL_ID,
        :DESTINATARIO,
        0,
        :ASSUNTO,
        :CORPO,
        0,
        CURRENT_TIMESTAMP
    );
end
^

SET TERM ; ^

COMMENT ON PARAMETER SPI_EMAIL.NOTIFICAR_USUARIO IS
'1 = Sim | 0 = Nao | Default: Nao';

SET TERM ^ ;

CREATE OR ALTER procedure SPI_NOTIFICA_ESTOQUE_ABASTECIDO (
    PRODUTO_ID integer,
    LOCALIZACAO_ID integer,
    QUANTIDADE numeric(15,4))
as
declare variable VLOCALIZACAO_ID integer;
declare variable VLOCALIZACAO_DESCRICAO varchar(20);
declare variable VPRODUTO_ID integer;
declare variable VPRODUTO_DESCRICAO varchar(100);
declare variable VNOTIFICACAO_USUARIOS varchar(200);
declare variable VUSUARIO_ID integer;
declare variable VUSUARIO_EMAIL varchar(50);
declare variable EMAIL_ID integer;
declare variable HTML_CORPO blob sub_type 1 segment size 80;
declare variable HTML_DADOS blob sub_type 1 segment size 80;
Begin

    For
    select lf.localizacao_id,
           l.descricao localizacao_descricao,
           p.codigo produto_id,
           p.descricao produto_descricao,
           lf.notificacao_usuarios
      from tbproduto p, tblocalizacao_familia lf, tblocalizacao l
     where lf.localizacao_id = :localizacao_id
       and p.familia_codigo = lf.familia_id
       and lf.localizacao_id = l.codigo
       and p.codigo = :produto_id    
       and lf.notifica = '1'
       and char_length(lf.notificacao_usuarios) > 0
    Into :vLOCALIZACAO_ID,:vLOCALIZACAO_DESCRICAO,:vPRODUTO_ID,:vPRODUTO_DESCRICAO,:vNOTIFICACAO_USUARIOS
    Do begin

        HTML_DADOS =
            '
            <tr>              
                <td> ' || vLOCALIZACAO_ID||' - '||vLOCALIZACAO_DESCRICAO || '</td>
                <td> ' || vPRODUTO_ID|| ' - '||vPRODUTO_DESCRICAO          || '</td>
                <td> ' || CAST(:QUANTIDADE AS NUMERIC(15,2)) || '</td>
            </tr> ';

        HTML_CORPO =
       '<style type="text/css">
        .tg  {border-collapse:collapse;border-spacing:0;}
        .tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
        .tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
        .tg .tg-0lax{text-align:left;vertical-align:top}
        </style>'||
           '<hr/>
                <h1>Notifica Estoque REABASTECIDO</h1>
            <hr/>
            <table class="tg">
                <thead>
                    <tr>              
                        <th class="tg-0lax">LOCALIZAÇÃO </th>
                        <th class="tg-0lax">PRODUTO     </th>
                        <th class="tg-0lax">SALDO       </th>
                    </tr>
                </thead>
                <tbody>
                ' || HTML_DADOS || '
                </tbody>
            </table><br/><br/>';

        For
        Select u.codigo, u.email /*,u.usuario*/
          from split(:vNOTIFICACAO_USUARIOS,','), tbusuario u
         where cast(OSPLIT as integer) = u.codigo
           and char_length(u.email) > 0
        Into :vUSUARIO_ID, :vUSUARIO_EMAIL /*,:vUSUARIO_NOME*/
        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,
                    :vUSUARIO_ID,
                    0,
                    0,
                    'Notificação de Estoque REABASTECIDO!',
                    0,
                    0,
                    current_timestamp,
                    0, 
                    current_timestamp,
                    0,
                    '',
                    0,
                    ' <br/>' || 'Loc.'||:vLOCALIZACAO_ID||' Prod.'||:vPRODUTO_DESCRICAO||' SALDO: '||CAST(:QUANTIDADE AS NUMERIC(15,2))||
                    ' <br/><a class="msg-balao-fechar" href="'|| fn_parametro('SISTEMA.URL_SERVER') ||'/_15060?PRODUTO_ID='||
                    :vPRODUTO_ID||'" target="_blank" >Clique aqui para ver</a><br>Dt/Hr: '|| FN_DATE(current_timestamp));

                INSERT INTO TBEMAIL (
                    ID,
                    EMAIL,
                    USUARIO_ID,
                    ASSUNTO,
                    CORPO,
                    STATUS,
                    DATAHORA
                ) VALUES (
                    :EMAIL_ID,
                    :vUSUARIO_EMAIL,
                    0,
                    'Notificação de Estoque REABASTECIDO',
                    FN_STRING_TO_HTML(:HTML_CORPO),
                    0,
                    CURRENT_TIMESTAMP
                );

           end

       end

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_NOTIFICA_ESTOQUE_ZERADO (
    PRODUTO_ID integer,
    LOCALIZACAO_ID integer)
as
declare variable VLOCALIZACAO_ID integer;
declare variable VLOCALIZACAO_DESCRICAO varchar(20);
declare variable VPRODUTO_ID integer;
declare variable VPRODUTO_DESCRICAO varchar(100);
declare variable VNOTIFICACAO_USUARIOS varchar(200);
declare variable VUSUARIO_ID integer;
declare variable VUSUARIO_EMAIL varchar(50);
declare variable EMAIL_ID integer;
declare variable HTML_CORPO blob sub_type 1 segment size 80;
declare variable HTML_DADOS blob sub_type 1 segment size 80;
Begin

    For
    select lf.localizacao_id,
           l.descricao localizacao_descricao,
           p.codigo produto_id,
           p.descricao produto_descricao,
           lf.notificacao_usuarios
      from tbproduto p, tblocalizacao_familia lf, tblocalizacao l
     where lf.localizacao_id = :localizacao_id
       and p.familia_codigo = lf.familia_id
       and lf.localizacao_id = l.codigo
       and p.codigo = :produto_id    
       and lf.notifica = '1'
       and char_length(lf.notificacao_usuarios) > 0
    Into :vLOCALIZACAO_ID,:vLOCALIZACAO_DESCRICAO,:vPRODUTO_ID,:vPRODUTO_DESCRICAO,:vNOTIFICACAO_USUARIOS
    Do begin

        HTML_DADOS =
            '
            <tr>              
                <td> ' || vLOCALIZACAO_ID||' - '||vLOCALIZACAO_DESCRICAO || '</td>
                <td> ' || vPRODUTO_ID|| ' - '||vPRODUTO_DESCRICAO          || '</td>
            </tr> ';

        HTML_CORPO =
       '<style type="text/css">
        .tg  {border-collapse:collapse;border-spacing:0;}
        .tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
        .tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
        .tg .tg-0lax{text-align:left;vertical-align:top}
        </style>'||
           '<hr/>
                <h1>Notifica Estoque Zerado</h1>
            <hr/>
            <table class="tg">
                <thead>
                    <tr>              
                        <th class="tg-0lax">LOCALIZAÇÃO </th>
                        <th class="tg-0lax">PRODUTO     </th>
                    </tr>
                </thead>
                <tbody>
                ' || HTML_DADOS || '
                </tbody>
            </table><br/><br/>';

        For
        Select u.codigo, u.email /*,u.usuario*/
          from split(:vNOTIFICACAO_USUARIOS,','), tbusuario u
         where cast(OSPLIT as integer) = u.codigo
           and char_length(u.email) > 0
        Into :vUSUARIO_ID, :vUSUARIO_EMAIL /*,:vUSUARIO_NOME*/
        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,
                    :vUSUARIO_ID,
                    0,
                    0,
                    'Notificação de Estoque Zerado!',
                    0,
                    0,
                    current_timestamp,
                    0, 
                    current_timestamp,
                    0,
                    '',
                    0,
                    ' <br/>' || 'Loc.'||:vLOCALIZACAO_ID||' Prod.'||:vPRODUTO_DESCRICAO||
                    ' <br/><a class="msg-balao-fechar" href="'|| fn_parametro('SISTEMA.URL_SERVER') ||'/_15060?PRODUTO_ID='||
                    :vPRODUTO_ID||'" target="_blank" >Clique aqui para ver</a><br>Dt/Hr: '|| FN_DATE(current_timestamp));

                INSERT INTO TBEMAIL (
                    ID,
                    EMAIL,
                    USUARIO_ID,
                    ASSUNTO,
                    CORPO,
                    STATUS,
                    DATAHORA
                ) VALUES (
                    :EMAIL_ID,
                    :vUSUARIO_EMAIL,
                    0,
                    'Notificação de Estoque Zerado',
                    FN_STRING_TO_HTML(:HTML_CORPO),
                    0,
                    CURRENT_TIMESTAMP
                );

           end

       end

End
^

SET TERM ; ^

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

SET TERM ^ ;

CREATE OR ALTER trigger ttbcaso_registro_b1i for tbcaso_registro
active before insert position 0
AS
declare variable finalizado integer;
declare variable id integer;
declare variable email varchar(100);
declare variable lista_emails varchar(300);
declare variable email_m varchar(300);
declare variable assunto varchar(5000);
begin

    execute procedure SPI_CASO_HISTORICO(new.id, new.painel_id, 'Caso Criado');

    new.old_user = new.usuario_id;

    id = gen_id(gtbcaso_feed,1);

    email = coalesce((select first 1 f.email from TBCASO_PAINEL f where f.id = new.painel_id),'');

    assunto = '';

--    assunto = assunto || '<html><body>';
    assunto = assunto || 'Caso '|| FN_LPAD(NEW.ID, 8, '0') ||' Aberto!';
--    assunto = assunto || '<p></p>';
--    assunto = assunto || '<p><a href="'||FN_PARAMETRO_V2('SISTEMA.URL_SERVER')||'/_11160/'||NEW.PAINEL_ID||'?CASO_ID='||NEW.ID||'" target="_blank">[ABRIR NA WEB]</a></p>';
--    assunto = assunto || '<p></p>';
--    assunto = assunto || '<p><u>Painel:</u> '|| COALESCE((SELECT FIRST 1 FN_LPAD(F.ID, 4, '0')||' - '||F.TITULO FROM TBCASO_PAINEL F WHERE F.ID = NEW.PAINEL_ID), '') ||'</p><br>';
--    assunto = assunto || '</html></body>';

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

    lista_emails = '';

    for
        select
            email
        from(
            select distinct
                email
            from(
                select
                    0 ordem,
                    OSPLIT as email
                from split(replace((
                    select
                        p.email_monitor
                    from tbcaso_painel p
                    where p.id = new.painel_id
                ),';',','),',')
                
                union all
                
                select
                   1 as ordem,
                   u.email
                from tbcaso_envolvidos e, tbusuario u
                where e.painel_id = new.painel_id
                and e.caso_id = new.id
                and u.codigo = e.usuario_id
                and char_length(u.email) > 5
            ) order by ordem
        )
    into
        :email_m

    do
    begin

        if (char_length(lista_emails ||','|| :email_m) < 300) then
        begin
            lista_emails = :lista_emails ||','|| :email_m;
        end

    end

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

    INSERT INTO TBCASO_FEED (ID, DE, PARA, EM_COPIA, EM_COPIA_OCULTA, MENSAGEM, ASSUNTO, PAINEL_ID, CASO_ID, FILES, SUBFEED, TIPO, USUARIO_ID)
        VALUES (:id, :email, :lista_emails, '', '', :assunto, '[CASO: '||FN_LPAD(NEW.ID, 8, '0')||'] - CASO ABERTO', new.painel_id, new.id, 0, 0, 1, FN_CURRENT_USER_ID());

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbcaso_registro_b02u for tbcaso_registro
active before update position 0
AS
declare variable finalizado integer;
declare variable id integer;
declare variable assunto varchar(5000);
begin

    if(new.status_id <> old.status_id)then
    begin
      finalizado = coalesce((select s.fechado from tbcaso_status s where s.id = new.status_id),0);

      if(finalizado = 1)then
      begin
        new.fechado = 1;
        id = gen_id(gtbcaso_feed,1);

        assunto = '';

--        assunto = assunto || '<html><body>';
        assunto = assunto || 'Caso '|| FN_LPAD(NEW.ID, 8, '0') ||' Fechado!';
--        assunto = assunto || '<p></p>';
--        assunto = assunto || '<p><a href="'||FN_PARAMETRO_V2('SISTEMA.URL_SERVER')||'/_11160/'||NEW.PAINEL_ID||'?CASO_ID='||NEW.ID||'" target="_blank">[ABRIR NA WEB]</a></p>';
--        assunto = assunto || '<p></p>';
--        assunto = assunto || '<p><u>Painel:</u> '|| COALESCE((SELECT FIRST 1 FN_LPAD(F.ID, 4, '0')||' - '||F.TITULO FROM TBCASO_PAINEL F WHERE F.ID = NEW.PAINEL_ID), '') ||'</p><br>';
--        assunto = assunto || '<p></p>';
--        assunto = assunto || '<p>Este</p>';
--        assunto = assunto || '<p></p>';
--        assunto = assunto || '</html></body>';

        INSERT INTO TBCASO_FEED (ID, DE, PARA, EM_COPIA, EM_COPIA_OCULTA, MENSAGEM, ASSUNTO, PAINEL_ID, CASO_ID, FILES, SUBFEED, TIPO, USUARIO_ID)
            VALUES (:id, '', '', '', '', :assunto, '[CASO: '||FN_LPAD(NEW.ID, 8, '0')||'] - CASO FECHADO', new.painel_id, new.id, 0, 0, 1, FN_CURRENT_USER_ID());

      end else
      begin
        new.fechado = 0;
      end
    end

end
^

SET TERM ; ^

