ALTER TABLE TBREQUISICAO_PLACA
    ADD DENSIDADE NUMERIC(15,1),
    ADD ESPESSURA NUMERIC(15,1),
    ADD LARGURA NUMERIC(15,4),
    ADD COMPRIMENTO NUMERIC(15,4),
    ADD COR_ID INTEGER;

CREATE OR ALTER trigger tbrequisicao_placa_bi for tbrequisicao_placa
active before insert position 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GTBREQUISICAO_PLACA,1);


  new.data_status = current_date;
END;

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)
as
declare variable MATRIZ_CODIGO integer;
declare variable TAMANHO integer;
begin

    select
        MATRIZ_CODIGO,
        TAMANHO,
        PRODUTO_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,
            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,
        COR_ID,
        COR_DESCRICAO,
        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
            *
        from(
            SELECT
    
                p.codigo as ID,
                FN_ESTOQUE_SALDO_DISPONIVEL(s.estabelecimento_codigo, s.codigo, p.codigo, 0) as saldo
    
            from tbproduto p, tbproduto_ficha f, tblocalizacao s
            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_ID
            and f.produto_codigo  =  p.codigo
            and f.densidade       =  :DENSIDADE
            and f.espessura       =  :ESPESSURA
            and s.codigo          = fn_parametro('SISTEMA.LOCALIZACAO_PLACAS')
      ) where saldo > 0

    into
        :PRODUTO_CODIGO,
        :SALDO
    do begin
        suspend;
    end


end;


CREATE TABLE TBREQUISICAO_PLACA_ALOCACAO (
    ID INTEGER NOT NULL,
    PRODUTO_ID INTEGER,
    QTD NUMERIC(15,2),
    SALDO NUMERIC(15,2),
    REQUISICAO_PLACA_ID INTEGER);

ALTER TABLE TBREQUISICAO_PLACA_ALOCACAO
ADD CONSTRAINT PK_TBREQUISICAO_PLACA_ALOCACAO
PRIMARY KEY (ID);

CREATE SEQUENCE GTBREQ_PLACA_ALOCACAO;

create trigger ttbreq_placa_alocacao_bi for tbrequisicao_placa_alocacao
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbreq_placa_alocacao,1);
end;

ALTER TABLE TBREQUISICAO_PLACA_ALOCACAO
    ADD ESTABELECIMENTO_ID INTEGER,
    ADD LOCALIZACAO_ID INTEGER;



ALTER TABLE TBREQUISICAO_PLACA_ALOCACAO
    ADD STATUS INTEGER;

CREATE OR ALTER trigger ttbrequisicao_placa_b03u for tbrequisicao_placa
active before update position 3
AS
begin

    if(new.status = 2 and old.status <> 2)then
    begin
        update TBREQUISICAO_PLACA_ALOCACAO a set a.status = 2 where a.requisicao_placa_id = new.id;
    end

    if(old.status = 2 and new.status <> 2)then
    begin
        update TBREQUISICAO_PLACA_ALOCACAO a set a.status = iif(a.saldo > 0, 0, 1) where a.requisicao_placa_id = new.id;
    end

end;


CREATE OR ALTER trigger ttbreq_placa_alocacao_bi for tbrequisicao_placa_alocacao
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbreq_placa_alocacao,1);

  new.status = 0;
end;


CREATE OR ALTER trigger ttbreq_placa_alocacao_b02i for tbrequisicao_placa_alocacao
active before insert position 2
AS
begin

    Insert into TBESTOQUE_DETALHE_ALOCACAO (
    Estabelecimento_id,Tabela_id,Tab_item_id,Tipo,
    Localizacao_id, Produto_id, Tamanho, Quantidade,
    Saldo, Alocacao_Id
    ) values (
        new.estabelecimento_id,
        new.requisicao_placa_id,
        0,
        'L',
        new.localizacao_id,
        new.produto_id,
        0,
        new.qtd,
        new.qtd,
        new.requisicao_placa_id
     );

