SET TERM ^ ;

CREATE OR ALTER function FN_DENSIDADE_ESPESSURA (
    MODELO_CODIGO integer,
    COR_CODIGO integer)
returns varchar(10)
AS
begin

    return coalesce((SELECT FIRST 1
      COALESCE((SELECT FIRST 1 M.DENSIDADE||'|'||M.ESPESSURA
         FROM TBMODELO M WHERE M.CODIGO = P2.MODELO_CODIGO),'0000000000')
      FROM TBMODELO_CONSUMO_COR MC, TBFAMILIA F, TBPRODUTO P2
     WHERE MC.MODELO_ID = :MODELO_CODIGO
       AND MC.COR_ID = :COR_CODIGO
       AND MC.PRODUTO_ID = P2.CODIGO
       AND P2.FAMILIA_CODIGO = F.CODIGO
       AND F.DENSIDADE_ESPESSURA = '1'),'0|0');
       
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER function FN_DENSIDADE_ESPESSURA_V2 (
    MODELO_CODIGO integer,
    COR_CODIGO integer,
    TAMANHO integer)
returns varchar(10)
AS
declare variable TBM varchar(10);
declare variable ESPESSURA integer;
declare variable DENSIDADE integer;
begin

   TAMANHO = coalesce(TAMANHO,0);

   TBM = coalesce((SELECT FIRST 1
      COALESCE((SELECT FIRST 1 M.DENSIDADE||'|'||M.ESPESSURA
         FROM TBMODELO M WHERE M.CODIGO = P2.MODELO_CODIGO),'0000000000')
      FROM TBMODELO_CONSUMO_COR MC, TBFAMILIA F, TBPRODUTO P2
     WHERE MC.MODELO_ID = :MODELO_CODIGO
       AND MC.COR_ID = :COR_CODIGO
       AND MC.PRODUTO_ID = P2.CODIGO
       AND P2.FAMILIA_CODIGO = F.CODIGO
       AND F.DENSIDADE_ESPESSURA = '1'
       and iif(:TAMANHO = 0, true,
               iif(:TAMANHO = 1, mc.t01 > 0, 
               iif(:TAMANHO = 2, mc.t02 > 0,
               iif(:TAMANHO = 3, mc.t03 > 0,
               iif(:TAMANHO = 4, mc.t04 > 0,
               iif(:TAMANHO = 5, mc.t05 > 0,
               iif(:TAMANHO = 6, mc.t06 > 0,
               iif(:TAMANHO = 7, mc.t07 > 0,
               iif(:TAMANHO = 8, mc.t08 > 0,
               iif(:TAMANHO = 9, mc.t09 > 0,
               iif(:TAMANHO =10, mc.t10 > 0, 
               iif(:TAMANHO =11, mc.t11 > 0,
               iif(:TAMANHO =12, mc.t12 > 0,
               iif(:TAMANHO =13, mc.t13 > 0,
               iif(:TAMANHO =14, mc.t14 > 0,
               iif(:TAMANHO =15, mc.t15 > 0,
               iif(:TAMANHO =16, mc.t16 > 0,
               iif(:TAMANHO =17, mc.t17 > 0,
               iif(:TAMANHO =18, mc.t18 > 0,
               iif(:TAMANHO =19, mc.t19 > 0,
               iif(:TAMANHO =20, mc.t20 > 0, false)))))))))))))))))))))

       ),'0|0');

    if(TBM = '0|0')then
    begin
        for
            SELECT FIRST 1
                M.DENSIDADE,
                M.ESPESSURA
            FROM TBMODELO M
                WHERE M.CODIGO = :MODELO_CODIGO
        into
            :DENSIDADE,
            :ESPESSURA
        do begin
            if(:DENSIDADE > 0 or :ESPESSURA > 0)then
            begin
                TBM = :DENSIDADE||'|'||:ESPESSURA;
            end
        end
    end

    return TBM;
       
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER function FN_DENSIDADE_ESPESSURA_V3 (
    MODELO_CODIGO integer,
    COR_CODIGO integer,
    TAMANHO integer = 0)
returns varchar(30)
AS
declare variable TBM varchar(30);
declare variable ESPESSURA numeric(18,8);
declare variable DENSIDADE numeric(18,8);
begin

   :TAMANHO = coalesce(:TAMANHO,0);

   TBM = coalesce((SELECT FIRST 1
      COALESCE((SELECT FIRST 1 M.DENSIDADE||'|'||M.ESPESSURA
         FROM TBMODELO M WHERE M.CODIGO = P2.MODELO_CODIGO),'0000000000')
      FROM TBMODELO_CONSUMO_COR MC, TBFAMILIA F, TBPRODUTO P2
     WHERE MC.MODELO_ID = :MODELO_CODIGO
       AND MC.COR_ID = :COR_CODIGO
       AND MC.PRODUTO_ID = P2.CODIGO
       AND P2.FAMILIA_CODIGO = F.CODIGO
       AND F.DENSIDADE_ESPESSURA = '1'
       and iif(:TAMANHO = 0, true,
               iif(:TAMANHO = 1, mc.t01 > 0, 
               iif(:TAMANHO = 2, mc.t02 > 0,
               iif(:TAMANHO = 3, mc.t03 > 0,
               iif(:TAMANHO = 4, mc.t04 > 0,
               iif(:TAMANHO = 5, mc.t05 > 0,
               iif(:TAMANHO = 6, mc.t06 > 0,
               iif(:TAMANHO = 7, mc.t07 > 0,
               iif(:TAMANHO = 8, mc.t08 > 0,
               iif(:TAMANHO = 9, mc.t09 > 0,
               iif(:TAMANHO =10, mc.t10 > 0, 
               iif(:TAMANHO =11, mc.t11 > 0,
               iif(:TAMANHO =12, mc.t12 > 0,
               iif(:TAMANHO =13, mc.t13 > 0,
               iif(:TAMANHO =14, mc.t14 > 0,
               iif(:TAMANHO =15, mc.t15 > 0,
               iif(:TAMANHO =16, mc.t16 > 0,
               iif(:TAMANHO =17, mc.t17 > 0,
               iif(:TAMANHO =18, mc.t18 > 0,
               iif(:TAMANHO =19, mc.t19 > 0,
               iif(:TAMANHO =20, mc.t20 > 0, false)))))))))))))))))))))

       ),'0|0');


    if(TBM = '0|0')then
    begin
        for
            SELECT FIRST 1
                M.DENSIDADE,
                M.ESPESSURA
            FROM TBMODELO M
                WHERE M.CODIGO = :MODELO_CODIGO
        into
            :DENSIDADE,
            :ESPESSURA
        do begin
            if(:DENSIDADE > 0 or :ESPESSURA > 0)then
            begin
                TBM = :DENSIDADE||'|'||:ESPESSURA;
            end
        end
    end

    return TBM;
       
end
^

SET TERM ; ^



SET TERM ^ ;

CREATE OR ALTER procedure SPC_PRODUCAO_CONFORMACAO_V2 (
    I_GP_ID integer,
    I_UP_ID integer,
    I_ESTACAO varchar(500),
    I_DATA_INICIO date,
    I_DATA_FIM date,
    I_FLAG integer)
returns (
    PERDAS_PERC numeric(15,2),
    EFICIENCIA numeric(15,2),
    SETUP_PREVISTO numeric(15,2),
    SETUP_REALIZADO numeric(15,2),
    COR_EFIC integer,
    JUSTIFICATIVA varchar(1000),
    PROGRAMACAO_ID integer,
    REQUISICAO_ID integer,
    GP_ID integer,
    GP_DESCRICAO varchar(500),
    UP_ID integer,
    UP_DESCRICAO varchar(500),
    ESTACAO integer,
    ESTACAO_DESCRICAO varchar(500),
    REMESSA integer,
    REMESSA_ID integer,
    REMESSA_DATA date,
    REMESSA_TALAO_ID integer,
    TALAO_ID integer,
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(500),
    MODELO_ID integer,
    MODELO_DESCRICAO varchar(500),
    COR_ID integer,
    COR_DESCRICAO varchar(500),
    TAMANHO integer,
    TAMANHO_DESCRICAO varchar(500),
    QUANTIDADE numeric(15,2),
    UM varchar(500),
    FERRAMENTA_ID integer,
    FERRAMENTA_DESCICAO varchar(500),
    DATAHORA_REALIZADO_INICIO varchar(20),
    DATAHORA_REALIZADO_FIM varchar(20),
    TEMPO_PREVISTO numeric(15,2),
    TEMPO_REALIZADO numeric(15,2),
    TEMPO_PREVISTO_OPERACIONAL numeric(15,2),
    TEMPO_PREVISTO_FERRAMENTA numeric(15,2),
    TEMPO_PREVISTO_AQUECIMENTO numeric(15,2),
    TEMPO_PREVISTO_APROVACAO numeric(15,2),
    TEMPO_REALIZADO_OPERACIONAL numeric(15,2),
    TEMPO_REALIZADO_FERRAMENTA numeric(15,2),
    TEMPO_REALIZADO_AQUECIMENTO numeric(15,2),
    TEMPO_REALIZADO_APROVACAO numeric(15,2),
    PERFIL_SKU varchar(10),
    TEMPO_PARADO numeric(15,2),
    PERDAS numeric(15,2),
    PERFIL_SKU_DESCRICAO varchar(500),
    PERDAS_PERC1 numeric(15,2),
    EFICIENCIA_MINIMA numeric(15,2),
    EFICIENCIA_A numeric(15,2),
    EFICIENCIA_B numeric(15,2),
    PERDAS_A numeric(15,2),
    PERDAS_B numeric(15,2),
    TEMPO_EXTRA numeric(15,2),
    TEMPO_EFIC numeric(15,2),
    TURNO integer,
    EFIC numeric(15,2))
