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,
    DIF_TOTAL 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_v3(f.modelo_codigo, f.cor_codigo, p.tamanho) 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,
            DIF_TOTAL
        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,
        :DIF_TOTAL
    do begin
        suspend;
    end


end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REQUISICAO_PLACA_PECAS (
    PRODUTO_ID integer,
    ITAMANHO integer,
    REQUISICAO_ID integer)
returns (
    PECA_ID integer,
    PECA_SALDO numeric(15,4),
    PECA_ENDERECAMENTO_ID integer,
    PECA_TALAO_ID integer,
    PACA_QTD_PARES integer,
    PECA_REMESSA_ID integer,
    PECA_PRODUTO_ID integer,
    PECA_PRODUTO varchar(100),
    PECA_ENDERECAMENTO varchar(50),
    PECA_LOCALIZACAO integer,
    PECA_ESTABELECIMENTO integer)
as
declare variable MATRIZ_CODIGO integer;
declare variable TAMANHO integer;
declare variable PRODUTO_CODIGO integer;
declare variable COR_CODIGO integer;
declare variable LARGURA numeric(18,5);
declare variable COMPRIMENTO numeric(18,5);
declare variable DENSIDADE numeric(18,2);
declare variable ESPESSURA numeric(18,2);
begin

    select
        MATRIZ_CODIGO,
        TAMANHO,
        PRODUTO_CODIGO,
        COR_CODIGO,
        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
            m.matriz_codigo,
            p.tamanho,
            f.codigo produto_codigo,
            f.cor_codigo,
            fn_densidade_espessura_v3(f.modelo_codigo, f.cor_codigo, p.tamanho) 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 tbmatriz t, tbproduto f, tbmodelo m, (select cast(:ITAMANHO as integer) as tamanho from rdb$database) as p
          where t.codigo = m.matriz_codigo
          and f.codigo = f.codigo
          and f.codigo = :PRODUTO_ID
          and m.codigo = f.modelo_codigo
    ) x into
        MATRIZ_CODIGO,
        TAMANHO,
        PRODUTO_CODIGO,
        COR_CODIGO,
        LARGURA,
        COMPRIMENTO,
        PACA_QTD_PARES,
        DENSIDADE,
        ESPESSURA;

    MATRIZ_CODIGO = coalesce(MATRIZ_CODIGO,0);

    if(MATRIZ_CODIGO = 0)then
    begin
        exception "..." 'Matriz não encontrada.';
    end


    for
        SELECT
            p.codigo as ID
        from tbproduto p, tbproduto_ficha f
        where MODELO_CODIGO   = ( select p.modelo_codigo from tbproduto p where p.codigo = fn_parametro('SISTEMA.PRODUTO_TALAO_PLACA'))
        and f.LARGURA         >= :LARGURA
        and f.COMPRIMENTO     >= :COMPRIMENTO
        and p.cor_codigo      = :COR_CODIGO
        and f.produto_codigo  = p.codigo
        and f.densidade       = :DENSIDADE
        and f.espessura       = :ESPESSURA
    into
        :PRODUTO_CODIGO
    do begin

        for
            select
                j.*
            from(
                SELECT

                    y.controle as id,
                    y.quantidade_saldo - coalesce((select sum(k.quantidade) from TBREQUISICAO_PLACA k where k.sobra_id = y.controle and k.status = 0 and k.id <> :REQUISICAO_ID),0)  as saldo,
                    y.enderecamento_id,
                    coalesce((select first 1 k.id from TBREMESSA_ITEM_PROCESSADO k where k.remessa = v.remessa_id and k.controle = v.remessa_talao_id ),0) as TALAO_ID,
                    x.remessa,
                    x.produto_codigo,

                    p.descricao as PRODUTO,
                    (select first 1 g.subgrupo||'-'||g.subgrupo from tbenderecamento g where g.id = y.enderecamento_id) as enderecamento,
                    fn_parametro('SISTEMA.LOCALIZACAO_PLACAS') as LOCALIZACAO_CODIGO,
                    x.estabelecimento_codigo

                from tbproduto p, tbproduto l, TBREMESSA_ITEM_PROCESSADO X, TBPEDIDO_ITEM_PROCESSADO y, tbremessa_consumo c, tbremessa_consumo_vinculo v
                WHERE p.codigo = x.produto_codigo
                and p.modelo_codigo = l.modelo_codigo
                and l.codigo = fn_parametro('SISTEMA.PRODUTO_TALAO_PLACA')
                and y.status_saldo = 1
                and x.situacao = 3
                and y.remessa = x.remessa
                and y.remessa_acumulado_controle = x.controle
                and x.produto_codigo = :PRODUTO_CODIGO
                and c.remessa = y.remessa
                and c.talao = y.remessa_acumulado_controle
                and v.consumo_id = c.id
            ) j where j.saldo > 0

            order by j.id
        into
            PECA_ID,
            PECA_SALDO,
            PECA_ENDERECAMENTO_ID,
            PECA_TALAO_ID,
            PECA_REMESSA_ID,
            PECA_PRODUTO_ID,
            PECA_PRODUTO,
            PECA_ENDERECAMENTO,
            PECA_LOCALIZACAO,
            PECA_ESTABELECIMENTO
        do begin    
            suspend;
        end
    end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_placa_aloc_biu_01 for tbrequisicao_placa_alocacao
active before insert or update position 0
AS
declare variable DEN numeric(15,4);
declare variable ESP numeric(15,4);
declare variable densidade numeric(15,4);
declare variable espessura numeric(15,4);
declare variable tamanho integer;
begin

    if(inserting or (updating and (new.produto_id is distinct from old.produto_id or new.densidade is distinct from old.densidade or new.espessura is distinct from old.espessura)))then
    begin

        select first 1
            p.tamanho
        from tbremessa_item_processado p, tbrequisicao_placa h
        where p.remessa = h.remessa
        and p.controle = h.talao
        and h.id = new.requisicao_placa_id
        into tamanho;

        tamanho = coalesce(tamanho,0);

        select first 1
            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
        from(
            select
                fn_densidade_espessura_v3(p.modelo_origem,p.cor_codigo, :tamanho) as DENESP
            from tbproduto p
            where p.codigo = new.produto_id
        ) a into DEN, ESP;
    
        DEN = coalesce(DEN,0);
        ESP = coalesce(ESP,0);
    
        if((DEN is distinct from new.densidade) or (ESP is distinct from new.espessura))then
        begin
            exception "..." 'Erro ao alocar placas, Densidade:'||coalesce(densidade,0)||' -> '||DEN||' e Espessura:'||coalesce(espessura,0)||' -> '||ESP||'.';
        end
    end

end
^

SET TERM ; ^

ALTER TABLE TBROMANEIO ADD RESOLVIDO INTEGER DEFAULT 0;

update tbromaneio r set r.resolvido = 0;