import { Controller, Get, Route, Security, Tags, SuccessResponse, Response, Path } 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 } 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 Extension from "../interfaces/extension";
@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);

  /**
   * 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 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.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 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:
                    node.posExecutive == _node.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.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 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:
                      node.posExecutive == _node.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.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 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:
                        node.posExecutive == _node.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.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 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:
                          node.posExecutive == _node.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.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 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:
                          node.posExecutive == _node.posExecutive
                            ? ""
                            : Extension.ToThaiNumber(node.posExecutive.toString()),
                        positionName:
                          node.positionName == null
                            ? ""
                            : 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: { data } });
  }

  /**
   * API Report2
   *
   * @summary Report2
   *
   */
  @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, "ไม่พบข้อมูล");
    // }

    const orgRootData = await this.orgRootRepository.find({
      where: {
        id: rootId,
        // orgRevisionId: orgRevision.id,
      },
      order: { orgRootOrder: "ASC" },
      relations: [
        "posMasters",
        "posMasters.orgRoot",
        "posMasters.orgChild1",
        "posMasters.orgChild2",
        "posMasters.orgChild3",
        "posMasters.orgChild4",
        "posMasters.next_holder",
        "posMasters.next_holder",
        "posMasters.next_holder",
        "posMasters.next_holder.posLevel",
        "posMasters.next_holder.posType",
        "posMasters.next_holder.profileSalary",
        "posMasters.next_holder.profileEducations",
        "posMasters.next_holder.current_holders",
        "posMasters.next_holder.current_holders.positions",
        "posMasters.next_holder.current_holders.orgRoot",
        "posMasters.next_holder.current_holders.orgChild1",
        "posMasters.next_holder.current_holders.orgChild2",
        "posMasters.next_holder.current_holders.orgChild3",
        "posMasters.next_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.orgRoot",
        "posMasters.orgChild1",
        "posMasters.orgChild2",
        "posMasters.orgChild3",
        "posMasters.orgChild4",
        "posMasters.next_holder",
        "posMasters.next_holder.posLevel",
        "posMasters.next_holder.posType",
        "posMasters.next_holder.profileSalary",
        "posMasters.next_holder.profileEducations",
        "posMasters.next_holder.current_holders",
        "posMasters.next_holder.current_holders.positions",
        "posMasters.next_holder.current_holders.orgRoot",
        "posMasters.next_holder.current_holders.orgChild1",
        "posMasters.next_holder.current_holders.orgChild2",
        "posMasters.next_holder.current_holders.orgChild3",
        "posMasters.next_holder.current_holders.orgChild4",
        "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.orgRoot",
        "posMasters.orgChild1",
        "posMasters.orgChild2",
        "posMasters.orgChild3",
        "posMasters.orgChild4",
        "posMasters.next_holder",
        "posMasters.next_holder.posLevel",
        "posMasters.next_holder.posType",
        "posMasters.next_holder.profileSalary",
        "posMasters.next_holder.profileEducations",
        "posMasters.next_holder.current_holders",
        "posMasters.next_holder.current_holders.positions",
        "posMasters.next_holder.current_holders.orgRoot",
        "posMasters.next_holder.current_holders.orgChild1",
        "posMasters.next_holder.current_holders.orgChild2",
        "posMasters.next_holder.current_holders.orgChild3",
        "posMasters.next_holder.current_holders.orgChild4",
        "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.orgRoot",
        "posMasters.orgChild1",
        "posMasters.orgChild2",
        "posMasters.orgChild3",
        "posMasters.orgChild4",
        "posMasters.next_holder",
        "posMasters.next_holder.posLevel",
        "posMasters.next_holder.posType",
        "posMasters.next_holder.profileSalary",
        "posMasters.next_holder.profileEducations",
        "posMasters.next_holder.current_holders",
        "posMasters.next_holder.current_holders.positions",
        "posMasters.next_holder.current_holders.orgRoot",
        "posMasters.next_holder.current_holders.orgChild1",
        "posMasters.next_holder.current_holders.orgChild2",
        "posMasters.next_holder.current_holders.orgChild3",
        "posMasters.next_holder.current_holders.orgChild4",
        "posMasters.next_holder.current_holders.orgChild4",
        "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.orgRoot",
        "posMasters.orgChild1",
        "posMasters.orgChild2",
        "posMasters.orgChild3",
        "posMasters.orgChild4",
        "posMasters.next_holder",
        "posMasters.next_holder.posLevel",
        "posMasters.next_holder.posType",
        "posMasters.next_holder.profileSalary",
        "posMasters.next_holder.profileEducations",
        "posMasters.next_holder.current_holders",
        "posMasters.next_holder.current_holders.positions",
        "posMasters.next_holder.current_holders.orgRoot",
        "posMasters.next_holder.current_holders.orgChild1",
        "posMasters.next_holder.current_holders.orgChild2",
        "posMasters.next_holder.current_holders.orgChild3",
        "posMasters.next_holder.current_holders.orgChild4",
        "posMasters.positions",
        "posMasters.positions.posLevel",
        "posMasters.positions.posType",
        "posMasters.positions.posExecutive",
      ],
    });

    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) {
              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) {
                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 != "") {
                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.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.date == null ? 0 : b.date.getTime()) -
                    (a.date == null ? 0 : a.date.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.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.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(" หรือ ")
                    : posMaster.next_holder.posType == null
                      ? "-"
                      : posMaster.next_holder.posType.posTypeName,
                profilePosLevel:
                  posMaster.next_holder == null
                    ? positionMasterOld == null
                      ? posLevel.join(" หรือ ")
                      : profilePosLevel.join(" หรือ ")
                    : posMaster.next_holder.posLevel == null
                      ? "-"
                      : posMaster.next_holder.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: 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.next_holder != null) {
                  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 != "") {
                  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.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.date == null ? 0 : b.date.getTime()) -
                      (a.date == null ? 0 : a.date.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.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.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(" หรือ ")
                      : posMaster.next_holder.posType == null
                        ? "-"
                        : posMaster.next_holder.posType.posTypeName,
                  profilePosLevel:
                    posMaster.next_holder == null
                      ? positionMasterOld == null
                        ? posLevel.join(" หรือ ")
                        : profilePosLevel.join(" หรือ ")
                      : posMaster.next_holder.posLevel == null
                        ? "-"
                        : posMaster.next_holder.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: 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.next_holder != null) {
                    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 != "") {
                    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.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.date == null ? 0 : b.date.getTime()) -
                        (a.date == null ? 0 : a.date.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.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.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(" หรือ ")
                        : posMaster.next_holder.posType == null
                          ? "-"
                          : posMaster.next_holder.posType.posTypeName,
                    profilePosLevel:
                      posMaster.next_holder == null
                        ? positionMasterOld == null
                          ? posLevel.join(" หรือ ")
                          : profilePosLevel.join(" หรือ ")
                        : posMaster.next_holder.posLevel == null
                          ? "-"
                          : posMaster.next_holder.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: 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.next_holder != null) {
                      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 != "") {
                      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.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.date == null ? 0 : b.date.getTime()) -
                          (a.date == null ? 0 : a.date.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.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.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(" หรือ ")
                          : posMaster.next_holder.posType == null
                            ? "-"
                            : posMaster.next_holder.posType.posTypeName,
                      profilePosLevel:
                        posMaster.next_holder == null
                          ? positionMasterOld == null
                            ? posLevel.join(" หรือ ")
                            : profilePosLevel.join(" หรือ ")
                          : posMaster.next_holder.posLevel == null
                            ? "-"
                            : posMaster.next_holder.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: 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.next_holder != null) {
                      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 != "") {
                      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.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.date == null ? 0 : b.date.getTime()) -
                          (a.date == null ? 0 : a.date.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.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.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(" หรือ ")
                          : posMaster.next_holder.posType == null
                            ? "-"
                            : posMaster.next_holder.posType.posTypeName,
                      profilePosLevel:
                        posMaster.next_holder == null
                          ? positionMasterOld == null
                            ? posLevel.join(" หรือ ")
                            : profilePosLevel.join(" หรือ ")
                          : posMaster.next_holder.posLevel == null
                            ? "-"
                            : posMaster.next_holder.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: 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: { data } });
  }

  /**
   * API Report3
   *
   * @summary Report3
   *
   */
  @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, "ไม่พบข้อมูล");
    // }

    const orgRootData = await this.orgRootRepository.find({
      where: {
        id: rootId,
        // orgRevisionId: orgRevision.id,
      },
      order: { orgRootOrder: "ASC" },
      relations: [
        "posMasters",
        "posMasters.orgRoot",
        "posMasters.orgChild1",
        "posMasters.orgChild2",
        "posMasters.orgChild3",
        "posMasters.orgChild4",
        "posMasters.next_holder",
        "posMasters.next_holder",
        "posMasters.next_holder",
        "posMasters.next_holder.posLevel",
        "posMasters.next_holder.posType",
        "posMasters.next_holder.profileSalary",
        "posMasters.next_holder.profileEducations",
        "posMasters.next_holder.current_holders",
        "posMasters.next_holder.current_holders.positions",
        "posMasters.next_holder.current_holders.orgRoot",
        "posMasters.next_holder.current_holders.orgChild1",
        "posMasters.next_holder.current_holders.orgChild2",
        "posMasters.next_holder.current_holders.orgChild3",
        "posMasters.next_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.orgRoot",
        "posMasters.orgChild1",
        "posMasters.orgChild2",
        "posMasters.orgChild3",
        "posMasters.orgChild4",
        "posMasters.next_holder",
        "posMasters.next_holder.posLevel",
        "posMasters.next_holder.posType",
        "posMasters.next_holder.profileSalary",
        "posMasters.next_holder.profileEducations",
        "posMasters.next_holder.current_holders",
        "posMasters.next_holder.current_holders.positions",
        "posMasters.next_holder.current_holders.orgRoot",
        "posMasters.next_holder.current_holders.orgChild1",
        "posMasters.next_holder.current_holders.orgChild2",
        "posMasters.next_holder.current_holders.orgChild3",
        "posMasters.next_holder.current_holders.orgChild4",
        "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.orgRoot",
        "posMasters.orgChild1",
        "posMasters.orgChild2",
        "posMasters.orgChild3",
        "posMasters.orgChild4",
        "posMasters.next_holder",
        "posMasters.next_holder.posLevel",
        "posMasters.next_holder.posType",
        "posMasters.next_holder.profileSalary",
        "posMasters.next_holder.profileEducations",
        "posMasters.next_holder.current_holders",
        "posMasters.next_holder.current_holders.positions",
        "posMasters.next_holder.current_holders.orgRoot",
        "posMasters.next_holder.current_holders.orgChild1",
        "posMasters.next_holder.current_holders.orgChild2",
        "posMasters.next_holder.current_holders.orgChild3",
        "posMasters.next_holder.current_holders.orgChild4",
        "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.orgRoot",
        "posMasters.orgChild1",
        "posMasters.orgChild2",
        "posMasters.orgChild3",
        "posMasters.orgChild4",
        "posMasters.next_holder",
        "posMasters.next_holder.posLevel",
        "posMasters.next_holder.posType",
        "posMasters.next_holder.profileSalary",
        "posMasters.next_holder.profileEducations",
        "posMasters.next_holder.current_holders",
        "posMasters.next_holder.current_holders.positions",
        "posMasters.next_holder.current_holders.orgRoot",
        "posMasters.next_holder.current_holders.orgChild1",
        "posMasters.next_holder.current_holders.orgChild2",
        "posMasters.next_holder.current_holders.orgChild3",
        "posMasters.next_holder.current_holders.orgChild4",
        "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.orgRoot",
        "posMasters.orgChild1",
        "posMasters.orgChild2",
        "posMasters.orgChild3",
        "posMasters.orgChild4",
        "posMasters.next_holder",
        "posMasters.next_holder.posLevel",
        "posMasters.next_holder.posType",
        "posMasters.next_holder.profileSalary",
        "posMasters.next_holder.profileEducations",
        "posMasters.next_holder.current_holders",
        "posMasters.next_holder.current_holders.positions",
        "posMasters.next_holder.current_holders.orgRoot",
        "posMasters.next_holder.current_holders.orgChild1",
        "posMasters.next_holder.current_holders.orgChild2",
        "posMasters.next_holder.current_holders.orgChild3",
        "posMasters.next_holder.current_holders.orgChild4",
        "posMasters.positions",
        "posMasters.positions.posLevel",
        "posMasters.positions.posType",
        "posMasters.positions.posExecutive",
      ],
    });

    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 positionMasterProfileOld: any = null;
              if (posMaster.next_holder != null) {
                positionMasterProfileOld = posMaster.next_holder.current_holders.find(
                  (x) => x.orgRevisionId == orgRevisionActive.id,
                );
              }
              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.date == null ? 0 : b.date.getTime()) -
                    (a.date == null ? 0 : a.date.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
                    : posMaster.next_holder.posType == null
                      ? "-"
                      : posMaster.next_holder.posType.posTypeName,
                posLevel:
                  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.isSit == false
                    ? posMaster.positions.find((x: any) => x.positionIsSelected == true)
                        ?.posExecutive?.posExecutiveName
                    : positionMasterProfileOld == null
                      ? "-"
                      : positionMasterProfileOld.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;

      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 positionMasterProfileOld: any = null;
                if (posMaster.next_holder != null) {
                  positionMasterProfileOld = posMaster.next_holder.current_holders.find(
                    (x) => x.orgRevisionId == orgRevisionActive.id,
                  );
                }
                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.date == null ? 0 : b.date.getTime()) -
                      (a.date == null ? 0 : a.date.getTime()),
                  );
                  if (_salary.length > 0) {
                    salary = _salary[0];
                  }
                }

                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
                      : posMaster.next_holder.posType == null
                        ? "-"
                        : posMaster.next_holder.posType.posTypeName,
                  posLevel:
                    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.isSit == false
                      ? posMaster.positions.find((x: any) => x.positionIsSelected == true)
                          ?.posExecutive?.posExecutiveName
                      : positionMasterProfileOld == null
                        ? "-"
                        : positionMasterProfileOld.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;

        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 && posMaster.next_holder != null) {
                  let positionMasterProfileOld: any = null;
                  if (posMaster.next_holder != null) {
                    positionMasterProfileOld = posMaster.next_holder.current_holders.find(
                      (x) => x.orgRevisionId == orgRevisionActive.id,
                    );
                  }
                  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.date == null ? 0 : b.date.getTime()) -
                        (a.date == null ? 0 : a.date.getTime()),
                    );
                    if (_salary.length > 0) {
                      salary = _salary[0];
                    }
                  }

                  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
                        : posMaster.next_holder.posType == null
                          ? "-"
                          : posMaster.next_holder.posType.posTypeName,
                    posLevel:
                      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.isSit == false
                        ? posMaster.positions.find((x: any) => x.positionIsSelected == true)
                            ?.posExecutive?.posExecutiveName
                        : positionMasterProfileOld == null
                          ? "-"
                          : positionMasterProfileOld.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;

          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 positionMasterProfileOld: any = null;
                    if (posMaster.next_holder != null) {
                      positionMasterProfileOld = posMaster.next_holder.current_holders.find(
                        (x) => x.orgRevisionId == orgRevisionActive.id,
                      );
                    }
                    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.date == null ? 0 : b.date.getTime()) -
                          (a.date == null ? 0 : a.date.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
                          : posMaster.next_holder.posType == null
                            ? "-"
                            : posMaster.next_holder.posType.posTypeName,
                      posLevel:
                        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.isSit == false
                          ? posMaster.positions.find((x: any) => x.positionIsSelected == true)
                              ?.posExecutive?.posExecutiveName
                          : positionMasterProfileOld == null
                            ? "-"
                            : positionMasterProfileOld.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;

            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 positionMasterProfileOld: any = null;
                      if (posMaster.next_holder != null) {
                        positionMasterProfileOld = posMaster.next_holder.current_holders.find(
                          (x) => x.orgRevisionId == orgRevisionActive.id,
                        );
                      }
                      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.date == null ? 0 : b.date.getTime()) -
                            (a.date == null ? 0 : a.date.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
                            : posMaster.next_holder.posType == null
                              ? "-"
                              : posMaster.next_holder.posType.posTypeName,
                        posLevel:
                          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.isSit == false
                            ? posMaster.positions.find((x: any) => x.positionIsSelected == true)
                                ?.posExecutive?.posExecutiveName
                            : positionMasterProfileOld == null
                              ? "-"
                              : positionMasterProfileOld.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: { data } });
  }
}
