37 lines
1.2 KiB
PL/PgSQL
37 lines
1.2 KiB
PL/PgSQL
CREATE OR REPLACE FUNCTION public."Hr_F_LeaveNetDays"
|
||
(
|
||
p_TenantId uuid,
|
||
p_EmployeeId uuid,
|
||
p_StartDate date,
|
||
p_EndDate date
|
||
)
|
||
RETURNS numeric(9, 1)
|
||
LANGUAGE plpgsql
|
||
STABLE
|
||
AS $$
|
||
DECLARE
|
||
v_Total numeric(9, 1);
|
||
v_Day date := p_StartDate;
|
||
BEGIN
|
||
-- İzin talebinin düştüğü gün sayısı: çalışma günleri (Hr_F_LeaveWorkDays) eksi çalışanın
|
||
-- rapor (istirahat) kapsamındaki günleri. İzin sırasında alınan raporun günleri izinden sayılmaz;
|
||
-- puantajda da o günler Raporlu'dur, bakiye ile puantaj aynı günü iki kez kullanmaz.
|
||
IF p_StartDate IS NULL OR p_EndDate IS NULL OR p_EndDate < p_StartDate THEN
|
||
RETURN 0;
|
||
END IF;
|
||
|
||
v_Total := public."Hr_F_LeaveWorkDays"(p_TenantId, p_StartDate, p_EndDate);
|
||
|
||
WHILE v_Day <= p_EndDate AND v_Total > 0 LOOP
|
||
IF EXISTS (SELECT 1 FROM "Adm_T_UserSickLeave" s
|
||
WHERE s."UserId" = p_EmployeeId AND s."IsDeleted" = FALSE
|
||
AND v_Day BETWEEN s."StartDate"::date AND s."EndDate"::date) THEN
|
||
v_Total := v_Total - public."Hr_F_LeaveWorkDays"(p_TenantId, v_Day, v_Day);
|
||
END IF;
|
||
|
||
v_Day := v_Day + 1;
|
||
END LOOP;
|
||
|
||
RETURN CASE WHEN v_Total < 0 THEN 0 ELSE v_Total END;
|
||
END;
|
||
$$;
|