

CREATE OR ALTER procedure SPU_REQUISICAO_BOJO (
    ID integer,
    ESTABELECIMENTO_ID integer,
    GP_ID integer,
    REMESSA_ID integer,
    PRODUTO_ID integer,
    TAMANHO integer,
    QUANTIDADE numeric(15,4),
    OPERADOR_ID integer,
    JUSTIFICATIVA varchar(255) = null,
    DATA date = null,
    CONSUMO integer = null)
returns (
    RET_ID integer,
    ETIQ blob sub_type 1 segment size 80 character set WIN1252)
as
declare variable SOBRA_ID integer;
declare variable SOBRA_ENDERECAMENTO varchar(20);
declare variable SOBRA_SALDO numeric(15,4);
declare variable GP_REQUISITA_SOBRA integer;
declare variable SOBRA_ID_LISTA varchar(500);
declare variable I integer;
declare variable V_ETIQ blob sub_type 1 segment size 80 character set WIN1252;
declare variable PRODUTO_DESCRICAO varchar(255);
declare variable REQ_SOBRA_ID integer;
declare variable SOBRA_QUANTIDADE numeric(15,4);
BEGIN



    /**
     * Insere ou atualiza os dados da requisicao
     */

    IF ( NOT COALESCE(ID,0) > 0 ) THEN
    BEGIN
        ID = GEN_ID(GTBREQUISICAO,1);
    END

    UPDATE OR INSERT INTO TBREQUISICAO (
        ID,
        ESTABELECIMENTO_ID,
        GP_ID,
        REMESSA,
        PRODUTO_ID,                                
        TAMANHO,
        QUANTIDADE,
        OPERADOR_ID,
        JUSTIFICATIVA,
        CCUSTO,
        DATA,
        USUARIO_ID,                             
        CONSUMO  
--        TELA,
--        DENSIDADE,
--        ESPESSURA,   
--        FATOR_CONVERSAO,
--        QUEBRA,
    ) VALUES (
        :ID,
        :ESTABELECIMENTO_ID,
        :GP_ID,
        :REMESSA_ID,
        :PRODUTO_ID,
        :TAMANHO,
        :QUANTIDADE,
        :OPERADOR_ID,
        :JUSTIFICATIVA,
        FN_DESCRICAO('TBGP',:GP_ID,'CCUSTO'),
        COALESCE(:DATA,CURRENT_DATE),
        FN_CURRENT_USER_ID(),
        COALESCE(:CONSUMO,0)   
--        :TELA,
--        :DENSIDADE,
--        :ESPESSURA,  
--        :FATOR_CONVERSAO,
--        :QUEBRA,
    ) MATCHING(ID);


    exception "..." QUANTIDADE;

    /**
     * Realiza a checagem de sobras para aproveitamento. Caso exista, realiza a alocacao
     */
    ETIQ = '';
    I = 0;
    FOR
        SELECT
            S.ID,
            (SELECT EN.GRUPO||'-'||EN.SUBGRUPO FROM TBENDERECAMENTO EN WHERE EN.ID = S.ENDERECAMENTO_ID) ENDERECAMENTO,
            S.SALDO - COALESCE((SELECT SUM(R.SALDO) FROM TBREQUISICAO_SOBRA R WHERE R.SOBRA_ID = S.ID AND R.STATUS = '0'),0.0000) SALDO,
            (SELECT FIRST 1 E.REQUISITA_SOBRA FROM TBESTEIRA E WHERE E.CODIGO = :GP_ID) REQUISITA_SOBRA
          FROM TBSOBRA S
         WHERE S.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
           AND S.STATUS = '1'
           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))
    INTO
        SOBRA_ID,
        SOBRA_ENDERECAMENTO,
        SOBRA_SALDO,
        GP_REQUISITA_SOBRA
    DO
    BEGIN


        IF ( SOBRA_SALDO > 0 AND GP_REQUISITA_SOBRA = 1 ) THEN
        BEGIN
            QUANTIDADE = COALESCE((SELECT FIRST 1 QUANTIDADE FROM TBREQUISICAO WHERE ID = :ID),0);
            IF ( QUANTIDADE > 0 ) THEN
            BEGIN
    
                SOBRA_QUANTIDADE = IIF(:SOBRA_SALDO >= :QUANTIDADE,:QUANTIDADE,:SOBRA_SALDO);
                /* ALOCA AS SOBRAS */
                INSERT INTO TBREQUISICAO_SOBRA (
                    REQUISICAO_ID,
                    SOBRA_ID,
                    PRODUTO_ID_ORIGINAL,
                    QUANTIDADE,
                    SALDO
                ) VALUES (
                    :ID,
                    :SOBRA_ID,
                    :PRODUTO_ID,
                    :SOBRA_QUANTIDADE,
                    :SOBRA_QUANTIDADE
                ) RETURNING ID INTO REQ_SOBRA_ID;
                /* BAIXA A QUANTIDADE DA REQUISICAO COM BASE NA SOBRA UTILIZADA */
                UPDATE TBREQUISICAO
                   SET QUANTIDADE = IIF(:SOBRA_SALDO >= QUANTIDADE,0,QUANTIDADE - :SOBRA_SALDO)
                 WHERE ID = :ID;
    
    
    
    
                /* CAPTURA A ETIQUETA MODELO */
                IF ( V_ETIQ IS NULL ) THEN
                BEGIN
                    V_ETIQ = (SELECT FIRST 1 ET.SCRIPT FROM TBETIQUETAS ET WHERE ET.ID = 132);
    
                    IF ( COALESCE(V_ETIQ,'') = '' ) THEN
                    BEGIN
                        EXCEPTION "..." 'ETIQUETA DE SOBRA INVALIDA. ID: 132';
                    END
                END
    
                /* INSERE A ETIQUETA MODELO NO SCRIPT DE SAIDA */
                IF ( I = 0 ) THEN ETIQ = ETIQ || V_ETIQ;
    
                /* INCREMENTO (A POSICAO DO REGISTRO NA ETIQUETA */
                I = I + 1;
    
                PRODUTO_DESCRICAO = COALESCE((
                    SELECT FIRST 1 TRIM(REPLACE(P.DESCRICAO,F.DESCRICAO,''))
                      FROM TBPRODUTO P, TBFAMILIA F
                     WHERE F.CODIGO = P.FAMILIA_CODIGO
                       AND P.CODIGO = :PRODUTO_ID),'');
    
                ETIQ=REPLACE(ETIQ,'#GP_DESCRICAO'     ||I||'#',FN_DESCRICAO('TBGP',GP_ID)                                         );
                ETIQ=REPLACE(ETIQ,'#ENDERECAMENTO'    ||I||'#',coalesce(SOBRA_ENDERECAMENTO,'')                                   );
                ETIQ=REPLACE(ETIQ,'#PRODUTO_DESCRICAO'||I||'#',coalesce(PRODUTO_DESCRICAO,'')                                     );
                ETIQ=REPLACE(ETIQ,'#TAMANHO'          ||I||'#',FN_TAMANHO_PRODUTO(PRODUTO_ID,TAMANHO)                             );
                ETIQ=REPLACE(ETIQ,'#REMESSA'          ||I||'#','REM.' ||coalesce(REMESSA_ID,'')                                   );
                ETIQ=REPLACE(ETIQ,'#QTD_SOBRA'        ||I||'#','SOB.' || FN_FORMAT_NUMBER(SOBRA_QUANTIDADE)                       );
                ETIQ=REPLACE(ETIQ,'#CODIGO'           ||I||'#',LPAD(REQ_SOBRA_ID,9,0)||LPAD(CAST(SOBRA_QUANTIDADE AS INTEGER),4,0));

                if(coalesce(ETIQ,'') = '')then
                begin
                    EXCEPTION "..." 'ETIQUETA DE SOBRA INVALIDA. (NULL)';
                end
    
                /* RESETA O INCREMETO QUANDO ATINGIR O LIMITE DA ETIQUETA */
                IF ( I = 5 ) THEN I = 0;
            END
        END

    END

    /* LIMPA DADOS DA ETIQUETA QUE NAO FORAM UTILIZADOS */
    IF ( NOT ETIQ = '' ) THEN
    BEGIN
        I = 0;
        WHILE (I <= 5) DO
        BEGIN
            I = I+1;
            
            ETIQ=REPLACE(ETIQ,'#GP_DESCRICAO'     ||I||'#','');
            ETIQ=REPLACE(ETIQ,'#ENDERECAMENTO'    ||I||'#','');
            ETIQ=REPLACE(ETIQ,'#PRODUTO_DESCRICAO'||I||'#','');
            ETIQ=REPLACE(ETIQ,'#TAMANHO'          ||I||'#','');
            ETIQ=REPLACE(ETIQ,'#REMESSA'          ||I||'#','');
            ETIQ=REPLACE(ETIQ,'#QTD_REQUISICAO'   ||I||'#','');
            ETIQ=REPLACE(ETIQ,'#QTD_SOBRA'        ||I||'#','');
            ETIQ=REPLACE(ETIQ,'#CODIGO'           ||I||'#','');
        END
        

    END

    ETIQ = NULLIF(ETIQ,'');
    RET_ID = ID;

    SUSPEND;

