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

109 lines
5.9 KiB
MySQL
Raw Normal View History

2026-10-06 11:24:30 +00:00
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.
-- Şube: çalışanın departman şubesi, yoksa çalışana atanmış ilk şube, yoksa işlemi yapanın ilk şubesi (kolon NOT NULL).
2026-10-06 11:24:30 +00:00
INSERT INTO public."Hr_T_LeaveRequest"
("Id", "TenantId", "BranchId", "RequestNo", "EmployeeId", "EmployeeName", "DepartmentId", "JobPositionId", "LeaveTypeId",
2026-10-06 11:24:30 +00:00
"StartDate", "EndDate", "IsHalfDay", "Days", "Description", "SickLeaveId",
"ApprovalStatus", "ApprovalUser", "ApprovalDate", "LastNotifiedStatus", "IsActive", "CreationTime", "CreatorId", "IsDeleted")
SELECT gen_random_uuid(), v_TenantId,
COALESCE((SELECT d."BranchId" FROM public."Hr_T_Department" d WHERE d."Id" = u."DepartmentId"), (SELECT b."Id" FROM public."Sas_T_Branch" b INNER JOIN public."Sas_T_BranchUsers" bu ON bu."BranchId" = b."Id" AND bu."UserId" = u."Id" WHERE b."IsDeleted" = FALSE AND b."IsActive" = TRUE ORDER BY b."Name" LIMIT 1), (SELECT b."Id" FROM public."Sas_T_Branch" b INNER JOIN public."Sas_T_BranchUsers" bu ON bu."BranchId" = b."Id" AND bu."UserId" = p_ActorId WHERE b."IsDeleted" = FALSE AND b."IsActive" = TRUE ORDER BY b."Name" LIMIT 1)),
2026-10-06 11:24:30 +00:00
'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
$$;