SET TERM ^ ;

CREATE OR ALTER procedure SPI_REMESSA_PLACA (
    I_REMESSA_ID integer)
as
declare variable ESTABELECIMENTO_ID integer;
declare variable REMESSA_TALAO_ID integer;
declare variable PRODUTO_ID integer;
declare variable TAMANHO integer;
declare variable QUANTIDADE_TALAO numeric(15,5);
declare variable QUANTIDADE_SOBRA numeric(15,5);
declare variable SOBRA_QUANTIDADE_ALOCAR numeric(15,5);
declare variable SOBRA_ID integer;
declare variable SOBRA_SALDO numeric(15,5);
declare variable REMESSA_ID integer;
declare variable ORDEM integer;
declare variable I_MATRIZ_CODIGO integer;
declare variable I_TAMANHO integer;
declare variable I_PRODUTO_CODIGO integer;
declare variable I_MODELO_CODIGO integer;
declare variable I_COR_ID integer;
declare variable I_LARGURA numeric(18,4);
declare variable I_COMPRIMENTO numeric(18,4);
declare variable I_PACA_QTD_PARES integer;
declare variable I_DENSIDADE smallint;
declare variable I_ESPESSURA numeric(18,2);
declare variable I_MODELO_ORIGEM integer;
declare variable I_PERFIL varchar(40);
declare variable QUANTIDADE_REQUISITAR numeric(15,2);
declare variable TMP integer;
declare variable UP_ID integer;
declare variable QUANTIDADE_SOBRA2 integer;
declare variable DATA date;
declare variable DATAHORA timestamp;
declare variable MINIMO integer;
begin

    delete from tbrequisicao_placa r where r.remessa = :I_REMESSA_ID and r.tipo = 1;

    FOR
        SELECT
            ESTABELECIMENTO_ID,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            PRODUTO_ID,
            TAMANHO,
            QUANTIDADE,
            ORDEM,
            UP_ID,
            QUANTIDADE_SOBRA,
            DATA,
            DATAHORA
        FROM(
            SELECT
                T.estabelecimento_codigo as ESTABELECIMENTO_ID,
                T.remessa as REMESSA_ID,
                T.controle as REMESSA_TALAO_ID,
                T.produto_codigo PRODUTO_ID,
                T.TAMANHO,
                T.QUANTIDADE,
                iif(t.controle > 5499 and t.controle < 6000 , 0, 1) as ordem,
                t.up_id ,
                COALESCE((SELECT SUM(S.QUANTIDADE)
                                FROM TBREQUISICAO_SOBRA S
                               WHERE S.REMESSA       = t.remessa
                                 AND S.TALAO         = t.controle
                                 AND S.REQUISICAO_ID = 0),0.0000) QUANTIDADE_SOBRA,

               g.data as DATA,
               g.datahora_disponibilidade as DATAHORA
            FROM
                tbremessa_item_processado T, tbremessa g
            WHERE
                T.remessa = :I_REMESSA_ID
            AND T.controle < 8000
            and g.numero = t.remessa
        ) order by ordem ascending
    INTO
        ESTABELECIMENTO_ID,
        REMESSA_ID,
        REMESSA_TALAO_ID,
        PRODUTO_ID,
        TAMANHO,
        QUANTIDADE_TALAO,
        ORDEM,
        UP_ID,
        QUANTIDADE_SOBRA2,
        DATA,
        DATAHORA
    DO
    BEGIN

        DATAHORA = DATA;

        QUANTIDADE_TALAO = QUANTIDADE_TALAO - QUANTIDADE_SOBRA2;

        --placas
        if(ORDEM = 0)then
        begin
            for
                SELECT
                    MATRIZ_CODIGO,
                    TAMANHO,
                    PRODUTO_CODIGO,
                    p.modelo_codigo,
                    g.COR_CODIGO as COR_ID,
                    LARGURA,
                    COMPRIMENTO,
                    1 PACA_QTD_PARES,
                    DENSIDADE,
                    ESPESSURA,
                    coalesce((select first 1 j.modelo_origem from tbproduto j where j.codigo = g.codigo),0) as MODELO_ORIGEM,
                    coalesce((select first 1 s.perfil from vwsku s where s.modelo_id = p.modelo_codigo and s.cor_id = g.COR_CODIGO),'') as PERFIL,
                    p.placa_por_chapa
                from tbremessa_item_processado p, tbproduto g
                where p.remessa = :REMESSA_ID
                and p.controle  = :REMESSA_TALAO_ID
                and g.codigo    = p.produto_codigo
            into
                I_MATRIZ_CODIGO,
                I_TAMANHO,
                I_PRODUTO_CODIGO,
                I_MODELO_CODIGO,
                I_COR_ID,
                I_LARGURA,
                I_COMPRIMENTO,
                I_PACA_QTD_PARES,
                I_DENSIDADE,
                I_ESPESSURA,
                I_MODELO_ORIGEM,
                I_PERFIL,
                MINIMO
            do begin
                :MINIMO = 0;
                QUANTIDADE_REQUISITAR = QUANTIDADE_TALAO;
                execute procedure SPI_REQUISITAR_PLACA(:I_COR_ID, :I_MODELO_ORIGEM, :I_DENSIDADE, :I_ESPESSURA, :I_LARGURA, :I_COMPRIMENTO, :QUANTIDADE_REQUISITAR, 1, :UP_ID, :REMESSA_ID, :REMESSA_TALAO_ID,1, :DATA, :DATAHORA, :MINIMO);
            end
        end

        --bojo
        if(ORDEM > 0)then
        begin
            for
                SELECT
                    MATRIZ_CODIGO,
                    TAMANHO,
                    PRODUTO_CODIGO,
                    modelo_codigo,
                    COR_CODIGO as COR_ID,
                    LARGURA,
                    COMPRIMENTO,
                    PACA_QTD_PARES,
                    cast( fn_array(DEN_ESP, 1, '|') as numeric(15,2)) as DENSIDADE,
                    cast( fn_array(DEN_ESP, 2, '|') as numeric(15,2)) as ESPESSURA,
    
                    coalesce((select first 1
                           p.modelo_codigo
                        from tbmodelo_consumo_cor c, tbproduto p
                        where c.modelo_id = x.modelo_codigo
                        and c.cor_id = x.COR_CODIGO
                        and p.codigo = c.produto_id
                        and c.nivel = 0),0) as MODELO_ORIGEM,
    
                    coalesce((select first 1 s.perfil from vwsku s where s.modelo_id = x.modelo_codigo and s.cor_id = x.COR_CODIGO),'') as PERFIL
    
                from(
                    select
                        p.matriz_codigo,
                        p.tamanho,
                        p.produto_codigo,
                        f.cor_codigo,
                        f.modelo_codigo,
                        c.descricao as COR_DESCRICAO,
                        fn_densidade_espessura(f.modelo_codigo, f.cor_codigo) as DEN_ESP,
                        iif(p.tamanho =  0, t.largura,
                        iif(p.tamanho =  1, t.largura_t01,
                        iif(p.tamanho =  2, t.largura_t02,
                        iif(p.tamanho =  3, t.largura_t03,
                        iif(p.tamanho =  4, t.largura_t04,
                        iif(p.tamanho =  5, t.largura_t05,
                        iif(p.tamanho =  6, t.largura_t06,
                        iif(p.tamanho =  7, t.largura_t07,
                        iif(p.tamanho =  8, t.largura_t08,
                        iif(p.tamanho =  9, t.largura_t09,
                        iif(p.tamanho = 10, t.largura_t10,
                        iif(p.tamanho = 11, t.largura_t11,
                        iif(p.tamanho = 12, t.largura_t12,
                        iif(p.tamanho = 13, t.largura_t13,
                        iif(p.tamanho = 14, t.largura_t14,
                        iif(p.tamanho = 15, t.largura_t15,
                        iif(p.tamanho = 16, t.largura_t16,
                        iif(p.tamanho = 17, t.largura_t17,
                        iif(p.tamanho = 18, t.largura_t18,
                        iif(p.tamanho = 19, t.largura_t19,
                        iif(p.tamanho = 20, t.largura_t20,
                        0))))))))))))))))))))) as LARGURA,
                    
                        iif(p.tamanho =  1, t.comprimento_t01,
                        iif(p.tamanho =  2, t.comprimento_t02,
                        iif(p.tamanho =  3, t.comprimento_t03,
                        iif(p.tamanho =  4, t.comprimento_t04,
                        iif(p.tamanho =  5, t.comprimento_t05,
                        iif(p.tamanho =  6, t.comprimento_t06,
                        iif(p.tamanho =  7, t.comprimento_t07,
                        iif(p.tamanho =  8, t.comprimento_t08,
                        iif(p.tamanho =  9, t.comprimento_t09,
                        iif(p.tamanho = 10, t.comprimento_t10,
                        iif(p.tamanho = 11, t.comprimento_t11,
                        iif(p.tamanho = 12, t.comprimento_t12,
                        iif(p.tamanho = 13, t.comprimento_t13,
                        iif(p.tamanho = 14, t.comprimento_t14,
                        iif(p.tamanho = 15, t.comprimento_t15,
                        iif(p.tamanho = 16, t.comprimento_t16,
                        iif(p.tamanho = 17, t.comprimento_t17,
                        iif(p.tamanho = 18, t.comprimento_t18,
                        iif(p.tamanho = 19, t.comprimento_t19,
                        iif(p.tamanho = 20, t.comprimento_t20,
                        0)))))))))))))))))))) as COMPRIMENTO,
    
                        iif(p.tamanho =  1, t.quantidade_t01,
                        iif(p.tamanho =  2, t.quantidade_t02,
                        iif(p.tamanho =  3, t.quantidade_t03,
                        iif(p.tamanho =  4, t.quantidade_t04,
                        iif(p.tamanho =  5, t.quantidade_t05,
                        iif(p.tamanho =  6, t.quantidade_t06,
                        iif(p.tamanho =  7, t.quantidade_t07,
                        iif(p.tamanho =  8, t.quantidade_t08,
                        iif(p.tamanho =  9, t.quantidade_t09,
                        iif(p.tamanho = 10, t.quantidade_t10,
                        iif(p.tamanho = 11, t.quantidade_t11,
                        iif(p.tamanho = 12, t.quantidade_t12,
                        iif(p.tamanho = 13, t.quantidade_t13,
                        iif(p.tamanho = 14, t.quantidade_t14,
                        iif(p.tamanho = 15, t.quantidade_t15,
                        iif(p.tamanho = 16, t.quantidade_t16,
                        iif(p.tamanho = 17, t.quantidade_t17,
                        iif(p.tamanho = 18, t.quantidade_t18,
                        iif(p.tamanho = 19, t.quantidade_t19,
                        iif(p.tamanho = 20, t.quantidade_t20,
                        0)))))))))))))))))))) as PACA_QTD_PARES
                    
                    from tbremessa_item_processado p, tbmatriz t, tbproduto f, tbcor c
                    where p.remessa = :REMESSA_ID
                    and p.controle = :REMESSA_TALAO_ID
                    and t.codigo = p.matriz_codigo
                    and f.codigo = p.produto_codigo
                    and c.codigo = f.cor_codigo
                ) x
            into
                I_MATRIZ_CODIGO,
                I_TAMANHO,
                I_PRODUTO_CODIGO,
                I_MODELO_CODIGO,
                I_COR_ID,
                I_LARGURA,
                I_COMPRIMENTO,
                I_PACA_QTD_PARES,
                I_DENSIDADE,
                I_ESPESSURA,
                I_MODELO_ORIGEM,
                I_PERFIL
            do begin

                QUANTIDADE_REQUISITAR = QUANTIDADE_TALAO / I_PACA_QTD_PARES;
                IF( (QUANTIDADE_REQUISITAR - CAST(fn_format_number2(QUANTIDADE_REQUISITAR,0) AS INTEGER)) > 0)THEN
                BEGIN
                    QUANTIDADE_REQUISITAR = CAST(fn_format_number2(QUANTIDADE_REQUISITAR,0) AS INTEGER) + 1;
                END

                MINIMO = I_PACA_QTD_PARES;

                execute procedure SPI_REQUISITAR_PLACA(:I_COR_ID, :I_MODELO_ORIGEM, :I_DENSIDADE, :I_ESPESSURA, :I_LARGURA, :I_COMPRIMENTO, :QUANTIDADE_REQUISITAR, :I_PACA_QTD_PARES, :UP_ID, :REMESSA_ID, :REMESSA_TALAO_ID,0, :DATA, :DATAHORA, :MINIMO);
            end
        end
    END

    EXECUTE PROCEDURE SPI_HISTORICO('TBREMESSA',:I_REMESSA_ID,'APROVEITAMENTO DE PLACAS PROCESSADA');
    EXECUTE PROCEDURE SPI_REMESSA_CONSUMO_BOJO(:I_REMESSA_ID,0);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_REQUISITAR_PLACA (
    COR_ID integer,
    MODELO_ORIGEM integer,
    DENSIDADE numeric(15,2),
    ESPESSURA numeric(15,2),
    LARGURA numeric(15,4),
    COMPRIMENTO numeric(15,4),
    QUANTIDADE_REQUISITAR numeric(15,2),
    FATOR integer,
    UP_ID integer,
    REMESSA integer,
    TALAO integer,
    TALAO_DE_PLACA integer,
    DATA date,
    DATAHORA timestamp,
    MINIMO integer)
