sozsoft-platform/configs/seeds/postgres/object/Hr_S_WorkCalendarAfterSave.sql
2026-10-06 14:24:30 +03:00

55 lines
2.3 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

CREATE OR REPLACE PROCEDURE public."Hr_S_WorkCalendarAfterSave"(
p_CalendarId uuid,
p_ActorId uuid DEFAULT NULL
)
LANGUAGE plpgsql
AS $$
DECLARE
v_TenantId uuid;
v_StartDate date;
v_EndDate date;
v_Recurrence varchar(256);
v_Shift integer;
BEGIN
-- Çalışma Takvimi satırı eklenince, değişince ya da silinince tatile denk gelen izin taleplerinin
-- gün sayısı ve puantaj yeniden hesaplanır; aksi hâlde sonradan girilen bayram izinden düşmeye,
-- puantajda çalışma günü görünmeye devam ederdi. Yıllık tekrarlı satırın bu yılki ve gelecek
-- yılki karşılığı işlenir; kapalı puantaj ayı yazılmaz.
SELECT "TenantId", "StartDate"::date, "EndDate"::date, "RecurrenceRule"
INTO v_TenantId, v_StartDate, v_EndDate, v_Recurrence
FROM public."Hr_T_WorkCalendar"
WHERE "Id" = p_CalendarId;
IF v_StartDate IS NULL THEN
RETURN;
END IF;
IF v_Recurrence = 'FREQ=YEARLY' THEN
v_Shift := EXTRACT(YEAR FROM LOCALTIMESTAMP)::integer - EXTRACT(YEAR FROM v_StartDate)::integer;
IF v_Shift > 0 THEN
v_StartDate := (v_StartDate + make_interval(years => v_Shift))::date;
v_EndDate := (v_EndDate + make_interval(years => v_Shift + 1))::date;
ELSE
v_EndDate := (v_EndDate + INTERVAL '1 year')::date;
END IF;
END IF;
UPDATE public."Hr_T_LeaveRequest" r
SET "Days" = CASE WHEN r."IsHalfDay" = TRUE AND n.Days > 0.5 THEN 0.5 ELSE n.Days END
FROM (
SELECT q."Id",
CASE WHEN t."Code" = 'Sick'
THEN public."Hr_F_LeaveWorkDays"(q."TenantId", q."StartDate"::date, q."EndDate"::date)
ELSE public."Hr_F_LeaveNetDays"(q."TenantId", q."EmployeeId", q."StartDate"::date, q."EndDate"::date)
END AS Days
FROM public."Hr_T_LeaveRequest" q
INNER JOIN public."Hr_T_LeaveType" t ON t."Id" = q."LeaveTypeId"
WHERE q."IsDeleted" = FALSE
AND (q."TenantId" = v_TenantId OR (q."TenantId" IS NULL AND v_TenantId IS NULL))
AND q."StartDate"::date <= v_EndDate AND q."EndDate"::date >= v_StartDate
) n
WHERE n."Id" = r."Id";
CALL public."Hr_S_TimesheetCalculate"(v_TenantId, NULL, v_StartDate, v_EndDate, p_ActorId);
END;
$$;