SET TERM ^ ;

CREATE OR ALTER procedure spc_estoque_transacao_regra (
    i_regra_tipo integer,
    i_gp_id integer,
    i_perfil_up varchar(10),
    i_produto_id integer,
    i_tipo char(1),
    i_talao integer = null,
    i_peca_barras varchar(50) = null,
    i_localizacao_id integer = null)
returns (
    regra_id integer,
    localizacao_id integer,
    operacao varchar(15),
    conferencia integer,
    peca_barras varchar(50))
as
declare variable regras integer;
declare variable localizacao_id_saida integer;
declare variable localizacao_id_entrada integer;
declare variable operacao_estoque_saida varchar(40);
declare variable operacao_estoque_entrada varchar(40);
declare variable familia_id integer;
declare variable peca_tipo varchar(10);
declare variable peca_id integer;
BEGIN

--    IF ( I_gp_id IS NULL ) THEN
--    BEGIN
--        exception "..." 'ID DO GRUPO DE PRODUCAO OBRIGATORIO.';
--    END
--
--    IF ( I_PERFIL_UP IS NULL ) THEN
--    BEGIN
--        exception "..." 'PERFIL DA UP OBRIGATORIO.';
--    END

    IF ( I_PRODUTO_ID IS NULL ) THEN
    BEGIN
        exception "..." 'ID DO PRODUTO OBRIGATORIO.';
    END


    IF ( I_TIPO IS NULL ) THEN
    BEGIN
        exception "..." 'TIPO DA TRANSACAO OBRIGATORIO.';
    END

    :REGRAS = 0;

    FAMILIA_ID = COALESCE((SELECT FIRST 1 FAMILIA_CODIGO FROM tbproduto P WHERE P.codigo = :I_PRODUTO_ID),0);

    IF ( familia_id = 0 ) THEN
    BEGIN
        exception "..." 'PRODUTO: ' || I_produto_id || ' SEM FAMILIA DEFINIDA.';
    END

    SELECT COUNT(ID) OVER() REGRAS,
           ID,
           TIPO,
           GP_ID,
           PERFIL_UP,
           FAMILIA_ID,
           LOCALIZACAO_ID_SAIDA,
           LOCALIZACAO_ID_ENTRADA,
           CONFERENCIA,
           OPERACAO_ESTOQUE_SAIDA,
           OPERACAO_ESTOQUE_ENTRADA
      FROM TBESTOQUE_TRANSACAO_REGRA R
     WHERE R.TIPO = :I_REGRA_TIPO
       AND COALESCE(R.GP_ID,0) = COALESCE(:I_GP_ID,0)
       AND COALESCE( iif(char_length(R.PERFIL_UP) = 0, null, R.PERFIL_UP),0) = COALESCE(:I_PERFIL_UP,0)
       AND R.FAMILIA_ID = :FAMILIA_ID
       AND R.STATUS = 1
    INTO
        :REGRAS,
        :REGRA_ID,
        :I_REGRA_TIPO,
        :I_GP_ID,
        :I_PERFIL_UP,
        :FAMILIA_ID,
        :LOCALIZACAO_ID_SAIDA,
        :LOCALIZACAO_ID_ENTRADA,
        :CONFERENCIA,
        :OPERACAO_ESTOQUE_SAIDA,
        :OPERACAO_ESTOQUE_ENTRADA;

    IF(:REGRAS > 1)THEN
    BEGIN
       EXCEPTION "..." 'REGRA DE TRANSACAO DE ESTOQUE ('||I_TIPO||')PARA O'
                       ||' TIPO:'|| COALESCE(:I_REGRA_TIPO,0)
                       ||' GP:'||COALESCE(:I_GP_ID,0)
                       ||' PERFIL UP:'||COALESCE(:I_PERFIL_UP,'')
                       ||' FAMILIA ID:'||COALESCE(:FAMILIA_ID,0)
                       ||' CONFIGURADA INCORRETAMENTE. MULTIPLAS REGRAS,  ENTRE EM CONTATO COM O SUPORTE TECNICO, RAMAL 27';
    END

    IF(:REGRAS < 1)THEN
    BEGIN
       EXCEPTION "..." 'REGRA DE TRANSACAO DE ESTOQUE ('||I_TIPO||')PARA O'
                       ||' TIPO:'|| COALESCE(:I_REGRA_TIPO,0)
                       ||' GP:'||COALESCE(:I_GP_ID,0)
                       ||' PERFIL UP:'||COALESCE(:I_PERFIL_UP,'')
                       ||' FAMILIA ID:'||COALESCE(:FAMILIA_ID,0)
                       ||' CONFIGURADA INCORRETAMENTE. NÃO ENCONTRADA, ENTRE EM CONTATO COM O SUPORTE TECNICO, RAMAL 27';
    END


    IF ( I_REGRA_TIPO = 5 AND i_peca_barras IS NULL ) THEN
    BEGIN
        IF ( NOT (I_TALAO > 0) ) THEN
        BEGIN
           EXCEPTION "..." 'REGRA DE TRANSACAO DE ESTOQUE: ' || REGRA_ID || ' - ('||I_TIPO||') PARA O'
                           ||' TIPO:'|| COALESCE(:I_REGRA_TIPO,0)
                           ||' GP:'||COALESCE(:I_GP_ID,0)
                           ||' PERFIL UP:'||COALESCE(:I_PERFIL_UP,'')
                           ||' FAMILIA ID:'||COALESCE(:FAMILIA_ID,0)
                           ||' CONFIGURADA INCORRETAMENTE. ID DO TALAO OBRIGATORIO. ENTRE EM CONTATO COM O SUPORTE TECNICO, RAMAL 27';

        END

        PECA_BARRAS = 'RD' || LPAD(I_TALAO,11,0);

    END
    ELSE
    IF ( I_PECA_BARRAS IS NOT NULL ) THEN
    BEGIN
        PECA_BARRAS = I_PECA_BARRAS;
    END


    IF(I_TIPO = 'E')THEN
    BEGIN
        :OPERACAO = :OPERACAO_ESTOQUE_ENTRADA;
        :LOCALIZACAO_ID = FN_LOCALIZACAO_CODIGO(:LOCALIZACAO_ID_ENTRADA,:I_PRODUTO_ID,:FAMILIA_ID, :I_LOCALIZACAO_ID, :I_TALAO, :I_GP_ID, :I_PERFIL_UP,:PECA_BARRAS);
    END
    ELSE
    IF(I_TIPO = 'S')THEN
    BEGIN
        :OPERACAO = :OPERACAO_ESTOQUE_SAIDA;


        :LOCALIZACAO_ID = FN_LOCALIZACAO_CODIGO(:LOCALIZACAO_ID_SAIDA,:I_PRODUTO_ID,:FAMILIA_ID, :I_LOCALIZACAO_ID, :I_TALAO, :I_GP_ID, :I_PERFIL_UP,:PECA_BARRAS);
    END
    ELSE
    BEGIN
        EXCEPTION "..." 'TIPO DE TRANSACAO INVALIDA, INFORME E-ENTRASA OU S-SAIDA';
    END

    IF ( COALESCE(LOCALIZACAO_ID,0) = 0 ) THEN
    BEGIN
       EXCEPTION "..." 'REGRA DE TRANSACAO DE ESTOQUE: ' || REGRA_ID || ' - ('||I_TIPO||') PARA O'
                       ||' TIPO:'|| COALESCE(:I_REGRA_TIPO,0)
                       ||' GP:'||COALESCE(:I_GP_ID,0)
                       ||' PERFIL UP:'||COALESCE(:I_PERFIL_UP,'')
                       ||' FAMILIA ID:'||COALESCE(:FAMILIA_ID,0)
                       ||' CONFIGURADA INCORRETAMENTE. LOCALIZACAO NAO ENCONTRADA. ENTRE EM CONTATO COM O SUPORTE TECNICO, RAMAL 27';

    END


    fn_set_context('REGRA_LOCALIZACAO_ID',:localizacao_id);

    SUSPEND;

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbestoque_transacao_regra_b1iu for tbestoque_transacao_regra
active before insert or update position 1
AS
declare variable entrada integer;
declare variable saida integer;
begin

    if( char_length(coalesce(new.perfil_up,'0')) = 0 )then
    begin
       new.perfil_up = null;
    end

    IF( (NEW.tipo = 1) or (NEW.tipo = 2) or (NEW.tipo = 4) )then
    BEGIN
        saida   = coalesce((select first 1 o.transferencia from tboperacao o where o.codigo = new.operacao_estoque_saida),0);
        entrada = coalesce((select first 1 o.transferencia from tboperacao o where o.codigo = new.operacao_estoque_entrada),0);
    
        if(saida = 0) then
        begin
           exception "..." 'OPERACAO DE SAIDA NAO E DE TRANSFERENCIA';
        end
    
        if(entrada = 0) then
        begin
           exception "..." 'OPERACAO DE ENTRADA NAO E DE TRANSFERENCIA';
        end
    END

end
^

SET TERM ; ^

