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

964 lines
34 KiB
TypeScript

import {
Controller,
Get,
Post,
Put,
Delete,
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 { KpiRole, createKpiRole, updateKpiRole } from "../entities/kpiRole";
import CallAPI from "../interfaces/call-api";
import { KpiPeriod } from "../entities/kpiPeriod";
import { Brackets, IsNull, Like } from "typeorm";
import { KpiRoleHistory } from "../entities/kpiRoleHistory";
import permission from "../interfaces/permission";
import { RequestWithUser } from "../middlewares/user";
import { setLogDataDiff } from "../interfaces/utils";
@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);
private kpiRoleHistoryRepository = AppDataSource.getRepository(KpiRoleHistory);
private kpiPeriodRepository = AppDataSource.getRepository(KpiPeriod);
/**
* สร้างตัวชี้วัดตามตำแหน่ง
* @param requestBody
* @param request
*/
@Post()
async createKpiRole(@Body() requestBody: createKpiRole, @Request() request: RequestWithUser) {
await new permission().PermissionCreate(request, "SYS_EVA_INDICATOR");
const kpiRole = Object.assign(new KpiRole(), requestBody);
if (requestBody.year != null && requestBody.period != null && requestBody.period != "") {
const kpiPeriod = await this.kpiPeriodRepository
.createQueryBuilder("kpiPeriod")
.where("kpiPeriod.year = :year", { year: requestBody.year })
.andWhere("kpiPeriod.durationKPI = :durationKPI", { durationKPI: requestBody.period })
.getOne();
const year =
requestBody.year && parseInt(requestBody.year) > 0
? parseInt(requestBody.year) + 543
: "ดังกล่าว";
if (!kpiPeriod) {
throw new HttpError(
HttpStatusCode.NOT_FOUND,
"ไม่พบข้อมูลรอบการประเมินนี้ในปีงบประมาณ" + year,
);
}
}
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.rootDnaId = x.rootDnaId;
kpiRole.rootShortName = x.rootShortName;
kpiRole.child1 = requestBody.node <= 0 ? null : x.child1;
kpiRole.child1Id = requestBody.node <= 0 ? null : x.child1Id;
kpiRole.child1DnaId = requestBody.node <= 0 ? null : x.child1DnaId;
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.child2DnaId = requestBody.node <= 1 ? null : x.child2DnaId;
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.child3DnaId = requestBody.node <= 2 ? null : x.child3DnaId;
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.child4DnaId = requestBody.node <= 3 ? null : x.child4DnaId;
kpiRole.child4ShortName = requestBody.node <= 3 ? null : x.child4ShortName;
})
.catch((x) => {});
let maxIncludingRole: any;
if (requestBody.node == 0) {
maxIncludingRole = await this.kpiRoleRepository
.createQueryBuilder("kpiRole")
.select("MAX(kpiRole.including)", "maxIncluding")
.where("kpiRole.rootId = :rootId AND kpiRole.child1Id IS NULL", {
rootId: requestBody.nodeId,
})
.andWhere("kpiRole.position LIKE :position", {
position: `%${requestBody.position}%`,
})
.andWhere("kpiRole.year = :year", {
year: requestBody.year,
})
.andWhere("kpiRole.period = :period", {
period: requestBody.period,
})
.getRawOne();
} else if (requestBody.node == 1) {
maxIncludingRole = await this.kpiRoleRepository
.createQueryBuilder("kpiRole")
.select("MAX(kpiRole.including)", "maxIncluding")
.where("kpiRole.child1Id = :child1Id AND kpiRole.child2Id IS NULL", {
child1Id: requestBody.nodeId,
})
.andWhere("kpiRole.position LIKE :position", {
position: `%${requestBody.position}%`,
})
.andWhere("kpiRole.year = :year", {
year: requestBody.year,
})
.andWhere("kpiRole.period = :period", {
period: requestBody.period,
})
.getRawOne();
} else if (requestBody.node == 2) {
maxIncludingRole = await this.kpiRoleRepository
.createQueryBuilder("kpiRole")
.select("MAX(kpiRole.including)", "maxIncluding")
.where("kpiRole.child2Id = :child2Id AND kpiRole.child3Id IS NULL", {
child2Id: requestBody.nodeId,
})
.andWhere("kpiRole.position LIKE :position", {
position: `%${requestBody.position}%`,
})
.andWhere("kpiRole.year = :year", {
year: requestBody.year,
})
.andWhere("kpiRole.period = :period", {
period: requestBody.period,
})
.getRawOne();
} else if (requestBody.node == 3) {
maxIncludingRole = await this.kpiRoleRepository
.createQueryBuilder("kpiRole")
.select("MAX(kpiRole.including)", "maxIncluding")
.where("kpiRole.child3Id = :child3Id AND kpiRole.child4Id IS NULL", {
child3Id: requestBody.nodeId,
})
.andWhere("kpiRole.position LIKE :position", {
position: `%${requestBody.position}%`,
})
.andWhere("kpiRole.year = :year", {
year: requestBody.year,
})
.andWhere("kpiRole.period = :period", {
period: requestBody.period,
})
.getRawOne();
} else if (requestBody.node == 4) {
maxIncludingRole = await this.kpiRoleRepository
.createQueryBuilder("kpiRole")
.select("MAX(kpiRole.including)", "maxIncluding")
.where("kpiRole.child4Id = :child4Id", {
child4Id: requestBody.nodeId,
})
.andWhere("kpiRole.position LIKE :position", {
position: `%${requestBody.position}%`,
})
.andWhere("kpiRole.year = :year", {
year: requestBody.year,
})
.andWhere("kpiRole.period = :period", {
period: requestBody.period,
})
.getRawOne();
}
const before = null;
kpiRole.including = maxIncludingRole.maxIncluding + 1;
kpiRole.createdUserId = request.user.sub;
kpiRole.createdFullName = request.user.name;
kpiRole.lastUpdateUserId = request.user.sub;
kpiRole.lastUpdateFullName = request.user.name;
kpiRole.createdAt = new Date();
kpiRole.lastUpdatedAt = new Date();
await this.kpiRoleRepository.save(kpiRole, { data: request });
setLogDataDiff(request, { before, after: kpiRole });
const history = new KpiRoleHistory();
history.kpiRoleId = kpiRole.id;
history.createdUserId = request.user.sub;
history.createdFullName = request.user.name;
history.lastUpdateUserId = request.user.sub;
history.lastUpdateFullName = request.user.name;
history.createdAt = new Date();
history.lastUpdatedAt = new Date();
await this.kpiRoleHistoryRepository.save(history, { data: request });
setLogDataDiff(request, { before, after: 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: RequestWithUser,
) {
await new permission().PermissionUpdate(request, "SYS_EVA_INDICATOR");
const kpiRole = await this.kpiRoleRepository.findOne({
where: { id: id },
});
if (!kpiRole) {
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลตัวชี้วัดตามตำแหน่งนี้");
}
if (requestBody.year != null) {
const kpiPeriod = await this.kpiPeriodRepository
.createQueryBuilder("kpiPeriod")
.where("kpiPeriod.year = :year", { year: requestBody.year })
.andWhere(requestBody.period ? "kpiPeriod.durationKPI = :durationKPI" : "1=1", {
durationKPI: requestBody.period,
})
.getOne();
if (!kpiPeriod) {
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลตัวชี้วัดตามตำแหน่งในรอบการประเมินนี้");
}
}
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.rootDnaId = x.rootDnaId;
kpiRole.rootShortName = x.rootShortName;
kpiRole.child1 = requestBody.node <= 0 ? null : x.child1;
kpiRole.child1Id = requestBody.node <= 0 ? null : x.child1Id;
kpiRole.child1DnaId = requestBody.node <= 0 ? null : x.child1DnaId;
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.child2DnaId = requestBody.node <= 1 ? null : x.child2DnaId;
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.child3DnaId = requestBody.node <= 2 ? null : x.child3DnaId;
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.child4DnaId = requestBody.node <= 3 ? null : x.child4DnaId;
kpiRole.child4ShortName = requestBody.node <= 3 ? null : x.child4ShortName;
})
.catch((x) => {});
let before = null;
before = structuredClone(kpiRole);
kpiRole.createdUserId = request.user.sub;
kpiRole.createdFullName = request.user.name;
kpiRole.lastUpdateUserId = request.user.sub;
kpiRole.lastUpdateFullName = request.user.name;
kpiRole.createdAt = new Date();
kpiRole.lastUpdatedAt = new Date();
await this.kpiRoleRepository.save(kpiRole, { data: request });
setLogDataDiff(request, { before, after: kpiRole });
before = null;
const history = new KpiRoleHistory();
history.kpiRoleId = kpiRole.id;
history.createdUserId = request.user.sub;
history.createdFullName = request.user.name;
history.lastUpdateUserId = request.user.sub;
history.lastUpdateFullName = request.user.name;
history.createdAt = new Date();
history.lastUpdatedAt = new Date();
await this.kpiRoleHistoryRepository.save(history, { data: request });
setLogDataDiff(request, { before, after: kpiRole });
return new HttpSuccess(id);
}
/**
* API ตัวชี้วัดตามตำแหน่ง
* @param id Guid, *Id ตัวชี้วัดตามตำแหน่ง
*/
@Get("edit/{id}")
async GetKpiRoleByIdEdit(@Request() request: RequestWithUser, @Path() id: string) {
let _workflow = await new permission().Workflow(request, id, "SYS_EVA_INDICATOR");
if (_workflow == false) await new permission().PermissionGet(request, "SYS_EVA_INDICATOR");
const kpiRole = await this.kpiRoleRepository.findOne({
where: { id: id },
relations: { kpiPeriod: true },
});
if (!kpiRole) {
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลตัวชี้วัดตามตำแหน่งนี้");
}
let node = null;
let nodeId = null;
let nodeDnaId = null;
let nodeName = null;
if (kpiRole.child4Id != null) {
node = 4;
nodeId = kpiRole.child4Id;
nodeDnaId = kpiRole.child4DnaId;
nodeName = kpiRole.child4;
} else if (kpiRole.child3Id != null) {
node = 3;
nodeId = kpiRole.child3Id;
nodeDnaId = kpiRole.child3DnaId;
nodeName = kpiRole.child3;
} else if (kpiRole.child2Id != null) {
node = 2;
nodeId = kpiRole.child2Id;
nodeDnaId = kpiRole.child2DnaId;
nodeName = kpiRole.child2;
} else if (kpiRole.child1Id != null) {
node = 1;
nodeId = kpiRole.child1Id;
nodeDnaId = kpiRole.child1DnaId;
nodeName = kpiRole.child1;
} else if (kpiRole.rootId != null) {
node = 0;
nodeId = kpiRole.rootId;
nodeDnaId = kpiRole.rootDnaId;
nodeName = kpiRole.root;
}
const formattedData = {
id: kpiRole.id,
// year: kpiRole.kpiPeriod == null ? null : kpiRole.kpiPeriod.year,
// round: kpiRole.kpiPeriod == null ? null : kpiRole.kpiPeriod.durationKPI,
year: kpiRole.year == null ? null : kpiRole.year,
round: kpiRole.period == null ? null : kpiRole.period,
kpiPeriodId: kpiRole.kpiPeriodId,
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,
root: kpiRole.rootId,
child1: kpiRole.child1Id,
child2: kpiRole.child2Id,
child3: kpiRole.child3Id,
child4: kpiRole.child4Id,
rootDna: kpiRole.rootDnaId,
child1Dna: kpiRole.child1DnaId,
child2Dna: kpiRole.child2DnaId,
child3Dna: kpiRole.child3DnaId,
child4Dna: kpiRole.child4DnaId,
node: node,
nodeId: nodeId,
nodeDnaId: nodeDnaId,
nodeName: nodeName,
orgRevisionId: kpiRole.orgRevisionId,
position: kpiRole.position,
documentInfoEvidence: kpiRole.documentInfoEvidence,
};
return new HttpSuccess(formattedData);
}
/**
* API ตัวชี้วัดตามตำแหน่ง
* @param id Guid, *Id ตัวชี้วัดตามตำแหน่ง
*/
@Get("{id}")
async GetKpiRoleById(@Request() request: RequestWithUser, @Path() id: string) {
const kpiRole = await this.kpiRoleRepository.findOne({
where: { id: id },
relations: { kpiPeriod: true },
});
if (!kpiRole) {
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลตัวชี้วัดตามตำแหน่งนี้");
}
let node = null;
let nodeId = null;
let nodeDnaId = null;
let nodeName = null;
if (kpiRole.child4Id != null) {
node = 4;
nodeId = kpiRole.child4Id;
nodeDnaId = kpiRole.child4DnaId;
nodeName = kpiRole.child4;
} else if (kpiRole.child3Id != null) {
node = 3;
nodeId = kpiRole.child3Id;
nodeDnaId = kpiRole.child3DnaId;
nodeName = kpiRole.child3;
} else if (kpiRole.child2Id != null) {
node = 2;
nodeId = kpiRole.child2Id;
nodeDnaId = kpiRole.child2DnaId;
nodeName = kpiRole.child2;
} else if (kpiRole.child1Id != null) {
node = 1;
nodeId = kpiRole.child1Id;
nodeDnaId = kpiRole.child1DnaId;
nodeName = kpiRole.child1;
} else if (kpiRole.rootId != null) {
node = 0;
nodeId = kpiRole.rootId;
nodeDnaId = kpiRole.rootDnaId;
nodeName = kpiRole.root;
}
const formattedData = {
id: kpiRole.id,
// year: kpiRole.kpiPeriod == null ? null : kpiRole.kpiPeriod.year,
// round: kpiRole.kpiPeriod == null ? null : kpiRole.kpiPeriod.durationKPI,
year: kpiRole.year == null ? null : kpiRole.year,
round: kpiRole.period == null ? null : kpiRole.period,
kpiPeriodId: kpiRole.kpiPeriodId,
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,
root: kpiRole.rootId,
child1: kpiRole.child1Id,
child2: kpiRole.child2Id,
child3: kpiRole.child3Id,
child4: kpiRole.child4Id,
rootDna: kpiRole.rootDnaId,
child1Dna: kpiRole.child1DnaId,
child2Dna: kpiRole.child2DnaId,
child3Dna: kpiRole.child3DnaId,
child4Dna: kpiRole.child4DnaId,
node: node,
nodeId: nodeId,
nodeDnaId: nodeDnaId,
nodeName: nodeName,
orgRevisionId: kpiRole.orgRevisionId,
position: kpiRole.position,
documentInfoEvidence: kpiRole.documentInfoEvidence,
};
return new HttpSuccess(formattedData);
}
/**
* API list ตัวชี้วัดตามตำแหน่ง
* @param page
* @param pageSize
* @param keyword
*/
@Post("search")
async listKpiRole(
@Request() request: RequestWithUser,
@Body()
requestBody: {
page: number;
pageSize: number;
year?: string | null;
period?: string | null;
nodeId?: string | null;
node?: number | null;
position?: string | null;
keyword?: string | null;
isAll?: boolean | false;
// isNull?: boolean | false;
},
) {
let condition = "";
let parameters: any = {};
if (requestBody.isAll === false) {
switch (requestBody.node) {
case 0:
condition = "kpiRole.rootDnaId LIKE :nodeId AND kpiRole.child1DnaId IS NULL";
break;
case 1:
condition = "kpiRole.child1DnaId LIKE :nodeId AND kpiRole.child2DnaId IS NULL";
break;
case 2:
condition = "kpiRole.child2DnaId LIKE :nodeId AND kpiRole.child3DnaId IS NULL";
break;
case 3:
condition = "kpiRole.child3DnaId LIKE :nodeId AND kpiRole.child4DnaId IS NULL";
break;
case 4:
condition = "kpiRole.child4DnaId LIKE :nodeId";
break;
default:
condition = "1=1";
break;
}
parameters.nodeId = `%${requestBody.nodeId}%`;
} else {
switch (requestBody.node) {
case 0:
condition = "kpiRole.rootDnaId LIKE :nodeId";
break;
case 1:
condition = "kpiRole.child1DnaId LIKE :nodeId";
break;
case 2:
condition = "kpiRole.child2DnaId LIKE :nodeId";
break;
case 3:
condition = "kpiRole.child3DnaId LIKE :nodeId";
break;
case 4:
condition = "kpiRole.child4DnaId LIKE :nodeId";
break;
default:
condition = "1=1";
break;
}
parameters.nodeId = `%${requestBody.nodeId}%`;
}
// if (requestBody.year && requestBody.period && requestBody.isNull === true) {
// condition += ` AND (kpiRole.year LIKE :year OR kpiRole.year IS NULL) AND (kpiRole.period LIKE :period OR kpiRole.period IS NULL)`;
// parameters.year = `%${requestBody.year}%`;
// parameters.period = `%${requestBody.period}%`;
// }
const [kpiRole, total] = await AppDataSource.getRepository(KpiRole)
.createQueryBuilder("kpiRole")
.leftJoinAndSelect("kpiRole.kpiPeriod", "kpiPeriod")
.andWhere(condition, parameters)
// .andWhere(
// requestBody.year && requestBody.period
// ? "kpiRole.year LIKE :year AND kpiRole.period LIKE :period"
// : "1=1",
// {
// year: `%${requestBody.year}%`,
// period: `%${requestBody.period}%`,
// },
// )
.andWhere(requestBody.year ? "kpiRole.year LIKE :year" : "1=1", {
year: `%${requestBody.year}%`,
})
.andWhere(requestBody.period ? "kpiRole.period LIKE :period" : "1=1", {
period: `%${requestBody.period}%`,
})
.andWhere(requestBody.position != undefined ? "kpiRole.position LIKE :position" : "1=1", {
position: `%${requestBody.position}%`,
})
.andWhere(
new Brackets((qb) => {
qb.orWhere("kpiRole.including LIKE :keyword", {
keyword: `%${requestBody.keyword}%`,
})
.orWhere("kpiRole.includingName LIKE :keyword", {
keyword: `%${requestBody.keyword}%`,
})
.orWhere("kpiRole.year LIKE :keyword", {
keyword: `%${requestBody.keyword}%`,
})
.orWhere("kpiRole.period LIKE :keyword", {
keyword: `%${requestBody.keyword}%`,
});
}),
)
.select([
"kpiRole.id",
"kpiPeriod.year",
"kpiPeriod.durationKPI",
"kpiRole.including",
"kpiRole.includingName",
"kpiRole.createdAt",
])
.orderBy("kpiRole.createdAt", "DESC")
.skip((requestBody.page - 1) * requestBody.pageSize)
.take(requestBody.pageSize)
.getManyAndCount();
return new HttpSuccess({ data: kpiRole, total });
}
/**
* API list ตัวชี้วัดตามตำแหน่ง
* @param page
* @param pageSize
* @param keyword
*/
@Post("search-kpi-role")
async searchKpiRole(
@Request() request: RequestWithUser,
@Body()
requestBody: {
page: number;
pageSize: number;
year?: string | null;
period?: string | null;
nodeId?: string | null;
node?: number | null;
position?: string | null;
keyword?: string | null;
isAll?: boolean | false;
},
) {
let _data = await new permission().PermissionList(request, "SYS_KPI_LIST");
let condition = "";
let parameters: any = {};
if (requestBody.isAll === false) {
switch (requestBody.node) {
case 0:
condition = "kpiRole.rootDnaId LIKE :nodeId AND kpiRole.child1DnaId IS NULL";
break;
case 1:
condition = "kpiRole.child1DnaId LIKE :nodeId AND kpiRole.child2DnaId IS NULL";
break;
case 2:
condition = "kpiRole.child2DnaId LIKE :nodeId AND kpiRole.child3DnaId IS NULL";
break;
case 3:
condition = "kpiRole.child3DnaId LIKE :nodeId AND kpiRole.child4DnaId IS NULL";
break;
case 4:
condition = "kpiRole.child4DnaId LIKE :nodeId";
break;
default:
condition = "1=1";
break;
}
parameters.nodeId = `%${requestBody.nodeId}%`;
} else {
switch (requestBody.node) {
case 0:
condition = "kpiRole.rootDnaId LIKE :nodeId";
break;
case 1:
condition = "kpiRole.child1DnaId LIKE :nodeId";
break;
case 2:
condition = "kpiRole.child2DnaId LIKE :nodeId";
break;
case 3:
condition = "kpiRole.child3DnaId LIKE :nodeId";
break;
case 4:
condition = "kpiRole.child4DnaId LIKE :nodeId";
break;
default:
condition = "1=1";
break;
}
parameters.nodeId = `%${requestBody.nodeId}%`;
}
const [kpiRole, total] = await AppDataSource.getRepository(KpiRole)
.createQueryBuilder("kpiRole")
.leftJoinAndSelect("kpiRole.kpiPeriod", "kpiPeriod")
.andWhere(condition, parameters)
.andWhere(requestBody.year ? "kpiRole.year LIKE :year" : "1=1", {
year: `%${requestBody.year}%`,
})
.andWhere(requestBody.period ? "kpiRole.period LIKE :period" : "1=1", {
period: `%${requestBody.period}%`,
})
.andWhere(requestBody.position != undefined ? "kpiRole.position LIKE :position" : "1=1", {
position: `%${requestBody.position}%`,
})
.andWhere(
new Brackets((qb) => {
qb.orWhere("kpiRole.including LIKE :keyword", {
keyword: `%${requestBody.keyword}%`,
})
.orWhere("kpiRole.includingName LIKE :keyword", {
keyword: `%${requestBody.keyword}%`,
})
.orWhere("kpiRole.year LIKE :keyword", {
keyword: `%${requestBody.keyword}%`,
})
.orWhere("kpiRole.period LIKE :keyword", {
keyword: `%${requestBody.keyword}%`,
});
}),
)
.select([
"kpiRole.id",
"kpiPeriod.year",
"kpiPeriod.durationKPI",
"kpiRole.including",
"kpiRole.includingName",
"kpiRole.createdAt",
])
.orderBy("kpiRole.createdAt", "DESC")
.skip((requestBody.page - 1) * requestBody.pageSize)
.take(requestBody.pageSize)
.getManyAndCount();
return new HttpSuccess({ data: kpiRole, total });
}
/**
* API list ตัวชี้วัดตามตำแหน่ง
* @param page
* @param pageSize
* @param keyword
*/
@Post("search-edit")
async listKpiRoleEdit(
@Request() request: RequestWithUser,
@Body()
requestBody: {
page: number;
pageSize: number;
year?: string | null;
period?: string | null;
nodeId?: string | null;
node?: number | null;
position?: string | null;
keyword?: string | null;
isAll?: boolean | false;
// isNull?: boolean | false;
sortBy?: string,
descending?: boolean,
},
) {
let _data = await new permission().PermissionList(request, "SYS_EVA_INDICATOR");
let condition = "";
let parameters: any = {};
if (requestBody.isAll === false) {
switch (requestBody.node) {
case 0:
condition = "kpiRole.rootDnaId LIKE :nodeId AND kpiRole.child1DnaId IS NULL";
break;
case 1:
condition = "kpiRole.child1DnaId LIKE :nodeId AND kpiRole.child2DnaId IS NULL";
break;
case 2:
condition = "kpiRole.child2DnaId LIKE :nodeId AND kpiRole.child3DnaId IS NULL";
break;
case 3:
condition = "kpiRole.child3DnaId LIKE :nodeId AND kpiRole.child4DnaId IS NULL";
break;
case 4:
condition = "kpiRole.child4DnaId LIKE :nodeId";
break;
default:
condition = "1=1";
break;
}
parameters.nodeId = `%${requestBody.nodeId}%`;
} else {
switch (requestBody.node) {
case 0:
condition = "kpiRole.rootDnaId LIKE :nodeId";
break;
case 1:
condition = "kpiRole.child1DnaId LIKE :nodeId";
break;
case 2:
condition = "kpiRole.child2DnaId LIKE :nodeId";
break;
case 3:
condition = "kpiRole.child3DnaId LIKE :nodeId";
break;
case 4:
condition = "kpiRole.child4DnaId LIKE :nodeId";
break;
default:
condition = "1=1";
break;
}
parameters.nodeId = `%${requestBody.nodeId}%`;
}
// if (requestBody.year && requestBody.period && requestBody.isNull === true) {
// condition += ` AND (kpiRole.year LIKE :year OR kpiRole.year IS NULL) AND (kpiRole.period LIKE :period OR kpiRole.period IS NULL)`;
// parameters.year = `%${requestBody.year}%`;
// parameters.period = `%${requestBody.period}%`;
// }
let query = await AppDataSource.getRepository(KpiRole)
.createQueryBuilder("kpiRole")
.leftJoinAndSelect("kpiRole.kpiPeriod", "kpiPeriod")
.andWhere(condition, parameters)
// .andWhere(
// requestBody.year && requestBody.period
// ? "kpiRole.year LIKE :year AND kpiRole.period LIKE :period"
// : "1=1",
// {
// year: `%${requestBody.year}%`,
// period: `%${requestBody.period}%`,
// },
// )
.andWhere(requestBody.year ? "kpiRole.year LIKE :year" : "1=1", {
year: `%${requestBody.year}%`,
})
.andWhere(requestBody.period ? "kpiRole.period LIKE :period" : "1=1", {
period: `%${requestBody.period}%`,
})
.andWhere(requestBody.position != undefined ? "kpiRole.position LIKE :position" : "1=1", {
position: `%${requestBody.position}%`,
})
.andWhere(
new Brackets((qb) => {
qb.orWhere("kpiRole.including LIKE :keyword", {
keyword: `%${requestBody.keyword}%`,
})
.orWhere("kpiRole.includingName LIKE :keyword", {
keyword: `%${requestBody.keyword}%`,
})
.orWhere("kpiRole.year LIKE :keyword", {
keyword: `%${requestBody.keyword}%`,
})
.orWhere("kpiRole.period LIKE :keyword", {
keyword: `%${requestBody.keyword}%`,
});
}),
)
.select([
"kpiRole.id",
"kpiPeriod.year",
"kpiPeriod.durationKPI",
"kpiRole.including",
"kpiRole.includingName",
"kpiRole.createdAt",
])
.orderBy("kpiRole.createdAt", "DESC")
if (requestBody.sortBy) {
query = query.orderBy(
`kpiRole.${requestBody.sortBy}`,
requestBody.descending ? "DESC" : "ASC"
);
}
const [kpiRole, total] = await query
.skip((requestBody.page - 1) * requestBody.pageSize)
.take(requestBody.pageSize)
.getManyAndCount();
return new HttpSuccess({ data: kpiRole, total });
}
/**
* API ลบตัวชี้วัดตามตำแหน่ง
* @param id
*/
@Delete("{id}")
async deleteKpiRole(@Path() id: string, @Request() request: RequestWithUser) {
await new permission().PermissionDelete(request, "SYS_EVA_INDICATOR");
const kpiRole = await this.kpiRoleRepository.findOne({
where: { id: id },
});
if (!kpiRole) {
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลตัวชี้วัดตามตำแหน่งนี้");
}
let type = 0;
if (kpiRole.child1Id != null) {
type = 1;
} else if (kpiRole.child2Id != null) {
type = 2;
} else if (kpiRole.child3Id != null) {
type = 3;
} else if (kpiRole.child4Id != null) {
type = 4;
}
await this.kpiRoleHistoryRepository.delete({ kpiRoleId: id });
await this.kpiRoleRepository.remove(kpiRole, { data: request });
if (kpiRole) {
let remainingKpiRoles: any;
if (type == 0) {
remainingKpiRoles = await this.kpiRoleRepository.find({
where: {
rootId: kpiRole.rootId,
child1Id: IsNull(),
position: Like(`%${kpiRole.position}%`),
},
order: {
including: "ASC",
},
});
} else if (type == 1) {
remainingKpiRoles = await this.kpiRoleRepository.find({
where: {
child1Id: kpiRole.child1Id,
child2Id: IsNull(),
position: Like(`%${kpiRole.position}%`),
},
order: {
including: "ASC",
},
});
} else if (type == 2) {
remainingKpiRoles = await this.kpiRoleRepository.find({
where: {
child2Id: kpiRole.child2Id,
child3Id: IsNull(),
position: Like(`%${kpiRole.position}%`),
},
order: {
including: "ASC",
},
});
} else if (type == 3) {
remainingKpiRoles = await this.kpiRoleRepository.find({
where: {
child3Id: kpiRole.child3Id,
child4Id: IsNull(),
position: Like(`%${kpiRole.position}%`),
},
order: {
including: "ASC",
},
});
} else if (type == 4) {
remainingKpiRoles = await this.kpiRoleRepository.find({
where: {
child4Id: kpiRole.child4Id,
position: Like(`%${kpiRole.position}%`),
},
order: {
including: "ASC",
},
});
}
remainingKpiRoles.forEach((kpiRole: any, index: any) => {
kpiRole.including = index + 1;
});
remainingKpiRoles.lastUpdateUserId = request.user.sub;
remainingKpiRoles.lastUpdateFullName = request.user.name;
remainingKpiRoles.lastUpdatedAt = new Date();
await this.kpiRoleRepository.save(remainingKpiRoles, { data: request });
}
return new HttpSuccess();
}
/**
* API ประวัดิตัวชี้วัดตามตำแหน่ง
* @param id Guid, *Id ประวัดิตัวชี้วัดตามตำแหน่ง
*/
@Get("history/{id}")
async GetHistory(@Request() request: RequestWithUser, @Path() id: string) {
let _data = await new permission().PermissionList(request, "SYS_EVA_INDICATOR");
const kpiRoleHistory = await this.kpiRoleHistoryRepository.find({
where: { kpiRoleId: id },
order: {
createdAt: "ASC",
},
});
if (!kpiRoleHistory) {
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลประวัดิตัวชี้วัดตามตำแหน่งนี้");
}
return new HttpSuccess(kpiRoleHistory);
}
}