CREATE OR ALTER PROCEDURE [dbo].[Hr_S_PerformanceReviewRecalc] @ReviewId uniqueidentifier AS BEGIN SET NOCOUNT ON; IF @ReviewId IS NULL RETURN; -- 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 g SET AchievementRate = 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 Hr_T_PerformanceGoal g CROSS APPLY (SELECT CAST(CASE WHEN g.ActualValue IS NULL THEN NULL WHEN g.Direction = N'Decreasing' AND g.ActualValue <= 0 THEN 150 WHEN g.Direction = N'Decreasing' THEN g.TargetValue / g.ActualValue * 100 ELSE g.ActualValue / g.TargetValue * 100 END AS decimal(18, 2)) AS Rate) x WHERE g.ReviewId = @ReviewId AND g.IsDeleted = 0; -- Yetkinlik puanı yöneticinin seçtiği seviyenin Progress değeridir. UPDATE c SET Score = l.Progress FROM Hr_T_PerformanceCompetency c LEFT JOIN Hr_T_SkillLevel l ON l.Id = c.ManagerLevelId AND l.IsDeleted = 0 WHERE c.ReviewId = @ReviewId AND c.IsDeleted = 0; UPDATE f SET Score = x.Score FROM Hr_T_PerformanceFeedback f OUTER APPLY ( SELECT CAST(AVG(CAST(l.Progress AS decimal(9, 2))) AS decimal(6, 2)) AS Score FROM Hr_T_PerformanceFeedbackScore s INNER JOIN Hr_T_SkillLevel l ON l.Id = s.LevelId AND l.IsDeleted = 0 WHERE s.FeedbackId = f.Id AND s.IsDeleted = 0) x WHERE f.ReviewId = @ReviewId AND f.IsDeleted = 0; UPDATE rv SET GoalScore = gs.Score, CompetencyScore = cs.Score, Feedback360Score = fs.Score, OverallScore = CASE WHEN gs.Score IS NULL AND cs.Score IS NULL THEN NULL ELSE CAST((COALESCE(gs.Score, 0) * p.GoalWeight + COALESCE(cs.Score, 0) * p.CompetencyWeight) / 100 AS decimal(6, 2)) END FROM Hr_T_PerformanceReview rv INNER JOIN Hr_T_PerformancePeriod p ON p.Id = rv.PeriodId OUTER APPLY ( SELECT CASE WHEN COUNT(*) = 0 THEN NULL ELSE CAST(SUM(COALESCE(g.AchievementRate, 0) * g.Weight) / 100 AS decimal(6, 2)) END AS Score FROM Hr_T_PerformanceGoal g WHERE g.ReviewId = rv.Id AND g.IsDeleted = 0) gs OUTER APPLY ( SELECT CAST(AVG(c.Score) AS decimal(6, 2)) AS Score FROM Hr_T_PerformanceCompetency c WHERE c.ReviewId = rv.Id AND c.IsDeleted = 0 AND c.Score IS NOT NULL) cs OUTER APPLY ( SELECT CAST(AVG(f.Score) AS decimal(6, 2)) AS Score FROM Hr_T_PerformanceFeedback f WHERE f.ReviewId = rv.Id AND f.IsDeleted = 0 AND f.Status = N'Submitted' AND f.Score IS NOT NULL) fs WHERE rv.Id = @ReviewId; -- Derece kalibre puandan, yoksa genel puandan; aralık alt sınırı dahil, üst sınırı hariçtir. UPDATE rv SET RatingId = ( SELECT TOP 1 rt.Id FROM Hr_T_PerformanceRating rt WHERE rt.IsDeleted = 0 AND rt.IsActive = 1 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) FROM Hr_T_PerformanceReview rv WHERE rv.Id = @ReviewId; END GO