Compare commits

...

10 commits
v1.0.2 ... dev

Author SHA1 Message Date
harid
932a283d7c Merge branch 'develop' into dev
All checks were successful
Build & Deploy on Dev / build (push) Successful in 57s
2026-07-03 17:00:57 +07:00
harid
89ffb6bfe7 fix 2026-07-03 17:00:30 +07:00
harid
ddbfc3e25e Merge branch 'develop' into dev
All checks were successful
Build & Deploy on Dev / build (push) Successful in 55s
2026-06-29 14:31:57 +07:00
harid
c9a682f502 Linear Flow Salary #224 2026-06-29 14:31:27 +07:00
5727c79cc2 Merge branch 'develop' into dev
All checks were successful
Build & Deploy on Dev / build (push) Successful in 1m1s
2026-04-08 15:14:05 +07:00
2bcd7506a4 ตัดชื่อไฟล์ยาวเกิน #2397 2026-04-08 15:13:29 +07:00
adisak
31c16befa7 Merge branch 'develop' into dev
All checks were successful
Build & Deploy on Dev / build (push) Successful in 1m2s
2026-04-07 18:12:52 +07:00
adisak
e6779f8ec7 2365 ชั่วคราว 2026-04-07 18:12:34 +07:00
adisak
ce4a8aa94a Merge branch 'develop' into dev
All checks were successful
Build & Deploy on Dev / build (push) Successful in 1m7s
2026-04-07 17:44:12 +07:00
adisak
e4e7edff3a #2365 2026-04-07 17:43:36 +07:00
8 changed files with 687 additions and 389 deletions

View file

