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

56 lines
3.5 KiB
MySQL
Raw Permalink Normal View History

2026-10-06 11:24:30 +00:00
CREATE OR REPLACE PROCEDURE public."Hr_S_PerformancePeriodActivate"(
p_PeriodId uuid,
p_ActorId uuid DEFAULT NULL
)
LANGUAGE plpgsql
AS $$
DECLARE
v_TenantId uuid;
v_ReviewIds uuid[];
v_EmployeeIds uuid[];
v_i integer;
BEGIN
SELECT "TenantId" INTO v_TenantId
FROM "Hr_T_PerformancePeriod"
WHERE "Id" = p_PeriodId AND "IsDeleted" = FALSE AND "Status" = 'Active';
IF NOT FOUND THEN
RETURN;
END IF;
-- Dönem aktif olduğunda kiracının aktif her kullanıcısına bir değerlendirme açılır; var olana
-- dokunulmaz, böylece dönem yeniden kaydedildiğinde yalnızca yeni katılan çalışanlar eklenir.
WITH created AS (
-- Şube: çalışanın departman şubesi, yoksa çalışana atanmış ilk şube, yoksa işlemi yapanın ilk şubesi (kolon NOT NULL).
INSERT INTO "Hr_T_PerformanceReview" ("Id", "TenantId", "BranchId", "PeriodId", "EmployeeId", "EmployeeName", "DepartmentId", "JobPositionId", "Status", "LastStatus", "IsActive", "CreationTime", "CreatorId", "IsDeleted")
SELECT gen_random_uuid(), v_TenantId, COALESCE((SELECT d."BranchId" FROM public."Hr_T_Department" d WHERE d."Id" = u."DepartmentId"), (SELECT b."Id" FROM public."Sas_T_Branch" b INNER JOIN public."Sas_T_BranchUsers" bu ON bu."BranchId" = b."Id" AND bu."UserId" = u."Id" WHERE b."IsDeleted" = FALSE AND b."IsActive" = TRUE ORDER BY b."Name" LIMIT 1), (SELECT b."Id" FROM public."Sas_T_Branch" b INNER JOIN public."Sas_T_BranchUsers" bu ON bu."BranchId" = b."Id" AND bu."UserId" = p_ActorId WHERE b."IsDeleted" = FALSE AND b."IsActive" = TRUE ORDER BY b."Name" LIMIT 1)), p_PeriodId, u."Id", LEFT(LTRIM(COALESCE(u."Name", '') || ' ' || COALESCE(u."Surname", '')), 128), u."DepartmentId", u."JobPositionId", 'GoalSetting', 'GoalSetting', TRUE, NOW() AT TIME ZONE 'UTC', p_ActorId, FALSE
2026-10-06 11:24:30 +00:00
FROM "AbpUsers" u
WHERE u."IsDeleted" = FALSE AND u."IsActive" = TRUE
AND (u."TenantId" = v_TenantId OR (u."TenantId" IS NULL AND v_TenantId IS NULL))
AND NOT EXISTS (
SELECT 1 FROM "Hr_T_PerformanceReview" rv
WHERE rv."PeriodId" = p_PeriodId AND rv."EmployeeId" = u."Id" AND rv."IsDeleted" = FALSE)
RETURNING "Id", "EmployeeId"
)
SELECT array_agg("Id"), array_agg("EmployeeId") INTO v_ReviewIds, v_EmployeeIds
FROM created;
-- Dönemin yetkinlik seti eksik olan her değerlendirmeye kopyalanır (sonradan eklenen yetkinlik dahil).
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_ActorId, 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."PeriodId" = p_PeriodId AND rv."IsDeleted" = FALSE 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_ReviewIds IS NOT NULL THEN
FOR v_i IN 1 .. array_length(v_ReviewIds, 1) LOOP
CALL public."Hr_S_PerformanceNotify"(v_ReviewIds[v_i], v_EmployeeIds[v_i], 'PerformansDurumDegisti',
2026-10-19 14:35:08 +00:00
'Hr.Performance.Notification.Status.Subject', 'Hr.Performance.Notification.Status.Message', p_ActorId);
2026-10-06 11:24:30 +00:00
END LOOP;
END IF;
END
$$;