From c5c8ccd8c099eb7fad55cfe55978f749330d12a8 Mon Sep 17 00:00:00 2001 From: Bright Date: Wed, 5 Mar 2025 18:26:19 +0700 Subject: [PATCH] update --- src/controllers/ProfileSalaryController.ts | 191 +++++++++++++--- src/controllers/ReportController.ts | 250 ++++++++++----------- src/entities/view/viewRegistryEmployee.ts | 18 ++ src/entities/view/viewRegistryOfficer.ts | 9 - 4 files changed, 296 insertions(+), 172 deletions(-) diff --git a/src/controllers/ProfileSalaryController.ts b/src/controllers/ProfileSalaryController.ts index aea03341..503e0eb1 100644 --- a/src/controllers/ProfileSalaryController.ts +++ b/src/controllers/ProfileSalaryController.ts @@ -19,6 +19,7 @@ import HttpError from "../interfaces/http-error"; import { ProfileSalaryHistory } from "../entities/ProfileSalaryHistory"; import { RequestWithUser } from "../middlewares/user"; import { Profile } from "../entities/Profile"; +import { ProfileEmployee } from "../entities/ProfileEmployee"; import { In, LessThan, MoreThan } from "typeorm"; import permission from "../interfaces/permission"; import { setLogDataDiff } from "../interfaces/utils"; @@ -31,57 +32,195 @@ import { TenureLevelEmployee } from "../entities/TenureLevelEmployee"; @Security("bearerAuth") export class ProfileSalaryController extends Controller { private profileRepo = AppDataSource.getRepository(Profile); + private profileEmployeeRepo = AppDataSource.getRepository(ProfileEmployee); private salaryRepo = AppDataSource.getRepository(ProfileSalary); private salaryHistoryRepo = AppDataSource.getRepository(ProfileSalaryHistory); private positionOfficerRepo = AppDataSource.getRepository(TenurePositionOfficer); + private positionEmployeeRepo = AppDataSource.getRepository(TenurePositionEmployee); private levelOfficerRepo = AppDataSource.getRepository(TenureLevelOfficer); - // async cronjobTenurePositionOfficer() { - @Get("XXX") + private levelEmployeeRepo = AppDataSource.getRepository(TenureLevelEmployee); + + @Get("TenurePositionOfficer") public async cronjobTenurePositionOfficer() { let data: any = []; - const profile = await this.profileRepo.find({ - where: { id: "09e89026-c420-4136-bd9e-7e408f530b69" }, - }); - await Promise.all( - profile.map(async (x) => { - const sql_mode = await AppDataSource.query( - "SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));", - ); + const positionOfficer = await this.positionOfficerRepo.find(); + await this.positionOfficerRepo.remove(positionOfficer); + const profile = await this.profileRepo.find(); + for await (const x of profile) { const position = await AppDataSource.query("CALL GetProfileSalaryPosition(?)", [x.id]); const _position = position.length > 0 ? position[0] : []; const mapPosition = _position.length > 1 - ? _position.slice(1).map((curr: any, index: number) => ({ + ? _position.slice(1) + .map((curr: any, index: number) => ({ days_diff: curr.days_diff, positionName: _position[index]?.positionName, - })) + })) : []; const calDayDiff = mapPosition .filter((curr: any) => curr.positionName == x.position) .reduce( (acc: any, curr: any) => { acc.days_diff += Number(curr.days_diff) || 0; + acc.positionName = curr.positionName return acc; }, - { days_diff: 0 }, + { days_diff: 0,positionName: null} ); - console.log("==========> ", calDayDiff); - const _mapData = { + const mapData:any = { profileId: x.id, - positionName: x.position, - days_diff: null, - Years: null, - Months: null, - Days: null, - }; - data.push(_mapData); - }), - + positionName: calDayDiff.positionName, + days_diff: calDayDiff.days_diff, + Years: (calDayDiff.days_diff / 365.2524).toFixed(4), + Months: (calDayDiff.days_diff / 30.4375 %12).toFixed(4), + Days: (calDayDiff.days_diff % 30.4375).toFixed(4), + } + // data.push(_mapData); + await this.positionOfficerRepo.save(mapData); + } // await this.positionOfficerRepo.save(data); - ); - + return new HttpSuccess(); } + @Get("TenurePositionEmployee") + public async cronjobTenurePositionEmployee() { + let data: any = []; + const positionEmployee = await this.positionEmployeeRepo.find(); + await this.positionEmployeeRepo.remove(positionEmployee); + const profile = await this.profileEmployeeRepo.find(); + for await (const x of profile) { + const position = await AppDataSource.query("CALL GetProfileSalaryPosition(?)", [x.id]); + const _position = position.length > 0 ? position[0] : []; + const mapPosition = + _position.length > 1 + ? _position.slice(1) + .map((curr: any, index: number) => ({ + days_diff: curr.days_diff, + positionName: _position[index]?.positionName, + })) + : []; + const calDayDiff = mapPosition + .filter((curr: any) => curr.positionName == x.position) + .reduce( + (acc: any, curr: any) => { + acc.days_diff += Number(curr.days_diff) || 0; + acc.positionName = curr.positionName + return acc; + }, + { days_diff: 0,positionName: null} + ); + const mapData:any = { + profileEmployeeId: x.id, + positionName: calDayDiff.positionName, + days_diff: calDayDiff.days_diff, + Years: (calDayDiff.days_diff / 365.2524).toFixed(4), + Months: (calDayDiff.days_diff / 30.4375 %12).toFixed(4), + Days: (calDayDiff.days_diff % 30.4375).toFixed(4), + } + // data.push(_mapData); + await this.positionEmployeeRepo.save(mapData); + } + // await this.positionEmployeeRepo.save(data); + + return new HttpSuccess(); + } + @Get("TenureLevelOfficer") + public async cronjobTenureLevelOfficer() { + let data: any = []; + const positionOfficer = await this.levelOfficerRepo.find(); + await this.levelOfficerRepo.remove(positionOfficer); + const profile = await this.profileRepo.find({relations:["posLevel"]}); + for await (const x of profile) { + const positionLevel = await AppDataSource.query("CALL GetProfileSalaryLevel(?)", [x.id]); + const _positionLevel = positionLevel.length > 0 ? positionLevel[0] : []; + const mapPositionLevel = + _positionLevel.length > 1 + ? _positionLevel.slice(1) + .map((curr: any, index: number) => ({ + days_diff: curr.days_diff, + positionType: _positionLevel[index]?.positionType, + positionLevel: _positionLevel[index]?.positionLevel, + positionCee: _positionLevel[index]?.positionCee, + })) + : []; + const calDayDiff = mapPositionLevel + .filter((curr: any) => curr.positionLevel == (x.posLevel?.posLevelName ??null)) + .reduce( + (acc: any, curr: any) => { + acc.days_diff += Number(curr.days_diff) || 0; + acc.positionType = curr.positionType + acc.positionLevel = curr.positionLevel + acc.positionCee = curr.positionCee + return acc; + }, + { days_diff: 0,positionType:null,positionLevel:null,positionCee:null} + ); + const mapData:any = { + profileId: x.id, + positionType: calDayDiff.positionType, + positionLevel: calDayDiff.positionLevel, + positionCee: calDayDiff.positionCee, + days_diff: calDayDiff.days_diff, + Years: x.posLevel == null? 0:((calDayDiff.days_diff / 365.2524).toFixed(4)), + Months: x.posLevel == null? 0:((calDayDiff.days_diff / 30.4375 %12).toFixed(4)), + Days: x.posLevel == null? 0:((calDayDiff.days_diff % 30.4375).toFixed(4)), + } + // data.push(_mapData); + await this.levelOfficerRepo.save(mapData); + } + // await this.levelOfficerRepo.save(data); + + return new HttpSuccess(); + } + @Get("TenureLevelEmployee") + public async cronjobTenureLevelEmployee() { + let data: any = []; + const positionEmployee = await this.levelEmployeeRepo.find(); + await this.levelEmployeeRepo.remove(positionEmployee); + const profile = await this.profileEmployeeRepo.find({relations:["posLevel"]}); + for await (const x of profile) { + const positionLevel = await AppDataSource.query("CALL GetProfileSalaryLevel(?)", [x.id]); + const _positionLevel = positionLevel.length > 0 ? positionLevel[0] : []; + const mapPositionLevel = + _positionLevel.length > 1 + ? _positionLevel.slice(1) + .map((curr: any, index: number) => ({ + days_diff: curr.days_diff, + positionType: _positionLevel[index]?.positionType, + positionLevel: _positionLevel[index]?.positionLevel, + positionCee: _positionLevel[index]?.positionCee, + })) + : []; + const calDayDiff = mapPositionLevel + .filter((curr: any) => curr.positionLevel == (x.posLevel?.posLevelName ??null)) + .reduce( + (acc: any, curr: any) => { + acc.days_diff += Number(curr.days_diff) || 0; + acc.positionType = curr.positionType + acc.positionLevel = curr.positionLevel + acc.positionCee = curr.positionCee + return acc; + }, + { days_diff: 0,positionType:null,positionLevel:null,positionCee:null} + ); + const mapData:any = { + profileEmployeeId: x.id, + positionType: calDayDiff.positionType, + positionLevel: calDayDiff.positionLevel, + positionCee: calDayDiff.positionCee, + days_diff: calDayDiff.days_diff, + Years: x.posLevel == null? 0:((calDayDiff.days_diff / 365.2524).toFixed(4)), + Months: x.posLevel == null? 0:((calDayDiff.days_diff / 30.4375 %12).toFixed(4)), + Days: x.posLevel == null? 0:((calDayDiff.days_diff % 30.4375).toFixed(4)), + } + // data.push(_mapData); + await this.levelEmployeeRepo.save(mapData); + } + // await this.levelEmployeeRepo.save(data); + + return new HttpSuccess(); + } + @Get("user") public async getSalaryUser(@Request() request: { user: Record }) { const profile = await this.profileRepo.findOneBy({ keycloak: request.user.sub }); diff --git a/src/controllers/ReportController.ts b/src/controllers/ReportController.ts index 75d50cc7..6f88ee61 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -260,7 +260,7 @@ export class ReportController extends Controller { if (tenureType != "" && tenureType == "position") { tenureTypeCondition = "registryOfficer.Years BETWEEN :tenureMin AND :tenureMax"; } else if (tenureType != "" && tenureType == "level") { - tenureTypeCondition = "registryOfficer.levelYears BETWEEN :tenureMin AND :tenureMax"; //xxxxxxxxxxxx + tenureTypeCondition = "registryOfficer.levelYears BETWEEN :tenureMin AND :tenureMax"; } const [lists, total] = await AppDataSource.getRepository(viewRegistryOfficer) @@ -338,83 +338,58 @@ export class ReportController extends Controller { .orderBy(`registryOfficer.${sortBy}`, sort) .getManyAndCount(); - const mapData = await Promise.all(lists.map(async(x) => { - const position = await AppDataSource.query("CALL GetProfileSalaryPosition(?)", [x.profileId]) - const _position = position.length > 0 ? position[0] : []; - const lastPosition = _position.length > 0 ? _position[_position.length - 1] : null; // last row - const mapPosition = lastPosition - ? [{ - Years: lastPosition.Years ? Math.floor(Number(lastPosition.Years)) : 0, - Months: lastPosition.Months ? Math.floor(Number(lastPosition.Months)) : 0, - Daysday: lastPosition.Days ? Math.floor(Number(lastPosition.Days)) : 0, - }] - : []; - const posLevel = await AppDataSource.query("CALL GetProfileSalaryLevel(?)", [x.profileId]) - const _posLevel = posLevel.length > 0 ? posLevel[0] : []; - const lastPosLevel= _posLevel.length > 0 ? _posLevel[_posLevel.length - 1] : null; - const mapPosLevel = lastPosLevel - ? [{ - Years: lastPosLevel.Years ? Math.floor(Number(lastPosLevel.Years)) : 0, - Months: lastPosLevel.Months ? Math.floor(Number(lastPosLevel.Months)) : 0, - Daysday: lastPosLevel.Days ? Math.floor(Number(lastPosLevel.Days)) : 0, - }] - : []; - return { - profileId: x.profileId, - citizenId: x.citizenId, - prefix: x.prefix, - firstName: x.firstName, - lastName: x.lastName, - isProbation: x.isProbation, - isLeave: x.isLeave, - isRetirement: x.isRetirement, - leaveType: x.leaveType, - posMasterNo: x.posMasterNo, - orgRootId: x.orgRootId, - orgChild1Id: x.orgChild1Id, - orgChild2Id: x.orgChild2Id, - orgChild3Id: x.orgChild3Id, - orgChild4Id: x.orgChild4Id, - orgRootName: x.orgRootName, - orgChild1Name: x.orgChild1Name, - orgChild2Name: x.orgChild2Name, - orgChild3Name: x.orgChild3Name, - orgChild4Name: x.orgChild4Name, - org: x.org, - searchShortName: x.searchShortName, - posExecutiveName: x.posExecutiveName, - position: x.position, - posTypeName: x.posTypeName, - posLevelName: x.posLevelName, - gender: x.gender, - relationship: x.relationship, - dateAppoint: x.dateAppoint, - dateRetire: x.dateRetire, - dateRetireLaw: x.dateRetireLaw, - birthdate: x.birthdate, - degree: x.degree, - age: x.age, - currentPosition: null, - lengthPosition: null, - // positionDate: { - // Years: x.Years, - // Months: x.Months, - // Days: x.Days, - // }, - // posExcutiveDate: { - // Years: x.posExecutiveYears, - // Months: x.posExecutiveMonths, - // Days: x.posExecutiveDays, - // }, - // posLevelDate: { - // Years: x.levelYears, - // Months: x.levelMonths, - // Days: x.levelDays, - // }, - positionDate: mapPosition, - posLevelDate: mapPosLevel + const mapData = await Promise.all( + lists.map(async(x) => { + return { + profileId: x.profileId, + citizenId: x.citizenId, + prefix: x.prefix, + firstName: x.firstName, + lastName: x.lastName, + isProbation: x.isProbation, + isLeave: x.isLeave, + isRetirement: x.isRetirement, + leaveType: x.leaveType, + posMasterNo: x.posMasterNo, + orgRootId: x.orgRootId, + orgChild1Id: x.orgChild1Id, + orgChild2Id: x.orgChild2Id, + orgChild3Id: x.orgChild3Id, + orgChild4Id: x.orgChild4Id, + orgRootName: x.orgRootName, + orgChild1Name: x.orgChild1Name, + orgChild2Name: x.orgChild2Name, + orgChild3Name: x.orgChild3Name, + orgChild4Name: x.orgChild4Name, + org: x.org, + searchShortName: x.searchShortName, + posExecutiveName: x.posExecutiveName, + position: x.position, + posTypeName: x.posTypeName, + posLevelName: x.posLevelName, + gender: x.gender, + relationship: x.relationship, + dateAppoint: x.dateAppoint, + dateRetire: x.dateRetire, + dateRetireLaw: x.dateRetireLaw, + birthdate: x.birthdate, + degree: x.degree, + age: x.age, + currentPosition: null, + lengthPosition: null, + positionDate: { + Years: x.Years, + Months: x.Months, + Days: x.Days, + }, + posLevelDate: { + Years: x.levelYears, + Months: x.levelMonths, + Days: x.levelDays, + }, + } } - })); + )); return new HttpSuccess({ data: mapData, total: total, @@ -613,6 +588,13 @@ export class ReportController extends Controller { parameters.retireType = retireType; } + let tenureTypeCondition = "1=1"; + if (tenureType != "" && tenureType == "position") { + tenureTypeCondition = "registryEmployee.Years BETWEEN :tenureMin AND :tenureMax"; + } else if (tenureType != "" && tenureType == "level") { + tenureTypeCondition = "registryEmployee.levelYears BETWEEN :tenureMin AND :tenureMax"; + } + let retireLawCondition = "1=1"; if (isRetireLaw) { retireLawCondition = @@ -624,6 +606,10 @@ export class ReportController extends Controller { .where(nodeCondition, { nodeId: nodeId, }) + .andWhere(tenureTypeCondition, { + tenureMin: tenureMin, + tenureMax: tenureMax, + }) .andWhere("registryEmployee.age BETWEEN :ageMin AND :ageMax", { ageMin, ageMax, @@ -683,67 +669,57 @@ export class ReportController extends Controller { .orderBy(`registryEmployee.${sortBy}`, sort) .getManyAndCount(); - const mapData = await Promise.all(lists.map(async(x) => { - const position = await AppDataSource.query("CALL GetProfileEmployeeSalaryPosition(?)", [x.profileEmployeeId]) - const _position = position.length > 0 ? position[0] : []; - const lastPosition = _position.length > 0 ? _position[_position.length - 1] : null; - const mapPosition = lastPosition - ? [{ - Years: lastPosition.Years ? Math.floor(Number(lastPosition.Years)) : 0, - Months: lastPosition.Months ? Math.floor(Number(lastPosition.Months)) : 0, - Daysday: lastPosition.Days ? Math.floor(Number(lastPosition.Days)) : 0, - }] - : []; - const posLevel = await AppDataSource.query("CALL GetProfileEmployeeSalaryLevel(?)", [x.profileEmployeeId]) - const _posLevel = posLevel.length > 0 ? posLevel[0] : []; - const lastPosLevel= _posLevel.length > 0 ? _posLevel[_posLevel.length - 1] : null; - const mapPosLevel = lastPosLevel - ? [{ - Years: lastPosLevel.Years ? Math.floor(Number(lastPosLevel.Years)) : 0, - Months: lastPosLevel.Months ? Math.floor(Number(lastPosLevel.Months)) : 0, - Daysday: lastPosLevel.Days ? Math.floor(Number(lastPosLevel.Days)) : 0, - }] - : []; - return { - profileId: x.profileEmployeeId, - citizenId: x.citizenId, - prefix: x.prefix, - firstName: x.firstName, - lastName: x.lastName, - isProbation: x.isProbation, - isLeave: x.isLeave, - isRetirement: x.isRetirement, - leaveType: x.leaveType, - posMasterNo: x.posMasterNo, - orgRootId: x.orgRootId, - orgChild1Id: x.orgChild1Id, - orgChild2Id: x.orgChild2Id, - orgChild3Id: x.orgChild3Id, - orgChild4Id: x.orgChild4Id, - orgRootName: x.orgRootName, - orgChild1Name: x.orgChild1Name, - orgChild2Name: x.orgChild2Name, - orgChild3Name: x.orgChild3Name, - orgChild4Name: x.orgChild4Name, - org: x.org, - searchShortName: x.searchShortName, - position: x.position, - posTypeName: x.posTypeName, - posLevelName: x.posLevelName, - gender: x.gender, - relationship: x.relationship, - dateAppoint: x.dateAppoint, - dateRetire: x.dateRetire, - dateRetireLaw: x.dateRetireLaw, - birthdate: x.birthdate, - degree: x.degree, - age: x.age, - currentPosition: null, - lengthPosition: null, - positionDate: mapPosition, - posLevelDate: mapPosLevel + const mapData = await Promise.all( + lists.map(async(x) => { + return { + profileId: x.profileEmployeeId, + citizenId: x.citizenId, + prefix: x.prefix, + firstName: x.firstName, + lastName: x.lastName, + isProbation: x.isProbation, + isLeave: x.isLeave, + isRetirement: x.isRetirement, + leaveType: x.leaveType, + posMasterNo: x.posMasterNo, + orgRootId: x.orgRootId, + orgChild1Id: x.orgChild1Id, + orgChild2Id: x.orgChild2Id, + orgChild3Id: x.orgChild3Id, + orgChild4Id: x.orgChild4Id, + orgRootName: x.orgRootName, + orgChild1Name: x.orgChild1Name, + orgChild2Name: x.orgChild2Name, + orgChild3Name: x.orgChild3Name, + orgChild4Name: x.orgChild4Name, + org: x.org, + searchShortName: x.searchShortName, + position: x.position, + posTypeName: x.posTypeName, + posLevelName: x.posLevelName, + gender: x.gender, + relationship: x.relationship, + dateAppoint: x.dateAppoint, + dateRetire: x.dateRetire, + dateRetireLaw: x.dateRetireLaw, + birthdate: x.birthdate, + degree: x.degree, + age: x.age, + currentPosition: null, + lengthPosition: null, + positionDate: { + Years: x.Years, + Months: x.Months, + Days: x.Days, + }, + posLevelDate: { + Years: x.levelYears, + Months: x.levelMonths, + Days: x.levelDays, + }, + } } - })); + )); return new HttpSuccess({ data: mapData, total: total, diff --git a/src/entities/view/viewRegistryEmployee.ts b/src/entities/view/viewRegistryEmployee.ts index 10d04c2d..e443d7d2 100644 --- a/src/entities/view/viewRegistryEmployee.ts +++ b/src/entities/view/viewRegistryEmployee.ts @@ -224,4 +224,22 @@ export class viewRegistryEmployee { @ViewColumn() age: number; + + @ViewColumn() + Years: number; + + @ViewColumn() + Months: number; + + @ViewColumn() + Days: number; + + @ViewColumn() + levelYears: number; + + @ViewColumn() + levelMonths: number; + + @ViewColumn() + levelDays: number; } diff --git a/src/entities/view/viewRegistryOfficer.ts b/src/entities/view/viewRegistryOfficer.ts index c411d0e2..28637d97 100644 --- a/src/entities/view/viewRegistryOfficer.ts +++ b/src/entities/view/viewRegistryOfficer.ts @@ -241,15 +241,6 @@ export class viewRegistryOfficer { @ViewColumn() Days: number; - @ViewColumn() - posExecutiveYears: number; - - @ViewColumn() - posExecutiveMonths: number; - - @ViewColumn() - posExecutiveDays: number; - @ViewColumn() levelYears: number;