diff --git a/src/controllers/DevelopmentController.ts b/src/controllers/DevelopmentController.ts index 8e0a440..ee4caf4 100644 --- a/src/controllers/DevelopmentController.ts +++ b/src/controllers/DevelopmentController.ts @@ -1925,6 +1925,38 @@ export class DevelopmentController extends Controller { return new HttpSuccess({ data: development, total }); } + /** + * API ลบรายชื่อผู้ผ่านการอบรม + * + * @summary ลบรายชื่อผู้ผ่านการอบรม + * + * @param {string} id Id ผู้ผ่านการอบรม + */ + @Delete("delete/{id}") + async DeleteDevelopmentBy(@Path() id: string, @Request() request: RequestWithUser) { + await new permission().PermissionDelete(request, "SYS_DEV_PROJECT"); + const developmentHis = await this.developmentHistoryRepository.findOne({ + where: { id }, + }); + if (!developmentHis) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลรายชื่อผู้ผ่านการอบรม"); + } + if (developmentHis.isProfile) { + if (developmentHis.isDone || developmentHis.isDoneIDP) { + await new CallAPI() + .PostData(request, "/org/profile/training/delete-byId", { + type: developmentHis.type, + profileId: developmentHis.profileId, + developmentId: developmentHis.developmentId, + }) + .then((x) => {}) + .catch((x) => {}); + } + } + await this.developmentHistoryRepository.delete({ id }); + return new HttpSuccess(); + } + /** * API ลบโครงการ/หลักสูตรการฝึกอบรม * @@ -2580,6 +2612,7 @@ export class DevelopmentController extends Controller { where: { developmentId: id }, relations: ["posLevel", "posType", "employeePosLevel", "employeePosType"], order: { + no: "ASC", isDone: "ASC", isDoneIDP: "ASC", citizenId: "ASC", @@ -2587,6 +2620,7 @@ export class DevelopmentController extends Controller { }, }); const _getDevelopment = getDevelopment.map((item) => ({ + no: item.no, id: item.id, type: item.type, idcard: item.citizenId, diff --git a/src/controllers/DevelopmentScholarshipController.ts b/src/controllers/DevelopmentScholarshipController.ts index a39889b..e78e310 100644 --- a/src/controllers/DevelopmentScholarshipController.ts +++ b/src/controllers/DevelopmentScholarshipController.ts @@ -330,7 +330,7 @@ export class DevelopmentScholarshipController extends Controller { id: item.id, year: item.scholarshipYear, citizenId: item.citizenId, - fullName: `${item.prefix ?? ""}${item.firstName ?? ""} ${item.lastName ?? ""}`, + fullName: `${item.prefix ?? ""}${item.firstName ?? ""} ${item.lastName ?? ""}`.trim(), position: item.position, posType: item.posType ? item.posType.posTypeName : null, posLevel: item.posLevel ? item.posLevel.posLevelName : null, @@ -339,7 +339,7 @@ export class DevelopmentScholarshipController extends Controller { scholarshipType: item.scholarshipType, startDate: item.startDate, endDate: item.endDate, - fullNameGuarantor: `${item.guarantorPrefix ?? ""}${item.guarantorFirstName ?? ""} ${item.guarantorLastName ?? ""}` , + fullNameGuarantor: `${item.guarantorPrefix ?? ""}${item.guarantorFirstName ?? ""} ${item.guarantorLastName ?? ""}`.trim(), guarantorCitizenId: item.guarantorCitizenId, })); @@ -789,6 +789,9 @@ export class DevelopmentScholarshipController extends Controller { if (!getDevelopment) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลทุนการศึกษา/ฝึกอบรมนี้"); } + if (getDevelopment.status == "PENDING") { + getDevelopment.status = "REPORTED"; + } const before = structuredClone(getDevelopment); Object.assign(getDevelopment, requestBody); getDevelopment.lastUpdateUserId = request.user.sub; diff --git a/src/controllers/PortfolioController.ts b/src/controllers/PortfolioController.ts index eecf28a..3ebe17b 100644 --- a/src/controllers/PortfolioController.ts +++ b/src/controllers/PortfolioController.ts @@ -23,7 +23,7 @@ import { CreatePortfolio, Portfolio } from "../entities/Portfolio"; import { RequestWithUser } from "../middlewares/user"; import { setLogDataDiff } from "../interfaces/utils"; import { Brackets } from "typeorm"; - +import CallAPI from "../interfaces/call-api"; @Route("api/v1/development/portfolio") @Tags("Portfolio") @Security("bearerAuth") @@ -104,19 +104,21 @@ export class PortfolioController extends Controller { } /** - * API รายละเอียดรายการผลงาน ใช้แสดงในรายงาน ก.พ.7/ก.ก.1 + * API รายละเอียดรายการผลงาน ใช้แสดงในรายงาน ทปอ. สามัญ * - * @summary รายละเอียดรายการผลงาน ใช้แสดงในรายงาน ก.พ.7/ก.ก.1 + * @summary รายละเอียดรายการผลงาน ใช้แสดงในรายงาน ทปอ. สามัญ * */ @Get("kk1/{keycloak}") async GetPortfolio(@Path() keycloak: string, @Request() request: RequestWithUser) { const _portfolio = await this.portfolioRepository.find({ where: { createdUserId: keycloak }, - select: [ - "name", - "createdAt" - ], + select: { + name: true, + createdAt: true, + position: true, + posLevel: true + }, order: { createdAt: "DESC" }, }); const result = @@ -124,7 +126,8 @@ export class PortfolioController extends Controller { name: x.name, year: x.createdAt.getFullYear() > 2500 ? x.createdAt.getFullYear() - : x.createdAt.getFullYear()+543 + : x.createdAt.getFullYear()+543, + position: `${x.position ?? ""}${x.posLevel ?? ""}`.trim() })); return new HttpSuccess(result); } @@ -153,7 +156,20 @@ export class PortfolioController extends Controller { if (checkName) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ชื่อนี้มีอยู่ในระบบแล้ว"); } + + let _position:string="" + let _posLevel:string="" + await new CallAPI() + .GetData(request, `/org/dotnet/by-keycloak/${request.user.sub}`) + .then((x) => { + _position = x.position; + _posLevel = x.posLevel; + }) + .catch(() => {}); + const before = null; + _portfolio.position = _position; + _portfolio.posLevel = _posLevel; _portfolio.createdUserId = request.user.sub; _portfolio.createdFullName = request.user.name; _portfolio.lastUpdateUserId = request.user.sub; diff --git a/src/controllers/ReportController.ts b/src/controllers/ReportController.ts index d6307e1..75d6a4f 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -628,6 +628,10 @@ export class ReportController extends Controller { field: getDevelopment.field, studyPlace: getDevelopment.studyPlace, scholarshipType: getDevelopment.scholarshipType, + bookNo: + getDevelopment.bookNo == null + ? "" + : Extension.ToThaiNumber(getDevelopment.bookNo), bookNoDate: getDevelopment.bookNoDate == null ? "" diff --git a/src/entities/DevelopmentHistory.ts b/src/entities/DevelopmentHistory.ts index dfbd9c4..c87319a 100644 --- a/src/entities/DevelopmentHistory.ts +++ b/src/entities/DevelopmentHistory.ts @@ -229,6 +229,7 @@ export class DevelopmentHistory extends EntityBase { isProfile: boolean; @Column({ + type: "int", nullable: true, comment: "ลำดับ", default: null, diff --git a/src/entities/Portfolio.ts b/src/entities/Portfolio.ts index 074dd08..26f4a60 100644 --- a/src/entities/Portfolio.ts +++ b/src/entities/Portfolio.ts @@ -17,6 +17,21 @@ export class Portfolio extends EntityBase { default: null, }) detail: string; + + @Column({ + nullable: true, + comment: "ตำแหน่ง", + default: null, + }) + position: string; + + + @Column({ + nullable: true, + comment: "ระดับตำแหน่ง", + default: null, + }) + posLevel: string; } export class CreatePortfolio { @Column() diff --git a/src/middlewares/auth.ts b/src/middlewares/auth.ts index de43a0c..e87755b 100644 --- a/src/middlewares/auth.ts +++ b/src/middlewares/auth.ts @@ -67,6 +67,16 @@ export async function expressAuthentication( request.app.locals.logData.userName = payload.name; request.app.locals.logData.user = payload.preferred_username; + // เก็บค่า profileId และ orgRootDnaId จาก token (ใช้ค่าว่างถ้าไม่มี) + request.app.locals.logData.profileId = payload.profileId ?? ""; + request.app.locals.logData.orgRootDnaId = payload.orgRootDnaId ?? ""; + request.app.locals.logData.orgChild1DnaId = payload.orgChild1DnaId ?? ""; + request.app.locals.logData.orgChild2DnaId = payload.orgChild2DnaId ?? ""; + request.app.locals.logData.orgChild3DnaId = payload.orgChild3DnaId ?? ""; + request.app.locals.logData.orgChild4DnaId = payload.orgChild4DnaId ?? ""; + request.app.locals.logData.empType = payload.empType ?? ""; + request.app.locals.logData.prefix = payload.prefix ?? ""; + return payload; } diff --git a/src/middlewares/logs.ts b/src/middlewares/logs.ts index 7273708..f445a75 100644 --- a/src/middlewares/logs.ts +++ b/src/middlewares/logs.ts @@ -45,21 +45,24 @@ async function logMiddleware(req: Request, res: Response, next: NextFunction) { if (level === 2 && res.statusCode < 400) return; if (level === 3 && res.statusCode < 200) return; - const token = req.headers["authorization"]; - let rootId = null; + // const token = req.headers["authorization"]; + // let rootId = null; - try { - rootId = token - ? await new permission().checkRootDna(token, req.app.locals.logData.userId) - : null; - } catch (err) { - console.warn("Error fetching rootId:", err); - } + // try { + // rootId = token + // ? await new permission().checkOrg(token, req.app.locals.logData.userId) + // : null; + // } catch (err) { + // console.warn("Error fetching rootId:", err); + // } + + // Get rootId from token + const rootId = req.app.locals.logData?.orgRootDnaId; const obj = { logType: res.statusCode >= 500 ? "error" : res.statusCode >= 400 ? "warning" : "info", ip: req.ip, - rootId: rootId?.rootDnaId ?? null, + rootId: rootId ?? null, systemName: "development", startTimeStamp: timestamp, endTimeStamp: new Date().toISOString(), diff --git a/src/migration/1773974268282-update_table_portfolio_add_field_position_.ts b/src/migration/1773974268282-update_table_portfolio_add_field_position_.ts new file mode 100644 index 0000000..79b9528 --- /dev/null +++ b/src/migration/1773974268282-update_table_portfolio_add_field_position_.ts @@ -0,0 +1,16 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class UpdateTablePortfolioAddFieldPosition_1773974268282 implements MigrationInterface { + name = 'UpdateTablePortfolioAddFieldPosition_1773974268282' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`portfolio\` ADD \`position\` varchar(255) NULL COMMENT 'ตำแหน่ง'`); + await queryRunner.query(`ALTER TABLE \`portfolio\` ADD \`posLevel\` varchar(255) NULL COMMENT 'ระดับตำแหน่ง'`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`portfolio\` DROP COLUMN \`posLevel\``); + await queryRunner.query(`ALTER TABLE \`portfolio\` DROP COLUMN \`position\``); + } + +}