IF  EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[SPWEB_DOKTORSLOT]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1)
DROP PROCEDURE SPWEB_DOKTORSLOT
GO
--SPWEB_DOKTORSLOT 190,'2022-05-19','2022-05-19',1
CREATE PROCEDURE [dbo].[SPWEB_DOKTORSLOT] 
	@DoctorId INT = 0,
	@StartDate NVARCHAR(25),
	@EndDate NVARCHAR(25),
	@Status INT = 0
AS
BEGIN


DECLARE @SONUCTABLOSU TABLE (slotdate NVARCHAR(20), 
							slotenddate NVARCHAR(20),
							result INT,
							resultdesc NVARCHAR(200),
							dateslot DATETIME,
							dateslotend DATETIME)

	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,
			@DETAYLICALSAATAKTIF BIT = 0,
			@RANDEVUSAATKALAALINIR INT

	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, slotenddate, result, resultdesc FROM @SONUCTABLOSU
		RETURN
	END

	IF @DoctorId=0
	BEGIN
		SELECT slotdate, slotenddate, result, resultdesc FROM @SONUCTABLOSU
		RETURN
	END
	
	SELECT TOP 1 @RANDEVUSAATKALAALINIR=RANDEVUSAATKALAALINIR FROM MEDIWEBAYARLAR
	SET @RANDEVUSAATKALAALINIR = ISNULL(@RANDEVUSAATKALAALINIR,0)

	--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'),
			@DETAYLICALSAATAKTIF=(			
				CASE WHEN (ISNULL(DETAYLICALSAATAKTIF,0)=1) AND (ISNULL((SELECT VALUESTR FROM CONFIG WITH(NOLOCK) WHERE SECTIONSTR LIKE 'Doktor%Tan%m' AND KEYNAME LIKE CONVERT(VARCHAR,TDRKIMLIK.SUBEID)+' numaral% %ubede g%n baz%nda detayl% randevu sistemi aktif'),'0')='1')
				THEN 1
				ELSE 0
				END
			)
	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
		IF @DETAYLICALSAATAKTIF=1
		BEGIN
			INSERT INTO @SONUCTABLOSU (result, slotdate, dateslot)
			SELECT	0,
					CONVERT(VARCHAR,DATEPART(YEAR,@TARIHTUT))+'-'+
					RIGHT('0'+CONVERT(VARCHAR,DATEPART(MONTH,@TARIHTUT)),2)+'-'+
					RIGHT('0'+CONVERT(VARCHAR,DATEPART(DAY,@TARIHTUT)),2)+' '+
					RIGHT('0'+CONVERT(VARCHAR,DATEPART(HOUR,TGUNSAAT.SAAT)),2)+':'+
					RIGHT('0'+CONVERT(VARCHAR,DATEPART(MINUTE,TGUNSAAT.SAAT)),2)+':'+
					RIGHT('0'+CONVERT(VARCHAR,DATEPART(SECOND,TGUNSAAT.SAAT)),2),				
					CONVERT(DATETIME,(
						CONVERT(VARCHAR,DATEPART(YEAR,@TARIHTUT))+'-'+
						RIGHT('0'+CONVERT(VARCHAR,DATEPART(MONTH,@TARIHTUT)),2)+'-'+
						RIGHT('0'+CONVERT(VARCHAR,DATEPART(DAY,@TARIHTUT)),2)+' '+
						RIGHT('0'+CONVERT(VARCHAR,DATEPART(HOUR,TGUNSAAT.SAAT)),2)+':'+
						RIGHT('0'+CONVERT(VARCHAR,DATEPART(MINUTE,TGUNSAAT.SAAT)),2)+':'+
						RIGHT('0'+CONVERT(VARCHAR,DATEPART(SECOND,TGUNSAAT.SAAT)),2)
					))		 
			FROM TGUNSAAT WITH(NOLOCK)
			JOIN TDRCALSAATDETAYLI WITH(NOLOCK) ON		TDRCALSAATDETAYLI.DRID=@DoctorId 
											AND TDRCALSAATDETAYLI.TARIH=@TARIHTUT
											AND CAST(
													ROUND(
															CASE WHEN TGUNSAAT.SAAT < TDRCALSAATDETAYLI.OSBASSAAT 
															THEN CAST(TGUNSAAT.SAAT - TDRCALSAATDETAYLI.SBASSAAT AS FLOAT) 
															ELSE CAST(TGUNSAAT.SAAT - TDRCALSAATDETAYLI.OSBASSAAT AS FLOAT) END 
															* 24 * 60, 0
													) AS INT
												) % @RANDEVUDAKIKA = 0
			WHERE	(
							(TGUNSAAT.Saat BETWEEN TDRCALSAATDETAYLI.SBASSAAT AND DATEADD(MINUTE,-1,TDRCALSAATDETAYLI.SBITSAAT))
						OR	(TGUNSAAT.Saat BETWEEN TDRCALSAATDETAYLI.OSBASSAAT AND DATEADD(MINUTE,-1,TDRCALSAATDETAYLI.OSBITSAAT))
					)
		END
		ELSE
		BEGIN
			INSERT INTO @SONUCTABLOSU (result, slotdate, dateslot)
			SELECT	0,
					CONVERT(VARCHAR,DATEPART(YEAR,@TARIHTUT))+'-'+
					RIGHT('0'+CONVERT(VARCHAR,DATEPART(MONTH,@TARIHTUT)),2)+'-'+
					RIGHT('0'+CONVERT(VARCHAR,DATEPART(DAY,@TARIHTUT)),2)+' '+
					RIGHT('0'+CONVERT(VARCHAR,DATEPART(HOUR,TGUNSAAT.SAAT)),2)+':'+
					RIGHT('0'+CONVERT(VARCHAR,DATEPART(MINUTE,TGUNSAAT.SAAT)),2)+':'+
					RIGHT('0'+CONVERT(VARCHAR,DATEPART(SECOND,TGUNSAAT.SAAT)),2),				
					CONVERT(DATETIME,(
						CONVERT(VARCHAR,DATEPART(YEAR,@TARIHTUT))+'-'+
						RIGHT('0'+CONVERT(VARCHAR,DATEPART(MONTH,@TARIHTUT)),2)+'-'+
						RIGHT('0'+CONVERT(VARCHAR,DATEPART(DAY,@TARIHTUT)),2)+' '+
						RIGHT('0'+CONVERT(VARCHAR,DATEPART(HOUR,TGUNSAAT.SAAT)),2)+':'+
						RIGHT('0'+CONVERT(VARCHAR,DATEPART(MINUTE,TGUNSAAT.SAAT)),2)+':'+
						RIGHT('0'+CONVERT(VARCHAR,DATEPART(SECOND,TGUNSAAT.SAAT)),2)
					))		 
			FROM TGUNSAAT WITH(NOLOCK)
			JOIN TDRCALSAAT WITH(NOLOCK) ON		TDRCALSAAT.DRID=@DoctorId 
											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))
					)
		END



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

	UPDATE @SONUCTABLOSU SET slotenddate=(case when slotdate IS NULL then '' else 
								CONVERT(VARCHAR,DATEPART(YEAR,DATEADD(MINUTE,@RANDEVUDAKIKA,CONVERT(DATETIME,slotdate))))+'-'+
								RIGHT('0'+CONVERT(VARCHAR,DATEPART(MONTH,DATEADD(MINUTE,@RANDEVUDAKIKA,CONVERT(DATETIME,slotdate)))),2)+'-'+
								RIGHT('0'+CONVERT(VARCHAR,DATEPART(DAY,DATEADD(MINUTE,@RANDEVUDAKIKA,CONVERT(DATETIME,slotdate)))),2)+' '+
								RIGHT('0'+CONVERT(VARCHAR,DATEPART(HOUR,DATEADD(MINUTE,@RANDEVUDAKIKA,CONVERT(DATETIME,slotdate)))),2)+':'+
								RIGHT('0'+CONVERT(VARCHAR,DATEPART(MINUTE,DATEADD(MINUTE,@RANDEVUDAKIKA,CONVERT(DATETIME,slotdate)))),2)+':'+
								RIGHT('0'+CONVERT(VARCHAR,DATEPART(SECOND,DATEADD(MINUTE,@RANDEVUDAKIKA,CONVERT(DATETIME,slotdate)))),2) end)

	UPDATE @SONUCTABLOSU SET dateslotend=CONVERT(DATETIME,slotenddate) WHERE slotenddate<>''

	UPDATE ST SET 
		ST.result = (
			CASE WHEN ST.dateslot<GETDATE() 
						THEN 6--geçmiş tarih
						ELSE ST.result
						end
		)
	FROM @SONUCTABLOSU ST
	LEFT JOIN HRANDEVU WITH(NOLOCK) ON		HRANDEVU.DRID = @DoctorId 
										AND HRANDEVU.RANDDURUMID NOT IN (5, 6) 
										AND (	
												(ST.dateslot>=HRANDEVU.RTARIHSAAT AND ST.dateslot<HRANDEVU.RBTARIH)
												OR
												(ST.dateslotend>HRANDEVU.RTARIHSAAT AND ST.dateslotend<=HRANDEVU.RBTARIH)
											)

	UPDATE ST SET 
		ST.result = (

							CASE WHEN ST.dateslot<DATEADD(HOUR,@RANDEVUSAATKALAALINIR,GETDATE())
							THEN 12--doktor bu kadar saat önce randevu kabul eder
							ELSE
								CASE WHEN ST.dateslot>@RANDEVUSONTARIH
								THEN 8--doktor son randevu tarihi belirlenmiş
								ELSE 
									CASE WHEN (NOT (CONVERT(TIME,ST.dateslot) BETWEEN CONVERT(TIME,@RANDBASSAAT) AND CONVERT(TIME,@RANDBITISSAAT)))
									THEN 9--doktor randevu saati hastane randevu saatinden farklı
									ELSE
										CASE WHEN ST.dateslot>=CONVERT(SMALLDATETIME,CONVERT(DATE,DATEADD(DAY,(@WEBMAXRANDEVUGUNSAYI+1),GETDATE())))
										THEN 10--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 7--doktor izinli
											ELSE
												CASE WHEN ISNULL(HRANDEVU.KYKULLANICI,0)='ONLINEMUAYENE'
												THEN 5--randevu dolu online muayene
												ELSE
													CASE WHEN ISNULL(HRANDEVU.RANDEVUID,0)>0
													THEN 4--randevu dolu yüz yüze muayene
													ELSE
														CASE WHEN @WEBRANDEVUVERILIR = 1 AND @ONLINEMUAYENEALIR = 1
														THEN 1--randevu boş (yüzyüze veya online randevu alabilir)
														ELSE
															CASE WHEN @WEBRANDEVUVERILIR=1
															THEN 2--randevu boş yuzyuze 
															ELSE
																CASE WHEN @ONLINEMUAYENEALIR=1
																THEN 3--randevu boş online
																ELSE
																	11--doktor webden veya online muayene almıyor
																END
															END
														END
													END												
												END
											END
										END
									END								
								END
							END				
					)					
	FROM @SONUCTABLOSU ST
	LEFT JOIN HRANDEVU WITH(NOLOCK) ON		HRANDEVU.DRID = @DoctorId 
										AND HRANDEVU.RANDDURUMID NOT IN (5, 6) 
										AND (	
												(ST.dateslot>=HRANDEVU.RTARIHSAAT AND ST.dateslot<HRANDEVU.RBTARIH)
												OR
												(ST.dateslotend>HRANDEVU.RTARIHSAAT AND ST.dateslotend<=HRANDEVU.RBTARIH)
											)
	WHERE ST.result=0

	UPDATE @SONUCTABLOSU SET resultdesc = (	CASE result 
												WHEN 1 THEN ''--'Randevu zamanı boş yüzyüze veya online randevu alınabilir'
												WHEN 2 THEN ''--'Randevu zamanı boş sadece yüzyüze randevu alınabilir'
												WHEN 3 THEN 'Sadece online muayene randevusu alınabilir'--'Randevu zamanı boş sadece online muayene randevusu alınabilir'
												WHEN 4 THEN 'Randevu dolu yüz yüze muayene'
												WHEN 5 THEN 'Randevu dolu online muayene'
												WHEN 6 THEN 'Geçmiş tarihli randevu alınamaz'
												WHEN 7 THEN 'Doktor izinli'
												WHEN 8 THEN 'Doktor son randevu tarihi belirlenmiş'
												WHEN 9 THEN 'Doktor randevu saati hastane randevu saatinden farklı'
												WHEN 10 THEN 'Doktor en fazla x gün sonraya randevu alır dışında tarih'
												WHEN 11 THEN 'Doktor webden veya online muayene randevusu almıyor'
												WHEN 12 THEN 'Doktor randevu saatine yakın zamanlarda yeni randevu almıyor'
												END
											)
	SELECT slotdate, slotenddate, result, resultdesc FROM @SONUCTABLOSU where (@Status = 0 or result = @Status)
      
END;
GO

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

