55 lines
3.5 KiB
PL/PgSQL
55 lines
3.5 KiB
PL/PgSQL
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
|
||
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
|
||
$$;
|