66 lines
2.6 KiB
Transact-SQL
66 lines
2.6 KiB
Transact-SQL
CREATE OR ALTER FUNCTION [dbo].[Hr_F_LeaveWorkDays]
|
||
(
|
||
@TenantId uniqueidentifier,
|
||
@StartDate date,
|
||
@EndDate date
|
||
)
|
||
RETURNS decimal(9, 1)
|
||
AS
|
||
BEGIN
|
||
-- İzin günü = ayarlarda çalışma günü işaretli olup Çalışma Takvimi'nde tatil olmayan gün.
|
||
-- Yarım gün (arife) 0,5 sayılır. Yıllık tekrarlı satır başlangıç yılından itibaren her yıl
|
||
-- aynı gün/ay aralığına düşer (29 Şubat artık olmayan yılda 28 Şubat'a kayar).
|
||
IF @StartDate IS NULL OR @EndDate IS NULL OR @EndDate < @StartDate
|
||
RETURN 0;
|
||
|
||
-- Gün sırası Pazartesi = 0 (DATEFIRST ayarından bağımsız). Ayar tanımı yoksa Pzt–Cum.
|
||
DECLARE @Work TABLE (DayIndex int PRIMARY KEY, IsWork bit);
|
||
INSERT INTO @Work (DayIndex, IsWork)
|
||
SELECT d.DayIndex,
|
||
CASE
|
||
WHEN s.Value IS NULL THEN CASE WHEN d.DayIndex < 5 THEN 1 ELSE 0 END
|
||
WHEN LOWER(s.Value) = N'true' THEN 1
|
||
ELSE 0
|
||
END
|
||
FROM (VALUES
|
||
(0, N'Adm.HrSettings.Leave.WorkMonday'),
|
||
(1, N'Adm.HrSettings.Leave.WorkTuesday'),
|
||
(2, N'Adm.HrSettings.Leave.WorkWednesday'),
|
||
(3, N'Adm.HrSettings.Leave.WorkThursday'),
|
||
(4, N'Adm.HrSettings.Leave.WorkFriday'),
|
||
(5, N'Adm.HrSettings.Leave.WorkSaturday'),
|
||
(6, N'Adm.HrSettings.Leave.WorkSunday')) d (DayIndex, SettingName)
|
||
CROSS APPLY (SELECT dbo.Hr_F_HrSetting(@TenantId, d.SettingName) AS Value) s;
|
||
|
||
DECLARE @Total decimal(9, 1) = 0;
|
||
DECLARE @Day date = @StartDate;
|
||
DECLARE @Value decimal(3, 1);
|
||
|
||
WHILE @Day <= @EndDate
|
||
BEGIN
|
||
SET @Value = 0;
|
||
|
||
IF EXISTS (SELECT 1 FROM @Work WHERE DayIndex = DATEDIFF(day, '19000101', @Day) % 7 AND IsWork = 1)
|
||
BEGIN
|
||
SET @Value = 1;
|
||
|
||
SELECT @Value = CASE WHEN MAX(CASE WHEN c.DayType = N'Holiday' THEN 1 ELSE 0 END) = 1 THEN 0 ELSE 0.5 END
|
||
FROM Hr_T_WorkCalendar c
|
||
WHERE c.IsDeleted = 0 AND c.IsActive = 1
|
||
AND (c.TenantId = @TenantId OR (c.TenantId IS NULL AND @TenantId IS NULL))
|
||
AND (
|
||
((c.RecurrenceRule IS NULL OR c.RecurrenceRule = N'') AND @Day BETWEEN c.StartDate AND c.EndDate)
|
||
OR (c.RecurrenceRule = N'FREQ=YEARLY' AND YEAR(@Day) >= YEAR(c.StartDate)
|
||
AND @Day BETWEEN DATEADD(year, YEAR(@Day) - YEAR(c.StartDate), c.StartDate)
|
||
AND DATEADD(year, YEAR(@Day) - YEAR(c.StartDate), c.EndDate))
|
||
)
|
||
HAVING COUNT(*) > 0;
|
||
END
|
||
|
||
SET @Total += @Value;
|
||
SET @Day = DATEADD(day, 1, @Day);
|
||
END
|
||
|
||
RETURN @Total;
|
||
END
|
||
GO
|