diff --git a/src/controllers/ReportController.ts b/src/controllers/ReportController.ts index ba4dd6d..95e852c 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -9,6 +9,7 @@ import { PosType } from "../entities/PosType"; import { PosLevel } from "../entities/PosLevel"; import Extension from "../interfaces/extension"; import { DevelopmentScholarship } from "../entities/DevelopmentScholarship"; +import { IsNull, Not } from "typeorm"; @Route("api/v1/development/report") @Tags("Report") @Security("bearerAuth") @@ -24,16 +25,228 @@ export class ReportController extends Controller { */ @Get("main") async GetReportDevelopemtMain(/*@Path() type: string*/) { + // const _type = type.trim().toUpperCase(); const formattedData = { org: "_type", }; + //ตารางรายละเอียด กับ แบบรายงาน + const dataDevelopment = await AppDataSource.getRepository(Development) + .createQueryBuilder("development") + .leftJoinAndSelect("development.developmentHistorys", "history") + .leftJoinAndSelect("development.developmentPlannedGoals", "planGoals") + .leftJoinAndSelect("development.strategyChild1Actual", "strategy1") + .leftJoinAndSelect("development.strategyChild2Actual", "strategy2") + .leftJoinAndSelect("development.strategyChild3Actual", "strategy3") + .leftJoinAndSelect("development.strategyChild4Actual", "strategy4") + .leftJoinAndSelect("development.strategyChild5Actual", "strategy5") + .where("development.status = :status", { status: "FINISH" }) + .andWhere("development.strategyChild1ActualId IS NOT NULL") + .select([ + "development.id AS id", + "development.projectName AS projectName", + "development.year AS year", + "development.totalDate AS totalDate", + "development.budget AS budget", + "SUM(DISTINCT planGoals.amount) AS goalParticipants", + "COUNT(DISTINCT history.id) AS actualParticipants", + "strategy1.strategyChild1Name AS strategy1", + "strategy2.strategyChild2Name AS strategy2", + "strategy3.strategyChild3Name AS strategy3", + "strategy4.strategyChild4Name AS strategy4", + "strategy5.strategyChild5Name AS strategy5", + "development.accept AS acceptBudget", + "development.receive AS receiveBudget", + "development.obstacle AS obstacle", + "development.root AS root", + ]) + .groupBy("development.id") + .getRawMany(); + + const mappedDataDev = dataDevelopment.map((item, index) => { + let budget = null; + if (item.budget == "REGULATIONBUDGET") { + budget = "งบตามข้อบัญญัติ"; + }else if (item.budget == "OTHERBUDGET") { + budget = "เงินนอกงบประมาณ"; + }else if (item.budget == "BANGKOKBUDGET") { + budget = "ไม่ใช้งบประมาณ"; + } + return { + strategy: item.strategy1, + projectName: item.projectName, + totalDate: item.totalDate != null && item.totalDate != "" ? Extension.ToThaiNumber(item.totalDate.toString()): "-", + goalParticipants: item.goalParticipants != null && item.goalParticipants != "" ? Extension.ToThaiNumber(item.goalParticipants.toString()): "-", + actualParticipants: item.actualParticipants != null && item.actualParticipants != "" ? Extension.ToThaiNumber(item.actualParticipants.toString()): "-", + budget: budget, + acceptBudget: item.acceptBudget != null && item.acceptBudget != "" ? Extension.ToThaiNumber(item.acceptBudget.toString()): "-", + receiveBudget: item.receiveBudget != null && item.receiveBudget != "" ? Extension.ToThaiNumber(item.receiveBudget.toString()): "-", + obstacle: item.obstacle, + root: item.root, + output: "-", + outcome: "-", + position: "-", + indicators: "-", + devResult: "-", + positionActual: "-", + }; + }); + + const resultAllStrategy = await AppDataSource.getRepository(Development) + .createQueryBuilder("development") + .leftJoinAndSelect("development.strategyChild1Actual", "strategy1") + .where("development.status = :status", { status: "FINISH" }) + .andWhere("development.strategyChild1ActualId IS NOT NULL") + .select([ + "development.rootId AS rootId", + "development.strategyChild1ActualId AS strategyId", + "strategy1.strategyChild1Name AS strategyName", + "COUNT(development.id) AS devCount", + "SUM(development.receive) AS receiveBudget", + "development.root AS root", + ]) + .groupBy("development.rootId, development.strategyChild1ActualId, strategy1.strategyChild1Name, development.root") + .orderBy("strategy1.createdAt", "ASC") + .getRawMany(); + + interface Strategy { + strategyId: string; + strategyName: string; + devCount: string; + receiveBudget: string; + sumDev: string; + sumTraget: string; + sumBudget: string; + sumRowDev: string, + sumRowTarget: string, + sumRowBudget: string, + } + + interface GroupedData { + rootId: string; + root: string; + strategy: Strategy[]; + } + + // สมมติว่า 'resultAllStrategy' ถูกกำหนดไว้แล้วและมีข้อมูลที่คุณให้มา + const groupedData: GroupedData[] = resultAllStrategy.reduce((acc: GroupedData[], item) => { + const existingRoot = acc.find(entry => entry.rootId === item.rootId); + + if (existingRoot) { + existingRoot.strategy.push({ + strategyId: item.strategyId, + strategyName: item.strategyName, + devCount: item.devCount?Extension.ToThaiNumber(item.devCount.toString()):"0", + receiveBudget: item.receiveBudget?Extension.ToThaiNumber(item.receiveBudget.toString()):"0", + sumDev: "", + sumTraget: "", + sumBudget: "", + sumRowDev:"", + sumRowTarget:"", + sumRowBudget:"", + }); + } else { + acc.push({ + rootId: item.rootId, + root: item.root, + strategy: [{ + strategyId: item.strategyId, + strategyName: item.strategyName, + devCount: item.devCount?Extension.ToThaiNumber(item.devCount.toString()):"0", + receiveBudget: item.receiveBudget?Extension.ToThaiNumber(item.receiveBudget.toString()):"0", + sumDev: "", + sumTraget: "", + sumBudget: "", + sumRowDev:"", + sumRowTarget:"", + sumRowBudget:"", + }] + }); + } + + return acc; + }, []); + + // ตอนนี้คุณสามารถ map ข้อมูลใน 'groupedData' เพื่อสร้าง 'formattedData' ได้แล้ว + const reformattedData = groupedData.map((group,x) => { + const formattedGroup = { + rowNo: x?Extension.ToThaiNumber((x + 1).toString()):Extension.ToThaiNumber("๑"), + rootId: group.rootId, + root: group.root, + strategy: Array(4).fill(null).map((_, index) => { + const strategy = group.strategy[index] || { + strategyName: "0", + devCount: "0", + target: "0", + receiveBudget: "0", + sumDev: "0", + sumTraget: "0", + sumBudget: "0", + sumRowDev:"0", + sumRowTarget:"0", + sumRowBudget:"0", + }; + + return { + [`strategyName${index + 1}`]: strategy.strategyName ?? "0", + [`devCount${index + 1}`]: strategy.devCount ?? "0", + [`target${index + 1}`]: "0", + [`receiveBudget${index + 1}`]: strategy.receiveBudget ?? "0", + [`sumDev${index + 1}`]: strategy.sumDev ?? "0", + [`sumTraget${index + 1}`]: strategy.sumTraget ?? "0", + [`sumBudget${index + 1}`]: strategy.sumBudget ?? "0", + [`sumRowDev`]: strategy.sumRowDev ?? "0", + [`sumRowTarget`]: strategy.sumRowTarget ?? "0", + [`sumRowBudget`]: strategy.sumRowBudget ?? "0", + }; + }), + }; + + return formattedGroup; + }); + + + // const fmdata = reformattedData.map(rfmData => { + // return { + // rowNo: rfmData.rowNo, + // rootId: rfmData.rootId, + // root: rfmData.root, + // strategy: [ + // { + // strategyName1: rfmData.strategy[0].strategyName1, + // devCount1: rfmData.strategy[0].devCount1, + // target1: rfmData.strategy[0].target1, + // receiveBudget1: rfmData.strategy[0].receiveBudget1 + // }, + // { + // strategyName2: rfmData.strategy[1].strategyName2, + // devCount2: rfmData.strategy[1].devCount2, + // target2: rfmData.strategy[1].target2, + // receiveBudget2: rfmData.strategy[1].receiveBudget2 + // }, + // { + // strategyName3: rfmData.strategy[2].strategyName3, + // devCount3: rfmData.strategy[2].devCount3, + // target3: rfmData.strategy[2].target3, + // receiveBudget3: rfmData.strategy[2].receiveBudget3 + // }, + // { + // strategyName4: rfmData.strategy[3].strategyName4, + // devCount4: rfmData.strategy[3].devCount4, + // target4: rfmData.strategy[3].target4, + // receiveBudget4: rfmData.strategy[3].receiveBudget4 + // } + // ], + // }; + // }); + return new HttpSuccess({ template: "development", reportName: "development", data: { - data: formattedData, + data: mappedDataDev, + resultAllStrategy: reformattedData, }, }); }