create or replace PROCEDURE GERA_PLAN_PRODUCAO(
    P_NRPLANPROD IN PLANPRODUCAO.NRPLANPROD%TYPE,
    P_OPERACAO   IN VARCHAR2, /*G: geracao C: Cancelamento*/
    P_CDFILCENT  IN FILIAL.CDFILIAL%TYPE,
    P_DTPRODUCAO IN RETIRADA.DTRETIRADA%TYPE,
    P_DTINICARD  IN PLANPRODUCAO.DTINICARD%TYPE, 
    P_DTFINCARD  IN PLANPRODUCAO.DTFINCARD%TYPE,
    P_TIPOPRAT   IN VARCHAR2, 
    P_SETOR      IN VARCHAR2,
    P_CDOPERADOR IN VARCHAR2,
    P_NRORG      IN NUMBER,
    P_COOKCHILL  IN VARCHAR2,
    P_ESTADO IN VARCHAR2,
    P_DTFINLIMITE IN PLANPRODUCAO.DTFINCARD%TYPE,
    P_LISTAFILSERV IN LISTA.NRLISTA%TYPE,
    P_RETORNO    OUT VARCHAR2
)
IS   
  V_NRLANCAMENTO VARCHAR2(20);
  /*Produto acabado*/
  V_CDPRODACABADO VARCHAR2(10); 
  /*Cardapio*/
  V_CDFILIAL VARCHAR2(4);
  V_CDSERVFILI VARCHAR2(5);
  V_DTCONSUMO DATE;
  V_IDCOOKCHILL VARCHAR2(1);
  V_IDFINALIZACAO VARCHAR2(1);
  V_ESTADO VARCHAR2(30);
  V_IDTPPRODCHILL VARCHAR2(30);
  V_CDPRODUTO VARCHAR(10);
  /*Auxiliares para calcular comensais*/
  V_NUMDESTINOS VARCHAR(2);
  V_NUMTPPRATO VARCHAR2(2);
  V_AUX VARCHAR(20);
  V_QTCOMENSAIS VARCHAR(20);
  V_QTPRODUTO FLOAT;
  V_CDTIPOPRAT VARCHAR2(3);
  EXIST_DADOS NUMBER;
  V_NRCARDACLIPLANPROD VARCHAR2(20);
  V_QTAMOSTRA FLOAT;
  V_QTAMOSTRA_PTO FLOAT;
  V_IDOBRIGINFOQTD VARCHAR2(1);
  V_HRINICIO FLOAT;
  V_HRFIM FLOAT;