END;



CREATE OR ALTER procedure SPC_REQUISICAO_PLACA (
    REMESSA_ID integer,
    REMESSA_TALAO_ID integer)
returns (
    PECA_ID integer,
    PECA_SALDO numeric(15,4),
    PECA_ENDERECAMENTO integer,
    PECA_TALAO_ID integer,
    PACA_QTD_PARES integer,
    PECA_REMESSA_ID integer,
    PECA_PRODUTO_ID 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
            p.matriz_codigo,
            p.tamanho,
            p.produto_codigo,
            f.cor_codigo,
            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
          where p.remessa = :REMESSA_ID
          and p.controle = :REMESSA_TALAO_ID
          and t.codigo = p.matriz_codigo
          and f.codigo = p.produto_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 first 1
            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
                y.controle as id,
                y.quantidade_saldo 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
            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

            order by y.controle
        into
            PECA_ID,
            PECA_SALDO,
            PECA_ENDERECAMENTO,
            PECA_TALAO_ID,
            PECA_REMESSA_ID,
            PECA_PRODUTO_ID
        do begin

        end
    end

    suspend;
end;



CREATE OR ALTER procedure SPC_REQUISICAO_BOJO (
    I_REMESSA_ID integer = 44154,
    REMESSA_TALAO_ID integer = 107,
    NAO_PREENCHER integer = null)
returns (
    ESTABELECIMENTO_ID integer,
    REMESSA_ID integer,
    GP_ID integer,
    GP_DESCRICAO varchar(255),
    GP_REQUISITA_SOBRA integer,
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(255),
    MODELO_ID integer,
    COR_ID integer,
    GRADE_ID integer,
    TAMANHO integer,
    TAMANHO_DESCRICAO varchar(10),
    UM varchar(10),
    HABILITA_REQ_SKU_FECHADO integer,
    HABILITA_REQ_SEM_LIMITE integer,
    QUANTIDADE_TOTAL numeric(15,4),
    QUANTIDADE_PRODUZIDA numeric(15,4),
    QUANTIDADE_ABERTO numeric(15,4),
    REMESSA_ID_APROV integer,
    REMESSA_TALAO_ID_APROV integer,
    QUANTIDADE_APROV numeric(15,4),
    QUANTIDADE_EXTRA numeric(15,4),
    QUANTIDADE_DEFEITO numeric(15,4),
    QUANTIDADE_SOBRA_APROVEITADA numeric(15,4),
    QUANTIDADE_SOBRA numeric(15,4),
    QUANTIDADE_REQUISITADA numeric(15,4),
    QUANTIDADE_REQUISITADA_PENDENTE numeric(15,4),
    PERCENTUAL_TOLERANCIA numeric(15,4),
    QUANTIDADE_TOLERANCIA numeric(15,4),
    QUANTIDADE_SALDO numeric(15,4),
    QUANTIDADE_PLACAS integer,
    REQUISITAR_PLACAS integer,
    PLACAS blob sub_type 1 segment size 80,
    QUANTIDADE_BOJO_PLACA integer)
as
declare variable PECA_ID integer;
declare variable PECA_SALDO numeric(18,4);
declare variable PECA_ENDERECAMENTO integer;
declare variable PECA_TALAO_ID integer;
declare variable PACA_QTD_PARES integer;
declare variable QTD_SALDO_BOJO numeric(15,4);
declare variable QTD_SALDO_BOJO_PARES integer;
declare variable PECA_REMESSA_ID integer;
declare variable PECA_PRODUTO_ID 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 QUANTIDADE_SALDO FROM SPC_REQUISICAO_BOJO(REMESSA_ID,REMESSA_TALAO_ID,1)) SALDO_ANTERIOR
    FROM (
        SELECT
            P.GP_ID,
            P.PRODUTO_ID,
            P.TAMANHO,
            P.REMESSA_ID,
            (SELECT FIRST 1 D.ID
              FROM VWREMESSA_TALAO_DETALHE D
             WHERE D.REMESSA_ID = P.REMESSA_ID
               AND D.GP_ID = P.GP_ID
               AND D.PRODUTO_ID = P.PRODUTO_ID
               AND D.TAMANHO = P.TAMANHO
               AND D.DATA_PRODUCAO IS NULL) PRODUZIDO,
            MIN(P.REMESSA_TALAO_ID) REMESSA_TALAO_ID,
            MIN(R.DATA) DATA
        FROM
            VWREMESSA_TALAO P,
            VWREMESSA R,
            VWREMESSA R2
        WHERE
            P.PRODUTO_ID  = :PRODUTO_ID /* 84518 */
        AND P.TAMANHO     = :TAMANHO /* 8 */
        AND P.GP_ID       = :GP_ID  /* 23 */
        AND R2.REMESSA_ID = :REMESSA_ID /* 45900 /* TALAO 55 */
        AND R.REMESSA_ID  = P.REMESSA_ID
        AND R.REMESSA_ID <> R2.REMESSA_ID
        AND R.DATA       <= R2.DATA
        AND P.REMESSA_TALAO_ID < 8000
        AND DATEDIFF(DAY, R.DATA, CURRENT_DATE) <= 7 /*7 DIAS DE DIFERENCA A PARTIR DA DATA DA REMESSA BASE*/
        GROUP BY 1,2,3,4
        ORDER BY DATA DESC) X
    WHERE
        X.PRODUZIDO IS NULL
    INTO
        REMESSA_ID_APROV,
        REMESSA_TALAO_ID_APROV,
        QUANTIDADE_APROV;    
    END

    QUANTIDADE_APROV = COALESCE(QUANTIDADE_APROV,0);

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

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

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

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

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

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

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

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

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

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

    QTD_SALDO_BOJO = QUANTIDADE_SALDO;

    QTD_SALDO_BOJO_PARES = QUANTIDADE_SALDO;
    REQUISITAR_PLACAS = 0;
    QUANTIDADE_PLACAS = 0;
    PACA_QTD_PARES    = 0;

    for
        select
            PECA_ID,
            PECA_SALDO,
            PECA_ENDERECAMENTO,
            PECA_TALAO_ID,
            PACA_QTD_PARES,
            PECA_REMESSA_ID,
            PECA_PRODUTO_ID
        from SPC_REQUISICAO_PLACA(:REMESSA_ID, :REMESSA_TALAO_ID)
        where peca_id > 0
    into
        PECA_ID,
        PECA_SALDO,
        PECA_ENDERECAMENTO,
        PECA_TALAO_ID,
        PACA_QTD_PARES,
        PECA_REMESSA_ID,
        PECA_PRODUTO_ID
    do begin

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

        REQUISITAR_PLACAS = 1;
        PLACAS = null;

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

                PLACAS = coalesce(PLACAS||',','[')||fn_to_json(
                    fn_to_par_json('PECA_ID',PECA_ID),
                    fn_to_par_json('QTD',QTD_SALDO_BOJO),
                    fn_to_par_json('PECA_ENDERECAMENTO',PECA_ENDERECAMENTO),
                    fn_to_par_json('PECA_TALAO_ID',PECA_TALAO_ID),
                    fn_to_par_json('PACA_QTD_PARES',PACA_QTD_PARES),
                    fn_to_par_json('PECA_REMESSA_ID',PECA_REMESSA_ID),
                    fn_to_par_json('PECA_PRODUTO_ID',PECA_PRODUTO_ID)
                );

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

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

                QTD_SALDO_BOJO_PARES = QTD_SALDO_BOJO_PARES - (PECA_SALDO * PACA_QTD_PARES);

                PLACAS = coalesce(PLACAS||',','[')||fn_to_json(
                    fn_to_par_json('PECA_ID',PECA_ID),
                    fn_to_par_json('QTD',PECA_SALDO),
                    fn_to_par_json('PECA_ENDERECAMENTO',PECA_ENDERECAMENTO),
                    fn_to_par_json('PECA_TALAO_ID',PECA_TALAO_ID),
                    fn_to_par_json('PACA_QTD_PARES',PACA_QTD_PARES),
                    fn_to_par_json('PECA_REMESSA_ID',PECA_REMESSA_ID),
                    fn_to_par_json('PECA_PRODUTO_ID',PECA_PRODUTO_ID)
                );
            end
       end
    end

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

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

    QUANTIDADE_BOJO_PLACA = PACA_QTD_PARES;

    suspend;
