106 lines
5.2 KiB
PL/PgSQL
106 lines
5.2 KiB
PL/PgSQL
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
|
||
$$;
|