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 ( INSERT INTO "Hr_T_PerformanceReview" ("Id", "TenantId", "PeriodId", "EmployeeId", "EmployeeName", "DepartmentId", "JobPositionId", "Status", "LastStatus", "IsActive", "CreationTime", "CreatorId", "IsDeleted") SELECT gen_random_uuid(), v_TenantId, 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 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', 'App.Hr.Performance.Notification.Status.Subject', 'App.Hr.Performance.Notification.Status.Message', p_ActorId); END LOOP; END IF; END $$;