create or replace PROCEDURE SUBST_PROD_PRODUCAO(
    P_NRPLANPROD IN PLANPRODUCAO.NRPLANPROD%TYPE,
    P_CANCELATODOS   IN VARCHAR2, /*T:cancela todos rel. ao prato N: cancela somente um NULL: não tem cancelamento*/
    P_NRLISTA IN VARCHAR2, /* lista cdfilial e servico*/
    P_CDCENTRAL  IN FILIAL.CDFILIAL%TYPE, 
    P_CDOPERADOR IN VARCHAR2,
    P_NRORG      IN NUMBER,
    /*Antigo Produto*/
    P_CDPRODORIGEM  IN VARCHAR2, -- CDPRODACABADO + IDCOOKCHILL + IDFINALIZACAO + IDTPPRODCHILL + IDESTADO + NRSEQPRODACABADO
    /*Novo Produto*/
    P_CDPRATO_SEL    IN VARCHAR2,
    P_CDFILAUXPRAT_SEL  IN VARCHAR2,
    P_NAOSUBSTITUIDO OUT VARCHAR2
)
IS
  /*Produto acabado*/
  V_CDPRODACABADO VARCHAR2(10); 
  /*Cardápio*/
  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_NUMTPPRATO VARCHAR2(2);
  V_AUX VARCHAR(20);
  V_QTPRODUTO FLOAT;
  V_NRCARDACLIPLANPROD VARCHAR2(20);
  V_NRSEQPRODACABADO FLOAT;
  V_CDPRATOORI VARCHAR2(10);
  V_CDFILAUXPRATORI VARCHAR2(4);
  V_CDPROD_SEL VARCHAR(10);
  V_IDORIGEM VARCHAR(10);
  V_CDPRODORI VARCHAR2(10);
  V_IDCOOKCHILLORI VARCHAR2(1);
  V_IDFINALIZACAOORI VARCHAR2(1);
  V_NRSEQPRODORI NUMBER;
  V_IDTPPRODCHILLORI VARCHAR2(30);
  V_IDESTADOORI VARCHAR2(30);
  V_IDOBRIGINFOQTD VARCHAR2(1);
  V_QTPRODANTIGO FLOAT;
  --TRATA ERRO
  V_CDFILIAL_ERRO VARCHAR2(4);
  V_CDSERVFILI_ERRO VARCHAR2(5);
