import { Body, Controller, Delete, Get, Patch, Path, Post, Request, Route, Security, Tags, Query, } from "tsoa"; import { AppDataSource } from "../database/data-source"; import HttpSuccess from "../interfaces/http-success"; import HttpStatus from "../interfaces/http-status"; import HttpError from "../interfaces/http-error"; import { ProfileDevelopmentHistory } from "../entities/ProfileDevelopmentHistory"; import { RequestWithUser } from "../middlewares/user"; import { Profile } from "../entities/Profile"; import { CreateProfileDevelopment, ProfileDevelopment, UpdateProfileDevelopment, } from "../entities/ProfileDevelopment"; import permission from "../interfaces/permission"; import { DevelopmentProject } from "../entities/DevelopmentProject"; import { In, Brackets } from "typeorm"; import { DevelopmentRequest } from "../entities/DevelopmentRequest"; @Route("api/v1/org/profile/development") @Tags("ProfileDevelopment") @Security("bearerAuth") export class ProfileDevelopmentController extends Controller { private profileRepository = AppDataSource.getRepository(Profile); private developmentRepository = AppDataSource.getRepository(ProfileDevelopment); private developmentHistoryRepository = AppDataSource.getRepository(ProfileDevelopmentHistory); private developmentProjectRepository = AppDataSource.getRepository(DevelopmentProject); private developmentRequestRepository = AppDataSource.getRepository(DevelopmentRequest); @Get("user") public async getDevelopmentUser(@Request() request: { user: Record }) { const profile = await this.profileRepository.findOneBy({ keycloak: request.user.sub }); if (!profile) { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const lists = await this.developmentRepository.find({ where: { profileId: profile.id }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); } @Get("{profileId}") public async getDevelopment( @Path() profileId: string, @Request() req: RequestWithUser, @Query("page") page: number = 1, @Query("pageSize") pageSize: number = 10, @Query() searchKeyword: string = "", ) { let _workflow = await new permission().Workflow(req, profileId, "SYS_REGISTRY_OFFICER"); if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_OFFICER", profileId); const [profileDevelopment, total] = await AppDataSource.getRepository(ProfileDevelopment) .createQueryBuilder("profileDevelopment") .where({ profileId: profileId }) .andWhere( new Brackets((qb) => { qb.where( searchKeyword != undefined && searchKeyword != null && searchKeyword != "" ? "profileDevelopment.name LIKE :keyword" : "1=1", { keyword: `%${searchKeyword}%`, }, ) .orWhere( searchKeyword != undefined && searchKeyword != null && searchKeyword != "" ? "profileDevelopment.developmentTarget LIKE :keyword" : "1=1", { keyword: `%${searchKeyword}%`, }, ) .orWhere( searchKeyword != undefined && searchKeyword != null && searchKeyword != "" ? "profileDevelopment.developmentResults LIKE :keyword" : "1=1", { keyword: `%${searchKeyword}%`, }, ) .orWhere( searchKeyword != undefined && searchKeyword != null && searchKeyword != "" ? "profileDevelopment.developmentReport LIKE :keyword" : "1=1", { keyword: `%${searchKeyword}%`, }, ); }), ) .orderBy("profileDevelopment.createdAt", "ASC") .skip((page - 1) * pageSize) .take(pageSize) .getManyAndCount(); return new HttpSuccess({ data: profileDevelopment, total }); } @Get("history/{developmentId}") public async developmentHistory(@Path() developmentId: string, @Request() req: RequestWithUser) { const _record = await this.developmentRepository.findOneBy({ id: developmentId }); if (_record) { let _workflow = await new permission().Workflow(req, developmentId, "SYS_REGISTRY_OFFICER"); if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_OFFICER", _record.profileId); } const record = await this.developmentHistoryRepository.find({ where: { profileDevelopmentId: developmentId }, order: { createdAt: "DESC" }, }); return new HttpSuccess(record); } @Get("registry/{type}/{developmentId}") public async developmentDetail( @Path() developmentId: string, @Path() type: string, @Request() req: RequestWithUser, ) { const data = await this.developmentRequestRepository.findOne({ where: { id: developmentId }, relations: ["developmentProjects"], }); if (!data) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบรายการพัฒนารายบุคคลดังกล่าว"); if (type.trim().toLocaleUpperCase() == "OFFICER") { let _workflow = await new permission().Workflow(req, developmentId, "SYS_REGISTRY_OFFICER"); if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_OFFICER", data.profileId); } else if (type.trim().toLocaleUpperCase() == "EMPLOYEE") { let _workflow = await new permission().Workflow(req, developmentId, "SYS_REGISTRY_EMP"); if (_workflow == false) await new permission().PermissionOrgUserGet( req, "SYS_REGISTRY_EMP", data.profileEmployeeId, ); } else if (type.trim().toLocaleUpperCase() == "TEMP") { let _workflow = await new permission().Workflow(req, developmentId, "SYS_REGISTRY_TEMP"); if (_workflow == false) await new permission().PermissionOrgUserGet( req, "SYS_REGISTRY_TEMP", data.profileEmployeeId, ); } else if (type.trim().toLocaleUpperCase() == "USER") { } else { throw new HttpError(HttpStatus.NOT_FOUND, "ไม่สามารถเข้าถึงข้อมูลนี้ได้"); } const _mapData = { id: data.id, evaluationId: null, target: data.developmentTarget, summary: null, point: null, name: data.name, achievement10: "มีผลการพัฒนาและมีการดำเนินการตามเป้าหมายการนำไปพัฒนางาน", achievement5: "มีผลการพัฒนาแต่ยังไม่ได้ดำเนินการตามเป้าหมายการนำไปพัฒนางาน", achievement0: "ไม่ได้ดำเนินการพัฒนา", isDevelopment70: data.isDevelopment70, isDevelopment20: data.isDevelopment20, isDevelopment10: data.isDevelopment10, reasonDevelopment70: data.reasonDevelopment70, reasonDevelopment20: data.reasonDevelopment20, reasonDevelopment10: data.reasonDevelopment10, selectType: null, selectTypeYear: null, selectTypeId: null, }; const _data = { ..._mapData, developmentProjects: data.developmentProjects.map((x) => x.name), }; return new HttpSuccess(_data); } @Post() public async newDevelopment( @Request() req: RequestWithUser, @Body() body: CreateProfileDevelopment, ) { if (!body.profileId) { throw new HttpError(HttpStatus.BAD_REQUEST, "กรุณากรอก profileId"); } const profile = await this.profileRepository.findOneBy({ id: body.profileId }); if (!profile) { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } await new permission().PermissionOrgUserUpdate(req, "SYS_REGISTRY_OFFICER", profile.id); const data = new ProfileDevelopment(); const meta = { createdUserId: req.user.sub, createdFullName: req.user.name, lastUpdateUserId: req.user.sub, lastUpdateFullName: req.user.name, createdAt: new Date(), lastUpdatedAt: new Date(), }; Object.assign(data, { ...body, ...meta }); const history = new ProfileDevelopmentHistory(); Object.assign(history, { ...data, id: undefined }); await this.developmentRepository.save(data); history.profileDevelopmentId = data.id; await this.developmentHistoryRepository.save(history); if (body.developmentProjects != null) { await Promise.all( body.developmentProjects.map(async (x) => { let developmentProject = new DevelopmentProject(); let developmentProjectHistory = new DevelopmentProject(); Object.assign(developmentProject, { ...meta, name: x, profileDevelopmentId: data.id, }); Object.assign(developmentProject, { ...meta, name: x, profileDevelopmentHistoryId: history.id, }); await Promise.all([ this.developmentProjectRepository.save(developmentProject), this.developmentProjectRepository.save(developmentProjectHistory), ]); }), ); } return new HttpSuccess(data.id); } @Patch("{developmentId}") public async editDevelopment( @Request() req: RequestWithUser, @Body() body: UpdateProfileDevelopment, @Path() developmentId: string, ) { const record = await this.developmentRepository.findOne({ where: { id: developmentId }, }); if (!record) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); await new permission().PermissionOrgUserUpdate(req, "SYS_REGISTRY_OFFICER", record.profileId); const history = new ProfileDevelopmentHistory(); Object.assign(record, body); Object.assign(history, { ...record, id: undefined }); history.profileDevelopmentId = developmentId; record.lastUpdateUserId = req.user.sub; record.lastUpdateFullName = req.user.name; record.lastUpdatedAt = new Date(); history.lastUpdateUserId = req.user.sub; history.lastUpdateFullName = req.user.name; history.createdUserId = req.user.sub; history.createdFullName = req.user.name; history.createdAt = new Date(); history.lastUpdatedAt = new Date(); await Promise.all([ this.developmentRepository.save(record), this.developmentHistoryRepository.save(history), ]); await this.developmentProjectRepository.delete({ profileDevelopmentId: record.id }); if (body.developmentProjects != null) { const meta = { createdUserId: req.user.sub, createdFullName: req.user.name, lastUpdateUserId: req.user.sub, lastUpdateFullName: req.user.name, createdAt: new Date(), lastUpdatedAt: new Date(), }; await Promise.all( body.developmentProjects.map(async (x) => { let developmentProject = new DevelopmentProject(); let developmentProjectHistory = new DevelopmentProject(); Object.assign(developmentProject, { ...meta, name: x, profileDevelopmentId: record.id, }); Object.assign(developmentProject, { ...meta, name: x, profileDevelopmentHistoryId: history.id, }); await Promise.all([ this.developmentProjectRepository.save(developmentProject), this.developmentProjectRepository.save(developmentProjectHistory), ]); }), ); } return new HttpSuccess(); } @Delete("{developmentId}") public async deleteDevelopment(@Path() developmentId: string, @Request() req: RequestWithUser) { const _record = await this.developmentRepository.findOneBy({ id: developmentId }); if (_record) { await new permission().PermissionOrgUserDelete( req, "SYS_REGISTRY_OFFICER", _record.profileId, ); } const history = await this.developmentHistoryRepository.find({ where: { profileDevelopmentId: developmentId }, }); await this.developmentProjectRepository.delete({ profileDevelopmentHistoryId: In(history) }); await this.developmentHistoryRepository.delete({ profileDevelopmentId: developmentId, }); await this.developmentProjectRepository.delete({ profileDevelopmentId: developmentId }); const result = await this.developmentRepository.delete({ id: developmentId }); if (result.affected == undefined || result.affected <= 0) { throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); } return new HttpSuccess(); } }