end;


CREATE OR ALTER trigger ttbreq_placa_alocacao_b01u for tbrequisicao_placa_alocacao
active before update position 0
AS
begin

  if(new.saldo is distinct from old.saldo)then
  begin
      update TBESTOQUE_DETALHE_ALOCACAO w
        set w.saldo = new.saldo
      where w.estabelecimento_id = new.estabelecimento_id
      and w.localizacao_id       = new.localizacao_id
      and w.produto_id           = new.produto_id
      and w.alocacao_id          = new.requisicao_placa_id
      and w.tipo = 'L';
  end

end;


CREATE OR ALTER trigger ttbreq_placa_alocacao_b02u for tbrequisicao_placa_alocacao
active before update position 2
AS
begin

    if(old.saldo > 0 and new.saldo = 0 and new.status < 2)then
    begin
        new.status = 1;
    end

    if(old.saldo = 0 and new.saldo > 0 and new.status < 2)then
    begin
        new.status = 0;
    end

    if(new.status = 2 and old.status < 2)then
    begin
        update TBESTOQUE_DETALHE_ALOCACAO w
        set w.saldo = 0
      where w.estabelecimento_id = new.estabelecimento_id
      and w.localizacao_id       = new.localizacao_id
      and w.produto_id           = new.produto_id
      and w.alocacao_id          = new.requisicao_placa_id
      and w.tipo = 'L';
    end

    if(new.status < 2 and old.status = 2 and new.saldo > 0)then
    begin
        update TBESTOQUE_DETALHE_ALOCACAO w
        set w.saldo = new.saldo
      where w.estabelecimento_id = new.estabelecimento_id
      and w.localizacao_id       = new.localizacao_id
      and w.produto_id           = new.produto_id
      and w.alocacao_id          = new.requisicao_placa_id
      and w.tipo = 'L';
    end

end;

CREATE OR ALTER trigger ttbreq_placa_alocacao_b01d for tbrequisicao_placa_alocacao
active before delete position 1
AS
begin

  delete from TBESTOQUE_DETALHE_ALOCACAO w
  where w.estabelecimento_id = old.estabelecimento_id
  and w.localizacao_id       = old.localizacao_id
  and w.produto_id           = old.produto_id
  and w.alocacao_id          = old.requisicao_placa_id
  and w.tipo = 'L';

end;

CREATE OR ALTER procedure SPC_REQUISICAO_BOJO (
    I_REMESSA_ID integer = 44154,
    REMESSA_TALAO_ID integer = 107,
    NAO_PREENCHER integer = null)
returns (
    ESTABELECIMENTO_ID integer,
    REMESSA_ID integer,
    GP_ID integer,
    GP_DESCRICAO varchar(255),
    GP_REQUISITA_SOBRA integer,
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(255),
    MODELO_ID integer,
    COR_ID integer,
    GRADE_ID integer,
    TAMANHO integer,
    TAMANHO_DESCRICAO varchar(10),
    UM varchar(10),
    HABILITA_REQ_SKU_FECHADO integer,
    HABILITA_REQ_SEM_LIMITE integer,
    QUANTIDADE_TOTAL numeric(15,4),
    QUANTIDADE_PRODUZIDA numeric(15,4),
    QUANTIDADE_ABERTO numeric(15,4),
    REMESSA_ID_APROV integer,
    REMESSA_TALAO_ID_APROV integer,
    QUANTIDADE_APROV numeric(15,4),
    QUANTIDADE_EXTRA numeric(15,4),
    QUANTIDADE_DEFEITO numeric(15,4),
    QUANTIDADE_SOBRA_APROVEITADA numeric(15,4),
    QUANTIDADE_SOBRA numeric(15,4),
    QUANTIDADE_REQUISITADA numeric(15,4),
    QUANTIDADE_REQUISITADA_PENDENTE numeric(15,4),
    PERCENTUAL_TOLERANCIA numeric(15,4),
    QUANTIDADE_TOLERANCIA numeric(15,4),
    QUANTIDADE_SALDO numeric(15,4),
    QUANTIDADE_PLACAS integer,
    REQUISITAR_PLACAS integer,
    PLACAS blob sub_type 1 segment size 80,
    QUANTIDADE_BOJO_PLACA integer)
