hrms-api-kpi/src/controllers/KpiRoleController.ts

301 lines
10 KiB
TypeScript
Raw Normal View History

2024-04-19 09:44:46 +07:00
import {
Controller,
Get,
Post,
Put,
Delete,
Route,
Security,
Tags,
Body,
Path,
Request,
Example,
SuccessResponse,
Response,
Query,
} 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 { KpiRole, createKpiRole, updateKpiRole } from "../entities/kpiRole";
import CallAPI from "../interfaces/call-api";
2024-04-19 17:45:56 +07:00
import { KpiPeriod } from "../entities/kpiPeriod";
import { Brackets } from "typeorm";
2024-04-19 09:44:46 +07:00
@Route("api/v1/kpi/role")
@Tags("kpiRole")
@Security("bearerAuth")
@Response(
HttpStatusCode.INTERNAL_SERVER_ERROR,
"เกิดข้อผิดพลาด ไม่สามารถแสดงรายการได้ กรุณาลองใหม่ในภายหลัง",
)
@SuccessResponse(HttpStatusCode.OK, "สำเร็จ")
export class kpiRoleController extends Controller {
private kpiRoleRepository = AppDataSource.getRepository(KpiRole);
2024-04-19 17:45:56 +07:00
private kpiPeriodRepository = AppDataSource.getRepository(KpiPeriod);
2024-04-19 09:44:46 +07:00
/**
*
* @param requestBody
* @param request
*/
@Post()
async createKpiRole(
@Body() requestBody: createKpiRole,
@Request() request: { user: Record<string, any> },
) {
const kpiRole = Object.assign(new KpiRole(), requestBody);
2024-04-19 17:45:56 +07:00
if (requestBody.kpiPeriodId != null) {
const kpiPeriod = await this.kpiPeriodRepository.findOne({
where: { id: requestBody.kpiPeriodId },
});
if (!kpiPeriod) {
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลตัวชี้วัดตามตำแหน่งนี้");
}
}
2024-04-19 09:44:46 +07:00
await new CallAPI()
.PostData(request, "org/find/all", {
node: requestBody.node,
nodeId: requestBody.nodeId,
})
.then((x) => {
kpiRole.root = x.root;
kpiRole.rootId = x.rootId;
kpiRole.rootShortName = x.rootShortName;
kpiRole.child1 = requestBody.node <= 0 ? null : x.child1;
kpiRole.child1Id = requestBody.node <= 0 ? null : x.child1Id;
kpiRole.child1ShortName = requestBody.node <= 0 ? null : x.child1ShortName;
kpiRole.child2 = requestBody.node <= 1 ? null : x.child2;
kpiRole.child2Id = requestBody.node <= 1 ? null : x.child2Id;
kpiRole.child2ShortName = requestBody.node <= 1 ? null : x.child2ShortName;
kpiRole.child3 = requestBody.node <= 2 ? null : x.child3;
kpiRole.child3Id = requestBody.node <= 2 ? null : x.child3Id;
kpiRole.child3ShortName = requestBody.node <= 2 ? null : x.child3ShortName;
kpiRole.child4 = requestBody.node <= 3 ? null : x.child4;
kpiRole.child4Id = requestBody.node <= 3 ? null : x.child4Id;
kpiRole.child4ShortName = requestBody.node <= 3 ? null : x.child4ShortName;
})
.catch((x) => {});
kpiRole.createdUserId = request.user.sub;
kpiRole.createdFullName = request.user.name;
kpiRole.lastUpdateUserId = request.user.sub;
kpiRole.lastUpdateFullName = request.user.name;
await this.kpiRoleRepository.save(kpiRole);
return new HttpSuccess(kpiRole.id);
}
/**
* API
* @param id
* @param requestBody
* @param request
*/
@Put("{id}")
async updateKpiRole(
@Path() id: string,
@Body() requestBody: updateKpiRole,
@Request() request: { user: Record<string, any> },
) {
const kpiRole = await this.kpiRoleRepository.findOne({
where: { id: id },
});
if (!kpiRole) {
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลตัวชี้วัดตามตำแหน่งนี้");
}
2024-04-19 17:45:56 +07:00
if (requestBody.kpiPeriodId != null) {
const kpiPeriod = await this.kpiPeriodRepository.findOne({
where: { id: requestBody.kpiPeriodId },
});
if (!kpiPeriod) {
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลตัวชี้วัดตามตำแหน่งนี้");
}
}
2024-04-19 09:44:46 +07:00
Object.assign(kpiRole, requestBody);
await new CallAPI()
.PostData(request, "org/find/all", {
node: requestBody.node,
nodeId: requestBody.nodeId,
})
.then((x) => {
kpiRole.root = x.root;
kpiRole.rootId = x.rootId;
kpiRole.rootShortName = x.rootShortName;
kpiRole.child1 = requestBody.node <= 0 ? null : x.child1;
kpiRole.child1Id = requestBody.node <= 0 ? null : x.child1Id;
kpiRole.child1ShortName = requestBody.node <= 0 ? null : x.child1ShortName;
kpiRole.child2 = requestBody.node <= 1 ? null : x.child2;
kpiRole.child2Id = requestBody.node <= 1 ? null : x.child2Id;
kpiRole.child2ShortName = requestBody.node <= 1 ? null : x.child2ShortName;
kpiRole.child3 = requestBody.node <= 2 ? null : x.child3;
kpiRole.child3Id = requestBody.node <= 2 ? null : x.child3Id;
kpiRole.child3ShortName = requestBody.node <= 2 ? null : x.child3ShortName;
kpiRole.child4 = requestBody.node <= 3 ? null : x.child4;
kpiRole.child4Id = requestBody.node <= 3 ? null : x.child4Id;
kpiRole.child4ShortName = requestBody.node <= 3 ? null : x.child4ShortName;
})
.catch((x) => {});
kpiRole.createdUserId = request.user.sub;
kpiRole.createdFullName = request.user.name;
kpiRole.lastUpdateUserId = request.user.sub;
kpiRole.lastUpdateFullName = request.user.name;
await this.kpiRoleRepository.save(kpiRole);
return new HttpSuccess(id);
}
/**
* API
* @param id Guid, *Id
*/
@Get("{id}")
async GetKpiRoleById(@Path() id: string) {
const kpiRole = await this.kpiRoleRepository.findOne({
where: { id: id },
2024-04-19 17:45:56 +07:00
relations: { kpiPeriod: true },
2024-04-19 09:44:46 +07:00
});
if (!kpiRole) {
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลตัวชี้วัดตามตำแหน่งนี้");
}
let node = null;
let nodeId = null;
let nodeName = null;
2024-04-19 09:44:46 +07:00
if (kpiRole.child4Id != null) {
node = 4;
nodeId = kpiRole.child4Id;
nodeName = kpiRole.child4;
2024-04-19 09:44:46 +07:00
} else if (kpiRole.child3Id != null) {
node = 3;
nodeId = kpiRole.child3Id;
nodeName = kpiRole.child3;
2024-04-19 09:44:46 +07:00
} else if (kpiRole.child2Id != null) {
node = 2;
nodeId = kpiRole.child2Id;
nodeName = kpiRole.child2;
2024-04-19 09:44:46 +07:00
} else if (kpiRole.child1Id != null) {
node = 1;
nodeId = kpiRole.child1Id;
nodeName = kpiRole.child1;
2024-04-19 09:44:46 +07:00
} else if (kpiRole.rootId != null) {
node = 0;
nodeId = kpiRole.rootId;
nodeName = kpiRole.root;
2024-04-19 09:44:46 +07:00
}
const formattedData = {
id: kpiRole.id,
2024-04-19 17:45:56 +07:00
year: kpiRole.kpiPeriod == null ? null : kpiRole.kpiPeriod.year,
round: kpiRole.kpiPeriod == null ? null : kpiRole.kpiPeriod.durationKPI,
kpiPeriodId: kpiRole.kpiPeriodId,
2024-04-19 09:44:46 +07:00
including: kpiRole.including,
includingName: kpiRole.includingName,
target: kpiRole.target,
unit: kpiRole.unit,
weight: kpiRole.weight,
achievement1: kpiRole.achievement1,
achievement2: kpiRole.achievement2,
achievement3: kpiRole.achievement3,
achievement4: kpiRole.achievement4,
achievement5: kpiRole.achievement5,
meaning: kpiRole.meaning,
formula: kpiRole.formula,
2024-04-26 10:18:00 +07:00
root: kpiRole.rootId,
child1: kpiRole.child1Id,
child2: kpiRole.child2Id,
child3: kpiRole.child3Id,
child4: kpiRole.child4Id,
2024-04-19 09:44:46 +07:00
node: node,
nodeId: nodeId,
nodeName: nodeName,
2024-04-19 09:44:46 +07:00
orgRevisionId: kpiRole.orgRevisionId,
2024-04-19 17:35:42 +07:00
position: kpiRole.position,
2024-04-19 09:44:46 +07:00
};
return new HttpSuccess(formattedData);
}
/**
* API list
* @param page
* @param pageSize
* @param keyword
*/
@Get()
async listKpiRole(
@Query("page") page: number = 1,
@Query("pageSize") pageSize: number = 10,
2024-04-20 12:51:44 +07:00
@Query("kpiPeriodId") kpiPeriodId?: string,
2024-04-19 09:44:46 +07:00
@Query("nodeId") nodeId?: string | null,
@Query("node") node?: number | null,
@Query("keyword") keyword?: string,
2024-04-19 16:11:46 +07:00
@Query("position") position?: string,
2024-04-19 09:44:46 +07:00
) {
const [kpiRole, total] = await AppDataSource.getRepository(KpiRole)
.createQueryBuilder("kpiRole")
2024-04-20 12:51:44 +07:00
.leftJoinAndSelect("kpiRole.kpiPeriod", "kpiPeriod")
2024-04-19 09:44:46 +07:00
.andWhere(
node != undefined && node != null
? node == 4
? "kpiRole.child4Id LIKE :nodeId"
: node == 3
? "kpiRole.child3Id LIKE :nodeId"
: node == 2
? "kpiRole.child2Id LIKE :nodeId"
: node == 1
? "kpiRole.child1Id LIKE :nodeId"
: "kpiRole.rootId LIKE :nodeId"
: "1=1",
{
2024-04-26 12:40:43 +07:00
nodeId: nodeId,
2024-04-19 09:44:46 +07:00
},
)
.andWhere(
2024-04-20 12:51:44 +07:00
kpiPeriodId != undefined && kpiPeriodId != null && kpiPeriodId != ""
? "kpiRole.kpiPeriod LIKE :kpiPeriodId"
2024-04-19 17:45:56 +07:00
: "1=1",
2024-04-19 09:44:46 +07:00
{
2024-04-26 12:40:43 +07:00
kpiPeriodId: kpiPeriodId,
2024-04-19 09:44:46 +07:00
},
)
2024-04-19 16:18:24 +07:00
.andWhere(position != undefined ? "kpiRole.position LIKE :position" : "1=1", {
2024-04-19 16:11:46 +07:00
position: `%${position}%`,
2024-04-19 09:44:46 +07:00
})
.andWhere(
new Brackets((qb) => {
qb.orWhere("kpiRole.including LIKE :keyword", { keyword: `%${keyword}%` }).orWhere(
"kpiRole.includingName LIKE :keyword",
{ keyword: `%${keyword}%` },
);
}),
)
2024-04-19 09:44:46 +07:00
.select([
"kpiRole.id",
2024-04-20 12:51:44 +07:00
"kpiPeriod.year",
"kpiPeriod.durationKPI",
2024-04-19 09:44:46 +07:00
"kpiRole.including",
"kpiRole.includingName",
2024-04-22 09:53:59 +07:00
"kpiRole.createdAt",
2024-04-19 09:44:46 +07:00
])
.orderBy("kpiRole.createdAt", "DESC")
.skip((page - 1) * pageSize)
.take(pageSize)
.getManyAndCount();
return new HttpSuccess({ data: kpiRole, total });
}
/**
* API
* @param id
*/
@Delete("{id}")
async deleteKpiRole(@Path() id: string) {
const kpiRole = await this.kpiRoleRepository.findOne({
where: { id: id },
});
if (!kpiRole) {
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลตัวชี้วัดตามตำแหน่งนี้");
}
await this.kpiRoleRepository.remove(kpiRole);
return new HttpSuccess();
}
}