From c73fe877a053681035b230b086c599b01b28c00b Mon Sep 17 00:00:00 2001 From: kittapath <> Date: Fri, 12 Dec 2025 01:38:57 +0700 Subject: [PATCH] add permission brother --- .../KpiUserDevelopmentController.ts | 95 +++---- .../KpiUserEvaluationController.ts | 243 +++++++++--------- src/interfaces/permission.ts | 18 ++ 3 files changed, 184 insertions(+), 172 deletions(-) diff --git a/src/controllers/KpiUserDevelopmentController.ts b/src/controllers/KpiUserDevelopmentController.ts index 897aa26..fea06cb 100644 --- a/src/controllers/KpiUserDevelopmentController.ts +++ b/src/controllers/KpiUserDevelopmentController.ts @@ -66,7 +66,7 @@ export class KpiUserDevelopmentController extends Controller { } const chkName = await this.kpiUserDevelopmentRepository.findOne({ - where: { + where: { kpiUserEvaluationId: requestBody.kpiUserEvaluationId, name: requestBody.name, }, @@ -393,7 +393,7 @@ export class KpiUserDevelopmentController extends Controller { _data.child1 != undefined && _data.child1 != null ? _data.child1[0] != null ? `kpiUserEvaluation.child1DnaId IN (:...child1)` - : `kpiUserEvaluation.child1DnaId is null` + : `kpiUserEvaluation.child1DnaId is ${_data.privilege == "PARENT" ? "not null" : "null"}` : "1=1", { child1: _data.child1, @@ -458,66 +458,69 @@ export class KpiUserDevelopmentController extends Controller { .orWhere("kpiUserDevelopment.name LIKE :keyword", { keyword: `%${requestBody.keyword}%`, }) - .orWhere( "kpiUserEvaluation.org LIKE :keyword", { + .orWhere("kpiUserEvaluation.org LIKE :keyword", { keyword: `%${requestBody.keyword}%`, }) - .orWhere( "CONCAT(kpiUserEvaluation.child1,' ', kpiUserEvaluation.org) LIKE :keyword", { - keyword: `%${requestBody.keyword}%`, - }) - .orWhere( "CONCAT(kpiUserEvaluation.child2,' ', kpiUserEvaluation.child1,' ', kpiUserEvaluation.org) LIKE :keyword", { - keyword: `%${requestBody.keyword}%`, - }) - .orWhere( "CONCAT(kpiUserEvaluation.child3,' ', kpiUserEvaluation.child2,' ', kpiUserEvaluation.child1,' ', kpiUserEvaluation.org) LIKE :keyword", { - keyword: `%${requestBody.keyword}%`, - }) - .orWhere( "CONCAT(kpiUserEvaluation.child4,' ', kpiUserEvaluation.child3,' ', kpiUserEvaluation.child2,' ', kpiUserEvaluation.child1,' ', kpiUserEvaluation.org) LIKE :keyword", { + .orWhere("CONCAT(kpiUserEvaluation.child1,' ', kpiUserEvaluation.org) LIKE :keyword", { keyword: `%${requestBody.keyword}%`, }) + .orWhere( + "CONCAT(kpiUserEvaluation.child2,' ', kpiUserEvaluation.child1,' ', kpiUserEvaluation.org) LIKE :keyword", + { + keyword: `%${requestBody.keyword}%`, + }, + ) + .orWhere( + "CONCAT(kpiUserEvaluation.child3,' ', kpiUserEvaluation.child2,' ', kpiUserEvaluation.child1,' ', kpiUserEvaluation.org) LIKE :keyword", + { + keyword: `%${requestBody.keyword}%`, + }, + ) + .orWhere( + "CONCAT(kpiUserEvaluation.child4,' ', kpiUserEvaluation.child3,' ', kpiUserEvaluation.child2,' ', kpiUserEvaluation.child1,' ', kpiUserEvaluation.org) LIKE :keyword", + { + keyword: `%${requestBody.keyword}%`, + }, + ) .orWhere(conditionFullName, { keyword: `%${requestBody.keyword}%`, }); }), - ) + ); - if (requestBody.sortBy) { - if(requestBody.sortBy === "developmentName"){ - query = query.orderBy( - `kpiUserDevelopment.name`, - requestBody.descending ? "DESC" : "ASC" - ); - }else if (requestBody.sortBy === "organization"){ - query = query + if (requestBody.sortBy) { + if (requestBody.sortBy === "developmentName") { + query = query.orderBy(`kpiUserDevelopment.name`, requestBody.descending ? "DESC" : "ASC"); + } else if (requestBody.sortBy === "organization") { + query = query .orderBy(`kpiUserEvaluation.child4`, requestBody.descending ? "DESC" : "ASC") .addOrderBy(`kpiUserEvaluation.child3`, requestBody.descending ? "DESC" : "ASC") .addOrderBy(`kpiUserEvaluation.child2`, requestBody.descending ? "DESC" : "ASC") .addOrderBy(`kpiUserEvaluation.child1`, requestBody.descending ? "DESC" : "ASC") .addOrderBy(`kpiUserEvaluation.org`, requestBody.descending ? "DESC" : "ASC"); - }else if(requestBody.sortBy === "firstname"){ - query = query.orderBy( - `kpiUserEvaluation.firstName`, - requestBody.descending ? "DESC" : "ASC" - ); - }else if(requestBody.sortBy === "lastname"){ - query = query.orderBy( - `kpiUserEvaluation.lastName`, - requestBody.descending ? "DESC" : "ASC" - ); - }else if(requestBody.sortBy === "root"){ - query = query.orderBy( - `kpiUserEvaluation.org`, - requestBody.descending ? "DESC" : "ASC" - ); - }else{ - query = query.orderBy( - `kpiUserEvaluation.${requestBody.sortBy}`, - requestBody.descending ? "DESC" : "ASC" - ); - } - }else{ - query = query.orderBy("kpiUserDevelopment.createdAt", "ASC") + } else if (requestBody.sortBy === "firstname") { + query = query.orderBy( + `kpiUserEvaluation.firstName`, + requestBody.descending ? "DESC" : "ASC", + ); + } else if (requestBody.sortBy === "lastname") { + query = query.orderBy( + `kpiUserEvaluation.lastName`, + requestBody.descending ? "DESC" : "ASC", + ); + } else if (requestBody.sortBy === "root") { + query = query.orderBy(`kpiUserEvaluation.org`, requestBody.descending ? "DESC" : "ASC"); + } else { + query = query.orderBy( + `kpiUserEvaluation.${requestBody.sortBy}`, + requestBody.descending ? "DESC" : "ASC", + ); } + } else { + query = query.orderBy("kpiUserDevelopment.createdAt", "ASC"); + } - const [kpiUserDevelopment, total] = await query + const [kpiUserDevelopment, total] = await query .skip((requestBody.page - 1) * requestBody.pageSize) .take(requestBody.pageSize) .getManyAndCount(); diff --git a/src/controllers/KpiUserEvaluationController.ts b/src/controllers/KpiUserEvaluationController.ts index 4a95262..0545a5a 100644 --- a/src/controllers/KpiUserEvaluationController.ts +++ b/src/controllers/KpiUserEvaluationController.ts @@ -186,16 +186,16 @@ export class KpiUserEvaluationController extends Controller { // }); }), ) - .orderBy("kpiUserEvaluation.createdAt", "DESC") + .orderBy("kpiUserEvaluation.createdAt", "DESC"); - if (requestBody.sortBy) { - query = query.orderBy( - `kpiUserEvaluation.${requestBody.sortBy}`, - requestBody.descending ? "DESC" : "ASC" - ); - } + if (requestBody.sortBy) { + query = query.orderBy( + `kpiUserEvaluation.${requestBody.sortBy}`, + requestBody.descending ? "DESC" : "ASC", + ); + } - const [kpiUserEvaluation, total] = await query + const [kpiUserEvaluation, total] = await query .skip((requestBody.page - 1) * requestBody.pageSize) .take(requestBody.pageSize) .getManyAndCount(); @@ -271,7 +271,7 @@ export class KpiUserEvaluationController extends Controller { _data.child1 != undefined && _data.child1 != null ? _data.child1[0] != null ? `kpiUserEvaluation.child1DnaId IN (:...child1)` - : `kpiUserEvaluation.child1DnaId is null` + : `kpiUserEvaluation.child1DnaId is ${_data.privilege == "PARENT" ? "not null" : "null"}` : "1=1", { child1: _data.child1, @@ -386,30 +386,27 @@ export class KpiUserEvaluationController extends Controller { keyword: `%${requestBody.keyword}%`, }); }), - ) + ); - if (requestBody.sortBy) { - if(requestBody.sortBy === "root"){ - query = query.orderBy( - `kpiUserEvaluation.org`, - requestBody.descending ? "DESC" : "ASC" - ); - }else if(requestBody.sortBy === "organization"){ - query = query - .orderBy(`kpiUserEvaluation.child4`, requestBody.descending ? "DESC" : "ASC") - .addOrderBy(`kpiUserEvaluation.child3`, requestBody.descending ? "DESC" : "ASC") - .addOrderBy(`kpiUserEvaluation.child2`, requestBody.descending ? "DESC" : "ASC") - .addOrderBy(`kpiUserEvaluation.child1`, requestBody.descending ? "DESC" : "ASC") - .addOrderBy(`kpiUserEvaluation.org`, requestBody.descending ? "DESC" : "ASC"); - }else{ - query = query.orderBy( - `kpiUserEvaluation.${requestBody.sortBy}`, - requestBody.descending ? "DESC" : "ASC" - ); - } - }else{ - query = query.orderBy("kpiUserEvaluation.createdAt", "DESC") + if (requestBody.sortBy) { + if (requestBody.sortBy === "root") { + query = query.orderBy(`kpiUserEvaluation.org`, requestBody.descending ? "DESC" : "ASC"); + } else if (requestBody.sortBy === "organization") { + query = query + .orderBy(`kpiUserEvaluation.child4`, requestBody.descending ? "DESC" : "ASC") + .addOrderBy(`kpiUserEvaluation.child3`, requestBody.descending ? "DESC" : "ASC") + .addOrderBy(`kpiUserEvaluation.child2`, requestBody.descending ? "DESC" : "ASC") + .addOrderBy(`kpiUserEvaluation.child1`, requestBody.descending ? "DESC" : "ASC") + .addOrderBy(`kpiUserEvaluation.org`, requestBody.descending ? "DESC" : "ASC"); + } else { + query = query.orderBy( + `kpiUserEvaluation.${requestBody.sortBy}`, + requestBody.descending ? "DESC" : "ASC", + ); } + } else { + query = query.orderBy("kpiUserEvaluation.createdAt", "DESC"); + } const [kpiUserEvaluation, total] = await query .skip((requestBody.page - 1) * requestBody.pageSize) @@ -556,7 +553,7 @@ export class KpiUserEvaluationController extends Controller { _data.child1 != undefined && _data.child1 != null ? _data.child1[0] != null ? `kpiUserEvaluation.child1DnaId IN (:...child1)` - : `kpiUserEvaluation.child1DnaId is null` + : `kpiUserEvaluation.child1DnaId is ${_data.privilege == "PARENT" ? "not null" : "null"}` : "1=1", { child1: _data.child1, @@ -591,31 +588,29 @@ export class KpiUserEvaluationController extends Controller { { child4: _data.child4, }, - ) + ); - if (requestBody.sortBy) { - if(requestBody.sortBy === "root"){ - query = query.orderBy( - `kpiUserEvaluation.org`, - requestBody.descending ? "DESC" : "ASC" - ); - }else if(requestBody.sortBy === "organization"){ - query = query - .orderBy(`kpiUserEvaluation.child4`, requestBody.descending ? "DESC" : "ASC") - .addOrderBy(`kpiUserEvaluation.child3`, requestBody.descending ? "DESC" : "ASC") - .addOrderBy(`kpiUserEvaluation.child2`, requestBody.descending ? "DESC" : "ASC") - .addOrderBy(`kpiUserEvaluation.child1`, requestBody.descending ? "DESC" : "ASC") - .addOrderBy(`kpiUserEvaluation.org`, requestBody.descending ? "DESC" : "ASC"); - }else{ - query = query.orderBy( - `kpiUserEvaluation.${requestBody.sortBy}`, - requestBody.descending ? "DESC" : "ASC" - ); - } - }else{ - query = query.orderBy("kpiPeriod.year", "DESC") - .addOrderBy("kpiUserEvaluation.createdAt", "DESC") + if (requestBody.sortBy) { + if (requestBody.sortBy === "root") { + query = query.orderBy(`kpiUserEvaluation.org`, requestBody.descending ? "DESC" : "ASC"); + } else if (requestBody.sortBy === "organization") { + query = query + .orderBy(`kpiUserEvaluation.child4`, requestBody.descending ? "DESC" : "ASC") + .addOrderBy(`kpiUserEvaluation.child3`, requestBody.descending ? "DESC" : "ASC") + .addOrderBy(`kpiUserEvaluation.child2`, requestBody.descending ? "DESC" : "ASC") + .addOrderBy(`kpiUserEvaluation.child1`, requestBody.descending ? "DESC" : "ASC") + .addOrderBy(`kpiUserEvaluation.org`, requestBody.descending ? "DESC" : "ASC"); + } else { + query = query.orderBy( + `kpiUserEvaluation.${requestBody.sortBy}`, + requestBody.descending ? "DESC" : "ASC", + ); } + } else { + query = query + .orderBy("kpiPeriod.year", "DESC") + .addOrderBy("kpiUserEvaluation.createdAt", "DESC"); + } const [kpiUserEvaluation, total] = await query .skip((requestBody.page - 1) * requestBody.pageSize) @@ -667,10 +662,12 @@ export class KpiUserEvaluationController extends Controller { @Body() requestBody: createKpiUserEvaluation, @Request() request: RequestWithUser, ) { - if(requestBody.evaluatorId == requestBody.commanderId || - requestBody.commanderId == requestBody.commanderHighId || - requestBody.evaluatorId == requestBody.commanderHighId){ - throw new HttpError( + if ( + requestBody.evaluatorId == requestBody.commanderId || + requestBody.commanderId == requestBody.commanderHighId || + requestBody.evaluatorId == requestBody.commanderHighId + ) { + throw new HttpError( HttpStatusCode.NOT_FOUND, "ไม่สามารถเลือกผู้ประเมินหรือผู้บังคับบัญชาซ้ำกันได้", ); @@ -1345,7 +1342,7 @@ export class KpiUserEvaluationController extends Controller { @Body() requestBody: { reason: string; actor: string }, @Request() request: RequestWithUser, ) { - try{ + try { const kpiUserEvaluation = await this.kpiUserEvalutionRepository.findOne({ where: { id: id }, }); @@ -1590,23 +1587,17 @@ export class KpiUserEvaluationController extends Controller { evaluationResults: results == undefined ? "" : results.trim().toUpperCase(), }, ) - .orderBy("kpiUserEvaluation.createdAt", "DESC") + .orderBy("kpiUserEvaluation.createdAt", "DESC"); - if (sortBy) { - if (["year", "durationKPI"].includes(sortBy)) { - query = query.orderBy( - `kpiPeriod.${sortBy}`, - descending ? "DESC" : "ASC" - ); - } else { - query = query.orderBy( - `kpiUserEvaluation.${sortBy}`, - descending ? "DESC" : "ASC" - ); - } + if (sortBy) { + if (["year", "durationKPI"].includes(sortBy)) { + query = query.orderBy(`kpiPeriod.${sortBy}`, descending ? "DESC" : "ASC"); + } else { + query = query.orderBy(`kpiUserEvaluation.${sortBy}`, descending ? "DESC" : "ASC"); } + } - const [kpiUserEvaluation, total] = await query + const [kpiUserEvaluation, total] = await query .skip((page - 1) * pageSize) .take(pageSize) .getManyAndCount(); @@ -1905,23 +1896,23 @@ export class KpiUserEvaluationController extends Controller { } else { item.evaluationReqEdit = requestBody.status.trim().toUpperCase(); item.evaluationStatus = "NEW"; - await new CallAPI() - .PostData(request, "/placement/noti/profiles", { - subject: `คำขอแก้ไขข้อตกลงการประเมินผลการปฏิบัติราชการระดับบุคคลได้รับการพิจารณาแล้ว`, - body: `คำขอแก้ไขข้อตกลงการประเมินผลการปฏิบัติราชการระดับบุคคลได้รับการพิจารณาแล้ว`, - receiverUserIds: [ - { - receiverUserId: item.profileId, - notiLink: `${process.env.VITE_URL_USER}/KPI-evaluator/${item.id}`, - }, - ], - payload: "", - isSendMail: true, - isSendInbox: true, - isSendNotification: true, - }) - .then(() => {}) - .catch(() => {}); + await new CallAPI() + .PostData(request, "/placement/noti/profiles", { + subject: `คำขอแก้ไขข้อตกลงการประเมินผลการปฏิบัติราชการระดับบุคคลได้รับการพิจารณาแล้ว`, + body: `คำขอแก้ไขข้อตกลงการประเมินผลการปฏิบัติราชการระดับบุคคลได้รับการพิจารณาแล้ว`, + receiverUserIds: [ + { + receiverUserId: item.profileId, + notiLink: `${process.env.VITE_URL_USER}/KPI-evaluator/${item.id}`, + }, + ], + payload: "", + isSendMail: true, + isSendInbox: true, + isSendNotification: true, + }) + .then(() => {}) + .catch(() => {}); } } else { item.evaluationReqEdit = requestBody.status.trim().toUpperCase(); @@ -2305,41 +2296,41 @@ export class KpiUserEvaluationController extends Controller { } const _null: any = null; kpiUserEvaluation.evaluationStatus = "COMPLETE"; - await new CallAPI() - if (kpiUserEvaluation.evaluatorId == null) { - await new CallAPI() - .PostData(request, "/placement/noti/keycloak", { - subject: `${kpiUserEvaluation.prefix}${kpiUserEvaluation.firstName} ${kpiUserEvaluation.lastName} ผู้ประเมินได้ให้ความเห็นโดยเห็นสมควรตามผลการประเมิน`, - body: `${kpiUserEvaluation.prefix}${kpiUserEvaluation.firstName} ${kpiUserEvaluation.lastName} ผู้ประเมินได้ให้ความเห็นโดยเห็นสมควรตามผลการประเมิน`, - receiverUserId: "aec26ac3-417c-4cf9-9cbe-874939f99ecc", - payload: "", - isSendMail: true, - isSendInbox: true, - isSendNotification: true, - }) - .then(() => {}) - .catch(() => {}); - kpiUserEvaluation.evaluationStatus = "COMPLETE"; - } else { - await new CallAPI() - .PostData(request, "/placement/noti/profile", { - subject: `${kpiUserEvaluation.prefix}${kpiUserEvaluation.firstName} ${kpiUserEvaluation.lastName} ผู้ประเมินได้ให้ความเห็นโดยเห็นสมควรตามผลการประเมิน`, - body: `${kpiUserEvaluation.prefix}${kpiUserEvaluation.firstName} ${kpiUserEvaluation.lastName} ผู้ประเมินได้ให้ความเห็นโดยเห็นสมควรตามผลการประเมิน`, - receiverUserIds: [ - { - receiverUserId: kpiUserEvaluation.evaluatorId, - notiLink: `${process.env.VITE_URL_USER}/KPI-evaluator/${kpiUserEvaluation.id}`, - }, - ], - payload: "", - isSendMail: true, - isSendInbox: true, - isSendNotification: true, - }) - .then(() => {}) - .catch(() => {}); - kpiUserEvaluation.evaluationStatus = "COMPLETE"; - } + await new CallAPI(); + if (kpiUserEvaluation.evaluatorId == null) { + await new CallAPI() + .PostData(request, "/placement/noti/keycloak", { + subject: `${kpiUserEvaluation.prefix}${kpiUserEvaluation.firstName} ${kpiUserEvaluation.lastName} ผู้ประเมินได้ให้ความเห็นโดยเห็นสมควรตามผลการประเมิน`, + body: `${kpiUserEvaluation.prefix}${kpiUserEvaluation.firstName} ${kpiUserEvaluation.lastName} ผู้ประเมินได้ให้ความเห็นโดยเห็นสมควรตามผลการประเมิน`, + receiverUserId: "aec26ac3-417c-4cf9-9cbe-874939f99ecc", + payload: "", + isSendMail: true, + isSendInbox: true, + isSendNotification: true, + }) + .then(() => {}) + .catch(() => {}); + kpiUserEvaluation.evaluationStatus = "COMPLETE"; + } else { + await new CallAPI() + .PostData(request, "/placement/noti/profile", { + subject: `${kpiUserEvaluation.prefix}${kpiUserEvaluation.firstName} ${kpiUserEvaluation.lastName} ผู้ประเมินได้ให้ความเห็นโดยเห็นสมควรตามผลการประเมิน`, + body: `${kpiUserEvaluation.prefix}${kpiUserEvaluation.firstName} ${kpiUserEvaluation.lastName} ผู้ประเมินได้ให้ความเห็นโดยเห็นสมควรตามผลการประเมิน`, + receiverUserIds: [ + { + receiverUserId: kpiUserEvaluation.evaluatorId, + notiLink: `${process.env.VITE_URL_USER}/KPI-evaluator/${kpiUserEvaluation.id}`, + }, + ], + payload: "", + isSendMail: true, + isSendInbox: true, + isSendNotification: true, + }) + .then(() => {}) + .catch(() => {}); + kpiUserEvaluation.evaluationStatus = "COMPLETE"; + } const before = structuredClone(kpiUserEvaluation); kpiUserEvaluation.reasonReject = _null; diff --git a/src/interfaces/permission.ts b/src/interfaces/permission.ts index cfe76e6..1542ce4 100644 --- a/src/interfaces/permission.ts +++ b/src/interfaces/permission.ts @@ -94,6 +94,15 @@ class CheckAuth { child4: null, privilege: "ROOT", }; + } else if (privilege == "PARENT") { + data = { + root: [x.orgRootId], + child1: [null], + child2: null, + child3: null, + child4: null, + privilege: "PARENT", + }; } else if (privilege == "CHILD") { data = { root: node >= 0 ? [x.orgRootId] : null, @@ -103,6 +112,15 @@ class CheckAuth { child4: node >= 4 ? [x.orgChild4Id] : null, privilege: "CHILD", }; + } else if (privilege == "BROTHER") { + data = { + // root: node >= 0 ? [x.orgRootId] : null, + root: node >= 0 ? [x.orgRootId] : null, + child1: node >= 2 ? [x.orgChild1Id] : null, + child2: node >= 3 ? [x.orgChild2Id] : null, + child3: node >= 4 ? [x.orgChild3Id] : null, + privilege: "BROTHER", + }; } else if (privilege == "NORMAL") { data = { root: [x.orgRootId],