sozsoft-platform/configs/seeds/postgres/object/Hr_S_PerformanceReviewAfterSave.sql

118 lines
6.7 KiB
MySQL
Raw Permalink Normal View History

2026-10-06 11:24:30 +00:00
CREATE OR REPLACE PROCEDURE public."Hr_S_PerformanceReviewAfterSave"(
p_ReviewId uuid,
p_UserId uuid,
p_Actor varchar(16)
)
LANGUAGE plpgsql
AS $$
DECLARE
v_Status varchar(16);
v_Last varchar(16);
v_EmployeeId uuid;
v_ManagerId uuid;
v_TenantId uuid;
v_Valid boolean;
BEGIN
SELECT "Status", COALESCE("LastStatus", 'GoalSetting'), "EmployeeId", "ManagerId", "TenantId"
INTO v_Status, v_Last, v_EmployeeId, v_ManagerId, v_TenantId
FROM "Hr_T_PerformanceReview"
WHERE "Id" = p_ReviewId AND "IsDeleted" = FALSE;
IF v_Status IS NULL THEN
RETURN;
END IF;
-- Elle açılan değerlendirmede organizasyon bilgisi çalışandan, yetkinlikler dönemin setinden gelir.
-- Ad, pano kartının başlığı olduğu için kayıtta metin olarak tutulur.
UPDATE "Hr_T_PerformanceReview" rv
SET "EmployeeName" = LEFT(LTRIM(COALESCE(u."Name", '') || ' ' || COALESCE(u."Surname", '')), 128),
"DepartmentId" = COALESCE(rv."DepartmentId", u."DepartmentId"),
"JobPositionId" = COALESCE(rv."JobPositionId", u."JobPositionId")
FROM "AbpUsers" u
WHERE u."Id" = rv."EmployeeId" AND rv."Id" = p_ReviewId;
INSERT INTO "Hr_T_PerformanceCompetency" ("Id", "TenantId", "ReviewId", "SkillId", "ExpectedLevelId", "IsActive", "CreationTime", "CreatorId", "IsDeleted")
SELECT gen_random_uuid(), rv."TenantId", rv."Id", ps."SkillId", ps."ExpectedLevelId", TRUE, NOW() AT TIME ZONE 'UTC', p_UserId, FALSE
FROM "Hr_T_PerformanceReview" rv
INNER JOIN "Hr_T_PerformancePeriodSkill" ps ON ps."PeriodId" = rv."PeriodId" AND ps."IsDeleted" = FALSE AND ps."IsActive" = TRUE
WHERE rv."Id" = p_ReviewId AND rv."Status" <> 'Completed'
AND NOT EXISTS (
SELECT 1 FROM "Hr_T_PerformanceCompetency" c
WHERE c."ReviewId" = rv."Id" AND c."SkillId" = ps."SkillId" AND c."IsDeleted" = FALSE);
IF v_Status <> v_Last THEN
-- İK her geçişi yapar; çalışan öz değerlendirmeyi gönderir; yönetici hedefleri onaylar,
-- değerlendirmesini kalibrasyona gönderir ya da kaydı bir önceki aşamaya iade eder.
v_Valid := CASE
WHEN p_Actor = 'Hr' THEN TRUE
WHEN p_Actor = 'Employee' AND v_Last = 'SelfReview' AND v_Status = 'ManagerReview' THEN TRUE
WHEN p_Actor = 'Manager' AND v_Last = 'GoalSetting' AND v_Status = 'SelfReview' THEN TRUE
WHEN p_Actor = 'Manager' AND v_Last = 'SelfReview' AND v_Status = 'GoalSetting' THEN TRUE
WHEN p_Actor = 'Manager' AND v_Last = 'ManagerReview' AND v_Status IN ('SelfReview', 'Calibration') THEN TRUE
ELSE FALSE
END;
-- Hedef belirleme ancak ağırlıkları toplamı 100 olan en az bir hedefle kapanır.
IF v_Valid AND v_Last = 'GoalSetting' AND v_Status <> 'GoalSetting' AND NOT EXISTS (
SELECT 1 FROM "Hr_T_PerformanceGoal" g
WHERE g."ReviewId" = p_ReviewId AND g."IsDeleted" = FALSE
HAVING SUM(g."Weight") = 100) THEN
v_Valid := FALSE;
END IF;
IF NOT v_Valid THEN
UPDATE "Hr_T_PerformanceReview" SET "Status" = v_Last WHERE "Id" = p_ReviewId;
v_Status := v_Last;
ELSE
UPDATE "Hr_T_PerformanceReview"
SET "LastStatus" = v_Status,
"SelfSubmittedDate" = CASE WHEN v_Status = 'ManagerReview' THEN NOW() AT TIME ZONE 'UTC' ELSE "SelfSubmittedDate" END,
"ManagerSubmittedDate" = CASE WHEN v_Status = 'Calibration' THEN NOW() AT TIME ZONE 'UTC' ELSE "ManagerSubmittedDate" END,
"CompletedDate" = CASE WHEN v_Status = 'Completed' THEN NOW() AT TIME ZONE 'UTC' ELSE NULL END
WHERE "Id" = p_ReviewId;
IF v_Status IN ('GoalSetting', 'SelfReview', 'Completed') THEN
CALL public."Hr_S_PerformanceNotify"(p_ReviewId, v_EmployeeId, 'PerformansDurumDegisti',
2026-10-19 14:35:08 +00:00
'Hr.Performance.Notification.Status.Subject', 'Hr.Performance.Notification.Status.Message', p_UserId);
2026-10-06 11:24:30 +00:00
END IF;
IF v_Status IN ('ManagerReview', 'Completed') THEN
CALL public."Hr_S_PerformanceNotify"(p_ReviewId, v_ManagerId, 'PerformansDurumDegisti',
2026-10-19 14:35:08 +00:00
'Hr.Performance.Notification.Status.Subject', 'Hr.Performance.Notification.Status.Message', p_UserId);
2026-10-06 11:24:30 +00:00
END IF;
-- Tamamlanan değerlendirmenin yönetici seviyeleri çalışanın yetkinlik profiline yazılır
-- (Progress 0–100 → UserSkill.Level 1–5).
IF v_Status = 'Completed' THEN
UPDATE "Adm_T_UserSkill" us
SET "Level" = x.lvl, "Note" = LEFT('Performans: ' || p."Name", 512),
"LastModificationTime" = NOW() AT TIME ZONE 'UTC', "LastModifierId" = p_UserId
FROM "Hr_T_PerformanceCompetency" c
INNER JOIN "Hr_T_SkillLevel" l ON l."Id" = c."ManagerLevelId"
INNER JOIN "Hr_T_PerformanceReview" rv ON rv."Id" = c."ReviewId"
INNER JOIN "Hr_T_PerformancePeriod" p ON p."Id" = rv."PeriodId"
CROSS JOIN LATERAL (SELECT CASE WHEN l."Progress" <= 20 THEN 1 WHEN l."Progress" >= 100 THEN 5 ELSE CAST(CEILING(l."Progress" / 20.0) AS integer) END AS lvl) x
WHERE c."SkillId" = us."SkillId" AND c."ReviewId" = p_ReviewId AND c."IsDeleted" = FALSE
AND us."UserId" = v_EmployeeId AND us."IsDeleted" = FALSE
AND (us."TenantId" = v_TenantId OR (us."TenantId" IS NULL AND v_TenantId IS NULL));
INSERT INTO "Adm_T_UserSkill" ("Id", "TenantId", "UserId", "SkillId", "Level", "Note", "CreationTime", "CreatorId", "IsDeleted")
SELECT gen_random_uuid(), v_TenantId, v_EmployeeId, c."SkillId", x.lvl, LEFT('Performans: ' || p."Name", 512), NOW() AT TIME ZONE 'UTC', p_UserId, FALSE
FROM "Hr_T_PerformanceCompetency" c
INNER JOIN "Hr_T_SkillLevel" l ON l."Id" = c."ManagerLevelId"
INNER JOIN "Hr_T_PerformanceReview" rv ON rv."Id" = c."ReviewId"
INNER JOIN "Hr_T_PerformancePeriod" p ON p."Id" = rv."PeriodId"
CROSS JOIN LATERAL (SELECT CASE WHEN l."Progress" <= 20 THEN 1 WHEN l."Progress" >= 100 THEN 5 ELSE CAST(CEILING(l."Progress" / 20.0) AS integer) END AS lvl) x
WHERE c."ReviewId" = p_ReviewId AND c."IsDeleted" = FALSE
AND NOT EXISTS (
SELECT 1 FROM "Adm_T_UserSkill" us
WHERE us."UserId" = v_EmployeeId AND us."SkillId" = c."SkillId" AND us."IsDeleted" = FALSE
AND (us."TenantId" = v_TenantId OR (us."TenantId" IS NULL AND v_TenantId IS NULL)));
END IF;
END IF;
END IF;
CALL public."Hr_S_PerformanceReviewRecalc"(p_ReviewId);
END
$$;