DROP FUNCTION PRATOS_MYMENU
/
DROP TYPE PRATOS_MYMENU_TABLE
/
DROP TYPE PRATOS_MYMENU_TYPE
/
CREATE TYPE PRATOS_MYMENU_TYPE AS OBJECT
  (
   NRGRUPOPRATOPESQ NUMBER,
   NMGRUPOPRATOPESQ VARCHAR2(40),
   NRCARDPME        VARCHAR2(10),
   NRCARDAPIO       VARCHAR2(10),
   CDTIPOPRAT       VARCHAR2(2),
   NMTIPOPRAT       VARCHAR2(40),
   CDFILAUXPRAT     VARCHAR2(04),
   CDPRATO          VARCHAR2(10),
   NMPRATO          VARCHAR2(80),
   NRSEQPRATCAR     NUMBER(3),
   NRORDPRATCAR     NUMBER(15),
   CALORIAS_KCAL    FLOAT(126),
   URL_FOTOPRATO    VARCHAR2(2000),
   BLOB_FOTOPRATO   BLOB,
   VRAVALIACAO      FLOAT(126),
   QTAVALIACAO      NUMBER,
   IDTIPORECEITA    VARCHAR2(1),
   DSPRATO          VARCHAR2(250),
   IDGLUTEN         VARCHAR2(1),
   IDLACTOSE        VARCHAR2(1),
   IDCONCNFMES      VARCHAR2(1)
  )
/
CREATE TYPE PRATOS_MYMENU_TABLE AS TABLE OF PRATOS_MYMENU_TYPE
/
DROP FUNCTION NUTRIENTE_PRATO_PME
/

DROP TYPE NUTRIENTE_PRATO_PME_TABLE
/

DROP TYPE NUTRIENTE_PRATO_PME_TYPE
/

CREATE TYPE NUTRIENTE_PRATO_PME_TYPE AS OBJECT(
   IDTIPORECEITA VARCHAR2(1),
   CDFAPRATNUTR VARCHAR2(04),
   CDPRATNUTR VARCHAR2(10),
   CDPRODNUTR VARCHAR2(10),
   CDNUTRCALC VARCHAR2(03),
   QTPRODNUTR FLOAT,
   QTNUTRCALC FLOAT,
   QTPROTLIQU FLOAT,
   VRCALORNUTR FLOAT,
   VRPECONSNUTR FLOAT
   )
/

CREATE TYPE NUTRIENTE_PRATO_PME_TABLE AS TABLE OF NUTRIENTE_PRATO_PME_TYPE
/

CREATE OR REPLACE
FUNCTION NUTRIENTE_PRATO_PME(
   P_CDFILCENTPME IN VARCHAR2,
   P_CDTIPOCARD   IN VARCHAR2,
   P_CDFILIAL     IN VARCHAR2,
   P_CDSERVFILI   IN VARCHAR2,
   P_NUTRIENTE    IN VARCHAR2,
   P_IDNDPCAL     IN VARCHAR2,
   P_CDPRATOINI   IN VARCHAR2,
   P_CDPRATOFIN   IN VARCHAR2
   ) RETURN NUTRIENTE_PRATO_PME_TABLE PIPELINED IS

   OUT_RECORD NUTRIENTE_PRATO_PME_TYPE := NUTRIENTE_PRATO_PME_TYPE(
                                      NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
   V_CDPROTEINA FLOAT;
   V_CDCALORIAS FLOAT;
   V_QTPROTLIQU FLOAT;
   V_VRCALORNUTR FLOAT;
BEGIN
   SELECT MAX(CDPROTEINA)
          INTO V_CDPROTEINA
   FROM PARAMGERAL;

   SELECT MAX(CDCALORIAS)
          INTO V_CDCALORIAS
   FROM PARAMGERAL;

   FOR C_NUTRIENTE IN(
      SELECT 'S' AS IDTIPORECEITA,
             RS.CDFILAUXPRAT,
             RS.CDPRATO,
             RS.CDPRODUTO,
             NP.CDNUTRIENTE,
             RS.QTCALCNUTRSE AS QTPRODUTO,
             RS.VRPEFATNUTSE AS VRPEFATNUT,
             NP.QTNUTRPROD * 10 * NVL(DECODE(PRODFILI.VRPESOUNIDFI,
                                             0, PR.VRPESOUNID, PRODFILI.VRPESOUNIDFI), PR.VRPESOUNID) * RS.QTCALCNUTRSE  AS QTCALCNUTR
      FROM RECESERV RS, NUTRPROD NP, PRODFILI, PRODUTO PR
      WHERE (RS.CDSERVFILI = P_CDSERVFILI)
        AND (RS.CDFILIAL = P_CDFILIAL)
        AND (RS.CDFILAUXPRAT = 'P' OR RS.CDFILAUXPRAT = P_CDFILIAL)
        AND (RS.CDPRATO BETWEEN P_CDPRATOINI AND P_CDPRATOFIN)
        AND ((INSTR(P_NUTRIENTE, NP.CDNUTRIENTE) <> 0) OR (P_NUTRIENTE IS NULL))
        AND (RS.CDPRODUTO = NP.CDPRODUTO)
        AND (RS.CDPRODUTO = PR.CDPRODUTO)
        AND (PRODFILI.CDFILIAL = P_CDFILIAL)
        AND (PRODFILI.CDPRODUTO = RS.CDPRODUTO)
      UNION ALL
      SELECT 'F' AS IDTIPORECEITA,
             RF.CDFILAUXPRAT,
             RF.CDPRATO,
             RF.CDPRODUTO,
             NP.CDNUTRIENTE,
             RF.QTCALCNUTRLO AS QTPRODUTO,
             RF.VRPEFATNUTLO AS VRPEFATNUT,
             NP.QTNUTRPROD * 10 * NVL(DECODE(PRODFILI.VRPESOUNIDFI, 0, PR.VRPESOUNID, PRODFILI.VRPESOUNIDFI), PR.VRPESOUNID) * RF.QTCALCNUTRLO  AS QTCALCNUTR
      FROM RECEFILI RF, NUTRPROD NP, PRODFILI, PRODUTO PR
      WHERE (RF.CDFILIAL = P_CDFILIAL)
        AND (RF.CDFILAUXPRAT = 'P' OR RF.CDFILAUXPRAT = P_CDFILIAL)
        AND (RF.CDPRATO BETWEEN P_CDPRATOINI AND P_CDPRATOFIN)
        AND ((INSTR(P_NUTRIENTE, NP.CDNUTRIENTE) <> 0) OR (P_NUTRIENTE IS NULL))
        AND (RF.CDPRODUTO = NP.CDPRODUTO)
        AND (RF.CDPRODUTO = PR.CDPRODUTO)
        AND (PRODFILI.CDFILIAL = P_CDFILIAL)
        AND (PRODFILI.CDPRODUTO = RF.CDPRODUTO)
        AND NOT EXISTS (SELECT CDPRATO
                        FROM RECESERV
                        WHERE (CDFILAUXPRAT = RF.CDFILAUXPRAT)
                          AND (CDPRATO = RF.CDPRATO)
                          AND (CDFILIAL = P_CDFILIAL)
                          AND (CDSERVFILI = P_CDSERVFILI)
                       )
      UNION ALL
      SELECT 'T' AS IDTIPORECEITA,
             TP.CDFILAUXPRAT,
             TP.CDPRATO,
             TP.CDPRODUTO,
             NP.CDNUTRIENTE,
             TP.QTCALCNUTRPRTP AS QTPRODUTO,
             TP.VRPEFATNUTPRTP AS VRPEFATNUT,
             NP.QTNUTRPROD * 10 * NVL(DECODE(PRODFILI.VRPESOUNIDFI, 0, PR.VRPESOUNID, PRODFILI.VRPESOUNIDFI), PR.VRPESOUNID) * TP.QTCALCNUTRPRTP AS QTCALCNUTR
      FROM RECETPCARD TP, NUTRPROD NP, PRODFILI, PRODUTO PR
      WHERE (TP.CDFILCENTPME = P_CDFILCENTPME)
        AND (TP.CDTIPOCARD   = P_CDTIPOCARD)
        AND (TP.CDFILAUXPRAT = 'P' OR TP.CDFILAUXPRAT = P_CDFILCENTPME)
        AND (TP.CDPRATO BETWEEN P_CDPRATOINI AND P_CDPRATOFIN)
        AND ((INSTR(P_NUTRIENTE, NP.CDNUTRIENTE) <> 0) OR (P_NUTRIENTE IS NULL))
        AND (TP.CDPRODUTO = NP.CDPRODUTO)
        AND (TP.CDPRODUTO = PR.CDPRODUTO)
        AND (PRODFILI.CDFILIAL = P_CDFILIAL)
        AND (PRODFILI.CDPRODUTO = TP.CDPRODUTO)
        AND NOT EXISTS (SELECT CDPRATO
                        FROM RECEFILI
                        WHERE (CDFILAUXPRAT = TP.CDFILAUXPRAT)
                          AND (CDPRATO = TP.CDPRATO)
                          AND (CDFILIAL = P_CDFILIAL)
                       )
        AND NOT EXISTS (SELECT CDPRATO
                        FROM RECESERV
                        WHERE (CDFILAUXPRAT = TP.CDFILAUXPRAT)
                          AND (CDPRATO = TP.CDPRATO)
                          AND (CDFILIAL = P_CDFILIAL)
                          AND (CDSERVFILI = P_CDSERVFILI)
                       )

      UNION ALL
      SELECT 'P' AS IDTIPORECEITA,
             RP.CDFILAUXPRAT,
             RP.CDPRATO,
             RP.CDPRODUTO,
             NP.CDNUTRIENTE,
             RP.QTCALCNUTRPR AS QTPRODUTO,
             RP.VRPEFATNUTPR AS VRPEFATNUT,
             NP.QTNUTRPROD * 10 * NVL(DECODE(PRODFILI.VRPESOUNIDFI, 0, PR.VRPESOUNID, PRODFILI.VRPESOUNIDFI), PR.VRPESOUNID) * RP.QTCALCNUTRPR AS QTCALCNUTR
      FROM RECEPADR RP, NUTRPROD NP, PRODFILI, PRODUTO PR
      WHERE (RP.CDFILAUXPRAT = 'P')
        AND (RP.CDPRATO BETWEEN P_CDPRATOINI AND P_CDPRATOFIN)
        AND ((INSTR(P_NUTRIENTE, NP.CDNUTRIENTE) <> 0) OR (P_NUTRIENTE IS NULL))
        AND (RP.CDPRODUTO = NP.CDPRODUTO)
        AND (RP.CDPRODUTO = PR.CDPRODUTO)
        AND (PRODFILI.CDFILIAL = P_CDFILIAL)
        AND (PRODFILI.CDPRODUTO = RP.CDPRODUTO)
        AND NOT EXISTS (SELECT CDPRATO
                        FROM RECETPCARD
                        WHERE (CDFILAUXPRAT = RP.CDFILAUXPRAT)
                          AND (CDPRATO = RP.CDPRATO)
                          AND (CDFILCENTPME = P_CDFILCENTPME)
                          AND (CDTIPOCARD   = P_CDTIPOCARD)
                       )
        AND NOT EXISTS (SELECT CDPRATO
                        FROM RECEFILI
                        WHERE (CDFILAUXPRAT = RP.CDFILAUXPRAT)
                          AND (CDPRATO = RP.CDPRATO)
                          AND (CDFILIAL = P_CDFILIAL)
                       )
        AND NOT EXISTS (SELECT CDPRATO
                        FROM RECESERV
                        WHERE (CDFILAUXPRAT = RP.CDFILAUXPRAT)
                          AND (CDPRATO = RP.CDPRATO)
                          AND (CDFILIAL = P_CDFILIAL)
                          AND (CDSERVFILI = P_CDSERVFILI)
                       )
   ) LOOP

      V_QTPROTLIQU := 0;
      V_VRCALORNUTR := 0;
      /* --- CALCULO DO DNPCal --- */
      IF P_IDNDPCAL = 'S' THEN
         IF V_CDPROTEINA = C_NUTRIENTE.CDNUTRIENTE THEN
            /* ---GRAVA O VALOR DE PROTEINA LIQUIDA (NPU) -- */
            SELECT NVL(MAX(VRFATCALNDPC),0)
                   INTO V_QTPROTLIQU
            FROM NDPCAL
            WHERE  CDPRODUTO = (SELECT MAX(CDPRODUTO)
                                FROM NDPCAL
                                WHERE INSTR(C_NUTRIENTE.CDPRODUTO,CDPRODUTO) = 1
                                );
            V_QTPROTLIQU := V_QTPROTLIQU * C_NUTRIENTE.QTCALCNUTR;
         END IF;
         /* --------------------- GRAVA O VALOR DE CALORIAS -------------------- */
         IF V_CDCALORIAS = C_NUTRIENTE.CDNUTRIENTE THEN
            V_VRCALORNUTR := C_NUTRIENTE.QTCALCNUTR;
         END IF;
      END IF;

      OUT_RECORD.IDTIPORECEITA := C_NUTRIENTE.IDTIPORECEITA;
      OUT_RECORD.CDFAPRATNUTR  := C_NUTRIENTE.CDFILAUXPRAT;
      OUT_RECORD.CDPRATNUTR    := C_NUTRIENTE.CDPRATO;
      OUT_RECORD.CDPRODNUTR    := C_NUTRIENTE.CDPRODUTO;
      OUT_RECORD.CDNUTRCALC    := C_NUTRIENTE.CDNUTRIENTE;
      OUT_RECORD.QTPRODNUTR    := ROUND(C_NUTRIENTE.QTPRODUTO, 5);
      OUT_RECORD.QTNUTRCALC    := ROUND(C_NUTRIENTE.QTCALCNUTR, 5);
      OUT_RECORD.QTPROTLIQU    := ROUND(V_QTPROTLIQU, 5);
      OUT_RECORD.VRCALORNUTR   := ROUND(V_VRCALORNUTR, 5);
      OUT_RECORD.VRPECONSNUTR  := C_NUTRIENTE.VRPEFATNUT;
      PIPE ROW (OUT_RECORD);

   END LOOP;
   RETURN;
END;