CREATE OR REPLACE PROCEDURE RETIRADA_INVENTARIO_PLA
(
P_CDFILIAL IN VARCHAR2,
P_NRINVRETIPLA IN VARCHAR2,
P_GRAVAR_ZERAR IN VARCHAR2,
P_CONTINUA_SEM_EFET IN VARCHAR2,
P_CDOPERADOR IN VARCHAR2,
P_NRORG IN NUMBER,
P_RETORNO OUT VARCHAR2,
P_LISTAERROS OUT NUMBER)
AS
   V_ORD NUMBER := 1;
   V_DTINICIAL DATE;
   V_DTFINAL DATE;
   V_DSINVENTRETI VARCHAR2(250);
   V_EXISTE_EFETIVOS NUMBER;
   V_QTESTOQDIA FLOAT;
   V_NRCONSPLAN VARCHAR2(10);
   V_EXISTE_NA_RETIRADAINV NUMBER;
   V_PROXITEM NUMBER;
   V_EXISTE_NA_CONSPLAN NUMBER;
   V_EXISTE_NA_PRODFILI NUMBER;
   V_EXISTE_PROD_SEM_SERV VARCHAR2(1);
   V_CDSERVRETPME VARCHAR2(5);
   V_NRRETIRADA VARCHAR2(10); 
   V_NRLANCESTQ VARCHAR2(10);
   V_NRCARDAPIO VARCHAR2(10);
   V_CDTIPCUSTEST VARCHAR2(2);      
   V_VRCUSTOPROD FLOAT;
   V_QTITEM FLOAT;
   V_CDTPRETIPADR VARCHAR2(5);
   V_CDALMOXARIFE  VARCHAR2(6);
   V_CDLOCALESTOQ  VARCHAR2(6);
   V_ESTOQOK VARCHAR2(1);
   -- Procedure auxiliar para agilizar inclusao na lista de erros
   PROCEDURE I_L(MENSAGEM IN VARCHAR2)
   AS
   BEGIN
      INSERE_LISTA_ERROS(P_CDFILIAL, MENSAGEM,
                         P_CDOPERADOR, P_NRORG, P_LISTAERROS);
     	V_ORD := V_ORD + 1;
   END;
