CREATE INDEX ITBESTOQUE_DETALHE_ALOCACAO_07
ON TBESTOQUE_DETALHE_ALOCACAO (ALOCACAO_ID);

DROP INDEX ITBESTOQUE_DETALHE_ALOCACAO_07;

CREATE INDEX ITBESTOQUE_DETALHE_ALOCACAO_07
ON TBESTOQUE_DETALHE_ALOCACAO (ALOCACAO_ID,TIPO);

CREATE INDEX ITBMODELO_CONSUMO_COR_30
ON TBMODELO_CONSUMO_COR (MODELO_ID,COR_ID,PRODUTO_ID,NIVEL);

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 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;
declare variable VINCULO_ID integer;
declare variable QTD_ALOCADO integer;
declare variable QTD_SALDO integer;
declare variable USUARIO_ID_BANCO integer;
declare variable TEMP_ID integer;
begin

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

    USUARIO_ID_BANCO = fn_current_user_id();

    TEMP_ID = :USUARIO_ID_BANCO * -1;

    FOR
        select
            ESTABELECIMENTO_ID,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            PRODUTO_ID,
            TAMANHO,
            QUANTIDADE,
            ORDEM,
            UP_ID,
            QUANTIDADE_SOBRA,
            DATA,
            DATAHORA
        from(
            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
            )
    
            union all
    
            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 between 9000 and 9999
                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;

                delete from tbrequisicao_placa_alocacao a where a.REQUISICAO_PLACA_ID = :TEMP_ID;
                delete from TBESTOQUE_DETALHE_ALOCACAO b where b.alocacao_id = :TEMP_ID and b.tipo = 'L';

                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;

                delete from tbrequisicao_placa_alocacao a where a.REQUISICAO_PLACA_ID = :TEMP_ID;
                delete from TBESTOQUE_DETALHE_ALOCACAO b where b.alocacao_id = :TEMP_ID and b.tipo = 'L';

               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

    for
        SELECT
            f.id
        from(
            select
                h.*
            from(
                select
                    vinculo,
                    coalesce(cast(fn_array(DENESP,1,'|') as numeric(15,4)),0) as DEN,
                    coalesce(cast(fn_array(DENESP,2,'|') as numeric(15,4)),0) as ESP,
                    h.*
                from(
                    select
                        f.id as vinculo,
                        fn_densidade_espessura_v3(p.modelo_origem,p.cor_codigo) as DENESP,
                        f.requisicao_placa_id
                    from TBREQUISICAO_PLACA_ALOCACAO f, tbproduto p
                    where f.saldo > 0
                    and p.codigo = f.produto_id
                ) a, tbrequisicao_placa h
                
                where h.id = a.requisicao_placa_id
                and h.status < 2
                and h.remessa = :remessa_id
            ) h
             where DEN <> h.densidade or ESP <> h.espessura
        ) h, TBREQUISICAO_PLACA_ALOCACAO f
        where f.id = h.vinculo
    into :VINCULO_ID
    do begin
       exception "..." 'Erro ao gerar aproveitamento, entre em contato com o suporte técnico (1)';
    end

    /*
    for
        SELECT
            h.id
        from(
            select
                h.id
            from(
                select
                    h.*,
                    a.QTD
                from(
                    select
                        f.requisicao_placa_id,
                        sum(f.qtd) as QTD
                    from TBREQUISICAO_PLACA_ALOCACAO f
        
                    group by 1
                ) a, tbrequisicao_placa h
                where h.id = a.requisicao_placa_id
                and h.status < 2
                and h.remessa = :remessa_id
            ) h
             where h.QTD <> h.quantidade
        ) h
    into :VINCULO_ID
    do begin
       exception "..." 'Erro ao gerar aproveitamento, entre em contato com o suporte técnico (2)';
    end

    for
        select
            produto_id,
            QTD as qtd_alocado,
            saldos as qtd_saldo
        from(
            select
                p.produto_id,
                QTD,
                coalesce((select sum(iif(ABERTO = 0,e.saldo, 0)) from VWESTOQUE_PLACA_V2 e where e.produto_id = p.produto_id),0) as saldos
            from(
                select
                    a.produto_id,
                    sum(a.qtd) as QTD
                from tbrequisicao_placa p, tbrequisicao_placa_alocacao a
                where p.remessa = :I_REMESSA_ID
                and a.requisicao_placa_id = p.id
                and a.saldo > 0
                and p.saldo > 0
                group by 1
            ) p
        ) where QTD > saldos
    into :PRODUTO_ID, :QTD_ALOCADO, :QTD_SALDO
    do begin
       exception "..." 'Quantidade alocada do produto '||coalesce(PRODUTO_ID,0)||' maior que o disponivel. Alocado:'||coalesce(QTD_ALOCADO,0)||', Disponivel:'||coalesce(QTD_SALDO,0);
    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;
declare variable SALDO_ESTOQUE integer;
declare variable SALDO_PECA integer;
declare variable SALDO_JA_BAIXADO integer;
declare variable USUARIO_ID_BANCO integer;
declare variable TEMP_ID integer;
begin

    QTD_SALDO = QUANTIDADE_REQUISITAR;

    USUARIO_ID_BANCO = fn_current_user_id();
    TEMP_ID = :USUARIO_ID_BANCO * -1;


    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, :USUARIO_ID_BANCO * -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 = :TEMP_ID;
            update TBESTOQUE_DETALHE_ALOCACAO b set b.alocacao_id = :ID_REQ where b.alocacao_id = :TEMP_ID 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 SPI_REMESSA_CONSUMO_BOJO (
    I_REMESSA_ID integer,
    I_MP_FAMILIA_ID integer)
as
declare variable ESTABELECIMENTO_ID integer;
declare variable REMESSA_ID integer;
declare variable MP_FAMILIA_ID integer;
declare variable REQUISICAO char(1);
declare variable V_LIMITE numeric(15,4) = 99999;
declare variable APROVEITAMENTO_TALAO_ID integer;
declare variable MATRIZ_DESCRICAO varchar(320);
declare variable MATRIZ_COEFICIENTE numeric(18,5);
declare variable MATRIZ_LARGURA numeric(18,5);
declare variable MATRIZ_PLACA numeric(18,5);
declare variable MATRIZ_SOBRA numeric(18,5);
declare variable MATRIZ_QUANTIDADE_POR_PLACA numeric(18,5);
declare variable MATRIZ_QUANTIDADE_CHAPA numeric(18,5);
declare variable CALC_CHAPA numeric(15,5);
declare variable RESTO numeric(15,5);
declare variable IDENT_PROD_TAM_MTZ integer;
declare variable TALAO_ID integer;
declare variable REMESSA_TALAO_ID integer;
declare variable MODELO_ID integer;
declare variable MODELO_DENSIDADE numeric(18,4);
declare variable MODELO_ESPESSURA numeric(18,4);
declare variable MATRIZ_ID integer;
declare variable PRODUTO_ID integer;
declare variable TAMANHO integer;
declare variable TAMANHO_DESCRICAO varchar(40);
declare variable QUANTIDADE numeric(18,5);
declare variable QUANTIDADE_SOBRA numeric(18,4);
declare variable CONSUMO_QUANTIDADE numeric(18,4);
declare variable CHAPAS numeric(18,5);
declare variable PLACAS numeric(18,5);
declare variable SOBRAS numeric(18,5);
declare variable GRADE_ID integer;
declare variable APROVEITAMENTO numeric(18,4);
declare variable REQ_SOBRA numeric(18,5);
declare variable FAMILIA_INVENTARIO integer;
declare variable ALT_DENSIDADE numeric(15,4);
declare variable ALT_ESPESSURA numeric(15,4);
declare variable LARGURA numeric(15,4);
declare variable COMPRIMENTO numeric(15,4);
declare variable ML numeric(15,2);
declare variable ALT_PRODUTO integer;
declare variable ALT_TAMANHO integer;
declare variable TAMANHO_CHAPA numeric(15,2);
declare variable TMP integer;
declare variable REQUISICAO_ID integer;
declare variable SOBRA_PLACA numeric(15,4);
declare variable QUANTIDADE_PLACA integer;
declare variable REQ_PLACA integer;
declare variable TMP_ID integer;
declare variable USER_DB_ID integer;
BEGIN
     
    --DELETE FROM TBREMESSA_CONSUMO C WHERE C.REMESSA = :I_REMESSA_ID;

    USER_DB_ID = fn_current_user_id();
    TMP_ID = USER_DB_ID * -1;

    UPDATE TBREMESSA_CONSUMO C SET C.REMESSA = :TMP_ID  WHERE C.REMESSA = :I_REMESSA_ID;

    UPDATE VWREMESSA
       SET FAMILIA_ID_MP = -1--:I_MP_FAMILIA_ID
     WHERE REMESSA_ID    = :I_REMESSA_ID;

    SELECT FIRST 1
        R.ESTABELECIMENTO_ID,
        R.REMESSA_ID,
        R.FAMILIA_ID_MP,
        R.REQUISICAO
    FROM
        VWREMESSA R
    WHERE
        R.REMESSA_ID = :I_REMESSA_ID
    INTO
        :ESTABELECIMENTO_ID,
        :REMESSA_ID,
        :MP_FAMILIA_ID,
        :REQUISICAO;

    IF ( NOT (COALESCE(MP_FAMILIA_ID,0) > 0)  ) THEN
    BEGIN
--        EXCEPTION "..." 'REMESSA SEM FAMILIA DE CONSUMO DEFINIDA';
    END

    /**
     * Realiza a verificacao de sobras
     */
    --EXECUTE PROCEDURE SPI_REMESSA_SOBRA(:REMESSA_ID);

    /**
     * Realiza o calculo de consumo
     */
    FOR
        SELECT
            ROW_NUMBER() OVER (PARTITION BY PRODUTO_ID,TAMANHO,MATRIZ_ID ORDER BY PERFIL,MODELO_DENSIDADE,MODELO_ESPESSURA,CLASSE,COR_DESCRICAO,PRODUTO_ID,TAMANHO,MATRIZ_ID,REMESSA_TALAO_ID) IDENT_PROD_TAM_MTZ,
            TALAO_ID,
            REMESSA_TALAO_ID,
            MODELO_ID,
            MODELO_DENSIDADE,
            MODELO_ESPESSURA,
            MATRIZ_ID,
            PRODUTO_ID,
            GRADE_ID,
            TAMANHO,
            TAMANHO_DESCRICAO,
            QUANTIDADE,
            QUANTIDADE_SOBRA,
            QUANTIDADE_PLACA,
            familia_inventario,
            alt_densidade,
            alt_espessura,
            largura,
            comprimento,
            requisicao_id
    
        FROM (
            SELECT
                X.TALAO_ID,
                X.REMESSA_TALAO_ID,
                X.MODELO_ID,
                CAST(SUBSTRING(X.DENS_ESPESS FROM 1 FOR 5) AS INTEGER)  MODELO_DENSIDADE,
                CAST(SUBSTRING(X.DENS_ESPESS FROM 6 FOR 5) AS NUMERIC(15,2))  MODELO_ESPESSURA,
                X.MATRIZ_ID,
                X.PRODUTO_ID,
                X.TAMANHO,  
                X.TAMANHO_DESCRICAO,
                X.QUANTIDADE,
                X.QUANTIDADE_SOBRA,
                x.QUANTIDADE_PLACA,

                X.LIB,
                X.GRADE_ID,
                X.CLASSE,
                (SELECT FIRST 1 C.DESCRICAO FROM TBCOR C WHERE C.CODIGO = X.COR_ID) COR_DESCRICAO,
                X.SEQ,
                X.PERFIL,
                x.familia_inventario,
                x.alt_densidade,
                x.alt_espessura,
                x.largura,
                x.comprimento,
                x.requisicao_id

            FROM (
            
                SELECT
                    A.ID TALAO_ID,
                    A.REMESSA REMESSA_ID,
                    A.CONTROLE REMESSA_TALAO_ID,
                    A.MODELO_CODIGO MODELO_ID,
                    P.GRADE_CODIGO GRADE_ID,
                    A.MATRIZ_CODIGO MATRIZ_ID,
                    A.PRODUTO_CODIGO PRODUTO_ID,
                    P.COR_CODIGO COR_ID,
                    A.TAMANHO,
                    A.QUANTIDADE,
                    COALESCE(A.LIB,'0') LIB,
                    A.SEQ,

                    COALESCE((SELECT SUM(S.QUANTIDADE)
                                FROM TBREQUISICAO_SOBRA S
                               WHERE S.REMESSA       = A.REMESSA
                                 AND S.TALAO         = A.CONTROLE
                                 AND S.REQUISICAO_ID = 0),0.0000) QUANTIDADE_SOBRA,

                   COALESCE((SELECT SUM(S2.pares)
                                FROM TBREQUISICAO_PLACA S2
                               WHERE S2.REMESSA       = A.REMESSA
                                 AND S2.TALAO         = A.CONTROLE
                                 AND S2.REQUISICAO_ID = 0
                                 AND S2.TIPO = 1),0.0000) QUANTIDADE_PLACA,
                
                   (SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE (P.GRADE_CODIGO,A.TAMANHO)) TAMANHO_DESCRICAO,
                
                    IIF(A.ESPESSURA > 0 AND A.DENSIDADE > 0, LPAD(A.DENSIDADE,5,'0')||LPAD(A.ESPESSURA,5,'0'),
                    IIF(M.ESPESSURA > 0 AND M.DENSIDADE > 0, LPAD(M.DENSIDADE,5,'0')||LPAD(M.ESPESSURA,5,'0'),
                    COALESCE(
                    (SELECT FIRST 1
                            COALESCE((SELECT FIRST 1
                                        LPAD(M.DENSIDADE,5,'0')||LPAD(M.ESPESSURA,5,'0')
                                        FROM TBMODELO M
                                       WHERE M.CODIGO = P2.MODELO_CODIGO),'0000000000')
                       FROM TBMODELO_CONSUMO_COR MC, TBFAMILIA F, TBPRODUTO P2
                      WHERE MC.MODELO_ID = A.MODELO_CODIGO
                        AND MC.COR_ID = P.COR_CODIGO
                        AND MC.PRODUTO_ID = P2.CODIGO
                        AND P2.FAMILIA_CODIGO = F.CODIGO
                        AND F.DENSIDADE_ESPESSURA = '1'
                        AND((A.TAMANHO = 1 AND MC.T01 > 0) OR
                            (A.TAMANHO = 2 AND MC.T02 > 0) OR
                            (A.TAMANHO = 3 AND MC.T03 > 0) OR
                            (A.TAMANHO = 4 AND MC.T04 > 0) OR
                            (A.TAMANHO = 5 AND MC.T05 > 0) OR
                            (A.TAMANHO = 6 AND MC.T06 > 0) OR
                            (A.TAMANHO = 7 AND MC.T07 > 0) OR
                            (A.TAMANHO = 8 AND MC.T08 > 0) OR
                            (A.TAMANHO = 9 AND MC.T09 > 0) OR
                            (A.TAMANHO =10 AND MC.T10 > 0) OR
                            (A.TAMANHO =11 AND MC.T11 > 0) OR
                            (A.TAMANHO =12 AND MC.T12 > 0) OR
                            (A.TAMANHO =13 AND MC.T13 > 0) OR
                            (A.TAMANHO =14 AND MC.T14 > 0) OR
                            (A.TAMANHO =15 AND MC.T15 > 0) OR
                            (A.TAMANHO =16 AND MC.T16 > 0) OR
                            (A.TAMANHO =17 AND MC.T17 > 0) OR
                            (A.TAMANHO =18 AND MC.T18 > 0) OR
                            (A.TAMANHO =19 AND MC.T19 > 0) OR
                            (A.TAMANHO =20 AND MC.T20 > 0))),'0000000000'))) DENS_ESPESS,

                    (SELECT FIRST 1 COALESCE(C.CLASSE||'.'||LPAD(C.SUBCLASSE,3,'0'),'0.000') FROM TBCOR C WHERE P.COR_CODIGO = C.CODIGO) CLASSE,
                    (SELECT FIRST 1 COALESCE(C.PERFIL,'') FROM TBCOR C WHERE P.COR_CODIGO = C.CODIGO) PERFIL,
                    p.familia_inventario,
                    h.densidade as alt_densidade,
                    h.espessura as alt_espessura,
                    h.largura,
                    h.comprimento,
                    a.requisicao_id

                FROM TBREMESSA_ITEM_PROCESSADO A
                LEFT JOIN TBPRODUTO P ON A.PRODUTO_CODIGO = P.CODIGO
                LEFT JOIN TBMODELO M ON A.MODELO_CODIGO = M.CODIGO
                LEFT JOIN tbproduto_ficha h ON h.produto_codigo = A.PRODUTO_CODIGO
                WHERE A.REMESSA = :REMESSA_ID
    
                ) X
    
            ORDER BY PERFIL,MODELO_DENSIDADE,MODELO_ESPESSURA,CLASSE,COR_DESCRICAO,PRODUTO_ID,TAMANHO,MATRIZ_ID,REMESSA_TALAO_ID
            ) Y

            WHERE (QUANTIDADE - QUANTIDADE_SOBRA) > 0
    INTO
        :IDENT_PROD_TAM_MTZ,
        :TALAO_ID,
        :REMESSA_TALAO_ID,
        :MODELO_ID,
        :MODELO_DENSIDADE,
        :MODELO_ESPESSURA,
        :MATRIZ_ID,
        :PRODUTO_ID,
        :GRADE_ID,
        :TAMANHO,
        :TAMANHO_DESCRICAO,
        :QUANTIDADE,
        :QUANTIDADE_SOBRA,
        :QUANTIDADE_PLACA,
        :FAMILIA_INVENTARIO,
        :ALT_DENSIDADE,
        :ALT_ESPESSURA,
        :LARGURA,
        :COMPRIMENTO,
        :requisicao_id
    do BEGIN

        if(FAMILIA_INVENTARIO = fn_parametro('SISTEMA.FAMILIA_PLACA'))then
        begin
            ML = 1;

            QUANTIDADE = QUANTIDADE - QUANTIDADE_PLACA;

            if(QUANTIDADE > 0)then
            begin

                select first 1
                    p1.codigo
                from tbproduto p1, tbproduto p2
                where p1.modelo_codigo = p2.modelo_origem
                and p2.codigo = :PRODUTO_ID
                and p1.cor_codigo = p2.cor_codigo
                into :ALT_PRODUTO;

                if(requisicao_id > 0)then
                begin
                    --se origem for requisicao
                    select first 1
                        r.tamanho_origem,
                        replace(fn_tamanho_produto(:ALT_PRODUTO, r.tamanho_origem),',','.')
                    from tbrequisicao r where r.id = :requisicao_id
                    into :ALT_TAMANHO, TAMANHO_CHAPA;
                end else
                begin
                    --se origem for talao normal (quando for aproveitamento de placa)
                    select first 1
                        c2.tamanho,
                        replace(fn_tamanho_produto(c2.produto_id, c2.tamanho),',','.')
                    from VWREMESSA_CONSUMO c2
                    where c2.remessa_id = :TMP_ID
                    and c2.remessa_talao_id = :remessa_talao_id
                    into :ALT_TAMANHO, TAMANHO_CHAPA;

                    ALT_TAMANHO = coalesce(ALT_TAMANHO,0);

                    if(ALT_TAMANHO < 1)then
                    begin
                        --exception "..." 'TAMANHO DE ORIGEM DA PLACA NAO ENCONTRADO. TL:'||:REMESSA_TALAO_ID;
                        ALT_TAMANHO = 13;
                        TAMANHO_CHAPA = 1.6;
                    end
                end

                if(not (:TAMANHO_CHAPA > 0))then
                begin
                    exception "..." 'TAMANHO DE ORIGEM DA PLACA NAO ENCONTRADO. TL:'||:REMESSA_TALAO_ID;
                end

                chapas = TAMANHO_CHAPA / :comprimento;
                TMP    = chapas;
                if(chapas <> TMP)then
                begin
                    IF(chapas < TMP)THEN
                    BEGIN
                        SOBRA_PLACA = (chapas+1) - TMP;
                        SOBRA_PLACA = SOBRA_PLACA * comprimento;
                        chapas = TMP - 1;
                    END ELSE
                    BEGIN
                        SOBRA_PLACA = TMP - chapas;
                        SOBRA_PLACA = SOBRA_PLACA * comprimento;
                        chapas = TMP;
                    END
                end ELSE
                BEGIN
                    SOBRA_PLACA = 0;
                END

                MATRIZ_QUANTIDADE_POR_PLACA = :chapas;

                chapas = quantidade / chapas;
                TMP    = chapas;
                if(chapas <> TMP)then
                begin
                    IF(chapas < TMP)THEN
                    BEGIN
                        chapas = TMP + 1;
                    END ELSE
                    BEGIN
                        chapas = TMP;
                    END
                end

                if(chapas = 0)then
                begin
                    chapas = 1;
                end

                IF(SOBRA_PLACA <= 0.2)THEN
                BEGIN
                   SOBRA_PLACA = 0;
                   :sobras = 0;
                END ELSE
                BEGIN
                   sobras = chapas;
                END

                quantidade = chapas * MATRIZ_QUANTIDADE_POR_PLACA;

                ML = chapas * :largura;

                update tbremessa_item_processado p
                    set p.placas        = :quantidade,
                    p.chapas            = :chapas,
                    PLACA_LARGURA       = :largura,
                    PLACA_COMPRIMENTO   = :comprimento,
                    PLACA_POR_CHAPA     = :MATRIZ_QUANTIDADE_POR_PLACA,
                    TOLERANCIA          = :quantidade,
                    CONSUMO_MEDIO       = :ML,
                    SOBRAS              = :sobras,
                    PLACA_TAM_SOBRA     = :SOBRA_PLACA

                where p.remessa = :REMESSA_ID and p.controle = :REMESSA_TALAO_ID;

                UPDATE OR INSERT INTO
                    VWREMESSA_CONSUMO (
                        ESTABELECIMENTO_ID,
                        REMESSA_ID,
                        REMESSA_TALAO_ID,
                        CONTROLE,
                        LOCALIZACAO_ID,
                        PRODUTO_ID,
                        TAMANHO,
                        DENSIDADE,
                        ESPESSURA,
                        QUANTIDADE_ORIGINAL,
                        QUANTIDADE_NECES,
                        QUANTIDADE_NECES_ALTERN,
                        QUANTIDADE,
                        QUANTIDADE_ALTERNATIVA,
                        SALDO_BAIXAR,
                        COMPONENTE
                    ) VALUES (
                        :ESTABELECIMENTO_ID,
                        :REMESSA_ID,
                        :REMESSA_TALAO_ID,
                        1,
                        fn_parametro('SISTEMA.LOCALIZACAO_PLACAS'),
                        :ALT_PRODUTO,
                        :ALT_TAMANHO,
                        :ALT_DENSIDADE,
                        :ALT_ESPESSURA,
                        :ML,
                        :ML,
                        0,
                        :ML,
                        0,
                        :ML,
                        '0'
                    ) MATCHING (
                        ESTABELECIMENTO_ID,
                        REMESSA_ID,
                        REMESSA_TALAO_ID,
                        PRODUTO_ID,
                        TAMANHO
                    );

             end else
             begin
                update tbremessa_item_processado p
                    set p.placas        = 0,
                    p.chapas            = 0,
                    PLACA_LARGURA       = :largura,
                    PLACA_COMPRIMENTO   = :comprimento,
                    PLACA_POR_CHAPA     = :MATRIZ_QUANTIDADE_POR_PLACA,
                    TOLERANCIA          = 0,
                    CONSUMO_MEDIO       = 0,
                    SOBRAS              = 0,
                    PLACA_TAM_SOBRA     = 0

                where p.remessa = :REMESSA_ID and p.controle = :REMESSA_TALAO_ID;
             end

        end else
        begin

            IF ( NOT (COALESCE(MODELO_DENSIDADE,0) > 0) ) THEN
            BEGIN
                EXCEPTION "..." 'TALAO ' || LPAD(REMESSA_TALAO_ID,4,'0') || ' SEM DENSIDADE DE DEFINIDA';
            END
    
    
            IF ( NOT (COALESCE(MODELO_ESPESSURA,0) > 0) ) THEN
            BEGIN
                EXCEPTION "..." 'TALAO ' || LPAD(REMESSA_TALAO_ID,4,'0') || ' SEM ESPESSURA DE DEFINIDA';
            END
    
            IF ( IDENT_PROD_TAM_MTZ = 1 OR REQUISICAO = '1' ) THEN
            BEGIN
                APROVEITAMENTO = 0;
            END
    
            APROVEITAMENTO_TALAO_ID =
            (SELECT FIRST 1 P.ID
               FROM TBREMESSA_ITEM_PROCESSADO P
              WHERE P.REMESSA = :REMESSA_ID
                AND P.MATRIZ_CODIGO = :MATRIZ_ID
                AND P.PRODUTO_CODIGO = :PRODUTO_ID
                AND P.TAMANHO = :TAMANHO
              ORDER BY P.CONTROLE DESC);
    
            FOR
                SELECT
                    MATRIZ_DESCRICAO,
                    COEFICIENTE     MATRIZ_COEFICIENTE,
                    LARGURA         MATRIZ_LARGURA,
                    PLACA           MATRIZ_PLACA,
                    SOBRA           MATRIZ_SOBRA,
                    QUANTIDADE      MATRIZ_QUANTIDADE_POR_PLACA,
                    (PLACA * QUANTIDADE + SOBRA) MATRIZ_QUANTIDADE_CHAPA
                FROM
                    SPC_REMESSA_CONSUMO_MATRIZ(:MATRIZ_ID,:GRADE_ID,:TAMANHO)
    
            INTO
                :MATRIZ_DESCRICAO,
                :MATRIZ_COEFICIENTE,
                :MATRIZ_LARGURA,
                :MATRIZ_PLACA,
                :MATRIZ_SOBRA,
                :MATRIZ_QUANTIDADE_POR_PLACA,
                :MATRIZ_QUANTIDADE_CHAPA
            DO
            BEGIN
                
                IF ( NOT (MATRIZ_QUANTIDADE_POR_PLACA > 0)  ) THEN
                BEGIN
                    EXCEPTION "..." 'TALAO ' || LPAD(REMESSA_TALAO_ID,4,'0') || ' - MATRIZ: ' || LPAD(MATRIZ_ID,5,'0') || ' - ' || MATRIZ_DESCRICAO || ' NO TAMANHO: [' || TAMANHO_DESCRICAO || '] ESTA SEM FATOR DE CONVERSAO OU QUANTIDADE DEFINIDA.';
                END
    
                CHAPAS = 0;
                PLACAS = 0;
                SOBRAS = 0;
    
                REQ_SOBRA = IIF( QUANTIDADE_SOBRA > 0, TRUNC(QUANTIDADE_SOBRA / MATRIZ_QUANTIDADE_CHAPA) * MATRIZ_QUANTIDADE_CHAPA, 0);
                REQ_PLACA = IIF( QUANTIDADE_PLACA > 0, TRUNC(QUANTIDADE_PLACA / MATRIZ_QUANTIDADE_CHAPA) * MATRIZ_QUANTIDADE_CHAPA, 0);


                CONSUMO_QUANTIDADE = QUANTIDADE - REQ_SOBRA - REQ_PLACA - IIF(REMESSA_TALAO_ID < 8000, IIF(APROVEITAMENTO_TALAO_ID = TALAO_ID, APROVEITAMENTO,0), 0);
    
                IF ( (QUANTIDADE > (REQ_SOBRA + REQ_PLACA)) AND CONSUMO_QUANTIDADE > 0 AND MATRIZ_COEFICIENTE > 0 ) THEN
                BEGIN
                    CALC_CHAPA = (MATRIZ_PLACA * MATRIZ_QUANTIDADE_POR_PLACA) + MATRIZ_SOBRA;
    
                    IF ( TRUNC( CONSUMO_QUANTIDADE / CALC_CHAPA ) = (CONSUMO_QUANTIDADE / CALC_CHAPA) ) THEN
                    BEGIN
                        CALC_CHAPA = CONSUMO_QUANTIDADE / CALC_CHAPA;
                        CHAPAS = CALC_CHAPA;
                        PLACAS = MATRIZ_PLACA * CALC_CHAPA;
                        SOBRAS = IIF( MATRIZ_SOBRA > 0, CALC_CHAPA, 0);
                    END
                    ELSE
                    BEGIN
                        CHAPAS = TRUNC(CONSUMO_QUANTIDADE/CALC_CHAPA) + IIF(QUANTIDADE - REQ_SOBRA <= V_LIMITE, 1,0);
                        PLACAS = MATRIZ_PLACA * TRUNC(CONSUMO_QUANTIDADE/CALC_CHAPA);
                        SOBRAS = IIF( MATRIZ_SOBRA > 0, TRUNC(CONSUMO_QUANTIDADE/CALC_CHAPA),0 );
    
                        IF ( QUANTIDADE - REQ_SOBRA <= V_LIMITE ) THEN
                        BEGIN
                            RESTO = CONSUMO_QUANTIDADE - ( PLACAS * MATRIZ_QUANTIDADE_POR_PLACA ) - ( SOBRAS * MATRIZ_SOBRA );
    
                            IF ( TRUNC( RESTO / MATRIZ_QUANTIDADE_POR_PLACA ) = ( RESTO / MATRIZ_QUANTIDADE_POR_PLACA ) ) THEN
                            BEGIN
                                PLACAS = PLACAS + ( RESTO / MATRIZ_QUANTIDADE_POR_PLACA );
                            END
                            ELSE
                            BEGIN
                                IF ( SOBRAS > 0 ) THEN
                                BEGIN
                                    PLACAS = PLACAS + (TRUNC(RESTO / MATRIZ_QUANTIDADE_POR_PLACA));
                                    SOBRAS = CHAPAS;
    
                                END
                                ELSE
                                BEGIN
                                    PLACAS = PLACAS + (TRUNC(RESTO / MATRIZ_QUANTIDADE_POR_PLACA)+1);
                                END
    
                            END
                            
    
                        END
                    END
    
                    
    
                END
    
                EXECUTE PROCEDURE SPU_REMESSA_PEDIDO_TALAO6(
                    ESTABELECIMENTO_ID,
                    REMESSA_ID, 
                    REMESSA_TALAO_ID, 
                    CHAPAS,
                    PLACAS,
                    SOBRAS,
                    IIF( TRUNC((MATRIZ_PLACA * CHAPAS) - PLACAS) > 0 , TRUNC((MATRIZ_PLACA * CHAPAS)-PLACAS), 0),
                    IIF( MATRIZ_SOBRA > 0 , (TRUNC(CHAPAS) - SOBRAS), 0),
                    CONSUMO_QUANTIDADE,
                    IIF(REMESSA_TALAO_ID < 8000, IIF( TALAO_ID = APROVEITAMENTO_TALAO_ID, APROVEITAMENTO / MATRIZ_QUANTIDADE_POR_PLACA, 0),0),
                    ((CHAPAS * MATRIZ_LARGURA)+(CHAPAS*0.001)),
                    MODELO_ESPESSURA,
                    MODELO_DENSIDADE
                );
    
                EXECUTE PROCEDURE SPI_REMESSA_CONSUMO_MATRIZ_V7(
                    :REMESSA_ID,
                    :REMESSA_TALAO_ID
                );
    
                APROVEITAMENTO = APROVEITAMENTO + ((TRUNC((MATRIZ_PLACA * CHAPAS ) - PLACAS) ) * MATRIZ_QUANTIDADE_POR_PLACA);
    
            END

        END

    END

    DELETE FROM TBREMESSA_CONSUMO C WHERE C.REMESSA = :TMP_ID;

    EXECUTE PROCEDURE SPI_HISTORICO('TBREMESSA',:REMESSA_ID,'CALCULO DE CONSUMO / CALCULO DE APROVEITAMENTO PROCESSADO');
                
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_FERRAMENTA_PAINEL
returns (
    PRODUTO_ID integer,
    QUANTIDADE numeric(18,4),
    TAMANHO varchar(50),
    MODELO_ID integer,
    COR integer,
    REMESSA varchar(15),
    TALAO integer,
    MODELOS varchar(300),
    REQUISICAO varchar(10),
    PROGRAMACAO_ID integer,
    TALAO_ID integer,
    GP_ID integer,
    GP_DESCRICAO varchar(100),
    UP_ID integer,
    UP_DESCRICAO varchar(100),
    ESTACAO integer,
    ESTACAO_DESCRICAO varchar(100),
    ESTACAO_STATUS varchar(10),
    ESTACAO_STATUS_DESCRICAO varchar(500),
    FERRAMENTA_ID varchar(50),
    FERRAMENTA_DESCRICAO varchar(100),
    FERRAMENTA_SERIE varchar(20),
    FERRAMENTA_BARRAS varchar(100),
    FERRAMENTA_SITUACAO_TALAO varchar(10),
    FERRAMENTA_SITUACAO varchar(10),
    FERRAMENTA_STATUS varchar(10),
    FERRAMENTA_ENDERECAMENTO varchar(50),
    FERRAMENTA_ITEM_DETALHE_COD varchar(50),
    NAVALHA_ID integer,
    NAVALHA_BARRAS varchar(100),
    DATAHORA_INICIO timestamp,
    CODE varchar(600),
    TEMPO integer,
    ORDEM_STATUS integer,
    DATA_SOLICITACAO timestamp)
