import { Controller, Get, Post, Put, Delete, Route, Security, Tags, Body, Path, Request, Example, SuccessResponse, Response, Query, } from "tsoa"; import { AppDataSource } from "../database/data-source"; import HttpSuccess from "../interfaces/http-success"; import HttpError from "../interfaces/http-error"; import HttpStatusCode from "../interfaces/http-status"; import { KpiRole, createKpiRole, updateKpiRole } from "../entities/kpiRole"; import CallAPI from "../interfaces/call-api"; import { KpiPeriod } from "../entities/kpiPeriod"; @Route("api/v1/kpi/role") @Tags("kpiRole") @Security("bearerAuth") @Response( HttpStatusCode.INTERNAL_SERVER_ERROR, "เกิดข้อผิดพลาด ไม่สามารถแสดงรายการได้ กรุณาลองใหม่ในภายหลัง", ) @SuccessResponse(HttpStatusCode.OK, "สำเร็จ") export class kpiRoleController extends Controller { private kpiRoleRepository = AppDataSource.getRepository(KpiRole); private kpiPeriodRepository = AppDataSource.getRepository(KpiPeriod); /** * สร้างตัวชี้วัดตามตำแหน่ง * @param requestBody * @param request */ @Post() async createKpiRole( @Body() requestBody: createKpiRole, @Request() request: { user: Record }, ) { const kpiRole = Object.assign(new KpiRole(), requestBody); if (requestBody.kpiPeriodId != null) { const kpiPeriod = await this.kpiPeriodRepository.findOne({ where: { id: requestBody.kpiPeriodId }, }); if (!kpiPeriod) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลตัวชี้วัดตามตำแหน่งนี้"); } } await new CallAPI() .PostData(request, "org/find/all", { node: requestBody.node, nodeId: requestBody.nodeId, }) .then((x) => { kpiRole.root = x.root; kpiRole.rootId = x.rootId; kpiRole.rootShortName = x.rootShortName; kpiRole.child1 = requestBody.node <= 0 ? null : x.child1; kpiRole.child1Id = requestBody.node <= 0 ? null : x.child1Id; kpiRole.child1ShortName = requestBody.node <= 0 ? null : x.child1ShortName; kpiRole.child2 = requestBody.node <= 1 ? null : x.child2; kpiRole.child2Id = requestBody.node <= 1 ? null : x.child2Id; kpiRole.child2ShortName = requestBody.node <= 1 ? null : x.child2ShortName; kpiRole.child3 = requestBody.node <= 2 ? null : x.child3; kpiRole.child3Id = requestBody.node <= 2 ? null : x.child3Id; kpiRole.child3ShortName = requestBody.node <= 2 ? null : x.child3ShortName; kpiRole.child4 = requestBody.node <= 3 ? null : x.child4; kpiRole.child4Id = requestBody.node <= 3 ? null : x.child4Id; kpiRole.child4ShortName = requestBody.node <= 3 ? null : x.child4ShortName; }) .catch((x) => {}); kpiRole.createdUserId = request.user.sub; kpiRole.createdFullName = request.user.name; kpiRole.lastUpdateUserId = request.user.sub; kpiRole.lastUpdateFullName = request.user.name; await this.kpiRoleRepository.save(kpiRole); return new HttpSuccess(kpiRole.id); } /** * API แก้ไขตัวชี้วัดตามตำแหน่ง * @param id * @param requestBody * @param request */ @Put("{id}") async updateKpiRole( @Path() id: string, @Body() requestBody: updateKpiRole, @Request() request: { user: Record }, ) { const kpiRole = await this.kpiRoleRepository.findOne({ where: { id: id }, }); if (!kpiRole) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลตัวชี้วัดตามตำแหน่งนี้"); } if (requestBody.kpiPeriodId != null) { const kpiPeriod = await this.kpiPeriodRepository.findOne({ where: { id: requestBody.kpiPeriodId }, }); if (!kpiPeriod) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลตัวชี้วัดตามตำแหน่งนี้"); } } Object.assign(kpiRole, requestBody); await new CallAPI() .PostData(request, "org/find/all", { node: requestBody.node, nodeId: requestBody.nodeId, }) .then((x) => { kpiRole.root = x.root; kpiRole.rootId = x.rootId; kpiRole.rootShortName = x.rootShortName; kpiRole.child1 = requestBody.node <= 0 ? null : x.child1; kpiRole.child1Id = requestBody.node <= 0 ? null : x.child1Id; kpiRole.child1ShortName = requestBody.node <= 0 ? null : x.child1ShortName; kpiRole.child2 = requestBody.node <= 1 ? null : x.child2; kpiRole.child2Id = requestBody.node <= 1 ? null : x.child2Id; kpiRole.child2ShortName = requestBody.node <= 1 ? null : x.child2ShortName; kpiRole.child3 = requestBody.node <= 2 ? null : x.child3; kpiRole.child3Id = requestBody.node <= 2 ? null : x.child3Id; kpiRole.child3ShortName = requestBody.node <= 2 ? null : x.child3ShortName; kpiRole.child4 = requestBody.node <= 3 ? null : x.child4; kpiRole.child4Id = requestBody.node <= 3 ? null : x.child4Id; kpiRole.child4ShortName = requestBody.node <= 3 ? null : x.child4ShortName; }) .catch((x) => {}); kpiRole.createdUserId = request.user.sub; kpiRole.createdFullName = request.user.name; kpiRole.lastUpdateUserId = request.user.sub; kpiRole.lastUpdateFullName = request.user.name; await this.kpiRoleRepository.save(kpiRole); return new HttpSuccess(id); } /** * API ตัวชี้วัดตามตำแหน่ง * @param id Guid, *Id ตัวชี้วัดตามตำแหน่ง */ @Get("{id}") async GetKpiRoleById(@Path() id: string) { const kpiRole = await this.kpiRoleRepository.findOne({ where: { id: id }, relations: { kpiPeriod: true }, }); if (!kpiRole) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลตัวชี้วัดตามตำแหน่งนี้"); } let node = null; let nodeId = null; let nodeName = null; if (kpiRole.child4Id != null) { node = 4; nodeId = kpiRole.child4Id; nodeName = kpiRole.child4; } else if (kpiRole.child3Id != null) { node = 3; nodeId = kpiRole.child3Id; nodeName = kpiRole.child3; } else if (kpiRole.child2Id != null) { node = 2; nodeId = kpiRole.child2Id; nodeName = kpiRole.child2; } else if (kpiRole.child1Id != null) { node = 1; nodeId = kpiRole.child1Id; nodeName = kpiRole.child1; } else if (kpiRole.rootId != null) { node = 0; nodeId = kpiRole.rootId; nodeName = kpiRole.root; } const formattedData = { id: kpiRole.id, year: kpiRole.kpiPeriod == null ? null : kpiRole.kpiPeriod.year, round: kpiRole.kpiPeriod == null ? null : kpiRole.kpiPeriod.durationKPI, kpiPeriodId: kpiRole.kpiPeriodId, including: kpiRole.including, includingName: kpiRole.includingName, target: kpiRole.target, unit: kpiRole.unit, weight: kpiRole.weight, achievement1: kpiRole.achievement1, achievement2: kpiRole.achievement2, achievement3: kpiRole.achievement3, achievement4: kpiRole.achievement4, achievement5: kpiRole.achievement5, meaning: kpiRole.meaning, formula: kpiRole.formula, root: kpiRole.rootId, child1: kpiRole.child1Id, child2: kpiRole.child2Id, child3: kpiRole.child3Id, child4: kpiRole.child4Id, node: node, nodeId: nodeId, nodeName: nodeName, orgRevisionId: kpiRole.orgRevisionId, position: kpiRole.position, }; return new HttpSuccess(formattedData); } /** * API list ตัวชี้วัดตามตำแหน่ง * @param page * @param pageSize * @param keyword */ @Get() async listKpiRole( @Query("page") page: number = 1, @Query("pageSize") pageSize: number = 10, @Query("kpiPeriodId") kpiPeriodId?: string, @Query("nodeId") nodeId?: string | null, @Query("node") node?: number | null, @Query("keyword") keyword?: string, @Query("position") position?: string, ) { const [kpiRole, total] = await AppDataSource.getRepository(KpiRole) .createQueryBuilder("kpiRole") .leftJoinAndSelect("kpiRole.kpiPeriod", "kpiPeriod") .andWhere( node != undefined && node != null ? node == 4 ? "kpiRole.child4Id LIKE :nodeId" : node == 3 ? "kpiRole.child3Id LIKE :nodeId" : node == 2 ? "kpiRole.child2Id LIKE :nodeId" : node == 1 ? "kpiRole.child1Id LIKE :nodeId" : "kpiRole.rootId LIKE :nodeId" : "1=1", { nodeId: `${nodeId}`, }, ) .andWhere( kpiPeriodId != undefined && kpiPeriodId != null && kpiPeriodId != "" ? "kpiRole.kpiPeriod LIKE :kpiPeriodId" : "1=1", { kpiPeriodId: `${kpiPeriodId}`, }, ) .andWhere(position != undefined ? "kpiRole.position LIKE :position" : "1=1", { position: `%${position}%`, }) .select([ "kpiRole.id", "kpiPeriod.year", "kpiPeriod.durationKPI", "kpiRole.including", "kpiRole.includingName", "kpiRole.createdAt", ]) .orderBy("kpiRole.createdAt", "DESC") .skip((page - 1) * pageSize) .take(pageSize) .getManyAndCount(); return new HttpSuccess({ data: kpiRole, total }); } /** * API ลบตัวชี้วัดตามตำแหน่ง * @param id */ @Delete("{id}") async deleteKpiRole(@Path() id: string) { const kpiRole = await this.kpiRoleRepository.findOne({ where: { id: id }, }); if (!kpiRole) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลตัวชี้วัดตามตำแหน่งนี้"); } await this.kpiRoleRepository.remove(kpiRole); return new HttpSuccess(); } }