IF  EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[SPWEB_DOKTOR_SLOT]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1)
DROP PROCEDURE SPWEB_DOKTOR_SLOT
GO
--SPWEB_DOKTOR_SLOT 412,'2022-01-20','2022-01-21'
CREATE PROCEDURE [dbo].[SPWEB_DOKTOR_SLOT] 
	@DoctorId INT = 412,
	@StartDate NVARCHAR(25),
	@EndDate NVARCHAR(25)
AS
BEGIN


DECLARE @SONUC_TABLE TABLE (slotdate NVARCHAR(20), 
							slotresult SMALLINT, 
							dateslot DATETIME)
	/*	sonuc	0:randevu boş (yüzyüze veya online randevu alabilir)
				1:randevu boş yuzyuze 
				2:randevu boş online
				3:randevu dolu yüz yüze muayene
				4:randevu dolu online muayene
				5:geçmiş tarih
				6:doktor izinli
				7:doktor son randevu tarihi belirlenmiş
				8:doktor randevu saati hastane randevu saatinden farklı
				9:doktor en fazla x gün sonraya randevu alır dışında tarih
				10:doktor webden veya online muayene randevusu almıyor
	*/

	DECLARE @RANDEVUDAKIKA INT,
			@WEBRANDEVUVERILIR BIT,
			@ONLINEMUAYENEALIR BIT,
			@MAXRANDEVUGUNSAYI INT,
			@WEBMAXRANDEVUGUNSAYI INT,
			@RANDEVUSONTARIH DATETIME,
			@AMELIYATRANDEVUVERILIR BIT,
			@RANDBASSAAT SMALLDATETIME,
			@RANDBITISSAAT SMALLDATETIME,
			@BASLANGICTARIH DATE,
			@BITISTARIH DATE,
			@TARIHTUT DATE,
			@DRIZINVAR BIT

	IF ISDATE(@StartDate)=1 AND ISDATE(@EndDate)=1
	BEGIN
		SET @BASLANGICTARIH = CAST(CAST(CAST(@StartDate AS DATETIME) AS DATE) AS DATETIME)
		SET @BITISTARIH = CAST(CAST(CAST(@EndDate AS DATETIME) AS DATE) AS DATETIME)
		IF @BASLANGICTARIH>@BITISTARIH
		BEGIN
			SET @TARIHTUT = @BASLANGICTARIH
			SET @BASLANGICTARIH = @BITISTARIH
			SET @BITISTARIH = @TARIHTUT
		END
	END
	ELSE
	BEGIN
		SELECT slotdate, slotresult FROM @SONUC_TABLE
		RETURN
	END

	IF @DoctorId=0
	BEGIN
		SELECT slotdate, slotresult FROM @SONUC_TABLE
		RETURN
	END 

	--Doktor bilgilerini al
	SELECT	@RANDEVUDAKIKA=ISNULL(RANDEVUDAKIKA,5),
			@WEBRANDEVUVERILIR=ISNULL(WEBRANDEVUVERILIR,1),
			@ONLINEMUAYENEALIR=ISNULL(ONLINEMUAYENEALIR,1),
			@WEBRANDEVUVERILIR=ISNULL(WEBRANDEVUVERILIR,1),
			@MAXRANDEVUGUNSAYI=ISNULL(MAXRANDEVUGUNSAYI,99),
			@WEBMAXRANDEVUGUNSAYI=ISNULL(WEBMAXRANDEVUGUNSAYI,99),
			@RANDEVUSONTARIH=ISNULL(RANDEVUSONTARIH,DATEADD(YEAR,5,GETDATE())),
			@AMELIYATRANDEVUVERILIR=ISNULL(AMELIYATRANDEVUVERILIR,0),
			@RANDBASSAAT=ISNULL(RANDBASSAAT,'1899-12-30 00:00:00'),
			@RANDBITISSAAT=ISNULL(RANDBITISSAAT,'1899-12-30 23:59:59')
	FROM TDRKIMLIK WITH(NOLOCK)
	LEFT JOIN SUBELER WITH(NOLOCK) ON SUBELER.SUBEID = TDRKIMLIK.SUBEID
	WHERE DRID=@DoctorId

	IF @WEBMAXRANDEVUGUNSAYI>@MAXRANDEVUGUNSAYI
		SET @WEBMAXRANDEVUGUNSAYI = @MAXRANDEVUGUNSAYI

	SET @DRIZINVAR = ISNULL((SELECT TOP 1 1 FROM TDRIZINLERI WITH(NOLOCK) WHERE DRID=@DoctorId AND BITISTARIHI>GETDATE()),0)



	--belirtilen tarih aralıklarındaki doktor slotlarını çıkar
	SET @TARIHTUT = @BASLANGICTARIH
	WHILE(@TARIHTUT <= @BITISTARIH)
	BEGIN 
		INSERT INTO @SONUC_TABLE (slotresult, slotdate, dateslot)
		SELECT	1, 
				FORMAT(@TARIHTUT, 'yyyy-MM-dd') + ' ' + FORMAT(TGUNSAAT.SAAT, 'HH:mm:ss'), 
				CONVERT(DATETIME,(FORMAT(@TARIHTUT, 'yyyy-MM-dd') + ' ' + FORMAT(TGUNSAAT.SAAT, 'HH:mm:ss')))		 
		FROM TGUNSAAT WITH(NOLOCK)
		JOIN TDRCALSAAT WITH(NOLOCK) ON		TDRCALSAAT.DRID=412 
										AND HAFTAGUNU=DATEPART(dw,@TARIHTUT)
										AND CAST(
												ROUND(
														CASE WHEN TGUNSAAT.SAAT < TDRCALSAAT.OSBASSAAT 
														THEN CAST(TGUNSAAT.SAAT - TDRCALSAAT.SBASSAAT AS FLOAT) 
														ELSE CAST(TGUNSAAT.SAAT - TDRCALSAAT.OSBASSAAT AS FLOAT) END 
														* 24 * 60, 0
												) AS INT
											) % @RANDEVUDAKIKA = 0
		WHERE	(
						(TGUNSAAT.Saat BETWEEN TDRCALSAAT.SBASSAAT AND DATEADD(MINUTE,-1,TDRCALSAAT.SBITSAAT))
					OR	(TGUNSAAT.Saat BETWEEN TDRCALSAAT.OSBASSAAT AND DATEADD(MINUTE,-1,TDRCALSAAT.OSBITSAAT))
				)



		SET @TARIHTUT = DATEADD(DAY,1,@TARIHTUT)
	END

	UPDATE ST SET 
		ST.slotresult = (
						CASE WHEN ST.dateslot<GETDATE()
						THEN 5--geçmiş tarih
						ELSE
							CASE WHEN ST.dateslot>@RANDEVUSONTARIH
							THEN 7--doktor son randevu tarihi belirlenmiş
							ELSE 
								CASE WHEN (NOT (CONVERT(TIME,ST.dateslot) BETWEEN CONVERT(TIME,@RANDBASSAAT) AND CONVERT(TIME,@RANDBITISSAAT)))
								THEN 8--doktor randevu saati hastane randevu saatinden farklı
								ELSE
									CASE WHEN ST.dateslot>=CONVERT(SMALLDATETIME,CONVERT(DATE,DATEADD(DAY,(@WEBMAXRANDEVUGUNSAYI+1),GETDATE())))
									THEN 9--doktor en fazla x gün sonraya randevu alır dışında tarih
									ELSE
										CASE WHEN @DRIZINVAR=1 AND ISNULL((SELECT TOP 1 1 FROM TDRIZINLERI WITH(NOLOCK) WHERE DRID=@DoctorId AND ST.dateslot BETWEEN BASTARIHI AND BITISTARIHI),0)=1
										THEN 6--doktor izinli
										ELSE
											CASE WHEN ISNULL(HRANDEVU.KYKULLANICI,0)='ONLINEMUAYENE'
											THEN 4--randevu dolu online muayene
											ELSE
												CASE WHEN ISNULL(HRANDEVU.RANDEVUID,0)>0
												THEN 3--randevu dolu yüz yüze muayene
												ELSE
													CASE WHEN @WEBRANDEVUVERILIR = 1 AND @ONLINEMUAYENEALIR = 1
													THEN 0--randevu boş (yüzyüze veya online randevu alabilir)
													ELSE
														CASE WHEN @WEBRANDEVUVERILIR=1
														THEN 1--randevu boş yuzyuze 
														ELSE
															CASE WHEN @ONLINEMUAYENEALIR=1
															THEN 2--randevu boş online
															ELSE
																10--doktor webden veya online muayene almıyor
															END
														END
													END
												END												
											END
										END
									END
								END								
							END
						END
					)					
	FROM @SONUC_TABLE ST
	LEFT JOIN HRANDEVU WITH(NOLOCK) ON HRANDEVU.DRID = @DoctorId AND HRANDEVU.RTARIHSAAT =ST.dateslot AND HRANDEVU.RANDDURUMID NOT IN (5, 6)




	SELECT slotdate, slotresult FROM @SONUC_TABLE
      
END;

IF EXISTS (SELECT [name] FROM [sys].[database_principals] WHERE [type] = N'S' AND [name] = N'mediwebuser')
BEGIN
	BEGIN TRY
		GRANT EXECUTE ON [dbo].[SPWEB_DOKTOR_SLOT] TO [mediwebuser]
	END TRY
	BEGIN CATCH
	END CATCH
END
GO

