From 6a43edef46f5de39f623163988ec4d0eaaf9affd Mon Sep 17 00:00:00 2001 From: Bright Date: Wed, 17 Sep 2025 15:50:01 +0700 Subject: [PATCH] report1 --- src/controllers/ReportController.ts | 2009 +++++++++++++++++++++++++++ 1 file changed, 2009 insertions(+) diff --git a/src/controllers/ReportController.ts b/src/controllers/ReportController.ts index 996f60a5..2c309096 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -8,6 +8,8 @@ import { Response, Path, Query, + Post, + Body } from "tsoa"; import { AppDataSource } from "../database/data-source"; import HttpSuccess from "../interfaces/http-success"; @@ -660,6 +662,2013 @@ export class ReportController extends Controller { }); } + /** + * 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" }, + 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" }, + 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" }, + 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" }, + 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" }, + relations: [ + "posMasters", + "posMasters.positions", + "posMasters.positions.posLevel", + "posMasters.positions.posType", + "posMasters.positions.posExecutive", + ], + }); + + let _nodeTemp: any = null; + 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 (_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)) { + 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 (_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) { + 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" }, + 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" }, + 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" }, + 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" }, + 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" }, + 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" }, + 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" }, + 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" }, + 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" }, + 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" }, + 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 *