-- 15191 - Cadastro de Regras de Requisição de Movimentação de Estoque --
15191 - TBREGRA_REQ_BAIXA				-> Cadastro de Regras de Requisição de Movimentação de Estoque
15191 - TBREGRA_REQ_BAIXA_OPERACAO		-> Cadastro de Regras de Requisição de Movimentação de Estoque - Itens
15191 - TBREQUISICAO_AUTORIZADORES		-> Cadastro de Regras de Requisição de Movimentação de Estoque - Autorizadores

-- 15200 - Cadastro de Requisição de Movimentação de Estoque --
15200 - TBREQUISICAO_BAIXA_ESTOQUE		-> Cadastro de Requisição de Movimentação de Estoque

-- 15200 - Autorização de Requisição de Movimentação de Estoque --
15220 - TBREQ_BAIXA_AUTORIZADOR			-> Autorização de Requisição de Movimentação de Estoque

-- 15200 - Cadastro de Motivos de Movimentação de Estoque --
15280 - TBSOBRA_SAIDA_MOTIVO			-> Cadastro de Motivos de Movimentação de Estoque

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- CORREÇÃO TBMENU E TBMENU_DETALHE (Menu das Telas e Parâmetros Transferidos) ------------------------------------------------------------------------------------------------------------------------
UPDATE TBMENU SET TIPO = '0', URL = '15191' WHERE (CONTROLE = 15190);
UPDATE OR INSERT INTO TBMENU (CONTROLE, GRUPO, SUBGRUPO, TIPO, DESCRICAO) VALUES (15191, 'EST', 'EST', 1, 'CADASTRO DE REGRAS DE REQUISIÇÃO DE MOVIMENTAÇÃO DE ESTOQUE') MATCHING(CONTROLE);
UPDATE OR INSERT INTO TBMENU (CONTROLE, GRUPO, SUBGRUPO, TIPO, DESCRICAO) VALUES (15200, 'EST', 'EST', 1, 'CADASTRO DE REQUISIÇÃO DE MOVIMENTAÇÃO DE ESTOQUE') MATCHING(CONTROLE);
UPDATE OR INSERT INTO TBMENU (CONTROLE, GRUPO, SUBGRUPO, TIPO, DESCRICAO) VALUES (15220, 'EST', 'EST', 1, 'AUTORIZAÇÃO DE REQUISIÇÃO DE MOVIMENTAÇÃO DE ESTOQUE') MATCHING(CONTROLE);
UPDATE OR INSERT INTO TBMENU (CONTROLE, GRUPO, SUBGRUPO, TIPO, DESCRICAO) VALUES (15280, 'EST', 'EST', 1, 'CADASTRO DE MOTIVOS DE MOVIMENTAÇÃO DE ESTOQUE') MATCHING(CONTROLE);

UPDATE OR INSERT INTO TBMENU_DETALHE (MENU_ID, USUARIO_ID, INCLUIR, ALTERAR, EXCLUIR, IMPRIMIR, NEGAR) VALUES (15191, 474, 1, 1, 1, 0, 0) MATCHING(MENU_ID, USUARIO_ID);
UPDATE OR INSERT INTO TBMENU_DETALHE (MENU_ID, USUARIO_ID, INCLUIR, ALTERAR, EXCLUIR, IMPRIMIR, NEGAR) VALUES (15191, 837, 1, 1, 1, 1, 0) MATCHING(MENU_ID, USUARIO_ID);
UPDATE OR INSERT INTO TBMENU_DETALHE (MENU_ID, USUARIO_ID, INCLUIR, ALTERAR, EXCLUIR, IMPRIMIR, NEGAR) VALUES (15191, 645, 1, 1, 1, 0, 0) MATCHING(MENU_ID, USUARIO_ID);

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- TBREGRA_REQ_BAIXA (Triggers) -----------------------------------------------------------------------------------------------------------------------------------------------------------------------
SET TERM ^ ;

