hrms-api-probation/src/controllers/EvaluateRecordController.ts
DESKTOP-2S5P7D1\Windows 10 168cfcee46 check workflow
2024-10-22 08:21:29 +07:00

1062 lines
38 KiB
TypeScript

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) {
let _workflow = await new permission().Workflow(request, assign_id, "SYS_PROBATION")
if (_workflow == false) 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) {
let _workflow = await new permission().Workflow(request, assign_id, "SYS_PROBATION")
if (_workflow == false) 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()
}
}