67 lines
2.9 KiB
MySQL
67 lines
2.9 KiB
MySQL
|
|
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
|
|||
|
|
$$;
|