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

67 lines
2.9 KiB
MySQL
Raw Permalink Normal View History

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