83 lines
3.4 KiB
MySQL
83 lines
3.4 KiB
MySQL
|
|
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
|