as
declare variable QTD_SALDO_BOJO numeric(15,4);
declare variable QTD_SALDO_BOJO_PARES integer;
declare variable PECA_DENSIDADE numeric(18,4);
declare variable PECA_ESPESSURA numeric(18,4);
declare variable PECA_LARGURA numeric(18,4);
declare variable PECA_COMPRIMENTO numeric(18,4);
declare variable PECA_COR_ID integer;
declare variable PECA_COR_DESCRICAO varchar(10);
declare variable PECA_SALDO numeric(18,4);
declare variable PECA_QTD_PARES numeric(18,4);
begin

    SELECT FIRST 1
           T.ESTABELECIMENTO_ID,
           T.REMESSA_ID, 
           T.PRODUTO_ID,
           T.TAMANHO,
           T.GP_ID
      FROM VWREMESSA_TALAO_DETALHE T
     WHERE T.REMESSA_ID       = :I_REMESSA_ID
       AND T.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
      INTO :ESTABELECIMENTO_ID,
           :REMESSA_ID,
           :PRODUTO_ID,
           :TAMANHO,
           :GP_ID;

    IF ( PRODUTO_ID IS NULL ) THEN
    BEGIN
        EXCEPTION "..." 'TALAO INVALIDO. VERIFIQUE OS DADOS INFORMADOS: REMESSA ' || COALESCE(I_REMESSA_ID,'') || ' TALAO ' || COALESCE(FN_LPAD(REMESSA_TALAO_ID,4,0),'');
    END

    HABILITA_REQ_SKU_FECHADO = COALESCE(FN_PARAMETRO('TBUSUARIO.REQ_SKU_FECHADO',FN_CURRENT_USER_ID()),0);
    HABILITA_REQ_SEM_LIMITE  = COALESCE(FN_PARAMETRO('TBUSUARIO.REQ_SKU_SEM_LIMITE',FN_CURRENT_USER_ID()),0);

    SELECT FIRST 1
           P.DESCRICAO,
           P.MODELO_CODIGO,
           P.COR_CODIGO,
           P.GRADE_CODIGO,
           P.UNIDADEMEDIDA_SIGLA
      FROM TBPRODUTO P
     WHERE P.CODIGO = :PRODUTO_ID
      INTO :PRODUTO_DESCRICAO,
           :MODELO_ID,
           :COR_ID,
           :GRADE_ID,
           :UM;

    SELECT FIRST 1
           G.DESCRICAO,
           G.REQUISITA_SOBRA
      FROM TBGP G
     WHERE G.ID = :GP_ID
      INTO GP_DESCRICAO,
           GP_REQUISITA_SOBRA;


    TAMANHO_DESCRICAO = FN_TAMANHO_GRADE(GRADE_ID,TAMANHO);


    QUANTIDADE_TOTAL = COALESCE((
        SELECT SUM(D.QUANTIDADE) QUANTIDADE
          FROM VWREMESSA_TALAO_DETALHE D
         WHERE D.REMESSA_ID        = :REMESSA_ID
           AND D.PRODUTO_ID        = :PRODUTO_ID
           AND D.TAMANHO           = :TAMANHO
           AND D.GP_ID             = :GP_ID
           AND D.REMESSA_TALAO_ID  < 8000
    ),0);

    QUANTIDADE_PRODUZIDA = COALESCE((
        SELECT SUM(D.QUANTIDADE)
          FROM VWREMESSA_TALAO_DETALHE D
         WHERE D.GP_ID            = :GP_ID
           AND D.REMESSA_ID       = :REMESSA_ID
           AND D.PRODUTO_ID       = :PRODUTO_ID
           AND D.TAMANHO          = :TAMANHO
           AND D.REMESSA_TALAO_ID < 8000
           AND D.DATA_PRODUCAO IS NOT NULL
    ),0);

    QUANTIDADE_ABERTO = QUANTIDADE_TOTAL - QUANTIDADE_PRODUZIDA;
        
    if ( COALESCE(NAO_PREENCHER,0) = 0 ) then
    BEGIN
    SELECT FIRST 1
        X.REMESSA_ID,
        X.REMESSA_TALAO_ID,
        (SELECT FIRST 1 QUANTIDADE_SALDO FROM SPC_REQUISICAO_BOJO(REMESSA_ID,REMESSA_TALAO_ID,1)) SALDO_ANTERIOR
    FROM (
        SELECT
            P.GP_ID,
            P.PRODUTO_ID,
            P.TAMANHO,
            P.REMESSA_ID,
            (SELECT FIRST 1 D.ID
              FROM VWREMESSA_TALAO_DETALHE D
             WHERE D.REMESSA_ID = P.REMESSA_ID
               AND D.GP_ID = P.GP_ID
               AND D.PRODUTO_ID = P.PRODUTO_ID
               AND D.TAMANHO = P.TAMANHO
               AND D.DATA_PRODUCAO IS NULL) PRODUZIDO,
            MIN(P.REMESSA_TALAO_ID) REMESSA_TALAO_ID,
            MIN(R.DATA) DATA
        FROM
            VWREMESSA_TALAO P,
            VWREMESSA R,
            VWREMESSA R2
        WHERE
            P.PRODUTO_ID  = :PRODUTO_ID /* 84518 */
        AND P.TAMANHO     = :TAMANHO /* 8 */
        AND P.GP_ID       = :GP_ID  /* 23 */
        AND R2.REMESSA_ID = :REMESSA_ID /* 45900 /* TALAO 55 */
        AND R.REMESSA_ID  = P.REMESSA_ID
        AND R.REMESSA_ID <> R2.REMESSA_ID
        AND R.DATA       <= R2.DATA
        AND P.REMESSA_TALAO_ID < 8000
        AND DATEDIFF(DAY, R.DATA, CURRENT_DATE) <= 7 /*7 DIAS DE DIFERENCA A PARTIR DA DATA DA REMESSA BASE*/
        GROUP BY 1,2,3,4
        ORDER BY DATA DESC) X
    WHERE
        X.PRODUZIDO IS NULL
    INTO
        REMESSA_ID_APROV,
        REMESSA_TALAO_ID_APROV,
        QUANTIDADE_APROV;    
    END

    QUANTIDADE_APROV = COALESCE(QUANTIDADE_APROV,0);

    QUANTIDADE_EXTRA = COALESCE((
        SELECT SUM(T.QUANTIDADE) QUANTIDADE
          FROM VWREMESSA_TALAO T
         WHERE T.REMESSA_TALAO_ID BETWEEN 8000 AND 8999
           AND T.GP_ID            = :GP_ID
           AND T.REMESSA_ID       = :REMESSA_ID
           AND T.PRODUTO_ID       = :PRODUTO_ID
           AND T.TAMANHO          = :TAMANHO
    ),0);

    QUANTIDADE_DEFEITO = COALESCE((
        SELECT SUM(I.QUANTIDADE)
          FROM TBDEFEITO_TRANSACAO_ITEM I
         WHERE I.ESTEIRA_ID = :GP_ID
           AND I.REMESSA    = :REMESSA_ID
           AND I.PRODUTO_ID = :PRODUTO_ID
           AND I.TAMANHO    = :TAMANHO
    ),0);

    QUANTIDADE_SOBRA_APROVEITADA = COALESCE((
        SELECT SUM(S.QUANTIDADE)
          FROM TBREQUISICAO R,
               TBREQUISICAO_SOBRA S
         WHERE R.REMESSA       = :REMESSA_ID
           AND R.PRODUTO_ID    = :PRODUTO_ID
           AND R.TAMANHO       = :TAMANHO
           AND R.GP_ID         = :GP_ID
           AND S.REQUISICAO_ID = R.ID
    ),0);

    QUANTIDADE_SOBRA = COALESCE((
        SELECT SUM(S.SALDO - COALESCE((SELECT SUM(R.SALDO) FROM TBREQUISICAO_SOBRA R WHERE R.SOBRA_ID = S.ID AND R.STATUS = '0'),0.0000))
        FROM
            TBSOBRA S
        WHERE
            S.STATUS             = '1'
        AND S.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
        AND S.TAMANHO            = :TAMANHO
        AND S.PRODUTO_ID IN (
            SELECT P.CODIGO
              FROM TBMODELO M,
                   TBPRODUTO P,
                  (SELECT P.MODELO_CODIGO MODELO_ID,
                          P.COR_CODIGO COR_ID,
                         (SELECT MODELO_PAI
                            FROM TBMODELO
                           WHERE CODIGO     = P.MODELO_CODIGO
                             AND MODELO_PAI > 0) MODELO_PAI
                     FROM TBPRODUTO P
                    WHERE P.CODIGO = :PRODUTO_ID) A
             WHERE A.COR_ID      = P.COR_CODIGO
               AND M.CODIGO      = P.MODELO_CODIGO
               AND (A.MODELO_ID  = M.CODIGO
                OR A.MODELO_ID  = M.MODELO_PAI
                OR A.MODELO_PAI = M.CODIGO
                OR A.MODELO_PAI = M.MODELO_PAI))
    ),0);

    QUANTIDADE_REQUISITADA = COALESCE((
        SELECT SUM(R.QUANTIDADE)
          FROM TBREQUISICAO R
         WHERE R.GP_ID      = :GP_ID
           AND R.REMESSA    = :REMESSA_ID
           AND R.PRODUTO_ID = :PRODUTO_ID
           AND R.TAMANHO    = :TAMANHO
    ),0);

    QUANTIDADE_REQUISITADA_PENDENTE = COALESCE((
        SELECT SUM(R.QUANTIDADE)
          FROM TBREQUISICAO R
         WHERE R.GP_ID      = :GP_ID
           AND R.REMESSA    = :REMESSA_ID
           AND R.PRODUTO_ID = :PRODUTO_ID
           AND R.TAMANHO    = :TAMANHO
           AND COALESCE(R.REMESSA_GERADA,0) = 0
    ),0);

    PERCENTUAL_TOLERANCIA = COALESCE(NULLIF(FN_PARAMETRO('SISTEMA.PERC_DEF_REQ'),''),0);

    QUANTIDADE_TOLERANCIA = FN_ARRENDONDAR((PERCENTUAL_TOLERANCIA/100) * QUANTIDADE_DEFEITO,0,2);

    QUANTIDADE_SALDO = QUANTIDADE_DEFEITO + QUANTIDADE_TOLERANCIA + QUANTIDADE_APROV - QUANTIDADE_EXTRA - QUANTIDADE_REQUISITADA - QUANTIDADE_SOBRA_APROVEITADA;

    QUANTIDADE_SALDO = IIF(QUANTIDADE_SALDO < 0,0,QUANTIDADE_SALDO);

    QTD_SALDO_BOJO = QUANTIDADE_SALDO;

    QTD_SALDO_BOJO_PARES = QUANTIDADE_SALDO;
    REQUISITAR_PLACAS = 0;
    QUANTIDADE_PLACAS = 0;
    PECA_QTD_PARES    = 0;

    for
        select
            DENSIDADE,
            ESPESSURA,
            LARGURA,
            COMPRIMENTO,
            COR_ID,
            COR_DESCRICAO,
            SALDO,
            PACA_QTD_PARES

        from SPC_REQUISICAO_PLACA(:REMESSA_ID, :REMESSA_TALAO_ID)
        where saldo > 0
    into
        PECA_DENSIDADE,
        PECA_ESPESSURA,
        PECA_LARGURA,
        PECA_COMPRIMENTO,
        PECA_COR_ID,
        PECA_COR_DESCRICAO,
        PECA_SALDO,
        PECA_QTD_PARES
    do begin

        if(REQUISITAR_PLACAS = 0)then
        begin
           QTD_SALDO_BOJO = QTD_SALDO_BOJO / PECA_QTD_PARES;
           if((QTD_SALDO_BOJO - cast(QTD_SALDO_BOJO as integer)) > 0)then
           begin
             QTD_SALDO_BOJO = cast(QTD_SALDO_BOJO as integer) + 1;
           end else
           begin
             QTD_SALDO_BOJO = cast(QTD_SALDO_BOJO as integer);
           end
        end

        REQUISITAR_PLACAS = 1;
        PLACAS = null;

       if( QTD_SALDO_BOJO > 0 )then
       begin
            if(QTD_SALDO_BOJO <= PECA_SALDO)then
            begin

                PLACAS = coalesce(PLACAS||',','[')||fn_to_json(
                    fn_to_par_json('PECA_DENSIDADE'     ,PECA_DENSIDADE),
                    fn_to_par_json('PECA_ESPESSURA'     ,PECA_ESPESSURA),
                    fn_to_par_json('PECA_LARGURA'       ,PECA_LARGURA),
                    fn_to_par_json('PECA_COMPRIMENTO'   ,PECA_COMPRIMENTO),
                    fn_to_par_json('PECA_COR_ID'        ,PECA_COR_ID),
                    fn_to_par_json('PECA_COR_DESCRICAO' ,PECA_COR_DESCRICAO),
                    fn_to_par_json('PECA_SALDO'         ,PECA_SALDO),
                    fn_to_par_json('PECA_QTD_PARES'     ,PECA_QTD_PARES),
                    fn_to_par_json('QTD'                ,QTD_SALDO_BOJO)
                );

                QTD_SALDO_BOJO       = 0;
                QTD_SALDO_BOJO_PARES = 0;
                QUANTIDADE_PLACAS    = QUANTIDADE_PLACAS + QTD_SALDO_BOJO;

            end else
            begin
                QTD_SALDO_BOJO = QTD_SALDO_BOJO - PECA_SALDO;
                QUANTIDADE_PLACAS = QUANTIDADE_PLACAS + PECA_SALDO;

                QTD_SALDO_BOJO_PARES = QTD_SALDO_BOJO_PARES - (PECA_SALDO * PECA_QTD_PARES);

                PLACAS = coalesce(PLACAS||',','[')||fn_to_json(
                    fn_to_par_json('PECA_DENSIDADE'     ,PECA_DENSIDADE),
                    fn_to_par_json('PECA_ESPESSURA'     ,PECA_ESPESSURA),
                    fn_to_par_json('PECA_LARGURA'       ,PECA_LARGURA),
                    fn_to_par_json('PECA_COMPRIMENTO'   ,PECA_COMPRIMENTO),
                    fn_to_par_json('PECA_COR_ID'        ,PECA_COR_ID),
                    fn_to_par_json('PECA_COR_DESCRICAO' ,PECA_COR_DESCRICAO),
                    fn_to_par_json('PECA_SALDO'         ,PECA_SALDO),
                    fn_to_par_json('PECA_QTD_PARES'     ,PECA_QTD_PARES),
                    fn_to_par_json('QTD'                ,PECA_SALDO)
                );

            end
       end
    end

    PLACAS = coalesce(PLACAS,'[')||']';

    if(REQUISITAR_PLACAS = 1 and PECA_QTD_PARES > 0)then
    begin
        QUANTIDADE_SALDO = QTD_SALDO_BOJO_PARES;
    end

    QUANTIDADE_BOJO_PLACA = PECA_QTD_PARES;

    suspend;
