create or replace PROCEDURE CONCLUI_PROD_ACABADO(
   P_NRPLANPROD IN PLANPRODUCAO.NRPLANPROD%TYPE,
   P_DTRETIRADA IN RETIRADA.DTRETIRADA%TYPE,
   P_CDOPERADOR IN OPERADOR.CDOPERADOR%TYPE,
   P_CDFILIPROC IN FILIAL.CDFILIAL%TYPE,
   P_DSLANCAMENTO IN LANCTOESTOQ.DSLANCESTQ%TYPE,   
   P_DSLANCTOESTOQ IN LANCTOESTOQ.DSLANCESTQ%TYPE,
   P_OPERACAO IN VARCHAR2, -- G: geracao C: Cancelamento   
   P_NRORG IN NUMBER,
   P_LISTAPROD IN VARCHAR2, -- LISTA DE PRODUTOS + COOKCHILL + IDFINALIZACAO + IDTPPRODCHILL + IDESTADO OBS SO PRIMEIRO CARACTERE + NRSEQPRODACABADO
   P_EXCGERAPARC IN VARCHAR2,
   P_RETORNO OUT VARCHAR2 
) AS
   V_CDTIPORETI      VARCHAR2(2);     -- Tipo de retirada
   V_IDUTILLOTE      VARCHAR2(1);     -- Identifica o uso de lote
   V_NRSEQUITRETI    NUMBER;          -- Sequencial para os itens da retirada
   V_CDFILIAL        VARCHAR2(4);     -- Central
   V_CDSERVICO       VARCHAR2(5);     -- Servico padrao para a retirada
   V_NRLANCTOEST     VARCHAR2(20);    -- n lancamento do estoque da retirada
   V_NRRETIRADA      VARCHAR2(20);    -- n da retirada
   V_NRCARDAPIO      VARCHAR2(20);    -- n do cardapio
   V_QTDEESTO        NUMBER;          -- Quantidade do produto no estoque
   V_VALRESTO        NUMBER;          -- 
   V_VALRBRUT        NUMBER;          -- 
   V_QTCONSUMIDA     NUMBER;          -- Quantidade normalizada pelo fator de conversao do produto
   V_CDALMOXARIFE    VARCHAR2(6);     -- Almoxarifado 
   V_CDLOCALESTOQ    VARCHAR2(6);     -- Local no estoque
   V_LOTEESTQ        VARCHAR2(20);    -- Lote
   V_SUBLOTE         VARCHAR2(4);     -- Sublote
   V_NR_REG          NUMBER;          -- Numero de registros atualizados   
   V_CDFILANCTOEST   VARCHAR2(4);      -- Filial lancamento do estoque de entrada prod. acabado
   V_NRLANCTOESTENTR VARCHAR2(20);    -- N do lancamento do estoque de entrada prod. acabado
   V_VRCUSTOMEDIO    NUMBER;          -- Custo medio do produto de producao
   V_CDFILIPROC      VARCHAR2(4);     -- Filial de lancamento do estoque
   V_CDSERVFILI      VARCHAR2(5);     -- Servico do cardapio da retirada
   V_DTRETIRADA      DATE;            -- Data da retirada
   V_RETORNO_VD      VARCHAR2(14);
   V_VALIDA_EST      VARCHAR2(14);    -- Valida se estoque vai ficar negativo 
   V_EXISTEITEM      NUMBER;          -- Indica se existem itens na retirada
   V_PRODACABADO     VARCHAR2(100);
   V_VRUNITARIO      FLOAT;           -- Valor unitario da materia prima da retirada
   V_VD_QTRETIRADA   FLOAT;           -- Verificacao de valor do item da retirada
   V_QTEXTRA         FLOAT;           -- quantidade extra da receita
   V_QTDEVOLVIDA     FLOAT;           -- quantidade devolvida da receita 
   V_VRTOTALRECEITA  FLOAT;           -- valor total da receita com quantidade extra por produto acabado
   V_NRSEQUITEM_OLD  NUMBER;          -- se ja existe item para o produto, apenas soma a quantidade
   V_NRSEQUITRETI_OLD NUMBER;
   V_SEQUENCIAL      VARCHAR2(20);  
   V_CDFILILANTO     VARCHAR2(4);     --filial de lancamento da retirada
   V_CDPRODUTO       VARCHAR2(10);
   V_IDCNTRESTOQ VARCHAR2(1);
   V_IDPRODATIV  VARCHAR2(1);
   -- ***** FUNCOES PRE-DEFINIDAS ******* 
   
   -- Verifica se o inventario esta pendente
   FUNCTION VD_INV_PENDENTE(P_CDFILIAL VARCHAR2, 
                            P_CDALMOXARIFE VARCHAR2,
                            P_CDLOCALESTOQ VARCHAR2,
                            P_DTRETIRADA DATE) RETURN VARCHAR2
   AS
   BEGIN      
      FOR C_INV IN
          (
            SELECT 1
            FROM
               INVEROTA
            WHERE
               (NRORG = P_NRORG) AND
               (CDFILIAL = V_CDFILIAL) AND
               (DTINVEROTA = (SELECT MAX(DTINVEROTA)
                              FROM INVEROTA
                              WHERE (CDFILIAL     = P_CDFILIAL)     AND
                                    (CDALMOXARIFE = P_CDALMOXARIFE) AND
                                    (CDLOCALESTOQ = P_CDLOCALESTOQ) AND
                                    (DTINVEROTA < P_DTRETIRADA)))   AND
               (CDALMOXARIFE = P_CDALMOXARIFE) AND
               (CDLOCALESTOQ = P_CDLOCALESTOQ) AND
               (IDINVENTOK = 'N')

            UNION ALL

            SELECT 1
            FROM
               INVEROTALOTE
            WHERE
               (NRORG = P_NRORG) AND
               (CDFILIAL = V_CDFILIAL) AND
               (DTINVELOTE = (SELECT MAX(DTINVELOTE)
                              FROM INVEROTALOTE
                              WHERE (CDFILIAL     = V_CDFILIAL)     AND
                                    (CDALMOXARIFE = ' ') AND
                                    (CDLOCALESTOQ = ' ') AND
                                    (DTINVELOTE < P_DTRETIRADA)))   AND
               (CDALMOXARIFE = P_CDALMOXARIFE) AND
               (CDLOCALESTOQ = P_CDLOCALESTOQ) AND
               (IDINVLOTEOK = 'N')
          ) LOOP
          RETURN 'ERR_INV_PEND' ||';' || P_CDALMOXARIFE || P_CDLOCALESTOQ;
      END LOOP;
      RETURN NULL;
   END;
   
   -- Calcula o custo medio do produto
   FUNCTION CALCULA_CUSTO_MEDIO(P_DTRETIRADA DATE,
                                P_CDFILIAL VARCHAR2,
                                P_CDPRODUTO VARCHAR2,
                                P_QTPRODUTO NUMBER) RETURN NUMBER
   AS
   V_CUSTOMEDIO NUMBER;
   BEGIN
      
      SELECT SUM(CF.VRTOTAPRODSERV)/P_QTPRODUTO
        INTO V_CUSTOMEDIO
        FROM CONSFILIAGREGA CF
       WHERE CF.CDFILIAL = P_CDFILIAL
         AND CF.DTRETIRADALANC = P_DTRETIRADA
         AND CF.CDPRODACABADO = P_CDPRODUTO
         AND (CF.NRORG = P_NRORG);
      
      RETURN NVL(V_CUSTOMEDIO, 0);
   END;
   
   -- Verifica inconsistencias no estoque
   PROCEDURE VD_INCONS_EST(P_CDFILIAL VARCHAR2,
                           P_DATA VARCHAR2,
                           P_CDFILIPROC VARCHAR2,
                           P_NRLANCTOEST VARCHAR2,
                           P_VALIDA VARCHAR2,
                           P_RETORNO OUT VARCHAR2)
   AS
   V_REG NUMBER;
   BEGIN
      V_REG := 0;
      FOR C_MOVIEST IN
          (
            SELECT CDPRODUTO
              FROM MOVILOTE M
             WHERE NRMOVILOTE = P_CDFILIPROC || P_NRLANCTOEST AND
                   (M.NRORG = P_NRORG)
          ) LOOP
         
         UPDATE ITLANCTOEST
            SET IDEVOLESTOQ = 'N'
          WHERE CDFILIMOVI = P_CDFILIAL AND
                NRLANCESTQ = P_NRLANCTOEST AND
                CDPRODUTO = C_MOVIEST.CDPRODUTO AND
                (NRORG = P_NRORG);
          
          V_REG := V_REG + 1;
         
      END LOOP;
      -- Recalcula estoque
      ATUALIZA_ESTOQUE(P_CDFILIAL, P_DATA, P_DATA, P_CDFILIPROC, V_NRLANCTOEST, null);
      
      DELETE FROM MOVILOTE WHERE (NRORG = P_NRORG) AND NRMOVILOTE = P_CDFILIPROC || P_NRLANCTOEST;
      IF  ((V_REG > 0) AND (P_VALIDA = 'S')) THEN
         P_RETORNO := 'INF_PROD_N_ATU'; 
      END IF;
   END;
   
   PROCEDURE ATUALIZA_PRODUTO_LOCAL(P_CDFILIAL VARCHAR2,
                                    P_CDALMOXARIFE VARCHAR2,
                                    P_CDLOCALESTOQ VARCHAR2,
                                    P_CDPRODUTO VARCHAR2,
                                    P_LOTE VARCHAR2,
                                    P_SUBLOTE VARCHAR2)
   AS
      EXIST_LOTE NUMBER;
   BEGIN
      INSERT INTO PRODLCESTOQ
      (CDFILIAL, CDALMOXARIFE, CDLOCALESTOQ, CDPRODUTO)
      (SELECT P_CDFILIAL, P_CDALMOXARIFE, P_CDLOCALESTOQ, P_CDPRODUTO
       FROM PRODFILI
       WHERE CDFILIAL  = P_CDFILIAL  AND
             CDPRODUTO = P_CDPRODUTO AND
             NVL(IDCNTRESTOQ, 'S') <> 'N' AND
             (NRORG = P_NRORG)
       MINUS
       SELECT CDFILIAL, CDALMOXARIFE, CDLOCALESTOQ, CDPRODUTO
       FROM PRODLCESTOQ
       WHERE CDFILIAL     = P_CDFILIAL     AND
             CDALMOXARIFE = P_CDALMOXARIFE AND
             CDLOCALESTOQ = P_CDLOCALESTOQ AND
             (NRORG = P_NRORG) AND
             CDPRODUTO    = P_CDPRODUTO);
      
      BEGIN
         SELECT MAX(1)
           INTO EXIST_LOTE
           FROM LOTE
          WHERE  (P_CDFILIAL   =  CDFILIAL)   AND
                 (P_LOTE       =  NRLOTEESTQ) AND
                 (P_SUBLOTE    =  NRSUBLOTE)  AND
                 (NRORG = P_NRORG) AND
                 (P_CDPRODUTO  =  CDPRODUTO);
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            EXIST_LOTE := NULL;
      END;
      
      IF EXIST_LOTE IS NULL THEN
         
         INSERT INTO LOTE
         (CDFILIAL, NRLOTEESTQ, NRSUBLOTE, CDPRODUTO, IDSTATLOTE, DTENTRLOTE)
         (SELECT P_CDFILIAL, P_LOTE, P_SUBLOTE, P_CDPRODUTO, 
         'L' IDSTATLOTE, SYSDATE DTENTRLOTE
          FROM PARAMGERAL
          MINUS
          SELECT CDFILIAL, NRLOTEESTQ, NRSUBLOTE, P_CDPRODUTO CDPRODUTO, 'L', SYSDATE
          FROM LOTE
          WHERE P_CDFILIAL   =  CDFILIAL     AND
                P_LOTE =  NRLOTEESTQ   AND
                P_SUBLOTE  =  NRSUBLOTE    AND
                (NRORG = P_NRORG) AND
                P_CDPRODUTO  =  CDPRODUTO);
         
      END IF;

   END;
   
