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.
|
2026-10-14 21:12:14 +00:00
|
|
|
|
-- Ş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"
|
2026-10-14 21:12:14 +00:00
|
|
|
|
("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,
|
2026-10-14 21:12:14 +00:00
|
|
|
|
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
|
|
|
|
|
|
$$;
|