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

73 lines
2.8 KiB
MySQL
Raw Normal View History

2026-10-06 11:24:30 +00:00
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
$$;