/* Sistemas Integrados TECNISA
   Compras e Suprimentos

Nome: NDPCAL_DO_PRATO_PLA.SQL

Descrição:
Retorna o NDPCal do Prato.

P_CDFILIAL   - Código da Filial. Pode ser passado vazio para consultar
               o NDPCal da receita padrão.
P_CDSERVFILI - Código do Servico. Pode ser passado vazio para consultar
               o NDPCal da receita padrão ou por filial.
P_CDFILAUXPRAT - Código da filial do prato.
P_CDPRATO    - Código do Prato.

****************************************************************
             CORREçãO DO CóLCULO DO NDPCAL%
****************************************************************
A fórmula usada para cólculo do NDPCal%:

NDPCAL% = NPU * Sum(Proteínas) * 4
          ------------------------
                    VCT

onde:

NPU = Somatório das proteínas dos componentes da receita multiplicados
      pelo Fator de Cólculo de NDPCAL, informado na tela de parametrização
      por grupo de produtos, sendo 0,7 para alimentos de origem animal;
      0,6 para leguminosas e 0,5 para cereais, frutas e outros vegetais.
Sum(Proteínas) = Somatório das proteínas dos componentes da receita
VCT = "Valor Calórico Total" = Soma(carboidratos) x 4 +
                               Soma(lipídeos)    x 9  +
                               Soma(proteínas)   x 4  +
                               Soma(álcoois)     x 7
****************************************************************
*/

CREATE OR REPLACE
FUNCTION NDPCAL_PRATO(
   P_CDFILIAL     IN FILIAL.CDFILIAL%TYPE,
   P_CDSERVFILI   IN SERVICO.CDSERVFILI%TYPE,
   P_CDFILAUXPRAT IN PRATO.CDFILAUXPRAT%TYPE,
   P_CDPRATO      IN PRATO.CDPRATO%TYPE,
   P_CDFILCENTPME IN FILIAL.CDFILCENTPME%TYPE DEFAULT NULL,
   P_CDTIPOCARD   IN TIPOCARD.CDTIPOCARD%TYPE DEFAULT NULL,
   P_MERENDA      IN VARCHAR2 DEFAULT 'N')  RETURN  NUMBER
AS
   V_NDPCAL    NUMBER;
   V_PROTLIQU  NUMBER; /* Sum (Proteínas) */
   V_CALORIAS  NUMBER; /* VCT */
   V_NPU       NUMBER; /* Sum (Proteína x Fator de Cólculo) */
