import { Controller, Get, Route, Security, Tags, SuccessResponse, Response, Path, Query, Post, Body, } from "tsoa"; import { AppDataSource } from "../database/data-source"; import HttpSuccess from "../interfaces/http-success"; import HttpStatusCode from "../interfaces/http-status"; import HttpError from "../interfaces/http-error"; import { In, LessThan, Brackets } from "typeorm"; import { OrgRevision } from "../entities/OrgRevision"; 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"; import { PosType } from "../entities/PosType"; import { PosLevel } from "../entities/PosLevel"; import { PosMaster } from "../entities/PosMaster"; import { EmployeePosMaster } from "../entities/EmployeePosMaster"; import Extension from "../interfaces/extension"; import { LeaveType } from "../entities/LeaveType"; import HttpStatus from "../interfaces/http-status"; import { Profile } from "../entities/Profile"; import { Position } from "../entities/Position"; import { ProfileEducation } from "../entities/ProfileEducation"; import { ProfileSalary } from "../entities/ProfileSalary"; import { viewRegistryOfficer } from "../entities/view/viewRegistryOfficer"; import { viewRegistryEmployee } from "../entities/view/viewRegistryEmployee"; import { EmployeeTempPosMaster } from "../entities/EmployeeTempPosMaster"; // import { sendWebSocket } from "../services/webSocket"; import { Registry } from "../entities/Registry"; import { RegistryEmployee } from "../entities/RegistryEmployee"; @Route("api/v1/org/report") @Tags("Report") @Security("bearerAuth") @Response( HttpStatusCode.INTERNAL_SERVER_ERROR, "เกิดข้อผิดพลาด ไม่สามารถแสดงรายการได้ กรุณาลองใหม่ในภายหลัง", ) export class ReportController extends Controller { private orgRevisionRepository = AppDataSource.getRepository(OrgRevision); 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); private posTypepository = AppDataSource.getRepository(PosType); private posLevelRepository = AppDataSource.getRepository(PosLevel); private posMasterRepository = AppDataSource.getRepository(PosMaster); private profileRepository = AppDataSource.getRepository(Profile); private empPosMasterRepository = AppDataSource.getRepository(EmployeePosMaster); private empTempPosMasterRepository = AppDataSource.getRepository(EmployeeTempPosMaster); private positionRepository = AppDataSource.getRepository(Position); private profileEducationRepository = AppDataSource.getRepository(ProfileEducation); private profileSalaryRepository = AppDataSource.getRepository(ProfileSalary); /** * API รายงานสถิติข้อมูลข้าราชการ กทม. สามัญ * * @summary รายงานสถิติข้อมูลข้าราชการ กทม. สามัญ * */ @Get("registry-officer") async registryOfficer( @Query() node?: number, @Query() nodeId?: string, @Query() posType?: string, @Query() posLevel?: string, @Query() position?: string, @Query() positionExecutive?: string, @Query() gender?: string, @Query() status?: string, @Query() education?: string, @Query() dateStart?: Date, @Query() dateEnd?: Date, @Query() ageMin?: number, @Query() ageMax?: number, @Query() isProbation?: boolean, @Query() isRetire?: boolean, @Query() isRetireLaw?: boolean, @Query() retireType?: string, @Query() tenureType?: string, @Query() tenureMin?: number, @Query() tenureMax?: number, @Query() positionArea?: string, @Query() educationLevel?: string, @Query() field?: string, @Query() sortBy: string = "posMasterNo", @Query() sort: "ASC" | "DESC" = "ASC", ) { const _null: any = null; if (!dateStart) { dateStart = _null; } if (!dateEnd) { dateEnd = _null; } if (ageMin && (ageMin < 18 || ageMin > 60)) { throw new HttpError(HttpStatus.NOT_FOUND, "ageMin must be between 18 and 60"); } if (ageMax && (ageMax < 18 || ageMax > 60)) { throw new HttpError(HttpStatus.NOT_FOUND, "ageMax must be between 18 and 60"); } if (ageMin && ageMax && ageMin > ageMax) { throw new HttpError(HttpStatus.NOT_FOUND, "ageMin cannot be greater than ageMax"); } ageMin = ageMin ?? 18; ageMax = ageMax ?? 60; tenureMin = tenureMin ?? 0; tenureMax = tenureMax ?? 20; let nodeCondition = "1=1"; if (node === 0 && nodeId) { nodeCondition = "registryOfficer.orgRootId = :nodeId"; } else if (node === 1 && nodeId) { nodeCondition = "registryOfficer.orgChild1Id = :nodeId"; } else if (node === 2 && nodeId) { nodeCondition = "registryOfficer.orgChild2Id = :nodeId"; } else if (node === 3 && nodeId) { nodeCondition = "registryOfficer.orgChild3Id = :nodeId"; } else if (node === 4 && nodeId) { nodeCondition = "registryOfficer.orgChild4Id = :nodeId"; } let dateAppointCondition = "1=1"; if (dateStart && dateEnd) { dateAppointCondition = "DATE(registryOfficer.dateAppoint) >= :startDateAppoint AND DATE(registryOfficer.dateAppoint) <= :endDateAppoint"; } else if (dateStart) { dateAppointCondition = "DATE(registryOfficer.dateAppoint) >= :startDateAppoint"; } else if (dateEnd) { dateAppointCondition = "DATE(registryOfficer.dateAppoint) <= :endDateAppoint"; } const IsLeavecondition = ["registryOfficer.isLeave = :isLeave"]; const parameters: any = { isLeave: isRetire }; if (retireType && retireType.trim() !== "") { IsLeavecondition.push("registryOfficer.leaveType = :retireType"); parameters.retireType = retireType; } let retireLawCondition = "1=1"; if (isRetireLaw) { retireLawCondition = "DATE(registryOfficer.dateRetireLaw) >= :startDateRetireLaw AND DATE(registryOfficer.dateRetireLaw) <= :endDateRetireLaw"; } let tenureTypeCondition = "1=1"; if (tenureType != "" && tenureType == "position") { tenureTypeCondition = "registryOfficer.Years BETWEEN :tenureMin AND :tenureMax"; } else if (tenureType != "" && tenureType == "level") { tenureTypeCondition = "registryOfficer.levelYears BETWEEN :tenureMin AND :tenureMax"; } else if (tenureType != "" && tenureType == "posExecutive") { tenureTypeCondition = "registryOfficer.posExecutiveYears BETWEEN :tenureMin AND :tenureMax"; } // ดึงผ่าน Table แทน View // const [lists, total] = await AppDataSource.getRepository(viewRegistryOfficer) const [lists, total] = await AppDataSource.getRepository(Registry) .createQueryBuilder("registryOfficer") .where(nodeCondition, { nodeId: nodeId, }) .andWhere(tenureTypeCondition, { tenureMin: tenureMin, tenureMax: tenureMax, }) .andWhere("registryOfficer.age BETWEEN :ageMin AND :ageMax", { ageMin, ageMax, }) .andWhere(dateAppointCondition, { startDateAppoint: dateStart?.toISOString().split("T")[0], endDateAppoint: dateEnd?.toISOString().split("T")[0], }) .andWhere(retireLawCondition, { startDateRetireLaw: new Date(new Date().getFullYear() - 1, 9, 1, 0, 0, 0, 0) ?.toISOString() .split("T")[0], endDateRetireLaw: new Date(new Date().getFullYear(), 8, 30, 23, 59, 59, 999) .toISOString() .split("T")[0], }) .andWhere("registryOfficer.isProbation = :isProbation", { isProbation: isProbation, }) .andWhere(IsLeavecondition.join(" AND "), parameters) .andWhere( posType != null && posType != "" ? "registryOfficer.posTypeName = :posTypeName" : "1=1", { posTypeName: `${posType}`, }, ) .andWhere( posLevel != null && posLevel != "" ? "registryOfficer.posLevelName = :posLevelName" : "1=1", { posLevelName: `${posLevel}`, }, ) .andWhere( position != null && position != "" ? "registryOfficer.position = :position" : "1=1", { position: `${position}`, }, ) .andWhere( positionExecutive != null && positionExecutive != "" ? "registryOfficer.posExecutiveName = :posExecutiveName" : "1=1", { posExecutiveName: `${positionExecutive}`, }, ) .andWhere(gender != null && gender != "" ? "registryOfficer.gender = :gender" : "1=1", { gender: `${gender}`, }) .andWhere( status != null && status != "" ? "registryOfficer.relationship = :relationship" : "1=1", { relationship: `${status}`, }, ) .andWhere( positionArea != null && positionArea != "" ? "registryOfficer.positionArea LIKE :positionArea" : "1=1", { positionArea: `%${positionArea}%`, }, ) .andWhere( education != null && education != "" ? "registryOfficer.degrees LIKE :degrees" : "1=1", { degrees: `%${education}%`, }, ) .andWhere( educationLevel != null && educationLevel != "" ? "registryOfficer.educationLevels LIKE :educationLevels" : "1=1", { educationLevels: `%${educationLevel}%`, }, ) .andWhere(field != null && field != "" ? "registryOfficer.fields LIKE :fields" : "1=1", { fields: `%${field}%`, }) .orderBy(`registryOfficer.${sortBy}`, sort) .getManyAndCount(); // const mapData1 = 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.degrees, // age: x.age, // currentPosition: null, // lengthPosition: null, // positionDate: { // Years: x.Years ? x.Years : 0, // Months: x.Months ? x.Months : 0, // Days: x.Days ? x.Days : 0, // }, // levelDate: { // posExecutiveYears: x.levelYears, // posExecutiveMonths: x.levelMonths, // posExecutiveDays: x.levelDays, // }, // }; // }), // ); const mapData = []; for await (const x of lists) { let _educations: any = []; if (!education && !educationLevel && !field) { _educations = Array.isArray(x.Educations) && x.Educations != null ? (x.Educations as any[]).filter((i: any) => i.isEducation == true) : []; if (_educations.length == 0) { _educations = Array.isArray(x.Educations) && x.Educations != null ? (x.Educations as any[]).filter((i: any) => i.isHigh == true) : []; // if(_educations.length == 0) { // _educations = Array.isArray(x.Educations) && x.Educations != null // ? (x.Educations as any[])[0] // : [] // } } } else { _educations = Array.isArray(x.Educations) && x.Educations != null ? (x.Educations as any[]).filter( (i: any) => // i.degree === education || // i.educationLevel === educationLevel || // i.field === field (education ? i.degree?.toString().includes(education) : false) || (educationLevel ? i.educationLevel?.toString().includes(educationLevel) : false) || (field ? i.field?.toString().includes(field) : false), ) : []; } mapData.push({ 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, positionArea: x.positionArea, posTypeName: x.posTypeName, posLevelName: x.posLevelName, gender: x.gender, relationship: x.relationship, dateAppoint: x.dateAppoint, dateRetire: x.dateRetire, dateRetireLaw: x.dateRetireLaw, birthdate: x.birthdate, Educations: _educations, // degree: x.degrees, // educationLevel: x.educationLevels, // field: x.fields, age: x.age, currentPosition: null, lengthPosition: null, positionDate: { Years: x.Years ? x.Years : 0, Months: x.Months ? x.Months : 0, Days: x.Days ? x.Days : 0, }, levelDate: { Years: x.levelYears ? x.levelYears : 0, Months: x.levelMonths ? x.levelMonths : 0, Days: x.levelDays ? x.levelDays : 0, }, posExecutiveDate: { Years: x.posExecutiveYears ? x.posExecutiveYears : 0, Months: x.posExecutiveMonths ? x.posExecutiveMonths : 0, Days: x.posExecutiveDays ? x.posExecutiveDays : 0, }, }); } return new HttpSuccess({ data: mapData, total: total, }); } /** * API รายงานสถิติข้อมูลลูกจ้างประจำ กทม. * * @summary รายงานสถิติข้อมูลลูกจ้างประจำ กทม. * */ @Get("registry-emp") async registryEmployee( @Query() node?: number, @Query() nodeId?: string, @Query() posType?: string, @Query() posLevel?: string, @Query() position?: string, @Query() gender?: string, @Query() status?: string, @Query() education?: string, @Query() dateStart?: Date, @Query() dateEnd?: Date, @Query() isProbation?: boolean, @Query() isRetire?: boolean, @Query() isRetireLaw?: boolean, @Query() retireType?: string, @Query() ageMin?: number, @Query() ageMax?: number, @Query() tenureType?: string, @Query() tenureMin?: number, @Query() tenureMax?: number, @Query() educationLevel?: string, @Query() field?: string, @Query() sortBy: string = "posMasterNo", @Query() sort: "ASC" | "DESC" = "ASC", ) { const _null: any = null; if (!dateStart) { dateStart = _null; } if (!dateEnd) { dateEnd = _null; } if (ageMin && (ageMin < 18 || ageMin > 60)) { throw new HttpError(HttpStatus.NOT_FOUND, "ageMin must be between 18 and 60"); } if (ageMax && (ageMax < 18 || ageMax > 60)) { throw new HttpError(HttpStatus.NOT_FOUND, "ageMax must be between 18 and 60"); } if (ageMin && ageMax && ageMin > ageMax) { throw new HttpError(HttpStatus.NOT_FOUND, "ageMin cannot be greater than ageMax"); } ageMin = ageMin ?? 18; ageMax = ageMax ?? 60; tenureMin = tenureMin ?? 0; tenureMax = tenureMax ?? 20; let nodeCondition = "1=1"; if (node === 0 && nodeId) { nodeCondition = "registryEmployee.orgRootId = :nodeId"; } else if (node === 1 && nodeId) { nodeCondition = "registryEmployee.orgChild1Id = :nodeId"; } else if (node === 2 && nodeId) { nodeCondition = "registryEmployee.orgChild2Id = :nodeId"; } else if (node === 3 && nodeId) { nodeCondition = "registryEmployee.orgChild3Id = :nodeId"; } else if (node === 4 && nodeId) { nodeCondition = "registryEmployee.orgChild4Id = :nodeId"; } let dateAppointCondition = "1=1"; if (dateStart && dateEnd) { dateAppointCondition = "DATE(registryEmployee.dateAppoint) >= :startDateAppoint AND DATE(registryEmployee.dateAppoint) <= :endDateAppoint"; } else if (dateStart) { dateAppointCondition = "DATE(registryEmployee.dateAppoint) >= :startDateAppoint"; } else if (dateEnd) { dateAppointCondition = "DATE(registryEmployee.dateAppoint) <= :endDateAppoint"; } const IsLeavecondition = ["registryEmployee.isLeave = :isLeave"]; const parameters: any = { isLeave: isRetire }; if (retireType && retireType.trim() !== "") { IsLeavecondition.push("registryEmployee.leaveType = :retireType"); 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 = "DATE(registryEmployee.dateRetireLaw) >= :startDateRetireLaw AND DATE(registryEmployee.dateRetireLaw) <= :endDateRetireLaw"; } // ดึงผ่าน Table แทน View // const [lists, total] = await AppDataSource.getRepository(viewRegistryEmployee) const [lists, total] = await AppDataSource.getRepository(RegistryEmployee) .createQueryBuilder("registryEmployee") .where(nodeCondition, { nodeId: nodeId, }) .andWhere(tenureTypeCondition, { tenureMin: tenureMin, tenureMax: tenureMax, }) .andWhere("registryEmployee.age BETWEEN :ageMin AND :ageMax", { ageMin, ageMax, }) .andWhere(dateAppointCondition, { startDateAppoint: dateStart?.toISOString().split("T")[0], endDateAppoint: dateEnd?.toISOString().split("T")[0], }) .andWhere(retireLawCondition, { startDateRetireLaw: new Date(new Date().getFullYear() - 1, 9, 1, 0, 0, 0, 0) ?.toISOString() .split("T")[0], endDateRetireLaw: new Date(new Date().getFullYear(), 8, 30, 23, 59, 59, 999) .toISOString() .split("T")[0], }) .andWhere("registryEmployee.isProbation = :isProbation", { isProbation: isProbation, }) .andWhere(IsLeavecondition.join(" AND "), parameters) .andWhere("registryEmployee.employeeClass = 'PERM'") .andWhere( posType != null && posType != "" ? "registryEmployee.posTypeName LIKE :posTypeName" : "1=1", { posTypeName: `${posType}`, }, ) .andWhere( posLevel != null && posLevel != "" ? "registryEmployee.posLevelName LIKE :posLevelName" : "1=1", { posLevelName: `${posLevel}`, }, ) .andWhere( position != null && position != "" ? "registryEmployee.position LIKE :position" : "1=1", { position: `${position}`, }, ) .andWhere(gender != null && gender != "" ? "registryEmployee.gender LIKE :gender" : "1=1", { gender: `${gender}`, }) .andWhere( status != null && status != "" ? "registryEmployee.relationship LIKE :relationship" : "1=1", { relationship: `${status}`, }, ) .andWhere( education != null && education != "" ? "registryEmployee.degrees LIKE :degrees" : "1=1", { degrees: `%${education}%`, }, ) .andWhere( educationLevel != null && educationLevel != "" ? "registryEmployee.educationLevels LIKE :educationLevels" : "1=1", { educationLevels: `%${educationLevel}%`, }, ) .andWhere(field != null && field != "" ? "registryEmployee.fields LIKE :fields" : "1=1", { fields: `%${field}%`, }) .orderBy(`registryEmployee.${sortBy}`, sort) .getManyAndCount(); const mapData = []; for await (const x of lists) { let _educations: any = []; if (!education && !educationLevel && !field) { _educations = Array.isArray(x.Educations) && x.Educations != null ? (x.Educations as any[]).filter((i: any) => i.isEducation == true) : []; if (_educations.length == 0) { _educations = Array.isArray(x.Educations) && x.Educations != null ? (x.Educations as any[]).filter((i: any) => i.isHigh == true) : []; } } else { _educations = Array.isArray(x.Educations) && x.Educations != null ? (x.Educations as any[]).filter( (i: any) => (education ? i.degree?.toString().includes(education) : false) || (educationLevel ? i.educationLevel?.toString().includes(educationLevel) : false) || (field ? i.field?.toString().includes(field) : false), ) : []; } mapData.push({ 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, Educations: _educations != null ? _educations : [], // degree: x.degrees, // educationLevel: x.educationLevels, // field: x.fields, age: x.age, currentPosition: null, lengthPosition: null, positionDate: { Years: x.Years ? x.Years : 0, Months: x.Months ? x.Months : 0, Days: x.Days ? x.Days : 0, }, levelDate: { posExecutiveYears: x.levelYears ? x.levelYears : 0, posExecutiveMonths: x.levelMonths ? x.levelMonths : 0, posExecutiveDays: x.levelDays ? x.levelDays : 0, }, }); } return new HttpSuccess({ data: mapData, total: total, }); } /** * API Report1 * * @summary Report1 * */ @Post("report1") async NewReport1( @Body() reqBody: { node: number; nodeId: string; }, ) { let _nodeId: string = reqBody.nodeId ? reqBody.nodeId : ""; let _node: number = reqBody.node ? reqBody.node : 0; if (_nodeId === "" || _node < 0 || _node > 4) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); } let orgName: string = ""; let data = new Array(); let no = 1; switch (_node) { case 0: { // ดึงข้อมูล orgRoot ตาม nodeId และลูกทั้งหมด (cascade 0..4) const orgRootData = await this.orgRootRepository.find({ where: { id: _nodeId }, order: { orgRootOrder: "ASC", posMasters: { posMasterOrder: "ASC", posMasterCreatedAt: "ASC", }, }, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); if (!orgRootData || orgRootData.length === 0) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล orgRoot"); } orgName = orgRootData[0].orgRootName ?? ""; const orgRootIds = orgRootData.map((r) => r.id) || null; const orgChild1Data = await this.child1Repository.find({ where: { orgRootId: In(orgRootIds) }, order: { orgChild1Order: "ASC", posMasters: { posMasterOrder: "ASC", posMasterCreatedAt: "ASC", }, }, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); const orgChild1Ids = orgChild1Data.map((c) => c.id) || null; const orgChild2Data = await this.child2Repository.find({ where: { orgChild1: In(orgChild1Ids) }, order: { orgChild2Order: "ASC", posMasters: { posMasterOrder: "ASC", posMasterCreatedAt: "ASC", }, }, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); const orgChild2Ids = orgChild2Data.map((c) => c.id) || null; const orgChild3Data = await this.child3Repository.find({ where: { orgChild2: In(orgChild2Ids) }, order: { orgChild3Order: "ASC", posMasters: { posMasterOrder: "ASC", posMasterCreatedAt: "ASC", }, }, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); const orgChild3Ids = orgChild3Data.map((c) => c.id) || null; const orgChild4Data = await this.child4Repository.find({ where: { orgChild3: In(orgChild3Ids) }, order: { orgChild4Order: "ASC", posMasters: { posMasterOrder: "ASC", posMasterCreatedAt: "ASC", }, }, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); let _nodeTemp: any = null; for (let orgRoot of orgRootData) { const posMastersFiltered = orgRoot.posMasters .filter((x) => x.orgChild1Id == null) .sort((a, b) => a.posMasterOrder - b.posMasterOrder); for (let posMaster of posMastersFiltered) { if (posMaster.orgChild1Id == null) { const positionName = [ ...new Set( posMaster.positions .sort((a: any, b: any) => a.orderNo - b.orderNo) .map((x) => x.positionArea ? `${x.positionName} (${x.positionArea})` : x.positionName, ), ), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.positionExecutiveField ? `${x.posExecutive.posExecutiveName} (${x.positionExecutiveField})` : x.posExecutive.posExecutiveName, ), ), ]; let node = { orgTreeName: orgRoot.orgRootName, orgTreeShortName: orgRoot.orgRootShortName, posMasterNo: posMaster.posMasterNo, positionName: positionName.join(" หรือ "), posType: posType.join(" หรือ "), posLevel: posLevel.join(" หรือ "), posExecutive: posExecutive.join(" หรือ "), reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_nodeTemp == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName.toString()), posExecutive: Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _nodeTemp.orgTreeShortName || node.orgTreeName != _nodeTemp.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _nodeTemp.orgTreeShortName ? "" : node.orgTreeShortName, posExecutive: node.orgTreeName == _nodeTemp.orgTreeName ? "" : Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); _nodeTemp = null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _nodeTemp = node; } } _nodeTemp = null; for (let orgChild1 of orgChild1Data.filter( (orgChild1) => orgChild1.orgRootId === orgRoot.id, )) { const posMastersFiltered = orgChild1.posMasters .filter((x) => x.orgChild2Id == null) .sort((a, b) => a.posMasterOrder - b.posMasterOrder); for (let posMaster of posMastersFiltered) { if (posMaster.orgChild2Id == null) { const positionName = [ ...new Set( posMaster.positions .sort((a: any, b: any) => a.orderNo - b.orderNo) .map((x) => x.positionArea ? `${x.positionName} (${x.positionArea})` : x.positionName, ), ), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.positionExecutiveField ? `${x.posExecutive.posExecutiveName} (${x.positionExecutiveField})` : x.posExecutive.posExecutiveName, ), ), ]; let node = { orgTreeName: orgChild1.orgChild1Name, orgTreeShortName: orgChild1.orgChild1ShortName, posMasterNo: posMaster.posMasterNo, positionName: positionName.join(" หรือ "), posType: posType.join(" หรือ "), posLevel: posLevel.join(" หรือ "), posExecutive: posExecutive.join(" หรือ "), reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_nodeTemp == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName?.toString() ?? ""), posExecutive: Extension.ToThaiNumber(node.orgTreeName?.toString() ?? ""), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _nodeTemp.orgTreeShortName || node.orgTreeName != _nodeTemp.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _nodeTemp.orgTreeShortName ? "" : node.orgTreeShortName, posExecutive: node.orgTreeName == _nodeTemp.orgTreeName ? "" : Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); _nodeTemp = null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _nodeTemp = node; } } for (let orgChild2 of orgChild2Data.filter( (orgChild2) => orgChild2.orgChild1Id === orgChild1.id, )) { const posMastersFiltered = orgChild2.posMasters .filter((x) => x.orgChild3Id == null) .sort((a, b) => a.posMasterOrder - b.posMasterOrder); for (let posMaster of posMastersFiltered) { if (posMaster.orgChild3Id == null) { const positionName = [ ...new Set( posMaster.positions .sort((a: any, b: any) => a.orderNo - b.orderNo) .map((x) => x.positionArea ? `${x.positionName} (${x.positionArea})` : x.positionName, ), ), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.positionExecutiveField ? `${x.posExecutive.posExecutiveName} (${x.positionExecutiveField})` : x.posExecutive.posExecutiveName, ), ), ]; let node = { orgTreeName: orgChild2.orgChild2Name, orgTreeShortName: orgChild2.orgChild2ShortName, posMasterNo: posMaster.posMasterNo, positionName: positionName.join(" หรือ "), posType: posType.join(" หรือ "), posLevel: posLevel.join(" หรือ "), posExecutive: posExecutive.join(" หรือ "), reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_nodeTemp == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName?.toString() ?? ""), posExecutive: Extension.ToThaiNumber(node.orgTreeName?.toString() ?? ""), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _nodeTemp.orgTreeShortName || node.orgTreeName != _nodeTemp.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _nodeTemp.orgTreeShortName ? "" : node.orgTreeShortName, posExecutive: node.orgTreeName == _nodeTemp.orgTreeName ? "" : Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); _nodeTemp = null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _nodeTemp = node; } } for (let orgChild3 of orgChild3Data.filter( (orgChild3) => orgChild3.orgChild2Id === orgChild2.id, )) { await Promise.all( orgChild3.posMasters .filter((x) => x.orgChild4Id == null) .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { if (posMaster.orgChild4Id == null) { const positionName = [ ...new Set( posMaster.positions .sort((a: any, b: any) => a.orderNo - b.orderNo) .map((x) => x.positionArea ? `${x.positionName} (${x.positionArea})` : x.positionName, ), ), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.positionExecutiveField ? `${x.posExecutive.posExecutiveName} (${x.positionExecutiveField})` : x.posExecutive.posExecutiveName, ), ), ]; let node = { orgTreeName: orgChild3.orgChild3Name, orgTreeShortName: orgChild3.orgChild3ShortName, posMasterNo: posMaster.posMasterNo, positionName: positionName.join(" หรือ "), posType: posType.join(" หรือ "), posLevel: posLevel.join(" หรือ "), posExecutive: posExecutive.join(" หรือ "), reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_nodeTemp == null) { const head = { posMasterNo: Extension.ToThaiNumber( node.orgTreeShortName?.toString() ?? "", ), posExecutive: Extension.ToThaiNumber( node.orgTreeName?.toString() ?? "", ), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _nodeTemp.orgTreeShortName || node.orgTreeName != _nodeTemp.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _nodeTemp.orgTreeShortName ? "" : node.orgTreeShortName, posExecutive: node.orgTreeName == _nodeTemp.orgTreeName ? "" : Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); _nodeTemp = null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _nodeTemp = node; } }), ); for (let orgChild4 of orgChild4Data.filter( (orgChild4) => orgChild4.orgChild3Id === orgChild3.id, )) { await Promise.all( orgChild4.posMasters .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { const positionName = [ ...new Set( posMaster.positions .sort((a: any, b: any) => a.orderNo - b.orderNo) .map((x) => x.positionArea ? `${x.positionName} (${x.positionArea})` : x.positionName, ), ), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.positionExecutiveField ? `${x.posExecutive.posExecutiveName} (${x.positionExecutiveField})` : x.posExecutive.posExecutiveName, ), ), ]; let node = { orgTreeName: orgChild4.orgChild4Name, orgTreeShortName: orgChild4.orgChild4ShortName, posMasterNo: posMaster.posMasterNo, positionName: positionName.join(" หรือ "), posType: posType.join(" หรือ "), posLevel: posLevel.join(" หรือ "), posExecutive: posExecutive.join(" หรือ "), reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_nodeTemp == null) { const head = { posMasterNo: Extension.ToThaiNumber( node.orgTreeShortName?.toString() ?? "", ), posExecutive: Extension.ToThaiNumber( node.orgTreeName?.toString() ?? "", ), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _nodeTemp.orgTreeShortName || node.orgTreeName != _nodeTemp.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _nodeTemp.orgTreeShortName ? "" : node.orgTreeShortName, posExecutive: node.orgTreeName == _nodeTemp.orgTreeName ? "" : Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); _nodeTemp = null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _nodeTemp = node; }), ); } } } } } break; } case 1: { // ดึง orgChild1 และลูก (orgChild2, orgChild3, orgChild4) const orgChild1Data = await this.child1Repository.find({ where: { id: _nodeId }, order: { orgChild1Order: "ASC", posMasters: { posMasterOrder: "ASC", posMasterCreatedAt: "ASC", }, }, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); if (!orgChild1Data || orgChild1Data.length === 0) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล orgChild1"); } orgName = orgChild1Data[0].orgChild1Name ?? ""; // cascade ลูก const orgChild1Ids = orgChild1Data.map((c) => c.id) || null; const orgChild2Data = await this.child2Repository.find({ where: { orgChild1: In(orgChild1Ids) }, order: { orgChild2Order: "ASC", posMasters: { posMasterOrder: "ASC", posMasterCreatedAt: "ASC", }, }, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); const orgChild2Ids = orgChild2Data.map((c) => c.id) || null; const orgChild3Data = await this.child3Repository.find({ where: { orgChild2: In(orgChild2Ids) }, order: { orgChild3Order: "ASC", posMasters: { posMasterOrder: "ASC", posMasterCreatedAt: "ASC", }, }, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); const orgChild3Ids = orgChild3Data.map((c) => c.id) || null; const orgChild4Data = await this.child4Repository.find({ where: { orgChild3: In(orgChild3Ids) }, order: { orgChild4Order: "ASC", posMasters: { posMasterOrder: "ASC", posMasterCreatedAt: "ASC", }, }, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); let _nodeTemp: any = null; for (let orgChild1 of orgChild1Data) { await Promise.all( orgChild1.posMasters .filter((x) => x.orgChild2Id == null) .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { if (posMaster.orgChild2Id == null) { // --- push data logic (เหมือน node 0) --- const positionName = [ ...new Set( posMaster.positions .sort((a: any, b: any) => a.orderNo - b.orderNo) .map((x) => x.positionArea ? `${x.positionName} (${x.positionArea})` : x.positionName, ), ), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.positionExecutiveField ? `${x.posExecutive.posExecutiveName} (${x.positionExecutiveField})` : x.posExecutive.posExecutiveName, ), ), ]; let node = { orgTreeName: orgChild1.orgChild1Name, orgTreeShortName: orgChild1.orgChild1ShortName, posMasterNo: posMaster.posMasterNo, positionName: positionName.join(" หรือ "), posType: posType.join(" หรือ "), posLevel: posLevel.join(" หรือ "), posExecutive: posExecutive.join(" หรือ "), reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_nodeTemp == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName?.toString() ?? ""), posExecutive: Extension.ToThaiNumber(node.orgTreeName?.toString() ?? ""), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _nodeTemp.orgTreeShortName || node.orgTreeName != _nodeTemp.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _nodeTemp.orgTreeShortName ? "" : node.orgTreeShortName, posExecutive: node.orgTreeName == _nodeTemp.orgTreeName ? "" : Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); _nodeTemp = null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _nodeTemp = node; } }), ); for (let orgChild2 of orgChild2Data.filter( (orgChild2) => orgChild2.orgChild1Id === orgChild1.id, )) { await Promise.all( orgChild2.posMasters .filter((x) => x.orgChild3Id == null) .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { if (posMaster.orgChild3Id == null) { // --- push data logic (เหมือน node 0) --- const positionName = [ ...new Set( posMaster.positions .sort((a: any, b: any) => a.orderNo - b.orderNo) .map((x) => x.positionArea ? `${x.positionName} (${x.positionArea})` : x.positionName, ), ), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.positionExecutiveField ? `${x.posExecutive.posExecutiveName} (${x.positionExecutiveField})` : x.posExecutive.posExecutiveName, ), ), ]; let node = { orgTreeName: orgChild2.orgChild2Name, orgTreeShortName: orgChild2.orgChild2ShortName, posMasterNo: posMaster.posMasterNo, positionName: positionName.join(" หรือ "), posType: posType.join(" หรือ "), posLevel: posLevel.join(" หรือ "), posExecutive: posExecutive.join(" หรือ "), reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_nodeTemp == null) { const head = { posMasterNo: Extension.ToThaiNumber( node.orgTreeShortName?.toString() ?? "", ), posExecutive: Extension.ToThaiNumber(node.orgTreeName?.toString() ?? ""), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _nodeTemp.orgTreeShortName || node.orgTreeName != _nodeTemp.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _nodeTemp.orgTreeShortName ? "" : node.orgTreeShortName, posExecutive: node.orgTreeName == _nodeTemp.orgTreeName ? "" : Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); _nodeTemp = null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _nodeTemp = node; } }), ); for (let orgChild3 of orgChild3Data.filter( (orgChild3) => orgChild3.orgChild2Id === orgChild2.id, )) { await Promise.all( orgChild3.posMasters .filter((x) => x.orgChild4Id == null) .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { if (posMaster.orgChild4Id == null) { // --- push data logic (เหมือน node 0) --- const positionName = [ ...new Set( posMaster.positions .sort((a: any, b: any) => a.orderNo - b.orderNo) .map((x) => x.positionArea ? `${x.positionName} (${x.positionArea})` : x.positionName, ), ), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.positionExecutiveField ? `${x.posExecutive.posExecutiveName} (${x.positionExecutiveField})` : x.posExecutive.posExecutiveName, ), ), ]; let node = { orgTreeName: orgChild3.orgChild3Name, orgTreeShortName: orgChild3.orgChild3ShortName, posMasterNo: posMaster.posMasterNo, positionName: positionName.join(" หรือ "), posType: posType.join(" หรือ "), posLevel: posLevel.join(" หรือ "), posExecutive: posExecutive.join(" หรือ "), reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_nodeTemp == null) { const head = { posMasterNo: Extension.ToThaiNumber( node.orgTreeShortName?.toString() ?? "", ), posExecutive: Extension.ToThaiNumber(node.orgTreeName?.toString() ?? ""), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _nodeTemp.orgTreeShortName || node.orgTreeName != _nodeTemp.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _nodeTemp.orgTreeShortName ? "" : node.orgTreeShortName, posExecutive: node.orgTreeName == _nodeTemp.orgTreeName ? "" : Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); _nodeTemp = null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _nodeTemp = node; } }), ); for (let orgChild4 of orgChild4Data.filter( (orgChild4) => orgChild4.orgChild3Id === orgChild3.id, )) { await Promise.all( orgChild4.posMasters .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { // --- push data logic (เหมือน node 0) --- const positionName = [ ...new Set( posMaster.positions .sort((a: any, b: any) => a.orderNo - b.orderNo) .map((x) => x.positionArea ? `${x.positionName} (${x.positionArea})` : x.positionName, ), ), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.positionExecutiveField ? `${x.posExecutive.posExecutiveName} (${x.positionExecutiveField})` : x.posExecutive.posExecutiveName, ), ), ]; let node = { orgTreeName: orgChild4.orgChild4Name, orgTreeShortName: orgChild4.orgChild4ShortName, posMasterNo: posMaster.posMasterNo, positionName: positionName.join(" หรือ "), posType: posType.join(" หรือ "), posLevel: posLevel.join(" หรือ "), posExecutive: posExecutive.join(" หรือ "), reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_nodeTemp == null) { const head = { posMasterNo: Extension.ToThaiNumber( node.orgTreeShortName?.toString() ?? "", ), posExecutive: Extension.ToThaiNumber(node.orgTreeName?.toString() ?? ""), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _nodeTemp.orgTreeShortName || node.orgTreeName != _nodeTemp.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _nodeTemp.orgTreeShortName ? "" : node.orgTreeShortName, posExecutive: node.orgTreeName == _nodeTemp.orgTreeName ? "" : Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); _nodeTemp = null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _nodeTemp = node; }), ); } } } } break; } case 2: { // ดึง orgChild2 และลูก (orgChild3, orgChild4) const orgChild2Data = await this.child2Repository.find({ where: { id: _nodeId, }, order: { orgChild2Order: "ASC", posMasters: { posMasterOrder: "ASC", posMasterCreatedAt: "ASC", }, }, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); if (!orgChild2Data || orgChild2Data.length === 0) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล orgChild2"); } orgName = orgChild2Data[0].orgChild2Name ?? ""; // cascade ลูก const orgChild2Ids = orgChild2Data.map((c) => c.id) || null; const orgChild3Data = await this.child3Repository.find({ where: { orgChild2: In(orgChild2Ids) }, order: { orgChild3Order: "ASC", posMasters: { posMasterOrder: "ASC", posMasterCreatedAt: "ASC", }, }, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); const orgChild3Ids = orgChild3Data.map((c) => c.id) || null; const orgChild4Data = await this.child4Repository.find({ where: { orgChild3: In(orgChild3Ids) }, order: { orgChild4Order: "ASC", posMasters: { posMasterOrder: "ASC", posMasterCreatedAt: "ASC", }, }, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); let _nodeTemp: any = null; for (let orgChild2 of orgChild2Data) { await Promise.all( orgChild2.posMasters .filter((x) => x.orgChild3Id == null) .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { if (posMaster.orgChild3Id == null) { // --- push data logic (เหมือน node 0) --- const positionName = [ ...new Set( posMaster.positions .sort((a: any, b: any) => a.orderNo - b.orderNo) .map((x) => x.positionArea ? `${x.positionName} (${x.positionArea})` : x.positionName, ), ), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.positionExecutiveField ? `${x.posExecutive.posExecutiveName} (${x.positionExecutiveField})` : x.posExecutive.posExecutiveName, ), ), ]; let node = { orgTreeName: orgChild2.orgChild2Name, orgTreeShortName: orgChild2.orgChild2ShortName, posMasterNo: posMaster.posMasterNo, positionName: positionName.join(" หรือ "), posType: posType.join(" หรือ "), posLevel: posLevel.join(" หรือ "), posExecutive: posExecutive.join(" หรือ "), reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_nodeTemp == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName?.toString() ?? ""), posExecutive: Extension.ToThaiNumber(node.orgTreeName?.toString() ?? ""), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _nodeTemp.orgTreeShortName || node.orgTreeName != _nodeTemp.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _nodeTemp.orgTreeShortName ? "" : node.orgTreeShortName, posExecutive: node.orgTreeName == _nodeTemp.orgTreeName ? "" : Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); _nodeTemp = null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _nodeTemp = node; } }), ); for (let orgChild3 of orgChild3Data.filter( (orgChild3) => orgChild3.orgChild2Id === orgChild2.id, )) { await Promise.all( orgChild3.posMasters .filter((x) => x.orgChild4Id == null) .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { if (posMaster.orgChild4Id == null) { // --- push data logic (เหมือน node 0) --- const positionName = [ ...new Set( posMaster.positions .sort((a: any, b: any) => a.orderNo - b.orderNo) .map((x) => x.positionArea ? `${x.positionName} (${x.positionArea})` : x.positionName, ), ), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.positionExecutiveField ? `${x.posExecutive.posExecutiveName} (${x.positionExecutiveField})` : x.posExecutive.posExecutiveName, ), ), ]; let node = { orgTreeName: orgChild3.orgChild3Name, orgTreeShortName: orgChild3.orgChild3ShortName, posMasterNo: posMaster.posMasterNo, positionName: positionName.join(" หรือ "), posType: posType.join(" หรือ "), posLevel: posLevel.join(" หรือ "), posExecutive: posExecutive.join(" หรือ "), reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_nodeTemp == null) { const head = { posMasterNo: Extension.ToThaiNumber( node.orgTreeShortName?.toString() ?? "", ), posExecutive: Extension.ToThaiNumber(node.orgTreeName?.toString() ?? ""), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _nodeTemp.orgTreeShortName || node.orgTreeName != _nodeTemp.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _nodeTemp.orgTreeShortName ? "" : node.orgTreeShortName, posExecutive: node.orgTreeName == _nodeTemp.orgTreeName ? "" : Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); _nodeTemp = null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _nodeTemp = node; } }), ); for (let orgChild4 of orgChild4Data.filter( (orgChild4) => orgChild4.orgChild3Id === orgChild3.id, )) { await Promise.all( orgChild4.posMasters .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { // --- push data logic (เหมือน node 0) --- const positionName = [ ...new Set( posMaster.positions .sort((a: any, b: any) => a.orderNo - b.orderNo) .map((x) => x.positionArea ? `${x.positionName} (${x.positionArea})` : x.positionName, ), ), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.positionExecutiveField ? `${x.posExecutive.posExecutiveName} (${x.positionExecutiveField})` : x.posExecutive.posExecutiveName, ), ), ]; let node = { orgTreeName: orgChild4.orgChild4Name, orgTreeShortName: orgChild4.orgChild4ShortName, posMasterNo: posMaster.posMasterNo, positionName: positionName.join(" หรือ "), posType: posType.join(" หรือ "), posLevel: posLevel.join(" หรือ "), posExecutive: posExecutive.join(" หรือ "), reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_nodeTemp == null) { const head = { posMasterNo: Extension.ToThaiNumber( node.orgTreeShortName?.toString() ?? "", ), posExecutive: Extension.ToThaiNumber(node.orgTreeName?.toString() ?? ""), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _nodeTemp.orgTreeShortName || node.orgTreeName != _nodeTemp.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _nodeTemp.orgTreeShortName ? "" : node.orgTreeShortName, posExecutive: node.orgTreeName == _nodeTemp.orgTreeName ? "" : Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); _nodeTemp = null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _nodeTemp = node; }), ); } } } break; } case 3: { // ดึง orgChild3 และลูก (orgChild4) const orgChild3Data = await this.child3Repository.find({ where: { id: _nodeId }, order: { orgChild3Order: "ASC", posMasters: { posMasterOrder: "ASC", posMasterCreatedAt: "ASC", }, }, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); if (!orgChild3Data || orgChild3Data.length === 0) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล orgChild3"); } orgName = orgChild3Data[0].orgChild3Name ?? ""; // cascade ลูก const orgChild3Ids = orgChild3Data.map((c) => c.id) || null; const orgChild4Data = await this.child4Repository.find({ where: { orgChild3: In(orgChild3Ids) }, order: { orgChild4Order: "ASC", posMasters: { posMasterOrder: "ASC", posMasterCreatedAt: "ASC", }, }, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); let _nodeTemp: any = null; for (let orgChild3 of orgChild3Data) { await Promise.all( orgChild3.posMasters .filter((x) => x.orgChild4Id == null) .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { if (posMaster.orgChild4Id == null) { // --- push data logic (เหมือน node 0) --- const positionName = [ ...new Set( posMaster.positions .sort((a: any, b: any) => a.orderNo - b.orderNo) .map((x) => x.positionArea ? `${x.positionName} (${x.positionArea})` : x.positionName, ), ), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.positionExecutiveField ? `${x.posExecutive.posExecutiveName} (${x.positionExecutiveField})` : x.posExecutive.posExecutiveName, ), ), ]; let node = { orgTreeName: orgChild3.orgChild3Name, orgTreeShortName: orgChild3.orgChild3ShortName, posMasterNo: posMaster.posMasterNo, positionName: positionName.join(" หรือ "), posType: posType.join(" หรือ "), posLevel: posLevel.join(" หรือ "), posExecutive: posExecutive.join(" หรือ "), reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_nodeTemp == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName?.toString() ?? ""), posExecutive: Extension.ToThaiNumber(node.orgTreeName?.toString() ?? ""), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _nodeTemp.orgTreeShortName || node.orgTreeName != _nodeTemp.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _nodeTemp.orgTreeShortName ? "" : node.orgTreeShortName, posExecutive: node.orgTreeName == _nodeTemp.orgTreeName ? "" : Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); _nodeTemp = null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _nodeTemp = node; } }), ); for (let orgChild4 of orgChild4Data.filter( (orgChild4) => orgChild4.orgChild3Id === orgChild3.id, )) { await Promise.all( orgChild4.posMasters .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { // --- push data logic (เหมือน node 0) --- const positionName = [ ...new Set( posMaster.positions .sort((a: any, b: any) => a.orderNo - b.orderNo) .map((x) => x.positionArea ? `${x.positionName} (${x.positionArea})` : x.positionName, ), ), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.positionExecutiveField ? `${x.posExecutive.posExecutiveName} (${x.positionExecutiveField})` : x.posExecutive.posExecutiveName, ), ), ]; let node = { orgTreeName: orgChild4.orgChild4Name, orgTreeShortName: orgChild4.orgChild4ShortName, posMasterNo: posMaster.posMasterNo, positionName: positionName.join(" หรือ "), posType: posType.join(" หรือ "), posLevel: posLevel.join(" หรือ "), posExecutive: posExecutive.join(" หรือ "), reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_nodeTemp == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName?.toString() ?? ""), posExecutive: Extension.ToThaiNumber(node.orgTreeName?.toString() ?? ""), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _nodeTemp.orgTreeShortName || node.orgTreeName != _nodeTemp.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _nodeTemp.orgTreeShortName ? "" : node.orgTreeShortName, posExecutive: node.orgTreeName == _nodeTemp.orgTreeName ? "" : Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); _nodeTemp = null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _nodeTemp = node; }), ); } } break; } case 4: { // ดึงข้อมูล orgChild4 ตาม nodeId const orgChild4Data = await this.child4Repository.find({ where: { id: _nodeId }, order: { orgChild4Order: "ASC", posMasters: { posMasterOrder: "ASC", posMasterCreatedAt: "ASC", }, }, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); if (!orgChild4Data || orgChild4Data.length === 0) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล orgChild4"); } orgName = orgChild4Data[0].orgChild4Name ?? ""; let _nodeTemp: any = null; for (let orgChild4 of orgChild4Data) { await Promise.all( orgChild4.posMasters .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { const positionName = [ ...new Set( posMaster.positions .sort((a: any, b: any) => a.orderNo - b.orderNo) .map((x) => x.positionArea ? `${x.positionName} (${x.positionArea})` : x.positionName, ), ), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.positionExecutiveField ? `${x.posExecutive.posExecutiveName} (${x.positionExecutiveField})` : x.posExecutive.posExecutiveName, ), ), ]; let node = { orgTreeName: orgChild4.orgChild4Name, orgTreeShortName: orgChild4.orgChild4ShortName, posMasterNo: posMaster.posMasterNo, positionName: positionName.join(" หรือ "), posType: posType.join(" หรือ "), posLevel: posLevel.join(" หรือ "), posExecutive: posExecutive.join(" หรือ "), reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_nodeTemp == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName?.toString() ?? ""), posExecutive: Extension.ToThaiNumber(node.orgTreeName?.toString() ?? ""), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _nodeTemp.orgTreeShortName || node.orgTreeName != _nodeTemp.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _nodeTemp.orgTreeShortName ? "" : node.orgTreeShortName, posExecutive: node.orgTreeName == _nodeTemp.orgTreeName ? "" : Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); _nodeTemp = null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _nodeTemp = node; }), ); } break; } default: { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); } } return new HttpSuccess({ template: "report1", reportName: "report1", data: { org: orgName, data }, }); } /** * API Report1 * * @summary Report1 * */ @Get("report1/{rootId}") async findReport1(@Path() rootId: string) { // const orgRevision = await this.orgRevisionRepository.findOne({ // where: { orgRevisionIsDraft: true, orgRevisionIsCurrent: false }, // relations: ["orgRoots"], // }); // if (!orgRevision) { // throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); // } const orgRootData = await this.orgRootRepository.find({ where: { id: rootId, // orgRevisionId: orgRevision.id, }, order: { orgRootOrder: "ASC" }, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); const orgName = orgRootData[0].orgRootName ?? ""; const orgRootIds = orgRootData.map((orgRoot) => orgRoot.id) || null; const orgChild1Data = await this.child1Repository.find({ where: { orgRootId: In(orgRootIds), }, order: { orgChild1Order: "ASC" }, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); const orgChild1Ids = orgChild1Data.map((orgChild1) => orgChild1.id) || null; const orgChild2Data = await this.child2Repository.find({ where: { orgChild1: In(orgChild1Ids), }, order: { orgChild2Order: "ASC" }, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); const orgChild2Ids = orgChild2Data.map((orgChild2) => orgChild2.id) || null; const orgChild3Data = await this.child3Repository.find({ where: { orgChild2: In(orgChild2Ids), }, order: { orgChild3Order: "ASC" }, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); const orgChild3Ids = orgChild3Data.map((orgChild3) => orgChild3.id) || null; const orgChild4Data = await this.child4Repository.find({ where: { orgChild3: In(orgChild3Ids), }, order: { orgChild4Order: "ASC" }, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); let data = new Array(); let _node: any; let no = 1; for (let orgRoot of orgRootData) { await Promise.all( orgRoot.posMasters .filter((x) => x.orgChild1Id == null) .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { if (posMaster.orgChild1Id == null) { const positionName = [ ...new Set( posMaster.positions .sort((a: any, b: any) => a.orderNo - b.orderNo) .map((x) => x.positionArea ? `${x.positionName} (${x.positionArea})` : x.positionName, ), ), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.positionExecutiveField ? `${x.posExecutive.posExecutiveName} (${x.positionExecutiveField})` : x.posExecutive.posExecutiveName, ), ), ]; let node = { orgTreeName: orgRoot.orgRootName, orgTreeShortName: orgRoot.orgRootShortName, posMasterNo: posMaster.posMasterNo, positionName: positionName.join(" หรือ "), posType: posType.join(" หรือ "), posLevel: posLevel.join(" หรือ "), posExecutive: posExecutive.join(" หรือ "), reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_node == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName.toString()), posExecutive: Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _node.orgTreeShortName || node.orgTreeName != _node.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _node.orgTreeShortName ? "" : node.orgTreeShortName, posExecutive: node.orgTreeName == _node.orgTreeName ? "" : Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); _node == null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _node = node; } }), ); _node = null; for (let orgChild1 of orgChild1Data.filter( (orgChild1) => orgChild1.orgRootId === orgRoot.id, )) { await Promise.all( orgChild1.posMasters .filter((x) => x.orgChild2Id == null) .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { if (posMaster.orgChild2Id == null) { const positionName = [ ...new Set( posMaster.positions .sort((a: any, b: any) => a.orderNo - b.orderNo) .map((x) => x.positionArea ? `${x.positionName} (${x.positionArea})` : x.positionName, ), ), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.positionExecutiveField ? `${x.posExecutive.posExecutiveName} (${x.positionExecutiveField})` : x.posExecutive.posExecutiveName, ), ), ]; let node = { orgTreeName: orgChild1.orgChild1Name, orgTreeShortName: orgChild1.orgChild1ShortName, posMasterNo: posMaster.posMasterNo, positionName: positionName.join(" หรือ "), posType: posType.join(" หรือ "), posLevel: posLevel.join(" หรือ "), posExecutive: posExecutive.join(" หรือ "), reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_node == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName.toString()), posExecutive: Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _node.orgTreeShortName || node.orgTreeName != _node.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _node.orgTreeShortName ? "" : node.orgTreeShortName, posExecutive: node.orgTreeName == _node.orgTreeName ? "" : Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); _node == null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _node = node; } }), ); _node = null; for (let orgChild2 of orgChild2Data.filter( (orgChild2) => orgChild2.orgChild1Id === orgChild1.id, )) { await Promise.all( orgChild2.posMasters .filter((x) => x.orgChild3Id == null) .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { if (posMaster.orgChild3Id == null) { const positionName = [ ...new Set( posMaster.positions .sort((a: any, b: any) => a.orderNo - b.orderNo) .map((x) => x.positionArea ? `${x.positionName} (${x.positionArea})` : x.positionName, ), ), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.positionExecutiveField ? `${x.posExecutive.posExecutiveName} (${x.positionExecutiveField})` : x.posExecutive.posExecutiveName, ), ), ]; let node = { orgTreeName: orgChild2.orgChild2Name, orgTreeShortName: orgChild2.orgChild2ShortName, posMasterNo: posMaster.posMasterNo, posExecutive: posExecutive.join(" หรือ "), positionName: positionName.join(" หรือ "), posType: posType.join(" หรือ "), posLevel: posLevel.join(" หรือ "), reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_node == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName.toString()), posExecutive: Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _node.orgTreeShortName || node.orgTreeName != _node.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _node.orgTreeShortName ? "" : node.orgTreeShortName, posExecutive: node.orgTreeName == _node.orgTreeName ? "" : node.orgTreeName, positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); _node == null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _node = node; } }), ); _node = null; for (let orgChild3 of orgChild3Data.filter( (orgChild3) => orgChild3.orgChild2Id === orgChild2.id, )) { await Promise.all( orgChild3.posMasters .filter((x) => x.orgChild4Id == null) .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { if (posMaster.orgChild4Id == null) { const positionName = [ ...new Set( posMaster.positions .sort((a: any, b: any) => a.orderNo - b.orderNo) .map((x) => x.positionArea ? `${x.positionName} (${x.positionArea})` : x.positionName, ), ), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.positionExecutiveField ? `${x.posExecutive.posExecutiveName} (${x.positionExecutiveField})` : x.posExecutive.posExecutiveName, ), ), ]; let node = { orgTreeName: orgChild3.orgChild3Name, orgTreeShortName: orgChild3.orgChild3ShortName, posMasterNo: posMaster.posMasterNo, positionName: positionName.join(" หรือ "), posType: posType.join(" หรือ "), posLevel: posLevel.join(" หรือ "), posExecutive: posExecutive.join(" หรือ "), reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_node == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName.toString()), posExecutive: Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _node.orgTreeShortName || node.orgTreeName != _node.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _node.orgTreeShortName ? "" : node.orgTreeShortName, posExecutive: node.orgTreeName == _node.orgTreeName ? "" : node.orgTreeName, positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); _node == null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _node = node; } }), ); _node = null; for (let orgChild4 of orgChild4Data.filter( (orgChild4) => orgChild4.orgChild3Id === orgChild3.id, )) { await Promise.all( orgChild4.posMasters .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { const positionName = [ ...new Set( posMaster.positions .sort((a: any, b: any) => a.orderNo - b.orderNo) .map((x) => x.positionArea ? `${x.positionName} (${x.positionArea})` : x.positionName, ), ), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.positionExecutiveField ? `${x.posExecutive.posExecutiveName} (${x.positionExecutiveField})` : x.posExecutive.posExecutiveName, ), ), ]; let node = { orgTreeName: orgChild4.orgChild4Name, orgTreeShortName: orgChild4.orgChild4ShortName, posMasterNo: posMaster.posMasterNo, positionName: positionName.join(" หรือ "), posType: posType.join(" หรือ "), posLevel: posLevel.join(" หรือ "), posExecutive: posExecutive.join(" หรือ "), reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_node == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName.toString()), posExecutive: Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _node.orgTreeShortName || node.orgTreeName != _node.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _node.orgTreeShortName ? "" : node.orgTreeShortName, posExecutive: node.orgTreeName == _node.orgTreeName ? "" : node.orgTreeName, positionName: "", posType: "", posLevel: "", reason: "", }; data.push(head); _node == null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), posExecutive: Extension.ToThaiNumber(node.posExecutive.toString()), positionName: Extension.ToThaiNumber(node.positionName.toString()), posType: Extension.ToThaiNumber(node.posType.toString()), posLevel: Extension.ToThaiNumber(node.posLevel.toString()), reason: Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _node = node; }), ); _node = null; } } } } } return new HttpSuccess({ template: "report1", reportName: "report1", data: { org: orgName, data }, }); } /** * API Report2 * * @summary Report2 * */ @Post("report2") async NewReport2( @Body() reqBody: { node: number; nodeId: string; }, ) { // @Get("report2/{rootId}") // async findReport2(@Path() rootId: string) { // const orgRevision = await this.orgRevisionRepository.findOne({ // where: { orgRevisionIsDraft: true, orgRevisionIsCurrent: false }, // relations: ["orgRoots"], // }); // if (!orgRevision) { // throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); // } // (async () => { let nodeId: string = reqBody.nodeId ? reqBody.nodeId : ""; let node: number = reqBody.node ? reqBody.node : 0; if (nodeId === "" || node < 0 || node > 4) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); } // ดึงแค่ rootId ก่อน ถ้าลูกค้า confirm ค่อยปรับ switch (node) { case 0: { const orgRoot = await this.orgRootRepository.findOne({ select: ["id"], where: { id: nodeId }, }); if (!orgRoot) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); nodeId = orgRoot.id; break; } case 1: { const orgChild1 = await this.child1Repository.findOne({ select: ["id", "orgRootId"], where: { id: nodeId }, }); if (!orgChild1) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); nodeId = orgChild1.orgRootId; break; } case 2: { const orgChild2 = await this.child2Repository.findOne({ select: ["id", "orgRootId"], where: { id: nodeId }, }); if (!orgChild2) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); nodeId = orgChild2.orgRootId; break; } case 3: { const orgChild3 = await this.child3Repository.findOne({ select: ["id", "orgRootId"], where: { id: nodeId }, }); if (!orgChild3) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); nodeId = orgChild3.orgRootId; break; } case 4: { const orgChild4 = await this.child4Repository.findOne({ select: ["id", "orgRootId"], where: { id: nodeId }, }); if (!orgChild4) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); nodeId = orgChild4.orgRootId; break; } default: throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); } // Step 1: ดึงข้อมูล OrgRoot พื้นฐาน const orgRootData = await this.orgRootRepository .createQueryBuilder("orgRoot") .select([ "orgRoot.id", "orgRoot.orgRootName", "orgRoot.orgRootShortName", "orgRoot.orgRootOrder", ]) .where("orgRoot.id = :nodeId", { nodeId }) .orderBy("orgRoot.orgRootOrder", "ASC") .getMany(); if (!orgRootData || orgRootData.length === 0) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลองค์กร"); } // Step 2: ดึงข้อมูล PosMasters ที่เกี่ยวข้องเท่านั้น const posMastersData = await this.posMasterRepository .createQueryBuilder("posMaster") .select([ "posMaster.id", "posMaster.posMasterOrder", "posMaster.isSit", "posMaster.posMasterNo", "posMaster.ancestorDNA", "posMaster.reason", "posMaster.orgRootId", "posMaster.orgChild1Id", "posMaster.current_holderId", "posMaster.next_holderId", ]) .where("posMaster.orgRootId = :nodeId", { nodeId }) .andWhere("posMaster.orgChild1Id IS NULL") // เฉพาะ root level .orderBy("posMaster.posMasterOrder", "ASC") .addOrderBy("posMaster.posMasterCreatedAt", "ASC") .getMany(); // Step 3: ดึงข้อมูล Profiles ที่ใช้จริงเท่านั้น const profileIds = [ ...new Set([ ...posMastersData.map((pm: any) => pm.current_holderId).filter(Boolean), ...posMastersData.map((pm: any) => pm.next_holderId).filter(Boolean), ]), ]; let profilesData: any[] = []; if (profileIds.length > 0) { profilesData = await this.profileRepository .createQueryBuilder("profile") .select([ "profile.id", "profile.prefix", "profile.firstName", "profile.lastName", "profile.position", "profile.posTypeId", "profile.posLevelId", ]) .where("profile.id IN (:...profileIds)", { profileIds }) .getMany(); } // Step 4: ดึงข้อมูล Education ล่าสุดของแต่ละ Profile let educationsData: any[] = []; if (profileIds.length > 0) { educationsData = await this.profileEducationRepository .createQueryBuilder("pe") .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level"]) .where("pe.profileId IN (:...profileIds)", { profileIds }) .andWhere( `(pe.profileId, COALESCE(pe.finishDate, '1900-01-01'), pe.level) IN ( SELECT pe2.profileId, COALESCE(MAX(pe2.finishDate), '1900-01-01'), CASE WHEN MAX(pe2.finishDate) IS NOT NULL THEN (SELECT pe3.level FROM profileEducation pe3 WHERE pe3.profileId = pe2.profileId AND pe3.finishDate = MAX(pe2.finishDate) LIMIT 1) ELSE MAX(pe2.level) END FROM profileEducation pe2 WHERE pe2.profileId IN (:...profileIds) GROUP BY pe2.profileId )`, { profileIds }, ) .getMany(); } // Step 5: ดึงข้อมูล Salary ล่าสุดของแต่ละ Profile let salariesData: any[] = []; if (profileIds.length > 0) { salariesData = await this.profileSalaryRepository .createQueryBuilder("ps") .select(["ps.profileId", "ps.commandDateAffect", "ps.amount"]) .where("ps.profileId IN (:...profileIds)", { profileIds }) .andWhere( `(ps.profileId, ps.commandDateAffect) IN ( SELECT ps2.profileId, MAX(ps2.commandDateAffect) FROM profileSalary ps2 WHERE ps2.profileId IN (:...profileIds) GROUP BY ps2.profileId )`, { profileIds }, ) .getMany(); } // Step 6: ดึงข้อมูล Positions ที่เกี่ยวข้อง const posMasterIds = posMastersData.map((pm: any) => pm.id); let positionsData: any[] = []; if (posMasterIds.length > 0) { positionsData = await this.positionRepository .createQueryBuilder("position") .leftJoinAndSelect("position.posType", "posType") .leftJoinAndSelect("position.posLevel", "posLevel") .leftJoinAndSelect("position.posExecutive", "posExecutive") .select([ "position.id", "position.positionName", "position.positionIsSelected", "position.posMasterId", "posType.id", "posType.posTypeName", "posLevel.id", "posLevel.posLevelName", "posExecutive.id", "posExecutive.posExecutiveName", ]) .where("position.posMasterId IN (:...posMasterIds)", { posMasterIds }) .getMany(); } // Step 7: Combine ข้อมูลกลับเหมือนเดิม for (let orgRoot of orgRootData) { orgRoot.posMasters = posMastersData.filter((pm: any) => pm.orgRootId === orgRoot.id); for (let posMaster of orgRoot.posMasters) { // Attach current_holder if (posMaster.current_holderId) { posMaster.current_holder = profilesData.find( (p: any) => p.id === posMaster.current_holderId, ); if (posMaster.current_holder) { posMaster.current_holder.profileEducations = educationsData.filter( (ed: any) => ed.profileId === posMaster.current_holderId, ); posMaster.current_holder.profileSalary = salariesData.filter( (sal: any) => sal.profileId === posMaster.current_holderId, ); } } // Attach next_holder if (posMaster.next_holderId) { posMaster.next_holder = profilesData.find((p: any) => p.id === posMaster.next_holderId); if (posMaster.next_holder) { posMaster.next_holder.profileEducations = educationsData.filter( (ed: any) => ed.profileId === posMaster.next_holderId, ); posMaster.next_holder.profileSalary = salariesData.filter( (sal: any) => sal.profileId === posMaster.next_holderId, ); } } // Attach positions posMaster.positions = positionsData.filter((pos: any) => pos.posMasterId === posMaster.id); } } if (!orgRootData || orgRootData.length === 0) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลองค์กร"); } const orgName = orgRootData[0].orgRootName ?? ""; const orgRootIds = orgRootData.map((orgRoot) => orgRoot.id) || null; // Step 8: ปรับปรุง orgChild1Data - ใช้ optimized approach const orgChild1Data = await this.child1Repository .createQueryBuilder("orgChild1") .select([ "orgChild1.id", "orgChild1.orgRootId", "orgChild1.orgChild1Name", "orgChild1.orgChild1ShortName", "orgChild1.orgChild1Order", ]) .where("orgChild1.orgRootId IN (:...orgRootIds)", { orgRootIds }) .orderBy("orgChild1.orgChild1Order", "ASC") .getMany(); // ดึงข้อมูล PosMasters สำหรับ orgChild1 const orgChild1Ids = orgChild1Data.map((orgChild1) => orgChild1.id); let child1PosMasters: any[] = []; if (orgChild1Ids.length > 0) { child1PosMasters = await this.posMasterRepository .createQueryBuilder("posMaster") .select([ "posMaster.id", "posMaster.posMasterOrder", "posMaster.isSit", "posMaster.posMasterNo", "posMaster.ancestorDNA", "posMaster.reason", "posMaster.orgChild1Id", "posMaster.orgChild2Id", "posMaster.current_holderId", "posMaster.next_holderId", ]) .where("posMaster.orgChild1Id IN (:...orgChild1Ids)", { orgChild1Ids }) .andWhere("posMaster.orgChild2Id IS NULL") // เฉพาะ child1 level .orderBy("posMaster.posMasterOrder", "ASC") .addOrderBy("posMaster.posMasterCreatedAt", "ASC") .getMany(); } // รวบรวม Profile IDs สำหรับ child1 const child1ProfileIds = child1PosMasters.length > 0 ? [ ...new Set([ ...child1PosMasters.map((pm: any) => pm.current_holderId).filter(Boolean), ...child1PosMasters.map((pm: any) => pm.next_holderId).filter(Boolean), ]), ] : []; // ดึงข้อมูล Profiles, Education, Salary, Positions สำหรับ child1 let child1Profiles: any[] = []; let child1Educations: any[] = []; let child1Salaries: any[] = []; let child1Positions: any[] = []; if (child1ProfileIds.length > 0) { [child1Profiles, child1Educations, child1Salaries] = await Promise.all([ this.profileRepository .createQueryBuilder("profile") .select([ "profile.id", "profile.prefix", "profile.firstName", "profile.lastName", "profile.position", "profile.posTypeId", "profile.posLevelId", ]) .where("profile.id IN (:...child1ProfileIds)", { child1ProfileIds }) .getMany(), this.profileEducationRepository .createQueryBuilder("pe") .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level"]) .where("pe.profileId IN (:...child1ProfileIds)", { child1ProfileIds }) .andWhere( `(pe.profileId, COALESCE(pe.finishDate, '1900-01-01'), pe.level) IN ( SELECT pe2.profileId, COALESCE(MAX(pe2.finishDate), '1900-01-01'), CASE WHEN MAX(pe2.finishDate) IS NOT NULL THEN (SELECT pe3.level FROM profileEducation pe3 WHERE pe3.profileId = pe2.profileId AND pe3.finishDate = MAX(pe2.finishDate) LIMIT 1) ELSE MAX(pe2.level) END FROM profileEducation pe2 WHERE pe2.profileId IN (:...child1ProfileIds) GROUP BY pe2.profileId )`, { child1ProfileIds }, ) .getMany(), this.profileSalaryRepository .createQueryBuilder("ps") .select(["ps.profileId", "ps.commandDateAffect", "ps.amount"]) .where("ps.profileId IN (:...child1ProfileIds)", { child1ProfileIds }) .andWhere( `(ps.profileId, ps.commandDateAffect) IN ( SELECT ps2.profileId, MAX(ps2.commandDateAffect) FROM profileSalary ps2 WHERE ps2.profileId IN (:...child1ProfileIds) GROUP BY ps2.profileId )`, { child1ProfileIds }, ) .getMany(), ]); } if (child1PosMasters.length > 0) { const child1PosMasterIds = child1PosMasters.map((pm: any) => pm.id); child1Positions = await this.positionRepository .createQueryBuilder("position") .leftJoinAndSelect("position.posType", "posType") .leftJoinAndSelect("position.posLevel", "posLevel") .leftJoinAndSelect("position.posExecutive", "posExecutive") .select([ "position.id", "position.positionName", "position.positionIsSelected", "position.posMasterId", "posType.id", "posType.posTypeName", "posLevel.id", "posLevel.posLevelName", "posExecutive.id", "posExecutive.posExecutiveName", ]) .where("position.posMasterId IN (:...child1PosMasterIds)", { child1PosMasterIds }) .getMany(); } // Combine ข้อมูล orgChild1 for (let orgChild1 of orgChild1Data) { orgChild1.posMasters = child1PosMasters.filter((pm: any) => pm.orgChild1Id === orgChild1.id); for (let posMaster of orgChild1.posMasters) { if (posMaster.current_holderId) { posMaster.current_holder = child1Profiles.find( (p: any) => p.id === posMaster.current_holderId, ); if (posMaster.current_holder) { posMaster.current_holder.profileEducations = child1Educations.filter( (ed: any) => ed.profileId === posMaster.current_holderId, ); posMaster.current_holder.profileSalary = child1Salaries.filter( (sal: any) => sal.profileId === posMaster.current_holderId, ); } } if (posMaster.next_holderId) { posMaster.next_holder = child1Profiles.find((p: any) => p.id === posMaster.next_holderId); if (posMaster.next_holder) { posMaster.next_holder.profileEducations = child1Educations.filter( (ed: any) => ed.profileId === posMaster.next_holderId, ); posMaster.next_holder.profileSalary = child1Salaries.filter( (sal: any) => sal.profileId === posMaster.next_holderId, ); } } posMaster.positions = child1Positions.filter( (pos: any) => pos.posMasterId === posMaster.id, ); } } // Step 9: ปรับปรุง orgChild2Data const originalOrgChild1Ids = orgChild1Data.length > 0 ? orgChild1Data.map((orgChild1) => orgChild1.id) : []; const orgChild2Data = await this.child2Repository .createQueryBuilder("orgChild2") .select([ "orgChild2.id", "orgChild2.orgChild1Id", "orgChild2.orgChild2Name", "orgChild2.orgChild2ShortName", "orgChild2.orgChild2Order", ]) .where( originalOrgChild1Ids.length > 0 ? "orgChild2.orgChild1Id IN (:...originalOrgChild1Ids)" : "1=0", { originalOrgChild1Ids, }, ) .orderBy("orgChild2.orgChild2Order", "ASC") .getMany(); // ดึงข้อมูล PosMasters สำหรับ orgChild2 const orgChild2Ids = orgChild2Data.map((orgChild2) => orgChild2.id); let child2PosMasters: any[] = []; if (orgChild2Ids.length > 0) { child2PosMasters = await this.posMasterRepository .createQueryBuilder("posMaster") .select([ "posMaster.id", "posMaster.posMasterOrder", "posMaster.isSit", "posMaster.posMasterNo", "posMaster.ancestorDNA", "posMaster.reason", "posMaster.orgChild2Id", "posMaster.orgChild3Id", "posMaster.current_holderId", "posMaster.next_holderId", ]) .where("posMaster.orgChild2Id IN (:...orgChild2Ids)", { orgChild2Ids }) .andWhere("posMaster.orgChild3Id IS NULL") // เฉพาะ child2 level .orderBy("posMaster.posMasterOrder", "ASC") .addOrderBy("posMaster.posMasterCreatedAt", "ASC") .getMany(); } // รวบรวม Profile IDs สำหรับ child2 const child2ProfileIds = child2PosMasters.length > 0 ? [ ...new Set([ ...child2PosMasters.map((pm: any) => pm.current_holderId).filter(Boolean), ...child2PosMasters.map((pm: any) => pm.next_holderId).filter(Boolean), ]), ] : []; // ดึงข้อมูล Profiles, Education, Salary, Positions สำหรับ child2 let child2Profiles: any[] = []; let child2Educations: any[] = []; let child2Salaries: any[] = []; let child2Positions: any[] = []; if (child2ProfileIds.length > 0) { [child2Profiles, child2Educations, child2Salaries] = await Promise.all([ this.profileRepository .createQueryBuilder("profile") .select([ "profile.id", "profile.prefix", "profile.firstName", "profile.lastName", "profile.position", "profile.posTypeId", "profile.posLevelId", ]) .where("profile.id IN (:...child2ProfileIds)", { child2ProfileIds }) .getMany(), this.profileEducationRepository .createQueryBuilder("pe") .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level"]) .where("pe.profileId IN (:...child2ProfileIds)", { child2ProfileIds }) .andWhere( `(pe.profileId, COALESCE(pe.finishDate, '1900-01-01'), pe.level) IN ( SELECT pe2.profileId, COALESCE(MAX(pe2.finishDate), '1900-01-01'), CASE WHEN MAX(pe2.finishDate) IS NOT NULL THEN (SELECT pe3.level FROM profileEducation pe3 WHERE pe3.profileId = pe2.profileId AND pe3.finishDate = MAX(pe2.finishDate) LIMIT 1) ELSE MAX(pe2.level) END FROM profileEducation pe2 WHERE pe2.profileId IN (:...child2ProfileIds) GROUP BY pe2.profileId )`, { child2ProfileIds }, ) .getMany(), this.profileSalaryRepository .createQueryBuilder("ps") .select(["ps.profileId", "ps.commandDateAffect", "ps.amount"]) .where("ps.profileId IN (:...child2ProfileIds)", { child2ProfileIds }) .andWhere( `(ps.profileId, ps.commandDateAffect) IN ( SELECT ps2.profileId, MAX(ps2.commandDateAffect) FROM profileSalary ps2 WHERE ps2.profileId IN (:...child2ProfileIds) GROUP BY ps2.profileId )`, { child2ProfileIds }, ) .getMany(), ]); } if (child2PosMasters.length > 0) { const child2PosMasterIds = child2PosMasters.map((pm: any) => pm.id); child2Positions = await this.positionRepository .createQueryBuilder("position") .leftJoinAndSelect("position.posType", "posType") .leftJoinAndSelect("position.posLevel", "posLevel") .leftJoinAndSelect("position.posExecutive", "posExecutive") .select([ "position.id", "position.positionName", "position.positionIsSelected", "position.posMasterId", "posType.id", "posType.posTypeName", "posLevel.id", "posLevel.posLevelName", "posExecutive.id", "posExecutive.posExecutiveName", ]) .where("position.posMasterId IN (:...child2PosMasterIds)", { child2PosMasterIds }) .getMany(); } // Combine ข้อมูล orgChild2 for (let orgChild2 of orgChild2Data) { orgChild2.posMasters = child2PosMasters.filter((pm: any) => pm.orgChild2Id === orgChild2.id); for (let posMaster of orgChild2.posMasters) { if (posMaster.current_holderId) { posMaster.current_holder = child2Profiles.find( (p: any) => p.id === posMaster.current_holderId, ); if (posMaster.current_holder) { posMaster.current_holder.profileEducations = child2Educations.filter( (ed: any) => ed.profileId === posMaster.current_holderId, ); posMaster.current_holder.profileSalary = child2Salaries.filter( (sal: any) => sal.profileId === posMaster.current_holderId, ); } } if (posMaster.next_holderId) { posMaster.next_holder = child2Profiles.find((p: any) => p.id === posMaster.next_holderId); if (posMaster.next_holder) { posMaster.next_holder.profileEducations = child2Educations.filter( (ed: any) => ed.profileId === posMaster.next_holderId, ); posMaster.next_holder.profileSalary = child2Salaries.filter( (sal: any) => sal.profileId === posMaster.next_holderId, ); } } posMaster.positions = child2Positions.filter( (pos: any) => pos.posMasterId === posMaster.id, ); } } // Step 10: ปรับปรุง orgChild3Data const originalOrgChild2Ids = orgChild2Data.length > 0 ? orgChild2Data.map((orgChild2) => orgChild2.id) : []; const orgChild3Data = await this.child3Repository .createQueryBuilder("orgChild3") .select([ "orgChild3.id", "orgChild3.orgChild2Id", "orgChild3.orgChild3Name", "orgChild3.orgChild3ShortName", "orgChild3.orgChild3Order", ]) .where( originalOrgChild2Ids.length > 0 ? "orgChild3.orgChild2Id IN (:...originalOrgChild2Ids)" : "1=0", { originalOrgChild2Ids, }, ) .orderBy("orgChild3.orgChild3Order", "ASC") .getMany(); // ดึงข้อมูล PosMasters สำหรับ orgChild3 const orgChild3Ids = orgChild3Data.map((orgChild3) => orgChild3.id); let child3PosMasters: any[] = []; if (orgChild3Ids.length > 0) { child3PosMasters = await this.posMasterRepository .createQueryBuilder("posMaster") .select([ "posMaster.id", "posMaster.posMasterOrder", "posMaster.isSit", "posMaster.posMasterNo", "posMaster.ancestorDNA", "posMaster.reason", "posMaster.orgChild3Id", "posMaster.orgChild4Id", "posMaster.current_holderId", "posMaster.next_holderId", ]) .where("posMaster.orgChild3Id IN (:...orgChild3Ids)", { orgChild3Ids }) .andWhere("posMaster.orgChild4Id IS NULL") // เฉพาะ child3 level .orderBy("posMaster.posMasterOrder", "ASC") .addOrderBy("posMaster.posMasterCreatedAt", "ASC") .getMany(); } // รวบรวม Profile IDs สำหรับ child3 const child3ProfileIds = child3PosMasters.length > 0 ? [ ...new Set([ ...child3PosMasters.map((pm: any) => pm.current_holderId).filter(Boolean), ...child3PosMasters.map((pm: any) => pm.next_holderId).filter(Boolean), ]), ] : []; // ดึงข้อมูล Profiles, Education, Salary, Positions สำหรับ child3 let child3Profiles: any[] = []; let child3Educations: any[] = []; let child3Salaries: any[] = []; let child3Positions: any[] = []; if (child3ProfileIds.length > 0) { [child3Profiles, child3Educations, child3Salaries] = await Promise.all([ this.profileRepository .createQueryBuilder("profile") .select([ "profile.id", "profile.prefix", "profile.firstName", "profile.lastName", "profile.position", "profile.posTypeId", "profile.posLevelId", ]) .where("profile.id IN (:...child3ProfileIds)", { child3ProfileIds }) .getMany(), this.profileEducationRepository .createQueryBuilder("pe") .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level"]) .where("pe.profileId IN (:...child3ProfileIds)", { child3ProfileIds }) .andWhere( `(pe.profileId, COALESCE(pe.finishDate, '1900-01-01'), pe.level) IN ( SELECT pe2.profileId, COALESCE(MAX(pe2.finishDate), '1900-01-01'), CASE WHEN MAX(pe2.finishDate) IS NOT NULL THEN (SELECT pe3.level FROM profileEducation pe3 WHERE pe3.profileId = pe2.profileId AND pe3.finishDate = MAX(pe2.finishDate) LIMIT 1) ELSE MAX(pe2.level) END FROM profileEducation pe2 WHERE pe2.profileId IN (:...child3ProfileIds) GROUP BY pe2.profileId )`, { child3ProfileIds }, ) .getMany(), this.profileSalaryRepository .createQueryBuilder("ps") .select(["ps.profileId", "ps.commandDateAffect", "ps.amount"]) .where("ps.profileId IN (:...child3ProfileIds)", { child3ProfileIds }) .andWhere( `(ps.profileId, ps.commandDateAffect) IN ( SELECT ps2.profileId, MAX(ps2.commandDateAffect) FROM profileSalary ps2 WHERE ps2.profileId IN (:...child3ProfileIds) GROUP BY ps2.profileId )`, { child3ProfileIds }, ) .getMany(), ]); } if (child3PosMasters.length > 0) { const child3PosMasterIds = child3PosMasters.map((pm: any) => pm.id); child3Positions = await this.positionRepository .createQueryBuilder("position") .leftJoinAndSelect("position.posType", "posType") .leftJoinAndSelect("position.posLevel", "posLevel") .leftJoinAndSelect("position.posExecutive", "posExecutive") .select([ "position.id", "position.positionName", "position.positionIsSelected", "position.posMasterId", "posType.id", "posType.posTypeName", "posLevel.id", "posLevel.posLevelName", "posExecutive.id", "posExecutive.posExecutiveName", ]) .where("position.posMasterId IN (:...child3PosMasterIds)", { child3PosMasterIds }) .getMany(); } // Combine ข้อมูล orgChild3 for (let orgChild3 of orgChild3Data) { orgChild3.posMasters = child3PosMasters.filter((pm: any) => pm.orgChild3Id === orgChild3.id); for (let posMaster of orgChild3.posMasters) { if (posMaster.current_holderId) { posMaster.current_holder = child3Profiles.find( (p: any) => p.id === posMaster.current_holderId, ); if (posMaster.current_holder) { posMaster.current_holder.profileEducations = child3Educations.filter( (ed: any) => ed.profileId === posMaster.current_holderId, ); posMaster.current_holder.profileSalary = child3Salaries.filter( (sal: any) => sal.profileId === posMaster.current_holderId, ); } } if (posMaster.next_holderId) { posMaster.next_holder = child3Profiles.find((p: any) => p.id === posMaster.next_holderId); if (posMaster.next_holder) { posMaster.next_holder.profileEducations = child3Educations.filter( (ed: any) => ed.profileId === posMaster.next_holderId, ); posMaster.next_holder.profileSalary = child3Salaries.filter( (sal: any) => sal.profileId === posMaster.next_holderId, ); } } posMaster.positions = child3Positions.filter( (pos: any) => pos.posMasterId === posMaster.id, ); } } // Step 11: ปรับปรุง orgChild4Data const originalOrgChild3Ids = orgChild3Data.length > 0 ? orgChild3Data.map((orgChild3) => orgChild3.id) : []; const orgChild4Data = await this.child4Repository .createQueryBuilder("orgChild4") .select([ "orgChild4.id", "orgChild4.orgChild3Id", "orgChild4.orgChild4Name", "orgChild4.orgChild4ShortName", "orgChild4.orgChild4Order", ]) .where( originalOrgChild3Ids.length > 0 ? "orgChild4.orgChild3Id IN (:...originalOrgChild3Ids)" : "1=0", { originalOrgChild3Ids, }, ) .orderBy("orgChild4.orgChild4Order", "ASC") .getMany(); // ดึงข้อมูล PosMasters สำหรับ orgChild4 const orgChild4Ids = orgChild4Data.map((orgChild4) => orgChild4.id); let child4PosMasters: any[] = []; if (orgChild4Ids.length > 0) { child4PosMasters = await this.posMasterRepository .createQueryBuilder("posMaster") .select([ "posMaster.id", "posMaster.posMasterOrder", "posMaster.isSit", "posMaster.posMasterNo", "posMaster.ancestorDNA", "posMaster.reason", "posMaster.orgChild4Id", "posMaster.current_holderId", "posMaster.next_holderId", ]) .where("posMaster.orgChild4Id IN (:...orgChild4Ids)", { orgChild4Ids }) .orderBy("posMaster.posMasterOrder", "ASC") .addOrderBy("posMaster.posMasterCreatedAt", "ASC") .getMany(); } // รวบรวม Profile IDs สำหรับ child4 const child4ProfileIds = child4PosMasters.length > 0 ? [ ...new Set([ ...child4PosMasters.map((pm: any) => pm.current_holderId).filter(Boolean), ...child4PosMasters.map((pm: any) => pm.next_holderId).filter(Boolean), ]), ] : []; // ดึงข้อมูล Profiles, Education, Salary, Positions สำหรับ child4 let child4Profiles: any[] = []; let child4Educations: any[] = []; let child4Salaries: any[] = []; let child4Positions: any[] = []; if (child4ProfileIds.length > 0) { [child4Profiles, child4Educations, child4Salaries] = await Promise.all([ this.profileRepository .createQueryBuilder("profile") .select([ "profile.id", "profile.prefix", "profile.firstName", "profile.lastName", "profile.position", "profile.posTypeId", "profile.posLevelId", ]) .where("profile.id IN (:...child4ProfileIds)", { child4ProfileIds }) .getMany(), this.profileEducationRepository .createQueryBuilder("pe") .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level"]) .where("pe.profileId IN (:...child4ProfileIds)", { child4ProfileIds }) .andWhere( `(pe.profileId, COALESCE(pe.finishDate, '1900-01-01'), pe.level) IN ( SELECT pe2.profileId, COALESCE(MAX(pe2.finishDate), '1900-01-01'), CASE WHEN MAX(pe2.finishDate) IS NOT NULL THEN (SELECT pe3.level FROM profileEducation pe3 WHERE pe3.profileId = pe2.profileId AND pe3.finishDate = MAX(pe2.finishDate) LIMIT 1) ELSE MAX(pe2.level) END FROM profileEducation pe2 WHERE pe2.profileId IN (:...child4ProfileIds) GROUP BY pe2.profileId )`, { child4ProfileIds }, ) .getMany(), this.profileSalaryRepository .createQueryBuilder("ps") .select(["ps.profileId", "ps.commandDateAffect", "ps.amount"]) .where("ps.profileId IN (:...child4ProfileIds)", { child4ProfileIds }) .andWhere( `(ps.profileId, ps.commandDateAffect) IN ( SELECT ps2.profileId, MAX(ps2.commandDateAffect) FROM profileSalary ps2 WHERE ps2.profileId IN (:...child4ProfileIds) GROUP BY ps2.profileId )`, { child4ProfileIds }, ) .getMany(), ]); } if (child4PosMasters.length > 0) { const child4PosMasterIds = child4PosMasters.map((pm: any) => pm.id); child4Positions = await this.positionRepository .createQueryBuilder("position") .leftJoinAndSelect("position.posType", "posType") .leftJoinAndSelect("position.posLevel", "posLevel") .leftJoinAndSelect("position.posExecutive", "posExecutive") .select([ "position.id", "position.positionName", "position.positionIsSelected", "position.posMasterId", "posType.id", "posType.posTypeName", "posLevel.id", "posLevel.posLevelName", "posExecutive.id", "posExecutive.posExecutiveName", ]) .where("position.posMasterId IN (:...child4PosMasterIds)", { child4PosMasterIds }) .getMany(); } // Combine ข้อมูล orgChild4 for (let orgChild4 of orgChild4Data) { orgChild4.posMasters = child4PosMasters.filter((pm: any) => pm.orgChild4Id === orgChild4.id); for (let posMaster of orgChild4.posMasters) { if (posMaster.current_holderId) { posMaster.current_holder = child4Profiles.find( (p: any) => p.id === posMaster.current_holderId, ); if (posMaster.current_holder) { posMaster.current_holder.profileEducations = child4Educations.filter( (ed: any) => ed.profileId === posMaster.current_holderId, ); posMaster.current_holder.profileSalary = child4Salaries.filter( (sal: any) => sal.profileId === posMaster.current_holderId, ); } } if (posMaster.next_holderId) { posMaster.next_holder = child4Profiles.find((p: any) => p.id === posMaster.next_holderId); if (posMaster.next_holder) { posMaster.next_holder.profileEducations = child4Educations.filter( (ed: any) => ed.profileId === posMaster.next_holderId, ); posMaster.next_holder.profileSalary = child4Salaries.filter( (sal: any) => sal.profileId === posMaster.next_holderId, ); } } posMaster.positions = child4Positions.filter( (pos: any) => pos.posMasterId === posMaster.id, ); } } let orgRevisionActive: any = await this.orgRevisionRepository .createQueryBuilder("orgRevision") .select([ "orgRevision.id", "orgRevision.orgRevisionIsCurrent", "orgRevision.orgRevisionIsDraft", "orgRevision.createdAt", ]) .leftJoinAndSelect("orgRevision.posMasters", "posMasters") .leftJoinAndSelect("posMasters.positions", "positions") .leftJoinAndSelect("positions.posType", "posType") .leftJoinAndSelect("positions.posLevel", "posLevel") .leftJoinAndSelect("positions.posExecutive", "posExecutive") .addSelect([ "posMasters.posMasterOrder", "posMasters.posMasterNo", "posMasters.ancestorDNA", "posMasters.orgRevisionId", ]) .addSelect(["positions.positionName", "positions.positionIsSelected"]) .addSelect(["posType.posTypeName"]) .addSelect(["posLevel.posLevelName"]) .addSelect(["posExecutive.posExecutiveName"]) .where("orgRevision.orgRevisionIsCurrent = :isCurrent", { isCurrent: true }) .andWhere("orgRevision.orgRevisionIsDraft = :isDraft", { isDraft: false }) .getOne(); if (orgRevisionActive == null) { const _orgRevisionActive = await this.orgRevisionRepository .createQueryBuilder("orgRevision") .select([ "orgRevision.id", "orgRevision.orgRevisionIsCurrent", "orgRevision.orgRevisionIsDraft", "orgRevision.createdAt", ]) .leftJoinAndSelect("orgRevision.posMasters", "posMasters") .leftJoinAndSelect("posMasters.positions", "positions") .leftJoinAndSelect("positions.posType", "posType") .leftJoinAndSelect("positions.posLevel", "posLevel") .leftJoinAndSelect("positions.posExecutive", "posExecutive") .addSelect([ "posMasters.posMasterOrder", "posMasters.posMasterNo", "posMasters.ancestorDNA", "posMasters.orgRevisionId", ]) .addSelect(["positions.positionName", "positions.positionIsSelected"]) .addSelect(["posType.posTypeName"]) .addSelect(["posLevel.posLevelName"]) .addSelect(["posExecutive.posExecutiveName"]) .orderBy("orgRevision.createdAt", "DESC") .skip(1) .take(1) .getMany(); if (_orgRevisionActive.length > 0) orgRevisionActive = _orgRevisionActive[0]; } let data = new Array(); let _node: any; let no = 1; for (let orgRoot of orgRootData) { const posMastersFiltered = orgRoot.posMasters.sort( (a, b) => a.posMasterOrder - b.posMasterOrder, ); for (let posMaster of posMastersFiltered) { if (posMaster.orgChild1Id == null) { // Use temporary arrays to reduce memory allocation const posNames = posMaster.positions.map((x) => x.positionName); const positionName = [...new Set(posNames)]; const typeNames = posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName); const posType = [...new Set(typeNames)]; const levelNames = posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName); const posLevel = [...new Set(levelNames)]; const execNames = posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x) => x.posExecutive.posExecutiveName); const posExecutive = [...new Set(execNames)]; let positionMasterProfileOld: any = null; if (posMaster.next_holder != null && posMaster.next_holder.current_holders) { positionMasterProfileOld = posMaster.next_holder.current_holders.find( (x) => x.orgRevisionId == orgRevisionActive.id, ); } let positionMasterOld: any = null; let profilePositionName: any = []; let profilePosType: any = []; let profilePosLevel: any = []; let profilePosExecutive: any = []; if ( posMaster.ancestorDNA != null && posMaster.ancestorDNA != "" && orgRevisionActive && orgRevisionActive.posMasters ) { positionMasterOld = orgRevisionActive.posMasters.find( (x: any) => x.orgRevisionId == orgRevisionActive.id && x.ancestorDNA == posMaster.ancestorDNA, ); if (positionMasterOld && positionMasterOld.positions) { profilePositionName = [ ...new Set(positionMasterOld.positions.map((x: any) => x.positionName)), ]; profilePosType = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posType != null) .map((x: any) => x.posType.posTypeName), ), ]; profilePosLevel = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posLevel != null) .map((x: any) => x.posLevel.posLevelName), ), ]; profilePosExecutive = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.posExecutive.posExecutiveName), ), ]; } } let education: any = ""; if ( posMaster.next_holder != null && posMaster.next_holder.profileEducations != null && posMaster.next_holder.profileEducations.length > 0 ) { let _education: any = posMaster.next_holder.profileEducations.sort( (a, b) => (b.finishDate == null ? 0 : b.finishDate.getTime()) - (a.finishDate == null ? 0 : a.finishDate.getTime()), ); if (_education.length > 0) { education = _education[0]; } } else { if ( posMaster.current_holder != null && posMaster.current_holder.profileEducations != null && posMaster.current_holder.profileEducations.length > 0 ) { let _education: any = posMaster.current_holder.profileEducations.sort( (a, b) => (b.finishDate == null ? 0 : b.finishDate.getTime()) - (a.finishDate == null ? 0 : a.finishDate.getTime()), ); if (_education.length > 0) { education = _education[0]; } } } let salary: any = ""; if ( posMaster.next_holder != null && posMaster.next_holder.profileSalary != null && posMaster.next_holder.profileSalary.length > 0 ) { let _salary: any = posMaster.next_holder.profileSalary.sort( (a, b) => (b.commandDateAffect == null ? 0 : b.commandDateAffect.getTime()) - (a.commandDateAffect == null ? 0 : a.commandDateAffect.getTime()), ); if (_salary.length > 0) { salary = _salary[0]; } } else { if ( posMaster.current_holder != null && posMaster.current_holder.profileSalary != null && posMaster.current_holder.profileSalary.length > 0 ) { let _salary: any = posMaster.current_holder.profileSalary.sort( (a, b) => (b.commandDateAffect == null ? 0 : b.commandDateAffect.getTime()) - (a.commandDateAffect == null ? 0 : a.commandDateAffect.getTime()), ); if (_salary.length > 0) { salary = _salary[0]; } } } if (positionMasterProfileOld == null && posMaster.next_holder != null && posMaster.next_holder.current_holders == null ) { positionMasterProfileOld = positionMasterOld } let node = { posMasterOrder: posMaster.posMasterOrder, // isSit: posMaster.isSit, // orgTreeName: orgRoot.orgRootName, orgTreeShortName: orgRoot.orgRootShortName, posMasterNo: posMaster.posMasterNo, positionName: posMaster.next_holder == null ? positionName.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true)?.positionName : posMaster.next_holder.position, posType: posMaster.next_holder == null ? posType.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true)?.posType ?.posTypeName : posMaster.next_holder.posType == null ? "-" : posMaster.next_holder.posType.posTypeName, posLevel: posMaster.next_holder == null ? posLevel.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true)?.posLevel ?.posLevelName : posMaster.next_holder.posLevel == null ? "-" : posMaster.next_holder.posLevel.posLevelName, posExecutive: posMaster.next_holder == null ? posExecutive.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true)?.posExecutive ?.posExecutiveName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posExecutive?.posExecutiveName, profileOrgName: posMaster.next_holder == null ? orgRoot.orgRootName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.orgChild4 != null ? positionMasterProfileOld.orgChild4.orgChild4Name : positionMasterProfileOld.orgChild3 != null ? positionMasterProfileOld.orgChild3.orgChild3Name : positionMasterProfileOld.orgChild2 != null ? positionMasterProfileOld.orgChild2.orgChild2Name : positionMasterProfileOld.orgChild1 != null ? positionMasterProfileOld.orgChild1.orgChild1Name : positionMasterProfileOld.orgRoot != null ? positionMasterProfileOld.orgRoot.orgRootName : "-", profileOrgShortName: posMaster.next_holder == null ? orgRoot.orgRootShortName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.orgChild4 != null ? positionMasterProfileOld.orgChild4.orgChild4ShortName : positionMasterProfileOld.orgChild3 != null ? positionMasterProfileOld.orgChild3.orgChild3ShortName : positionMasterProfileOld.orgChild2 != null ? positionMasterProfileOld.orgChild2.orgChild2ShortName : positionMasterProfileOld.orgChild1 != null ? positionMasterProfileOld.orgChild1.orgChild1ShortName : positionMasterProfileOld.orgRoot != null ? positionMasterProfileOld.orgRoot.orgRootShortName : "-", profileFullname: posMaster.next_holder == null ? posMaster.current_holder == null ? "- ว่าง -" : `${posMaster.current_holder.prefix}${posMaster.current_holder.firstName} ${posMaster.current_holder.lastName}` : `${posMaster.next_holder.prefix}${posMaster.next_holder.firstName} ${posMaster.next_holder.lastName}`, profilePosMasterNo: posMaster.next_holder == null ? positionMasterOld == null ? "-" : positionMasterOld.posMasterNo : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.posMasterNo, profilePositionName: posMaster.next_holder == null ? positionMasterOld == null ? positionName.join(" หรือ ") : profilePositionName.join(" หรือ ") : posMaster.next_holder.position, profilePosType: posMaster.next_holder == null ? positionMasterOld == null ? posType.join(" หรือ ") : profilePosType.join(" หรือ ") : positionMasterProfileOld == null ? "-" // : posMaster.next_holder.posType.posTypeName, : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posType?.posTypeName, profilePosLevel: posMaster.next_holder == null ? positionMasterOld == null ? posLevel.join(" หรือ ") : profilePosLevel.join(" หรือ ") : positionMasterProfileOld == null ? "-" // : posMaster.next_holder.posLevel.posLevelName, : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posLevel?.posLevelName, profilePosExecutive: posMaster.next_holder == null ? positionMasterOld == null ? posExecutive.join(" หรือ ") : profilePosExecutive.join(" หรือ ") : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posExecutive?.posExecutiveName, education: education == "" ? "" : education.degree, salary: salary == "" ? "" : salary.amount, reason: posMaster.reason, }; if (_node == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName.toString()), profileFullname: posMaster.next_holder == null ? Extension.ToThaiNumber(node.profileOrgName.toString()) : Extension.ToThaiNumber(node.orgTreeName.toString()), posExecutive: Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", profilePosMasterNo: posMaster.next_holder == null ? Extension.ToThaiNumber(node.profileOrgShortName.toString()) : Extension.ToThaiNumber(node.orgTreeShortName.toString()), profilePosExecutive: "", profilePositionName: "", profilePosType: "", profilePosLevel: "", education: "", salary: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == null ? "" : Extension.ToThaiNumber(node.posExecutive.toString()), positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), profilePosMasterNo: Extension.ToThaiNumber(node.profilePosMasterNo.toString()), profilePosExecutive: node.profilePosExecutive == null ? "" : Extension.ToThaiNumber(node.profilePosExecutive.toString()), profilePositionName: node.profilePositionName == null ? "" : Extension.ToThaiNumber(node.profilePositionName.toString()), profilePosType: node.profilePosType == null ? "" : Extension.ToThaiNumber(node.profilePosType.toString()), profilePosLevel: node.profilePosLevel == null ? "" : Extension.ToThaiNumber(node.profilePosLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _node.orgTreeShortName || node.orgTreeName != _node.orgTreeName || node.profileOrgShortName != _node.profileOrgShortName || node.profileOrgName != _node.profileOrgName ) { const head = { posMasterNo: node.orgTreeShortName == _node.orgTreeShortName ? "" : node.orgTreeShortName, profileFullname: node.profileOrgName == _node.profileOrgName ? "" : node.profileOrgName, posExecutive: node.orgTreeName == _node.orgTreeName ? "" : node.orgTreeName, positionName: "", posType: "", posLevel: "", profilePosMasterNo: node.profileOrgShortName == _node.profileOrgShortName ? "" : node.profileOrgShortName, profilePosExecutive: "", profilePositionName: "", profilePosType: "", profilePosLevel: "", education: "", salary: "", reason: "", }; data.push(head); _node == null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == null ? "" : Extension.ToThaiNumber(node.posExecutive.toString()), positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), profilePosMasterNo: Extension.ToThaiNumber(node.profilePosMasterNo.toString()), profilePosExecutive: node.profilePosExecutive == null ? "" : Extension.ToThaiNumber(node.profilePosExecutive.toString()), profilePositionName: node.profilePositionName == null ? "" : Extension.ToThaiNumber(node.profilePositionName.toString()), profilePosType: node.profilePosType == null ? "" : Extension.ToThaiNumber(node.profilePosType.toString()), profilePosLevel: node.profilePosLevel == null ? "" : Extension.ToThaiNumber(node.profilePosLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _node = node; } } _node = null; for (let orgChild1 of orgChild1Data.filter( (orgChild1) => orgChild1.orgRootId === orgRoot.id, )) { const posMastersFiltered1 = orgChild1.posMasters.sort( (a, b) => a.posMasterOrder - b.posMasterOrder, ); for (let posMaster of posMastersFiltered1) { if (posMaster.orgChild2Id == null) { const positionName = [...new Set(posMaster.positions.map((x) => x.positionName))]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x) => x.posExecutive.posExecutiveName), ), ]; let positionMasterProfileOld: any = null; if (posMaster.next_holder != null && posMaster.next_holder.current_holders) { positionMasterProfileOld = posMaster.next_holder.current_holders.find( (x) => x.orgRevisionId == orgRevisionActive.id, ); } let positionMasterOld: any = null; let profilePositionName: any = []; let profilePosType: any = []; let profilePosLevel: any = []; let profilePosExecutive: any = []; if ( posMaster.ancestorDNA != null && posMaster.ancestorDNA != "" && orgRevisionActive && orgRevisionActive.posMasters ) { positionMasterOld = orgRevisionActive.posMasters.find( (x: any) => x.orgRevisionId == orgRevisionActive.id && x.ancestorDNA == posMaster.ancestorDNA, ); if (positionMasterOld && positionMasterOld.positions) { profilePositionName = [ ...new Set(positionMasterOld.positions.map((x: any) => x.positionName)), ]; profilePosType = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posType != null) .map((x: any) => x.posType.posTypeName), ), ]; profilePosLevel = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posLevel != null) .map((x: any) => x.posLevel.posLevelName), ), ]; profilePosExecutive = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.posExecutive.posExecutiveName), ), ]; } } let education: any = ""; if ( posMaster.next_holder != null && posMaster.next_holder.profileEducations != null && posMaster.next_holder.profileEducations.length > 0 ) { let _education: any = posMaster.next_holder.profileEducations.sort( (a, b) => (b.finishDate == null ? 0 : b.finishDate.getTime()) - (a.finishDate == null ? 0 : a.finishDate.getTime()), ); if (_education.length > 0) { education = _education[0]; } } else { if ( posMaster.current_holder != null && posMaster.current_holder.profileEducations != null && posMaster.current_holder.profileEducations.length > 0 ) { let _education: any = posMaster.current_holder.profileEducations.sort( (a, b) => (b.finishDate == null ? 0 : b.finishDate.getTime()) - (a.finishDate == null ? 0 : a.finishDate.getTime()), ); if (_education.length > 0) { education = _education[0]; } } } let salary: any = ""; if ( posMaster.next_holder != null && posMaster.next_holder.profileSalary != null && posMaster.next_holder.profileSalary.length > 0 ) { let _salary: any = posMaster.next_holder.profileSalary.sort( (a, b) => (b.commandDateAffect == null ? 0 : b.commandDateAffect.getTime()) - (a.commandDateAffect == null ? 0 : a.commandDateAffect.getTime()), ); if (_salary.length > 0) { salary = _salary[0]; } } else { if ( posMaster.current_holder != null && posMaster.current_holder.profileSalary != null && posMaster.current_holder.profileSalary.length > 0 ) { let _salary: any = posMaster.current_holder.profileSalary.sort( (a, b) => (b.commandDateAffect == null ? 0 : b.commandDateAffect.getTime()) - (a.commandDateAffect == null ? 0 : a.commandDateAffect.getTime()), ); if (_salary.length > 0) { salary = _salary[0]; } } } if (positionMasterProfileOld == null && posMaster.next_holder != null && posMaster.next_holder.current_holders == null ) { positionMasterProfileOld = positionMasterOld } let node = { posMasterOrder: posMaster.posMasterOrder, // isSit: posMaster.isSit, // orgTreeName: orgChild1.orgChild1Name, orgTreeShortName: orgChild1.orgChild1ShortName, posMasterNo: posMaster.posMasterNo, positionName: posMaster.next_holder == null ? positionName.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.positionName : posMaster.next_holder.position, posType: posMaster.next_holder == null ? posType.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true)?.posType ?.posTypeName : posMaster.next_holder.posType == null ? "-" : posMaster.next_holder.posType.posTypeName, posLevel: posMaster.next_holder == null ? posLevel.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true)?.posLevel ?.posLevelName : posMaster.next_holder.posLevel == null ? "-" : posMaster.next_holder.posLevel.posLevelName, posExecutive: posMaster.next_holder == null ? posExecutive.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posExecutive?.posExecutiveName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posExecutive?.posExecutiveName, profileOrgName: posMaster.next_holder == null ? orgChild1.orgChild1Name : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.orgChild4 != null ? positionMasterProfileOld.orgChild4.orgChild4Name : positionMasterProfileOld.orgChild3 != null ? positionMasterProfileOld.orgChild3.orgChild3Name : positionMasterProfileOld.orgChild2 != null ? positionMasterProfileOld.orgChild2.orgChild2Name : positionMasterProfileOld.orgChild1 != null ? positionMasterProfileOld.orgChild1.orgChild1Name : positionMasterProfileOld.orgRoot != null ? positionMasterProfileOld.orgRoot.orgRootName : "-", profileOrgShortName: posMaster.next_holder == null ? orgChild1.orgChild1ShortName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.orgChild4 != null ? positionMasterProfileOld.orgChild4.orgChild4ShortName : positionMasterProfileOld.orgChild3 != null ? positionMasterProfileOld.orgChild3.orgChild3ShortName : positionMasterProfileOld.orgChild2 != null ? positionMasterProfileOld.orgChild2.orgChild2ShortName : positionMasterProfileOld.orgChild1 != null ? positionMasterProfileOld.orgChild1.orgChild1ShortName : positionMasterProfileOld.orgRoot != null ? positionMasterProfileOld.orgRoot.orgRootShortName : "-", profileFullname: posMaster.next_holder == null ? posMaster.current_holder == null ? "- ว่าง -" : `${posMaster.current_holder.prefix}${posMaster.current_holder.firstName} ${posMaster.current_holder.lastName}` : `${posMaster.next_holder.prefix}${posMaster.next_holder.firstName} ${posMaster.next_holder.lastName}`, profilePosMasterNo: posMaster.next_holder == null ? positionMasterOld == null ? "-" : positionMasterOld.posMasterNo : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.posMasterNo, profilePositionName: posMaster.next_holder == null ? positionMasterOld == null ? positionName.join(" หรือ ") : profilePositionName.join(" หรือ ") : posMaster.next_holder.position, profilePosType: posMaster.next_holder == null ? positionMasterOld == null ? posType.join(" หรือ ") : profilePosType.join(" หรือ ") : positionMasterProfileOld == null ? "-" // : posMaster.next_holder.posType.posTypeName, : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posType?.posTypeName, profilePosLevel: posMaster.next_holder == null ? positionMasterOld == null ? posLevel.join(" หรือ ") : profilePosLevel.join(" หรือ ") : positionMasterProfileOld == null ? "-" // : posMaster.next_holder.posLevel.posLevelName, : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posLevel?.posLevelName, profilePosExecutive: posMaster.next_holder == null ? positionMasterOld == null ? posExecutive.join(" หรือ ") : profilePosExecutive.join(" หรือ ") : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posExecutive?.posExecutiveName, education: education == "" ? "" : education.degree, salary: salary == "" ? "" : salary.amount, reason: posMaster.reason, }; if (_node == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName.toString()), profileFullname: posMaster.next_holder == null ? Extension.ToThaiNumber(node.profileOrgName.toString()) : Extension.ToThaiNumber(node.orgTreeName.toString()), posExecutive: Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", profilePosMasterNo: posMaster.next_holder == null ? Extension.ToThaiNumber(node.profileOrgShortName.toString()) : Extension.ToThaiNumber(node.orgTreeShortName.toString()), profilePosExecutive: "", profilePositionName: "", profilePosType: "", profilePosLevel: "", education: "", salary: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == null ? "" : Extension.ToThaiNumber(node.posExecutive.toString()), positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), profilePosMasterNo: Extension.ToThaiNumber(node.profilePosMasterNo.toString()), profilePosExecutive: node.profilePosExecutive == null ? "" : Extension.ToThaiNumber(node.profilePosExecutive.toString()), profilePositionName: node.profilePositionName == null ? "" : Extension.ToThaiNumber(node.profilePositionName.toString()), profilePosType: node.profilePosType == null ? "" : Extension.ToThaiNumber(node.profilePosType.toString()), profilePosLevel: node.profilePosLevel == null ? "" : Extension.ToThaiNumber(node.profilePosLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _node.orgTreeShortName || node.orgTreeName != _node.orgTreeName || node.profileOrgShortName != _node.profileOrgShortName || node.profileOrgName != _node.profileOrgName ) { const head = { posMasterNo: node.orgTreeShortName == _node.orgTreeShortName ? "" : node.orgTreeShortName, profileFullname: node.profileOrgName == _node.profileOrgName ? "" : node.profileOrgName, posExecutive: node.orgTreeName == _node.orgTreeName ? "" : node.orgTreeName, positionName: "", posType: "", posLevel: "", profilePosMasterNo: node.profileOrgShortName == _node.profileOrgShortName ? "" : node.profileOrgShortName, profilePosExecutive: "", profilePositionName: "", profilePosType: "", profilePosLevel: "", education: "", salary: "", reason: "", }; data.push(head); _node == null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == null ? "" : Extension.ToThaiNumber(node.posExecutive.toString()), positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), profilePosMasterNo: Extension.ToThaiNumber(node.profilePosMasterNo.toString()), profilePosExecutive: node.profilePosExecutive == null ? "" : Extension.ToThaiNumber(node.profilePosExecutive.toString()), profilePositionName: node.profilePositionName == null ? "" : Extension.ToThaiNumber(node.profilePositionName.toString()), profilePosType: node.profilePosType == null ? "" : Extension.ToThaiNumber(node.profilePosType.toString()), profilePosLevel: node.profilePosLevel == null ? "" : Extension.ToThaiNumber(node.profilePosLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _node = node; } } _node = null; for (let orgChild2 of orgChild2Data.filter( (orgChild2) => orgChild2.orgChild1Id === orgChild1.id, )) { const posMastersFiltered2 = orgChild2.posMasters.sort( (a, b) => a.posMasterOrder - b.posMasterOrder, ); for (let posMaster of posMastersFiltered2) { if (posMaster.orgChild3Id == null) { const positionName = [...new Set(posMaster.positions.map((x) => x.positionName))]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x) => x.posExecutive.posExecutiveName), ), ]; let positionMasterProfileOld: any = null; if (posMaster.next_holder != null && posMaster.next_holder.current_holders) { positionMasterProfileOld = posMaster.next_holder.current_holders.find( (x) => x.orgRevisionId == orgRevisionActive.id, ); } let positionMasterOld: any = null; let profilePositionName: any = []; let profilePosType: any = []; let profilePosLevel: any = []; let profilePosExecutive: any = []; if ( posMaster.ancestorDNA != null && posMaster.ancestorDNA != "" && orgRevisionActive && orgRevisionActive.posMasters ) { positionMasterOld = orgRevisionActive.posMasters.find( (x: any) => x.orgRevisionId == orgRevisionActive.id && x.ancestorDNA == posMaster.ancestorDNA, ); if (positionMasterOld && positionMasterOld.positions) { profilePositionName = [ ...new Set(positionMasterOld.positions.map((x: any) => x.positionName)), ]; profilePosType = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posType != null) .map((x: any) => x.posType.posTypeName), ), ]; profilePosLevel = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posLevel != null) .map((x: any) => x.posLevel.posLevelName), ), ]; profilePosExecutive = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.posExecutive.posExecutiveName), ), ]; } } let education: any = ""; if ( posMaster.next_holder != null && posMaster.next_holder.profileEducations != null && posMaster.next_holder.profileEducations.length > 0 ) { let _education: any = posMaster.next_holder.profileEducations.sort( (a, b) => (b.finishDate == null ? 0 : b.finishDate.getTime()) - (a.finishDate == null ? 0 : a.finishDate.getTime()), ); if (_education.length > 0) { education = _education[0]; } } else { if ( posMaster.current_holder != null && posMaster.current_holder.profileEducations != null && posMaster.current_holder.profileEducations.length > 0 ) { let _education: any = posMaster.current_holder.profileEducations.sort( (a, b) => (b.finishDate == null ? 0 : b.finishDate.getTime()) - (a.finishDate == null ? 0 : a.finishDate.getTime()), ); if (_education.length > 0) { education = _education[0]; } } } let salary: any = ""; if ( posMaster.next_holder != null && posMaster.next_holder.profileSalary != null && posMaster.next_holder.profileSalary.length > 0 ) { let _salary: any = posMaster.next_holder.profileSalary.sort( (a, b) => (b.commandDateAffect == null ? 0 : b.commandDateAffect.getTime()) - (a.commandDateAffect == null ? 0 : a.commandDateAffect.getTime()), ); if (_salary.length > 0) { salary = _salary[0]; } } else { if ( posMaster.current_holder != null && posMaster.current_holder.profileSalary != null && posMaster.current_holder.profileSalary.length > 0 ) { let _salary: any = posMaster.current_holder.profileSalary.sort( (a, b) => (b.commandDateAffect == null ? 0 : b.commandDateAffect.getTime()) - (a.commandDateAffect == null ? 0 : a.commandDateAffect.getTime()), ); if (_salary.length > 0) { salary = _salary[0]; } } } if (positionMasterProfileOld == null && posMaster.next_holder != null && posMaster.next_holder.current_holders == null ) { positionMasterProfileOld = positionMasterOld } let node = { posMasterOrder: posMaster.posMasterOrder, // isSit: posMaster.isSit, // orgTreeName: orgChild2.orgChild2Name, orgTreeShortName: orgChild2.orgChild2ShortName, posMasterNo: posMaster.posMasterNo, positionName: posMaster.next_holder == null ? positionName.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.positionName : posMaster.next_holder.position, posType: posMaster.next_holder == null ? posType.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true)?.posType ?.posTypeName : posMaster.next_holder.posType == null ? "-" : posMaster.next_holder.posType.posTypeName, posLevel: posMaster.next_holder == null ? posLevel.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true)?.posLevel ?.posLevelName : posMaster.next_holder.posLevel == null ? "-" : posMaster.next_holder.posLevel.posLevelName, posExecutive: posMaster.next_holder == null ? posExecutive.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posExecutive?.posExecutiveName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posExecutive?.posExecutiveName, profileOrgName: posMaster.next_holder == null ? orgChild2.orgChild2Name : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.orgChild4 != null ? positionMasterProfileOld.orgChild4.orgChild4Name : positionMasterProfileOld.orgChild3 != null ? positionMasterProfileOld.orgChild3.orgChild3Name : positionMasterProfileOld.orgChild2 != null ? positionMasterProfileOld.orgChild2.orgChild2Name : positionMasterProfileOld.orgChild1 != null ? positionMasterProfileOld.orgChild1.orgChild1Name : positionMasterProfileOld.orgRoot != null ? positionMasterProfileOld.orgRoot.orgRootName : "-", profileOrgShortName: posMaster.next_holder == null ? orgChild2.orgChild2ShortName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.orgChild4 != null ? positionMasterProfileOld.orgChild4.orgChild4ShortName : positionMasterProfileOld.orgChild3 != null ? positionMasterProfileOld.orgChild3.orgChild3ShortName : positionMasterProfileOld.orgChild2 != null ? positionMasterProfileOld.orgChild2.orgChild2ShortName : positionMasterProfileOld.orgChild1 != null ? positionMasterProfileOld.orgChild1.orgChild1ShortName : positionMasterProfileOld.orgRoot != null ? positionMasterProfileOld.orgRoot.orgRootShortName : "-", profileFullname: posMaster.next_holder == null ? posMaster.current_holder == null ? "- ว่าง -" : `${posMaster.current_holder.prefix}${posMaster.current_holder.firstName} ${posMaster.current_holder.lastName}` : `${posMaster.next_holder.prefix}${posMaster.next_holder.firstName} ${posMaster.next_holder.lastName}`, profilePosMasterNo: posMaster.next_holder == null ? positionMasterOld == null ? "-" : positionMasterOld.posMasterNo : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.posMasterNo, profilePositionName: posMaster.next_holder == null ? positionMasterOld == null ? positionName.join(" หรือ ") : profilePositionName.join(" หรือ ") : posMaster.next_holder.position, profilePosType: posMaster.next_holder == null ? positionMasterOld == null ? posType.join(" หรือ ") : profilePosType.join(" หรือ ") : positionMasterProfileOld == null ? "-" // : posMaster.next_holder.posType.posTypeName, : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posType?.posTypeName, profilePosLevel: posMaster.next_holder == null ? positionMasterOld == null ? posLevel.join(" หรือ ") : profilePosLevel.join(" หรือ ") : positionMasterProfileOld == null ? "-" // : posMaster.next_holder.posLevel.posLevelName, : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posLevel?.posLevelName, profilePosExecutive: posMaster.next_holder == null ? positionMasterOld == null ? posExecutive.join(" หรือ ") : profilePosExecutive.join(" หรือ ") : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posExecutive?.posExecutiveName, education: education == "" ? "" : education.degree, salary: salary == "" ? "" : salary.amount, reason: posMaster.reason, }; if (_node == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName.toString()), profileFullname: posMaster.next_holder == null ? Extension.ToThaiNumber(node.profileOrgName.toString()) : Extension.ToThaiNumber(node.orgTreeName.toString()), posExecutive: Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", profilePosMasterNo: posMaster.next_holder == null ? Extension.ToThaiNumber(node.profileOrgShortName.toString()) : Extension.ToThaiNumber(node.orgTreeShortName.toString()), profilePosExecutive: "", profilePositionName: "", profilePosType: "", profilePosLevel: "", education: "", salary: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == null ? "" : Extension.ToThaiNumber(node.posExecutive.toString()), positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), profilePosMasterNo: Extension.ToThaiNumber(node.profilePosMasterNo.toString()), profilePosExecutive: node.profilePosExecutive == null ? "" : Extension.ToThaiNumber(node.profilePosExecutive.toString()), profilePositionName: node.profilePositionName == null ? "" : Extension.ToThaiNumber(node.profilePositionName.toString()), profilePosType: node.profilePosType == null ? "" : Extension.ToThaiNumber(node.profilePosType.toString()), profilePosLevel: node.profilePosLevel == null ? "" : Extension.ToThaiNumber(node.profilePosLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _node.orgTreeShortName || node.orgTreeName != _node.orgTreeName || node.profileOrgShortName != _node.profileOrgShortName || node.profileOrgName != _node.profileOrgName ) { const head = { posMasterNo: node.orgTreeShortName == _node.orgTreeShortName ? "" : node.orgTreeShortName, profileFullname: node.profileOrgName == _node.profileOrgName ? "" : node.profileOrgName, posExecutive: node.orgTreeName == _node.orgTreeName ? "" : node.orgTreeName, positionName: "", posType: "", posLevel: "", profilePosMasterNo: node.profileOrgShortName == _node.profileOrgShortName ? "" : node.profileOrgShortName, profilePosExecutive: "", profilePositionName: "", profilePosType: "", profilePosLevel: "", education: "", salary: "", reason: "", }; data.push(head); _node == null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == null ? "" : Extension.ToThaiNumber(node.posExecutive.toString()), positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), profilePosMasterNo: Extension.ToThaiNumber(node.profilePosMasterNo.toString()), profilePosExecutive: node.profilePosExecutive == null ? "" : Extension.ToThaiNumber(node.profilePosExecutive.toString()), profilePositionName: node.profilePositionName == null ? "" : Extension.ToThaiNumber(node.profilePositionName.toString()), profilePosType: node.profilePosType == null ? "" : Extension.ToThaiNumber(node.profilePosType.toString()), profilePosLevel: node.profilePosLevel == null ? "" : Extension.ToThaiNumber(node.profilePosLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _node = node; } } _node = null; for (let orgChild3 of orgChild3Data.filter( (orgChild3) => orgChild3.orgChild2Id === orgChild2.id, )) { const posMastersFiltered3 = orgChild3.posMasters.sort( (a, b) => a.posMasterOrder - b.posMasterOrder, ); for (let posMaster of posMastersFiltered3) { if (posMaster.orgChild4Id == null) { console.log(posMaster); const positionName = [...new Set(posMaster.positions.map((x) => x.positionName))]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x) => x.posExecutive.posExecutiveName), ), ]; let positionMasterProfileOld: any = null; if (posMaster.next_holder != null && posMaster.next_holder.current_holders) { positionMasterProfileOld = posMaster.next_holder.current_holders.find( (x) => x.orgRevisionId == orgRevisionActive.id, ); } let positionMasterOld: any = null; let profilePositionName: any = []; let profilePosType: any = []; let profilePosLevel: any = []; let profilePosExecutive: any = []; if ( posMaster.ancestorDNA != null && posMaster.ancestorDNA != "" && orgRevisionActive && orgRevisionActive.posMasters ) { positionMasterOld = orgRevisionActive.posMasters.find( (x: any) => x.orgRevisionId == orgRevisionActive.id && x.ancestorDNA == posMaster.ancestorDNA, ); if (positionMasterOld && positionMasterOld.positions) { profilePositionName = [ ...new Set(positionMasterOld.positions.map((x: any) => x.positionName)), ]; profilePosType = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posType != null) .map((x: any) => x.posType.posTypeName), ), ]; profilePosLevel = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posLevel != null) .map((x: any) => x.posLevel.posLevelName), ), ]; profilePosExecutive = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.posExecutive.posExecutiveName), ), ]; } } let education: any = ""; if ( posMaster.next_holder != null && posMaster.next_holder.profileEducations != null && posMaster.next_holder.profileEducations.length > 0 ) { let _education: any = posMaster.next_holder.profileEducations.sort( (a, b) => (b.finishDate == null ? 0 : b.finishDate.getTime()) - (a.finishDate == null ? 0 : a.finishDate.getTime()), ); if (_education.length > 0) { education = _education[0]; } } else { if ( posMaster.current_holder != null && posMaster.current_holder.profileEducations != null && posMaster.current_holder.profileEducations.length > 0 ) { let _education: any = posMaster.current_holder.profileEducations.sort( (a, b) => (b.finishDate == null ? 0 : b.finishDate.getTime()) - (a.finishDate == null ? 0 : a.finishDate.getTime()), ); if (_education.length > 0) { education = _education[0]; } } } let salary: any = ""; if ( posMaster.next_holder != null && posMaster.next_holder.profileSalary != null && posMaster.next_holder.profileSalary.length > 0 ) { let _salary: any = posMaster.next_holder.profileSalary.sort( (a, b) => (b.commandDateAffect == null ? 0 : b.commandDateAffect.getTime()) - (a.commandDateAffect == null ? 0 : a.commandDateAffect.getTime()), ); if (_salary.length > 0) { salary = _salary[0]; } } else { if ( posMaster.current_holder != null && posMaster.current_holder.profileSalary != null && posMaster.current_holder.profileSalary.length > 0 ) { let _salary: any = posMaster.current_holder.profileSalary.sort( (a, b) => (b.commandDateAffect == null ? 0 : b.commandDateAffect.getTime()) - (a.commandDateAffect == null ? 0 : a.commandDateAffect.getTime()), ); if (_salary.length > 0) { salary = _salary[0]; } } } if (positionMasterProfileOld == null && posMaster.next_holder != null && posMaster.next_holder.current_holders == null ) { positionMasterProfileOld = positionMasterOld } let node = { posMasterOrder: posMaster.posMasterOrder, // isSit: posMaster.isSit, // orgTreeName: orgChild3.orgChild3Name, orgTreeShortName: orgChild3.orgChild3ShortName, posMasterNo: posMaster.posMasterNo, positionName: posMaster.next_holder == null ? positionName.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.positionName : posMaster.next_holder.position, posType: posMaster.next_holder == null ? posType.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posType?.posTypeName : posMaster.next_holder.posType == null ? "-" : posMaster.next_holder.posType.posTypeName, posLevel: posMaster.next_holder == null ? posLevel.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posLevel?.posLevelName : posMaster.next_holder.posLevel == null ? "-" : posMaster.next_holder.posLevel.posLevelName, posExecutive: posMaster.next_holder == null ? posExecutive.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posExecutive?.posExecutiveName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posExecutive?.posExecutiveName, profileOrgName: posMaster.next_holder == null ? orgChild3.orgChild3Name : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.orgChild4 != null ? positionMasterProfileOld.orgChild4.orgChild4Name : positionMasterProfileOld.orgChild3 != null ? positionMasterProfileOld.orgChild3.orgChild3Name : positionMasterProfileOld.orgChild2 != null ? positionMasterProfileOld.orgChild2.orgChild2Name : positionMasterProfileOld.orgChild1 != null ? positionMasterProfileOld.orgChild1.orgChild1Name : positionMasterProfileOld.orgRoot != null ? positionMasterProfileOld.orgRoot.orgRootName : "-", profileOrgShortName: posMaster.next_holder == null ? orgChild3.orgChild3ShortName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.orgChild4 != null ? positionMasterProfileOld.orgChild4.orgChild4ShortName : positionMasterProfileOld.orgChild3 != null ? positionMasterProfileOld.orgChild3.orgChild3ShortName : positionMasterProfileOld.orgChild2 != null ? positionMasterProfileOld.orgChild2.orgChild2ShortName : positionMasterProfileOld.orgChild1 != null ? positionMasterProfileOld.orgChild1.orgChild1ShortName : positionMasterProfileOld.orgRoot != null ? positionMasterProfileOld.orgRoot.orgRootShortName : "-", profileFullname: posMaster.next_holder == null ? posMaster.current_holder == null ? "- ว่าง -" : `${posMaster.current_holder.prefix}${posMaster.current_holder.firstName} ${posMaster.current_holder.lastName}` : `${posMaster.next_holder.prefix}${posMaster.next_holder.firstName} ${posMaster.next_holder.lastName}`, profilePosMasterNo: posMaster.next_holder == null ? positionMasterOld == null ? "-" : positionMasterOld.posMasterNo : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.posMasterNo, profilePositionName: posMaster.next_holder == null ? positionMasterOld == null ? positionName.join(" หรือ ") : profilePositionName.join(" หรือ ") : posMaster.next_holder.position, profilePosType: posMaster.next_holder == null ? positionMasterOld == null ? posType.join(" หรือ ") : profilePosType.join(" หรือ ") : positionMasterProfileOld == null ? "-" // : posMaster.next_holder.posType.posTypeName, : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posType?.posTypeName, profilePosLevel: posMaster.next_holder == null ? positionMasterOld == null ? posLevel.join(" หรือ ") : profilePosLevel.join(" หรือ ") : positionMasterProfileOld == null ? "-" // : posMaster.next_holder.posLevel.posLevelName, : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posLevel?.posLevelName, profilePosExecutive: posMaster.next_holder == null ? positionMasterOld == null ? posExecutive.join(" หรือ ") : profilePosExecutive.join(" หรือ ") : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posExecutive?.posExecutiveName, education: education == "" ? "" : education.degree, salary: salary == "" ? "" : salary.amount, reason: posMaster.reason, }; if (_node == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName.toString()), profileFullname: posMaster.next_holder == null ? Extension.ToThaiNumber(node.profileOrgName.toString()) : Extension.ToThaiNumber(node.orgTreeName.toString()), posExecutive: Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", profilePosMasterNo: posMaster.next_holder == null ? Extension.ToThaiNumber(node.profileOrgShortName.toString()) : Extension.ToThaiNumber(node.orgTreeShortName.toString()), profilePosExecutive: "", profilePositionName: "", profilePosType: "", profilePosLevel: "", education: "", salary: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == null ? "" : Extension.ToThaiNumber(node.posExecutive.toString()), positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), profilePosMasterNo: Extension.ToThaiNumber(node.profilePosMasterNo.toString()), profilePosExecutive: node.profilePosExecutive == null ? "" : Extension.ToThaiNumber(node.profilePosExecutive.toString()), profilePositionName: node.profilePositionName == null ? "" : Extension.ToThaiNumber(node.profilePositionName.toString()), profilePosType: node.profilePosType == null ? "" : Extension.ToThaiNumber(node.profilePosType.toString()), profilePosLevel: node.profilePosLevel == null ? "" : Extension.ToThaiNumber(node.profilePosLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _node.orgTreeShortName || node.orgTreeName != _node.orgTreeName || node.profileOrgShortName != _node.profileOrgShortName || node.profileOrgName != _node.profileOrgName ) { const head = { posMasterNo: node.orgTreeShortName == _node.orgTreeShortName ? "" : node.orgTreeShortName, profileFullname: node.profileOrgName == _node.profileOrgName ? "" : node.profileOrgName, posExecutive: node.orgTreeName == _node.orgTreeName ? "" : node.orgTreeName, positionName: "", posType: "", posLevel: "", profilePosMasterNo: node.profileOrgShortName == _node.profileOrgShortName ? "" : node.profileOrgShortName, profilePosExecutive: "", profilePositionName: "", profilePosType: "", profilePosLevel: "", education: "", salary: "", reason: "", }; data.push(head); _node == null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == null ? "" : Extension.ToThaiNumber(node.posExecutive.toString()), positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), profilePosMasterNo: Extension.ToThaiNumber(node.profilePosMasterNo.toString()), profilePosExecutive: node.profilePosExecutive == null ? "" : Extension.ToThaiNumber(node.profilePosExecutive.toString()), profilePositionName: node.profilePositionName == null ? "" : Extension.ToThaiNumber(node.profilePositionName.toString()), profilePosType: node.profilePosType == null ? "" : Extension.ToThaiNumber(node.profilePosType.toString()), profilePosLevel: node.profilePosLevel == null ? "" : Extension.ToThaiNumber(node.profilePosLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _node = node; } } console.log("Processing orgChild4"); _node = null; for (let orgChild4 of orgChild4Data.filter( (orgChild4) => orgChild4.orgChild3Id === orgChild3.id, )) { const posMastersFiltered4 = orgChild4.posMasters.sort( (a, b) => a.posMasterOrder - b.posMasterOrder, ); for (let posMaster of posMastersFiltered4) { const positionName = [...new Set(posMaster.positions.map((x) => x.positionName))]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x) => x.posExecutive.posExecutiveName), ), ]; let positionMasterProfileOld: any = null; if (posMaster.next_holder != null && posMaster.next_holder.current_holders) { positionMasterProfileOld = posMaster.next_holder.current_holders.find( (x) => x.orgRevisionId == orgRevisionActive.id, ); } let positionMasterOld: any = null; let profilePositionName: any = []; let profilePosType: any = []; let profilePosLevel: any = []; let profilePosExecutive: any = []; if ( posMaster.ancestorDNA != null && posMaster.ancestorDNA != "" && orgRevisionActive && orgRevisionActive.posMasters ) { positionMasterOld = orgRevisionActive.posMasters.find( (x: any) => x.orgRevisionId == orgRevisionActive.id && x.ancestorDNA == posMaster.ancestorDNA, ); if (positionMasterOld && positionMasterOld.positions) { profilePositionName = [ ...new Set(positionMasterOld.positions.map((x: any) => x.positionName)), ]; profilePosType = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posType != null) .map((x: any) => x.posType.posTypeName), ), ]; profilePosLevel = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posLevel != null) .map((x: any) => x.posLevel.posLevelName), ), ]; profilePosExecutive = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.posExecutive.posExecutiveName), ), ]; } } let education: any = ""; if ( posMaster.next_holder != null && posMaster.next_holder.profileEducations != null && posMaster.next_holder.profileEducations.length > 0 ) { let _education: any = posMaster.next_holder.profileEducations.sort( (a, b) => (b.finishDate == null ? 0 : b.finishDate.getTime()) - (a.finishDate == null ? 0 : a.finishDate.getTime()), ); if (_education.length > 0) { education = _education[0]; } } else { if ( posMaster.current_holder != null && posMaster.current_holder.profileEducations != null && posMaster.current_holder.profileEducations.length > 0 ) { let _education: any = posMaster.current_holder.profileEducations.sort( (a, b) => (b.finishDate == null ? 0 : b.finishDate.getTime()) - (a.finishDate == null ? 0 : a.finishDate.getTime()), ); if (_education.length > 0) { education = _education[0]; } } } let salary: any = ""; if ( posMaster.next_holder != null && posMaster.next_holder.profileSalary != null && posMaster.next_holder.profileSalary.length > 0 ) { let _salary: any = posMaster.next_holder.profileSalary.sort( (a, b) => (b.commandDateAffect == null ? 0 : b.commandDateAffect.getTime()) - (a.commandDateAffect == null ? 0 : a.commandDateAffect.getTime()), ); if (_salary.length > 0) { salary = _salary[0]; } } else { if ( posMaster.current_holder != null && posMaster.current_holder.profileSalary != null && posMaster.current_holder.profileSalary.length > 0 ) { let _salary: any = posMaster.current_holder.profileSalary.sort( (a, b) => (b.commandDateAffect == null ? 0 : b.commandDateAffect.getTime()) - (a.commandDateAffect == null ? 0 : a.commandDateAffect.getTime()), ); if (_salary.length > 0) { salary = _salary[0]; } } } if (positionMasterProfileOld == null && posMaster.next_holder != null && posMaster.next_holder.current_holders == null ) { positionMasterProfileOld = positionMasterOld } let node = { posMasterOrder: posMaster.posMasterOrder, // isSit: posMaster.isSit, // orgTreeName: orgChild4.orgChild4Name, orgTreeShortName: orgChild4.orgChild4ShortName, posMasterNo: posMaster.posMasterNo, positionName: posMaster.next_holder == null ? positionName.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.positionName : posMaster.next_holder.position, posType: posMaster.next_holder == null ? posType.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posType?.posTypeName : posMaster.next_holder.posType == null ? "-" : posMaster.next_holder.posType.posTypeName, posLevel: posMaster.next_holder == null ? posLevel.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posLevel?.posLevelName : posMaster.next_holder.posLevel == null ? "-" : posMaster.next_holder.posLevel.posLevelName, posExecutive: posMaster.next_holder == null ? posExecutive.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posExecutive?.posExecutiveName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posExecutive?.posExecutiveName, profileOrgName: posMaster.next_holder == null ? orgChild4.orgChild4Name : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.orgChild4 != null ? positionMasterProfileOld.orgChild4.orgChild4Name : positionMasterProfileOld.orgChild3 != null ? positionMasterProfileOld.orgChild3.orgChild3Name : positionMasterProfileOld.orgChild2 != null ? positionMasterProfileOld.orgChild2.orgChild2Name : positionMasterProfileOld.orgChild1 != null ? positionMasterProfileOld.orgChild1.orgChild1Name : positionMasterProfileOld.orgRoot != null ? positionMasterProfileOld.orgRoot.orgRootName : "-", profileOrgShortName: posMaster.next_holder == null ? orgChild4.orgChild4ShortName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.orgChild4 != null ? positionMasterProfileOld.orgChild4.orgChild4ShortName : positionMasterProfileOld.orgChild3 != null ? positionMasterProfileOld.orgChild3.orgChild3ShortName : positionMasterProfileOld.orgChild2 != null ? positionMasterProfileOld.orgChild2.orgChild2ShortName : positionMasterProfileOld.orgChild1 != null ? positionMasterProfileOld.orgChild1.orgChild1ShortName : positionMasterProfileOld.orgRoot != null ? positionMasterProfileOld.orgRoot.orgRootShortName : "-", profileFullname: posMaster.next_holder == null ? posMaster.current_holder == null ? "- ว่าง -" : `${posMaster.current_holder.prefix}${posMaster.current_holder.firstName} ${posMaster.current_holder.lastName}` : `${posMaster.next_holder.prefix}${posMaster.next_holder.firstName} ${posMaster.next_holder.lastName}`, profilePosMasterNo: posMaster.next_holder == null ? positionMasterOld == null ? "-" : positionMasterOld.posMasterNo : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.posMasterNo, profilePositionName: posMaster.next_holder == null ? positionMasterOld == null ? positionName.join(" หรือ ") : profilePositionName.join(" หรือ ") : posMaster.next_holder.position, profilePosType: posMaster.next_holder == null ? positionMasterOld == null ? posType.join(" หรือ ") : profilePosType.join(" หรือ ") : positionMasterProfileOld == null ? "-" // : posMaster.next_holder.posType.posTypeName, : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posType?.posTypeName, profilePosLevel: posMaster.next_holder == null ? positionMasterOld == null ? posLevel.join(" หรือ ") : profilePosLevel.join(" หรือ ") : positionMasterProfileOld == null ? "-" // : posMaster.next_holder.posLevel.posLevelName, : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posLevel?.posLevelName, profilePosExecutive: posMaster.next_holder == null ? positionMasterOld == null ? posExecutive.join(" หรือ ") : profilePosExecutive.join(" หรือ ") : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posExecutive?.posExecutiveName, education: education == "" ? "" : education.degree, salary: salary == "" ? "" : salary.amount, reason: posMaster.reason, }; if (_node == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName.toString()), profileFullname: posMaster.next_holder == null ? Extension.ToThaiNumber(node.profileOrgName.toString()) : Extension.ToThaiNumber(node.orgTreeName.toString()), posExecutive: Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", profilePosMasterNo: posMaster.next_holder == null ? Extension.ToThaiNumber(node.profileOrgShortName.toString()) : Extension.ToThaiNumber(node.orgTreeShortName.toString()), profilePosExecutive: "", profilePositionName: "", profilePosType: "", profilePosLevel: "", education: "", salary: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == null ? "" : Extension.ToThaiNumber(node.posExecutive.toString()), positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), profilePosMasterNo: Extension.ToThaiNumber(node.profilePosMasterNo.toString()), profilePosExecutive: node.profilePosExecutive == null ? "" : Extension.ToThaiNumber(node.profilePosExecutive.toString()), profilePositionName: node.profilePositionName == null ? "" : Extension.ToThaiNumber(node.profilePositionName.toString()), profilePosType: node.profilePosType == null ? "" : Extension.ToThaiNumber(node.profilePosType.toString()), profilePosLevel: node.profilePosLevel == null ? "" : Extension.ToThaiNumber(node.profilePosLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _node.orgTreeShortName || node.orgTreeName != _node.orgTreeName || node.profileOrgShortName != _node.profileOrgShortName || node.profileOrgName != _node.profileOrgName ) { const head = { posMasterNo: node.orgTreeShortName == _node.orgTreeShortName ? "" : node.orgTreeShortName, profileFullname: node.profileOrgName == _node.profileOrgName ? "" : node.profileOrgName, posExecutive: node.orgTreeName == _node.orgTreeName ? "" : node.orgTreeName, positionName: "", posType: "", posLevel: "", profilePosMasterNo: node.profileOrgShortName == _node.profileOrgShortName ? "" : node.profileOrgShortName, profilePosExecutive: "", profilePositionName: "", profilePosType: "", profilePosLevel: "", education: "", salary: "", reason: "", }; data.push(head); _node == null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == null ? "" : Extension.ToThaiNumber(node.posExecutive.toString()), positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), profilePosMasterNo: Extension.ToThaiNumber(node.profilePosMasterNo.toString()), profilePosExecutive: node.profilePosExecutive == null ? "" : Extension.ToThaiNumber(node.profilePosExecutive.toString()), profilePositionName: node.profilePositionName == null ? "" : Extension.ToThaiNumber(node.profilePositionName.toString()), profilePosType: node.profilePosType == null ? "" : Extension.ToThaiNumber(node.profilePosType.toString()), profilePosLevel: node.profilePosLevel == null ? "" : Extension.ToThaiNumber(node.profilePosLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _node = node; } _node = null; } // End for orgChild4 } // End for orgChild3 } // End for orgChild2 } // End for orgChild1 } // End for orgRoot // const metaData = { template: "report2", reportName: "report2", data: { data } }; // sendWebSocket(metaData); // })(); return new HttpSuccess({ template: "report2", reportName: "report2", data: { org: orgName, data }, }); } /** * API Report2 * * @summary Report2 * */ @Get("report2-history/{rootId}") async findReport2History(@Path() rootId: string) { const orgRootData = await this.orgRootRepository.find({ where: { id: rootId, }, order: { orgRootOrder: "ASC" }, relations: [ "orgRevision", "posMasters", "posMasters.orgRoot", "posMasters.orgChild1", "posMasters.orgChild2", "posMasters.orgChild3", "posMasters.orgChild4", "posMasters.current_holder", "posMasters.current_holder.posLevel", "posMasters.current_holder.posType", "posMasters.current_holder.profileSalary", "posMasters.current_holder.profileEducations", "posMasters.current_holder.current_holders", "posMasters.current_holder.current_holders.positions", "posMasters.current_holder.current_holders.orgRoot", "posMasters.current_holder.current_holders.orgChild1", "posMasters.current_holder.current_holders.orgChild2", "posMasters.current_holder.current_holders.orgChild3", "posMasters.current_holder.current_holders.orgChild4", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); const orgRootIds = orgRootData.map((orgRoot) => orgRoot.id) || null; const orgChild1Data = await this.child1Repository.find({ where: { orgRootId: In(orgRootIds), }, order: { orgChild1Order: "ASC" }, relations: [ "posMasters", "posMasters.current_holder", "posMasters.current_holder.profileSalary", "posMasters.current_holder.profileEducations", "posMasters.positions", ], }); const orgChild1Ids = orgChild1Data.map((orgChild1) => orgChild1.id) || null; const orgChild2Data = await this.child2Repository.find({ where: { orgChild1: In(orgChild1Ids), }, order: { orgChild2Order: "ASC" }, relations: [ "posMasters", "posMasters.current_holder", "posMasters.current_holder.profileSalary", "posMasters.current_holder.profileEducations", "posMasters.positions", ], }); const orgChild2Ids = orgChild2Data.map((orgChild2) => orgChild2.id) || null; const orgChild3Data = await this.child3Repository.find({ where: { orgChild2: In(orgChild2Ids), }, order: { orgChild3Order: "ASC" }, relations: [ "posMasters", "posMasters.current_holder", "posMasters.current_holder.profileSalary", "posMasters.current_holder.profileEducations", "posMasters.positions", ], }); const orgChild3Ids = orgChild3Data.map((orgChild3) => orgChild3.id) || null; const orgChild4Data = await this.child4Repository.find({ where: { orgChild3: In(orgChild3Ids), }, order: { orgChild4Order: "ASC" }, relations: [ "posMasters", "posMasters.current_holder", "posMasters.current_holder.profileSalary", "posMasters.current_holder.profileEducations", "posMasters.positions", ], }); if (orgRootData.length <= 0) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบโครงสร้าง"); const _orgRevisionActive = await this.orgRevisionRepository.find({ where: { createdAt: LessThan(orgRootData[0]?.createdAt ?? new Date()) }, order: { createdAt: "DESC" }, skip: 1, take: 2, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); if (_orgRevisionActive.length <= 0) { throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูลประวัติโครงสร้าง"); } let orgRevisionActive = _orgRevisionActive[0]; let data = new Array(); let _node: any; let no = 1; for (let orgRoot of orgRootData) { await Promise.all( orgRoot.posMasters .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { if (posMaster.orgChild1Id == null) { const positionName = [...new Set(posMaster.positions.map((x) => x.positionName))]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x) => x.posExecutive.posExecutiveName), ), ]; let positionMasterProfileOld: any = null; if (posMaster.current_holder != null) { positionMasterProfileOld = posMaster.current_holder.current_holders.find( (x) => x.orgRevisionId == orgRevisionActive.id, ); } let positionMasterOld: any = null; let profilePositionName: any = []; let profilePosType: any = []; let profilePosLevel: any = []; let profilePosExecutive: any = []; if (posMaster.ancestorDNA != null && posMaster.ancestorDNA != "") { positionMasterOld = orgRevisionActive.posMasters.find( (x: any) => x.orgRevisionId == orgRevisionActive.id && x.ancestorDNA == posMaster.ancestorDNA, ); profilePositionName = [ ...new Set(positionMasterOld.positions.map((x: any) => x.positionName)), ]; profilePosType = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posType != null) .map((x: any) => x.posType.posTypeName), ), ]; profilePosLevel = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posLevel != null) .map((x: any) => x.posLevel.posLevelName), ), ]; profilePosExecutive = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.posExecutive.posExecutiveName), ), ]; } let education: any = ""; if ( posMaster.current_holder != null && posMaster.current_holder.profileEducations != null && posMaster.current_holder.profileEducations.length > 0 ) { let _education: any = posMaster.current_holder.profileEducations .filter((x) => x.isEducation == true || x.isUse == true) .sort((a, b) => { // (b.finishDate == null ? 0 : b.finishDate.getTime()) - // (a.finishDate == null ? 0 : a.finishDate.getTime()), if (a.isEducation !== b.isEducation) { return a.isEducation ? -1 : 1; } return b.level - a.level; }); if (_education.length > 0) { // education = _education[0]; education = _education.map((e: any) => e.degree).join(", "); } } let salary: any = ""; if ( posMaster.current_holder != null && posMaster.current_holder.profileSalary != null && posMaster.current_holder.profileSalary.length > 0 ) { let _salary: any = posMaster.current_holder.profileSalary.sort( (a, b) => (b.commandDateAffect == null ? 0 : b.commandDateAffect.getTime()) - (a.commandDateAffect == null ? 0 : a.commandDateAffect.getTime()), ); if (_salary.length > 0) { salary = _salary[0]; } } let node = { posMasterOrder: posMaster.posMasterOrder, // isSit: posMaster.isSit, // orgTreeName: orgRoot.orgRootName, orgTreeShortName: orgRoot.orgRootShortName, posMasterNo: posMaster.posMasterNo, positionName: posMaster.current_holder == null ? positionName.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.positionName : posMaster.current_holder.position, posType: posMaster.current_holder == null ? posType.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true)?.posType ?.posTypeName : posMaster.current_holder.posType == null ? "-" : posMaster.current_holder.posType.posTypeName, posLevel: posMaster.current_holder == null ? posLevel.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true)?.posLevel ?.posLevelName : posMaster.current_holder.posLevel == null ? "-" : posMaster.current_holder.posLevel.posLevelName, posExecutive: posMaster.current_holder == null ? posExecutive.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posExecutive?.posExecutiveName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posExecutive?.posExecutiveName, profileOrgName: posMaster.current_holder == null ? orgRoot.orgRootName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.orgChild4 != null ? positionMasterProfileOld.orgChild4.orgChild4Name : positionMasterProfileOld.orgChild3 != null ? positionMasterProfileOld.orgChild3.orgChild3Name : positionMasterProfileOld.orgChild2 != null ? positionMasterProfileOld.orgChild2.orgChild2Name : positionMasterProfileOld.orgChild1 != null ? positionMasterProfileOld.orgChild1.orgChild1Name : positionMasterProfileOld.orgRoot != null ? positionMasterProfileOld.orgRoot.orgRootName : "-", profileOrgShortName: posMaster.current_holder == null ? orgRoot.orgRootShortName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.orgChild4 != null ? positionMasterProfileOld.orgChild4.orgChild4ShortName : positionMasterProfileOld.orgChild3 != null ? positionMasterProfileOld.orgChild3.orgChild3ShortName : positionMasterProfileOld.orgChild2 != null ? positionMasterProfileOld.orgChild2.orgChild2ShortName : positionMasterProfileOld.orgChild1 != null ? positionMasterProfileOld.orgChild1.orgChild1ShortName : positionMasterProfileOld.orgRoot != null ? positionMasterProfileOld.orgRoot.orgRootShortName : "-", profileFullname: posMaster.current_holder == null ? "- ว่าง -" : `${posMaster.current_holder.prefix}${posMaster.current_holder.firstName} ${posMaster.current_holder.lastName}`, profilePosMasterNo: posMaster.current_holder == null ? positionMasterOld == null ? "-" : positionMasterOld.posMasterNo : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.posMasterNo, profilePositionName: posMaster.current_holder == null ? positionMasterOld == null ? positionName.join(" หรือ ") : profilePositionName.join(" หรือ ") : posMaster.current_holder.position, profilePosType: posMaster.current_holder == null ? positionMasterOld == null ? posType.join(" หรือ ") : profilePosType.join(" หรือ ") : posMaster.current_holder.posType == null ? "-" : posMaster.current_holder.posType.posTypeName, profilePosLevel: posMaster.current_holder == null ? positionMasterOld == null ? posLevel.join(" หรือ ") : profilePosLevel.join(" หรือ ") : posMaster.current_holder.posLevel == null ? "-" : posMaster.current_holder.posLevel.posLevelName, profilePosExecutive: posMaster.current_holder == null ? positionMasterOld == null ? posExecutive.join(" หรือ ") : profilePosExecutive.join(" หรือ ") : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posExecutive?.posExecutiveName, education: education == "" ? "" : education, salary: salary == "" ? "" : salary.amount, reason: posMaster.reason, }; if (_node == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName.toString()), profileFullname: Extension.ToThaiNumber(node.profileOrgName.toString()), posExecutive: Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", profilePosMasterNo: Extension.ToThaiNumber(node.profileOrgShortName.toString()), profilePosExecutive: "", profilePositionName: "", profilePosType: "", profilePosLevel: "", education: "", salary: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == null ? "" : Extension.ToThaiNumber(node.posExecutive.toString()), positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), profilePosMasterNo: Extension.ToThaiNumber(node.profilePosMasterNo.toString()), profilePosExecutive: node.profilePosExecutive == null ? "" : Extension.ToThaiNumber(node.profilePosExecutive.toString()), profilePositionName: node.profilePositionName == null ? "" : Extension.ToThaiNumber(node.profilePositionName.toString()), profilePosType: node.profilePosType == null ? "" : Extension.ToThaiNumber(node.profilePosType.toString()), profilePosLevel: node.profilePosLevel == null ? "" : Extension.ToThaiNumber(node.profilePosLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _node.orgTreeShortName || node.orgTreeName != _node.orgTreeName || node.profileOrgShortName != _node.profileOrgShortName || node.profileOrgName != _node.profileOrgName ) { const head = { posMasterNo: node.orgTreeShortName == _node.orgTreeShortName ? "" : node.orgTreeShortName, profileFullname: node.profileOrgName == _node.profileOrgName ? "" : node.profileOrgName, posExecutive: node.orgTreeName == _node.orgTreeName ? "" : node.orgTreeName, positionName: "", posType: "", posLevel: "", profilePosMasterNo: node.profileOrgShortName == _node.profileOrgShortName ? "" : node.profileOrgShortName, profilePosExecutive: "", profilePositionName: "", profilePosType: "", profilePosLevel: "", education: "", salary: "", reason: "", }; data.push(head); _node == null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == null ? "" : Extension.ToThaiNumber(node.posExecutive.toString()), positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), profilePosMasterNo: Extension.ToThaiNumber(node.profilePosMasterNo.toString()), profilePosExecutive: node.profilePosExecutive == null ? "" : Extension.ToThaiNumber(node.profilePosExecutive.toString()), profilePositionName: node.profilePositionName == null ? "" : Extension.ToThaiNumber(node.profilePositionName.toString()), profilePosType: node.profilePosType == null ? "" : Extension.ToThaiNumber(node.profilePosType.toString()), profilePosLevel: node.profilePosLevel == null ? "" : Extension.ToThaiNumber(node.profilePosLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _node = node; } }), ); _node = null; for (let orgChild1 of orgChild1Data.filter( (orgChild1) => orgChild1.orgRootId === orgRoot.id, )) { await Promise.all( orgChild1.posMasters .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { if (posMaster.orgChild2Id == null) { const positionName = [...new Set(posMaster.positions.map((x) => x.positionName))]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x) => x.posExecutive.posExecutiveName), ), ]; let positionMasterProfileOld: any = null; if (posMaster.current_holder != null) { positionMasterProfileOld = posMaster.current_holder.current_holders.find( (x) => x.orgRevisionId == orgRevisionActive.id, ); } let positionMasterOld: any = null; let profilePositionName: any = []; let profilePosType: any = []; let profilePosLevel: any = []; let profilePosExecutive: any = []; if (posMaster.ancestorDNA != null && posMaster.ancestorDNA != "") { positionMasterOld = orgRevisionActive.posMasters.find( (x: any) => x.orgRevisionId == orgRevisionActive.id && x.ancestorDNA == posMaster.ancestorDNA, ); profilePositionName = [ ...new Set(positionMasterOld.positions.map((x: any) => x.positionName)), ]; profilePosType = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posType != null) .map((x: any) => x.posType.posTypeName), ), ]; profilePosLevel = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posLevel != null) .map((x: any) => x.posLevel.posLevelName), ), ]; profilePosExecutive = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.posExecutive.posExecutiveName), ), ]; } let education: any = ""; if ( posMaster.current_holder != null && posMaster.current_holder.profileEducations != null && posMaster.current_holder.profileEducations.length > 0 ) { let _education: any = posMaster.current_holder.profileEducations .filter((x) => x.isEducation == true || x.isUse == true) .sort((a, b) => { if (a.isEducation !== b.isEducation) { return a.isEducation ? -1 : 1; } return b.level - a.level; }); if (_education.length > 0) { education = _education.map((e: any) => e.degree).join(", "); } } let salary: any = ""; if ( posMaster.current_holder != null && posMaster.current_holder.profileSalary != null && posMaster.current_holder.profileSalary.length > 0 ) { let _salary: any = posMaster.current_holder.profileSalary.sort( (a, b) => (b.commandDateAffect == null ? 0 : b.commandDateAffect.getTime()) - (a.commandDateAffect == null ? 0 : a.commandDateAffect.getTime()), ); if (_salary.length > 0) { salary = _salary[0]; } } let node = { posMasterOrder: posMaster.posMasterOrder, // isSit: posMaster.isSit, // orgTreeName: orgChild1.orgChild1Name, orgTreeShortName: orgChild1.orgChild1ShortName, posMasterNo: posMaster.posMasterNo, positionName: posMaster.current_holder == null ? positionName.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.positionName : posMaster.current_holder.position, posType: posMaster.current_holder == null ? posType.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posType?.posTypeName : posMaster.current_holder.posType == null ? "-" : posMaster.current_holder.posType.posTypeName, posLevel: posMaster.current_holder == null ? posLevel.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posLevel?.posLevelName : posMaster.current_holder.posLevel == null ? "-" : posMaster.current_holder.posLevel.posLevelName, posExecutive: posMaster.current_holder == null ? posExecutive.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posExecutive?.posExecutiveName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posExecutive?.posExecutiveName, profileOrgName: posMaster.current_holder == null ? orgChild1.orgChild1Name : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.orgChild4 != null ? positionMasterProfileOld.orgChild4.orgChild4Name : positionMasterProfileOld.orgChild3 != null ? positionMasterProfileOld.orgChild3.orgChild3Name : positionMasterProfileOld.orgChild2 != null ? positionMasterProfileOld.orgChild2.orgChild2Name : positionMasterProfileOld.orgChild1 != null ? positionMasterProfileOld.orgChild1.orgChild1Name : positionMasterProfileOld.orgRoot != null ? positionMasterProfileOld.orgRoot.orgRootName : "-", profileOrgShortName: posMaster.current_holder == null ? orgChild1.orgChild1ShortName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.orgChild4 != null ? positionMasterProfileOld.orgChild4.orgChild4ShortName : positionMasterProfileOld.orgChild3 != null ? positionMasterProfileOld.orgChild3.orgChild3ShortName : positionMasterProfileOld.orgChild2 != null ? positionMasterProfileOld.orgChild2.orgChild2ShortName : positionMasterProfileOld.orgChild1 != null ? positionMasterProfileOld.orgChild1.orgChild1ShortName : positionMasterProfileOld.orgRoot != null ? positionMasterProfileOld.orgRoot.orgRootShortName : "-", profileFullname: posMaster.current_holder == null ? "- ว่าง -" : `${posMaster.current_holder.prefix}${posMaster.current_holder.firstName} ${posMaster.current_holder.lastName}`, profilePosMasterNo: posMaster.current_holder == null ? positionMasterOld == null ? "-" : positionMasterOld.posMasterNo : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.posMasterNo, profilePositionName: posMaster.current_holder == null ? positionMasterOld == null ? positionName.join(" หรือ ") : profilePositionName.join(" หรือ ") : posMaster.current_holder.position, profilePosType: posMaster.current_holder == null ? positionMasterOld == null ? posType.join(" หรือ ") : profilePosType.join(" หรือ ") : posMaster.current_holder.posType == null ? "-" : posMaster.current_holder.posType.posTypeName, profilePosLevel: posMaster.current_holder == null ? positionMasterOld == null ? posLevel.join(" หรือ ") : profilePosLevel.join(" หรือ ") : posMaster.current_holder.posLevel == null ? "-" : posMaster.current_holder.posLevel.posLevelName, profilePosExecutive: posMaster.current_holder == null ? positionMasterOld == null ? posExecutive.join(" หรือ ") : profilePosExecutive.join(" หรือ ") : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posExecutive?.posExecutiveName, education: education == "" ? "" : education, salary: salary == "" ? "" : salary.amount, reason: posMaster.reason, }; if (_node == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName.toString()), profileFullname: Extension.ToThaiNumber(node.profileOrgName.toString()), posExecutive: Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", profilePosMasterNo: Extension.ToThaiNumber(node.profileOrgShortName.toString()), profilePosExecutive: "", profilePositionName: "", profilePosType: "", profilePosLevel: "", education: "", salary: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == null ? "" : Extension.ToThaiNumber(node.posExecutive.toString()), positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), profilePosMasterNo: Extension.ToThaiNumber(node.profilePosMasterNo.toString()), profilePosExecutive: node.profilePosExecutive == null ? "" : Extension.ToThaiNumber(node.profilePosExecutive.toString()), profilePositionName: node.profilePositionName == null ? "" : Extension.ToThaiNumber(node.profilePositionName.toString()), profilePosType: node.profilePosType == null ? "" : Extension.ToThaiNumber(node.profilePosType.toString()), profilePosLevel: node.profilePosLevel == null ? "" : Extension.ToThaiNumber(node.profilePosLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _node.orgTreeShortName || node.orgTreeName != _node.orgTreeName || node.profileOrgShortName != _node.profileOrgShortName || node.profileOrgName != _node.profileOrgName ) { const head = { posMasterNo: node.orgTreeShortName == _node.orgTreeShortName ? "" : node.orgTreeShortName, profileFullname: node.profileOrgName == _node.profileOrgName ? "" : node.profileOrgName, posExecutive: node.orgTreeName == _node.orgTreeName ? "" : node.orgTreeName, positionName: "", posType: "", posLevel: "", profilePosMasterNo: node.profileOrgShortName == _node.profileOrgShortName ? "" : node.profileOrgShortName, profilePosExecutive: "", profilePositionName: "", profilePosType: "", profilePosLevel: "", education: "", salary: "", reason: "", }; data.push(head); _node == null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == null ? "" : Extension.ToThaiNumber(node.posExecutive.toString()), positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), profilePosMasterNo: Extension.ToThaiNumber(node.profilePosMasterNo.toString()), profilePosExecutive: node.profilePosExecutive == null ? "" : Extension.ToThaiNumber(node.profilePosExecutive.toString()), profilePositionName: node.profilePositionName == null ? "" : Extension.ToThaiNumber(node.profilePositionName.toString()), profilePosType: node.profilePosType == null ? "" : Extension.ToThaiNumber(node.profilePosType.toString()), profilePosLevel: node.profilePosLevel == null ? "" : Extension.ToThaiNumber(node.profilePosLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _node = node; } }), ); _node = null; for (let orgChild2 of orgChild2Data.filter( (orgChild2) => orgChild2.orgChild1Id === orgChild1.id, )) { await Promise.all( orgChild2.posMasters .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { if (posMaster.orgChild3Id == null) { const positionName = [...new Set(posMaster.positions.map((x) => x.positionName))]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x) => x.posExecutive.posExecutiveName), ), ]; let positionMasterProfileOld: any = null; if (posMaster.current_holder != null) { positionMasterProfileOld = posMaster.current_holder.current_holders.find( (x) => x.orgRevisionId == orgRevisionActive.id, ); } let positionMasterOld: any = null; let profilePositionName: any = []; let profilePosType: any = []; let profilePosLevel: any = []; let profilePosExecutive: any = []; if (posMaster.ancestorDNA != null && posMaster.ancestorDNA != "") { positionMasterOld = orgRevisionActive.posMasters.find( (x: any) => x.orgRevisionId == orgRevisionActive.id && x.ancestorDNA == posMaster.ancestorDNA, ); profilePositionName = [ ...new Set(positionMasterOld.positions.map((x: any) => x.positionName)), ]; profilePosType = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posType != null) .map((x: any) => x.posType.posTypeName), ), ]; profilePosLevel = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posLevel != null) .map((x: any) => x.posLevel.posLevelName), ), ]; profilePosExecutive = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.posExecutive.posExecutiveName), ), ]; } let education: any = ""; if ( posMaster.current_holder != null && posMaster.current_holder.profileEducations != null && posMaster.current_holder.profileEducations.length > 0 ) { let _education: any = posMaster.current_holder.profileEducations .filter((x) => x.isEducation == true || x.isUse == true) .sort((a, b) => { if (a.isEducation !== b.isEducation) { return a.isEducation ? -1 : 1; } return b.level - a.level; }); if (_education.length > 0) { education = _education.map((e: any) => e.degree).join(", "); } } let salary: any = ""; if ( posMaster.current_holder != null && posMaster.current_holder.profileSalary != null && posMaster.current_holder.profileSalary.length > 0 ) { let _salary: any = posMaster.current_holder.profileSalary.sort( (a, b) => (b.commandDateAffect == null ? 0 : b.commandDateAffect.getTime()) - (a.commandDateAffect == null ? 0 : a.commandDateAffect.getTime()), ); if (_salary.length > 0) { salary = _salary[0]; } } let node = { posMasterOrder: posMaster.posMasterOrder, // isSit: posMaster.isSit, // orgTreeName: orgChild2.orgChild2Name, orgTreeShortName: orgChild2.orgChild2ShortName, posMasterNo: posMaster.posMasterNo, positionName: posMaster.current_holder == null ? positionName.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.positionName : posMaster.current_holder.position, posType: posMaster.current_holder == null ? posType.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posType?.posTypeName : posMaster.current_holder.posType == null ? "-" : posMaster.current_holder.posType.posTypeName, posLevel: posMaster.current_holder == null ? posLevel.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posLevel?.posLevelName : posMaster.current_holder.posLevel == null ? "-" : posMaster.current_holder.posLevel.posLevelName, posExecutive: posMaster.current_holder == null ? posExecutive.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posExecutive?.posExecutiveName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posExecutive?.posExecutiveName, profileOrgName: posMaster.current_holder == null ? orgChild2.orgChild2Name : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.orgChild4 != null ? positionMasterProfileOld.orgChild4.orgChild4Name : positionMasterProfileOld.orgChild3 != null ? positionMasterProfileOld.orgChild3.orgChild3Name : positionMasterProfileOld.orgChild2 != null ? positionMasterProfileOld.orgChild2.orgChild2Name : positionMasterProfileOld.orgChild1 != null ? positionMasterProfileOld.orgChild1.orgChild1Name : positionMasterProfileOld.orgRoot != null ? positionMasterProfileOld.orgRoot.orgRootName : "-", profileOrgShortName: posMaster.current_holder == null ? orgChild2.orgChild2ShortName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.orgChild4 != null ? positionMasterProfileOld.orgChild4.orgChild4ShortName : positionMasterProfileOld.orgChild3 != null ? positionMasterProfileOld.orgChild3.orgChild3ShortName : positionMasterProfileOld.orgChild2 != null ? positionMasterProfileOld.orgChild2.orgChild2ShortName : positionMasterProfileOld.orgChild1 != null ? positionMasterProfileOld.orgChild1.orgChild1ShortName : positionMasterProfileOld.orgRoot != null ? positionMasterProfileOld.orgRoot.orgRootShortName : "-", profileFullname: posMaster.current_holder == null ? "- ว่าง -" : `${posMaster.current_holder.prefix}${posMaster.current_holder.firstName} ${posMaster.current_holder.lastName}`, profilePosMasterNo: posMaster.current_holder == null ? positionMasterOld == null ? "-" : positionMasterOld.posMasterNo : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.posMasterNo, profilePositionName: posMaster.current_holder == null ? positionMasterOld == null ? positionName.join(" หรือ ") : profilePositionName.join(" หรือ ") : posMaster.current_holder.position, profilePosType: posMaster.current_holder == null ? positionMasterOld == null ? posType.join(" หรือ ") : profilePosType.join(" หรือ ") : posMaster.current_holder.posType == null ? "-" : posMaster.current_holder.posType.posTypeName, profilePosLevel: posMaster.current_holder == null ? positionMasterOld == null ? posLevel.join(" หรือ ") : profilePosLevel.join(" หรือ ") : posMaster.current_holder.posLevel == null ? "-" : posMaster.current_holder.posLevel.posLevelName, profilePosExecutive: posMaster.current_holder == null ? positionMasterOld == null ? posExecutive.join(" หรือ ") : profilePosExecutive.join(" หรือ ") : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posExecutive?.posExecutiveName, education: education == "" ? "" : education, salary: salary == "" ? "" : salary.amount, reason: posMaster.reason, }; if (_node == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName.toString()), profileFullname: Extension.ToThaiNumber(node.profileOrgName.toString()), posExecutive: Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", profilePosMasterNo: Extension.ToThaiNumber( node.profileOrgShortName.toString(), ), profilePosExecutive: "", profilePositionName: "", profilePosType: "", profilePosLevel: "", education: "", salary: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == null ? "" : Extension.ToThaiNumber(node.posExecutive.toString()), positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), profilePosMasterNo: Extension.ToThaiNumber( node.profilePosMasterNo.toString(), ), profilePosExecutive: node.profilePosExecutive == null ? "" : Extension.ToThaiNumber(node.profilePosExecutive.toString()), profilePositionName: node.profilePositionName == null ? "" : Extension.ToThaiNumber(node.profilePositionName.toString()), profilePosType: node.profilePosType == null ? "" : Extension.ToThaiNumber(node.profilePosType.toString()), profilePosLevel: node.profilePosLevel == null ? "" : Extension.ToThaiNumber(node.profilePosLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _node.orgTreeShortName || node.orgTreeName != _node.orgTreeName || node.profileOrgShortName != _node.profileOrgShortName || node.profileOrgName != _node.profileOrgName ) { const head = { posMasterNo: node.orgTreeShortName == _node.orgTreeShortName ? "" : node.orgTreeShortName, profileFullname: node.profileOrgName == _node.profileOrgName ? "" : node.profileOrgName, posExecutive: node.orgTreeName == _node.orgTreeName ? "" : node.orgTreeName, positionName: "", posType: "", posLevel: "", profilePosMasterNo: node.profileOrgShortName == _node.profileOrgShortName ? "" : node.profileOrgShortName, profilePosExecutive: "", profilePositionName: "", profilePosType: "", profilePosLevel: "", education: "", salary: "", reason: "", }; data.push(head); _node == null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == null ? "" : Extension.ToThaiNumber(node.posExecutive.toString()), positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), profilePosMasterNo: Extension.ToThaiNumber( node.profilePosMasterNo.toString(), ), profilePosExecutive: node.profilePosExecutive == null ? "" : Extension.ToThaiNumber(node.profilePosExecutive.toString()), profilePositionName: node.profilePositionName == null ? "" : Extension.ToThaiNumber(node.profilePositionName.toString()), profilePosType: node.profilePosType == null ? "" : Extension.ToThaiNumber(node.profilePosType.toString()), profilePosLevel: node.profilePosLevel == null ? "" : Extension.ToThaiNumber(node.profilePosLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _node = node; } }), ); _node = null; for (let orgChild3 of orgChild3Data.filter( (orgChild3) => orgChild3.orgChild2Id === orgChild2.id, )) { await Promise.all( orgChild3.posMasters .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { if (posMaster.orgChild4Id == null) { const positionName = [ ...new Set(posMaster.positions.map((x) => x.positionName)), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x) => x.posExecutive.posExecutiveName), ), ]; let positionMasterProfileOld: any = null; if (posMaster.current_holder != null) { positionMasterProfileOld = posMaster.current_holder.current_holders.find( (x) => x.orgRevisionId == orgRevisionActive.id, ); } let positionMasterOld: any = null; let profilePositionName: any = []; let profilePosType: any = []; let profilePosLevel: any = []; let profilePosExecutive: any = []; if (posMaster.ancestorDNA != null && posMaster.ancestorDNA != "") { positionMasterOld = orgRevisionActive.posMasters.find( (x: any) => x.orgRevisionId == orgRevisionActive.id && x.ancestorDNA == posMaster.ancestorDNA, ); profilePositionName = [ ...new Set(positionMasterOld.positions.map((x: any) => x.positionName)), ]; profilePosType = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posType != null) .map((x: any) => x.posType.posTypeName), ), ]; profilePosLevel = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posLevel != null) .map((x: any) => x.posLevel.posLevelName), ), ]; profilePosExecutive = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.posExecutive.posExecutiveName), ), ]; } let education: any = ""; if ( posMaster.current_holder != null && posMaster.current_holder.profileEducations != null && posMaster.current_holder.profileEducations.length > 0 ) { let _education: any = posMaster.current_holder.profileEducations .filter((x) => x.isEducation == true || x.isUse == true) .sort((a, b) => { if (a.isEducation !== b.isEducation) { return a.isEducation ? -1 : 1; } return b.level - a.level; }); if (_education.length > 0) { education = _education.map((e: any) => e.degree).join(", "); } } let salary: any = ""; if ( posMaster.current_holder != null && posMaster.current_holder.profileSalary != null && posMaster.current_holder.profileSalary.length > 0 ) { let _salary: any = posMaster.current_holder.profileSalary.sort( (a, b) => (b.commandDateAffect == null ? 0 : b.commandDateAffect.getTime()) - (a.commandDateAffect == null ? 0 : a.commandDateAffect.getTime()), ); if (_salary.length > 0) { salary = _salary[0]; } } let node = { posMasterOrder: posMaster.posMasterOrder, // isSit: posMaster.isSit, // orgTreeName: orgChild3.orgChild3Name, orgTreeShortName: orgChild3.orgChild3ShortName, posMasterNo: posMaster.posMasterNo, positionName: posMaster.current_holder == null ? positionName.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.positionName : posMaster.current_holder.position, posType: posMaster.current_holder == null ? posType.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posType?.posTypeName : posMaster.current_holder.posType == null ? "-" : posMaster.current_holder.posType.posTypeName, posLevel: posMaster.current_holder == null ? posLevel.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posLevel?.posLevelName : posMaster.current_holder.posLevel == null ? "-" : posMaster.current_holder.posLevel.posLevelName, posExecutive: posMaster.current_holder == null ? posExecutive.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posExecutive?.posExecutiveName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posExecutive?.posExecutiveName, profileOrgName: posMaster.current_holder == null ? orgChild3.orgChild3Name : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.orgChild4 != null ? positionMasterProfileOld.orgChild4.orgChild4Name : positionMasterProfileOld.orgChild3 != null ? positionMasterProfileOld.orgChild3.orgChild3Name : positionMasterProfileOld.orgChild2 != null ? positionMasterProfileOld.orgChild2.orgChild2Name : positionMasterProfileOld.orgChild1 != null ? positionMasterProfileOld.orgChild1.orgChild1Name : positionMasterProfileOld.orgRoot != null ? positionMasterProfileOld.orgRoot.orgRootName : "-", profileOrgShortName: posMaster.current_holder == null ? orgChild3.orgChild3ShortName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.orgChild4 != null ? positionMasterProfileOld.orgChild4.orgChild4ShortName : positionMasterProfileOld.orgChild3 != null ? positionMasterProfileOld.orgChild3.orgChild3ShortName : positionMasterProfileOld.orgChild2 != null ? positionMasterProfileOld.orgChild2.orgChild2ShortName : positionMasterProfileOld.orgChild1 != null ? positionMasterProfileOld.orgChild1.orgChild1ShortName : positionMasterProfileOld.orgRoot != null ? positionMasterProfileOld.orgRoot.orgRootShortName : "-", profileFullname: posMaster.current_holder == null ? "- ว่าง -" : `${posMaster.current_holder.prefix}${posMaster.current_holder.firstName} ${posMaster.current_holder.lastName}`, profilePosMasterNo: posMaster.current_holder == null ? positionMasterOld == null ? "-" : positionMasterOld.posMasterNo : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.posMasterNo, profilePositionName: posMaster.current_holder == null ? positionMasterOld == null ? positionName.join(" หรือ ") : profilePositionName.join(" หรือ ") : posMaster.current_holder.position, profilePosType: posMaster.current_holder == null ? positionMasterOld == null ? posType.join(" หรือ ") : profilePosType.join(" หรือ ") : posMaster.current_holder.posType == null ? "-" : posMaster.current_holder.posType.posTypeName, profilePosLevel: posMaster.current_holder == null ? positionMasterOld == null ? posLevel.join(" หรือ ") : profilePosLevel.join(" หรือ ") : posMaster.current_holder.posLevel == null ? "-" : posMaster.current_holder.posLevel.posLevelName, profilePosExecutive: posMaster.current_holder == null ? positionMasterOld == null ? posExecutive.join(" หรือ ") : profilePosExecutive.join(" หรือ ") : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posExecutive?.posExecutiveName, education: education == "" ? "" : education, salary: salary == "" ? "" : salary.amount, reason: posMaster.reason, }; if (_node == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName.toString()), profileFullname: Extension.ToThaiNumber(node.profileOrgName.toString()), posExecutive: Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", profilePosMasterNo: Extension.ToThaiNumber( node.profileOrgShortName.toString(), ), profilePosExecutive: "", profilePositionName: "", profilePosType: "", profilePosLevel: "", education: "", salary: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == null ? "" : Extension.ToThaiNumber(node.posExecutive.toString()), positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), profilePosMasterNo: Extension.ToThaiNumber( node.profilePosMasterNo.toString(), ), profilePosExecutive: node.profilePosExecutive == null ? "" : Extension.ToThaiNumber(node.profilePosExecutive.toString()), profilePositionName: node.profilePositionName == null ? "" : Extension.ToThaiNumber(node.profilePositionName.toString()), profilePosType: node.profilePosType == null ? "" : Extension.ToThaiNumber(node.profilePosType.toString()), profilePosLevel: node.profilePosLevel == null ? "" : Extension.ToThaiNumber(node.profilePosLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _node.orgTreeShortName || node.orgTreeName != _node.orgTreeName || node.profileOrgShortName != _node.profileOrgShortName || node.profileOrgName != _node.profileOrgName ) { const head = { posMasterNo: node.orgTreeShortName == _node.orgTreeShortName ? "" : node.orgTreeShortName, profileFullname: node.profileOrgName == _node.profileOrgName ? "" : node.profileOrgName, posExecutive: node.orgTreeName == _node.orgTreeName ? "" : node.orgTreeName, positionName: "", posType: "", posLevel: "", profilePosMasterNo: node.profileOrgShortName == _node.profileOrgShortName ? "" : node.profileOrgShortName, profilePosExecutive: "", profilePositionName: "", profilePosType: "", profilePosLevel: "", education: "", salary: "", reason: "", }; data.push(head); _node == null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == null ? "" : Extension.ToThaiNumber(node.posExecutive.toString()), positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), profilePosMasterNo: Extension.ToThaiNumber( node.profilePosMasterNo.toString(), ), profilePosExecutive: node.profilePosExecutive == null ? "" : Extension.ToThaiNumber(node.profilePosExecutive.toString()), profilePositionName: node.profilePositionName == null ? "" : Extension.ToThaiNumber(node.profilePositionName.toString()), profilePosType: node.profilePosType == null ? "" : Extension.ToThaiNumber(node.profilePosType.toString()), profilePosLevel: node.profilePosLevel == null ? "" : Extension.ToThaiNumber(node.profilePosLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _node = node; } }), ); _node = null; for (let orgChild4 of orgChild4Data.filter( (orgChild4) => orgChild4.orgChild3Id === orgChild3.id, )) { await Promise.all( orgChild4.posMasters .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { const positionName = [ ...new Set(posMaster.positions.map((x) => x.positionName)), ]; const posType = [ ...new Set( posMaster.positions .filter((x: any) => x.posType != null) .map((x) => x.posType.posTypeName), ), ]; const posLevel = [ ...new Set( posMaster.positions .filter((x: any) => x.posLevel != null) .map((x) => x.posLevel.posLevelName), ), ]; const posExecutive = [ ...new Set( posMaster.positions .filter((x: any) => x.posExecutive != null) .map((x) => x.posExecutive.posExecutiveName), ), ]; let positionMasterProfileOld: any = null; if (posMaster.current_holder != null) { positionMasterProfileOld = posMaster.current_holder.current_holders.find( (x) => x.orgRevisionId == orgRevisionActive.id, ); } let positionMasterOld: any = null; let profilePositionName: any = []; let profilePosType: any = []; let profilePosLevel: any = []; let profilePosExecutive: any = []; if (posMaster.ancestorDNA != null && posMaster.ancestorDNA != "") { positionMasterOld = orgRevisionActive.posMasters.find( (x: any) => x.orgRevisionId == orgRevisionActive.id && x.ancestorDNA == posMaster.ancestorDNA, ); profilePositionName = [ ...new Set(positionMasterOld.positions.map((x: any) => x.positionName)), ]; profilePosType = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posType != null) .map((x: any) => x.posType.posTypeName), ), ]; profilePosLevel = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posLevel != null) .map((x: any) => x.posLevel.posLevelName), ), ]; profilePosExecutive = [ ...new Set( positionMasterOld.positions .filter((x: any) => x.posExecutive != null) .map((x: any) => x.posExecutive.posExecutiveName), ), ]; } let education: any = ""; if ( posMaster.current_holder != null && posMaster.current_holder.profileEducations != null && posMaster.current_holder.profileEducations.length > 0 ) { let _education: any = posMaster.current_holder.profileEducations .filter((x) => x.isEducation == true || x.isUse == true) .sort((a, b) => { if (a.isEducation !== b.isEducation) { return a.isEducation ? -1 : 1; } return b.level - a.level; }); if (_education.length > 0) { education = _education.map((e: any) => e.degree).join(", "); } } let salary: any = ""; if ( posMaster.current_holder != null && posMaster.current_holder.profileSalary != null && posMaster.current_holder.profileSalary.length > 0 ) { let _salary: any = posMaster.current_holder.profileSalary.sort( (a, b) => (b.commandDateAffect == null ? 0 : b.commandDateAffect.getTime()) - (a.commandDateAffect == null ? 0 : a.commandDateAffect.getTime()), ); if (_salary.length > 0) { salary = _salary[0]; } } let node = { posMasterOrder: posMaster.posMasterOrder, // isSit: posMaster.isSit, // orgTreeName: orgChild4.orgChild4Name, orgTreeShortName: orgChild4.orgChild4ShortName, posMasterNo: posMaster.posMasterNo, positionName: posMaster.current_holder == null ? positionName.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.positionName : posMaster.current_holder.position, posType: posMaster.current_holder == null ? posType.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posType?.posTypeName : posMaster.current_holder.posType == null ? "-" : posMaster.current_holder.posType.posTypeName, posLevel: posMaster.current_holder == null ? posLevel.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posLevel?.posLevelName : posMaster.current_holder.posLevel == null ? "-" : posMaster.current_holder.posLevel.posLevelName, posExecutive: posMaster.current_holder == null ? posExecutive.join(" หรือ ") : posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posExecutive?.posExecutiveName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posExecutive?.posExecutiveName, profileOrgName: posMaster.current_holder == null ? orgChild4.orgChild4Name : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.orgChild4 != null ? positionMasterProfileOld.orgChild4.orgChild4Name : positionMasterProfileOld.orgChild3 != null ? positionMasterProfileOld.orgChild3.orgChild3Name : positionMasterProfileOld.orgChild2 != null ? positionMasterProfileOld.orgChild2.orgChild2Name : positionMasterProfileOld.orgChild1 != null ? positionMasterProfileOld.orgChild1.orgChild1Name : positionMasterProfileOld.orgRoot != null ? positionMasterProfileOld.orgRoot.orgRootName : "-", profileOrgShortName: posMaster.current_holder == null ? orgChild4.orgChild4ShortName : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.orgChild4 != null ? positionMasterProfileOld.orgChild4.orgChild4ShortName : positionMasterProfileOld.orgChild3 != null ? positionMasterProfileOld.orgChild3.orgChild3ShortName : positionMasterProfileOld.orgChild2 != null ? positionMasterProfileOld.orgChild2.orgChild2ShortName : positionMasterProfileOld.orgChild1 != null ? positionMasterProfileOld.orgChild1.orgChild1ShortName : positionMasterProfileOld.orgRoot != null ? positionMasterProfileOld.orgRoot.orgRootShortName : "-", profileFullname: posMaster.current_holder == null ? "- ว่าง -" : `${posMaster.current_holder.prefix}${posMaster.current_holder.firstName} ${posMaster.current_holder.lastName}`, profilePosMasterNo: posMaster.current_holder == null ? positionMasterOld == null ? "-" : positionMasterOld.posMasterNo : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.posMasterNo, profilePositionName: posMaster.current_holder == null ? positionMasterOld == null ? positionName.join(" หรือ ") : profilePositionName.join(" หรือ ") : posMaster.current_holder.position, profilePosType: posMaster.current_holder == null ? positionMasterOld == null ? posType.join(" หรือ ") : profilePosType.join(" หรือ ") : posMaster.current_holder.posType == null ? "-" : posMaster.current_holder.posType.posTypeName, profilePosLevel: posMaster.current_holder == null ? positionMasterOld == null ? posLevel.join(" หรือ ") : profilePosLevel.join(" หรือ ") : posMaster.current_holder.posLevel == null ? "-" : posMaster.current_holder.posLevel.posLevelName, profilePosExecutive: posMaster.current_holder == null ? positionMasterOld == null ? posExecutive.join(" หรือ ") : profilePosExecutive.join(" หรือ ") : positionMasterProfileOld == null ? "-" : positionMasterProfileOld.positions.find( (x: any) => x.positionIsSelected == true, )?.posExecutive?.posExecutiveName, education: education == "" ? "" : education, salary: salary == "" ? "" : salary.amount, reason: posMaster.reason, }; if (_node == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName.toString()), profileFullname: Extension.ToThaiNumber(node.profileOrgName.toString()), posExecutive: Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", profilePosMasterNo: Extension.ToThaiNumber( node.profileOrgShortName.toString(), ), profilePosExecutive: "", profilePositionName: "", profilePosType: "", profilePosLevel: "", education: "", salary: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == null ? "" : Extension.ToThaiNumber(node.posExecutive.toString()), positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), profilePosMasterNo: Extension.ToThaiNumber( node.profilePosMasterNo.toString(), ), profilePosExecutive: node.profilePosExecutive == null ? "" : Extension.ToThaiNumber(node.profilePosExecutive.toString()), profilePositionName: node.profilePositionName == null ? "" : Extension.ToThaiNumber(node.profilePositionName.toString()), profilePosType: node.profilePosType == null ? "" : Extension.ToThaiNumber(node.profilePosType.toString()), profilePosLevel: node.profilePosLevel == null ? "" : Extension.ToThaiNumber(node.profilePosLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _node.orgTreeShortName || node.orgTreeName != _node.orgTreeName || node.profileOrgShortName != _node.profileOrgShortName || node.profileOrgName != _node.profileOrgName ) { const head = { posMasterNo: node.orgTreeShortName == _node.orgTreeShortName ? "" : node.orgTreeShortName, profileFullname: node.profileOrgName == _node.profileOrgName ? "" : node.profileOrgName, posExecutive: node.orgTreeName == _node.orgTreeName ? "" : node.orgTreeName, positionName: "", posType: "", posLevel: "", profilePosMasterNo: node.profileOrgShortName == _node.profileOrgShortName ? "" : node.profileOrgShortName, profilePosExecutive: "", profilePositionName: "", profilePosType: "", profilePosLevel: "", education: "", salary: "", reason: "", }; data.push(head); _node == null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == null ? "" : Extension.ToThaiNumber(node.posExecutive.toString()), positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), profilePosMasterNo: Extension.ToThaiNumber( node.profilePosMasterNo.toString(), ), profilePosExecutive: node.profilePosExecutive == null ? "" : Extension.ToThaiNumber(node.profilePosExecutive.toString()), profilePositionName: node.profilePositionName == null ? "" : Extension.ToThaiNumber(node.profilePositionName.toString()), profilePosType: node.profilePosType == null ? "" : Extension.ToThaiNumber(node.profilePosType.toString()), profilePosLevel: node.profilePosLevel == null ? "" : Extension.ToThaiNumber(node.profilePosLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _node = node; }), ); _node = null; } } } } } return new HttpSuccess({ template: "report2", reportName: "report2", data: { rootName: orgRootData.length > 0 ? orgRootData[0].orgRootName : "-", data: data, }, }); } /** * API Report3 * * @summary Report3 * */ @Post("report3") async NewReport3( @Body() reqBody: { node: number; nodeId: string; }, ) { // @Get("report3/{rootId}") // async findReport3(@Path() rootId: string) { // const orgRevision = await this.orgRevisionRepository.findOne({ // where: { orgRevisionIsDraft: true, orgRevisionIsCurrent: false }, // relations: ["orgRoots"], // }); // if (!orgRevision) { // throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); // } let nodeId: string = reqBody.nodeId ? reqBody.nodeId : ""; let node: number = reqBody.node ? reqBody.node : 0; if (nodeId === "" || node < 0 || node > 4) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); } // ดึงแค่ rootId ก่อน ถ้าลูกค้า confirm ค่อยปรับ switch (node) { case 0: { const orgRoot = await this.orgRootRepository.findOne({ select: ["id"], where: { id: nodeId }, }); if (!orgRoot) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); nodeId = orgRoot.id; break; } case 1: { const orgChild1 = await this.child1Repository.findOne({ select: ["id", "orgRootId"], where: { id: nodeId }, }); if (!orgChild1) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); nodeId = orgChild1.orgRootId; break; } case 2: { const orgChild2 = await this.child2Repository.findOne({ select: ["id", "orgRootId"], where: { id: nodeId }, }); if (!orgChild2) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); nodeId = orgChild2.orgRootId; break; } case 3: { const orgChild3 = await this.child3Repository.findOne({ select: ["id", "orgRootId"], where: { id: nodeId }, }); if (!orgChild3) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); nodeId = orgChild3.orgRootId; break; } case 4: { const orgChild4 = await this.child4Repository.findOne({ select: ["id", "orgRootId"], where: { id: nodeId }, }); if (!orgChild4) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); nodeId = orgChild4.orgRootId; break; } default: throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); } // Step 1: ดึงข้อมูล OrgRoot พื้นฐาน const orgRootData = await this.orgRootRepository .createQueryBuilder("orgRoot") .select([ "orgRoot.id", "orgRoot.orgRootName", "orgRoot.orgRootShortName", "orgRoot.orgRootOrder", ]) .where("orgRoot.id = :nodeId", { nodeId }) .orderBy("orgRoot.orgRootOrder", "ASC") .getMany(); if (!orgRootData || orgRootData.length === 0) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลองค์กร"); } // Step 2: ดึงข้อมูล PosMasters ที่เกี่ยวข้องเท่านั้น const posMastersData = await this.posMasterRepository .createQueryBuilder("posMaster") .select([ "posMaster.id", "posMaster.posMasterOrder", "posMaster.isSit", "posMaster.posMasterNo", "posMaster.ancestorDNA", "posMaster.reason", "posMaster.orgRootId", "posMaster.orgChild1Id", "posMaster.current_holderId", "posMaster.next_holderId", ]) .where("posMaster.orgRootId = :nodeId", { nodeId }) .andWhere("posMaster.orgChild1Id IS NULL") // เฉพาะ root level .orderBy("posMaster.posMasterOrder", "ASC") .addOrderBy("posMaster.posMasterCreatedAt", "ASC") .getMany(); // Step 3: ดึงข้อมูล Profiles ที่ใช้จริงเท่านั้น const profileIds = [ ...new Set([ ...posMastersData.map((pm: any) => pm.current_holderId).filter(Boolean), ...posMastersData.map((pm: any) => pm.next_holderId).filter(Boolean), ]), ]; let profilesData: any[] = []; if (profileIds.length > 0) { profilesData = await this.profileRepository .createQueryBuilder("profile") .select([ "profile.id", "profile.prefix", "profile.firstName", "profile.lastName", "profile.position", ]) .where("profile.id IN (:...profileIds)", { profileIds }) .getMany(); } // Step 4: ดึงข้อมูล Education ล่าสุดของแต่ละ Profile let educationsData: any[] = []; if (profileIds.length > 0) { educationsData = await this.profileEducationRepository .createQueryBuilder("pe") .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level"]) .where("pe.profileId IN (:...profileIds)", { profileIds }) .andWhere( `(pe.profileId, COALESCE(pe.finishDate, '1900-01-01'), pe.level) IN ( SELECT pe2.profileId, COALESCE(MAX(pe2.finishDate), '1900-01-01'), CASE WHEN MAX(pe2.finishDate) IS NOT NULL THEN (SELECT pe3.level FROM profileEducation pe3 WHERE pe3.profileId = pe2.profileId AND pe3.finishDate = MAX(pe2.finishDate) LIMIT 1) ELSE MIN(pe2.level) END FROM profileEducation pe2 WHERE pe2.profileId IN (:...profileIds) GROUP BY pe2.profileId )`, { profileIds }, ) .getMany(); } // Step 5: ดึงข้อมูล Salary ล่าสุดของแต่ละ Profile let salariesData: any[] = []; if (profileIds.length > 0) { salariesData = await this.profileSalaryRepository .createQueryBuilder("ps") .select([ "ps.profileId", "ps.commandDateAffect", "ps.amount", "ps.positionSalaryAmount", "ps.mouthSalaryAmount", ]) .where("ps.profileId IN (:...profileIds)", { profileIds }) .andWhere( `(ps.profileId, ps.commandDateAffect) IN ( SELECT ps2.profileId, MAX(ps2.commandDateAffect) FROM profileSalary ps2 WHERE ps2.profileId IN (:...profileIds) GROUP BY ps2.profileId )`, { profileIds }, ) .getMany(); } // Step 6: ดึงข้อมูล Positions ที่เกี่ยวข้อง const posMasterIds = posMastersData.map((pm: any) => pm.id); let positionsData: any[] = []; if (posMasterIds.length > 0) { positionsData = await this.positionRepository .createQueryBuilder("position") .leftJoinAndSelect("position.posType", "posType") .leftJoinAndSelect("position.posLevel", "posLevel") .leftJoinAndSelect("position.posExecutive", "posExecutive") .select([ "position.id", "position.positionName", "position.positionIsSelected", "position.posMasterId", "posType.id", "posType.posTypeName", "posLevel.id", "posLevel.posLevelName", "posExecutive.id", "posExecutive.posExecutiveName", ]) .where("position.posMasterId IN (:...posMasterIds)", { posMasterIds }) .getMany(); } // Step 7: Combine ข้อมูลกลับเหมือนเดิม for (let orgRoot of orgRootData) { orgRoot.posMasters = posMastersData.filter((pm: any) => pm.orgRootId === orgRoot.id); for (let posMaster of orgRoot.posMasters) { // Attach current_holder if (posMaster.current_holderId) { posMaster.current_holder = profilesData.find( (p: any) => p.id === posMaster.current_holderId, ); if (posMaster.current_holder) { posMaster.current_holder.profileEducations = educationsData.filter( (ed: any) => ed.profileId === posMaster.current_holderId, ); posMaster.current_holder.profileSalary = salariesData.filter( (sal: any) => sal.profileId === posMaster.current_holderId, ); } } // Attach next_holder if (posMaster.next_holderId) { posMaster.next_holder = profilesData.find((p: any) => p.id === posMaster.next_holderId); if (posMaster.next_holder) { posMaster.next_holder.profileEducations = educationsData.filter( (ed: any) => ed.profileId === posMaster.next_holderId, ); posMaster.next_holder.profileSalary = salariesData.filter( (sal: any) => sal.profileId === posMaster.next_holderId, ); } } // Attach positions posMaster.positions = positionsData.filter((pos: any) => pos.posMasterId === posMaster.id); } } if (!orgRootData || orgRootData.length === 0) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลองค์กร"); } const orgName = orgRootData[0].orgRootName ?? ""; const orgRootIds = orgRootData.map((orgRoot) => orgRoot.id) || null; // Step 8: ปรับปรุง orgChild1Data - ใช้ optimized approach const orgChild1Data = await this.child1Repository .createQueryBuilder("orgChild1") .select([ "orgChild1.id", "orgChild1.orgRootId", "orgChild1.orgChild1Name", "orgChild1.orgChild1ShortName", "orgChild1.orgChild1Order", ]) .where("orgChild1.orgRootId IN (:...orgRootIds)", { orgRootIds }) .orderBy("orgChild1.orgChild1Order", "ASC") .getMany(); // ดึงข้อมูล PosMasters สำหรับ orgChild1 const orgChild1Ids = orgChild1Data.map((orgChild1) => orgChild1.id); let child1PosMasters: any[] = []; if (orgChild1Ids.length > 0) { child1PosMasters = await this.posMasterRepository .createQueryBuilder("posMaster") .select([ "posMaster.id", "posMaster.posMasterOrder", "posMaster.isSit", "posMaster.posMasterNo", "posMaster.ancestorDNA", "posMaster.reason", "posMaster.orgChild1Id", "posMaster.orgChild2Id", "posMaster.current_holderId", "posMaster.next_holderId", ]) .where("posMaster.orgChild1Id IN (:...orgChild1Ids)", { orgChild1Ids }) .andWhere("posMaster.orgChild2Id IS NULL") // เฉพาะ child1 level .orderBy("posMaster.posMasterOrder", "ASC") .addOrderBy("posMaster.posMasterCreatedAt", "ASC") .getMany(); } // รวบรวม Profile IDs สำหรับ child1 const child1ProfileIds = child1PosMasters.length > 0 ? [ ...new Set([ ...child1PosMasters.map((pm: any) => pm.current_holderId).filter(Boolean), ...child1PosMasters.map((pm: any) => pm.next_holderId).filter(Boolean), ]), ] : []; // ดึงข้อมูล Profiles, Education, Salary, Positions สำหรับ child1 let child1Profiles: any[] = []; let child1Educations: any[] = []; let child1Salaries: any[] = []; let child1Positions: any[] = []; if (child1ProfileIds.length > 0) { [child1Profiles, child1Educations, child1Salaries] = await Promise.all([ this.profileRepository .createQueryBuilder("profile") .select([ "profile.id", "profile.prefix", "profile.firstName", "profile.lastName", "profile.position", "profile.posTypeId", "profile.posLevelId", ]) .where("profile.id IN (:...child1ProfileIds)", { child1ProfileIds }) .getMany(), this.profileEducationRepository .createQueryBuilder("pe") .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level"]) .where("pe.profileId IN (:...child1ProfileIds)", { child1ProfileIds }) .andWhere( `(pe.profileId, COALESCE(pe.finishDate, '1900-01-01'), pe.level) IN ( SELECT pe2.profileId, COALESCE(MAX(pe2.finishDate), '1900-01-01'), CASE WHEN MAX(pe2.finishDate) IS NOT NULL THEN (SELECT pe3.level FROM profileEducation pe3 WHERE pe3.profileId = pe2.profileId AND pe3.finishDate = MAX(pe2.finishDate) LIMIT 1) ELSE MIN(pe2.level) END FROM profileEducation pe2 WHERE pe2.profileId IN (:...child1ProfileIds) GROUP BY pe2.profileId )`, { child1ProfileIds }, ) .getMany(), this.profileSalaryRepository .createQueryBuilder("ps") .select([ "ps.profileId", "ps.commandDateAffect", "ps.amount", "ps.positionSalaryAmount", "ps.mouthSalaryAmount", ]) .where("ps.profileId IN (:...child1ProfileIds)", { child1ProfileIds }) .andWhere( `(ps.profileId, ps.commandDateAffect) IN ( SELECT ps2.profileId, MAX(ps2.commandDateAffect) FROM profileSalary ps2 WHERE ps2.profileId IN (:...child1ProfileIds) GROUP BY ps2.profileId )`, { child1ProfileIds }, ) .getMany(), ]); } if (child1PosMasters.length > 0) { const child1PosMasterIds = child1PosMasters.map((pm: any) => pm.id); child1Positions = await this.positionRepository .createQueryBuilder("position") .leftJoinAndSelect("position.posType", "posType") .leftJoinAndSelect("position.posLevel", "posLevel") .leftJoinAndSelect("position.posExecutive", "posExecutive") .select([ "position.id", "position.positionName", "position.positionIsSelected", "position.posMasterId", "posType.id", "posType.posTypeName", "posLevel.id", "posLevel.posLevelName", "posExecutive.id", "posExecutive.posExecutiveName", ]) .where("position.posMasterId IN (:...child1PosMasterIds)", { child1PosMasterIds }) .getMany(); } // Combine ข้อมูล orgChild1 for (let orgChild1 of orgChild1Data) { orgChild1.posMasters = child1PosMasters.filter((pm: any) => pm.orgChild1Id === orgChild1.id); for (let posMaster of orgChild1.posMasters) { if (posMaster.current_holderId) { posMaster.current_holder = child1Profiles.find( (p: any) => p.id === posMaster.current_holderId, ); if (posMaster.current_holder) { posMaster.current_holder.profileEducations = child1Educations.filter( (ed: any) => ed.profileId === posMaster.current_holderId, ); posMaster.current_holder.profileSalary = child1Salaries.filter( (sal: any) => sal.profileId === posMaster.current_holderId, ); } } if (posMaster.next_holderId) { posMaster.next_holder = child1Profiles.find((p: any) => p.id === posMaster.next_holderId); if (posMaster.next_holder) { posMaster.next_holder.profileEducations = child1Educations.filter( (ed: any) => ed.profileId === posMaster.next_holderId, ); posMaster.next_holder.profileSalary = child1Salaries.filter( (sal: any) => sal.profileId === posMaster.next_holderId, ); } } posMaster.positions = child1Positions.filter( (pos: any) => pos.posMasterId === posMaster.id, ); } } // Step 9: ปรับปรุง orgChild2Data const originalOrgChild1Ids = orgChild1Data.length > 0 ? orgChild1Data.map((orgChild1) => orgChild1.id) : []; const orgChild2Data = await this.child2Repository .createQueryBuilder("orgChild2") .select([ "orgChild2.id", "orgChild2.orgChild1Id", "orgChild2.orgChild2Name", "orgChild2.orgChild2ShortName", "orgChild2.orgChild2Order", ]) .where( originalOrgChild1Ids.length > 0 ? "orgChild2.orgChild1Id IN (:...originalOrgChild1Ids)" : "1=0", { originalOrgChild1Ids, }, ) .orderBy("orgChild2.orgChild2Order", "ASC") .getMany(); // ดึงข้อมูล PosMasters สำหรับ orgChild2 const orgChild2Ids = orgChild2Data.map((orgChild2) => orgChild2.id); let child2PosMasters: any[] = []; if (orgChild2Ids.length > 0) { child2PosMasters = await this.posMasterRepository .createQueryBuilder("posMaster") .select([ "posMaster.id", "posMaster.posMasterOrder", "posMaster.isSit", "posMaster.posMasterNo", "posMaster.ancestorDNA", "posMaster.reason", "posMaster.orgChild2Id", "posMaster.orgChild3Id", "posMaster.current_holderId", "posMaster.next_holderId", ]) .where("posMaster.orgChild2Id IN (:...orgChild2Ids)", { orgChild2Ids }) .andWhere("posMaster.orgChild3Id IS NULL") // เฉพาะ child2 level .orderBy("posMaster.posMasterOrder", "ASC") .addOrderBy("posMaster.posMasterCreatedAt", "ASC") .getMany(); } // รวบรวม Profile IDs สำหรับ child2 const child2ProfileIds = child2PosMasters.length > 0 ? [ ...new Set([ ...child2PosMasters.map((pm: any) => pm.current_holderId).filter(Boolean), ...child2PosMasters.map((pm: any) => pm.next_holderId).filter(Boolean), ]), ] : []; // ดึงข้อมูล Profiles, Education, Salary, Positions สำหรับ child2 let child2Profiles: any[] = []; let child2Educations: any[] = []; let child2Salaries: any[] = []; let child2Positions: any[] = []; if (child2ProfileIds.length > 0) { [child2Profiles, child2Educations, child2Salaries] = await Promise.all([ this.profileRepository .createQueryBuilder("profile") .select([ "profile.id", "profile.prefix", "profile.firstName", "profile.lastName", "profile.position", "profile.posTypeId", "profile.posLevelId", ]) .where("profile.id IN (:...child2ProfileIds)", { child2ProfileIds }) .getMany(), this.profileEducationRepository .createQueryBuilder("pe") .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level"]) .where("pe.profileId IN (:...child2ProfileIds)", { child2ProfileIds }) .andWhere( `(pe.profileId, COALESCE(pe.finishDate, '1900-01-01'), pe.level) IN ( SELECT pe2.profileId, COALESCE(MAX(pe2.finishDate), '1900-01-01'), CASE WHEN MAX(pe2.finishDate) IS NOT NULL THEN (SELECT pe3.level FROM profileEducation pe3 WHERE pe3.profileId = pe2.profileId AND pe3.finishDate = MAX(pe2.finishDate) LIMIT 1) ELSE MIN(pe2.level) END FROM profileEducation pe2 WHERE pe2.profileId IN (:...child2ProfileIds) GROUP BY pe2.profileId )`, { child2ProfileIds }, ) .getMany(), this.profileSalaryRepository .createQueryBuilder("ps") .select([ "ps.profileId", "ps.commandDateAffect", "ps.amount", "ps.positionSalaryAmount", "ps.mouthSalaryAmount", ]) .where("ps.profileId IN (:...child2ProfileIds)", { child2ProfileIds }) .andWhere( `(ps.profileId, ps.commandDateAffect) IN ( SELECT ps2.profileId, MAX(ps2.commandDateAffect) FROM profileSalary ps2 WHERE ps2.profileId IN (:...child2ProfileIds) GROUP BY ps2.profileId )`, { child2ProfileIds }, ) .getMany(), ]); } if (child2PosMasters.length > 0) { const child2PosMasterIds = child2PosMasters.map((pm: any) => pm.id); child2Positions = await this.positionRepository .createQueryBuilder("position") .leftJoinAndSelect("position.posType", "posType") .leftJoinAndSelect("position.posLevel", "posLevel") .leftJoinAndSelect("position.posExecutive", "posExecutive") .select([ "position.id", "position.positionName", "position.positionIsSelected", "position.posMasterId", "posType.id", "posType.posTypeName", "posLevel.id", "posLevel.posLevelName", "posExecutive.id", "posExecutive.posExecutiveName", ]) .where("position.posMasterId IN (:...child2PosMasterIds)", { child2PosMasterIds }) .getMany(); } // Combine ข้อมูล orgChild2 for (let orgChild2 of orgChild2Data) { orgChild2.posMasters = child2PosMasters.filter((pm: any) => pm.orgChild2Id === orgChild2.id); for (let posMaster of orgChild2.posMasters) { if (posMaster.current_holderId) { posMaster.current_holder = child2Profiles.find( (p: any) => p.id === posMaster.current_holderId, ); if (posMaster.current_holder) { posMaster.current_holder.profileEducations = child2Educations.filter( (ed: any) => ed.profileId === posMaster.current_holderId, ); posMaster.current_holder.profileSalary = child2Salaries.filter( (sal: any) => sal.profileId === posMaster.current_holderId, ); } } if (posMaster.next_holderId) { posMaster.next_holder = child2Profiles.find((p: any) => p.id === posMaster.next_holderId); if (posMaster.next_holder) { posMaster.next_holder.profileEducations = child2Educations.filter( (ed: any) => ed.profileId === posMaster.next_holderId, ); posMaster.next_holder.profileSalary = child2Salaries.filter( (sal: any) => sal.profileId === posMaster.next_holderId, ); } } posMaster.positions = child2Positions.filter( (pos: any) => pos.posMasterId === posMaster.id, ); } } // Step 10: ปรับปรุง orgChild3Data const originalOrgChild2Ids = orgChild2Data.length > 0 ? orgChild2Data.map((orgChild2) => orgChild2.id) : []; const orgChild3Data = await this.child3Repository .createQueryBuilder("orgChild3") .select([ "orgChild3.id", "orgChild3.orgChild2Id", "orgChild3.orgChild3Name", "orgChild3.orgChild3ShortName", "orgChild3.orgChild3Order", ]) .where( originalOrgChild2Ids.length > 0 ? "orgChild3.orgChild2Id IN (:...originalOrgChild2Ids)" : "1=0", { originalOrgChild2Ids, }, ) .orderBy("orgChild3.orgChild3Order", "ASC") .getMany(); // ดึงข้อมูล PosMasters สำหรับ orgChild3 const orgChild3Ids = orgChild3Data.map((orgChild3) => orgChild3.id); let child3PosMasters: any[] = []; if (orgChild3Ids.length > 0) { child3PosMasters = await this.posMasterRepository .createQueryBuilder("posMaster") .select([ "posMaster.id", "posMaster.posMasterOrder", "posMaster.isSit", "posMaster.posMasterNo", "posMaster.ancestorDNA", "posMaster.reason", "posMaster.orgChild2Id", "posMaster.orgChild3Id", "posMaster.orgChild4Id", "posMaster.current_holderId", "posMaster.next_holderId", ]) .where("posMaster.orgChild3Id IN (:...orgChild3Ids)", { orgChild3Ids }) .andWhere("posMaster.orgChild4Id IS NULL") // เฉพาะ child3 level .orderBy("posMaster.posMasterOrder", "ASC") .addOrderBy("posMaster.posMasterCreatedAt", "ASC") .getMany(); } // รวบรวม Profile IDs สำหรับ child3 const child3ProfileIds = child3PosMasters.length > 0 ? [ ...new Set([ ...child3PosMasters.map((pm: any) => pm.current_holderId).filter(Boolean), ...child3PosMasters.map((pm: any) => pm.next_holderId).filter(Boolean), ]), ] : []; // ดึงข้อมูล Profiles, Education, Salary, Positions สำหรับ child3 let child3Profiles: any[] = []; let child3Educations: any[] = []; let child3Salaries: any[] = []; let child3Positions: any[] = []; if (child3ProfileIds.length > 0) { [child3Profiles, child3Educations, child3Salaries] = await Promise.all([ this.profileRepository .createQueryBuilder("profile") .select([ "profile.id", "profile.prefix", "profile.firstName", "profile.lastName", "profile.position", "profile.posTypeId", "profile.posLevelId", ]) .where("profile.id IN (:...child3ProfileIds)", { child3ProfileIds }) .getMany(), this.profileEducationRepository .createQueryBuilder("pe") .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level"]) .where("pe.profileId IN (:...child3ProfileIds)", { child3ProfileIds }) .andWhere( `(pe.profileId, COALESCE(pe.finishDate, '1900-01-01'), pe.level) IN ( SELECT pe2.profileId, COALESCE(MAX(pe2.finishDate), '1900-01-01'), CASE WHEN MAX(pe2.finishDate) IS NOT NULL THEN (SELECT pe3.level FROM profileEducation pe3 WHERE pe3.profileId = pe2.profileId AND pe3.finishDate = MAX(pe2.finishDate) LIMIT 1) ELSE MIN(pe2.level) END FROM profileEducation pe2 WHERE pe2.profileId IN (:...child3ProfileIds) GROUP BY pe2.profileId )`, { child3ProfileIds }, ) .getMany(), this.profileSalaryRepository .createQueryBuilder("ps") .select([ "ps.profileId", "ps.commandDateAffect", "ps.amount", "ps.positionSalaryAmount", "ps.mouthSalaryAmount", ]) .where("ps.profileId IN (:...child3ProfileIds)", { child3ProfileIds }) .andWhere( `(ps.profileId, ps.commandDateAffect) IN ( SELECT ps2.profileId, MAX(ps2.commandDateAffect) FROM profileSalary ps2 WHERE ps2.profileId IN (:...child3ProfileIds) GROUP BY ps2.profileId )`, { child3ProfileIds }, ) .getMany(), ]); } console.log("2"); if (child3PosMasters.length > 0) { const child3PosMasterIds = child3PosMasters.map((pm: any) => pm.id); child3Positions = await this.positionRepository .createQueryBuilder("position") .leftJoinAndSelect("position.posType", "posType") .leftJoinAndSelect("position.posLevel", "posLevel") .leftJoinAndSelect("position.posExecutive", "posExecutive") .select([ "position.id", "position.positionName", "position.positionIsSelected", "position.posMasterId", "posType.id", "posType.posTypeName", "posLevel.id", "posLevel.posLevelName", "posExecutive.id", "posExecutive.posExecutiveName", ]) .where("position.posMasterId IN (:...child3PosMasterIds)", { child3PosMasterIds }) .getMany(); } // Combine ข้อมูล orgChild3 for (let orgChild3 of orgChild3Data) { orgChild3.posMasters = child3PosMasters.filter((pm: any) => pm.orgChild3Id === orgChild3.id); for (let posMaster of orgChild3.posMasters) { if (posMaster.current_holderId) { posMaster.current_holder = child3Profiles.find( (p: any) => p.id === posMaster.current_holderId, ); if (posMaster.current_holder) { posMaster.current_holder.profileEducations = child3Educations.filter( (ed: any) => ed.profileId === posMaster.current_holderId, ); posMaster.current_holder.profileSalary = child3Salaries.filter( (sal: any) => sal.profileId === posMaster.current_holderId, ); } } if (posMaster.next_holderId) { posMaster.next_holder = child3Profiles.find((p: any) => p.id === posMaster.next_holderId); if (posMaster.next_holder) { posMaster.next_holder.profileEducations = child3Educations.filter( (ed: any) => ed.profileId === posMaster.next_holderId, ); posMaster.next_holder.profileSalary = child3Salaries.filter( (sal: any) => sal.profileId === posMaster.next_holderId, ); } } posMaster.positions = child3Positions.filter( (pos: any) => pos.posMasterId === posMaster.id, ); } } // Step 11: ปรับปรุง orgChild4Data const originalOrgChild3Ids = orgChild3Data.length > 0 ? orgChild3Data.map((orgChild3) => orgChild3.id) : []; const orgChild4Data = await this.child4Repository .createQueryBuilder("orgChild4") .select([ "orgChild4.id", "orgChild4.orgChild3Id", "orgChild4.orgChild4Name", "orgChild4.orgChild4ShortName", "orgChild4.orgChild4Order", ]) .where( originalOrgChild3Ids.length > 0 ? "orgChild4.orgChild3Id IN (:...originalOrgChild3Ids)" : "1=0", { originalOrgChild3Ids, }, ) .orderBy("orgChild4.orgChild4Order", "ASC") .getMany(); // ดึงข้อมูล PosMasters สำหรับ orgChild4 const orgChild4Ids = orgChild4Data.map((orgChild4) => orgChild4.id); let child4PosMasters: any[] = []; if (orgChild4Ids.length > 0) { child4PosMasters = await this.posMasterRepository .createQueryBuilder("posMaster") .select([ "posMaster.id", "posMaster.posMasterOrder", "posMaster.isSit", "posMaster.posMasterNo", "posMaster.ancestorDNA", "posMaster.reason", "posMaster.orgChild3Id", "posMaster.orgChild4Id", "posMaster.current_holderId", "posMaster.next_holderId", ]) .where("posMaster.orgChild4Id IN (:...orgChild4Ids)", { orgChild4Ids }) .orderBy("posMaster.posMasterOrder", "ASC") .addOrderBy("posMaster.posMasterCreatedAt", "ASC") .getMany(); } // รวบรวม Profile IDs สำหรับ child4 const child4ProfileIds = child4PosMasters.length > 0 ? [ ...new Set([ ...child4PosMasters.map((pm: any) => pm.current_holderId).filter(Boolean), ...child4PosMasters.map((pm: any) => pm.next_holderId).filter(Boolean), ]), ] : []; // ดึงข้อมูล Profiles, Education, Salary, Positions สำหรับ child4 let child4Profiles: any[] = []; let child4Educations: any[] = []; let child4Salaries: any[] = []; let child4Positions: any[] = []; if (child4ProfileIds.length > 0) { [child4Profiles, child4Educations, child4Salaries] = await Promise.all([ this.profileRepository .createQueryBuilder("profile") .select([ "profile.id", "profile.prefix", "profile.firstName", "profile.lastName", "profile.position", "profile.posTypeId", "profile.posLevelId", ]) .where("profile.id IN (:...child4ProfileIds)", { child4ProfileIds }) .getMany(), this.profileEducationRepository .createQueryBuilder("pe") .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level"]) .where("pe.profileId IN (:...child4ProfileIds)", { child4ProfileIds }) .andWhere( `(pe.profileId, COALESCE(pe.finishDate, '1900-01-01'), pe.level) IN ( SELECT pe2.profileId, COALESCE(MAX(pe2.finishDate), '1900-01-01'), CASE WHEN MAX(pe2.finishDate) IS NOT NULL THEN (SELECT pe3.level FROM profileEducation pe3 WHERE pe3.profileId = pe2.profileId AND pe3.finishDate = MAX(pe2.finishDate) LIMIT 1) ELSE MIN(pe2.level) END FROM profileEducation pe2 WHERE pe2.profileId IN (:...child4ProfileIds) GROUP BY pe2.profileId )`, { child4ProfileIds }, ) .getMany(), this.profileSalaryRepository .createQueryBuilder("ps") .select([ "ps.profileId", "ps.commandDateAffect", "ps.amount", "ps.positionSalaryAmount", "ps.mouthSalaryAmount", ]) .where("ps.profileId IN (:...child4ProfileIds)", { child4ProfileIds }) .andWhere( `(ps.profileId, ps.commandDateAffect) IN ( SELECT ps2.profileId, MAX(ps2.commandDateAffect) FROM profileSalary ps2 WHERE ps2.profileId IN (:...child4ProfileIds) GROUP BY ps2.profileId )`, { child4ProfileIds }, ) .getMany(), ]); } if (child4PosMasters.length > 0) { const child4PosMasterIds = child4PosMasters.map((pm: any) => pm.id); child4Positions = await this.positionRepository .createQueryBuilder("position") .leftJoinAndSelect("position.posType", "posType") .leftJoinAndSelect("position.posLevel", "posLevel") .leftJoinAndSelect("position.posExecutive", "posExecutive") .select([ "position.id", "position.positionName", "position.positionIsSelected", "position.posMasterId", "posType.id", "posType.posTypeName", "posLevel.id", "posLevel.posLevelName", "posExecutive.id", "posExecutive.posExecutiveName", ]) .where("position.posMasterId IN (:...child4PosMasterIds)", { child4PosMasterIds }) .getMany(); } // Combine ข้อมูล orgChild4 for (let orgChild4 of orgChild4Data) { orgChild4.posMasters = child4PosMasters.filter((pm: any) => pm.orgChild4Id === orgChild4.id); for (let posMaster of orgChild4.posMasters) { if (posMaster.current_holderId) { posMaster.current_holder = child4Profiles.find( (p: any) => p.id === posMaster.current_holderId, ); if (posMaster.current_holder) { posMaster.current_holder.profileEducations = child4Educations.filter( (ed: any) => ed.profileId === posMaster.current_holderId, ); posMaster.current_holder.profileSalary = child4Salaries.filter( (sal: any) => sal.profileId === posMaster.current_holderId, ); } } if (posMaster.next_holderId) { posMaster.next_holder = child4Profiles.find((p: any) => p.id === posMaster.next_holderId); if (posMaster.next_holder) { posMaster.next_holder.profileEducations = child4Educations.filter( (ed: any) => ed.profileId === posMaster.next_holderId, ); posMaster.next_holder.profileSalary = child4Salaries.filter( (sal: any) => sal.profileId === posMaster.next_holderId, ); } } posMaster.positions = child4Positions.filter( (pos: any) => pos.posMasterId === posMaster.id, ); } } let orgRevisionActive: any = await this.orgRevisionRepository.findOne({ where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false }, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); if (orgRevisionActive == null) { const _orgRevisionActive = await this.orgRevisionRepository.find({ order: { createdAt: "DESC" }, skip: 1, relations: [ "posMasters", "posMasters.positions", "posMasters.positions.posLevel", "posMasters.positions.posType", "posMasters.positions.posExecutive", ], }); if (_orgRevisionActive.length > 0) orgRevisionActive = _orgRevisionActive[0]; } let data = new Array(); let _node: any; let no = 1; for (let orgRoot of orgRootData) { await Promise.all( orgRoot.posMasters .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { if (posMaster.orgChild1Id == null && posMaster.next_holder != null) { let education: any = ""; if ( posMaster.next_holder != null && posMaster.next_holder.profileEducations != null && posMaster.next_holder.profileEducations.length > 0 ) { let _education: any = posMaster.next_holder.profileEducations.sort( (a, b) => (b.finishDate == null ? 0 : b.finishDate.getTime()) - (a.finishDate == null ? 0 : a.finishDate.getTime()), ); if (_education.length > 0) { education = _education[0]; } } let salary: any = ""; if ( posMaster.next_holder != null && posMaster.next_holder.profileSalary != null && posMaster.next_holder.profileSalary.length > 0 ) { let _salary: any = posMaster.next_holder.profileSalary.sort( (a, b) => (b.commandDateAffect == null ? 0 : b.commandDateAffect.getTime()) - (a.commandDateAffect == null ? 0 : a.commandDateAffect.getTime()), ); if (_salary.length > 0) { salary = _salary[0]; } } let node = { orgTreeName: orgRoot.orgRootName, orgTreeShortName: orgRoot.orgRootShortName, posMasterNo: posMaster.posMasterNo, positionName: posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.positionName : posMaster.next_holder.position, posType: posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true)?.posType ?.posTypeName : "-", posLevel: posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true)?.posLevel ?.posLevelName : "-", posExecutive: posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posExecutive?.posExecutiveName : "-", profileFullname: `${posMaster.next_holder.prefix}${posMaster.next_holder.firstName} ${posMaster.next_holder.lastName}`, education: education == "" ? "" : education.degree, salary: salary == "" ? "" : salary.amount, positionSalaryAmount: salary == "" ? "" : salary.positionSalaryAmount, mouthSalaryAmount: salary == "" ? "" : salary.mouthSalaryAmount, reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_node == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName.toString()), profileFullname: "", posExecutive: Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", education: "", salary: "", positionSalaryAmount: "", mouthSalaryAmount: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == undefined ? "" : node.posExecutive, positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", positionSalaryAmount: node.positionSalaryAmount ? Extension.ToThaiNumber(node.positionSalaryAmount.toLocaleString()) : "", mouthSalaryAmount: node.mouthSalaryAmount ? Extension.ToThaiNumber(node.mouthSalaryAmount.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _node.orgTreeShortName || node.orgTreeName != _node.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _node.orgTreeShortName ? "" : node.orgTreeShortName, profileFullname: "", posExecutive: node.orgTreeName == _node.orgTreeName ? "" : node.orgTreeName, positionName: "", posType: "", posLevel: "", education: "", salary: "", positionSalaryAmount: "", mouthSalaryAmount: "", reason: "", }; data.push(head); _node == null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == _node.posExecutive ? "" : node.posExecutive, positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", positionSalaryAmount: node.positionSalaryAmount ? Extension.ToThaiNumber(node.positionSalaryAmount.toLocaleString()) : "", mouthSalaryAmount: node.mouthSalaryAmount ? Extension.ToThaiNumber(node.mouthSalaryAmount.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _node = node; } }), ); _node = null; console.log("13"); for (let orgChild1 of orgChild1Data.filter( (orgChild1) => orgChild1.orgRootId === orgRoot.id, )) { await Promise.all( orgChild1.posMasters .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { if (posMaster.orgChild2Id == null && posMaster.next_holder != null) { let education: any = ""; if ( posMaster.next_holder != null && posMaster.next_holder.profileEducations != null && posMaster.next_holder.profileEducations.length > 0 ) { let _education: any = posMaster.next_holder.profileEducations.sort( (a, b) => (b.finishDate == null ? 0 : b.finishDate.getTime()) - (a.finishDate == null ? 0 : a.finishDate.getTime()), ); if (_education.length > 0) { education = _education[0]; } } let salary: any = ""; if ( posMaster.next_holder != null && posMaster.next_holder.profileSalary != null && posMaster.next_holder.profileSalary.length > 0 ) { let _salary: any = posMaster.next_holder.profileSalary.sort( (a, b) => (b.commandDateAffect == null ? 0 : b.commandDateAffect.getTime()) - (a.commandDateAffect == null ? 0 : a.commandDateAffect.getTime()), ); if (_salary.length > 0) { salary = _salary[0]; } } console.log("14"); let node = { orgTreeName: orgChild1.orgChild1Name, orgTreeShortName: orgChild1.orgChild1ShortName, posMasterNo: posMaster.posMasterNo, positionName: posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.positionName : posMaster.next_holder.position, posType: posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true)?.posType ?.posTypeName : "-", posLevel: posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true)?.posLevel ?.posLevelName : "-", posExecutive: posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posExecutive?.posExecutiveName : "-", profileFullname: `${posMaster.next_holder.prefix}${posMaster.next_holder.firstName} ${posMaster.next_holder.lastName}`, education: education == "" ? "" : education.degree, salary: salary == "" ? "" : salary.amount, positionSalaryAmount: salary == "" ? "" : salary.positionSalaryAmount, mouthSalaryAmount: salary == "" ? "" : salary.mouthSalaryAmount, reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_node == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName.toString()), profileFullname: "", posExecutive: Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", education: "", salary: "", positionSalaryAmount: "", mouthSalaryAmount: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive, positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", positionSalaryAmount: node.positionSalaryAmount ? Extension.ToThaiNumber(node.positionSalaryAmount.toLocaleString()) : "", mouthSalaryAmount: node.mouthSalaryAmount ? Extension.ToThaiNumber(node.mouthSalaryAmount.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _node.orgTreeShortName || node.orgTreeName != _node.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _node.orgTreeShortName ? "" : node.orgTreeShortName, profileFullname: "", posExecutive: node.orgTreeName == _node.orgTreeName ? "" : node.orgTreeName, positionName: "", posType: "", posLevel: "", education: "", salary: "", positionSalaryAmount: "", mouthSalaryAmount: "", reason: "", }; data.push(head); _node == null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == _node.posExecutive ? "" : node.posExecutive, positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", positionSalaryAmount: node.positionSalaryAmount ? Extension.ToThaiNumber(node.positionSalaryAmount.toLocaleString()) : "", mouthSalaryAmount: node.mouthSalaryAmount ? Extension.ToThaiNumber(node.mouthSalaryAmount.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _node = node; } }), ); _node = null; console.log("15"); for (let orgChild2 of orgChild2Data.filter( (orgChild2) => orgChild2.orgChild1Id === orgChild1.id, )) { console.log("111"); await Promise.all( orgChild2.posMasters .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { console.log("112"); if (posMaster.orgChild3Id == null && posMaster.next_holder != null) { console.log("114"); let education: any = ""; if ( posMaster.next_holder != null && posMaster.next_holder.profileEducations != null && posMaster.next_holder.profileEducations.length > 0 ) { let _education: any = posMaster.next_holder.profileEducations.sort( (a, b) => (b.finishDate == null ? 0 : b.finishDate.getTime()) - (a.finishDate == null ? 0 : a.finishDate.getTime()), ); if (_education.length > 0) { education = _education[0]; } } console.log("115"); let salary: any = ""; if ( posMaster.next_holder != null && posMaster.next_holder.profileSalary != null && posMaster.next_holder.profileSalary.length > 0 ) { let _salary: any = posMaster.next_holder.profileSalary.sort( (a, b) => (b.commandDateAffect == null ? 0 : b.commandDateAffect.getTime()) - (a.commandDateAffect == null ? 0 : a.commandDateAffect.getTime()), ); if (_salary.length > 0) { salary = _salary[0]; } } console.log("116"); let node = { orgTreeName: orgChild2.orgChild2Name, orgTreeShortName: orgChild2.orgChild2ShortName, posMasterNo: posMaster.posMasterNo, positionName: posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.positionName : posMaster.next_holder.position, posType: posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posType?.posTypeName : "-", posLevel: posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posLevel?.posLevelName : "-", posExecutive: posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posExecutive?.posExecutiveName : "-", profileFullname: `${posMaster.next_holder.prefix}${posMaster.next_holder.firstName} ${posMaster.next_holder.lastName}`, education: education == "" ? "" : education.degree, salary: salary == "" ? "" : salary.amount, positionSalaryAmount: salary == "" ? "" : salary.positionSalaryAmount, mouthSalaryAmount: salary == "" ? "" : salary.mouthSalaryAmount, reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_node == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName.toString()), profileFullname: "", posExecutive: Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", education: "", salary: "", positionSalaryAmount: "", mouthSalaryAmount: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive, positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", positionSalaryAmount: node.positionSalaryAmount ? Extension.ToThaiNumber(node.positionSalaryAmount.toLocaleString()) : "", mouthSalaryAmount: node.mouthSalaryAmount ? Extension.ToThaiNumber(node.mouthSalaryAmount.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _node.orgTreeShortName || node.orgTreeName != _node.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _node.orgTreeShortName ? "" : node.orgTreeShortName, profileFullname: "", posExecutive: node.orgTreeName == _node.orgTreeName ? "" : node.orgTreeName, positionName: "", posType: "", posLevel: "", education: "", salary: "", positionSalaryAmount: "", mouthSalaryAmount: "", reason: "", }; data.push(head); _node == null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == _node.posExecutive ? "" : node.posExecutive, positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", positionSalaryAmount: node.positionSalaryAmount ? Extension.ToThaiNumber(node.positionSalaryAmount.toLocaleString()) : "", mouthSalaryAmount: node.mouthSalaryAmount ? Extension.ToThaiNumber(node.mouthSalaryAmount.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _node = node; } }), ); _node = null; console.log("16"); for (let orgChild3 of orgChild3Data.filter( (orgChild3) => orgChild3.orgChild2Id === orgChild2.id, )) { await Promise.all( orgChild3.posMasters .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { if (posMaster.orgChild4Id == null && posMaster.next_holder != null) { let education: any = ""; if ( posMaster.next_holder != null && posMaster.next_holder.profileEducations != null && posMaster.next_holder.profileEducations.length > 0 ) { let _education: any = posMaster.next_holder.profileEducations.sort( (a, b) => (b.finishDate == null ? 0 : b.finishDate.getTime()) - (a.finishDate == null ? 0 : a.finishDate.getTime()), ); if (_education.length > 0) { education = _education[0]; } } let salary: any = ""; if ( posMaster.next_holder != null && posMaster.next_holder.profileSalary != null && posMaster.next_holder.profileSalary.length > 0 ) { let _salary: any = posMaster.next_holder.profileSalary.sort( (a, b) => (b.commandDateAffect == null ? 0 : b.commandDateAffect.getTime()) - (a.commandDateAffect == null ? 0 : a.commandDateAffect.getTime()), ); if (_salary.length > 0) { salary = _salary[0]; } } let node = { orgTreeName: orgChild3.orgChild3Name, orgTreeShortName: orgChild3.orgChild3ShortName, posMasterNo: posMaster.posMasterNo, positionName: posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.positionName : posMaster.next_holder.position, posType: posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posType?.posTypeName : "-", posLevel: posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posLevel?.posLevelName : "-", posExecutive: posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posExecutive?.posExecutiveName : "-", profileFullname: `${posMaster.next_holder.prefix}${posMaster.next_holder.firstName} ${posMaster.next_holder.lastName}`, education: education == "" ? "" : education.degree, salary: salary == "" ? "" : salary.amount, positionSalaryAmount: salary == "" ? "" : salary.positionSalaryAmount, mouthSalaryAmount: salary == "" ? "" : salary.mouthSalaryAmount, reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_node == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName.toString()), profileFullname: "", posExecutive: Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", education: "", salary: "", positionSalaryAmount: "", mouthSalaryAmount: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive, positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", positionSalaryAmount: node.positionSalaryAmount ? Extension.ToThaiNumber(node.positionSalaryAmount.toLocaleString()) : "", mouthSalaryAmount: node.mouthSalaryAmount ? Extension.ToThaiNumber(node.mouthSalaryAmount.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _node.orgTreeShortName || node.orgTreeName != _node.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _node.orgTreeShortName ? "" : node.orgTreeShortName, profileFullname: "", posExecutive: node.orgTreeName == _node.orgTreeName ? "" : node.orgTreeName, positionName: "", posType: "", posLevel: "", education: "", salary: "", positionSalaryAmount: "", mouthSalaryAmount: "", reason: "", }; data.push(head); _node == null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == _node.posExecutive ? "" : node.posExecutive, positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", positionSalaryAmount: node.positionSalaryAmount ? Extension.ToThaiNumber(node.positionSalaryAmount.toLocaleString()) : "", mouthSalaryAmount: node.mouthSalaryAmount ? Extension.ToThaiNumber(node.mouthSalaryAmount.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _node = node; } }), ); _node = null; console.log("17"); for (let orgChild4 of orgChild4Data.filter( (orgChild4) => orgChild4.orgChild3Id === orgChild3.id, )) { await Promise.all( orgChild4.posMasters .sort((a, b) => a.posMasterOrder - b.posMasterOrder) .map(async (posMaster) => { if (posMaster.next_holder != null) { let education: any = ""; if ( posMaster.next_holder != null && posMaster.next_holder.profileEducations != null && posMaster.next_holder.profileEducations.length > 0 ) { let _education: any = posMaster.next_holder.profileEducations.sort( (a, b) => b.finishDate == null ? 0 : (b.finishDate == null ? 0 : b.finishDate.getTime()) - (a.finishDate == null ? 0 : a.finishDate.getTime()), ); if (_education.length > 0) { education = _education[0]; } } let salary: any = ""; if ( posMaster.next_holder != null && posMaster.next_holder.profileSalary != null && posMaster.next_holder.profileSalary.length > 0 ) { let _salary: any = posMaster.next_holder.profileSalary.sort( (a, b) => (b.commandDateAffect == null ? 0 : b.commandDateAffect.getTime()) - (a.commandDateAffect == null ? 0 : a.commandDateAffect.getTime()), ); if (_salary.length > 0) { salary = _salary[0]; } } let node = { orgTreeName: orgChild4.orgChild4Name, orgTreeShortName: orgChild4.orgChild4ShortName, posMasterNo: posMaster.posMasterNo, positionName: posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.positionName : posMaster.next_holder.position, posType: posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posType?.posTypeName : "-", posLevel: posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posLevel?.posLevelName : "-", posExecutive: posMaster.isSit == false ? posMaster.positions.find((x: any) => x.positionIsSelected == true) ?.posExecutive?.posExecutiveName : "-", profileFullname: `${posMaster.next_holder.prefix}${posMaster.next_holder.firstName} ${posMaster.next_holder.lastName}`, education: education == "" ? "" : education.degree, salary: salary == "" ? "" : salary.amount, positionSalaryAmount: salary == "" ? "" : salary.positionSalaryAmount, mouthSalaryAmount: salary == "" ? "" : salary.mouthSalaryAmount, reason: posMaster.reason == null ? "" : posMaster.reason, }; if (_node == null) { const head = { posMasterNo: Extension.ToThaiNumber(node.orgTreeShortName.toString()), profileFullname: "", posExecutive: Extension.ToThaiNumber(node.orgTreeName.toString()), positionName: "", posType: "", posLevel: "", education: "", salary: "", positionSalaryAmount: "", mouthSalaryAmount: "", reason: "", }; data.push(head); const _head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive, positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", positionSalaryAmount: node.positionSalaryAmount ? Extension.ToThaiNumber(node.positionSalaryAmount.toLocaleString()) : "", mouthSalaryAmount: node.mouthSalaryAmount ? Extension.ToThaiNumber(node.mouthSalaryAmount.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(_head); } else { if ( node.orgTreeShortName != _node.orgTreeShortName || node.orgTreeName != _node.orgTreeName ) { const head = { posMasterNo: node.orgTreeShortName == _node.orgTreeShortName ? "" : node.orgTreeShortName, profileFullname: "", posExecutive: node.orgTreeName == _node.orgTreeName ? "" : node.orgTreeName, positionName: "", posType: "", posLevel: "", education: "", salary: "", positionSalaryAmount: "", mouthSalaryAmount: "", reason: "", }; data.push(head); _node == null; } const head = { no: Extension.ToThaiNumber(no.toString()), posMasterNo: node.posMasterNo == null ? "" : Extension.ToThaiNumber(node.posMasterNo.toString()), profileFullname: node.profileFullname == null ? "" : Extension.ToThaiNumber(node.profileFullname.toString()), posExecutive: node.posExecutive == _node.posExecutive ? "" : node.posExecutive, positionName: node.positionName == null ? "" : Extension.ToThaiNumber(node.positionName.toString()), posType: node.posType == null ? "" : Extension.ToThaiNumber(node.posType.toString()), posLevel: node.posLevel == null ? "" : Extension.ToThaiNumber(node.posLevel.toString()), education: node.education == null ? "" : Extension.ToThaiNumber(node.education.toString()), salary: node.salary ? Extension.ToThaiNumber(node.salary.toLocaleString()) : "", positionSalaryAmount: node.positionSalaryAmount ? Extension.ToThaiNumber(node.positionSalaryAmount.toLocaleString()) : "", mouthSalaryAmount: node.mouthSalaryAmount ? Extension.ToThaiNumber(node.mouthSalaryAmount.toLocaleString()) : "", reason: node.reason == null ? "" : Extension.ToThaiNumber(node.reason.toString()), }; data.push(head); } no += 1; _node = node; } }), ); _node = null; } } } } } return new HttpSuccess({ template: "report3", reportName: "report3", data: { org: orgName, data }, }); } @Post("report4") async NewReport4( @Body() reqBody: { node: number; nodeId: string; }, ) { // @Get("report4/{rootId}") // async findReport4(@Path() rootId: string) { let nodeId: string = reqBody.nodeId ? reqBody.nodeId : ""; let node: number = reqBody.node ? reqBody.node : 0; let rootName: string = ""; let whereCase: string = ""; let params: any = {}; if (nodeId === "" || node < 0 || node > 4) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); } switch (node) { case 0: { const orgRoot = await this.orgRootRepository.findOne({ select: ["id", "orgRootName"], where: { id: nodeId }, }); if (!orgRoot) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); rootName = orgRoot.orgRootName; whereCase = "posMaster.orgRootId = :nodeId"; params = { nodeId }; break; } case 1: { const orgChild1 = await this.child1Repository.findOne({ select: ["id", "orgChild1Name"], where: { id: nodeId }, }); if (!orgChild1) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); rootName = orgChild1.orgChild1Name; whereCase = "posMaster.orgChild1Id = :nodeId"; params = { nodeId }; break; } case 2: { const orgChild2 = await this.child2Repository.findOne({ select: ["id", "orgChild2Name"], where: { id: nodeId }, }); if (!orgChild2) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); rootName = orgChild2.orgChild2Name; whereCase = "posMaster.orgChild2Id = :nodeId"; params = { nodeId }; break; } case 3: { const orgChild3 = await this.child3Repository.findOne({ select: ["id", "orgChild3Name"], where: { id: nodeId }, }); if (!orgChild3) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); rootName = orgChild3.orgChild3Name; whereCase = "posMaster.orgChild3Id = :nodeId"; params = { nodeId }; break; } case 4: { const orgChild4 = await this.child4Repository.findOne({ select: ["id", "orgChild4Name"], where: { id: nodeId }, }); if (!orgChild4) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); rootName = orgChild4.orgChild4Name; whereCase = "posMaster.orgChild4Id = :nodeId"; params = { nodeId }; break; } default: throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); } // const orgRootData = await this.orgRootRepository.findOne({ // where: { id: reqBody.nodeId }, // }); // if (!orgRootData) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); // let rootId:string = reqBody.nodeId; const posMaster = await this.posMasterRepository .createQueryBuilder("posMaster") .leftJoinAndSelect("posMaster.positions", "position") .leftJoinAndSelect("position.posType", "posType") .leftJoinAndSelect("position.posLevel", "posLevel") // .where("posMaster.orgRootId = :rootId", { rootId }) .where(whereCase, params) .orderBy("posType.posTypeRank", "ASC") .addOrderBy("posLevel.posLevelRank", "ASC") .getMany(); const _posMaster = posMaster.map((x) => ({ type: [...new Set(x.positions.flatMap((y) => y.posType.posTypeName))].join(","), typeRank: [...new Set(x.positions.flatMap((y) => y.posType.posTypeRank))].join(""), level: [...new Set(x.positions.flatMap((y) => y.posLevel.posLevelName))].join(","), levelRank: [ ...new Set( x.positions.flatMap((y) => `${y.posType.posTypeRank}${y.posLevel.posLevelRank}`), ), ].join(""), positions: [...new Set(x.positions.flatMap((y) => y.positionName))].join(""), })); const groupedData = _posMaster.reduce((acc: any, curr: any) => { const key = `${curr.type}|${curr.typeRank}|${curr.level}|${curr.levelRank}`; if (!acc[key]) { acc[key] = { ...curr, total: 1 }; } else { acc[key].total += 1; } return acc; }, {}); let result = Object.values(groupedData) .map((x: any) => ({ type: x.type, typeRank: parseInt(x.typeRank), level: x.level, levelRank: parseInt(x.levelRank), total: x.total, remark: x.positions, })) .sort((x, y) => { if (x.typeRank !== y.typeRank) { return x.typeRank - y.typeRank; } return x.levelRank - y.levelRank; }); let tmpType: string = ""; let allTotal: number = 0; let total: number = 0; let _total: number = 0; let _reslut = new Array(); result.forEach((x: any, idx: number) => { allTotal += x.total; total += x.total; if (x.type === tmpType) { _reslut.push({ ...x, type: "", }); } else { if (x.type !== tmpType && tmpType != "") { _total = total - x.total; _reslut.push({ type: "", typeRank: "", level: "รวม", levelRank: "", total: _total, remark: "", }); total = x.total; _total = 0; } _reslut.push({ ...x, }); } tmpType = x.type; }); _reslut.push({ type: "", typeRank: "", level: "รวม", levelRank: "", total: total, remark: "", }); _reslut.push({ type: "", typeRank: "", level: "รวมทั้งสิ้น", levelRank: "", total: allTotal, remark: "", }); return new HttpSuccess({ template: "report4", reportName: "report4", data: { dateCurrent: Extension.ToThaiShortDate(new Date()), rootName: rootName ? rootName : "-", data: _reslut, }, }); } @Get("report4-employee/{rootId}") async findReportEmp4(@Path() rootId: string) { const orgRootData = await this.orgRootRepository.findOne({ where: { id: rootId }, }); if (!orgRootData) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); const posMaster = await this.empPosMasterRepository .createQueryBuilder("posMaster") .leftJoinAndSelect("posMaster.positions", "position") .leftJoinAndSelect("position.posType", "posType") .leftJoinAndSelect("position.posLevel", "posLevel") .where("posMaster.orgRootId = :rootId", { rootId }) .orderBy("posType.posTypeRank", "ASC") .addOrderBy("posLevel.posLevelRank", "ASC") .getMany(); const _posMaster = posMaster.map((x) => ({ type: [...new Set(x.positions.flatMap((y) => y.posType.posTypeName))].join(","), typeRank: [...new Set(x.positions.flatMap((y) => y.posType.posTypeRank))].join(""), level: [...new Set(x.positions.flatMap((y) => y.posLevel.posLevelName))].join(","), levelRank: [ ...new Set( x.positions.flatMap((y) => `${y.posType.posTypeRank}${y.posLevel.posLevelRank}`), ), ].join(""), positions: [...new Set(x.positions.flatMap((y) => y.positionName))].join(""), })); const groupedData = _posMaster.reduce((acc: any, curr: any) => { const key = `${curr.type}|${curr.typeRank}|${curr.level}|${curr.levelRank}`; if (!acc[key]) { acc[key] = { ...curr, total: 1 }; } else { acc[key].total += 1; } return acc; }, {}); let result = Object.values(groupedData) .map((x: any) => ({ type: x.type, typeRank: parseInt(x.typeRank), level: x.level, levelRank: parseInt(x.levelRank), total: x.total, remark: x.positions, })) .sort((x, y) => { if (x.typeRank !== y.typeRank) { return x.typeRank - y.typeRank; } return x.levelRank - y.levelRank; }); let tmpType: string = ""; let allTotal: number = 0; let total: number = 0; let _total: number = 0; let _reslut = new Array(); result.forEach((x: any, idx: number) => { allTotal += x.total; total += x.total; if (x.type === tmpType) { _reslut.push({ ...x, type: "", }); } else { if (x.type !== tmpType && tmpType != "") { _total = total - x.total; _reslut.push({ type: "", typeRank: "", level: "รวม", levelRank: "", total: _total, remark: "", }); total = x.total; _total = 0; } _reslut.push({ ...x, }); } tmpType = x.type; }); _reslut.push({ type: "", typeRank: "", level: "รวม", levelRank: "", total: total, remark: "", }); _reslut.push({ type: "", typeRank: "", level: "รวมทั้งสิ้น", levelRank: "", total: allTotal, remark: "", }); return new HttpSuccess({ template: "report4", reportName: "report4", data: { dateCurrent: Extension.ToThaiShortDate(new Date()), rootName: orgRootData ? orgRootData.orgRootName : "-", data: _reslut, }, }); } @Get("report4-employee-temp/{rootId}") async findReportEmp4Temp(@Path() rootId: string) { const orgRootData = await this.orgRootRepository.findOne({ where: { id: rootId }, }); if (!orgRootData) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); const posMaster = await this.empTempPosMasterRepository .createQueryBuilder("posMaster") .leftJoinAndSelect("posMaster.positions", "position") .leftJoinAndSelect("position.posType", "posType") .leftJoinAndSelect("position.posLevel", "posLevel") .where("posMaster.orgRootId = :rootId", { rootId }) .orderBy("posType.posTypeRank", "ASC") .addOrderBy("posLevel.posLevelRank", "ASC") .getMany(); const _posMaster = posMaster.map((x) => ({ type: [...new Set(x.positions.flatMap((y) => y.posType.posTypeName))].join(","), typeRank: [...new Set(x.positions.flatMap((y) => y.posType.posTypeRank))].join(""), level: [...new Set(x.positions.flatMap((y) => y.posLevel.posLevelName))].join(","), levelRank: [ ...new Set( x.positions.flatMap((y) => `${y.posType.posTypeRank}${y.posLevel.posLevelRank}`), ), ].join(""), positions: [...new Set(x.positions.flatMap((y) => y.positionName))].join(""), })); const groupedData = _posMaster.reduce((acc: any, curr: any) => { const key = `${curr.type}|${curr.typeRank}|${curr.level}|${curr.levelRank}`; if (!acc[key]) { acc[key] = { ...curr, total: 1 }; } else { acc[key].total += 1; } return acc; }, {}); let result = Object.values(groupedData) .map((x: any) => ({ type: x.type, typeRank: parseInt(x.typeRank), level: x.level, levelRank: parseInt(x.levelRank), total: x.total, remark: x.positions, })) .sort((x, y) => { if (x.typeRank !== y.typeRank) { return x.typeRank - y.typeRank; } return x.levelRank - y.levelRank; }); let tmpType: string = ""; let allTotal: number = 0; let total: number = 0; let _total: number = 0; let _reslut = new Array(); result.forEach((x: any, idx: number) => { allTotal += x.total; total += x.total; if (x.type === tmpType) { _reslut.push({ ...x, type: "", }); } else { if (x.type !== tmpType && tmpType != "") { _total = total - x.total; _reslut.push({ type: "", typeRank: "", level: "รวม", levelRank: "", total: _total, remark: "", }); total = x.total; _total = 0; } _reslut.push({ ...x, }); } tmpType = x.type; }); _reslut.push({ type: "", typeRank: "", level: "รวม", levelRank: "", total: total, remark: "", }); _reslut.push({ type: "", typeRank: "", level: "รวมทั้งสิ้น", levelRank: "", total: allTotal, remark: "", }); return new HttpSuccess({ template: "report4", reportName: "report4", data: { dateCurrent: Extension.ToThaiShortDate(new Date()), rootName: orgRootData ? orgRootData.orgRootName : "-", data: _reslut, }, }); } }