BEGIN
/* *********************************** */
/* GERACAO do planejamento da producao */
/* *********************************** */
IF P_OPERACAO = 'G' THEN
   
   /* Busca o numero do lancamento do produto acabado */
   NOVO_CODIGO('PLANPRODUCAO', V_NRLANCAMENTO);
   V_NRLANCAMENTO := SUBSTR(V_NRLANCAMENTO, 11, 10);
      
   P_RETORNO := V_NRLANCAMENTO;    

   INSERT INTO PLANPRODUCAO
      (NRORG, NRPLANPROD, CDFILIAL, DTPRODUCAO, DTINICARD, DTFINCARD, IDRETIRADA)
   VALUES
      (P_NRORG, V_NRLANCAMENTO, P_CDFILCENT, P_DTPRODUCAO, P_DTINICARD, P_DTFINCARD, 'N');

   /* Busca os dados para alimentar as tabelas */
   FOR C_DADOS IN
   (
 SELECT CDFILIAL, CDSERVFILI, S.DTCONSUMO, DTPRATO, QTCOMENSAIS, S.CDPRODACABADO, CDPRODUTO, SUM(QTPRODUTO) QTPRODUTO,
          MAX(QTPORPESSOA) AS QTPORPESSOA, MAX(VRCUSTOUNITPROD) VRCUSTOUNITPROD,
          CDTIPOPRAT, CDPRATO, CDFILAUXPRAT, IDTIPO, IDADIANTADO, IDCOOKCHILL, IDFINALIZACAO, ESTADO, IDTPPRODCHILL, PRATOCARDAPIO,
          QTAMOSTRA
     FROM(SELECT C.CDFILIAL, C.CDSERVFILI, (C.DTCARDAPIO - NVL(R.LIMITEACUMULADO,0) + NVL(R.QTLIMSEGPRODPAI,0) +  NVL(R.QTLIMSEG,0) + NVL(R.QTLIMSEGPRAT,0)) AS DTCONSUMO, 
                 C.DTCARDAPIO AS DTPRATO,
                 C.QTCLIESTICAR AS QTCOMENSAIS, R.CDPRODPRODUCAO AS CDPRODACABADO, R.CDPRODUTO,
                 ROUND(C.QTCLIESTICAR * DECODE(NVL(R.IDFINALIZACAO, 'M'),'F',ROUND(R.QTPRODUTO,5) ,ROUND(R.QTPRODUTO + NVL(R.QTCOMPLPROD,0),5)),5) AS QTPRODUTO,
                 ROUND(R.QTPADRAO, 5) AS QTPORPESSOA, 
                 ROUND(NVL(CUSTO_PRODUTO(P_CDFILCENT, R.CDPRODUTO, DECODE(PF.CDTIPCUSTEST, '', '03', PF.CDTIPCUSTEST), C.DTCARDAPIO, SYSDATE), 0),5) AS VRCUSTOUNITPROD,
                 C.CDTIPOPRAT, R.CDPRATO, R.CDFILAUXPRAT, DECODE(R.LIMITEACUMULADOPP,0,'N','S') AS IDADIANTADO, NVL(R.IDPRODCHILL, 'N') AS IDCOOKCHILL,
                 NVL(R.IDFINALIZACAO, 'M') AS IDFINALIZACAO,
                 DECODE(R.LIMITEACUMULADOPP,0,'CONSUMO','PRODUCAO') AS ESTADO, R.IDTPPRODCHILL, R.IDTIPORECE AS IDTIPO, C.CDPRATO AS PRATOCARDAPIO,
                 R.QTAMOSTRA
            FROM (SELECT C.CDFILIAL, C.CDSERVFILI, C.DTCARDAPIO, 
                        CASE COUNT(CLI.QT_CLI) WHEN 0 THEN SUM(ROUND(((C.QTCOMESTICAR * P.VRPECONSCARD)/100),3))
                        ELSE 
                      SUM(ROUND(((C.QTCLIESTICAR * P.VRPECONSCARD)/100),3)) 
                      END 
                      AS QTCLIESTICAR, 
                  P.CDTIPOPRAT, P.CDFILAUXPRAT, P.CDPRATO
                    FROM CARDADIA C 
                    LEFT JOIN (SELECT CDFILIAL, NRCARDAPIO, NVL(COUNT(CDDESTFILI), 0) QT_CLI 
                                 FROM CARDACLI 
                                GROUP BY CDFILIAL, NRCARDAPIO) CLI ON CLI.NRCARDAPIO = C.NRCARDAPIO AND CLI.CDFILIAL = C.CDFILIAL 
                   INNER JOIN COMPCARD P ON C.CDFILIAL = P.CDFILIAL AND P.NRCARDAPIO = C.NRCARDAPIO 
                                        AND C.DTCARDAPIO BETWEEN P_DTINICARD AND P_DTFINLIMITE
                   INNER JOIN (SELECT SUBSTR(CDLISTA,1,4) AS CDFILIAL, SUBSTR(CDLISTA,5,5) AS CDSERVFILI FROM LISTA
                                WHERE NRLISTA = P_LISTAFILSERV) L ON C.CDFILIAL = L.CDFILIAL AND C.CDSERVFILI = L.CDSERVFILI
                                   -- LEFT JOIN SETOTIPOPRAT  SC ON (C.CDFILIAL = SC.CDFILIAL AND P.CDTIPOPRAT = SC.CDTIPOPRAT) 
                   WHERE NVL(C.QTCLIESTICAR,0) > 0                 
                  GROUP BY C.CDFILIAL,C.CDSERVFILI, C.DTCARDAPIO, P.CDTIPOPRAT, P.CDFILAUXPRAT, P.CDPRATO) C,
                 TABLE(RECEITA_UTIL(C.CDFILIAL, C.CDSERVFILI, C.CDPRATO, C.CDFILAUXPRAT, '0', 'Z', C.CDPRATO,0,0,'S')) R, PRATO,
                 PARAMFILIAL PF
          WHERE R.CDPRATO = PRATO.CDPRATO
           AND (PF.CDFILIAL(+) = P_CDFILCENT)
           AND (R.CDPRODPRODUCAO IS NOT NULL)
           AND (P_COOKCHILL =  R.IDPRODCHILL OR P_COOKCHILL = 'T')
           AND R.QTPADRAO > 0
           AND R.IDTPREQPROD = 'P'
           AND R.IDTPREQPRODPAI <> 'E'
           AND (INSTR(P_TIPOPRAT, C.CDTIPOPRAT) <> 0 OR (P_TIPOPRAT = 'A'))
           AND (INSTR(P_SETOR, VERIFICA_SETORCOZ_COZ(C.CDFILIAL, C.CDTIPOPRAT, R.CDPRODPRODUCAO))<>0 OR (P_SETOR = 'A'))
           AND (E_AGREGADA(P_CDFILCENT, C.CDFILIAL, C.CDSERVFILI, C.CDTIPOPRAT, C.DTCARDAPIO) > 0)    
           AND ((P_ESTADO = 'P' AND R.LIMITEACUMULADOPP > 0) OR (P_ESTADO = 'F' AND R.LIMITEACUMULADOPP = 0) OR (P_ESTADO = 'T'))
           AND C.DTCARDAPIO - R.LIMITEACUMULADOPP BETWEEN P_DTINICARD AND P_DTFINCARD
           AND NOT EXISTS (SELECT PPROD.CDPRODACABADO
                            FROM PLANPRODFILIAGREGA PPROD
                           WHERE IDCONCLUIDO = 'S' AND
                                 PPROD.CDFILIAGREG = C.CDFILIAL AND 
                                 PPROD.CDSERVFILIAGREG = C.CDSERVFILI AND 
                                 PPROD.DTCONSUMO = C.DTCARDAPIO AND 
                                 PPROD.CDPRODACABADO = R.CDPRODPRODUCAO)
           ) S
   GROUP BY CDFILIAL, CDSERVFILI, S.DTCONSUMO, DTPRATO, S.CDPRODACABADO, CDPRODUTO, QTCOMENSAIS,         
           CDTIPOPRAT, CDPRATO, CDFILAUXPRAT, IDTIPO, IDADIANTADO, IDCOOKCHILL, IDFINALIZACAO, ESTADO, IDTPPRODCHILL, PRATOCARDAPIO,
           QTAMOSTRA
   ORDER BY CDPRODACABADO, IDCOOKCHILL, IDFINALIZACAO, ESTADO, IDTPPRODCHILL, CDFILIAL, CDSERVFILI, DTCONSUMO, CDPRODUTO
   ) LOOP
       V_QTPRODUTO :=  C_DADOS.QTPRODUTO;
      /* Insere produto acabado */
      IF ( (V_CDPRODACABADO IS NULL) OR (V_CDPRODACABADO <> C_DADOS.CDPRODACABADO) OR
           (V_IDCOOKCHILL   IS NULL) OR (V_IDCOOKCHILL   <> C_DADOS.IDCOOKCHILL)   OR
           (V_IDFINALIZACAO IS NULL) OR (V_IDFINALIZACAO <> C_DADOS.IDFINALIZACAO) OR
           (V_ESTADO        IS NULL) OR (V_ESTADO        <> C_DADOS.ESTADO)        OR
           (V_IDTPPRODCHILL IS NULL) OR (V_IDTPPRODCHILL <> C_DADOS.IDTPPRODCHILL)) THEN
		 
         INSERT INTO PLANPRODACABADO
         (NRSEQPRODACABADO, NRPLANPROD, CDPRODACABADO, QTPRODACABADO, 
          CDPRATO, CDFILAUXPRAT,
          NRORG, NRORGINCLUSAO, NRORGULTATU, 
          DTINCLUSAO, DTULTATU,
          CDOPERINCLUSAO, CDOPERULTATU,IDCOOKCHILL,
          IDFINALIZACAO, IDESTADO, IDTPPRODCHILL)
         VALUES
         (1,V_NRLANCAMENTO, C_DADOS.CDPRODACABADO, 0.00, 
          C_DADOS.CDPRATO, C_DADOS.CDFILAUXPRAT,
          P_NRORG, P_NRORG, P_NRORG,
          SYSDATE, SYSDATE,
          P_CDOPERADOR, P_CDOPERADOR,C_DADOS.IDCOOKCHILL,
          C_DADOS.IDFINALIZACAO, C_DADOS.ESTADO, C_DADOS.IDTPPRODCHILL);
          
         /* Atualiza o custo por pessoa no cardapio */         
         IF (V_CDFILIAL IS NOT NULL) THEN
            UPDATE PLANPRODFILIAGREGA
               SET VRUNITPRODSERV = ROUND(VRTOTALPRODSERV / CASE WHEN QTCOMENSSERV = 0 THEN 1 ELSE QTCOMENSSERV END , 2)
             WHERE NRPLANPROD = V_NRLANCAMENTO
               AND CDPRODACABADO = V_CDPRODACABADO
               AND CDFILIAGREG = V_CDFILIAL
               AND CDSERVFILIAGREG = V_CDSERVFILI
               AND DTCONSUMO = V_DTCONSUMO
               AND IDCOOKCHILL = V_IDCOOKCHILL
               AND IDFINALIZACAO = V_IDFINALIZACAO
               AND IDESTADO = V_ESTADO
               AND IDTPPRODCHILL = V_IDTPPRODCHILL;
         END IF;
         

             
         V_CDPRODACABADO := C_DADOS.CDPRODACABADO;
         V_IDCOOKCHILL   := C_DADOS.IDCOOKCHILL;
         V_IDFINALIZACAO := C_DADOS.IDFINALIZACAO;
         V_ESTADO        := C_DADOS.ESTADO;
         V_IDTPPRODCHILL := C_DADOS.IDTPPRODCHILL;
         V_CDFILIAL := NULL;
         V_CDSERVFILI := NULL;
         V_DTCONSUMO := NULL;
         V_CDPRODUTO := NULL;
         

      END IF;
      
      /*Insere cardapio das filiais agregadas */
      IF ( (V_CDFILIAL IS NULL) OR (V_CDFILIAL <> C_DADOS.CDFILIAL) ) OR 
         ( (V_CDSERVFILI IS NULL) OR (V_CDSERVFILI <> C_DADOS.CDSERVFILI) ) OR 
         ( (V_DTCONSUMO IS NULL) OR (V_DTCONSUMO <> C_DADOS.DTCONSUMO) ) THEN
         
          /* QUANTIDADE DA AMOSTRA */ 
           V_QTAMOSTRA_PTO := 0.00;
           V_QTAMOSTRA := C_DADOS.QTAMOSTRA;
          /* BEGIN
             SELECT NVL(QTTOTEXTRA, 0.00) INTO V_QTAMOSTRA FROM (SELECT CDFILAUXPRAT, CDPRATO, QTPADRAOPRAT AS QTPORPESSOA, QTAMOSTRPADR AS QTTOTEXTRA, 'P' AS RECE_UTIL
                          FROM PRATPADR WHERE CDPRODPRODUCAO IS NOT NULL            
                        UNION ALL 
                        SELECT CDFILAUXPRAT, CDPRATO, QTPADRAOFILI AS QTPORPESSOA, QTAMOSTRFILI AS QTTOTEXTRA, 'F' AS RECE_UTIL
                          FROM PRATFILI WHERE CDFILIAL = C_DADOS.CDFILIAL AND CDPRODPRODUCAO IS NOT NULL
                        UNION ALL
                        SELECT CDFILAUXPRAT, CDPRATO, QTPADRAOSERV AS QTPORPESSOA, QTAMOSTRSERV AS QTTOTEXTRA, 'S' AS RECE_UTIL
                          FROM PRATSERV WHERE CDFILIAL = C_DADOS.CDFILIAL AND CDSERVFILI = C_DADOS.CDSERVFILI AND CDPRODPRODUCAO IS NOT NULL
                       ) REC WHERE REC.CDFILAUXPRAT = C_DADOS.CDFILAUXPRAT 
                            AND REC.CDPRATO = C_DADOS.CDPRATO 
                            AND REC.RECE_UTIL = C_DADOS.IDTIPO;
          EXCEPTION
             WHEN NO_DATA_FOUND THEN BEGIN
                V_QTAMOSTRA := 0.00;
             END;
         END;*/
         
         /* Atualiza o custo por pessoa no cardapio */         
         IF (V_CDFILIAL IS NOT NULL) THEN
            UPDATE PLANPRODFILIAGREGA
               SET VRUNITPRODSERV = ROUND(VRTOTALPRODSERV / CASE WHEN QTCOMENSSERV = 0 THEN 1 ELSE QTCOMENSSERV END , 2)
             WHERE NRPLANPROD = V_NRLANCAMENTO
               AND CDPRODACABADO = V_CDPRODACABADO
               AND CDFILIAGREG = V_CDFILIAL
               AND CDSERVFILIAGREG = V_CDSERVFILI
               AND DTCONSUMO = V_DTCONSUMO
               AND IDCOOKCHILL = V_IDCOOKCHILL
               AND IDFINALIZACAO = V_IDFINALIZACAO
               AND IDESTADO = V_ESTADO
               AND IDTPPRODCHILL = V_IDTPPRODCHILL;
         END IF;
         
         /*Insere cardapio das filiais agregadas */
         INSERT INTO PLANPRODFILIAGREGA 
         (NRSEQPRODACABADO, NRPLANPROD, CDPRODACABADO, CDFILIAGREG, CDSERVFILIAGREG, 
          DTCONSUMO, QTCOMENSSERV, QTPRODSERV, VRTOTALPRODSERV, VRUNITPRODSERV,
          NRORG, NRORGINCLUSAO, NRORGULTATU, 
          DTINCLUSAO, DTULTATU,
          CDOPERINCLUSAO, CDOPERULTATU,IDCOOKCHILL,
          IDFINALIZACAO, IDESTADO, IDTPPRODCHILL)
         VALUES
         (1,V_NRLANCAMENTO, V_CDPRODACABADO, C_DADOS.CDFILIAL, C_DADOS.CDSERVFILI,
          C_DADOS.DTCONSUMO, 0, 0.00, 0.00, 0.00,
          P_NRORG, P_NRORG, P_NRORG,
          SYSDATE, SYSDATE,
          P_CDOPERADOR, P_CDOPERADOR,V_IDCOOKCHILL,
          V_IDFINALIZACAO, V_ESTADO, V_IDTPPRODCHILL);
          
          BEGIN
             SELECT COUNT(DISTINCT CDTIPOPRAT) INTO V_NUMTPPRATO
               FROM COMPCARD CP INNER JOIN CARDADIA C ON (C.CDFILIAL = CP.CDFILIAL AND C.NRCARDAPIO = CP.NRCARDAPIO)  
              WHERE C.CDFILIAL   = C_DADOS.CDFILIAL AND 
                    C.CDSERVFILI = C_DADOS.CDSERVFILI AND
                    C.DTCARDAPIO = C_DADOS.DTPRATO AND
                    CP.CDPRATO   = C_DADOS.PRATOCARDAPIO;
          EXCEPTION
             WHEN NO_DATA_FOUND THEN BEGIN
                V_NUMTPPRATO := 1;
             END;
         END;
         IF (V_NUMTPPRATO = 0) THEN
            V_NUMTPPRATO := 1;
         END IF;
         
         /*ROTINA PARA GRAVAR OS DADOS DE COMENSAIS POR PONTO DE ENTREGA, E TIPO DE PRATO PARA POSTERIOR CALCULO DE EMBALAGENS*/
         FOR C_PTOENTREGA IN(
            SELECT CL.CDCLIENTE, CL.CDDESTFILI, ROUND(NVL(CL.QTCOMESTICLI, C.QTCLIESTICAR) * (CP.VRPECONSCARD/100),3) AS QTCOMESTICLI, 
                   CP.NRSEQPRATCAR, CP.CDTIPOPRAT
              FROM  CARDADIA C LEFT JOIN CARDACLI CL ON CL.CDFILIAL = C.CDFILIAL AND CL.NRCARDAPIO = C.NRCARDAPIO
                               INNER JOIN COMPCARD CP ON CP.CDFILIAL = C.CDFILIAL AND CP.NRCARDAPIO = C.NRCARDAPIO
              WHERE C.CDFILIAL = C_DADOS.CDFILIAL AND
                    C.CDSERVFILI = C_DADOS.CDSERVFILI AND
                    C.DTCARDAPIO = C_DADOS.DTCONSUMO AND
                    CP.CDPRATO = C_DADOS.PRATOCARDAPIO AND 
                    --CP.CDTIPOPRAT = C_DADOS.CDTIPOPRAT AND
                    (INSTR(P_TIPOPRAT, CP.CDTIPOPRAT) <> 0 OR (P_TIPOPRAT = 'A')) AND
                    NVL(CL.QTCOMESTICLI, C.QTCOMESTICAR) > 0
         ) LOOP 
            /* gera novo codigo para a tabela cardacliplanprod */
            NOVO_CODIGO('CARDACLIPLANPROD', V_NRCARDACLIPLANPROD);
            V_NRCARDACLIPLANPROD := SUBSTR(V_NRCARDACLIPLANPROD, 11, 10);
            INSERT INTO CARDACLIPLANPROD (NRCARDACLIPLANPROD,NRPLANPROD, CDPRODUTO, CDPRATO, CDFILAUXPRAT, CDFILIAL, CDSERVFILI, DTCONSUMO, CDCLIENTE, 
                                          CDDESTFILI, CDTIPOPRAT, QTCOMESTICLI, NRSEQPRATCAR, IDCOOKCHILL, IDTPPRODCHILL, IDESTADO, NRORG, QTAPRODUZIR)
            VALUES (V_NRCARDACLIPLANPROD,V_NRLANCAMENTO, V_CDPRODACABADO, C_DADOS.CDPRATO, C_DADOS.CDFILAUXPRAT, C_DADOS.CDFILIAL, C_DADOS.CDSERVFILI, C_DADOS.DTCONSUMO, C_PTOENTREGA.CDCLIENTE,
                    C_PTOENTREGA.CDDESTFILI, C_PTOENTREGA.CDTIPOPRAT, C_PTOENTREGA.QTCOMESTICLI, C_PTOENTREGA.NRSEQPRATCAR,
                    V_IDCOOKCHILL, V_IDTPPRODCHILL, V_ESTADO, P_NRORG, C_DADOS.QTPORPESSOA * C_PTOENTREGA.QTCOMESTICLI);

            V_QTAMOSTRA_PTO := V_QTAMOSTRA_PTO + V_QTAMOSTRA;

         END LOOP;
         /*FIM*/
         /*auxiliares para calculcar os comensais*/
         V_AUX := 1;
         V_QTCOMENSAIS := 0;
         --V_NUMDESTINOS := V_NUMDESTINOS + V_NUMTPPRATO - 1;               
         V_CDFILIAL := C_DADOS.CDFILIAL;
         V_CDSERVFILI := C_DADOS.CDSERVFILI;
         V_DTCONSUMO := C_DADOS.DTCONSUMO;
         V_CDPRODUTO := NULL;
         V_CDTIPOPRAT := NULL;
      END IF;
      
      -- CALCULA A QUANTIDADE DE MATERIA PRIMA CONSIDERANDO A QTD DE AMOSTRA
      V_QTPRODUTO := C_DADOS.QTPRODUTO + ((((V_QTAMOSTRA_PTO * 100) / C_DADOS.QTPORPESSOA) * C_DADOS.QTPRODUTO) / 100);
      
      IF ( (V_CDFILIAL IS NULL) OR (V_CDFILIAL <> C_DADOS.CDFILIAL) ) OR 
         ( (V_CDSERVFILI IS NULL) OR (V_CDSERVFILI <> C_DADOS.CDSERVFILI) ) OR 
         ( (V_DTCONSUMO IS NULL) OR (V_DTCONSUMO <> C_DADOS.DTCONSUMO) ) OR 
         ( (V_CDPRODACABADO IS NULL) OR (V_CDPRODACABADO <> C_DADOS.CDPRODACABADO) ) OR 
         ( (V_IDCOOKCHILL IS NULL) OR (V_IDCOOKCHILL <> C_DADOS.IDCOOKCHILL) ) OR 
         ( (V_IDFINALIZACAO IS NULL) OR (V_IDFINALIZACAO <> C_DADOS.IDFINALIZACAO) ) OR 
         ( (V_ESTADO IS NULL) OR (V_ESTADO <> C_DADOS.ESTADO) ) OR 
         ( (V_IDTPPRODCHILL IS NULL) OR (V_IDTPPRODCHILL <> C_DADOS.IDTPPRODCHILL) ) OR
         ( (V_CDPRODUTO IS NULL) OR (V_CDPRODUTO <> C_DADOS.CDPRODUTO) ) OR
         ( (V_CDTIPOPRAT IS NULL) OR (V_CDTIPOPRAT <> C_DADOS.CDTIPOPRAT) ) THEN
                    
          /* Insere item da receita */
          INSERT INTO PLANRECPROD
            (NRSEQPRODACABADO, NRPLANPROD, CDFILIAL, 
             CDPRODACABADO, CDFILIAGREG, CDSERVFILIAGREG, DTCONSUMO, 
             CDPRODUTO, QTPRODRECEPRAT, VRUNITRECEPRAT, 
             VRTOTALRECEPRAT, CDTIPOPRAT, IDTPRECEITA, IDADIANTADO,
             NRORG, NRORGINCLUSAO, NRORGULTATU, 
             DTINCLUSAO, DTULTATU,
             CDOPERINCLUSAO, CDOPERULTATU,IDCOOKCHILL,
                IDFINALIZACAO, IDESTADO, IDTPPRODCHILL)
          VALUES
            (1,V_NRLANCAMENTO, P_CDFILCENT,
             V_CDPRODACABADO, V_CDFILIAL, V_CDSERVFILI, V_DTCONSUMO,
             C_DADOS.CDPRODUTO, V_QTPRODUTO, ROUND( NVL(C_DADOS.VRCUSTOUNITPROD, 0.00), 5),
             ROUND( NVL(V_QTPRODUTO * C_DADOS.VRCUSTOUNITPROD, 0.00), 2), C_DADOS.CDTIPOPRAT, C_DADOS.IDTIPO, C_DADOS.IDADIANTADO,
             P_NRORG, P_NRORG, P_NRORG,
             SYSDATE, SYSDATE,
             P_CDOPERADOR, P_CDOPERADOR,V_IDCOOKCHILL,
             V_IDFINALIZACAO, V_ESTADO, V_IDTPPRODCHILL);
      ELSE 
         UPDATE PLANRECPROD
            SET QTPRODRECEPRAT = QTPRODRECEPRAT + V_QTPRODUTO,
                VRTOTALRECEPRAT = VRTOTALRECEPRAT + ROUND( NVL(V_QTPRODUTO * C_DADOS.VRCUSTOUNITPROD, 0.00), 5)
          WHERE CDFILIAL = P_CDFILCENT
            AND CDFILIAGREG = C_DADOS.CDFILIAL
            AND CDSERVFILIAGREG = C_DADOS.CDSERVFILI
            AND DTCONSUMO = C_DADOS.DTCONSUMO
            AND CDPRODACABADO = C_DADOS.CDPRODACABADO
            AND CDPRODUTO = C_DADOS.CDPRODUTO
            AND IDCOOKCHILL = C_DADOS.IDCOOKCHILL
            AND IDFINALIZACAO = C_DADOS.IDFINALIZACAO
            AND IDESTADO = C_DADOS.ESTADO
            AND IDTPPRODCHILL = C_DADOS.IDTPPRODCHILL
            AND CDTIPOPRAT = C_DADOS.CDTIPOPRAT; 
      END IF;
            
      /*Soma o numero de comensais de cada ponto de entrega*/      
      IF (V_NUMTPPRATO >= V_AUX) THEN
        V_QTCOMENSAIS := C_DADOS.QTCOMENSAIS;          
               
       UPDATE PLANPRODACABADO
          SET QTPRODACABADO = QTPRODACABADO + ROUND(NVL(V_QTCOMENSAIS * C_DADOS.QTPORPESSOA, 0.00),5) + V_QTAMOSTRA_PTO 
        WHERE NRPLANPROD = V_NRLANCAMENTO
          AND CDPRODACABADO = V_CDPRODACABADO
          AND IDCOOKCHILL = V_IDCOOKCHILL
          AND IDFINALIZACAO = V_IDFINALIZACAO
          AND IDESTADO = V_ESTADO
          AND IDTPPRODCHILL = V_IDTPPRODCHILL;
        
        UPDATE PLANPRODFILIAGREGA
           SET QTCOMENSSERV = QTCOMENSSERV + V_QTCOMENSAIS,
               QTPRODSERV = QTPRODSERV + ROUND(NVL(V_QTCOMENSAIS * C_DADOS.QTPORPESSOA, 0.00),5) + V_QTAMOSTRA_PTO,
               --VRUNITPRODSERV = ROUND(VRTOTALPRODSERV / CASE WHEN QTCOMENSSERV = 0 THEN 1 ELSE QTCOMENSSERV END , 2)
               VRUNITPRODSERV = ROUND(VRTOTALPRODSERV / V_QTCOMENSAIS, 2)
         WHERE NRPLANPROD = V_NRLANCAMENTO
           AND CDPRODACABADO = V_CDPRODACABADO
           AND CDFILIAGREG = V_CDFILIAL
           AND CDSERVFILIAGREG = V_CDSERVFILI
           AND DTCONSUMO = V_DTCONSUMO
           AND IDCOOKCHILL = V_IDCOOKCHILL
           AND IDFINALIZACAO = V_IDFINALIZACAO
           AND IDESTADO = V_ESTADO
           AND IDTPPRODCHILL = V_IDTPPRODCHILL;        
             
        V_AUX := V_AUX + 1;
      END IF;
      
      /* Atualiza o custo total no cardapio e a quantidade de comensais apenas se  */      
      UPDATE PLANPRODFILIAGREGA
         SET VRTOTALPRODSERV = VRTOTALPRODSERV + ROUND(NVL(V_QTPRODUTO * C_DADOS.VRCUSTOUNITPROD, 0.00) , 2)
       WHERE NRPLANPROD = V_NRLANCAMENTO
         AND CDPRODACABADO = V_CDPRODACABADO
         AND CDFILIAGREG = V_CDFILIAL
         AND CDSERVFILIAGREG = V_CDSERVFILI
         AND DTCONSUMO = V_DTCONSUMO
         AND IDCOOKCHILL = V_IDCOOKCHILL
         AND IDFINALIZACAO = V_IDFINALIZACAO
         AND IDESTADO = V_ESTADO
         AND IDTPPRODCHILL = V_IDTPPRODCHILL;
      
      V_CDPRODUTO := C_DADOS.CDPRODUTO;
      V_CDTIPOPRAT := C_DADOS.CDTIPOPRAT;
   END LOOP;
   
   /* Atualiza o custo por pessoa no cardapio */         
   IF (V_CDFILIAL IS NOT NULL) THEN
      UPDATE PLANPRODFILIAGREGA
         SET VRUNITPRODSERV = ROUND(VRTOTALPRODSERV / CASE WHEN QTCOMENSSERV = 0 THEN 1 ELSE QTCOMENSSERV END , 2)
       WHERE NRPLANPROD = V_NRLANCAMENTO
         AND CDPRODACABADO = V_CDPRODACABADO
         AND CDFILIAGREG = V_CDFILIAL
         AND CDSERVFILIAGREG = V_CDSERVFILI
         AND DTCONSUMO = V_DTCONSUMO
         AND IDCOOKCHILL = V_IDCOOKCHILL
         AND IDFINALIZACAO = V_IDFINALIZACAO
         AND IDESTADO = V_ESTADO
         AND IDTPPRODCHILL = V_IDTPPRODCHILL;         
   END IF;
   /*ATUALIZA A QUANTIDADE A PRODUZIR IGUAL A QUANTIDADE PLANEJADA*/
   BEGIN
    BEGIN 
      SELECT NVL(IDOBRIGINFOQTD, 'N') INTO V_IDOBRIGINFOQTD
        FROM PARAMPLANEJA
       WHERE CDFILIAL = P_CDFILCENT;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN BEGIN
        V_IDOBRIGINFOQTD := 'N';
      END;
    END;

    IF V_IDOBRIGINFOQTD = 'S' THEN
      UPDATE PLANRECPROD 
         SET QTAPRODUZIR = 0,
             QTLIBERADA  = QTPRODRECEPRAT
       WHERE NRPLANPROD = V_NRLANCAMENTO;
    ELSE
      UPDATE PLANRECPROD 
         SET QTAPRODUZIR = QTPRODRECEPRAT,
             QTLIBERADA  = QTPRODRECEPRAT
       WHERE NRPLANPROD = V_NRLANCAMENTO;
    END IF;

    UPDATE PLANPRODACABADO 
             SET QTAPRODUZIR = QTPRODACABADO
           WHERE NRPLANPROD = V_NRLANCAMENTO; 
    UPDATE PLANPRODFILIAGREGA 
             SET QTAPRODUZIR = QTPRODSERV
           WHERE NRPLANPROD = V_NRLANCAMENTO;
   END;

   /*Verifica se o planejamento da producao possui dados. Se nao possuir, exclui dados e retorna NULL*/
   BEGIN
      SELECT 1 
        INTO EXIST_DADOS
      FROM DUAL
      WHERE EXISTS (SELECT 1 
                      FROM PLANRECPROD 
                     WHERE NRPLANPROD = V_NRLANCAMENTO
                       AND NRORG = P_NRORG);
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
      BEGIN
         DELETE FROM PLANRECPROD PR
          WHERE NRPLANPROD = V_NRLANCAMENTO AND NRORG = P_NRORG;

         DELETE FROM PLANPRODFILIAGREGA  PF
          WHERE NRPLANPROD = V_NRLANCAMENTO AND NRORG = P_NRORG;

         DELETE FROM PLANPRODACABADO PA
          WHERE NRPLANPROD = V_NRLANCAMENTO AND NRORG = P_NRORG;

         DELETE FROM PLANPRODUCAO PP
          WHERE NRPLANPROD = V_NRLANCAMENTO AND NRORG = P_NRORG;
         
         P_RETORNO := NULL;
      END;
   END;
    /* **************************************** */
    /* INSERE PRODUTOS QUE FORAM ANTECIPADOS E CONCLUIDOS COMO FINALIZACAO NA SUA DATA DE CONSUMO */
    /* **************************************** */   
   BEGIN
      INSERT INTO PLANPRODACABADO (NRPLANPROD, CDPRODACABADO, CDPRATO, CDFILAUXPRAT, QTPRODACABADO, IDPRODUZIR, IDCONCLUIDO, CDCONTAINER, IDCOOKCHILL, IDFINALIZACAO,
                                   IDTPPRODCHILL, IDESTADO, NRSEQPRODACABADO, QTAPRODUZIR, QTPERDA, QTEXTRA, NRJUSTPLANPROD, NRORG)
      (
      SELECT V_NRLANCAMENTO, PD.CDPRODACABADO, MIN(PD.CDPRATO), MIN(PD.CDFILAUXPRAT), SUM(PD.QTPRODACABADO), 'S' AS IDPRODUZIR, 'S' AS IDCONCLUIDO, NULL AS CDCONTAINER, 
             PD.IDCOOKCHILL, PD.IDFINALIZACAO, PD.IDTPPRODCHILL, 'FINALIZACAO' AS IDESTADO, PD.NRSEQPRODACABADO, 
             SUM(PD.QTAPRODUZIR), SUM(PD.QTPERDA), SUM(PD.QTEXTRA), MIN(PD.NRJUSTPLANPROD), PD.NRORG 
        FROM PLANPRODACABADO PD INNER JOIN (SELECT DISTINCT PR.NRPLANPROD, PR.CDPRODACABADO, PR.IDCOOKCHILL, PR.IDFINALIZACAO, PR.IDTPPRODCHILL, 
                                                   PR.IDESTADO, PR.NRSEQPRODACABADO
                                             FROM PLANRECPROD PR INNER JOIN (SELECT SUBSTR(CDLISTA,1,4) AS CDFILIAL, SUBSTR(CDLISTA,5,5) AS CDSERVFILI 
                                                                                   FROM LISTA WHERE NRLISTA = P_LISTAFILSERV) L ON 
                                                                                   PR.CDFILIAGREG = L.CDFILIAL AND PR.CDSERVFILIAGREG = L.CDSERVFILI
                                                                 LEFT JOIN SETOTIPOPRAT  SC ON ((PR.CDFILIAGREG = SC.CDFILIAL AND PR.CDTIPOPRAT = SC.CDTIPOPRAT) AND
                                                                                                (INSTR(P_SETOR, SC.CDSETORCOZ)<>0 OR (P_SETOR = 'A')))
                                            WHERE PR.DTCONSUMO = P_DTPRODUCAO AND
                                                  PR.NRSEQITRETI IS NOT NULL AND
                                                  PR.IDCOOKCHILL = 'S' AND
                                                  PR.IDFINALIZACAO = 'M' AND
                                                  PR.CDFILIAL = P_CDFILCENT AND
                                                  PR.NRORG = P_NRORG AND
                                                  (INSTR(P_TIPOPRAT, PR.CDTIPOPRAT) <> 0 OR (P_TIPOPRAT = 'A')) AND
                                                  PR.IDESTADO = 'PRODUCAO') PF ON PD.NRPLANPROD = PF.NRPLANPROD AND 
                                                                               PD.NRORG = P_NRORG AND
                                                                               PD.CDPRODACABADO = PF.CDPRODACABADO AND
                                                                               PD.IDCOOKCHILL = PF.IDCOOKCHILL AND
                                                                               PD.IDFINALIZACAO = PF.IDFINALIZACAO AND
                                                                               PD.IDTPPRODCHILL = PF.IDTPPRODCHILL AND 
                                                                               PD.IDESTADO = PF.IDESTADO AND
                                                                               PD.NRSEQPRODACABADO = PF.NRSEQPRODACABADO AND
                                                                               PD.IDCONCLUIDO = 'S'
                                
       WHERE (P_ESTADO IN ('F','T'))
       GROUP BY PD.CDPRODACABADO, PD.IDCOOKCHILL, PD.IDFINALIZACAO, PD.IDTPPRODCHILL, PD.NRSEQPRODACABADO, PD.NRORG);
   
      INSERT INTO PLANPRODFILIAGREGA (NRPLANPROD, CDPRODACABADO, CDFILIAGREG, CDSERVFILIAGREG, DTCONSUMO, QTPRODSERV, VRUNITPRODSERV, VRTOTALPRODSERV, QTCOMENSSERV, 
                                      IDPRODUZIR, IDCONCLUIDO, IDCOOKCHILL, IDFINALIZACAO, IDTPPRODCHILL, IDESTADO, NRSEQPRODACABADO, QTAPRODUZIR, QTPERDA, QTEXTRA, NRORG)
      (
      SELECT V_NRLANCAMENTO, PF.CDPRODACABADO, PF.CDFILIAGREG, PF.CDSERVFILIAGREG, PF.DTCONSUMO, PF.QTPRODSERV, PF.VRUNITPRODSERV, PF.VRTOTALPRODSERV, PF.QTCOMENSSERV, 
             'S' AS IDPRODUZIR, 'S' AS IDCONCLUIDO, PF.IDCOOKCHILL, PF.IDFINALIZACAO, PF.IDTPPRODCHILL, 'FINALIZACAO' AS IDESTADO, 
             PF.NRSEQPRODACABADO, PF.QTAPRODUZIR, PF.QTPERDA, PF.QTEXTRA, PF.NRORG
        FROM PLANPRODFILIAGREGA PF INNER JOIN (SELECT DISTINCT PR.NRPLANPROD, PR.CDPRODACABADO, PR.CDFILIAGREG, PR.CDSERVFILIAGREG,
                                                   PR.DTCONSUMO, PR.IDCOOKCHILL, PR.IDFINALIZACAO, PR.IDTPPRODCHILL, 
                                                   PR.IDESTADO, PR.NRSEQPRODACABADO
                                             FROM PLANRECPROD PR INNER JOIN (SELECT SUBSTR(CDLISTA,1,4) AS CDFILIAL, SUBSTR(CDLISTA,5,5) AS CDSERVFILI 
                                                                                   FROM LISTA WHERE NRLISTA = P_LISTAFILSERV) L ON 
                                                                                   PR.CDFILIAGREG = L.CDFILIAL AND PR.CDSERVFILIAGREG = L.CDSERVFILI
                                                                 LEFT JOIN SETOTIPOPRAT  SC ON ((PR.CDFILIAGREG = SC.CDFILIAL AND PR.CDTIPOPRAT = SC.CDTIPOPRAT) AND
                                                                                                (INSTR(P_SETOR, SC.CDSETORCOZ)<>0 OR (P_SETOR = 'A')))
                                            WHERE PR.DTCONSUMO = P_DTPRODUCAO AND
                                                  PR.NRSEQITRETI IS NOT NULL AND
                                                  PR.IDCOOKCHILL = 'S' AND
                                                  PR.IDFINALIZACAO = 'M' AND
                                                  PR.CDFILIAL = P_CDFILCENT AND
                                                  PR.NRORG = P_NRORG AND
                                                  (INSTR(P_TIPOPRAT, PR.CDTIPOPRAT) <> 0 OR (P_TIPOPRAT = 'A')) AND
                                                  PR.IDESTADO = 'PRODUCAO') PR ON PF.NRPLANPROD = PR.NRPLANPROD AND
                                                                               PF.NRORG = P_NRORG AND 
                                                                               PF.CDFILIAGREG = PR.CDFILIAGREG AND
                                                                               PF.CDSERVFILIAGREG = PR.CDSERVFILIAGREG AND
                                                                               PF.DTCONSUMO = PR.DTCONSUMO AND
                                                                               PF.CDPRODACABADO = PR.CDPRODACABADO AND
                                                                               PF.IDCOOKCHILL = PR.IDCOOKCHILL AND
                                                                               PF.IDFINALIZACAO = PR.IDFINALIZACAO AND
                                                                               PF.IDTPPRODCHILL = PR.IDTPPRODCHILL AND 
                                                                               PF.IDESTADO = PR.IDESTADO AND
                                                                               PF.NRSEQPRODACABADO = PR.NRSEQPRODACABADO AND
                                                                               PF.IDCONCLUIDO = 'S'
                                
       WHERE (P_ESTADO IN ('F','T')));
       
      INSERT INTO PLANRECPROD (NRPLANPROD, CDPRODACABADO, CDFILIAL, DTCONSUMO, CDFILIAGREG, CDSERVFILIAGREG, CDPRODUTO, CDTIPOPRAT, QTPRODRECEPRAT, VRUNITRECEPRAT,
                               VRTOTALRECEPRAT, IDTPRECEITA, IDADIANTADO, NRSEQITRETI, NRORG, IDCOOKCHILL, IDFINALIZACAO, IDTPPRODCHILL, IDESTADO, NRSEQPRODACABADO,
                               QTAPRODUZIR, QTEXTRA)
      (
      SELECT V_NRLANCAMENTO, PR.CDPRODACABADO, PR.CDFILIAL, PR.DTCONSUMO, PR.CDFILIAGREG, PR.CDSERVFILIAGREG, PR.CDPRODUTO, PR.CDTIPOPRAT, PR.QTPRODRECEPRAT, 
             PR.VRUNITRECEPRAT, PR.VRTOTALRECEPRAT, PR.IDTPRECEITA, 'S' AS IDADIANTADO, PR.NRSEQITRETI, PR.NRORG, PR.IDCOOKCHILL, PR.IDFINALIZACAO, PR.IDTPPRODCHILL, 
             'FINALIZACAO' AS IDESTADO, PR.NRSEQPRODACABADO, PR.QTAPRODUZIR, PR.QTEXTRA
        FROM PLANRECPROD PR INNER JOIN (SELECT SUBSTR(CDLISTA,1,4) AS CDFILIAL, SUBSTR(CDLISTA,5,5) AS CDSERVFILI 
                                          FROM LISTA WHERE NRLISTA = P_LISTAFILSERV) L ON PR.CDFILIAGREG = L.CDFILIAL AND PR.CDSERVFILIAGREG = L.CDSERVFILI
                            LEFT JOIN SETOTIPOPRAT  SC ON (PR.CDFILIAGREG = SC.CDFILIAL AND PR.CDTIPOPRAT = SC.CDTIPOPRAT)
       WHERE PR.DTCONSUMO = P_DTPRODUCAO AND
             PR.NRSEQITRETI IS NOT NULL AND
             PR.IDCOOKCHILL = 'S' AND
             PR.IDFINALIZACAO = 'M' AND
             PR.CDFILIAL = P_CDFILCENT AND
             PR.NRORG = P_NRORG AND
             (INSTR(P_TIPOPRAT, PR.CDTIPOPRAT) <> 0 OR (P_TIPOPRAT = 'A')) AND
             (INSTR(P_SETOR, SC.CDSETORCOZ)<>0 OR (P_SETOR = 'A')) AND
             PR.IDESTADO = 'PRODUCAO' AND
             (P_ESTADO IN ('F','T')));
   END;
   
   
  /*INSERE NA CARDACLIPLANPROD OS PRODUTOS DE FINALIZACAO RECEM INSERIDOS*/
  FOR C_PTOENTREGAFINAL IN(
     SELECT CL.CDCLIENTE, CL.CDDESTFILI, NVL(CL.QTCOMESTICLI, C.QTCOMESTICAR) AS QTCOMESTICLI, CP.NRSEQPRATCAR,
            P.CDPRODACABADO, P.CDPRATO, P.CDFILAUXPRAT, P.IDCOOKCHILL, P.IDESTADO, P.IDTPPRODCHILL,
            P.CDFILIAGREG, P.CDSERVFILIAGREG, P.DTCONSUMO, P.CDTIPOPRAT, 
            ROUND((P.QTAPRODUZIR / P.QTCOMENSSERV) * NVL(CL.QTCOMESTICLI, C.QTCOMESTICAR),5) QTAPRODUZIR
       FROM  CARDADIA C LEFT JOIN CARDACLI CL ON CL.CDFILIAL = C.CDFILIAL AND CL.NRCARDAPIO = C.NRCARDAPIO
                        INNER JOIN COMPCARD CP ON CP.CDFILIAL = C.CDFILIAL AND CP.NRCARDAPIO = C.NRCARDAPIO
                        INNER JOIN (SELECT DISTINCT PP.CDPRODACABADO, PP.CDPRATO, PP.CDFILAUXPRAT, PP.IDCOOKCHILL, PP.IDESTADO, PP.IDTPPRODCHILL,
                                           PF.CDFILIAGREG, PF.CDSERVFILIAGREG, PF.DTCONSUMO, PR.CDTIPOPRAT, PF.QTAPRODUZIR, PF.QTCOMENSSERV
                                      FROM PLANPRODACABADO PP INNER JOIN PLANPRODFILIAGREGA PF ON PP.NRPLANPROD = V_NRLANCAMENTO AND
                                                                                                  PP.NRORG = P_NRORG AND
                                                                                                  PF.NRPLANPROD = V_NRLANCAMENTO AND
                                                                                                  PF.NRORG = P_NRORG AND
                                                                                                  PP.NRPLANPROD = PF.NRPLANPROD AND 
                                                                                                  PP.NRSEQPRODACABADO = PF.NRSEQPRODACABADO AND
                                                                                                  PP.CDPRODACABADO = PF.CDPRODACABADO AND
                                                                                                  PP.IDCOOKCHILL = PF.IDCOOKCHILL AND
                                                                                                  PP.IDTPPRODCHILL = PF.IDTPPRODCHILL AND
                                                                                                  PP.IDFINALIZACAO = PF.IDFINALIZACAO AND
                                                                                                  PP.IDESTADO = PF.IDESTADO AND
                                                                                                  PP.NRORG = PF.NRORG AND
                                                                                                  PP.IDESTADO = 'FINALIZACAO' AND
                                                                                                  PP.IDFINALIZACAO = 'M' AND
                                                                                                  PP.IDPRODUZIR = 'S' AND
                                                                                                  PP.IDCONCLUIDO = 'S'
                                                              INNER JOIN PLANRECPROD PR ON PR.NRPLANPROD = V_NRLANCAMENTO AND
                                                                                           PR.NRORG = P_NRORG AND
                                                                                           PP.NRPLANPROD = PR.NRPLANPROD AND 
                                                                                           PP.NRSEQPRODACABADO = PR.NRSEQPRODACABADO AND
                                                                                           PP.CDPRODACABADO = PR.CDPRODACABADO AND
                                                                                           PP.IDCOOKCHILL = PR.IDCOOKCHILL AND
                                                                                           PP.IDTPPRODCHILL = PR.IDTPPRODCHILL AND
                                                                                           PP.IDFINALIZACAO = PR.IDFINALIZACAO AND
                                                                                           PP.IDESTADO = PF.IDESTADO AND
                                                                                           PP.NRORG = PF.NRORG AND
                                                                                           PP.IDESTADO = 'FINALIZACAO' AND
                                                                                           PP.IDFINALIZACAO = 'M' AND
                                                                                           PP.IDPRODUZIR = 'S' AND
                                                                                           PP.IDCONCLUIDO = 'S' AND
                                                                                           PF.CDFILIAGREG = PR.CDFILIAGREG AND
                                                                                           PF.CDSERVFILIAGREG = PR.CDSERVFILIAGREG AND
                                                                                           PF.DTCONSUMO = PR.DTCONSUMO AND
                                                                                           PR.CDFILIAL = P_CDFILCENT) P ON (C.CDFILIAL = P.CDFILIAGREG AND
                                                                                                                             C.CDSERVFILI = P.CDSERVFILIAGREG AND
                                                                                                                             C.DTCARDAPIO = P.DTCONSUMO AND
                                                                                                                             CP.CDPRATO = P.CDPRATO AND
                                                                                                                             CP.CDFILAUXPRAT = P.CDFILAUXPRAT AND
                                                                                                                             CP.CDTIPOPRAT = P.CDTIPOPRAT)
         ) LOOP 
            /* gera novo codigo para a tabela cardacliplanprod */
            NOVO_CODIGO('CARDACLIPLANPROD', V_NRCARDACLIPLANPROD);
            V_NRCARDACLIPLANPROD := SUBSTR(V_NRCARDACLIPLANPROD, 11, 10);
            INSERT INTO CARDACLIPLANPROD (NRCARDACLIPLANPROD,NRPLANPROD, CDPRODUTO, CDPRATO, CDFILAUXPRAT, CDFILIAL, CDSERVFILI, DTCONSUMO, CDCLIENTE, 
                                          CDDESTFILI, CDTIPOPRAT, QTCOMESTICLI, NRSEQPRATCAR, IDCOOKCHILL, IDTPPRODCHILL, IDESTADO, NRORG, QTAPRODUZIR)
            VALUES (V_NRCARDACLIPLANPROD,V_NRLANCAMENTO, C_PTOENTREGAFINAL.CDPRODACABADO, C_PTOENTREGAFINAL.CDPRATO, C_PTOENTREGAFINAL.CDFILAUXPRAT, 
                    C_PTOENTREGAFINAL.CDFILIAGREG, C_PTOENTREGAFINAL.CDSERVFILIAGREG, C_PTOENTREGAFINAL.DTCONSUMO, C_PTOENTREGAFINAL.CDCLIENTE,
                    C_PTOENTREGAFINAL.CDDESTFILI, C_PTOENTREGAFINAL.CDTIPOPRAT, C_PTOENTREGAFINAL.QTCOMESTICLI, C_PTOENTREGAFINAL.NRSEQPRATCAR, 
                    C_PTOENTREGAFINAL.IDCOOKCHILL, C_PTOENTREGAFINAL.IDTPPRODCHILL, C_PTOENTREGAFINAL.IDESTADO, P_NRORG, C_PTOENTREGAFINAL.QTAPRODUZIR);

         END LOOP;
  
  /**/
  -- BUSCA O  HORARIO DE PRODUCAO DOS SERVICOS DAS AGREGADAS
    BEGIN
        SELECT HORACHAR_HORADEC(MIN(NVL(S.HRINICATEN, 0.00))),
               HORACHAR_HORADEC(MIN(S.HRENTREGA))
          INTO V_HRINICIO, V_HRFIM 
          FROM PLANPRODFILIAGREGA PPF 
         INNER JOIN SERVICO S ON S.CDFILIAL = PPF.CDFILIAGREG AND S.CDSERVFILI = PPF.CDSERVFILIAGREG
         WHERE PPF.NRPLANPROD = V_NRLANCAMENTO;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN BEGIN
            V_HRINICIO := 0.00;
            V_HRFIM := NULL;
        END;
    END;
    
    UPDATE PLANPRODUCAO 
        SET HRINICIO = V_HRINICIO,
            HRFIM = V_HRFIM
    WHERE NRPLANPROD = V_NRLANCAMENTO;
  
   
