import { Controller, Route, Security, Tags, Request, SuccessResponse, Response, Get, Post, Body, Query, Put, } from "tsoa"; import HttpSuccess from "../interfaces/http-success"; import HttpStatusCode from "../interfaces/http-status"; import { RequestWithUser } from "../middlewares/user"; import { findEndDate, setLogDataDiff } from "../interfaces/utils"; import { AppDataSource } from "../database/data-source"; import { AssignDirector } from "../entities/AssignDirector"; import HttpError from "../interfaces/http-error"; import { Assign } from "../entities/Assign"; import { Personal } from "../entities/Personal"; import { AssignOutput } from "../entities/AssignOutput"; import { CreateEvaluateAssessor, EvaluateAssessor } from "../entities/EvaluateAssessor"; import { CreateEvaluateAchievement, EvaluateAchievement } from "../entities/EvaluateAchievement"; import CallAPI from "../interfaces/call-api"; import permission from "../interfaces/permission"; @Route("api/v1/probation/evaluate-record") @Tags("แบบบันทึกผล") @Security("bearerAuth") @Response( HttpStatusCode.INTERNAL_SERVER_ERROR, "เกิดข้อผิดพลาด ไม่สามารถแสดงรายการได้ กรุณาลองใหม่ในภายหลัง", ) export class EvaluateRecordController extends Controller { private assignDirectorRepository = AppDataSource.getRepository(AssignDirector); private assignRepository = AppDataSource.getRepository(Assign); private personalRepository = AppDataSource.getRepository(Personal); private assignOutputRepository = AppDataSource.getRepository(AssignOutput); private evaluateAssessorRepository = AppDataSource.getRepository(EvaluateAssessor); private evaluateAchievementRepository = AppDataSource.getRepository(EvaluateAchievement); /** * API ดึงข้อมูลตอนกดสร้างแบบบันทึกผล * * @summary get ข้อมูลตอนกดสร้างแบบบันทึกผล * */ @Get("create") async GetCreate(@Query() assign_id: string, @Request() request: RequestWithUser) { await new permission().PermissionGet(request, "SYS_PROBATION"); const directorData = await this.assignDirectorRepository.findOne({ select: ["personal_id", "dated", "fullname", "position", "posType", "posLevel"], where: { assign_id, role: "mentor", }, }); if (!directorData) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); } const director = await { ...directorData, name: directorData.fullname, label: `${directorData.fullname} (${directorData.position}, ${directorData.posType}: ${directorData.posLevel})`, }; const director_id = director.personal_id; const assign = await this.assignRepository.findOne({ where: { id: assign_id, }, }); if (!assign) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลแบบมอบหมายงาน"); } const profileData = await this.personalRepository.findOne({ select: [ "personal_id", "prefixName", "firstName", "lastName", "positionName", "positionLevelName", "organization", ], where: { personal_id: assign.personal_id, }, }); if (!profileData) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลบุคคล"); } const profile = await { id: profileData.personal_id, name: profileData.prefixName + profileData.firstName + " " + profileData.lastName, positionName: profileData.positionName, positionLevelName: profileData.positionLevelName, Oc: profileData.organization, }; const output = await this.assignOutputRepository.find({ select: ["id", "output_desc"], where: { assign_id, }, order: { id: "ASC" }, }); const evaluate_amount = await this.evaluateAssessorRepository.count({ where: { assign_id, director_id, }, }); const evaluate_no = await (evaluate_amount + 1); const start_date = await (evaluate_amount == 0 ? assign.date_start : findEndDate(evaluate_amount * 2, assign.date_start)); var commanderData = await this.assignDirectorRepository.findOne({ select: ["personal_id", "dated", "fullname", "position", "posType", "posLevel"], where: { personal_id: director_id }, }); if (!commanderData) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลผู้บังคับบัญชา"); } const commander = await { ...commanderData, name: commanderData.fullname, label: `${commanderData.fullname} (${commanderData.position}, ${commanderData.posType}: ${commanderData.posLevel})`, }; return new HttpSuccess({ person: profile, assign, assign_output: output, evaluate_no, start_date, end_date: findEndDate(2, start_date), director: commander, }); } /** * API ข้อมูลแบบบันทึกผล(ผู้ดูแล) * * @summary ข้อมูลแบบบันทึกผล(ผู้ดูแล) * */ @Get("") async GetData( @Request() request: RequestWithUser, @Query() assign_id: string, @Query() evaluate_no?: string, ) { await new permission().PermissionGet(request, "SYS_PROBATION"); const director = await this.assignDirectorRepository.findOne({ select: ["personal_id"], where: { assign_id, role: "mentor", }, }); if (!director) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลผู้ดูแล"); } const director_id = director.personal_id; let evaluate: any = null; let evaluateData: any = []; if (evaluate_no) { evaluate = await this.evaluateAssessorRepository.findOne({ where: { director_id, assign_id, no: evaluate_no, }, }); if (!evaluate) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลแบบประเมิน"); } const achievementData = await this.evaluateAchievementRepository.find({ select: ["output_desc", "evaluate_expect_level", "output_desc", "evaluate_output_level"], where: { evaluate_id: evaluate.id, }, order: { output_id: "ASC" }, }); if (!achievementData) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); } const achievements = await achievementData.map((achievement) => { return { ...achievement, evaluate_expect_desc: achievement.output_desc, evaluate_output_desc: achievement.output_desc, }; }); evaluateData = await { id: evaluate.id, director_id: evaluate.director_id, assign_id, no: Number(evaluate.no), date_start: evaluate.date_start, date_finish: evaluate.date_finish, assessor_dated: evaluate.assessor_dated, knowledge_level: evaluate.knowledge_level, skill_level: evaluate.skill_level, competency_level: evaluate.competency_level, learn_level: evaluate.learn_level, apply_level: evaluate.apply_level, achievement_other_desc: evaluate.achievement_other_desc, achievement_other_level: evaluate.achievement_other_level, achievement_strength_desc: evaluate.achievement_strength_desc, achievement_improve_desc: evaluate.achievement_improve_desc, conduct1_level: evaluate.conduct1_level, conduct2_level: evaluate.conduct2_level, conduct3_level: evaluate.conduct3_level, conduct4_level: evaluate.conduct4_level, moral1_level: evaluate.moral1_level, moral2_level: evaluate.moral2_level, moral3_level: evaluate.moral3_level, discipline1_level: evaluate.discipline1_level, discipline2_level: evaluate.discipline2_level, discipline3_level: evaluate.discipline3_level, discipline4_level: evaluate.discipline4_level, discipline5_level: evaluate.discipline5_level, behavior_other_desc: evaluate.behavior_other_desc, behavior_other_level: evaluate.behavior_other_level, behavior_strength_desc: evaluate.behavior_strength_desc, behavior_improve_desc: evaluate.behavior_improve_desc, orientation: evaluate.orientation, self_learning: evaluate.self_learning, training_seminar: evaluate.training_seminar, other_training: evaluate.other_training, createdAt: evaluate.createdAt, updatedAt: evaluate.updatedAt, achievements: achievements, }; } else { evaluate = await this.evaluateAssessorRepository.find({ where: { director_id: director_id, assign_id, }, order: { no: "ASC" }, }); if (!evaluate) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); } await Promise.all( evaluate.map(async (element: any, index: number) => { const achievementData = await this.evaluateAchievementRepository.find({ select: [ "output_desc", "evaluate_expect_level", "output_desc", "evaluate_output_level", ], where: { evaluate_id: element.id, }, order: { output_id: "ASC" }, }); const achievements = await achievementData.map((achievement) => { return { ...achievement, evaluate_expect_desc: achievement.output_desc, evaluate_output_desc: achievement.output_desc, }; }); evaluateData[index] = await { id: element.id, director_id: element.director_id, assign_id, no: Number(element.no), date_start: element.date_start, date_finish: element.date_finish, assessor_dated: element.assessor_dated, knowledge_level: element.knowledge_level, skill_level: element.skill_level, competency_level: element.competency_level, learn_level: element.learn_level, apply_level: element.apply_level, achievement_other_desc: element.achievement_other_desc, achievement_other_level: element.achievement_other_level, achievement_strength_desc: element.achievement_strength_desc, achievement_improve_desc: element.achievement_improve_desc, conduct1_level: element.conduct1_level, conduct2_level: element.conduct2_level, conduct3_level: element.conduct3_level, conduct4_level: element.conduct4_level, moral1_level: element.moral1_level, moral2_level: element.moral2_level, moral3_level: element.moral3_level, discipline1_level: element.discipline1_level, discipline2_level: element.discipline2_level, discipline3_level: element.discipline3_level, discipline4_level: element.discipline4_level, discipline5_level: element.discipline5_level, behavior_other_desc: element.behavior_other_desc, behavior_other_level: element.behavior_other_level, behavior_strength_desc: element.behavior_strength_desc, behavior_improve_desc: element.behavior_improve_desc, orientation: element.orientation, self_learning: element.self_learning, training_seminar: element.training_seminar, other_training: element.other_training, createdAt: element.createdAt, updatedAt: element.updatedAt, achievements: achievements, }; }), ); } const assign = await this.assignRepository.findOne({ where: { id: assign_id, }, }); if (!assign) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลแบบมอบหมายงาน"); } const experimenteeData = await this.personalRepository.find({ select: [ "personal_id", "prefixName", "firstName", "lastName", "positionName", "positionLevelName", "organization", ], where: { personal_id: assign.personal_id }, }); const experimentee = await experimenteeData.map((element) => ({ ...element, name: element.prefixName + element.firstName + " " + element.lastName, Oc: element.organization, })); const directorData = await this.assignDirectorRepository.find({ select: ["personal_id", "dated", "fullname", "position", "posType", "posLevel"], where: { personal_id: director_id }, }); const directors = await directorData.map((element) => ({ ...element, name: element.fullname, label: `${element.fullname} (${element.position}, ${element.posType}: ${element.posLevel})`, })); return new HttpSuccess({ experimentee: experimentee ? experimentee : null, director: directors ? directors : null, assign, evaluate: evaluateData, }); } /** * API เพิ่มแบบบันทึกผล(ผู้ดูแล) * * @summary เพิ่มแบบบันทึกผล(ผู้ดูแล) * */ @Post("") async PostData( @Query() assign_id: string, @Body() requestBody: CreateEvaluateAssessor, @Request() request: RequestWithUser, ) { await new permission().PermissionUpdate(request, "SYS_PROBATION"); const director = await this.assignDirectorRepository.findOne({ select: ["personal_id"], where: { assign_id, role: "mentor", }, }); if (!director) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลผู้ดูแล"); } const director_id = director.personal_id; const assign = await this.assignRepository.findOne({ relations: ["profile"], where: { id: assign_id }, }); if (!assign) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลแบบมอบหมายงาน"); } const postData: any = await { assign_id, ...requestBody, director_id, no: requestBody.evaluate_no, date_start: requestBody.start_date, personal_id: assign.personal_id, achievement_other_desc: requestBody.achievement_other ? requestBody.achievement_other.text : "", achievement_other_level: requestBody.achievement_other ? Number(requestBody.achievement_other.level) : 0, behavior_other_desc: requestBody.behavio_orther.text, behavior_other_level: requestBody.behavio_orther.text != "" ? Number(requestBody.behavio_orther.level) : 0, behavior_strength_desc: requestBody.behavior_strength_desc, behavior_improve_desc: requestBody.behavior_improve_desc, orientation: requestBody.orientation, self_learning: requestBody.self_learning, training_seminar: requestBody.training_seminar, other_training: requestBody.other_training, createdUserId: request.user.sub, createdFullName: request.user.name, updateUserId: request.user.sub, updateFullName: request.user.name, }; const evaluateAssessor = await this.evaluateAssessorRepository.save(postData, { data: request, }); if (evaluateAssessor) { await Promise.all( requestBody.evaluate_expenct_level.map(async (expenct, index) => { const evaluateAchievement: CreateEvaluateAchievement = await { evaluate_id: evaluateAssessor.id, assign_id, output_id: expenct.id.toString(), assessor_id: director_id, evaluate_expect_level: Number(expenct.level), output_desc: requestBody.evaluate_ouptut[index].text, evaluate_output_level: Number(requestBody.evaluate_ouptut[index].level), createdUserId: request.user.sub, createdFullName: request.user.name, updateUserId: request.user.sub, updateFullName: request.user.name, }; await this.evaluateAchievementRepository.save(evaluateAchievement, { data: request, }); }), ); } setLogDataDiff(request, { before: null, after: postData }); if (Number(requestBody.evaluate_no) < 3) { // #noted cronjob // แจ้งผู้ดูแลและผู้บังคับบัญชาเข้ามาบันทึกผลทุก 2 เดือน 3 ครั้ง const dateSaveForm = await findEndDate(2, requestBody.start_date); const nextNo = await (Number(requestBody.evaluate_no) + 1); await new CallAPI() .PostData(request, "/placement/noti", { subject: `ถึงกำหนดบันทึกผลการทดลองปฏิบัติหน้าที่ราชการครั้งที่ ${nextNo} ${assign.profile.prefixName}${assign.profile.firstName} ${assign.profile.lastName}`, body: `ถึงกำหนดบันทึกผลการทดลองปฏิบัติหน้าที่ราชการครั้งที่ ${nextNo} ${assign.profile.prefixName}${assign.profile.firstName} ${assign.profile.lastName}`, receiverUserId: director_id, payload: "", isSendMail: true, isSendInbox: true, receiveDate: dateSaveForm, }) .catch((error) => { console.error("Error calling API:", error); }); } return new HttpSuccess(); } /** * API แก้ไขข้อมูลแบบบันทึกผล(ผู้ดูแล) * * @summary แก้ไขข้อมูลแบบบันทึกผล(ผู้ดูแล) * */ @Put("") async UpdateData( @Query() assign_id: string, @Query() evaluate_id: string, @Body() requestBody: CreateEvaluateAssessor, @Request() request: RequestWithUser, ) { await new permission().PermissionUpdate(request, "SYS_PROBATION"); const director = await this.assignDirectorRepository.findOne({ select: ["personal_id"], where: { assign_id, role: "mentor", }, }); if (!director) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลผู้ดูแล"); } const director_id = director.personal_id; let evaluate = await this.evaluateAssessorRepository.findOne({ where: { id: evaluate_id }, }); const before = evaluate; if (!evaluate) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการประเมิน"); } evaluate.assessor_dated = requestBody.assessor_dated; evaluate.knowledge_level = requestBody.knowledge_level; evaluate.skill_level = requestBody.skill_level; evaluate.competency_level = requestBody.competency_level; evaluate.learn_level = requestBody.learn_level; evaluate.apply_level = requestBody.apply_level; evaluate.achievement_other_desc = requestBody.achievement_other ? requestBody.achievement_other.text : ""; evaluate.achievement_other_level = requestBody.achievement_other.text != "" ? Number(requestBody.achievement_other.level) : 0; evaluate.achievement_strength_desc = requestBody.achievement_strength_desc; evaluate.achievement_improve_desc = requestBody.achievement_improve_desc; evaluate.conduct1_level = requestBody.conduct1_level; evaluate.conduct2_level = requestBody.conduct2_level; evaluate.conduct3_level = requestBody.conduct3_level; evaluate.conduct4_level = requestBody.conduct4_level; evaluate.moral1_level = requestBody.moral1_level; evaluate.moral2_level = requestBody.moral2_level; evaluate.moral3_level = requestBody.moral3_level; evaluate.discipline1_level = requestBody.discipline1_level; evaluate.discipline2_level = requestBody.discipline2_level; evaluate.discipline3_level = requestBody.discipline3_level; evaluate.discipline4_level = requestBody.discipline4_level; evaluate.discipline5_level = requestBody.discipline5_level; evaluate.behavior_other_desc = requestBody.behavio_orther.text; evaluate.behavior_other_level = requestBody.behavio_orther.text != "" ? Number(requestBody.behavio_orther.level) : 0; evaluate.behavior_strength_desc = requestBody.behavior_strength_desc; evaluate.behavior_improve_desc = requestBody.behavior_improve_desc; evaluate.orientation = requestBody.orientation; evaluate.self_learning = requestBody.self_learning; evaluate.training_seminar = requestBody.training_seminar; evaluate.other_training = requestBody.other_training; evaluate.updateUserId = request.user.sub; evaluate.updateFullName = request.user.name; const evaluateAssessor = await this.evaluateAssessorRepository.save(evaluate, { data: request, }); if (evaluateAssessor) { await this.evaluateAchievementRepository.delete({ evaluate_id, }); await Promise.all( requestBody.evaluate_expenct_level.map(async (expenct, index) => { const evaluateAchievement: CreateEvaluateAchievement = await { evaluate_id: evaluateAssessor.id, assign_id, output_id: expenct.id.toString(), assessor_id: director_id, evaluate_expect_level: Number(expenct.level), output_desc: requestBody.evaluate_ouptut[index].text, evaluate_output_level: Number(requestBody.evaluate_ouptut[index].level), createdUserId: request.user.sub, createdFullName: request.user.name, updateUserId: request.user.sub, updateFullName: request.user.name, }; await this.evaluateAchievementRepository.save(evaluateAchievement, { data: request, }); }), ); } setLogDataDiff(request, { before, after: evaluate }); return new HttpSuccess(); } /** * API ดึงข้อมูลตอนกดสร้างแบบบันทึกผล (ผู้บังคัญบัญชา) * * @summary get ข้อมูลตอนกดสร้างแบบบันทึกผล (ผู้บังคัญบัญชา) * */ @Get("create/commander") async GetCreateCommander(@Query() assign_id: string, @Request() request: RequestWithUser) { await new permission().PermissionGet(request, "SYS_PROBATION"); const directorData = await this.assignDirectorRepository.findOne({ select: ["personal_id", "dated", "fullname", "position", "posType", "posLevel"], where: { assign_id, role: "commander", }, }); if (!directorData) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); } const director = await { ...directorData, name: directorData.fullname, label: `${directorData.fullname} (${directorData.position}, ${directorData.posType}: ${directorData.posLevel})`, }; const director_id = director.personal_id; const assign = await this.assignRepository.findOne({ where: { id: assign_id, }, }); if (!assign) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลแบบมอบหมายงาน"); } const profileData = await this.personalRepository.findOne({ select: [ "personal_id", "prefixName", "firstName", "lastName", "positionName", "positionLevelName", "organization", ], where: { personal_id: assign.personal_id, }, }); if (!profileData) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลบุคคล"); } const profile = await { id: profileData.personal_id, name: profileData.prefixName + profileData.firstName + " " + profileData.lastName, positionName: profileData.positionName, positionLevelName: profileData.positionLevelName, Oc: profileData.organization, }; const output = await this.assignOutputRepository.find({ select: ["id", "output_desc"], where: { assign_id, }, order: { id: "ASC" }, }); const evaluate_amount = await this.evaluateAssessorRepository.count({ where: { assign_id, director_id, }, }); const evaluate_no = await (evaluate_amount + 1); const start_date = await (evaluate_amount == 0 ? assign.date_start : findEndDate(evaluate_amount * 2, assign.date_start)); return new HttpSuccess({ person: profile, assign, assign_output: output, evaluate_no, start_date, end_date: findEndDate(2, start_date), director, }); } /** * API ข้อมูลแบบบันทึกผล (ผู้บังคัญบัญชา) * * @summary ข้อมูลแบบบันทึกผล (ผู้บังคัญบัญชา) * */ @Get("commander") async GetDataCommander( @Request() request: RequestWithUser, @Query() assign_id: string, @Query() evaluate_no?: string, ) { await new permission().PermissionGet(request, "SYS_PROBATION"); const director = await this.assignDirectorRepository.findOne({ select: ["personal_id"], where: { assign_id, role: "commander", }, }); if (!director) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลผู้ดูแล"); } const director_id = director.personal_id; let evaluate: any = null; let evaluateData: any = []; if (evaluate_no) { evaluate = await this.evaluateAssessorRepository.findOne({ where: { director_id, assign_id, no: evaluate_no, }, }); if (!evaluate) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลแบบประเมิน"); } const achievementData = await this.evaluateAchievementRepository.find({ select: ["output_desc", "evaluate_expect_level", "output_desc", "evaluate_output_level"], where: { evaluate_id: evaluate.id, }, order: { output_id: "ASC" }, }); if (!achievementData) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); } const achievements = await achievementData.map((achievement) => { return { ...achievement, evaluate_expect_desc: achievement.output_desc, evaluate_output_desc: achievement.output_desc, }; }); evaluateData = await { id: evaluate.id, director_id: evaluate.director_id, assign_id, no: Number(evaluate.no), date_start: evaluate.date_start, date_finish: evaluate.date_finish, assessor_dated: evaluate.assessor_dated, knowledge_level: evaluate.knowledge_level, skill_level: evaluate.skill_level, competency_level: evaluate.competency_level, learn_level: evaluate.learn_level, apply_level: evaluate.apply_level, achievement_other_desc: evaluate.achievement_other_desc, achievement_other_level: evaluate.achievement_other_level, achievement_strength_desc: evaluate.achievement_strength_desc, achievement_improve_desc: evaluate.achievement_improve_desc, conduct1_level: evaluate.conduct1_level, conduct2_level: evaluate.conduct2_level, conduct3_level: evaluate.conduct3_level, conduct4_level: evaluate.conduct4_level, moral1_level: evaluate.moral1_level, moral2_level: evaluate.moral2_level, moral3_level: evaluate.moral3_level, discipline1_level: evaluate.discipline1_level, discipline2_level: evaluate.discipline2_level, discipline3_level: evaluate.discipline3_level, discipline4_level: evaluate.discipline4_level, discipline5_level: evaluate.discipline5_level, behavior_other_desc: evaluate.behavior_other_desc, behavior_other_level: evaluate.behavior_other_level, behavior_strength_desc: evaluate.behavior_strength_desc, behavior_improve_desc: evaluate.behavior_improve_desc, orientation: evaluate.orientation, self_learning: evaluate.self_learning, training_seminar: evaluate.training_seminar, other_training: evaluate.other_training, createdAt: evaluate.createdAt, updatedAt: evaluate.updatedAt, achievements: achievements, }; } else { evaluate = await this.evaluateAssessorRepository.find({ where: { director_id: director_id, assign_id, }, order: { no: "ASC" }, }); if (!evaluate) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); } await Promise.all( evaluate.map(async (element: any, index: number) => { const achievementData = await this.evaluateAchievementRepository.find({ select: [ "output_desc", "evaluate_expect_level", "output_desc", "evaluate_output_level", ], where: { evaluate_id: element.id, }, order: { output_id: "ASC" }, }); const achievements = await achievementData.map((achievement) => { return { ...achievement, evaluate_expect_desc: achievement.output_desc, evaluate_output_desc: achievement.output_desc, }; }); evaluateData[index] = await { id: element.id, director_id: element.director_id, assign_id, no: Number(element.no), date_start: element.date_start, date_finish: element.date_finish, assessor_dated: element.assessor_dated, knowledge_level: element.knowledge_level, skill_level: element.skill_level, competency_level: element.competency_level, learn_level: element.learn_level, apply_level: element.apply_level, achievement_other_desc: element.achievement_other_desc, achievement_other_level: element.achievement_other_level, achievement_strength_desc: element.achievement_strength_desc, achievement_improve_desc: element.achievement_improve_desc, conduct1_level: element.conduct1_level, conduct2_level: element.conduct2_level, conduct3_level: element.conduct3_level, conduct4_level: element.conduct4_level, moral1_level: element.moral1_level, moral2_level: element.moral2_level, moral3_level: element.moral3_level, discipline1_level: element.discipline1_level, discipline2_level: element.discipline2_level, discipline3_level: element.discipline3_level, discipline4_level: element.discipline4_level, discipline5_level: element.discipline5_level, behavior_other_desc: element.behavior_other_desc, behavior_other_level: element.behavior_other_level, behavior_strength_desc: element.behavior_strength_desc, behavior_improve_desc: element.behavior_improve_desc, orientation: element.orientation, self_learning: element.self_learning, training_seminar: element.training_seminar, other_training: element.other_training, createdAt: element.createdAt, updatedAt: element.updatedAt, achievements: achievements, }; }), ); } const assign = await this.assignRepository.findOne({ where: { id: assign_id, }, }); if (!assign) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลแบบมอบหมายงาน"); } const experimenteeData = await this.personalRepository.find({ select: [ "personal_id", "prefixName", "firstName", "lastName", "positionName", "positionLevelName", "organization", ], where: { personal_id: assign.personal_id }, }); const experimentee = await experimenteeData.map((element) => ({ ...element, name: element.prefixName + element.firstName + " " + element.lastName, Oc: element.organization, })); const directorData = await this.assignDirectorRepository.find({ select: ["personal_id", "dated", "fullname", "position", "posType", "posLevel"], where: { personal_id: director_id }, }); const directors = await directorData.map((element) => ({ ...element, name: element.fullname, label: `${element.fullname} (${element.position}, ${element.posType}: ${element.posLevel})`, })); return new HttpSuccess({ experimentee: experimentee ? experimentee : null, person: directors ? directors : null, assign, evaluate: evaluateData, }); } /** * API บันทึกข้อมูลแบบบันทึกผล (ผู้บังคัญบัญชา) * * @summary บันทึกข้อมูลแบบบันทึกผล (ผู้บังคัญบัญชา) * */ @Post("commander") async PostDataCommander( @Query() assign_id: string, @Body() requestBody: CreateEvaluateAssessor, @Request() request: RequestWithUser, ) { await new permission().PermissionUpdate(request, "SYS_PROBATION"); const director = await this.assignDirectorRepository.findOne({ select: ["personal_id"], where: { assign_id, role: "commander", }, }); if (!director) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลผู้ดูแล"); } const director_id = director.personal_id; const assign = await this.assignRepository.findOne({ relations: ["profile"], where: { id: assign_id }, }); if (!assign) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลแบบมอบหมายงาน"); } const postData: any = await { assign_id, ...requestBody, director_id, no: requestBody.evaluate_no, date_start: requestBody.start_date, personal_id: assign.personal_id, achievement_other_desc: requestBody.achievement_other ? requestBody.achievement_other.text : "", achievement_other_level: requestBody.achievement_other ? Number(requestBody.achievement_other.level) : 0, behavior_other_desc: requestBody.behavio_orther.text, behavior_other_level: requestBody.behavio_orther.text != "" ? Number(requestBody.behavio_orther.level) : 0, behavior_strength_desc: requestBody.behavior_strength_desc, behavior_improve_desc: requestBody.behavior_improve_desc, orientation: requestBody.orientation, self_learning: requestBody.self_learning, training_seminar: requestBody.training_seminar, other_training: requestBody.other_training, createdUserId: request.user.sub, createdFullName: request.user.name, updateUserId: request.user.sub, updateFullName: request.user.name, }; const evaluateAssessor = await this.evaluateAssessorRepository.save(postData, { data: request, }); if (evaluateAssessor) { await Promise.all( requestBody.evaluate_expenct_level.map(async (expenct, index) => { const evaluateAchievement: CreateEvaluateAchievement = await { evaluate_id: evaluateAssessor.id, assign_id, output_id: expenct.id.toString(), assessor_id: director_id, evaluate_expect_level: Number(expenct.level), output_desc: requestBody.evaluate_ouptut[index].text, evaluate_output_level: Number(requestBody.evaluate_ouptut[index].level), createdUserId: request.user.sub, createdFullName: request.user.name, updateUserId: request.user.sub, updateFullName: request.user.name, }; await this.evaluateAchievementRepository.save(evaluateAchievement, { data: request, }); }), ); } setLogDataDiff(request, { before: null, after: postData }); if (Number(requestBody.evaluate_no) < 3) { // #noted cronjob // แจ้งผู้ดูแลและผู้บังคับบัญชาเข้ามาบันทึกผลทุก 2 เดือน 3 ครั้ง const dateSaveForm = await findEndDate(2, requestBody.start_date); const nextNo = await (Number(requestBody.evaluate_no) + 1); await new CallAPI() .PostData(request, "/placement/noti", { subject: `ถึงกำหนดบันทึกผลการทดลองปฏิบัติหน้าที่ราชการครั้งที่ ${nextNo} ${assign.profile.prefixName}${assign.profile.firstName} ${assign.profile.lastName}`, body: `ถึงกำหนดบันทึกผลการทดลองปฏิบัติหน้าที่ราชการครั้งที่ ${nextNo} ${assign.profile.prefixName}${assign.profile.firstName} ${assign.profile.lastName}`, receiverUserId: director_id, payload: "", isSendMail: true, isSendInbox: true, receiveDate: dateSaveForm, }) .catch((error) => { console.error("Error calling API:", error); }); } return new HttpSuccess(); } /** * API แก้ไขข้อมูลแบบบันทึกผล (ผู้บังคัญบัญชา) * @summary แก้ไขข้อมูลแบบบันทึกผล (ผู้บังคัญบัญชา) * */ @Put("commander") async UpdateDataCommander( @Query() assign_id: string, @Query() evaluate_id: string, @Body() requestBody: CreateEvaluateAssessor, @Request() request: RequestWithUser, ) { await new permission().PermissionUpdate(request, "SYS_PROBATION"); const director = await this.assignDirectorRepository.findOne({ select: ["personal_id"], where: { assign_id, role: "commander", }, }); if (!director) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลผู้ดูแล"); } const director_id = director.personal_id; let evaluate = await this.evaluateAssessorRepository.findOne({ where: { id: evaluate_id }, }); if (!evaluate) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการประเมิน"); } const before = evaluate; evaluate.assessor_dated = requestBody.assessor_dated; evaluate.knowledge_level = requestBody.knowledge_level; evaluate.skill_level = requestBody.skill_level; evaluate.competency_level = requestBody.competency_level; evaluate.learn_level = requestBody.learn_level; evaluate.apply_level = requestBody.apply_level; evaluate.achievement_other_desc = requestBody.achievement_other ? requestBody.achievement_other.text : ""; evaluate.achievement_other_level = requestBody.achievement_other.text != "" ? Number(requestBody.achievement_other.level) : 0; evaluate.achievement_strength_desc = requestBody.achievement_strength_desc; evaluate.achievement_improve_desc = requestBody.achievement_improve_desc; evaluate.conduct1_level = requestBody.conduct1_level; evaluate.conduct2_level = requestBody.conduct2_level; evaluate.conduct3_level = requestBody.conduct3_level; evaluate.conduct4_level = requestBody.conduct4_level; evaluate.moral1_level = requestBody.moral1_level; evaluate.moral2_level = requestBody.moral2_level; evaluate.moral3_level = requestBody.moral3_level; evaluate.discipline1_level = requestBody.discipline1_level; evaluate.discipline2_level = requestBody.discipline2_level; evaluate.discipline3_level = requestBody.discipline3_level; evaluate.discipline4_level = requestBody.discipline4_level; evaluate.discipline5_level = requestBody.discipline5_level; evaluate.behavior_other_desc = requestBody.behavio_orther.text; evaluate.behavior_other_level = requestBody.behavio_orther.text != "" ? Number(requestBody.behavio_orther.level) : 0; evaluate.behavior_strength_desc = requestBody.behavior_strength_desc; evaluate.behavior_improve_desc = requestBody.behavior_improve_desc; evaluate.orientation = requestBody.orientation; evaluate.self_learning = requestBody.self_learning; evaluate.training_seminar = requestBody.training_seminar; evaluate.other_training = requestBody.other_training; evaluate.updateUserId = request.user.sub; evaluate.updateFullName = request.user.name; const evaluateAssessor = await this.evaluateAssessorRepository.save(evaluate, { data: request, }); if (evaluateAssessor) { await this.evaluateAchievementRepository.delete({ evaluate_id, }); await Promise.all( requestBody.evaluate_expenct_level.map(async (expenct, index) => { const evaluateAchievement: CreateEvaluateAchievement = await { evaluate_id: evaluateAssessor.id, assign_id, output_id: expenct.id.toString(), assessor_id: director_id, evaluate_expect_level: Number(expenct.level), output_desc: requestBody.evaluate_ouptut[index].text, evaluate_output_level: Number(requestBody.evaluate_ouptut[index].level), createdUserId: request.user.sub, createdFullName: request.user.name, updateUserId: request.user.sub, updateFullName: request.user.name, }; await this.evaluateAchievementRepository.save(evaluateAchievement, { data: request, }); }), ); } setLogDataDiff(request, { before, after: evaluate }); return new HttpSuccess(); } }