CREATE OR ALTER procedure spu_conferencia_transacao (
    i_estoque_id varchar(3000),
    i_operador_id integer,
    i_conferir integer = 2)
as
declare variable estoque_id integer;
declare variable operador_descricao varchar(200);
declare variable conferencia_descricao varchar(50);
BEGIN
    
    FOR
        SELECT OSPLIT
          FROM SPLIT(:I_ESTOQUE_ID,',')
    INTO
        ESTOQUE_ID
    DO
    BEGIN
        OPERADOR_DESCRICAO = COALESCE((
            SELECT FIRST 1 NOME
              FROM TBOPERADOR O
             WHERE O.CODIGO = :I_OPERADOR_ID),'');

        UPDATE TBESTOQUE_TRANSACAO_ITEM I
           SET I.CONFERENCIA = :I_CONFERIR,
           i.operador = :I_OPERADOR_ID
         WHERE I.CONTROLE IN (:ESTOQUE_ID);

        IF ( I_CONFERIR = 1 ) THEN
        BEGIN
            CONFERENCIA_DESCRICAO = 'DESCONFERIDO';
        END
        ELSE
        IF ( I_CONFERIR = 2 ) THEN
        BEGIN
            CONFERENCIA_DESCRICAO = 'CONFERIDO';
        END
        ELSE
        BEGIN
            EXCEPTION "..." 'OPERACAO DE CONFERENCIA INVALIDA';
        END

        EXECUTE PROCEDURE SPI_HISTORICO(
            'TBESTOQUE_TRANSACAO_ITEM',
            :ESTOQUE_ID,
            'ESTOQUE ' || CONFERENCIA_DESCRICAO || ' PELO OPERADOR: ' || :I_OPERADOR_ID || ' - ' || :OPERADOR_DESCRICAO
        );
    END


END;

ALTER TABLE TBOPERADOR
    ADD FAMILIA VARCHAR(500) DEFAULT '',
    ADD LOCALIZACAO VARCHAR(500) DEFAULT '';

COMMENT ON COLUMN TBOPERADOR.FAMILIA IS
'id das familias separdas por virgula';

COMMENT ON COLUMN TBOPERADOR.LOCALIZACAO IS
'id das localizacoes separdas por virgula';

SET TERM ^ ;

CREATE OR ALTER function fn_operador_localizacao (
    operador_id integer,
    localizacao_id integer)
returns boolean
as
declare variable lista varchar(500);
declare variable item varchar(10);
declare variable liberado boolean;
begin

    LIBERADO = false;

    for
       select first 1
          o.localizacao
       from tboperador o
       where o.codigo = :OPERADOR_ID
    into
        :LISTA
    do
    begin
    
        for
            select * from split(:LISTA,',')
        into
            :ITEM
        do
        begin
           if(LOCALIZACAO_ID = cast(:ITEM as integer))then
           begin
              LIBERADO = true;
           end
        end
    
    end

  return LIBERADO;
end;

CREATE OR ALTER function fn_operador_familia (
    operador_id integer,
    familia_id integer)
returns boolean
as
declare variable lista varchar(500);
declare variable item varchar(10);
declare variable liberado boolean;
begin

    LIBERADO = false;

    for
       select first 1
          o.familia
       from tboperador o
       where o.codigo = :OPERADOR_ID
    into
        :LISTA
    do
    begin
    
        for
            select * from split(:LISTA,',')
        into
            :ITEM
        do
        begin
           if(familia_id = cast(:ITEM as integer))then
           begin
              LIBERADO = true;
           end
        end
    
    end

  return LIBERADO;
end;


CREATE OR ALTER trigger ttbestoque_transacao_item_b4u for tbestoque_transacao_item
active before update position 0
AS
declare variable FAMILIA_LIBERADO boolean;
declare variable LOCALIZACAO_LIBERADO boolean;
declare variable FAMILIA_PRODUTO integer;
begin
  IF ( NEW.ESTOQUE_TRANSACAO_REGRA_ID > 0 AND NEW.TIPO = 'E' ) THEN
  BEGIN
     IF ( OLD.CONFERENCIA = 1 AND NEW.CONFERENCIA = 2 AND new.operador > 0) THEN
     BEGIN
        FAMILIA_PRODUTO = coalesce((select first 1 p.familia_codigo from tbproduto p where p.codigo = new.produto_codigo),0);

        FAMILIA_LIBERADO     = fn_operador_familia(new.operador, FAMILIA_PRODUTO);
        LOCALIZACAO_LIBERADO = fn_operador_localizacao(new.operador, new.localizacao_codigo);

        if(FAMILIA_LIBERADO =  false)then
        begin
           exception "..." 'OPERADOR NAO TEM PERMISSAO DE CONFERIR ESTOQUE COM A FAMILIA INFORMADA. FAMILIA:'||FAMILIA_PRODUTO||' OPERADOR:'||new.operador||'.';
        end

        if(LOCALIZACAO_LIBERADO =  false)then
        begin
           exception "..." 'OPERADOR NAO TEM PERMISSAO DE CONFERIR ESTOQUE COM A LOCALIZACAO INFORMADA. LOCALIZACAO:'||new.localizacao_codigo||' OPERADOR:'||new.operador||'.';
        end
     END

     IF ( OLD.CONFERENCIA = 2 AND NEW.CONFERENCIA = 1 AND new.operador > 0) THEN
     BEGIN
        FAMILIA_PRODUTO = coalesce((select first 1 p.familia_codigo from tbproduto p where p.codigo = new.produto_codigo),0);

        FAMILIA_LIBERADO     = fn_operador_familia(new.operador, FAMILIA_PRODUTO);
        LOCALIZACAO_LIBERADO = fn_operador_localizacao(new.operador, new.localizacao_codigo);

        if(FAMILIA_LIBERADO =  false)then
        begin
           exception "..." 'OPERADOR NAO TEM PERMISSAO DE DESCONFERIR ESTOQUE COM A FAMILIA INFORMADA. FAMILIA:'||FAMILIA_PRODUTO||' OPERADOR:'||new.operador||'.';
        end

        if(LOCALIZACAO_LIBERADO =  false)then
        begin
           exception "..." 'OPERADOR NAO TEM PERMISSAO DE DESCONFERIR ESTOQUE COM A LOCALIZACAO INFORMADA. LOCALIZACAO:'||new.localizacao_codigo||' OPERADOR:'||new.operador||'.';
        end
     END
  END
end;

