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(20);
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
            max(a.nivel)
        from TBREQ_BAIXA_AUTORIZADOR a
        where a.status = 0
        and a.requisicao_baixa_estoque_id = new.requisicao_baixa_estoque_id
    into :max_nivel;

  if(max_nivel >= 0)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.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||' solicita '||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="https://gc.delfa.com.br/_15220?ID='||new.id||'" target="_blank" >Clique aqui para ver</a>';
        CORPO = CORPO||'</div>';
    
      for
        select
            a.usuario_id,
            a.nivel
        from TBREQUISICAO_AUTORIZADORES a
        where a.status = 1
        and a.requisicao_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;

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(20);
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||' solicita '||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="https://gc.delfa.com.br/_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;