sozsoft-platform/configs/seeds/postgres/object/Hr_S_WorkCalendarAfterSave.sql

56 lines
2.3 KiB
MySQL
Raw Permalink Normal View History

2026-10-06 11:24:30 +00:00
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;
$$;