diff --git a/src/controllers/OrganizationController.ts b/src/controllers/OrganizationController.ts index fdf24b66..e1767a43 100644 --- a/src/controllers/OrganizationController.ts +++ b/src/controllers/OrganizationController.ts @@ -65,6 +65,8 @@ import { } from "../services/PositionService"; import { orgStructureCache } from "../utils/OrgStructureCache"; import { OrgIdMapping, AllOrgMappings, SavePosMasterHistory } from "../interfaces/OrgMapping"; +import { OrgPermissionData, NodeLevel } from "../interfaces/OrgTypes"; +import { formatPosMaster, generateLabelName, filterPosMasters } from "../utils/org-formatting"; @Route("api/v1/org") @Tags("Organization") @@ -5678,7 +5680,7 @@ export class OrganizationController extends Controller { */ @Get("act/{id}") async detailAct(@Path() id: string, @Request() request: RequestWithUser) { - let _data: any = { + let _data: OrgPermissionData = { root: null, child1: null, child2: null, @@ -5721,7 +5723,7 @@ export class OrganizationController extends Controller { if (profileAssign && _privilege.privilege !== "OWNER" && _privilege.privilege !== "PARENT") { if (_privilege.privilege == "NORMAL") { const holder = profile.current_holders.find((x) => x.orgRevisionId === id); - if (!holder) return; + if (!holder) return new HttpSuccess({ remark: "", data: [] }); _data.root = [holder.orgRootId]; _data.child1 = [holder.orgChild1Id]; _data.child2 = [holder.orgChild2Id]; @@ -5729,7 +5731,7 @@ export class OrganizationController extends Controller { _data.child4 = [holder.orgChild4Id]; } else if (_privilege.privilege == "CHILD" || _privilege.privilege == "BROTHER") { const holder = profile.current_holders.find((x) => x.orgRevisionId === id); - if (!holder) return; + if (!holder) return new HttpSuccess({ remark: "", data: [] }); _data.root = [holder.orgRootId]; if (_privilege.root && _privilege.child1 === null) { } else if (_privilege.child1 && _privilege.child2 === null) { @@ -5752,10 +5754,24 @@ export class OrganizationController extends Controller { } const orgDna = await new permission().checkDna(request, request.user.sub); - let level: any = resolveNodeLevel(orgDna); + let level: NodeLevel = resolveNodeLevel(orgDna); const orgRootData = await AppDataSource.getRepository(OrgRoot) .createQueryBuilder("orgRoot") + .select([ + "orgRoot.id", + "orgRoot.orgRootName", + "orgRoot.orgRootShortName", + "orgRoot.orgRootCode", + "orgRoot.orgRootOrder", + ]) + .addSelect([ + "posMasters.id", + "posMasters.posMasterNo", + "posMasters.orgChild1Id", + "posMasters.isDirector", + ]) + .addSelect(["current_holder.prefix", "current_holder.firstName", "current_holder.lastName"]) .where("orgRoot.orgRevisionId = :id", { id }) .andWhere( _data.root != undefined && _data.root != null @@ -5767,8 +5783,8 @@ export class OrganizationController extends Controller { node: _data.root, }, ) - .leftJoinAndSelect("orgRoot.posMasters", "posMasters") - .leftJoinAndSelect("posMasters.current_holder", "current_holder") + .leftJoin("orgRoot.posMasters", "posMasters") + .leftJoin("posMasters.current_holder", "current_holder") .orderBy("orgRoot.orgRootOrder", "ASC") .getMany(); @@ -5777,6 +5793,25 @@ export class OrganizationController extends Controller { orgRootIds && orgRootIds.length > 0 ? await AppDataSource.getRepository(OrgChild1) .createQueryBuilder("orgChild1") + .select([ + "orgChild1.id", + "orgChild1.orgRootId", + "orgChild1.orgChild1Name", + "orgChild1.orgChild1ShortName", + "orgChild1.orgChild1Code", + "orgChild1.orgChild1Order", + ]) + .addSelect([ + "posMasters.id", + "posMasters.posMasterNo", + "posMasters.orgChild2Id", + "posMasters.isDirector", + ]) + .addSelect([ + "current_holder.prefix", + "current_holder.firstName", + "current_holder.lastName", + ]) .where("orgChild1.orgRootId IN (:...ids)", { ids: orgRootIds }) .andWhere( _data.child1 != undefined && _data.child1 != null @@ -5788,8 +5823,8 @@ export class OrganizationController extends Controller { node: _data.child1, }, ) - .leftJoinAndSelect("orgChild1.posMasters", "posMasters") - .leftJoinAndSelect("posMasters.current_holder", "current_holder") + .leftJoin("orgChild1.posMasters", "posMasters") + .leftJoin("posMasters.current_holder", "current_holder") .orderBy("orgChild1.orgChild1Order", "ASC") .getMany() : []; @@ -5799,6 +5834,25 @@ export class OrganizationController extends Controller { orgChild1Ids && orgChild1Ids.length > 0 ? await AppDataSource.getRepository(OrgChild2) .createQueryBuilder("orgChild2") + .select([ + "orgChild2.id", + "orgChild2.orgChild1Id", + "orgChild2.orgChild2Name", + "orgChild2.orgChild2ShortName", + "orgChild2.orgChild2Code", + "orgChild2.orgChild2Order", + ]) + .addSelect([ + "posMasters.id", + "posMasters.posMasterNo", + "posMasters.orgChild3Id", + "posMasters.isDirector", + ]) + .addSelect([ + "current_holder.prefix", + "current_holder.firstName", + "current_holder.lastName", + ]) .where("orgChild2.orgChild1Id IN (:...ids)", { ids: orgChild1Ids }) .andWhere( _data.child2 != undefined && _data.child2 != null @@ -5810,8 +5864,8 @@ export class OrganizationController extends Controller { node: _data.child2, }, ) - .leftJoinAndSelect("orgChild2.posMasters", "posMasters") - .leftJoinAndSelect("posMasters.current_holder", "current_holder") + .leftJoin("orgChild2.posMasters", "posMasters") + .leftJoin("posMasters.current_holder", "current_holder") .orderBy("orgChild2.orgChild2Order", "ASC") .getMany() : []; @@ -5821,6 +5875,25 @@ export class OrganizationController extends Controller { orgChild2Ids && orgChild2Ids.length > 0 ? await AppDataSource.getRepository(OrgChild3) .createQueryBuilder("orgChild3") + .select([ + "orgChild3.id", + "orgChild3.orgChild2Id", + "orgChild3.orgChild3Name", + "orgChild3.orgChild3ShortName", + "orgChild3.orgChild3Code", + "orgChild3.orgChild3Order", + ]) + .addSelect([ + "posMasters.id", + "posMasters.posMasterNo", + "posMasters.orgChild4Id", + "posMasters.isDirector", + ]) + .addSelect([ + "current_holder.prefix", + "current_holder.firstName", + "current_holder.lastName", + ]) .where("orgChild3.orgChild2Id IN (:...ids)", { ids: orgChild2Ids }) .andWhere( _data.child3 != undefined && _data.child3 != null @@ -5832,8 +5905,8 @@ export class OrganizationController extends Controller { node: _data.child3, }, ) - .leftJoinAndSelect("orgChild3.posMasters", "posMasters") - .leftJoinAndSelect("posMasters.current_holder", "current_holder") + .leftJoin("orgChild3.posMasters", "posMasters") + .leftJoin("posMasters.current_holder", "current_holder") .orderBy("orgChild3.orgChild3Order", "ASC") .getMany() : []; @@ -5843,6 +5916,20 @@ export class OrganizationController extends Controller { orgChild3Ids && orgChild3Ids.length > 0 ? await AppDataSource.getRepository(OrgChild4) .createQueryBuilder("orgChild4") + .select([ + "orgChild4.id", + "orgChild4.orgChild3Id", + "orgChild4.orgChild4Name", + "orgChild4.orgChild4ShortName", + "orgChild4.orgChild4Code", + "orgChild4.orgChild4Order", + ]) + .addSelect(["posMasters.id", "posMasters.posMasterNo", "posMasters.isDirector"]) + .addSelect([ + "current_holder.prefix", + "current_holder.firstName", + "current_holder.lastName", + ]) .where("orgChild4.orgChild3Id IN (:...ids)", { ids: orgChild3Ids }) .andWhere( _data.child4 != undefined && _data.child4 != null @@ -5854,333 +5941,183 @@ export class OrganizationController extends Controller { node: _data.child4, }, ) - .leftJoinAndSelect("orgChild4.posMasters", "posMasters") - .leftJoinAndSelect("posMasters.current_holder", "current_holder") + .leftJoin("orgChild4.posMasters", "posMasters") + .leftJoin("posMasters.current_holder", "current_holder") .orderBy("orgChild4.orgChild4Order", "ASC") .getMany() : []; const cannotViewRootPosMaster = _privilege.privilege === "PARENT" || - (_privilege.privilege === "BROTHER" && level > 1) || - (_privilege.privilege === "CHILD" && level > 0) || - (_privilege.privilege === "NORMAL" && level != 0); + (_privilege.privilege === "BROTHER" && level !== null && level > 1) || + (_privilege.privilege === "CHILD" && level !== null && level > 0) || + (_privilege.privilege === "NORMAL" && level !== null && level !== 0); const cannotViewChild1PosMaster = - (_privilege.privilege === "PARENT" && level > 1) || - (_privilege.privilege === "BROTHER" && level > 2) || - (_privilege.privilege === "CHILD" && level > 1) || + (_privilege.privilege === "PARENT" && level !== null && level > 1) || + (_privilege.privilege === "BROTHER" && level !== null && level > 2) || + (_privilege.privilege === "CHILD" && level !== null && level > 1) || (_privilege.privilege === "NORMAL" && level !== 1); const cannotViewChild2PosMaster = - (_privilege.privilege === "PARENT" && level > 2) || - (_privilege.privilege === "BROTHER" && level > 3) || - (_privilege.privilege === "CHILD" && level > 2) || + (_privilege.privilege === "PARENT" && level !== null && level > 2) || + (_privilege.privilege === "BROTHER" && level !== null && level > 3) || + (_privilege.privilege === "CHILD" && level !== null && level > 2) || (_privilege.privilege === "NORMAL" && level !== 2); const cannotViewChild3PosMaster = - (_privilege.privilege === "PARENT" && level > 3) || - (_privilege.privilege === "BROTHER" && level > 4) || - (_privilege.privilege === "CHILD" && level > 3) || + (_privilege.privilege === "PARENT" && level !== null && level > 3) || + (_privilege.privilege === "BROTHER" && level !== null && level > 4) || + (_privilege.privilege === "CHILD" && level !== null && level > 3) || (_privilege.privilege === "NORMAL" && level !== 3); const cannotViewChild4PosMaster = - (_privilege.privilege === "PARENT" && level > 4) || - (_privilege.privilege === "CHILD" && level > 4) || + (_privilege.privilege === "PARENT" && level !== null && level > 4) || + (_privilege.privilege === "CHILD" && level !== null && level > 4) || (_privilege.privilege === "NORMAL" && level !== 4); - // const formattedData = orgRootData.map((orgRoot) => { - const formattedData = await Promise.all( - orgRootData.map(async (orgRoot) => { - return { - orgTreeId: orgRoot.id, - orgLevel: 0, - orgName: orgRoot.orgRootName, - orgTreeName: orgRoot.orgRootName, - orgTreeShortName: orgRoot.orgRootShortName, - orgTreeCode: orgRoot.orgRootCode, - orgCode: orgRoot.orgRootCode + "00", - orgRootName: orgRoot.orgRootName, - labelName: - orgRoot.orgRootName + " " + orgRoot.orgRootCode + "00" + " " + orgRoot.orgRootShortName, - posMaster: cannotViewRootPosMaster - ? [] - : await Promise.all( - orgRoot.posMasters - .filter( - (x) => - x.orgChild1Id == null && - // x.current_holderId != null && - x.isDirector === true, - ) - // .sort((a, b) => a.posMasterOrder - b.posMasterOrder) // Sort by posMasterOrder ASC - // .slice(0, 3) // Select the first 3 rows - .map(async (x) => ({ - posmasterId: x.id, - posNo: `${orgRoot.orgRootShortName} ${x.posMasterNo}`, - orgTreeId: orgRoot.id, - orgLevel: 0, - fullNameCurrentHolder: - x.current_holder == null - ? null - : `${x.current_holder.prefix}${x.current_holder.firstName} ${x.current_holder.lastName}`, - })), - ), - children: await Promise.all( - orgChild1Data - .filter((orgChild1) => orgChild1.orgRootId === orgRoot.id) - .map(async (orgChild1) => ({ - orgTreeId: orgChild1.id, - orgRootId: orgRoot.id, - orgLevel: 1, - orgName: `${orgChild1.orgChild1Name}/${orgRoot.orgRootName}`, - orgTreeName: orgChild1.orgChild1Name, - orgTreeShortName: orgChild1.orgChild1ShortName, - orgTreeCode: orgChild1.orgChild1Code, - orgCode: orgRoot.orgRootCode + orgChild1.orgChild1Code, - orgRootName: orgRoot.orgRootName, - labelName: - orgChild1.orgChild1Name + - " " + - orgRoot.orgRootCode + - orgChild1.orgChild1Code + - " " + - orgChild1.orgChild1ShortName + - "/" + - orgRoot.orgRootName + - " " + - orgRoot.orgRootCode + - "00" + - " " + - orgRoot.orgRootShortName, - posMaster: cannotViewChild1PosMaster - ? [] - : await Promise.all( - orgChild1.posMasters - .filter( - (x) => - x.orgChild2Id == null && - // x.current_holderId != null && - x.isDirector === true, - ) - // .sort((a, b) => a.posMasterOrder - b.posMasterOrder) // Sort by posMasterOrder ASC - // .slice(0, 3) // Select the first 3 rows - .map(async (x) => ({ - posmasterId: x.id, - posNo: `${orgChild1.orgChild1ShortName} ${x.posMasterNo}`, - orgTreeId: orgChild1.id, - orgLevel: 1, - fullNameCurrentHolder: - x.current_holder == null - ? null - : `${x.current_holder.prefix}${x.current_holder.firstName} ${x.current_holder.lastName}`, - })), - ), - - children: await Promise.all( - orgChild2Data - .filter((orgChild2) => orgChild2.orgChild1Id === orgChild1.id) - .map(async (orgChild2) => ({ - orgTreeId: orgChild2.id, - orgRootId: orgChild1.id, - orgLevel: 2, - orgName: `${orgChild2.orgChild2Name}/${orgChild1.orgChild1Name}/${orgRoot.orgRootName}`, - orgTreeName: orgChild2.orgChild2Name, - orgTreeShortName: orgChild2.orgChild2ShortName, - orgTreeCode: orgChild2.orgChild2Code, - orgCode: orgRoot.orgRootCode + orgChild2.orgChild2Code, - orgRootName: orgRoot.orgRootName, - labelName: - orgChild2.orgChild2Name + - " " + - orgRoot.orgRootCode + - orgChild2.orgChild2Code + - " " + - orgChild2.orgChild2ShortName + - "/" + - orgChild1.orgChild1Name + - " " + - orgRoot.orgRootCode + - orgChild1.orgChild1Code + - " " + - orgChild1.orgChild1ShortName + - "/" + - orgRoot.orgRootName + - " " + - orgRoot.orgRootCode + - "00" + - " " + - orgRoot.orgRootShortName, - posMaster: cannotViewChild2PosMaster - ? [] - : await Promise.all( - orgChild2.posMasters - .filter( - (x) => - x.orgChild3Id == null && - // x.current_holderId != null && - x.isDirector === true, - ) - // .sort((a, b) => a.posMasterOrder - b.posMasterOrder) // Sort by posMasterOrder ASC - // .slice(0, 3) // Select the first 3 rows - .map(async (x) => ({ - posmasterId: x.id, - posNo: `${orgChild2.orgChild2ShortName} ${x.posMasterNo}`, - orgTreeId: orgChild2.id, - orgLevel: 2, - fullNameCurrentHolder: - x.current_holder == null - ? null - : `${x.current_holder.prefix}${x.current_holder.firstName} ${x.current_holder.lastName}`, - })), - ), - - children: await Promise.all( - orgChild3Data - .filter((orgChild3) => orgChild3.orgChild2Id === orgChild2.id) - .map(async (orgChild3) => ({ - orgTreeId: orgChild3.id, - orgRootId: orgChild2.id, - orgLevel: 3, - orgName: `${orgChild3.orgChild3Name}/${orgChild2.orgChild2Name}/${orgChild1.orgChild1Name}/${orgRoot.orgRootName}`, - orgTreeName: orgChild3.orgChild3Name, - orgTreeShortName: orgChild3.orgChild3ShortName, - orgTreeCode: orgChild3.orgChild3Code, - orgCode: orgRoot.orgRootCode + orgChild3.orgChild3Code, - orgRootName: orgRoot.orgRootName, - labelName: - orgChild3.orgChild3Name + - " " + - orgRoot.orgRootCode + - orgChild3.orgChild3Code + - " " + - orgChild3.orgChild3ShortName + - "/" + - orgChild2.orgChild2Name + - " " + - orgRoot.orgRootCode + - orgChild2.orgChild2Code + - " " + - orgChild2.orgChild2ShortName + - "/" + - orgChild1.orgChild1Name + - " " + - orgRoot.orgRootCode + - orgChild1.orgChild1Code + - " " + - orgChild1.orgChild1ShortName + - "/" + - orgRoot.orgRootName + - " " + - orgRoot.orgRootCode + - "00" + - " " + - orgRoot.orgRootShortName, - posMaster: cannotViewChild3PosMaster - ? [] - : await Promise.all( - orgChild3.posMasters - .filter( - (x) => - x.orgChild4Id == null && - // x.current_holderId != null && - x.isDirector === true, - ) - // .sort((a, b) => a.posMasterOrder - b.posMasterOrder) // Sort by posMasterOrder ASC - // .slice(0, 3) // Select the first 3 rows - .map(async (x) => ({ - posmasterId: x.id, - posNo: `${orgChild3.orgChild3ShortName} ${x.posMasterNo}`, - orgTreeId: orgChild3.id, - orgLevel: 3, - fullNameCurrentHolder: - x.current_holder == null - ? null - : `${x.current_holder.prefix}${x.current_holder.firstName} ${x.current_holder.lastName}`, - })), - ), - - children: await Promise.all( - orgChild4Data - .filter((orgChild4) => orgChild4.orgChild3Id === orgChild3.id) - .map(async (orgChild4) => ({ - orgTreeId: orgChild4.id, - orgRootId: orgChild3.id, - orgLevel: 4, - orgName: `${orgChild4.orgChild4Name}/${orgChild3.orgChild3Name}/${orgChild2.orgChild2Name}/${orgChild1.orgChild1Name}/${orgRoot.orgRootName}`, - orgTreeName: orgChild4.orgChild4Name, - orgTreeShortName: orgChild4.orgChild4ShortName, - orgTreeCode: orgChild4.orgChild4Code, - orgCode: orgRoot.orgRootCode + orgChild4.orgChild4Code, - orgRootName: orgRoot.orgRootName, - labelName: - orgChild4.orgChild4Name + - " " + - orgRoot.orgRootCode + - orgChild4.orgChild4Code + - " " + - orgChild4.orgChild4ShortName + - "/" + - orgChild3.orgChild3Name + - " " + - orgRoot.orgRootCode + - orgChild3.orgChild3Code + - " " + - orgChild3.orgChild3ShortName + - "/" + - orgChild2.orgChild2Name + - " " + - orgRoot.orgRootCode + - orgChild2.orgChild2Code + - " " + - orgChild2.orgChild2ShortName + - "/" + - orgChild1.orgChild1Name + - " " + - orgRoot.orgRootCode + - orgChild1.orgChild1Code + - " " + - orgChild1.orgChild1ShortName + - "/" + - orgRoot.orgRootName + - " " + - orgRoot.orgRootCode + - "00" + - " " + - orgRoot.orgRootShortName, - posMaster: cannotViewChild4PosMaster - ? [] - : await Promise.all( - orgChild4.posMasters - .filter( - (x) => - // x.current_holderId != null && - x.isDirector === true, - ) - // .sort((a, b) => a.posMasterOrder - b.posMasterOrder) // Sort by posMasterOrder ASC - // .slice(0, 3) // Select the first 3 rows - .map(async (x) => ({ - posmasterId: x.id, - posNo: `${orgChild4.orgChild4ShortName} ${x.posMasterNo}`, - orgTreeId: orgChild4.id, - orgLevel: 4, - fullNameCurrentHolder: - x.current_holder == null - ? null - : `${x.current_holder.prefix}${x.current_holder.firstName} ${x.current_holder.lastName}`, - })), - ), - })), - ), - })), - ), - })), - ), - })), + const formattedData = orgRootData.map((orgRoot) => ({ + orgTreeId: orgRoot.id, + orgLevel: 0, + orgName: orgRoot.orgRootName, + orgTreeName: orgRoot.orgRootName, + orgTreeShortName: orgRoot.orgRootShortName, + orgTreeCode: orgRoot.orgRootCode, + orgCode: orgRoot.orgRootCode + "00", + orgRootName: orgRoot.orgRootName, + labelName: generateLabelName( + orgRoot.orgRootName, + orgRoot.orgRootCode + "00", + orgRoot.orgRootShortName, + orgRoot.orgRootName, + orgRoot.orgRootCode, + orgRoot.orgRootShortName, + ), + posMaster: cannotViewRootPosMaster + ? [] + : filterPosMasters(orgRoot.posMasters, "orgChild1Id").map((x) => + formatPosMaster(x, orgRoot.orgRootShortName, orgRoot.id, 0), ), - }; - }), - ); + children: orgChild1Data + .filter((orgChild1) => orgChild1.orgRootId === orgRoot.id) + .map((orgChild1) => ({ + orgTreeId: orgChild1.id, + orgRootId: orgRoot.id, + orgLevel: 1, + orgName: `${orgChild1.orgChild1Name}/${orgRoot.orgRootName}`, + orgTreeName: orgChild1.orgChild1Name, + orgTreeShortName: orgChild1.orgChild1ShortName, + orgTreeCode: orgChild1.orgChild1Code, + orgCode: orgRoot.orgRootCode + orgChild1.orgChild1Code, + orgRootName: orgRoot.orgRootName, + labelName: generateLabelName( + orgChild1.orgChild1Name, + orgChild1.orgChild1Code, + orgChild1.orgChild1ShortName, + orgRoot.orgRootName, + orgRoot.orgRootCode, + orgRoot.orgRootShortName, + ), + posMaster: cannotViewChild1PosMaster + ? [] + : filterPosMasters(orgChild1.posMasters, "orgChild2Id").map((x) => + formatPosMaster(x, orgChild1.orgChild1ShortName, orgChild1.id, 1), + ), + children: orgChild2Data + .filter((orgChild2) => orgChild2.orgChild1Id === orgChild1.id) + .map((orgChild2) => ({ + orgTreeId: orgChild2.id, + orgRootId: orgChild1.id, + orgLevel: 2, + orgName: `${orgChild2.orgChild2Name}/${orgChild1.orgChild1Name}/${orgRoot.orgRootName}`, + orgTreeName: orgChild2.orgChild2Name, + orgTreeShortName: orgChild2.orgChild2ShortName, + orgTreeCode: orgChild2.orgChild2Code, + orgCode: orgRoot.orgRootCode + orgChild2.orgChild2Code, + orgRootName: orgRoot.orgRootName, + labelName: generateLabelName( + orgChild2.orgChild2Name, + orgChild2.orgChild2Code, + orgChild2.orgChild2ShortName, + orgRoot.orgRootName, + orgRoot.orgRootCode, + orgRoot.orgRootShortName, + [orgChild1.orgChild1Name], + [orgChild1.orgChild1Code], + [orgChild1.orgChild1ShortName], + ), + posMaster: cannotViewChild2PosMaster + ? [] + : filterPosMasters(orgChild2.posMasters, "orgChild3Id").map((x) => + formatPosMaster(x, orgChild2.orgChild2ShortName, orgChild2.id, 2), + ), + children: orgChild3Data + .filter((orgChild3) => orgChild3.orgChild2Id === orgChild2.id) + .map((orgChild3) => ({ + orgTreeId: orgChild3.id, + orgRootId: orgChild2.id, + orgLevel: 3, + orgName: `${orgChild3.orgChild3Name}/${orgChild2.orgChild2Name}/${orgChild1.orgChild1Name}/${orgRoot.orgRootName}`, + orgTreeName: orgChild3.orgChild3Name, + orgTreeShortName: orgChild3.orgChild3ShortName, + orgTreeCode: orgChild3.orgChild3Code, + orgCode: orgRoot.orgRootCode + orgChild3.orgChild3Code, + orgRootName: orgRoot.orgRootName, + labelName: generateLabelName( + orgChild3.orgChild3Name, + orgChild3.orgChild3Code, + orgChild3.orgChild3ShortName, + orgRoot.orgRootName, + orgRoot.orgRootCode, + orgRoot.orgRootShortName, + [orgChild2.orgChild2Name, orgChild1.orgChild1Name], + [orgChild2.orgChild2Code, orgChild1.orgChild1Code], + [orgChild2.orgChild2ShortName, orgChild1.orgChild1ShortName], + ), + posMaster: cannotViewChild3PosMaster + ? [] + : filterPosMasters(orgChild3.posMasters, "orgChild4Id").map((x) => + formatPosMaster(x, orgChild3.orgChild3ShortName, orgChild3.id, 3), + ), + children: orgChild4Data + .filter((orgChild4) => orgChild4.orgChild3Id === orgChild3.id) + .map((orgChild4) => ({ + orgTreeId: orgChild4.id, + orgRootId: orgChild3.id, + orgLevel: 4, + orgName: `${orgChild4.orgChild4Name}/${orgChild3.orgChild3Name}/${orgChild2.orgChild2Name}/${orgChild1.orgChild1Name}/${orgRoot.orgRootName}`, + orgTreeName: orgChild4.orgChild4Name, + orgTreeShortName: orgChild4.orgChild4ShortName, + orgTreeCode: orgChild4.orgChild4Code, + orgCode: orgRoot.orgRootCode + orgChild4.orgChild4Code, + orgRootName: orgRoot.orgRootName, + labelName: generateLabelName( + orgChild4.orgChild4Name, + orgChild4.orgChild4Code, + orgChild4.orgChild4ShortName, + orgRoot.orgRootName, + orgRoot.orgRootCode, + orgRoot.orgRootShortName, + [orgChild3.orgChild3Name, orgChild2.orgChild2Name, orgChild1.orgChild1Name], + [orgChild3.orgChild3Code, orgChild2.orgChild2Code, orgChild1.orgChild1Code], + [ + orgChild3.orgChild3ShortName, + orgChild2.orgChild2ShortName, + orgChild1.orgChild1ShortName, + ], + ), + posMaster: cannotViewChild4PosMaster + ? [] + : orgChild4.posMasters + .filter((x) => x.isDirector === true) + .map((x) => + formatPosMaster(x, orgChild4.orgChild4ShortName, orgChild4.id, 4), + ), + })), + })), + })), + })), + })); return new HttpSuccess(formattedData); } diff --git a/src/interfaces/OrgTypes.ts b/src/interfaces/OrgTypes.ts new file mode 100644 index 00000000..12402cad --- /dev/null +++ b/src/interfaces/OrgTypes.ts @@ -0,0 +1,10 @@ +export interface OrgPermissionData { + root: (string | null | undefined)[] | null; + child1: (string | null | undefined)[] | null; + child2: (string | null | undefined)[] | null; + child3: (string | null | undefined)[] | null; + child4: (string | null | undefined)[] | null; + privilege?: "OWNER" | "PARENT" | "CHILD" | "BROTHER" | "NORMAL"; +} + +export type NodeLevel = 0 | 1 | 2 | 3 | 4 | null; diff --git a/src/utils/org-formatting.ts b/src/utils/org-formatting.ts new file mode 100644 index 00000000..701fb478 --- /dev/null +++ b/src/utils/org-formatting.ts @@ -0,0 +1,70 @@ +import { PosMaster } from "../entities/PosMaster"; + +export interface PosMasterFormatted { + posmasterId: string; + posNo: string; + orgTreeId: string; + orgLevel: number; + fullNameCurrentHolder: string | null; +} + +export interface OrgTreeNode { + orgTreeId: string; + orgLevel: number; + orgName: string; + orgTreeName: string; + orgTreeShortName: string; + orgTreeCode: string; + orgCode: string; + orgRootName: string; + labelName: string; + posMaster: PosMasterFormatted[]; + children?: OrgTreeNode[]; +} + +export function formatPosMaster( + posMaster: PosMaster, + orgShortName: string, + orgTreeId: string, + orgLevel: number, +): PosMasterFormatted { + return { + posmasterId: posMaster.id, + posNo: `${orgShortName} ${posMaster.posMasterNo}`, + orgTreeId, + orgLevel, + fullNameCurrentHolder: posMaster.current_holder + ? `${posMaster.current_holder.prefix}${posMaster.current_holder.firstName} ${posMaster.current_holder.lastName}` + : null, + }; +} + +export function generateLabelName( + nodeName: string, + nodeCode: string, + nodeShortName: string, + rootName: string, + rootCode: string, + rootShortName: string, + parentNames?: string[], + parentCodes?: string[], + parentShortNames?: string[], +): string { + const parts = [nodeName, " ", rootCode, nodeCode, " ", nodeShortName]; + + if (parentNames) { + for (let i = 0; i < parentNames.length; i++) { + parts.push("/", parentNames[i], " ", rootCode, parentCodes![i], " ", parentShortNames![i]); + } + } + + parts.push("/", rootName, " ", rootCode, "00", " ", rootShortName); + return parts.join(""); +} + +export function filterPosMasters( + posMasters: PosMaster[], + childLevelIdKey: keyof PosMaster, +): PosMaster[] { + return posMasters.filter((x) => x[childLevelIdKey] == null && x.isDirector === true); +}