CREATE OR ALTER trigger ttbregra_req_baixa_b01i for tbregra_req_baixa
active before insert position 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GTBREGRA_REQ_BAIXA,1);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbregra_req_baixa_b02i for tbregra_req_baixa
active before insert position 2
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF(NEW.ID > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'REGISTRO INCLUIDO';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBREGRA_REQ_BAIXA', NEW.ID, HISTORICO);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbregra_req_baixa_b01u for tbregra_req_baixa
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

   HISTORICO = '';

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

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

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

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

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

   IF (HISTORICO <> '') THEN
   BEGIN
      EXECUTE PROCEDURE SPI_HISTORICO('TBREGRA_REQ_BAIXA', OLD.ID, HISTORICO);
   END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbregra_req_baixa_b01d for tbregra_req_baixa
active before delete position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
DECLARE VARIABLE REQUISICAO INTEGER;
begin
    HISTORICO = '';
    REQUISICAO = COALESCE((SELECT FIRST 1 A.ID FROM TBREQUISICAO_BAIXA_ESTOQUE A WHERE A.REGRA_ID = OLD.ID), 0);

    IF (REQUISICAO > 0) THEN
    BEGIN
       exception "..." 'REGRA NÃO PODE SER EXCLUÍDA! A REGRA SELECIONADA ESTÁ EM USO.';
    END

    IF (OLD.ID > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'REGISTRO EXCLUIDO';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBHORARIO',OLD.ID, HISTORICO);
    END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbregra_req_baixa_b03d for tbregra_req_baixa
active before delete position 2
AS
BEGIN
  DELETE FROM TBREGRA_REQ_BAIXA_OPERACAO A WHERE A.REGRA_REQ_BAIXA_ID = OLD.ID;      -- EXCLUI OPERAÇÕES RELACIONADAS A REGQUISICAO DELETADA.
  DELETE FROM TBREQUISICAO_AUTORIZADORES B WHERE B.REQUISICAO_ID = OLD.ID;            -- EXCLUI AUTORIZADORES RELACIONADOS A REQUISICAO DELETADA.
END
^

SET TERM ; ^

-- TBREGRA_REQ_BAIXA_OPERACAO
SET TERM ^ ;

CREATE OR ALTER trigger ttbregra_req_baixa_operaca_b01i for tbregra_req_baixa_operacao
active before insert position 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GTBREGRA_REQ_BAIXA_OPER,1);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbregra_req_baixa_operaca_b02i for tbregra_req_baixa_operacao
active before insert position 1
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF(NEW.ID > 0) THEN
    BEGIN
        HISTORICO = 'OPERAÇÃO '||FN_LPAD(NEW.ID, 4, '0')||' - '||NEW.DESCRICAO||' INCLUIDA';
    END
    
    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBREGRA_REQ_BAIXA', NEW.REGRA_REQ_BAIXA_ID, HISTORICO);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbregra_req_baixa_operaca_b01u for tbregra_req_baixa_operacao
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

   HISTORICO = '';

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

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

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


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

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

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

    IF (HISTORICO <> '') THEN
    BEGIN
        HISTORICO = 'OPERACAO '||FN_LPAD(NEW.ID, 4, 0)||' - '||NEW.DESCRICAO||' ALTERADA'||HISTORICO;
        EXECUTE PROCEDURE SPI_HISTORICO('TBREGRA_REQ_BAIXA', OLD.REGRA_REQ_BAIXA_ID, HISTORICO);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbregra_req_baixa_operaca_b01d for tbregra_req_baixa_operacao
active before delete position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF(OLD.ID > 0) THEN
    BEGIN
        HISTORICO = 'OPERAÇÃO '||FN_LPAD(OLD.ID, 4, '0')||' - '||OLD.DESCRICAO||' EXCLUIDA';
    END
    
    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBREGRA_REQ_BAIXA', OLD.REGRA_REQ_BAIXA_ID, HISTORICO);
    END
END
^

SET TERM ; ^

-- TBREQUISICAO_AUTORIZADORES
SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_autorizadore_b01i for tbrequisicao_autorizadores
active before insert position 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GTBREQUISICAO_AUTORIZADORES,1);
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_autorizadore_b02i for tbrequisicao_autorizadores
active before insert position 1
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
DECLARE VARIABLE USUARIO VARCHAR(500);
BEGIN

    HISTORICO = '';
    USUARIO = COALESCE((SELECT FIRST 1 FN_LPAD(A.CODIGO, 4, '0')||' - '||A.USUARIO FROM TBUSUARIO A WHERE A.CODIGO = NEW.USUARIO_ID),0);

    IF(NEW.ID > 0) THEN
    BEGIN
        HISTORICO = 'AUTORIZADOR '||USUARIO||' INCLUIDO';
    END

    IF(HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBREGRA_REQ_BAIXA', NEW.REQUISICAO_ID, HISTORICO);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_autorizadore_b01u for tbrequisicao_autorizadores
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
DECLARE VARIABLE USUARIO VARCHAR(500);
BEGIN

    HISTORICO = '';
    USUARIO = COALESCE((SELECT FIRST 1 FN_LPAD(A.CODIGO, 4, '0')||' - '||A.USUARIO FROM TBUSUARIO A WHERE A.CODIGO = NEW.USUARIO_ID),0);

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

    IF(OLD.NIVEL <> NEW.NIVEL)THEN
    BEGIN
        HISTORICO = HISTORICO || ' NÍVEL:'||OLD.NIVEL||'->'||NEW.NIVEL;
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        HISTORICO = 'AUTORIZADOR '||USUARIO||' ALTERADO'||HISTORICO;
        EXECUTE PROCEDURE SPI_HISTORICO('TBREGRA_REQ_BAIXA', OLD.REQUISICAO_ID, HISTORICO);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_autorizadore_b02u for tbrequisicao_autorizadores
active before update position 1
AS
BEGIN
    IF(OLD.NIVEL <> NEW.NIVEL)THEN
    BEGIN
        UPDATE TBREQ_BAIXA_AUTORIZADOR A SET A.NIVEL = NEW.NIVEL WHERE A.USUARIO_ID = NEW.USUARIO_ID;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_autorizadore_b01d for tbrequisicao_autorizadores
active before delete position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
DECLARE VARIABLE USUARIO VARCHAR(500);
BEGIN

    HISTORICO = '';
    USUARIO = COALESCE((SELECT FIRST 1 FN_LPAD(A.CODIGO, 4, '0')||' - '||A.USUARIO FROM TBUSUARIO A WHERE A.CODIGO = OLD.USUARIO_ID),0);

    IF(OLD.ID > 0) THEN
    BEGIN
        HISTORICO = 'AUTORIZADOR '||USUARIO||' EXCLUIDO';
    END

    IF(HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBREGRA_REQ_BAIXA', OLD.REQUISICAO_ID, HISTORICO);
    END
END
^

SET TERM ; ^

-- TBREQUISICAO_BAIXA_ESTOQUE
SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_baixa_est_b01i for tbrequisicao_baixa_estoque
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrequisicao_baixa_estoque,1);

  new.estoque_id = 0;
  new.old_estoque_id = 0;
  new.usuario_id = fn_current_user_id();
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_baixa_est_b03i for tbrequisicao_baixa_estoque
active before insert position 3
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = 'REGISTRO INCLUIDO';

   if (HISTORICO <> '') Then
   Begin
      execute procedure SPI_HISTORICO('TBREQUISICAO_BAIXA_ESTOQUE', new.id, :HISTORICO);
   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="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
^

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="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
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_baixa_est_b01u for tbrequisicao_baixa_estoque
active before update position 1
AS
declare variable aprovado integer;
declare variable aprovado_nv0 integer;
declare variable lista varchar(3000);
declare variable estabelecimento_id integer;
declare variable tamanho integer;
declare variable transacao_id integer = null;
declare variable documento integer = null;
declare variable talao integer = null;
declare variable t01 numeric(10,5);
declare variable t02 numeric(10,5);
declare variable t03 numeric(10,5);
declare variable t04 numeric(10,5);
declare variable t05 numeric(10,5);
declare variable t06 numeric(10,5);
declare variable t07 numeric(10,5);
declare variable t08 numeric(10,5);
declare variable t09 numeric(10,5);
declare variable t10 numeric(10,5);
declare variable t11 numeric(10,5);
declare variable t12 numeric(10,5);
declare variable t13 numeric(10,5);
declare variable t14 numeric(10,5);
declare variable t15 numeric(10,5);
declare variable t16 numeric(10,5);
declare variable t17 numeric(10,5);
declare variable t18 numeric(10,5);
declare variable t19 numeric(10,5);
declare variable t20 numeric(10,5);
declare variable QUANTIDADE numeric(18,8);
declare variable tipo_e integer;
declare variable operacao_entrada varchar(10);
declare variable operacao_saida varchar(10);
declare variable localizacao_entrada integer;
declare variable localizacao_saida integer;

begin

  if(old.status = 2 and new.status <> 1)then
   begin
      exception "..." 'REGISTRO NÃO PODE SER MODIFICADA, ESTOQUE JÁ FOI BAIXADO.';
   end

  --se usuario aprovando
  if(old.status = 1 and new.status = 2)then
  begin

     --se esta pendente de aprovacao
     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.id
     AND R.status <> 1
     and u.codigo = r.usuario_id
        into aprovado, lista;

     --se usuario de nivel 0 aprovou
     aprovado_nv0 = coalesce((select first 1 a.id from TBREQ_BAIXA_AUTORIZADOR a where a.requisicao_baixa_estoque_id = new.id and a.nivel = 0 and a.STATUS = 1),0);

     --se aprovado ou usuario de nivel 0 aprovando
     IF(aprovado = 0 or aprovado_nv0 > 0)THEN
     BEGIN

        --informacoes da operacao, loc. entrada, saida, peca e etc
        SELECT first 1
            o2.tipo,
            o2.operacao_entrada,
            o2.operacao_saida,
            o2.localizacao_entrada,
            o2.localizacao_saida
        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
            tipo_e,
            operacao_entrada,
            operacao_saida,
            localizacao_entrada,
            localizacao_saida;


        new.localizacao_entrada = :localizacao_entrada;
        new.localizacao_saida   = :localizacao_saida;

        --informacoes da peca
        select
                    
           iif(coalesce(o.TALAO_ID,'') = '', 0, o.TALAO_ID) as TALAO_ID,
           coalesce(o.QUANTIDADE_SALDO,0),
           coalesce(o.TAMANHO,0),
           coalesce(o.ESTABELECIMENTO_ID,0)

        FROM SPC_STATUS_PECA(new.tipo, new.peca_id) O
        into
        :TALAO,
        :QUANTIDADE,
        :TAMANHO,
        :ESTABELECIMENTO_ID;

        IF ( NOT COALESCE(QUANTIDADE,0) > 0 ) THEN
        BEGIN
            EXCEPTION "..." 'NAO É PERMITIDO QUANTIDADE ZERADA NA TRANSACAO DE ESTOQUE.';
        END

        TALAO = COALESCE(TALAO,0);
    
        T01 = IIF(TAMANHO = 01, QUANTIDADE, 0);
        T02 = IIF(TAMANHO = 02, QUANTIDADE, 0);
        T03 = IIF(TAMANHO = 03, QUANTIDADE, 0);
        T04 = IIF(TAMANHO = 04, QUANTIDADE, 0);
        T05 = IIF(TAMANHO = 05, QUANTIDADE, 0);
        T06 = IIF(TAMANHO = 06, QUANTIDADE, 0);
        T07 = IIF(TAMANHO = 07, QUANTIDADE, 0);
        T08 = IIF(TAMANHO = 08, QUANTIDADE, 0);
        T09 = IIF(TAMANHO = 09, QUANTIDADE, 0);
        T10 = IIF(TAMANHO = 10, QUANTIDADE, 0);
        T11 = IIF(TAMANHO = 11, QUANTIDADE, 0);
        T12 = IIF(TAMANHO = 12, QUANTIDADE, 0);
        T13 = IIF(TAMANHO = 13, QUANTIDADE, 0);
        T14 = IIF(TAMANHO = 14, QUANTIDADE, 0);
        T15 = IIF(TAMANHO = 15, QUANTIDADE, 0);
        T16 = IIF(TAMANHO = 16, QUANTIDADE, 0);
        T17 = IIF(TAMANHO = 17, QUANTIDADE, 0);
        T18 = IIF(TAMANHO = 18, QUANTIDADE, 0);
        T19 = IIF(TAMANHO = 19, QUANTIDADE, 0);
        T20 = IIF(TAMANHO = 20, QUANTIDADE, 0);

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

        --se for baixa atualiza as pecas
        if(:tipo_e = 1)then
        begin
            if(new.tipo = 'RD')then
            begin
              update TBPEDIDO_ITEM_PROCESSADO w
                set w.motivo_baixa_id = new.motivo_id,
                w.quantidade_saldo    = 0,
                w.quantidade_baixa    = :QUANTIDADE,
                w.estoque_id_baixa    = :TRANSACAO_ID,
                w.tipo_baixa          = 'X'
              where w.controle = new.peca_id;
            end
    
            if(new.tipo = 'P')then
            begin
              update tbrevisao x
                set x.motivo_baixa_id = new.motivo_id,
                x.saldo               = 0,
                x.quantidade_baixa    = :QUANTIDADE,
                x.estoque_id_baixa    = :TRANSACAO_ID,
                x.tipo_baixa          = 'X'
              where x.id = new.peca_id;
            end
        end

        --transacao de estoque (saida)
        INSERT INTO TBESTOQUE_TRANSACAO_ITEM (
            TABELA,
            TABELA_ID,
            TABELA_NIVEL,
            ESTABELECIMENTO_CODIGO,
            LOCALIZACAO_CODIGO,
            PRODUTO_CODIGO,
            CONTROLE,
            DATA,
            DOCUMENTO,
            NFS_ITEM_CONTROLE,
            NFE_ITEM_CONTROLE,
            OPERACAO_CODIGO,
            TIPO,
            QUANTIDADE,
            REMESSA_ITEM_CONTROLE,
            T01,
            T02,
            T03,
            T04,
            T05,
            T06,
            T07,
            T08,
            T09,
            T10,
            T11,
            T12,
            T13,
            T14,
            T15,
            T16,
            T17,
            T18,
            T19,
            T20,
            CUSTO_UNITARIO,
            TRANSACAO_CONTROLE,
            CONSUMO,
            USUARIO_CODIGO,
            USUARIO_DATA,
            TURNO_CODIGO,
            CENTRO_DE_CUSTO,
            OBSERVACAO,
            ESPUMACAO,
            CLASSIFICACAO,
            REVISAO_CONTROLE,
            EMPRESA_CODIGO,
            CUSTO_MEDIO,
            ESTOQUE_TRANSACAO_REGRA_ID,
            CONFERENCIA,
            PECA_ID,
            MOTIVO_BAIXA_ID
        ) VALUES(
            'TBREQUISICAO_BAIXA_ESTOQUE',
            new.id,
            '0',
            :ESTABELECIMENTO_ID,
            :localizacao_saida,
            new.produto_id,
            :TRANSACAO_ID,
            current_date,
            new.id,
            0,
            0,
            :operacao_saida,
            'S',
            :QUANTIDADE,
            :TALAO,
            :T01,
            :T02,
            :T03,
            :T04,
            :T05,
            :T06,
            :T07,
            :T08,
            :T09,
            :T10,
            :T11,
            :T12,
            :T13,
            :T14,
            :T15,
            :T16,
            :T17,
            :T18,
            :T19,
            :T20,
            0,
            0,
            '0',
            fn_current_user_id(),
            CURRENT_DATE,
            0,
            '',
            fn_elipses(new.observacao,99),
            '0',
            0,
            0,
            0,
            0,
            0,
            0,
            new.codbarras,
            new.motivo_id
        );

        new.estoque_entrada = 0;

        --se for tranferencia
        if(:tipo_e = 0 and localizacao_entrada > 0)then
        begin

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

           --atualiza as pecas
           if(new.tipo = 'RD')then
           begin
              update TBPEDIDO_ITEM_PROCESSADO w set
                w.estoque_id_s_transf = new.estoque_saida,
                w.estoque_id_e_transf = new.estoque_entrada,
                w.localizacao_codigo  = :localizacao_entrada,
                w.tipo_baixa          = 'X'
              where w.controle = new.peca_id;
           end

           --atualiza as pecas
           if(new.tipo = 'P')then
            begin
              update tbrevisao x set
                 x.estoque_id_s_transf = new.estoque_saida,
                 x.estoque_id_e_transf = new.estoque_entrada,
                 x.localizacao_entrada = :localizacao_entrada,
                 x.localizacao_saida   = :localizacao_saida,
                 x.tipo_baixa          = 'X'
              where x.id = new.peca_id;
            end

           --transacao de estoque (entrada)
           INSERT INTO TBESTOQUE_TRANSACAO_ITEM (
                TABELA,
                TABELA_ID,
                TABELA_NIVEL,
                ESTABELECIMENTO_CODIGO,
                LOCALIZACAO_CODIGO,
                PRODUTO_CODIGO,
                CONTROLE,
                DATA,
                DOCUMENTO,
                NFS_ITEM_CONTROLE,
                NFE_ITEM_CONTROLE,
                OPERACAO_CODIGO,
                TIPO,
                QUANTIDADE,
                REMESSA_ITEM_CONTROLE,
                T01,
                T02,
                T03,
                T04,
                T05,
                T06,
                T07,
                T08,
                T09,
                T10,
                T11,
                T12,
                T13,
                T14,
                T15,
                T16,
                T17,
                T18,
                T19,
                T20,
                CUSTO_UNITARIO,
                TRANSACAO_CONTROLE,
                CONSUMO,
                USUARIO_CODIGO,
                USUARIO_DATA,
                TURNO_CODIGO,
                CENTRO_DE_CUSTO,
                OBSERVACAO,
                ESPUMACAO,
                CLASSIFICACAO,
                REVISAO_CONTROLE,
                EMPRESA_CODIGO,
                CUSTO_MEDIO,
                ESTOQUE_TRANSACAO_REGRA_ID,
                CONFERENCIA,
                PECA_ID,
                MOTIVO_BAIXA_ID
            ) VALUES(
                'TBREQUISICAO_BAIXA_ESTOQUE',
                new.id,
                '0',
                :ESTABELECIMENTO_ID,
                :localizacao_entrada,
                new.produto_id,
                :TRANSACAO_ID,
                current_date,
                new.id,
                0,
                0,
                :operacao_entrada,
                'E',
                :QUANTIDADE,
                :TALAO,
                :T01,
                :T02,
                :T03,
                :T04,
                :T05,
                :T06,
                :T07,
                :T08,
                :T09,
                :T10,
                :T11,
                :T12,
                :T13,
                :T14,
                :T15,
                :T16,
                :T17,
                :T18,
                :T19,
                :T20,
                0,
                0,
                '0',
                fn_current_user_id(),
                CURRENT_DATE,
                0,
                '',
                fn_elipses(new.observacao,99),
                '0',
                0,
                0,
                0,
                0,
                0,
                0,
                new.codbarras,
                new.motivo_id
            );
        end
        
     END ELSE
     BEGIN
       exception "..." 'REQUISIÇÃO DE BAIXA DE ESTOQUE NÃO FOI APROVADA POR: '||lista;
     END

  end

  --se estiver desfazendo a baixa
  if(old.status = 2 and new.status = 1)then
  begin

     if(new.estoque_saida > 0 and new.estoque_entrada = 0)then
     begin
        --se so tem entrada, fi baixa
        if(new.tipo = 'RD')then
            begin
              update TBPEDIDO_ITEM_PROCESSADO w
                set w.motivo_baixa_id = 0,
                w.quantidade_saldo    = w.quantidade_baixa,
                w.estoque_id_baixa    = 0,
                w.tipo_baixa          = 'X'
              where w.controle = new.peca_id;
            end
    
            if(new.tipo = 'P')then
            begin
              update tbrevisao x
                set x.motivo_baixa_id = 0,
                x.saldo               = x.quantidade_baixa,
                x.estoque_id_baixa    = 0,
                x.tipo_baixa          = 'X'
              where x.id = new.peca_id;
            end
     end else
     begin
        if(new.estoque_saida > 0 and new.estoque_entrada > 0)then
        begin
           --se tem entrada e sida foi transferencia

           --atualiza as pecas
           if(new.tipo = 'RD')then
           begin
              update TBPEDIDO_ITEM_PROCESSADO w set
                w.estoque_id_s_transf = 0,
                w.estoque_id_e_transf = 0,
                w.localizacao_codigo  = new.localizacao_saida,
                w.tipo_baixa          = 'X'
              where w.controle = new.peca_id;
           end

           --atualiza as pecas
           if(new.tipo = 'P')then
            begin
              update tbrevisao x set
                 x.estoque_id_s_transf = 0,
                 x.estoque_id_e_transf = 0,
                 x.localizacao_entrada = new.localizacao_saida,
                 x.localizacao_saida   = 0,
                 x.tipo_baixa          = 'X'
              where x.id = new.peca_id;
            end

        end
     end

     if(new.estoque_saida > 0)then
     begin
        delete from TBESTOQUE_TRANSACAO_ITEM t where t.controle = new.estoque_saida;
        new.estoque_saida = 0;
     end

     if(new.estoque_entrada > 0)then
     begin
        delete from TBESTOQUE_TRANSACAO_ITEM t where t.controle = new.estoque_entrada;
        new.estoque_entrada = 0;
     end

  end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_baixa_est_b02u for tbrequisicao_baixa_estoque
active before update position 2
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = '';

   if(old.status = 0 and new.status = 1)then
   begin
      HISTORICO = 'REQUISIÇÃO AUTORIZADA';
      execute procedure SPI_HISTORICO('TBREQUISICAO_BAIXA_ESTOQUE', new.id, :HISTORICO);
   end

   if(old.status <> 3 and new.status = 3)then
   begin
      HISTORICO = 'REQUISIÇÃO RECUSADA';
      execute procedure SPI_HISTORICO('TBREQUISICAO_BAIXA_ESTOQUE', new.id, :HISTORICO);
   end

   if(old.status <> 2 and new.status = 2)then
   begin
      new.DATA_BAIXA = current_timestamp;
      HISTORICO = 'REQUISIÇÃO BAIXADA';
      execute procedure SPI_HISTORICO('TBREQUISICAO_BAIXA_ESTOQUE', new.id, :HISTORICO);
   end

   if(old.status = 2 and new.status <> 2)then
   begin
      HISTORICO = 'BAIXA DE REQUISIÇÃO DESFEITA';
      execute procedure SPI_HISTORICO('TBREQUISICAO_BAIXA_ESTOQUE', new.id, :HISTORICO);
   end

   if(old.status = 1 and new.status = 0)then
   begin
      HISTORICO = 'AUTORIZAÇÃO DA REQUISIÇÃO DESFEITA';
      execute procedure SPI_HISTORICO('TBREQUISICAO_BAIXA_ESTOQUE', new.id, :HISTORICO);
   end

   if(old.status = 3 and new.status = 0)then
   begin
      HISTORICO = 'RECUSAÇÃO DA REQUISIÇÃO DESFEITA';
      execute procedure SPI_HISTORICO('TBREQUISICAO_BAIXA_ESTOQUE', new.id, :HISTORICO);
   end

   HISTORICO = '';

   if(old.codbarras <> new.codbarras)then
   begin
      HISTORICO = HISTORICO || ' PEÇA:'||old.codbarras||'->'||new.codbarras;
   end

   if(old.tipo <> new.tipo)then
   begin
      HISTORICO = HISTORICO || ' TIPO:'||old.tipo||'->'||new.tipo;
   end

   if(old.regra_id <> new.regra_id)then
   begin
      HISTORICO = HISTORICO || ' REGRA:'||old.regra_id||'->'||new.regra_id;
   end

   if(old.operacao_id <> new.operacao_id)then
   begin
      HISTORICO = HISTORICO || ' OPERACAO:'||old.operacao_id||'->'||new.operacao_id;
   end

   if(old.motivo_id <> new.motivo_id)then
   begin
      HISTORICO = HISTORICO || ' MOTIVO:'||old.motivo_id||'->'||new.motivo_id;
   end

   if(old.observacao <> new.observacao)then
   begin
      HISTORICO = HISTORICO || ' OBS:'||old.observacao||'->'||new.observacao;
   end

   if (HISTORICO <> '') Then
   Begin
      execute procedure SPI_HISTORICO('TBREQUISICAO_BAIXA_ESTOQUE', new.id, :HISTORICO);
   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="https://gc.delfa.com.br/_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_b02d for tbrequisicao_baixa_estoque
active before delete position 1
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   if(old.status = 2)then
   begin
      exception "..." 'REGISTRO NÃO PODE SER EXCLUIDO, ESTOQUE JÁ FOI BAIXADO.';
   end
    
   HISTORICO = 'REGISTRO EXCLUIDO';

   if (HISTORICO <> '') Then
   Begin
      execute procedure SPI_HISTORICO('TBREQUISICAO_BAIXA_ESTOQUE', old.id, :HISTORICO);
   End
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_baixa_est_b01d for tbrequisicao_baixa_estoque
active before delete position 5
AS
begin
  DELETE FROM TBREQ_BAIXA_AUTORIZADOR A WHERE A.REQUISICAO_BAIXA_ESTOQUE_ID = OLD.ID;
end
^

SET TERM ; ^

-- TBREQ_BAIXA_AUTORIZADOR
SET TERM ^ ;

CREATE OR ALTER trigger ttbreq_baixa_autorizador_b01i for tbreq_baixa_autorizador
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbreq_baixa_autorizador,1);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbreq_baixa_autorizador_b02i for tbreq_baixa_autorizador
active before insert position 2
AS
begin

