ALTER TABLE TBREVISAO
    ADD SITUACAO INTEGER DEFAULT 0;

COMMENT ON COLUMN TBREVISAO.SITUACAO IS
'liberacao do talao';

update tbrevisao r set r.situacao = 0;

ALTER TABLE TBPEDIDO_ITEM_PROCESSADO
    ADD ESTOQUE_ID_S_TRANSF INTEGER,
    ADD ESTOQUE_ID_E_TRANSF INTEGER;

COMMENT ON COLUMN TBPEDIDO_ITEM_PROCESSADO.ESTOQUE_ID_S_TRANSF IS
'id do estoque saida transferencia';

COMMENT ON COLUMN TBPEDIDO_ITEM_PROCESSADO.ESTOQUE_ID_E_TRANSF IS
'id do estoque entrada transferencia';

CREATE OR ALTER VIEW VWREMESSA_TALAO_DETALHE(
    ID,
    ESTABELECIMENTO_ID,
    REMESSA_ID,
    REMESSA_TALAO_ID,
    PECA_CONJUNTO,
    LOCALIZACAO_ID,
    PRODUTO_ID,
    MODELO_ID,
    COR_ID,
    TAMANHO,
    PERFIL,
    QUANTIDADE,
    QUANTIDADE_PRODUCAO,
    QUANTIDADE_PRODUCAO_TMP,
    QUANTIDADE_SALDO,
    QUANTIDADE_ALTERN,
    QUANTIDADE_ALTERN_PRODUCAO,
    QUANTIDADE_ALTERN_PRODUCAO_TMP,
    QUANTIDADE_ALTERN_SALDO,
    STATUS,
    DATA_PRODUCAO,
    DATAHORA_PRODUCAO,
    GP_ID,
    ESTOQUE_ID,
    QUANTIDADE_SOBRA,
    QUANTIDADE_SOBRA_TMP,
    LIB,
    ESTOQUE_ID_S_TRANSF,
    ESTOQUE_ID_E_TRANSF)
AS
Select
    P.CONTROLE,
    P.ESTABELECIMENTO_CODIGO,
    P.REMESSA,
    P.REMESSA_ACUMULADO_CONTROLE,
    P.PECA_CONJUNTO,
    P.LOCALIZACAO_CODIGO,
    P.PRODUTO_CODIGO,
    P.MODELO_CODIGO,
    P.COR_ID,
    P.TAMANHO,
    P.PERFIL,
    P.QUANTIDADE_PEDIDO,
    P.QUANTIDADE_PRODUCAO,
    P.QUANTIDADE_PRODUCAO_TMP,
    P.QUANTIDADE_SALDO,
    P.QUANTIDADE_ALTERN,
    P.QUANTIDADE_ALTERN_PRODUCAO,
    P.QUANTIDADE_ALTERN_PRODUCAO_TMP,
    P.QUANTIDADE_ALTERN_SALDO,
    P.SITUACAO,
    P.DATA_PRODUCAO, 
    P.HORA_PRODUCAO,
    P.PROGRAMACAO_ESTEIRA,
    P.ESTOQUE_ID,
    P.QUANTIDADE_SOBRA,
    P.QUANTIDADE_SOBRA_TMP ,
    P.LIB,
    P.ESTOQUE_ID_S_TRANSF,
    P.ESTOQUE_ID_E_TRANSF

from TBPEDIDO_ITEM_PROCESSADO P
;

ALTER TABLE TBREVISAO
    ADD ESTOQUE_ID_S_TRANSF INTEGER,
    ADD ESTOQUE_ID_E_TRANSF INTEGER;

COMMENT ON COLUMN TBREVISAO.ESTOQUE_ID_S_TRANSF IS
'id do estoque saida transferencia';

COMMENT ON COLUMN TBREVISAO.ESTOQUE_ID_E_TRANSF IS
'id do estoque entrada transferencia';

CREATE OR ALTER PROCEDURE SPU_LIBERACAO_TALAO_COLETOR (
    cod_barras varchar(100),
    operador_id integer)
