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; $$;