BEGIN
   /* ----------------- RETORNA O TOTAL DE CALORIAS DO PRATO ---------------- */
   FOR CUR_CALORIA IN
     (SELECT
           SUM(NP.QTNUTRPROD * QTPRODUTO) * 4 AS PROTEINA,
           SUM(NC.QTNUTRPROD * QTPRODUTO) * 4 AS CARBOIDRATO,
           SUM(NL.QTNUTRPROD * QTPRODUTO) * 9 AS LIPIDEO,
           SUM(NA.QTNUTRPROD * QTPRODUTO) * 7 AS ALCOOL
      FROM (
        SELECT R.CDPRODUTO, P.CDCARBOHIDRA, P.CDPROTEINA, P.CDLIPIDIOS, P.CDALCOOL,
                (10 * NVL(DECODE(PRODFILI.VRPESOUNIDFI, 0, R.VRPESOUNID, PRODFILI.VRPESOUNIDFI), R.VRPESOUNID) * R.QTCALCNUTR) AS QTPRODUTO
            FROM (SELECT MAX(CDCARBOHIDRA) CDCARBOHIDRA, MAX(CDPROTEINA) CDPROTEINA,
                         MAX(CDLIPIDIOS) CDLIPIDIOS, MAX(CDALCOOL) CDALCOOL FROM PARAMGERAL) P,
                 PRODFILI, PRATO P,
                 TABLE (RECEITA_UTIL(P_CDFILIAL, P_CDSERVFILI, P.CDPRATO, P.CDFILAUXPRAT,'0', 'Z', P.CDPRATO,0,0,'N', NULL, NULL, P_CDFILCENTPME, P_CDTIPOCARD) ) R
           WHERE (P.CDPRATO = P_CDPRATO)
             AND (P.CDFILAUXPRAT = 'P' OR P.CDFILAUXPRAT = P_CDFILIAL)
             AND (R.CDPRATOPAI = P.CDPRATO) 
             AND (R.CDFILAUXPRAT = P.CDFILAUXPRAT)
             AND (PRODFILI.CDFILIAL (+)  = P_CDFILIAL)
             AND (PRODFILI.CDPRODUTO (+) = R.CDPRODUTO)) R,
         NUTRPROD NC, NUTRPROD NP, NUTRPROD NL, NUTRPROD NA
      WHERE
         NP.CDPRODUTO   (+) = R.CDPRODUTO    AND
         NP.CDNUTRIENTE (+) = R.CDPROTEINA   AND
         NC.CDPRODUTO   (+) = R.CDPRODUTO    AND
         NC.CDNUTRIENTE (+) = R.CDCARBOHIDRA AND
         NL.CDPRODUTO   (+) = R.CDPRODUTO    AND
         NL.CDNUTRIENTE (+) = R.CDLIPIDIOS   AND
         NA.CDPRODUTO   (+) = R.CDPRODUTO    AND
         NA.CDNUTRIENTE (+) = R.CDALCOOL
   ) LOOP
      V_CALORIAS := NVL(CUR_CALORIA.CARBOIDRATO,0) + NVL(CUR_CALORIA.LIPIDEO,0) + NVL(CUR_CALORIA.PROTEINA,0) + NVL(CUR_CALORIA.ALCOOL,0);
   END LOOP;

   /* ---------------- RETORNA O TOTAL DE PROTEINAS E O NPU DO PRATO ---------------- */

   FOR CUR_PROTEINA IN
     (SELECT SUM(NPU) NPU FROM (
           SELECT 
             SUM(
                 NP.QTNUTRPROD * 10 * 
                 NVL(DECODE(PRODFILI.VRPESOUNIDFI, 0, R.VRPESOUNID, PRODFILI.VRPESOUNIDFI), R.VRPESOUNID) * 
                 QTCALCNUTR * 
                 NVL((SELECT MAX(N.VRFATCALNDPC)
                        FROM NDPCAL N WHERE INSTR(R.CDPRODUTO, N.CDPRODUTO) > 0), 1) 
                 ) AS NPU
        FROM PRODFILI, NUTRPROD NP, PRATO P,
            TABLE (RECEITA_UTIL(P_CDFILIAL, P_CDSERVFILI, P.CDPRATO, P.CDFILAUXPRAT,'0', 'Z', P.CDPRATO,0,0,'N', NULL, NULL, P_CDFILCENTPME, P_CDTIPOCARD) ) R
        WHERE (R.CDPRATOPAI = P.CDPRATO)
          AND (P.CDPRATO = P_CDPRATO)
          AND (P.CDFILAUXPRAT = P_CDFILAUXPRAT)
          AND (P.CDFILAUXPRAT = P_CDFILAUXPRAT)
          AND (R.CDFILAUXPRAT = P.CDFILAUXPRAT)
          AND (R.CDPRODUTO       = NP.CDPRODUTO)
          AND (PRODFILI.CDFILIAL(+)  = P_CDFILIAL)
          AND (PRODFILI.CDPRODUTO(+) = R.CDPRODUTO)
          AND (NP.CDNUTRIENTE  = (SELECT MAX(CDPROTEINA) FROM PARAMGERAL)))
   ) LOOP
      V_NPU := NVL(CUR_PROTEINA.NPU,0);
   END LOOP;
   
   SELECT SUM(R.QTPRODLIQ)
     INTO V_PROTLIQU
     FROM TABLE (RECEITA_UTIL(P_CDFILIAL, P_CDSERVFILI, P_CDPRATO, P_CDFILAUXPRAT,'0', 'Z', P_CDPRATO,0,0,'N', NULL, NULL, P_CDFILCENTPME, P_CDTIPOCARD) ) R
          INNER JOIN NUTRPROD NP ON NP.CDPRODUTO = R.CDPRODUTO;

   IF V_CALORIAS = 0 OR V_CALORIAS IS NULL THEN
      V_NDPCAL := 0;
   ELSE
      V_NDPCAL := NVL(V_PROTLIQU,0) * NVL(V_NPU,0) * 4 / V_CALORIAS;
   END IF;

   RETURN(ROUND(V_NDPCAL, 2));

END;
/