as
begin

  for
    SELECT
    
            iif(PERDAS_PERC > 100,100,PERDAS_PERC) as PERDAS_PERC,
    
            iif(z.efic > 100,100,z.efic) as eficiencia,
            (TEMPO_PREVISTO_FERRAMENTA+
            TEMPO_PREVISTO_AQUECIMENTO+
            TEMPO_PREVISTO_APROVACAO) as SETUP_PREVISTO,
    
            (TEMPO_REALIZADO_FERRAMENTA+
            TEMPO_REALIZADO_AQUECIMENTO+
            TEMPO_REALIZADO_APROVACAO) as SETUP_REALIZADO,
    
            iif(z.efic < EFICIENCIA_A,1,
            iif(z.efic >= EFICIENCIA_A and z.efic <= EFICIENCIA_B,2,
            iif(z.efic > EFICIENCIA_B,3,0))) as cor_efic,
    
            coalesce((SELECT
                        list(j.descricao||': '||coalesce(p.observacao,''),',<br>') from
                    TBREGISTRO_PARADA P,
                    tbjustificativa J
                    where p.tabela = 'INEFICIENCIA'
                    and p.tabela_id = z.PROGRAMACAO_ID
                    and j.id = p.status)
    
            ,'') as JUSTIFICATIVA,
    
            z.*
    
        from(
        SELECT
            PROGRAMACAO_ID,
            REQUISICAO_ID,
            GP_ID,
            GP_DESCRICAO,
            UP_ID,
            UP_DESCRICAO,
            ESTACAO,
            ESTACAO_DESCRICAO,
            REMESSA,
            REMESSA_ID,
            REMESSA_DATA,
            REMESSA_TALAO_ID,
            TALAO_ID,
            PRODUTO_ID,
            PRODUTO_DESCRICAO,
            MODELO_ID,
            MODELO_DESCRICAO,
            COR_ID,
            COR_DESCRICAO,
            TAMANHO,
            TAMANHO_DESCRICAO,
            QUANTIDADE,
            UM,
            FERRAMENTA_ID,
            FERRAMENTA_DESCICAO,
            formatdatetime(DATAHORA_REALIZADO_INICIO) as DATAHORA_REALIZADO_INICIO,
            formatdatetime(DATAHORA_REALIZADO_FIM) as DATAHORA_REALIZADO_FIM,
            TEMPO_PREVISTO,
            TEMPO_REALIZADO,
            TEMPO_PREVISTO_OPERACIONAL,
            TEMPO_PREVISTO_FERRAMENTA,
            TEMPO_PREVISTO_AQUECIMENTO,
            TEMPO_PREVISTO_APROVACAO,
            IIF( TEMPO_REALIZADO_OPERACIONAL < 0, 0, TEMPO_REALIZADO_OPERACIONAL) TEMPO_REALIZADO_OPERACIONAL,
            TEMPO_REALIZADO_FERRAMENTA,
            TEMPO_REALIZADO_AQUECIMENTO,
            TEMPO_REALIZADO_APROVACAO,
            PERFIL_SKU,
            TEMPO_PARADO,
            TEMPO_EXTRA,
            PERDAS,
            PERFIL_SKU_DESCRICAO,
            cast(((PERDAS / iif(QUANTIDADE > 0,QUANTIDADE,1)) * 100) as numeric(15,2)) PERDAS_PERC,
            EFICIENCIA_MINIMA,
            EFICIENCIA_A,
            EFICIENCIA_B,
            PERDAS_A,
            PERDAS_B,
            iif(TEMPO_EFIC > 0, TEMPO_EFIC,0) as TEMPO_EFIC,

            (select first 1 b.codigo from tbturno_producao b where (COMPARE_HORA(b.hora_inicio,b.hora_fim,gethora(DATAHORA_REALIZADO_FIM))) = 1 and b.dia_semana = iif(gethora(DATAHORA_REALIZADO_FIM) < '07:00:00', (extract(weekday from DATAHORA_REALIZADO_FIM)-1),extract(weekday from DATAHORA_REALIZADO_FIM))) as turno,
            (TEMPO_PREVISTO_OPERACIONAL / iif(TEMPO_EFIC>0,TEMPO_EFIC,1) * 100) as efic
        
        FROM (
            SELECT
                ((TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) + TEMPO_EXTRA + TEMPO_PARADO) as TEMPO_EFIC,
                PROGRAMACAO_ID,
                REQUISICAO_ID,
                GP_ID,
                GP_DESCRICAO,
                UP_ID,
                UP_DESCRICAO,
                ESTACAO,
                ESTACAO_DESCRICAO,
                REMESSA,
                REMESSA_ID,
                REMESSA_DATA,
                REMESSA_TALAO_ID,
                TALAO_ID,
                PRODUTO_ID,
                PRODUTO_DESCRICAO,
                MODELO_ID,
                MODELO_DESCRICAO,
                COR_ID,
                COR_DESCRICAO,
                TAMANHO,
                TAMANHO_DESCRICAO,
                QUANTIDADE,
                UM,
                FERRAMENTA_ID,
                FERRAMENTA_DESCICAO,
                DATAHORA_REALIZADO_INICIO,
                DATAHORA_REALIZADO_FIM,
                TEMPO_PREVISTO,
                TEMPO_REALIZADO,
                TEMPO_PREVISTO_OPERACIONAL,
                TEMPO_PREVISTO_FERRAMENTA,
                TEMPO_PREVISTO_AQUECIMENTO,
                TEMPO_PREVISTO_APROVACAO,
                (TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) TEMPO_REALIZADO_OPERACIONAL,
                TEMPO_REALIZADO_FERRAMENTA,
                TEMPO_REALIZADO_AQUECIMENTO,
                TEMPO_REALIZADO_APROVACAO,
                TEMPO_PARADO,
                PERFIL_SKU,
                PERDAS,
                PF.descricao as PERFIL_SKU_DESCRICAO,
                PF.efic_minima as EFICIENCIA_MINIMA,
                PF.efic_a as EFICIENCIA_A,
                PF.efic_b as EFICIENCIA_B,
                PF.perda_a as PERDAS_A,
                PF.perda_b as PERDAS_B,
                TEMPO_EXTRA
            
            FROM (
                SELECT
                    P.ID                                            AS PROGRAMACAO_ID,   
                    A.REQUISICAO_ID                                 AS REQUISICAO_ID,
                    G.ID                                            AS GP_ID,
                    G.DESCRICAO                                     AS GP_DESCRICAO,
                    U.ID                                            AS UP_ID,
                    U.DESCRICAO                                     AS UP_DESCRICAO,
                    P.ESTACAO                                       AS ESTACAO,
                    SU.DESCRICAO                                    AS ESTACAO_DESCRICAO,
                    R.REMESSA                                       AS REMESSA,
                    T.REMESSA_ID                                    AS REMESSA_ID,
                    R.DATA                                          AS REMESSA_DATA,
                    T.REMESSA_TALAO_ID                              AS REMESSA_TALAO_ID,
                    T.ID                                            AS TALAO_ID,
                    PR.CODIGO                                       AS PRODUTO_ID,
                    PR.DESCRICAO                                    AS PRODUTO_DESCRICAO,
                    M.CODIGO                                        AS MODELO_ID,
                    M.DESCRICAO                                     AS MODELO_DESCRICAO,
                    C.CODIGO                                        AS COR_ID,
                    C.DESCRICAO                                     AS COR_DESCRICAO,
                    P.TAMANHO                                       AS TAMANHO,
                    TAMANHO_GRADE(GR.CODIGO,P.TAMANHO)              AS TAMANHO_DESCRICAO,
                    A.QUANTIDADE                                    AS QUANTIDADE,
                    PR.UNIDADEMEDIDA_SIGLA                          AS UM,
                    A.datahora_realizado_inicio                     AS DATAHORA_REALIZADO_INICIO,
                    A.DATAHORA_REALIZADO_FIM                        AS DATAHORA_REALIZADO_FIM,
                    P.TEMPO                                         AS TEMPO_PREVISTO,
                    A.TEMPO_REALIZADO                               AS TEMPO_REALIZADO,
                    A.TEMPO_OPERACIONAL                             AS TEMPO_PREVISTO_OPERACIONAL,
                    A.TEMPO_SETUP_FERRAMENTA                        AS TEMPO_PREVISTO_FERRAMENTA,
                    (A.TEMPO_SETUP_AQUECIMENTO + A.TEMPO_SETUP_COR) AS TEMPO_PREVISTO_AQUECIMENTO,
                    A.TEMPO_SETUP_APROVACAO                         AS TEMPO_PREVISTO_APROVACAO,
                    coalesce(a.tempo_parado,0)                      AS TEMPO_PARADO,
                    coalesce(a.tempo_estacao,0)                     AS TEMPO_EXTRA,

                
                    CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                     FROM TBREGISTRO_SETUP S
                                    WHERE S.TALAO_ID = P.TABELA_ID
                                      AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                      AND S.SETUP_ID = 1
                                      and S.DATAHORA_FIM > S.DATAHORA_INICIO),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_FERRAMENTA,
                
                
                   CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                    FROM TBREGISTRO_SETUP S
                                   WHERE S.TALAO_ID = P.TABELA_ID
                                     AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                     AND S.SETUP_ID = 2
                                     and S.DATAHORA_FIM > S.DATAHORA_INICIO),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_AQUECIMENTO,
                

                   CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                    FROM TBREGISTRO_SETUP S
                                   WHERE S.TALAO_ID = P.TABELA_ID
                                     AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                     AND S.SETUP_ID = 3
                                     and S.DATAHORA_FIM > S.DATAHORA_INICIO),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_APROVACAO,
            
                  (SELECT FIRST 1 SK.PERFIL
                     FROM VWSKU SK
                    WHERE SK.MODELO_ID = M.CODIGO
                     AND SK.COR_ID    = C.CODIGO
                     AND SK.TAMANHO   = T.TAMANHO) PERFIL_SKU,
        
                    A.FERRAMENTA_ID,
        
                    (SELECT FIRST 1 LPAD(F.SERIE,4,'0') || ' - ' || DESCRICAO FROM TBFERRAMENTARIA F WHERE F.ID = A.FERRAMENTA_ID) FERRAMENTA_DESCICAO,
    
                    coalesce((SELECT
                        SUM(D.quantidade) AS quantidade
                    FROM
                        TbDefeito_Transacao_Item D,
                        tbsac_defeito j
                    WHERE d.remessa           = r.remessa_id
                        AND d.remessa_controle  = t.remessa_talao_id
                        and d.defeito_id        = j.codigo
                        and j.conformacao       = '1'
                    ),0) as PERDAS
                
                FROM
                    TBPROGRAMACAO_REQUISICAO A,
                    TBPROGRAMACAO P,
                    VWREMESSA_TALAO T,
                    VWREMESSA R,
                    TBGP G,
                    TBUP U,
                    TBSUB_UP SU,
                    TBPRODUTO PR,
                    TBMODELO M,
                    TBCOR C,
                    TBGRADE GR
                
                WHERE p.gp_id    = :I_GP_ID
                and p.up_id    = :I_UP_ID
                AND P.ESTACAO  in(select * from split(:I_estacao,','))
        
                AND P.ID            = A.PROGRAMACAO_ID
                AND P.FERRAMENTA_ID > 0
                AND A.STATUS        = 3
                AND P.TIPO          = 'A'
                AND P.TABELA_ID     = T.ID
                AND R.REMESSA_ID    = T.REMESSA_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 PR.CODIGO       = P.PRODUTO_ID
                AND M.CODIGO        = PR.MODELO_CODIGO
                AND C.CODIGO        = PR.COR_CODIGO
                AND GR.CODIGO       = PR.GRADE_CODIGO
                AND A.DATAHORA_REALIZADO_FIM >= iif(:I_FLAG = 1, cast(cast(:i_data_inicio as date) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp),
                                                                 cast((select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from (select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1))) as timestamp))
                and iif(:i_flag = 1,
                    A.DATAHORA_REALIZADO_FIM BETWEEN

                    cast(cast(:i_data_inicio as date) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp)
                    and
                    cast(dateadd(day, 1 ,cast(:i_data_fim as date)) ||' '|| (select first 1 tt.hora_inicio - 0.0000001 from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp),


                    A.DATAHORA_REALIZADO_FIM >= cast((select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from (select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1))) as timestamp)
                )
        
            ) X, TBPERFIL PF
    
            where PF.tabela = 'SKU' and  PF.id = PERFIL_SKU
        ) Y
    )Z
    order by z.estacao,z.datahora_realizado_fim

  into
    :PERDAS_PERC,
    :EFICIENCIA,
    :SETUP_PREVISTO,
    :SETUP_REALIZADO,
    :COR_EFIC,
    :JUSTIFICATIVA,
    :PROGRAMACAO_ID,
    :REQUISICAO_ID,
    :GP_ID,
    :GP_DESCRICAO,
    :UP_ID,
    :UP_DESCRICAO,
    :ESTACAO,
    :ESTACAO_DESCRICAO,
    :REMESSA,
    :REMESSA_ID,
    :REMESSA_DATA,
    :REMESSA_TALAO_ID,
    :TALAO_ID,
    :PRODUTO_ID,
    :PRODUTO_DESCRICAO,
    :MODELO_ID,
    :MODELO_DESCRICAO,
    :COR_ID,
    :COR_DESCRICAO,
    :TAMANHO,
    :TAMANHO_DESCRICAO,
    :QUANTIDADE,
    :UM,
    :FERRAMENTA_ID,
    :FERRAMENTA_DESCICAO,
    :DATAHORA_REALIZADO_INICIO,
    :DATAHORA_REALIZADO_FIM,
    :TEMPO_PREVISTO,
    :TEMPO_REALIZADO,
    :TEMPO_PREVISTO_OPERACIONAL,
    :TEMPO_PREVISTO_FERRAMENTA,
    :TEMPO_PREVISTO_AQUECIMENTO,
    :TEMPO_PREVISTO_APROVACAO,
    :TEMPO_REALIZADO_OPERACIONAL,
    :TEMPO_REALIZADO_FERRAMENTA,
    :TEMPO_REALIZADO_AQUECIMENTO,
    :TEMPO_REALIZADO_APROVACAO,
    :PERFIL_SKU,
    :TEMPO_PARADO,
    :TEMPO_EXTRA,
    :PERDAS,
    :PERFIL_SKU_DESCRICAO,
    :PERDAS_PERC1,
    :EFICIENCIA_MINIMA,
    :EFICIENCIA_A,
    :EFICIENCIA_B,
    :PERDAS_A,
    :PERDAS_B,
    :TEMPO_EFIC,
    :TURNO,
    :EFIC
  do
  begin
    suspend;
  end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbregistro_setup_b02u for tbregistro_setup
