CREATE TABLE TBREGRA_REQ_BAIXA (
    ID INTEGER NOT NULL,
    DESCRICAO VARCHAR(100) DEFAULT '',
    STATUS INTEGER DEFAULT 1,
    FAMILIA_ID INTEGER DEFAULT 0,
    NOTIFICAR_EMAIL INTEGER DEFAULT 1,
    NOTIFICAR_MSG INTEGER DEFAULT 1);

ALTER TABLE TBREGRA_REQ_BAIXA
ADD CONSTRAINT PK_TBREGRA_REQ_BAIXA
PRIMARY KEY (ID);

CREATE SEQUENCE GTBREGRA_REQ_BAIXA;

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


CREATE TABLE TBREGRA_REQ_BAIXA_OPERACAO (
    ID INTEGER NOT NULL,
    DESCRICAO VARCHAR(50) DEFAULT '',
    OPERACAO VARCHAR(10) DEFAULT '',
    STATUS INTEGER DEFAULT 0);

ALTER TABLE TBREGRA_REQ_BAIXA_OPERACAO
ADD CONSTRAINT PK_TBREGRA_REQ_BAIXA_OPERACAO
PRIMARY KEY (ID);

COMMENT ON COLUMN TBREGRA_REQ_BAIXA_OPERACAO.OPERACAO IS
'OPERACAO DE ESTOQUE';

CREATE SEQUENCE GTBREGRA_REQ_BAIXA_OPER;

create trigger ttbregra_req_baixa_op_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;

CREATE TABLE TBREQUISICAO_BAIXA_ESTOQUE (
    ID INTEGER NOT NULL,
    PRODUTO_ID INTEGER,
    PECA_ID INTEGER,
    TIPO INTEGER,
    USUARIO_ID INTEGER);

ALTER TABLE TBREQUISICAO_BAIXA_ESTOQUE
ADD CONSTRAINT PK_TBREQUISICAO_BAIXA_ESTOQUE
PRIMARY KEY (ID);

COMMENT ON COLUMN TBREQUISICAO_BAIXA_ESTOQUE.TIPO IS
'R - TBREVISAO
T - TALOES';

CREATE SEQUENCE GTBREQUISICAO_BAIXA_ESTOQUE;

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

ALTER TABLE TBREQUISICAO_BAIXA_ESTOQUE
    ADD STATUS INTEGER DEFAULT 1;

CREATE TABLE TBREQUISICAO_AUTORIZADORES (
    ID INTEGER NOT NULL,
    USUARIO_ID INTEGER,
    REQUISICAO_ID INTEGER,
    STATUS INTEGER,
    NIVEL INTEGER);

ALTER TABLE TBREQUISICAO_AUTORIZADORES
ADD CONSTRAINT PK_TBREQUISICAO_AUTORIZADORES
PRIMARY KEY (ID);

CREATE SEQUENCE GTBREQUISICAO_AUTORIZADORES;

create trigger ttbrequisicao_autoriz_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;

COMMENT ON TABLE TBREQUISICAO_AUTORIZADORES IS 'tabela com os usuarios que autorizao uma requisicao de baixa de estoque';

ALTER TABLE TBREGRA_REQ_BAIXA_OPERACAO
    ADD OPERACAO_ENTRADA VARCHAR(10),
    ADD OPERACAO_SAIDA VARCHAR(10),
    ADD LOCALIZACAO_SAIDA INTEGER,
    ADD LOCALIZACAO_ENTRADA INTEGER,
    ADD TIPO INTEGER;

COMMENT ON COLUMN TBREGRA_REQ_BAIXA_OPERACAO.TIPO IS
'1 - Transferencia
2 - Baixa';

ALTER TABLE TBREGRA_REQ_BAIXA_OPERACAO DROP OPERACAO;

ALTER TABLE TBREGRA_REQ_BAIXA_OPERACAO
    ADD REGRA_REQ_BAIXA_ID INTEGER;

CREATE trigger ttbregra_req_baixa_b01d for tbregra_req_baixa
active before delete position 0
as
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = 'Registro excluído';

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

END;

CREATE trigger ttbrequisicao_autoriz_b01d for tbrequisicao_autorizadores
active before delete position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = 'Autorizador '||old.usuario_id||' excluído';

   if (HISTORICO <> '') Then
   Begin
      execute procedure SPI_HISTORICO('TBREGRA_REQ_BAIXA', old.requisicao_id, :HISTORICO);
   End
