SET TERM ^ ;

CREATE OR ALTER procedure SPI_REMESSA_ITEM_ALOCACAO_TALAO (
    AGRUPAMENTO_ID integer,
    REMESSA_ID integer,
    REMESSA_TALAO_ID integer,
    TIPO_REMESSA varchar(10))
as
declare variable ITEM_ID integer;
declare variable ESTABELECIMENTO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable TABELA_ID integer;
declare variable TAB_ITEM_ID integer;
declare variable REMESSA integer;
declare variable TALAO integer;
declare variable PRODUTO_ID integer;
declare variable TAMANHO integer;
declare variable QUANTIDADE numeric(18,5);
declare variable TIPO char(1);
declare variable SALDO numeric(18,5);
declare variable DATAHORA date;
declare variable USUARIO integer;
declare variable QUANTIDADE_ORIGINAL numeric(18,5);
declare variable VAGR_REM_ID integer;
declare variable TEMPO numeric(15,4);
declare variable UP_ID integer;
declare variable AGRUP_UP_ID integer;
declare variable ORIGEM_PRODUTO_ID integer;
declare variable TIPO_GP varchar(10);
declare variable TRANSBORDAR_AGRUPAMENTOS integer;
declare variable VAGRUPAMENTO_ID integer;
declare variable LISTA_AGRUPAMENTOS varchar(300);
declare variable SALDO_AGRUPAMENTO numeric(15,4);
declare variable GP_ID integer;
declare variable DATA_FINAL date;
begin

    --REMOVER AS BAIXA DE SALDO do talao
    FOR
        select
            s.id
        from TBREMESSA_ITEM_ALOCACAO s
        where s.remessa = :REMESSA_ID
        and s.talao = :REMESSA_TALAO_ID
    into
        :VAGR_REM_ID
    DO begin
        DELETE FROM TBAGRUPAMENTO_CARGA_SKU_UP WHERE TIPO = 2 AND AGRUP_PED_ID = :VAGR_REM_ID;
    END

    --REMOVER A ALOCACAO Ddo talao
    DELETE FROM TBREMESSA_ITEM_ALOCACAO S WHERE s.remessa = :REMESSA_ID and s.talao = :REMESSA_TALAO_ID;

    TIPO_GP = coalesce((select first 1 g.tipo_agrupamento from tbpedido_item_processado p, tbgp g where p.controle = :REMESSA_TALAO_ID and g.id = p.PROGRAMACAO_ESTEIRA),'');

    if(TIPO_GP = '' and TIPO_REMESSA <> '22600')then
    begin
        exception "..." 'TIPO DE AGRUPAMENTO DO GRUPO DE PRODUCAO NAO ENCONTRADO';
    end

    if(TIPO_REMESSA = '22600')then
    begin
        TIPO_GP = 'R';
    end

    if(AGRUPAMENTO_ID > 0)then
    begin

        TRANSBORDAR_AGRUPAMENTOS = coalesce((select first 1 r.transbordar_agrupamentos from tbremessa r where r.numero = :REMESSA_ID),1);
        VAGRUPAMENTO_ID = AGRUPAMENTO_ID;
        LISTA_AGRUPAMENTOS = ''||AGRUPAMENTO_ID;

        FOR
            select
                gp_id,
                SETOR_CODIGO,
                ESTABELECIMENTO_ID,
                LOCALIZACAO_ID,
                TABELA_ID,
                TAB_ITEM_ID,
                REMESSA,
                TALAO,
                PRODUTO_ID,
                TAMANHO,
                QUANTIDADE,
                TIPO,
                SALDO,
                DATAHORA,
                USUARIO,
                QUANTIDADE_ORIGINAL,
                TEMPO,
                ORIGEM_PRODUTO_ID
            from(
                select
                    r.gp_id,
                    p.setor_codigo,
                    P.estabelecimento_codigo ESTABELECIMENTO_ID,
                    P.localizacao_codigo LOCALIZACAO_ID,
                    0 TABELA_ID,
                    0 TAB_ITEM_ID,
                    P.remessa REMESSA,
                    P.controle TALAO,
                    P.produto_codigo PRODUTO_ID,
                    p.tamanho TAMANHO,
                    p.quantidade_pedido QUANTIDADE,
                    :TIPO_GP TIPO,
                    p.quantidade_pedido SALDO,
                    current_date DATAHORA,
                    fn_current_user_id() USUARIO,
                    p.quantidade_pedido QUANTIDADE_ORIGINAL,
                    s.tempo * s.colaboradores as tempo,
                    P.remessa_acumulado_controle,
                    p.produto_codigo as ORIGEM_PRODUTO_ID
                FROM tbpedido_item_processado P, tbremessa R, tbprogramacao s
                WHERE P.remessa = :REMESSA_ID
                AND R.numero = P.remessa
                and s.remessa_id = p.remessa
                and s.tabela_id = p.controle
                and s.tipo = 'D'
                and coalesce(p.modelo_origem,0) = 0
                and p.peca_conjunto_id = 0
                and p.controle = :REMESSA_TALAO_ID
        
                union all
    
                select
                    r.gp_id,
                    p.setor_codigo,
                    P.estabelecimento_codigo ESTABELECIMENTO_ID,
                    P.localizacao_codigo LOCALIZACAO_ID,
                    0 TABELA_ID,
                    0 TAB_ITEM_ID,
                    P.remessa REMESSA,
                    P.controle TALAO,
                    k1.codigo PRODUTO_ID,
                    p.tamanho TAMANHO,
                    p.quantidade_pedido QUANTIDADE,
                    :TIPO_GP TIPO,
                    p.quantidade_pedido SALDO,
                    current_date DATAHORA,
                    fn_current_user_id() USUARIO,
                    p.quantidade_pedido QUANTIDADE_ORIGINAL,
                    s.tempo * s.colaboradores as tempo,
                    P.remessa_acumulado_controle,
                    coalesce(k2.codigo,0) as ORIGEM_PRODUTO_ID
                FROM tbremessa R, tbprogramacao s, tbproduto k1, tbpedido_item_processado P
                left join tbproduto k2 on k2.modelo_codigo = p.modelo_origem and p.cor_id = k2.cor_codigo and k2.modelo_codigo > 0

                WHERE P.remessa = :REMESSA_ID
                AND R.numero = P.remessa
                and s.remessa_id = p.remessa
                and s.tabela_id = p.controle
                and s.tipo = 'D'
                and k1.modelo_codigo = p.modelo_codigo
                and p.cor_id = k1.cor_codigo
                and p.peca_conjunto_id > 0
                and p.controle = :REMESSA_TALAO_ID

            ) ORDER BY remessa_acumulado_controle
        into
            GP_ID,
            UP_ID,
            ESTABELECIMENTO_ID,
            LOCALIZACAO_ID,
            TABELA_ID,
            TAB_ITEM_ID,
            REMESSA,
            TALAO,
            PRODUTO_ID,
            TAMANHO,
            QUANTIDADE,
            TIPO,
            SALDO,
            DATAHORA,
            USUARIO,
            QUANTIDADE_ORIGINAL,
            TEMPO,
            ORIGEM_PRODUTO_ID
        do begin
        
           VAGR_REM_ID = GEN_ID(Gtbremessa_item_alocacao,1);

           if(TRANSBORDAR_AGRUPAMENTOS = 0)then
           begin
              SALDO_AGRUPAMENTO = coalesce((select first 1 l.saldo from tbagrupamento_carga_up l where l.agrupamento_id = :VAGRUPAMENTO_ID and l.up_id = :UP_ID),0);

              if(SALDO_AGRUPAMENTO < TEMPO)then
              begin
                select first 1
                    a.gp_id,
                    a.data_final
                from tbagrupamento a
                where a.id = :VAGRUPAMENTO_ID
                into :GP_ID, DATA_FINAL;

                VAGRUPAMENTO_ID = coalesce((
                    select first 1
                        id
                    from(
                        select
                            a.id,
                            coalesce((select first 1 l.saldo from tbagrupamento_carga_up l where l.agrupamento_id = a.id and l.up_id = :UP_ID),0) as SALDO
                        from tbagrupamento a
                        where a.id <> :VAGRUPAMENTO_ID
                        and a.gp_id = :GP_ID
                        and a.data_inicial >= :DATA_FINAL
                        order by a.data_inicial asc
                    )  where SALDO >= :TEMPO
                  ),0);

                if(VAGRUPAMENTO_ID > 0)then
                LISTA_AGRUPAMENTOS = LISTA_AGRUPAMENTOS||', '||VAGRUPAMENTO_ID;
              end
           end

           if(VAGRUPAMENTO_ID = 0)then
           begin
              exception "..." 'SEM AGRUPAMENTO DISPONIVEL PARA ESTA REMESSA, AGRUPAMENTOS UTILIZADOS: '||LISTA_AGRUPAMENTOS;
           end

           update tbpedido_item_processado p set p.agrupamento_id = :VAGRUPAMENTO_ID where p.controle = :TALAO;

           --ALOCAR REMESSA
           INSERT INTO TBREMESSA_ITEM_ALOCACAO (
                ID,
                ESTABELECIMENTO_ID,
                LOCALIZACAO_ID,
                TABELA_ID,
                TAB_ITEM_ID,
                REMESSA,
                TALAO,
                PRODUTO_ID,
                TAMANHO,
                QUANTIDADE,
                TIPO,
                SALDO,
                USUARIO,
                AGRUPAMENTO_ID,
                TEMPO,
                QTD_BAIXA,
                SALDO_BAIXA,
                TIPO_REMESSA,
                ORIGEM_PRODUTO_ID
           ) VALUES (
                :VAGR_REM_ID,
                :ESTABELECIMENTO_ID,
                :LOCALIZACAO_ID,
                :TABELA_ID,
                :TAB_ITEM_ID,
                :REMESSA,
                :TALAO,
                :PRODUTO_ID,
                :TAMANHO,
                :QUANTIDADE,
                :TIPO,
                :SALDO,
                :USUARIO,
                :AGRUPAMENTO_ID,
                :TEMPO,
                0,
                0,
                :TIPO_REMESSA,
                :ORIGEM_PRODUTO_ID
           );
    
        end
    end
end
^

SET TERM ; ^