end;

CREATE INDEX ITBREQ_PLACA_ALOCACA_02
ON TBREQUISICAO_PLACA_ALOCACAO (STATUS);

CREATE INDEX ITBREQ_PLACA_ALOCACA_01
ON TBREQUISICAO_PLACA_ALOCACAO (REQUISICAO_PLACA_ID);

CREATE OR ALTER trigger tbrequisicao_placa_bi0 for tbrequisicao_placa
active before insert position 1
AS
declare variable QTD_SALDO_BOJO numeric(15,4);
declare variable QTD_SALDO_BOJO_PARES integer;
declare variable PECA_DENSIDADE numeric(18,4);
declare variable PECA_ESPESSURA numeric(18,4);
declare variable PECA_LARGURA numeric(18,4);
declare variable PECA_COMPRIMENTO numeric(18,4);
declare variable PECA_COR_ID integer;
declare variable PECA_COR_DESCRICAO varchar(10);
declare variable PECA_SALDO numeric(18,4);
declare variable PECA_QTD_PARES numeric(18,4);
declare variable localixacao_id integer;
declare variable LOCALIZACAO_ID integer;
declare variable estabelecimento_id integer;
declare variable QTD_GRAVAR integer;
declare variable PRODUTO_ID integer;
BEGIN

    QTD_SALDO_BOJO = new.quantidade;

    for
        select
            PRODUTO_CODIGO,
            DENSIDADE,
            ESPESSURA,
            LARGURA,
            COMPRIMENTO,
            COR_ID,
            COR_DESCRICAO,
            SALDO,
            PACA_QTD_PARES,
            l.codigo as localixacao_id,
            l.estabelecimento_codigo as estabelecimento_id
        from SPC_REQUISICAO_PLACA(new.remessa, new.talao) a, tblocalizacao l
        where saldo > 0
        and l.codigo = fn_parametro('SISTEMA.LOCALIZACAO_PLACAS')
    into
        PRODUTO_ID,
        PECA_DENSIDADE,
        PECA_ESPESSURA,
        PECA_LARGURA,
        PECA_COMPRIMENTO,
        PECA_COR_ID,
        PECA_COR_DESCRICAO,
        PECA_SALDO,
        PECA_QTD_PARES,
        LOCALIZACAO_ID,
        ESTABELECIMENTO_ID
    do begin

       if( QTD_SALDO_BOJO > 0 )then
       begin
            if(QTD_SALDO_BOJO <= PECA_SALDO)then
            begin
                QTD_GRAVAR      = QTD_SALDO_BOJO;
                QTD_SALDO_BOJO  = 0;
            end else
            begin
                QTD_SALDO_BOJO = QTD_SALDO_BOJO - PECA_SALDO;
                QTD_GRAVAR = PECA_SALDO;
            end

            INSERT INTO TBREQUISICAO_PLACA_ALOCACAO (
                PRODUTO_ID, QTD, SALDO, REQUISICAO_PLACA_ID, ESTABELECIMENTO_ID, LOCALIZACAO_ID
            ) VALUES (
                :PRODUTO_ID, :QTD_GRAVAR, :QTD_GRAVAR, new.ID, :ESTABELECIMENTO_ID, :LOCALIZACAO_ID
            );
       end
    end

    if(QTD_SALDO_BOJO > 0)then
    begin
        exception "..." 'Sem saldo para alocação';
    end
END;

CREATE OR ALTER trigger ttbrequisicao_placa_b03d for tbrequisicao_placa
active before delete position 3
AS
begin
  delete from TBREQUISICAO_PLACA_ALOCACAO l where l.requisicao_placa_id = old.id;
end;
