SET TERM ^ ;

CREATE OR ALTER procedure SPI_REMESSA_ITEM_ALOCACAO (
    REMESSA_ID integer,
    AGRUPAMENTO_ID integer,
    TIPO_EXECUCAO integer = 0,
    TRANSBORDAR integer = 0,
    TRANSFERIR integer = 0)
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 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;
declare variable TRANSBORDAR_AGRUPAMENTOS integer;
declare variable TALAO_DETALHE_ID integer;
declare variable AGRUP_PED_ID integer;
declare variable ALOCADO_PEDIDO numeric(18,5);
declare variable ID integer;
begin

    if(TIPO_EXECUCAO = 0)then
    begin
        TRANSBORDAR_AGRUPAMENTOS = coalesce((select first 1 r.transbordar_agrupamentos from tbremessa r where r.numero = :REMESSA_ID),1);
    end else
    begin
        TRANSBORDAR_AGRUPAMENTOS = TRANSBORDAR;
    end

    if(TRANSFERIR = 0)then
    begin
        --VERIFICAR SE REMESSA JA TEM VINCULOS
        select first 1
            s.id
        from TBREMESSA_ITEM_ALOCACAO s
        where s.remessa = :REMESSA_ID
        and s.tabela_id > 0
        into :ITEM_ID;
        
        ITEM_ID = coalesce(ITEM_ID,0);
        
        if(ITEM_ID > 0)then
        begin
            exception "..." 'ITENS DA ALOCACAO DA REMESSA '||:REMESSA_ID||' POSSUEM PEDIDOS VINCULADOS';
        end
    
        --REMOVER AS BAIXA DE SALDO
        FOR
            select
                s.id
            from TBREMESSA_ITEM_ALOCACAO s
            where s.remessa = :REMESSA_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 DA REMESSA
        DELETE FROM TBREMESSA_ITEM_ALOCACAO S WHERE s.remessa = :REMESSA_ID;
    
        if(AGRUPAMENTO_ID > 0)then
        begin
    
            VAGRUPAMENTO_ID = AGRUPAMENTO_ID;
            LISTA_AGRUPAMENTOS = ''||AGRUPAMENTO_ID;
    
            FOR
                select
                    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
                        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,
                        'R' 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
            
                    union all
        
                    select
                        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,
                        'R' 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 p.modelo_origem > 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
    
                ) ORDER BY remessa_acumulado_controle
            into
                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,
                    :VAGRUPAMENTO_ID,
                    :TEMPO,
                    0,
                    0,
                    '22600',
                    :ORIGEM_PRODUTO_ID
               );
        
            end
        end
    end else
    begin
        if(AGRUPAMENTO_ID > 0)then
        begin
    
            VAGRUPAMENTO_ID = AGRUPAMENTO_ID;
            LISTA_AGRUPAMENTOS = ''||AGRUPAMENTO_ID;
    
            DELETE FROM TBREMESSA_ITEM_ALOCACAO S WHERE s.remessa = :REMESSA_ID and s.tabela_id = 0;

            FOR
                select
                    ID,
                    AGRUP_PED_ID,
                    TALAO_DETALHE_ID,
                    SETOR_CODIGO,
                    ESTABELECIMENTO_ID,
                    LOCALIZACAO_ID,
                    TABELA_ID,
                    TAB_ITEM_ID,
                    REMESSA,
                    TALAO,
                    PRODUTO_ID,
                    TAMANHO,
                    QUANTIDADE,
                    TIPO,
                    SALDO,
                    DATAHORA,
                    fn_current_user_id() USUARIO,
                    QUANTIDADE_ORIGINAL,
                    TEMPO,
                    ORIGEM_PRODUTO_ID
                from(
                    select
                        s.ID,
                        s.id as AGRUP_PED_ID,
                        p.controle as TALAO_DETALHE_ID,
                        p.remessa_acumulado_controle,
                        p.setor_codigo,
                        s.estabelecimento_id,
                        s.localizacao_id,
                        s.tabela_id,
                        s.tab_item_id,
                        s.remessa,
                        s.talao,
                        s.produto_id,
                        s.tamanho,
                        s.quantidade,
                        s.tipo,
                        s.saldo,
                        s.datahora,
                        s.usuario,
                        s.quantidade_original,
                        s.tempo,
                        s.produto_origem as ORIGEM_PRODUTO_ID
                    from TBREMESSA_ITEM_ALOCACAO s, tbpedido_item_processado p
                    where s.remessa = :REMESSA_ID
                    and p.remessa = s.remessa
                    and p.controle = s.talao
                    and p.situacao < 3
                )
                ORDER BY remessa_acumulado_controle
            into
                ID,
                AGRUP_PED_ID,
                TALAO_DETALHE_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

                DELETE FROM TBAGRUPAMENTO_CARGA_SKU_UP WHERE TIPO = 2 AND AGRUP_PED_ID = :AGRUP_PED_ID;
                DELETE FROM TBREMESSA_ITEM_ALOCACAO S WHERE s.remessa = :REMESSA_ID and s.id = :ID;
    
                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;
    
               VAGR_REM_ID = GEN_ID(Gtbremessa_item_alocacao,1);

               --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,
                    :VAGRUPAMENTO_ID,
                    :TEMPO,
                    0,
                    0,
                    '22600',
                    :ORIGEM_PRODUTO_ID
               );
        
            end

            for
                select
                    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,
                    coalesce((select sum(k.quantidade) from TBREMESSA_ITEM_ALOCACAO k where k.remessa = a.REMESSA and k.talao = a.TALAO),0) as ALOCADO_PEDIDO
                from(
                    select
                        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,
                        'R' 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
            
                    union all
        
                    select
                        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,
                        'R' 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 p.modelo_origem > 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

                ) A ORDER BY remessa_acumulado_controle
           into
                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,
                ALOCADO_PEDIDO
            do begin
               QUANTIDADE = QUANTIDADE - ALOCADO_PEDIDO;
               SALDO      = SALDO      - ALOCADO_PEDIDO;

               if(QUANTIDADE > 0)then
               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,
                        :VAGRUPAMENTO_ID,
                        :TEMPO,
                        0,
                        0,
                        '22600',
                        :ORIGEM_PRODUTO_ID
                   );
               end
            end
        end
    end
end
^

SET TERM ; ^

COMMENT ON PARAMETER SPI_REMESSA_ITEM_ALOCACAO.TIPO_EXECUCAO IS
'se 1, vem da triger';

