IF EXISTS ( SELECT * 
            FROM   sysobjects 
            WHERE  id = object_id(N'CPJ_Turnos_Generar') 
                   and OBJECTPROPERTY(id, N'IsProcedure') = 1 )
BEGIN
    DROP PROCEDURE CPJ_Turnos_Generar
END
GO


CREATE PROCEDURE CPJ_Turnos_Generar		@pJson VARCHAR(8000)
AS 
SET NOCOUNT ON 
/*Variables recibidas por par▀metro a traves del JSON*/
DECLARE @pFlagUsarTrans			TINYINT
DECLARE @pModoDebug				TINYINT
DECLARE @pId_Usuario			SMALLINT
DECLARE @pId_Sector				SMALLINT
DECLARE @pId_Recurso			INT
DECLARE @pFecha_Desde			DATETIME
DECLARE @pFecha_Hasta			DATETIME
DECLARE @pId_Contrato           INT

SET @pFlagUsarTrans			= ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJson,'FlagUsarTrans')), 0)
SET @pModoDebug				= ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJson,'ModoDebug')), 0)
SET @pId_Usuario			= ISNULL(CONVERT(SMALLINT, dbo.CF_JSON_VALUE(@pJson,'Id_Usuario')), 0)
SET @pId_Sector				= ISNULL(CONVERT(SMALLINT, dbo.CF_JSON_VALUE(@pJson,'Id_Sector')), 0)
SET @pId_Recurso			= ISNULL(CONVERT(INT, dbo.CF_JSON_VALUE(@pJson,'Id_Recurso')), 0)
SET @pFecha_Desde			= ISNULL(CONVERT(DATETIME, dbo.CF_JSON_VALUE(@pJson,'Fecha_Desde')), '19000101')
SET @pFecha_Hasta			= ISNULL(CONVERT(DATETIME, dbo.CF_JSON_VALUE(@pJson,'Fecha_Hasta')), '19000101')
SET @pId_Contrato			= ISNULL(CONVERT(INT, dbo.CF_JSON_VALUE(@pJson,'Id_Contrato')), 0)
/*FIN Variables recibidas por par▀metro a traves del JSON*/

/*Variables Locales*/
DECLARE @cadaDiaAGenerar					DATETIME
DECLARE @Id_Recurso							INT
DECLARE @Id_Recurso_Horario					INT
DECLARE @Dia_De_La_Semana					VARCHAR(50)
DECLARE @Hora_Inicio						DATETIME
DECLARE @Hora_Fin							DATETIME
DECLARE @Frecuencia							INT
DECLARE @cadaMinutoAGenerar					DATETIME
DECLARE @fechaCompletaAGenerar				DATETIME
DECLARE @Flag_Id_Recurso_Bloq				INT
DECLARE @Cantidad_Turnos_Generados 			INT
DECLARE @Flag_Ya_Existe_Turno				TINYINT
DECLARE @Cupo_Max_Compartido				INT
DECLARE @Cant_Cupo_Compartido_Generados 	INT
DECLARE @Agregar_Contratos 					TINYINT
DECLARE @Flag_Feriado						TINYINT
DECLARE @Flag_Es_Dia_Feriado				TINYINT
/*FIN Variables Locales*/

/*
 * LOG CAMBIOS:
 * 14/12/2020. Se agrega compatiblidad con el campo Flag_Feriado de la tabla Empresas_Sedes_Sec_Recuros_Horarios
*/

