2026-10-04 19:17:16 +00:00
|
|
|
|
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
|
2026-10-19 14:35:08 +00:00
|
|
|
|
(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)
|
2026-10-04 19:17:16 +00:00
|
|
|
|
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
|