SET TERM ^ ;

CREATE OR ALTER trigger ttbfamilia_localizacao_b0iu for tbfamilia_localizacao
active before insert or update position 0
AS
declare variable contador integer;
begin

    contador = 0;

    select count(*)
      from tbfamilia_localizacao l
     where l.familia_id = new.familia_id
       and l.gp_id = new.gp_id
       and l.perfil_up = new.perfil_up
       and l.localizacao_tipo_id = new.localizacao_tipo_id
      into contador;

    if ( contador > 0 ) then
    begin
        exception "..." 'Inclusao ou alteracao nao permitida. Ja existe uma ou mais combinacoes para os parametros informados.' ||
                        ' GP: '                  || NEW.gp_id ||
                        ' PERFIL UP: '           || NEW.perfil_up ||
                        ' TIPO LOCALIZACAO ID: ' || NEW.localizacao_tipo_id;
    end
end
^

SET TERM ; ^





SET TERM ^ ;

CREATE OR ALTER function fn_localizacao_codigo (
    codigo integer,
    produto_id integer = 0,
    familia_id integer = 0,
    localizacao_id integer = 0,
    remessa_talao_detalhe_id integer = 0,
    gp_id integer = 0,
    perfil_up varchar(10) = '')
returns integer
as
declare variable ret integer;
declare variable localizacao_tipo integer;
begin

    /* retorna o proprio valor informado como localizacao */
    if ( codigo < 1001 ) then
    begin
        ret = codigo;
    end
    else
    /* codigo tratados */
    if ( codigo < 2001 ) then
    begin
        /* retorna a localizacao padrao da familia do produto */
        if ( codigo = 1001 ) then
        begin
            ret = (select first 1 f.localizacao_codigo from tbfamilia f where f.codigo = :familia_id);
        end
        else
        /* retorna a localizacao padrao do produto */
        if ( codigo = 1002 ) then
        begin
            ret = (select first 1 p.localizacao_codigo from tbproduto p where p.codigo = :familia_id);
        end
        else
        /* retorna a localizacao informada */
        if ( codigo = 1003 ) then
        begin
            ret = localizacao_id;
        end
        else
        /* retorna a localizacao do talao */
        if ( codigo = 1004 ) then
        begin
            ret = (select first 1 d.localizacao_id from vwremessa_talao_detalhe d where d.id = :remessa_talao_detalhe_id);
        end
    end
    else
    /* localizacao pela familia/gp/perfil_up */
    if ( codigo < 3001 ) then
    begin

        localizacao_tipo = codigo - 2000;

        ret = (select first 1 l.localizacao_id
                 from tbfamilia_localizacao l
                where l.familia_id          = :familia_id
                  and l.gp_id               = :gp_id
                  and l.perfil_up           = :perfil_up
                  and l.localizacao_tipo_id = :localizacao_tipo);

    end


  return ret;
end
^

SET TERM ; ^

ALTER TABLE TBESTOQUE_TRANSACAO_ITEM
    ADD ESTOQUE_TRANSACAO_REGRA_ID INTEGER;

ALTER TABLE TBESTOQUE_TRANSACAO_ITEM
    ADD CONFERENCIA INTEGER DEFAULT 0;

	
	
	
CREATE GLOBAL TEMPORARY TABLE TMPGP_ESTOQUE (
    GP_ID       INTEGER NOT NULL
) ON COMMIT DELETE ROWS;	