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 70,'2022-02-27','2022-02-27',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)

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

	IF @DoctorId=0
	BEGIN
		SELECT slotdate, slotenddate, result, resultdesc FROM @SONUCTABLOSU
		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 @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))
				)



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

	UPDATE ST SET 
		ST.result = (
						CASE WHEN ST.dateslot<GETDATE()
						THEN 6--geçmiş tarih
						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

	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'
												END
											),
							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)
	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