BEGIN
   -- Busca o codigo da filial central
   BEGIN
      SELECT P.CDFILIAL, P.NRRETIRADA, P.NRLANCTOESTENTR, R.NRLANCESTQ,  R.NRCARDAPIO, R.CDFILANCESTQ, 
             CDSERVFILI, R.DTRETIRADA, P.CDFILANCTOEST
        INTO V_CDFILIAL, V_NRRETIRADA, V_NRLANCTOESTENTR, V_NRLANCTOEST, V_NRCARDAPIO, V_CDFILIPROC,
             V_CDSERVFILI, V_DTRETIRADA, V_CDFILANCTOEST
        FROM PLANPRODUCAO P
             LEFT JOIN RETIRADA R ON R.CDFILIAL = P.CDFILIAL AND R.NRRETIRADA = P.NRRETIRADA
             LEFT JOIN CARDADIA CD ON CD.CDFILIAL = R.CDFILIAL AND CD.NRCARDAPIO = R.NRCARDAPIO
       WHERE P.NRPLANPROD = P_NRPLANPROD AND (P.NRORG = P_NRORG);
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         P_RETORNO := 'ERR_N_HA_PLANPROD'|| ';';
         RETURN;
   END;
   
   -- =================================== 
   -- ======= OPERACAO DE GERACAO =======
   -- Operacao de geracao da retirada da materia prima
   -- e entrada dos produtos acabados
   -- ===================================
   IF P_OPERACAO = 'G' THEN
      -- Verifica se ha produtos acabados indicados para a geracao
      BEGIN
         SELECT COUNT(1)
           INTO V_NR_REG
           FROM PLANPRODACABADO
          WHERE NRPLANPROD = P_NRPLANPROD
            AND (NRORG = P_NRORG)
            AND IDPRODUZIR = 'S';
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            P_RETORNO := 'ERR_N_HA_PRODACABADO_CONCL' || ';';
            RETURN;
      END;
      
      IF V_NR_REG <= 0 THEN
         P_RETORNO := 'ERR_N_HA_PRODACABADO_CONCL'|| ';';
         RETURN;
      END IF;
      
      -- Verifica se existem cardapios ja gerados
      FOR C_JACONCLUIDOS IN 
         (
         SELECT F.CDPRODACABADO, F.CDFILIAGREG, F.CDSERVFILIAGREG, F.DTCONSUMO, PPROD.NRPLANPROD
           FROM PLANPRODFILIAGREGA F
          INNER JOIN (SELECT NRSEQPRODACABADO, NRPLANPROD, CDPRODACABADO, CDFILIAGREG, CDSERVFILIAGREG, DTCONSUMO,
                             IDCOOKCHILL, IDFINALIZACAO, IDTPPRODCHILL, IDESTADO
                       FROM PLANPRODFILIAGREGA
                      WHERE IDCONCLUIDO = 'S') PPROD ON PPROD.CDFILIAGREG = F.CDFILIAGREG AND
                                                        PPROD.CDSERVFILIAGREG = F.CDSERVFILIAGREG AND
                                                        PPROD.DTCONSUMO = F.DTCONSUMO AND
                                                        PPROD.CDPRODACABADO = F.CDPRODACABADO AND
                                                        PPROD.IDCOOKCHILL = F.IDCOOKCHILL AND
                                                        PPROD.IDFINALIZACAO = F.IDFINALIZACAO AND
                                                        PPROD.IDTPPRODCHILL = F.IDTPPRODCHILL AND
                                                        PPROD.IDESTADO = F.IDESTADO AND
                                                        PPROD.NRSEQPRODACABADO = F.NRSEQPRODACABADO
          INNER JOIN LISTA L_PROD ON ((NRLISTA         = P_LISTAPROD)        AND
                                      (F.CDPRODACABADO = SUBSTR(L_PROD.CDLISTA,1,10))AND
                                      (F.IDCOOKCHILL   = SUBSTR(L_PROD.CDLISTA,11,1))AND
                                      (F.IDFINALIZACAO = SUBSTR(L_PROD.CDLISTA,12,1))AND
                                      (SUBSTR(F.IDTPPRODCHILL,1,1) = SUBSTR(L_PROD.CDLISTA,13,1))AND
                                      (SUBSTR(F.IDESTADO,1,1)      = SUBSTR(L_PROD.CDLISTA,14,1)) AND
                                      (F.IDESTADO <> 'FINALIZACAO') AND
                                      (F.NRSEQPRODACABADO          = SUBSTR(L_PROD.CDLISTA,15)))      
          
          WHERE F.NRPLANPROD = P_NRPLANPROD 
            AND F.IDPRODUZIR = 'S'
            AND (F.NRORG = P_NRORG)
         ) LOOP
         
          IF (P_RETORNO IS NULL) THEN 
              -- Busca novo sequencial para a tabela de log               
              NOVO_CODIGO_SC('LOGMATPRIMA', V_SEQUENCIAL);
              P_RETORNO := TO_NUMBER(V_SEQUENCIAL);
          END IF; 
          
          INSERT INTO LOGMATPRIMA 
          (NRLOGMATPRIMA, CDPRODUTO, DSORIGEM, CDFILIAL, CDSERVFILI, 
           NRPLANPROD, DTCARDAPIO) 
          VALUES
          (P_RETORNO, C_JACONCLUIDOS.CDPRODACABADO, 'GERACAO', C_JACONCLUIDOS.CDFILIAGREG, C_JACONCLUIDOS.CDSERVFILIAGREG, 
           C_JACONCLUIDOS.NRPLANPROD, TO_CHAR(C_JACONCLUIDOS.DTCONSUMO, 'DD/MM/YYYY'));
      END LOOP;
      
      IF (P_RETORNO IS NOT NULL) THEN
        P_RETORNO := 'INF_CARDJACONCL;' || P_RETORNO;
        RETURN;
      END IF;
      
      -- Percorre os produtos acabados incluindo-os no estoque
      FOR C_VDPRODACABA IN
         (
            SELECT PT.CDARVPROD, P.CDPRODACABADO, PF.CDFILIAL, PT.NMPRODUTO, P.QTPRODACABADO, PT.VRFATOCONV, 
                   PF.IDPRODATIV, PF.IDCNTRESTOQ, PF.IDUTCTRLLOTE,
                   PT.CDPRODESTO
              FROM PLANPRODACABADO P
                   INNER JOIN PRODUTO PT ON PT.CDPRODUTO = P.CDPRODACABADO
                   LEFT JOIN PRODFILI PF ON PF.CDPRODUTO = PT.CDPRODUTO AND PF.CDFILIAL = V_CDFILIAL
                   INNER JOIN LISTA L_PROD ON ((NRLISTA         = P_LISTAPROD)        AND
                                               (P.CDPRODACABADO = SUBSTR(L_PROD.CDLISTA,1,10))AND
                                               (P.IDCOOKCHILL   = SUBSTR(L_PROD.CDLISTA,11,1))AND
                                               (P.IDFINALIZACAO = SUBSTR(L_PROD.CDLISTA,12,1))AND
                                               (SUBSTR(P.IDTPPRODCHILL,1,1) = SUBSTR(L_PROD.CDLISTA,13,1))AND
                                               (SUBSTR(P.IDESTADO,1,1)      = SUBSTR(L_PROD.CDLISTA,14,1)) AND
                                               (P.IDESTADO <> 'FINALIZACAO') AND
                                               (P.NRSEQPRODACABADO          = SUBSTR(L_PROD.CDLISTA,15)))     
             WHERE P.NRPLANPROD = P_NRPLANPROD
               AND P.IDPRODUZIR = 'S'
               AND (P.NRORG = P_NRORG)
         ) LOOP
         
         IF (C_VDPRODACABA.IDPRODATIV IS NULL) THEN
			INSERT INTO PRODFILI(CDFILIAL, CDPRODUTO, IDCNTRESTOQ, IDPRODATIV, NRORG)
				VALUES (V_CDFILIAL, C_VDPRODACABA.CDPRODACABADO, 'S', 'A', P_NRORG) ;
         END IF;
		 
         IF (C_VDPRODACABA.IDPRODATIV <> 'A') OR (C_VDPRODACABA.IDCNTRESTOQ <> 'S') THEN
            UPDATE PRODFILI
			SET IDCNTRESTOQ = 'S', IDPRODATIV = 'A'
			  WHERE CDFILIAL = V_CDFILIAL
				AND CDPRODUTO = C_VDPRODACABA.CDPRODACABADO
				AND NRORG = P_NRORG;
         END IF;
         
      END LOOP;

      -- Busca o tipo de retirada padrao
      BEGIN
         SELECT CDTPRETIPADR, CDSERVRETPME
            INTO V_CDTIPORETI, V_CDSERVICO
         FROM PARAMPLANEJA
         WHERE CDFILIAL = V_CDFILIAL AND (NRORG = P_NRORG);
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
         V_CDTIPORETI := NULL;
      END;
      
      -- Verifica uso de lote no estoque
      SELECT IDUTILLOTE
        INTO V_IDUTILLOTE
      FROM PARAMFILIAL
      WHERE CDFILIAL = V_CDFILIAL AND (NRORG = P_NRORG);
      
      -- Verifica se existe cardapio para a data de retirada
      BEGIN
         SELECT MIN(NRCARDAPIO)
            INTO V_NRCARDAPIO
         FROM CARDADIA
         WHERE (CDFILIAL   = V_CDFILIAL)
           AND (CDSERVFILI = V_CDSERVICO)
           AND (DTCARDAPIO = P_DTRETIRADA)
           AND (NRORG = P_NRORG);
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_NRCARDAPIO := NULL;
      END;
      
      
      -- *************************************
      -- RETIRADA DA MATERIA PRIMA
      -- *************************************
      
      
      -- Se existe cardapio, verifica se existe retirada correspondente
      IF V_NRCARDAPIO IS NOT NULL THEN
          SELECT MAX(NRLANCESTQ), MAX(NRRETIRADA), MAX(CDFILANCESTQ) 
            INTO V_NRLANCTOEST, V_NRRETIRADA, V_CDFILILANTO
            FROM RETIRADA RE
           WHERE RE.CDFILIAL = V_CDFILIAL
             AND RE.NRCARDAPIO = V_NRCARDAPIO
             AND RE.DTRETIRADA = P_DTRETIRADA
             AND (RE.NRORG = P_NRORG);
      
      -- Inclui novo cardapio, caso nao exista
      ELSE
         NOVO_CODIGO_SC('CARDAPIO'||V_CDFILIAL, V_NRCARDAPIO, 1);
         V_NRCARDAPIO := SUBSTR(V_NRCARDAPIO, 11, 10);
         INSERT INTO CARDADIA
            (NRORG, CDFILIAL, NRCARDAPIO, CDSERVFILI, 
             CDOPERADOR, DTCARDAPIO, DTMESCARD)
         VALUES
            (P_NRORG, V_CDFILIAL, V_NRCARDAPIO, V_CDSERVICO, 
             P_CDOPERADOR, P_DTRETIRADA, ADD_MONTHS(LAST_DAY(P_DTRETIRADA), -1) + 1);
      END IF;
      
      -- Inclui nova retirada, caso nao exista
      IF V_NRRETIRADA IS NULL THEN
         V_CDFILILANTO := P_CDFILIPROC;
         -- Inclui lanAamento de estoque da retirada
         NOVO_CODIGO_SC('LANCTOEST'||V_CDFILILANTO, V_NRLANCTOEST, 1);
         V_NRLANCTOEST := SUBSTR(V_NRLANCTOEST, 11, 10);
         
         INSERT INTO LANCTOESTOQ
           (NRORG, CDFILIAL, NRLANCESTQ, IDTPLANCTO,
            DTLANCESTQ, DSLANCESTQ, IDALTCUSMED,
            NRLANCTONF, CDFILIMOVI, CDOPERADOR,
            CDALMOXARIFE,  CDLOCALESTOQ)
         VALUES
           (P_NRORG, V_CDFILILANTO, V_NRLANCTOEST, '3', 
            P_DTRETIRADA, P_DSLANCAMENTO, 'N',
            NULL, V_CDFILIAL, P_CDOPERADOR, 
            ' ', ' ');
         
         -- Inclui a retirada      
         NOVO_CODIGO_SC('RETIRADA'||V_CDFILIAL, V_NRRETIRADA, 1);
         V_NRRETIRADA := SUBSTR(V_NRRETIRADA, 11, 10);
         INSERT INTO RETIRADA
            (NRORG, CDFILIAL, NRRETIRADA, NRCARDAPIO, 
             DTRETIRADA, CDFILANCESTQ, NRLANCESTQ, IDRETIPRAT, NRREQUEXTRRE)
         VALUES
            (P_NRORG, V_CDFILIAL, V_NRRETIRADA, V_NRCARDAPIO,    
             P_DTRETIRADA, V_CDFILILANTO, V_NRLANCTOEST, 'N', '0000000000');

         V_NRSEQUITRETI := 1;

      -- Caso a retirada exista, busca o proximo sequencial para itens
      ELSE
         SELECT MAX(NRSEQUITRETI)
            INTO V_NRSEQUITRETI
         FROM ITEMRETI
         WHERE CDFILIAL = V_CDFILIAL
           AND NRRETIRADA = V_NRRETIRADA
           AND NRCARDAPIO = V_NRCARDAPIO
           AND (NRORG = P_NRORG);
        
        IF V_NRSEQUITRETI IS NULL THEN
           V_NRSEQUITRETI := 0;
        END IF;
        
        V_NRSEQUITRETI := V_NRSEQUITRETI + 1;
      END IF;
      
      V_NR_REG := 0;
      -- Percorre cada produto das materias primas necessarias para a producao
      FOR C_PRODRECEITA IN 
         (
         SELECT R.CDPRODUTO, P.CDPRODESTO, SUM(R.QTEXTRA) AS QTEXTRA, SUM(R.QTDEVOLVIDA) AS QTDEVOLVIDA, SUM(R.QTLIBERADA) AS QTLIBERADA,
                SUM(ROUND(R.QTPRODRECEPRAT, 5)) AS QTPRODRECEPRAT,
                SUM(ROUND(R.QTAPRODUZIR, 5)) AS QTAPRODUZIR,
                SUM(ROUND(R.QTAPRODUZIR * R.VRUNITRECEPRAT, 3)) AS VRTOTAL
           FROM PLANRECPROD R
                  INNER JOIN PRODUTO P ON P.CDPRODUTO = R.CDPRODUTO
                  INNER JOIN PLANPRODFILIAGREGA F
                     ON F.NRPLANPROD = R.NRPLANPROD
                    AND F.CDPRODACABADO = R.CDPRODACABADO
                    AND F.CDFILIAGREG = R.CDFILIAGREG
                    AND F.CDSERVFILIAGREG = R.CDSERVFILIAGREG
                    AND F.DTCONSUMO = R.DTCONSUMO
                    AND F.IDCOOKCHILL = R.IDCOOKCHILL
                    AND F.IDFINALIZACAO = R.IDFINALIZACAO
                    AND F.IDTPPRODCHILL = R.IDTPPRODCHILL
                    AND F.IDESTADO = R.IDESTADO
                    AND F.IDESTADO <> 'FINALIZACAO'
                    AND F.NRSEQPRODACABADO = R.NRSEQPRODACABADO
                  LEFT JOIN (SELECT CDPRODACABADO, CDFILIAGREG, CDSERVFILIAGREG, DTCONSUMO,
                                    IDCOOKCHILL, IDFINALIZACAO, IDTPPRODCHILL, IDESTADO
                               FROM PLANPRODFILIAGREGA
                              WHERE IDCONCLUIDO = 'S') PPROD ON PPROD.CDFILIAGREG = R.CDFILIAGREG AND
                                                                PPROD.CDSERVFILIAGREG = R.CDSERVFILIAGREG AND
                                                                PPROD.DTCONSUMO = R.DTCONSUMO AND
                                                                PPROD.CDPRODACABADO = R.CDPRODACABADO AND
                                                                PPROD.IDCOOKCHILL = R.IDCOOKCHILL AND
                                                                PPROD.IDFINALIZACAO = R.IDFINALIZACAO AND
                                                                PPROD.IDTPPRODCHILL = R.IDTPPRODCHILL AND
                                                                PPROD.IDESTADO = R.IDESTADO AND
                                                                PPROD.IDESTADO <> 'FINALIZACAO'
                  INNER JOIN LISTA L_PROD ON ((NRLISTA         = P_LISTAPROD)        AND
                                              (F.CDPRODACABADO = SUBSTR(L_PROD.CDLISTA,1,10))AND
                                              (F.IDCOOKCHILL   = SUBSTR(L_PROD.CDLISTA,11,1))AND
                                              (F.IDFINALIZACAO = SUBSTR(L_PROD.CDLISTA,12,1))AND
                                              (SUBSTR(F.IDTPPRODCHILL,1,1) = SUBSTR(L_PROD.CDLISTA,13,1))AND
                                              (SUBSTR(F.IDESTADO,1,1)      = SUBSTR(L_PROD.CDLISTA,14,1))AND
                                              (F.IDESTADO <> 'FINALIZACAO') AND
                                              (F.NRSEQPRODACABADO          = SUBSTR(L_PROD.CDLISTA,15)))   
          WHERE R.NRPLANPROD = P_NRPLANPROD          
            AND F.IDPRODUZIR = 'S'
            AND (F.NRORG = P_NRORG)
            AND PPROD.CDPRODACABADO IS NULL
          GROUP BY R.CDPRODUTO, P.CDPRODESTO
         ) LOOP
         
        BEGIN
			-- Inclui o produto na relacao com a filial, caso nao exista
			 SELECT CDPRODUTO, IDCNTRESTOQ, IDPRODATIV
			   INTO V_CDPRODUTO, V_IDCNTRESTOQ, V_IDPRODATIV
			   FROM PRODFILI
			  WHERE CDFILIAL = V_CDFILIAL
				AND CDPRODUTO = C_PRODRECEITA.CDPRODUTO
				AND NRORG = P_NRORG;
		EXCEPTION
		WHEN NO_DATA_FOUND THEN
			 INSERT
			   INTO PRODFILI(CDFILIAL, CDPRODUTO, IDCNTRESTOQ, IDPRODATIV, NRORG)
				VALUES (V_CDFILIAL, C_PRODRECEITA.CDPRODUTO, 'S', 'A', P_NRORG) ;
		END;
		IF(V_IDCNTRESTOQ = 'N') OR(V_IDPRODATIV = 'I') THEN
			 UPDATE PRODFILI
			SET IDCNTRESTOQ = 'S', IDPRODATIV = 'A'
			  WHERE CDFILIAL = V_CDFILIAL
				AND CDPRODUTO = C_PRODRECEITA.CDPRODUTO
				AND NRORG = P_NRORG;
		END IF;
        
         -- Verifica a quantidade do produto no estoque
         CONSULTA_POSICAO(V_CDFILIAL,
                          C_PRODRECEITA.CDPRODUTO,
                          P_DTRETIRADA,
                          ' ',
                          ' ',
                          ' ',
                          ' ',
                          'N',
                          V_QTDEESTO,
                          V_VALRESTO,
                          V_VALRBRUT);
         
         -- Calcula valor unitario
         IF V_QTDEESTO > 0 THEN
            V_VALRBRUT := V_VALRBRUT / V_QTDEESTO;
         END IF;
         
         -- Normaliza valor do produto pelo fator de conversao
         V_QTCONSUMIDA := C_PRODRECEITA.QTPRODRECEPRAT;
         
         -- Inclui o item se o consumo for maior que zero
         IF C_PRODRECEITA.QTAPRODUZIR > 0 THEN
            V_VRUNITARIO := ROUND(C_PRODRECEITA.VRTOTAL/C_PRODRECEITA.QTAPRODUZIR, 3);
            -- Identifica o local no estoque
            LOCALESTOQUE_PADRAO(V_CDFILIAL, C_PRODRECEITA.CDPRODUTO,
                                V_CDALMOXARIFE, V_CDLOCALESTOQ);
            IF V_CDALMOXARIFE IS NULL THEN
               V_CDALMOXARIFE := ' ';
            END IF;
            IF V_CDLOCALESTOQ IS NULL THEN
               V_CDLOCALESTOQ := ' ';
            END IF;
            
            -- Consulta o nAmero do lote e sublote
            CONSULTA_LOTE(V_IDUTILLOTE, V_CDFILIAL, V_CDALMOXARIFE,
                          V_CDLOCALESTOQ, C_PRODRECEITA.CDPRODUTO,
                          V_LOTEESTQ, V_SUBLOTE);
            
            
            -- verifica se existe item lancado para o produto, se existir da apenas update nas quantidades
            SELECT MIN(IT.NRSEQUITRETI)
              INTO V_NRSEQUITRETI_OLD   
              FROM ITEMRETI IT INNER JOIN ITLANCTOEST IL ON (IT.NRLANCESTQ = IL.NRLANCESTQ AND 
                                                             IT.NRSEQUITEM = IL.NRSEQUITEM AND
                                                             IT.CDFIITLANEST = IL.CDFILIAL AND
                                                             IT.NRORG = IL.NRORG)
             WHERE IT.CDPRODUTO = C_PRODRECEITA.CDPRODUTO AND
                   IT.NRRETIRADA = V_NRRETIRADA AND
                   IT.NRCARDAPIO = V_NRCARDAPIO AND
                   IT.CDFILIAL = V_CDFILIAL AND 
                   IT.NRORG = P_NRORG;
                   
                   
            -- SE EXISTE ITEM DO PRODUTO LANCADO, UPDATE NO ITEM COM A QTDE ATUALIZADA, SENAO INSERT NO LANCAMENTO 
            IF C_PRODRECEITA.QTLIBERADA >= C_PRODRECEITA.QTPRODRECEPRAT THEN
              V_QTEXTRA := (C_PRODRECEITA.QTLIBERADA - C_PRODRECEITA.QTPRODRECEPRAT) + C_PRODRECEITA.QTEXTRA;
              V_QTDEVOLVIDA := C_PRODRECEITA.QTDEVOLVIDA;
            ELSE
              V_QTEXTRA := C_PRODRECEITA.QTEXTRA;
              V_QTDEVOLVIDA := (C_PRODRECEITA.QTPRODRECEPRAT - C_PRODRECEITA.QTLIBERADA) + C_PRODRECEITA.QTDEVOLVIDA;
            END IF;

            IF V_NRSEQUITRETI_OLD IS NOT NULL THEN                
                UPDATE ITLANCTOEST
                   SET QTLANCTOEST = QTLANCTOEST + V_QTCONSUMIDA,
                       VRTOTLANCTO = VRTOTLANCTO + C_PRODRECEITA.VRTOTAL,
                       QTTOTLANCTO = QTTOTLANCTO + C_PRODRECEITA.QTAPRODUZIR,
                       VRLANCTOBRUT = (VRTOTLANCTO + C_PRODRECEITA.VRTOTAL / QTLANCTOEST + C_PRODRECEITA.QTAPRODUZIR)
                 WHERE NRLANCESTQ = V_NRLANCTOEST AND
                       NRSEQUITEM = LPAD(V_NRSEQUITRETI_OLD, 4, '0') AND
                       CDFILIAL = V_CDFILILANTO AND 
                       CDPRODUTO = C_PRODRECEITA.CDPRODUTO AND
                       NRORG = P_NRORG;
                
                
                UPDATE ITEMRETI
                   SET QTPREVISRETI = QTPREVISRETI + V_QTCONSUMIDA,
                       QTRETIRADA = QTRETIRADA + C_PRODRECEITA.QTAPRODUZIR,
                       QTEXTRARETI = QTEXTRARETI + V_QTEXTRA,
                       QTDEVOLVRETI = QTDEVOLVRETI + V_QTDEVOLVIDA
                 WHERE CDFILIAL = V_CDFILIAL AND
                       NRRETIRADA = V_NRRETIRADA AND
                       NRCARDAPIO = V_NRCARDAPIO AND
                       NRSEQUITRETI = LPAD(V_NRSEQUITRETI_OLD, 4, '0') AND
                       CDPRODUTO = C_PRODRECEITA.CDPRODUTO AND
                       NRORG = P_NRORG;

            ELSE
            
               V_NRSEQUITRETI_OLD := LPAD(V_NRSEQUITRETI, 4, '0');
            
               -- Item do lancamento do estoque
               INSERT INTO ITLANCTOEST
                  (NRORG, CDFILIAL, NRLANCESTQ, NRSEQUITEM, 
                   CDPRODUTO, QTLANCTOEST, VRUNILANCTO,
                   VRTOTLANCTO, IDTIPOMOVI, DTLANCMOVI, 
                   IDORDEMCLC, QTTOTLANCTO, CDFILIMOVI,
                   CDPRODMOVI, IDEVOLESTOQ, CDALMOXARIFE, 
                   CDLOCALESTOQ, NRLOTEESTQ, NRSUBLOTE, CDTIPORETI, VRLANCTOBRUT)
               VALUES
                  (P_NRORG, V_CDFILILANTO, V_NRLANCTOEST, LPAD(V_NRSEQUITRETI_OLD, 4, '0'), 
                   C_PRODRECEITA.CDPRODUTO, C_PRODRECEITA.QTAPRODUZIR, V_VRUNITARIO,
                   C_PRODRECEITA.VRTOTAL, '3', P_DTRETIRADA, 
                   '9', C_PRODRECEITA.QTAPRODUZIR, V_CDFILIAL,
                   C_PRODRECEITA.CDPRODESTO, 'S', V_CDALMOXARIFE, 
                   V_CDLOCALESTOQ, V_LOTEESTQ, V_SUBLOTE,  V_CDTIPORETI, V_VRUNITARIO);
               
               -- Insere item na retirada
               INSERT INTO ITEMRETI
                  (NRORG, CDFILIAL, NRRETIRADA, NRCARDAPIO, 
                   NRSEQUITRETI, CDPRODUTO, QTPREVISRETI, 
                   QTEXTRARETI, QTDEVOLVRETI, QTRETIRADA,
                   CDFIITLANEST, NRLANCESTQ, NRSEQUITEM, CDTIPORETI)
               VALUES
                  (P_NRORG, V_CDFILIAL, V_NRRETIRADA, V_NRCARDAPIO, 
                   LPAD(V_NRSEQUITRETI_OLD, 4, '0'), C_PRODRECEITA.CDPRODUTO, V_QTCONSUMIDA, 
                   V_QTEXTRA, V_QTDEVOLVIDA , C_PRODRECEITA.QTAPRODUZIR,
                   V_CDFILILANTO, V_NRLANCTOEST, LPAD(V_NRSEQUITRETI_OLD, 4, '0'), V_CDTIPORETI);
            
            END IF;   

             -- Criacao do lote
             ATUALIZA_PRODUTO_LOCAL(V_CDFILIAL, V_CDALMOXARIFE, V_CDLOCALESTOQ, C_PRODRECEITA.CDPRODUTO,
                                        V_LOTEESTQ, V_SUBLOTE);
            -- Atualiza o sequencial dos itens de estoque nos produtos correspondentes
            FOR C_PLANRECPROD IN
            (
            SELECT F.NRSEQPRODACABADO, F.NRPLANPROD, F.CDPRODACABADO, F.CDFILIAGREG, F.CDSERVFILIAGREG, F.DTCONSUMO,
                R.CDPRODUTO, P.CDPRODESTO,R.IDCOOKCHILL,R.IDFINALIZACAO,R.IDTPPRODCHILL,R.IDESTADO
              FROM PLANRECPROD R
                  INNER JOIN PRODUTO P ON P.CDPRODUTO = R.CDPRODUTO
                  INNER JOIN PLANPRODFILIAGREGA F
                     ON F.NRPLANPROD = R.NRPLANPROD
                    AND F.CDPRODACABADO = R.CDPRODACABADO
                    AND F.CDFILIAGREG = R.CDFILIAGREG
                    AND F.CDSERVFILIAGREG = R.CDSERVFILIAGREG
                    AND F.DTCONSUMO = R.DTCONSUMO
                    AND F.IDCOOKCHILL = R.IDCOOKCHILL
                    AND F.IDFINALIZACAO = R.IDFINALIZACAO
                    AND F.IDTPPRODCHILL = R.IDTPPRODCHILL
                    AND F.IDESTADO = R.IDESTADO
                    AND F.IDESTADO <> 'FINALIZACAO'
                    AND F.NRSEQPRODACABADO = R.NRSEQPRODACABADO
                  LEFT JOIN (SELECT CDPRODACABADO, CDFILIAGREG, CDSERVFILIAGREG, DTCONSUMO,
                                    IDCOOKCHILL, IDFINALIZACAO, IDTPPRODCHILL, IDESTADO
                               FROM PLANPRODFILIAGREGA
                              WHERE IDCONCLUIDO = 'S') PPROD ON PPROD.CDFILIAGREG = R.CDFILIAGREG AND
                                                                PPROD.CDSERVFILIAGREG = R.CDSERVFILIAGREG AND
                                                                PPROD.DTCONSUMO = R.DTCONSUMO AND
                                                                PPROD.CDPRODACABADO = R.CDPRODACABADO AND
                                                                PPROD.IDCOOKCHILL = R.IDCOOKCHILL AND
                                                                PPROD.IDFINALIZACAO = R.IDFINALIZACAO AND
                                                                PPROD.IDTPPRODCHILL = R.IDTPPRODCHILL AND
                                                                PPROD.IDESTADO = R.IDESTADO AND
                                                                PPROD.IDESTADO <> 'FINALIZACAO'
                  INNER JOIN LISTA L_PROD ON ((NRLISTA         = P_LISTAPROD)        AND
                                              (F.CDPRODACABADO = SUBSTR(L_PROD.CDLISTA,1,10))AND
                                              (F.IDCOOKCHILL   = SUBSTR(L_PROD.CDLISTA,11,1))AND
                                              (F.IDFINALIZACAO = SUBSTR(L_PROD.CDLISTA,12,1))AND
                                              (SUBSTR(F.IDTPPRODCHILL,1,1) = SUBSTR(L_PROD.CDLISTA,13,1))AND
                                              (SUBSTR(F.IDESTADO,1,1)      = SUBSTR(L_PROD.CDLISTA,14,1))AND
                                              (F.IDESTADO <> 'FINALIZACAO') AND
                                              (F.NRSEQPRODACABADO          = SUBSTR(L_PROD.CDLISTA,15)))   
            WHERE R.NRPLANPROD = P_NRPLANPROD          
              AND F.IDPRODUZIR = 'S'
              AND (F.NRORG = P_NRORG)
              AND PPROD.CDPRODACABADO IS NULL
              AND R.CDPRODUTO = C_PRODRECEITA.CDPRODUTO          
            ) LOOP
            
              UPDATE PLANRECPROD
                 SET NRSEQITRETI = LPAD(V_NRSEQUITRETI_OLD, 4, '0')
               WHERE CDPRODUTO = C_PLANRECPROD.CDPRODUTO
                 AND NRSEQPRODACABADO = C_PLANRECPROD.NRSEQPRODACABADO
                 AND NRPLANPROD = C_PLANRECPROD.NRPLANPROD
                 AND CDPRODACABADO = C_PLANRECPROD.CDPRODACABADO
                 AND CDFILIAGREG = C_PLANRECPROD.CDFILIAGREG
                 AND CDSERVFILIAGREG = C_PLANRECPROD.CDSERVFILIAGREG
                 AND DTCONSUMO = C_PLANRECPROD.DTCONSUMO
                 AND IDCOOKCHILL = C_PLANRECPROD.IDCOOKCHILL
                 AND IDFINALIZACAO = C_PLANRECPROD.IDFINALIZACAO
                 AND IDTPPRODCHILL = C_PLANRECPROD.IDTPPRODCHILL
                 AND IDESTADO = C_PLANRECPROD.IDESTADO
                 AND NRORG = P_NRORG;              
              
            END LOOP;            
            
         END IF;
         IF (V_NRSEQUITRETI_OLD = V_NRSEQUITRETI_OLD) THEN 
            V_NRSEQUITRETI := V_NRSEQUITRETI + 1;
            V_NR_REG := V_NR_REG + 1;
         END IF;
         
      END LOOP;
      
      FOR C_FILIAGREGA IN
            (
            SELECT F.NRSEQPRODACABADO, F.CDPRODACABADO, F.CDFILIAGREG, F.CDSERVFILIAGREG, F.DTCONSUMO,
                   F.IDCOOKCHILL, F.IDFINALIZACAO, F.IDTPPRODCHILL, F.IDESTADO
              FROM PLANPRODFILIAGREGA F                     
                  LEFT JOIN (SELECT CDPRODACABADO, CDFILIAGREG, CDSERVFILIAGREG, DTCONSUMO,
                                    IDCOOKCHILL, IDFINALIZACAO, IDTPPRODCHILL, IDESTADO, NRSEQPRODACABADO
                               FROM PLANPRODFILIAGREGA
                              WHERE IDCONCLUIDO = 'S') PPROD ON PPROD.CDFILIAGREG = F.CDFILIAGREG AND
                                                                PPROD.CDSERVFILIAGREG = F.CDSERVFILIAGREG AND
                                                                PPROD.DTCONSUMO = F.DTCONSUMO AND
                                                                PPROD.CDPRODACABADO = F.CDPRODACABADO AND
                                                                PPROD.IDCOOKCHILL = F.IDCOOKCHILL AND
                                                                PPROD.IDFINALIZACAO = F.IDFINALIZACAO AND
                                                                PPROD.IDTPPRODCHILL = F.IDTPPRODCHILL AND
                                                                PPROD.IDESTADO = F.IDESTADO AND
                                                                PPROD.IDESTADO <> 'FINALIZACAO' AND
																PPROD.NRSEQPRODACABADO = F.NRSEQPRODACABADO
                  INNER JOIN LISTA L_PROD ON ((NRLISTA         = P_LISTAPROD)        AND
                                              (F.CDPRODACABADO = SUBSTR(L_PROD.CDLISTA,1,10))AND
                                              (F.IDCOOKCHILL   = SUBSTR(L_PROD.CDLISTA,11,1))AND
                                              (F.IDFINALIZACAO = SUBSTR(L_PROD.CDLISTA,12,1))AND
                                              (SUBSTR(F.IDTPPRODCHILL,1,1) = SUBSTR(L_PROD.CDLISTA,13,1))AND
                                              (SUBSTR(F.IDESTADO,1,1)      = SUBSTR(L_PROD.CDLISTA,14,1))AND
                                              (F.IDESTADO <> 'FINALIZACAO') AND
                                              (F.NRSEQPRODACABADO          = SUBSTR(L_PROD.CDLISTA,15)))   
            WHERE F.NRPLANPROD = P_NRPLANPROD          
              AND F.IDPRODUZIR = 'S'
              AND (F.NRORG = P_NRORG)
              AND PPROD.CDPRODACABADO IS NULL                   
            ) LOOP
            -- Indica que esse cardapio para esse produto foi concluido
              UPDATE PLANPRODFILIAGREGA
                 SET IDCONCLUIDO = 'S'
               WHERE NRPLANPROD = P_NRPLANPROD
                 AND NRSEQPRODACABADO = C_FILIAGREGA.NRSEQPRODACABADO
                 AND CDPRODACABADO = C_FILIAGREGA.CDPRODACABADO
                 AND CDFILIAGREG = C_FILIAGREGA.CDFILIAGREG
                 AND CDSERVFILIAGREG = C_FILIAGREGA.CDSERVFILIAGREG
                 AND DTCONSUMO = C_FILIAGREGA.DTCONSUMO
                 AND IDCOOKCHILL = C_FILIAGREGA.IDCOOKCHILL
                 AND IDFINALIZACAO = C_FILIAGREGA.IDFINALIZACAO
                 AND IDTPPRODCHILL = C_FILIAGREGA.IDTPPRODCHILL
                 AND IDESTADO = C_FILIAGREGA.IDESTADO;
            
      END LOOP;
      
      -- Recalcula estoque e verifica estoque negativo
      ATUALIZA_ESTOQUE(V_CDFILIAL, P_DTRETIRADA, P_DTRETIRADA, P_CDFILIPROC, V_NRLANCTOEST, null);
      
      -- Verifica itens do estoque que ficaram negativos
      VD_INCONS_EST(V_CDFILIAL, P_DTRETIRADA, P_CDFILIPROC, V_NRLANCTOEST, 'S', V_VALIDA_EST);
      IF V_VALIDA_EST IS NOT NULL THEN
         V_RETORNO_VD := V_VALIDA_EST;
      END IF;
      
      -- Verifica se o inventorio esta pendente
      P_RETORNO := VD_INV_PENDENTE(V_CDFILIAL, ' ', ' ', P_DTRETIRADA);
      
      IF P_RETORNO IS NOT NULL THEN
         RETURN;
      END IF;
      
     
      -- *************************************
      -- ENTRADA DE PRODUTOS ACABADOS
      -- *************************************
      
      IF V_CDFILANCTOEST IS NULL THEN
         V_CDFILANCTOEST := P_CDFILIPROC;
         
         -- Inclui lancamento de estoque da entrada dos produtos acabados
         NOVO_CODIGO_SC('LANCTOEST'||V_CDFILANCTOEST, V_NRLANCTOESTENTR, 1);
         V_NRLANCTOESTENTR := SUBSTR(V_NRLANCTOESTENTR, 11, 10);
         
         INSERT INTO LANCTOESTOQ
           (NRORG, CDFILIAL, NRLANCESTQ, IDTPLANCTO,
            DTLANCESTQ, DSLANCESTQ, IDALTCUSMED,
            NRLANCTONF, CDFILIMOVI, CDOPERADOR,
            CDALMOXARIFE,  CDLOCALESTOQ)
         VALUES
           (P_NRORG, V_CDFILANCTOEST, V_NRLANCTOESTENTR, '2', 
            P_DTRETIRADA, P_DSLANCTOESTOQ, 'S',
            NULL, V_CDFILIAL, P_CDOPERADOR, 
            ' ', ' ');      
      
         V_NRSEQUITRETI := 0;
      
      ELSE        
        SELECT MAX(NRSEQUITEM)
          INTO V_NRSEQUITRETI
          FROM ITLANCTOEST
         WHERE NRORG = P_NRORG
           AND NRLANCESTQ = V_NRLANCTOESTENTR
           AND CDFILIAL = V_CDFILANCTOEST;
       
         
        IF V_NRSEQUITRETI IS NULL THEN
           V_NRSEQUITRETI := 0;
        END IF;
         
         V_NRSEQUITRETI := V_NRSEQUITRETI + 1;
      
      END IF;
      
      
      -- Percorre os produtos acabados incluindo-os no estoque
      FOR C_PRODACABA IN
         (
            SELECT Q.NRSEQPRODACABADO, P.CDPRODACABADO, Q.QTPRODACABADO, Q.PERDA, PT.VRFATOCONV, 
                   PF.IDPRODATIV, PF.IDCNTRESTOQ, PF.IDUTCTRLLOTE,
                   PT.CDPRODESTO, CUSTO_TOTAL, P.IDCOOKCHILL, P.IDFINALIZACAO, P.IDTPPRODCHILL, P.IDESTADO
              FROM PLANPRODACABADO P
                   INNER JOIN PRODUTO PT ON PT.CDPRODUTO = P.CDPRODACABADO
                   LEFT JOIN PRODFILI PF ON PF.CDPRODUTO = PT.CDPRODUTO AND PF.CDFILIAL = V_CDFILIAL
                   INNER JOIN
                      (SELECT NRSEQPRODACABADO, 
                              NRPLANPROD,
                              CDPRODACABADO,
                              SUM(QTAPRODUZIR + NVL(QTEXTRA,0)) AS QTPRODACABADO,
                              SUM(NVL(QTPERDA,0)) AS PERDA,                              
                              SUM(VRTOTALPRODSERV) AS CUSTO_TOTAL,
                              IDCOOKCHILL,
                              IDFINALIZACAO,
                              IDTPPRODCHILL,
                              IDESTADO
                         FROM PLANPRODFILIAGREGA
                        WHERE IDPRODUZIR = 'S' AND IDESTADO <> 'FINALIZACAO'
                       GROUP BY NRSEQPRODACABADO,
                                NRPLANPROD,
                                CDPRODACABADO,
                                IDCOOKCHILL,
                                IDFINALIZACAO,
                                IDTPPRODCHILL,
                                IDESTADO
                      HAVING (SUM(QTAPRODUZIR + NVL(QTEXTRA,0)) - SUM(NVL(QTPERDA,0))) > 0
                      ) Q ON ((Q.NRSEQPRODACABADO = P.NRSEQPRODACABADO) AND(Q.NRPLANPROD = P_NRPLANPROD) AND (Q.CDPRODACABADO = P.CDPRODACABADO) AND
                              (Q.IDCOOKCHILL = P.IDCOOKCHILL) AND (Q.IDFINALIZACAO = P.IDFINALIZACAO) AND
                              (Q.IDTPPRODCHILL = P.IDTPPRODCHILL) AND (Q.IDESTADO = P.IDESTADO))
                   INNER JOIN LISTA L_PROD ON ((NRLISTA         = P_LISTAPROD)        AND
                                               (P.CDPRODACABADO = SUBSTR(L_PROD.CDLISTA,1,10))AND
                                               (P.IDCOOKCHILL   = SUBSTR(L_PROD.CDLISTA,11,1))AND
                                               (P.IDFINALIZACAO = SUBSTR(L_PROD.CDLISTA,12,1))AND
                                               (SUBSTR(P.IDTPPRODCHILL,1,1) = SUBSTR(L_PROD.CDLISTA,13,1))AND
                                               (SUBSTR(P.IDESTADO,1,1)      = SUBSTR(L_PROD.CDLISTA,14,1))AND
                                               (P.IDESTADO <> 'FINALIZACAO') AND
                                               (P.NRSEQPRODACABADO          = SUBSTR(L_PROD.CDLISTA,15)))   
             WHERE P.NRPLANPROD = P_NRPLANPROD
               AND P.IDPRODUZIR = 'S'
               AND (P.NRORG = P_NRORG)
         ) LOOP 
         
         -- Identifica o local no estoque
         LOCALESTOQUE_PADRAO(V_CDFILIAL, C_PRODACABA.CDPRODACABADO,
                             V_CDALMOXARIFE, V_CDLOCALESTOQ);
         IF V_CDALMOXARIFE IS NULL THEN
            V_CDALMOXARIFE := ' ';
         END IF;
         IF V_CDLOCALESTOQ IS NULL THEN
            V_CDLOCALESTOQ := ' ';
         END IF;
         
         -- Verifica se o inventorio esta pendente
         P_RETORNO := VD_INV_PENDENTE(V_CDFILIAL, V_CDALMOXARIFE, V_CDLOCALESTOQ, P_DTRETIRADA);
         
         IF P_RETORNO IS NOT NULL THEN
            RETURN;
         END IF;
	
		  V_VRCUSTOMEDIO := ROUND(C_PRODACABA.CUSTO_TOTAL / C_PRODACABA.QTPRODACABADO, 3); 	
	
         -- Insere produto acabado no estoque da central
         -- Consulta o nAmero do lote e sublote
         CONSULTA_LOTE(V_IDUTILLOTE, V_CDFILIAL, V_CDALMOXARIFE,
                       V_CDLOCALESTOQ, C_PRODACABA.CDPRODACABADO,
                       V_LOTEESTQ, V_SUBLOTE);
         
         V_QTCONSUMIDA := ROUND(((C_PRODACABA.QTPRODACABADO - C_PRODACABA.PERDA)* C_PRODACABA.VRFATOCONV), 5);
         
         -- Criacao do lote
         ATUALIZA_PRODUTO_LOCAL(V_CDFILIAL, V_CDALMOXARIFE, V_CDLOCALESTOQ, C_PRODACABA.CDPRODACABADO,
                                V_LOTEESTQ, V_SUBLOTE);
         
         -- Item do lancamento do estoque
         INSERT INTO ITLANCTOEST
            (NRORG, CDFILIAL, NRLANCESTQ, NRSEQUITEM, 
             CDPRODUTO, QTLANCTOEST, VRUNILANCTO,
             VRTOTLANCTO, IDTIPOMOVI, DTLANCMOVI, 
             IDORDEMCLC, QTTOTLANCTO, CDFILIMOVI,
             CDPRODMOVI, IDEVOLESTOQ, CDALMOXARIFE, 
             CDLOCALESTOQ, NRLOTEESTQ, NRSUBLOTE, CDTIPORETI, VRLANCTOEST, VRLANCTOBRUT, VRCUSTENTR)
         VALUES
            (P_NRORG, V_CDFILANCTOEST, V_NRLANCTOESTENTR, LPAD(V_NRSEQUITRETI, 4, '0'), 
             C_PRODACABA.CDPRODACABADO, ROUND(V_QTCONSUMIDA,5), V_VRCUSTOMEDIO,
             V_VRCUSTOMEDIO * C_PRODACABA.QTPRODACABADO, '2', P_DTRETIRADA, 
             '2', ROUND(V_QTCONSUMIDA,5), V_CDFILIAL,
             C_PRODACABA.CDPRODESTO, 'S', V_CDALMOXARIFE, 
             V_CDLOCALESTOQ, V_LOTEESTQ, V_SUBLOTE, V_CDTIPORETI, V_VRCUSTOMEDIO, V_VRCUSTOMEDIO, V_VRCUSTOMEDIO * C_PRODACABA.QTPRODACABADO);
         
         -- Indica que o produto acabado foi concluido
         UPDATE PLANPRODACABADO
            SET NRSEQITLANEST = LPAD(V_NRSEQUITRETI, 4, '0'),
                IDCONCLUIDO = 'S',
                HRFIM = HORACHAR_HORADEC(TO_CHAR(SYSDATE,'hh24:mi'))
          WHERE NRPLANPROD = P_NRPLANPROD
            AND NRSEQPRODACABADO = C_PRODACABA.NRSEQPRODACABADO
            AND CDPRODACABADO = C_PRODACABA.CDPRODACABADO
            AND IDCOOKCHILL = C_PRODACABA.IDCOOKCHILL
            AND IDFINALIZACAO = C_PRODACABA.IDFINALIZACAO
            AND IDTPPRODCHILL = C_PRODACABA.IDTPPRODCHILL
            AND IDESTADO = C_PRODACABA.IDESTADO
            AND NRORG = P_NRORG
            AND IDESTADO <> 'FINALIZACAO';
         
         V_NRSEQUITRETI := V_NRSEQUITRETI + 1;
      END LOOP;

      -- Atualiza o planejamento com o numero da retirada, n do lancamento de entrada e o status
      UPDATE PLANPRODUCAO
      SET NRRETIRADA = V_NRRETIRADA,
          IDRETIRADA = 'S',
          CDFILANCTOEST = V_CDFILANCTOEST,
          NRLANCTOESTENTR = V_NRLANCTOESTENTR
       WHERE NRPLANPROD = P_NRPLANPROD AND (NRORG = P_NRORG);
       
      -- Recalcula estoque
      ATUALIZA_ESTOQUE(V_CDFILIAL, P_DTRETIRADA, P_DTRETIRADA, V_CDFILANCTOEST, V_NRLANCTOESTENTR, null);
      
      -- Verifica irregularidade no estoque      
      VD_INCONS_EST(V_CDFILIAL, P_DTRETIRADA, V_CDFILANCTOEST, V_NRLANCTOESTENTR, 'N', V_VALIDA_EST);      
      IF V_VALIDA_EST IS NOT NULL THEN
         V_RETORNO_VD := V_VALIDA_EST;
      END IF;
      
      IF (P_RETORNO IS NULL) AND (V_RETORNO_VD IS NOT NULL) THEN
         P_RETORNO := V_RETORNO_VD;
      END IF;
   -- =================================== 
   -- ======= OPERACAO DE CANCELAMENTO ====
   -- Operacao de cancelamento da retirada da materia prima
   -- e entrada dos produtos acabados
   -- ===================================   
   ELSE
      -- Confere se ja existem efetivos lancados para clientes
      FOR C_EFETIVOS IN
      (SELECT 1
         FROM CARDADIA C
              INNER JOIN PARAMFILIAL PF ON PF.CDFILIAL = C.CDFILIAL
              LEFT JOIN EFETCLIE EF ON EF.CDFILIAL = C.CDFILIAL AND
                                       EF.DTEFETCLIE = C.DTCARDAPIO AND
                                       EF.CDSERVFILI = C.CDSERVFILI 
        WHERE C.CDFILIAL = V_CDFILIAL 
          AND (C.NRORG = P_NRORG)
          AND C.NRCARDAPIO = V_NRCARDAPIO
          AND PF.DSPARAMFATFI = 'S'
          AND EF.NRAPURACFAT IS NOT NULL
          AND (EF.QTCOMEFETCLI IS NOT NULL OR EF.QTDOAEFETCLI IS NOT NULL OR EF.QTFUNEFETCLI IS NOT NULL) 
      ) LOOP
         P_RETORNO := 'ERR_EFET_FATU;';
         RETURN;
      END LOOP;
      
      -- Apaga os items da retirada da materia prima
      FOR C_ITRETIRADA IN
          (SELECT R.NRSEQPRODACABADO, R.NRPLANPROD, R.CDPRODACABADO, R.CDFILIAGREG, 
                  R.CDSERVFILIAGREG, R.DTCONSUMO, R.CDPRODUTO, R.NRSEQITRETI,
                  SUM(ROUND(R.QTPRODRECEPRAT, 5)) AS QTPRODUTO,
                  SUM(ROUND(R.QTAPRODUZIR, 5)) AS QTAPRODUZIR,
                  SUM(ROUND((R.QTAPRODUZIR) * R.VRUNITRECEPRAT, 3)) VRTOTAL,
                  SUM(R.QTEXTRA) AS QTEXTRA, SUM(R.QTDEVOLVIDA) AS QTDEVOLVIDA,
                  R.IDCOOKCHILL, R.IDFINALIZACAO, R.IDTPPRODCHILL, R.IDESTADO
             FROM PLANRECPROD R
                  INNER JOIN LISTA L_PROD ON ((NRLISTA         = P_LISTAPROD)        AND
                                              (R.CDPRODACABADO = SUBSTR(L_PROD.CDLISTA,1,10))AND
                                              (R.IDCOOKCHILL   = SUBSTR(L_PROD.CDLISTA,11,1))AND
                                              (R.IDFINALIZACAO = SUBSTR(L_PROD.CDLISTA,12,1))AND
                                              (SUBSTR(R.IDTPPRODCHILL,1,1) = SUBSTR(L_PROD.CDLISTA,13,1))AND
                                              (SUBSTR(R.IDESTADO,1,1)      = SUBSTR(L_PROD.CDLISTA,14,1))AND
                                              (R.NRSEQPRODACABADO          = SUBSTR(L_PROD.CDLISTA,15))) AND
                                              (R.IDESTADO <> 'FINALIZACAO')
            WHERE R.NRPLANPROD = P_NRPLANPROD
              AND R.NRSEQITRETI IS NOT NULL
            GROUP BY R.NRSEQPRODACABADO, R.NRPLANPROD, R.CDPRODACABADO, R.CDFILIAGREG, 
                     R.CDSERVFILIAGREG, R.DTCONSUMO, R.CDPRODUTO, R.NRSEQITRETI,
                     R.IDCOOKCHILL, R.IDFINALIZACAO, R.IDTPPRODCHILL, R.IDESTADO) LOOP
              
         --  VERIFICA SE JA EXISTE DISTRIBUICAO EFETIVADA PARA O PRODUTO  
         BEGIN
         SELECT DISTINCT P.CDARVPROD ||' - '|| P.NMPRODUTO 
           INTO V_PRODACABADO
           FROM PRODUTO P INNER JOIN
         (SELECT PRODUTO_ACABADO(CF.CDFILAUXPRAT, CF.CDPRATO, CD.CDFILIAL, CD.CDSERVFILI) AS CDPRODACABADO 
           FROM CARDDISTPROD C
          INNER JOIN DISTPROD D
             ON D.NRDISTPROD = C.NRDISTPROD

          INNER JOIN CARDADIA CD
             ON CD.CDFILIAL    = C.CDFILIAL AND CD.NRCARDAPIO = C.NRCARDAPIO
          INNER JOIN CNFDISTCARD CF
            ON CF.NRDISTCARD                                                            = C.NRDISTCARD
         WHERE C.CDFILIAL                                                               = C_ITRETIRADA.CDFILIAGREG
           AND C.CDSERVFILI                                                             = C_ITRETIRADA.CDSERVFILIAGREG
           AND CD.DTCARDAPIO                                                            = C_ITRETIRADA.DTCONSUMO
           AND PRODUTO_ACABADO(CF.CDFILAUXPRAT, CF.CDPRATO, CD.CDFILIAL, CD.CDSERVFILI) = C_ITRETIRADA.CDPRODACABADO
           AND D.IDEFETIVADA = 'S') A
           ON (P.CDPRODUTO = A.CDPRODACABADO);              
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_PRODACABADO := NULL;
         END;


         IF V_PRODACABADO IS NOT NULL THEN
            P_RETORNO := 'ERR_DIST_EFET;' || V_PRODACABADO;
            RETURN;
         END IF;  
                             
        UPDATE ITEMRETI
           SET QTRETIRADA = QTRETIRADA - C_ITRETIRADA.QTAPRODUZIR,
               QTPREVISRETI = QTPREVISRETI - C_ITRETIRADA.QTPRODUTO,
               QTEXTRARETI = QTEXTRARETI - C_ITRETIRADA.QTEXTRA, 
               QTDEVOLVRETI = QTDEVOLVRETI - C_ITRETIRADA.QTDEVOLVIDA
          WHERE CDFILIAL = V_CDFILIAL
            AND (NRORG = P_NRORG)
            AND NRRETIRADA = V_NRRETIRADA
            AND NRSEQUITEM = C_ITRETIRADA.NRSEQITRETI;
            
         UPDATE ITLANCTOEST
            SET QTLANCTOEST = QTLANCTOEST - C_ITRETIRADA.QTPRODUTO,
                QTTOTLANCTO = QTTOTLANCTO - C_ITRETIRADA.QTAPRODUZIR,
                VRTOTLANCTO = VRTOTLANCTO - C_ITRETIRADA.VRTOTAL,
                VRUNILANCTO = CASE WHEN QTTOTLANCTO - C_ITRETIRADA.QTAPRODUZIR <= 0 THEN 0.0 
                                   ELSE (VRTOTLANCTO - C_ITRETIRADA.VRTOTAL)/(QTTOTLANCTO - C_ITRETIRADA.QTAPRODUZIR) 
                              END
          WHERE CDFILIAL = V_CDFILIPROC
            AND (NRORG = P_NRORG)
            AND NRLANCESTQ = V_NRLANCTOEST
            AND NRSEQUITEM = C_ITRETIRADA.NRSEQITRETI;
            
        
        SELECT MAX(QTRETIRADA)
          INTO V_VD_QTRETIRADA
          FROM ITEMRETI
         WHERE CDFILIAL = V_CDFILIAL
            AND (NRORG = P_NRORG)
            AND NRRETIRADA = V_NRRETIRADA
            AND NRSEQUITEM = C_ITRETIRADA.NRSEQITRETI;
            
        IF V_VD_QTRETIRADA IS NULL OR V_VD_QTRETIRADA <= 0 THEN
          DELETE FROM ITEMRETI
          WHERE CDFILIAL = V_CDFILIAL
            AND (NRORG = P_NRORG)
            AND NRRETIRADA = V_NRRETIRADA
            AND NRSEQUITEM = C_ITRETIRADA.NRSEQITRETI;
          
          DELETE FROM ITLANCTOEST
          WHERE CDFILIAL = V_CDFILIPROC
            AND (NRORG = P_NRORG)
            AND NRLANCESTQ = V_NRLANCTOEST
            AND NRSEQUITEM = C_ITRETIRADA.NRSEQITRETI;
        END IF;
            
         -- Remove vinculo com a retirada
         UPDATE PLANRECPROD
            SET NRSEQITRETI = NULL
          WHERE CDPRODUTO = C_ITRETIRADA.CDPRODUTO
            AND NRSEQPRODACABADO = C_ITRETIRADA.NRSEQPRODACABADO
            AND NRPLANPROD = P_NRPLANPROD
            AND CDPRODACABADO = C_ITRETIRADA.CDPRODACABADO
            AND CDFILIAGREG = C_ITRETIRADA.CDFILIAGREG
            AND CDSERVFILIAGREG = C_ITRETIRADA.CDSERVFILIAGREG
            AND DTCONSUMO = C_ITRETIRADA.DTCONSUMO
            AND IDCOOKCHILL = C_ITRETIRADA.IDCOOKCHILL
            AND IDFINALIZACAO = C_ITRETIRADA.IDFINALIZACAO
            AND IDTPPRODCHILL = C_ITRETIRADA.IDTPPRODCHILL
            AND IDESTADO = C_ITRETIRADA.IDESTADO
            AND NRORG = P_NRORG
            AND IDESTADO <> 'FINALIZACAO';
         
         -- Cancela conclusao
         UPDATE PLANPRODFILIAGREGA
            SET IDCONCLUIDO = 'N'
          WHERE NRPLANPROD = P_NRPLANPROD
            AND NRSEQPRODACABADO = C_ITRETIRADA.NRSEQPRODACABADO
            AND CDPRODACABADO = C_ITRETIRADA.CDPRODACABADO
            AND CDFILIAGREG = C_ITRETIRADA.CDFILIAGREG 
            AND CDSERVFILIAGREG = C_ITRETIRADA.CDSERVFILIAGREG
            AND DTCONSUMO = C_ITRETIRADA.DTCONSUMO
            AND IDCOOKCHILL = C_ITRETIRADA.IDCOOKCHILL
            AND IDFINALIZACAO = C_ITRETIRADA.IDFINALIZACAO
            AND IDTPPRODCHILL = C_ITRETIRADA.IDTPPRODCHILL
            AND IDESTADO = C_ITRETIRADA.IDESTADO
            AND NRORG = P_NRORG
            AND IDESTADO <> 'FINALIZACAO';
      END LOOP;

      -- Recalcula estoque
      ATUALIZA_ESTOQUE(V_CDFILIAL, V_DTRETIRADA, V_DTRETIRADA, V_CDFILIPROC, V_NRLANCTOEST, null);

      -- Verifica irregularidade no estoque      
      VD_INCONS_EST(V_CDFILIAL, V_DTRETIRADA, V_CDFILIPROC, V_NRLANCTOEST, 'N', V_VALIDA_EST);

      -- Apaga o item do produto
      FOR C_ITLANCTOENTR IN
          (SELECT DISTINCT P.NRSEQPRODACABADO, P.CDPRODACABADO, P.NRSEQITLANEST, P.IDCOOKCHILL, P.IDFINALIZACAO, P.IDTPPRODCHILL, P.IDESTADO
             FROM PLANPRODACABADO P
                  INNER JOIN LISTA L_PROD ON ((NRLISTA         = P_LISTAPROD)        AND
                                              (P.CDPRODACABADO = SUBSTR(L_PROD.CDLISTA,1,10))AND
                                              (P.IDCOOKCHILL   = SUBSTR(L_PROD.CDLISTA,11,1))AND
                                              (P.IDFINALIZACAO = SUBSTR(L_PROD.CDLISTA,12,1))AND
                                              (SUBSTR(P.IDTPPRODCHILL,1,1) = SUBSTR(L_PROD.CDLISTA,13,1))AND
                                              (SUBSTR(P.IDESTADO,1,1)      = SUBSTR(L_PROD.CDLISTA,14,1))AND
                                              (P.NRSEQPRODACABADO          = SUBSTR(L_PROD.CDLISTA,15))) AND
                                              (P.IDESTADO <> 'FINALIZACAO')
            WHERE P.NRPLANPROD = P_NRPLANPROD
              AND P.NRSEQITLANEST IS NOT NULL) LOOP
              
          DELETE FROM ITLANCTOEST
           WHERE CDFILIAL = V_CDFILANCTOEST
             AND (NRORG = P_NRORG)
             AND NRLANCESTQ = V_NRLANCTOESTENTR
             AND NRSEQUITEM = C_ITLANCTOENTR.NRSEQITLANEST;
             
         -- Indica que o produto acabado foi concluido
         UPDATE PLANPRODACABADO
            SET NRSEQITLANEST = NULL,
                IDCONCLUIDO = 'N',
                HRFIM = NULL,
				HRINICIO = NULL
          WHERE NRPLANPROD = P_NRPLANPROD
            AND NRSEQPRODACABADO = C_ITLANCTOENTR.NRSEQPRODACABADO
            AND CDPRODACABADO = C_ITLANCTOENTR.CDPRODACABADO
            AND IDCOOKCHILL = C_ITLANCTOENTR.IDCOOKCHILL
            AND IDFINALIZACAO = C_ITLANCTOENTR.IDFINALIZACAO
            AND IDTPPRODCHILL = C_ITLANCTOENTR.IDTPPRODCHILL
            AND IDESTADO = C_ITLANCTOENTR.IDESTADO
            AND NRORG = P_NRORG
            AND IDESTADO <> 'FINALIZACAO';
             
      END LOOP;
      
      -- Recalcula estoque
      ATUALIZA_ESTOQUE(V_CDFILIAL, V_DTRETIRADA, V_DTRETIRADA, V_CDFILANCTOEST, V_NRLANCTOESTENTR, null);

      -- Verifica irregularidade no estoque      
      VD_INCONS_EST(V_CDFILIAL, V_DTRETIRADA, V_CDFILANCTOEST, V_NRLANCTOESTENTR, 'N', V_VALIDA_EST);

      -- Verifica se a retirada/ lancamento de entrada devem ser excluidos
      BEGIN
         SELECT MAX(SS.EXISTEITEM)
           INTO V_EXISTEITEM
           FROM 
          (SELECT MAX(1) AS EXISTEITEM
             FROM ITEMRETI
            WHERE CDFILIAL = V_CDFILIAL
              AND (NRORG = P_NRORG)
              AND NRRETIRADA = V_NRRETIRADA
            UNION
           SELECT MAX(1) AS EXISTEITEM
             FROM ITLANCTOEST
            WHERE CDFILIAL = V_CDFILANCTOEST
             AND (NRORG = P_NRORG)
             AND NRLANCESTQ = V_NRLANCTOESTENTR ) SS;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_EXISTEITEM := NULL;
      END;      
      
      IF (V_EXISTEITEM IS NULL) THEN
         -- Apaga a retirada
         DELETE FROM RETIRADA
          WHERE CDFILIAL = V_CDFILIAL
            AND (NRORG = P_NRORG)
            AND NRRETIRADA = V_NRRETIRADA;      
                     
         -- Apaga o lancamento de estoque da retirada
         DELETE FROM LANCTOESTOQ
          WHERE CDFILIAL = V_CDFILIPROC
            AND (NRORG = P_NRORG)
            AND NRLANCESTQ = V_NRLANCTOEST;
            
         UPDATE CARDADIA
            SET QTCLIEFETCAR = NULL, QTFUNEFETCAR = NULL,
                QTDOAEFETCAR = NULL, QTCOMEFETCAR = NULL
          WHERE CDFILIAL = V_CDFILIAL
            AND (NRORG = P_NRORG)
            AND NRCARDAPIO = V_NRCARDAPIO;
         
         UPDATE COMPCARD
            SET QTCOMEFETPRA = NULL, QTPRODUZPRAT = NULL
          WHERE CDFILIAL = V_CDFILIAL
            AND (NRORG = P_NRORG)
            AND NRCARDAPIO = V_NRCARDAPIO;
            
         UPDATE EFETCLIE
            SET QTCOMEFETCLI = NULL, QTFUNEFETCLI = NULL,
                QTDOAEFETCLI = NULL
          WHERE CDFILIAL = V_CDFILIAL
            AND (NRORG = P_NRORG)
            AND CDSERVFILI = V_CDSERVFILI
            AND DTEFETCLIE = V_DTRETIRADA;
            
         -- Apaga o lancamento de estoque dos produtos acabados
         DELETE FROM LANCTOESTOQ
          WHERE CDFILIAL = V_CDFILANCTOEST
            AND (NRORG = P_NRORG)
            AND NRLANCESTQ = V_NRLANCTOESTENTR;
                  
         -- Atualiza o planejamento removendo as informacoes da retirada e entrada de prod. acabado
         UPDATE PLANPRODUCAO
         SET NRRETIRADA = NULL,
             IDRETIRADA = 'N',
             NRLANCTOESTENTR = NULL,
             CDFILANCTOEST = NULL
         WHERE NRPLANPROD = P_NRPLANPROD AND (NRORG = P_NRORG);
         
      END IF;
         
       -- Exclui a geracao parcial se o usuario tiver marcado a opcao
       IF P_EXCGERAPARC = 'S' THEN
          FOR C_GERACAOPARCIAL IN (
            SELECT GP.NRGERAPAPARCIAL
              FROM GERAPAPARCIAL GP
             INNER JOIN LISTA L ON L.NRLISTA = P_LISTAPROD
             WHERE GP.NRPLANPROD             = P_NRPLANPROD
               AND GP.CDPRODACABADO          = SUBSTR(L.CDLISTA,1,10)
               AND GP.IDCOOKCHILL            = SUBSTR(L.CDLISTA,11,1)
               AND GP.IDFINALIZACAO          = SUBSTR(L.CDLISTA,12,1)
               AND SUBSTR(GP.IDTPPRODCHILL,1,1) = SUBSTR(L.CDLISTA,13,1)
               AND SUBSTR(GP.IDESTADO,1,1)      = SUBSTR(L.CDLISTA,14,1)
               AND GP.NRSEQPRODACABADO          = SUBSTR(L.CDLISTA,15)
               AND GP.NRORG                     = P_NRORG
          ) LOOP
          
             -- Apaga o registro do historico da geracao parcial do produto
             DELETE FROM GERAPAPARCIAL
              WHERE NRGERAPAPARCIAL = C_GERACAOPARCIAL.NRGERAPAPARCIAL
                AND NRORG = P_NRORG;
            
          END LOOP;
       END IF;
       
   END IF;

END;
/