BEGIN
/* *********************************** */
/* Substituição do produto */
/* *********************************** */

    V_CDPRODORI := SUBSTR(P_CDPRODORIGEM,1,10);
    V_IDCOOKCHILLORI := SUBSTR(P_CDPRODORIGEM,11,1);
    V_IDFINALIZACAOORI := SUBSTR(P_CDPRODORIGEM,12,1);
    V_IDTPPRODCHILLORI := CASE SUBSTR(P_CDPRODORIGEM,13,1) 
                                WHEN 'N' THEN 'NENHUM'
                                WHEN 'C' THEN 'CONGELADO'
                                WHEN 'R' THEN 'RESFRIADO'
                          END;
    V_IDESTADOORI := CASE SUBSTR(P_CDPRODORIGEM,14,1) 
                            WHEN 'C' THEN 'CONSUMO'
                            WHEN 'P' THEN 'PRODUCAO'
                            WHEN 'F' THEN 'FINALIZACAO'
                     END;
    V_NRSEQPRODORI := SUBSTR(P_CDPRODORIGEM, 15, LENGTH(P_CDPRODORIGEM) - 14);
    /*Verifica se A obrigado a informar quantidade*/
    BEGIN 
      SELECT NVL(IDOBRIGINFOQTD, 'N') INTO V_IDOBRIGINFOQTD
        FROM PARAMPLANEJA
       WHERE CDFILIAL = P_CDCENTRAL;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN BEGIN
        V_IDOBRIGINFOQTD := 'N';
      END;
    END;

   /* Busca os dados para alimentar as tabelas */
   FOR C_PRODUTOORI IN
   (
        SELECT NRPLANPROD, CDPRODACABADO, CDPRATO, SUM(QTPRODACABADO) AS QTPRODACABADO, SUM(QTAPRODUZIR) AS QTAPRODUZIR, SUM(QTPERDA) AS QTPERDA,
               SUM(QTEXTRA) AS QTEXTRA, CDFILAUXPRAT,IDCOOKCHILL, IDTPPRODCHILL, IDFINALIZACAO, IDESTADO
        FROM PLANPRODACABADO
        WHERE NRPLANPROD = P_NRPLANPROD
             AND CDPRODACABADO = V_CDPRODORI
             AND IDCOOKCHILL = V_IDCOOKCHILLORI
             AND IDFINALIZACAO = V_IDFINALIZACAOORI
             AND IDTPPRODCHILL = V_IDTPPRODCHILLORI
        GROUP BY NRPLANPROD, CDPRODACABADO, CDPRATO, CDFILAUXPRAT, IDCOOKCHILL, IDTPPRODCHILL, IDFINALIZACAO, IDESTADO

    ) LOOP

        FOR C_FILIAGREG IN 
        (
            SELECT CDPRODACABADO, CDPRATO, CDFILAUXPRAT, CDFILIAL, CDSERVFILI, IDESTADO, 
                             SUM(QTCOMENSAIS) AS QTCOMENSAIS, DTCONSUMO, 
                             SUM(QTPRODUTO) AS QTPRODUTO,
                             CDPRODUTO,
                             QTPORPESSOA, 
                             SUM(QTAMOSTRA) AS QTAMOSTRA ,
                             VRCUSTOUNITPROD,
                             IDTIPO, IDADIANTADO, IDCOOKCHILL,
                             IDFINALIZACAO, ESTADO,
                             IDTPPRODCHILL,
                             CDTIPOPRAT 
            FROM (
                    SELECT R.CDPRODPRODUCAO AS CDPRODACABADO, PPF.NRSEQPRODACABADO, R.CDPRATO, R.CDFILAUXPRAT, PPF.CDFILIAGREG AS CDFILIAL, PPF.CDSERVFILIAGREG AS CDSERVFILI, PPF.IDESTADO, 
                             MAX(PPF.QTCOMENSSERV) AS QTCOMENSAIS, PPF.DTCONSUMO, 
                             ROUND(PPF.QTCOMENSSERV * DECODE(NVL(R.IDFINALIZACAO, 'M'),'F',ROUND(R.QTPRODUTO,5), ROUND(R.QTPRODUTO + NVL(R.QTCOMPLPROD,0),5)),5) AS QTPRODUTO,
                              R.CDPRODUTO, ROUND(R.QTPADRAO, 5) AS QTPORPESSOA, NVL(R.QTAMOSTRA, 0.00) AS QTAMOSTRA ,
                             ROUND(NVL(CUSTO_PRODUTO(P_CDCENTRAL, R.CDPRODUTO, DECODE(PF.CDTIPCUSTEST, '', '03', PF.CDTIPCUSTEST), PPF.DTCONSUMO, SYSDATE), 0),5) AS VRCUSTOUNITPROD,
                             R.IDTIPORECE AS IDTIPO, 'N' AS IDADIANTADO, NVL(R.IDPRODCHILL, 'N') AS IDCOOKCHILL,
                             NVL(R.IDFINALIZACAO, 'M') AS IDFINALIZACAO, 'CONSUMO' AS ESTADO,
                             NVL(R.IDTPPRODCHILL, 'NENHUM') AS IDTPPRODCHILL,
                             PRP.CDTIPOPRAT
                    FROM PLANPRODACABADO PP 
                    INNER JOIN LISTA ON LISTA.NRLISTA = P_NRLISTA
                    INNER JOIN PLANPRODFILIAGREGA PPF ON PPF.NRPLANPROD = PP.NRPLANPROD 
                        AND PPF.CDPRODACABADO = PP.CDPRODACABADO 
                        AND PPF.NRSEQPRODACABADO = PP.NRSEQPRODACABADO 
                        AND PPF.IDCOOKCHILL = PP.IDCOOKCHILL 
                        AND PPF.IDFINALIZACAO = PP.IDFINALIZACAO 
                        AND PPF.IDTPPRODCHILL = PP.IDTPPRODCHILL
                        AND LISTA.CDLISTA = (PPF.CDFILIAGREG ||PPF.CDSERVFILIAGREG)
                        --AND PP.IDORIGEM IS NOT NULL)
                    LEFT JOIN TABLE ( RECEITA_UTIL(PPF.CDFILIAGREG, PPF.CDSERVFILIAGREG,  P_CDPRATO_SEL,  P_CDFILAUXPRAT_SEL, '0', 'Z', NULL, 0, 0, 'S') ) R
                                  ON R.CDPRATO =  P_CDPRATO_SEL OR R.CDPRATOPAI =  P_CDPRATO_SEL 
                                  AND R.CDFILAUXPRAT =  P_CDFILAUXPRAT_SEL AND R.LIMITEACUMULADOPP = 0 AND NVL(R.QTPADRAO,0) > 0 
                                  AND (NVL(R.IDTPREQPROD,'P') = 'P')
                    INNER JOIN PARAMFILIAL PF ON PF.CDFILIAL = P_CDCENTRAL
                    INNER JOIN (
                            SELECT DISTINCT NRPLANPROD, CDPRODACABADO, CDFILIAGREG, CDSERVFILIAGREG, CDTIPOPRAT, DTCONSUMO,
                                            IDCOOKCHILL, IDFINALIZACAO, IDTPPRODCHILL
                                FROM PLANRECPROD
                                WHERE NRPLANPROD = C_PRODUTOORI.NRPLANPROD 
                                    AND CDPRODACABADO = C_PRODUTOORI.CDPRODACABADO
                                    AND IDCOOKCHILL = C_PRODUTOORI.IDCOOKCHILL 
                                    AND IDFINALIZACAO = C_PRODUTOORI.IDFINALIZACAO 
                                    AND IDTPPRODCHILL = C_PRODUTOORI.IDTPPRODCHILL
                        ) PRP ON PRP.NRPLANPROD = PPF.NRPLANPROD  AND PRP.CDPRODACABADO = PPF.CDPRODACABADO 
                                            AND PRP.CDFILIAGREG = PPF.CDFILIAGREG AND PRP.CDSERVFILIAGREG = PPF.CDSERVFILIAGREG
                                            AND PRP.IDCOOKCHILL = PPF.IDCOOKCHILL 
                                            AND PRP.IDFINALIZACAO = PPF.IDFINALIZACAO 
                                            --AND PRP.NRSEQPRODACABADO = PPF.NRSEQPRODACABADO 
                                            AND PRP.IDTPPRODCHILL = PPF.IDTPPRODCHILL
                    WHERE PP.NRPLANPROD = C_PRODUTOORI.NRPLANPROD 
                        AND PP.CDPRODACABADO = C_PRODUTOORI.CDPRODACABADO
                        AND PP.IDCOOKCHILL = C_PRODUTOORI.IDCOOKCHILL 
                        AND PP.IDFINALIZACAO = C_PRODUTOORI.IDFINALIZACAO 
                        AND PP.IDTPPRODCHILL = C_PRODUTOORI.IDTPPRODCHILL
                        AND ( P_CANCELATODOS IS NOT NULL AND PP.IDORIGEM IS NOT NULL) OR ( P_CANCELATODOS IS NULL)
                    GROUP BY 
                            R.CDPRODPRODUCAO, PPF.NRSEQPRODACABADO, R.CDPRATO, R.CDFILAUXPRAT, PPF.CDFILIAGREG, PPF.CDSERVFILIAGREG , PPF.IDESTADO, 
                             PPF.DTCONSUMO, 
                             ROUND(PPF.QTCOMENSSERV * DECODE(NVL(R.IDFINALIZACAO, 'M'),'F',ROUND(R.QTPRODUTO,5), ROUND(R.QTPRODUTO + NVL(R.QTCOMPLPROD,0),5)),5),
                             R.CDPRODUTO,ROUND(R.QTPADRAO, 5), NVL(R.QTAMOSTRA, 0.00),
                             ROUND(NVL(CUSTO_PRODUTO( P_CDCENTRAL, R.CDPRODUTO, DECODE(PF.CDTIPCUSTEST, '', '03', PF.CDTIPCUSTEST), PPF.DTCONSUMO, SYSDATE), 0),5),
                             R.IDTIPORECE, 'N', NVL(R.IDPRODCHILL, 'N'),
                             NVL(R.IDFINALIZACAO, 'M') , 'CONSUMO',
                             NVL(R.IDTPPRODCHILL, 'NENHUM'),
                             PRP.CDTIPOPRAT
            ) GROUP BY CDPRODACABADO, CDPRATO, CDFILAUXPRAT, CDFILIAL, CDSERVFILI, IDESTADO, 
                     DTCONSUMO, 
                     CDPRODUTO,
                     VRCUSTOUNITPROD,
                     QTPORPESSOA,
                     IDTIPO, IDADIANTADO, IDCOOKCHILL,
                     IDFINALIZACAO, ESTADO,
                     IDTPPRODCHILL,
                     CDTIPOPRAT
           ORDER BY CDPRODACABADO, IDCOOKCHILL, IDFINALIZACAO, ESTADO, IDTPPRODCHILL, CDFILIAL, CDSERVFILI, DTCONSUMO, CDPRODUTO
           

        )LOOP 
            IF C_FILIAGREG.CDPRODACABADO IS NOT NULL THEN
                V_CDPROD_SEL := C_FILIAGREG.CDPRODACABADO;
                V_CDPRATOORI    := C_PRODUTOORI.CDPRATO;
                V_CDFILAUXPRATORI := C_PRODUTOORI.CDFILAUXPRAT;
                V_IDORIGEM := 'SUBSTITUTO';

                IF P_CANCELATODOS IS NOT NULL THEN
                    SELECT DISTINCT CDPRODPRODUCAO INTO V_CDPROD_SEL 
                      FROM TABLE ( RECEITA_UTIL(C_FILIAGREG.CDFILIAL, C_FILIAGREG.CDSERVFILI, C_FILIAGREG.CDPRATO, P_CDFILAUXPRAT_SEL, '0', 'Z', NULL, 0, 0, 'S') ) R
                     WHERE CDPRODPRODUCAO IS NOT NULL AND CDPRATOPAI IS NULL;

                    IF V_CDPROD_SEL IS NULL 
                      THEN V_CDPROD_SEL := V_CDPRODORI;
                    END IF;

                    V_CDPRATOORI := NULL;
                    V_CDFILAUXPRATORI := NULL;
                    V_IDORIGEM := NULL;   

                 END IF;

                /* Insere produto acabado */
                IF (V_CDPRODACABADO IS NULL OR V_CDPRODACABADO <> C_FILIAGREG.CDPRODACABADO)  OR
                     (V_IDCOOKCHILL   IS NULL OR V_IDCOOKCHILL <> C_FILIAGREG.IDCOOKCHILL)  OR
                     (V_IDFINALIZACAO IS NULL OR V_IDFINALIZACAO <> C_FILIAGREG.IDFINALIZACAO)  OR
                     (V_ESTADO        IS NULL OR V_ESTADO <> C_FILIAGREG.ESTADO)  OR
                     (V_IDTPPRODCHILL IS NULL OR V_IDTPPRODCHILL <> C_FILIAGREG.IDTPPRODCHILL)  THEN

                    IF V_CDPROD_SEL IS NOT NULL THEN 
                         /*Verifica se já existe produtos já inseridos*/
                         SELECT MAX(NRSEQPRODACABADO) INTO V_NRSEQPRODACABADO 
                           FROM PLANPRODACABADO 
                          WHERE NRPLANPROD = P_NRPLANPROD AND CDPRODACABADO = C_FILIAGREG.CDPRODACABADO
                            AND IDCOOKCHILL = C_FILIAGREG.IDCOOKCHILL AND IDFINALIZACAO = C_FILIAGREG.IDFINALIZACAO 
                            AND IDESTADO = C_FILIAGREG.ESTADO AND IDTPPRODCHILL = C_FILIAGREG.IDTPPRODCHILL ;

                         IF (V_NRSEQPRODACABADO) IS NULL THEN V_NRSEQPRODACABADO := 1;
                         ELSE V_NRSEQPRODACABADO := V_NRSEQPRODACABADO + 1; END IF;

                         INSERT INTO PLANPRODACABADO
                           (NRPLANPROD, CDPRODACABADO, CDPRATO, CDFILAUXPRAT, QTPRODACABADO, 
                            IDPRODUZIR, IDCONCLUIDO, CDPRATOORI, CDFILAUXPRATORI,
                            NRORG, NRORGINCLUSAO, NRORGULTATU, 
                            DTINCLUSAO, DTULTATU,
                            IDATIVO, IDCOOKCHILL, IDFINALIZACAO, IDTPPRODCHILL,
                            IDESTADO, NRSEQPRODACABADO, QTAPRODUZIR, IDORIGEM,
                            CDOPERINCLUSAO, CDOPERULTATU)
                         VALUES
                            (P_NRPLANPROD,V_CDPROD_SEL, P_CDPRATO_SEL, P_CDFILAUXPRAT_SEL, 0,
                            'N','N', V_CDPRATOORI, V_CDFILAUXPRATORI,
                             P_NRORG, P_NRORG, P_NRORG,
                             SYSDATE, SYSDATE,
                             'S',C_FILIAGREG.IDCOOKCHILL, C_FILIAGREG.IDFINALIZACAO, C_FILIAGREG.IDTPPRODCHILL,
                             C_FILIAGREG.ESTADO, V_NRSEQPRODACABADO,0, V_IDORIGEM,
                             P_CDOPERADOR, P_CDOPERADOR);

                         V_IDCOOKCHILL   := C_FILIAGREG.IDCOOKCHILL;
                         V_IDFINALIZACAO := C_FILIAGREG.IDFINALIZACAO;
                         V_ESTADO        := C_FILIAGREG.ESTADO;
                         V_IDTPPRODCHILL := C_FILIAGREG.IDTPPRODCHILL;
                    END IF;
                END IF;

                /*Insere cardápio das filiais agregadas */
                IF ( (V_CDFILIAL IS NULL) OR   (V_CDFILIAL <> C_FILIAGREG.CDFILIAL) ) OR 
                     ( (V_CDSERVFILI IS NULL) OR (V_CDSERVFILI <> C_FILIAGREG.CDSERVFILI) ) OR 
                     ( (V_DTCONSUMO IS NULL) OR  (V_DTCONSUMO <> C_FILIAGREG.DTCONSUMO) ) OR
                     ( (V_CDPRODACABADO IS NULL) OR (V_CDPRODACABADO <> C_FILIAGREG.CDPRODACABADO) )
                     THEN
                     

                     /* Atualiza o custo por pessoa no cardápio */         
                     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 = P_NRPLANPROD
                           AND CDPRODACABADO = V_CDPROD_SEL
                           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;

                     INSERT INTO PLANPRODFILIAGREGA 
                       (NRSEQPRODACABADO, NRPLANPROD, CDPRODACABADO, CDFILIAGREG, CDSERVFILIAGREG, 
                        DTCONSUMO, QTCOMENSSERV, QTPRODSERV, VRTOTALPRODSERV, VRUNITPRODSERV,
                        NRORG, NRORGINCLUSAO, NRORGULTATU, 
                        DTINCLUSAO, DTULTATU,
                        CDOPERINCLUSAO, CDOPERULTATU,IDCOOKCHILL,
                        IDFINALIZACAO, IDESTADO, IDTPPRODCHILL, IDPRODUZIR)
                     VALUES
                       (V_NRSEQPRODACABADO, P_NRPLANPROD, V_CDPROD_SEL, C_FILIAGREG.CDFILIAL, C_FILIAGREG.CDSERVFILI,
                        C_FILIAGREG.DTCONSUMO, 0, 0.00, 0.00, 0.00,
                        P_NRORG, P_NRORG, P_NRORG,
                        SYSDATE, SYSDATE,
                        P_CDOPERADOR, P_CDOPERADOR,C_FILIAGREG.IDCOOKCHILL,
                        C_FILIAGREG.IDFINALIZACAO, C_FILIAGREG.ESTADO, C_FILIAGREG.IDTPPRODCHILL, 'N');

