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 $$;