sozsoft-platform/configs/seeds/postgres/object/Hr_S_LeaveRequestGuard.sql
2026-10-06 14:24:30 +03:00

72 lines
2.8 KiB
PL/PgSQL
Raw 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_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
$$;