BEGIN
	SELECT MAX(DTINIRETIPLA), MAX(DTFINRETIPLA), MAX(DSINVENTRETI)
	  INTO V_DTINICIAL, V_DTFINAL, V_DSINVENTRETI
	  FROM INVENTRETIPLA
	 WHERE CDFILIAL = P_CDFILIAL
	   AND NRINVRETIPLA = P_NRINVRETIPLA;
	-- Verifica existencia de retirada no periodo
	V_ORD := 1;
	FOR C_RETIRADAS IN
	(
		SELECT S.CDSERVFILI || ' - ' || S.NMSERVICO AS SERVICO,
		       TO_CHAR(RET.DTRETIRADA, 'DD/MM/YYYY') AS DTRETIRADA
		  FROM RETIRADA RET
		       INNER JOIN CARDADIA CD ON CD.CDFILIAL = RET.CDFILIAL AND
		                                 CD.NRCARDAPIO = RET.NRCARDAPIO
		       LEFT JOIN SERVICO S ON S.CDFILIAL = CD.CDFILIAL AND
		                              S.CDSERVFILI = CD.CDSERVFILI
		 WHERE (RET.CDFILIAL = P_CDFILIAL)
		   AND (RET.DTRETIRADA BETWEEN V_DTINICIAL AND V_DTFINAL)
		   AND (RET.CDFILIAL    = CD.CDFILIAL)
		   AND (RET.NRCARDAPIO  = CD.NRCARDAPIO)
		   AND (S.CDFILIAL      = CD.CDFILIAL)
		   AND (S.CDSERVFILI    = CD.CDSERVFILI)
	)
	LOOP
	   -- Existe retirada para o servico __0__ em __1__
		I_L(MSG('RETIRADAINVENTARIO_0001', C_RETIRADAS.SERVICO, C_RETIRADAS.DTRETIRADA));	
	END LOOP;

	-- Gerar a procedure de consumo planejado
	V_NRCONSPLAN := RETORNA_NOVO_CODIGO('CONSPLAN' || P_CDFILIAL, 1, 10);

	CONSUMO_PLANEJADO_PLA(P_CDFILIAL,
   'T',
   V_DTINICIAL, V_DTFINAL,
   'C',
   'CFP',
   'N',
   0,
   'N',
   V_NRCONSPLAN,
   '0',
   'zzzzzzzzzz',
   P_CDOPERADOR);

   IF P_GRAVAR_ZERAR = 'Z' THEN
   	BEGIN
   		SELECT MAX(TO_NUMBER(NRITINVENTRETI))
	   	  INTO V_PROXITEM
	   	  FROM ITEMINVRETIPLA
	   	 WHERE CDFILIAL = P_CDFILIAL
	   	   AND NRINVRETIPLA = P_NRINVRETIPLA;   		
   	EXCEPTION
   		WHEN OTHERS THEN
   			V_PROXITEM := 0;
   	END;

   	V_PROXITEM := NVL(V_PROXITEM, 0) + 1;

   	FOR C_PROD_EM_ESTOQUE IN (
   		SELECT P.CDPRODUTO
			  FROM POSESTDIA P
			 WHERE P.CDFILIAL = P_CDFILIAL
			   AND (P.CDALMOXARIFE = ' ')
			   AND (P.CDLOCALESTOQ = ' ')
			   AND (P.NRLOTEESTQ = ' ')
			   AND (P.NRSUBLOTE = ' ')
			   AND P.QTESTOQDIA > 0
			   AND P.DTPOSIESTQ = (SELECT MAX(E.DTPOSIESTQ)
			                         FROM POSESTDIA E
			                        WHERE E.CDFILIAL = P_CDFILIAL
			                          AND (E.CDALMOXARIFE = ' ')
											  AND (E.CDLOCALESTOQ = ' ')
											  AND (E.NRLOTEESTQ = ' ')
											  AND (E.NRSUBLOTE = ' ')
			                          AND E.DTPOSIESTQ <= V_DTFINAL + 1
			                          AND P.CDPRODUTO = E.CDPRODUTO)
			 ORDER BY P.CDPRODUTO
   	)LOOP
   		SELECT COUNT(1)
   		  INTO V_EXISTE_NA_RETIRADAINV
   		  FROM ITEMINVRETIPLA
   		 WHERE CDFILIAL = P_CDFILIAL
   		   AND NRINVRETIPLA = P_NRINVRETIPLA
   		   AND CDPRODUTO = C_PROD_EM_ESTOQUE.CDPRODUTO; 

   		IF V_EXISTE_NA_RETIRADAINV = 0 THEN
   			INSERT INTO ITEMINVRETIPLA
				(CDFILIAL, NRINVRETIPLA, NRITINVENTRETI,
				 QTITINVENTRETI, CDPRODUTO)
				VALUES 
				(P_CDFILIAL, P_NRINVRETIPLA, LPAD(TO_CHAR(V_PROXITEM), 4, '0'),
				 0.0, C_PROD_EM_ESTOQUE.CDPRODUTO);

   			V_PROXITEM := V_PROXITEM + 1;
   		END IF;
   	END LOOP;
   END IF;

	-- Verifica efetivos no periodo
	SELECT SUM(QTCOMEFETCAR)
	  INTO V_EXISTE_EFETIVOS
	  FROM CARDADIA CAR
	 WHERE CDFILIAL = P_CDFILIAL
	   AND DTCARDAPIO BETWEEN V_DTINICIAL AND V_DTFINAL
	   AND EXISTS (SELECT CDSERVCPLA
	                 FROM CONSPLAN CON
	                WHERE CON.NRCONSPLAN = V_NRCONSPLAN
	                  AND CON.CDFILICPLA = CAR.CDFILIAL
	                  AND CON.DTCONSPLAN = CAR.DTCARDAPIO);


	IF V_EXISTE_EFETIVOS IS NULL OR V_EXISTE_EFETIVOS <= 0 THEN
		IF P_CONTINUA_SEM_EFET IS NULL OR P_CONTINUA_SEM_EFET = 'N' THEN
			P_RETORNO := 'CONTINUAR_SEM_EFETIVOS';
			RETURN;	
		END IF;
	END IF; 

	V_EXISTE_PROD_SEM_SERV := 'N';

	SELECT MAX(CDSERVRETPME), MAX(CDTPRETIPADR)
	  INTO V_CDSERVRETPME, V_CDTPRETIPADR
 	  FROM PARAMPLANEJA
 	 WHERE CDFILIAL = P_CDFILIAL;

	-- Percorre os produtos da retirada consistindo habilitacao em estoque e saldo em estoque
	FOR C_PROD_RETIRADA IN 
	(SELECT PD.CDPRODESTO, PD.CDPRODUTO, PD.CDARVPROD, PD.NMPRODUTO, IT.QTITINVENTRETI, 
		     CASE WHEN NVL(PD.VRFATOCONV, 1.0) = 0.0 THEN 1.00 ELSE NVL(PD.VRFATOCONV, 1.0) END AS VRFATOCONV,
           CASE WHEN IDCNTRESTOQ = 'N' THEN 'S' ELSE 'N' END AS NAO_CONTROLA_ESTOQUE
	   FROM INVENTRETIPLA INV
	        INNER JOIN ITEMINVRETIPLA IT ON INV.CDFILIAL = IT.CDFILIAL AND
	                                        INV.NRINVRETIPLA = IT.NRINVRETIPLA
           LEFT JOIN PRODUTO PD ON PD.CDPRODUTO = IT.CDPRODUTO
           LEFT JOIN PRODFILI PR ON PR.CDFILIAL = IT.CDFILIAL AND
                                    PR.CDPRODUTO = IT.CDPRODUTO
	  WHERE INV.CDFILIAL = P_CDFILIAL
	    AND INV.NRINVRETIPLA = P_NRINVRETIPLA
	    AND PD.CDPRODUTO = IT.CDPRODUTO
	) LOOP
		IF C_PROD_RETIRADA.NAO_CONTROLA_ESTOQUE = 'S' THEN
		   -- Produto __0__ nao controla estoque na unidade
			I_L(MSG('RETIRADAINVENTARIO_0002', C_PROD_RETIRADA.CDARVPROD || ' - ' || C_PROD_RETIRADA.NMPRODUTO));			
		END IF;

		SELECT MAX(PE.QTESTOQDIA)
		  INTO V_QTESTOQDIA
		  FROM POSESTDIA PE
		 WHERE PE.CDPRODUTO = C_PROD_RETIRADA.CDPRODESTO
         AND PE.CDFILIAL = P_CDFILIAL
         AND (PE.CDALMOXARIFE = ' ')
		   AND (PE.CDLOCALESTOQ = ' ')
		   AND (PE.NRLOTEESTQ = ' ')
		   AND (PE.NRSUBLOTE = ' ')
         AND PE.DTPOSIESTQ = (SELECT MAX(P.DTPOSIESTQ)
                                FROM POSESTDIA P
                               WHERE P.CDFILIAL = P_CDFILIAL
                                 AND P.CDPRODUTO = C_PROD_RETIRADA.CDPRODUTO
                                 AND (P.CDALMOXARIFE = ' ')
										   AND (P.CDLOCALESTOQ = ' ')
										   AND (P.NRLOTEESTQ = ' ')
										   AND (P.NRSUBLOTE = ' ')
                                 AND P.DTPOSIESTQ <= V_DTFINAL);
   	

   	V_QTESTOQDIA := NVL(V_QTESTOQDIA, 0.0);

   	IF C_PROD_RETIRADA.QTITINVENTRETI * C_PROD_RETIRADA.VRFATOCONV > V_QTESTOQDIA THEN
   		-- Quantidade informada para o produto __0__ nao disponivel no estoque
   		I_L(MSG('RETIRADAINVENTARIO_0003', C_PROD_RETIRADA.CDARVPROD || ' - ' || C_PROD_RETIRADA.NMPRODUTO));
   	END IF;

   	SELECT COUNT(1)
   	  INTO V_EXISTE_NA_CONSPLAN
   	  FROM CONSPLAN C   	  
   	 WHERE C.NRCONSPLAN = V_NRCONSPLAN
   	   AND C.CDFILICPLA = P_CDFILIAL
         AND C.CDPRODCPLA = C_PROD_RETIRADA.CDPRODUTO;

   	 IF V_EXISTE_NA_CONSPLAN = 0 THEN
   	    IF V_CDSERVRETPME IS NULL THEN
   	    	-- Produto __0__ nao relacionado a servico planejado e o servico para retirada automatica nao esta informado em parametros de planejamento.
   			I_L(MSG('RETIRADAINVENTARIO_0004', C_PROD_RETIRADA.CDARVPROD || ' - ' || C_PROD_RETIRADA.NMPRODUTO));
   	    END IF;
   	    V_EXISTE_PROD_SEM_SERV := 'S';
   	 END IF;

   	 SELECT COUNT(1)
   	   INTO V_EXISTE_NA_PRODFILI
   	   FROM PRODFILI
   	  WHERE CDFILIAL = P_CDFILIAL
   	    AND CDPRODUTO = C_PROD_RETIRADA.CDPRODUTO;

   	 IF V_EXISTE_NA_PRODFILI = 0 THEN
   	    -- Produto __0__ nao relacionado a unidade
   		 I_L(MSG('RETIRADAINVENTARIO_0005', C_PROD_RETIRADA.CDARVPROD || ' - ' || C_PROD_RETIRADA.NMPRODUTO));
   	 END IF;

   	 IF (C_PROD_RETIRADA.CDPRODESTO <> C_PROD_RETIRADA.CDPRODUTO) THEN
	   	 SELECT COUNT(1)
	   	   INTO V_EXISTE_NA_PRODFILI
	   	   FROM PRODFILI
	   	  WHERE CDFILIAL = P_CDFILIAL
	   	    AND CDPRODUTO = C_PROD_RETIRADA.CDPRODUTO;

	   	 IF V_EXISTE_NA_PRODFILI = 0 THEN
	   	 	-- Produto de estoque do produto __0__ nao relacionado a unidade
	   	 	I_L(MSG('RETIRADAINVENTARIO_0006', C_PROD_RETIRADA.CDARVPROD || ' - ' || C_PROD_RETIRADA.NMPRODUTO));
	   	 END IF;
	    END IF;

   	 LOCALESTOQUE_PADRAO(P_CDFILIAL, C_PROD_RETIRADA.CDPRODUTO, V_CDALMOXARIFE, V_CDLOCALESTOQ, 'PLA');
	END LOOP;

	IF V_EXISTE_PROD_SEM_SERV = 'S' AND V_CDSERVRETPME IS NULL THEN
		-- Existem produtos nao relacionados a servico planejado. O servico para retirada automatica deve ser informado em parametros de planejamento para conclusao da operacao.
   	I_L(MSG('RETIRADAINVENTARIO_0007'));
	END IF;

	IF P_LISTAERROS IS NOT NULL THEN
		P_RETORNO := 'ERRO';
		RETURN;
	END IF;

	GERA_RETIRADA_INVENTARIO(
   P_CDFILIAL, 
   V_DTINICIAL, 
   V_DTFINAL, 
   V_NRCONSPLAN, 
   P_CDOPERADOR, 
   P_NRINVRETIPLA, 
   P_CDFILIAL,
   V_DSINVENTRETI
   );

	IF V_EXISTE_PROD_SEM_SERV = 'S' THEN
		SELECT MAX(CDTIPCUSTEST)
		  INTO V_CDTIPCUSTEST
		  FROM PARAMFILIAL
		 WHERE CDFILIAL = P_CDFILIAL;

	   SELECT MAX(RE.NRCARDAPIO), MAX(RE.NRRETIRADA), MAX(RE.NRLANCESTQ)
   	  INTO V_NRCARDAPIO, V_NRRETIRADA, V_NRLANCESTQ
		  FROM RETIRADA RE
		       INNER JOIN CARDADIA CA ON CA.CDFILIAL = RE.CDFILIAL AND
		                                 CA.NRCARDAPIO = RE.NRCARDAPIO
		 WHERE RE.CDFILIAL = P_CDFILIAL
			AND CA.CDSERVFILI = V_CDSERVRETPME
			AND RE.DTRETIRADA = V_DTFINAL;

		IF V_NRRETIRADA IS NULL THEN
			SELECT MAX(NRCARDAPIO)
			  INTO V_NRCARDAPIO
			  FROM CARDADIA
			 WHERE CDFILIAL = P_CDFILIAL
			   AND CDSERVFILI = V_CDSERVRETPME
			   AND DTCARDAPIO = V_DTFINAL;

			IF V_NRCARDAPIO IS NULL THEN
				V_NRCARDAPIO := RETORNA_NOVO_CODIGO('CARDAPIO'||P_CDFILIAL, 1, 10);
				INSERT INTO CARDADIA
				  (CDFILIAL, NRCARDAPIO, CDSERVFILI, 
				   CDOPERADOR, DTCARDAPIO, DTMESCARD)
				VALUES
				  (P_CDFILIAL, V_NRCARDAPIO, V_CDSERVRETPME,
				   P_CDOPERADOR, V_DTFINAL, TRUNC(V_DTFINAL));
			END IF;

			V_NRRETIRADA := RETORNA_NOVO_CODIGO('RETIRADA' || P_CDFILIAL, 1, 10);
			V_NRLANCESTQ := RETORNA_NOVO_CODIGO('LANCTOEST' || P_CDFILIAL, 1, 10);

			INSERT INTO LANCTOESTOQ
			(CDFILIAL, NRLANCESTQ, IDTPLANCTO, DTLANCESTQ,
			 CDFILIMOVI, IDALTCUSMED, CDOPERADOR, DSLANCESTQ)
			VALUES
			(P_CDFILIAL, V_NRLANCESTQ, '3', V_DTFINAL,
			 P_CDFILIAL, 'N', P_CDOPERADOR, V_DSINVENTRETI);

			INSERT INTO RETIRADA
			(CDFILIAL, NRRETIRADA, NRCARDAPIO, DTRETIRADA, CDFILANCESTQ, NRLANCESTQ, IDRETIPRAT, NRINVRETIPLA)
			VALUES
			(P_CDFILIAL, V_NRRETIRADA, V_NRCARDAPIO, V_DTFINAL, P_CDFILIAL, V_NRLANCESTQ, 'N', P_NRINVRETIPLA);

			V_PROXITEM := 1;
		ELSE
			BEGIN
				SELECT MAX(TO_NUMBER(NRSEQUITRETI))
				  INTO V_PROXITEM
				  FROM ITEMRETI
				 WHERE CDFILIAL = P_CDFILIAL
				   AND NRCARDAPIO = V_NRCARDAPIO
			  		AND NRRETIRADA = V_NRRETIRADA;
			EXCEPTION
				WHEN OTHERS THEN
					V_PROXITEM := 0;
			END;
			V_PROXITEM := NVL(V_PROXITEM, 0) + 1;
		END IF;

	   -- Retirada para os produtos nao relacionados a servicos na consplan
	   FOR C_PROD_N_CONSPLAN IN (
	   	SELECT PD.CDPRODUTO, PD.CDARVPROD, PD.NMPRODUTO, IT.QTITINVENTRETI,
	   	       PD.CDPRODESTO, 
	   	       CASE WHEN NVL(PD.VRFATOCONV, 1.0) = 0.0 THEN 0.0 ELSE NVL(PD.VRFATOCONV, 1.0) END AS VRFATOCONV
			  FROM INVENTRETIPLA INV
			       INNER JOIN ITEMINVRETIPLA IT ON INV.CDFILIAL = IT.CDFILIAL AND
			                                       INV.NRINVRETIPLA = IT.NRINVRETIPLA
		          LEFT JOIN PRODUTO PD ON PD.CDPRODUTO = IT.CDPRODUTO
		          LEFT JOIN PRODFILI PR ON PR.CDFILIAL = IT.CDFILIAL AND
		                                   PR.CDPRODUTO = IT.CDPRODUTO
			 WHERE INV.CDFILIAL = P_CDFILIAL
			   AND INV.NRINVRETIPLA = P_NRINVRETIPLA
			   AND PD.CDPRODUTO = IT.CDPRODUTO
			   AND NOT EXISTS (SELECT 1
							    	   FROM CONSPLAN C   	  
							   	  WHERE C.NRCONSPLAN = V_NRCONSPLAN
							   	    AND C.CDFILICPLA = P_CDFILIAL
							          AND C.CDPRODCPLA = IT.CDPRODUTO)
	   ) LOOP

	   	-- Informacoes do produto em estoque na data da retirada
	   	SELECT MAX(D.QTESTOQDIA) AS QTESTOQDIA,
			       MAX(CUSTO_PRODUTO(P_CDFILIAL, C_PROD_N_CONSPLAN.CDPRODESTO, NVL(V_CDTIPCUSTEST, 3), (V_DTFINAL + 1), TRUNC(SYSDATE))) AS  VRCUSTPROD
			  INTO V_QTESTOQDIA, V_VRCUSTOPROD
			  FROM POSESTDIA D
			 WHERE (D.CDFILIAL = P_CDFILIAL)
			   AND (D.CDALMOXARIFE = ' ')
			   AND (D.CDLOCALESTOQ = ' ')
			   AND (D.NRLOTEESTQ = ' ')
			   AND (D.NRSUBLOTE = ' ')
			   AND (D.CDPRODUTO = C_PROD_N_CONSPLAN.CDPRODESTO)
			   AND (DTPOSIESTQ = (SELECT MAX(DTPOSIESTQ)
			                        FROM POSESTDIA
			                       WHERE (CDFILIAL = P_CDFILIAL)
			                         AND (CDALMOXARIFE = ' ')
			                         AND (CDLOCALESTOQ = ' ')
			                         AND (NRLOTEESTQ =  ' ')
			                         AND (NRSUBLOTE =  ' ')
			                         AND (CDPRODUTO = C_PROD_N_CONSPLAN.CDPRODESTO)
			                         AND (DTPOSIESTQ <= (V_DTFINAL + 1))));

			V_QTITEM := ROUND(V_QTESTOQDIA - C_PROD_N_CONSPLAN.VRFATOCONV * C_PROD_N_CONSPLAN.QTITINVENTRETI, 5);
			
			IF V_QTITEM > 0 THEN

				-- Insere nos itens de lancamento do estoque
				INSERT INTO ITLANCTOEST
				(CDFILIAL, NRLANCESTQ, NRSEQUITEM, CDPRODUTO, QTLANCTOEST, VRUNILANCTO,
				 QTTOTLANCTO, CDPRODMOVI, CDFILIMOVI, CDALMOXARIFE, CDLOCALESTOQ, NRLOTEESTQ,
				 NRSUBLOTE, IDTIPOMOVI, IDEVOLESTOQ, DTLANCMOVI, IDORDEMCLC)
				VALUES
				(P_CDFILIAL, V_NRLANCESTQ, LPAD(TO_CHAR(V_PROXITEM), 4, '0'), C_PROD_N_CONSPLAN.CDPRODESTO, 
				 V_QTITEM, V_VRCUSTOPROD,
				 V_QTITEM, C_PROD_N_CONSPLAN.CDPRODESTO, P_CDFILIAL, ' ', ' ', ' ',
				 ' ', '3', 'S', V_DTFINAL, '0');

				-- Insere o item na retirada
				INSERT INTO ITEMRETI
				(CDFILIAL, NRRETIRADA, NRCARDAPIO, NRSEQUITRETI, 
				 CDPRODUTO, QTRETIRADA, CDFIITLANEST, 
				 NRLANCESTQ, NRSEQUITEM, CDTIPORETI)
				VALUES
				(P_CDFILIAL, V_NRRETIRADA, V_NRCARDAPIO, LPAD(TO_CHAR(V_PROXITEM), 4, '0'), 
				 C_PROD_N_CONSPLAN.CDPRODESTO, V_QTITEM, P_CDFILIAL, 
				 V_NRLANCESTQ, LPAD(TO_CHAR(V_PROXITEM), 4, '0'), V_CDTPRETIPADR);

				V_PROXITEM := V_PROXITEM + 1;
			END IF;			
	   END LOOP;
	END IF;
	
	-- Ajuste do inventario de acordo com o informado no romaneio
	V_NRLANCESTQ := RETORNA_NOVO_CODIGO('LANCTOEST' || P_CDFILIAL, 1, 10);

	INSERT INTO LANCTOESTOQ
	(CDFILIAL, NRLANCESTQ, IDTPLANCTO, DTLANCESTQ,
	 CDFILIMOVI, IDALTCUSMED, CDOPERADOR, DSLANCESTQ)
	VALUES
	(P_CDFILIAL, V_NRLANCESTQ, '1', V_DTFINAL,
	 P_CDFILIAL, 'N', P_CDOPERADOR, V_DSINVENTRETI);

	V_PROXITEM := 1;

   FOR C_ITENS IN (
   	SELECT PD.CDPRODUTO, PD.CDARVPROD, PD.NMPRODUTO, IT.QTITINVENTRETI,
   	       PD.CDPRODESTO, NVL(PD.VRFATOCONV, 1.0) AS VRFATOCONV,
   	       CUSTO_PRODUTO(P_CDFILIAL, PD.CDPRODESTO, NVL(V_CDTIPCUSTEST, 3), (V_DTFINAL + 1), TRUNC(SYSDATE)) AS VRCUSTPROD
		  FROM INVENTRETIPLA INV
		       INNER JOIN ITEMINVRETIPLA IT ON INV.CDFILIAL = IT.CDFILIAL AND
		                                       INV.NRINVRETIPLA = IT.NRINVRETIPLA
	          LEFT JOIN PRODUTO PD ON PD.CDPRODUTO = IT.CDPRODUTO
	          LEFT JOIN PRODFILI PR ON PR.CDFILIAL = IT.CDFILIAL AND
	                                   PR.CDPRODUTO = IT.CDPRODUTO
		 WHERE INV.CDFILIAL = P_CDFILIAL
		   AND INV.NRINVRETIPLA = P_NRINVRETIPLA
		   AND PD.CDPRODUTO = IT.CDPRODUTO
		   AND IT.QTITINVENTRETI >= 0
   ) LOOP
   	V_QTITEM := ROUND(C_ITENS.VRFATOCONV * C_ITENS.QTITINVENTRETI, 5);
		-- Insere nos itens de lancamento do estoque
		INSERT INTO ITLANCTOEST
		(CDFILIAL, NRLANCESTQ, NRSEQUITEM, CDPRODUTO, QTLANCTOEST, VRUNILANCTO,
		 QTTOTLANCTO, CDPRODMOVI, CDFILIMOVI, CDALMOXARIFE, CDLOCALESTOQ, NRLOTEESTQ,
		 NRSUBLOTE, IDTIPOMOVI, IDEVOLESTOQ, DTLANCMOVI, IDORDEMCLC)
		VALUES
		(P_CDFILIAL, V_NRLANCESTQ, LPAD(TO_CHAR(V_PROXITEM), 4, '0'), C_ITENS.CDPRODESTO, 
		 V_QTITEM, C_ITENS.VRCUSTPROD,
		 V_QTITEM, C_ITENS.CDPRODESTO, P_CDFILIAL, ' ', ' ', ' ',
		 ' ', '1', 'S', V_DTFINAL, 'U');
		
		V_PROXITEM := V_PROXITEM + 1;
   END LOOP;

   ATUALIZA_ESTOQUE(P_CDFILIAL, V_DTFINAL, 
						  TRUNC(SYSDATE), V_DTFINAL, V_NRLANCESTQ);

   DELETE FROM CONSPLAN WHERE CDFILICPLA = P_CDFILIAL AND NRCONSPLAN = V_NRCONSPLAN;

   UPDATE INVENTRETIPLA
      SET IDRETIEFET = 'S'
    WHERE CDFILIAL = P_CDFILIAL
	   AND NRINVRETIPLA = P_NRINVRETIPLA;

	P_RETORNO := 'SUCESSO';
END;
/