diff --git a/src/controllers/ReportController.ts b/src/controllers/ReportController.ts index 3991afc..623f2fa 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -28,7 +28,7 @@ import { AssignDirector } from "../entities/AssignDirector"; import { EvaluateAchievement } from "../entities/EvaluateAchievement"; import { EvaluateCommander } from "../entities/EvaluateCommander"; import CallAPI from "../interfaces/call-api"; -import { Double, In } from "typeorm"; +import { Between, Double, In } from "typeorm"; import Extension from "../interfaces/extension"; import { Appoint } from "../entities/Appoint"; import { AppointDirector } from "../entities/AppointDirector"; @@ -51,6 +51,7 @@ export class ReportController extends Controller { private evaluateCommanderRepository = AppDataSource.getRepository(EvaluateCommander); private appointRepository = AppDataSource.getRepository(Appoint); private AppointDirectorRepository = AppDataSource.getRepository(AppointDirector); + private assignRepository = AppDataSource.getRepository(Assign); private assignOutputRepository = AppDataSource.getRepository(AssignOutput); /** * API สำหรับออกรายงาน @@ -1397,11 +1398,192 @@ export class ReportController extends Controller { @Query("startDate") startDate?: Date, @Query("endDate") endDate?: Date, ) { - return new HttpSuccess({ - template: "placementProbation01", - reportName: "xlsx-report", - data: "", - }); + + interface Result { + [rootId: string]: { + rootName: string; + status1: number; + status2: number; + status3: number; + status4: number; + status5: number; + status6: number; + status7: number; + }; + } + + const rootNode = await new CallAPI() + .PostData(req, "/org/find/node-all",{nodeId: nodeId, node: node}) + .catch((error) => { + console.error("Error calling API:", error); + }); + const rootNodeTrue = rootNode["isRootTrue"]; + const rootNodeFalse = rootNode["isRootFalse"]; + + let whereRootTrue = rootNodeTrue && rootNodeTrue.rootId ? { root: rootNodeTrue.rootId } : {}; + let listsRootTrue = rootNodeTrue && rootNodeTrue.rootId + ? await this.personalRepository.find({ + where: { + ...whereRootTrue, + createdAt: startDate && endDate ? Between(new Date(startDate), new Date(endDate)) : undefined, + }, + }) + : []; + + let rootIds = rootNodeFalse.map((node: any) => node.rootId); + let listsRootFalse = rootIds && rootIds.length + ? await this.personalRepository.find({ + where: { + root: In(rootIds), + createdAt: startDate && endDate ? Between(new Date(startDate), new Date(endDate)) : undefined, + }, + }) + : []; + + let resultTrue: Result = {}; + let resultFalse: Result = {}; + + listsRootTrue.forEach(item => { + let rootId = item.root; + let status = item.probation_status; + let rootName = item.orgRootName; + + if (!resultTrue[rootId]) { + resultTrue[rootId] = { + "rootName": rootName, + "status1": 0, + "status2": 0, + "status3": 0, + "status4": 0, + "status5": 0, + "status6": 0, + "status7": 0 + }; + } + + if (status >= 1 && status <= 7) { + (resultTrue[rootId] as { [key: string]: any })[`status${status}`]++; + } + }); + listsRootFalse.forEach(item => { + let rootId = item.root; + let status = item.probation_status; + let rootName = item.orgRootName; + + if (!resultFalse[rootId]) { + resultFalse[rootId] = { + "rootName": rootName, + "status1": 0, + "status2": 0, + "status3": 0, + "status4": 0, + "status5": 0, + "status6": 0, + "status7": 0 + }; + } + + if (status >= 1 && status <= 7) { + (resultFalse[rootId] as { [key: string]: any })[`status${status}`]++; + } + }); + const resultTruePass = Object.values(resultTrue).reduce((sum, { status2 }) => sum + status2, 0); + const resultTrueExtand = Object.values(resultTrue).reduce((sum, { status7 }) => sum + status7, 0); + const resultTrueSuspension = "-"; + const resultTrueChangePos = Object.values(resultTrue).reduce((sum, { status4 }) => sum + status4, 0); + const resultTrueResign = Object.values(resultTrue).reduce((sum, { status5 }) => sum + status5, 0); + const resultTrueDeceased = Object.values(resultTrue).reduce((sum, { status6 }) => sum + status6, 0); + const resultTrueNotPass = Object.values(resultTrue).reduce((sum, { status3 }) => sum + status3, 0); + const resultFalsePass = Object.values(resultFalse).reduce((sum, { status2 }) => sum + status2, 0); + const resultFalseExtand = Object.values(resultFalse).reduce((sum, { status7 }) => sum + status7, 0); + const resultFalseSuspension = "-"; + const resultFalseChangePos = Object.values(resultFalse).reduce((sum, { status4 }) => sum + status4, 0); + const resultFalseResign = Object.values(resultFalse).reduce((sum, { status5 }) => sum + status5, 0); + const resultFalseDeceased = Object.values(resultFalse).reduce((sum, { status6 }) => sum + status6, 0); + const resultFalseNotPass = Object.values(resultFalse).reduce((sum, { status3 }) => sum + status3, 0); + const sumPass = Object.values(resultTrue).reduce((sum, { status2 }) => sum + status2, 0) + Object.values(resultFalse).reduce((sum, { status2 }) => sum + status2, 0); + const sumExtand = Object.values(resultTrue).reduce((sum, { status7 }) => sum + status7, 0) + Object.values(resultFalse).reduce((sum, { status7 }) => sum + status7, 0); + const sumSuspension = "-"; + const sumChangePos = Object.values(resultTrue).reduce((sum, { status4 }) => sum + status4, 0) + Object.values(resultFalse).reduce((sum, { status4 }) => sum + status4, 0); + const sumResign = Object.values(resultTrue).reduce((sum, { status5 }) => sum + status5, 0) + Object.values(resultFalse).reduce((sum, { status5 }) => sum + status5, 0); + const sumDeceased = Object.values(resultTrue).reduce((sum, { status6 }) => sum + status6, 0) + Object.values(resultFalse).reduce((sum, { status6 }) => sum + status6, 0); + const sumNotPass = Object.values(resultTrue).reduce((sum, { status3 }) => sum + status3, 0) + Object.values(resultFalse).reduce((sum, { status3 }) => sum + status3, 0); + const sumResultTrue = Object.values(resultTrue).reduce((total, { status2, status7, status4, status5, status6, status3 }) => { + return total + status2 + status7 + status4 + status5 + status6 + status3; + }, 0); + const sumResultFalse = Object.values(resultFalse).reduce((total, { status2, status7, status4, status5, status6, status3 }) => { + return total + status2 + status7 + status4 + status5 + status6 + status3; + }, 0); + const sumAll = sumPass + sumExtand + sumChangePos + sumResign + sumDeceased + sumNotPass; + const nowDate = Extension.ToThaiNumber(Extension.ToThaiShortDate(new Date())); + const formattedData = { + topic: "หน่วยงานระดับสำนักหรือเทียบเท่า", + dateNow: nowDate, + dateStart: startDate?Extension.ToThaiNumber(Extension.ToThaiNoprefixDate(startDate)):"", + dateEnd: endDate?Extension.ToThaiNumber(Extension.ToThaiNoprefixDate(endDate)):"", + resultTrueProbation: Object.keys(resultTrue).map((rootId,index) => { + const { status2, status7, status4, status5, status6, status3, rootName } = resultTrue[rootId]; + const sum = status2 + status7 + status4 + status5 + status6 + status3; + return { + rowNo:(index + 1).toString(), + rootName:rootName.toString(), + pass:status2.toString(), + extand:status7.toString(), + suspension: "-", + changePos:status4.toString(), + resign:status5.toString(), + deceased:status6.toString(), + notPass:status3.toString(), + total:sum.toString() + }; + }), + resultTruePass:resultTruePass.toString(), + resultTrueExtand:resultTrueExtand.toString(), + resultTrueSuspension: "-", + resultTrueChangePos:resultTrueChangePos.toString(), + resultTrueResign:resultTrueResign.toString(), + resultTrueDeceased:resultTrueDeceased.toString(), + resultTrueNotPass:resultTrueNotPass.toString(), + topic2: "หน่วยงานระดับสำนักงานเขต", + resultFalseProbation: Object.keys(resultFalse).map((rootId,index) => { + const { status2, status7, status4, status5, status6, status3, rootName } = resultFalse[rootId]; + const sum = status2 + status7 + status4 + status5 + status6 + status3; + return { + rowNo:(index + 1).toString(), + rootName:rootName.toString(), + pass:status2.toString(), + extand:status7.toString(), + suspension: "-", + changePos:status4.toString(), + resign:status5.toString(), + deceased:status6.toString(), + notPass:status3.toString(), + total:sum.toString() + }; + }), + resultFalsePass:resultFalsePass.toString(), + resultFalseExtand:resultFalseExtand.toString(), + resultFalseSuspension: "-", + resultFalseChangePos:resultFalseChangePos.toString(), + resultFalseResign:resultFalseResign.toString(), + resultFalseDeceased:resultFalseDeceased.toString(), + resultFalseNotPass:resultFalseNotPass.toString(), + sumPass:sumPass.toString(), + sumExtand:sumExtand.toString(), + sumSuspension:"-", + sumChangePos:sumChangePos.toString(), + sumResign:sumResign.toString(), + sumDeceased:sumDeceased.toString(), + sumNotPass:sumNotPass.toString(), + sumResultTrue:sumResultTrue.toString(), + sumResultFalse:sumResultFalse.toString(), + sumAll:sumAll.toString() + }; + return new HttpSuccess({ + template: "placementProbation01", + reportName: "xlsx-report", + data: formattedData, + }); } @Get("report2") @@ -1427,10 +1609,191 @@ export class ReportController extends Controller { @Query("startDate") startDate?: Date, @Query("endDate") endDate?: Date, ) { + interface Result { + [rootId: string]: { + rootName: string; + status1: number; + status2: number; + status3: number; + status4: number; + status5: number; + status6: number; + status7: number; + }; + } + + const rootNode = await new CallAPI() + .PostData(req, "/org/find/node-all",{nodeId: nodeId, node: node}) + .catch((error) => { + console.error("Error calling API:", error); + }); + const rootNodeTrue = rootNode["isRootTrue"]; + const rootNodeFalse = rootNode["isRootFalse"]; + + let whereRootTrue = rootNodeTrue && rootNodeTrue.rootId ? { root: rootNodeTrue.rootId } : {}; + let listsRootTrue = rootNodeTrue && rootNodeTrue.rootId + ? await this.personalRepository.find({ + where: { + ...whereRootTrue, + createdAt: startDate && endDate ? Between(new Date(startDate), new Date(endDate)) : undefined, + }, + }) + : []; + + let rootIds = rootNodeFalse.map((node: any) => node.rootId); + let listsRootFalse = rootIds && rootIds.length + ? await this.personalRepository.find({ + where: { + root: In(rootIds), + createdAt: startDate && endDate ? Between(new Date(startDate), new Date(endDate)) : undefined, + }, + }) + : []; + + let resultTrue: Result = {}; + let resultFalse: Result = {}; + + listsRootTrue.forEach(item => { + let rootId = item.root; + let status = item.probation_status; + let rootName = item.orgRootName; + + if (!resultTrue[rootId]) { + resultTrue[rootId] = { + "rootName": rootName, + "status1": 0, + "status2": 0, + "status3": 0, + "status4": 0, + "status5": 0, + "status6": 0, + "status7": 0 + }; + } + + if (status >= 1 && status <= 7) { + (resultTrue[rootId] as { [key: string]: any })[`status${status}`]++; + } + }); + listsRootFalse.forEach(item => { + let rootId = item.root; + let status = item.probation_status; + let rootName = item.orgRootName; + + if (!resultFalse[rootId]) { + resultFalse[rootId] = { + "rootName": rootName, + "status1": 0, + "status2": 0, + "status3": 0, + "status4": 0, + "status5": 0, + "status6": 0, + "status7": 0 + }; + } + + if (status >= 1 && status <= 7) { + (resultFalse[rootId] as { [key: string]: any })[`status${status}`]++; + } + }); + const resultTruePass = Object.values(resultTrue).reduce((sum, { status2 }) => sum + status2, 0); + const resultTrueExtand = Object.values(resultTrue).reduce((sum, { status7 }) => sum + status7, 0); + const resultTrueSuspension = "-"; + const resultTrueChangePos = Object.values(resultTrue).reduce((sum, { status4 }) => sum + status4, 0); + const resultTrueResign = Object.values(resultTrue).reduce((sum, { status5 }) => sum + status5, 0); + const resultTrueDeceased = Object.values(resultTrue).reduce((sum, { status6 }) => sum + status6, 0); + const resultTrueNotPass = Object.values(resultTrue).reduce((sum, { status3 }) => sum + status3, 0); + const resultFalsePass = Object.values(resultFalse).reduce((sum, { status2 }) => sum + status2, 0); + const resultFalseExtand = Object.values(resultFalse).reduce((sum, { status7 }) => sum + status7, 0); + const resultFalseSuspension = "-"; + const resultFalseChangePos = Object.values(resultFalse).reduce((sum, { status4 }) => sum + status4, 0); + const resultFalseResign = Object.values(resultFalse).reduce((sum, { status5 }) => sum + status5, 0); + const resultFalseDeceased = Object.values(resultFalse).reduce((sum, { status6 }) => sum + status6, 0); + const resultFalseNotPass = Object.values(resultFalse).reduce((sum, { status3 }) => sum + status3, 0); + const sumPass = Object.values(resultTrue).reduce((sum, { status2 }) => sum + status2, 0) + Object.values(resultFalse).reduce((sum, { status2 }) => sum + status2, 0); + const sumExtand = Object.values(resultTrue).reduce((sum, { status7 }) => sum + status7, 0) + Object.values(resultFalse).reduce((sum, { status7 }) => sum + status7, 0); + const sumSuspension = "-"; + const sumChangePos = Object.values(resultTrue).reduce((sum, { status4 }) => sum + status4, 0) + Object.values(resultFalse).reduce((sum, { status4 }) => sum + status4, 0); + const sumResign = Object.values(resultTrue).reduce((sum, { status5 }) => sum + status5, 0) + Object.values(resultFalse).reduce((sum, { status5 }) => sum + status5, 0); + const sumDeceased = Object.values(resultTrue).reduce((sum, { status6 }) => sum + status6, 0) + Object.values(resultFalse).reduce((sum, { status6 }) => sum + status6, 0); + const sumNotPass = Object.values(resultTrue).reduce((sum, { status3 }) => sum + status3, 0) + Object.values(resultFalse).reduce((sum, { status3 }) => sum + status3, 0); + const sumResultTrue = Object.values(resultTrue).reduce((total, { status2, status7, status4, status5, status6, status3 }) => { + return total + status2 + status7 + status4 + status5 + status6 + status3; + }, 0); + const sumResultFalse = Object.values(resultFalse).reduce((total, { status2, status7, status4, status5, status6, status3 }) => { + return total + status2 + status7 + status4 + status5 + status6 + status3; + }, 0); + const sumAll = sumPass + sumExtand + sumChangePos + sumResign + sumDeceased + sumNotPass; + const nowDate = Extension.ToThaiNumber(Extension.ToThaiShortDate(new Date())); + const formattedData = { + topic: "หน่วยงานระดับสำนักหรือเทียบเท่า", + dateNow: nowDate, + accExam: "", + dateStart: startDate?Extension.ToThaiNumber(Extension.ToThaiNoprefixDate(startDate)):"", + dateEnd: endDate?Extension.ToThaiNumber(Extension.ToThaiNoprefixDate(endDate)):"", + resultTrueProbation: Object.keys(resultTrue).map((rootId,index) => { + const { status2, status7, status4, status5, status6, status3, rootName } = resultTrue[rootId]; + const sum = status2 + status7 + status4 + status5 + status6 + status3; + return { + rowNo:(index + 1).toString(), + rootName:rootName.toString(), + pass:status2.toString(), + extand:status7.toString(), + suspension: "-", + changePos:status4.toString(), + resign:status5.toString(), + deceased:status6.toString(), + notPass:status3.toString(), + total:sum.toString() + }; + }), + resultTruePass:resultTruePass.toString(), + resultTrueExtand:resultTrueExtand.toString(), + resultTrueSuspension: "-", + resultTrueChangePos:resultTrueChangePos.toString(), + resultTrueResign:resultTrueResign.toString(), + resultTrueDeceased:resultTrueDeceased.toString(), + resultTrueNotPass:resultTrueNotPass.toString(), + topic2: "หน่วยงานระดับสำนักงานเขต", + resultFalseProbation: Object.keys(resultFalse).map((rootId,index) => { + const { status2, status7, status4, status5, status6, status3, rootName } = resultFalse[rootId]; + const sum = status2 + status7 + status4 + status5 + status6 + status3; + return { + rowNo:(index + 1).toString(), + rootName:rootName.toString(), + pass:status2.toString(), + extand:status7.toString(), + suspension: "-", + changePos:status4.toString(), + resign:status5.toString(), + deceased:status6.toString(), + notPass:status3.toString(), + total:sum.toString() + }; + }), + resultFalsePass:resultFalsePass.toString(), + resultFalseExtand:resultFalseExtand.toString(), + resultFalseSuspension: "-", + resultFalseChangePos:resultFalseChangePos.toString(), + resultFalseResign:resultFalseResign.toString(), + resultFalseDeceased:resultFalseDeceased.toString(), + resultFalseNotPass:resultFalseNotPass.toString(), + sumPass:sumPass.toString(), + sumExtand:sumExtand.toString(), + sumSuspension:"-", + sumChangePos:sumChangePos.toString(), + sumResign:sumResign.toString(), + sumDeceased:sumDeceased.toString(), + sumNotPass:sumNotPass.toString(), + sumResultTrue:sumResultTrue.toString(), + sumResultFalse:sumResultFalse.toString(), + sumAll:sumAll.toString() + }; return new HttpSuccess({ template: "placementProbation03", reportName: "xlsx-report", - data: "", + data: formattedData, }); } } diff --git a/src/interfaces/extension.ts b/src/interfaces/extension.ts index 5de8bd4..b7f804c 100644 --- a/src/interfaces/extension.ts +++ b/src/interfaces/extension.ts @@ -29,6 +29,36 @@ class Extension { return ""; } } + public static ToThaiShortMonth(value: number) { + switch (value) { + case 1: + return "ม.ค."; + case 2: + return "ก.พ."; + case 3: + return "มี.ค."; + case 4: + return "เม.ย."; + case 5: + return "พ.ค."; + case 6: + return "มิ.ย."; + case 7: + return "ก.ค."; + case 8: + return "ส.ค."; + case 9: + return "ก.ย."; + case 10: + return "ต.ค."; + case 11: + return "พ.ย."; + case 12: + return "ธ.ค."; + default: + return ""; + } + } public static ToThaiYear(value: number) { if (value < 2400) return value + 543; @@ -67,6 +97,30 @@ class Extension { ); } + public static ToThaiShortDate(value: Date) { + let yy = value.getFullYear() < 2400 ? value.getFullYear() + 543 : value.getFullYear(); + return ( + "วันที่ " + + value.getDate() + + " " + + Extension.ToThaiShortMonth(value.getMonth() + 1) + + " " + + yy.toString().slice(-2) + ); + } + + public static ToThaiNoprefixDate(value: Date) { + let yy = value.getFullYear() < 2400 ? value.getFullYear() + 543 : value.getFullYear(); + return ( + "วันที่ " + + value.getDate() + + " " + + Extension.ToThaiMonth(value.getMonth() + 1) + + " " + + yy.toString().slice(-2) + ); + } + public static ToThaiFullDate2(value: Date) { let yy = value.getFullYear() < 2400 ? value.getFullYear() + 543 : value.getFullYear(); return value.getDate() + " " + Extension.ToThaiMonth(value.getMonth() + 1) + " " + yy;