diff --git a/src/app.ts b/src/app.ts index bb627c36..221a0304 100644 --- a/src/app.ts +++ b/src/app.ts @@ -78,6 +78,7 @@ async function main() { const profileSalaryController = new ProfileSalaryController(); await profileSalaryController.cronjobTenurePositionOfficer(); await profileSalaryController.cronjobTenureLevelOfficer(); + await profileSalaryController.cronjobTenureExecutivePositionOfficer(); await profileSalaryController.cronjobTenurePositionEmployee(); await profileSalaryController.cronjobTenureLevelEmployee(); } catch (error) { diff --git a/src/controllers/ProfileSalaryController.ts b/src/controllers/ProfileSalaryController.ts index 79936bb1..44397d5c 100644 --- a/src/controllers/ProfileSalaryController.ts +++ b/src/controllers/ProfileSalaryController.ts @@ -27,8 +27,11 @@ import { TenurePositionOfficer } from "../entities/TenurePositionOfficer"; import { TenureLevelOfficer } from "../entities/TenureLevelOfficer"; import { TenurePositionEmployee } from "../entities/TenurePositionEmployee"; import { TenureLevelEmployee } from "../entities/TenureLevelEmployee"; +import { TenurePositionExecutiveOfficer } from "../entities/TenurePositionExecutiveOfficer"; import { Command } from "../entities/Command"; import { OrgRoot } from "../entities/OrgRoot"; +import { OrgRevision } from "../entities/OrgRevision"; +import { Position } from "../entities/Position"; @Route("api/v1/org/profile/salary") @Tags("ProfileSalary") @Security("bearerAuth") @@ -41,8 +44,11 @@ export class ProfileSalaryController extends Controller { private positionEmployeeRepo = AppDataSource.getRepository(TenurePositionEmployee); private levelOfficerRepo = AppDataSource.getRepository(TenureLevelOfficer); private levelEmployeeRepo = AppDataSource.getRepository(TenureLevelEmployee); + private positionExecutiveOfficerRepo = AppDataSource.getRepository(TenurePositionExecutiveOfficer); private commandRepository = AppDataSource.getRepository(Command); private orgRootRepository = AppDataSource.getRepository(OrgRoot); + private orgRevisionRepository = AppDataSource.getRepository(OrgRevision); + private positionRepo = AppDataSource.getRepository(Position); @Get("TenurePositionOfficer") public async cronjobTenurePositionOfficer() { @@ -229,6 +235,64 @@ export class ProfileSalaryController extends Controller { return new HttpSuccess(); } + @Get("TenurePositionExecutiveOfficer") + public async cronjobTenureExecutivePositionOfficer() { + await this.positionExecutiveOfficerRepo.clear(); + const profile = await this.profileRepo.find(); + const orgRevision = await this.orgRevisionRepository.findOne({ + select: ["id"], + where: { + orgRevisionIsDraft: false, + orgRevisionIsCurrent: true, + }, + }); + for await (const x of profile) { + const position = await this.positionRepo.findOne({ + where: { + positionIsSelected: true, + posMaster: { + orgRevisionId: orgRevision?.id, + current_holderId: x.id, + }, + }, + order: { createdAt: "DESC" }, + relations: { + posExecutive: true, + }, + }); + const positionExecutive = await AppDataSource.query("CALL GetProfileSalaryExecutive(?)", [x.id]); + const _position = positionExecutive.length > 0 ? positionExecutive[0] : []; + const mapPosition = + _position.length > 1 + ? _position.slice(1).map((curr: any, index: number) => ({ + days_diff: curr.days_diff, + positionExecutive: _position[index]?.positionExecutive, + })) + : []; + const _posExecutiveName = position?.posExecutive?.posExecutiveName; + const calDayDiff = mapPosition + .filter((curr: any) => _posExecutiveName && curr.positionExecutive == _posExecutiveName) + .reduce( + (acc: any, curr: any) => { + acc.days_diff += Number(curr.days_diff) || 0; + acc.positionExecutive = curr.positionExecutive; + return acc; + }, + { days_diff: 0, positionExecutive: null }, + ); + const mapData: any = { + profileId: x.id, + positionExecutiveName: calDayDiff.positionExecutive, + 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), + }; + await this.positionExecutiveOfficerRepo.save(mapData); + } + 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 4350aa38..63939de8 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -151,7 +151,7 @@ export class ReportController extends Controller { } else if (tenureType != "" && tenureType == "level") { tenureTypeCondition = "registryOfficer.levelYears BETWEEN :tenureMin AND :tenureMax"; } else if (tenureType != "" && tenureType == "posExecutive") { - tenureTypeCondition = "registryOfficer.levelYears BETWEEN :tenureMin AND :tenureMax"; + tenureTypeCondition = "registryOfficer.posExecutiveYears BETWEEN :tenureMin AND :tenureMax"; } const [lists, total] = await AppDataSource.getRepository(viewRegistryOfficer) diff --git a/src/entities/view/viewRegistryOfficer.ts b/src/entities/view/viewRegistryOfficer.ts index 668d0bcb..1ddbd88a 100644 --- a/src/entities/view/viewRegistryOfficer.ts +++ b/src/entities/view/viewRegistryOfficer.ts @@ -116,6 +116,14 @@ import { ViewColumn, ViewEntity } from "typeorm"; vctlo.Days, vctlo.profileId FROM tenureLevelOfficer vctlo + ), + PositionExecutiveDate AS ( + SELECT + vcteo.Years, + vcteo.Months, + vcteo.Days, + vcteo.profileId + FROM tenurePositionExecutiveOfficer vcteo ) SELECT p.id as profileId, @@ -168,7 +176,10 @@ import { ViewColumn, ViewEntity } from "typeorm"; vcto.Days, vctlo.Years AS levelYears, vctlo.Months AS levelMonths, - vctlo.Days AS levelDays + vctlo.Days AS levelDays, + vcteo.Years AS posExecutiveYears, + vcteo.Months AS posExecutiveMonths, + vcteo.Days AS posExecutiveDays FROM profile p LEFT JOIN posLevel ON p.posLevelId = posLevel.id LEFT JOIN posType ON p.posTypeId = posType.id @@ -179,6 +190,7 @@ import { ViewColumn, ViewEntity } from "typeorm"; LEFT JOIN Fields fies ON p.id = fies.profileId LEFT JOIN PositionDate vcto ON p.id = vcto.profileId LEFT JOIN PositionLevelDate vctlo ON p.id = vctlo.profileId + LEFT JOIN PositionExecutiveDate vcteo ON p.id = vcteo.profileId `, }) export class viewRegistryOfficer {