/*
declare variable EMAIL_ID integer;
declare variable DESTINATARIO varchar(500);
declare variable ASSUNTO 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;
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', iif(o2.tipo = 1, 'Baixa', '')) 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
    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;

    ASSUNTO = 'Nova Requisição de Estoque';

    CORPO = '';
    CORPO = CORPO||'O Usuário:'||USUARIO||' solicita '||TIPO||'<br>';
    CORPO = CORPO||' Produto:'||PRODUTO||'<br>';
    CORPO = CORPO||' Quantidade:'||QTD||'<br>';
    CORPO = CORPO||' Data: '||DATA||'<br>';
    CORPO = CORPO||' Motivo: '||MOTIVO||'<br>';
    CORPO = CORPO||' Operação: '||OPERACAO||'<br>';
    CORPO = CORPO||' Observação: '||observacao||'<br>';
    CORPO = CORPO||'<br><a class="msg-balao-fechar" href="https://gc.delfa.com.br/_15220/'||new.requisicao_baixa_estoque_id||'" target="_blank" >Clique aqui para ver</a>';

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

    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);


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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbreq_baixa_autoriza_b02u for tbreq_baixa_autorizador
active before update position 1
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
DECLARE VARIABLE USUARIO VARCHAR(100);
DECLARE VARIABLE PENDENTES INTEGER;
DECLARE VARIABLE LISTA VARCHAR(300);
BEGIN

    HISTORICO = '';

    IF(OLD.STATUS <> NEW.STATUS)THEN
    BEGIN
        SELECT
            COUNT(A.ID) AS PENDENTES,
            list(FN_LPAD(A.USUARIO_ID, 4, '0')||' - '||COALESCE(U.NOME, U.USUARIO)) AS LISTA
        FROM TBREQ_BAIXA_AUTORIZADOR A
        LEFT JOIN TBUSUARIO U ON U.CODIGO = A.USUARIO_ID
        WHERE A.REQUISICAO_BAIXA_ESTOQUE_ID = NEW.REQUISICAO_BAIXA_ESTOQUE_ID
        AND A.NIVEL > NEW.NIVEL
        AND A.STATUS <> 1
        AND A.USUARIO_ID <> NEW.USUARIO_ID
            INTO PENDENTES, LISTA;
        IF(PENDENTES > 0)THEN
        BEGIN
            IF(OLD.STATUS <> 1 AND NEW.STATUS = 1)THEN
            BEGIN
                exception "..." 'Autorização não pode ser concluída! '||IIF(PENDENTES = 1, 'O usuário de nível inferior ', 'Os usuários de nivel inferior ')||LISTA||IIF(PENDENTES = 1, ' ainda não autorizou.', ' ainda não autorizaram.');
            END
        END

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

    IF(HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBREQUISICAO_BAIXA_ESTOQUE', NEW.REQUISICAO_BAIXA_ESTOQUE_ID, :HISTORICO);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbreq_baixa_autorizador_b01u for tbreq_baixa_autorizador
active before update position 2
AS
declare variable PENDENTES integer;
declare variable LISTA varchar(300);
declare variable status integer;
begin

    if(old.status <> new.status)then
    begin
        --verifica se requisicao ja foi baixada
        status = coalesce((select first 1 b.status from TBREQUISICAO_BAIXA_ESTOQUE b where b.id = new.requisicao_baixa_estoque_id),0);
    
        --se requisicao nao baixada
        if(status <> 2)then
        begin
    
            --se aprovando
            if(new.status = 1)then
            begin
                 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 <> 1
                 and u.codigo = r.usuario_id
                    into PENDENTES, lista;
        
        
                 if(PENDENTES = 0 or new.nivel = 0)then
                 begin
                    --aprovada
                    update TBREQUISICAO_BAIXA_ESTOQUE b set b.status = 1 where b.id = new.requisicao_baixa_estoque_id;
                 end
        
            end else
            begin

                --se reprovando
                if(new.status = 2)then
                begin
                    --reprovada
                    update TBREQUISICAO_BAIXA_ESTOQUE b set b.status = 3 where b.id = new.requisicao_baixa_estoque_id;
                end else
                    begin

                        -- se revertendo a autorização/recusação
                        if(old.status <> 0 and new.status = 0)then
                        begin
                            update TBREQUISICAO_BAIXA_ESTOQUE b set b.status = 0 where b.id = new.requisicao_baixa_estoque_id;
                        end

                    end

            end
    
        end else
        begin
          --se já foi baixada
          exception "..." 'REQUISIÇÃO JÁ FOI BAIXADA.';
        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="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 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 ; ^

-- TBSOBRA_SAIDA_MOTIVO
SET TERM ^ ;

CREATE OR ALTER trigger ttbsobra_saida_motivo_b01i for tbsobra_saida_motivo
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gTBSOBRA_SAIDA_MOTIVO,1);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbsobra_saida_motivo_b02i for tbsobra_saida_motivo
active before insert position 1
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN
    HISTORICO = '';

    IF(NEW.ID > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'REGISTRO INCLUIDO';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBSOBRA_SAIDA_MOTIVO', NEW.ID, HISTORICO);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbsobra_saida_motivo_999 for tbsobra_saida_motivo
active before insert or update or delete position 999
AS
begin

  update tbreplica_tabela set Status = '0'
  Where tabela = 'TBSOBRA_SAIDA_MOTIVO'
    and Status = '1';

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbsobra_saida_motivo_b01u for tbsobra_saida_motivo
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN
    HISTORICO = '';

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

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

    IF(OLD.FAMILIA_ID <> NEW.FAMILIA_ID)THEN
    BEGIN
        HISTORICO = HISTORICO || ' FAMILIA:'||FN_LPAD(OLD.FAMILIA_ID, 4, '0')||'->'||FN_LPAD(NEW.FAMILIA_ID, 4, '0');
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBSOBRA_SAIDA_MOTIVO', OLD.ID, HISTORICO);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbsobra_saida_motivo_999 for tbsobra_saida_motivo
active before insert or update or delete position 999
AS
begin

  update tbreplica_tabela set Status = '0'
  Where tabela = 'TBSOBRA_SAIDA_MOTIVO'
    and Status = '1';

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbsobra_saida_motivo_b01d for tbsobra_saida_motivo
active before delete position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN
    HISTORICO = '';

    IF(OLD.ID > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'REGISTRO EXCLUIDO';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBSOBRA_SAIDA_MOTIVO', OLD.ID, HISTORICO);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbsobra_saida_motivo_999 for tbsobra_saida_motivo
active before insert or update or delete position 999
AS
begin

  update tbreplica_tabela set Status = '0'
  Where tabela = 'TBSOBRA_SAIDA_MOTIVO'
    and Status = '1';

end
^

SET TERM ; ^

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- PROCEDURE (SPC_STATUS_PECA2 => SPC_STATUS_PECA2 que ignora o saldo)
SET TERM ^ ;

CREATE OR ALTER procedure SPC_STATUS_PECA2 (
    ITIPO varchar(10),
    IPECA_ID integer)
returns (
    TIPO varchar(10),
    ID integer,
    PECA varchar(12),
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(100),
    QUANTIDADE_SALDO numeric(18,5),
    UNIDADEMEDIDA_SIGLA varchar(3),
    LOCALIZACAO_ID integer,
    REMESSA varchar(10),
    TALAO_ID varchar(10),
    TAMANHO integer,
    ESTABELECIMENTO_ID integer)
as
begin

    IF(ITIPO = 'P')THEN
    BEGIN

        FOR
            select first 1
                'P' as TIPO,
                r.id,
                'P'||lpad(r.id,11,'0') as PECA,
                r.produto_id as produto_cod,
                p.descricao as produto_desc,
                r.saldo as QUANTIDADE,
                p.unidademedida_sigla,
                r.localizacao_entrada,
                '' as remessa,
                '' as talao,
                r.tamanho,
                r.estabelecimento_id
            from tbrevisao r, tbproduto p
            WHERE r.produto_id = p.codigo
            AND r.id = :IPECA_ID
        INTO
            TIPO,
            ID,
            PECA,
            PRODUTO_ID,
            PRODUTO_DESCRICAO,
            QUANTIDADE_SALDO,
            UNIDADEMEDIDA_SIGLA,
            LOCALIZACAO_ID,
            REMESSA,
            TALAO_ID,
            TAMANHO,
            ESTABELECIMENTO_ID
        DO BEGIN
          suspend;
        END
                        
    END ELSE
    BEGIN
        IF(ITIPO = 'RD')THEN
        BEGIN

          FOR
             select first 1
                'RD' as TIPO,
                d.id,
                'RD'||lpad(d.id,10,'0') as PECA,
                d.produto_id,
                p.descricao as produto_descricao,
                d.quantidade_saldo,
                p.unidademedida_sigla,
                d.localizacao_id as localizacao_id,
                v.remessa,
                fn_lpad(d.remessa_talao_id,3,'0') as talao_id,
                d.tamanho,
                v.estabelecimento_id
            from vwremessa_talao_detalhe d,
                vwremessa_talao t,
                vwremessa v,
                tbproduto p
            
            where p.codigo = d.produto_id
            and v.remessa_id = d.remessa_id
            and t.remessa_id = d.remessa_id
            and t.remessa_talao_id = d.remessa_talao_id
            AND D.ID = :IPECA_ID

          INTO
            TIPO,
            ID,
            PECA,
            PRODUTO_ID,
            PRODUTO_DESCRICAO,
            QUANTIDADE_SALDO,
            UNIDADEMEDIDA_SIGLA,
            LOCALIZACAO_ID,
            REMESSA,
            TALAO_ID,
            TAMANHO,
            ESTABELECIMENTO_ID
          DO BEGIN
            suspend;
          END

       END ELSE
       BEGIN
            exception "..." 'Tipo invalido, Permitidos: "P" - Revisão, "RD" - Talões.';
       END
    END

end
^

SET TERM ; ^