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 (
|
2026-10-14 21:12:14 +00:00
|
|
|
|
-- Ş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',
|
|
|
|
|
|
'App.Hr.Performance.Notification.Status.Subject', 'App.Hr.Performance.Notification.Status.Message', p_ActorId);
|
|
|
|
|
|
END LOOP;
|
|
|
|
|
|
END IF;
|
|
|
|
|
|
END
|
|
|
|
|
|
$$;
|