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

108 lines
5.9 KiB
PL/PgSQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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).
INSERT INTO public."Hr_T_LeaveRequest"
("Id", "TenantId", "BranchId", "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,
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)),
'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
$$;