hrms-api-development/src/controllers/ReportController.ts

986 lines
46 KiB
TypeScript
Raw Normal View History

2025-02-13 10:28:05 +07:00
import { Controller, Get, Post, Route, Security, Tags, Body, Path, Query } from "tsoa";
2024-04-09 11:38:13 +07:00
import { AppDataSource } from "../database/data-source";
import HttpSuccess from "../interfaces/http-success";
import HttpError from "../interfaces/http-error";
import HttpStatusCode from "../interfaces/http-status";
import { Development } from "../entities/Development";
2024-09-03 15:18:30 +07:00
import { DevelopmentHistory } from "../entities/DevelopmentHistory";
2024-04-09 11:38:13 +07:00
import { PosType } from "../entities/PosType";
import { PosLevel } from "../entities/PosLevel";
import Extension from "../interfaces/extension";
import { DevelopmentScholarship } from "../entities/DevelopmentScholarship";
2025-02-13 18:43:36 +07:00
import { In, IsNull, Not } from "typeorm";
2025-02-13 18:08:39 +07:00
import { viewDevScholarship } from "../entities/view/viewDevScholarship";
2025-02-13 20:02:25 +07:00
import { isNotEmittedStatement } from "typescript";
2024-04-09 11:38:13 +07:00
@Route("api/v1/development/report")
@Tags("Report")
@Security("bearerAuth")
export class ReportController extends Controller {
private developmentScholarshipRepository = AppDataSource.getRepository(DevelopmentScholarship);
2025-02-13 18:08:39 +07:00
private viewDevScholarship = AppDataSource.getRepository(viewDevScholarship);
2024-04-09 11:38:13 +07:00
/**
* API Report /
*
* @summary DEV_0xx - Report / #xx
*
* @param {string} type type report
*/
2024-07-17 13:19:20 +07:00
@Get("main")
2025-02-13 18:07:32 +07:00
async GetReportDevelopemtMain(
@Query("year") year?: number,
@Query("rootId") rootId?: string,
) {
2025-01-17 20:02:52 +07:00
2024-07-17 12:47:36 +07:00
// const _type = type.trim().toUpperCase();
2024-04-09 11:38:13 +07:00
const formattedData = {
2024-07-17 12:47:36 +07:00
org: "_type",
2024-04-09 11:38:13 +07:00
};
2025-01-17 20:02:52 +07:00
//ตารางรายละเอียด กับ แบบรายงาน
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,
2025-01-21 11:00:27 +07:00
totalDate: item.totalDate != null && item.totalDate != "" ? Extension.ToThaiNumber(item.totalDate.toLocaleString()): "-",
goalParticipants: item.goalParticipants != null && item.goalParticipants != "" ? Extension.ToThaiNumber(item.goalParticipants.toLocaleString()): "-",
actualParticipants: item.actualParticipants != null && item.actualParticipants != "" ? Extension.ToThaiNumber(item.actualParticipants.toLocaleString()): "-",
2025-01-17 20:02:52 +07:00
budget: budget,
2025-01-21 11:00:27 +07:00
acceptBudget: item.acceptBudget != null && item.acceptBudget != "" ? Extension.ToThaiNumber(item.acceptBudget.toLocaleString()): "-",
receiveBudget: item.receiveBudget != null && item.receiveBudget != "" ? Extension.ToThaiNumber(item.receiveBudget.toLocaleString()): "-",
2025-01-17 20:02:52 +07:00
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[];
}
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,
2025-01-20 18:20:09 +07:00
devCount: item.devCount?item.devCount:"-",
receiveBudget: item.receiveBudget?item.receiveBudget:"-",
2025-01-17 20:02:52 +07:00
sumDev: "",
sumTraget: "",
sumBudget: "",
sumRowDev:"",
sumRowTarget:"",
sumRowBudget:"",
});
} else {
acc.push({
rootId: item.rootId,
root: item.root,
strategy: [{
strategyId: item.strategyId,
strategyName: item.strategyName,
2025-01-20 18:20:09 +07:00
devCount: item.devCount?item.devCount:"-",
receiveBudget: item.receiveBudget?item.receiveBudget:"-",
2025-01-17 20:02:52 +07:00
sumDev: "",
sumTraget: "",
sumBudget: "",
sumRowDev:"",
sumRowTarget:"",
sumRowBudget:"",
}]
});
}
return acc;
}, []);
2025-01-21 11:00:27 +07:00
let sumDev1 = 0;
let sumTraget1 = 0;
let sumBudget1 = 0;
let sumDev2 = 0;
let sumTraget2 = 0;
let sumBudget2 = 0;
let sumDev3 = 0;
let sumTraget3 = 0;
let sumBudget3 = 0;
let sumDev4 = 0;
let sumTraget4 = 0;
let sumBudget4 = 0;
2025-01-17 20:02:52 +07:00
const reformattedData = groupedData.map((group,x) => {
2025-01-20 18:20:09 +07:00
const sumRowDev = (group.strategy[0] && group.strategy[0].devCount !== "-" ? Number(group.strategy[0].devCount) : 0) +
(group.strategy[1] && group.strategy[1].devCount !== "-" ? Number(group.strategy[1].devCount) : 0) +
(group.strategy[2] && group.strategy[2].devCount !== "-" ? Number(group.strategy[2].devCount) : 0);
(group.strategy[3] && group.strategy[3].devCount !== "-" ? Number(group.strategy[3].devCount) : 0);
const sumRowBudget = (group.strategy[0] && group.strategy[0].receiveBudget !== "-" ? Number(group.strategy[0].receiveBudget) : 0) +
(group.strategy[1] && group.strategy[1].receiveBudget !== "-" ? Number(group.strategy[1].receiveBudget) : 0) +
(group.strategy[2] && group.strategy[2].receiveBudget !== "-" ? Number(group.strategy[2].receiveBudget) : 0);
(group.strategy[3] && group.strategy[3].receiveBudget !== "-" ? Number(group.strategy[3].receiveBudget) : 0);
2025-01-21 11:00:27 +07:00
sumDev1 = groupedData.reduce((sum, group) => {
const devCount = group.strategy[0] && group.strategy[0].devCount !== "-" ? Number(group.strategy[0].devCount) : 0;
return sum + devCount;
}, 0);
sumBudget1 = groupedData.reduce((sum, group) => {
const devCount = group.strategy[0] && group.strategy[0].receiveBudget !== "-" ? Number(group.strategy[0].receiveBudget) : 0;
return sum + devCount;
}, 0);
sumDev2 = groupedData.reduce((sum, group) => {
const devCount = group.strategy[1] && group.strategy[1].devCount !== "-" ? Number(group.strategy[1].devCount) : 0;
return sum + devCount;
}, 0);
sumBudget2 = groupedData.reduce((sum, group) => {
const devCount = group.strategy[1] && group.strategy[1].receiveBudget !== "-" ? Number(group.strategy[1].receiveBudget) : 0;
return sum + devCount;
}, 0);
sumDev3 = groupedData.reduce((sum, group) => {
const devCount = group.strategy[2] && group.strategy[2].devCount !== "-" ? Number(group.strategy[2].devCount) : 0;
return sum + devCount;
}, 0);
sumBudget3 = groupedData.reduce((sum, group) => {
const devCount = group.strategy[2] && group.strategy[2].receiveBudget !== "-" ? Number(group.strategy[2].receiveBudget) : 0;
return sum + devCount;
}, 0);
sumDev4 = groupedData.reduce((sum, group) => {
const devCount = group.strategy[3] && group.strategy[3].devCount !== "-" ? Number(group.strategy[3].devCount) : 0;
return sum + devCount;
}, 0);
sumBudget4 = groupedData.reduce((sum, group) => {
const devCount = group.strategy[3] && group.strategy[3].receiveBudget !== "-" ? Number(group.strategy[3].receiveBudget) : 0;
return sum + devCount;
}, 0);
2025-01-17 20:02:52 +07:00
const formattedGroup = {
rowNo: x?Extension.ToThaiNumber((x + 1).toString()):Extension.ToThaiNumber("๑"),
rootId: group.rootId,
root: group.root,
2025-01-20 18:20:09 +07:00
strategyName1: group.strategy[0]&&group.strategy[0].strategyName?group.strategy[0].strategyName:"-",
2025-01-21 11:00:27 +07:00
devCount1: group.strategy[0]&&group.strategy[0].devCount?Extension.ToThaiNumber(group.strategy[0].devCount.toLocaleString()):"-",
2025-01-20 18:20:09 +07:00
target1: "-",
2025-01-21 11:00:27 +07:00
receiveBudget1: group.strategy[0]&&group.strategy[0].receiveBudget?Extension.ToThaiNumber(group.strategy[0].receiveBudget.toLocaleString()):"-",
2025-01-20 18:20:09 +07:00
strategyName2: group.strategy[1]&&group.strategy[1].strategyName?group.strategy[1].strategyName:"-",
2025-01-21 11:00:27 +07:00
devCount2: group.strategy[1]&&group.strategy[1].devCount?Extension.ToThaiNumber(group.strategy[1].devCount.toLocaleString()):"-",
2025-01-20 18:20:09 +07:00
target2: "-",
2025-01-21 11:00:27 +07:00
receiveBudget2: group.strategy[1]&&group.strategy[1].receiveBudget?Extension.ToThaiNumber(group.strategy[1].receiveBudget.toLocaleString()):"-",
2025-01-20 18:20:09 +07:00
strategyName3: group.strategy[2]&&group.strategy[2].strategyName?group.strategy[2].strategyName:"-",
2025-01-21 11:00:27 +07:00
devCount3: group.strategy[2]&&group.strategy[2].devCount?Extension.ToThaiNumber(group.strategy[2].devCount.toLocaleString()):"-",
2025-01-20 18:20:09 +07:00
target3: "-",
2025-01-21 11:00:27 +07:00
receiveBudget3: group.strategy[2]&&group.strategy[2].receiveBudget?Extension.ToThaiNumber(group.strategy[2].receiveBudget.toLocaleString()):"-",
2025-01-20 18:20:09 +07:00
2025-01-17 20:02:52 +07:00
2025-01-20 18:20:09 +07:00
strategyName4: group.strategy[3]&&group.strategy[3].strategyName?group.strategy[3].strategyName:"-",
2025-01-21 11:00:27 +07:00
devCount4: group.strategy[3]&&group.strategy[3].devCount?Extension.ToThaiNumber(group.strategy[3].devCount.toLocaleString()):"-",
2025-01-20 18:20:09 +07:00
target4: "-",
2025-01-21 11:00:27 +07:00
receiveBudget4: group.strategy[3]&&group.strategy[3].receiveBudget?Extension.ToThaiNumber(group.strategy[3].receiveBudget.toLocaleString()):"-",
2025-01-20 18:20:09 +07:00
2025-01-21 11:00:27 +07:00
sumRowDev: sumRowDev?Extension.ToThaiNumber(sumRowDev.toLocaleString()):"-",
2025-01-20 18:20:09 +07:00
sumRowTarget: "-",
2025-01-21 11:00:27 +07:00
sumRowBudget: sumRowBudget?Extension.ToThaiNumber(sumRowBudget.toLocaleString()):"-",
2025-01-20 18:20:09 +07:00
// strategy: Array(4).fill(null).map((_, index) => {
// const strategy = group.strategy[index] || {
// strategyName: "",
// devCount: "",
// target: "",
// receiveBudget: "",
// sumDev: "",
// sumTraget: "",
// sumBudget: "",
// sumRowDev: "",
// sumRowTarget: "",
// sumRowBudget: "",
// };
// return {
// [`strategyName${index + 1}`]: strategy.strategyName ?? "",
// [`devCount${index + 1}`]: strategy.devCount ?? "",
// [`target${index + 1}`]: "",
// [`receiveBudget${index + 1}`]: strategy.receiveBudget ?? "",
// [`sumDev${index + 1}`]: strategy.sumDev ?? "",
// [`sumTraget${index + 1}`]: strategy.sumTraget ?? "",
// [`sumBudget${index + 1}`]: strategy.sumBudget ?? "",
// [`sumRowDev`]: strategy.sumRowDev ?? "",
// [`sumRowTarget`]: strategy.sumRowTarget ?? "",
// [`sumRowBudget`]: strategy.sumRowBudget ?? "",
// };
// }),
2025-01-17 20:02:52 +07:00
};
return formattedGroup;
});
2024-04-09 11:38:13 +07:00
return new HttpSuccess({
template: "development",
reportName: "development",
data: {
2025-01-17 20:02:52 +07:00
data: mappedDataDev,
resultAllStrategy: reformattedData,
2025-01-21 11:00:27 +07:00
sumDev1: Extension.ToThaiNumber(sumDev1.toLocaleString())??"-",
sumTraget1: Extension.ToThaiNumber(sumTraget1.toLocaleString())??"-",
sumBudget1: Extension.ToThaiNumber(sumBudget1.toLocaleString())??"-",
sumDev2: Extension.ToThaiNumber(sumDev2.toLocaleString())??"-",
sumTraget2: Extension.ToThaiNumber(sumTraget2.toLocaleString())??"-",
sumBudget2: Extension.ToThaiNumber(sumBudget2.toLocaleString())??"-",
sumDev3: Extension.ToThaiNumber(sumDev3.toLocaleString())??"-",
sumTraget3: Extension.ToThaiNumber(sumTraget3.toLocaleString())??"-",
sumBudget3: Extension.ToThaiNumber(sumBudget3.toLocaleString())??"-",
sumDev4: Extension.ToThaiNumber(sumDev4.toLocaleString())??"-",
sumTraget4: Extension.ToThaiNumber(sumTraget4.toLocaleString())??"-",
sumBudget4: Extension.ToThaiNumber(sumBudget4.toLocaleString())??"-",
sumAllDev: Extension.ToThaiNumber((sumDev1 + sumDev2 + sumDev3 + sumDev4).toLocaleString())??"-",
sumTraget: Extension.ToThaiNumber((sumTraget1 +sumTraget2 +sumTraget3 +sumTraget4).toLocaleString())??"-",
sumAllBudget: Extension.ToThaiNumber((sumBudget1 + sumBudget2 + sumBudget3 + sumBudget4).toLocaleString())??"-",
2024-04-09 11:38:13 +07:00
},
});
}
/**
* API Report /
*
* @summary DEV_0xx - Report / #xx
*
*/
@Post("history-officer")
async PostReportDevelopemtHistoryOfficer(
@Body()
body: {
year: number;
root: string;
},
) {
const development = await AppDataSource.getRepository(DevelopmentHistory)
.createQueryBuilder("developmentHistory")
.leftJoinAndSelect("developmentHistory.posLevel", "posLevel")
.leftJoinAndSelect("developmentHistory.posType", "posType")
.leftJoinAndSelect("developmentHistory.development", "development")
.andWhere(body.year != 0 && body.year != null ? "development.year = :year" : "1=1", {
year: body.year,
})
.andWhere(body.root != null ? "development.root = :root" : "1=1", {
root: body.root,
})
.andWhere("developmentHistory.type = :type", { type: "OFFICER" })
.select([
"developmentHistory.citizenId",
"developmentHistory.rank",
"developmentHistory.position",
"developmentHistory.posExecutive",
"developmentHistory.developmentId",
"developmentHistory.prefix",
"developmentHistory.firstName",
"developmentHistory.lastName",
"posLevel.posLevelName",
"posType.posTypeName",
"development.projectName",
"development.root",
])
.getMany();
const formattedData = development.map((item) => ({
id: item.id,
citizenId: Extension.ToThaiNumber(item.citizenId.toString()),
fullName: item.prefix + item.firstName + " " + item.lastName,
position: item.position,
posType: item.posType ? item.posType.posTypeName : null,
posLevel: item.posLevel ? item.posLevel.posLevelName : null,
posExecutive: item.posExecutive,
projectName: item.development ? item.development.projectName : null,
root: item.root,
}));
2024-04-09 11:38:13 +07:00
return new HttpSuccess({
template: "developmentHistoryOfficer",
reportName: "developmentHistoryOfficer",
2024-04-09 11:38:13 +07:00
data: {
data: formattedData,
},
});
}
/**
* API Report /
*
* @summary DEV_0xx - Report / #xx
*
* @param {number} year year report
2024-04-09 11:38:13 +07:00
*/
@Post("history-employee")
async PostReportDevelopemtHistoryEmployee(
@Body()
body: {
year: number;
root: string;
},
) {
const development = await AppDataSource.getRepository(DevelopmentHistory)
.createQueryBuilder("developmentHistory")
.leftJoinAndSelect("developmentHistory.employeePosLevel", "employeePosLevel")
.leftJoinAndSelect("developmentHistory.employeePosType", "employeePosType")
.leftJoinAndSelect("developmentHistory.development", "development")
.andWhere(body.year != 0 && body.year != null ? "development.year = :year" : "1=1", {
year: body.year,
})
.andWhere(body.root != null ? "development.root = :root" : "1=1", {
root: body.root,
})
.andWhere("developmentHistory.type = :type", { type: "EMPLOYEE" })
.select([
"developmentHistory.citizenId",
"developmentHistory.position",
"developmentHistory.developmentId",
"developmentHistory.prefix",
"developmentHistory.firstName",
"developmentHistory.lastName",
"employeePosLevel.posLevelName",
"employeePosType.posTypeName",
"employeePosType.posTypeShortName",
"development.projectName",
"development.root",
])
.getMany();
const formattedData = development.map((item) => ({
id: item.id,
citizenId: Extension.ToThaiNumber(item.citizenId.toString()),
fullName: item.prefix + item.firstName + " " + item.lastName,
position: item.position,
employeePosType: item.employeePosType ? item.employeePosType.posTypeName : null,
employeePosLevel:
item.employeePosType.posTypeShortName +
" " +
Extension.ToThaiNumber(item.employeePosLevel.posLevelName.toString()),
projectName: item.development ? item.development.projectName : null,
root: item.root,
}));
2024-04-09 11:38:13 +07:00
return new HttpSuccess({
template: "developmentHistoryEmployee",
reportName: "developmentHistoryEmployee",
2024-04-09 11:38:13 +07:00
data: {
data: formattedData,
},
});
}
/**
* API Report /
*
* @summary DEV_0xx - Report / #xx
*
*/
@Get("scholarship")
async GetReportDevelopemtScholarship() {
const formattedData = {
org: "_type",
};
return new HttpSuccess({
template: "development",
reportName: "development",
data: {
data: formattedData,
},
});
}
/**
* API Report / detail
*
* @summary DEV_0xx - Report / detail #xx
*
* @param {string} id Id scholarship
*/
@Get("scholarship/{id}")
async GetReportDevelopemtScholarshipDetail(@Path() id: string) {
const getDevelopment = await this.developmentScholarshipRepository.findOne({
where: { id: id },
});
if (!getDevelopment) {
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลทุนการศึกษา/ฝึกอบรมนี้");
}
if (getDevelopment.scholarshipType != null) {
switch (getDevelopment.scholarshipType.trim().toUpperCase()) {
case "DOMESTICE":
getDevelopment.scholarshipType = "การศึกษาในประเทศ";
break;
case "NOABROAD":
getDevelopment.scholarshipType =
"ฝึกอบรมในประเทศที่ส่งไปพัฒนากับหน่วยวงานภายนอก (หลักสูตรที่ไม่มีการไปต่างประเทศ)";
break;
case "ABROAD":
getDevelopment.scholarshipType =
"ฝึกอบรมในประเทศที่ส่งไปพัฒนากับหน่วยวงานภายนอก (หลักสูตรที่มีการไปต่างประเทศ)";
break;
case "EXECUTIVE":
getDevelopment.scholarshipType =
"ฝึกอบรมในประเทศที่ส่งไปพัฒนากับหน่วยวงานภายนอก (หลักสูตรประเภทนักบริหาร)";
break;
2025-01-21 09:22:42 +07:00
case "RESEARCH":
getDevelopment.scholarshipType =
"ศึกษา ฝึกอบรม ประชุม ดูงาน และปฏิบัติการวิจัย ณ ต่างประเทศ";
break;
default:
break;
}
}
const formattedData = {
id: getDevelopment.id,
firstName: getDevelopment.firstName,
lastName: getDevelopment.lastName,
position: getDevelopment.position,
2024-04-19 09:28:57 +07:00
org: getDevelopment.org,
degreeLevel: getDevelopment.degreeLevel,
course: getDevelopment.course,
field: getDevelopment.field,
studyPlace: getDevelopment.studyPlace,
scholarshipType: getDevelopment.scholarshipType,
2024-04-19 09:28:57 +07:00
bookNoDate:
getDevelopment.bookNoDate == null
? ""
2024-07-17 13:58:37 +07:00
: Extension.ToThaiNumber(Extension.ToThaiFullDate3(getDevelopment.bookNoDate)),
startDate:
getDevelopment.startDate == null
? ""
2024-07-17 13:58:37 +07:00
: Extension.ToThaiNumber(Extension.ToThaiFullDate3(getDevelopment.startDate)),
endDate:
getDevelopment.endDate == null
? ""
2024-07-17 13:58:37 +07:00
: Extension.ToThaiNumber(Extension.ToThaiFullDate3(getDevelopment.endDate)),
reportBackNo:
getDevelopment.reportBackNo == null
? ""
: Extension.ToThaiNumber(getDevelopment.reportBackNo),
reportBackNoDate:
getDevelopment.reportBackNoDate == null
? ""
2024-07-17 13:58:37 +07:00
: Extension.ToThaiNumber(Extension.ToThaiFullDate3(getDevelopment.reportBackNoDate)),
governmentDate:
getDevelopment.governmentDate == null
? ""
2024-07-17 13:58:37 +07:00
: Extension.ToThaiNumber(Extension.ToThaiFullDate3(getDevelopment.governmentDate)),
graduatedDate:
getDevelopment.graduatedDate == null
? ""
2024-07-17 13:58:37 +07:00
: Extension.ToThaiNumber(Extension.ToThaiFullDate3(getDevelopment.graduatedDate)),
2024-09-03 15:18:30 +07:00
graduatedReason: getDevelopment.graduatedReason == null ? "" : getDevelopment.graduatedReason,
useOfficialTime: getDevelopment.useOfficialTime,
useOffTime: getDevelopment.useOfficialTime == true ? "🗹 ใช้ ☐ ไม่ใช้" : "☐ ใช้ 🗹 ไม่ใช้",
isGraduated: getDevelopment.isGraduated,
isG1: getDevelopment.isGraduated == true ? "🗹" : "☐",
isG2: getDevelopment.isGraduated == true ? "☐" : "🗹",
2024-07-17 12:47:36 +07:00
totalPeriod:
getDevelopment.totalPeriod == null || getDevelopment.totalPeriod == ""
2024-07-17 12:47:36 +07:00
? ""
: Extension.ToThaiNumber(getDevelopment.totalPeriod),
};
return new HttpSuccess({
template: "repatriation",
reportName: "repatriation",
data: formattedData,
});
}
2025-02-11 19:23:29 +07:00
/**
2025-02-11 19:49:41 +07:00
* API Report
2025-02-11 19:23:29 +07:00
*
2025-02-11 19:49:41 +07:00
* @summary DEV_0xx - Report #xx
2025-02-11 19:23:29 +07:00
*
*/
@Get("report3")
2025-02-13 10:28:05 +07:00
async report3(
2025-02-13 18:07:32 +07:00
@Query("year") year?: number,
2025-02-13 10:28:05 +07:00
@Query("rootId") rootId?: string,
) {
2025-02-13 11:15:13 +07:00
const developments = await AppDataSource.getRepository(DevelopmentScholarship)
.createQueryBuilder("developmentScholarship")
.leftJoinAndSelect("developmentScholarship.posLevel", "posLevel")
.leftJoinAndSelect("developmentScholarship.posType", "posType")
.andWhere(
year !== 0 && year != null && year != undefined
? "developmentScholarship.scholarshipYear = :scholarshipYear"
: "1=1",
{ scholarshipYear: year },
)
.andWhere(
rootId != "" && rootId != null && rootId != undefined
? "developmentScholarship.rootId = :rootId"
: "1=1",
{ rootId: rootId },
)
.orderBy("developmentScholarship.scholarshipYear", "DESC")
.addOrderBy("developmentScholarship.createdAt", "DESC")
.getMany();
2025-02-13 17:38:17 +07:00
2025-02-13 11:15:13 +07:00
const mapData = developments.map((item, idx:number) => ({
no: Extension.ToThaiNumber((idx+1).toString()),
institution: item.educationalInstitution ? item.educationalInstitution : "-",
2025-02-13 17:38:17 +07:00
scholarshipType: item.scholarshipType ?
item.scholarshipType == "DOMESTICE"
? "การศึกษาในประเทศ"
: item.scholarshipType == "NOABROAD"
? "ฝึกอบรมในประเทศที่ส่งไปพัฒนากับหน่วยวงานภายนอก (หลักสูตรที่ไม่มีการไปต่างประเทศ)"
: item.scholarshipType == "ABROAD"
? "ฝึกอบรมในประเทศที่ส่งไปพัฒนากับหน่วยวงานภายนอก (หลักสูตรที่มีการไปต่างประเทศ)"
: item.scholarshipType == "EXECUTIVE"
? "ฝึกอบรมในประเทศที่ส่งไปพัฒนากับหน่วยวงานภายนอก (หลักสูตรประเภทนักบริหาร)"
: item.scholarshipType == "RESEARCH"
? "ศึกษา ฝึกอบรม ประชุม ดูงาน และปฏิบัติการวิจัย ณ ต่างประเทศ"
: "-"
: "-",
2025-02-13 11:15:13 +07:00
degreeLevel: item.degreeLevel ? item.degreeLevel : "-",
course: item.course ? item.course : "-",
field: item.field ? item.field : "-",
fullName: `${item.prefix}${item.firstName} ${item.lastName}`,
position: item.position ? item.position : "-",
posLevel: item.posLevel ? item.posLevel.posLevelName : "-",
totalPeriod: item.totalPeriod ? item.totalPeriod : "-",
2025-02-13 17:38:17 +07:00
budgetApprove: item.budgetApprove ? Extension.ToThaiNumber(item.budgetApprove.toLocaleString()) : ""
2025-02-13 11:15:13 +07:00
}));
const sum = developments
.filter(x => x.budgetApprove)
.reduce((acc, item) => acc + (Number(item.budgetApprove)), 0);
2025-02-11 19:23:29 +07:00
return new HttpSuccess({
template: "reportFund3",
reportName: "reportFund3",
data: {
2025-02-13 11:15:13 +07:00
year: year ? Extension.ToThaiNumber((year+543).toString()) : "-",
2025-02-13 17:38:17 +07:00
root: rootId ? developments.length > 0 ? developments.find(x => x.root != "")?.root: "-" : "-",
2025-02-13 11:15:13 +07:00
data: mapData.length > 0
? mapData
: [{
no: "-",
institution: "-",
scholarshipType: "-",
degreeLevel: "-",
course: "-",
field: "-",
fullName: "-",
position: "-",
posLevel: "-",
totalPeriod: "-",
budgetApprove: "-",
}],
2025-02-13 17:38:17 +07:00
sum: sum ? Extension.ToThaiNumber(sum.toLocaleString()): "-"
2025-02-11 19:23:29 +07:00
},
});
}
/**
2025-02-11 19:49:41 +07:00
* API Report
2025-02-11 19:23:29 +07:00
*
2025-02-11 19:49:41 +07:00
* @summary DEV_0xx - Report #xx
2025-02-11 19:23:29 +07:00
*
*/
@Get("report4")
2025-02-13 17:38:17 +07:00
async report4(
2025-02-13 18:07:32 +07:00
@Query("year") year?: number,
2025-02-13 17:38:17 +07:00
) {
const developments = await AppDataSource.getRepository(DevelopmentScholarship)
.createQueryBuilder("developmentScholarship")
.andWhere(
year !== 0 && year != null && year != undefined
? "developmentScholarship.scholarshipYear = :scholarshipYear"
: "1=1",
{ scholarshipYear: year },
)
.orderBy("developmentScholarship.scholarshipYear", "DESC")
.addOrderBy("developmentScholarship.createdAt", "DESC")
.getMany();
2025-02-11 19:23:29 +07:00
2025-02-13 17:38:17 +07:00
// const _develop = await this.developmentScholarshipRepository.find({
// where: {
// scholarshipYear: year ? year : Not(IsNull())
// },
// order: { "scholarshipYear" : "DESC" }
// })
const groupDevelopment = Array.isArray(developments) && developments.length > 0
? developments.reduce((acc:any, current:any, idx:number) => {
const root = current.root || "";
if (!acc[root]) {
acc[root] = {
no: (idx+1),
root: root,
Bachelor : 0,
BachelorHight: 0,
Master: 0,
Doctor: 0,
DomesticeCourseCount: 0,
DomesticeProfileCount: 0,
DomesticeBudgetApprove: 0,
NoAbroadCourseCount: 0,
NoAbroadDProfileCount: 0,
NoAbroadBudgetApprove: 0,
AbroadCourseCount: 0,
AbroadProfileCount: 0,
AbroadBudgetApprove: 0,
ExecutiveCourseCount: 0,
ExecutiveProfileCount: 0,
ExecutiveBudgetApprove: 0,
TotalCourseCount: 0,
TotalProfileCount: 0,
TotalBudgetApprove: 0,
};
}
switch (current.scholarshipType) {
case "DOMESTICE":
acc[root].DomesticeCourseCount++;
acc[root].DomesticeProfileCount++;
acc[root].DomesticeBudgetApprove += current.budgetApprove || 0;
break;
case "NOABROAD":
acc[root].NoAbroadCourseCount++;
acc[root].NoAbroadProfileCount++;
acc[root].NoAbroadBudgetApprove += current.budgetApprove || 0;
break;
case "ABROAD":
acc[root].AbroadCourseCount++;
acc[root].AbroadProfileCount++;
acc[root].AbroadBudgetApprove += current.budgetApprove || 0;
break;
case "EXECUTIVE":
acc[root].ExecutiveCourseCount++;
acc[root].ExecutiveProfileCount++;
acc[root].ExecutiveBudgetApprove += current.budgetApprove || 0;
break;
}
2025-02-11 19:23:29 +07:00
2025-02-13 17:38:17 +07:00
acc[root].TotalCourseCount = acc[root].DomesticeCourseCount + acc[root].NoAbroadCourseCount + acc[root].AbroadCourseCount + acc[root].ExecutiveCourseCount;
acc[root].TotalProfileCount = acc[root].DomesticeProfileCount + acc[root].NoAbroadProfileCount + acc[root].AbroadProfileCount + acc[root].ExecutiveProfileCount;
acc[root].TotalBudgetApprove = acc[root].DomesticeBudgetApprove + acc[root].NoAbroadBudgetApprove + acc[root].AbroadBudgetApprove + acc[root].ExecutiveBudgetApprove;
return acc;
}, {})
: [];
const _group = Object.values(groupDevelopment);
2025-02-11 19:23:29 +07:00
return new HttpSuccess({
template: "reportFund4",
reportName: "reportFund4",
data: {
2025-02-13 17:38:17 +07:00
year: year ? Extension.ToThaiNumber((year+543).toString()) : "-",
data: Array.isArray(_group)
2025-02-13 18:43:36 +07:00
// ? _group
? _group.map((x:any) => ({
no: x.no ? Extension.ToThaiNumber(x.no.toString()) : "-",
root: x.root ? x.root : "-",
Bachelor : "-",
BachelorHight: "-",
Master: "-",
Doctor: "-",
DomesticeCourseCount: x.DomesticeCourseCount ? Extension.ToThaiNumber(x.DomesticeCourseCount.toLocaleString()) : "-",
DomesticeProfileCount: x.DomesticeProfileCount ? Extension.ToThaiNumber(x.DomesticeProfileCount.toLocaleString()) : "-",
DomesticeBudgetApprove: x.DomesticeBudgetApprove ? Extension.ToThaiNumber(x.DomesticeBudgetApprove.toLocaleString()) : "-",
NoAbroadCourseCount: x.NoAbroadCourseCount ? Extension.ToThaiNumber(x.NoAbroadCourseCount.toLocaleString()) : "-",
NoAbroadDProfileCount: x.NoAbroadDProfileCount ? Extension.ToThaiNumber(x.NoAbroadDProfileCount.toLocaleString()) : "-",
NoAbroadBudgetApprove: x.NoAbroadBudgetApprove ? Extension.ToThaiNumber(x.NoAbroadBudgetApprove.toLocaleString()) : "-",
AbroadCourseCount: x.AbroadCourseCount ? Extension.ToThaiNumber(x.AbroadCourseCount.toLocaleString()) : "-",
AbroadProfileCount: x.AbroadProfileCount ? Extension.ToThaiNumber(x.AbroadProfileCount.toLocaleString()) : "-",
AbroadBudgetApprove: x.AbroadBudgetApprove ? Extension.ToThaiNumber(x.AbroadBudgetApprove.toLocaleString()) : "-",
ExecutiveCourseCount: x.ExecutiveCourseCount ? Extension.ToThaiNumber(x.ExecutiveCourseCount.toLocaleString()) : "-",
ExecutiveProfileCount: x.ExecutiveProfileCount ? Extension.ToThaiNumber(x.ExecutiveProfileCount.toLocaleString()) : "-",
ExecutiveBudgetApprove: x.ExecutiveBudgetApprove ? Extension.ToThaiNumber(x.ExecutiveBudgetApprove.toLocaleString()) : "-",
TotalCourseCount: x.TotalCourseCount ? Extension.ToThaiNumber(x.TotalCourseCount.toLocaleString()) : "-",
TotalProfileCount: x.TotalProfileCount ? Extension.ToThaiNumber(x.TotalProfileCount.toLocaleString()) : "-",
TotalBudgetApprove: x.TotalBudgetApprove ? Extension.ToThaiNumber(x.TotalBudgetApprove.toLocaleString()) : "-",
}))
2025-02-13 17:38:17 +07:00
: [{
no: "-",
root: "-",
Bachelor : "-",
BachelorHight: "-",
Master: "-",
Doctor: "-",
DomesticeCourseCount: "-",
DomesticeProfileCount: "-",
DomesticeBudgetApprove: "-",
NoAbroadCourseCount: "-",
NoAbroadDProfileCount: "-",
NoAbroadBudgetApprove: "-",
AbroadCourseCount: "-",
AbroadProfileCount: "-",
AbroadBudgetApprove: "-",
ExecutiveCourseCount: "-",
ExecutiveProfileCount: "-",
ExecutiveBudgetApprove: "-",
TotalCourseCount: "-",
TotalProfileCount: "-",
TotalBudgetApprove: "-",
}],
totalRoot: Array.isArray(_group) ? Extension.ToThaiNumber(_group.length.toLocaleString()) : "-"
2025-02-11 19:23:29 +07:00
},
});
}
/**
2025-02-11 19:49:41 +07:00
* API Report
2025-02-11 19:23:29 +07:00
*
2025-02-11 19:49:41 +07:00
* @summary DEV_0xx - Report #xx
2025-02-11 19:23:29 +07:00
*
*/
@Get("report5")
2025-02-13 17:34:19 +07:00
async report5(
2025-02-13 18:07:32 +07:00
@Query("year") year?: number,
2025-02-13 17:34:19 +07:00
// @Query("rootId") rootId: string,
) {
const [development, total] = await AppDataSource.getRepository(DevelopmentScholarship)
.createQueryBuilder("developmentScholarship")
.leftJoinAndSelect("developmentScholarship.posLevel", "posLevel")
.leftJoinAndSelect("developmentScholarship.posType", "posType")
.leftJoinAndSelect("developmentScholarship.posLevelguarantor", "posLevelguarantor")
.leftJoinAndSelect("developmentScholarship.posTypeguarantor", "posTypeguarantor")
// .where("developmentScholarship.rootId = :rootId", { rootId: rootId })
.andWhere(
year !== 0 && year != null && year != undefined
? "developmentScholarship.scholarshipYear = :scholarshipYear"
: "1=1",
{ scholarshipYear: year },
)
.andWhere(
"developmentScholarship.scholarshipType = :scholarshipType", { scholarshipType: "RESEARCH" },
)
.orderBy("developmentScholarship.scholarshipYear", "DESC")
.addOrderBy("developmentScholarship.createdAt", "DESC")
.getManyAndCount();
const totalBudgetApprove = development.reduce((sum, item) => sum + Number(item.budgetApprove), 0);
const formattedData = development.map((item, index) => {
const rawPath = [
item.course == "-" ? null : item.course,
item.field == "-" ? null : item.course
];
const courseAndfield = rawPath
.filter((path) => path !== undefined && path !== null)
.join("/");
const date = [
Extension.ToThaiNumber(Extension.ToThaiShortDate(item.startDate)),
Extension.ToThaiNumber(Extension.ToThaiShortDate(item.endDate))
];
const dateDulation = date
.filter((path) => path !== undefined && path !== null)
.join(" - ");
return {
no: Extension.ToThaiNumber((index + 1).toString()),
id: item.id,
studyTopic: item.studyTopic ? item.studyTopic : "-",
fullName: item.prefix + item.firstName + " " + item.lastName,
position: item.position,
posLevel: item.posLevel ? item.posLevel.posLevelName : "-",
courseAndfield: courseAndfield ?? "-",
place: item.studyPlace ? item.studyPlace : "-",
country: item.studyCountry ? item.studyCountry : "-",
startAndendDate: dateDulation,
2025-02-13 18:43:36 +07:00
budgetApprove: item.budgetApprove ? Extension.ToThaiNumber(item.budgetApprove.toLocaleString()) : "-",
2025-02-13 17:34:19 +07:00
};
});
2025-02-11 19:23:29 +07:00
return new HttpSuccess({
template: "reportFund5",
reportName: "reportFund5",
data: {
year: year?Extension.ToThaiNumber((year+543).toString()):"",
2025-02-13 17:34:19 +07:00
data: formattedData,
2025-02-13 18:43:36 +07:00
total: Extension.ToThaiNumber(total.toLocaleString()),
totalBudgetApprove: Extension.ToThaiNumber(totalBudgetApprove.toLocaleString()),
2025-02-11 19:23:29 +07:00
},
});
}
/**
2025-02-11 19:49:41 +07:00
* API Report
2025-02-11 19:23:29 +07:00
*
2025-02-11 19:49:41 +07:00
* @summary DEV_0xx - Report #xx
2025-02-11 19:23:29 +07:00
*
*/
@Get("report6")
2025-02-13 17:34:19 +07:00
async report6(
2025-02-13 18:07:32 +07:00
@Query("year") year?: number,
2025-02-13 17:34:19 +07:00
) {
const degree = [
"ปริญญาเอก",
"ปริญญาโท",
"ปริญญาตรี",
];
2025-02-13 20:02:25 +07:00
const development = await this.viewDevScholarship.find({
where: {
rootId: Not(IsNull()),
degreeLevel: In(degree),
},
});
2025-02-13 18:43:36 +07:00
2025-02-13 20:02:25 +07:00
const groupedData = development.reduce((acc:any, item:any) => {
const { rootId, root, degreeLevel, scholarshipType, budgetApprove } = item;
2025-02-11 19:23:29 +07:00
2025-02-13 20:02:25 +07:00
if (!acc[rootId]) {
acc[rootId] = {
root,
rootId,
degreeLevel1: {
numberOfRecords: 0,
numberOfScholarshipTypes: 0,
totalBudgetApprove: 0,
},
degreeLevel2: {
numberOfRecords: 0,
numberOfScholarshipTypes: 0,
totalBudgetApprove: 0,
},
degreeLevel3: {
numberOfRecords: 0,
numberOfScholarshipTypes: 0,
totalBudgetApprove: 0,
},
};
}
if (degreeLevel === "ปริญญาตรี") {
acc[rootId].degreeLevel1.numberOfRecords += Number(item.numberOfRecords);
acc[rootId].degreeLevel1.numberOfScholarshipTypes += Number(item.numberOfScholarshipTypes);
acc[rootId].degreeLevel1.totalBudgetApprove += Number(item.totalBudgetApprove);
} else if (degreeLevel === "ปริญญาโท") {
acc[rootId].degreeLevel2.numberOfRecords += Number(item.numberOfRecords);
acc[rootId].degreeLevel2.numberOfScholarshipTypes += Number(item.numberOfScholarshipTypes);
acc[rootId].degreeLevel2.totalBudgetApprove += Number(item.totalBudgetApprove);
} else if (degreeLevel === "ปริญญาเอก") {
acc[rootId].degreeLevel3.numberOfRecords += Number(item.numberOfRecords);
acc[rootId].degreeLevel3.numberOfScholarshipTypes += Number(item.numberOfScholarshipTypes);
acc[rootId].degreeLevel3.totalBudgetApprove += Number(item.totalBudgetApprove);
}
return acc;
}, {});
2025-02-11 19:23:29 +07:00
2025-02-13 20:02:25 +07:00
const formattedData = Object.values(groupedData).map((item: any, index: any) => {
const sumnumberOfRecords = item.degreeLevel1.numberOfRecords + item.degreeLevel2.numberOfRecords + item.degreeLevel3.numberOfRecords;
const sumnumberOfScholarshipTypes = item.degreeLevel1.numberOfScholarshipTypes + item.degreeLevel2.numberOfScholarshipTypes + item.degreeLevel3.numberOfScholarshipTypes;
const sumtotalBudgetApprove = item.degreeLevel1.totalBudgetApprove + item.degreeLevel2.totalBudgetApprove + item.degreeLevel3.totalBudgetApprove;
return {
no: index ? Extension.ToThaiNumber((index + 1).toString()) : "๑",
rootId: item.rootId ? item.rootId : "-",
root: item.root ? item.root : "-",
degreeLevel1: "ปริญญาตรี",
numberOfRecords1: item.degreeLevel1.numberOfRecords ? Extension.ToThaiNumber(item.degreeLevel1.numberOfRecords.toString()) : "-",
numberOfScholarshipTypes1: item.degreeLevel1.numberOfScholarshipTypes ? Extension.ToThaiNumber(item.degreeLevel1.numberOfScholarshipTypes.toString()) : "-",
totalBudgetApprove1: item.degreeLevel1.totalBudgetApprove ? Extension.ToThaiNumber(item.degreeLevel1.totalBudgetApprove.toLocaleString()) : "-",
degreeLevel2: "ปริญญาโท",
numberOfRecords2: item.degreeLevel2.numberOfRecords ? Extension.ToThaiNumber(item.degreeLevel2.numberOfRecords.toString()) : "-",
numberOfScholarshipTypes2: item.degreeLevel2.numberOfScholarshipTypes ? Extension.ToThaiNumber(item.degreeLevel2.numberOfScholarshipTypes.toString()) : "-",
totalBudgetApprove2: item.degreeLevel2.totalBudgetApprove ? Extension.ToThaiNumber(item.degreeLevel2.totalBudgetApprove.toLocaleString()) : "-",
degreeLevel3: "ปริญญาเอก",
numberOfRecords3: item.degreeLevel3.numberOfRecords ? Extension.ToThaiNumber(item.degreeLevel3.numberOfRecords.toString()) : "-",
numberOfScholarshipTypes3: item.degreeLevel3.numberOfScholarshipTypes ? Extension.ToThaiNumber(item.degreeLevel3.numberOfScholarshipTypes.toString()) : "-",
totalBudgetApprove3: item.degreeLevel3.totalBudgetApprove ? Extension.ToThaiNumber(item.degreeLevel3.totalBudgetApprove.toLocaleString()) : "-",
totalNumberOfRecords: Extension.ToThaiNumber(sumnumberOfRecords.toString()),
totalNumberOfScholarshipTypes: Extension.ToThaiNumber(sumnumberOfScholarshipTypes.toString()),
totalTotalBudgetApprove: Extension.ToThaiNumber(sumtotalBudgetApprove.toLocaleString())
};
});
const uniqueRoots = new Set(formattedData.map(item => item.root));
const numberOfORG = uniqueRoots.size;
2025-02-11 19:23:29 +07:00
return new HttpSuccess({
template: "reportFund6",
reportName: "reportFund6",
data: {
year: year?Extension.ToThaiNumber((year+543).toString()):"",
2025-02-13 20:02:25 +07:00
data: formattedData,
coutOrg: numberOfORG?Extension.ToThaiNumber(numberOfORG.toString())+" หน่วยงาน":" หน่วยงาน"
2025-02-11 19:23:29 +07:00
},
});
}
2024-04-09 11:38:13 +07:00
}
2025-02-11 19:23:29 +07:00