as
declare variable ID integer;
declare variable PRODUTO varchar(200);
declare variable ESTABELECIMENTO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable SALDO integer;
declare variable SALDO_INDISPONIVEL integer;
declare variable SALDO_ALOCADO integer;
declare variable QTD_SALDO integer;
declare variable QTD_GRAVAR integer;
declare variable ID_REQ integer;
declare variable TALAO_ID integer;
begin

    QTD_SALDO = QUANTIDADE_REQUISITAR;

    for
        SELECT
            ID,
            PRODUTO,
            ESTABELECIMENTO_ID,
            LOCALIZACAO_ID,
            iif(saldo_estoque > saldo_peca, saldo_peca, saldo_estoque) as saldo,
            SALDO_INDISPONIVEL,
            saldo_ALOCADO AS ALOCADO
        from(
            SELECT
                ID,
                PRODUTO,
                ESTABELECIMENTO_ID,
                LOCALIZACAO_ID,
                SALDO_ESTOQUE,
                SALDO_ALOCADO,
                coalesce(cast(fn_array(saldos,1,'|') as numeric(15,4)),0) as saldo_peca,
                coalesce(cast(fn_array(saldos,2,'|') as numeric(15,4)),0) as saldo_indisponivel
            FROM (
                SELECT
                    p.DESCRICAO as PRODUTO,
                    s.estabelecimento_codigo as ESTABELECIMENTO_ID, s.codigo as LOCALIZACAO_ID,
                    p.codigo as ID,
                    FN_ESTOQUE_SALDO_DISPONIVEL(s.estabelecimento_codigo, s.codigo, p.codigo, 0) as SALDO_ESTOQUE,
                    FN_ESTOQUE_SALDO_ALOCADO(s.estabelecimento_codigo, s.codigo, p.codigo, 0) as SALDO_ALOCADO,
                    coalesce((select sum(iif(ABERTO = 0,e.saldo, 0))||'|'||sum(iif(ABERTO = 0,0,e.saldo)) from VWESTOQUE_PLACA_V2 e where e.produto_id = p.codigo),0) as saldos
                from tbproduto p, tbproduto_ficha f, tblocalizacao s
                where p.familia_alternativa = (select fn_parametro('SISTEMA.FAMILIA_PLACA') from rdb$database)
                and f.LARGURA         >=:LARGURA
                and f.COMPRIMENTO     >=:COMPRIMENTO
                and p.cor_codigo      = :COR_ID
                and f.produto_codigo  = p.codigo
                and f.densidade       = :DENSIDADE
                and f.espessura       = :ESPESSURA
                and s.codigo          = fn_parametro('SISTEMA.LOCALIZACAO_PLACAS')
                AND P.modelo_origem   = :MODELO_ORIGEM
            ) x  

        ) where saldo_estoque > 0 and (saldo_peca > 0 or saldo_indisponivel > 0)

        order by saldo asc
    into
        ID,
        PRODUTO,
        ESTABELECIMENTO_ID,
        LOCALIZACAO_ID,
        SALDO,
        SALDO_INDISPONIVEL,
        SALDO_ALOCADO
    do begin
        if(QTD_SALDO > MINIMO and SALDO > 0)then
        begin

            if(QTD_SALDO > SALDO)then
            begin
                if((QTD_SALDO - MINIMO) > SALDO)then
                begin
                    QTD_GRAVAR = SALDO;
                end else
                begin
                   QTD_GRAVAR = (QTD_SALDO - MINIMO);
                end
            end else
            begin
                QTD_GRAVAR = (QTD_SALDO - MINIMO);
            end

            INSERT INTO TBREQUISICAO_PLACA_ALOCACAO (
                PRODUTO_ID, QTD, SALDO, REQUISICAO_PLACA_ID, ESTABELECIMENTO_ID, LOCALIZACAO_ID
            ) VALUES (
                :ID, :QTD_GRAVAR, :QTD_GRAVAR, fn_current_user_id() * -1, :ESTABELECIMENTO_ID, :LOCALIZACAO_ID
            );

            QTD_SALDO = QTD_SALDO - QTD_GRAVAR;
         end
    end

    QTD_GRAVAR = QUANTIDADE_REQUISITAR - QTD_SALDO;

    --exception "..." QUANTIDADE_REQUISITAR||' | '||QTD_SALDO||' | '||QTD_GRAVAR;

    if(QTD_GRAVAR > 0)then
    begin

        if(TALAO_DE_PLACA = 0)then
        begin
            ID_REQ = GEN_ID(GTBREQUISICAO_PLACA,1);
    
            INSERT INTO TBREQUISICAO_PLACA (
                ID,
                REQUISICAO_ID,
                QUANTIDADE,
                SALDO,
                STATUS,
                REMESSA,
                TALAO,
                DENSIDADE,
                ESPESSURA,
                LARGURA,
                COMPRIMENTO,
                COR_ID,
                SOBRA_ID,
                PARES,
                URGENTE,
                UP_ID,
                TIPO,
                DATA,
                DATAHORA
            ) VALUES (
                :ID_REQ,
                0,
                :QTD_GRAVAR,
                :QTD_GRAVAR,
                0,
                :REMESSA,
                :TALAO,
                :DENSIDADE,
                :ESPESSURA,
                :LARGURA,
                :COMPRIMENTO,
                :COR_ID,
                0,
                (:FATOR * :QTD_GRAVAR),
                0,
                :UP_ID,
                1,
                :DATA,
                :DATAHORA
            );
    
            update tbrequisicao_placa_alocacao a set a.REQUISICAO_PLACA_ID = :ID_REQ where a.REQUISICAO_PLACA_ID = fn_current_user_id() * -1;
            update TBESTOQUE_DETALHE_ALOCACAO b set b.alocacao_id = :ID_REQ where b.alocacao_id = fn_current_user_id() * -1 and b.tipo = 'L';

        end else
        begin

            TALAO_ID = coalesce((select first 1 p.id from tbremessa_item_processado p where p.remessa = :REMESSA and p.controle = :TALAO),0);
                
            if(QTD_SALDO = 0)then
            begin
                update tbremessa_item_processado p set p.situacao = 6 where p.remessa = :REMESSA and p.controle = :TALAO;
                update tbprogramacao s set s.status = 6 where s.tabela_id = :TALAO_ID and s.tipo = 'A' and s.remessa_id = :REMESSA;
                update tbpedido_item_processado p set p.situacao = 6 where p.remessa = :REMESSA and p.remessa_acumulado_controle = :TALAO and p.situacao <> 3 and p.situacao <> 6;

                update tbremessa_item_processado p set p.quantidade_original = p.quantidade where p.remessa = :REMESSA and p.controle = :TALAO   and p.quantidade_original is null;
                update tbremessa_item_processado p set p.quantidade          = 0 where p.remessa  = :REMESSA and p.controle = :TALAO;
                update tbpedido_item_processado  z set z.quantidade_pedido   = 0 where z.remessa  = :REMESSA and z.remessa_acumulado_controle = :TALAO;

            end else
            begin
                --update tbremessa_item_processado p set p.situacao = 0 where p.remessa = :REMESSA and p.controle = :TALAO;
                --update tbprogramacao s set s.status = 0 where s.tabela_id = :TALAO_ID and s.tipo = 'A' and s.remessa_id = :REMESSA;

                update tbremessa_item_processado p set p.quantidade_original = p.quantidade where p.remessa = :REMESSA and p.controle = :TALAO   and p.quantidade_original is null;
                update tbremessa_item_processado p set p.quantidade          = :QUANTIDADE_REQUISITAR - :QTD_GRAVAR  where p.remessa  = :REMESSA and p.controle = :TALAO;
                update tbpedido_item_processado  z set z.quantidade_pedido   = :QUANTIDADE_REQUISITAR - :QTD_GRAVAR  where z.remessa  = :REMESSA and z.remessa_acumulado_controle = :TALAO;
            end
        end

    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_COPIAR_PARAMETRO_OPERADOR (
    DE integer,
    PARA integer,
    LIMPAR integer = 0)