end;

CREATE trigger ttbregra_req_baixa_opera_b01d for tbregra_req_baixa_operacao
active before delete position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = 'Operação '||old.id||' - '||old.descricao||' excluída';

   if (HISTORICO <> '') Then
   Begin
      execute procedure SPI_HISTORICO('TBREGRA_REQ_BAIXA', old.regra_req_baixa_id, :HISTORICO);
   End
end;

CREATE OR ALTER trigger ttbregra_req_baixa_b01i for tbregra_req_baixa
active before insert position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin
	
	if (new.id is null) then
    new.id = gen_id(gtbregra_req_baixa,1);
	
   HISTORICO = 'Registro incluido';

   if (HISTORICO <> '') Then
   Begin
      execute procedure SPI_HISTORICO('TBREGRA_REQ_BAIXA', new.id, :HISTORICO);
   End
end;

CREATE 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 || ' Descrição: '||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 || ', Família: '||old.familia_id||' -> '||new.familia_id;
   end

   if(old.notificar_email <> new.notificar_email)then
   begin
      HISTORICO = HISTORICO || ', Notificação Email: '||old.notificar_email||' -> '||new.notificar_email;
   end

   if(old.notificar_msg <> new.notificar_msg)then
   begin
      HISTORICO = HISTORICO || ', Notificação GC-Web: '||old.notificar_msg||' -> '||new.notificar_msg;
   end

   if (HISTORICO <> '') Then
   Begin
      execute procedure SPI_HISTORICO('TBREGRA_REQ_BAIXA', new.id, :HISTORICO);
   End
end;

CREATE trigger ttbrequisicao_autorizado_b02i for tbrequisicao_autorizadores
active before insert position 2
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = 'Autorizador '||new.usuario_id||' Incluído';

   if (HISTORICO <> '') Then
   Begin
      execute procedure SPI_HISTORICO('TBREGRA_REQ_BAIXA', new.requisicao_id, :HISTORICO);
   End
end;

CREATE trigger ttbrequisicao_autorizado_b01u for tbrequisicao_autorizadores
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = '';

   if(old.status <> new.status)then
   begin
      HISTORICO = HISTORICO || ', Status do Autorizador('||new.usuario_id||'): '||old.status||' -> '||new.status;
   end

   if(old.nivel <> new.nivel)then
   begin
      HISTORICO = HISTORICO || ', Nível do Autorizador('||new.usuario_id||'):'||old.nivel||' -> '||new.nivel;
   end

   if (HISTORICO <> '') Then
   Begin
      execute procedure SPI_HISTORICO('TBREGRA_REQ_BAIXA', new.requisicao_id, :HISTORICO);
   End
end;


CREATE trigger ttbregra_req_baixa_opero_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 || 'Operação Descrição: '||old.descricao||' -> '||new.descricao;
   end

   if(old.operacao_entrada <> new.operacao_entrada)then
   begin
      HISTORICO = HISTORICO || ', '||new.descricao||' Operação de entrada:'||old.operacao_entrada||' -> '||new.operacao_entrada;
   end

   if(old.operacao_saida <> new.operacao_saida)then
   begin
      HISTORICO = HISTORICO || ', '||new.descricao||' Operação de saída:'||old.operacao_saida||' -> '||new.operacao_saida;
   end


   if(old.localizacao_entrada <> new.localizacao_entrada)then
   begin
      HISTORICO = HISTORICO || ', '||new.descricao||' Localização de entrada:'||old.localizacao_entrada||' -> '||new.localizacao_entrada;
   end

   if(old.localizacao_saida <> new.localizacao_saida)then
   begin
      HISTORICO = HISTORICO || ', '||new.descricao||' Localização de saída:'||old.localizacao_saida||' -> '||new.localizacao_saida;
   end

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

   if (HISTORICO <> '') Then
   Begin
      execute procedure SPI_HISTORICO('TBREGRA_REQ_BAIXA', new.regra_req_baixa_id, :HISTORICO);
   End
end;

CREATE trigger ttbregra_req_baixa_opera_b02i for tbregra_req_baixa_operacao
active before insert position 2
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = 'Operação '||new.id||' - '||new.descricao||' incluída';

   if (HISTORICO <> '') Then
   Begin
      execute procedure SPI_HISTORICO('TBREGRA_REQ_BAIXA', new.regra_req_baixa_id, :HISTORICO);
   End