BEGIN TRY
	IF @pFlagUsarTrans <> 0 
	BEGIN
		BEGIN TRAN
	END

	IF(@pModoDebug = 1)
	BEGIN
		PRINT 'Ingreso a Stored Procedure: CPJ_Turnos_Generar'
		PRINT 'Parametros: '+ @pJson  
	END
	
	/*===================================================================*/	
	
	SET @Cantidad_Turnos_Generados = 0
	
	/*===================================================================*/	
	
	IF @pFecha_Desde = 0 RAISERROR ('Parameter "Fecha_Desde" mandatory', 16,  1)
	IF @pFecha_Hasta = 0 RAISERROR ('Parameter "Fecha_Hasta" mandatory', 16,  1)
	IF @pFecha_Desde > @pFecha_Hasta  RAISERROR ('Parameter "Fecha_Hasta" greater than or equal Parameter "Fecha_Desde"', 16,  1)
	
	IF(@pId_Sector = 0 AND @pId_Recurso = 0 AND @pId_Contrato = 0)
	BEGIN
		IF @pId_Sector = 0 RAISERROR ('Parameter "Id_Sector" mandatory', 16,  1)
		IF @pId_Recurso = 0 RAISERROR ('Parameter "Id_Recurso" mandatory', 16,  1)
		IF @pId_Contrato = 0 RAISERROR ('Parameter "Id_Contrato" mandatory', 16,  1)
	END		
	
	--Primer dia a generar
	SET @cadaDiaAGenerar = @pFecha_Desde	
	
	WHILE(@cadaDiaAGenerar <= @pFecha_Hasta)  
	BEGIN		
		SET @Dia_De_La_Semana = DATENAME(WEEKDAY, @cadaDiaAGenerar) --Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
		IF(@pModoDebug = 1)
		BEGIN
			PRINT 'Dia: ' + @Dia_De_La_Semana + '(' + CONVERT(VARCHAR(10), @cadaDiaAGenerar, 102) + ')'
		END
		
		SET @Flag_Es_Dia_Feriado = ISNULL((	SELECT MAX(1) 
											FROM Tab_Feriados
											WHERE
											Dia = DATEPART(DAY, @cadaDiaAGenerar)
											AND Mes = DATEPART(MONTH, @cadaDiaAGenerar))
										, 0)
		IF(@Flag_Es_Dia_Feriado = 1)
		BEGIN
			IF(@pModoDebug = 1)
			BEGIN
				PRINT 'Es un Dia Feriado segun la Tabla Tab_Feriados.'
			END
		END	
	
		--POR SECTOR
		IF(@pId_Sector <> 0 AND @pId_Recurso = 0)
		BEGIN
			IF(@pModoDebug = 1)
			BEGIN
				PRINT 'Generacion POR SECTOR. pId_Sector: ' + CONVERT(VARCHAR(10), @pId_Sector)
			END
			--Recorro todos los recursos que tiene el sector		
			DECLARE curGenerarRecursosxDia CURSOR FOR
			SELECT Id_Recurso 
			FROM Empresas_Sedes_Sec_Recursos
			WHERE
			Activo = 1
			AND Id_Sector = @pId_Sector

			OPEN curGenerarRecursosxDia
			FETCH NEXT FROM curGenerarRecursosxDia INTO @Id_Recurso
			WHILE @@FETCH_STATUS = 0
			BEGIN
				IF(@pModoDebug = 1)
				BEGIN
					PRINT 'Id_Recurso: ' + CONVERT(VARCHAR(10), @Id_Recurso)
				END
				
				--Recorro todos los horarios que tiene el recurso
				DECLARE curGenerarRecursosxDiaxHorario CURSOR FOR
				SELECT Id_Recurso_Horario, Hora_Inicio, Hora_Fin, Frecuencia, ISNULL(Cupo_Max_Compartido, 0), ISNULL(Flag_Feriado, 0)
				FROM Empresas_Sedes_Sec_Recuros_Horarios
				WHERE
				Activo = 1
				AND Id_Recurso = @Id_Recurso
				AND (	(ISNULL(Lunes, 0) = 1  AND (@Dia_De_La_Semana = 'Monday'  OR  @Dia_De_La_Semana = 'Lunes'))  OR
						(ISNULL(Martes, 0) = 1 AND (@Dia_De_La_Semana = 'Tuesday' OR  @Dia_De_La_Semana = 'Martes')) OR
						(ISNULL(Miercoles, 0) = 1 AND (@Dia_De_La_Semana = 'Wednesday' OR @Dia_De_La_Semana = 'Miercoles' OR @Dia_De_La_Semana = 'Mi'+ CHAR(233) +'rcoles')) OR
						(ISNULL(Jueves, 0) = 1  AND (@Dia_De_La_Semana = 'Thursday' OR  @Dia_De_La_Semana = 'Jueves')) OR
						(ISNULL(Viernes, 0) = 1 AND (@Dia_De_La_Semana = 'Friday' OR @Dia_De_La_Semana = 'Viernes')) OR
						(ISNULL(Sabado, 0) = 1  AND (@Dia_De_La_Semana = 'Saturday'  OR @Dia_De_La_Semana = 'Sabado' OR @Dia_De_La_Semana = 'S'+ CHAR(225) +'bado')) OR
						(ISNULL(Domingo, 0) = 1 AND (@Dia_De_La_Semana = 'Sunday' OR @Dia_De_La_Semana = 'Domingo'))
					)
				
				SET @Cant_Cupo_Compartido_Generados = 0

				OPEN curGenerarRecursosxDiaxHorario
				FETCH NEXT FROM curGenerarRecursosxDiaxHorario INTO @Id_Recurso_Horario, @Hora_Inicio, @Hora_Fin, @Frecuencia, @Cupo_Max_Compartido, @Flag_Feriado
				WHILE @@FETCH_STATUS = 0
				BEGIN
					IF((@Flag_Feriado = 0) OR (@Flag_Feriado = 1 AND @Flag_Es_Dia_Feriado = 1) OR (@Flag_Feriado = 2 AND @Flag_Es_Dia_Feriado = 0))
					BEGIN					
						IF(@pModoDebug = 1)
						BEGIN
							PRINT 'Id_Recurso_Horario: ' + CONVERT(VARCHAR(10), @Id_Recurso_Horario) + ' Hora_Inicio: ' + CONVERT(VARCHAR(5), @Hora_Inicio, 8) + ' Hora_Fin: ' + CONVERT(VARCHAR(5), @Hora_Fin, 8) + ' Frecuencia: ' + CONVERT(VARCHAR(10), @Frecuencia) + ' Cupo_Max_Compartido:' + CONVERT(VARCHAR(10), @Cupo_Max_Compartido)
						END
						
						--Hora inicio Ej: Ej. 1900-01-01T10:00:00
						--Hora fin Ej: Ej. 1900-01-01T10:50:00
						
						-- Primer Minuto a generar (Ej. 1900-01-01T10:00:00)				
						SET @cadaMinutoAGenerar = @Hora_Inicio
						
						WHILE (@cadaMinutoAGenerar <= @Hora_Fin)
						BEGIN
							IF(@pModoDebug = 1)
							BEGIN
								PRINT 'Hora: ' + CONVERT(VARCHAR(5), @cadaMinutoAGenerar, 8)
							END
							
							SET @Flag_Id_Recurso_Bloq = ISNULL((SELECT Id_Recurso_Bloq 
																FROM Empresas_Sedes_Sec_Recuros_Bloqueos 
																WHERE 
																Activo = 1
																AND Id_Recurso = @Id_Recurso 
																AND ((ISNULL(Lunes, 0) = 1 AND (@Dia_De_La_Semana = 'Monday' OR  @Dia_De_La_Semana = 'Lunes')) OR
																	(ISNULL(Martes, 0) = 1 AND (@Dia_De_La_Semana = 'Tuesday' OR  @Dia_De_La_Semana = 'Martes')) OR
																	(ISNULL(Miercoles, 0) = 1 AND (@Dia_De_La_Semana = 'Wednesday' OR  @Dia_De_La_Semana = 'Miercoles' OR @Dia_De_La_Semana = 'Mi'+ CHAR(233) +'rcoles')) OR
																	(ISNULL(Jueves, 0) = 1  AND (@Dia_De_La_Semana = 'Thursday' OR  @Dia_De_La_Semana = 'Jueves')) OR
																	(ISNULL(Viernes, 0) = 1 AND (@Dia_De_La_Semana = 'Friday' OR  @Dia_De_La_Semana = 'Viernes')) OR
																	(ISNULL(Sabado, 0) = 1  AND (@Dia_De_La_Semana = 'Saturday' OR  @Dia_De_La_Semana = 'Sabado' OR @Dia_De_La_Semana = 'S'+ CHAR(225) +'bado')) OR
																	(ISNULL(Domingo, 0) = 1 AND (@Dia_De_La_Semana = 'Sunday' OR  @Dia_De_La_Semana = 'Domingo'))
																	)
																AND Hora_Inicio <= @cadaMinutoAGenerar
																AND Hora_Fin >= @cadaMinutoAGenerar)
																, 0)
							
							IF(@Flag_Id_Recurso_Bloq > 0)
							BEGIN
								IF(@pModoDebug = 1)
								BEGIN
									PRINT 'El recurso se encuentra bloqueado para la hora: ' + CONVERT(VARCHAR(5), @cadaMinutoAGenerar, 8) + ' a traves del Id_Recurso_Bloq = ' + CONVERT(VARCHAR(10), @Flag_Id_Recurso_Bloq)
								END
							END
							ELSE
							BEGIN					
								SET @fechaCompletaAGenerar = CONVERT(DATETIME, 
																			CAST(DATEPART(yy, @cadaDiaAGenerar) AS CHAR(4)) + '-' + RIGHT('00' + CAST(DATEPART(mm, @cadaDiaAGenerar) AS VARCHAR), 2) + '-' + RIGHT('00' + CAST(DATEPART(dd, @cadaDiaAGenerar) AS VARCHAR), 2) 
																			+ 'T' + 
																			RIGHT('00' + CAST(DATEPART(HOUR, @cadaMinutoAGenerar) AS VARCHAR), 2) + ':' + RIGHT('00' + CAST(DATEPART(MINUTE, @cadaMinutoAGenerar) AS VARCHAR), 2) + ':' + '00'
																	)
								
								SET @Flag_Ya_Existe_Turno = 0

								IF(@pModoDebug = 1)
								BEGIN
									PRINT '_Fecha Completa a Generar: ' + CONVERT(VARCHAR(20), @fechaCompletaAGenerar, 120)
								END

								IF(@pModoDebug = 1)
								BEGIN
									PRINT '@Cupo_Max_Compartido: ' + CONVERT(VARCHAR(10), @Cupo_Max_Compartido)
								END
								
								IF(@Cupo_Max_Compartido >= 2)
								BEGIN
									SET @Cant_Cupo_Compartido_Generados = (SELECT ISNULL((SELECT COUNT(1) FROM CRM_Turnos WHERE Id_Recurso = @Id_Recurso AND Fecha = @fechaCompletaAGenerar), 0))
									
									IF(@pModoDebug = 1)
									BEGIN
										PRINT '@Cant_Cupo_Compartido_Generados: ' + CONVERT(VARCHAR(10), @Cant_Cupo_Compartido_Generados) + ' de: ' + CONVERT(VARCHAR(10), @Cupo_Max_Compartido)
									END
									
									IF(@Cant_Cupo_Compartido_Generados >= @Cupo_Max_Compartido)
									BEGIN
										SET @Flag_Ya_Existe_Turno = 1
									END
								END
								ELSE
								BEGIN
									/*Si es un solo turno (es decir no es compartido)*/
									SET @Flag_Ya_Existe_Turno = (SELECT ISNULL((SELECT MAX(1) FROM CRM_Turnos WHERE Id_Recurso = @Id_Recurso AND Fecha = @fechaCompletaAGenerar), 0))
								END							
								
								IF(@pModoDebug = 1)
								BEGIN
									PRINT '@Flag_Ya_Existe_Turno: ' + CONVERT(VARCHAR(10), @Flag_Ya_Existe_Turno)
								END
								
								IF(@Flag_Ya_Existe_Turno = 1)
								BEGIN
									IF(@pModoDebug = 1)
									BEGIN
										PRINT 'Ya existia un turno generado (o todos los turnos compartidos) para el Id_Recurso: ' + CONVERT(VARCHAR(10), @Id_Recurso) + ' en la Fecha: ' + CONVERT(VARCHAR(20), @fechaCompletaAGenerar, 120)
									END
								END
								ELSE
								BEGIN
									IF(@Cupo_Max_Compartido = 0)
									BEGIN
										SET @Cupo_Max_Compartido = 1
									END
																								
									/*Agregado 2020-10-30 Para que tome solo los Cupos restantes no asignados*/
									---SET @Cant_Cupo_Compartido_Generados = 1
									SET @Cant_Cupo_Compartido_Generados = (SELECT ISNULL((SELECT COUNT(1) FROM CRM_Turnos WHERE Id_Recurso = @pId_Recurso AND Fecha = @fechaCompletaAGenerar), 0))
									SET @Cant_Cupo_Compartido_Generados = @Cant_Cupo_Compartido_Generados + 1 --Para el WHILE

									IF(@pModoDebug=1)
									BEGIN
										PRINT '@Cant_Cupo_Compartido_Generados: ' + CONVERT (VARCHAR(10), @Cant_Cupo_Compartido_Generados)
									END
									/*Fin Agregado 2020-10-30*/

									WHILE(@Cant_Cupo_Compartido_Generados <= @Cupo_Max_Compartido)
									BEGIN
										IF(@pModoDebug = 1)
										BEGIN
											PRINT 'Genera registro CRM_Turnos con los siguientes datos: Id_Usuario: ' + CONVERT(VARCHAR(10), @pId_Usuario) + '. Id_Recurso: ' + CONVERT(VARCHAR(10), @Id_Recurso) + ' Fecha: ' + CONVERT(VARCHAR(20), @fechaCompletaAGenerar, 120)
											PRINT '@Cant_Cupo_Compartido_Generados: ' + CONVERT(VARCHAR(10), @Cant_Cupo_Compartido_Generados) + ' de: ' + CONVERT(VARCHAR(10), @Cupo_Max_Compartido)
										END																		
										
										--Inserta el registro en CRM_Turnos
										SET @Cantidad_Turnos_Generados = @Cantidad_Turnos_Generados + 1
										
										INSERT INTO CRM_Turnos
										(Id_Usuario,			Id_Cliente,			Id_Recurso, 
										Fecha,					Descripcion,		Estado,
										Id_Trans,				Id_Recurso_Horario,	Frecuencia,
										Fecha_Generacion)
										VALUES
										(@pId_Usuario,			0,					@Id_Recurso,
										@fechaCompletaAGenerar,	'',					'',
										0,						@Id_Recurso_Horario,	@Frecuencia,
										GETDATE())
										
										SET @Cant_Cupo_Compartido_Generados = @Cant_Cupo_Compartido_Generados + 1
									END								
								END
							END
							
							--Siguiente minuto a generar
							SET @cadaMinutoAGenerar = DATEADD(MINUTE, @Frecuencia, @cadaMinutoAGenerar)
						END
					END--IF((@Flag_Feriado = 0) OR (@Flag_Feriado = 1 AND @Flag_Es_Dia_Feriado = 1) OR (@Flag_Feriado = 2 AND @Flag_Es_Dia_Feriado = 0))
					ELSE
					BEGIN
						IF(@pModoDebug = 1)
						BEGIN
							PRINT 'No corresponde generar turno debbido a que el recurso tiene @Flag_Feriado: ' + CONVERT(VARCHAR(10), @Flag_Feriado) + ' y @Flag_Es_Dia_Feriado: ' + CONVERT(VARCHAR(10), @Flag_Es_Dia_Feriado)
						END	
					END
					
					FETCH NEXT FROM curGenerarRecursosxDiaxHorario INTO @Id_Recurso_Horario, @Hora_Inicio, @Hora_Fin, @Frecuencia, @Cupo_Max_Compartido, @Flag_Feriado
				END
				CLOSE curGenerarRecursosxDiaxHorario
				DEALLOCATE curGenerarRecursosxDiaxHorario
				--FIN Recorro todos los horarios que tiene el recurso
				
				FETCH NEXT FROM curGenerarRecursosxDia INTO @Id_Recurso
			END
			CLOSE curGenerarRecursosxDia
			DEALLOCATE curGenerarRecursosxDia
			--FIN Recorro todos los recursos que tiene el sector
		END--IF(@pId_Sector <> 0)
		
		------------------------------------------------------------------------------------------------------------------
		
		--POR RECURSO (Siempre viene en el parametro Sector Y recurso)
		IF(@pId_Recurso <> 0 AND @pId_Sector <> 0)
		BEGIN
			IF(@pModoDebug = 1)
			BEGIN
				PRINT 'Generacion POR RECURSO. pId_Recurso: ' + CONVERT(VARCHAR(10), @pId_Recurso)
			END
			
			--Recorro todos los horarios que tiene el recurso
			DECLARE curGenerarRecursosxDiaxHorario CURSOR FOR
			SELECT Id_Recurso_Horario, Hora_Inicio, Hora_Fin, Frecuencia, ISNULL(Cupo_Max_Compartido, 0), ISNULL(Flag_Feriado, 0)
			FROM Empresas_Sedes_Sec_Recuros_Horarios
			WHERE
			Activo = 1
			AND Id_Recurso = @pId_Recurso
			AND (	(ISNULL(Lunes, 0) = 1 AND (@Dia_De_La_Semana = 'Monday'  OR  @Dia_De_La_Semana = 'Lunes')) OR
					(ISNULL(Martes, 0) = 1 AND (@Dia_De_La_Semana = 'Tuesday' OR  @Dia_De_La_Semana = 'Martes')) OR
					(ISNULL(Miercoles, 0) = 1 AND (@Dia_De_La_Semana = 'Wednesday' OR  @Dia_De_La_Semana = 'Miercoles' OR @Dia_De_La_Semana = 'Mi'+ CHAR(233) +'rcoles')) OR
					(ISNULL(Jueves, 0) = 1 AND (@Dia_De_La_Semana = 'Thursday' OR  @Dia_De_La_Semana = 'Jueves')) OR
					(ISNULL(Viernes, 0) = 1 AND (@Dia_De_La_Semana = 'Friday' OR  @Dia_De_La_Semana = 'Viernes')) OR
					(ISNULL(Sabado, 0) = 1 AND (@Dia_De_La_Semana = 'Saturday' OR  @Dia_De_La_Semana = 'Sabado' OR  @Dia_De_La_Semana = 'S'+ CHAR(225) +'bado')) OR
					(ISNULL(Domingo, 0) = 1 AND (@Dia_De_La_Semana = 'Sunday' OR  @Dia_De_La_Semana = 'Domingo'))
				)
			
			SET @Cant_Cupo_Compartido_Generados = 0
			
			OPEN curGenerarRecursosxDiaxHorario
			FETCH NEXT FROM curGenerarRecursosxDiaxHorario INTO @Id_Recurso_Horario, @Hora_Inicio, @Hora_Fin, @Frecuencia, @Cupo_Max_Compartido, @Flag_Feriado
			WHILE @@FETCH_STATUS = 0
			BEGIN
				IF((@Flag_Feriado = 0) OR (@Flag_Feriado = 1 AND @Flag_Es_Dia_Feriado = 1) OR (@Flag_Feriado = 2 AND @Flag_Es_Dia_Feriado = 0))
				BEGIN	
				
					IF(@pModoDebug = 1)
					BEGIN
						PRINT 'Id_Recurso_Horario: ' + CONVERT(VARCHAR(10), @Id_Recurso_Horario) + ' Hora_Inicio: ' + CONVERT(VARCHAR(5), @Hora_Inicio, 8) + ' Hora_Fin: ' + CONVERT(VARCHAR(5), @Hora_Fin, 8) + ' Frecuencia: ' + CONVERT(VARCHAR(10), @Frecuencia)
					END
					
					--Hora inicio Ej: Ej. 1900-01-01T10:00:00
					--Hora fin Ej: Ej. 1900-01-01T10:50:00
					
					-- Primer Minuto a generar (Ej. 1900-01-01T10:00:00)				
					SET @cadaMinutoAGenerar = @Hora_Inicio
					
					WHILE (@cadaMinutoAGenerar <= @Hora_Fin)
					BEGIN
						IF(@pModoDebug = 1)
						BEGIN
							PRINT 'Hora: ' + CONVERT(VARCHAR(5), @cadaMinutoAGenerar, 8)
						END
						
						SET @Flag_Id_Recurso_Bloq = ISNULL((SELECT Id_Recurso_Bloq 
															FROM Empresas_Sedes_Sec_Recuros_Bloqueos 
															WHERE 
															Activo = 1
															AND Id_Recurso = @pId_Recurso 
															AND ((ISNULL(Lunes, 0) = 1 AND (@Dia_De_La_Semana = 'Monday'  OR  @Dia_De_La_Semana = 'Lunes')) OR
																(ISNULL(Martes, 0) = 1 AND (@Dia_De_La_Semana = 'Tuesday' OR  @Dia_De_La_Semana = 'Martes')) OR
																(ISNULL(Miercoles, 0) = 1 AND (@Dia_De_La_Semana = 'Wednesday' OR  @Dia_De_La_Semana = 'Miercoles' OR @Dia_De_La_Semana = 'Mi'+ CHAR(233) +'rcoles')) OR
																(ISNULL(Jueves, 0) = 1 AND (@Dia_De_La_Semana = 'Thursday' OR  @Dia_De_La_Semana = 'Jueves')) OR
																(ISNULL(Viernes, 0) = 1 AND (@Dia_De_La_Semana = 'Friday' OR  @Dia_De_La_Semana = 'Viernes')) OR
																(ISNULL(Sabado, 0) = 1 AND (@Dia_De_La_Semana = 'Saturday' OR  @Dia_De_La_Semana = 'Sabado' OR  @Dia_De_La_Semana = 'S'+ CHAR(225) +'bado')) OR
																(ISNULL(Domingo, 0) = 1 AND (@Dia_De_La_Semana = 'Sunday' OR  @Dia_De_La_Semana = 'Domingo'))
																)
															AND Hora_Inicio <= @cadaMinutoAGenerar
															AND Hora_Fin >= @cadaMinutoAGenerar)
															, 0)
						
						IF(@Flag_Id_Recurso_Bloq > 0)
						BEGIN
							IF(@pModoDebug = 1)
							BEGIN
								PRINT 'El recurso se encuentra bloqueado para la hora: ' + CONVERT(VARCHAR(5), @cadaMinutoAGenerar, 8) + ' a traves del Id_Recurso_Bloq = ' + CONVERT(VARCHAR(10), @Flag_Id_Recurso_Bloq)
							END
						END
						ELSE
						BEGIN					
							SET @fechaCompletaAGenerar = CONVERT(DATETIME, 
																		CAST(DATEPART(yy, @cadaDiaAGenerar) AS CHAR(4)) + '-' + RIGHT('00' + CAST(DATEPART(mm, @cadaDiaAGenerar) AS VARCHAR), 2) + '-' + RIGHT('00' + CAST(DATEPART(dd, @cadaDiaAGenerar) AS VARCHAR), 2) 
																		+ 'T' + 
																		RIGHT('00' + CAST(DATEPART(HOUR, @cadaMinutoAGenerar) AS VARCHAR), 2) + ':' + RIGHT('00' + CAST(DATEPART(MINUTE, @cadaMinutoAGenerar) AS VARCHAR), 2) + ':' + '00'
																)

							SET @Flag_Ya_Existe_Turno = 0

							IF(@pModoDebug = 1)
							BEGIN
								PRINT '_Fecha Completa a Generar: ' + CONVERT(VARCHAR(20), @fechaCompletaAGenerar, 120)
							END

							IF(@pModoDebug = 1)
							BEGIN
								PRINT '@Cupo_Max_Compartido: ' + CONVERT(VARCHAR(10), @Cupo_Max_Compartido)
							END
							
							IF(@Cupo_Max_Compartido >= 2)
							BEGIN
								SET @Cant_Cupo_Compartido_Generados = (SELECT ISNULL((SELECT COUNT(1) FROM CRM_Turnos WHERE Id_Recurso = @pId_Recurso AND Fecha = @fechaCompletaAGenerar), 0))

								IF(@pModoDebug = 1)
								BEGIN
									PRINT '@Cant_Cupo_Compartido_Generados: ' + CONVERT(VARCHAR(10), @Cant_Cupo_Compartido_Generados) + ' de: ' + CONVERT(VARCHAR(10), @Cupo_Max_Compartido)
								END

								IF(@Cant_Cupo_Compartido_Generados >= @Cupo_Max_Compartido)
								BEGIN
									SET @Flag_Ya_Existe_Turno = 1
								END
							END
							ELSE
							BEGIN
								/*Si es un solo turno (es decir no es compartido)*/
								SET @Flag_Ya_Existe_Turno = (SELECT ISNULL((SELECT MAX(1) FROM CRM_Turnos WHERE Id_Recurso = @pId_Recurso AND Fecha = @fechaCompletaAGenerar), 0))
							END		
		
							IF(@pModoDebug = 1)
							BEGIN
									PRINT '@Flag_Ya_Existe_Turno: ' + CONVERT(VARCHAR(10), @Flag_Ya_Existe_Turno)
							END

							IF(@Flag_Ya_Existe_Turno = 1)
							BEGIN
								IF(@pModoDebug = 1)
								BEGIN
									PRINT 'Ya existia un turno (o todos los turnos compartidos) generado para el Id_Recurso: ' + CONVERT(VARCHAR(10), @pId_Recurso) + ' en la Fecha: ' + CONVERT(VARCHAR(20), @fechaCompletaAGenerar, 120)
								END
							END
							ELSE
							BEGIN						
								IF(@Cupo_Max_Compartido = 0)
								BEGIN
									SET @Cupo_Max_Compartido = 1
								END

								IF(@pModoDebug = 1)
								BEGIN
									PRINT '@Cupo_Max_Compartido:' + CONVERT (VARCHAR(10), @Cupo_Max_Compartido)
								END

								/*Agregado 2020-10-30 Para que tome solo los Cupos restantes no asignados*/
								---SET @Cant_Cupo_Compartido_Generados = 1
								SET @Cant_Cupo_Compartido_Generados = (SELECT ISNULL((SELECT COUNT(1) FROM CRM_Turnos WHERE Id_Recurso = @pId_Recurso AND Fecha = @fechaCompletaAGenerar), 0))							
								SET @Cant_Cupo_Compartido_Generados = @Cant_Cupo_Compartido_Generados + 1 --Para el WHILE

								IF(@pModoDebug=1)
								BEGIN
									PRINT '@Cant_Cupo_Compartido_Generados: ' + CONVERT (VARCHAR(10), @Cant_Cupo_Compartido_Generados)
								END
								/*Fin Agregado 2020-10-30*/
								
								WHILE(@Cant_Cupo_Compartido_Generados <= @Cupo_Max_Compartido)
								BEGIN
									IF(@pModoDebug = 1)
									BEGIN
										PRINT 'Genera registro CRM_Turnos con los siguientes datos: Id_Usuario: ' + CONVERT(VARCHAR(10), @pId_Usuario) + '. Id_Recurso: ' + CONVERT(VARCHAR(10), @pId_Recurso) + ' Fecha: ' + CONVERT(VARCHAR(20), @fechaCompletaAGenerar, 120)
										PRINT '@Cant_Cupo_Compartido_Generados: ' + CONVERT(VARCHAR(10), @Cant_Cupo_Compartido_Generados) + ' de: ' + CONVERT(VARCHAR(10), @Cupo_Max_Compartido)
									END
														
									--Inserta el registro en CRM_Turnos
									SET @Cantidad_Turnos_Generados = @Cantidad_Turnos_Generados + 1
									
									INSERT INTO CRM_Turnos
									(Id_Usuario,			Id_Cliente,			Id_Recurso, 
									Fecha,					Descripcion,		Estado,
									Id_Trans,				Id_Recurso_Horario,	Frecuencia,
									Fecha_Generacion)
									VALUES
									(@pId_Usuario,			0,					@pId_Recurso,
									@fechaCompletaAGenerar,	'',					'',
									0,						@Id_Recurso_Horario,@Frecuencia,
									GETDATE())
									
									SET @Cant_Cupo_Compartido_Generados = @Cant_Cupo_Compartido_Generados + 1
								END
							END
						END
						
						--Siguiente minuto a generar
						SET @cadaMinutoAGenerar = DATEADD(MINUTE, @Frecuencia, @cadaMinutoAGenerar)
					END
				END--IF((@Flag_Feriado = 0) OR (@Flag_Feriado = 1 AND @Flag_Es_Dia_Feriado = 1) OR (@Flag_Feriado = 2 AND @Flag_Es_Dia_Feriado = 0))
				ELSE
				BEGIN
					IF(@pModoDebug = 1)
					BEGIN
						PRINT 'No corresponde generar turno debbido a que el recurso tiene @Flag_Feriado: ' + CONVERT(VARCHAR(10), @Flag_Feriado) + ' y @Flag_Es_Dia_Feriado: ' + CONVERT(VARCHAR(10), @Flag_Es_Dia_Feriado)
					END	
				END
				
				FETCH NEXT FROM curGenerarRecursosxDiaxHorario INTO @Id_Recurso_Horario, @Hora_Inicio, @Hora_Fin, @Frecuencia, @Cupo_Max_Compartido, @Flag_Feriado
			END
			CLOSE curGenerarRecursosxDiaxHorario
			DEALLOCATE curGenerarRecursosxDiaxHorario
			--FIN Recorro todos los horarios que tiene el recurso
		END--IF(@pId_Recurso <> 0)
		
		--Siguiente Dia a generar
		SET @cadaDiaAGenerar = DATEADD(dd, 1, @cadaDiaAGenerar)
	END--WHILE(@cadaDiaAGenerar <= @pFecha_Hasta)


	/*===================================================================*/	

	--VALIDO SI EL CONTRATO TIENE TURNOS
	SET @Agregar_Contratos = (SELECT Valor_Integer FROM xParametros where SetDatos= 1 AND IdParametro = 'Generar_CRM_Turnos')
	IF(@pModoDebug = 1)
	BEGIN
		 PRINT '@Agregar_Contratos: ' + CONVERT(VARCHAR(10), @Agregar_Contratos)
	END
	
    IF @Agregar_Contratos = 1
	BEGIN
		IF @pId_Contrato <> 0
		BEGIN
			IF(@pModoDebug = 1)
			BEGIN
				 PRINT 'Elimina todos los turnos para el id_contrato: ' + CONVERT(VARCHAR(10), @pId_Contrato)
			END
				     
			DELETE CRM_TURNOS 
			WHERE 
			ISNULL(Id_Contrato, 0) = @pId_Contrato 
			AND Fecha >= @pFecha_Desde 
			AND Fecha < dateadd(dd,1,@pFecha_Hasta) 
		END
		ELSE
		BEGIN 
			IF(@pModoDebug = 1)
			BEGIN
				 PRINT 'Elimina todos los turnos que no tengan contrato' 
			END
			
			DELETE CRM_TURNOS 
			WHERE 
			ISNULL(Id_Contrato, 0) <> 0  
			AND Fecha >= @pFecha_Desde 
			AND Fecha <  dateadd(dd,1,@pFecha_Hasta) 
		END

		SET @cadaDiaAGenerar = @pFecha_Desde	
	
		WHILE(@cadaDiaAGenerar <= @pFecha_Hasta)
		BEGIN		
			SET @Dia_De_La_Semana = DATENAME(WEEKDAY, @cadaDiaAGenerar) --Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
			IF(@pModoDebug = 1)
			BEGIN
				PRINT 'Dia contrato : ' + @Dia_De_La_Semana + '(' + CONVERT(VARCHAR(10), @cadaDiaAGenerar, 102) + ')'
			END
			
			SET @Flag_Es_Dia_Feriado = ISNULL((	SELECT MAX(1) 
												FROM Tab_Feriados
												WHERE
												Dia = DATEPART(DAY, @cadaDiaAGenerar)
												AND Mes = DATEPART(MONTH, @cadaDiaAGenerar))
											, 0)
			IF(@Flag_Es_Dia_Feriado = 1)
			BEGIN
				IF(@pModoDebug = 1)
				BEGIN
					PRINT 'Es un Dia Feriado segun la Tabla Tab_Feriados.'
				END
			END	

			IF(@pModoDebug = 1)
			BEGIN
				PRINT '@pId_Contrato: ' + CONVERT(VARCHAR(10), @pId_Contrato) + '. @pId_Recurso: ' + CONVERT(VARCHAR(10), @pId_Recurso) + '. @pId_Sector: ' + CONVERT(VARCHAR(10), @pId_Sector) + '. @pFecha_Desde: ' + CONVERT(VARCHAR(10), @pFecha_Desde, 120) + '. @pFecha_Hasta: ' + CONVERT(VARCHAR(10), @pFecha_Hasta, 120) + '. @cadaDiaAGenerar: ' + CONVERT(VARCHAR(10), @cadaDiaAGenerar, 120) + '. @Dia_De_La_Semana: ' + @Dia_De_La_Semana
			END
				
			IF @pId_Contrato <> 0
			BEGIN
				INSERT INTO CRM_Turnos
				(Id_Usuario,			Id_Cliente,			Id_Recurso, 
				Fecha,					Descripcion,		Estado,
				Id_Trans,				Id_Recurso_Horario,	Frecuencia,
				Fecha_Generacion,       Id_Contrato)

				SELECT 	@pId_Usuario,
						C.id_cliente,
						R.id_recurso,
						CONVERT(datetime,LEFT(CONVERT(VARCHAR(20),@cadaDiaAGenerar,112),8) + ' ' + LEFT(CONVERT(VARCHAR(20),H.Hora_Inicio,14),8)),
						'',
						'R',
						0,
						0,
						Datediff(mi,H.Hora_Inicio,H.Hora_Fin),
						GETDATE(),
						C.ID_CONTRATO
						FROM CONTRATOS C, Contratos_Prod_Horarios P, Prod_Familias_Hor_Recursos R,Empresas_Sedes_Sec_Recuros_Horarios H
						where 
						c.id_contrato = p.id_contrato 
						AND p.Id_Prod_Familia_Horario = r.Id_Prod_Familia_Horario
						and r.Id_Recurso = h.Id_Recurso
						AND C.ID_CONTRATO = @pId_Contrato
						AND c.activo = 1
						AND c.Fecha_Desde <= @pFecha_Hasta
						AND c.Fecha_Desde <= @cadaDiaAGenerar
						AND isnull(c.Fecha_Hasta ,@pFecha_Desde) >=  @pFecha_Desde	
						AND c.Fecha_Hasta >= @cadaDiaAGenerar
						AND ((ISNULL(H.Lunes, 0) = 1  AND (@Dia_De_La_Semana = 'Monday'  OR  @Dia_De_La_Semana = 'Lunes'))  OR 
							(ISNULL(H.Martes, 0) = 1 AND (@Dia_De_La_Semana = 'Tuesday' OR  @Dia_De_La_Semana = 'Martes')) OR
							(ISNULL(H.Miercoles, 0) = 1 AND (@Dia_De_La_Semana = 'Wednesday' OR @Dia_De_La_Semana = 'Miercoles' OR @Dia_De_La_Semana = 'Mi'+ CHAR(233) +'rcoles')) OR
							(ISNULL(H.Jueves, 0) = 1  AND (@Dia_De_La_Semana = 'Thursday' OR  @Dia_De_La_Semana = 'Jueves')) OR
							(ISNULL(H.Viernes, 0) = 1 AND (@Dia_De_La_Semana = 'Friday' OR @Dia_De_La_Semana = 'Viernes')) OR
							(ISNULL(H.Sabado, 0) = 1  AND (@Dia_De_La_Semana = 'Saturday' OR @Dia_De_La_Semana = 'Sabado' OR  @Dia_De_La_Semana = 'S'+ CHAR(225) +'bado')) OR
							(ISNULL(H.Domingo, 0) = 1 AND (@Dia_De_La_Semana = 'Sunday' OR @Dia_De_La_Semana = 'Domingo'))
						)
						AND ((H.Flag_Feriado = 0) OR (H.Flag_Feriado = 1 AND @Flag_Es_Dia_Feriado = 1) OR (H.Flag_Feriado = 2 AND @Flag_Es_Dia_Feriado = 0))
			END
			ELSE
			BEGIN
				IF (@pId_Recurso <> 0 AND @pId_Sector = 0)
				BEGIN
					INSERT INTO CRM_Turnos
					(Id_Usuario,			Id_Cliente,			Id_Recurso, 
					Fecha,					Descripcion,		Estado,
					Id_Trans,				Id_Recurso_Horario,	Frecuencia,
					Fecha_Generacion,       Id_Contrato)

					SELECT 
					@pId_Usuario,
					C.id_cliente,
					R.id_recurso,
					CONVERT(DATETIME,LEFT(CONVERT(VARCHAR(20),@cadaDiaAGenerar,112),8) + ' ' + LEFT(CONVERT(VARCHAR(20),H.Hora_Inicio,14),8)),
					'',
					'R',
					0,
					0,
					Datediff(mi,H.Hora_Inicio,H.Hora_Fin),
					GETDATE(),
					C.ID_CONTRATO
					FROM CONTRATOS C, Contratos_Prod_Horarios P, Prod_Familias_Hor_Recursos R,Empresas_Sedes_Sec_Recuros_Horarios H
					where 
					c.id_contrato = p.id_contrato 
					AND p.Id_Prod_Familia_Horario = r.Id_Prod_Familia_Horario
					and r.Id_Recurso = h.Id_Recurso
					AND c.activo = 1
					AND c.Fecha_Desde <= @pFecha_Hasta
					AND c.Fecha_Desde <= @cadaDiaAGenerar
					AND isnull(c.Fecha_Hasta ,@pFecha_Desde) >=  @pFecha_Desde	
					AND c.Fecha_Hasta >= @cadaDiaAGenerar
					AND ((ISNULL(H.Lunes, 0) = 1  AND (@Dia_De_La_Semana = 'Monday'  OR  @Dia_De_La_Semana = 'Lunes'))  OR
						(ISNULL(H.Martes, 0) = 1 AND (@Dia_De_La_Semana = 'Tuesday' OR  @Dia_De_La_Semana = 'Martes')) OR
						(ISNULL(H.Miercoles, 0) = 1 AND (@Dia_De_La_Semana = 'Wednesday' OR @Dia_De_La_Semana = 'Miercoles' OR @Dia_De_La_Semana = 'Mi'+ CHAR(233) +'rcoles')) OR
						(ISNULL(H.Jueves, 0) = 1  AND (@Dia_De_La_Semana = 'Thursday' OR  @Dia_De_La_Semana = 'Jueves')) OR
						(ISNULL(H.Viernes, 0) = 1 AND (@Dia_De_La_Semana = 'Friday' OR @Dia_De_La_Semana = 'Viernes')) OR
						(ISNULL(H.Sabado, 0) = 1  AND (@Dia_De_La_Semana = 'Saturday'  OR @Dia_De_La_Semana = 'Sabado' OR  @Dia_De_La_Semana = 'S'+ CHAR(225) +'bado')) OR
						(ISNULL(H.Domingo, 0) = 1 AND (@Dia_De_La_Semana = 'Sunday' OR @Dia_De_La_Semana = 'Domingo'))
					)
					AND ((H.Flag_Feriado = 0) OR (H.Flag_Feriado = 1 AND @Flag_Es_Dia_Feriado = 1) OR (H.Flag_Feriado = 2 AND @Flag_Es_Dia_Feriado = 0))
				END

				IF @pId_Sector <> 0
				BEGIN
					INSERT INTO CRM_Turnos
					(Id_Usuario,			Id_Cliente,			Id_Recurso, 
					Fecha,					Descripcion,		Estado,
					Id_Trans,				Id_Recurso_Horario,	Frecuencia,
					Fecha_Generacion,       Id_Contrato)

					SELECT 
					@pId_Usuario,
					C.id_cliente,
					R.id_recurso,
					CONVERT(datetime,LEFT(CONVERT(VARCHAR(20),@cadaDiaAGenerar,112),8) + ' ' + LEFT(CONVERT(VARCHAR(20),H.Hora_Inicio,14),8)),
					'',
					'R',
					0,
					0,
					Datediff(mi,H.Hora_Inicio,H.Hora_Fin),
					GETDATE(),
					C.ID_CONTRATO
					FROM CONTRATOS C, Contratos_Prod_Horarios P, Prod_Familias_Hor_Recursos R,Empresas_Sedes_Sec_Recuros_Horarios H
					where 
					c.id_contrato = p.id_contrato 
					AND p.Id_Prod_Familia_Horario = r.Id_Prod_Familia_Horario
					AND r.Id_Recurso = h.Id_Recurso
					AND c.activo = 1
					AND c.Fecha_Desde <= @pFecha_Hasta
					AND c.Fecha_Desde <= @cadaDiaAGenerar
					AND isnull(c.Fecha_Hasta ,@pFecha_Desde) >=  @pFecha_Desde	
					AND c.Fecha_Hasta >= @cadaDiaAGenerar
					AND ((ISNULL(H.Lunes, 0) = 1  AND (@Dia_De_La_Semana = 'Monday'  OR  @Dia_De_La_Semana = 'Lunes'))  OR
						(ISNULL(H.Martes, 0) = 1 AND (@Dia_De_La_Semana = 'Tuesday' OR  @Dia_De_La_Semana = 'Martes')) OR
						(ISNULL(H.Miercoles, 0) = 1 AND (@Dia_De_La_Semana = 'Wednesday' OR @Dia_De_La_Semana = 'Miercoles' OR @Dia_De_La_Semana = 'Mi'+ CHAR(233) +'rcoles')) OR
						(ISNULL(H.Jueves, 0) = 1  AND (@Dia_De_La_Semana = 'Thursday' OR  @Dia_De_La_Semana = 'Jueves')) OR
						(ISNULL(H.Viernes, 0) = 1 AND (@Dia_De_La_Semana = 'Friday' OR @Dia_De_La_Semana = 'Viernes')) OR
						(ISNULL(H.Sabado, 0) = 1  AND (@Dia_De_La_Semana = 'Saturday'  OR  @Dia_De_La_Semana = 'Sabado' OR  @Dia_De_La_Semana = 'S'+ CHAR(225) +'bado')) OR
						(ISNULL(H.Domingo, 0) = 1 AND (@Dia_De_La_Semana = 'Sunday' OR @Dia_De_La_Semana = 'Domingo'))
					)
					AND ((H.Flag_Feriado = 0) OR (H.Flag_Feriado = 1 AND @Flag_Es_Dia_Feriado = 1) OR (H.Flag_Feriado = 2 AND @Flag_Es_Dia_Feriado = 0))
				END
			END

			SET @cadaDiaAGenerar += 1
		END	--BEGIN		

	END
			
	/*===================================================================*/	

	IF @pFlagUsarTrans <> 0 COMMIT

	SELECT	 0							AS ErrorNumber 
			,0							AS ErrorSeverity  
			,0							AS ErrorState 
			,0							AS ErrorProcedure  
			,@Cantidad_Turnos_Generados	AS ErrorLine		
			,''							AS ErrorMessage

	IF(@pModoDebug = 1)
	BEGIN
		PRINT 'Fin Stored Procedure: CPJ_Turnos_Generar'
	END
	
END TRY  


BEGIN CATCH  
    EXECUTE usp_GetErrorInfo

	IF @pFlagUsarTrans <> 0  ROLLBACK

	RETURN 9999
END CATCH

RETURN 0 

--Ejemplo de uso
--EXEC CPJ_Turnos_Generar '{"FlagUsarTrans":"0", "ModoDebug":"1", "Id_Usuario":"-1", "Id_Sector":"8", "Fecha_Desde":"20200801", "Fecha_Hasta":"20200805", "Id_Contrato":"0"}'