--                    /* Atualiza qtprodacabado e qtaproduzir*/           
--                    UPDATE PLANPRODACABADO
--                          SET QTPRODACABADO = QTPRODACABADO + ROUND(NVL(C_FILIAGREG.QTCOMENSAIS * C_FILIAGREG.QTPORPESSOA, 0.00),5) + C_FILIAGREG.QTAMOSTRA,
--                          QTAPRODUZIR = CASE WHEN V_IDOBRIGINFOQTD = 'S' THEN 0
--                                        ELSE QTPRODACABADO + ROUND(NVL(C_FILIAGREG.QTCOMENSAIS * C_FILIAGREG.QTPORPESSOA, 0.00),5) + C_FILIAGREG.QTAMOSTRA END
--                        WHERE NRPLANPROD = P_NRPLANPROD
--                          AND CDPRODACABADO = V_CDPROD_SEL
--                          AND IDCOOKCHILL = C_FILIAGREG.IDCOOKCHILL
--                          AND IDFINALIZACAO = C_FILIAGREG.IDFINALIZACAO
--                          AND IDESTADO = C_FILIAGREG.ESTADO
--                          AND IDTPPRODCHILL = C_FILIAGREG.IDTPPRODCHILL
--                          AND NRSEQPRODACABADO = V_NRSEQPRODACABADO;  

                    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_FILIAGREG.CDFILIAL AND 
                                C.CDSERVFILI = C_FILIAGREG.CDSERVFILI AND
                                C.DTCARDAPIO = C_FILIAGREG.DTCONSUMO AND
                                CP.CDPRATO   = P_CDPRATO_SEL;
                      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 CDCLIENTE, CDDESTFILI, QTCOMESTICLI, NRSEQPRATCAR FROM CARDACLIPLANPROD 
                        WHERE NRPLANPROD = P_NRPLANPROD AND CDPRODUTO = V_CDPRODORI AND CDFILAUXPRAT = C_PRODUTOORI.CDFILAUXPRAT --AND CDPRATO = C_FILIAGREG.CDPRATOORI  
                              AND CDFILIAL = C_FILIAGREG.CDFILIAL AND CDSERVFILI = C_FILIAGREG.CDSERVFILI
                              AND IDTPPRODCHILL = V_IDTPPRODCHILLORI AND IDESTADO = V_IDESTADOORI
                              AND CDTIPOPRAT = C_FILIAGREG.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)
                        VALUES 
                        (V_NRCARDACLIPLANPROD, P_NRPLANPROD, V_CDPROD_SEL, P_CDPRATO_SEL, P_CDFILAUXPRAT_SEL, C_FILIAGREG.CDFILIAL, C_FILIAGREG.CDSERVFILI, C_FILIAGREG.DTCONSUMO, C_PTOENTREGA.CDCLIENTE,
                         C_PTOENTREGA.CDDESTFILI, C_FILIAGREG.CDTIPOPRAT, C_PTOENTREGA.QTCOMESTICLI, C_PTOENTREGA.NRSEQPRATCAR, 
                         C_FILIAGREG.IDCOOKCHILL, C_FILIAGREG.IDTPPRODCHILL, C_FILIAGREG.ESTADO, P_NRORG);


                     END LOOP;


                  END IF;

                V_QTPRODUTO := C_FILIAGREG.QTPRODUTO + ((((C_FILIAGREG.QTAMOSTRA * 100) / NVL(C_FILIAGREG.QTPORPESSOA,1)) * C_FILIAGREG.QTPRODUTO) / 100);

                /* Insere item da receita */
                IF ( (V_CDFILIAL IS NULL) OR (V_CDFILIAL <> C_FILIAGREG.CDFILIAL) ) OR 
                 ( (V_CDSERVFILI IS NULL) OR (V_CDSERVFILI <> C_FILIAGREG.CDSERVFILI) ) OR 
                 ( (V_DTCONSUMO IS NULL) OR (V_DTCONSUMO <> C_FILIAGREG.DTCONSUMO) ) OR 
                 ( (V_CDPRODACABADO IS NULL) OR (V_CDPRODACABADO <> C_FILIAGREG.CDPRODACABADO) ) OR 
                 ( (V_IDCOOKCHILL IS NULL) OR (V_IDCOOKCHILL <> C_FILIAGREG.IDCOOKCHILL) ) OR 
                 ( (V_IDFINALIZACAO IS NULL) OR (V_IDFINALIZACAO <> C_FILIAGREG.IDFINALIZACAO) ) OR 
                 ( (V_ESTADO IS NULL) OR (V_ESTADO <> C_FILIAGREG.ESTADO) ) OR 
                 ( (V_IDTPPRODCHILL IS NULL) OR (V_IDTPPRODCHILL <> C_FILIAGREG.IDTPPRODCHILL) ) OR
                 ( (V_CDPRODUTO IS NULL) OR (V_CDPRODUTO <> C_FILIAGREG.CDPRODUTO) )
                 THEN


                  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,QTDEVOLVIDA,QTEXTRA,
                     QTLIBERADA,
                     QTAPRODUZIR)
                  VALUES
                    (V_NRSEQPRODACABADO,P_NRPLANPROD, P_CDCENTRAL,
                     V_CDPROD_SEL, C_FILIAGREG.CDFILIAL, C_FILIAGREG.CDSERVFILI, C_FILIAGREG.DTCONSUMO,
                     C_FILIAGREG.CDPRODUTO, V_QTPRODUTO, ROUND( NVL(C_FILIAGREG.VRCUSTOUNITPROD, 0.00), 5),
                     ROUND( NVL(V_QTPRODUTO * C_FILIAGREG.VRCUSTOUNITPROD, 0.00), 2), C_FILIAGREG.CDTIPOPRAT, C_FILIAGREG.IDTIPO, C_FILIAGREG.IDADIANTADO,
                     P_NRORG, P_NRORG, P_NRORG,
                     SYSDATE, SYSDATE,
                     P_CDOPERADOR, P_CDOPERADOR,V_IDCOOKCHILL,
                     V_IDFINALIZACAO, V_ESTADO, V_IDTPPRODCHILL,0,0,
                     V_QTPRODUTO,
                     CASE V_IDOBRIGINFOQTD WHEN 'S' THEN 0
                     ELSE V_QTPRODUTO  END);
              ELSE 
                 UPDATE PLANRECPROD
                    SET QTPRODRECEPRAT = QTPRODRECEPRAT + V_QTPRODUTO,
                        VRTOTALRECEPRAT = VRTOTALRECEPRAT + ROUND( NVL(V_QTPRODUTO * C_FILIAGREG.VRCUSTOUNITPROD, 0.00), 5)
                  WHERE CDFILIAL = P_CDCENTRAL
                    AND CDFILIAGREG = C_FILIAGREG.CDFILIAL
                    AND CDSERVFILIAGREG = C_FILIAGREG.CDSERVFILI
                    AND DTCONSUMO = C_FILIAGREG.DTCONSUMO
                    AND CDPRODACABADO = V_CDPROD_SEL
                    AND CDPRODUTO = C_FILIAGREG.CDPRODUTO
                    AND IDCOOKCHILL = C_FILIAGREG.IDCOOKCHILL
                    AND IDFINALIZACAO = C_FILIAGREG.IDFINALIZACAO
                    AND IDESTADO = C_FILIAGREG.ESTADO
                    AND IDTPPRODCHILL = C_FILIAGREG.IDTPPRODCHILL
                    AND CDTIPOPRAT = C_FILIAGREG.CDTIPOPRAT; 

              END IF;

                /*auxiliares para calcular os comensais*/
                 V_AUX := 1;
                 V_CDFILIAL := C_FILIAGREG.CDFILIAL;
                 V_CDSERVFILI := C_FILIAGREG.CDSERVFILI;
                 V_DTCONSUMO := C_FILIAGREG.DTCONSUMO;

                 /*Deleta produtos filhos*/
                FOR C_PRODFILHOS IN(
                    SELECT PPA.CDPRODACABADO, PPA.IDFINALIZACAO, PPA.IDCOOKCHILL, PPA.NRPLANPROD, PPA.NRSEQPRODACABADO, PPA.NRORG, PR.CDPRATO FROM PLANPRODACABADO PPA
                    INNER JOIN (
                        SELECT DISTINCT R.CDPRODPRODUCAO, R.CDPRATO
                                FROM PLANPRODACABADO PP
                                INNER JOIN TABLE ( RECEITA_UTIL(V_CDFILIAL, V_CDSERVFILI, PP.CDPRATO, PP.CDFILAUXPRAT, '0', 'Z', NULL, 0, 0, 'S') ) R ON 
                                 R.CDPRATOPAI = PP.CDPRATO
                                WHERE PP.NRPLANPROD = P_NRPLANPROD AND PP.CDPRODACABADO = V_CDPRODORI
                    ) PR ON PR.CDPRODPRODUCAO = PPA.CDPRODACABADO
                    WHERE PPA.NRPLANPROD = P_NRPLANPROD
                 )LOOP 

                      DELETE FROM CARDACLIPLANPROD WHERE NRPLANPROD = C_PRODFILHOS.NRPLANPROD AND CDPRODUTO = V_CDPRODORI
                                  AND IDCOOKCHILL = C_PRODFILHOS.IDCOOKCHILL
                                  AND CDPRATO = C_PRODFILHOS.CDPRATO AND NRORG = C_PRODFILHOS.NRORG;

                      DELETE FROM PLANRECPROD WHERE CDPRODACABADO = C_PRODFILHOS.CDPRODACABADO AND NRPLANPROD = C_PRODFILHOS.NRPLANPROD
                                  AND IDCOOKCHILL = C_PRODFILHOS.IDCOOKCHILL AND IDFINALIZACAO = C_PRODFILHOS.IDFINALIZACAO
                                  AND NRORG = C_PRODFILHOS.NRORG AND NRSEQPRODACABADO = C_PRODFILHOS.NRSEQPRODACABADO;

                      DELETE FROM PLANPRODFILIAGREGA WHERE CDPRODACABADO = C_PRODFILHOS.CDPRODACABADO AND NRPLANPROD = C_PRODFILHOS.NRPLANPROD
                                 AND IDCOOKCHILL = C_PRODFILHOS.IDCOOKCHILL AND IDFINALIZACAO = C_PRODFILHOS.IDFINALIZACAO
                                 AND NRORG = C_PRODFILHOS.NRORG AND NRSEQPRODACABADO = C_PRODFILHOS.NRSEQPRODACABADO;

                      DELETE FROM PLANPRODACABADO WHERE CDPRODACABADO = C_PRODFILHOS.CDPRODACABADO AND IDCOOKCHILL = C_PRODFILHOS.IDCOOKCHILL 
                                  AND IDFINALIZACAO = C_PRODFILHOS.IDFINALIZACAO AND NRPLANPROD = C_PRODFILHOS.NRPLANPROD 
                                  AND NRORG = C_PRODFILHOS.NRORG AND NRSEQPRODACABADO = C_PRODFILHOS.NRSEQPRODACABADO;

                  END LOOP;

                /*Delete somente aquele produto*/
                DELETE FROM CARDACLIPLANPROD WHERE NRPLANPROD = P_NRPLANPROD AND CDPRODUTO = V_CDPRODORI
                          AND CDFILIAL = C_FILIAGREG.CDFILIAL AND CDSERVFILI = C_FILIAGREG.CDSERVFILI
                          AND IDCOOKCHILL = V_IDCOOKCHILLORI AND CDTIPOPRAT = C_FILIAGREG.CDTIPOPRAT AND NRORG = P_NRORG;
                
                IF(P_CANCELATODOS = 'N') THEN
                
                    DELETE FROM PLANRECPROD WHERE NRPLANPROD = P_NRPLANPROD AND CDPRODACABADO = V_CDPRODORI 
                                                     AND CDFILIAGREG = C_FILIAGREG.CDFILIAL AND CDSERVFILIAGREG = C_FILIAGREG.CDSERVFILI
                                                     AND IDCOOKCHILL = V_IDCOOKCHILLORI AND IDTPPRODCHILL = V_IDTPPRODCHILLORI 
                                                     AND IDFINALIZACAO = V_IDFINALIZACAOORI AND IDESTADO = V_IDESTADOORI
                                                     AND NRORG = P_NRORG
                                                     AND NRSEQPRODACABADO = V_NRSEQPRODORI;
    
                    DELETE FROM PLANPRODFILIAGREGA WHERE NRPLANPROD = P_NRPLANPROD AND CDPRODACABADO = V_CDPRODORI 
                                                     AND CDFILIAGREG = C_FILIAGREG.CDFILIAL AND CDSERVFILIAGREG = C_FILIAGREG.CDSERVFILI
                                                     AND IDCOOKCHILL = V_IDCOOKCHILLORI AND IDTPPRODCHILL = V_IDTPPRODCHILLORI 
                                                     AND IDFINALIZACAO = V_IDFINALIZACAOORI AND IDESTADO = V_IDESTADOORI
                                                     AND NRORG = P_NRORG
                                                     AND NRSEQPRODACABADO = V_NRSEQPRODORI;
                                                     
                ELSE 
                  DELETE FROM PLANRECPROD WHERE NRPLANPROD = P_NRPLANPROD AND CDPRODACABADO = V_CDPRODORI 
                                                 AND CDFILIAGREG = C_FILIAGREG.CDFILIAL AND CDSERVFILIAGREG = C_FILIAGREG.CDSERVFILI
                                                 AND IDCOOKCHILL = V_IDCOOKCHILLORI AND IDTPPRODCHILL = V_IDTPPRODCHILLORI 
                                                 AND IDFINALIZACAO = V_IDFINALIZACAOORI AND IDESTADO = V_IDESTADOORI
                                                 AND NRORG = P_NRORG;
                                                 --AND NRSEQPRODACABADO = V_NRSEQPRODORI;

                  DELETE FROM PLANPRODFILIAGREGA WHERE NRPLANPROD = P_NRPLANPROD AND CDPRODACABADO = V_CDPRODORI 
                                                 AND CDFILIAGREG = C_FILIAGREG.CDFILIAL AND CDSERVFILIAGREG = C_FILIAGREG.CDSERVFILI
                                                 AND IDCOOKCHILL = V_IDCOOKCHILLORI AND IDTPPRODCHILL = V_IDTPPRODCHILLORI 
                                                 AND IDFINALIZACAO = V_IDFINALIZACAOORI AND IDESTADO = V_IDESTADOORI
                                                 AND NRORG = P_NRORG;
                                                 --AND NRSEQPRODACABADO = V_NRSEQPRODORI;
                
                    
                END IF;

                IF (V_NUMTPPRATO >= V_AUX) THEN
                        UPDATE PLANPRODFILIAGREGA
                           SET QTCOMENSSERV = ROUND(C_FILIAGREG.QTCOMENSAIS, 2),
                               QTPRODSERV = ROUND(NVL(C_FILIAGREG.QTCOMENSAIS * C_FILIAGREG.QTPORPESSOA, 0.00),5),
                               VRUNITPRODSERV = ROUND( (VRTOTALPRODSERV + ROUND(NVL(V_QTPRODUTO * C_FILIAGREG.VRCUSTOUNITPROD, 0.00) , 2))/ CASE WHEN C_FILIAGREG.QTCOMENSAIS = 0 THEN 1 ELSE C_FILIAGREG.QTCOMENSAIS END , 2),
                               VRTOTALPRODSERV = VRTOTALPRODSERV + ROUND(NVL(V_QTPRODUTO * C_FILIAGREG.VRCUSTOUNITPROD, 0.00) , 2),
                               QTAPRODUZIR = ROUND(NVL(C_FILIAGREG.QTCOMENSAIS * C_FILIAGREG.QTPORPESSOA, 0.00),5)
                         WHERE NRPLANPROD = P_NRPLANPROD
                           AND CDPRODACABADO = V_CDPROD_SEL
                           AND IDCOOKCHILL = C_FILIAGREG.IDCOOKCHILL
                           AND IDFINALIZACAO = C_FILIAGREG.IDFINALIZACAO
                           AND IDESTADO = C_FILIAGREG.ESTADO
                           AND IDTPPRODCHILL = C_FILIAGREG.IDTPPRODCHILL
                           AND NRSEQPRODACABADO = V_NRSEQPRODACABADO          
                           AND CDFILIAGREG = C_FILIAGREG.CDFILIAL
                           AND CDSERVFILIAGREG = C_FILIAGREG.CDSERVFILI; 

                           V_AUX := V_AUX + 1;
                END IF;

                V_CDPRODUTO := C_FILIAGREG.CDPRODUTO;
                V_CDPRATOORI := C_PRODUTOORI.CDPRATO;
                V_CDFILAUXPRATORI := C_PRODUTOORI.CDFILAUXPRAT;
                V_CDPRODACABADO := V_CDPROD_SEL;

            ELSE 
               IF ( (V_CDFILIAL_ERRO IS NULL) OR (V_CDFILIAL_ERRO <> C_FILIAGREG.CDFILIAL) ) OR 
                   ( (V_CDSERVFILI_ERRO IS NULL) OR (V_CDSERVFILI_ERRO <> C_FILIAGREG.CDSERVFILI) ) THEN
                    P_NAOSUBSTITUIDO := P_NAOSUBSTITUIDO || C_FILIAGREG.CDFILIAL || C_FILIAGREG.CDSERVFILI || '_'; 
                    V_CDFILIAL_ERRO := C_FILIAGREG.CDFILIAL;
                    V_CDSERVFILI_ERRO := C_FILIAGREG.CDSERVFILI;
               END IF;
            END IF;
        END LOOP;

        /* Atualiza qtprodacabado e qtaproduzir do produto inserido e o anterior, caso exista*/           
        FOR C_QTS IN (
                SELECT PP.CDPRODACABADO, PP.NRSEQPRODACABADO, ROUND(SUM(NVL(PPF.QTPRODSERV, 0)), 5) AS QTPRODACABADO, ROUND(SUM(NVL(PPF.QTAPRODUZIR,0)), 5) AS QTAPRODUZIR
                FROM PLANPRODACABADO PP
                LEFT JOIN PLANPRODFILIAGREGA PPF ON PPF.NRPLANPROD = PP.NRPLANPROD 
                        AND PPF.CDPRODACABADO = PP.CDPRODACABADO 
                        AND PPF.NRSEQPRODACABADO = PP.NRSEQPRODACABADO 
                        AND PPF.IDCOOKCHILL = PP.IDCOOKCHILL 
                        AND PPF.IDFINALIZACAO = PP.IDFINALIZACAO 
                        AND PPF.IDTPPRODCHILL = PP.IDTPPRODCHILL
                WHERE PP.NRPLANPROD = P_NRPLANPROD
                        AND PP.CDPRODACABADO IN (V_CDPROD_SEL, V_CDPRODORI)
                GROUP BY PP.NRPLANPROD, PP.CDPRODACABADO, PP.NRSEQPRODACABADO
        )LOOP
        
            IF C_QTS.QTPRODACABADO = 0 AND C_QTS.QTAPRODUZIR = 0 THEN
                DELETE FROM PLANPRODACABADO
                WHERE NRPLANPROD = P_NRPLANPROD
                      AND CDPRODACABADO = C_QTS.CDPRODACABADO
                      AND NRSEQPRODACABADO = C_QTS.NRSEQPRODACABADO;
            ELSE 
                UPDATE PLANPRODACABADO
                SET QTPRODACABADO = C_QTS.QTPRODACABADO,
                    QTAPRODUZIR = C_QTS.QTAPRODUZIR
                WHERE NRPLANPROD = P_NRPLANPROD
                      AND CDPRODACABADO = C_QTS.CDPRODACABADO
                      AND NRSEQPRODACABADO = C_QTS.NRSEQPRODACABADO;
            END IF;
        END LOOP;
        
