hrms-api-probation/src/controllers/EvaluateRecordController.ts

1167 lines
42 KiB
TypeScript
Raw Normal View History

2024-09-05 13:59:43 +07:00
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";
2024-09-05 16:56:22 +07:00
import { CreateEvaluateAssessor, EvaluateAssessor } from "../entities/EvaluateAssessor";
import { CreateEvaluateAchievement, EvaluateAchievement } from "../entities/EvaluateAchievement";
2024-09-05 13:59:43 +07:00
import CallAPI from "../interfaces/call-api";
2024-09-06 15:17:42 +07:00
import permission from "../interfaces/permission";
2024-09-05 16:56:22 +07:00
@Route("api/v1/probation/evaluate-record")
2024-09-05 13:59:43 +07:00
@Tags("แบบบันทึกผล")
@Security("bearerAuth")
@Response(
HttpStatusCode.INTERNAL_SERVER_ERROR,
2024-09-05 16:56:22 +07:00
"เกิดข้อผิดพลาด ไม่สามารถแสดงรายการได้ กรุณาลองใหม่ในภายหลัง",
2024-09-05 13:59:43 +07:00
)
export class EvaluateRecordController extends Controller {
2024-09-05 16:56:22 +07:00
private assignDirectorRepository = AppDataSource.getRepository(AssignDirector);
2024-09-05 13:59:43 +07:00
private assignRepository = AppDataSource.getRepository(Assign);
private personalRepository = AppDataSource.getRepository(Personal);
private assignOutputRepository = AppDataSource.getRepository(AssignOutput);
2024-09-05 16:56:22 +07:00
private evaluateAssessorRepository = AppDataSource.getRepository(EvaluateAssessor);
private evaluateAchievementRepository = AppDataSource.getRepository(EvaluateAchievement);
2024-09-05 13:59:43 +07:00
/**
* API
*
* @summary get
*
*/
@Get("create")
2024-09-06 15:17:42 +07:00
async GetCreate(@Query() assign_id: string, @Request() request: RequestWithUser) {
await new permission().PermissionGet(request, "SYS_PROBATION");
2024-09-05 13:59:43 +07:00
const directorData = await this.assignDirectorRepository.findOne({
2024-09-05 16:56:22 +07:00
select: ["personal_id", "dated", "fullname", "position", "posType", "posLevel"],
2024-09-05 13:59:43 +07:00
where: {
assign_id,
role: "mentor",
},
});
if (!directorData) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล");
2024-09-05 13:59:43 +07:00
}
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) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลแบบมอบหมายงาน");
2024-09-05 13:59:43 +07:00
}
const profileData = await this.personalRepository.findOne({
select: [
"personal_id",
"prefixName",
"firstName",
"lastName",
"positionName",
"positionLevelName",
"organization",
],
where: {
personal_id: assign.personal_id,
},
});
if (!profileData) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลบุคคล");
2024-09-05 13:59:43 +07:00
}
const profile = await {
id: profileData.personal_id,
2024-09-05 16:56:22 +07:00
name: profileData.prefixName + profileData.firstName + " " + profileData.lastName,
2024-09-05 13:59:43 +07:00
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({
2024-09-05 16:56:22 +07:00
select: ["personal_id", "dated", "fullname", "position", "posType", "posLevel"],
2024-09-05 13:59:43 +07:00
where: { personal_id: director_id },
});
if (!commanderData) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลผู้บังคับบัญชา");
2024-09-05 13:59:43 +07:00
}
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("")
2024-09-06 15:17:42 +07:00
async GetData(
@Request() request: RequestWithUser,
@Query() assign_id: string,
@Query() evaluate_no?: string,
) {
await new permission().PermissionGet(request, "SYS_PROBATION");
2024-09-05 13:59:43 +07:00
const director = await this.assignDirectorRepository.findOne({
select: ["personal_id"],
where: {
assign_id,
role: "mentor",
},
});
if (!director) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลผู้ดูแล");
2024-09-05 13:59:43 +07:00
}
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) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลแบบประเมิน");
2024-09-05 13:59:43 +07:00
}
const achievementData = await this.evaluateAchievementRepository.find({
2024-09-05 16:56:22 +07:00
select: ["output_desc", "evaluate_expect_level", "output_desc", "evaluate_output_level"],
2024-09-05 13:59:43 +07:00
where: {
evaluate_id: evaluate.id,
},
order: { output_id: "ASC" },
});
if (!achievementData) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล");
2024-09-05 13:59:43 +07:00
}
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),
2024-09-05 13:59:43 +07:00
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) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล");
2024-09-05 13:59:43 +07:00
}
await Promise.all(
evaluate.map(async (element: any, index: number) => {
2024-09-05 16:56:22 +07:00
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" },
});
2024-09-05 13:59:43 +07:00
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),
2024-09-05 13:59:43 +07:00
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,
};
2024-09-05 16:56:22 +07:00
}),
2024-09-05 13:59:43 +07:00
);
}
const assign = await this.assignRepository.findOne({
where: {
id: assign_id,
},
});
if (!assign) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลแบบมอบหมายงาน");
2024-09-05 13:59:43 +07:00
}
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({
2024-09-05 16:56:22 +07:00
select: ["personal_id", "dated", "fullname", "position", "posType", "posLevel"],
2024-09-05 13:59:43 +07:00
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,
2024-09-05 16:56:22 +07:00
@Request() request: RequestWithUser,
2024-09-05 13:59:43 +07:00
) {
2024-09-06 15:17:42 +07:00
await new permission().PermissionUpdate(request, "SYS_PROBATION");
2024-09-05 13:59:43 +07:00
const director = await this.assignDirectorRepository.findOne({
select: ["personal_id"],
where: {
assign_id,
role: "mentor",
},
});
if (!director) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลผู้ดูแล");
2024-09-05 13:59:43 +07:00
}
const director_id = director.personal_id;
const assign = await this.assignRepository.findOne({
relations: ["profile"],
where: { id: assign_id },
});
if (!assign) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลแบบมอบหมายงาน");
2024-09-05 13:59:43 +07:00
}
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:
2024-09-05 16:56:22 +07:00
requestBody.behavio_orther.text != "" ? Number(requestBody.behavio_orther.level) : 0,
2024-09-05 13:59:43 +07:00
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,
};
2024-09-05 16:56:22 +07:00
const evaluateAssessor = await this.evaluateAssessorRepository.save(postData, {
data: request,
});
2024-09-05 13:59:43 +07:00
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,
2024-09-05 16:56:22 +07:00
evaluate_output_level: Number(requestBody.evaluate_ouptut[index].level),
2024-09-05 13:59:43 +07:00
createdUserId: request.user.sub,
createdFullName: request.user.name,
updateUserId: request.user.sub,
updateFullName: request.user.name,
};
await this.evaluateAchievementRepository.save(evaluateAchievement, {
data: request,
});
2024-09-05 16:56:22 +07:00
}),
2024-09-05 13:59:43 +07:00
);
}
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,
2024-09-05 16:56:22 +07:00
@Request() request: RequestWithUser,
2024-09-05 13:59:43 +07:00
) {
2024-09-06 15:17:42 +07:00
await new permission().PermissionUpdate(request, "SYS_PROBATION");
2024-09-05 13:59:43 +07:00
const director = await this.assignDirectorRepository.findOne({
select: ["personal_id"],
where: {
assign_id,
role: "mentor",
},
});
if (!director) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลผู้ดูแล");
2024-09-05 13:59:43 +07:00
}
const director_id = director.personal_id;
let evaluate = await this.evaluateAssessorRepository.findOne({
where: { id: evaluate_id },
});
const before = evaluate;
if (!evaluate) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการประเมิน");
2024-09-05 13:59:43 +07:00
}
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 =
2024-09-05 16:56:22 +07:00
requestBody.achievement_other.text != "" ? Number(requestBody.achievement_other.level) : 0;
2024-09-05 13:59:43 +07:00
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 =
2024-09-05 16:56:22 +07:00
requestBody.behavio_orther.text != "" ? Number(requestBody.behavio_orther.level) : 0;
2024-09-05 13:59:43 +07:00
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;
2024-09-05 16:56:22 +07:00
const evaluateAssessor = await this.evaluateAssessorRepository.save(evaluate, {
data: request,
});
2024-09-05 13:59:43 +07:00
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,
2024-09-05 16:56:22 +07:00
evaluate_output_level: Number(requestBody.evaluate_ouptut[index].level),
2024-09-05 13:59:43 +07:00
createdUserId: request.user.sub,
createdFullName: request.user.name,
updateUserId: request.user.sub,
updateFullName: request.user.name,
};
await this.evaluateAchievementRepository.save(evaluateAchievement, {
data: request,
});
2024-09-05 16:56:22 +07:00
}),
2024-09-05 13:59:43 +07:00
);
}
setLogDataDiff(request, { before, after: evaluate });
return new HttpSuccess();
}
/**
* API ()
*
* @summary get ()
*
*/
@Get("create/commander")
2024-09-06 15:17:42 +07:00
async GetCreateCommander(@Query() assign_id: string, @Request() request: RequestWithUser) {
await new permission().PermissionGet(request, "SYS_PROBATION");
2024-09-05 13:59:43 +07:00
const directorData = await this.assignDirectorRepository.findOne({
2024-09-05 16:56:22 +07:00
select: ["personal_id", "dated", "fullname", "position", "posType", "posLevel"],
2024-09-05 13:59:43 +07:00
where: {
assign_id,
role: "commander",
},
});
if (!directorData) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล");
2024-09-05 13:59:43 +07:00
}
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) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลแบบมอบหมายงาน");
2024-09-05 13:59:43 +07:00
}
const profileData = await this.personalRepository.findOne({
select: [
"personal_id",
"prefixName",
"firstName",
"lastName",
"positionName",
"positionLevelName",
"organization",
],
where: {
personal_id: assign.personal_id,
},
});
if (!profileData) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลบุคคล");
2024-09-05 13:59:43 +07:00
}
const profile = await {
id: profileData.personal_id,
2024-09-05 16:56:22 +07:00
name: profileData.prefixName + profileData.firstName + " " + profileData.lastName,
2024-09-05 13:59:43 +07:00
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")
2024-09-06 15:17:42 +07:00
async GetDataCommander(
@Request() request: RequestWithUser,
@Query() assign_id: string,
@Query() evaluate_no?: string,
) {
await new permission().PermissionGet(request, "SYS_PROBATION");
2024-09-05 13:59:43 +07:00
const director = await this.assignDirectorRepository.findOne({
select: ["personal_id"],
where: {
assign_id,
role: "commander",
},
});
if (!director) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลผู้ดูแล");
2024-09-05 13:59:43 +07:00
}
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) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลแบบประเมิน");
2024-09-05 13:59:43 +07:00
}
const achievementData = await this.evaluateAchievementRepository.find({
2024-09-05 16:56:22 +07:00
select: ["output_desc", "evaluate_expect_level", "output_desc", "evaluate_output_level"],
2024-09-05 13:59:43 +07:00
where: {
evaluate_id: evaluate.id,
},
order: { output_id: "ASC" },
});
if (!achievementData) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล");
2024-09-05 13:59:43 +07:00
}
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),
2024-09-05 13:59:43 +07:00
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) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล");
2024-09-05 13:59:43 +07:00
}
await Promise.all(
evaluate.map(async (element: any, index: number) => {
2024-09-05 16:56:22 +07:00
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" },
});
2024-09-05 13:59:43 +07:00
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),
2024-09-05 13:59:43 +07:00
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,
};
2024-09-05 16:56:22 +07:00
}),
2024-09-05 13:59:43 +07:00
);
}
const assign = await this.assignRepository.findOne({
where: {
id: assign_id,
},
});
if (!assign) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลแบบมอบหมายงาน");
2024-09-05 13:59:43 +07:00
}
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({
2024-09-05 16:56:22 +07:00
select: ["personal_id", "dated", "fullname", "position", "posType", "posLevel"],
2024-09-05 13:59:43 +07:00
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,
2024-09-05 16:56:22 +07:00
@Request() request: RequestWithUser,
2024-09-05 13:59:43 +07:00
) {
2024-09-06 15:17:42 +07:00
await new permission().PermissionUpdate(request, "SYS_PROBATION");
2024-09-05 13:59:43 +07:00
const director = await this.assignDirectorRepository.findOne({
select: ["personal_id"],
where: {
assign_id,
role: "commander",
},
});
if (!director) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลผู้ดูแล");
2024-09-05 13:59:43 +07:00
}
const director_id = director.personal_id;
const assign = await this.assignRepository.findOne({
relations: ["profile"],
where: { id: assign_id },
});
if (!assign) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลแบบมอบหมายงาน");
2024-09-05 13:59:43 +07:00
}
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:
2024-09-05 16:56:22 +07:00
requestBody.behavio_orther.text != "" ? Number(requestBody.behavio_orther.level) : 0,
2024-09-05 13:59:43 +07:00
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,
};
2024-09-05 16:56:22 +07:00
const evaluateAssessor = await this.evaluateAssessorRepository.save(postData, {
data: request,
});
2024-09-05 13:59:43 +07:00
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,
2024-09-05 16:56:22 +07:00
evaluate_output_level: Number(requestBody.evaluate_ouptut[index].level),
2024-09-05 13:59:43 +07:00
createdUserId: request.user.sub,
createdFullName: request.user.name,
updateUserId: request.user.sub,
updateFullName: request.user.name,
};
await this.evaluateAchievementRepository.save(evaluateAchievement, {
data: request,
});
2024-09-05 16:56:22 +07:00
}),
2024-09-05 13:59:43 +07:00
);
}
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,
2024-09-05 16:56:22 +07:00
@Request() request: RequestWithUser,
2024-09-05 13:59:43 +07:00
) {
2024-09-06 15:17:42 +07:00
await new permission().PermissionUpdate(request, "SYS_PROBATION");
2024-09-05 13:59:43 +07:00
const director = await this.assignDirectorRepository.findOne({
select: ["personal_id"],
where: {
assign_id,
role: "commander",
},
});
if (!director) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลผู้ดูแล");
2024-09-05 13:59:43 +07:00
}
const director_id = director.personal_id;
let evaluate = await this.evaluateAssessorRepository.findOne({
where: { id: evaluate_id },
});
if (!evaluate) {
2024-09-06 09:37:29 +07:00
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการประเมิน");
2024-09-05 13:59:43 +07:00
}
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 =
2024-09-05 16:56:22 +07:00
requestBody.achievement_other.text != "" ? Number(requestBody.achievement_other.level) : 0;
2024-09-05 13:59:43 +07:00
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 =
2024-09-05 16:56:22 +07:00
requestBody.behavio_orther.text != "" ? Number(requestBody.behavio_orther.level) : 0;
2024-09-05 13:59:43 +07:00
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;
2024-09-05 16:56:22 +07:00
const evaluateAssessor = await this.evaluateAssessorRepository.save(evaluate, {
data: request,
});
2024-09-05 13:59:43 +07:00
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,
2024-09-05 16:56:22 +07:00
evaluate_output_level: Number(requestBody.evaluate_ouptut[index].level),
2024-09-05 13:59:43 +07:00
createdUserId: request.user.sub,
createdFullName: request.user.name,
updateUserId: request.user.sub,
updateFullName: request.user.name,
};
await this.evaluateAchievementRepository.save(evaluateAchievement, {
data: request,
});
2024-09-05 16:56:22 +07:00
}),
2024-09-05 13:59:43 +07:00
);
}
setLogDataDiff(request, { before, after: evaluate });
return new HttpSuccess();
}
}