as
declare variable ID integer;
declare variable VALOR_EXT varchar(100);
begin

  if(LIMPAR = 1)then
  begin
    delete from tbcontrole_operador f where f.operador_id = :PARA;
  end

  for
    select
        p.id,
        p.valor_ext
    from tbcontrole_operador  p
    where p.operador_id = :DE
  into
    ID,
    VALOR_EXT
  do begin

     update or insert into TBCONTROLE_OPERADOR (OPERADOR_ID, ID, VALOR_EXT)
        values (:PARA, :ID, :VALOR_EXT)
     matching (OPERADOR_ID, ID);

  end

end
^

SET TERM ; ^

CREATE OR ALTER VIEW VWREMESSA_MODELO_TAMANHO(
    MODELO,
    QUANTIDADE,
    PROGRAMACAO_ESTEIRA,
    SITUACAO,
    TAM_DESCRICAO,
    REMESSA,
    CONTROLE,
    TIPO,
    LIB,
    STATUS,
    REQUISICAO,
    entrada_cd)
AS
SELECT P.descricao,R.quantidade,R.programacao_esteira,R.situacao,(Select Tam_Descricao From
Sp_Tamanho_Grade ((P.grade_codigo), R.tamanho)) Tam_Descricao, R.remessa,R.controle,t.tipo,lib,t.status,coalesce(t.requisicao,0) requisicao, r.entrada_cd
FROM tbproduto p, tbremessa_item_processado R,tbremessa t WHERE P.codigo = R.produto_codigo and t.numero = r.remessa;

