DROP FUNCTION RECEITA_UTIL
/

DROP TYPE RECEITA_UTIL_TABLE
/

DROP TYPE RECEITA_UTIL_TYPE
/

CREATE TYPE RECEITA_UTIL_TYPE AS OBJECT
  (CDPRATO      VARCHAR2(10),
   CDFILAUXPRAT VARCHAR2(04),
   CDPRODUTO    VARCHAR2(10),
   QTPRODUTO    NUMBER,
   SGUNIDADE    VARCHAR2(05),
   VRPEFATCOC   NUMBER,
   VRPEFATCOR   NUMBER,
   VRPEFATNUT   FLOAT(126),
   VRPESOUNID   FLOAT(126),
   HRTEMPPREP   VARCHAR2(05),
   CDAPRERECE   VARCHAR2(03),
   QTCOMPLPROD  NUMBER,
   QTBRUTAUNR   NUMBER,
   CDPRATOPAI   VARCHAR2(10),
   CDPRODPRODUCAO  VARCHAR2(10),
   QTLIMSEG        NUMBER, /*LIMITE DE SEGURANCA DA RECEITA*/
   QTLIMSEGPRAT    NUMBER, /*LIMITE DE SEGURANCA DO PRATO*/
   LIMITEACUMULADO NUMBER, /*LIMITE DE SEGURANCA ACUMULADO DO PRATO + RECEITA*/
   LIMITEACUMULADOPP NUMBER, /*LIMITE ACUMULADO DO PRATO + PRODUTO DE PRODUCAO NA RECEITA (APENAS PARA O PLANEJAMENTO DA PRODUCAO*/
   QTLIMSEGPRODPAI   NUMBER, /*LIMITE DE SEGURAN�A DO PRODUTO ACABADO PAI*/
   QTPADRAO      NUMBER,
   QTAMOSTRA     FLOAT(126),
   IDPRODCHILL   VARCHAR2(1),
   IDFINALIZACAO VARCHAR2(1),
   IDTPPRODCHILL VARCHAR2(30),
   IDTPREQPROD   VARCHAR2(1),
   IDTIPORECE    VARCHAR2(1),
   QTCALCNUTR    NUMBER,
   QTPRODLIQ     NUMBER,
   IDTPREQPRODPAI VARCHAR2(1)
  )
/

CREATE TYPE RECEITA_UTIL_TABLE AS TABLE OF RECEITA_UTIL_TYPE
/

create or replace FUNCTION RECEITA_UTIL
  (P_CDFILIAL IN SERVICO.CDFILIAL%TYPE,
   P_CDSERVFILI IN SERVICO.CDSERVFILI%TYPE,
   P_CDPRATO IN PRATO.CDPRATO%TYPE,
   P_CDFILAUXPRAT IN PRATO.CDFILAUXPRAT%TYPE,
   P_CDPRODUTOINI IN PRODUTO.CDPRODUTO%TYPE,
   P_CDPRODUTOFIN IN PRODUTO.CDPRODUTO%TYPE,
   P_CDPRATOPAI IN PRATO.CDPRATO%TYPE DEFAULT NULL,
   P_LIMITE IN NUMBER DEFAULT 0,
   P_LIMITEPP IN NUMBER DEFAULT 0,
   P_GRAVAPRODPROD IN VARCHAR DEFAULT 'N', /*PARAMETRO PARA RETORNAR O PRODUTO DE PRODUCAO OU APENAS A SUA RECEITA (PLAN PRODUCAO = 'S' PREVISAO DE CONSUMO = 'N'*/
   P_LIMSEGPRODPAI IN NUMBER DEFAULT NULL,
   P_RECEITAPRODACA IN VARCHAR DEFAULT NULL,
   P_CDFILCENTPME IN VARCHAR DEFAULT NULL,
   P_CDTIPOCARD IN VARCHAR DEFAULT NULL
   )
   RETURN RECEITA_UTIL_TABLE PIPELINED IS

   OUT_RECORD RECEITA_UTIL_TYPE := RECEITA_UTIL_TYPE
   (NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,NULL, NULL);