end;

ALTER TABLE TBREQUISICAO_BAIXA_ESTOQUE
    ADD CODBARRAS VARCHAR(50);


ALTER TABLE TBREQUISICAO_BAIXA_ESTOQUE
    ADD REGRA_ID INTEGER,
    ADD OPERACAO_ID INTEGER,
    ADD MOTIVO_ID INTEGER,
    ADD OBSERVACAO BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ADD DATA_INSERTE TIMESTAMP DEFAULT 'NOW',
    ADD ESTOQUE_ID INTEGER,
    ADD OLD_ESTOQUE_ID INTEGER;

ALTER TABLE TBREQUISICAO_BAIXA_ESTOQUE
    ALTER TIPO TYPE VARCHAR(11);

COMMENT ON COLUMN TBREQUISICAO_BAIXA_ESTOQUE.STATUS IS
'0 - PENDENTE DE APROVACAO
1 - APROVADO
2 - CONFIRMADO';

create or alter procedure spc_status_peca (
    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(15),
    talao_id varchar(1000))
as
begin

    IF(ITIPO = 'P')THEN
    BEGIN

        FOR
            SELECT
                '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
            from tbrevisao r, tbproduto p
            where r.saldo > 0
            and 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
        DO BEGIN
          suspend;
        END
                        
    END ELSE
    BEGIN
        IF(ITIPO = 'P')THEN
        BEGIN

          FOR
             select
                '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
            
            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.quantidade_saldo > 0
            AND D.ID = :IPECA_ID

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

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

end;

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;

ALTER TABLE TBREQUISICAO_BAIXA_ESTOQUE ALTER COLUMN STATUS
SET DEFAULT 0;

CREATE TABLE TBREQ_BAIXA_AUTORIZADOR (
    ID INTEGER NOT NULL,
    REQUISICAO_BAIXA_ESTOQUE_ID INTEGER,
    USUARIO_ID INTEGER,
    STATUS INTEGER,
    DATA_APROVACAO TIMESTAMP);

ALTER TABLE TBREQ_BAIXA_AUTORIZADOR
ADD CONSTRAINT PK_TBREQ_BAIXA_AUTORIZADOR
PRIMARY KEY (ID);

CREATE SEQUENCE GTBREQ_BAIXA_AUTORIZADOR;

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

ALTER TABLE TBREQ_BAIXA_AUTORIZADOR
    ADD NIVEL INTEGER;

CREATE OR ALTER trigger ttbrequisicao_baixa_est_b02i for tbrequisicao_baixa_estoque
active before insert position 2
AS
    declare variable usuario_id integer;
    declare variable nivel integer;
begin
  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 );
  end
end;


CREATE trigger ttbreq_baixa_autorizador_b01u for tbreq_baixa_autorizador
active before update position 0
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);
    
        if(status <> 2)then
        begin
    
            --se aprovando
            if(old.status = 0 and 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)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(old.status <> 2 and new.status = 2)then
                begin
                    --reprovada
                    update TBREQUISICAO_BAIXA_ESTOQUE b set b.status = 3 where b.id = new.requisicao_baixa_estoque_id;
                end
            end
    
        end else
        begin
          --se já foi baixada
          exception "..." 'Requisição já foi baixada.';
        end
    end

end;

COMMENT ON TRIGGER TTBREQ_BAIXA_AUTORIZADOR_B01U IS 'atualiza status da requisicao de estoque quando todos tiverem autorizado';

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;
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 = '';
    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.id||'" target="_blank" >Clique aqui para ver</a>';

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

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)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 = 'Aprovada';
        end else
        begin
            LABEL = 'Reprovada';
        end

        ASSUNTO = 'Requisição de Estoque '||LABEL;
        ASSUNTO_email = 'Requisição de Estoque '||LABEL||', Produto:'||PRODUTO||', Quantidade:'||QTD;
    
        CORPO = '';
        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?ID='||new.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),'');
    
        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;


CREATE TABLE TBREQUISICAO_ESTOQUE_STATUS (
    ID INTEGER NOT NULL,
    DESCRICAO VARCHAR(50));

