55 lines
2.3 KiB
PL/PgSQL
55 lines
2.3 KiB
PL/PgSQL
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;
|
||
$$;
|