V_CDPRATOPROD VARCHAR2(10);
V_CDFILAUXPROD VARCHAR2(04);
V_CDPRODPRODUCAO VARCHAR2(10);  
V_LIMISEGPRAT NUMBER;
V_QTPADRAO NUMBER;
V_IDPRODCHILL VARCHAR2(1);
V_IDFINALIZACAO VARCHAR2(1);
V_IDTPPRODCHILL VARCHAR2(30);
V_LIMITEACUMULADO NUMBER;
V_LIMITEACUMULADOPP NUMBER;
V_LIMITE_PRAT_PROD NUMBER;
V_QTPADRAOPROD NUMBER;
V_QTAMOSTRA FLOAT(126);
V_GRAVAPRODPROD VARCHAR2(1);
V_RECEITAPRODACA VARCHAR2(1);
BEGIN
   V_RECEITAPRODACA := P_RECEITAPRODACA;
   V_GRAVAPRODPROD := P_GRAVAPRODPROD;
   FOR C_RECEITA IN (
         SELECT
            R.IDTIPORECE,
            R.CDPRATO,
            R.CDFILAUXPRAT,
            R.CDPRODUTO,
            PRODUTO.VRPESOUNID,
            R.QTPRODUTO,
            NVL(R.SGUNIDADE,PRODUTO.SGUNIDADE) AS SGUNIDADE,
            R.VRPEFATCOC,
            R.VRPEFATNUT,
            R.VRPEFATCOR,
            R.HRTEMPPREP,
            R.CDAPRERECE,
            R.QTCOMPLPROD,
            R.QTBRUTAUNR,
            PRODUTO.IDPRODPROD,
            R.QTLIMSEG,
            NVL(R.IDTPREQPROD,'P') IDTPREQPROD,
            R.QTCALCNUTR,
            R.QTPRODLIQ
         FROM PRODUTO,
            (SELECT
                'S' AS IDTIPORECE,
                RECESERV.CDPRATO,
                RECESERV.CDFILAUXPRAT,
                RECESERV.CDPRODUTO,
                RECESERV.QTBRUTASE AS QTPRODUTO,
                RECESERV.SGUNIDADE,
                RECESERV.VRPEFATCOCSE AS VRPEFATCOC,
                RECESERV.VRPEFATNUTSE AS VRPEFATNUT,
                RECESERV.VRPEFATCORSE AS VRPEFATCOR,
                RECESERV.HRTEMPPREPSE AS HRTEMPPREP,
                RECESERV.CDAPRERECE,
                RECESERV.QTCOMPLPRODSERV AS QTCOMPLPROD,
                RECESERV.QTBRUTASEUNR AS QTBRUTAUNR,
                RECESERV.QTLIMSEGSERV AS QTLIMSEG,
                RECESERV.IDTPREQPRODSERV AS IDTPREQPROD,
                RECESERV.QTCALCNUTRSE AS QTCALCNUTR, 
                RECESERV.QTPRODRECSER AS QTPRODLIQ
             FROM
                RECESERV
             WHERE
                (RECESERV.CDFILAUXPRAT = P_CDFILAUXPRAT)    AND
                (RECESERV.CDPRATO      = P_CDPRATO)         AND
                (RECESERV.CDFILIAL     = P_CDFILIAL)        AND
                (RECESERV.CDSERVFILI   = P_CDSERVFILI)     AND
                (NVL(V_RECEITAPRODACA,'S') = 'S')
             UNION ALL
             SELECT
                'F' AS IDTIPORECE,
                RECEFILI.CDPRATO,
                RECEFILI.CDFILAUXPRAT,
                RECEFILI.CDPRODUTO,
                RECEFILI.QTBRUTALO AS QTPRODUTO,
                RECEFILI.SGUNIDADE,
                RECEFILI.VRPEFATCOCLO AS VRPEFATCOC,
                RECEFILI.VRPEFATNUTLO AS VRPEFATNUT,
                RECEFILI.VRPEFATCORLO AS VRPEFATCOR,
                RECEFILI.HRTEMPPREPLO AS HRTEMPPREP,
                RECEFILI.CDAPRERECE,
                RECEFILI.QTCOMPLPRODFILI AS QTCOMPLPROD,
                RECEFILI.QTBRUTALOUNR AS QTBRUTAUNR,
                RECEFILI.QTLIMSEGFILI AS QTLIMSEG,
                RECEFILI.IDTPREQPRODFILI AS IDTPREQPROD,
                RECEFILI.QTCALCNUTRLO AS QTCALCNUTR, 
                RECEFILI.QTPRODRECLOC AS QTPRODLIQ
             FROM
                RECEFILI
             WHERE
                (RECEFILI.CDFILAUXPRAT = P_CDFILAUXPRAT)    AND
                (RECEFILI.CDPRATO      = P_CDPRATO)         AND
                (RECEFILI.CDFILIAL     = P_CDFILIAL)        AND
                ((V_RECEITAPRODACA = 'F') OR
                 NOT EXISTS (SELECT
                                CDPRATO
                             FROM
                                RECESERV
                             WHERE
                                (CDFILAUXPRAT = P_CDFILAUXPRAT) AND
                                (CDPRATO      = P_CDPRATO)      AND
                                (CDFILIAL     = P_CDFILIAL)     AND
                                (CDSERVFILI   = P_CDSERVFILI)
                             ))
             UNION ALL
             SELECT
                'T' AS IDTIPORECE,
                RECETPCARD.CDPRATO,
                RECETPCARD.CDFILAUXPRAT,
                RECETPCARD.CDPRODUTO,
                RECETPCARD.QTBRUTAPRTP AS QTPRODUTO,
                RECETPCARD.SGUNIDADE,
                RECETPCARD.VRPEFATCOCPRTP AS VRPEFATCOC,
                RECETPCARD.VRPEFATNUTPRTP AS VRPEFATNUT,
                RECETPCARD.VRPEFATCORPRTP AS VRPEFATCOR,
                RECETPCARD.HRTEMPPREPPRTP AS HRTEMPPREP,
                RECETPCARD.CDAPRERECE,
                --RECETPCARD.QTCOMPLPRODFILI AS QTCOMPLPROD,
                0 AS QTCOMPLPROD,
                RECETPCARD.QTBRUTAPRUNRTP AS QTBRUTAUNR,
                --RECETPCARD.QTLIMSEGFILI AS QTLIMSEG,
                NULL AS QTLIMSEG,
                --RECETPCARD.IDTPREQPRODFILI AS IDTPREQPROD,
                'P' AS IDTPREQPROD,
                RECETPCARD.QTCALCNUTRPRTP AS QTCALCNUTR,
                RECETPCARD.QTPRODPRATTP AS QTPRODLIQ
             FROM
                RECETPCARD
             WHERE
                (RECETPCARD.CDFILAUXPRAT = P_CDFILAUXPRAT)    AND
                (RECETPCARD.CDPRATO      = P_CDPRATO)         AND
                (RECETPCARD.CDFILCENTPME = P_CDFILCENTPME)    AND
                (RECETPCARD.CDTIPOCARD   = P_CDTIPOCARD)      AND
                ((V_RECEITAPRODACA = 'T') OR
                 NOT EXISTS (SELECT
                                CDPRATO
                             FROM
                                RECEFILI
                             WHERE
                                (CDFILAUXPRAT = P_CDFILAUXPRAT) AND
                                (CDPRATO      = P_CDPRATO)      AND
                                (CDFILIAL     = P_CDFILIAL)
                             )AND
                 NOT EXISTS (SELECT
                                CDPRATO
                             FROM
                                RECESERV
                             WHERE
                                (CDFILAUXPRAT = P_CDFILAUXPRAT) AND
                                (CDPRATO      = P_CDPRATO)      AND
                                (CDFILIAL     = P_CDFILIAL)     AND
                                (CDSERVFILI   = P_CDSERVFILI)))
             UNION ALL
             SELECT
                'P' AS IDTIPORECE,
                RECEPADR.CDPRATO,
                RECEPADR.CDFILAUXPRAT,
                RECEPADR.CDPRODUTO,
                RECEPADR.QTBRUTAPR AS QTPRODUTO,
                RECEPADR.SGUNIDADE,
                RECEPADR.VRPEFATCOCPR AS VRPEFATCOC,
                RECEPADR.VRPEFATCORPR AS VRPEFATCOR,
                RECEPADR.VRPEFATNUTPR AS VRPEFATNUT,
                RECEPADR.HRTEMPPREPPR AS HRTEMPPREP,
                RECEPADR.CDAPRERECE,
                RECEPADR.QTCOMPLPRODPADR AS QTCOMPLPROD,
                RECEPADR.QTBRUTAPRUNR AS QTBRUTAUNR,
                RECEPADR.QTLIMSEGPADR AS QTLIMSEG,
                RECEPADR.IDTPREQPRODPADR AS IDTPREQPROD,
                RECEPADR.QTCALCNUTRPR AS QTCALCNUTR, 
                RECEPADR.QTPRODPRAT AS QTPRODLIQ
             FROM
                RECEPADR
             WHERE
                (RECEPADR.CDFILAUXPRAT = P_CDFILAUXPRAT)    AND
                (RECEPADR.CDPRATO      = P_CDPRATO)         AND
                ((V_RECEITAPRODACA = 'P') OR            
                 NOT EXISTS (SELECT
                                CDPRATO
                             FROM
                                RECETPCARD
                             WHERE
                                (CDFILAUXPRAT = P_CDFILAUXPRAT) AND
                                (CDPRATO      = P_CDPRATO)      AND
                                (CDFILCENTPME = P_CDFILCENTPME) AND
                                (CDTIPOCARD   = P_CDTIPOCARD)
                            )AND
                 NOT EXISTS (SELECT
                                CDPRATO
                             FROM
                                RECEFILI
                             WHERE
                                (CDFILAUXPRAT = P_CDFILAUXPRAT) AND
                                (CDPRATO      = P_CDPRATO)      AND
                                (CDFILIAL     = P_CDFILIAL)
                             ) AND
                 NOT EXISTS (SELECT
                                CDPRATO
                             FROM
                                RECESERV
                             WHERE
                                (CDFILAUXPRAT = P_CDFILAUXPRAT) AND
                                (CDPRATO      = P_CDPRATO)      AND
                                (CDFILIAL     = P_CDFILIAL)     AND
                                (CDSERVFILI   = P_CDSERVFILI)))
         ) R
         WHERE
            (R.CDPRODUTO = PRODUTO.CDPRODUTO) AND
            (PRODUTO.CDARVPROD BETWEEN P_CDPRODUTOINI AND P_CDPRODUTOFIN)
   )
   LOOP
      IF C_RECEITA.IDTIPORECE = 'S' THEN /*RETORNA O PRODUTO DE PRODUCAO DO PRATO E SEUS LIMITES DE SEGURANCA*/
         SELECT MIN(CDPRODPRODUCAO), MAX(QTLIMSEGSERV), MAX(NVL(QTPADRAOSERV,0)), MAX(NVL(IDPRODCHILL, 'N')), MAX(IDFINALSERV), MAX(IDTPPRODCHILL), MAX(NVL(QTAMOSTRSERV, 0))
           INTO V_CDPRODPRODUCAO, V_LIMISEGPRAT, V_QTPADRAO, V_IDPRODCHILL, V_IDFINALIZACAO, V_IDTPPRODCHILL, V_QTAMOSTRA
         FROM PRATSERV
         WHERE CDFILIAL = P_CDFILIAL 
           AND CDSERVFILI = P_CDSERVFILI
           AND CDPRATO = C_RECEITA.CDPRATO
           AND CDFILAUXPRAT = C_RECEITA.CDFILAUXPRAT;
      END IF;
      IF C_RECEITA.IDTIPORECE = 'F' THEN
         SELECT MIN(CDPRODPRODUCAO), MAX(QTLIMSEGFILI), MAX(NVL(QTPADRAOFILI, 0)), MAX(NVL(IDPRODCHILL, 'N')), MAX(IDFINALFILI), MAX(IDTPPRODCHILL), MAX(NVL(QTAMOSTRFILI, 0))
           INTO V_CDPRODPRODUCAO, V_LIMISEGPRAT, V_QTPADRAO, V_IDPRODCHILL, V_IDFINALIZACAO, V_IDTPPRODCHILL, V_QTAMOSTRA
         FROM PRATFILI
         WHERE CDFILIAL = P_CDFILIAL 
           AND CDPRATO = C_RECEITA.CDPRATO
           AND CDFILAUXPRAT = C_RECEITA.CDFILAUXPRAT;
      END IF;
      IF C_RECEITA.IDTIPORECE = 'T' THEN
        V_CDPRODPRODUCAO := NULL;
        V_LIMISEGPRAT := NULL;
        V_QTPADRAO := 0;
        V_IDPRODCHILL := 'N';
        V_IDFINALIZACAO := NULL;
        V_IDTPPRODCHILL := NULL;
        V_QTAMOSTRA := 0;
      END IF;
      IF C_RECEITA.IDTIPORECE = 'P' THEN
         SELECT MIN(CDPRODPRODUCAO), MAX(QTLIMSEGPADR), MAX(NVL(QTPADRAOPRAT, 0)), MAX(NVL(IDPRODCHILL, 'N')), MAX(IDFINALPADR), MAX(IDTPPRODCHILL), MAX(NVL(QTAMOSTRPADR, 0))
           INTO V_CDPRODPRODUCAO, V_LIMISEGPRAT, V_QTPADRAO, V_IDPRODCHILL, V_IDFINALIZACAO, V_IDTPPRODCHILL, V_QTAMOSTRA
         FROM PRATPADR
         WHERE CDPRATO = C_RECEITA.CDPRATO
           AND CDFILAUXPRAT = C_RECEITA.CDFILAUXPRAT;
      END IF;
      V_LIMITEACUMULADO :=  NVL(V_LIMISEGPRAT,0) + NVL(C_RECEITA.QTLIMSEG,0);
      
      V_LIMITEACUMULADOPP :=  NVL(V_LIMISEGPRAT,0);-- + NVL(C_RECEITA.QTLIMSEG,0) + NVL(V_LIMITE_PRAT_PROD,0); 
      
      IF (C_RECEITA.IDPRODPROD = 'S') THEN /* VERIFICAR SE � UM PRODUTO DE PRODUCAO, SE FOR ENTRAR� EM RECURSAO PARA BUSCAR SUA RECEITA*/
         SELECT MIN(CDPRATO), MIN(CDFILAUXPRAT), MIN(QTLIMSEGSERV), MAX(QTPADRAOSERV), 'S'
           INTO V_CDPRATOPROD, V_CDFILAUXPROD, V_LIMITE_PRAT_PROD, V_QTPADRAOPROD, V_RECEITAPRODACA
         FROM PRATSERV
         WHERE CDFILIAL = P_CDFILIAL 
           AND CDSERVFILI = P_CDSERVFILI
           AND CDPRODPRODUCAO = C_RECEITA.CDPRODUTO;
         
         IF V_CDPRATOPROD IS NULL THEN 
            SELECT MIN(CDPRATO), MIN(CDFILAUXPRAT), MIN(QTLIMSEGFILI), MAX(QTPADRAOFILI), 'F'
              INTO V_CDPRATOPROD, V_CDFILAUXPROD, V_LIMITE_PRAT_PROD, V_QTPADRAOPROD, V_RECEITAPRODACA
            FROM PRATFILI
            WHERE CDFILIAL = P_CDFILIAL 
              AND CDPRODPRODUCAO = C_RECEITA.CDPRODUTO;
         END IF;

         IF V_CDPRATOPROD IS NULL THEN 
            SELECT MIN(CDPRATO), MIN(CDFILAUXPRAT), MIN(QTLIMSEGPADR), MAX(QTPADRAOPRAT), 'P'
              INTO V_CDPRATOPROD, V_CDFILAUXPROD, V_LIMITE_PRAT_PROD, V_QTPADRAOPROD, V_RECEITAPRODACA
            FROM PRATPADR
            WHERE CDPRODPRODUCAO = C_RECEITA.CDPRODUTO;
         END IF;         
         IF V_CDPRATOPROD IS NULL THEN
            V_GRAVAPRODPROD := 'S';
         END IF;
         /*GRAVA O PRODUTO DE PRODUCAO NA RECEITA DO PRATO, SE A MATERIA PRIMA FOR IGUAL AO PRODUTO DE PRODUCAO, GRAVA APENAS A MATERIA PRIMA E NAO ENTRA EM RECURSAO*/
         IF (V_GRAVAPRODPROD = 'S' OR C_RECEITA.CDPRODUTO =  V_CDPRODPRODUCAO) THEN
            OUT_RECORD.CDPRATO      := P_CDPRATO; OUT_RECORD.CDPRATOPAI := P_CDPRATOPAI;
            OUT_RECORD.QTLIMSEGPRODPAI := P_LIMSEGPRODPAI;
            OUT_RECORD.CDFILAUXPRAT := P_CDFILAUXPRAT;
            OUT_RECORD.CDPRODPRODUCAO := V_CDPRODPRODUCAO;
            OUT_RECORD.VRPEFATNUT       := C_RECEITA.VRPEFATNUT;
            OUT_RECORD.CDPRODUTO    := C_RECEITA.CDPRODUTO;
            OUT_RECORD.VRPESOUNID   := C_RECEITA.VRPESOUNID;
            OUT_RECORD.QTPRODUTO    := NVL(V_QTPADRAOPROD,C_RECEITA.QTPRODUTO);
            OUT_RECORD.SGUNIDADE    := C_RECEITA.SGUNIDADE;
            OUT_RECORD.VRPEFATCOC   := C_RECEITA.VRPEFATCOC;
            OUT_RECORD.VRPEFATCOR   := C_RECEITA.VRPEFATCOR;
            OUT_RECORD.HRTEMPPREP   := C_RECEITA.HRTEMPPREP;
            OUT_RECORD.CDAPRERECE   := C_RECEITA.CDAPRERECE;
            OUT_RECORD.QTCOMPLPROD  := C_RECEITA.QTCOMPLPROD;
            OUT_RECORD.QTBRUTAUNR   := C_RECEITA.QTBRUTAUNR;
            OUT_RECORD.QTLIMSEG     := C_RECEITA.QTLIMSEG;
            OUT_RECORD.QTLIMSEGPRAT := V_LIMISEGPRAT;
            OUT_RECORD.LIMITEACUMULADO := P_LIMITE + V_LIMITEACUMULADO;
            OUT_RECORD.LIMITEACUMULADOPP := P_LIMITEPP + V_LIMITEACUMULADOPP;
            OUT_RECORD.QTPADRAO := V_QTPADRAO;
            OUT_RECORD.QTAMOSTRA := V_QTAMOSTRA;
            OUT_RECORD.IDPRODCHILL := V_IDPRODCHILL;
            OUT_RECORD.IDFINALIZACAO := V_IDFINALIZACAO;
            OUT_RECORD.IDTPPRODCHILL := V_IDTPPRODCHILL;
            OUT_RECORD.IDTPREQPROD := C_RECEITA.IDTPREQPROD;
            OUT_RECORD.IDTPREQPRODPAI := C_RECEITA.IDTPREQPROD;
            OUT_RECORD.IDTIPORECE := C_RECEITA.IDTIPORECE;
            OUT_RECORD.QTCALCNUTR := C_RECEITA.QTCALCNUTR;
            OUT_RECORD.QTPRODLIQ := C_RECEITA.QTPRODLIQ;
            PIPE ROW (OUT_RECORD);
            V_LIMITEACUMULADOPP := V_LIMITEACUMULADOPP + NVL(C_RECEITA.QTLIMSEG,0);
         END IF;

        /*SÓ ENTRA NA RECURSAO SE O PRODUTO DE PRODUCAO DO PRATO FOR DIFERENTE DO PRODUTO DA MATERIA PRIMA E SE O PRATO DO PRODUTO ACABADO (INSUMO) FOR DIFERENTE DO PRATO PLANEJADO*/
        IF (C_RECEITA.CDPRODUTO <>  V_CDPRODPRODUCAO) AND (V_CDPRATOPROD <> C_RECEITA.CDPRATO) THEN 
            FOR C_REC_PROD IN
               (SELECT 
                   CDPRATO,
                   CDFILAUXPRAT,
                   CDPRODPRODUCAO,
                   CDPRODUTO,
                   VRPESOUNID,
                   VRPEFATNUT,
                   QTPRODUTO,
                   SGUNIDADE,
                   VRPEFATCOC,
                   VRPEFATCOR,
                   HRTEMPPREP,
                   CDAPRERECE,
                   QTCOMPLPROD,
                   QTBRUTAUNR,
                   QTLIMSEG, 
                   CDPRATOPAI,
                   QTLIMSEGPRAT,
                   LIMITEACUMULADO,
                   LIMITEACUMULADOPP,
                   QTPADRAO,
                   IDPRODCHILL,
                   IDFINALIZACAO,
                   IDTPPRODCHILL,
                   NVL(IDTPREQPROD, 'P') IDTPREQPROD,
                   IDTIPORECE,
                   QTLIMSEGPRODPAI, 
                   QTPRODLIQ
                FROM TABLE(RECEITA_UTIL(P_CDFILIAL, P_CDSERVFILI, V_CDPRATOPROD, V_CDFILAUXPROD, P_CDPRODUTOINI, P_CDPRODUTOFIN, C_RECEITA.CDPRATO, 
                                        V_LIMITEACUMULADO + P_LIMITE, V_LIMITEACUMULADOPP + P_LIMITEPP, P_GRAVAPRODPROD, C_RECEITA.QTLIMSEG,V_RECEITAPRODACA))
            )LOOP
               OUT_RECORD.CDPRATO         := C_REC_PROD.CDPRATO;
               OUT_RECORD.CDFILAUXPRAT    := C_REC_PROD.CDFILAUXPRAT;
               OUT_RECORD.CDPRODPRODUCAO  := C_REC_PROD.CDPRODPRODUCAO;
               OUT_RECORD.VRPEFATNUT      := C_REC_PROD.VRPEFATNUT;
               OUT_RECORD.CDPRODUTO       := C_REC_PROD.CDPRODUTO;
               OUT_RECORD.VRPESOUNID      := C_REC_PROD.VRPESOUNID;
               OUT_RECORD.QTPRODUTO       := C_REC_PROD.QTPRODUTO;
               OUT_RECORD.SGUNIDADE       := C_REC_PROD.SGUNIDADE;
               OUT_RECORD.VRPEFATCOC      := C_REC_PROD.VRPEFATCOC;
               OUT_RECORD.VRPEFATCOR      := C_REC_PROD.VRPEFATCOR;
               OUT_RECORD.HRTEMPPREP      := C_REC_PROD.HRTEMPPREP;
               OUT_RECORD.CDAPRERECE      := C_REC_PROD.CDAPRERECE;
               OUT_RECORD.QTCOMPLPROD     := C_REC_PROD.QTCOMPLPROD;
               OUT_RECORD.QTBRUTAUNR      := C_REC_PROD.QTBRUTAUNR; 
               OUT_RECORD.QTLIMSEG        := C_REC_PROD.QTLIMSEG;
               OUT_RECORD.QTLIMSEGPRAT    := C_REC_PROD.QTLIMSEGPRAT;
               OUT_RECORD.CDPRATOPAI      := C_REC_PROD.CDPRATOPAI;
               OUT_RECORD.LIMITEACUMULADO := C_REC_PROD.LIMITEACUMULADO;
               OUT_RECORD.LIMITEACUMULADOPP := C_REC_PROD.LIMITEACUMULADOPP;
               OUT_RECORD.QTPADRAO        := C_REC_PROD.QTPADRAO;
               OUT_RECORD.QTAMOSTRA       := V_QTAMOSTRA;
               OUT_RECORD.IDPRODCHILL     := C_REC_PROD.IDPRODCHILL;
               OUT_RECORD.IDFINALIZACAO   := C_REC_PROD.IDFINALIZACAO;
               OUT_RECORD.IDTPPRODCHILL   := C_REC_PROD.IDTPPRODCHILL;
               OUT_RECORD.IDTPREQPROD     := C_REC_PROD.IDTPREQPROD;
               OUT_RECORD.IDTPREQPRODPAI  := C_RECEITA.IDTPREQPROD;
               OUT_RECORD.IDTIPORECE      := C_REC_PROD.IDTIPORECE;
               OUT_RECORD.QTLIMSEGPRODPAI := C_REC_PROD.QTLIMSEGPRODPAI;
               OUT_RECORD.QTCALCNUTR := C_RECEITA.QTCALCNUTR;
               OUT_RECORD.QTPRODLIQ := C_REC_PROD.QTPRODLIQ;
               PIPE ROW (OUT_RECORD);
            END LOOP; 
         END IF;
         V_LIMITEACUMULADOPP :=  NVL(V_LIMITEACUMULADOPP,0) - NVL(C_RECEITA.QTLIMSEG,0);-- - NVL(V_LIMITE_PRAT_PROD,0) ;
      ELSE
         OUT_RECORD.CDPRATO      := P_CDPRATO; OUT_RECORD.CDPRATOPAI := P_CDPRATOPAI;
         OUT_RECORD.CDFILAUXPRAT := P_CDFILAUXPRAT;
         OUT_RECORD.CDPRODPRODUCAO := V_CDPRODPRODUCAO;
         OUT_RECORD.CDPRODUTO    := C_RECEITA.CDPRODUTO;
         OUT_RECORD.VRPESOUNID   := C_RECEITA.VRPESOUNID;
         OUT_RECORD.QTPRODUTO    := C_RECEITA.QTPRODUTO;
         OUT_RECORD.SGUNIDADE    := C_RECEITA.SGUNIDADE;
         OUT_RECORD.VRPEFATCOC   := C_RECEITA.VRPEFATCOC;
         OUT_RECORD.VRPEFATCOR   := C_RECEITA.VRPEFATCOR;
         OUT_RECORD.HRTEMPPREP   := C_RECEITA.HRTEMPPREP;
         OUT_RECORD.CDAPRERECE   := C_RECEITA.CDAPRERECE;
         OUT_RECORD.QTCOMPLPROD  := C_RECEITA.QTCOMPLPROD;
         OUT_RECORD.QTBRUTAUNR   := C_RECEITA.QTBRUTAUNR;
         OUT_RECORD.VRPEFATNUT   := C_RECEITA.VRPEFATNUT;
         OUT_RECORD.QTLIMSEG     := C_RECEITA.QTLIMSEG;
         OUT_RECORD.QTLIMSEGPRAT := V_LIMISEGPRAT;
         OUT_RECORD.LIMITEACUMULADO := P_LIMITE + V_LIMITEACUMULADO;
         OUT_RECORD.LIMITEACUMULADOPP := P_LIMITEPP + V_LIMITEACUMULADOPP;
         OUT_RECORD.QTPADRAO := V_QTPADRAO;
         OUT_RECORD.QTAMOSTRA := V_QTAMOSTRA;
         OUT_RECORD.IDPRODCHILL := V_IDPRODCHILL;
         OUT_RECORD.IDFINALIZACAO := V_IDFINALIZACAO;
         OUT_RECORD.IDTPPRODCHILL := V_IDTPPRODCHILL;
         OUT_RECORD.IDTPREQPROD := C_RECEITA.IDTPREQPROD;
         OUT_RECORD.IDTPREQPRODPAI := C_RECEITA.IDTPREQPROD;
         OUT_RECORD.IDTIPORECE := C_RECEITA.IDTIPORECE;
         OUT_RECORD.QTLIMSEGPRODPAI := P_LIMSEGPRODPAI;
         OUT_RECORD.QTCALCNUTR := C_RECEITA.QTCALCNUTR;
         OUT_RECORD.QTPRODLIQ := C_RECEITA.QTPRODLIQ;
         PIPE ROW (OUT_RECORD);
      END IF;
   END LOOP;

   RETURN;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('RECEITA_UTIL','6.29.xxx'); END;
/