returns (
    produto_id integer,
    produto_descricao varchar(100),
    operacao1 varchar(10),
    operacao2 varchar(10),
    localizacao_id_velha integer,
    localizacao_id_nova integer,
    localizacao_desc_velha varchar(100),
    localizacao_desc_nova varchar(100),
    remessa varchar(20),
    talao varchar(20),
    quantidade numeric(15,2),
    familia integer,
    id varchar(20),
    quantidade_alt numeric(15,2),
    situacao integer)
as
declare variable tipo_cod_barras integer;
declare variable id_codbarras varchar(20);
declare variable posicao integer;
declare variable tamanho integer;
declare variable estab integer;
begin
    :TIPO_COD_BARRAS = 0;

    if(position('P'  in :COD_BARRAS) > 0)then begin :TIPO_COD_BARRAS = 1; POSICAO = 2; end
    if(position('RD' in :COD_BARRAS) > 0)then begin :TIPO_COD_BARRAS = 2; POSICAO = 3; end
    if(position('RA' in :COD_BARRAS) > 0)then begin :TIPO_COD_BARRAS = 3; POSICAO = 3; end

    :TAMANHO = char_length(:COD_BARRAS);

    :ID_CODBARRAS = substring(:COD_BARRAS from POSICAO for TAMANHO);

    ID_CODBARRAS = cast(cast(ID_CODBARRAS as integer) as varchar(20));

    if(:TIPO_COD_BARRAS = 1)then
    begin
       for
            select
            
                r.produto_id as produto_cod,
                p.descricao as produto_desc,
                r.saldo as QUANTIDADE,
                r.localizacao_entrada,
                '' as remessa,
                '' as talao,
                P.familia_codigo,
                r.estabelecimento_id,
                r.situacao
            
            from tbrevisao r,
                 tbproduto p
            
            where true
             and r.id = :ID_CODBARRAS
             and p.codigo = r.produto_id

       into
        :produto_id,            
        :produto_descricao,
        :QUANTIDADE,
        :localizacao_id_velha,
        :remessa,                
        :talao,
        :FAMILIA,
        :ESTAB,
        :SITUACAO
       do begin
          :QUANTIDADE_ALT = 0;
       end
    end else
    begin
        if(:TIPO_COD_BARRAS = 2)then
        begin
           for
                select first 1

                    d.produto_id,
                    p.descricao as produto_descricao,
                    d.quantidade_saldo,
                    d.quantidade_altern_producao,
                    d.localizacao_id as localizacao_id_velha,
                    d.remessa_id,
                    d.remessa_talao_id,
                    p.familia_codigo as FAMILIA,
                    v.estabelecimento_id,
                    t.status

                from vwremessa_talao_detalhe d,
                     vwremessa_talao t,
                     vwremessa v,
                     tbproduto p
                
                where true
                and d.id = :ID_CODBARRAS
                and 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
    
           into
            :produto_id,            
            :produto_descricao,
            :QUANTIDADE,
            :QUANTIDADE_ALT,
            :localizacao_id_velha,
            :remessa,                
            :talao,                  
            :FAMILIA,
            :ESTAB,
            :SITUACAO
           do begin
    
           end
        end else
        begin
            if(:TIPO_COD_BARRAS = 3)then
            begin
               for
                    select

                        m.codigo as produto_id,
                        m.descricao as produto_descricao,
                        sum(d.quantidade_saldo) as QUANTIDADE,
                        sum(d.quantidade_altern_saldo) QUANTIDADE_ALT,
                        d.localizacao_id as localizacao_id_velha,
                        d.remessa_id,
                        d.remessa_talao_id,
                        v.familia_id as FAMILIA,
                        v.estabelecimento_id,
                        t.status
                    
                    from vwremessa_talao t,
                         vwremessa_talao_detalhe d,
                         vwremessa v,
                         tbmodelo m
                    
                    where true
                    and t.id = :ID_CODBARRAS
                    and v.remessa_id = d.remessa_id
                    and d.remessa_id = t.remessa_id
                    and d.remessa_talao_id = t.remessa_talao_id
                    and m.codigo = d.modelo_id
                    
                    group by 1,2,5,6,7,8,9,10
        
               into
                :produto_id,            
                :produto_descricao,
                :QUANTIDADE,
                :QUANTIDADE_ALT,
                :localizacao_id_velha,
                :remessa,                
                :talao,                  
                :FAMILIA,
                :ESTAB,
                :SITUACAO
               do begin
        
               end
            end else
            begin
                exception "..." 'Item não foi encontrado';
            end
        end
    end

    :operacao1 = coalesce((select first 1 n.valor_ext from tbcontrole_n n where n.id = 122),'');
    :operacao2 = coalesce((select first 1 n.valor_ext from tbcontrole_n n where n.id = 121),'');

    :localizacao_id_nova    = coalesce((select first 1 n.localizacao_processo from tbfamilia_ficha n where n.familia_codigo = :FAMILIA and n.estabelecimento_codigo = :ESTAB),0);
    :localizacao_desc_nova  = coalesce((select first 1 n.descricao from tblocalizacao n where n.codigo = :localizacao_id_nova and n.estabelecimento_codigo = :ESTAB),'');
    :localizacao_desc_velha = coalesce((select first 1 n.descricao from tblocalizacao n where n.codigo = :localizacao_id_velha and n.estabelecimento_codigo = :ESTAB),'');

    if(TIPO_COD_BARRAS = 1)then begin :ID = 'P/' ||:ID_CODBARRAS; end
    if(TIPO_COD_BARRAS = 2)then begin :ID = 'RD/'||:ID_CODBARRAS; end
    if(TIPO_COD_BARRAS = 3)then begin :ID = 'RA/'||:ID_CODBARRAS; end

    if(:quantidade = 0)then
    begin
        exception "..." 'O saldo deste item é 0';
    end

    if(:TIPO_COD_BARRAS > 1)then
    begin
        if(:SITUACAO <> 2)then
        begin
            exception "..." 'Este não esta produzido';
        end
    end

    if(:SITUACAO = 3)then
    begin
        exception "..." 'Este talão já foi liberado';
    end

    if(:localizacao_id_nova = 0)then
    begin
        exception "..." 'Familia sem estoque de processo definida. Familia:'||coalesce(:FAMILIA,0);
    end

    if(:localizacao_id_velha = 0)then
    begin
        exception "..." 'Item sem localizacao definida. Localizacao:'||coalesce(:localizacao_id_velha,0);
    end

    suspend;

