import { Controller, Get, Post, Put, Delete, Patch, 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 HttpStatusCode from "../interfaces/http-status"; import { KpiUserRole, CreateKpiUserRole, UpdateKpiUserRole } from "../entities/kpiUserRole"; import HttpError from "../interfaces/http-error"; import { Not } from "typeorm"; import { KpiUserEvaluation } from "../entities/kpiUserEvaluation"; import { KpiRole } from "../entities/kpiRole"; @Route("api/v1/kpi/user/achievement/role") @Tags("KpiUserRole") @Security("bearerAuth") @Response( HttpStatusCode.INTERNAL_SERVER_ERROR, "เกิดข้อผิดพลาด ไม่สามารถแสดงรายการได้ กรุณาลองใหม่ในภายหลัง", ) @SuccessResponse(HttpStatusCode.OK, "สำเร็จ") export class KpiUserRoleController extends Controller { private kpiUserRoleRepository = AppDataSource.getRepository(KpiUserRole); private kpiUserEvaluationRepository = AppDataSource.getRepository(KpiUserEvaluation); private kpiRoleRepository = AppDataSource.getRepository(KpiRole); /** * API เพิ่มงานตามหน้าที่ความรับผิดชอบหลัก * * @summary - เพิ่มงานตามหน้าที่ความรับผิดชอบหลัก #48 * */ @Post() async createKpiUserRole( @Body() requestBody: CreateKpiUserRole, @Request() request: { user: Record }, ) { const chkUserEvaluation = await this.kpiUserEvaluationRepository.findOne({ where:{id:requestBody.kpiUserEvaluationId}, }) if (!chkUserEvaluation) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลแบบประเมินผู้ใช้งาน"); } const chkKpiRole = await this.kpiRoleRepository.findOne({ where:{id:requestBody.kpiRoleId}, }) if (!chkKpiRole) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลแบบประเมินตามหน้าที่ความรับผิดชอบหลัก"); } const kpiUserRole = Object.assign(new KpiUserRole(), requestBody); if (!kpiUserRole) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); } kpiUserRole.createdUserId = request.user.sub; kpiUserRole.createdFullName = request.user.name; kpiUserRole.lastUpdateUserId = request.user.sub; kpiUserRole.lastUpdateFullName = request.user.name; await this.kpiUserRoleRepository.save(kpiUserRole); return new HttpSuccess(kpiUserRole.id); } /** * API แก้ไขงานตามหน้าที่ความรับผิดชอบหลัก * * @summary - แก้ไขงานตามหน้าที่ความรับผิดชอบหลัก #49 * * @param {string} id Id งานตามหน้าที่ความรับผิดชอบหลัก */ @Put("{id}") async editKpiUserRole( @Path() id: string, @Body() requestBody: UpdateKpiUserRole, @Request() request: { user: Record }, ) { const kpiUserRole = await this.kpiUserRoleRepository.findOne({ where: { id } }); if (!kpiUserRole) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลงานตามหน้าที่ความรับผิดชอบหลักนี้"); } const chkUserEvaluation = await this.kpiUserEvaluationRepository.findOne({ where:{id:requestBody.kpiUserEvaluationId}, }) if (!chkUserEvaluation) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลแบบประเมินผู้ใช้งาน"); } const chkKpiRole = await this.kpiRoleRepository.findOne({ where:{id:requestBody.kpiRoleId}, }) if (!chkKpiRole) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลแบบประเมินตามหน้าที่ความรับผิดชอบหลัก"); } kpiUserRole.lastUpdateUserId = request.user.sub; kpiUserRole.lastUpdateFullName = request.user.name; this.kpiUserRoleRepository.merge(kpiUserRole, requestBody); await this.kpiUserRoleRepository.save(kpiUserRole); return new HttpSuccess(kpiUserRole.id); } /** * API ลบงานตามหน้าที่ความรับผิดชอบหลัก * * @summary - ลบงานตามหน้าที่ความรับผิดชอบหลัก #50 * * @param {string} id Id ตำแหน่ง */ @Delete("{id}") async deleteKpiUserRole(@Path() id: string) { const delKpiUserRole = await this.kpiUserRoleRepository.findOne({ where: { id } }); if (!delKpiUserRole) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลงานตามหน้าที่ความรับผิดชอบหลักนี้"); } await this.kpiUserRoleRepository.remove(delKpiUserRole); return new HttpSuccess(); } // /** // * API รายละเอียดงานตามหน้าที่ความรับผิดชอบหลัก // * // * @summary - รายละเอียดงานตามหน้าที่ความรับผิดชอบหลัก #51 // * // * @param {string} id Id งานตามหน้าที่ความรับผิดชอบหลัก // */ // @Get("{id}") // async GetKpiUserRoleDetail(@Path() id: string) { // const getKpiUserRole = await this.kpiUserRoleRepository.findOne({ // select: ["id", "kpiUserRoleName", "kpiUserRoleRank"], // relations: ["posLevels"], // where: { id: id }, // }); // if (!getKpiUserRole) { // throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลงานตามหน้าที่ความรับผิดชอบหลักนี้"); // } // const mapGetKpiUserRole = { // id: getKpiUserRole.id, // kpiUserRoleName: getKpiUserRole.kpiUserRoleName, // kpiUserRoleRank: getKpiUserRole.kpiUserRoleRank, // posLevels: getKpiUserRole.posLevels // .sort((a, b) => a.posLevelRank - b.posLevelRank) // .map((posLevel) => ({ // id: posLevel.id, // posLevelName: posLevel.posLevelName, // posLevelRank: posLevel.posLevelRank, // posLevelAuthority: posLevel.posLevelAuthority, // })), // }; // return new HttpSuccess(mapGetKpiUserRole); // } /** * API รายการงานตามหน้าที่ความรับผิดชอบหลัก * * @summary - รายการงานตามหน้าที่ความรับผิดชอบหลัก #29 * */ @Get() async GetKpiUserRole( @Query("id") id: string , ) { const kpiUserRole = await this.kpiUserRoleRepository.find({ where:{ kpiUserEvaluationId:id }, relations: ["kpiRole","kpiUserEvaluation"], order: { createdAt: "ASC" }, }); // if (!kpiUserRole) { // return new HttpSuccess([]); // } const mapKpiUserRole = kpiUserRole.map((item) => ({ id: item.id, evaluationId: item.kpiUserEvaluation.id, kpiRoleId: item.kpiRole.id, including: item.kpiRole.including, includingName: item.kpiRole.includingName, target: item.target, weight: item.weight, unit: item.unit, meaning: item.meaning, formula: item.formula, point: item.point, achievement: item.point === 1 ? "ระดับ 1" : item.point === 2 ? "ระดับ 2" : item.point === 3 ? "ระดับ 3" : item.point === 3 ? "ระดับ 4" : item.point === 3 ? "ระดับ 5" : null, achievement1: item.kpiRole.achievement1, achievement2: item.kpiRole.achievement2, achievement3: item.kpiRole.achievement3, achievement4: item.kpiRole.achievement4, achievement5: item.kpiRole.achievement5, })); return new HttpSuccess(mapKpiUserRole); } }