SET TERM ^ ;

CREATE OR ALTER trigger ttbestoque_transacao_item_a9iu for tbestoque_transacao_item
active after insert or update position 9
AS
declare variable REMESSA_ID integer;
declare variable CONSUMO_ID integer;
declare variable QUANTIDADE numeric(18,8);
declare variable SALDO_ALOCAR numeric(18,8);
declare variable MENSAGEM VARCHAR(2000);
begin
  IF(NEW.alocar_consumo > 0)THEN
  BEGIN

     IF(new.tipo is distinct from 'S' and((inserting AND NEW.conferencia = 0) or (updating AND NEW.conferencia IS distinct FROM OLD.conferencia AND NEW.conferencia = 2)))THEN
     BEGIN

       SALDO_ALOCAR = new.quantidade;

       for
            select
                ID,
                REMESSA,
                CONSUMO_KG - quantidade_alocada SALDO
            from(
                    SELECT
                        D.id,
                        d.remessa,
                        d.consumo_kg,
                        coalesce((select sum(a.quantidade) from tbestoque_detalhe_alocacao a where a.tabela_id = d.remessa and a.tab_item_id = d.id and a.tipo = 'R'),0) as quantidade_alocada
                    FROM TBREMESSA_CONSUMO D, TBREMESSA C, TBPEDIDO_ITEM_PROCESSADO P, TBUP U, TBPRODUTO G, TBESTOQUE_TRANSACAO_REGRA R
                    WHERE C.NUMERO = D.REMESSA
                    AND P.REMESSA = C.NUMERO
                    AND P.REMESSA_ACUMULADO_CONTROLE = D.TALAO
                    AND P.CONTROLE = D.TALAO_DETALHE_ID
                    AND U.ID = P.SETOR_CODIGO
                    AND D.CONFERENCIA = '0'
                    AND G.CODIGO = D.PRODUTO_ID
                    AND R.FAMILIA_ID = G.FAMILIA_CODIGO
                    AND R.GP_ID = C.GP_ID
                    AND R.PERFIL_UP = U.PERFIL
                    AND R.TIPO = 3
                    AND R.LOCALIZACAO_ID_KANBAN > 0
                    AND R.id = NEW.alocar_consumo
                    and d.produto_id = new.produto_codigo
                    and d.tamanho = new.tamanho
                    order by d.id ascending
             ) where quantidade_alocada < consumo_kg
       into
           :CONSUMO_ID,
           :REMESSA_ID,
           :QUANTIDADE
       do BEGIN

            if(SALDO_ALOCAR >= :QUANTIDADE)then
            begin
                insert into TBESTOQUE_DETALHE_ALOCACAO (estabelecimento_id,tabela_id,tab_item_id,tipo, localizacao_id, produto_id, tamanho, tamanho_item, quantidade, saldo)
                values (new.estabelecimento_codigo, :REMESSA_ID, :CONSUMO_ID, 'R', new.localizacao_codigo, new.produto_codigo, new.tamanho, 0, :QUANTIDADE, :QUANTIDADE);

                SALDO_ALOCAR = SALDO_ALOCAR - :QUANTIDADE;

                if(SALDO_ALOCAR < 0)then
                begin
                    
                    :MENSAGEM = 'ERRO NA ALOCACAO AUTOMATICA DE CONSUMO';
    
                    EXECUTE PROCEDURE SPI_ERROR_LOG_ESTOQUE(NEW.TABELA, NEW.TABELA_ID, :MENSAGEM);
                
                    EXCEPTION "...":MENSAGEM;

                end
            end

       END
     END
  END
end
^

SET TERM ; ^

ALTER TABLE TBKANBAN_LOTE_DETALHE
    ADD FLAG INTEGER DEFAULT 0;

COMMENT ON COLUMN TBKANBAN_LOTE_DETALHE.FLAG IS
'se excluindo pelo lote = 1';

SET TERM ^ ;

CREATE OR ALTER trigger ttbkanban_lote_b5d for tbkanban_lote
active before delete position 5
AS
declare variable DETALHE_ID INTEGER;
begin
    update TBKANBAN_LOTE_DETALHE D set flag = 1
     WHERE D.KANBAN_LOTE_ID = OLD.ID;

    DELETE
      FROM TBKANBAN_LOTE_DETALHE D
     WHERE D.KANBAN_LOTE_ID = OLD.ID;

    
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger tbkanban_lote_detalhe_a01d for tbkanban_lote_detalhe
active after delete position 0
AS
declare variable qtd integer;
declare variable id integer;
begin
    if(coalesce(old.flag,0) = 0)then
    begin
      qtd = coalesce((select count(d.id) from TBKANBAN_LOTE_DETALHE d where d.kanban_lote_id = old.kanban_lote_id),0);
    
      if(qtd = 0)then
      begin
    
        id = coalesce((select id from TBKANBAN_LOTE l where l.id = coalesce(old.kanban_lote_id,0)),0);
    
        if(id > 0)then
        begin
            delete from TBKANBAN_LOTE l where l.id = :id;
        end
      end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbkanban_lote_detalhe_b0u for tbkanban_lote_detalhe
active before update position 0
AS
begin
    if(coalesce(new.flag,0) = 0)then
    begin
        EXCEPTION "..." 'OPERACAO DE ALTERACAO NAO PEMITIDA PARA LOTES DE KANBAN.';
    end
end
^

SET TERM ; ^

