diff --git a/.onedev-buildspec.yml b/.onedev-buildspec.yml new file mode 100644 index 0000000..0eef9fb --- /dev/null +++ b/.onedev-buildspec.yml @@ -0,0 +1,102 @@ +version: 37 +jobs: +- name: CI for UAT + steps: + - !CheckoutStep + name: checkout code + cloneCredential: !DefaultCredential {} + withLfs: false + withSubmodules: false + condition: ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL + - !GenerateChecksumStep + name: generate package checksum + files: package-lock.json yarn.lock + targetFile: checksum + condition: ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL + - !SetupCacheStep + name: set up npm cache + key: node_modules_@file:checksum@ + loadKeys: + - node_modules + paths: + - node_modules + uploadStrategy: UPLOAD_IF_NOT_HIT + condition: ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL + - !SetBuildVersionStep + name: set build version + buildVersion: '@tag@' + condition: ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL + - !CommandStep + name: build & test + runInContainer: true + image: node + interpreter: !DefaultInterpreter + commands: | + npm install + npm run build + useTTY: true + condition: ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL + - !BuildImageStep + name: build docker image + dockerfile: ./docker/Dockerfile + output: !RegistryOutput + tags: hrms-git.chin.in.th/bma-hrms/hrms-api-dev:@build_version@ hrms-git.chin.in.th/bma-hrms/hrms-api-dev:latest + condition: ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL + triggers: + - !TagCreateTrigger + tags: uat-* + branches: main + retryCondition: never + maxRetries: 3 + retryDelay: 30 + timeout: 14400 +- name: CI for PROD + steps: + - !CheckoutStep + name: checkout code + cloneCredential: !DefaultCredential {} + withLfs: false + withSubmodules: false + condition: ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL + - !GenerateChecksumStep + name: generate package checksum + files: package-lock.json yarn.lock + targetFile: checksum + condition: ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL + - !SetupCacheStep + name: set up npm cache + key: node_modules_@file:checksum@ + loadKeys: + - node_modules + paths: + - node_modules + uploadStrategy: UPLOAD_IF_NOT_HIT + condition: ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL + - !SetBuildVersionStep + name: set build version + buildVersion: '@tag@' + condition: ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL + - !CommandStep + name: build & test + runInContainer: true + image: node + interpreter: !DefaultInterpreter + commands: | + npm install + npm run build + useTTY: true + condition: ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL + - !BuildImageStep + name: build docker image + dockerfile: ./docker/Dockerfile + output: !RegistryOutput + tags: hrms-git.bangkok.go.th/bma-hrms/hrms-api-dev:@build_version@ hrms-git.bangkok.go.th/bma-hrms/hrms-api-dev:latest + condition: ALL_PREVIOUS_STEPS_WERE_SUCCESSFUL + triggers: + - !TagCreateTrigger + tags: prod-* + branches: main + retryCondition: never + maxRetries: 3 + retryDelay: 30 + timeout: 14400 diff --git a/src/controllers/DevelopmentController.ts b/src/controllers/DevelopmentController.ts index f2b456a..454a843 100644 --- a/src/controllers/DevelopmentController.ts +++ b/src/controllers/DevelopmentController.ts @@ -32,7 +32,6 @@ import { ActualPeople, CreateActualPeople } from "../entities/ActualPeople"; import { CreatePlannedPeople, PlannedPeople } from "../entities/PlannedPeople"; import { ActualGoal, CreateActualGoal } from "../entities/ActualGoal"; import { CreatePlannedGoal, PlannedGoal } from "../entities/PlannedGoal"; -import { Province } from "../entities/Province"; import { PosType } from "../entities/PosType"; import { PosLevel } from "../entities/PosLevel"; import { PlannedGoalPosition } from "../entities/PlannedGoalPosition"; @@ -83,7 +82,6 @@ export class DevelopmentController extends Controller { private actualGoalRepository = AppDataSource.getRepository(ActualGoal); private plannedGoalRepository = AppDataSource.getRepository(PlannedGoal); private plannedGoalPositionRepository = AppDataSource.getRepository(PlannedGoalPosition); - private provinceRepository = AppDataSource.getRepository(Province); private posTypeRepository = AppDataSource.getRepository(PosType); private posLevelRepository = AppDataSource.getRepository(PosLevel); private strategyChild1Repository = AppDataSource.getRepository(StrategyChild1); @@ -1224,19 +1222,14 @@ export class DevelopmentController extends Controller { // const before = structuredClone(development); await Promise.all( requestBody.developmentAddresss.map(async (x) => { - let _null: any = null; const data = Object.assign(new DevelopmentAddress(), x); - if (x.provinceId != null) { - const chkProvince = await this.provinceRepository.findOne({ - where: { - id: x.provinceId, - }, - }); - if (chkProvince == null) { - data.provinceId = _null; - } - } if (x.address) { + await new CallAPI() + .GetData(request, `/org/metadata/province/${x.provinceId}`) + .then(async (item) => { + data.provinceName = item.name; + }) + .catch(async (x) => {}); data.developmentId = development.id; data.createdUserId = request.user.sub; data.createdFullName = request.user.name; @@ -1433,16 +1426,14 @@ export class DevelopmentController extends Controller { if (!development) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลโครงการ/หลักสูตรการฝึกอบรมนี้"); } - if (requestBody.provinceActualId != null) { - const checkId = await this.provinceRepository.findOne({ - where: { id: requestBody.provinceActualId }, - }); - if (!checkId) { - throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลจังหวัดข้อมูลด้านวิชาการ"); - } - } const before = structuredClone(development); const data = Object.assign(new DevelopmentOther(), requestBody); + await new CallAPI() + .GetData(request, `/org/metadata/province/${requestBody.provinceActualId}`) + .then(async (item) => { + data.provinceActualName = item.name; + }) + .catch(async (x) => {}); data.createdUserId = request.user.sub; data.createdFullName = request.user.name; data.lastUpdateUserId = request.user.sub; @@ -1496,6 +1487,12 @@ export class DevelopmentController extends Controller { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลความเสี่ยงของโครงการ"); } Object.assign(development, requestBody); + await new CallAPI() + .GetData(request, `/org/metadata/province/${requestBody.provinceActualId}`) + .then(async (item) => { + development.provinceActualName = item.name; + }) + .catch(async (x) => {}); development.lastUpdateUserId = request.user.sub; development.lastUpdateFullName = request.user.name; development.lastUpdatedAt = new Date(); @@ -1944,7 +1941,7 @@ export class DevelopmentController extends Controller { }) .andWhere( keyword != undefined - ? new Brackets ((qb) => { + ? new Brackets((qb) => { qb.where("development.projectName LIKE :keyword") .orWhere("development.root LIKE :keyword") .orWhere("development.child1 LIKE :keyword") @@ -2554,9 +2551,9 @@ export class DevelopmentController extends Controller { reasonDevelopment70: x.development.reasonActual70, reasonDevelopment20: x.development.reasonActual20, reasonDevelopment10: x.development.reasonActual10, - isDevelopment70: false, - isDevelopment20: false, - isDevelopment10: false, + isDevelopment70: x.development.isReasonActual70, + isDevelopment20: x.development.isReasonActual20, + isDevelopment10: x.development.isReasonActual10, developmentTarget: null, developmentResults: null, developmentReport: null, @@ -2610,7 +2607,7 @@ export class DevelopmentController extends Controller { async developmentDetail( @Path() developmentId: string, @Path() type: string, - @Request() request: RequestWithUser + @Request() request: RequestWithUser, ) { const getDevelopment = await this.developmentRepository.findOne({ where: { id: developmentId }, @@ -2625,13 +2622,17 @@ export class DevelopmentController extends Controller { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลโครงการ/หลักสูตรการฝึกอบรมนี้"); if (type.trim().toLocaleUpperCase() == "OFFICER") { - let _workflow = await new permission().Workflow(request, developmentId, "SYS_REGISTRY_OFFICER"); + let _workflow = await new permission().Workflow( + request, + developmentId, + "SYS_REGISTRY_OFFICER", + ); if (_workflow == false) await new permission().PermissionGet(request, "SYS_REGISTRY_OFFICER"); } else if (type.trim().toLocaleUpperCase() == "USER") { } else { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่สามารถเข้าถึงข้อมูลนี้ได้"); } - + let _getDevelopment: any = { id: getDevelopment.id, evaluationId: null, @@ -2651,7 +2652,7 @@ export class DevelopmentController extends Controller { selectType: "PROJECT", selectTypeYear: getDevelopment.year, selectTypeId: null, - developmentProjects : getDevelopment.developmentProjectTechniqueActuals + developmentProjects: getDevelopment.developmentProjectTechniqueActuals .map((x) => x.name) .sort(), }; @@ -2698,11 +2699,12 @@ export class DevelopmentController extends Controller { if (oldProfile.isDone == true) return; } if (item["ประเภท"] == undefined) return; + let development = Object.assign(new DevelopmentHistory(), oldProfile); if (item["ประเภท"] == "ข้าราชการกรุงเทพมหานครสามัญ" || item["ประเภท"] == "ขรก.กทม. สามัญ") { await new CallAPI() .GetData(request, `/org/unauthorize/officer/citizen/${item["รหัสประจำตัวประชาชน"]}`) .then(async (x: any) => { - let development = Object.assign(new DevelopmentHistory(), x); + development = Object.assign(development, x); development.dateStart = item["วันที่เริ่มต้น"] == undefined ? null : item["วันที่เริ่มต้น"]; development.dateEnd = @@ -2738,7 +2740,6 @@ export class DevelopmentController extends Controller { setLogDataDiff(request, { before, after: development }); }) .catch(async (x) => { - let development = new DevelopmentHistory(); let _null: any = null; development.prefix = item["คำนำหน้า"] == undefined ? null : item["คำนำหน้า"]; development.firstName = item["ชื่อ"] == undefined ? null : item["ชื่อ"]; @@ -2784,12 +2785,9 @@ export class DevelopmentController extends Controller { }); } else if (item["ประเภท"] == "ลูกจ้างประจำ") { await new CallAPI() - .GetData( - request, - `/org/unauthorize/employee-prem/citizen/${item["รหัสประจำตัวประชาชน"]}`, - ) + .GetData(request, `/org/unauthorize/employee/citizen/${item["รหัสประจำตัวประชาชน"]}`) .then(async (x: any) => { - let development = Object.assign(new DevelopmentHistory(), x); + development = Object.assign(development, x); development.dateStart = item["วันที่เริ่มต้น"] == undefined ? null : item["วันที่เริ่มต้น"]; development.dateEnd = @@ -2825,7 +2823,6 @@ export class DevelopmentController extends Controller { setLogDataDiff(request, { before, after: development }); }) .catch(async (x) => { - let development = new DevelopmentHistory(); let _null: any = null; development.prefix = item["คำนำหน้า"] == undefined ? null : item["คำนำหน้า"]; development.firstName = item["ชื่อ"] == undefined ? null : item["ชื่อ"]; diff --git a/src/controllers/DevelopmentEmployeeHistoryController.ts b/src/controllers/DevelopmentEmployeeHistoryController.ts index 3d152ea..2b8054f 100644 --- a/src/controllers/DevelopmentEmployeeHistoryController.ts +++ b/src/controllers/DevelopmentEmployeeHistoryController.ts @@ -360,18 +360,17 @@ export class DevelopmentEmployeeHistoryController extends Controller { relations: [ "development", "development.developmentOthers", - "development.developmentOthers.province", "employeePosLevel", "employeePosType", ], where: { id: id, type: type }, order: { - development:{ + development: { developmentOthers: { - createdAt: "ASC" - } - } - } + createdAt: "ASC", + }, + }, + }, }); if (!getDevelopment) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลประวัติการฝึกอบรม/ดูงานนี้"); @@ -416,7 +415,7 @@ export class DevelopmentEmployeeHistoryController extends Controller { ? getDevelopment.development.developmentOthers.map((dev) => ({ topicAcademic: dev.topicAcademic, addressAcademic: dev.addressAcademic, - province: dev.province.name + province: dev.provinceActualName, })) : [], }; diff --git a/src/controllers/DevelopmentHistoryController.ts b/src/controllers/DevelopmentHistoryController.ts index dec3501..e546a0c 100644 --- a/src/controllers/DevelopmentHistoryController.ts +++ b/src/controllers/DevelopmentHistoryController.ts @@ -27,7 +27,6 @@ import { PosLevel } from "../entities/PosLevel"; import { RequestWithUser } from "../middlewares/user"; import { setLogDataDiff } from "../interfaces/utils"; import permission from "../interfaces/permission"; -import { Province } from "../entities/Province"; @Route("api/v1/development/history/officer") @Tags("DevelopmentOfficerHistory") @@ -352,13 +351,7 @@ export class DevelopmentOfficerHistoryController extends Controller { await new permission().PermissionGet(request, "SYS_DEV_HISTORY_OFFICER"); const type = "OFFICER"; const getDevelopment = await this.developmentHistoryRepository.findOne({ - relations: [ - "development", - "development.developmentOthers", - "development.developmentOthers.province", - "posLevel", - "posType", - ], + relations: ["development", "development.developmentOthers", "posLevel", "posType"], where: { id: id, type: type }, order: { development: { @@ -408,7 +401,7 @@ export class DevelopmentOfficerHistoryController extends Controller { ? getDevelopment.development.developmentOthers.map((dev) => ({ topicAcademic: dev.topicAcademic, addressAcademic: dev.addressAcademic, - province: dev.province.name, + province: dev.provinceActualName, })) : [], }; diff --git a/src/entities/Development.ts b/src/entities/Development.ts index b807734..cd4b339 100644 --- a/src/entities/Development.ts +++ b/src/entities/Development.ts @@ -1,6 +1,5 @@ import { Entity, Column, ManyToOne, JoinColumn, OneToMany, Double } from "typeorm"; import { EntityBase } from "./base/Base"; -import { Province } from "./Province"; import { ActualPeople, CreateActualPeople } from "./ActualPeople"; import { CreatePlannedPeople, PlannedPeople } from "./PlannedPeople"; import { ActualGoal, CreateActualGoal } from "./ActualGoal"; @@ -566,10 +565,6 @@ export class Development extends EntityBase { }) provinceActualId: string; - @ManyToOne(() => Province, (province: Province) => province.developmentActuals) - @JoinColumn({ name: "provinceActualId" }) - provinceActual: Province; - @Column({ nullable: true, type: "datetime", diff --git a/src/entities/DevelopmentAddress.ts b/src/entities/DevelopmentAddress.ts index 37be847..1629293 100644 --- a/src/entities/DevelopmentAddress.ts +++ b/src/entities/DevelopmentAddress.ts @@ -1,7 +1,6 @@ import { Entity, Column, ManyToOne, JoinColumn } from "typeorm"; import { EntityBase } from "./base/Base"; import { Development } from "./Development"; -import { Province } from "./Province"; @Entity("developmentAddress") export class DevelopmentAddress extends EntityBase { @@ -19,9 +18,12 @@ export class DevelopmentAddress extends EntityBase { }) provinceId: string; - @ManyToOne(() => Province, (province: Province) => province.developmentAddresss) - @JoinColumn({ name: "provinceId" }) - province: Province; + @Column({ + nullable: true, + comment: "โครงการ/หลักสูตรการฝึกอบรม", + default: null, + }) + provinceName: string; @Column({ nullable: true, diff --git a/src/entities/DevelopmentOther.ts b/src/entities/DevelopmentOther.ts index 7cf0da1..98e145a 100644 --- a/src/entities/DevelopmentOther.ts +++ b/src/entities/DevelopmentOther.ts @@ -1,7 +1,6 @@ import { Entity, Column, ManyToOne, JoinColumn } from "typeorm"; import { EntityBase } from "./base/Base"; import { Development } from "./Development"; -import { Province } from "./Province"; @Entity("developmentOther") export class DevelopmentOther extends EntityBase { @@ -26,6 +25,13 @@ export class DevelopmentOther extends EntityBase { }) provinceActualId: string; + @Column({ + nullable: true, + comment: "จังหวัด(ข้อมูลวิชาการ)", + default: null, + }) + provinceActualName: string; + @Column({ nullable: true, comment: "คีย์นอก(FK)ของตาราง development", @@ -36,10 +42,6 @@ export class DevelopmentOther extends EntityBase { @ManyToOne(() => Development, (development: Development) => development.developmentOthers) @JoinColumn({ name: "developmentId" }) development: Development; - - @ManyToOne(() => Province, (province: Province) => province.developmentOthers) - @JoinColumn({ name: "provinceActualId" }) - province: Province; } export class UpdateDevelopmentOther { diff --git a/src/entities/DevelopmentRisk.ts b/src/entities/DevelopmentRisk.ts index e12c614..b146cba 100644 --- a/src/entities/DevelopmentRisk.ts +++ b/src/entities/DevelopmentRisk.ts @@ -1,7 +1,6 @@ import { Entity, Column, ManyToOne, JoinColumn } from "typeorm"; import { EntityBase } from "./base/Base"; import { Development } from "./Development"; -import { Province } from "./Province"; @Entity("developmentRisk") export class DevelopmentRisk extends EntityBase { @@ -47,9 +46,9 @@ export class DevelopmentRisk extends EntityBase { }) developmentId: string; - @ManyToOne(() => Development, (development: Development) => development.developmentRisks) - @JoinColumn({ name: "developmentId" }) - development: Development; + @ManyToOne(() => Development, (development: Development) => development.developmentRisks) + @JoinColumn({ name: "developmentId" }) + development: Development; } export class UpdateDevelopmentRisk { diff --git a/src/entities/Province.ts b/src/entities/Province.ts index f697b97..080a8c6 100644 --- a/src/entities/Province.ts +++ b/src/entities/Province.ts @@ -13,18 +13,6 @@ export class Province extends EntityBase { default: null, }) name: string; - - @OneToMany( - () => DevelopmentAddress, - (developmentAddress: DevelopmentAddress) => developmentAddress.province, - ) - developmentAddresss: DevelopmentAddress[]; - - @OneToMany(() => Development, (development: Development) => development.provinceActual) - developmentActuals: Development[]; - - @OneToMany(() => DevelopmentOther, (developmentOther: DevelopmentOther) => developmentOther.province) - developmentOthers: Development[]; } export class CreateProvince { diff --git a/src/migration/1737111015155-update_delete_dev_provincename.ts b/src/migration/1737111015155-update_delete_dev_provincename.ts new file mode 100644 index 0000000..9f0b4e5 --- /dev/null +++ b/src/migration/1737111015155-update_delete_dev_provincename.ts @@ -0,0 +1,22 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class UpdateDeleteDevProvincename1737111015155 implements MigrationInterface { + name = 'UpdateDeleteDevProvincename1737111015155' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`developmentAddress\` DROP FOREIGN KEY \`FK_e2721b3f440256b56ce83a04fb2\``); + await queryRunner.query(`ALTER TABLE \`developmentOther\` DROP FOREIGN KEY \`FK_47bbbecaea9b7b31d2536054656\``); + await queryRunner.query(`ALTER TABLE \`development\` DROP FOREIGN KEY \`FK_bdafbb824b88c3bdb73adf7f220\``); + await queryRunner.query(`ALTER TABLE \`developmentAddress\` ADD \`provinceName\` varchar(255) NULL COMMENT 'โครงการ/หลักสูตรการฝึกอบรม'`); + await queryRunner.query(`ALTER TABLE \`developmentOther\` ADD \`provinceActualName\` varchar(255) NULL COMMENT 'จังหวัด(ข้อมูลวิชาการ)'`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`developmentOther\` DROP COLUMN \`provinceActualName\``); + await queryRunner.query(`ALTER TABLE \`developmentAddress\` DROP COLUMN \`provinceName\``); + await queryRunner.query(`ALTER TABLE \`development\` ADD CONSTRAINT \`FK_bdafbb824b88c3bdb73adf7f220\` FOREIGN KEY (\`provinceActualId\`) REFERENCES \`province\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE \`developmentOther\` ADD CONSTRAINT \`FK_47bbbecaea9b7b31d2536054656\` FOREIGN KEY (\`provinceActualId\`) REFERENCES \`province\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE \`developmentAddress\` ADD CONSTRAINT \`FK_e2721b3f440256b56ce83a04fb2\` FOREIGN KEY (\`provinceId\`) REFERENCES \`province\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + } + +}