IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[P_EST_PROD_VD_PROC_REPROCESSAMENTO_ALL]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[P_EST_PROD_VD_PROC_REPROCESSAMENTO_ALL]
GO
GO
--EXEC P_EST_PROD_VD_PROC_REPROCESSAMENTO_ALL 0,22,'2018-06-19'
CREATE PROCEDURE P_EST_PROD_VD_PROC_REPROCESSAMENTO_ALL @QTDE_DIAS INT=860, 
														@CD_FILIAL INT=0,
														@DT_PROC DATETIME=NULL AS

SET NOCOUNT ON

--BEGIN TRY
	PRINT 'P_EST_PROD_VD_PROC_REPROCESSAMENTO_ALL - TRUNCATE 1 '+CONVERT(VARCHAR, GETDATE(), 108);
	if @QTDE_DIAS > 500
	begin
		TRUNCATE TABLE EST_PROD_CPL_VD
		TRUNCATE TABLE EST_PROD_CPL_VD_EST_PROD_VD_PENDENTE
		TRUNCATE TABLE EST_PROD_VD
	end

	--Criando calendario para processar as vendas
	DECLARE @DataIni datetime;
	DECLARE @dataFim datetime;
	DECLARE @START DATETIME, @END DATETIME;

	DECLARE @DT_MOV DATETIME;
	DECLARE @CD_CTR INT;
	IF @DT_PROC IS NULL
		BEGIN
			SET @DataIni= CONVERT(CHAR(10),GETDATE()-@QTDE_DIAS,112)
			SET @dataFim =CONVERT(CHAR(10),GETDATE(),112);

			SET @START = @DATAINI;
			SET @END = @DATAFIM;
		END
	ELSE
		BEGIN
			SET @START = @DT_PROC;
			SET @END = @DT_PROC;
		END

	CREATE TABLE #RSCALENDARIO(DT DATETIME);
	
	PRINT 'INSERT 2 '+CONVERT(VARCHAR, GETDATE(), 108);
	WITH CALENDAR(DATE)
     AS (
     SELECT @START
     UNION ALL
     SELECT DATE + 1
     FROM CALENDAR
     WHERE DATE + 1 < @END)
     INSERT INTO #RSCALENDARIO(DT)
            SELECT *
            FROM calendar OPTION(MAXRECURSION 10000); 

	--Fim da criacao do calendario
		 DECLARE ProcDataProcPend CURSOR FAST_FORWARD
		 FOR SELECT DISTINCT
				  DT
			 FROM
				#RSCALENDARIO
			 ORDER BY
				DT DESC
		 OPEN ProcDataProcPend;

		 FETCH NEXT FROM ProcDataProcPend INTO @DT_MOV;
		 WHILE @@FETCH_STATUS = 0
			 BEGIN
				PRINT 'Processando data.: '+CONVERT(CHAR(10), @DT_MOV, 103);
				PRINT 'INSERT 3 '+CONVERT(VARCHAR, GETDATE(), 108);				SET @CD_CTR=0
				SET @CD_CTR=ISNULL((SELECT
								 TOP 1 CD_CTR 
							FROM 
								GLB_DT_MOVIMENTO INNER JOIN EST_PROD_CPL_VD_LOTE_PROC_PENDENTE ON
								GLB_DT_MOVIMENTO.CD_CTR_DT_MOVIMENTO = EST_PROD_CPL_VD_LOTE_PROC_PENDENTE.CD_CTR_DT_MOVIMENTO
							WHERE
								GLB_DT_MOVIMENTO.DT_MOVIMENTO=@DT_MOV),0)				

				IF @CD_CTR=0 
					BEGIN
						 INSERT INTO EST_PROD_CPL_VD_LOTE_PROC_PENDENTE
						 (CD_CTR_DT_MOVIMENTO,
						  DT_CAD,
						  ANO_MES,
						  ANO,
						  MES
						  ,ROTINA
						 )
						SELECT 
							GLB_DT_MOVIMENTO.CD_CTR_DT_MOVIMENTO,
							GETDATE(),
							GLB_DT_MOVIMENTO.ANO_MES_MOVIMENTO,
							GLB_DT_MOVIMENTO.ANO_MOVIMENTO,
							GLB_DT_MOVIMENTO.MES_MOVIMENTO,
							OBJECT_NAME(@@PROCID)
						FROM
							 GLB_DT_MOVIMENTO 
						WHERE
							GLB_DT_MOVIMENTO.DT_MOVIMENTO=@DT_MOV

						SET @CD_CTR=IDENT_CURRENT('EST_PROD_CPL_VD_LOTE_PROC_PENDENTE')
				END
			
				PRINT 'INSERT 4 '+CONVERT(VARCHAR, GETDATE(), 108);
				INSERT INTO EST_PROD_CPL_VD_LOTE_PROC_PRC_FILIAL
				(CD_CTR,
				CD_EMP,
				CD_FILIAL
				)
				SELECT 
					DISTINCT @CD_CTR,
					PRC_FILIAL.CD_EMP,
					PRC_FILIAL.CD_FILIAL
				FROM 
					PRC_FILIAL LEFT OUTER JOIN EST_PROD_CPL_VD_LOTE_PROC_PRC_FILIAL ON
					PRC_FILIAL.CD_EMP = EST_PROD_CPL_VD_LOTE_PROC_PRC_FILIAL.CD_EMP AND
					PRC_FILIAL.CD_FILIAL = EST_PROD_CPL_VD_LOTE_PROC_PRC_FILIAL.CD_FILIAL AND
					@CD_CTR = EST_PROD_CPL_VD_LOTE_PROC_PRC_FILIAL.CD_CTR
				WHERE
					PRC_FILIAL.CD_FILIAL=@CD_FILIAL
					AND EST_PROD_CPL_VD_LOTE_PROC_PRC_FILIAL.CD_CTR IS NULL

				PRINT 'INSERT 5 '+CONVERT(VARCHAR, GETDATE(), 108);
				INSERT INTO EST_PROD_CPL_VD_LOTE_PROC_EST_PROD
				(CD_CTR,
				CD_EMP,
				CD_PROD
				)
				SELECT 
					DISTINCT @CD_CTR,
					EST_PROD.CD_EMP,
					EST_PROD.CD_PROD
				FROM 
					EST_PROD LEFT OUTER JOIN EST_PROD_CPL_VD_LOTE_PROC_EST_PROD ON
					EST_PROD.CD_EMP = EST_PROD_CPL_VD_LOTE_PROC_EST_PROD.CD_EMP AND
					EST_PROD.CD_PROD = EST_PROD_CPL_VD_LOTE_PROC_EST_PROD.CD_PROD AND
					@CD_CTR = EST_PROD_CPL_VD_LOTE_PROC_EST_PROD.CD_CTR
				WHERE
					EST_PROD_CPL_VD_LOTE_PROC_EST_PROD.CD_CTR IS NULL

				FETCH NEXT FROM ProcDataProcPend INTO @DT_MOV;
			 END;

		 CLOSE ProcDataProcPend;
		 DEALLOCATE ProcDataProcPend;

	DROP TABLE #RSCALENDARIO;

/*
	END TRY

BEGIN CATCH

	INSERT INTO ADM_ERRO (numero, severidade, estado, rotina, linha, mensagem, dtErro)
		SELECT
			ERROR_NUMBER() AS numero,
			ERROR_SEVERITY() AS severidade,
			ERROR_STATE() AS estado,
			'P_EST_PROD_VD_PROC_REPROCESSAMENTO_ALL' AS rotina,
			ERROR_LINE() AS linha,
			ERROR_MESSAGE() AS mensagem,
			GETDATE() AS dtErro;	

END CATCH
*/
PRINT 'P_EST_PROD_VD_PROC_REPROCESSAMENTO_ALL FINALIZADA!';