66 lines
2.9 KiB
PL/PgSQL
66 lines
2.9 KiB
PL/PgSQL
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
|
||
$$;
|