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

86 lines
3.9 KiB
PL/PgSQL
Raw Permalink 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_PerformanceReviewRecalc"(
p_ReviewId uuid
)
LANGUAGE plpgsql
AS $$
BEGIN
IF p_ReviewId IS NULL THEN
RETURN;
END IF;
-- Gerçekleşme %: Artan hedefte Gerçekleşen/Hedef, Azalan hedefte Hedef/Gerçekleşen; 0–150'ye kırpılır.
-- Azalan hedefte sıfır gerçekleşme hedefin tamamen tutturulduğu anlamına gelir, tavan verilir.
UPDATE "Hr_T_PerformanceGoal" g
SET "AchievementRate" = (
SELECT CASE
WHEN x.rate IS NULL THEN NULL
WHEN x.rate > 150 THEN 150
WHEN x.rate < 0 THEN 0
ELSE x.rate
END
FROM (SELECT CAST(CASE
WHEN g."ActualValue" IS NULL THEN NULL
WHEN g."Direction" = 'Decreasing' AND g."ActualValue" <= 0 THEN 150
WHEN g."Direction" = 'Decreasing' THEN g."TargetValue" / g."ActualValue" * 100
ELSE g."ActualValue" / g."TargetValue" * 100
END AS numeric(18, 2)) AS rate) x)
WHERE g."ReviewId" = p_ReviewId AND g."IsDeleted" = FALSE;
-- Yetkinlik puanı yöneticinin seçtiği seviyenin Progress değeridir.
UPDATE "Hr_T_PerformanceCompetency" c
SET "Score" = (
SELECT l."Progress"
FROM "Hr_T_SkillLevel" l
WHERE l."Id" = c."ManagerLevelId" AND l."IsDeleted" = FALSE)
WHERE c."ReviewId" = p_ReviewId AND c."IsDeleted" = FALSE;
UPDATE "Hr_T_PerformanceFeedback" f
SET "Score" = (
SELECT CAST(AVG(CAST(l."Progress" AS numeric(9, 2))) AS numeric(6, 2))
FROM "Hr_T_PerformanceFeedbackScore" s
INNER JOIN "Hr_T_SkillLevel" l ON l."Id" = s."LevelId" AND l."IsDeleted" = FALSE
WHERE s."FeedbackId" = f."Id" AND s."IsDeleted" = FALSE)
WHERE f."ReviewId" = p_ReviewId AND f."IsDeleted" = FALSE;
UPDATE "Hr_T_PerformanceReview" rv
SET "GoalScore" = s.goal_score,
"CompetencyScore" = s.competency_score,
"Feedback360Score" = s.feedback_score,
"OverallScore" = CASE
WHEN s.goal_score IS NULL AND s.competency_score IS NULL THEN NULL
ELSE CAST((COALESCE(s.goal_score, 0) * s.goal_weight + COALESCE(s.competency_score, 0) * s.competency_weight) / 100 AS numeric(6, 2))
END
FROM (
SELECT r."Id",
p."GoalWeight" AS goal_weight,
p."CompetencyWeight" AS competency_weight,
(SELECT CASE WHEN COUNT(*) = 0 THEN NULL
ELSE CAST(SUM(COALESCE(g."AchievementRate", 0) * g."Weight") / 100 AS numeric(6, 2)) END
FROM "Hr_T_PerformanceGoal" g
WHERE g."ReviewId" = r."Id" AND g."IsDeleted" = FALSE) AS goal_score,
(SELECT CAST(AVG(c."Score") AS numeric(6, 2))
FROM "Hr_T_PerformanceCompetency" c
WHERE c."ReviewId" = r."Id" AND c."IsDeleted" = FALSE AND c."Score" IS NOT NULL) AS competency_score,
(SELECT CAST(AVG(f."Score") AS numeric(6, 2))
FROM "Hr_T_PerformanceFeedback" f
WHERE f."ReviewId" = r."Id" AND f."IsDeleted" = FALSE AND f."Status" = 'Submitted' AND f."Score" IS NOT NULL) AS feedback_score
FROM "Hr_T_PerformanceReview" r
INNER JOIN "Hr_T_PerformancePeriod" p ON p."Id" = r."PeriodId"
WHERE r."Id" = p_ReviewId
) s
WHERE rv."Id" = s."Id";
-- Derece kalibre puandan, yoksa genel puandan; aralık alt sınırı dahil, üst sınırı hariçtir.
UPDATE "Hr_T_PerformanceReview" rv
SET "RatingId" = (
SELECT rt."Id"
FROM "Hr_T_PerformanceRating" rt
WHERE rt."IsDeleted" = FALSE AND rt."IsActive" = TRUE
AND (rt."TenantId" = rv."TenantId" OR (rt."TenantId" IS NULL AND rv."TenantId" IS NULL))
AND COALESCE(rv."CalibratedScore", rv."OverallScore") >= rt."MinScore"
AND COALESCE(rv."CalibratedScore", rv."OverallScore") < rt."MaxScore"
ORDER BY rt."Level" DESC
LIMIT 1)
WHERE rv."Id" = p_ReviewId;
END
$$;