end;

CREATE OR ALTER trigger ttbrequisicao_b0d_01 for tbrequisicao
active before delete position 0
AS
BEGIN


  --if (OLD.STATUS <> '0') then
  --    Begin
  --    Exception "..." 'EXCLUSÃO SÓ É PERMITIDA PARA REQUISIÇÕES PENDENTES DE AUTORIZAÇÃO.'||
  --                    ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
  --
  --    End

  INSERT INTO TBHISTORICO (
  TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
  'TBREQUISICAO', OLD.ID,
 (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
 (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
  'Registro excluído');

  Delete from TBRequisicao_Sobra
  Where Requisicao_Id = OLD.ID;

  Delete from TBRequisicao_placa
  Where Requisicao_Id = OLD.ID;

END;

CREATE OR ALTER procedure SPC_REQUISICAO_PLACA (
    REMESSA_ID integer,
    REMESSA_TALAO_ID integer)
returns (
    PECA_ID integer,
    PECA_SALDO numeric(15,4),
    PECA_ENDERECAMENTO integer,
    PECA_TALAO_ID integer,
    PACA_QTD_PARES integer,
    PECA_REMESSA_ID integer,
    PECA_PRODUTO_ID 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
            p.matriz_codigo,
            p.tamanho,
            p.produto_codigo,
            f.cor_codigo,
            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
          where p.remessa = :REMESSA_ID
          and p.controle = :REMESSA_TALAO_ID
          and t.codigo = p.matriz_codigo
          and f.codigo = p.produto_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 first 1
            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),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
                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,
            PECA_TALAO_ID,
            PECA_REMESSA_ID,
            PECA_PRODUTO_ID
        do begin

        end
    end

    suspend;
end;

