1603 lines
61 KiB
TypeScript
1603 lines
61 KiB
TypeScript
import {
|
|
Body,
|
|
Controller,
|
|
Get,
|
|
Patch,
|
|
Path,
|
|
Post,
|
|
Put,
|
|
Query,
|
|
Request,
|
|
Route,
|
|
Security,
|
|
Tags,
|
|
} from "tsoa";
|
|
import { AppDataSource } from "../database/data-source";
|
|
import { ProfileSalary } from "../entities/ProfileSalary";
|
|
import HttpSuccess from "../interfaces/http-success";
|
|
import HttpStatus from "../interfaces/http-status";
|
|
import HttpError from "../interfaces/http-error";
|
|
import HttpStatusCode from "../interfaces/http-status";
|
|
import { RequestWithUser } from "../middlewares/user";
|
|
import { Brackets, IsNull, LessThan, MoreThan, Not } from "typeorm";
|
|
import { setLogDataDiff } from "../interfaces/utils";
|
|
import {
|
|
CreateProfileSalaryTemp,
|
|
ProfileSalaryTemp,
|
|
UpdateProfileSalaryTemp,
|
|
} from "../entities/ProfileSalaryTemp";
|
|
import { Profile } from "../entities/Profile";
|
|
import { ProfileEmployee } from "../entities/ProfileEmployee";
|
|
import permission from "../interfaces/permission";
|
|
import { OrgRevision } from "../entities/OrgRevision";
|
|
import Extension from "../interfaces/extension";
|
|
import {
|
|
CreatePositionSalaryEditHistory,
|
|
PositionSalaryEditHistory,
|
|
} from "../entities/PositionSalaryEditHistory";
|
|
|
|
@Route("api/v1/org/profile/salaryTemp")
|
|
@Tags("ProfileSalaryTemp")
|
|
@Security("bearerAuth")
|
|
export class ProfileSalaryTempController extends Controller {
|
|
private profileRepo = AppDataSource.getRepository(Profile);
|
|
private profileEmployeeRepo = AppDataSource.getRepository(ProfileEmployee);
|
|
private salaryRepo = AppDataSource.getRepository(ProfileSalaryTemp);
|
|
private salaryOldRepo = AppDataSource.getRepository(ProfileSalary);
|
|
private orgRevisionRepo = AppDataSource.getRepository(OrgRevision);
|
|
private positionSalaryEditHistoryRepo = AppDataSource.getRepository(PositionSalaryEditHistory);
|
|
|
|
/**
|
|
* API ค้นหารายการคน
|
|
*
|
|
* @summary API ค้นหารายการคน
|
|
*
|
|
*/
|
|
@Get()
|
|
async listProfile(
|
|
@Request() request: RequestWithUser,
|
|
@Query("page") page: number = 1,
|
|
@Query("pageSize") pageSize: number = 10,
|
|
@Query()
|
|
searchField?: "firstName" | "lastName" | "fullName" | "citizenId",
|
|
@Query() type: string = "OFFICER",
|
|
@Query() searchKeyword: string = "",
|
|
@Query() statusCheckEdit?: string | null,
|
|
@Query() rootId?: string,
|
|
@Query("sortBy") sortBy?: string,
|
|
@Query("descending") descending?: boolean,
|
|
) {
|
|
if (type.trim().toUpperCase() == "OFFICER") {
|
|
let _data = await new permission().PermissionOrgList(request, "SYS_REGISTRY_OFFICER");
|
|
let queryLike =
|
|
"CONCAT(profile.prefix, profile.firstName, ' ', profile.lastName) LIKE :keyword";
|
|
if (searchField == "citizenId") {
|
|
queryLike = "profile.citizenId LIKE :keyword";
|
|
}
|
|
const findRevision = await this.orgRevisionRepo.findOne({
|
|
where: { orgRevisionIsCurrent: true },
|
|
});
|
|
if (!findRevision) {
|
|
throw new HttpError(HttpStatus.NOT_FOUND, "not found. OrgRevision");
|
|
}
|
|
let query = await this.profileRepo
|
|
.createQueryBuilder("profile")
|
|
.leftJoinAndSelect("profile.posLevel", "posLevel")
|
|
.leftJoinAndSelect("profile.posType", "posType")
|
|
.leftJoinAndSelect("profile.current_holders", "current_holders")
|
|
.leftJoinAndSelect("current_holders.positions", "positions")
|
|
.leftJoinAndSelect("positions.posExecutive", "posExecutive")
|
|
.leftJoinAndSelect("current_holders.orgRevision", "orgRevision")
|
|
.leftJoinAndSelect("current_holders.orgRoot", "orgRoot")
|
|
.leftJoinAndSelect("current_holders.orgChild1", "orgChild1")
|
|
.leftJoinAndSelect("current_holders.orgChild2", "orgChild2")
|
|
.leftJoinAndSelect("current_holders.orgChild3", "orgChild3")
|
|
.leftJoinAndSelect("current_holders.orgChild4", "orgChild4")
|
|
.where("current_holders.orgRevisionId = :orgRevisionId", {
|
|
orgRevisionId: findRevision.id,
|
|
})
|
|
.andWhere(
|
|
statusCheckEdit != undefined &&
|
|
statusCheckEdit != null &&
|
|
statusCheckEdit.toUpperCase() != "ALL"
|
|
? "profile.statusCheckEdit = :statusCheckEdit"
|
|
: "1=1",
|
|
{
|
|
statusCheckEdit: statusCheckEdit?.trim()?.toUpperCase() ?? null,
|
|
},
|
|
)
|
|
.andWhere(
|
|
_data.root != undefined && _data.root != null
|
|
? _data.root[0] != null
|
|
? `current_holders.orgRootId IN (:...root)`
|
|
: `current_holders.orgRootId is null`
|
|
: "1=1",
|
|
{
|
|
root: _data.root,
|
|
},
|
|
)
|
|
.andWhere(
|
|
_data.child1 != undefined && _data.child1 != null
|
|
? _data.child1[0] != null
|
|
? `current_holders.orgChild1Id IN (:...child1)`
|
|
: `current_holders.orgChild1Id is null`
|
|
: "1=1",
|
|
{
|
|
child1: _data.child1,
|
|
},
|
|
)
|
|
.andWhere(
|
|
_data.child2 != undefined && _data.child2 != null
|
|
? _data.child2[0] != null
|
|
? `current_holders.orgChild2Id IN (:...child2)`
|
|
: `current_holders.orgChild2Id is null`
|
|
: "1=1",
|
|
{
|
|
child2: _data.child2,
|
|
},
|
|
)
|
|
.andWhere(
|
|
_data.child3 != undefined && _data.child3 != null
|
|
? _data.child3[0] != null
|
|
? `current_holders.orgChild3Id IN (:...child3)`
|
|
: `current_holders.orgChild3Id is null`
|
|
: "1=1",
|
|
{
|
|
child3: _data.child3,
|
|
},
|
|
)
|
|
.andWhere(
|
|
_data.child4 != undefined && _data.child4 != null
|
|
? _data.child4[0] != null
|
|
? `current_holders.orgChild4Id IN (:...child4)`
|
|
: `current_holders.orgChild4Id is null`
|
|
: "1=1",
|
|
{
|
|
child4: _data.child4,
|
|
},
|
|
)
|
|
.andWhere(
|
|
new Brackets((qb) => {
|
|
qb.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `profile.citizenId like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `profile.position like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(profile.prefix, profile.firstName," ",profile.lastName) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `posType.posTypeName like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `posLevel.posLevelName like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `orgRoot.orgRootName like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `orgChild1.orgChild1Name like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `orgChild2.orgChild2Name like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `orgChild3.orgChild3Name like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `orgChild4.orgChild4Name like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(
|
|
orgRoot.orgRootShortName," ",
|
|
current_holders.posMasterNo
|
|
) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(
|
|
orgRoot.orgRootShortName,
|
|
orgChild1.orgChild1ShortName," ",
|
|
current_holders.posMasterNo
|
|
) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(
|
|
orgRoot.orgRootShortName,
|
|
orgChild1.orgChild1ShortName,
|
|
orgChild2.orgChild2ShortName," ",
|
|
current_holders.posMasterNo
|
|
) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(
|
|
orgRoot.orgRootShortName,
|
|
orgChild1.orgChild1ShortName,
|
|
orgChild2.orgChild2ShortName,
|
|
orgChild3.orgChild3ShortName," ",
|
|
current_holders.posMasterNo
|
|
) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(
|
|
orgRoot.orgRootShortName,
|
|
orgChild1.orgChild1ShortName,
|
|
orgChild2.orgChild2ShortName,
|
|
orgChild3.orgChild3ShortName,
|
|
orgChild4.orgChild4ShortName," ",
|
|
current_holders.posMasterNo
|
|
) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(
|
|
orgRoot.orgRootShortName,
|
|
current_holders.posMasterNo
|
|
) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(
|
|
orgRoot.orgRootShortName,
|
|
orgChild1.orgChild1ShortName,
|
|
current_holders.posMasterNo
|
|
) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(
|
|
orgRoot.orgRootShortName,
|
|
orgChild1.orgChild1ShortName,
|
|
orgChild2.orgChild2ShortName,
|
|
current_holders.posMasterNo
|
|
) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(
|
|
orgRoot.orgRootShortName,
|
|
orgChild1.orgChild1ShortName,
|
|
orgChild2.orgChild2ShortName,
|
|
orgChild3.orgChild3ShortName,
|
|
current_holders.posMasterNo
|
|
) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(
|
|
orgRoot.orgRootShortName,
|
|
orgChild1.orgChild1ShortName,
|
|
orgChild2.orgChild2ShortName,
|
|
orgChild3.orgChild3ShortName,
|
|
orgChild4.orgChild4ShortName,
|
|
current_holders.posMasterNo
|
|
) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
);
|
|
}),
|
|
)
|
|
// .andWhere(
|
|
// rootId != undefined &&
|
|
// rootId != null
|
|
// ? `current_holders.orgRootId = :rootId`
|
|
// : "1=1",
|
|
// {
|
|
// rootId: rootId,
|
|
// }
|
|
// )
|
|
.andWhere("current_holders.orgRootId = :rootId", {
|
|
rootId: rootId,
|
|
})
|
|
.addSelect("CASE WHEN current_holders.posMasterNo IS NULL THEN 1 ELSE 0 END", "sort_order")
|
|
// .orderBy(`${sortBy}`, sort)
|
|
|
|
if (sortBy) {
|
|
if(sortBy == "posLevel"){
|
|
query = query.orderBy(
|
|
`posLevel.posLevelName`,
|
|
descending ? "DESC" : "ASC"
|
|
);
|
|
}else if(sortBy == "posType"){
|
|
query = query.orderBy(
|
|
`posType.posTypeName`,
|
|
descending ? "DESC" : "ASC"
|
|
);
|
|
}else if(sortBy == "posExecutive"){
|
|
query = query.orderBy(
|
|
`posExecutive.posExecutiveName`,
|
|
descending ? "DESC" : "ASC"
|
|
);
|
|
}else if(sortBy == "posNo"){
|
|
query = query.orderBy(
|
|
`orgRoot.orgRootShortName`,
|
|
descending ? "DESC" : "ASC"
|
|
);
|
|
}else{
|
|
query = query.orderBy(
|
|
`profile.${sortBy}`,
|
|
descending ? "DESC" : "ASC"
|
|
);
|
|
}
|
|
}else{
|
|
query = query.orderBy("sort_order", "ASC")
|
|
.addOrderBy("orgRoot.orgRootOrder", "ASC")
|
|
.addOrderBy("orgChild1.orgChild1Order", "ASC")
|
|
.addOrderBy("orgChild2.orgChild2Order", "ASC")
|
|
.addOrderBy("orgChild3.orgChild3Order", "ASC")
|
|
.addOrderBy("orgChild4.orgChild4Order", "ASC")
|
|
.addOrderBy("current_holders.posMasterNo", "ASC")
|
|
}
|
|
|
|
const [record, total] = await query
|
|
.skip((page - 1) * pageSize)
|
|
.take(pageSize)
|
|
.getManyAndCount();
|
|
|
|
const data = await Promise.all(
|
|
record.map((_data) => {
|
|
const posExecutive =
|
|
_data.current_holders.length == 0 ||
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id) == null ||
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.positions
|
|
.length == 0 ||
|
|
_data.current_holders
|
|
.find((x) => x.orgRevisionId == findRevision.id)
|
|
?.positions.find((x: any) => x.positionIsSelected == true) == null ||
|
|
_data.current_holders
|
|
.find((x) => x.orgRevisionId == findRevision.id)
|
|
?.positions.find((x: any) => x.positionIsSelected == true)?.posExecutive == null
|
|
? null
|
|
: _data.current_holders
|
|
.find((x) => x.orgRevisionId == findRevision.id)
|
|
?.positions.find((x: any) => x.positionIsSelected == true)?.posExecutive
|
|
?.posExecutiveName;
|
|
|
|
const shortName =
|
|
_data.current_holders.length == 0
|
|
? null
|
|
: _data.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null &&
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)
|
|
?.orgChild4 != null
|
|
? `${_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild4.orgChild4ShortName} ${_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}`
|
|
: _data.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null &&
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)
|
|
?.orgChild3 != null
|
|
? `${_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild3.orgChild3ShortName} ${_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}`
|
|
: _data.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null &&
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)
|
|
?.orgChild2 != null
|
|
? `${_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild2.orgChild2ShortName} ${_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}`
|
|
: _data.current_holders.find((x) => x.orgRevisionId == findRevision.id) !=
|
|
null &&
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)
|
|
?.orgChild1 != null
|
|
? `${_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild1.orgChild1ShortName} ${_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}`
|
|
: _data.current_holders.find((x) => x.orgRevisionId == findRevision.id) !=
|
|
null &&
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)
|
|
?.orgRoot != null
|
|
? `${_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgRoot.orgRootShortName} ${_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}`
|
|
: null;
|
|
const root =
|
|
_data.current_holders.length == 0 ||
|
|
(_data.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null &&
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgRoot ==
|
|
null)
|
|
? null
|
|
: _data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgRoot;
|
|
|
|
const child1 =
|
|
_data.current_holders == null ||
|
|
_data.current_holders.length == 0 ||
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id) == null
|
|
? null
|
|
: _data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild1;
|
|
|
|
const child2 =
|
|
_data.current_holders == null ||
|
|
_data.current_holders.length == 0 ||
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id) == null
|
|
? null
|
|
: _data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild2;
|
|
|
|
const child3 =
|
|
_data.current_holders == null ||
|
|
_data.current_holders.length == 0 ||
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id) == null
|
|
? null
|
|
: _data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild3;
|
|
|
|
const child4 =
|
|
_data.current_holders == null ||
|
|
_data.current_holders.length == 0 ||
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id) == null
|
|
? null
|
|
: _data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild4;
|
|
|
|
let _child1 = child1?.orgChild1Name;
|
|
let _child2 = child2?.orgChild2Name;
|
|
let _child3 = child3?.orgChild3Name;
|
|
let _child4 = child4?.orgChild4Name;
|
|
|
|
return {
|
|
id: _data.id,
|
|
avatar: _data.avatar,
|
|
avatarName: _data.avatarName,
|
|
prefix: _data.prefix,
|
|
rank: _data.rank,
|
|
firstName: _data.firstName,
|
|
lastName: _data.lastName,
|
|
citizenId: _data.citizenId,
|
|
posLevel: _data.posLevel == null ? null : _data.posLevel.posLevelName,
|
|
posType: _data.posType == null ? null : _data.posType.posTypeName,
|
|
posLevelId: _data.posLevel == null ? null : _data.posLevel.id,
|
|
posTypeId: _data.posType == null ? null : _data.posType.id,
|
|
position: _data.position,
|
|
posExecutive: posExecutive,
|
|
posNo: shortName,
|
|
rootId: root == null ? null : root.id,
|
|
root: root == null ? null : root.orgRootName,
|
|
orgRootShortName: root == null ? null : root.orgRootShortName,
|
|
orgRevisionId: root == null ? null : root.orgRevisionId,
|
|
org:
|
|
(_child4 == null ? "" : _child4 + "\n") +
|
|
(_child3 == null ? "" : _child3 + "\n") +
|
|
(_child2 == null ? "" : _child2 + "\n") +
|
|
(_child1 == null ? "" : _child1 + "\n") +
|
|
(root?.orgRootName == null ? "" : root?.orgRootName),
|
|
statusCheckEdit: _data.statusCheckEdit,
|
|
type: "OFFICER",
|
|
};
|
|
}),
|
|
);
|
|
|
|
return new HttpSuccess({ data: data, total });
|
|
} else {
|
|
let _data = await new permission().PermissionOrgList(request, "SYS_REGISTRY_EMP");
|
|
let queryLike =
|
|
"CONCAT(profileEmployee.prefix, profileEmployee.firstName, ' ', profileEmployee.lastName) LIKE :keyword";
|
|
if (searchField == "citizenId") {
|
|
queryLike = "profileEmployee.citizenId LIKE :keyword";
|
|
}
|
|
const findRevision = await this.orgRevisionRepo.findOne({
|
|
where: { orgRevisionIsCurrent: true },
|
|
});
|
|
if (!findRevision) {
|
|
throw new HttpError(HttpStatus.NOT_FOUND, "not found. OrgRevision");
|
|
}
|
|
let query = await this.profileEmployeeRepo
|
|
.createQueryBuilder("profileEmployee")
|
|
.leftJoinAndSelect("profileEmployee.posLevel", "posLevel")
|
|
.leftJoinAndSelect("profileEmployee.posType", "posType")
|
|
.leftJoinAndSelect("profileEmployee.current_holders", "current_holders")
|
|
.leftJoinAndSelect("profileEmployee.profileEmployeeEmployment", "profileEmployeeEmployment")
|
|
.leftJoinAndSelect("current_holders.positions", "positions")
|
|
.leftJoinAndSelect("current_holders.orgRevision", "orgRevision")
|
|
.leftJoinAndSelect("current_holders.orgRoot", "orgRoot")
|
|
.leftJoinAndSelect("current_holders.orgChild1", "orgChild1")
|
|
.leftJoinAndSelect("current_holders.orgChild2", "orgChild2")
|
|
.leftJoinAndSelect("current_holders.orgChild3", "orgChild3")
|
|
.leftJoinAndSelect("current_holders.orgChild4", "orgChild4")
|
|
.where("current_holders.orgRevisionId = :orgRevisionId", {
|
|
orgRevisionId: findRevision.id,
|
|
})
|
|
.andWhere(
|
|
statusCheckEdit != undefined &&
|
|
statusCheckEdit != null &&
|
|
statusCheckEdit.toUpperCase() != "ALL"
|
|
? "profileEmployee.statusCheckEdit = :statusCheckEdit"
|
|
: "1=1",
|
|
{
|
|
statusCheckEdit: statusCheckEdit?.trim()?.toUpperCase() ?? null,
|
|
},
|
|
)
|
|
.andWhere(
|
|
_data.root != undefined && _data.root != null
|
|
? _data.root[0] != null
|
|
? `current_holders.orgRootId IN (:...root)`
|
|
: `current_holders.orgRootId is null`
|
|
: "1=1",
|
|
{
|
|
root: _data.root,
|
|
},
|
|
)
|
|
.andWhere(
|
|
_data.child1 != undefined && _data.child1 != null
|
|
? _data.child1[0] != null
|
|
? `current_holders.orgChild1Id IN (:...child1)`
|
|
: `current_holders.orgChild1Id is null`
|
|
: "1=1",
|
|
{
|
|
child1: _data.child1,
|
|
},
|
|
)
|
|
.andWhere(
|
|
_data.child2 != undefined && _data.child2 != null
|
|
? _data.child2[0] != null
|
|
? `current_holders.orgChild2Id IN (:...child2)`
|
|
: `current_holders.orgChild2Id is null`
|
|
: "1=1",
|
|
{
|
|
child2: _data.child2,
|
|
},
|
|
)
|
|
.andWhere(
|
|
_data.child3 != undefined && _data.child3 != null
|
|
? _data.child3[0] != null
|
|
? `current_holders.orgChild3Id IN (:...child3)`
|
|
: `current_holders.orgChild3Id is null`
|
|
: "1=1",
|
|
{
|
|
child3: _data.child3,
|
|
},
|
|
)
|
|
.andWhere(
|
|
_data.child4 != undefined && _data.child4 != null
|
|
? _data.child4[0] != null
|
|
? `current_holders.orgChild4Id IN (:...child4)`
|
|
: `current_holders.orgChild4Id is null`
|
|
: "1=1",
|
|
{
|
|
child4: _data.child4,
|
|
},
|
|
)
|
|
// .andWhere("profileEmployee.employeeClass LIKE :type", {
|
|
// type: "PERM",
|
|
// })
|
|
// .andWhere(
|
|
// searchKeyword != undefined && searchKeyword != null && searchKeyword != ""
|
|
// ? queryLike
|
|
// : "1=1",
|
|
// {
|
|
// keyword: `%${searchKeyword}%`,
|
|
// },
|
|
// )
|
|
.andWhere(
|
|
new Brackets((qb) => {
|
|
qb.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `profileEmployee.citizenId like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `profileEmployee.position like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(profileEmployee.prefix, profileEmployee.firstName," ",profileEmployee.lastName) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `posType.posTypeName like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `posLevel.posLevelName like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(posType.posTypeShortName," ",posLevel.posLevelName) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(posType.posTypeShortName,posLevel.posLevelName) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `orgRoot.orgRootName like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `orgChild1.orgChild1Name like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `orgChild2.orgChild2Name like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `orgChild3.orgChild3Name like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `orgChild4.orgChild4Name like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(
|
|
orgRoot.orgRootShortName," ",
|
|
current_holders.posMasterNo
|
|
) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(
|
|
orgRoot.orgRootShortName,
|
|
orgChild1.orgChild1ShortName," ",
|
|
current_holders.posMasterNo
|
|
) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(
|
|
orgRoot.orgRootShortName,
|
|
orgChild1.orgChild1ShortName,
|
|
orgChild2.orgChild2ShortName," ",
|
|
current_holders.posMasterNo
|
|
) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(
|
|
orgRoot.orgRootShortName,
|
|
orgChild1.orgChild1ShortName,
|
|
orgChild2.orgChild2ShortName,
|
|
orgChild3.orgChild3ShortName," ",
|
|
current_holders.posMasterNo
|
|
) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(
|
|
orgRoot.orgRootShortName,
|
|
orgChild1.orgChild1ShortName,
|
|
orgChild2.orgChild2ShortName,
|
|
orgChild3.orgChild3ShortName,
|
|
orgChild4.orgChild4ShortName," ",
|
|
current_holders.posMasterNo
|
|
) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(
|
|
orgRoot.orgRootShortName,
|
|
current_holders.posMasterNo
|
|
) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(
|
|
orgRoot.orgRootShortName,
|
|
orgChild1.orgChild1ShortName,
|
|
current_holders.posMasterNo
|
|
) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(
|
|
orgRoot.orgRootShortName,
|
|
orgChild1.orgChild1ShortName,
|
|
orgChild2.orgChild2ShortName,
|
|
current_holders.posMasterNo
|
|
) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(
|
|
orgRoot.orgRootShortName,
|
|
orgChild1.orgChild1ShortName,
|
|
orgChild2.orgChild2ShortName,
|
|
orgChild3.orgChild3ShortName,
|
|
current_holders.posMasterNo
|
|
) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
)
|
|
.orWhere(
|
|
searchKeyword != null && searchKeyword != ""
|
|
? `CONCAT(
|
|
orgRoot.orgRootShortName,
|
|
orgChild1.orgChild1ShortName,
|
|
orgChild2.orgChild2ShortName,
|
|
orgChild3.orgChild3ShortName,
|
|
orgChild4.orgChild4ShortName,
|
|
current_holders.posMasterNo
|
|
) like '%${searchKeyword}%'`
|
|
: "1=1",
|
|
);
|
|
}),
|
|
)
|
|
.andWhere("current_holders.orgRootId = :rootId", {
|
|
rootId: rootId,
|
|
})
|
|
.orderBy("current_holders.posMasterNo", "ASC")
|
|
// .orderBy(`${sortBy}`, sort)
|
|
|
|
if (sortBy) {
|
|
if(sortBy == "posLevel"){
|
|
query = query.orderBy(
|
|
`posLevel.posLevelName`,
|
|
descending ? "DESC" : "ASC"
|
|
);
|
|
}else if(sortBy == "posType"){
|
|
query = query.orderBy(
|
|
`posType.posTypeName`,
|
|
descending ? "DESC" : "ASC"
|
|
);
|
|
}else if(sortBy == "posNo"){
|
|
query = query.orderBy(
|
|
`orgRoot.orgRootShortName`,
|
|
descending ? "DESC" : "ASC"
|
|
);
|
|
}else{
|
|
query = query.orderBy(
|
|
`profileEmployee.${sortBy}`,
|
|
descending ? "DESC" : "ASC"
|
|
);
|
|
}
|
|
}
|
|
const [record, total] = await query
|
|
.skip((page - 1) * pageSize)
|
|
.take(pageSize)
|
|
.getManyAndCount();
|
|
|
|
const data = await Promise.all(
|
|
record.map((_data) => {
|
|
const shortName =
|
|
_data.current_holders.length == 0
|
|
? null
|
|
: _data.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null &&
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)
|
|
?.orgChild4 != null
|
|
? `${_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild4.orgChild4ShortName} ${_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}`
|
|
: _data.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null &&
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)
|
|
?.orgChild3 != null
|
|
? `${_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild3.orgChild3ShortName} ${_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}`
|
|
: _data.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null &&
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)
|
|
?.orgChild2 != null
|
|
? `${_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild2.orgChild2ShortName} ${_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}`
|
|
: _data.current_holders.find((x) => x.orgRevisionId == findRevision.id) !=
|
|
null &&
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)
|
|
?.orgChild1 != null
|
|
? `${_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild1.orgChild1ShortName} ${_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}`
|
|
: _data.current_holders.find((x) => x.orgRevisionId == findRevision.id) !=
|
|
null &&
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)
|
|
?.orgRoot != null
|
|
? `${_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgRoot.orgRootShortName} ${_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}`
|
|
: null;
|
|
const dateEmployment =
|
|
_data.profileEmployeeEmployment.length == 0
|
|
? null
|
|
: _data.profileEmployeeEmployment.reduce((latest, current) => {
|
|
return latest.date > current.date ? latest : current;
|
|
}).date;
|
|
const root =
|
|
_data.current_holders.length == 0 ||
|
|
(_data.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null &&
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgRoot ==
|
|
null)
|
|
? null
|
|
: _data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgRoot;
|
|
|
|
const child1 =
|
|
_data.current_holders == null ||
|
|
_data.current_holders.length == 0 ||
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id) == null
|
|
? null
|
|
: _data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild1;
|
|
|
|
const child2 =
|
|
_data.current_holders == null ||
|
|
_data.current_holders.length == 0 ||
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id) == null
|
|
? null
|
|
: _data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild2;
|
|
|
|
const child3 =
|
|
_data.current_holders == null ||
|
|
_data.current_holders.length == 0 ||
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id) == null
|
|
? null
|
|
: _data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild3;
|
|
|
|
const child4 =
|
|
_data.current_holders == null ||
|
|
_data.current_holders.length == 0 ||
|
|
_data.current_holders.find((x) => x.orgRevisionId == findRevision.id) == null
|
|
? null
|
|
: _data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild4;
|
|
|
|
let _child1 = child1?.orgChild1Name;
|
|
let _child2 = child2?.orgChild2Name;
|
|
let _child3 = child3?.orgChild3Name;
|
|
let _child4 = child4?.orgChild4Name;
|
|
return {
|
|
id: _data.id,
|
|
prefix: _data.prefix,
|
|
rank: _data.rank,
|
|
firstName: _data.firstName,
|
|
lastName: _data.lastName,
|
|
citizenId: _data.citizenId,
|
|
posLevel: _data.posLevel == null ? null : _data.posLevel.posLevelName,
|
|
posType: _data.posType == null ? null : _data.posType.posTypeName,
|
|
posTypeShortName: _data.posType == null ? null : _data.posType.posTypeShortName,
|
|
posLevelId: _data.posLevel == null ? null : _data.posLevel.id,
|
|
posTypeId: _data.posType == null ? null : _data.posType.id,
|
|
positionId: _data.positionIdTemp,
|
|
posmasterId: _data.posmasterIdTemp,
|
|
position: _data.position,
|
|
posNo: _data.employeeClass == "TEMP" ? _data.posMasterNoTemp : shortName,
|
|
employeeClass: _data.employeeClass == null ? null : _data.employeeClass,
|
|
govAge: Extension.CalculateGovAge(_data.dateAppoint, 0, 0),
|
|
age: Extension.CalculateAgeStrV2(_data.birthDate, 0, 0),
|
|
dateEmployment: dateEmployment,
|
|
dateAppoint: _data.dateAppoint,
|
|
dateStart: _data.dateStart,
|
|
createdAt: _data.createdAt,
|
|
dateRetireLaw: _data.dateRetireLaw,
|
|
draftOrganizationOrganization:
|
|
_data.nodeTemp == "0"
|
|
? _data.rootTemp
|
|
: _data.nodeTemp == "1"
|
|
? _data.child1Temp
|
|
: _data.nodeTemp == "2"
|
|
? _data.child2Temp
|
|
: _data.nodeTemp == "3"
|
|
? _data.child3Temp
|
|
: _data.nodeTemp == "4"
|
|
? _data.child4Temp
|
|
: null,
|
|
draftPositionEmployee: _data.positionTemp,
|
|
draftOrgEmployeeStatus: _data.statusTemp,
|
|
node: _data.nodeTemp,
|
|
nodeId: _data.nodeIdTemp,
|
|
nodeName:
|
|
_data.nodeTemp == "0"
|
|
? _data.rootTemp
|
|
: _data.nodeTemp == "1"
|
|
? _data.child1Temp
|
|
: _data.nodeTemp == "2"
|
|
? _data.child2Temp
|
|
: _data.nodeTemp == "3"
|
|
? _data.child3Temp
|
|
: _data.nodeTemp == "4"
|
|
? _data.child4Temp
|
|
: null,
|
|
nodeShortName:
|
|
_data.nodeTemp == "0"
|
|
? _data.rootShortNameTemp
|
|
: _data.nodeTemp == "1"
|
|
? _data.child1ShortNameTemp
|
|
: _data.nodeTemp == "2"
|
|
? _data.child1ShortNameTemp
|
|
: _data.nodeTemp == "3"
|
|
? _data.child3ShortNameTemp
|
|
: _data.nodeTemp == "4"
|
|
? _data.child4ShortNameTemp
|
|
: null,
|
|
root: _data.rootTemp ? _data.rootTemp : null,
|
|
rootId: _data.rootIdTemp ? _data.rootIdTemp : null,
|
|
rootShortName: _data.rootShortNameTemp ? _data.rootShortNameTemp : null,
|
|
child1: _data.child1Temp ? _data.child1Temp : null,
|
|
child1Id: _data.child1IdTemp ? _data.child1IdTemp : null,
|
|
child1ShortName: _data.child1ShortNameTemp ? _data.child1ShortNameTemp : null,
|
|
child2: _data.child2Temp ? _data.child2Temp : null,
|
|
child2Id: _data.child2IdTemp ? _data.child2IdTemp : null,
|
|
child2ShortName: _data.child2ShortNameTemp ? _data.child2ShortNameTemp : null,
|
|
child3: _data.child3Temp ? _data.child3Temp : null,
|
|
child3Id: _data.child3IdTemp ? _data.child3IdTemp : null,
|
|
child3ShortName: _data.child3ShortNameTemp ? _data.child3ShortNameTemp : null,
|
|
child4: _data.child4Temp ? _data.child4Temp : null,
|
|
child4Id: _data.child4IdTemp ? _data.child4IdTemp : null,
|
|
child4ShortName: _data.child4ShortNameTemp ? _data.child4ShortNameTemp : null,
|
|
org:
|
|
(_child4 == null ? "" : _child4 + "\n") +
|
|
(_child3 == null ? "" : _child3 + "\n") +
|
|
(_child2 == null ? "" : _child2 + "\n") +
|
|
(_child1 == null ? "" : _child1 + "\n") +
|
|
(root?.orgRootName == null ? "" : root?.orgRootName),
|
|
statusCheckEdit: _data.statusCheckEdit,
|
|
type: "EMPLOYEE",
|
|
};
|
|
}),
|
|
);
|
|
|
|
return new HttpSuccess({ data: data, total });
|
|
}
|
|
}
|
|
|
|
// /**
|
|
// * API Clone ใหม่ตำแหน่งเงินเดือน
|
|
// *
|
|
// * @summary API Clone ใหม่ตำแหน่งเงินเดือน
|
|
// *
|
|
// */
|
|
// @Get("{type}/new-clone/{profileId}")
|
|
// public async newCloneSalary(
|
|
// @Path() profileId: string,
|
|
// @Path() type: string,
|
|
// @Request() req: RequestWithUser,
|
|
// ) {
|
|
// if (type.toLocaleUpperCase() == "OFFICER") {
|
|
// const salary = await this.salaryRepo.find({ where: { profileId: profileId } });
|
|
// await this.salaryRepo.remove(salary);
|
|
// let salaryOld = await this.salaryOldRepo.find({
|
|
// where: { profileId: profileId },
|
|
// order: { order: "ASC" },
|
|
// });
|
|
// salaryOld.forEach((item: any) => {
|
|
// item.salaryId = item.id;
|
|
// item.order = i + 1;
|
|
// });
|
|
// let salaryNew = salaryOld.map(({ id, ...rest }: ProfileSalary) => ({
|
|
// ...rest,
|
|
// isDelete: false,
|
|
// isEdit: false,
|
|
// createdUserId: req.user.sub,
|
|
// createdFullName: req.user.name,
|
|
// lastUpdateUserId: req.user.sub,
|
|
// lastUpdateFullName: req.user.name,
|
|
// createdAt: new Date(),
|
|
// lastUpdatedAt: new Date(),
|
|
// }));
|
|
// await this.salaryRepo.save(salaryNew);
|
|
// return new HttpSuccess(salaryNew);
|
|
// } else {
|
|
// const salary = await this.salaryRepo.find({ where: { profileEmployeeId: profileId } });
|
|
// await this.salaryRepo.remove(salary);
|
|
// let salaryOld = await this.salaryOldRepo.find({
|
|
// where: { profileEmployeeId: profileId },
|
|
// order: { order: "ASC" },
|
|
// });
|
|
// salaryOld.forEach((item: any) => {
|
|
// item.salaryId = item.id;
|
|
// item.order = i + 1;
|
|
// });
|
|
// let salaryNew = salaryOld.map(({ id, ...rest }: ProfileSalary) => ({
|
|
// ...rest,
|
|
// isDelete: false,
|
|
// isEdit: false,
|
|
// createdUserId: req.user.sub,
|
|
// createdFullName: req.user.name,
|
|
// lastUpdateUserId: req.user.sub,
|
|
// lastUpdateFullName: req.user.name,
|
|
// createdAt: new Date(),
|
|
// lastUpdatedAt: new Date(),
|
|
// }));
|
|
// await this.salaryRepo.save(salaryNew);
|
|
// return new HttpSuccess(salaryNew);
|
|
// }
|
|
// }
|
|
|
|
/**
|
|
* API Get ตำแหน่งเงินเดือน
|
|
*
|
|
* @summary API Get ตำแหน่งเงินเดือน
|
|
*
|
|
*/
|
|
@Get("get/{salaryId}")
|
|
public async getSalary(@Path() salaryId: string, @Request() req: RequestWithUser) {
|
|
const salary = await this.salaryRepo.findOne({
|
|
where: { id: salaryId },
|
|
relations: ["profileSalary"],
|
|
});
|
|
if (!salary) {
|
|
throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว");
|
|
}
|
|
return new HttpSuccess({ salaryNew: salary, salaryOld: salary.profileSalary });
|
|
}
|
|
|
|
/**
|
|
* API List ตำแหน่งเงินเดือน
|
|
*
|
|
* @summary API List ตำแหน่งเงินเดือน
|
|
*
|
|
*/
|
|
@Get("{type}/{profileId}")
|
|
public async listSalary(
|
|
@Path() profileId: string,
|
|
@Path() type: string,
|
|
@Request() req: RequestWithUser,
|
|
) {
|
|
if (type.toLocaleUpperCase() == "OFFICER") {
|
|
const salary = await this.salaryRepo.find({
|
|
where: { profileId: profileId },
|
|
order: { order: "ASC" },
|
|
});
|
|
|
|
if (salary.length <= 0) {
|
|
let salaryOld = await this.salaryOldRepo.find({
|
|
where: { profileId: profileId },
|
|
order: { order: "ASC" },
|
|
});
|
|
salaryOld.forEach((item: any, i) => {
|
|
item.salaryId = item.id;
|
|
item.order = i + 1;
|
|
});
|
|
let salaryNew = salaryOld.map(({ id, ...rest }: ProfileSalary) => ({
|
|
...rest,
|
|
isDelete: false,
|
|
isEdit: false,
|
|
isEntry: rest.isEntry ?? false,
|
|
createdUserId: req.user.sub,
|
|
createdFullName: req.user.name,
|
|
lastUpdateUserId: req.user.sub,
|
|
lastUpdateFullName: req.user.name,
|
|
createdAt: new Date(),
|
|
lastUpdatedAt: new Date(),
|
|
}));
|
|
await this.salaryRepo.save(salaryNew);
|
|
return new HttpSuccess(
|
|
salaryNew.map((item) => ({
|
|
...item,
|
|
status: item.isDelete == true ? "DELETE" : item.isEdit == true ? "EDIT" : "PENDING",
|
|
})),
|
|
);
|
|
}
|
|
return new HttpSuccess(
|
|
salary.map((item) => ({
|
|
...item,
|
|
status: item.isDelete == true ? "DELETE" : item.isEdit == true ? "EDIT" : "PENDING",
|
|
})),
|
|
);
|
|
} else {
|
|
const salary = await this.salaryRepo.find({
|
|
where: { profileEmployeeId: profileId },
|
|
order: { order: "ASC" },
|
|
});
|
|
if (salary.length <= 0) {
|
|
let salaryOld = await this.salaryOldRepo.find({
|
|
where: { profileEmployeeId: profileId },
|
|
order: { order: "ASC" },
|
|
});
|
|
salaryOld.forEach((item: any, i) => {
|
|
item.salaryId = item.id;
|
|
item.order = i + 1;
|
|
});
|
|
let salaryNew = salaryOld.map(({ id, ...rest }: ProfileSalary) => ({
|
|
...rest,
|
|
isDelete: false,
|
|
isEdit: false,
|
|
isEntry: rest.isEntry ?? false,
|
|
createdUserId: req.user.sub,
|
|
createdFullName: req.user.name,
|
|
lastUpdateUserId: req.user.sub,
|
|
lastUpdateFullName: req.user.name,
|
|
createdAt: new Date(),
|
|
lastUpdatedAt: new Date(),
|
|
}));
|
|
await this.salaryRepo.save(salaryNew);
|
|
return new HttpSuccess(
|
|
salaryNew.map((item) => ({
|
|
...item,
|
|
status: item.isDelete == true ? "DELETE" : item.isEdit == true ? "EDIT" : "PENDING",
|
|
})),
|
|
);
|
|
}
|
|
return new HttpSuccess(
|
|
salary.map((item) => ({
|
|
...item,
|
|
status: item.isDelete == true ? "DELETE" : item.isEdit == true ? "EDIT" : "PENDING",
|
|
})),
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* API List ตำแหน่งเงินเดือนแก้ไขแล้ว
|
|
*
|
|
* @summary API List ตำแหน่งเงินเดือนแก้ไขแล้ว
|
|
*
|
|
*/
|
|
@Get("{type}/done/{profileId}")
|
|
public async listDoneSalary(
|
|
@Path() profileId: string,
|
|
@Path() type: string,
|
|
@Request() req: RequestWithUser,
|
|
) {
|
|
if (type.toLocaleUpperCase() == "OFFICER") {
|
|
const salary = await this.salaryRepo.find({
|
|
where: { profileId: profileId, isDelete: false },
|
|
order: { order: "ASC" },
|
|
});
|
|
if (!salary) {
|
|
throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว");
|
|
}
|
|
return new HttpSuccess(
|
|
salary.map((item) => ({
|
|
...item,
|
|
status: item.isDelete == true ? "DELETE" : item.isEdit == true ? "EDIT" : "PENDING",
|
|
})),
|
|
);
|
|
} else {
|
|
const salary = await this.salaryRepo.find({
|
|
where: { profileEmployeeId: profileId, isDelete: false },
|
|
order: { order: "ASC" },
|
|
});
|
|
if (!salary) {
|
|
throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว");
|
|
}
|
|
return new HttpSuccess(
|
|
salary.map((item) => ({
|
|
...item,
|
|
status: item.isDelete == true ? "DELETE" : item.isEdit == true ? "EDIT" : "PENDING",
|
|
})),
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* API สร้างตำแหน่งเงินเดือน
|
|
*
|
|
* @summary API สร้างตำแหน่งเงินเดือน
|
|
*
|
|
*/
|
|
@Post()
|
|
public async newSalary(@Request() req: RequestWithUser, @Body() body: CreateProfileSalaryTemp) {
|
|
let dest_item = 1;
|
|
|
|
if (body.type.toLocaleUpperCase() == "OFFICER") {
|
|
if (body.profileId) {
|
|
const salary = await this.salaryRepo.findOne({
|
|
where: { profileId: body.profileId },
|
|
order: { order: "DESC" },
|
|
});
|
|
if (salary) {
|
|
dest_item = salary.order+1;
|
|
}
|
|
// const profile = await this.profileRepo.findOneBy({ id: body.profileId });
|
|
// if (!profile) {
|
|
// throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว");
|
|
// }
|
|
// profile.statusCheckEdit = "EDITED"
|
|
// await this.profileRepo.save(profile);
|
|
} else {
|
|
throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว");
|
|
}
|
|
} else {
|
|
if (body.profileEmployeeId) {
|
|
const salary = await this.salaryRepo.findOne({
|
|
where: { profileEmployeeId: body.profileEmployeeId },
|
|
order: { order: "DESC" },
|
|
});
|
|
if (salary) {
|
|
dest_item = salary.order+1;
|
|
}
|
|
// const profile = await this.profileEmployeeRepo.findOneBy({ id: body.profileId });
|
|
// if (!profile) {
|
|
// throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว");
|
|
// }
|
|
// profile.statusCheckEdit = "EDITED"
|
|
// await this.profileRepo.save(profile);
|
|
} else {
|
|
throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว");
|
|
}
|
|
}
|
|
const before = null;
|
|
const data = new ProfileSalaryTemp();
|
|
|
|
const meta = {
|
|
order: dest_item,
|
|
createdUserId: req.user.sub,
|
|
createdFullName: req.user.name,
|
|
lastUpdateUserId: req.user.sub,
|
|
lastUpdateFullName: req.user.name,
|
|
createdAt: new Date(),
|
|
lastUpdatedAt: new Date(),
|
|
isEdit: true,
|
|
};
|
|
Object.assign(data, { ...body, ...meta });
|
|
await this.salaryRepo.save(data, { data: req });
|
|
setLogDataDiff(req, { before, after: data });
|
|
|
|
return new HttpSuccess();
|
|
}
|
|
|
|
/**
|
|
* API แก้สถานะเป็นยังไม่แก้ไข
|
|
*
|
|
* @summary API แก้สถานะเป็นยังไม่แก้ไข
|
|
*
|
|
*/
|
|
@Post("confirm-pending")
|
|
public async confirmPendingSalary(
|
|
@Request() req: RequestWithUser,
|
|
@Body() body: { profileId: string; type: string },
|
|
) {
|
|
if (body.type.toLocaleUpperCase() == "OFFICER") {
|
|
const profile = await this.profileRepo.findOneBy({ id: body.profileId });
|
|
if (!profile) {
|
|
throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว");
|
|
}
|
|
profile.statusCheckEdit = "PENDING";
|
|
await this.profileRepo.save(profile);
|
|
} else {
|
|
const profile = await this.profileEmployeeRepo.findOneBy({ id: body.profileId });
|
|
if (!profile) {
|
|
throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว");
|
|
}
|
|
profile.statusCheckEdit = "PENDING";
|
|
await this.profileEmployeeRepo.save(profile);
|
|
}
|
|
return new HttpSuccess();
|
|
}
|
|
|
|
/**
|
|
* API ยืนยันเสร็จสิ้นการแก้ไข
|
|
*
|
|
* @summary API ยืนยันเสร็จสิ้นการแก้ไข
|
|
*
|
|
*/
|
|
@Post("confirm-edit")
|
|
public async confirmEditSalary(
|
|
@Request() req: RequestWithUser,
|
|
@Body() body: { profileId: string; type: string },
|
|
) {
|
|
if (body.type.toLocaleUpperCase() == "OFFICER") {
|
|
const profile = await this.profileRepo.findOneBy({ id: body.profileId });
|
|
if (!profile) {
|
|
throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว");
|
|
}
|
|
profile.statusCheckEdit = "EDITED";
|
|
await this.profileRepo.save(profile);
|
|
} else {
|
|
const profile = await this.profileEmployeeRepo.findOneBy({ id: body.profileId });
|
|
if (!profile) {
|
|
throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว");
|
|
}
|
|
profile.statusCheckEdit = "EDITED";
|
|
await this.profileEmployeeRepo.save(profile);
|
|
}
|
|
return new HttpSuccess();
|
|
}
|
|
|
|
/**
|
|
* API ยืนยันข้อมูลถูกต้อง
|
|
*
|
|
* @summary API ยืนยันข้อมูลถูกต้อง
|
|
*
|
|
*/
|
|
@Post("confirm-done")
|
|
public async confirmDoneSalary(
|
|
@Request() req: RequestWithUser,
|
|
@Body() body: { profileId: string; type: string },
|
|
) {
|
|
if (body.type.toLocaleUpperCase() == "OFFICER") {
|
|
const profile = await this.profileRepo.findOneBy({ id: body.profileId });
|
|
if (!profile) {
|
|
throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว");
|
|
}
|
|
profile.statusCheckEdit = "CHECKED";
|
|
await this.profileRepo.save(profile);
|
|
} else {
|
|
const profile = await this.profileEmployeeRepo.findOneBy({ id: body.profileId });
|
|
if (!profile) {
|
|
throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว");
|
|
}
|
|
profile.statusCheckEdit = "CHECKED";
|
|
await this.profileEmployeeRepo.save(profile);
|
|
}
|
|
return new HttpSuccess();
|
|
}
|
|
|
|
/**
|
|
* API แก้ไขข้อมูล
|
|
*
|
|
* @summary API แก้ไขข้อมูล
|
|
*
|
|
*/
|
|
@Patch("{salaryId}")
|
|
public async editSalary(
|
|
@Request() req: RequestWithUser,
|
|
@Body() body: UpdateProfileSalaryTemp,
|
|
@Path() salaryId: string,
|
|
) {
|
|
const record = await this.salaryRepo.findOneBy({ id: salaryId });
|
|
if (!record) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล");
|
|
// await new permission().PermissionOrgUserUpdate(req, "SYS_REGISTRY_OFFICER", record.profileId);
|
|
const before = structuredClone(record);
|
|
|
|
Object.assign(record, body);
|
|
|
|
record.isEdit = true;
|
|
record.lastUpdateUserId = req.user.sub;
|
|
record.lastUpdateFullName = req.user.name;
|
|
record.lastUpdatedAt = new Date();
|
|
|
|
await Promise.all([
|
|
this.salaryRepo.save(record, { data: req }),
|
|
setLogDataDiff(req, { before, after: record }),
|
|
]);
|
|
|
|
return new HttpSuccess();
|
|
}
|
|
|
|
/**
|
|
* API ลบข้อมูล
|
|
*
|
|
* @summary API ลบข้อมูล
|
|
*
|
|
*/
|
|
@Post("delete")
|
|
public async deleteIsSalary(
|
|
@Request() req: RequestWithUser,
|
|
@Body() body: { salaryId: string; type: string },
|
|
) {
|
|
const data = await this.salaryRepo.findOneBy({ id: body.salaryId });
|
|
if (data == null) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล");
|
|
data.isDelete = true;
|
|
await this.salaryRepo.save(data);
|
|
|
|
return new HttpSuccess();
|
|
}
|
|
|
|
/**
|
|
* API ย้อนลบข้อมูล
|
|
*
|
|
* @summary API ย้อนลบข้อมูล
|
|
*
|
|
*/
|
|
@Post("delete-renew")
|
|
public async deleteReNewIsSalary(
|
|
@Request() req: RequestWithUser,
|
|
@Body() body: { salaryId: string; type: string },
|
|
) {
|
|
const data = await this.salaryRepo.findOneBy({ id: body.salaryId });
|
|
if (data == null) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล");
|
|
data.isDelete = false;
|
|
await this.salaryRepo.save(data);
|
|
|
|
return new HttpSuccess();
|
|
}
|
|
|
|
/**
|
|
* API สลับตำแหน่ง
|
|
*
|
|
* @summary API สลับตำแหน่ง
|
|
*
|
|
*/
|
|
@Get("swap/{direction}/{salaryId}")
|
|
public async swapSalary(
|
|
@Path() direction: string,
|
|
salaryId: string,
|
|
@Request() req: RequestWithUser,
|
|
) {
|
|
const source_item = await this.salaryRepo.findOne({ where: { id: salaryId } });
|
|
// if (source_item) {
|
|
//await new permission().PermissionOrgUserGet(req,"SYS_REGISTRY_OFFICER",source_item.profileId,); //ไม่แน่ใจOFFปิดไว้ก่อน
|
|
// }
|
|
if (source_item == null) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล");
|
|
const sourceOrder = source_item.order;
|
|
if (direction.trim().toUpperCase() == "UP") {
|
|
const dest_item = await this.salaryRepo.findOne({
|
|
where: { profileId: source_item.profileId, order: LessThan(sourceOrder) },
|
|
order: { order: "DESC" },
|
|
});
|
|
if (dest_item == null) return new HttpSuccess();
|
|
var destOrder = dest_item.order;
|
|
dest_item.order = sourceOrder;
|
|
dest_item.isEdit = true;
|
|
source_item.order = destOrder;
|
|
source_item.isEdit = true;
|
|
await Promise.all([this.salaryRepo.save(source_item), this.salaryRepo.save(dest_item)]);
|
|
} else {
|
|
const dest_item = await this.salaryRepo.findOne({
|
|
where: { profileId: source_item.profileId, order: MoreThan(sourceOrder) },
|
|
order: { order: "ASC" },
|
|
});
|
|
if (dest_item == null) return new HttpSuccess();
|
|
var destOrder = dest_item.order;
|
|
dest_item.order = sourceOrder;
|
|
dest_item.isEdit = true;
|
|
source_item.order = destOrder;
|
|
source_item.isEdit = true;
|
|
await Promise.all([this.salaryRepo.save(source_item), this.salaryRepo.save(dest_item)]);
|
|
}
|
|
return new HttpSuccess();
|
|
}
|
|
|
|
/**
|
|
* API ตีกลับแก้ไข
|
|
*
|
|
* @summary API ตีกลับแก้ไข
|
|
*
|
|
*/
|
|
@Patch("return-edit/{profileId}")
|
|
public async returnEdit(
|
|
@Path() profileId: string,
|
|
@Body() body: CreatePositionSalaryEditHistory,
|
|
@Request() req: RequestWithUser,
|
|
) {
|
|
let profile = null;
|
|
let profileEmployee = null;
|
|
profile = await this.profileRepo.findOneBy({ id: profileId });
|
|
|
|
if (!profile) {
|
|
profileEmployee = await this.profileEmployeeRepo.findOneBy({ id: profileId });
|
|
if (!profileEmployee) {
|
|
throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล");
|
|
}
|
|
}
|
|
|
|
try {
|
|
if (profile) {
|
|
profile.statusCheckEdit = "PENDING";
|
|
await this.profileRepo.save(profile);
|
|
} else if (profileEmployee) {
|
|
profileEmployee.statusCheckEdit = "PENDING";
|
|
await this.profileEmployeeRepo.save(profileEmployee);
|
|
}
|
|
|
|
const history: PositionSalaryEditHistory = Object.assign(
|
|
new PositionSalaryEditHistory(),
|
|
body,
|
|
);
|
|
if (profile) {
|
|
history.profileId = profileId;
|
|
} else if (profileEmployee) {
|
|
history.profileEmployeeId = profileId;
|
|
}
|
|
history.returnedDate = new Date();
|
|
history.examinerName = req.user.name;
|
|
history.createdFullName = req.user.name;
|
|
history.lastUpdateFullName = req.user.name;
|
|
await this.positionSalaryEditHistoryRepo.save(history);
|
|
|
|
return new HttpSuccess();
|
|
} catch {
|
|
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่สามารถดําเนินการได้");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* API รายการประวัติตีกลับแก้ไข
|
|
*
|
|
* @summary API รายการประวัติตีกลับแก้ไข
|
|
*
|
|
*/
|
|
@Get("return-edit/history/{profileId}")
|
|
public async returnEditHistory(@Path() profileId: string) {
|
|
try {
|
|
let history = await this.positionSalaryEditHistoryRepo.find({
|
|
where: { profileId: profileId },
|
|
order: { returnedDate: "DESC" },
|
|
});
|
|
|
|
//EMP
|
|
if (!history) {
|
|
history = await this.positionSalaryEditHistoryRepo.find({
|
|
where: { profileEmployeeId: profileId },
|
|
order: { returnedDate: "DESC" },
|
|
});
|
|
}
|
|
|
|
return new HttpSuccess(history);
|
|
} catch {
|
|
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่สามารถดําเนินการได้");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* API แก้้ไขลำดับรายคน
|
|
*
|
|
* @summary API แก้้ไขลำดับรายคน
|
|
*
|
|
*/
|
|
@Get("change/sort/all")
|
|
public async changeSortEditGenAll() {
|
|
try {
|
|
const profiles = await this.profileRepo.find();
|
|
let num = 1;
|
|
for await (const item of profiles) {
|
|
let salaryOld = await this.salaryOldRepo.find({
|
|
where: { profileId: item.id },
|
|
order: { commandDateAffect: "ASC", order: "ASC" },
|
|
});
|
|
|
|
salaryOld.forEach((item: any, i) => {
|
|
item.order = i + 1;
|
|
});
|
|
num = num + 1;
|
|
console.log(num);
|
|
await this.salaryOldRepo.save(salaryOld);
|
|
}
|
|
|
|
return new HttpSuccess();
|
|
} catch {
|
|
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่สามารถดําเนินการได้");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* API แก้้ไขลำดับรายคน
|
|
*
|
|
* @summary API แก้้ไขลำดับรายคน
|
|
*
|
|
*/
|
|
@Get("change/sort/{profileId}")
|
|
public async changeSortEdit(@Path() profileId: string) {
|
|
try {
|
|
let salaryOld = await this.salaryRepo.find({
|
|
where: { profileId: profileId },
|
|
order: { commandDateAffect: "ASC", order: "ASC" },
|
|
});
|
|
|
|
salaryOld.forEach((item: any, i) => {
|
|
item.order = i + 1;
|
|
});
|
|
await this.salaryRepo.save(salaryOld);
|
|
|
|
return new HttpSuccess();
|
|
} catch {
|
|
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่สามารถดําเนินการได้");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* API แก้้ไขลำดับรายคน
|
|
*
|
|
* @summary API แก้้ไขลำดับรายคน
|
|
*
|
|
*/
|
|
@Put("change/sort/{profileId}")
|
|
public async changeSortEditAll(@Path() profileId: string, @Body() requestBody: { id: string[] }) {
|
|
const salary = await this.salaryRepo.find({
|
|
where: { profileId: profileId },
|
|
});
|
|
|
|
const sortLevel = salary.map((data) => ({
|
|
...data,
|
|
order: requestBody.id.indexOf(data.id) + 1,
|
|
}));
|
|
|
|
await this.salaryRepo.save(sortLevel);
|
|
return new HttpSuccess();
|
|
}
|
|
}
|