ALTER TABLE TBREQUISICAO_ESTOQUE_STATUS
ADD CONSTRAINT PK_TBREQUISICAO_ESTOQUE_STATUS
PRIMARY KEY (ID);

CREATE SEQUENCE GTBREQUISICAO_ESTOQUE_STATUS;

create trigger ttbrequisicao_est_status_b01i for tbrequisicao_estoque_status
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrequisicao_estoque_status,1);
end;

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

   HISTORICO = '';

   if(old.status = 0 and new.status = 1)then
   begin
      HISTORICO = 'Requisição Aprovada';
      execute procedure SPI_HISTORICO('TBREQUISICAO_BAIXA_ESTOQUE', new.id, :HISTORICO);
   end

   if(old.status <> 3 and new.status = 3)then
   begin
      HISTORICO = 'Requisição Reprovada';
      execute procedure SPI_HISTORICO('TBREQUISICAO_BAIXA_ESTOQUE', new.id, :HISTORICO);
   end

   if(old.status <> 2 and new.status = 2)then
   begin
      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 desfeita';
      execute procedure SPI_HISTORICO('TBREQUISICAO_BAIXA_ESTOQUE', new.id, :HISTORICO);
   end

   if(old.status = 1 and new.status <> 1)then
   begin
      HISTORICO = 'Aprovação desfeita';
      execute procedure SPI_HISTORICO('TBREQUISICAO_BAIXA_ESTOQUE', new.id, :HISTORICO);
   end

   if(old.status = 3 and new.status <> 3)then
   begin
      HISTORICO = 'Reprovaçã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 || ', Operação: '||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 || ', Observação: '||old.observacao||' -> '||new.observacao;
   end

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

end;


CREATE trigger TTBREQUISICAO_BAIXA_EST_b03i for TBREQUISICAO_BAIXA_ESTOQUE
active before insert position 3
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = 'Registro Incluído';

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


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

ALTER TABLE TBREQUISICAO_BAIXA_ESTOQUE
    ADD DATA_BAIXA TIMESTAMP;

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

   HISTORICO = '';

   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 || 'Reprovada';
   end

   if(old.status <> 0 and new.status = 0)then
   begin
      HISTORICO = HISTORICO || 'Alterado de '||old.status||'-'||iif(old.status = 1, 'Autorizada', iif(old.status = 2, 'Reprovada', 'Não definido'))||' para 0-Pendente';
   end

   if (HISTORICO <> '') Then
   Begin
      execute procedure SPI_HISTORICO('TBREQUISICAO_BAIXA_ESTOQUE', new.requisicao_baixa_estoque_id, :HISTORICO);
   End

end;

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

   HISTORICO = '';

   if(old.status = 0 and new.status = 1)then
   begin
      HISTORICO = 'Requisição Aprovada';
      execute procedure SPI_HISTORICO('TBREQUISICAO_BAIXA_ESTOQUE', new.id, :HISTORICO);
   end

   if(old.status <> 3 and new.status = 3)then
   begin
      HISTORICO = 'Requisição Reprovada';
      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 = 0)then
   begin
      HISTORICO = 'Baixa desfeita';
      execute procedure SPI_HISTORICO('TBREQUISICAO_BAIXA_ESTOQUE', new.id, :HISTORICO);
   end

   if(old.status = 1 and new.status = 0)then
   begin
      HISTORICO = 'Aprovação desfeita';
      execute procedure SPI_HISTORICO('TBREQUISICAO_BAIXA_ESTOQUE', new.id, :HISTORICO);
   end

   if(old.status = 3 and new.status = 0)then
   begin
      HISTORICO = 'Reprovaçã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 || ', Operação: '||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 || ', Observação: '||old.observacao||' -> '||new.observacao;
   end

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

end;

ALTER TABLE TBREQUISICAO_BAIXA_ESTOQUE
    ADD ESTOQUE_ENTRADA INTEGER,
    ADD ESTOQUE_SAIDA INTEGER;


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 = 'Aprovada';
        end else
        begin
            LABEL = 'Reprovada';
        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;

CREATE OR ALTER trigger ttbrequisicao_baixa_est_b01u for tbrequisicao_baixa_estoque
active before update position 0
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
                    
           o.TALAO_ID,
           o.QUANTIDADE_SALDO,
           o.TAMANHO,
           o.ESTABELECIMENTO_ID

        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;
