SET TERM ^ ;

CREATE OR ALTER procedure SPC_REQUISICAO_PLACA (
    REMESSA_ID integer,
    REMESSA_TALAO_ID integer)
returns (
    PRODUTO_CODIGO integer,
    DENSIDADE numeric(15,2),
    ESPESSURA numeric(15,2),
    LARGURA numeric(15,4),
    COMPRIMENTO numeric(15,4),
    COR_ID integer,
    COR_DESCRICAO varchar(100),
    SALDO numeric(15,2),
    PACA_QTD_PARES integer,
    ALOCADO integer,
    ESTABELECIMENTO_ID integer,
    LOCALIZACAO_ID integer)
as
declare variable MATRIZ_CODIGO integer;
declare variable TAMANHO integer;
declare variable MODELO_CODIGO integer;
declare variable MODELO_ORIGEM integer;
begin

    select
        MATRIZ_CODIGO,
        TAMANHO,
        PRODUTO_CODIGO,
        modelo_codigo,
        COR_CODIGO,
        COR_DESCRICAO,
        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
    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
        MATRIZ_CODIGO,
        TAMANHO,
        PRODUTO_CODIGO,
        MODELO_CODIGO,
        COR_ID,
        COR_DESCRICAO,
        LARGURA,
        COMPRIMENTO,
        PACA_QTD_PARES,
        DENSIDADE,
        ESPESSURA;

    MATRIZ_CODIGO = coalesce(MATRIZ_CODIGO,0);

    MODELO_ORIGEM = coalesce((select first 1
                                   p.modelo_codigo
                                from tbmodelo_consumo_cor c, tbproduto p
                                where c.modelo_id = :MODELO_CODIGO
                                and c.cor_id = :COR_ID
                                and p.codigo = c.produto_id
                                and c.nivel = 0),0);

    if(MODELO_ORIGEM = 0)then
    begin
        exception "..." 'MODELO DE ORIGEM NÃO ENCONTRADO, REM: '||coalesce(REMESSA_ID,0)||', TAL:'||coalesce(REMESSA_TALAO_ID,0)||', MOD:'||coalesce(:MODELO_CODIGO,0)||', COR:'||coalesce(:COR_ID,0);
    end

    if(MATRIZ_CODIGO = 0)then
    begin
        exception "..." 'MATRIZ NAO ENCONTRADA. REM:'||coalesce(REMESSA_ID,'')||', TAL:'||coalesce(REMESSA_TALAO_ID,'');
    end

    for
        select
            ID,
            ESTABELECIMENTO_ID,
            LOCALIZACAO_ID,
            iif(saldo_estoque > saldo_peca, saldo_peca, saldo_estoque) as saldo,
            saldo_ALOCADO AS ALOCADO
        from(
            select
                a.*
            FROM(

                SELECT
                    (f.LARGURA - :LARGURA) DIF_LARGURA,
                    (f.COMPRIMENTO - :COMPRIMENTO) DIF_comprimento,
                    ((f.LARGURA - :LARGURA) + (f.COMPRIMENTO - :COMPRIMENTO)) as DIF_TOTAL,
                    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(e.saldo) from VWESTOQUE_PLACA e where e.produto_id = p.codigo),0) as saldo_peca
        
                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

            ) a order by a.DIF_TOTAL ascending
            
      ) where saldo_estoque > 0 and saldo_peca > 0

      order by saldo asc

    into
        :PRODUTO_CODIGO,
        :ESTABELECIMENTO_ID,
        :LOCALIZACAO_ID,
        :SALDO,
        :ALOCADO
    do begin
        suspend;
    end


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;
declare variable SALDO_ESTOQUE integer;
declare variable SALDO_PECA integer;
declare variable SALDO_JA_BAIXADO integer;
begin

    QTD_SALDO = QUANTIDADE_REQUISITAR;

    for
        SELECT
            ID,
            PRODUTO,
            ESTABELECIMENTO_ID,
            LOCALIZACAO_ID,
            SALDO_ESTOQUE,
            saldo_peca,
            --iif(saldo_estoque > saldo_indisponivel, saldo_estoque - saldo_indisponivel, 0) as saldo,
            iif(saldo_estoque > saldo_peca, saldo_peca - saldo_indisponivel - SALDO_JA_BAIXADO, saldo_estoque - saldo_indisponivel - SALDO_JA_BAIXADO) as saldo,
            SALDO_INDISPONIVEL,
            saldo_ALOCADO AS ALOCADO,
            SALDO_JA_BAIXADO
        from(
            SELECT
                ID,
                PRODUTO,
                ESTABELECIMENTO_ID,
                LOCALIZACAO_ID,
                iif(SALDO_ALOCADO_INI >= 0, (SALDO_ESTOQUE - SALDO_ALOCADO_INI), (SALDO_ESTOQUE - SALDO_ALOCADO)) as SALDO_ESTOQUE,
                SALDO_ALOCADO,
                SALDO_JA_BAIXADO,
                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
                    (f.LARGURA - :LARGURA) DIF_LARGURA,
                    (f.COMPRIMENTO - :COMPRIMENTO) DIF_comprimento,
                    ((f.LARGURA - :LARGURA) + (f.COMPRIMENTO - :COMPRIMENTO)) as DIF_TOTAL,

                    p.DESCRICAO as PRODUTO,
                    s.estabelecimento_codigo as ESTABELECIMENTO_ID, s.codigo as LOCALIZACAO_ID,
                    p.codigo as ID,
                    FN_ESTOQUE_SALDO(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(k.baixado) from TMPCALC_PLACA k where k.remessa_id = :REMESSA and k.produto_id = P.codigo),0) SALDO_JA_BAIXADO,
                    coalesce((select first 1 k.alocado from TMPCALC_PLACA k where k.remessa_id = :REMESSA and k.produto_id = P.codigo order by k.id ascending),-1) SALDO_ALOCADO_INI,
                    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

                order by f.largura ascending, f.comprimento ascending

            ) x order by x.DIF_TOTAL ascending

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

        order by saldo asc
    into
        ID,
        PRODUTO,
        ESTABELECIMENTO_ID,
        LOCALIZACAO_ID,
        SALDO_ESTOQUE,
        SALDO_PECA,
        SALDO,
        SALDO_INDISPONIVEL,
        SALDO_ALOCADO,
        SALDO_JA_BAIXADO
    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 TMPCALC_PLACA (PRODUTO_ID, PRODUTO, ESTABELECIMENTO_ID, LOCALIZACAO_ID, SALDO_ESTOQUE, SALDO_PECA, SALDO, SALDO_INDISPONIVEL, ALOCADO, REMESSA_ID, BAIXADO)
            values (:ID, :PRODUTO, :ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :SALDO_ESTOQUE, :SALDO_PECA, :SALDO, :SALDO_INDISPONIVEL, :SALDO_ALOCADO, :REMESSA, :QTD_GRAVAR);

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

            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 ; ^