active before update position 0
AS
begin
  if(old.datahora_fim is distinct from new.datahora_fim and new.datahora_inicio IS not null)then
  begin
    if(new.datahora_fim < new.datahora_inicio)then
    begin
        exception "..." 'DATA FIM DO SETUP NAO PODE SER MENOR QUE A DATA DE INICIO. ('||formatdatetime(new.datahora_fim)||' -> '||formatdatetime(new.datahora_inicio)||')';
    end
  end
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER trigger ttbprogramacao_b5u for tbprogramacao
active before update position 5
AS
declare variable status1 varchar(100);
declare variable status2 varchar(100);
begin

    if(OLD.STATUS IS distinct FROM NEW.status)then
    begin
    
       if(OLD.STATUS = 0)then begin status1 = '0 - PARADO'; end
       if(OLD.STATUS = 1)then begin status1 = '1 - INICIADO/PARADO'; end
       if(OLD.STATUS = 2)then begin status1 = '2 - EM ANDAMENTO'; end
       if(OLD.STATUS = 3)then begin status1 = '3 - FINALIZADO'; end
       if(OLD.STATUS = 6)then begin status1 = '6 - ENCERRADO'; end

       if(NEW.STATUS = 0)then begin status2 = '0 - PARADO'; end
       if(NEW.STATUS = 1)then begin status2 = '1 - INICIADO/PARADO'; end
       if(NEW.STATUS = 2)then begin status2 = '2 - EM ANDAMENTO'; end
       if(NEW.STATUS = 3)then begin status2 = '3 - FINALIZADO'; end
       if(NEW.STATUS = 6)then begin status2 = '6 - ENCERRADO'; end

       if(NEW.STATUS = 2)then
       begin
            new.status_solicitacao = 0;
       end

       execute procedure spi_historico('TBPROGRAMACAO', new.id, 'STATUS : '||status1||'->'||status2);
    end

    if(OLD.status_requisicao IS distinct FROM NEW.status_requisicao)then
    begin
    
       status1 = '';
       if(coalesce(NEW.status_requisicao,0) = 0)then begin status1 = 'REQUISICAO REMOVIDA'; end
       if(coalesce(NEW.status_requisicao,0) = 1)then begin status1 = 'REQUISICAO INSERIDA'; end

       new.status_solicitacao = 0;

       execute procedure spi_historico('TBPROGRAMACAO', new.id, status1);
    end


    IF ( NEW.FERRAMENTA_ID > 0 AND OLD.STATUS IS distinct FROM NEW.status AND NEW.STATUS = '3' ) THEN
    BEGIN

        new.status_solicitacao = 0;

        UPDATE OR INSERT INTO TBPROGRAMACAO_REQUISICAO (
            PROGRAMACAO_ID,
            REQUISICAO_ID,
            STATUS,
            FERRAMENTA_ID,
            TEMPO_PREVISTO,
            TEMPO_REALIZADO,
            TEMPO_OPERACIONAL,
            TEMPO_SETUP_FERRAMENTA,
            TEMPO_SETUP_AQUECIMENTO,
            TEMPO_SETUP_COR,
            TEMPO_SETUP_APROVACAO,
            DATAHORA_INICIO,
            DATAHORA_FIM,
            DATAHORA_REALIZADO_INICIO,
            DATAHORA_REALIZADO_FIM,
            QUANTIDADE,
            tempo_parado,
            tempo_estacao
        ) VALUES (
            NEW.ID,
            NEW.REQUISICAO_ID,
            NEW.STATUS,
            NEW.FERRAMENTA_ID,
            NEW.TEMPO,
            NEW.TEMPO_REALIZADO,
            NEW.TEMPO_OPERACIONAL, 
            NEW.TEMPO_SETUP_FERRAMENTA,
            NEW.TEMPO_SETUP_AQUECIMENTO,
            NEW.TEMPO_SETUP_COR,
            NEW.TEMPO_SETUP_APROVACAO,
            NEW.DATAHORA_INICIO,
            NEW.DATAHORA_FIM,
            --tempo parado
           (SELECT FIRST 1 R.DATAHORA
              FROM TBPROGRAMACAO_REGISTRO R
             WHERE R.PROGRAMACAO_ID = NEW.ID
               AND R.REQUISICAO_ID  = NEW.REQUISICAO_ID
               AND R.STATUS         = 0
             ORDER BY R.DATAHORA),
            CURRENT_TIMESTAMP,
            NEW.QUANTIDADE,

            coalesce((select
                       sum(coalesce(TEMPO_PARADO,0)) as TEMPO_PARADO
                    from(
                        select
                            iif((y.STATUS1 = 1) and (y.STATUS2 = 0) AND (rec = 0), (select sum(cast(PRODUTIVO as integer)) from spc_calendario_estacao(up_id,estacao_id,y.datahora1,y.datahora2)),0) as TEMPO_PARADO
                        from
                        (
                            SELECT
                                lead(x.status) over (order by x.datahora ascending) STATUS2,
                                lead(x.datahora) over (order by x.datahora ascending) datahora2,
                                iif((lag(X.requisicao_id) over (order by X.datahora ascending) = X.requisicao_id),0,1) AS rec,
                                x.status as status1,
                                x.datahora as datahora1,
                                u.up_id,
                                u.estacao as estacao_id,
                                u.gp_id
                            FROM tbprogramacao_registro x,
                                 tbprogramacao u,
                                 tbjustificativa l
                            WHERE x.programacao_id = new.id
                            AND x.status in (0,1)
                            and x.requisicao_id = new.requisicao_id
                            and u.id = x.programacao_id

                            and l.id = x.justificativa_id
                            and l.tipo = '1'

                            order by x.datahora ascending
                        ) y
                    )z),0),

               --tempo parado estacao
               coalesce((select
                        
                            (select sum(TEMPO_PARADO_EXTRA) from SPC_PARADA_ESTACAO(new.gp_id,new.up_id,j.estacao_id,j.ANTERIOR,j.DATAHORA) WHERE TEMPO_PARADO_EXTRA > 0) as TEMPO_EXTRA
                        
                        FROM
                        (select first 1
                            
                                r.*,
                        
                                (select first 1
                                    
                                        s.datahora
                                    
                                     from tbprogramacao_registro s, tbprogramacao q
                                    
                                    where s.datahora < r.datahora
                                    and s.status = 2
                                    and s.estacao_id = r.estacao_id
                                    and q.id = s.programacao_id
                                    and q.gp_id = new.gp_id
                                    and q.up_id = new.up_id
                            
                                    order by s.id descending
                            
                                ) as ANTERIOR
                            
                            from tbprogramacao_registro r
                            
                            where r.programacao_id = new.ID
                            and r.requisicao_id = new.REQUISICAO_ID
                            and r.status = 0
                        ) j),0)

        ) MATCHING (
            PROGRAMACAO_ID,
            REQUISICAO_ID
        );

    END
