72 lines
2.8 KiB
PL/PgSQL
72 lines
2.8 KiB
PL/PgSQL
CREATE OR REPLACE PROCEDURE public."Hr_S_LeaveRequestGuard"(
|
||
p_RequestId uuid,
|
||
p_ActorId uuid,
|
||
p_Actor varchar(16),
|
||
p_Operation varchar(16)
|
||
)
|
||
LANGUAGE plpgsql
|
||
AS $$
|
||
DECLARE
|
||
v_EmployeeId uuid;
|
||
v_Status varchar(50);
|
||
v_ManagerIds varchar(1024);
|
||
v_TenantId uuid;
|
||
v_StartDate date;
|
||
v_EndDate date;
|
||
BEGIN
|
||
-- Persona ekranları satırı DefaultFilter ile süzer; kayıt uçları satırı yalnızca Id ile
|
||
-- güncellediği için sahiplik ve aşama kuralı yazma tarafında burada uygulanır. Kayıttan önce
|
||
-- çalıştığı için talebin eski tarihleri de burada kapalı puantaj dönemine karşı denetlenir.
|
||
IF p_RequestId IS NULL THEN
|
||
RETURN;
|
||
END IF;
|
||
|
||
SELECT "EmployeeId", "ApprovalStatus", "ManagerIds", "TenantId", "StartDate"::date, "EndDate"::date
|
||
INTO v_EmployeeId, v_Status, v_ManagerIds, v_TenantId, v_StartDate, v_EndDate
|
||
FROM public."Hr_T_LeaveRequest"
|
||
WHERE "Id" = p_RequestId AND "IsDeleted" = FALSE;
|
||
|
||
IF v_EmployeeId IS NULL THEN
|
||
RETURN;
|
||
END IF;
|
||
|
||
IF public."Hr_F_TimesheetPeriodClosed"(v_TenantId, v_StartDate, v_EndDate) THEN
|
||
RAISE EXCEPTION 'İzin tarihleri kapalı bir puantaj dönemine düşüyor. Önce İnsan Kaynakları dönemi açmalıdır.'
|
||
USING ERRCODE = 'P0001', DETAIL = '51118';
|
||
END IF;
|
||
|
||
IF p_Actor = 'Hr' THEN
|
||
RETURN;
|
||
END IF;
|
||
|
||
IF p_Actor = 'Employee' THEN
|
||
IF v_EmployeeId <> p_ActorId THEN
|
||
RAISE EXCEPTION 'Bu izin talebi size ait değil.' USING ERRCODE = 'P0001', DETAIL = '51100';
|
||
END IF;
|
||
|
||
-- Karar verilmiş talep çalışan tarafından değiştirilemez; iptal için İK'ya başvurulur.
|
||
IF v_Status IS NOT NULL AND v_Status NOT IN ('Onaya Gönderildi', 'Müdür Onayı') THEN
|
||
RAISE EXCEPTION 'Onay sürecinde ilerlemiş ya da sonuçlanmış izin talebi değiştirilemez veya silinemez. İptal için İnsan Kaynakları ile görüşün.'
|
||
USING ERRCODE = 'P0001', DETAIL = '51101';
|
||
END IF;
|
||
|
||
RETURN;
|
||
END IF;
|
||
|
||
IF p_Actor = 'Manager' THEN
|
||
IF p_Operation = 'Delete' THEN
|
||
RAISE EXCEPTION 'Yönetici izin talebini silemez.' USING ERRCODE = 'P0001', DETAIL = '51102';
|
||
END IF;
|
||
|
||
-- ManagerIds SQL Server döneminde büyük harfli GUID metni taşıyabilir; karşılaştırma harf duyarsız.
|
||
IF p_ActorId IS NULL
|
||
OR strpos('|' || lower(COALESCE(v_ManagerIds, '')) || '|', '|' || lower(p_ActorId::text) || '|') = 0 THEN
|
||
RAISE EXCEPTION 'Bu izin talebinin onaycısı değilsiniz.' USING ERRCODE = 'P0001', DETAIL = '51103';
|
||
END IF;
|
||
|
||
IF v_Status IS NULL OR v_Status <> 'Müdür Onayı' THEN
|
||
RAISE EXCEPTION 'İzin talebi müdür onayında beklemiyor.' USING ERRCODE = 'P0001', DETAIL = '51104';
|
||
END IF;
|
||
END IF;
|
||
END
|
||
$$;
|