@ -22,7 +22,7 @@ import {
listFile,
updateFile,
} from "../services/edm";
import { s3DeleteFile, s3DownloadFile, s3ListFile, s3UploadFile } from "../services/minio";
import { s3DeleteFile, s3DownloadFile, s3ListFile, s3UploadFile, truncateFileName } from "../services/minio";
@Route("api/v1/salary/file/{name}/{group}")
@Security("bearerAuth")
@ -257,7 +257,7 @@ export class FileController extends Controller {
const map = fileList.map(async ({ fileName, ...props }) => [
fileName,
await createFile(path, fileName, props),
await createFile(path, truncateFileName(fileName), props),
]);
const result = await Promise.all(map).catch((e) =>
@ -607,7 +607,7 @@ export class SubFileController extends Controller {
const map = fileList.map(async ({ fileName, ...props }) => [
fileName,
await createFile(path, fileName, props),
await createFile(path, truncateFileName(fileName), props),
]);
const result = await Promise.all(map).catch((e) =>

View file

@ -9078,8 +9078,7 @@ export class ReportController extends Controller {
body: {
refIds: {
refId: string;
// commandAffectDate: Date | null;//เก่า
commandDateAffect: Date | null; //ใหม่ (ปรับตาม rabbitMQ ORG)
commandDateAffect: Date | null;
commandNo: string | null;
commandYear: number | null;
commandId: string | null;
@ -9095,16 +9094,79 @@ export class ReportController extends Controller {
},
@Request() request: RequestWithUser,
) {
await Promise.all(
// ═══════════════════════════════════════════════════════════════
// old circle flow (เก็บไว้อ้างอิง — ลบการใช้งานจริงออกแล้ว)
// ═══════════════════════════════════════════════════════════════
// await Promise.all(
// body.refIds.map(async (v) => {
// const salary = await this.salaryProfileRepository.findOne({
// where: { id: v.refId },
// });
// if (salary != null) {
// // เดิม: ยิง callback เข้า org เพื่อให้ org สร้าง salary record
// await new CallAPI()
// .PostData(request, "/org/profile/salary/update", {
// profileId: salary.profileId,
// commandDateAffect: v.commandDateAffect,
// commandDateSign: v.commandDateSign,
// amount: v.amount,
// amountSpecial: v.amountSpecial,
// positionSalaryAmount: v.positionSalaryAmount,
// mouthSalaryAmount: v.mouthSalaryAmount,
// posNo: salary.posMasterNo.toString(),
// posNoAbb: salary.orgShortName,
// positionName: salary.position,
// positionExecutive: salary.posExecutive,
// positionExecutiveField: salary.positionExecutiveField,
// positionArea: salary.positionArea,
// positionType: salary.posType,
// positionLevel: salary.posLevel,
// commandId: v.commandId,
// remark: v.remark,
// orgRoot: salary.root,
// orgChild1: salary.child1,
// orgChild2: salary.child2,
// orgChild3: salary.child3,
// orgChild4: salary.child4,
// commandCode: v.commandCode,
// commandName: v.commandName,
// commandNo: v.commandNo,
// commandYear: v.commandYear,
// })
// // เดิม: set status33 ใน .then() หลัง org ตอบกลับสำเร็จเท่านั้น
// .then(async () => {
// const before = null;
// salary.status33 = "DONE";
// salary.lastUpdateUserId = request.user.sub;
// salary.lastUpdateFullName = request.user.name;
// salary.lastUpdatedAt = new Date();
// await this.salaryProfileRepository.save(salary, { data: request });
// setLogDataDiff(request, { before, after: salary });
// });
// }
// }),
// );
// return new HttpSuccess();
// ═══════════════════════════════════════════════════════════════
// new linear flow
// ═══════════════════════════════════════════════════════════════
// เปลี่ยน: ไม่ยิง callback เข้า org แล้ว → ทำงานของตัวเอง (set status) แล้ว return data
// ให้ org ทำงานต่อ (org AMQ จะเรียก ExecuteSalaryReportService เองหลังได้รับ response)
const result = await Promise.all(
body.refIds.map(async (v) => {
const salary = await this.salaryProfileRepository.findOne({
where: {
id: v.refId,
},
});
const salary = await this.salaryProfileRepository.findOne({ where: { id: v.refId } });
if (salary != null) {
await new CallAPI()
.PostData(request, "/org/profile/salary/update", {
// 1) set status33 = DONE (ย้ายขึ้นมาทำก่อนเลย ไม่ต้องรอ org ตอบกลับ)
salary.status33 = "DONE";
salary.lastUpdateUserId = request.user.sub;
salary.lastUpdateFullName = request.user.name;
salary.lastUpdatedAt = new Date();
await this.salaryProfileRepository.save(salary, { data: request });
setLogDataDiff(request, { before: null, after: salary });
// 2) return ข้อมูลที่ org ต้องการสร้าง ProfileSalary (shape เดียวกับที่เคย PostData)
return {
profileId: salary.profileId,
commandDateAffect: v.commandDateAffect,
commandDateSign: v.commandDateSign,
@ -9131,20 +9193,12 @@ export class ReportController extends Controller {
commandName: v.commandName,
commandNo: v.commandNo,
commandYear: v.commandYear,
})
.then(async () => {
const before = null;
salary.status33 = "DONE";
salary.lastUpdateUserId = request.user.sub;
salary.lastUpdateFullName = request.user.name;
salary.lastUpdatedAt = new Date();
await this.salaryProfileRepository.save(salary, { data: request });
setLogDataDiff(request, { before, after: salary });
});
};
}
return null; // refId ที่ไม่พบ salary → กรองออก (เหมือนเดิมที่ข้ามไป)
}),
);
return new HttpSuccess();
return { result: result.filter(Boolean) }; // return array ของ salary data ให้ org ทำงานต่อ
}
/**
@ -9155,13 +9209,12 @@ export class ReportController extends Controller {
* @param {string} id Guid, *Id
*/
@Post("command34/officer/report/excecute")
async SalaryReportExcecute34(
async SalaryReportExcecute34(
@Body()
body: {
refIds: {
refId: string;
// commandAffectDate: Date | null;//เก่า
commandDateAffect: Date | null; //ใหม่ (ปรับตาม rabbitMQ ORG)
commandDateAffect: Date | null;
commandNo: string | null;
commandYear: number | null;
commandId: string | null;
@ -9176,18 +9229,76 @@ export class ReportController extends Controller {
}[];
},
@Request() request: RequestWithUser,
) {
await Promise.all(
body.refIds.map(async (v) => {
const salary = await this.salaryProfileRepository.findOne({
where: {
id: v.refId,
},
});
) {
// ═══════════════════════════════════════════════════════════════
// old circle flow (เก็บไว้อ้างอิง — ลบการใช้งานจริงออกแล้ว)
// ═══════════════════════════════════════════════════════════════
// await Promise.all(
// body.refIds.map(async (v) => {
// const salary = await this.salaryProfileRepository.findOne({
// where: { id: v.refId },
// });
// if (salary != null) {
// await new CallAPI()
// .PostData(request, "/org/profile/salary/update", {
// profileId: salary.profileId,
// commandDateAffect: v.commandDateAffect,
// commandDateSign: v.commandDateSign,
// amount: v.amount,
// amountSpecial: v.amountSpecial,
// positionSalaryAmount: v.positionSalaryAmount,
// mouthSalaryAmount: v.mouthSalaryAmount,
// posNo: salary.posMasterNo.toString(),
// posNoAbb: salary.orgShortName,
// positionName: salary.position,
// positionExecutive: salary.posExecutive,
// positionExecutiveField: salary.positionExecutiveField,
// positionArea: salary.positionArea,
// positionType: salary.posType,
// positionLevel: salary.posLevel,
// commandId: v.commandId,
// remark: v.remark,
// orgRoot: salary.root,
// orgChild1: salary.child1,
// orgChild2: salary.child2,
// orgChild3: salary.child3,
// orgChild4: salary.child4,
// commandCode: v.commandCode,
// commandName: v.commandName,
// commandNo: v.commandNo,
// commandYear: v.commandYear,
// })
// .then(async () => {
// const before = null;
// salary.status34 = "DONE";
// salary.lastUpdateUserId = request.user.sub;
// salary.lastUpdateFullName = request.user.name;
// salary.lastUpdatedAt = new Date();
// await this.salaryProfileRepository.save(salary, { data: request });
// setLogDataDiff(request, { before, after: salary });
// });
// }
// }),
// );
// return new HttpSuccess();
// ═══════════════════════════════════════════════════════════════
// new linear flow
// ═══════════════════════════════════════════════════════════════
const result = await Promise.all(
body.refIds.map(async (v) => {
const salary = await this.salaryProfileRepository.findOne({ where: { id: v.refId } });
if (salary != null) {
await new CallAPI()
.PostData(request, "/org/profile/salary/update", {
// 1) set status34 = DONE (ย้ายขึ้นมาทำก่อนเลย ไม่ต้องรอ org ตอบกลับ)
salary.status34 = "DONE";
salary.lastUpdateUserId = request.user.sub;
salary.lastUpdateFullName = request.user.name;
salary.lastUpdatedAt = new Date();
await this.salaryProfileRepository.save(salary, { data: request });
setLogDataDiff(request, { before: null, after: salary });
// 2) return ข้อมูลที่ org ต้องการสร้าง ProfileSalary (shape เดียวกับที่เคย PostData)
return {
profileId: salary.profileId,
commandDateAffect: v.commandDateAffect,
commandDateSign: v.commandDateSign,
@ -9214,21 +9325,13 @@ export class ReportController extends Controller {
commandName: v.commandName,
commandNo: v.commandNo,
commandYear: v.commandYear,
})
.then(async () => {
const before = null;
salary.status34 = "DONE";
salary.lastUpdateUserId = request.user.sub;
salary.lastUpdateFullName = request.user.name;
salary.lastUpdatedAt = new Date();
await this.salaryProfileRepository.save(salary, { data: request });
setLogDataDiff(request, { before, after: salary });
});
};
}
return null;
}),
);
return new HttpSuccess();
}
return { result: result.filter(Boolean) };
}
/**
* API C-PM-35
@ -9243,8 +9346,7 @@ export class ReportController extends Controller {
body: {
refIds: {
refId: string;
// commandAffectDate: Date | null;//เก่า
commandDateAffect: Date | null; //ใหม่ (ปรับตาม rabbitMQ ORG)
commandDateAffect: Date | null;
commandNo: string | null;
commandYear: number | null;
commandId: string | null;
@ -9260,17 +9362,76 @@ export class ReportController extends Controller {
},
@Request() request: RequestWithUser,
) {
await Promise.all(
body.refIds.map(async (v) => {
const salary = await this.salaryProfileRepository.findOne({
where: {
id: v.refId,
},
});
// ═══════════════════════════════════════════════════════════════
// old circle flow (เก็บไว้อ้างอิง — ลบการใช้งานจริงออกแล้ว)
// ═══════════════════════════════════════════════════════════════
// await Promise.all(
// body.refIds.map(async (v) => {
// const salary = await this.salaryProfileRepository.findOne({
// where: { id: v.refId },
// });
// if (salary != null) {
// await new CallAPI()
// .PostData(request, "/org/profile/salary/update", {
// profileId: salary.profileId,
// commandDateAffect: v.commandDateAffect,
// commandDateSign: v.commandDateSign,
// amount: v.amount,
// amountSpecial: v.amountSpecial,
// positionSalaryAmount: v.positionSalaryAmount,
// mouthSalaryAmount: v.mouthSalaryAmount,
// posNo: salary.posMasterNo.toString(),
// posNoAbb: salary.orgShortName,
// positionName: salary.position,
// positionExecutive: salary.posExecutive,
// positionExecutiveField: salary.positionExecutiveField,
// positionArea: salary.positionArea,
// positionType: salary.posType,
// positionLevel: salary.posLevel,
// commandId: v.commandId,
// remark: v.remark,
// orgRoot: salary.root,
// orgChild1: salary.child1,
// orgChild2: salary.child2,
// orgChild3: salary.child3,
// orgChild4: salary.child4,
// commandCode: v.commandCode,
// commandName: v.commandName,
// commandNo: v.commandNo,
// commandYear: v.commandYear,
// })
// .then(async () => {
// const before = null;
// salary.status35 = "DONE";
// salary.lastUpdateUserId = request.user.sub;
// salary.lastUpdateFullName = request.user.name;
// salary.lastUpdatedAt = new Date();
// await this.salaryProfileRepository.save(salary, { data: request });
// setLogDataDiff(request, { before, after: salary });
// });
// }
// }),
// );
// return new HttpSuccess();
// ═══════════════════════════════════════════════════════════════
// new linear flow
// ═══════════════════════════════════════════════════════════════
// ใช้ร่วมกับ C-PM-45 (path reuse) — ทั้ง C-PM-35/45 ยิงเข้าที่นี่ ตั้ง status35 เหมือนกัน
const result = await Promise.all(
body.refIds.map(async (v) => {
const salary = await this.salaryProfileRepository.findOne({ where: { id: v.refId } });
if (salary != null) {
await new CallAPI()
.PostData(request, "/org/profile/salary/update", {
// 1) set status35 = DONE (ย้ายขึ้นมาทำก่อนเลย ไม่ต้องรอ org ตอบกลับ)
salary.status35 = "DONE";
salary.lastUpdateUserId = request.user.sub;
salary.lastUpdateFullName = request.user.name;
salary.lastUpdatedAt = new Date();
await this.salaryProfileRepository.save(salary, { data: request });
setLogDataDiff(request, { before: null, after: salary });
// 2) return ข้อมูลที่ org ต้องการสร้าง ProfileSalary (shape เดียวกับที่เคย PostData)
return {
profileId: salary.profileId,
commandDateAffect: v.commandDateAffect,
commandDateSign: v.commandDateSign,
@ -9297,20 +9458,12 @@ export class ReportController extends Controller {
commandName: v.commandName,
commandNo: v.commandNo,
commandYear: v.commandYear,
})
.then(async () => {
const before = null;
salary.status35 = "DONE";
salary.lastUpdateUserId = request.user.sub;
salary.lastUpdateFullName = request.user.name;
salary.lastUpdatedAt = new Date();
await this.salaryProfileRepository.save(salary, { data: request });
setLogDataDiff(request, { before, after: salary });
});
};
}
return null;
}),
);
return new HttpSuccess();
return { result: result.filter(Boolean) };
}
/**
@ -9326,8 +9479,7 @@ export class ReportController extends Controller {
body: {
refIds: {
refId: string;
// commandAffectDate: Date | null;//เก่า
commandDateAffect: Date | null; //ใหม่ (ปรับตาม rabbitMQ ORG)
commandDateAffect: Date | null;
commandDateSign?: Date | null;
commandNo: string | null;
commandYear: number | null;
@ -9347,17 +9499,81 @@ export class ReportController extends Controller {
},
@Request() request: RequestWithUser,
) {
await Promise.all(
body.refIds.map(async (v) => {
const salary = await this.salaryProfileEmployeeRepository.findOne({
where: {
id: v.refId,
},
});
// ═══════════════════════════════════════════════════════════════
// old circle flow (เก็บไว้อ้างอิง — ลบการใช้งานจริงออกแล้ว)
// ═══════════════════════════════════════════════════════════════
// await Promise.all(
// body.refIds.map(async (v) => {
// const salary = await this.salaryProfileEmployeeRepository.findOne({
// where: { id: v.refId },
// });
// if (salary != null) {
// await new CallAPI()
// .PostData(request, "/org/profile-employee/salary/update", {
// profileEmployeeId: salary.profileId,
// commandDateAffect: v.commandDateAffect,
// commandDateSign: v.commandDateSign,
// amount: v.amount,
// amountSpecial: v.amountSpecial,
// positionSalaryAmount: v.positionSalaryAmount,
// mouthSalaryAmount: v.mouthSalaryAmount,
// posNo: salary.posMasterNo != null ? salary.posMasterNo.toString() : null,
// posNoAbb: salary.orgShortName,
// positionName: salary.position,
// positionType: salary.posType,
// positionLevel:
// (salary.posTypeShort != null ? salary.posTypeShort + " " : "") +
// (salary.posLevel != null ? salary.posLevel.toString() : ""),
// remark: v.remark,
// orgRoot: salary.root,
// orgChild1: salary.child1,
// orgChild2: salary.child2,
// orgChild3: salary.child3,
// orgChild4: salary.child4,
// commandCode: v.commandCode,
// commandName: v.commandName,
// commandNo: v.commandNo,
// commandYear: v.commandYear,
// commandId: v.commandId,
// salaryLevel:
// salary.salaryLevel && salary.salaryLevelNew
// ? salary.salaryLevelNew
// : salary.salaryLevel,
// group: salary.groupNew ?? salary.group,
// })
// .then(async () => {
// const before = null;
// salary.status36 = "DONE";
// salary.lastUpdateUserId = request.user.sub;
// salary.lastUpdateFullName = request.user.name;
// salary.lastUpdatedAt = new Date();
// await this.salaryProfileEmployeeRepository.save(salary, { data: request });
// setLogDataDiff(request, { before, after: salary });
// });
// }
// }),
// );
// return new HttpSuccess();
// ═══════════════════════════════════════════════════════════════
// new linear flow
// ═══════════════════════════════════════════════════════════════
// ใช้ร่วมกับ C-PM-46 (path reuse) — ทั้ง C-PM-36/46 ยิงเข้าที่นี่ ตั้ง status36 เหมือนกัน
const result = await Promise.all(
body.refIds.map(async (v) => {
const salary = await this.salaryProfileEmployeeRepository.findOne({ where: { id: v.refId } });
if (salary != null) {
await new CallAPI()
.PostData(request, "/org/profile-employee/salary/update", {
// 1) set status36 = DONE (ย้ายขึ้นมาทำก่อนเลย ไม่ต้องรอ org ตอบกลับ)
salary.status36 = "DONE";
salary.lastUpdateUserId = request.user.sub;
salary.lastUpdateFullName = request.user.name;
salary.lastUpdatedAt = new Date();
await this.salaryProfileEmployeeRepository.save(salary, { data: request });
setLogDataDiff(request, { before: null, after: salary });
// 2) return ข้อมูลที่ org ต้องการสร้าง ProfileSalary (shape เดียวกับที่เคย PostData)
// สังเกต: profileEmployeeId (ไม่ใช่ profileId) + salaryLevel/group เพิ่ม
return {
profileEmployeeId: salary.profileId,
commandDateAffect: v.commandDateAffect,
commandDateSign: v.commandDateSign,
@ -9384,24 +9600,14 @@ export class ReportController extends Controller {
commandYear: v.commandYear,
commandId: v.commandId,
salaryLevel:
salary.salaryLevel && salary.salaryLevelNew
? salary.salaryLevelNew
: salary.salaryLevel,
salary.salaryLevel && salary.salaryLevelNew ? salary.salaryLevelNew : salary.salaryLevel,
group: salary.groupNew ?? salary.group,
})
.then(async () => {
const before = null;
salary.status36 = "DONE";
salary.lastUpdateUserId = request.user.sub;
salary.lastUpdateFullName = request.user.name;
salary.lastUpdatedAt = new Date();
await this.salaryProfileEmployeeRepository.save(salary, { data: request });
setLogDataDiff(request, { before, after: salary });
});
};
}
return null;
}),
);
return new HttpSuccess();
return { result: result.filter(Boolean) };
}
/**
@ -9417,8 +9623,7 @@ export class ReportController extends Controller {
body: {
refIds: {
refId: string;
// commandAffectDate: Date | null;//เก่า
commandDateAffect: Date | null; //ใหม่ (ปรับตาม rabbitMQ ORG)
commandDateAffect: Date | null;
commandDateSign?: Date | null;
commandNo: string | null;
commandYear: number | null;
@ -9438,17 +9643,79 @@ export class ReportController extends Controller {
},
@Request() request: RequestWithUser,
) {
await Promise.all(
body.refIds.map(async (v) => {
const salary = await this.salaryProfileEmployeeRepository.findOne({
where: {
id: v.refId,
},
});
// ═══════════════════════════════════════════════════════════════
// old circle flow (เก็บไว้อ้างอิง — ลบการใช้งานจริงออกแล้ว)
// ═══════════════════════════════════════════════════════════════
// await Promise.all(
// body.refIds.map(async (v) => {
// const salary = await this.salaryProfileEmployeeRepository.findOne({
// where: { id: v.refId },
// });
// if (salary != null) {
// await new CallAPI()
// .PostData(request, "/org/profile-employee/salary/update", {
// profileEmployeeId: salary.profileId,
// commandDateAffect: v.commandDateAffect,
// commandDateSign: v.commandDateSign,
// amount: v.amount,
// amountSpecial: v.amountSpecial,
// positionSalaryAmount: v.positionSalaryAmount,
// mouthSalaryAmount: v.mouthSalaryAmount,
// posNo: salary.posMasterNo != null ? salary.posMasterNo.toString() : null,
// posNoAbb: salary.orgShortName,
// positionName: salary.position,
// positionType: salary.posType,
// positionLevel:
// (salary.posTypeShort != null ? salary.posTypeShort + " " : "") +
// (salary.posLevel != null ? salary.posLevel.toString() : ""),
// remark: v.remark,
// orgRoot: salary.root,
// orgChild1: salary.child1,
// orgChild2: salary.child2,
// orgChild3: salary.child3,
// orgChild4: salary.child4,
// commandCode: v.commandCode,
// commandName: v.commandName,
// commandNo: v.commandNo,
// commandYear: v.commandYear,
// commandId: v.commandId,
// salaryLevel:
// salary.salaryLevel && salary.salaryLevelNew
// ? salary.salaryLevelNew
// : salary.salaryLevel,
// group: salary.groupNew ?? salary.group,
// })
// .then(async () => {
// const before = null;
// salary.status37 = "DONE";
// salary.lastUpdateUserId = request.user.sub;
// salary.lastUpdateFullName = request.user.name;
// salary.lastUpdatedAt = new Date();
// await this.salaryProfileEmployeeRepository.save(salary, { data: request });
// setLogDataDiff(request, { before, after: salary });
// });
// }
// }),
// );
// return new HttpSuccess();
// ═══════════════════════════════════════════════════════════════
// new linear flow
// ═══════════════════════════════════════════════════════════════
const result = await Promise.all(
body.refIds.map(async (v) => {
const salary = await this.salaryProfileEmployeeRepository.findOne({ where: { id: v.refId } });
if (salary != null) {
await new CallAPI()
.PostData(request, "/org/profile-employee/salary/update", {
// 1) set status37 = DONE (ย้ายขึ้นมาทำก่อนเลย ไม่ต้องรอ org ตอบกลับ)
salary.status37 = "DONE";
salary.lastUpdateUserId = request.user.sub;
salary.lastUpdateFullName = request.user.name;
salary.lastUpdatedAt = new Date();
await this.salaryProfileEmployeeRepository.save(salary, { data: request });
setLogDataDiff(request, { before: null, after: salary });
// 2) return ข้อมูลที่ org ต้องการสร้าง ProfileSalary (shape เดียวกับที่เคย PostData)
return {
profileEmployeeId: salary.profileId,
commandDateAffect: v.commandDateAffect,
commandDateSign: v.commandDateSign,
@ -9475,24 +9742,14 @@ export class ReportController extends Controller {
commandYear: v.commandYear,
commandId: v.commandId,
salaryLevel:
salary.salaryLevel && salary.salaryLevelNew
? salary.salaryLevelNew
: salary.salaryLevel,
salary.salaryLevel && salary.salaryLevelNew ? salary.salaryLevelNew : salary.salaryLevel,
group: salary.groupNew ?? salary.group,
})
.then(async () => {
const before = null;
salary.status37 = "DONE";
salary.lastUpdateUserId = request.user.sub;
salary.lastUpdateFullName = request.user.name;
salary.lastUpdatedAt = new Date();
await this.salaryProfileEmployeeRepository.save(salary, { data: request });
setLogDataDiff(request, { before, after: salary });
});
};
}
return null;
}),
);
return new HttpSuccess();
return { result: result.filter(Boolean) };
}
/**

View file

@ -470,7 +470,7 @@ export class SalaryPeriodController extends Controller {
const Level = await this.posLevelRepository.findOne({
where: {
posTypeId: Type.id,
posLevelName: salaryProfile.posLevel,
posLevelName: salaryProfile.posLevel?.split("/")[0],
},
});
if (!Level) {
@ -935,7 +935,7 @@ export class SalaryPeriodController extends Controller {
const Level = await this.posLevelRepository.findOne({
where: {
posTypeId: Type.id,
posLevelName: salaryProfile.posLevel,
posLevelName: salaryProfile.posLevel?.split("/")[0],
},
});
if (!Level) {
@ -1272,7 +1272,7 @@ export class SalaryPeriodController extends Controller {
const Level = await this.posLevelRepository.findOne({
where: {
posTypeId: Type.id,
posLevelName: salaryProfile.posLevel,
posLevelName: salaryProfile.posLevel?.split("/")[0],
},
});
if (!Level) {
@ -1981,7 +1981,7 @@ export class SalaryPeriodController extends Controller {
Level = await this.posLevelRepository.findOne({
where: {
posTypeId: Type.id,
posLevelName: salaryProfile.posLevel,
posLevelName: salaryProfile.posLevel?.split("/")[0],
},
});
if (!Level) {
@ -2474,7 +2474,7 @@ export class SalaryPeriodController extends Controller {
const posLevel = await this.posLevelRepository.findOne({
where: {
posTypeId: posType.id,
posLevelName: salaryProfile.posLevel,
posLevelName: salaryProfile.posLevel?.split("/")[0],
},
});
if (!posLevel) {

View file

@ -430,7 +430,7 @@ export class SalaryPeriodEmployeeController extends Controller {
const Level = await this.posLevelRepository.findOne({
where: {
posTypeId: Type.id,
posLevelName: salaryProfile.posLevel,
posLevelName: salaryProfile.posLevel?.split("/")[0],
},
});
if (!Level) {
@ -750,7 +750,7 @@ export class SalaryPeriodEmployeeController extends Controller {
const Level = await this.posLevelRepository.findOne({
where: {
posTypeId: Type.id,
posLevelName: salaryProfile.posLevel,
posLevelName: salaryProfile.posLevel?.split("/")[0],
},
});
if (!Level) {
@ -941,7 +941,7 @@ export class SalaryPeriodEmployeeController extends Controller {
const Level = await this.posLevelRepository.findOne({
where: {
posTypeId: Type.id,
posLevelName: salaryProfile.posLevel,
posLevelName: salaryProfile.posLevel?.split("/")[0],
},
});
if (!Level) {
@ -1132,7 +1132,7 @@ export class SalaryPeriodEmployeeController extends Controller {
const Level = await this.posLevelRepository.findOne({
where: {
posTypeId: Type.id,
posLevelName: salaryProfile.posLevel,
posLevelName: salaryProfile.posLevel?.split("/")[0],
},
});
if (!Level) {
@ -1597,7 +1597,7 @@ export class SalaryPeriodEmployeeController extends Controller {
const posLevel = await this.posLevelRepository.findOne({
where: {
posTypeId: posType.id,
posLevelName: salaryProfile.posLevel,
posLevelName: salaryProfile.posLevel?.split("/")[0],
},
});
if (!posLevel) {

View file

@ -12,9 +12,9 @@ enum EmployeePosLevelAuthoritys {
export class EmployeePosLevel extends EntityBase {
@Column({
comment: "ชื่อระดับชั้นงาน",
type: "int",
length: 255,
})
posLevelName: number;
posLevelName: string;
@Column({
comment: "ระดับของระดับชั้นงาน",

View file

@ -134,7 +134,7 @@ export class SalaryProfileEmployee extends EntityBase {
comment: "ระดับตำแหน่ง",
default: null,
})
posLevel: number;
posLevel: string;
@Column({
type: "double",
@ -482,7 +482,7 @@ export class CreateSalaryProfileEmployee {
posType: string | null;
@Column()
posLevel: number | null;
posLevel: string | null;
@Column()
group: number | null;

View file

@ -0,0 +1,16 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class UpdateTablePosLevelToString20260407112136 implements MigrationInterface {
name = 'UpdateTablePosLevelToString20260407112136'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE \`salaryProfileEmployee\` CHANGE \`posLevel\` \`posLevel\` varchar(255) NULL COMMENT 'ระดับตำแหน่ง'`);
await queryRunner.query(`ALTER TABLE \`employeePosLevel\` CHANGE \`posLevelName\` \`posLevelName\` varchar(255) NOT NULL COMMENT 'ชื่อระดับชั้นงาน'`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE \`salaryProfileEmployee\` CHANGE \`posLevel\` \`posLevel\` double NULL COMMENT 'ระดับตำแหน่ง'`);
await queryRunner.query(`ALTER TABLE \`employeePosLevel\` CHANGE \`posLevelName\` \`posLevelName\` int NOT NULL COMMENT 'ชื่อระดับชั้นงาน'`);
}
}

View file

@ -16,6 +16,26 @@ const minio = new Client({
export default minio;
/**
* limit
* @param fileName -
* @param maxLength - (default: 50 )
* @returns
*/
export function truncateFileName(fileName: string, maxLength: number = 50): string {
const dot = fileName.lastIndexOf(".");
const name = dot !== -1 && !fileName.startsWith(".") ? fileName.slice(0, dot) : fileName;
const ext = dot !== -1 && !fileName.startsWith(".") ? fileName.slice(dot) : "";
if (name.length <= maxLength) {
return fileName;
}
// ตัดชื่อและเติม "..." ตามด้วย 5 ตัวสุดท้ายของชื่อเดิม
const truncated = name.slice(0, maxLength - 8) + "..." + name.slice(-5);
return truncated + ext;
}
function exception(e: any): never {
console.error(e);
throw new Error("เกิดข้อผิดพลาดกับระบบจัดการไฟล์");
@ -74,6 +94,11 @@ export async function s3DeleteFolder(path: string) {
export async function s3UploadFile(replace: boolean, ...pathname: string[]) {
if (!pathname.length) return;
// ตัดชื่อไฟล์ถ้ายาวเกิน
const originalFileName = pathname.at(-1) as string;
const truncatedFileName = truncateFileName(originalFileName);
pathname = [...pathname.slice(0, -1), truncatedFileName];
if (!replace) {
const list = await s3ListFile(...pathname.slice(0, -1)).catch(exception);