--        UPDATE PLANPRODACABADO
--        SET (QTPRODACABADO, QTAPRODUZIR) = (SELECT ROUND(SUM(QTPRODSERV), 2) AS QTPRODACABADO, ROUND(SUM(QTAPRODUZIR), 2) AS QTAPRODUZIR
--                                                  FROM PLANPRODFILIAGREGA
--                                                  WHERE NRPLANPROD = P_NRPLANPROD
--                                                        AND CDPRODACABADO = V_CDPROD_SEL
--                                                        AND NRSEQPRODACABADO = V_NRSEQPRODACABADO)
--        WHERE NRPLANPROD = P_NRPLANPROD
--              AND CDPRODACABADO = V_CDPROD_SEL
--              AND NRSEQPRODACABADO = V_NRSEQPRODACABADO;  

        /*Deleta todos produtos */
        IF(P_CANCELATODOS = 'T') THEN 
          DELETE FROM CARDACLIPLANPROD WHERE NRPLANPROD = P_NRPLANPROD AND CDPRODUTO = V_CDPRODORI;

          DELETE FROM PLANRECPROD WHERE NRPLANPROD = P_NRPLANPROD AND CDPRODACABADO = V_CDPRODORI;

          DELETE FROM PLANPRODFILIAGREGA WHERE NRPLANPROD = P_NRPLANPROD AND CDPRODACABADO = V_CDPRODORI;

          DELETE FROM PLANPRODACABADO WHERE NRPLANPROD = P_NRPLANPROD AND CDPRODACABADO = V_CDPRODORI ;
        END IF;

        /*Deleta calculo do produto caso exista*/
        DELETE FROM CAPACIDADEPRODCOZ 
        WHERE CDCENTRAL = P_CDCENTRAL 
              AND NRPLANPROD = P_NRPLANPROD
              AND CDPRODUTO = V_CDPRODORI;
    

   END LOOP;

   /*Verifica a existAncia de produtos na planprodfiliagrega antes de excluir a planprodacabado*/
