diff --git a/src/controllers/ProfileController.ts b/src/controllers/ProfileController.ts index d4e058a7..29e9e60a 100644 --- a/src/controllers/ProfileController.ts +++ b/src/controllers/ProfileController.ts @@ -3019,4 +3019,29 @@ export class ProfileController extends Controller { }); return new HttpSuccess(formattedData); } + + /** + * API อัพเดทเกษียณ + * + * @summary อัพเดทเกษียณ (ADMIN) + * + * @param {string} id Id ทะเบียนประวัติ + */ + @Put("salary/{id}") + async updateLeaveUser( + @Path() id: string, + @Body() + requestBody: { isLeave: boolean; leaveReason: string; dateLeave: Date }, + ) { + const profile = await this.profileRepo.findOne({ + where: { id: id }, + }); + if (!profile) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); + + profile.isLeave = requestBody.isLeave; + profile.leaveReason = requestBody.leaveReason; + profile.dateLeave = requestBody.dateLeave; + await this.profileRepo.save(profile); + return new HttpSuccess(); + } } diff --git a/src/controllers/ProfileEmployeeController.ts b/src/controllers/ProfileEmployeeController.ts index b13debe4..17eb7f97 100644 --- a/src/controllers/ProfileEmployeeController.ts +++ b/src/controllers/ProfileEmployeeController.ts @@ -27,6 +27,7 @@ import { CreateProfileEmployee, UpdateProfileEmployee, ProfileEmployeeHistory, + UpdatePositionTempProfileEmployee } from "../entities/ProfileEmployee"; import { EmployeePosLevel } from "../entities/EmployeePosLevel"; import { EmployeePosType } from "../entities/EmployeePosType"; @@ -44,6 +45,11 @@ import { ProfileFamilyCouple } from "../entities/ProfileFamilyCouple"; import { ProfileFamilyMother } from "../entities/ProfileFamilyMother"; import { ProfileFamilyFather } from "../entities/ProfileFamilyFather"; import Extension from "../interfaces/extension"; +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"; @Route("api/v1/org/profile-employee") @Tags("ProfileEmployee") @@ -71,6 +77,11 @@ export class ProfileEmployeeController extends Controller { private disciplineRepository = AppDataSource.getRepository(ProfileDiscipline); private educationRepository = AppDataSource.getRepository(ProfileEducation); private salaryRepository = AppDataSource.getRepository(ProfileSalary); + 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); /** * report ประวัติแบบย่อ ลูกจ้าง @@ -785,11 +796,20 @@ export class ProfileEmployeeController extends Controller { position: _data.position, posNo: shortName, employeeClass: _data.employeeClass == null ? null : _data.employeeClass, - dateAppoint: _data.dateAppoint, + govAge: Extension.CalculateGovAge(_data.dateAppoint,0,0), + age: Extension.CalculateAgeStrV2(_data.birthDate,0,0), + dateAppoint: _data.dateAppoint, dateStart: _data.dateStart, - createdAt: _data.createdAt, + createdAt: _data.createdAt, dateRetireLaw: _data.dateRetireLaw, - draftOrgEmployeeStatus: null + 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 }; }), ); @@ -1504,6 +1524,138 @@ export class ProfileEmployeeController extends Controller { return new HttpSuccess(formattedData); } + /** + * API บันทึกตำแหน่งลูกจ้างชั่วคราว + * + * @summary บันทึกตำแหน่งลูกจ้างชั่วคราว (ADMIN) + * + * @param {string} id Id ทะเบียนประวัติลูกจ้างชั่วคราว + */ + @Put("position/{id}") + async positionProfileEmployee( + @Request() request: RequestWithUser, + @Path() id: string, + @Body() body: UpdatePositionTempProfileEmployee, + ) { + if (body.posLevelId === "") body.posLevelId = null; + if (body.posTypeId === "") body.posTypeId = null; + + if (body.posLevelId && !(await this.posLevelRepo.findOneBy({ id: body.posLevelId }))) { + throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูลระดับตำแหน่งนี้"); + } + if (body.posTypeId && !(await this.posTypeRepo.findOneBy({ id: body.posTypeId }))) { + throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูลประเภทตำแหน่งนี้"); + } + const profileEmp = await this.profileRepo.findOneBy({ id }); + if (!profileEmp) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูลโปรไฟล์นี้"); + + switch (body.node) { + case 0: { + const data = await this.orgRootRepository.findOne({ + where: { id: body.nodeId }, + }); + if (data != null) { + profileEmp.rootIdTemp = data.id; + profileEmp.rootTemp = data.orgRootName; + profileEmp.rootShortNameTemp = data.orgRootShortName; + } + } + case 1: { + const data = await this.child1Repository.findOne({ + where: { id: body.nodeId }, + relations: ["orgRoot"] + }); + if (data != null) { + profileEmp.rootIdTemp = data.orgRoot.id; + profileEmp.rootTemp = data.orgRoot.orgRootName; + profileEmp.rootShortNameTemp = data.orgRoot.orgRootShortName; + profileEmp.child1IdTemp = data.id; + profileEmp.child1Temp = data.orgChild1Name; + profileEmp.child1ShortNameTemp = data.orgChild1ShortName; + } + } + case 2: { + const data = await this.child2Repository.findOne({ + where: { id: body.nodeId }, + relations: ["orgRoot", "orgChild1"] + }); + if (data != null) { + profileEmp.rootIdTemp = data.orgRoot.id; + profileEmp.rootTemp = data.orgRoot.orgRootName; + profileEmp.rootShortNameTemp = data.orgRoot.orgRootShortName; + profileEmp.child1IdTemp = data.orgChild1.id; + profileEmp.child1Temp = data.orgChild1.orgChild1Name; + profileEmp.child1ShortNameTemp = data.orgChild1.orgChild1ShortName; + profileEmp.child2IdTemp = data.id; + profileEmp.child2Temp = data.orgChild2Name; + profileEmp.child2ShortNameTemp = data.orgChild2ShortName; + } + } + case 3: { + const data = await this.child3Repository.findOne({ + where: { id: body.nodeId }, + relations: ["orgRoot", "orgChild1", "orgChild2"] + }); + if (data != null) { + profileEmp.rootIdTemp = data.orgRoot.id; + profileEmp.rootTemp = data.orgRoot.orgRootName; + profileEmp.rootShortNameTemp = data.orgRoot.orgRootShortName; + profileEmp.child1IdTemp = data.orgChild1.id; + profileEmp.child1Temp = data.orgChild1.orgChild1Name; + profileEmp.child1ShortNameTemp = data.orgChild1.orgChild1ShortName; + profileEmp.child2IdTemp = data.orgChild2.id; + profileEmp.child2Temp = data.orgChild2.orgChild2Name; + profileEmp.child2ShortNameTemp = data.orgChild2.orgChild2ShortName; + profileEmp.child3IdTemp = data.id; + profileEmp.child3Temp = data.orgChild3Name; + profileEmp.child3ShortNameTemp = data.orgChild3ShortName; + } + } + case 4: { + const data = await this.child4Repository.findOne({ + where: { id: body.nodeId }, + relations: ["orgRoot", "orgChild1", "orgChild2", "orgChild3"] + }); + if (data != null) { + profileEmp.rootIdTemp = data.orgRoot.id; + profileEmp.rootTemp = data.orgRoot.orgRootName; + profileEmp.rootShortNameTemp = data.orgRoot.orgRootShortName; + profileEmp.child1IdTemp = data.orgChild1.id; + profileEmp.child1Temp = data.orgChild1.orgChild1Name; + profileEmp.child1ShortNameTemp = data.orgChild1.orgChild1ShortName; + profileEmp.child2IdTemp = data.orgChild2.id; + profileEmp.child2Temp = data.orgChild2.orgChild2Name; + profileEmp.child2ShortNameTemp = data.orgChild2.orgChild2ShortName; + profileEmp.child3IdTemp = data.orgChild3.id; + profileEmp.child3Temp = data.orgChild3.orgChild3Name; + profileEmp.child3ShortNameTemp = data.orgChild3.orgChild3ShortName; + profileEmp.child4IdTemp = data.id; + profileEmp.child4Temp = data.orgChild4Name; + profileEmp.child4ShortNameTemp = data.orgChild4ShortName; + } + } + } + + profileEmp.lastUpdateUserId = request.user.sub; + profileEmp.lastUpdateFullName = request.user.name; + profileEmp.nodeTemp = String(body.node); + profileEmp.nodeIdTemp = body.nodeId; + profileEmp.orgRevisionIdTemp = body.orgRevisionId; + profileEmp.posmasterIdTemp = body.posmasterId; + profileEmp.posMasterNoTemp = body.posMasterNo; + profileEmp.positionIdTemp = body.positionId; + profileEmp.positionTemp = body.position; + profileEmp.positionFieldTemp = body.positionField; + profileEmp.posTypeIdTemp = String(body.posTypeId); + profileEmp.posTypeNameTemp = body.posTypeName; + profileEmp.posLevelIdTemp = String(body.posLevelId); + profileEmp.posLevelNameTemp = body.posLevelName; + profileEmp.statusTemp = "REPORT"; + this.profileRepo.merge(profileEmp, body); + await this.profileRepo.save(profileEmp); + return new HttpSuccess(); + } + /** * API เช็คเลขบัตร * diff --git a/src/entities/Profile.ts b/src/entities/Profile.ts index a4e2dae6..ffc7015e 100644 --- a/src/entities/Profile.ts +++ b/src/entities/Profile.ts @@ -166,6 +166,14 @@ export class Profile extends EntityBase { }) leaveReason: string; + @Column({ + nullable: true, + type: "datetime", + comment: "วันพ้นราชการ", + default: null, + }) + dateLeave: Date; + @Column({ nullable: true, type: "datetime", @@ -466,15 +474,15 @@ export class Profile extends EntityBase { @Column({ nullable: true, length: 40, - comment: "ไอดีรอบลงเวลาล่าสุด" + comment: "ไอดีรอบลงเวลาล่าสุด", }) - dutyTimeId : string; + dutyTimeId: string; @Column({ nullable: true, type: "datetime", comment: "รอบลงเวลาล่าสุด", - default: null + default: null, }) dutyTimeEffectiveDate: Date; } diff --git a/src/entities/ProfileEmployee.ts b/src/entities/ProfileEmployee.ts index c0c28de7..21f3855b 100644 --- a/src/entities/ProfileEmployee.ts +++ b/src/entities/ProfileEmployee.ts @@ -721,3 +721,18 @@ export type UpdateProfileAddressEmployee = { currentSubDistrictId?: string | null; currentZipCode?: string | null; }; + +export type UpdatePositionTempProfileEmployee = { + posmasterId: string ; + node: number ; + nodeId: string ; + orgRevisionId: string ; + positionId: string ; + posMasterNo: string ; + position: string ; + positionField: string ; + posTypeId: string | null; + posTypeName: string ; + posLevelId: string | null; + posLevelName: string ; +}; \ No newline at end of file diff --git a/src/interfaces/extension.ts b/src/interfaces/extension.ts index d3c57877..d0f021ea 100644 --- a/src/interfaces/extension.ts +++ b/src/interfaces/extension.ts @@ -171,6 +171,78 @@ class Extension { } return citizen; } + + public static CalculateGovAge(appointDate: Date, plusYear: number = 0, subtractYear: number = 0): number { + if (appointDate == null || appointDate == undefined) return 0 + const now = new Date(); + if (now.getMonth() - appointDate.getMonth() >= 6) { + return (now.getFullYear() - appointDate.getFullYear()) + 1 + plusYear - subtractYear; + } + else { + return (now.getFullYear() - appointDate.getFullYear()) + plusYear - subtractYear; + } + } + + public static CalculateAge(appointDate: Date, plusYear: number = 0, subtractYear: number = 0) { + let currentDate = new Date().getTime(); + let appointDateTime = new Date(appointDate).getTime(); + let ageInMilliseconds = currentDate - appointDateTime; + let ageInDays = ageInMilliseconds / (1000 * 60 * 60 * 24); + let years = Math.floor(ageInDays / 365.25) + plusYear - subtractYear; + return years; + } + + public static CalculateAgeStrV2(date: Date, plusYear: number = 0, subtractYear: number = 0) { + if (date == null || date == undefined) return "" + const currentDate = new Date(); + if (date > currentDate) { + throw new Error("วันเกิดต้องไม่มากกว่าวันที่ปัจจุบัน"); + } + + let years = currentDate.getFullYear() - date.getFullYear(); + let months = 0; + let days = 0; + + if (currentDate.getMonth() < date.getMonth() || (currentDate.getMonth() === date.getMonth() && currentDate.getDate() < date.getDate())) { + years--; + months = 12 - date.getMonth() + currentDate.getMonth(); + + if (currentDate.getDate() < date.getDate()) { + months--; + let lastMonthDays = 0; + if (currentDate.getMonth() === 0) { + lastMonthDays = new Date(currentDate.getFullYear() - 1, 11, 0).getDate(); + } + else { + lastMonthDays = new Date(currentDate.getFullYear(), currentDate.getMonth(), 0).getDate(); + days = lastMonthDays - date.getDate() + currentDate.getDate(); + } + } + else { + days = currentDate.getDate() - date.getDate(); + } + } + else { + months = currentDate.getMonth() - date.getMonth(); + + if (currentDate.getDate() < date.getDate()) { + months--; + let lastMonthDays = 0; + if (currentDate.getMonth() === 0) { + lastMonthDays = new Date(currentDate.getFullYear() - 1, 11, 0).getDate(); + } + else { + lastMonthDays = new Date(currentDate.getFullYear(), currentDate.getMonth(), 0).getDate(); + days = lastMonthDays - date.getDate() + currentDate.getDate(); + } + } + else { + days = currentDate.getDate() - date.getDate(); + } + } + years += plusYear - subtractYear; + return `${years} ปี ${months} เดือน ${days} วัน`; + } } export default Extension; diff --git a/src/migration/1717671751714-update_table_Profile_add_dateLeave.ts b/src/migration/1717671751714-update_table_Profile_add_dateLeave.ts new file mode 100644 index 00000000..f0a1aa09 --- /dev/null +++ b/src/migration/1717671751714-update_table_Profile_add_dateLeave.ts @@ -0,0 +1,16 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class UpdateTableProfileAddDateLeave1717671751714 implements MigrationInterface { + name = 'UpdateTableProfileAddDateLeave1717671751714' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`profile\` ADD \`dateLeave\` datetime NULL COMMENT 'วันพ้นราชการ'`); + await queryRunner.query(`ALTER TABLE \`profileHistory\` ADD \`dateLeave\` datetime NULL COMMENT 'วันพ้นราชการ'`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`profileHistory\` DROP COLUMN \`dateLeave\``); + await queryRunner.query(`ALTER TABLE \`profile\` DROP COLUMN \`dateLeave\``); + } + +}