CREATE OR REPLACE PROCEDURE public."Hr_S_LeaveSickLeaveSync"( p_SickLeaveId uuid, p_ActorId uuid DEFAULT NULL ) LANGUAGE plpgsql AS $$ DECLARE v_TenantId uuid; v_UserId uuid; v_StartDate date; v_EndDate date; v_Reason varchar(1024); v_IsDeleted boolean; v_RequestId uuid; v_OldStart date; v_OldEnd date; v_Days numeric(9, 1); v_LeaveTypeId uuid; v_ActorName varchar(256); v_Year varchar(4); BEGIN -- Sağlık Kartı › İstirahatler'den (ya da kullanıcı detayındaki istirahat listesinden) girilen -- rapor, İzin Yönetimi'nde onaylanmış "Sick" türünde talep olarak görünür (tek kayıt). Talep -- tarafı istirahati kendisi yazar; bu prosedür yalnızca istirahat ekranından gelen değişikliği taşır. IF p_SickLeaveId IS NULL THEN RETURN; END IF; SELECT "TenantId", "UserId", "StartDate"::date, "EndDate"::date, "SickLeaveReason", "IsDeleted" INTO v_TenantId, v_UserId, v_StartDate, v_EndDate, v_Reason, v_IsDeleted FROM public."Adm_T_UserSickLeave" WHERE "Id" = p_SickLeaveId; IF v_UserId IS NULL THEN RETURN; END IF; -- Eşlenen talep istirahatin önceki tarihlerini taşır; kapalı aya düşen eski ya da yeni gün varsa -- kayıt geri alınır (puantaj ve bordro kapanmış aydır). SELECT "Id", "StartDate"::date, "EndDate"::date INTO v_RequestId, v_OldStart, v_OldEnd FROM public."Hr_T_LeaveRequest" WHERE "SickLeaveId" = p_SickLeaveId ORDER BY "IsDeleted", "CreationTime" LIMIT 1; IF public."Hr_F_TimesheetPeriodClosed"(v_TenantId, v_StartDate, v_EndDate) OR public."Hr_F_TimesheetPeriodClosed"(v_TenantId, v_OldStart, v_OldEnd) THEN RAISE EXCEPTION 'Rapor kapalı bir puantaj dönemine düşüyor. Önce İnsan Kaynakları dönemi açmalıdır.' USING ERRCODE = 'P0001', DETAIL = '51120'; END IF; IF v_IsDeleted = TRUE THEN UPDATE public."Hr_T_LeaveRequest" SET "IsDeleted" = TRUE, "DeletionTime" = (NOW() AT TIME ZONE 'UTC'), "DeleterId" = p_ActorId WHERE "SickLeaveId" = p_SickLeaveId AND "IsDeleted" = FALSE; ELSE v_Days := public."Hr_F_LeaveWorkDays"(v_TenantId, v_StartDate, v_EndDate); IF v_RequestId IS NOT NULL THEN UPDATE public."Hr_T_LeaveRequest" SET "StartDate" = v_StartDate, "EndDate" = v_EndDate, "Days" = v_Days, "IsDeleted" = FALSE, "DeletionTime" = NULL, "DeleterId" = NULL, "LastModificationTime" = (NOW() AT TIME ZONE 'UTC'), "LastModifierId" = p_ActorId WHERE "Id" = v_RequestId; ELSE -- Kiracıda rapor türü tanımlı değilse eşlenecek talep yoktur. SELECT "Id" INTO v_LeaveTypeId FROM public."Hr_T_LeaveType" WHERE "Code" = 'Sick' AND "IsDeleted" = FALSE AND ("TenantId" = v_TenantId OR ("TenantId" IS NULL AND v_TenantId IS NULL)) LIMIT 1; IF v_LeaveTypeId IS NOT NULL THEN v_ActorName := (SELECT "UserName" FROM public."AbpUsers" WHERE "Id" = p_ActorId); v_Year := EXTRACT(YEAR FROM (NOW() AT TIME ZONE 'UTC'))::int::text; -- İstirahat sağlık birimince girilmiş bir belgedir; onay akışına girmeden onaylı yazılır. INSERT INTO public."Hr_T_LeaveRequest" ("Id", "TenantId", "RequestNo", "EmployeeId", "EmployeeName", "DepartmentId", "JobPositionId", "LeaveTypeId", "StartDate", "EndDate", "IsHalfDay", "Days", "Description", "SickLeaveId", "ApprovalStatus", "ApprovalUser", "ApprovalDate", "LastNotifiedStatus", "IsActive", "CreationTime", "CreatorId", "IsDeleted") SELECT gen_random_uuid(), v_TenantId, 'IZN-' || v_Year || '-' || right('00000' || ( SELECT COALESCE(MAX(CASE WHEN right(x."RequestNo", 5) ~ '^[0-9]+$' THEN right(x."RequestNo", 5)::int END), 0) + 1 FROM public."Hr_T_LeaveRequest" x WHERE (x."TenantId" = v_TenantId OR (x."TenantId" IS NULL AND v_TenantId IS NULL)) AND x."RequestNo" LIKE 'IZN-' || v_Year || '-%')::text, 5), u."Id", CONCAT(u."Name", ' ', u."Surname"), u."DepartmentId", u."JobPositionId", v_LeaveTypeId, v_StartDate, v_EndDate, FALSE, v_Days, left(v_Reason, 1024), p_SickLeaveId, 'Onaylandı', v_ActorName, (NOW() AT TIME ZONE 'UTC'), 'Onaylandı', TRUE, (NOW() AT TIME ZONE 'UTC'), p_ActorId, FALSE FROM public."AbpUsers" u WHERE u."Id" = v_UserId; END IF; END IF; END IF; -- Rapora denk gelen izin günleri bakiyeye döner; puantajda raporlu günler (ve tarihi değiştiyse -- eski günler) yeniden hesaplanır. CALL public."Hr_S_LeaveDaysRefresh"(v_TenantId, v_UserId); IF v_OldStart IS NOT NULL AND v_OldStart < v_StartDate THEN v_StartDate := v_OldStart; END IF; IF v_OldEnd IS NOT NULL AND v_OldEnd > v_EndDate THEN v_EndDate := v_OldEnd; END IF; CALL public."Hr_S_TimesheetCalculate"(v_TenantId, v_UserId, v_StartDate, v_EndDate, p_ActorId); END $$;