diff --git a/src/controllers/DevelopmentController.ts b/src/controllers/DevelopmentController.ts index 466db5e..bf63fe5 100644 --- a/src/controllers/DevelopmentController.ts +++ b/src/controllers/DevelopmentController.ts @@ -38,9 +38,13 @@ import { PosLevel } from "../entities/PosLevel"; import { PlannedGoalPosition } from "../entities/PlannedGoalPosition"; import { DevelopmentHistory } from "../entities/DevelopmentHistory"; import { DevelopmentProjectType } from "../entities/DevelopmentProjectType"; -import { DevelopmentProjectTechnique } from "../entities/DevelopmentProjectTechnique"; -import { DevelopmentEvaluation } from "../entities/DevelopmentEvaluation"; +import { + CreateDevelopmentEvaluation, + DevelopmentEvaluation, +} from "../entities/DevelopmentEvaluation"; import { DevelopmentAddress } from "../entities/DevelopmentAddress"; +import { DevelopmentProjectTechniquePlanned } from "../entities/DevelopmentProjectTechniquePlanned"; +import { DevelopmentProjectTechniqueActual } from "../entities/DevelopmentProjectTechniqueActual"; @Route("api/v1/development/main") @Tags("Development") @@ -50,8 +54,11 @@ export class DevelopmentController extends Controller { private developmentAddresssRepository = AppDataSource.getRepository(DevelopmentAddress); private developmentEvaluationRepository = AppDataSource.getRepository(DevelopmentEvaluation); private developmentProjectTypeRepository = AppDataSource.getRepository(DevelopmentProjectType); - private developmentProjectTechniqueRepository = AppDataSource.getRepository( - DevelopmentProjectTechnique, + private developmentProjectTechniquePlannedRepository = AppDataSource.getRepository( + DevelopmentProjectTechniquePlanned, + ); + private developmentProjectTechniqueActualRepository = AppDataSource.getRepository( + DevelopmentProjectTechniqueActual, ); private developmentHistoryRepository = AppDataSource.getRepository(DevelopmentHistory); private actualPeopleRepository = AppDataSource.getRepository(ActualPeople); @@ -162,7 +169,7 @@ export class DevelopmentController extends Controller { if (!development) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลโครงการ/หลักสูตรการฝึกอบรมนี้"); } - const data = Object.assign(new PlannedGoal(), requestBody); + const data = Object.assign(new PlannedGoal(), { ...requestBody, positions: [] }); data.createdUserId = request.user.sub; data.createdFullName = request.user.name; data.lastUpdateUserId = request.user.sub; @@ -284,7 +291,7 @@ export class DevelopmentController extends Controller { @Put("tab2_4_add/{id}") async CreateDevelopmenttab2_4( @Path() id: string, - @Body() requestBody: CreateActualPeople[], + @Body() requestBody: CreateActualPeople, @Request() request: { user: Record }, ) { const development = await this.developmentRepository.findOne({ @@ -308,7 +315,7 @@ export class DevelopmentController extends Controller { * * @summary DEV_00 - แก้ไขโครงการ/หลักสูตรการฝึกอบรมtab2-1 # * - * @param {string} id Id โครงการ + * @param {string} id Id รายการ */ @Put("tab2_1_edit/{id}") async UpdateDevelopmenttab2_1( @@ -327,9 +334,7 @@ export class DevelopmentController extends Controller { } await this.plannedGoalPositionRepository.remove(development.plannedGoalPositions); - const _requestBody: any = requestBody; - delete _requestBody.positions; - Object.assign(development, requestBody); + Object.assign(development, { ...requestBody, positions: [] }); development.lastUpdateUserId = request.user.sub; development.lastUpdateFullName = request.user.name; await this.plannedGoalRepository.save(development); @@ -371,7 +376,7 @@ export class DevelopmentController extends Controller { * * @summary DEV_00 - แก้ไขโครงการ/หลักสูตรการฝึกอบรมtab2-2 # * - * @param {string} id Id โครงการ + * @param {string} id Id รายการ */ @Put("tab2_2_edit/{id}") async UpdateDevelopmenttab2_2( @@ -397,7 +402,7 @@ export class DevelopmentController extends Controller { * * @summary DEV_00 - แก้ไขโครงการ/หลักสูตรการฝึกอบรมtab2-3 # * - * @param {string} id Id โครงการ + * @param {string} id Id รายการ */ @Put("tab2_3_edit/{id}") async UpdateDevelopmenttab2_3( @@ -439,7 +444,7 @@ export class DevelopmentController extends Controller { * * @summary DEV_00 - แก้ไขโครงการ/หลักสูตรการฝึกอบรมtab2-4 # * - * @param {string} id Id โครงการ + * @param {string} id Id รายการ */ @Put("tab2_4_edit/{id}") async UpdateDevelopmenttab2_4( @@ -557,19 +562,28 @@ export class DevelopmentController extends Controller { where: { id }, relations: { developmentProjectTypes: true, - developmentProjectTechniques: true, + developmentProjectTechniquePlanneds: true, + developmentProjectTechniqueActuals: true, }, }); if (!development) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลโครงการ/หลักสูตรการฝึกอบรมนี้"); } - Object.assign(development, requestBody); + Object.assign(development, { + ...requestBody, + developmentProjectTypes: [], + developmentProjectTechniquePlanneds: [], + developmentProjectTechniqueActuals: [], + }); development.lastUpdateUserId = request.user.sub; development.lastUpdateFullName = request.user.name; await this.developmentRepository.save(development); await this.developmentProjectTypeRepository.remove(development.developmentProjectTypes); - await this.developmentProjectTechniqueRepository.remove( - development.developmentProjectTechniques, + await this.developmentProjectTechniquePlannedRepository.remove( + development.developmentProjectTechniquePlanneds, + ); + await this.developmentProjectTechniqueActualRepository.remove( + development.developmentProjectTechniqueActuals, ); if (requestBody.developmentProjectTypes != null) { await Promise.all( @@ -585,17 +599,31 @@ export class DevelopmentController extends Controller { }), ); } - if (requestBody.developmentProjectTechniques != null) { + if (requestBody.developmentProjectTechniquePlanneds != null) { await Promise.all( - requestBody.developmentProjectTechniques.map(async (x) => { - let data = new DevelopmentProjectTechnique(); + requestBody.developmentProjectTechniquePlanneds.map(async (x) => { + let data = new DevelopmentProjectTechniquePlanned(); data.name = x; data.createdUserId = request.user.sub; data.createdFullName = request.user.name; data.lastUpdateUserId = request.user.sub; data.lastUpdateFullName = request.user.name; data.developmentId = development.id; - await this.developmentProjectTechniqueRepository.save(data); + await this.developmentProjectTechniquePlannedRepository.save(data); + }), + ); + } + if (requestBody.developmentProjectTechniqueActuals != null) { + await Promise.all( + requestBody.developmentProjectTechniqueActuals.map(async (x) => { + let data = new DevelopmentProjectTechniquePlanned(); + data.name = x; + data.createdUserId = request.user.sub; + data.createdFullName = request.user.name; + data.lastUpdateUserId = request.user.sub; + data.lastUpdateFullName = request.user.name; + data.developmentId = development.id; + await this.developmentProjectTechniqueActualRepository.save(data); }), ); } @@ -617,9 +645,6 @@ export class DevelopmentController extends Controller { ) { const development = await this.developmentRepository.findOne({ where: { id }, - relations: { - developmentEvaluations: true, - }, }); if (!development) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลโครงการ/หลักสูตรการฝึกอบรมนี้"); @@ -628,18 +653,80 @@ export class DevelopmentController extends Controller { development.lastUpdateUserId = request.user.sub; development.lastUpdateFullName = request.user.name; await this.developmentRepository.save(development); - await this.developmentEvaluationRepository.remove(development.developmentEvaluations); - await Promise.all( - requestBody.developmentEvaluations.map(async (x) => { - const data = Object.assign(new DevelopmentEvaluation(), x); - data.createdUserId = request.user.sub; - data.createdFullName = request.user.name; - data.lastUpdateUserId = request.user.sub; - data.lastUpdateFullName = request.user.name; - data.developmentId = development.id; - await this.developmentEvaluationRepository.save(data); - }), - ); + return new HttpSuccess(development.id); + } + + /** + * API เพิ่มโครงการ/หลักสูตรการฝึกอบรมtab4-1 + * + * @summary DEV_00 - เพิ่มโครงการ/หลักสูตรการฝึกอบรมtab4-1 # + * + * @param {string} id Id โครงการ + */ + @Put("tab4_1_add/{id}") + async CreateDevelopmenttab4_1( + @Path() id: string, + @Body() requestBody: CreateDevelopmentEvaluation, + @Request() request: { user: Record }, + ) { + const development = await this.developmentRepository.findOne({ + where: { id }, + }); + if (!development) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลโครงการ/หลักสูตรการฝึกอบรมนี้"); + } + const data = Object.assign(new DevelopmentEvaluation(), requestBody); + data.createdUserId = request.user.sub; + data.createdFullName = request.user.name; + data.lastUpdateUserId = request.user.sub; + data.lastUpdateFullName = request.user.name; + data.developmentId = development.id; + await this.developmentEvaluationRepository.save(data); + return new HttpSuccess(data.id); + } + + /** + * API ลบโครงการ/หลักสูตรการฝึกอบรมtab4-1 + * + * @summary DEV_00 - ลบโครงการ/หลักสูตรการฝึกอบรมtab4-1 # + * + * @param {string} id Id รายการ + */ + @Delete("tab4_1/{id}") + async DeleteDevelopmenttab4_1(@Path() id: string) { + const development = await this.developmentEvaluationRepository.findOne({ + where: { id }, + }); + if (!development) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลผู้เกี่ยวข้องเป้าหมายตามแผน"); + } + await this.developmentEvaluationRepository.remove(development); + return new HttpSuccess(development.id); + } + + /** + * API แก้ไขโครงการ/หลักสูตรการฝึกอบรมtab4-1 + * + * @summary DEV_00 - แก้ไขโครงการ/หลักสูตรการฝึกอบรมtab4-1 # + * + * @param {string} id Id รายการ + */ + @Put("tab4_1_edit/{id}") + async UpdateDevelopmenttab4_1( + @Path() id: string, + @Body() requestBody: CreateDevelopmentEvaluation, + @Request() request: { user: Record }, + ) { + const development = await this.developmentEvaluationRepository.findOne({ + where: { id }, + }); + if (!development) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลโครงการ/หลักสูตรการฝึกอบรมนี้"); + } + Object.assign(development, requestBody); + development.lastUpdateUserId = request.user.sub; + development.lastUpdateFullName = request.user.name; + await this.developmentEvaluationRepository.save(development); return new HttpSuccess(development.id); } @@ -658,9 +745,7 @@ export class DevelopmentController extends Controller { ) { const development = await this.developmentRepository.findOne({ where: { id }, - relations: { - developmentAddresss: true, - }, + relations: { developmentAddresss: true }, }); if (!development) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลโครงการ/หลักสูตรการฝึกอบรมนี้"); @@ -673,28 +758,31 @@ export class DevelopmentController extends Controller { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลจังหวัดข้อมูลด้านวิชาการ"); } } - Object.assign(development, requestBody); + + Object.assign(development, { ...requestBody, developmentAddresss: [] }); development.lastUpdateUserId = request.user.sub; development.lastUpdateFullName = request.user.name; await this.developmentRepository.save(development); + await this.developmentAddresssRepository.remove(development.developmentAddresss); await Promise.all( requestBody.developmentAddresss.map(async (x) => { const data = Object.assign(new DevelopmentAddress(), x); - const chkProvince = await this.provinceRepository.find({ + const chkProvince = await this.provinceRepository.findOne({ where: { id: x.provinceId, }, }); if (chkProvince == null) return; + data.developmentId = development.id; data.createdUserId = request.user.sub; data.createdFullName = request.user.name; data.lastUpdateUserId = request.user.sub; data.lastUpdateFullName = request.user.name; - data.developmentId = development.id; await this.developmentAddresssRepository.save(data); }), ); + return new HttpSuccess(development.id); } @@ -703,7 +791,6 @@ export class DevelopmentController extends Controller { * * @summary DEV_00 - ค้นหาโครงการ # * - * @param {string} id Id โครงการ */ @Get("search") async ListDevelopemt( @@ -752,7 +839,7 @@ export class DevelopmentController extends Controller { * * @summary DEV_003 - ลบโครงการ/หลักสูตรการฝึกอบรม #3 * - * @param {string} id Id โครงการ + * @param {string} id Id รายการ */ @Delete("{id}") async DeleteDevelopment(@Path() id: string) { @@ -764,7 +851,8 @@ export class DevelopmentController extends Controller { developmentActualGoals: true, developmentPlannedGoals: true, developmentProjectTypes: true, - developmentProjectTechniques: true, + developmentProjectTechniquePlanneds: true, + developmentProjectTechniqueActuals: true, developmentEvaluations: true, developmentAddresss: true, }, @@ -787,8 +875,11 @@ export class DevelopmentController extends Controller { await this.actualGoalRepository.remove(development.developmentActualGoals); await this.plannedGoalRepository.remove(development.developmentPlannedGoals); await this.developmentProjectTypeRepository.remove(development.developmentProjectTypes); - await this.developmentProjectTechniqueRepository.remove( - development.developmentProjectTechniques, + await this.developmentProjectTechniquePlannedRepository.remove( + development.developmentProjectTechniquePlanneds, + ); + await this.developmentProjectTechniqueActualRepository.remove( + development.developmentProjectTechniqueActuals, ); await this.developmentEvaluationRepository.remove(development.developmentEvaluations); await this.developmentAddresssRepository.remove(development.developmentAddresss); @@ -915,10 +1006,38 @@ export class DevelopmentController extends Controller { } let _getDevelopment: any = { id: getDevelopment.id, - actualPeoples: getDevelopment.developmentActualPeoples, - plannedPeoples: getDevelopment.developmentPlannedPeoples, - actualGoals: getDevelopment.developmentActualGoals, - plannedGoals: getDevelopment.developmentPlannedGoals, + actualPeoples: + getDevelopment.developmentActualPeoples == null + ? null + : getDevelopment.developmentActualPeoples.sort((a, b) => + (a.groupTarget == null ? "" : a.groupTarget).localeCompare( + b.groupTarget == null ? "" : b.groupTarget, + ), + ), + plannedPeoples: + getDevelopment.developmentPlannedPeoples == null + ? null + : getDevelopment.developmentPlannedPeoples.sort((a, b) => + (a.groupTarget == null ? "" : a.groupTarget).localeCompare( + b.groupTarget == null ? "" : b.groupTarget, + ), + ), + actualGoals: + getDevelopment.developmentActualGoals == null + ? null + : getDevelopment.developmentActualGoals.sort((a, b) => + (a.groupTarget == null ? "" : a.groupTarget).localeCompare( + b.groupTarget == null ? "" : b.groupTarget, + ), + ), + plannedGoals: + getDevelopment.developmentPlannedGoals == null + ? null + : getDevelopment.developmentPlannedGoals.sort((a, b) => + (a.groupTarget == null ? "" : a.groupTarget).localeCompare( + b.groupTarget == null ? "" : b.groupTarget, + ), + ), }; return new HttpSuccess(_getDevelopment); } @@ -935,28 +1054,34 @@ export class DevelopmentController extends Controller { const getDevelopment = await this.developmentRepository.findOne({ where: { id: id }, relations: [ - "developmentActualPeoples", - "developmentPlannedPeoples", - "developmentActualGoals", - "developmentPlannedGoals", - "developmentPlannedGoals.plannedGoalPositions", - "provinces", - // "provinces.developmentProvinces", + "developmentProjectTypes", + "developmentProjectTechniquePlanneds", + "developmentProjectTechniqueActuals", ], }); if (!getDevelopment) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลโครงการ/หลักสูตรการฝึกอบรมนี้"); } - let _getDevelopment: any = getDevelopment; - _getDevelopment.actualPeoples = getDevelopment.developmentActualPeoples; - _getDevelopment.plannedPeoples = getDevelopment.developmentPlannedPeoples; - _getDevelopment.actualGoals = getDevelopment.developmentActualGoals; - _getDevelopment.plannedGoals = getDevelopment.developmentPlannedGoals; - // _getDevelopment.provinces = getDevelopment.provinces.map(x=>x.developmentProvinces); - delete _getDevelopment.developmentActualPeoples; - delete _getDevelopment.developmentPlannedPeoples; - delete _getDevelopment.developmentActualGoals; - delete _getDevelopment.developmentPlannedGoals; + let _getDevelopment: any = { + developmentProjectTypes: getDevelopment.developmentProjectTypes.map((x) => x.name).sort(), + projectModal: getDevelopment.projectModal, + isBackPlanned: getDevelopment.isBackPlanned, + isHoldPlanned: getDevelopment.isHoldPlanned, + projectDayBackPlanned: getDevelopment.projectDayBackPlanned, + projectDayHoldPlanned: getDevelopment.projectDayHoldPlanned, + projectNigthHoldPlanned: getDevelopment.projectNigthHoldPlanned, + developmentProjectTechniquePlanneds: getDevelopment.developmentProjectTechniquePlanneds + .map((x) => x.name) + .sort(), + isBackActual: getDevelopment.isBackActual, + isHoldActual: getDevelopment.isHoldActual, + projectDayBackActual: getDevelopment.projectDayBackActual, + projectDayHoldActual: getDevelopment.projectDayHoldActual, + projectNigthHoldActual: getDevelopment.projectNigthHoldActual, + developmentProjectTechniqueActuals: getDevelopment.developmentProjectTechniqueActuals + .map((x) => x.name) + .sort(), + }; return new HttpSuccess(_getDevelopment); } @@ -971,29 +1096,28 @@ export class DevelopmentController extends Controller { async GetDevelopemtTab4ById(@Path() id: string) { const getDevelopment = await this.developmentRepository.findOne({ where: { id: id }, - relations: [ - "developmentActualPeoples", - "developmentPlannedPeoples", - "developmentActualGoals", - "developmentPlannedGoals", - "developmentPlannedGoals.plannedGoalPositions", - "provinces", - // "provinces.developmentProvinces", - ], + relations: ["developmentEvaluations"], }); if (!getDevelopment) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลโครงการ/หลักสูตรการฝึกอบรมนี้"); } - let _getDevelopment: any = getDevelopment; - _getDevelopment.actualPeoples = getDevelopment.developmentActualPeoples; - _getDevelopment.plannedPeoples = getDevelopment.developmentPlannedPeoples; - _getDevelopment.actualGoals = getDevelopment.developmentActualGoals; - _getDevelopment.plannedGoals = getDevelopment.developmentPlannedGoals; - // _getDevelopment.provinces = getDevelopment.provinces.map(x=>x.developmentProvinces); - delete _getDevelopment.developmentActualPeoples; - delete _getDevelopment.developmentPlannedPeoples; - delete _getDevelopment.developmentActualGoals; - delete _getDevelopment.developmentPlannedGoals; + let _getDevelopment = { + developmentEvaluations: + getDevelopment.developmentEvaluations == null + ? null + : getDevelopment.developmentEvaluations.sort((a, b) => + (a.indicators == null ? "" : a.indicators).localeCompare( + b.indicators == null ? "" : b.indicators, + ), + ), + project: getDevelopment.project, + isPassAllocate: getDevelopment.isPassAllocate, + isPassNoAllocate: getDevelopment.isPassNoAllocate, + isNoPass: getDevelopment.isNoPass, + isBudget: getDevelopment.isBudget, + isOutBudget: getDevelopment.isOutBudget, + }; + return new HttpSuccess(_getDevelopment); } @@ -1008,29 +1132,39 @@ export class DevelopmentController extends Controller { async GetDevelopemtTab5ById(@Path() id: string) { const getDevelopment = await this.developmentRepository.findOne({ where: { id: id }, - relations: [ - "developmentActualPeoples", - "developmentPlannedPeoples", - "developmentActualGoals", - "developmentPlannedGoals", - "developmentPlannedGoals.plannedGoalPositions", - "provinces", - // "provinces.developmentProvinces", - ], + relations: ["developmentAddresss"], }); if (!getDevelopment) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลโครงการ/หลักสูตรการฝึกอบรมนี้"); } - let _getDevelopment: any = getDevelopment; - _getDevelopment.actualPeoples = getDevelopment.developmentActualPeoples; - _getDevelopment.plannedPeoples = getDevelopment.developmentPlannedPeoples; - _getDevelopment.actualGoals = getDevelopment.developmentActualGoals; - _getDevelopment.plannedGoals = getDevelopment.developmentPlannedGoals; - // _getDevelopment.provinces = getDevelopment.provinces.map(x=>x.developmentProvinces); - delete _getDevelopment.developmentActualPeoples; - delete _getDevelopment.developmentPlannedPeoples; - delete _getDevelopment.developmentActualGoals; - delete _getDevelopment.developmentPlannedGoals; + let _getDevelopment = { + dateStart: getDevelopment.dateStart, + dateEnd: getDevelopment.dateEnd, + totalDate: getDevelopment.totalDate, + developmentAddresss: + getDevelopment.developmentAddresss == null + ? null + : getDevelopment.developmentAddresss.sort((a, b) => + (a.address == null ? "" : a.address).localeCompare( + b.address == null ? "" : b.address, + ), + ), + budget: getDevelopment.budget, + budgetSub: getDevelopment.budgetSub, + accept: getDevelopment.accept, + receive: getDevelopment.receive, + approved: getDevelopment.approved, + budgetPay: getDevelopment.budgetPay, + issues: getDevelopment.issues, + chance: getDevelopment.chance, + effects: getDevelopment.effects, + riskLevel: getDevelopment.riskLevel, + riskManagement: getDevelopment.riskManagement, + expect: getDevelopment.expect, + topicAcademic: getDevelopment.topicAcademic, + addressAcademic: getDevelopment.addressAcademic, + provinceActualId: getDevelopment.provinceActualId, + }; return new HttpSuccess(_getDevelopment); } diff --git a/src/controllers/DevelopmentScholarshipController.ts b/src/controllers/DevelopmentScholarshipController.ts index 3ef6c50..f305148 100644 --- a/src/controllers/DevelopmentScholarshipController.ts +++ b/src/controllers/DevelopmentScholarshipController.ts @@ -21,6 +21,7 @@ import { CreateDevelopmentScholarship, DevelopmentScholarship, UpdateDevelopmentScholarship, + UpdateDevelopmentScholarshipUser, } from "../entities/DevelopmentScholarship"; import { PosType } from "../entities/PosType"; import { PosLevel } from "../entities/PosLevel"; @@ -314,10 +315,91 @@ export class DevelopmentScholarshipController extends Controller { totalPeriod: getDevelopment.totalPeriod ? getDevelopment.totalPeriod : null, status: getDevelopment.status ? getDevelopment.status : null, profileId: getDevelopment.profileId ? getDevelopment.profileId : null, + planType: getDevelopment.planType ? getDevelopment.planType : null, + isNoUseBudget: getDevelopment.isNoUseBudget ? getDevelopment.isNoUseBudget : null, }; return new HttpSuccess(formattedData); } + /** + * API รายการทุนของ user + * + * @summary DEV_0 - รายการทุนของ user # + * + * @param {string} profileId profileId ข้าราชการฯที่ได้รับทุนการศึกษา + */ + @Get("user/{profileId}") + async GetDevelopemtScholarshipUserById(@Path() profileId: string) { + const getDevelopment = await this.developmentScholarshipRepository.find({ + where: { profileId: profileId }, + }); + const formattedData = getDevelopment.map((item) => ({ + id: item.id, + scholarshipYear: item.scholarshipYear, + scholarshipType: item.scholarshipType, + fundType: item.fundType, + })); + + return new HttpSuccess(formattedData); + } + + /** + * API รายละเอียดทุนของ user + * + * @summary DEV_0 - รายละเอียดทุนของ user # + * + * @param {string} id id รายการ + */ + @Get("user/detail/{id}") + async GetDevelopemtScholarshipUserDetailById(@Path() id: string) { + const getDevelopment = await this.developmentScholarshipRepository.findOne({ + where: { id: id }, + select: [ + "id", + "scholarshipYear", + "scholarshipType", + "fundType", + "governmentDate", + "isGraduated", + "graduatedDate", + "isNoGraduated", + "graduatedReason", + ], + }); + if (!getDevelopment) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลทุนการศึกษา/ฝึกอบรมนี้"); + } + + return new HttpSuccess(getDevelopment); + } + + /** + * API แก้ไขรายการทุนของ user + * + * @summary DEV_015 - แก้ไขรายการทุนของ user #15 + * + * @param {string} id รายการ + */ + @Put("user/detail/{id}") + async UpdateDevelopemtScholarshipUserById( + @Path() id: string, + @Body() requestBody: UpdateDevelopmentScholarshipUser, + @Request() request: { user: Record }, + ) { + const getDevelopment = await this.developmentScholarshipRepository.findOne({ + where: { id: id }, + }); + if (!getDevelopment) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลทุนการศึกษา/ฝึกอบรมนี้"); + } + Object.assign(getDevelopment, requestBody); + getDevelopment.lastUpdateUserId = request.user.sub; + getDevelopment.lastUpdateFullName = request.user.name; + await this.developmentScholarshipRepository.save(getDevelopment); + + return new HttpSuccess(getDevelopment.id); + } + /** * API เปลี่ยนสถานะ * @@ -340,6 +422,8 @@ export class DevelopmentScholarshipController extends Controller { } const _status = status.trim().toUpperCase(); getDevelopment.status = _status; + getDevelopment.lastUpdateUserId = request.user.sub; + getDevelopment.lastUpdateFullName = request.user.name; if (_status == "GRADUATE") { if (getDevelopment.scholarshipType != null) { switch (getDevelopment.scholarshipType.trim().toUpperCase()) { diff --git a/src/entities/Development.ts b/src/entities/Development.ts index bae93d3..3c1a34e 100644 --- a/src/entities/Development.ts +++ b/src/entities/Development.ts @@ -7,9 +7,10 @@ import { ActualGoal, CreateActualGoal } from "./ActualGoal"; import { CreatePlannedGoal, PlannedGoal } from "./PlannedGoal"; import { DevelopmentHistory } from "./DevelopmentHistory"; import { DevelopmentProjectType } from "./DevelopmentProjectType"; -import { DevelopmentProjectTechnique } from "./DevelopmentProjectTechnique"; +import { DevelopmentProjectTechniquePlanned } from "./DevelopmentProjectTechniquePlanned"; import { CreateDevelopmentEvaluation, DevelopmentEvaluation } from "./DevelopmentEvaluation"; import { CreateDevelopmentAddress, DevelopmentAddress } from "./DevelopmentAddress"; +import { DevelopmentProjectTechniqueActual } from "./DevelopmentProjectTechniqueActual"; @Entity("development") export class Development extends EntityBase { @@ -141,11 +142,18 @@ export class Development extends EntityBase { projectNigthHoldActual: number; @OneToMany( - () => DevelopmentProjectTechnique, - (developmentProjectTechnique: DevelopmentProjectTechnique) => - developmentProjectTechnique.development, + () => DevelopmentProjectTechniquePlanned, + (developmentProjectTechniquePlanned: DevelopmentProjectTechniquePlanned) => + developmentProjectTechniquePlanned.development, ) - developmentProjectTechniques: DevelopmentProjectTechnique[]; + developmentProjectTechniquePlanneds: DevelopmentProjectTechniquePlanned[]; + + @OneToMany( + () => DevelopmentProjectTechniqueActual, + (developmentProjectTechniqueActual: DevelopmentProjectTechniqueActual) => + developmentProjectTechniqueActual.development, + ) + developmentProjectTechniqueActuals: DevelopmentProjectTechniqueActual[]; @Column({ nullable: true, @@ -400,6 +408,8 @@ export class UpdateDevelopment3 { @Column() developmentProjectTypes?: string[]; @Column() + projectModal?: number | null; + @Column() isBackPlanned?: boolean | null; @Column() isHoldPlanned?: boolean | null; @@ -410,6 +420,8 @@ export class UpdateDevelopment3 { @Column() projectNigthHoldPlanned?: number | null; @Column() + developmentProjectTechniquePlanneds?: string[]; + @Column() isBackActual?: boolean | null; @Column() isHoldActual?: boolean | null; @@ -420,13 +432,11 @@ export class UpdateDevelopment3 { @Column() projectNigthHoldActual?: number | null; @Column() - developmentProjectTechniques?: string[]; - @Column() - projectModal?: number | null; + developmentProjectTechniqueActuals?: string[]; } export class UpdateDevelopment4 { - @Column() - developmentEvaluations: CreateDevelopmentEvaluation[]; + // @Column() + // developmentEvaluations: CreateDevelopmentEvaluation[]; @Column() project: string | null; @Column() @@ -479,8 +489,4 @@ export class UpdateDevelopment5 { addressAcademic: string | null; @Column() provinceActualId: string | null; - @Column() - dateStudyStart: Date | null; - @Column() - dateStudyEnd: Date | null; } diff --git a/src/entities/DevelopmentProjectTechnique.ts b/src/entities/DevelopmentProjectTechniqueActual.ts similarity index 86% rename from src/entities/DevelopmentProjectTechnique.ts rename to src/entities/DevelopmentProjectTechniqueActual.ts index 2d3ac30..a437e00 100644 --- a/src/entities/DevelopmentProjectTechnique.ts +++ b/src/entities/DevelopmentProjectTechniqueActual.ts @@ -2,8 +2,8 @@ import { Entity, Column, ManyToOne, JoinColumn } from "typeorm"; import { EntityBase } from "./base/Base"; import { Development } from "./Development"; -@Entity("developmentProjectTechnique") -export class DevelopmentProjectTechnique extends EntityBase { +@Entity("developmentProjectTechniqueActual") +export class DevelopmentProjectTechniqueActual extends EntityBase { @Column({ // TRAINING = การอบรม // MEETING = การประชุม @@ -28,12 +28,12 @@ export class DevelopmentProjectTechnique extends EntityBase { @ManyToOne( () => Development, - (development: Development) => development.developmentProjectTechniques, + (development: Development) => development.developmentProjectTechniqueActuals, ) @JoinColumn({ name: "developmentId" }) development: Development; } -export class CreateDevelopmentProjectTechnique { +export class CreateDevelopmentProjectTechniqueActual { @Column() name: number; } diff --git a/src/entities/DevelopmentProjectTechniquePlanned.ts b/src/entities/DevelopmentProjectTechniquePlanned.ts new file mode 100644 index 0000000..bb8d3dc --- /dev/null +++ b/src/entities/DevelopmentProjectTechniquePlanned.ts @@ -0,0 +1,39 @@ +import { Entity, Column, ManyToOne, JoinColumn } from "typeorm"; +import { EntityBase } from "./base/Base"; +import { Development } from "./Development"; + +@Entity("developmentProjectTechniquePlanned") +export class DevelopmentProjectTechniquePlanned extends EntityBase { + @Column({ + // TRAINING = การอบรม + // MEETING = การประชุม + // SEMINAR = การสัมมนา + // STUDY_TOUR = การศึกษาดูงาน + // ACADEMIC_SEMINAR = การสัมมนาทางวิชาการ + // WORKSHOP = การสัมมนาเชิงปฏิบัติการ + // SPECIAL_LECTURE = การบรรยายพิเศษ + // STUDY_TRAINING = การฝึกศึกษา + nullable: true, + comment: "เทคนิควิธีการที่ใช้ในการพัฒนา", + default: null, + }) + name: string; + + @Column({ + nullable: true, + comment: "โครงการ/หลักสูตรการฝึกอบรม", + default: null, + }) + developmentId: string; + + @ManyToOne( + () => Development, + (development: Development) => development.developmentProjectTechniquePlanneds, + ) + @JoinColumn({ name: "developmentId" }) + development: Development; +} +export class CreateDevelopmentProjectTechniquePlanned { + @Column() + name: number; +} diff --git a/src/entities/DevelopmentScholarship.ts b/src/entities/DevelopmentScholarship.ts index fa3e020..1c850af 100644 --- a/src/entities/DevelopmentScholarship.ts +++ b/src/entities/DevelopmentScholarship.ts @@ -429,6 +429,57 @@ export class DevelopmentScholarship extends EntityBase { default: null, }) totalPeriod: string; + + @Column({ + // ในแผนฯ (INPLAN) + // นอกแผนฯ (OUTPLAN) + nullable: true, + comment: "ในแผนฯ", + length: 40, + default: null, + }) + planType: string; + + @Column({ + comment: "ไม่ใช้งบประมาณ", + default: false, + }) + isNoUseBudget: boolean; + + @Column({ + nullable: true, + type: "datetime", + comment: "กลับเข้ารับราชการตั้งแต่", + default: null, + }) + governmentDate: Date; + + @Column({ + comment: "สำเร็จการศึกษาตามที่หลักสูตรกำหนด", + default: false, + }) + isGraduated: boolean; + + @Column({ + nullable: true, + type: "datetime", + comment: "ตั้งแต่", + default: null, + }) + graduatedDate: Date; + + @Column({ + comment: "เสร็จสิ้นการศึกษาตามที่หลักสูตรกำหนดแล้วแต่ยังไม่สำเร็จการศึกษา", + default: false, + }) + isNoGraduated: boolean; + + @Column({ + nullable: true, + comment: "เนื่องจาก", + default: null, + }) + graduatedReason: string; } export class CreateDevelopmentScholarship { profileId: string | null; @@ -481,6 +532,8 @@ export class CreateDevelopmentScholarship { studyAbroadStartDate: Date | null; studyAbroadEndDate: Date | null; totalPeriod: string | null; + planType: string | null; + isNoUseBudget: boolean | null; } export class UpdateDevelopmentScholarship { @@ -534,4 +587,14 @@ export class UpdateDevelopmentScholarship { studyAbroadStartDate: Date | null; studyAbroadEndDate: Date | null; totalPeriod: string | null; + planType: string | null; + isNoUseBudget: boolean | null; +} + +export class UpdateDevelopmentScholarshipUser { + governmentDate: Date | null; + isGraduated: boolean | null; + graduatedDate: Date | null; + isNoGraduated: boolean | null; + graduatedReason: string | null; } diff --git a/src/migration/1712815316667-add_table_starty1.ts b/src/migration/1712815316667-add_table_starty1.ts new file mode 100644 index 0000000..3a5d95f --- /dev/null +++ b/src/migration/1712815316667-add_table_starty1.ts @@ -0,0 +1,20 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class AddTableStarty11712815316667 implements MigrationInterface { + name = 'AddTableStarty11712815316667' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TABLE \`developmentProjectTechniquePlanned\` (\`id\` varchar(36) NOT NULL, \`createdAt\` datetime(6) NOT NULL COMMENT 'สร้างข้อมูลเมื่อ' DEFAULT CURRENT_TIMESTAMP(6), \`createdUserId\` varchar(40) NOT NULL COMMENT 'User Id ที่สร้างข้อมูล' DEFAULT '00000000-0000-0000-0000-000000000000', \`lastUpdatedAt\` datetime(6) NOT NULL COMMENT 'แก้ไขข้อมูลล่าสุดเมื่อ' DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), \`lastUpdateUserId\` varchar(40) NOT NULL COMMENT 'User Id ที่แก้ไขข้อมูล' DEFAULT '00000000-0000-0000-0000-000000000000', \`createdFullName\` varchar(200) NOT NULL COMMENT 'ชื่อ User ที่สร้างข้อมูล' DEFAULT 'string', \`lastUpdateFullName\` varchar(200) NOT NULL COMMENT 'ชื่อ User ที่แก้ไขข้อมูลล่าสุด' DEFAULT 'string', \`name\` varchar(255) NULL COMMENT 'เทคนิควิธีการที่ใช้ในการพัฒนา', \`developmentId\` varchar(255) NULL COMMENT 'โครงการ/หลักสูตรการฝึกอบรม', PRIMARY KEY (\`id\`)) ENGINE=InnoDB`); + await queryRunner.query(`CREATE TABLE \`developmentProjectTechniqueActual\` (\`id\` varchar(36) NOT NULL, \`createdAt\` datetime(6) NOT NULL COMMENT 'สร้างข้อมูลเมื่อ' DEFAULT CURRENT_TIMESTAMP(6), \`createdUserId\` varchar(40) NOT NULL COMMENT 'User Id ที่สร้างข้อมูล' DEFAULT '00000000-0000-0000-0000-000000000000', \`lastUpdatedAt\` datetime(6) NOT NULL COMMENT 'แก้ไขข้อมูลล่าสุดเมื่อ' DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), \`lastUpdateUserId\` varchar(40) NOT NULL COMMENT 'User Id ที่แก้ไขข้อมูล' DEFAULT '00000000-0000-0000-0000-000000000000', \`createdFullName\` varchar(200) NOT NULL COMMENT 'ชื่อ User ที่สร้างข้อมูล' DEFAULT 'string', \`lastUpdateFullName\` varchar(200) NOT NULL COMMENT 'ชื่อ User ที่แก้ไขข้อมูลล่าสุด' DEFAULT 'string', \`name\` varchar(255) NULL COMMENT 'เทคนิควิธีการที่ใช้ในการพัฒนา', \`developmentId\` varchar(255) NULL COMMENT 'โครงการ/หลักสูตรการฝึกอบรม', PRIMARY KEY (\`id\`)) ENGINE=InnoDB`); + await queryRunner.query(`ALTER TABLE \`developmentProjectTechniquePlanned\` ADD CONSTRAINT \`FK_7166cc94112552ea072a2cc6134\` FOREIGN KEY (\`developmentId\`) REFERENCES \`development\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE \`developmentProjectTechniqueActual\` ADD CONSTRAINT \`FK_aaaee1c5fb44bef093ed78a0c32\` FOREIGN KEY (\`developmentId\`) REFERENCES \`development\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`developmentProjectTechniqueActual\` DROP FOREIGN KEY \`FK_aaaee1c5fb44bef093ed78a0c32\``); + await queryRunner.query(`ALTER TABLE \`developmentProjectTechniquePlanned\` DROP FOREIGN KEY \`FK_7166cc94112552ea072a2cc6134\``); + await queryRunner.query(`DROP TABLE \`developmentProjectTechniqueActual\``); + await queryRunner.query(`DROP TABLE \`developmentProjectTechniquePlanned\``); + } + +} diff --git a/src/migration/1712824449740-update_table_developmentScholarship_add_planType.ts b/src/migration/1712824449740-update_table_developmentScholarship_add_planType.ts new file mode 100644 index 0000000..e9bce7e --- /dev/null +++ b/src/migration/1712824449740-update_table_developmentScholarship_add_planType.ts @@ -0,0 +1,26 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class UpdateTableDevelopmentScholarshipAddPlanType1712824449740 implements MigrationInterface { + name = 'UpdateTableDevelopmentScholarshipAddPlanType1712824449740' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`developmentScholarship\` ADD \`planType\` varchar(40) NULL COMMENT 'ในแผนฯ'`); + await queryRunner.query(`ALTER TABLE \`developmentScholarship\` ADD \`isNoUseBudget\` tinyint NOT NULL COMMENT 'ไม่ใช้งบประมาณ' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`developmentScholarship\` ADD \`governmentDate\` datetime NULL COMMENT 'กลับเข้ารับราชการตั้งแต่'`); + await queryRunner.query(`ALTER TABLE \`developmentScholarship\` ADD \`isGraduated\` tinyint NOT NULL COMMENT 'สำเร็จการศึกษาตามที่หลักสูตรกำหนด' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`developmentScholarship\` ADD \`graduatedDate\` datetime NULL COMMENT 'ตั้งแต่'`); + await queryRunner.query(`ALTER TABLE \`developmentScholarship\` ADD \`isNoGraduated\` tinyint NOT NULL COMMENT 'เสร็จสิ้นการศึกษาตามที่หลักสูตรกำหนดแล้วแต่ยังไม่สำเร็จการศึกษา' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`developmentScholarship\` ADD \`graduatedReason\` varchar(255) NULL COMMENT 'เนื่องจาก'`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`developmentScholarship\` DROP COLUMN \`graduatedReason\``); + await queryRunner.query(`ALTER TABLE \`developmentScholarship\` DROP COLUMN \`isNoGraduated\``); + await queryRunner.query(`ALTER TABLE \`developmentScholarship\` DROP COLUMN \`graduatedDate\``); + await queryRunner.query(`ALTER TABLE \`developmentScholarship\` DROP COLUMN \`isGraduated\``); + await queryRunner.query(`ALTER TABLE \`developmentScholarship\` DROP COLUMN \`governmentDate\``); + await queryRunner.query(`ALTER TABLE \`developmentScholarship\` DROP COLUMN \`isNoUseBudget\``); + await queryRunner.query(`ALTER TABLE \`developmentScholarship\` DROP COLUMN \`planType\``); + } + +}