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