as
declare variable DESCANSO_DATAHORA timestamp;
declare variable DESCANSO_DATAHORA_EXPIRACAO timestamp;
BEGIN

    FERRAMENTA_ID = 0;

    FOR
        SELECT
            *
        FROM(
            SELECT
                produto_id,
                quantidade,
                fn_tamanho_produto(produto_id,tamanho) as TAMANHO,
                modelo_id,
                coalesce((select first 1
                        c.codigo
                    from tbproduto j, tbcor c
                    where j.codigo = produto_id
                    and c.codigo = j.cor_codigo
                ),'') as COR,
                remessa,
                TALAO,
    
                coalesce((select
                        ''
                        --||''||j.codigo
                        --||''||j.descricao
                        ||''||n.codigo
                        ||' - '||n.descricao
                        --||''||c.codigo
                        ||' ('||c.descricao||')'
                    from tbproduto j, tbmodelo n, tbcor c
                    where j.codigo = produto_id
                    and n.codigo = j.modelo_codigo
                    and c.codigo = j.cor_codigo
                ),'') as MODELOS,
    
                CODE,   
                REQUISICAO,
                PROGRAMACAO_ID,
                TALAO_ID,
                DATAHORA_INICIO,
                GP_ID,
                GP_DESCRICAO,
                UP_ID,
                UP_DESCRICAO,
                ESTACAO,
                ESTACAO_DESCRICAO,
                ESTACAO_STATUS,
                (SELECT FIRST 1 J.DESCRICAO FROM TBJUSTIFICATIVA J WHERE J.ID = ESTACAO_STATUS)ESTACAO_STATUS_DESCRICAO,
                FERRAMENTA_ID,
                FERRAMENTA_DESCRICAO,
                FERRAMENTA_SERIE,
                FERRAMENTA_BARRAS,
                FERRAMENTA_SITUACAO,
                FERRAMENTA_SITUACAO_TALAO,
                FERRAMENTA_STATUS,
                FERRAMENTA_ENDERECAMENTO,
                FERRAMENTA_ITEM_DETALHE_COD,
                NAVALHA_ID,
                FERRAMENTA_ITEM_DETALHE_COD NAVALHA_BARRAS,
                TEMPO,
                ORDEM_STATUS,
                DATA_SOLICITACAO
            
            FROM (
                SELECT FIRST 150
                    p.produto_id,
                    p.quantidade,
                    p.tamanho,
                    t.modelo_id,
                    coalesce((select first 1 r.remessa from tbremessa r where r.numero = p.remessa_id and r.estabelecimento_codigo = p.estabelecimento_id),'') as REMESSA,
                    coalesce((select first 1 s.remessa_talao_id from vwremessa_talao s where s.id = p.tabela_id),0) as TALAO,
    
                    (P.GP_ID || '-' || P.UP_ID || '-' || P.ESTACAO || '-' || P.FERRAMENTA_ID || '-' || DATAHORA_INICIO || '-' || R.REQUISICAO || '-' || COALESCE(ENDERECAMENTO,'') || '-' || COALESCE(P.FERRAMENTA_ITEM_DETALHE_ID,0) ) CODE,
                    IIF(P.STATUS_REQUISICAO = 1 AND P.STATUS <> 1,'1','0') REQUISICAO,
                    P.ID PROGRAMACAO_ID,
                    T.ID TALAO_ID,
                    P.DATAHORA_INICIO,
                    P.GP_ID,
                    G.DESCRICAO GP_DESCRICAO,
                    P.UP_ID, 
                    U.DESCRICAO UP_DESCRICAO,
                    P.ESTACAO,
                    SU.DESCRICAO ESTACAO_DESCRICAO,
                    COALESCE((SELECT FIRST 1 S.STATUS
                                FROM TBREGISTRO_PARADA S
                               WHERE S.TABELA_ID     = P.ESTACAO
                                 AND S.TABELA        = 'ESTACAO'
                                 AND S.VINCULO_ID    = P.GP_ID
                                 AND S.SUBVINCULO_ID = P.UP_ID
                               ORDER BY S.ID DESC),0) ESTACAO_STATUS,
                
                    LPAD(P.FERRAMENTA_ID,4,'0') FERRAMENTA_ID,
                    F.DESCRICAO FERRAMENTA_DESCRICAO,
                    LPAD(F.SERIE,4,'0') FERRAMENTA_SERIE,
                    F.CODBARRAS FERRAMENTA_BARRAS,
                    COALESCE(F.SITUACAO,'E') FERRAMENTA_SITUACAO,
                    IIF(F.ID = P.FERRAMENTA_ID AND F.TALAO_ID = T.ID,F.SITUACAO,'E') FERRAMENTA_SITUACAO_TALAO,
                    F.STATUS FERRAMENTA_STATUS,
                    F.ENDERECAMENTO FERRAMENTA_ENDERECAMENTO,
                    P.FERRAMENTA_ITEM_DETALHE_ID NAVALHA_ID,
                    (SELECT FIRST 1 D.CODBARRAS
                       FROM TBFERRAMENTARIA_ITEM_DETALHE D
                      WHERE D.ID = P.FERRAMENTA_ITEM_DETALHE_ID) FERRAMENTA_ITEM_DETALHE_COD,
                    0 TEMPO,
                    coalesce(p.STATUS_SOLICITACAO,0) as ORDEM_STATUS,
                    IIF(coalesce(p.STATUS_SOLICITACAO,0) > 0, coalesce(p.DATA_SOLICITACAO,P.DATAHORA_INICIO), P.DATAHORA_INICIO) as DATA_SOLICITACAO
                FROM
                    TBPROGRAMACAO P,
                    TBFERRAMENTARIA F,
                    TBGP G,
                    TBUP U,
                    TBSUB_UP SU,
                    VWREMESSA_TALAO T,
                    VWREMESSA R
                
                WHERE
                    P.FERRAMENTA_ID          > 1
                AND P.TEMPO_SETUP_FERRAMENTA > 0
                AND P.STATUS                 < 2  
                AND P.TIPO                   = 'A'
                AND F.ID                     = P.FERRAMENTA_ID
                AND G.ID                     = P.GP_ID
                AND U.ID                     = P.UP_ID
                AND SU.UP_ID                 = P.UP_ID
                AND SU.ID                    = P.ESTACAO
                AND T.ID                     = P.TABELA_ID
                AND R.REMESSA_ID             = T.REMESSA_ID
                --AND R.DATA_DISPONIBILIDADE  <= CAST(DATEADD(1 HOUR TO CURRENT_TIMESTAMP) AS DATE)
                AND (IIF(F.ID = P.FERRAMENTA_ID AND F.TALAO_ID = T.ID,F.SITUACAO,'E') IN ('E','R') OR F.TALAO_ID <> T.ID)
                --NAO MOSTRAR TALOES PARADOS AGUARDANDO REQUISICAO
                AND NOT (P.STATUS = 1 AND P.STATUS_REQUISICAO = 1)
                --AND P.DATAHORA_INICIO <= DATEADD(3 HOUR TO CURRENT_TIMESTAMP)
                AND P.DATAHORA_INICIO <= DATEADD(7 day TO CURRENT_TIMESTAMP)
                --AND G.ID NOT IN (244)

                ORDER BY
                    p.status_solicitacao descending,
                    DATAHORA_INICIO,
                    GP_DESCRICAO,
                    UP_DESCRICAO,
                    ESTACAO_DESCRICAO
            ) X

        ) Y
            ORDER BY
                ORDEM_STATUS descending,
                DATA_SOLICITACAO,
                DATAHORA_INICIO,
                GP_DESCRICAO,
                UP_DESCRICAO,
                ESTACAO_DESCRICAO

    INTO
        PRODUTO_ID,
        QUANTIDADE,
        TAMANHO,
        MODELO_ID,
        COR,
        REMESSA,
        TALAO,
        MODELOS,
        CODE,
        REQUISICAO,
        PROGRAMACAO_ID,
        TALAO_ID,
        DATAHORA_INICIO,
        GP_ID,
        GP_DESCRICAO,
        UP_ID,
        UP_DESCRICAO,
        ESTACAO,
        ESTACAO_DESCRICAO,
        ESTACAO_STATUS,
        ESTACAO_STATUS_DESCRICAO,
        FERRAMENTA_ID,
        FERRAMENTA_DESCRICAO,
        FERRAMENTA_SERIE,
        FERRAMENTA_BARRAS,
        FERRAMENTA_SITUACAO,
        FERRAMENTA_SITUACAO_TALAO,
        FERRAMENTA_STATUS,
        FERRAMENTA_ENDERECAMENTO,
        FERRAMENTA_ITEM_DETALHE_COD,
        NAVALHA_ID,
        NAVALHA_BARRAS,
        TEMPO,
        ORDEM_STATUS,
        DATA_SOLICITACAO

    DO BEGIN

        if(ORDEM_STATUS > 0)then
        begin
            ESTACAO_STATUS_DESCRICAO = 'SOLICITADO EM '||formatdatetime(DATA_SOLICITACAO);
        end


        SUSPEND;
    END
END
^

SET TERM ; ^