end
^

SET TERM ; ^



SET TERM ^ ;

CREATE OR ALTER function NF_TAM_GRAD (
    MODELO_ID integer,
    TAMANHO integer,
    QTD decimal(15,2),
    DESCI varchar(10))
returns integer
as
declare variable GRADE_CODIGO integer;
declare variable DESC_TAM varchar(300);
begin
  GRADE_CODIGO = coalesce((select first 1 M.grade_codigo FROM tbmodelo M WHERE M.codigo = :MODELO_ID),0);

  DESC_TAM = coalesce((
        select first 1
            G.t01||'|'||G.t02||'|'||G.t03||'|'||G.t04||'|'||G.t05||'|'||G.t06||'|'||G.t07||'|'||G.t08||'|'||G.t09||'|'||G.t10||'|'||
            G.t11||'|'||G.t12||'|'||G.t13||'|'||G.t14||'|'||G.t15||'|'||G.t16||'|'||G.t17||'|'||G.t18||'|'||G.t19||'|'||G.t20
        FROM tbgrade G
        WHERE G.codigo = :GRADE_CODIGO
      ),'|||||||||||||||||||||||||||||||');


  DESC_TAM = fn_array(DESC_TAM, TAMANHO,'|');

  IF(DESC_TAM = DESCI)THEN
  BEGIN
    return QTD;
  END ELSE
  BEGIN
    return 0;
  END

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbregistro_setup_b02u for tbregistro_setup
active before update position 0
AS
begin
    
  if(old.datahora_inicio is distinct from new.datahora_inicio and new.datahora_inicio IS not null)then
  begin
    if(new.datahora_inicio > dateadd(minute, 5, current_timestamp))then
    begin
        exception "..." 'ERRO NA DATA DE INICIO. ('||formatdatetime(new.datahora_inicio)||' -> '||formatdatetime(current_date)||')';
    end
  end

  if(old.datahora_fim is distinct from new.datahora_fim and new.datahora_inicio IS not null)then
  begin
    if(new.datahora_fim < new.datahora_inicio)then
    begin
        exception "..." 'DATA FIM DO SETUP NAO PODE SER MENOR QUE A DATA DE INICIO. ('||formatdatetime(new.datahora_fim)||' -> '||formatdatetime(new.datahora_inicio)||')';
    end
  end

end
^

SET TERM ; ^



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;

SET TERM ^ ;

CREATE OR ALTER trigger ttbregistro_setup_b02u for tbregistro_setup
active before update position 0
AS
begin
    
  if(old.datahora_inicio is distinct from new.datahora_inicio and new.datahora_inicio IS not null)then
  begin
    if(new.datahora_inicio > dateadd(minute, 5, current_timestamp))then
    begin
        exception "..." 'ERRO NA DATA DE INICIO. ID:'||new.talao_id||', ('||formatdatetime(new.datahora_inicio)||' -> '||formatdatetime(current_date)||')';
    end
  end

  if(old.datahora_fim is distinct from new.datahora_fim and new.datahora_inicio IS not null)then
  begin
    if(new.datahora_fim < new.datahora_inicio)then
    begin
        exception "..." 'DATA FIM DO SETUP NAO PODE SER MENOR QUE A DATA DE INICIO. ID:'||new.talao_id||', ('||formatdatetime(new.datahora_fim)||' -> '||formatdatetime(new.datahora_inicio)||')';
    end
  end

end
^

SET TERM ; ^

