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
    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 ; ^

