sozsoft-platform/configs/seeds/sql/object/Hr_F_LeaveWorkDays.sql

67 lines
2.6 KiB
MySQL
Raw Permalink Normal View History

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