SET TERM ^ ;

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

  if(new.datahora_inicio IS not null)then
  begin
    if(new.datahora_inicio > dateadd(minute, 5, current_timestamp))then
    begin
        exception "..." 'ERRO NA DATA DE INICIO. ID:'||new.talao_id||', ('||formatdatetime(new.datahora_inicio)||' -> '||formatdatetime(current_date)||')';
    end
  end

end
^

SET TERM ; ^

ALTER TABLE TBREGISTRO_SETUP
    ADD FLAG INTEGER;

SET TERM ^ ;

CREATE trigger ttbregistro_setup_b99u for tbregistro_setup
active before update position 99
AS
begin
  new.flag = 0;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure AJUSTAR_SETUP_TALAO (
    I_TALAO_ID integer,
    I_SETUP_1 integer,
    I_SETUP_2 integer,
    I_SETUP_3 integer,
    I_DATA timestamp,
    I_REQUISICAO integer,
    I_REQUISICAO_ID integer)
as
declare variable V_ID integer;
declare variable V_SETUP_ID integer;
declare variable V_TALAO_ID integer;
declare variable V_DATAHORA_INICIO timestamp;
declare variable V_DATAHORA_FIM timestamp;
declare variable V_TEMPO numeric(18,9);
declare variable V_FIM integer;
declare variable V_DATAHORA_INICIO_A timestamp;
declare variable V_DATAHORA_FIM_A timestamp;
declare variable V_1 integer;
declare variable V_2 integer;
declare variable V_3 integer;
declare variable V_REQUISICAO_ID integer;
begin

    :V_DATAHORA_INICIO_A = null;
    :V_DATAHORA_FIM_A    = null;

    :V_1 = 0;
    :V_2 = 0;
    :V_3 = 0;

  for

    select
    
        n.ID,
        n.SETUP_ID,
        n.TALAO_ID,
        n.DATAHORA_INICIO,
        n.DATAHORA_FIM,
        coalesce(n.datahora_fim - n.DATAHORA_INICIO,0) as TEMPO,
        iif(n.datahora_fim is null,0,1) FIM,
        n.requisicao_id
    
    from TBREGISTRO_SETUP n
    where n.talao_id = :I_TALAO_ID
    AND N.requisicao_id = :I_REQUISICAO_ID

    order by n.setup_id, n.id desc

  into
      :V_ID,
      :V_SETUP_ID,
      :V_TALAO_ID,
      :V_DATAHORA_INICIO,
      :V_DATAHORA_FIM,
      :V_TEMPO,
      :V_FIM,
      :v_requisicao_id
  do
  begin
    
    if(:V_SETUP_ID = 1)then
    begin
        :V_1 = 1;
    end
    if(:V_SETUP_ID = 2)then
    begin
        :V_2 = 1;
    end
    if(:V_SETUP_ID = 3)then
    begin
        :V_3 = 1;
    end

    if(V_DATAHORA_FIM is null)then
    begin

       if(:V_SETUP_ID = 1 and :I_SETUP_1 > 0)then
       begin
            update tbregistro_setup n set n.datahora_fim = (n.datahora_inicio + (:I_SETUP_1 * (1.000000000 / (24 * 60)) ))  where n.talao_id = :i_talao_id and n.requisicao_id = :I_REQUISICAO_ID;
       end

       if(:V_SETUP_ID = 2 and :I_SETUP_2 > 0)then
       begin
            update tbregistro_setup n set n.datahora_fim = (n.datahora_inicio + (:I_SETUP_2 * (1.000000000 / (24 * 60)) ))  where n.talao_id = :i_talao_id and n.requisicao_id = :I_REQUISICAO_ID;
       end

       if(:V_SETUP_ID = 3 and :I_SETUP_3 > 0)then
       begin
            update tbregistro_setup n set n.datahora_fim = (n.datahora_inicio + (:I_SETUP_3 * (1.000000000 / (24 * 60)) ))  where n.talao_id = :i_talao_id and n.requisicao_id = :I_REQUISICAO_ID;
       end

    end

    if(:V_SETUP_ID = 1 and :I_SETUP_1 > 0)then
    begin
        :V_DATAHORA_FIM_A    = (:V_DATAHORA_INICIO + (:I_SETUP_1 * (1.000000000 / (24 * 60)) ));
    END

    if(:V_SETUP_ID = 2 and :I_SETUP_2 > 0)then
    begin
        :V_DATAHORA_FIM_A    = (:V_DATAHORA_INICIO + (:I_SETUP_2 * (1.000000000 / (24 * 60)) ));
    END

    if(:V_SETUP_ID = 3 and :I_SETUP_3 > 0)then
    begin
        :V_DATAHORA_FIM_A    = (:V_DATAHORA_INICIO + (:I_SETUP_3 * (1.000000000 / (24 * 60)) ));
    END

  end
        if(:V_DATAHORA_FIM_A IS NULL)then
        begin
            :V_DATAHORA_FIM_A = I_DATA;
        END


        if((:I_SETUP_1 > 0) and (:V_1 = 0))then
        begin
            INSERT INTO TBREGISTRO_SETUP (SETUP_ID, DATAHORA_INICIO, datahora_fim, TALAO_ID, REQUISICAO, REQUISICAO_ID, FLAG)
            VALUES (
                1,
                (:V_DATAHORA_FIM_A + (1.000000000 / (24 * 60 * 60))),
                (:V_DATAHORA_FIM_A + (:I_SETUP_1 * (1.000000000 / (24 * 60)) )),
                 :I_TALAO_ID,
                 :I_REQUISICAO,
                 :I_REQUISICAO_ID,
                 1
            );

            :V_DATAHORA_FIM_A    = (:V_DATAHORA_FIM_A + (:I_SETUP_1 * (1.000000000 / (24 * 60)) ));
        end

        if((:I_SETUP_2 > 0) and (:V_2 = 0))then
        begin
            INSERT INTO TBREGISTRO_SETUP (SETUP_ID, DATAHORA_INICIO, datahora_fim, TALAO_ID, REQUISICAO, REQUISICAO_ID, FLAG)
            VALUES (
                2,
                (:V_DATAHORA_FIM_A + (1.000000000 / (24 * 60 * 60))),
                (:V_DATAHORA_FIM_A + (:I_SETUP_2 * (1.000000000 / (24 * 60)) )),
                 :I_TALAO_ID,
                 :I_REQUISICAO,
                 :I_REQUISICAO_ID,
                 1
            );

            :V_DATAHORA_FIM_A    = (:V_DATAHORA_FIM_A + (:I_SETUP_2 * (1.000000000 / (24 * 60)) ));
        end

        if((:I_SETUP_3 > 0) and (:V_3 = 0))then
        begin
            INSERT INTO TBREGISTRO_SETUP (SETUP_ID, DATAHORA_INICIO, datahora_fim, TALAO_ID, REQUISICAO, REQUISICAO_ID, FLAG)
            VALUES (
                3,
                (:V_DATAHORA_FIM_A + (1.000000000 / (24 * 60 * 60))),
                (:V_DATAHORA_FIM_A + (:I_SETUP_3 * (1.000000000 / (24 * 60)) )),
                 :I_TALAO_ID,
                 :I_REQUISICAO,
                 :I_REQUISICAO_ID,
                 1
            );

            :V_DATAHORA_FIM_A = (:V_DATAHORA_FIM_A + (:I_SETUP_3 * (1.000000000 / (24 * 60)) ));
        end

end
^

SET TERM ; ^

SET TERM ^ ;

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

  new.flag = coalesce(new.flag,0);

  if(new.datahora_inicio IS not null and new.flag = 0)then
  begin
    if((new.datahora_inicio > dateadd(minute, 5, current_timestamp)) or (new.datahora_inicio < dateadd(minute, -5, current_timestamp)))then
    begin
        exception "..." 'ERRO NA DATA DE INICIO. ID:'||new.talao_id||', ('||formatdatetime(new.datahora_inicio)||' -> '||formatdatetime(current_timestamp)||')';
    end
  end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbregistro_setup_b02u for tbregistro_setup
active before update position 0
AS
begin
    
  if(old.datahora_inicio is distinct from new.datahora_inicio and new.datahora_inicio IS not null)then
  begin
    if(new.datahora_inicio > dateadd(minute, 5, current_timestamp))then
    begin
        exception "..." 'ERRO NA DATA DE INICIO. ID:'||new.talao_id||', ('||formatdatetime(new.datahora_inicio)||' -> '||formatdatetime(current_timestamp)||')';
    end
  end

  if(old.datahora_fim is distinct from new.datahora_fim and new.datahora_inicio IS not null)then
  begin
    if(new.datahora_fim < new.datahora_inicio)then
    begin
        exception "..." 'DATA FIM DO SETUP NAO PODE SER MENOR QUE A DATA DE INICIO. ID:'||new.talao_id||', ('||formatdatetime(new.datahora_fim)||' -> '||formatdatetime(new.datahora_inicio)||')';
    end
  end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbregistro_setup_b99u for tbregistro_setup