--    SELECT DISTINCT NVL(SUM(PF.QTPRODSERV), 0) INTO V_QTPRODANTIGO FROM PLANPRODACABADO P
--    LEFT JOIN PLANPRODFILIAGREGA PF ON PF.NRPLANPROD = P.NRPLANPROD AND PF.CDPRODACABADO = P.CDPRODACABADO 
--                                 AND PF.IDTPPRODCHILL = P.IDTPPRODCHILL AND PF.IDFINALIZACAO = P.IDFINALIZACAO
--                                 AND PF.IDESTADO = P.IDESTADO AND PF.NRORG = P.NRORG 
--                                 AND PF.NRSEQPRODACABADO = P.NRSEQPRODACABADO
--    WHERE P.NRPLANPROD = P_NRPLANPROD AND P.CDPRODACABADO = V_CDPRODORI AND P.IDCOOKCHILL = V_IDCOOKCHILLORI 
--        AND P.IDTPPRODCHILL = V_IDTPPRODCHILLORI AND P.IDFINALIZACAO = V_IDFINALIZACAOORI 
--        AND P.IDESTADO = V_IDESTADOORI AND P.NRORG = P_NRORG
--        AND P.NRSEQPRODACABADO = V_NRSEQPRODORI;
--
--    IF V_QTPRODANTIGO = 0 THEN
--        IF (P_CANCELATODOS IS NULL ) THEN
--            DELETE FROM PLANPRODACABADO WHERE NRPLANPROD = P_NRPLANPROD AND CDPRODACABADO = V_CDPRODORI 
--                                      AND IDCOOKCHILL = V_IDCOOKCHILLORI AND IDTPPRODCHILL = V_IDTPPRODCHILLORI
--                                      AND IDFINALIZACAO = V_IDFINALIZACAOORI AND IDESTADO = V_IDESTADOORI 
--                                      AND NRORG = P_NRORG;
--                                      --AND NRSEQPRODACABADO = V_NRSEQPRODORI
--        ELSE
--            DELETE FROM PLANPRODACABADO WHERE NRPLANPROD = P_NRPLANPROD AND CDPRODACABADO = V_CDPRODORI 
--                                      AND IDCOOKCHILL = V_IDCOOKCHILLORI AND IDTPPRODCHILL = V_IDTPPRODCHILLORI
--                                      AND IDFINALIZACAO = V_IDFINALIZACAOORI AND IDESTADO = V_IDESTADOORI 
--                                      AND NRORG = P_NRORG
--                                      AND NRSEQPRODACABADO = V_NRSEQPRODORI;
--        END IF;
--    END IF;

END;
/

-- VERSAO --
BEGIN ATUVEROBJ('SUBST_PROD_PRODUCAO','6.35.009'); END;
/