end;

CREATE OR ALTER PROCEDURE SPU_LIBERAR_TALAO_COLETOR (
    cod_barras varchar(100),
    operador_id integer)
as
declare variable produto_id integer;
declare variable produto_descricao varchar(100);
declare variable operacao1 varchar(10);
declare variable operacao2 varchar(10);
declare variable localizacao_id_velha integer;
declare variable localizacao_id_nova integer;
declare variable localizacao_desc_velha varchar(100);
declare variable localizacao_desc_nova varchar(100);
declare variable remessa varchar(20);
declare variable talao varchar(20);
declare variable quantidade numeric(15,2);
declare variable familia integer;
declare variable id varchar(20);
declare variable quantidade_alt numeric(15,2);
declare variable tipo_cod_barras integer;
declare variable id_codbarras varchar(20);
declare variable posicao integer;
declare variable tamanho integer;
declare variable estab integer;
declare variable tratar_estoque integer;
declare variable estoque_id_saida integer;
declare variable estoque_id_entrada integer;
declare variable controle integer;
declare variable ccusto varchar(10);
declare variable acumulado integer;
begin
    :TIPO_COD_BARRAS = 0;
    :TRATAR_ESTOQUE = 0;

    if(position('P'  in :COD_BARRAS) > 0)then begin :TIPO_COD_BARRAS = 1; POSICAO = 2; end
    if(position('RD' in :COD_BARRAS) > 0)then begin :TIPO_COD_BARRAS = 2; POSICAO = 3; end
    if(position('RA' in :COD_BARRAS) > 0)then begin :TIPO_COD_BARRAS = 3; POSICAO = 3; end

    :TAMANHO = char_length(:COD_BARRAS);

    :ID_CODBARRAS = substring(:COD_BARRAS from POSICAO for TAMANHO);

    ID_CODBARRAS = cast(cast(ID_CODBARRAS as integer) as varchar(20));

    if(:TIPO_COD_BARRAS = 1)then
    begin
       for
            select
            
                r.produto_id as produto_cod,
                p.descricao as produto_desc,
                r.saldo as QUANTIDADE,
                r.localizacao_entrada,
                '' as remessa,
                '' as talao,
                P.familia_codigo,
                r.estabelecimento_id,
                r.tamanho
            
            from tbrevisao r,
                 tbproduto p
            
            where true
             and r.id = :ID_CODBARRAS
             and p.codigo = r.produto_id

       into
        :produto_id,            
        :produto_descricao,
        :QUANTIDADE,
        :localizacao_id_velha,
        :remessa,                
        :talao,
        :FAMILIA,
        :ESTAB,
        :TAMANHO
       do begin
          :TRATAR_ESTOQUE = 1;
       end
    end else
    begin
        if(:TIPO_COD_BARRAS = 2)then
        begin
           for
                select first 1

                    d.produto_id,
                    p.descricao as produto_descricao,
                    d.quantidade_saldo,
                    d.quantidade_altern_producao,
                    d.localizacao_id as localizacao_id_velha,
                    d.remessa_id,
                    d.remessa_talao_id,
                    p.familia_codigo as FAMILIA,
                    v.estabelecimento_id,
                    d.tamanho
                from vwremessa_talao_detalhe d,
                     vwremessa v,
                     tbproduto p
                
                where true
                and d.id = :ID_CODBARRAS
                and p.codigo = d.produto_id
                and v.remessa_id = d.remessa_id
    
           into
            :produto_id,            
            :produto_descricao,
            :QUANTIDADE,
            :QUANTIDADE_ALT,
            :localizacao_id_velha,
            :remessa,                
            :talao,                  
            :FAMILIA,
            :ESTAB,
            :TAMANHO
           do begin
             :TRATAR_ESTOQUE = 1;
           end
        end else
        begin
            if(:TIPO_COD_BARRAS = 3)then
            begin
               for
                    select

                        m.codigo as produto_id,
                        m.descricao as produto_descricao,
                        d.quantidade_saldo as QUANTIDADE,
                        d.quantidade_altern_saldo QUANTIDADE_ALT,
                        d.localizacao_id as localizacao_id_velha,
                        d.remessa_id,
                        d.remessa_talao_id,
                        v.familia_id as FAMILIA,
                        v.estabelecimento_id,
                        t.tamanho
                    
                    from vwremessa_talao t,
                         vwremessa_talao_detalhe d,
                         vwremessa v,
                         tbmodelo m
                    
                    where true
                    and t.id = :ID_CODBARRAS
                    and v.remessa_id = d.remessa_id
                    and d.remessa_id = t.remessa_id
                    and d.remessa_talao_id = t.remessa_talao_id
                    and m.codigo = d.modelo_id
        
               into
                :produto_id,            
                :produto_descricao,
                :QUANTIDADE,
                :QUANTIDADE_ALT,
                :localizacao_id_velha,
                :remessa,                
                :talao,                  
                :FAMILIA,
                :ESTAB,
                :TAMANHO
               do begin
                  :TRATAR_ESTOQUE = 0;
               end
            end else
            begin
                exception "..." 'Item não foi encontrado';
            end
        end
    end

    --FIM TRATAMENTO

    :operacao1 = coalesce((select first 1 n.valor_ext from tbcontrole_n n where n.id = 122),'');
    :operacao2 = coalesce((select first 1 n.valor_ext from tbcontrole_n n where n.id = 121),'');

    :localizacao_id_nova    = coalesce((select first 1 n.localizacao_processo from tbfamilia_ficha n where n.familia_codigo = :FAMILIA and n.estabelecimento_codigo = :ESTAB),0);
    :localizacao_desc_nova  = coalesce((select first 1 n.descricao from tblocalizacao n where n.codigo = :localizacao_id_nova and n.estabelecimento_codigo = :ESTAB),'');

    if(:quantidade = 0)then
    begin
        exception "..." 'O saldo deste item é 0';
    end

    if(:localizacao_id_nova = 0)then
    begin
        exception "..." 'Familia sem estoque de processo definida. Familia:'||coalesce(:FAMILIA,0);
    end

    if((:localizacao_id_velha = 0) or (:localizacao_id_velha is null) )then
    begin
        exception "..." 'Item sem localizacao de estoque. pode nao esta produzido';
    end

    if(coalesce(:produto_id,0) = 0)then
    begin
        exception "..." 'Produto nao definido. Produto:'||coalesce(:produto_id,0);
    end

    if((:operacao1 = '') or (:operacao1 = ''))then
    begin
        exception "..." 'Operacao de Entrada/Saida nao definida:'||coalesce(:produto_id,0);
    end

    if(:TRATAR_ESTOQUE = 1)then
    begin

        ESTOQUE_ID_SAIDA   = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
        ESTOQUE_ID_ENTRADA = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);

        --saida do saldo
        EXECUTE PROCEDURE SPU_ESTOQUE_SALDO4 (
            :ESTAB,
            :localizacao_id_velha,
            :produto_id,
            'S', /* S = SAIDA NO ESTOQUE */
            current_date,
            :QUANTIDADE,
            IIF(:TAMANHO = 1,:QUANTIDADE,0),
            IIF(:TAMANHO = 2,:QUANTIDADE,0),
            IIF(:TAMANHO = 3,:QUANTIDADE,0),
            IIF(:TAMANHO = 4,:QUANTIDADE,0),
            IIF(:TAMANHO = 5,:QUANTIDADE,0),
            IIF(:TAMANHO = 6,:QUANTIDADE,0),
            IIF(:TAMANHO = 7,:QUANTIDADE,0),
            IIF(:TAMANHO = 8,:QUANTIDADE,0),
            IIF(:TAMANHO = 9,:QUANTIDADE,0),
            IIF(:TAMANHO =10,:QUANTIDADE,0),
            IIF(:TAMANHO =11,:QUANTIDADE,0),
            IIF(:TAMANHO =12,:QUANTIDADE,0),
            IIF(:TAMANHO =13,:QUANTIDADE,0),
            IIF(:TAMANHO =14,:QUANTIDADE,0),
            IIF(:TAMANHO =15,:QUANTIDADE,0),
            IIF(:TAMANHO =16,:QUANTIDADE,0),
            IIF(:TAMANHO =17,:QUANTIDADE,0),
            IIF(:TAMANHO =18,:QUANTIDADE,0),
            IIF(:TAMANHO =19,:QUANTIDADE,0),
            IIF(:TAMANHO =20,:QUANTIDADE,0),
            :ESTOQUE_ID_SAIDA,
            ID_CODBARRAS,
            0,
            0,
            :operacao1,
            0,
            0,
            0,
            0,
            0,
            Current_Date,
            0,
            :CCUSTO,
            'SAIDA INTERNA DA PRODUCAO',
            '0',
            0,
            0,
            0,
            0
        );

        --saida do saldo
        EXECUTE PROCEDURE SPU_ESTOQUE_SALDO4 (
            :ESTAB,
            :localizacao_id_nova,
            :produto_id,
            'E', /* E = ENTRADA NO ESTOQUE */
            current_date,
            :QUANTIDADE,
            IIF(:TAMANHO = 1,:QUANTIDADE,0),
            IIF(:TAMANHO = 2,:QUANTIDADE,0),
            IIF(:TAMANHO = 3,:QUANTIDADE,0),
            IIF(:TAMANHO = 4,:QUANTIDADE,0),
            IIF(:TAMANHO = 5,:QUANTIDADE,0),
            IIF(:TAMANHO = 6,:QUANTIDADE,0),
            IIF(:TAMANHO = 7,:QUANTIDADE,0),
            IIF(:TAMANHO = 8,:QUANTIDADE,0),
            IIF(:TAMANHO = 9,:QUANTIDADE,0),
            IIF(:TAMANHO =10,:QUANTIDADE,0),
            IIF(:TAMANHO =11,:QUANTIDADE,0),
            IIF(:TAMANHO =12,:QUANTIDADE,0),
            IIF(:TAMANHO =13,:QUANTIDADE,0),
            IIF(:TAMANHO =14,:QUANTIDADE,0),
            IIF(:TAMANHO =15,:QUANTIDADE,0),
            IIF(:TAMANHO =16,:QUANTIDADE,0),
            IIF(:TAMANHO =17,:QUANTIDADE,0),
            IIF(:TAMANHO =18,:QUANTIDADE,0),
            IIF(:TAMANHO =19,:QUANTIDADE,0),
            IIF(:TAMANHO =20,:QUANTIDADE,0),
            :estoque_id_entrada,
            ID_CODBARRAS,
            0,
            0,
            :operacao2,
            0,
            0,
            0,
            0,
            0,
            Current_Date,
            0,
            :CCUSTO,
            'RETORNO INTERNO P/PRODUCAO',
            '0',
            0,
            0,
            0,
            0
        );

    end

    if(:TIPO_COD_BARRAS = 1)then
    begin

        update tbrevisao r
        set r.situacao = 3,
            r.estoque_id_s_transf = :estoque_id_saida,
            r.estoque_id_e_transf = :estoque_id_entrada,
            r.localizacao_entrada = :localizacao_id_nova
        where true
            and r.id = :ID_CODBARRAS;

    end

    if(:TIPO_COD_BARRAS = 2)then
    begin
        ACUMULADO = coalesce((select t.id from vwremessa_talao_detalhe d, vwremessa_talao t
        where true
        and d.id = :ID_CODBARRAS
        and t.remessa_id = d.remessa_id
        and t.remessa_talao_id = d.remessa_talao_id),0);

        if(:ACUMULADO <= 0)then
        begin
            exception "..." 'Erro ao consultar talão detalhado:'||coalesce(:produto_id,0);
        end

        update vwremessa_talao_detalhe t
        set t.estoque_id_s_transf = :estoque_id_saida,
            t.estoque_id_e_transf = :estoque_id_entrada,
            t.localizacao_id      = :localizacao_id_nova
        where true
        and t.id = :ID_CODBARRAS;

        update vwremessa_talao t
        set t.status = 3
        where true
        and t.id = :ACUMULADO;
    end

    if(:TIPO_COD_BARRAS = 3)then
    begin
        update vwremessa_talao t
        set t.status = 3
        where true
        and t.id = :ID_CODBARRAS;
    end

