หมายเหตุ
This commit is contained in:
parent
709300ea8b
commit
4419222086
8 changed files with 912 additions and 82 deletions
877
src/controllers/KpiReasonController.ts
Normal file
877
src/controllers/KpiReasonController.ts
Normal file
|
|
@ -0,0 +1,877 @@
|
|||
import {
|
||||
Controller,
|
||||
Get,
|
||||
Put,
|
||||
Route,
|
||||
Security,
|
||||
Tags,
|
||||
Body,
|
||||
Path,
|
||||
Request,
|
||||
SuccessResponse,
|
||||
Response,
|
||||
} from "tsoa";
|
||||
import { AppDataSource } from "../database/data-source";
|
||||
import HttpSuccess from "../interfaces/http-success";
|
||||
import HttpError from "../interfaces/http-error";
|
||||
import HttpStatusCode from "../interfaces/http-status";
|
||||
import { In } from "typeorm";
|
||||
import { KpiUserEvaluationReasonPlan } from "../entities/kpiUserEvaluationReasonPlan";
|
||||
import { KpiUserEvaluationReasonRole } from "../entities/kpiUserEvaluationReasonRole";
|
||||
import { KpiUserEvaluationReasonSpecial } from "../entities/kpiUserEvaluationReasonSpecial";
|
||||
import {
|
||||
KpiUserEvaluationReasonCapacity,
|
||||
updateKpiUserReasonEvaluation,
|
||||
} from "../entities/kpiUserEvaluationReasonCapacity";
|
||||
import { KpiUserEvaluationReasonDevelopment } from "../entities/kpiUserEvaluationReasonDevelopment";
|
||||
import { KpiUserEvaluation } from "../entities/kpiUserEvaluation";
|
||||
import { KpiUserRole } from "../entities/kpiUserRole";
|
||||
import { KpiUserSpecial } from "../entities/kpiUserSpecial";
|
||||
import { KpiUserCapacity } from "../entities/kpiUserCapacity";
|
||||
import { KpiUserDevelopment } from "../entities/kpiUserDevelopment";
|
||||
import { KpiUserPlanned } from "../entities/kpiUserPlanned";
|
||||
|
||||
@Route("api/v1/kpi/reason")
|
||||
@Tags("kpiReason")
|
||||
@Security("bearerAuth")
|
||||
@Response(
|
||||
HttpStatusCode.INTERNAL_SERVER_ERROR,
|
||||
"เกิดข้อผิดพลาด ไม่สามารถแสดงรายการได้ กรุณาลองใหม่ในภายหลัง",
|
||||
)
|
||||
@SuccessResponse(HttpStatusCode.OK, "สำเร็จ")
|
||||
export class kpiReasonController extends Controller {
|
||||
private kpiUserEvaluationReasonPlan = AppDataSource.getRepository(KpiUserEvaluationReasonPlan);
|
||||
private kpiUserEvaluationReasonRole = AppDataSource.getRepository(KpiUserEvaluationReasonRole);
|
||||
private kpiUserEvaluationReasonSpecial = AppDataSource.getRepository(
|
||||
KpiUserEvaluationReasonSpecial,
|
||||
);
|
||||
private kpiUserEvaluationReasonCapacity = AppDataSource.getRepository(
|
||||
KpiUserEvaluationReasonCapacity,
|
||||
);
|
||||
private kpiUserEvaluationReasonDevelopment = AppDataSource.getRepository(
|
||||
KpiUserEvaluationReasonDevelopment,
|
||||
);
|
||||
private kpiUserPlan = AppDataSource.getRepository(KpiUserPlanned);
|
||||
private kpiUserRole = AppDataSource.getRepository(KpiUserRole);
|
||||
private kpiUserSpecial = AppDataSource.getRepository(KpiUserSpecial);
|
||||
private kpiUserCapacity = AppDataSource.getRepository(KpiUserCapacity);
|
||||
private kpiUserDevelopment = AppDataSource.getRepository(KpiUserDevelopment);
|
||||
|
||||
/**
|
||||
* API แก้ไขหมายเหตุ (USER)
|
||||
*
|
||||
* @summary แก้ไขหมายเหตุ (USER)
|
||||
*
|
||||
* @param {string} id Guid, *Id คนประเมิน (USER)
|
||||
*/
|
||||
@Put("{type}/plan/{user}/{id}")
|
||||
async updateKpiPlanReason(
|
||||
@Path() type: string,
|
||||
@Path() user: string,
|
||||
@Path() id: string,
|
||||
@Body() requestBody: updateKpiUserReasonEvaluation,
|
||||
@Request() request: { user: Record<string, any> },
|
||||
) {
|
||||
if (user.trim().toUpperCase() == "USER") {
|
||||
const kpiUserEvaluation = await this.kpiUserPlan.findOne({
|
||||
where: { id: id },
|
||||
relations: ["kpiUserEvaluation", "kpiUserEvaluation.evaluatorId"],
|
||||
});
|
||||
if (!kpiUserEvaluation) {
|
||||
throw new HttpError(
|
||||
HttpStatusCode.NOT_FOUND,
|
||||
"ไม่พบข้อมูลรายการประเมินผลการปฏิบัติราชการระดับบุคคลนี้",
|
||||
);
|
||||
}
|
||||
const kpiUserEvaluationReason = Object.assign(new KpiUserEvaluationReasonPlan(), requestBody);
|
||||
kpiUserEvaluationReason.type = type.trim().toUpperCase();
|
||||
if (type.trim().toUpperCase() == "PROBLEM") {
|
||||
kpiUserEvaluationReason.status =
|
||||
kpiUserEvaluation.kpiUserEvaluation.evaluatorId == null ? "DONE" : "DAFT";
|
||||
} else {
|
||||
kpiUserEvaluationReason.status =
|
||||
kpiUserEvaluation.kpiUserEvaluation.evaluatorId == null ? "DONE" : "EVALUATOR";
|
||||
}
|
||||
kpiUserEvaluationReason.kpiUserPlannedId = id;
|
||||
kpiUserEvaluationReason.createdUserId = request.user.sub;
|
||||
kpiUserEvaluationReason.createdFullName = request.user.name;
|
||||
kpiUserEvaluationReason.lastUpdateUserId = request.user.sub;
|
||||
kpiUserEvaluationReason.lastUpdateFullName = request.user.name;
|
||||
await this.kpiUserEvaluationReasonPlan.save(kpiUserEvaluationReason);
|
||||
return new HttpSuccess(kpiUserEvaluationReason.id);
|
||||
} else {
|
||||
const kpiReason = await this.kpiUserEvaluationReasonPlan.findOne({
|
||||
where: { id: id },
|
||||
relations: [
|
||||
"kpiUserPlanned",
|
||||
"kpiUserPlanned.kpiUserEvaluation",
|
||||
"kpiUserPlanned.kpiUserEvaluation.evaluatorId",
|
||||
],
|
||||
});
|
||||
if (!kpiReason) {
|
||||
throw new HttpError(
|
||||
HttpStatusCode.NOT_FOUND,
|
||||
"ไม่พบข้อมูลรายการประเมินผลการปฏิบัติราชการระดับบุคคลนี้",
|
||||
);
|
||||
}
|
||||
|
||||
if (user.trim().toUpperCase() == "EVALUATOR") {
|
||||
kpiReason.reasonEvaluator = requestBody.reason;
|
||||
kpiReason.status =
|
||||
kpiReason.kpiUserPlanned.kpiUserEvaluation.commanderId == null ? "DONE" : "COMMANDER";
|
||||
} else if (user.trim().toUpperCase() == "COMMANDER") {
|
||||
kpiReason.reasonCommander = requestBody.reason;
|
||||
kpiReason.status =
|
||||
kpiReason.kpiUserPlanned.kpiUserEvaluation.commanderHighId == null
|
||||
? "DONE"
|
||||
: "COMMANDERHIGH";
|
||||
} else if (user.trim().toUpperCase() == "COMMANDERHIGH") {
|
||||
kpiReason.reasonCommanderHigh = requestBody.reason;
|
||||
kpiReason.status = "DONE";
|
||||
}
|
||||
kpiReason.reasonCommanderHigh = requestBody.reason;
|
||||
kpiReason.lastUpdateUserId = request.user.sub;
|
||||
kpiReason.lastUpdateFullName = request.user.name;
|
||||
await this.kpiUserEvaluationReasonPlan.save(kpiReason);
|
||||
return new HttpSuccess(kpiReason.id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* API แก้ไขหมายเหตุ (USER)
|
||||
*
|
||||
* @summary แก้ไขหมายเหตุ (USER)
|
||||
*
|
||||
* @param {string} id Guid, *Id คนประเมิน (USER)
|
||||
*/
|
||||
@Put("problem/plansend/user/{id}")
|
||||
async sendKpiPlanReason(
|
||||
@Path() id: string,
|
||||
@Body() requestBody: updateKpiUserReasonEvaluation,
|
||||
@Request() request: { user: Record<string, any> },
|
||||
) {
|
||||
const kpiReason = await this.kpiUserEvaluationReasonPlan.findOne({
|
||||
where: { id: id },
|
||||
relations: [
|
||||
"kpiUserPlanned",
|
||||
"kpiUserPlanned.kpiUserEvaluation",
|
||||
"kpiUserPlanned.kpiUserEvaluation.evaluatorId",
|
||||
],
|
||||
});
|
||||
if (!kpiReason) {
|
||||
throw new HttpError(
|
||||
HttpStatusCode.NOT_FOUND,
|
||||
"ไม่พบข้อมูลรายการประเมินผลการปฏิบัติราชการระดับบุคคลนี้",
|
||||
);
|
||||
}
|
||||
|
||||
kpiReason.status =
|
||||
kpiReason.kpiUserPlanned.kpiUserEvaluation.commanderId == null ? "DONE" : "COMMANDER";
|
||||
kpiReason.reasonCommanderHigh = requestBody.reason;
|
||||
kpiReason.lastUpdateUserId = request.user.sub;
|
||||
kpiReason.lastUpdateFullName = request.user.name;
|
||||
await this.kpiUserEvaluationReasonPlan.save(kpiReason);
|
||||
return new HttpSuccess(kpiReason.id);
|
||||
}
|
||||
|
||||
/**
|
||||
* API list หมายเหตุ (USER)
|
||||
*
|
||||
* @summary list หมายเหตุ (USER)
|
||||
*
|
||||
* @param {string} id Guid, *Id คนประเมิน (USER)
|
||||
*/
|
||||
@Get("{type}/plan/{user}/{id}")
|
||||
async listKpiUserPlanReason(@Path() id: string, @Path() type: string, @Path() user: string) {
|
||||
if (type.trim().toUpperCase() == "PROGRESS") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonPlan.find({
|
||||
where: { kpiUserPlannedId: id },
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
} else {
|
||||
if (user.trim().toUpperCase() == "USER") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonPlan.find({
|
||||
where: { kpiUserPlannedId: id },
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
} else if (user.trim().toUpperCase() == "EVALUATOR") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonPlan.find({
|
||||
where: {
|
||||
kpiUserPlannedId: id,
|
||||
status: In(["EVALUATOR", "COMMANDER", "COMMANDERHIGH", "DONE"]),
|
||||
},
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
} else if (user.trim().toUpperCase() == "COMMANDER") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonPlan.find({
|
||||
where: {
|
||||
kpiUserPlannedId: id,
|
||||
status: In(["COMMANDER", "COMMANDERHIGH", "DONE"]),
|
||||
},
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
} else if (user.trim().toUpperCase() == "COMMANDERHIGH") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonPlan.find({
|
||||
where: {
|
||||
kpiUserPlannedId: id,
|
||||
status: In(["COMMANDERHIGH", "DONE"]),
|
||||
},
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* API แก้ไขหมายเหตุ (USER)
|
||||
*
|
||||
* @summary แก้ไขหมายเหตุ (USER)
|
||||
*
|
||||
* @param {string} id Guid, *Id คนประเมิน (USER)
|
||||
*/
|
||||
@Put("{type}/role/{user}/{id}")
|
||||
async updateKpiRoleReason(
|
||||
@Path() type: string,
|
||||
@Path() user: string,
|
||||
@Path() id: string,
|
||||
@Body() requestBody: updateKpiUserReasonEvaluation,
|
||||
@Request() request: { user: Record<string, any> },
|
||||
) {
|
||||
if (user.trim().toUpperCase() == "USER") {
|
||||
const kpiUserEvaluation = await this.kpiUserRole.findOne({
|
||||
where: { id: id },
|
||||
relations: ["kpiUserEvaluation", "kpiUserEvaluation.evaluatorId"],
|
||||
});
|
||||
if (!kpiUserEvaluation) {
|
||||
throw new HttpError(
|
||||
HttpStatusCode.NOT_FOUND,
|
||||
"ไม่พบข้อมูลรายการประเมินผลการปฏิบัติราชการระดับบุคคลนี้",
|
||||
);
|
||||
}
|
||||
const kpiUserEvaluationReason = Object.assign(new KpiUserEvaluationReasonRole(), requestBody);
|
||||
kpiUserEvaluationReason.type = type.trim().toUpperCase();
|
||||
kpiUserEvaluationReason.status =
|
||||
kpiUserEvaluation.kpiUserEvaluation.evaluatorId == null ? "DONE" : "EVALUATOR";
|
||||
kpiUserEvaluationReason.kpiUserRoleId = id;
|
||||
kpiUserEvaluationReason.createdUserId = request.user.sub;
|
||||
kpiUserEvaluationReason.createdFullName = request.user.name;
|
||||
kpiUserEvaluationReason.lastUpdateUserId = request.user.sub;
|
||||
kpiUserEvaluationReason.lastUpdateFullName = request.user.name;
|
||||
await this.kpiUserEvaluationReasonRole.save(kpiUserEvaluationReason);
|
||||
return new HttpSuccess(kpiUserEvaluationReason.id);
|
||||
} else {
|
||||
const kpiReason = await this.kpiUserEvaluationReasonRole.findOne({
|
||||
where: { id: id },
|
||||
relations: [
|
||||
"kpiUserRole",
|
||||
"kpiUserRole.kpiUserEvaluation",
|
||||
"kpiUserRole.kpiUserEvaluation.evaluatorId",
|
||||
],
|
||||
});
|
||||
if (!kpiReason) {
|
||||
throw new HttpError(
|
||||
HttpStatusCode.NOT_FOUND,
|
||||
"ไม่พบข้อมูลรายการประเมินผลการปฏิบัติราชการระดับบุคคลนี้",
|
||||
);
|
||||
}
|
||||
|
||||
if (user.trim().toUpperCase() == "EVALUATOR") {
|
||||
kpiReason.reasonEvaluator = requestBody.reason;
|
||||
kpiReason.status =
|
||||
kpiReason.kpiUserRole.kpiUserEvaluation.commanderId == null ? "DONE" : "COMMANDER";
|
||||
} else if (user.trim().toUpperCase() == "COMMANDER") {
|
||||
kpiReason.reasonCommander = requestBody.reason;
|
||||
kpiReason.status =
|
||||
kpiReason.kpiUserRole.kpiUserEvaluation.commanderHighId == null
|
||||
? "DONE"
|
||||
: "COMMANDERHIGH";
|
||||
} else if (user.trim().toUpperCase() == "COMMANDERHIGH") {
|
||||
kpiReason.reasonCommanderHigh = requestBody.reason;
|
||||
kpiReason.status = "DONE";
|
||||
}
|
||||
kpiReason.reasonCommanderHigh = requestBody.reason;
|
||||
kpiReason.lastUpdateUserId = request.user.sub;
|
||||
kpiReason.lastUpdateFullName = request.user.name;
|
||||
await this.kpiUserEvaluationReasonRole.save(kpiReason);
|
||||
return new HttpSuccess(kpiReason.id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* API แก้ไขหมายเหตุ (USER)
|
||||
*
|
||||
* @summary แก้ไขหมายเหตุ (USER)
|
||||
*
|
||||
* @param {string} id Guid, *Id คนประเมิน (USER)
|
||||
*/
|
||||
@Put("problem/rolesend/user/{id}")
|
||||
async sendKpiRoleReason(
|
||||
@Path() id: string,
|
||||
@Body() requestBody: updateKpiUserReasonEvaluation,
|
||||
@Request() request: { user: Record<string, any> },
|
||||
) {
|
||||
const kpiReason = await this.kpiUserEvaluationReasonRole.findOne({
|
||||
where: { id: id },
|
||||
relations: [
|
||||
"kpiUserRole",
|
||||
"kpiUserRole.kpiUserEvaluation",
|
||||
"kpiUserRole.kpiUserEvaluation.evaluatorId",
|
||||
],
|
||||
});
|
||||
if (!kpiReason) {
|
||||
throw new HttpError(
|
||||
HttpStatusCode.NOT_FOUND,
|
||||
"ไม่พบข้อมูลรายการประเมินผลการปฏิบัติราชการระดับบุคคลนี้",
|
||||
);
|
||||
}
|
||||
|
||||
kpiReason.status =
|
||||
kpiReason.kpiUserRole.kpiUserEvaluation.commanderId == null ? "DONE" : "COMMANDER";
|
||||
kpiReason.reasonCommanderHigh = requestBody.reason;
|
||||
kpiReason.lastUpdateUserId = request.user.sub;
|
||||
kpiReason.lastUpdateFullName = request.user.name;
|
||||
await this.kpiUserEvaluationReasonRole.save(kpiReason);
|
||||
return new HttpSuccess(kpiReason.id);
|
||||
}
|
||||
|
||||
/**
|
||||
* API list หมายเหตุ (USER)
|
||||
*
|
||||
* @summary list หมายเหตุ (USER)
|
||||
*
|
||||
* @param {string} id Guid, *Id คนประเมิน (USER)
|
||||
*/
|
||||
@Get("{type}/role/{user}/{id}")
|
||||
async listKpiUserRoleReason(@Path() id: string, @Path() type: string, @Path() user: string) {
|
||||
if (type.trim().toUpperCase() == "PROGRESS") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonRole.find({
|
||||
where: { kpiUserRoleId: id },
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
} else {
|
||||
if (user.trim().toUpperCase() == "USER") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonRole.find({
|
||||
where: { kpiUserRoleId: id },
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
} else if (user.trim().toUpperCase() == "EVALUATOR") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonRole.find({
|
||||
where: {
|
||||
kpiUserRoleId: id,
|
||||
status: In(["EVALUATOR", "COMMANDER", "COMMANDERHIGH", "DONE"]),
|
||||
},
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
} else if (user.trim().toUpperCase() == "COMMANDER") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonRole.find({
|
||||
where: {
|
||||
kpiUserRoleId: id,
|
||||
status: In(["COMMANDER", "COMMANDERHIGH", "DONE"]),
|
||||
},
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
} else if (user.trim().toUpperCase() == "COMMANDERHIGH") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonRole.find({
|
||||
where: {
|
||||
kpiUserRoleId: id,
|
||||
status: In(["COMMANDERHIGH", "DONE"]),
|
||||
},
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* API แก้ไขหมายเหตุ (USER)
|
||||
*
|
||||
* @summary แก้ไขหมายเหตุ (USER)
|
||||
*
|
||||
* @param {string} id Guid, *Id คนประเมิน (USER)
|
||||
*/
|
||||
@Put("{type}/special/{user}/{id}")
|
||||
async updateKpiSpecialReason(
|
||||
@Path() type: string,
|
||||
@Path() user: string,
|
||||
@Path() id: string,
|
||||
@Body() requestBody: updateKpiUserReasonEvaluation,
|
||||
@Request() request: { user: Record<string, any> },
|
||||
) {
|
||||
if (user.trim().toUpperCase() == "USER") {
|
||||
const kpiUserEvaluation = await this.kpiUserSpecial.findOne({
|
||||
where: { id: id },
|
||||
relations: ["kpiUserEvaluation", "kpiUserEvaluation.evaluatorId"],
|
||||
});
|
||||
if (!kpiUserEvaluation) {
|
||||
throw new HttpError(
|
||||
HttpStatusCode.NOT_FOUND,
|
||||
"ไม่พบข้อมูลรายการประเมินผลการปฏิบัติราชการระดับบุคคลนี้",
|
||||
);
|
||||
}
|
||||
const kpiUserEvaluationReason = Object.assign(
|
||||
new KpiUserEvaluationReasonSpecial(),
|
||||
requestBody,
|
||||
);
|
||||
kpiUserEvaluationReason.type = type.trim().toUpperCase();
|
||||
kpiUserEvaluationReason.status =
|
||||
kpiUserEvaluation.kpiUserEvaluation.evaluatorId == null ? "DONE" : "EVALUATOR";
|
||||
kpiUserEvaluationReason.kpiUserSpecialId = id;
|
||||
kpiUserEvaluationReason.createdUserId = request.user.sub;
|
||||
kpiUserEvaluationReason.createdFullName = request.user.name;
|
||||
kpiUserEvaluationReason.lastUpdateUserId = request.user.sub;
|
||||
kpiUserEvaluationReason.lastUpdateFullName = request.user.name;
|
||||
await this.kpiUserEvaluationReasonSpecial.save(kpiUserEvaluationReason);
|
||||
return new HttpSuccess(kpiUserEvaluationReason.id);
|
||||
} else {
|
||||
const kpiReason = await this.kpiUserEvaluationReasonSpecial.findOne({
|
||||
where: { id: id },
|
||||
relations: [
|
||||
"kpiUserSpecial",
|
||||
"kpiUserSpecial.kpiUserEvaluation",
|
||||
"kpiUserSpecial.kpiUserEvaluation.evaluatorId",
|
||||
],
|
||||
});
|
||||
if (!kpiReason) {
|
||||
throw new HttpError(
|
||||
HttpStatusCode.NOT_FOUND,
|
||||
"ไม่พบข้อมูลรายการประเมินผลการปฏิบัติราชการระดับบุคคลนี้",
|
||||
);
|
||||
}
|
||||
|
||||
if (user.trim().toUpperCase() == "EVALUATOR") {
|
||||
kpiReason.reasonEvaluator = requestBody.reason;
|
||||
kpiReason.status =
|
||||
kpiReason.kpiUserSpecial.kpiUserEvaluation.commanderId == null ? "DONE" : "COMMANDER";
|
||||
} else if (user.trim().toUpperCase() == "COMMANDER") {
|
||||
kpiReason.reasonCommander = requestBody.reason;
|
||||
kpiReason.status =
|
||||
kpiReason.kpiUserSpecial.kpiUserEvaluation.commanderHighId == null
|
||||
? "DONE"
|
||||
: "COMMANDERHIGH";
|
||||
} else if (user.trim().toUpperCase() == "COMMANDERHIGH") {
|
||||
kpiReason.reasonCommanderHigh = requestBody.reason;
|
||||
kpiReason.status = "DONE";
|
||||
}
|
||||
kpiReason.reasonCommanderHigh = requestBody.reason;
|
||||
kpiReason.lastUpdateUserId = request.user.sub;
|
||||
kpiReason.lastUpdateFullName = request.user.name;
|
||||
await this.kpiUserEvaluationReasonSpecial.save(kpiReason);
|
||||
return new HttpSuccess(kpiReason.id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* API แก้ไขหมายเหตุ (USER)
|
||||
*
|
||||
* @summary แก้ไขหมายเหตุ (USER)
|
||||
*
|
||||
* @param {string} id Guid, *Id คนประเมิน (USER)
|
||||
*/
|
||||
@Put("problem/specialsend/user/{id}")
|
||||
async sendKpiSpecialReason(
|
||||
@Path() id: string,
|
||||
@Body() requestBody: updateKpiUserReasonEvaluation,
|
||||
@Request() request: { user: Record<string, any> },
|
||||
) {
|
||||
const kpiReason = await this.kpiUserEvaluationReasonSpecial.findOne({
|
||||
where: { id: id },
|
||||
relations: [
|
||||
"kpiUserSpecial",
|
||||
"kpiUserSpecial.kpiUserEvaluation",
|
||||
"kpiUserSpecial.kpiUserEvaluation.evaluatorId",
|
||||
],
|
||||
});
|
||||
if (!kpiReason) {
|
||||
throw new HttpError(
|
||||
HttpStatusCode.NOT_FOUND,
|
||||
"ไม่พบข้อมูลรายการประเมินผลการปฏิบัติราชการระดับบุคคลนี้",
|
||||
);
|
||||
}
|
||||
|
||||
kpiReason.status =
|
||||
kpiReason.kpiUserSpecial.kpiUserEvaluation.commanderId == null ? "DONE" : "COMMANDER";
|
||||
kpiReason.reasonCommanderHigh = requestBody.reason;
|
||||
kpiReason.lastUpdateUserId = request.user.sub;
|
||||
kpiReason.lastUpdateFullName = request.user.name;
|
||||
await this.kpiUserEvaluationReasonSpecial.save(kpiReason);
|
||||
return new HttpSuccess(kpiReason.id);
|
||||
}
|
||||
|
||||
/**
|
||||
* API list หมายเหตุ (USER)
|
||||
*
|
||||
* @summary list หมายเหตุ (USER)
|
||||
*
|
||||
* @param {string} id Guid, *Id คนประเมิน (USER)
|
||||
*/
|
||||
@Get("{type}/special/{user}/{id}")
|
||||
async listKpiUserSpecialReason(@Path() id: string, @Path() type: string, @Path() user: string) {
|
||||
if (type.trim().toUpperCase() == "PROGRESS") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonSpecial.find({
|
||||
where: { kpiUserSpecialId: id },
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
} else {
|
||||
if (user.trim().toUpperCase() == "USER") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonSpecial.find({
|
||||
where: { kpiUserSpecialId: id },
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
} else if (user.trim().toUpperCase() == "EVALUATOR") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonSpecial.find({
|
||||
where: {
|
||||
kpiUserSpecialId: id,
|
||||
status: In(["EVALUATOR", "COMMANDER", "COMMANDERHIGH", "DONE"]),
|
||||
},
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
} else if (user.trim().toUpperCase() == "COMMANDER") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonSpecial.find({
|
||||
where: {
|
||||
kpiUserSpecialId: id,
|
||||
status: In(["COMMANDER", "COMMANDERHIGH", "DONE"]),
|
||||
},
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
} else if (user.trim().toUpperCase() == "COMMANDERHIGH") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonSpecial.find({
|
||||
where: {
|
||||
kpiUserSpecialId: id,
|
||||
status: In(["COMMANDERHIGH", "DONE"]),
|
||||
},
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* API แก้ไขหมายเหตุ (USER)
|
||||
*
|
||||
* @summary แก้ไขหมายเหตุ (USER)
|
||||
*
|
||||
* @param {string} id Guid, *Id คนประเมิน (USER)
|
||||
*/
|
||||
@Put("{type}/development/{user}/{id}")
|
||||
async updateKpiDevelopmentReason(
|
||||
@Path() type: string,
|
||||
@Path() user: string,
|
||||
@Path() id: string,
|
||||
@Body() requestBody: updateKpiUserReasonEvaluation,
|
||||
@Request() request: { user: Record<string, any> },
|
||||
) {
|
||||
if (user.trim().toUpperCase() == "USER") {
|
||||
const kpiUserEvaluation = await this.kpiUserDevelopment.findOne({
|
||||
where: { id: id },
|
||||
relations: ["kpiUserEvaluation", "kpiUserEvaluation.evaluatorId"],
|
||||
});
|
||||
if (!kpiUserEvaluation) {
|
||||
throw new HttpError(
|
||||
HttpStatusCode.NOT_FOUND,
|
||||
"ไม่พบข้อมูลรายการประเมินผลการปฏิบัติราชการระดับบุคคลนี้",
|
||||
);
|
||||
}
|
||||
const kpiUserEvaluationReason = Object.assign(
|
||||
new KpiUserEvaluationReasonDevelopment(),
|
||||
requestBody,
|
||||
);
|
||||
kpiUserEvaluationReason.type = type.trim().toUpperCase();
|
||||
kpiUserEvaluationReason.status =
|
||||
kpiUserEvaluation.kpiUserEvaluation.evaluatorId == null ? "DONE" : "EVALUATOR";
|
||||
kpiUserEvaluationReason.kpiUserDevelopmentId = id;
|
||||
kpiUserEvaluationReason.createdUserId = request.user.sub;
|
||||
kpiUserEvaluationReason.createdFullName = request.user.name;
|
||||
kpiUserEvaluationReason.lastUpdateUserId = request.user.sub;
|
||||
kpiUserEvaluationReason.lastUpdateFullName = request.user.name;
|
||||
await this.kpiUserEvaluationReasonDevelopment.save(kpiUserEvaluationReason);
|
||||
return new HttpSuccess(kpiUserEvaluationReason.id);
|
||||
} else {
|
||||
const kpiReason = await this.kpiUserEvaluationReasonDevelopment.findOne({
|
||||
where: { id: id },
|
||||
relations: [
|
||||
"kpiUserDevelopment",
|
||||
"kpiUserDevelopment.kpiUserEvaluation",
|
||||
"kpiUserDevelopment.kpiUserEvaluation.evaluatorId",
|
||||
],
|
||||
});
|
||||
if (!kpiReason) {
|
||||
throw new HttpError(
|
||||
HttpStatusCode.NOT_FOUND,
|
||||
"ไม่พบข้อมูลรายการประเมินผลการปฏิบัติราชการระดับบุคคลนี้",
|
||||
);
|
||||
}
|
||||
|
||||
if (user.trim().toUpperCase() == "EVALUATOR") {
|
||||
kpiReason.reasonEvaluator = requestBody.reason;
|
||||
kpiReason.status =
|
||||
kpiReason.kpiUserDevelopment.kpiUserEvaluation.commanderId == null ? "DONE" : "COMMANDER";
|
||||
} else if (user.trim().toUpperCase() == "COMMANDER") {
|
||||
kpiReason.reasonCommander = requestBody.reason;
|
||||
kpiReason.status =
|
||||
kpiReason.kpiUserDevelopment.kpiUserEvaluation.commanderHighId == null
|
||||
? "DONE"
|
||||
: "COMMANDERHIGH";
|
||||
} else if (user.trim().toUpperCase() == "COMMANDERHIGH") {
|
||||
kpiReason.reasonCommanderHigh = requestBody.reason;
|
||||
kpiReason.status = "DONE";
|
||||
}
|
||||
kpiReason.reasonCommanderHigh = requestBody.reason;
|
||||
kpiReason.lastUpdateUserId = request.user.sub;
|
||||
kpiReason.lastUpdateFullName = request.user.name;
|
||||
await this.kpiUserEvaluationReasonDevelopment.save(kpiReason);
|
||||
return new HttpSuccess(kpiReason.id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* API แก้ไขหมายเหตุ (USER)
|
||||
*
|
||||
* @summary แก้ไขหมายเหตุ (USER)
|
||||
*
|
||||
* @param {string} id Guid, *Id คนประเมิน (USER)
|
||||
*/
|
||||
@Put("problem/development/user/{id}")
|
||||
async sendKpiDevelopmentReason(
|
||||
@Path() id: string,
|
||||
@Body() requestBody: updateKpiUserReasonEvaluation,
|
||||
@Request() request: { user: Record<string, any> },
|
||||
) {
|
||||
const kpiReason = await this.kpiUserEvaluationReasonDevelopment.findOne({
|
||||
where: { id: id },
|
||||
relations: [
|
||||
"kpiUserDevelopment",
|
||||
"kpiUserDevelopment.kpiUserEvaluation",
|
||||
"kpiUserDevelopment.kpiUserEvaluation.evaluatorId",
|
||||
],
|
||||
});
|
||||
if (!kpiReason) {
|
||||
throw new HttpError(
|
||||
HttpStatusCode.NOT_FOUND,
|
||||
"ไม่พบข้อมูลรายการประเมินผลการปฏิบัติราชการระดับบุคคลนี้",
|
||||
);
|
||||
}
|
||||
|
||||
kpiReason.status =
|
||||
kpiReason.kpiUserDevelopment.kpiUserEvaluation.commanderId == null ? "DONE" : "COMMANDER";
|
||||
kpiReason.reasonCommanderHigh = requestBody.reason;
|
||||
kpiReason.lastUpdateUserId = request.user.sub;
|
||||
kpiReason.lastUpdateFullName = request.user.name;
|
||||
await this.kpiUserEvaluationReasonDevelopment.save(kpiReason);
|
||||
return new HttpSuccess(kpiReason.id);
|
||||
}
|
||||
|
||||
/**
|
||||
* API list หมายเหตุ (USER)
|
||||
*
|
||||
* @summary list หมายเหตุ (USER)
|
||||
*
|
||||
* @param {string} id Guid, *Id คนประเมิน (USER)
|
||||
*/
|
||||
@Get("{type}/development/{user}/{id}")
|
||||
async listKpiUserDevelopmentReason(
|
||||
@Path() id: string,
|
||||
@Path() type: string,
|
||||
@Path() user: string,
|
||||
) {
|
||||
if (type.trim().toUpperCase() == "PROGRESS") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonDevelopment.find({
|
||||
where: { kpiUserDevelopmentId: id },
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
} else {
|
||||
if (user.trim().toUpperCase() == "USER") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonDevelopment.find({
|
||||
where: { kpiUserDevelopmentId: id },
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
} else if (user.trim().toUpperCase() == "EVALUATOR") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonDevelopment.find({
|
||||
where: {
|
||||
kpiUserDevelopmentId: id,
|
||||
status: In(["EVALUATOR", "COMMANDER", "COMMANDERHIGH", "DONE"]),
|
||||
},
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
} else if (user.trim().toUpperCase() == "COMMANDER") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonDevelopment.find({
|
||||
where: {
|
||||
kpiUserDevelopmentId: id,
|
||||
status: In(["COMMANDER", "COMMANDERHIGH", "DONE"]),
|
||||
},
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
} else if (user.trim().toUpperCase() == "COMMANDERHIGH") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonDevelopment.find({
|
||||
where: {
|
||||
kpiUserDevelopmentId: id,
|
||||
status: In(["COMMANDERHIGH", "DONE"]),
|
||||
},
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* API แก้ไขหมายเหตุ (USER)
|
||||
*
|
||||
* @summary แก้ไขหมายเหตุ (USER)
|
||||
*
|
||||
* @param {string} id Guid, *Id คนประเมิน (USER)
|
||||
*/
|
||||
@Put("{type}/capacity/{user}/{id}")
|
||||
async updateKpiCapacityReason(
|
||||
@Path() type: string,
|
||||
@Path() user: string,
|
||||
@Path() id: string,
|
||||
@Body() requestBody: updateKpiUserReasonEvaluation,
|
||||
@Request() request: { user: Record<string, any> },
|
||||
) {
|
||||
if (user.trim().toUpperCase() == "USER") {
|
||||
const kpiUserEvaluation = await this.kpiUserCapacity.findOne({
|
||||
where: { id: id },
|
||||
relations: ["kpiUserEvaluation", "kpiUserEvaluation.evaluatorId"],
|
||||
});
|
||||
if (!kpiUserEvaluation) {
|
||||
throw new HttpError(
|
||||
HttpStatusCode.NOT_FOUND,
|
||||
"ไม่พบข้อมูลรายการประเมินผลการปฏิบัติราชการระดับบุคคลนี้",
|
||||
);
|
||||
}
|
||||
const kpiUserEvaluationReason = Object.assign(
|
||||
new KpiUserEvaluationReasonCapacity(),
|
||||
requestBody,
|
||||
);
|
||||
kpiUserEvaluationReason.type = type.trim().toUpperCase();
|
||||
kpiUserEvaluationReason.status =
|
||||
kpiUserEvaluation.kpiUserEvaluation.evaluatorId == null ? "DONE" : "EVALUATOR";
|
||||
kpiUserEvaluationReason.kpiUserCapacityId = id;
|
||||
kpiUserEvaluationReason.createdUserId = request.user.sub;
|
||||
kpiUserEvaluationReason.createdFullName = request.user.name;
|
||||
kpiUserEvaluationReason.lastUpdateUserId = request.user.sub;
|
||||
kpiUserEvaluationReason.lastUpdateFullName = request.user.name;
|
||||
await this.kpiUserEvaluationReasonCapacity.save(kpiUserEvaluationReason);
|
||||
return new HttpSuccess(kpiUserEvaluationReason.id);
|
||||
} else {
|
||||
const kpiReason = await this.kpiUserEvaluationReasonCapacity.findOne({
|
||||
where: { id: id },
|
||||
relations: [
|
||||
"kpiUserCapacity",
|
||||
"kpiUserCapacity.kpiUserEvaluation",
|
||||
"kpiUserCapacity.kpiUserEvaluation.evaluatorId",
|
||||
],
|
||||
});
|
||||
if (!kpiReason) {
|
||||
throw new HttpError(
|
||||
HttpStatusCode.NOT_FOUND,
|
||||
"ไม่พบข้อมูลรายการประเมินผลการปฏิบัติราชการระดับบุคคลนี้",
|
||||
);
|
||||
}
|
||||
|
||||
if (user.trim().toUpperCase() == "EVALUATOR") {
|
||||
kpiReason.reasonEvaluator = requestBody.reason;
|
||||
kpiReason.status =
|
||||
kpiReason.kpiUserCapacity.kpiUserEvaluation.commanderId == null ? "DONE" : "COMMANDER";
|
||||
} else if (user.trim().toUpperCase() == "COMMANDER") {
|
||||
kpiReason.reasonCommander = requestBody.reason;
|
||||
kpiReason.status =
|
||||
kpiReason.kpiUserCapacity.kpiUserEvaluation.commanderHighId == null
|
||||
? "DONE"
|
||||
: "COMMANDERHIGH";
|
||||
} else if (user.trim().toUpperCase() == "COMMANDERHIGH") {
|
||||
kpiReason.reasonCommanderHigh = requestBody.reason;
|
||||
kpiReason.status = "DONE";
|
||||
}
|
||||
kpiReason.reasonCommanderHigh = requestBody.reason;
|
||||
kpiReason.lastUpdateUserId = request.user.sub;
|
||||
kpiReason.lastUpdateFullName = request.user.name;
|
||||
await this.kpiUserEvaluationReasonCapacity.save(kpiReason);
|
||||
return new HttpSuccess(kpiReason.id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* API แก้ไขหมายเหตุ (USER)
|
||||
*
|
||||
* @summary แก้ไขหมายเหตุ (USER)
|
||||
*
|
||||
* @param {string} id Guid, *Id คนประเมิน (USER)
|
||||
*/
|
||||
@Put("problem/capacity/user/{id}")
|
||||
async sendKpiCapacityReason(
|
||||
@Path() id: string,
|
||||
@Body() requestBody: updateKpiUserReasonEvaluation,
|
||||
@Request() request: { user: Record<string, any> },
|
||||
) {
|
||||
const kpiReason = await this.kpiUserEvaluationReasonCapacity.findOne({
|
||||
where: { id: id },
|
||||
relations: [
|
||||
"kpiUserCapacity",
|
||||
"kpiUserCapacity.kpiUserEvaluation",
|
||||
"kpiUserCapacity.kpiUserEvaluation.evaluatorId",
|
||||
],
|
||||
});
|
||||
if (!kpiReason) {
|
||||
throw new HttpError(
|
||||
HttpStatusCode.NOT_FOUND,
|
||||
"ไม่พบข้อมูลรายการประเมินผลการปฏิบัติราชการระดับบุคคลนี้",
|
||||
);
|
||||
}
|
||||
|
||||
kpiReason.status =
|
||||
kpiReason.kpiUserCapacity.kpiUserEvaluation.commanderId == null ? "DONE" : "COMMANDER";
|
||||
kpiReason.reasonCommanderHigh = requestBody.reason;
|
||||
kpiReason.lastUpdateUserId = request.user.sub;
|
||||
kpiReason.lastUpdateFullName = request.user.name;
|
||||
await this.kpiUserEvaluationReasonCapacity.save(kpiReason);
|
||||
return new HttpSuccess(kpiReason.id);
|
||||
}
|
||||
|
||||
/**
|
||||
* API list หมายเหตุ (USER)
|
||||
*
|
||||
* @summary list หมายเหตุ (USER)
|
||||
*
|
||||
* @param {string} id Guid, *Id คนประเมิน (USER)
|
||||
*/
|
||||
@Get("{type}/capacity/{user}/{id}")
|
||||
async listKpiUserCapacityReason(@Path() id: string, @Path() type: string, @Path() user: string) {
|
||||
if (type.trim().toUpperCase() == "PROGRESS") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonCapacity.find({
|
||||
where: { kpiUserCapacityId: id },
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
} else {
|
||||
if (user.trim().toUpperCase() == "USER") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonCapacity.find({
|
||||
where: { kpiUserCapacityId: id },
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
} else if (user.trim().toUpperCase() == "EVALUATOR") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonCapacity.find({
|
||||
where: {
|
||||
kpiUserCapacityId: id,
|
||||
status: In(["EVALUATOR", "COMMANDER", "COMMANDERHIGH", "DONE"]),
|
||||
},
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
} else if (user.trim().toUpperCase() == "COMMANDER") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonCapacity.find({
|
||||
where: {
|
||||
kpiUserCapacityId: id,
|
||||
status: In(["COMMANDER", "COMMANDERHIGH", "DONE"]),
|
||||
},
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
} else if (user.trim().toUpperCase() == "COMMANDERHIGH") {
|
||||
const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonCapacity.find({
|
||||
where: {
|
||||
kpiUserCapacityId: id,
|
||||
status: In(["COMMANDERHIGH", "DONE"]),
|
||||
},
|
||||
});
|
||||
return new HttpSuccess(kpiUserEvaluationReason);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -190,57 +190,6 @@ export class KpiUserEvaluationController extends Controller {
|
|||
return new HttpSuccess(kpiUserEvaluation.id);
|
||||
}
|
||||
|
||||
// /**
|
||||
// * API แก้ไขหมายเหตุ (USER)
|
||||
// *
|
||||
// * @summary แก้ไขหมายเหตุ (USER)
|
||||
// *
|
||||
// * @param {string} id Guid, *Id คนประเมิน (USER)
|
||||
// */
|
||||
// @Put("{type}/{id}")
|
||||
// async updateKpiUserEvaluatorEvaluation(
|
||||
// @Path() id: string,
|
||||
// @Path() type: string,
|
||||
// @Body() requestBody: updateKpiUserReasonEvaluation,
|
||||
// @Request() request: { user: Record<string, any> },
|
||||
// ) {
|
||||
// const kpiUserEvaluation = await this.kpiUserEvalutionRepository.findOne({
|
||||
// where: { id: id },
|
||||
// });
|
||||
// if (!kpiUserEvaluation) {
|
||||
// throw new HttpError(
|
||||
// HttpStatusCode.NOT_FOUND,
|
||||
// "ไม่พบข้อมูลรายการประเมินผลการปฏิบัติราชการระดับบุคคลนี้",
|
||||
// );
|
||||
// }
|
||||
|
||||
// const kpiUserEvaluationReason = Object.assign(new KpiUserEvaluationReason(), requestBody);
|
||||
// kpiUserEvaluationReason.type = type.trim().toUpperCase();
|
||||
// kpiUserEvaluationReason.kpiUserEvaluationId = id;
|
||||
// kpiUserEvaluationReason.createdUserId = request.user.sub;
|
||||
// kpiUserEvaluationReason.createdFullName = request.user.name;
|
||||
// kpiUserEvaluationReason.lastUpdateUserId = request.user.sub;
|
||||
// kpiUserEvaluationReason.lastUpdateFullName = request.user.name;
|
||||
// await this.kpiUserEvaluationReasonRepository.save(kpiUserEvaluationReason);
|
||||
// return new HttpSuccess(kpiUserEvaluation.id);
|
||||
// }
|
||||
|
||||
// /**
|
||||
// * API list หมายเหตุ (USER)
|
||||
// *
|
||||
// * @summary list หมายเหตุ (USER)
|
||||
// *
|
||||
// * @param {string} id Guid, *Id คนประเมิน (USER)
|
||||
// */
|
||||
// @Get("{type}/{id}")
|
||||
// async listKpiUserCommanderEvaluation(@Path() id: string, @Path() type: string) {
|
||||
// const kpiUserEvaluationReason = await this.kpiUserEvaluationReasonRepository.find({
|
||||
// where: { kpiUserEvaluationId: id, type: type.trim().toUpperCase() },
|
||||
// order: { createdAt: "ASC" },
|
||||
// });
|
||||
// return new HttpSuccess(kpiUserEvaluationReason);
|
||||
// }
|
||||
|
||||
/**
|
||||
* API แก้ไขรายการประเมินผลการปฏิบัติราชการระดับบุคคล (USER)
|
||||
*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue