hrms-api-org/src/controllers/ReportController.ts

391 lines
17 KiB
TypeScript
Raw Normal View History

import {
Controller,
Get,
Post,
Put,
Delete,
Patch,
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 HttpStatusCode from "../interfaces/http-status";
import { PosExecutive } from "../entities/PosExecutive";
import { PosType } from "../entities/PosType";
import { PosLevel } from "../entities/PosLevel";
import { CreatePosDict, PosDict } from "../entities/PosDict";
import HttpError from "../interfaces/http-error";
import { Equal, ILike, In, IsNull, Like, Not } from "typeorm";
import { CreatePosMaster, PosMaster } from "../entities/PosMaster";
import { OrgRevision } from "../entities/OrgRevision";
import { OrgRoot } from "../entities/OrgRoot";
import { OrgChild1 } from "../entities/OrgChild1";
import { OrgChild2 } from "../entities/OrgChild2";
import { OrgChild3 } from "../entities/OrgChild3";
import { OrgChild4 } from "../entities/OrgChild4";
import { Position } from "../entities/Position";
import { Brackets } from "typeorm/browser";
@Route("api/v1/org/report")
2024-02-03 13:09:44 +07:00
// @Tags("Position")
// @Security("bearerAuth")
@Response(
HttpStatusCode.INTERNAL_SERVER_ERROR,
"เกิดข้อผิดพลาด ไม่สามารถแสดงรายการได้ กรุณาลองใหม่ในภายหลัง",
)
@SuccessResponse(HttpStatusCode.OK, "สำเร็จ")
export class ReportController extends Controller {
private posExecutiveRepository = AppDataSource.getRepository(PosExecutive);
private posTypeRepository = AppDataSource.getRepository(PosType);
private posLevelRepository = AppDataSource.getRepository(PosLevel);
private posDictRepository = AppDataSource.getRepository(PosDict);
private posMasterRepository = AppDataSource.getRepository(PosMaster);
private positionRepository = AppDataSource.getRepository(Position);
private orgRevisionRepository = AppDataSource.getRepository(OrgRevision);
private orgRootRepository = AppDataSource.getRepository(OrgRoot);
private child1Repository = AppDataSource.getRepository(OrgChild1);
private child2Repository = AppDataSource.getRepository(OrgChild2);
private child3Repository = AppDataSource.getRepository(OrgChild3);
private child4Repository = AppDataSource.getRepository(OrgChild4);
/**
* API
*
* @summary ORG_029 - (ADMIN) #32
*
*/
@Get("position")
async findPosition() {
try {
2024-02-03 13:09:44 +07:00
const orgRevision = await this.orgRevisionRepository.findOne({
where: { orgRevisionIsDraft: true, orgRevisionIsCurrent: false },
relations: ["orgRoots"],
});
if (!orgRevision) {
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล");
}
2024-02-07 11:08:55 +07:00
const orgRootData = await this.orgRootRepository.find({
where: {
orgRevisionId: orgRevision.id,
},
order: { orgRootOrder: "ASC" },
relations: [
"posMasters",
"posMasters.next_holder",
2024-02-07 12:43:49 +07:00
"posMasters.next_holder.posLevel",
"posMasters.next_holder.posType",
"posMasters.next_holder.current_holders",
"posMasters.next_holder.current_holders.positions",
2024-02-07 11:08:55 +07:00
"posMasters.positions",
"posMasters.positions.posLevel",
"posMasters.positions.posType",
2024-02-07 18:53:15 +07:00
"posMasters.positions.posExecutive",
2024-02-07 11:08:55 +07:00
],
});
2024-02-03 13:09:44 +07:00
const orgRootIds = orgRootData.map((orgRoot) => orgRoot.id) || null;
const orgChild1Data =
orgRootIds && orgRootIds.length > 0
? await AppDataSource.getRepository(OrgChild1)
.createQueryBuilder("orgChild1")
.where("orgChild1.orgRootId IN (:...ids)", { ids: orgRootIds })
.select([
"orgChild1.id",
"orgChild1.orgChild1Name",
"orgChild1.orgChild1ShortName",
"orgChild1.orgRootId",
"orgChild1.orgChild1Order",
])
.orderBy("orgChild1.orgChild1Order", "ASC")
.getMany()
: [];
const orgChild1Ids = orgChild1Data.map((orgChild1) => orgChild1.id) || null;
const orgChild2Data =
orgChild1Ids && orgChild1Ids.length > 0
? await AppDataSource.getRepository(OrgChild2)
.createQueryBuilder("orgChild2")
.where("orgChild2.orgChild1Id IN (:...ids)", { ids: orgChild1Ids })
.select([
"orgChild2.id",
"orgChild2.orgChild2Name",
"orgChild2.orgChild2ShortName",
"orgChild2.orgChild1Id",
"orgChild2.orgChild2Order",
])
.orderBy("orgChild2.orgChild2Order", "ASC")
.getMany()
: [];
const orgChild2Ids = orgChild2Data.map((orgChild2) => orgChild2.id) || null;
const orgChild3Data =
orgChild2Ids && orgChild2Ids.length > 0
? await AppDataSource.getRepository(OrgChild3)
.createQueryBuilder("orgChild3")
.where("orgChild3.orgChild2Id IN (:...ids)", { ids: orgChild2Ids })
.select([
"orgChild3.id",
"orgChild3.orgChild3Name",
"orgChild3.orgChild3ShortName",
"orgChild3.orgChild2Id",
"orgChild3.orgChild3Order",
])
.orderBy("orgChild3.orgChild3Order", "ASC")
.getMany()
: [];
const orgChild3Ids = orgChild3Data.map((orgChild3) => orgChild3.id) || null;
const orgChild4Data =
orgChild3Ids && orgChild3Ids.length > 0
? await AppDataSource.getRepository(OrgChild4)
.createQueryBuilder("orgChild4")
.where("orgChild4.orgChild3Id IN (:...ids)", { ids: orgChild3Ids })
.select([
"orgChild4.id",
"orgChild4.orgChild4Name",
"orgChild4.orgChild4ShortName",
"orgChild4.orgChild3Id",
"orgChild4.orgChild4Order",
])
.orderBy("orgChild4.orgChild4Order", "ASC")
.getMany()
: [];
const posMasters = await this.posMasterRepository.find({
where: {
orgRevisionId: orgRevision.id,
},
relations: ["next_holder", "current_holder"],
order: { posMasterOrder: "ASC" },
});
2024-02-03 13:09:44 +07:00
const positions = await this.positionRepository.find({
where: {
posMasterId: In(posMasters.map((posMaster: any) => posMaster.id)),
},
relations: ["posLevel", "posType", "posExecutive"],
});
2024-02-06 11:30:21 +07:00
let orgRevisionActive: any = await this.orgRevisionRepository.findOne({
where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false },
2024-02-07 14:01:39 +07:00
relations: [
"posMasters",
"posMasters.positions",
"posMasters.positions.posLevel",
"posMasters.positions.posType",
2024-02-07 18:53:15 +07:00
"posMasters.positions.posExecutive",
2024-02-07 14:01:39 +07:00
],
2024-02-06 11:30:21 +07:00
});
if (orgRevisionActive == null) {
const _orgRevisionActive = await this.orgRevisionRepository.find({
order: { orgRevisionCreatedAt: "DESC" },
skip: 1,
2024-02-07 14:01:39 +07:00
relations: [
"posMasters",
"posMasters.positions",
"posMasters.positions.posLevel",
"posMasters.positions.posType",
2024-02-07 18:53:15 +07:00
"posMasters.positions.posExecutive",
2024-02-07 14:01:39 +07:00
],
2024-02-06 11:30:21 +07:00
});
if (_orgRevisionActive.length > 0) orgRevisionActive = _orgRevisionActive[0];
}
2024-02-03 13:09:44 +07:00
2024-02-07 12:43:49 +07:00
// const posMasterOlds = await this.posMasterRepository.find({
// where: {
// orgRevisionId: orgRevisionActive.id,
// },
// relations: ["next_holder", "current_holder"],
// });
// const positionOlds = await this.positionRepository.find({
// where: {
// posMasterId: In(posMasterOlds.map((posMaster: any) => posMaster.id)),
// },
// relations: ["posLevel", "posType", "posExecutive"],
// });
2024-02-03 13:09:44 +07:00
let data = new Array();
2024-02-07 11:08:55 +07:00
for (let orgRoot of orgRootData) {
const node = {
orgRootName: orgRoot.orgRootName,
orgTreeName: orgRoot.orgRootName,
orgTreeShortName: orgRoot.orgRootShortName,
posMasters: await Promise.all(
2024-02-07 14:01:39 +07:00
orgRoot.posMasters
.sort((a, b) => a.posMasterOrder - b.posMasterOrder)
.map(async (posMaster) => {
const positionName = [...new Set(posMaster.positions.map((x) => x.positionName))];
const posType = [...new Set(posMaster.positions.map((x) => x.posType.posTypeName))];
const posLevel = [
...new Set(posMaster.positions.map((x) => x.posLevel.posLevelName)),
];
2024-02-07 18:53:15 +07:00
const posExecutive = [
...new Set(posMaster.positions.map((x) => x.posExecutive.posExecutiveName)),
];
2024-02-07 14:01:39 +07:00
const positionField = [...new Set(posMaster.positions.map((x) => x.positionField))];
let positionMasterProfileOld: any = null;
if (posMaster.next_holder != null) {
positionMasterProfileOld = posMaster.next_holder.current_holders.find(
(x) => x.orgRevisionId == orgRevisionActive.id,
);
}
let positionMasterOld: any = null;
let profilePositionName: any = [];
let profilePosType: any = [];
let profilePosLevel: any = [];
2024-02-07 18:53:15 +07:00
let profilePosExecutive: any = [];
2024-02-07 14:01:39 +07:00
let profilePositionField: any = [];
if (posMaster.ancestorDNA != null) {
positionMasterOld = orgRevisionActive.posMasters.find(
(x: any) =>
x.orgRevisionId == orgRevisionActive.id &&
x.ancestorDNA == posMaster.ancestorDNA,
);
profilePositionName = [
...new Set(positionMasterOld.positions.map((x: any) => x.positionName)),
];
profilePosType = [
...new Set(positionMasterOld.positions.map((x: any) => x.posType.posTypeName)),
];
profilePosLevel = [
...new Set(
positionMasterOld.positions.map((x: any) => x.posLevel.posLevelName),
),
];
2024-02-07 18:53:15 +07:00
profilePosExecutive = [
...new Set(
positionMasterOld.positions.map((x: any) => x.posExecutive.posExecutiveName),
),
];
2024-02-07 14:01:39 +07:00
profilePositionField = [
...new Set(positionMasterOld.positions.map((x: any) => x.positionField)),
];
}
return {
posMasterOrder: posMaster.posMasterOrder,
posMasterNoPrefix: posMaster.posMasterNoPrefix,
posMasterNo: posMaster.posMasterNo,
posMasterNoSuffix: posMaster.posMasterNoSuffix,
2024-02-07 18:53:15 +07:00
// positionName:
// posMaster.next_holder == null
// ? positionName.join(" หรือ ")
// : posMaster.positionIsSelected == false
// ? posMaster.positions.find((x: any) => (x.positionIsSelected = true))
// ?.positionName
// : posMaster.next_holder.position,
// posType:
// posMaster.next_holder == null
// ? posType.join(" หรือ ")
// : posMaster.positionIsSelected == false
// ? posMaster.positions.find((x: any) => (x.positionIsSelected = true))
// ?.posType?.posTypeName
// : posMaster.next_holder.posType == null
// ? "-"
// : posMaster.next_holder.posType.posTypeName,
// posLevel:
// posMaster.next_holder == null
// ? posLevel.join(" หรือ ")
// : posMaster.positionIsSelected == false
// ? posMaster.positions.find((x: any) => (x.positionIsSelected = true))
// ?.posLevel?.posLevelName
// : posMaster.next_holder.posLevel == null
// ? "-"
// : posMaster.next_holder.posLevel.posLevelName,
// posExecutive:
// posMaster.next_holder == null
// ? posExecutive.join(" หรือ ")
// : posMaster.positionIsSelected == false
// ? posMaster.positions.find((x: any) => (x.positionIsSelected = true))
// ?.posExecutive?.posExecutiveName
// : positionMasterProfileOld == null
// ? "-"
// : positionMasterProfileOld.positions.find(
// (x: any) => (x.positionIsSelected = true),
// )?.posExecutive?.posExecutiveName,
2024-02-07 14:01:39 +07:00
profileFullname:
posMaster.next_holder == null
? "- ว่าง -"
: `${posMaster.next_holder.prefix}${posMaster.next_holder.firstName} ${posMaster.next_holder.lastName}`,
profilePosMasterNo:
2024-02-07 18:53:15 +07:00
posMaster.next_holder == null
2024-02-07 14:01:39 +07:00
? positionMasterOld == null
? "-"
: positionMasterOld.posMasterNo
2024-02-07 18:53:15 +07:00
: positionMasterProfileOld == null
? "-"
: positionMasterProfileOld.posMasterNo,
2024-02-07 14:01:39 +07:00
profilePositionName:
posMaster.next_holder == null
2024-02-07 18:53:15 +07:00
? positionMasterOld == null
? positionName.join(" หรือ ")
: profilePositionName.join(" หรือ ")
2024-02-07 14:01:39 +07:00
: posMaster.next_holder.position,
profilePosType:
posMaster.next_holder == null
2024-02-07 18:53:15 +07:00
? positionMasterOld == null
? posType.join(" หรือ ")
: profilePosType.join(" หรือ ")
2024-02-07 14:01:39 +07:00
: posMaster.next_holder.posType == null
? "-"
: posMaster.next_holder.posType.posTypeName,
profilePosLevel:
posMaster.next_holder == null
2024-02-07 18:53:15 +07:00
? positionMasterOld == null
? posLevel.join(" หรือ ")
: profilePosLevel.join(" หรือ ")
2024-02-07 14:01:39 +07:00
: posMaster.next_holder.posLevel == null
? "-"
: posMaster.next_holder.posLevel.posLevelName,
2024-02-07 18:53:15 +07:00
profilePosExecutive:
2024-02-07 14:01:39 +07:00
posMaster.next_holder == null
2024-02-07 18:53:15 +07:00
? positionMasterOld == null
? posExecutive.join(" หรือ ")
: profilePosExecutive.join(" หรือ ")
2024-02-07 14:01:39 +07:00
: positionMasterProfileOld == null
? "-"
: positionMasterProfileOld.positions.find(
(x: any) => (x.positionIsSelected = true),
2024-02-07 18:53:15 +07:00
)?.posExecutive?.posExecutiveName,
2024-02-07 12:43:49 +07:00
2024-02-07 14:01:39 +07:00
// positions: await Promise.all(
// positions
// .filter((position) => position.posMasterId === posMaster.id)
// .map(async (position) => {
// return {
// positionName: position.positionName,
// positionField: position.positionField,
// posType: position.posType == null ? null : position.posType.posTypeName,
// posLevel:
// position.posLevel == null ? null : position.posLevel.posLevelName,
// posExecutive:
// position.posExecutive == null
// ? null
// : position.posExecutive.posExecutiveName,
// };
// }),
// ),
};
}),
2024-02-07 11:08:55 +07:00
),
};
data.push(node);
}
2024-02-03 13:09:44 +07:00
return new HttpSuccess(data);
} catch (error) {
return error;
}
}
}