end;

CREATE OR ALTER PROCEDURE SPU_LIBERACAO_TALAO_COLETOR (
    cod_barras varchar(100),
    operador_id integer)
returns (
    produto_id integer,
    produto_descricao varchar(100),
    operacao1 varchar(10),
    operacao2 varchar(10),
    localizacao_id_velha integer,
    localizacao_id_nova integer,
    localizacao_desc_velha varchar(100),
    localizacao_desc_nova varchar(100),
    remessa varchar(20),
    talao varchar(20),
    quantidade varchar(15),
    familia integer,
    id varchar(20),
    quantidade_alt varchar(15),
    situacao integer)
as
declare variable tipo_cod_barras integer;
declare variable id_codbarras varchar(20);
declare variable posicao integer;
declare variable tamanho integer;
declare variable estab integer;
begin
    :TIPO_COD_BARRAS = 0;

    if(position('P'  in :COD_BARRAS) > 0)then begin :TIPO_COD_BARRAS = 1; POSICAO = 2; end
    if(position('RD' in :COD_BARRAS) > 0)then begin :TIPO_COD_BARRAS = 2; POSICAO = 3; end
    if(position('RA' in :COD_BARRAS) > 0)then begin :TIPO_COD_BARRAS = 3; POSICAO = 3; end

    :TAMANHO = char_length(:COD_BARRAS);

    :ID_CODBARRAS = substring(:COD_BARRAS from POSICAO for TAMANHO);

    ID_CODBARRAS = cast(cast(ID_CODBARRAS as integer) as varchar(20));

    if(:TIPO_COD_BARRAS = 1)then
    begin
       for
            select
            
                r.produto_id as produto_cod,
                p.descricao as produto_desc,
                r.saldo as QUANTIDADE,
                r.localizacao_entrada,
                '' as remessa,
                '' as talao,
                P.familia_codigo,
                r.estabelecimento_id,
                r.situacao
            
            from tbrevisao r,
                 tbproduto p
            
            where true
             and r.id = :ID_CODBARRAS
             and p.codigo = r.produto_id

       into
        :produto_id,            
        :produto_descricao,
        :QUANTIDADE,
        :localizacao_id_velha,
        :remessa,                
        :talao,
        :FAMILIA,
        :ESTAB,
        :SITUACAO
       do begin
          :QUANTIDADE_ALT = 0;
       end
    end else
    begin
        if(:TIPO_COD_BARRAS = 2)then
        begin
           for
                select first 1

                    d.produto_id,
                    p.descricao as produto_descricao,
                    d.quantidade_saldo,
                    d.quantidade_altern_producao,
                    d.localizacao_id as localizacao_id_velha,
                    d.remessa_id,
                    d.remessa_talao_id,
                    p.familia_codigo as FAMILIA,
                    v.estabelecimento_id,
                    t.status

                from vwremessa_talao_detalhe d,
                     vwremessa_talao t,
                     vwremessa v,
                     tbproduto p
                
                where true
                and d.id = :ID_CODBARRAS
                and 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
    
           into
            :produto_id,            
            :produto_descricao,
            :QUANTIDADE,
            :QUANTIDADE_ALT,
            :localizacao_id_velha,
            :remessa,                
            :talao,                  
            :FAMILIA,
            :ESTAB,
            :SITUACAO
           do begin
    
           end
        end else
        begin
            if(:TIPO_COD_BARRAS = 3)then
            begin
               for
                    select

                        m.codigo as produto_id,
                        m.descricao as produto_descricao,
                        sum(d.quantidade_saldo) as QUANTIDADE,
                        sum(d.quantidade_altern_saldo) QUANTIDADE_ALT,
                        d.localizacao_id as localizacao_id_velha,
                        d.remessa_id,
                        d.remessa_talao_id,
                        v.familia_id as FAMILIA,
                        v.estabelecimento_id,
                        t.status
                    
                    from vwremessa_talao t,
                         vwremessa_talao_detalhe d,
                         vwremessa v,
                         tbmodelo m
                    
                    where true
                    and t.id = :ID_CODBARRAS
                    and v.remessa_id = d.remessa_id
                    and d.remessa_id = t.remessa_id
                    and d.remessa_talao_id = t.remessa_talao_id
                    and m.codigo = d.modelo_id
                    
                    group by 1,2,5,6,7,8,9,10
        
               into
                :produto_id,            
                :produto_descricao,
                :QUANTIDADE,
                :QUANTIDADE_ALT,
                :localizacao_id_velha,
                :remessa,                
                :talao,                  
                :FAMILIA,
                :ESTAB,
                :SITUACAO
               do begin
        
               end
            end else
            begin
                exception "..." 'Item não foi encontrado';
            end
        end
    end

    :operacao1 = coalesce((select first 1 n.valor_ext from tbcontrole_n n where n.id = 122),'');
    :operacao2 = coalesce((select first 1 n.valor_ext from tbcontrole_n n where n.id = 121),'');

    :localizacao_id_nova    = coalesce((select first 1 n.localizacao_processo from tbfamilia_ficha n where n.familia_codigo = :FAMILIA and n.estabelecimento_codigo = :ESTAB),0);
    :localizacao_desc_nova  = coalesce((select first 1 n.descricao from tblocalizacao n where n.codigo = :localizacao_id_nova and n.estabelecimento_codigo = :ESTAB),'');
    :localizacao_desc_velha = coalesce((select first 1 n.descricao from tblocalizacao n where n.codigo = :localizacao_id_velha and n.estabelecimento_codigo = :ESTAB),'');

    if(TIPO_COD_BARRAS = 1)then begin :ID = 'P/' ||:ID_CODBARRAS; end
    if(TIPO_COD_BARRAS = 2)then begin :ID = 'RD/'||:ID_CODBARRAS; end
    if(TIPO_COD_BARRAS = 3)then begin :ID = 'RA/'||:ID_CODBARRAS; end

    if(:quantidade = 0)then
    begin
        exception "..." 'O saldo deste item é 0';
    end

    if(:TIPO_COD_BARRAS > 1)then
    begin
        if(:SITUACAO <> 2)then
        begin
            exception "..." 'Este não esta produzido';
        end
    end

    if(:SITUACAO = 3)then
    begin
        exception "..." 'Este talão já foi liberado';
    end

    if(:localizacao_id_nova = 0)then
    begin
        exception "..." 'Familia sem estoque de processo definida. Familia:'||coalesce(:FAMILIA,0);
    end

    if(:localizacao_id_velha = 0)then
    begin
        exception "..." 'Item sem localizacao definida. Localizacao:'||coalesce(:localizacao_id_velha,0);
    end

    suspend;

end;