/* **************************************** */
/* CANCELAMENTO do planejamento da producao */
/* **************************************** */   
ELSE

   DELETE FROM GERAPAPARCIAL
    WHERE NRPLANPROD = P_NRPLANPROD AND NRORG = P_NRORG;
    
   DELETE FROM ETIQUETACOZ
    WHERE NRPLANPROD = P_NRPLANPROD AND NRORG = P_NRORG;
    
   DELETE FROM CAPACIDADEPRODCOZ
    WHERE NRPLANPROD = P_NRPLANPROD AND NRORG = P_NRORG;
    
   DELETE FROM CARDACLIPLANPROD 
    WHERE NRPLANPROD = P_NRPLANPROD AND NRORG = P_NRORG;

   DELETE FROM PLANRECPROD PR
    WHERE NRPLANPROD = P_NRPLANPROD AND NRORG = P_NRORG;

   DELETE FROM PLANPRODFILIAGREGA  PF
    WHERE NRPLANPROD = P_NRPLANPROD AND NRORG = P_NRORG;

   DELETE FROM PLANPRODACABADO PA
    WHERE NRPLANPROD = P_NRPLANPROD AND NRORG = P_NRORG;

   DELETE FROM LOGMATPRIMA
    WHERE NRPLANPROD = P_NRPLANPROD AND NRORG = P_NRORG;

   DELETE FROM PLANPRODUCAO PP
    WHERE NRPLANPROD = P_NRPLANPROD AND NRORG = P_NRORG;

END IF;


END;
/