fix + test retirement #1903, #1904, #1892

This commit is contained in:
harid 2025-10-30 18:56:03 +07:00
parent 8a96794e53
commit 0c523a55a4
4 changed files with 115 additions and 134 deletions

View file

@ -68,7 +68,7 @@ async function main() {
// const cronTime_Oct = "0 0 1 10 *"; // const cronTime_Oct = "0 0 1 10 *";
// Test #1892 // Test #1892
const cronTime_Oct = "0 0 30 10 *"; const cronTime_Oct = "0 0 31 10 *";
cron.schedule(cronTime_Oct, async () => { cron.schedule(cronTime_Oct, async () => {
try { try {
const commandController = new CommandController(); const commandController = new CommandController();

View file

@ -62,6 +62,7 @@ import {
getUserByUsername, getUserByUsername,
getRoleMappings, getRoleMappings,
removeUserRoles, removeUserRoles,
getToken,
} from "../keycloak"; } from "../keycloak";
import { ProfileEducation, CreateProfileEducation } from "../entities/ProfileEducation"; import { ProfileEducation, CreateProfileEducation } from "../entities/ProfileEducation";
import { ProfileEducationHistory } from "../entities/ProfileEducationHistory"; import { ProfileEducationHistory } from "../entities/ProfileEducationHistory";
@ -1476,24 +1477,25 @@ export class CommandController extends Controller {
} }
// @Get("XXX") // @Get("XXX")
async cronjobUpdateRetirementStatus(/*@Request() request: RequestWithUser*/) { async cronjobUpdateRetirementStatus(/*@Request() request: RequestWithUser*/) {
let body = { // let body = {
client_id: "gettoken", // client_id: "gettoken",
client_secret: process.env.AUTH_ACCOUNT_SECRET, // client_secret: process.env.AUTH_ACCOUNT_SECRET,
grant_type: "client_credentials", // grant_type: "client_credentials",
}; // };
const postData = querystring.stringify(body); // const postData = querystring.stringify(body);
const response = await axios.post( // const response = await axios.post(
`${process.env.KC_URL}/realms/${process.env.KC_REALMS}/protocol/openid-connect/token`, // `${process.env.KC_URL}/realms/${process.env.KC_REALMS}/protocol/openid-connect/token`,
postData, // postData,
{ // {
headers: { // headers: {
"Content-Type": "application/x-www-form-urlencoded", // "Content-Type": "application/x-www-form-urlencoded",
api_key: process.env.API_KEY, // api_key: process.env.API_KEY,
}, // },
}, // },
); // );
const adminToken = response.data.access_token; // const adminToken = response.data.access_token;
// const adminToken = request.headers["authorization"]?.replace("Bearer ", ""); // const adminToken = request.headers["authorization"]?.replace("Bearer ", "");
const adminToken = await getToken() ?? "";
const today = new Date(); const today = new Date();
today.setUTCHours(0, 0, 0, 0); today.setUTCHours(0, 0, 0, 0);
let type: string = "OFFICER"; let type: string = "OFFICER";

View file

@ -9773,9 +9773,13 @@ export class ProfileController extends Controller {
keyword?: string; keyword?: string;
}, },
) { ) {
let conditionFullName = const orgRevisionActive = await this.orgRevisionRepo.findOne({
"CONCAT(profile.prefix, profile.firstName, ' ', profile.lastName) LIKE :keyword"; where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false },
const [findProfile, total] = await AppDataSource.getRepository(Profile) });
if (!orgRevisionActive) {
throw new HttpError(HttpStatus.NOT_FOUND, "not found. OrgRevision");
}
let query = AppDataSource.getRepository(Profile)
.createQueryBuilder("profile") .createQueryBuilder("profile")
.leftJoinAndSelect("profile.posLevel", "posLevel") .leftJoinAndSelect("profile.posLevel", "posLevel")
.leftJoinAndSelect("profile.posType", "posType") .leftJoinAndSelect("profile.posType", "posType")
@ -9788,103 +9792,83 @@ export class ProfileController extends Controller {
.leftJoinAndSelect("current_holders.orgChild4", "orgChild4") .leftJoinAndSelect("current_holders.orgChild4", "orgChild4")
.leftJoinAndSelect("current_holders.positions", "positions") .leftJoinAndSelect("current_holders.positions", "positions")
.leftJoinAndSelect("positions.posExecutive", "posExecutive") .leftJoinAndSelect("positions.posExecutive", "posExecutive")
.where(`profile.position LIKE :keyword`, { .andWhere(
keyword: `%${body.keyword}%`, new Brackets(qb => {
}) qb.where("profile.position LIKE :keyword", { keyword: `%${body.keyword}%` })
.orWhere(`profile.prefix LIKE :keyword`, { .orWhere("posLevel.posLevelName LIKE :keyword", { keyword: `%${body.keyword}%` })
keyword: `%${body.keyword}%`, .orWhere("posType.posTypeName LIKE :keyword", { keyword: `%${body.keyword}%` })
}) .orWhere("CONCAT(profile.prefix, profile.firstName, ' ', profile.lastName) LIKE :keyword", { keyword: `%${body.keyword}%` });
.orWhere(`profile.firstName LIKE :keyword`, { })
keyword: `%${body.keyword}%`, )
})
.orWhere(`profile.lastName LIKE :keyword`, {
keyword: `%${body.keyword}%`,
})
.orWhere(`posLevel.posLevelName LIKE :keyword`, {
keyword: `%${body.keyword}%`,
})
.orWhere(`posType.posTypeName LIKE :keyword`, {
keyword: `%${body.keyword}%`,
})
.orWhere(conditionFullName, {
keyword: `%${body.keyword}%`,
})
.andWhere("profile.isLeave = false") .andWhere("profile.isLeave = false")
.orderBy("profile.citizenId", "ASC") .andWhere("current_holders.orgRevisionId = :orgRevisionId", { orgRevisionId: orgRevisionActive.id });
.skip((body.page - 1) * body.pageSize)
.take(body.pageSize)
.getManyAndCount();
const orgRevisionActive = await this.orgRevisionRepo.findOne({ const [findProfile, total] = await query
where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false }, .orderBy("profile.citizenId", "ASC")
}); .skip((body.page - 1) * body.pageSize)
const findRevision = await this.orgRevisionRepo.findOne({ .take(body.pageSize)
where: { orgRevisionIsCurrent: true }, .getManyAndCount();
});
if (!findRevision) {
throw new HttpError(HttpStatus.NOT_FOUND, "not found. OrgRevision");
}
const mapDataProfile = await Promise.all( const mapDataProfile = await Promise.all(
findProfile.map(async (item: Profile) => { findProfile.map(async (item: Profile) => {
const posMaster = const posMaster =
item.current_holders == null || item.current_holders == null ||
item.current_holders.length == 0 || item.current_holders.length == 0 ||
item.current_holders.find((x) => x.orgRevisionId == findRevision.id) == null item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) == null
? null ? null
: item.current_holders.find((x) => x.orgRevisionId == findRevision.id); : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id);
const position = const position =
posMaster == null || posMaster == null ||
item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.positions == null || item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.positions == null ||
item.current_holders?.find((x) => x.orgRevisionId == findRevision.id)?.positions.length == item.current_holders?.find((x) => x.orgRevisionId == orgRevisionActive.id)?.positions.length ==
0 || 0 ||
item.current_holders item.current_holders
.find((x) => x.orgRevisionId == findRevision.id) .find((x) => x.orgRevisionId == orgRevisionActive.id)
?.positions?.find((position) => position.positionIsSelected == true) == null ?.positions?.find((position) => position.positionIsSelected == true) == null
? null ? null
: item.current_holders : item.current_holders
.find((x) => x.orgRevisionId == findRevision.id) .find((x) => x.orgRevisionId == orgRevisionActive.id)
?.positions?.find((position) => position.positionIsSelected == true); ?.positions?.find((position) => position.positionIsSelected == true);
const posExecutive = const posExecutive =
position == null || position == null ||
item.current_holders item.current_holders
.find((x) => x.orgRevisionId == findRevision.id) .find((x) => x.orgRevisionId == orgRevisionActive.id)
?.positions?.find((position) => position.positionIsSelected == true)?.posExecutive == ?.positions?.find((position) => position.positionIsSelected == true)?.posExecutive ==
null || null ||
item.current_holders item.current_holders
.find((x) => x.orgRevisionId == findRevision.id) .find((x) => x.orgRevisionId == orgRevisionActive.id)
?.positions?.find((position) => position.positionIsSelected == true)?.posExecutive ?.positions?.find((position) => position.positionIsSelected == true)?.posExecutive
?.posExecutiveName == null ?.posExecutiveName == null
? null ? null
: item.current_holders : item.current_holders
.find((x) => x.orgRevisionId == findRevision.id) .find((x) => x.orgRevisionId == orgRevisionActive.id)
?.positions?.find((position) => position.positionIsSelected == true)?.posExecutive ?.positions?.find((position) => position.positionIsSelected == true)?.posExecutive
.posExecutiveName; .posExecutiveName;
const shortName = const shortName =
item.current_holders.length == 0 item.current_holders.length == 0
? null ? null
: item.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null && : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) != null &&
item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild4 != item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild4 !=
null null
? `${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild4.orgChild4ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` ? `${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild4.orgChild4ShortName} ${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.posMasterNo}`
: item.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null && : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) != null &&
item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild3 != item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild3 !=
null null
? `${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild3.orgChild3ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` ? `${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild3.orgChild3ShortName} ${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.posMasterNo}`
: item.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null && : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) != null &&
item.current_holders.find((x) => x.orgRevisionId == findRevision.id) item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)
?.orgChild2 != null ?.orgChild2 != null
? `${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild2.orgChild2ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` ? `${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild2.orgChild2ShortName} ${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.posMasterNo}`
: item.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null && : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) != null &&
item.current_holders.find((x) => x.orgRevisionId == findRevision.id) item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)
?.orgChild1 != null ?.orgChild1 != null
? `${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild1.orgChild1ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` ? `${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild1.orgChild1ShortName} ${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.posMasterNo}`
: item.current_holders.find((x) => x.orgRevisionId == findRevision.id) != : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) !=
null && null &&
item.current_holders.find((x) => x.orgRevisionId == findRevision.id) item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)
?.orgRoot != null ?.orgRoot != null
? `${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgRoot.orgRootShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` ? `${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgRoot.orgRootShortName} ${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.posMasterNo}`
: null; : null;
return { return {

View file

@ -4419,11 +4419,16 @@ export class ProfileEmployeeController extends Controller {
page: number; page: number;
pageSize: number; pageSize: number;
keyword?: string; keyword?: string;
type?: string;
}, },
) { ) {
let conditionFullName = const orgRevisionActive = await this.orgRevisionRepo.findOne({
"CONCAT(profileEmployee.prefix, profileEmployee.firstName, ' ', profileEmployee.lastName) LIKE :keyword"; where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false },
const [findProfile, total] = await AppDataSource.getRepository(ProfileEmployee) });
if (!orgRevisionActive) {
throw new HttpError(HttpStatus.NOT_FOUND, "not found. OrgRevision");
}
let query = AppDataSource.getRepository(ProfileEmployee)
.createQueryBuilder("profileEmployee") .createQueryBuilder("profileEmployee")
.leftJoinAndSelect("profileEmployee.posLevel", "posLevel") .leftJoinAndSelect("profileEmployee.posLevel", "posLevel")
.leftJoinAndSelect("profileEmployee.posType", "posType") .leftJoinAndSelect("profileEmployee.posType", "posType")
@ -4435,88 +4440,78 @@ export class ProfileEmployeeController extends Controller {
.leftJoinAndSelect("current_holders.orgChild3", "orgChild3") .leftJoinAndSelect("current_holders.orgChild3", "orgChild3")
.leftJoinAndSelect("current_holders.orgChild4", "orgChild4") .leftJoinAndSelect("current_holders.orgChild4", "orgChild4")
.leftJoinAndSelect("current_holders.positions", "positions") .leftJoinAndSelect("current_holders.positions", "positions")
.where(`profileEmployee.position LIKE :keyword`, { .andWhere(
keyword: `%${body.keyword}%`, new Brackets(qb => {
}) qb.where("profileEmployee.position LIKE :keyword", { keyword: `%${body.keyword}%` })
.orWhere(`profileEmployee.prefix LIKE :keyword`, { .orWhere("posLevel.posLevelName LIKE :keyword", { keyword: `%${body.keyword}%` })
keyword: `%${body.keyword}%`, .orWhere("posType.posTypeName LIKE :keyword", { keyword: `%${body.keyword}%` })
}) .orWhere("CONCAT(profileEmployee.prefix, profileEmployee.firstName, ' ', profileEmployee.lastName) LIKE :keyword", { keyword: `%${body.keyword}%` });
.orWhere(`profileEmployee.firstName LIKE :keyword`, { })
keyword: `%${body.keyword}%`, )
})
.orWhere(`profileEmployee.lastName LIKE :keyword`, {
keyword: `%${body.keyword}%`,
})
.orWhere(`posLevel.posLevelName LIKE :keyword`, {
keyword: `%${body.keyword}%`,
})
.orWhere(`posType.posTypeName LIKE :keyword`, {
keyword: `%${body.keyword}%`,
})
.orWhere(conditionFullName, {
keyword: `%${body.keyword}%`,
})
.andWhere("profileEmployee.isLeave = false") .andWhere("profileEmployee.isLeave = false")
.andWhere("current_holders.orgRevisionId = :orgRevisionId", { orgRevisionId: orgRevisionActive.id });
if (body.type) {
const typeUpper = body.type.trim().toUpperCase();
if (typeUpper === "EMPLOYEE") {
query = query.andWhere("profileEmployee.employeeClass = 'PERM'");
}
else if (typeUpper === "TEMP"){
query = query.andWhere("profileEmployee.employeeClass = 'TEMP'");
}
}
const [findProfile, total] = await query
.orderBy("profileEmployee.citizenId", "ASC") .orderBy("profileEmployee.citizenId", "ASC")
.skip((body.page - 1) * body.pageSize) .skip((body.page - 1) * body.pageSize)
.take(body.pageSize) .take(body.pageSize)
.getManyAndCount(); .getManyAndCount();
const orgRevisionActive = await this.orgRevisionRepo.findOne({
where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false },
});
const findRevision = await this.orgRevisionRepo.findOne({
where: { orgRevisionIsCurrent: true },
});
if (!findRevision) {
throw new HttpError(HttpStatus.NOT_FOUND, "not found. OrgRevision");
}
const mapDataProfile = await Promise.all( const mapDataProfile = await Promise.all(
findProfile.map(async (item: ProfileEmployee) => { findProfile.map(async (item: ProfileEmployee) => {
const posMaster = const posMaster =
item.current_holders == null || item.current_holders == null ||
item.current_holders.length == 0 || item.current_holders.length == 0 ||
item.current_holders.find((x) => x.orgRevisionId == findRevision.id) == null item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) == null
? null ? null
: item.current_holders.find((x) => x.orgRevisionId == findRevision.id); : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id);
const position = const position =
posMaster == null || posMaster == null ||
item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.positions == null || item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.positions == null ||
item.current_holders?.find((x) => x.orgRevisionId == findRevision.id)?.positions.length == item.current_holders?.find((x) => x.orgRevisionId == orgRevisionActive.id)?.positions.length ==
0 || 0 ||
item.current_holders item.current_holders
.find((x) => x.orgRevisionId == findRevision.id) .find((x) => x.orgRevisionId == orgRevisionActive.id)
?.positions?.find((position) => position.positionIsSelected == true) == null ?.positions?.find((position) => position.positionIsSelected == true) == null
? null ? null
: item.current_holders : item.current_holders
.find((x) => x.orgRevisionId == findRevision.id) .find((x) => x.orgRevisionId == orgRevisionActive.id)
?.positions?.find((position) => position.positionIsSelected == true); ?.positions?.find((position) => position.positionIsSelected == true);
const shortName = const shortName =
item.current_holders.length == 0 item.current_holders.length == 0
? null ? null
: item.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null && : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) != null &&
item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild4 != item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild4 !=
null null
? `${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild4.orgChild4ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` ? `${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild4.orgChild4ShortName} ${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.posMasterNo}`
: item.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null && : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) != null &&
item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild3 != item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild3 !=
null null
? `${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild3.orgChild3ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` ? `${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild3.orgChild3ShortName} ${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.posMasterNo}`
: item.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null && : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) != null &&
item.current_holders.find((x) => x.orgRevisionId == findRevision.id) item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)
?.orgChild2 != null ?.orgChild2 != null
? `${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild2.orgChild2ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` ? `${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild2.orgChild2ShortName} ${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.posMasterNo}`
: item.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null && : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) != null &&
item.current_holders.find((x) => x.orgRevisionId == findRevision.id) item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)
?.orgChild1 != null ?.orgChild1 != null
? `${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild1.orgChild1ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` ? `${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild1.orgChild1ShortName} ${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.posMasterNo}`
: item.current_holders.find((x) => x.orgRevisionId == findRevision.id) != : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) !=
null && null &&
item.current_holders.find((x) => x.orgRevisionId == findRevision.id) item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)
?.orgRoot != null ?.orgRoot != null
? `${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgRoot.orgRootShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` ? `${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgRoot.orgRootShortName} ${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.posMasterNo}`
: null; : null;
return { return {