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

66 lines
2.9 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_PerformanceGuard"(
p_ReviewId uuid,
p_UserId uuid,
p_Actor varchar(16),
p_Scope varchar(16),
p_FeedbackId uuid DEFAULT NULL
)
LANGUAGE plpgsql
AS $$
DECLARE
v_Status varchar(16);
v_EmployeeId uuid;
v_ManagerId uuid;
v_PeriodStatus varchar(16);
v_Allowed boolean;
BEGIN
-- Kişisel ekranlar (Değerlendirmelerim, Ekibim, 360 Taleplerim) satırı listede süzer; bu kontrol
-- aynı kuralı yazma tarafında uygular. Kayıt uçları satırı yalnızca Id ile güncellediği için
-- başka birinin kaydına doğrudan yapılan istek burada reddedilir.
IF p_Actor = 'Hr' THEN
RETURN;
END IF;
SELECT rv."Status", rv."EmployeeId", rv."ManagerId", p."Status"
INTO v_Status, v_EmployeeId, v_ManagerId, v_PeriodStatus
FROM "Hr_T_PerformanceReview" rv
INNER JOIN "Hr_T_PerformancePeriod" p ON p."Id" = rv."PeriodId"
WHERE rv."Id" = p_ReviewId AND rv."IsDeleted" = FALSE;
IF v_Status IS NULL THEN
RAISE EXCEPTION 'Değerlendirme kaydı bulunamadı.' USING ERRCODE = 'P0001', DETAIL = '51000';
END IF;
IF v_PeriodStatus = 'Closed' THEN
RAISE EXCEPTION 'Dönem kapatıldığı için değerlendirme değiştirilemez.' USING ERRCODE = 'P0001', DETAIL = '51001';
END IF;
IF p_Actor = 'Employee' AND (p_UserId IS NULL OR p_UserId <> v_EmployeeId) THEN
RAISE EXCEPTION 'Yalnızca kendi değerlendirmenizi değiştirebilirsiniz.' USING ERRCODE = 'P0001', DETAIL = '51002';
END IF;
IF p_Actor = 'Manager' AND (p_UserId IS NULL OR v_ManagerId IS NULL OR p_UserId <> v_ManagerId) THEN
RAISE EXCEPTION 'Yalnızca yöneticisi olduğunuz değerlendirmeleri değiştirebilirsiniz.' USING ERRCODE = 'P0001', DETAIL = '51003';
END IF;
IF p_Actor = 'Reviewer' AND NOT EXISTS (
SELECT 1 FROM "Hr_T_PerformanceFeedback" f
WHERE f."Id" = p_FeedbackId AND f."ReviewId" = p_ReviewId AND f."ReviewerId" = p_UserId AND f."IsDeleted" = FALSE) THEN
RAISE EXCEPTION 'Yalnızca size atanan 360 değerlendirmesini doldurabilirsiniz.' USING ERRCODE = 'P0001', DETAIL = '51004';
END IF;
-- Durum matrisi: hangi rol hangi aşamada neyi değiştirebilir.
v_Allowed := CASE
WHEN p_Scope = 'DevelopmentPlan' THEN TRUE
WHEN p_Actor = 'Employee' AND p_Scope = 'Review' THEN v_Status IN ('GoalSetting', 'SelfReview')
WHEN p_Actor = 'Employee' AND p_Scope IN ('Goal', 'Competency') THEN v_Status IN ('GoalSetting', 'SelfReview')
WHEN p_Actor = 'Manager' AND p_Scope IN ('Review', 'Goal', 'Competency') THEN v_Status IN ('GoalSetting', 'SelfReview', 'ManagerReview')
WHEN p_Actor = 'Reviewer' THEN v_Status IN ('GoalSetting', 'SelfReview', 'ManagerReview')
ELSE FALSE
END;
IF NOT v_Allowed THEN
RAISE EXCEPTION 'Değerlendirme bu aşamada bu işlem için açık değil.' USING ERRCODE = 'P0001', DETAIL = '51005';
END IF;
END
$$;