active before insert or update position 99
AS
begin
  new.flag = 0;
end
^

SET TERM ; ^

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(f.modelo_codigo, f.cor_codigo) as DEN_ESP,
            iif(p.tamanho =  0, t.largura,
            iif(p.tamanho =  1, t.largura_t01,
            iif(p.tamanho =  2, t.largura_t02,
            iif(p.tamanho =  3, t.largura_t03,
            iif(p.tamanho =  4, t.largura_t04,
            iif(p.tamanho =  5, t.largura_t05,
            iif(p.tamanho =  6, t.largura_t06,
            iif(p.tamanho =  7, t.largura_t07,
            iif(p.tamanho =  8, t.largura_t08,
            iif(p.tamanho =  9, t.largura_t09,
            iif(p.tamanho = 10, t.largura_t10,
            iif(p.tamanho = 11, t.largura_t11,
            iif(p.tamanho = 12, t.largura_t12,
            iif(p.tamanho = 13, t.largura_t13,
            iif(p.tamanho = 14, t.largura_t14,
            iif(p.tamanho = 15, t.largura_t15,
            iif(p.tamanho = 16, t.largura_t16,
            iif(p.tamanho = 17, t.largura_t17,
            iif(p.tamanho = 18, t.largura_t18,
            iif(p.tamanho = 19, t.largura_t19,
            iif(p.tamanho = 20, t.largura_t20,
            0))))))))))))))))))))) as LARGURA,
        
            iif(p.tamanho =  1, t.comprimento_t01,
            iif(p.tamanho =  2, t.comprimento_t02,
            iif(p.tamanho =  3, t.comprimento_t03,
            iif(p.tamanho =  4, t.comprimento_t04,
            iif(p.tamanho =  5, t.comprimento_t05,
            iif(p.tamanho =  6, t.comprimento_t06,
            iif(p.tamanho =  7, t.comprimento_t07,
            iif(p.tamanho =  8, t.comprimento_t08,
            iif(p.tamanho =  9, t.comprimento_t09,
            iif(p.tamanho = 10, t.comprimento_t10,
            iif(p.tamanho = 11, t.comprimento_t11,
            iif(p.tamanho = 12, t.comprimento_t12,
            iif(p.tamanho = 13, t.comprimento_t13,
            iif(p.tamanho = 14, t.comprimento_t14,
            iif(p.tamanho = 15, t.comprimento_t15,
            iif(p.tamanho = 16, t.comprimento_t16,
            iif(p.tamanho = 17, t.comprimento_t17,
            iif(p.tamanho = 18, t.comprimento_t18,
            iif(p.tamanho = 19, t.comprimento_t19,
            iif(p.tamanho = 20, t.comprimento_t20,
            0)))))))))))))))))))) as COMPRIMENTO,

            iif(p.tamanho =  1, t.quantidade_t01,
            iif(p.tamanho =  2, t.quantidade_t02,
            iif(p.tamanho =  3, t.quantidade_t03,
            iif(p.tamanho =  4, t.quantidade_t04,
            iif(p.tamanho =  5, t.quantidade_t05,
            iif(p.tamanho =  6, t.quantidade_t06,
            iif(p.tamanho =  7, t.quantidade_t07,
            iif(p.tamanho =  8, t.quantidade_t08,
            iif(p.tamanho =  9, t.quantidade_t09,
            iif(p.tamanho = 10, t.quantidade_t10,
            iif(p.tamanho = 11, t.quantidade_t11,
            iif(p.tamanho = 12, t.quantidade_t12,
            iif(p.tamanho = 13, t.quantidade_t13,
            iif(p.tamanho = 14, t.quantidade_t14,
            iif(p.tamanho = 15, t.quantidade_t15,
            iif(p.tamanho = 16, t.quantidade_t16,
            iif(p.tamanho = 17, t.quantidade_t17,
            iif(p.tamanho = 18, t.quantidade_t18,
            iif(p.tamanho = 19, t.quantidade_t19,
            iif(p.tamanho = 20, t.quantidade_t20,
            0)))))))))))))))))))) as PACA_QTD_PARES
        
          from tbremessa_item_processado p, tbmatriz t, tbproduto f, tbcor c
          where p.remessa = :REMESSA_ID
          and p.controle = :REMESSA_TALAO_ID
          and t.codigo = p.matriz_codigo
          and f.codigo = p.produto_codigo
          and c.codigo = f.cor_codigo

    ) x into
        MATRIZ_CODIGO,
        TAMANHO,
        PRODUTO_CODIGO,
        MODELO_CODIGO,
        COR_ID,
        COR_DESCRICAO,
        LARGURA,
        COMPRIMENTO,
        PACA_QTD_PARES,
        DENSIDADE,
        ESPESSURA;

    MATRIZ_CODIGO = coalesce(MATRIZ_CODIGO,0);

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

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

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

    for
        select
            ID,
            ESTABELECIMENTO_ID,
            LOCALIZACAO_ID,
            iif(saldo_estoque > saldo_peca, saldo_peca, saldo_estoque) as saldo,
            saldo_ALOCADO AS ALOCADO,
            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 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(100);
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

    if( coalesce(new.tipo,0) = 0 )then
    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')
            order by DIF_TOTAL ascending
        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, DENSIDADE, ESPESSURA
                ) VALUES (
                    :PRODUTO_ID, :QTD_GRAVAR, :QTD_GRAVAR, new.ID, :ESTABELECIMENTO_ID, :LOCALIZACAO_ID, new.densidade, new.espessura
                );
           end
        end
    
        if(QTD_SALDO_BOJO > 0)then
        begin
            exception "..." 'Sem saldo para alocação';
        end
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REQUISICAO_BOJO_V2 (
    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,
    QUANTIDADE_PLACA_APROVEITADA integer,
    QUANTIDADE_PARES_APROVEITADA integer,
    SALDO_PARES integer,
    QUANTIDADE_PLACA_ESTOQUE 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(50);
declare variable PECA_SALDO numeric(18,4);
declare variable PECA_QTD_PARES numeric(18,4);
declare variable CONT integer;
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 SALDO_PARES FROM SPC_REQUISICAO_BOJO_V2(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,
            TBPRODUTO G1,
            TBPRODUTO G2,
            TBMODELO  F1,
            TBMODELO  F2
        WHERE G1.CODIGO      = :PRODUTO_ID
        AND F1.CODIGO        = G1.MODELO_CODIGO
        AND F1.MODELO_PAI    = F2.MODELO_PAI
        AND G2.MODELO_CODIGO = F2.CODIGO
        AND G2.CODIGO        = P.PRODUTO_ID
        AND G1.COR_CODIGO    = G2.COR_CODIGO
        AND P.TAMANHO        = :TAMANHO
        AND P.GP_ID          = :GP_ID
        AND R2.REMESSA_ID    = :REMESSA_ID
        AND R.REMESSA_ID     = P.REMESSA_ID
        --AND R.REMESSA_ID        <> R2.REMESSA_ID
        AND IIF(P.remessa_id = R2.remessa_id, P.remessa_talao_id <> :REMESSA_TALAO_ID, P.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);


    SELECT SUM(S.QUANTIDADE), SUM(S.PARES)
      FROM TBREQUISICAO R,
           TBREQUISICAO_PLACA 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
       and s.status < 3
    into QUANTIDADE_PLACA_APROVEITADA, QUANTIDADE_PARES_APROVEITADA;

    QUANTIDADE_PLACA_APROVEITADA = COALESCE(QUANTIDADE_PLACA_APROVEITADA, 0);
    QUANTIDADE_PARES_APROVEITADA = COALESCE(QUANTIDADE_PARES_APROVEITADA, 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_PARES_APROVEITADA;
    QUANTIDADE_SALDO = IIF(QUANTIDADE_SALDO < 0,0,QUANTIDADE_SALDO);
    SALDO_PARES      = QUANTIDADE_SALDO;

    QUANTIDADE_SOBRA = iif(QUANTIDADE_SALDO > QUANTIDADE_SOBRA, QUANTIDADE_SOBRA , QUANTIDADE_SALDO   );
    QUANTIDADE_SALDO = iif(QUANTIDADE_SALDO > QUANTIDADE_SOBRA, QUANTIDADE_SALDO - QUANTIDADE_SOBRA, 0);

    QTD_SALDO_BOJO = QUANTIDADE_SALDO;

    QTD_SALDO_BOJO_PARES = QUANTIDADE_SALDO;
    REQUISITAR_PLACAS    = 0;
    QUANTIDADE_PLACAS    = 0;
    PECA_QTD_PARES       = 0;
    PLACAS               = null;
    QUANTIDADE_PLACA_ESTOQUE = 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
        order by DIF_TOTAL ascending
    into
        PECA_DENSIDADE,
        PECA_ESPESSURA,
        PECA_LARGURA,
        PECA_COMPRIMENTO,
        PECA_COR_ID,
        PECA_COR_DESCRICAO,
        PECA_SALDO,
        PECA_QTD_PARES
    do begin

        QUANTIDADE_PLACA_ESTOQUE = QUANTIDADE_PLACA_ESTOQUE + PECA_SALDO;

        if(REQUISITAR_PLACAS = 0)then
        begin
           QTD_SALDO_BOJO = fn_arrendondar_para_cima(QTD_SALDO_BOJO / PECA_QTD_PARES);
        end

       REQUISITAR_PLACAS = 1;

       if( QTD_SALDO_BOJO > 0 )then
       begin

            if(QTD_SALDO_BOJO <= PECA_SALDO)then
            begin

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

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

            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_v2(
                    fn_to_par_json('PECA_DENSIDADE'     ,coalesce(PECA_DENSIDADE,0)),
                    fn_to_par_json('PECA_ESPESSURA'     ,coalesce(PECA_ESPESSURA,0)),
                    fn_to_par_json('PECA_LARGURA'       ,coalesce(PECA_LARGURA,0)),
                    fn_to_par_json('PECA_COMPRIMENTO'   ,coalesce(PECA_COMPRIMENTO,0)),
                    fn_to_par_json('PECA_COR_ID'        ,coalesce(PECA_COR_ID,0)),
                    fn_to_par_json('PECA_COR_DESCRICAO' ,coalesce(PECA_COR_DESCRICAO,'')),
                    fn_to_par_json('PECA_SALDO'         ,coalesce(PECA_SALDO,0)),
                    fn_to_par_json('PECA_QTD_PARES'     ,coalesce(PECA_QTD_PARES,0)),
                    fn_to_par_json('QTD'                ,coalesce(PECA_SALDO,0))
                );

                /*
                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(PLACAS = '[]')then
    begin
        REQUISITAR_PLACAS = 0;
        QUANTIDADE_PLACAS = 0;
    end

    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
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REQUISICAO_BOJO_V3 (
    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 varchar(200),
    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,
    QUANTIDADE_PLACA_APROVEITADA integer,
    QUANTIDADE_PARES_APROVEITADA integer,
    SALDO_PARES integer,
    QUANTIDADE_PLACA_ESTOQUE 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(50);
declare variable PECA_SALDO numeric(18,4);
declare variable PECA_QTD_PARES numeric(18,4);
declare variable CONT integer;
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
            list(distinct REMESSA_ID,', ') as REMESSA_ID,
            0,
            sum(SALDO_ANTERIOR) as SALDO_ANTERIOR
        from(
        SELECT
            X.REMESSA_ID,
            X.REMESSA_TALAO_ID,
            (SELECT FIRST 1 SALDO_PARES FROM SPC_REQUISICAO_BOJO_V3(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,
                max(P.REMESSA_TALAO_ID) REMESSA_TALAO_ID,
                MIN(R.DATA) DATA
            FROM
                VWREMESSA_TALAO P,
                VWREMESSA R,
                VWREMESSA R2,
                TBPRODUTO G1,
                TBPRODUTO G2,
                TBMODELO  F1,
                TBMODELO  F2
            WHERE G1.CODIGO      = :PRODUTO_ID
            AND F1.CODIGO        = G1.MODELO_CODIGO
            AND F1.MODELO_PAI    = F2.MODELO_PAI
            AND G2.MODELO_CODIGO = F2.CODIGO
            AND G2.CODIGO        = P.PRODUTO_ID
            AND G1.COR_CODIGO    = G2.COR_CODIGO
            AND P.TAMANHO        = :TAMANHO
            AND P.GP_ID          = :GP_ID
            AND R2.REMESSA_ID    = :REMESSA_ID
            AND R.REMESSA_ID     = P.REMESSA_ID
            --AND R.REMESSA_ID        <> R2.REMESSA_ID
            AND IIF(P.remessa_id = R2.remessa_id, P.remessa_talao_id <> :REMESSA_TALAO_ID and g1.codigo <> g2.codigo, P.remessa_id <> R2.remessa_id)
            AND R.DATA              <= R2.DATA
            AND P.REMESSA_TALAO_ID  < 8000
            AND DATEDIFF(DAY, R.DATA, CURRENT_DATE) <= 15 /* 15 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);

    /*
    ID = COALESCE((
        SELECT first 1 r.id
          FROM TBREQUISICAO R
         WHERE R.REMESSA       = :REMESSA_ID
           AND R.PRODUTO_ID    = :PRODUTO_ID
           AND R.TAMANHO       = :TAMANHO
           AND R.GP_ID         = :GP_ID
    ),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);


    SELECT SUM(S.QUANTIDADE), SUM(S.PARES)
      FROM TBREQUISICAO R,
           TBREQUISICAO_PLACA 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
       and s.status < 3
    into QUANTIDADE_PLACA_APROVEITADA, QUANTIDADE_PARES_APROVEITADA;

    QUANTIDADE_PLACA_APROVEITADA = COALESCE(QUANTIDADE_PLACA_APROVEITADA, 0);
    QUANTIDADE_PARES_APROVEITADA = COALESCE(QUANTIDADE_PARES_APROVEITADA, 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
           AND R.STATUS <> '6'
    ),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 R.STATUS <> '6'
           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_PARES_APROVEITADA;
    QUANTIDADE_SALDO = IIF(QUANTIDADE_SALDO < 0,0,QUANTIDADE_SALDO);
    SALDO_PARES      = QUANTIDADE_SALDO;

    QUANTIDADE_SOBRA = iif(QUANTIDADE_SALDO > QUANTIDADE_SOBRA, QUANTIDADE_SOBRA , QUANTIDADE_SALDO   );
    QUANTIDADE_SALDO = iif(QUANTIDADE_SALDO > QUANTIDADE_SOBRA, QUANTIDADE_SALDO - QUANTIDADE_SOBRA, 0);

    if(QUANTIDADE_SOBRA < 0)then
    begin
        QUANTIDADE_SOBRA = 0;
    end

    QTD_SALDO_BOJO = QUANTIDADE_SALDO;

    QTD_SALDO_BOJO_PARES = QUANTIDADE_SALDO;
    REQUISITAR_PLACAS    = 0;
    QUANTIDADE_PLACAS    = 0;
    PECA_QTD_PARES       = 0;
    PLACAS               = null;
    QUANTIDADE_PLACA_ESTOQUE = 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
        order by DIF_TOTAL ascending
    into
        PECA_DENSIDADE,
        PECA_ESPESSURA,
        PECA_LARGURA,
        PECA_COMPRIMENTO,
        PECA_COR_ID,
        PECA_COR_DESCRICAO,
        PECA_SALDO,
        PECA_QTD_PARES
    do begin

        QUANTIDADE_PLACA_ESTOQUE = QUANTIDADE_PLACA_ESTOQUE + PECA_SALDO;

        if(REQUISITAR_PLACAS = 0)then
        begin
           QTD_SALDO_BOJO = fn_arrendondar_para_cima(QTD_SALDO_BOJO / PECA_QTD_PARES);
        end

       REQUISITAR_PLACAS = 1;

       if( QTD_SALDO_BOJO > 0 )then
       begin

            if(QTD_SALDO_BOJO <= PECA_SALDO)then
            begin
                /*
                PLACAS = coalesce(PLACAS||',','[')||fn_to_json_v2(
                    fn_to_par_json('PECA_DENSIDADE'     ,coalesce(PECA_DENSIDADE,0)),
                    fn_to_par_json('PECA_ESPESSURA'     ,coalesce(PECA_ESPESSURA,0)),
                    fn_to_par_json('PECA_LARGURA'       ,coalesce(PECA_LARGURA,0)),
                    fn_to_par_json('PECA_COMPRIMENTO'   ,coalesce(PECA_COMPRIMENTO,0)),
                    fn_to_par_json('PECA_COR_ID'        ,coalesce(PECA_COR_ID,0)),
                    fn_to_par_json('PECA_COR_DESCRICAO' ,coalesce(PECA_COR_DESCRICAO,'')),
                    fn_to_par_json('PECA_SALDO'         ,coalesce(PECA_SALDO,0)),
                    fn_to_par_json('PECA_QTD_PARES'     ,coalesce(PECA_QTD_PARES,0)),
                    fn_to_par_json('QTD'                ,coalesce(QTD_SALDO_BOJO,0))
                );
                */

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

            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_v2(
                    fn_to_par_json('PECA_DENSIDADE'     ,coalesce(PECA_DENSIDADE,0)),
                    fn_to_par_json('PECA_ESPESSURA'     ,coalesce(PECA_ESPESSURA,0)),
                    fn_to_par_json('PECA_LARGURA'       ,coalesce(PECA_LARGURA,0)),
                    fn_to_par_json('PECA_COMPRIMENTO'   ,coalesce(PECA_COMPRIMENTO,0)),
                    fn_to_par_json('PECA_COR_ID'        ,coalesce(PECA_COR_ID,0)),
                    fn_to_par_json('PECA_COR_DESCRICAO' ,coalesce(PECA_COR_DESCRICAO,'')),
                    fn_to_par_json('PECA_SALDO'         ,coalesce(PECA_SALDO,0)),
                    fn_to_par_json('PECA_QTD_PARES'     ,coalesce(PECA_QTD_PARES,0)),
                    fn_to_par_json('QTD'                ,coalesce(PECA_SALDO,0))
                );
                */

            end

       end

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


    end

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

    if(PLACAS = '[]')then
    begin
        REQUISITAR_PLACAS = 0;
        QUANTIDADE_PLACAS = 0;
    end

    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
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REQUISICAO_BOJO_V4 (
    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 varchar(200),
    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,
    QUANTIDADE_PLACA_APROVEITADA integer,
    QUANTIDADE_PARES_APROVEITADA integer,
    SALDO_PARES integer,
    QUANTIDADE_PLACA_ESTOQUE 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(50);
declare variable PECA_SALDO numeric(18,4);
declare variable PECA_QTD_PARES numeric(18,4);
declare variable CONT integer;
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
            list(distinct REMESSA_ID,', ') as REMESSA_ID,
            0,
            sum(SALDO_ANTERIOR) as SALDO_ANTERIOR
        from(
        SELECT
            X.REMESSA_ID,
            X.REMESSA_TALAO_ID,
            (SELECT FIRST 1 SALDO_PARES FROM SPC_REQUISICAO_BOJO_V4(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,
                max(P.REMESSA_TALAO_ID) REMESSA_TALAO_ID,
                MIN(R.DATA) DATA
            FROM
                VWREMESSA_TALAO P,
                VWREMESSA R,
                VWREMESSA R2,
                TBPRODUTO G1,
                TBPRODUTO G2,
                TBMODELO  F1,
                TBMODELO  F2
            WHERE G1.CODIGO      = :PRODUTO_ID
            AND F1.CODIGO        = G1.MODELO_CODIGO
            AND F1.MODELO_PAI    = F2.MODELO_PAI
            AND G2.MODELO_CODIGO = F2.CODIGO
            AND G2.CODIGO        = P.PRODUTO_ID
            AND G1.COR_CODIGO    = G2.COR_CODIGO
            AND P.TAMANHO        = :TAMANHO
            AND P.GP_ID          = :GP_ID
            AND R2.REMESSA_ID    = :REMESSA_ID
            AND R.REMESSA_ID     = P.REMESSA_ID
            --AND R.REMESSA_ID        <> R2.REMESSA_ID
            AND IIF(P.remessa_id = R2.remessa_id, P.remessa_talao_id <> :REMESSA_TALAO_ID and g1.codigo <> g2.codigo, P.remessa_id <> R2.remessa_id)
            AND R.DATA              <= R2.DATA
            AND P.REMESSA_TALAO_ID  < 6000
            AND DATEDIFF(DAY, R.DATA, CURRENT_DATE) <= 15 /* 15 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);

    /*
    ID = COALESCE((
        SELECT first 1 r.id
          FROM TBREQUISICAO R
         WHERE R.REMESSA       = :REMESSA_ID
           AND R.PRODUTO_ID    = :PRODUTO_ID
           AND R.TAMANHO       = :TAMANHO
           AND R.GP_ID         = :GP_ID
    ),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);


    SELECT SUM(S.QUANTIDADE), SUM(S.PARES)
      FROM TBREQUISICAO R,
           TBREQUISICAO_PLACA 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
       and s.status < 3
    into QUANTIDADE_PLACA_APROVEITADA, QUANTIDADE_PARES_APROVEITADA;

    QUANTIDADE_PLACA_APROVEITADA = COALESCE(QUANTIDADE_PLACA_APROVEITADA, 0);
    QUANTIDADE_PARES_APROVEITADA = COALESCE(QUANTIDADE_PARES_APROVEITADA, 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
           AND R.STATUS <> '6'
    ),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 R.STATUS <> '6'
           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_PARES_APROVEITADA;
    QUANTIDADE_SALDO = IIF(QUANTIDADE_SALDO < 0,0,QUANTIDADE_SALDO);
    SALDO_PARES      = QUANTIDADE_SALDO;

    QUANTIDADE_SOBRA = iif(QUANTIDADE_SALDO > QUANTIDADE_SOBRA, QUANTIDADE_SOBRA , QUANTIDADE_SALDO   );
    QUANTIDADE_SALDO = iif(QUANTIDADE_SALDO > QUANTIDADE_SOBRA, QUANTIDADE_SALDO - QUANTIDADE_SOBRA, 0);

    if(QUANTIDADE_SOBRA < 0)then
    begin
        QUANTIDADE_SOBRA = 0;
    end

    QTD_SALDO_BOJO = QUANTIDADE_SALDO;

    QTD_SALDO_BOJO_PARES = QUANTIDADE_SALDO;
    REQUISITAR_PLACAS    = 0;
    QUANTIDADE_PLACAS    = 0;
    PECA_QTD_PARES       = 0;
    PLACAS               = null;
    QUANTIDADE_PLACA_ESTOQUE = 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
        order by DIF_TOTAL ascending
    into
        PECA_DENSIDADE,
        PECA_ESPESSURA,
        PECA_LARGURA,
        PECA_COMPRIMENTO,
        PECA_COR_ID,
        PECA_COR_DESCRICAO,
        PECA_SALDO,
        PECA_QTD_PARES
    do begin

        QUANTIDADE_PLACA_ESTOQUE = QUANTIDADE_PLACA_ESTOQUE + PECA_SALDO;

        if(REQUISITAR_PLACAS = 0)then
        begin
           QTD_SALDO_BOJO = fn_arrendondar_para_cima(QTD_SALDO_BOJO / PECA_QTD_PARES);
        end

       REQUISITAR_PLACAS = 1;

       if( QTD_SALDO_BOJO > 0 )then
       begin

            if(QTD_SALDO_BOJO <= PECA_SALDO)then
            begin
                /*
                PLACAS = coalesce(PLACAS||',','[')||fn_to_json_v2(
                    fn_to_par_json('PECA_DENSIDADE'     ,coalesce(PECA_DENSIDADE,0)),
                    fn_to_par_json('PECA_ESPESSURA'     ,coalesce(PECA_ESPESSURA,0)),
                    fn_to_par_json('PECA_LARGURA'       ,coalesce(PECA_LARGURA,0)),
                    fn_to_par_json('PECA_COMPRIMENTO'   ,coalesce(PECA_COMPRIMENTO,0)),
                    fn_to_par_json('PECA_COR_ID'        ,coalesce(PECA_COR_ID,0)),
                    fn_to_par_json('PECA_COR_DESCRICAO' ,coalesce(PECA_COR_DESCRICAO,'')),
                    fn_to_par_json('PECA_SALDO'         ,coalesce(PECA_SALDO,0)),
                    fn_to_par_json('PECA_QTD_PARES'     ,coalesce(PECA_QTD_PARES,0)),
                    fn_to_par_json('QTD'                ,coalesce(QTD_SALDO_BOJO,0))
                );
                */

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

            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_v2(
                    fn_to_par_json('PECA_DENSIDADE'     ,coalesce(PECA_DENSIDADE,0)),
                    fn_to_par_json('PECA_ESPESSURA'     ,coalesce(PECA_ESPESSURA,0)),
                    fn_to_par_json('PECA_LARGURA'       ,coalesce(PECA_LARGURA,0)),
                    fn_to_par_json('PECA_COMPRIMENTO'   ,coalesce(PECA_COMPRIMENTO,0)),
                    fn_to_par_json('PECA_COR_ID'        ,coalesce(PECA_COR_ID,0)),
                    fn_to_par_json('PECA_COR_DESCRICAO' ,coalesce(PECA_COR_DESCRICAO,'')),
                    fn_to_par_json('PECA_SALDO'         ,coalesce(PECA_SALDO,0)),
                    fn_to_par_json('PECA_QTD_PARES'     ,coalesce(PECA_QTD_PARES,0)),
                    fn_to_par_json('QTD'                ,coalesce(PECA_SALDO,0))
                );
                */

            end

       end

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


    end

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

    if(PLACAS = '[]')then
    begin
        REQUISITAR_PLACAS = 0;
        QUANTIDADE_PLACAS = 0;
    end

    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
^

SET TERM ; ^

