diff --git a/src/controllers/employee-controller.ts b/src/controllers/employee-controller.ts index c04090b..5b98bda 100644 --- a/src/controllers/employee-controller.ts +++ b/src/controllers/employee-controller.ts @@ -298,10 +298,8 @@ export class EmployeeController extends Controller { prisma.district.findFirst({ where: { id: body.districtId || undefined } }), prisma.subDistrict.findFirst({ where: { id: body.subDistrictId || undefined } }), prisma.customerBranch.findFirst({ - where: { id: body.customerBranchId || undefined }, - include: { - customer: true, - }, + where: { id: body.customerBranchId }, + include: { customer: true }, }), ]); if (body.provinceId && !province) @@ -450,37 +448,42 @@ export class EmployeeController extends Controller { @Body() body: EmployeeUpdate, @Path() employeeId: string, ) { - if (body.provinceId || body.districtId || body.subDistrictId || body.customerBranchId) { - const [province, district, subDistrict, customerBranch] = await prisma.$transaction([ - prisma.province.findFirst({ where: { id: body.provinceId || undefined } }), - prisma.district.findFirst({ where: { id: body.districtId || undefined } }), - prisma.subDistrict.findFirst({ where: { id: body.subDistrictId || undefined } }), - prisma.customerBranch.findFirst({ where: { id: body.customerBranchId || undefined } }), - ]); - if (body.provinceId && !province) - throw new HttpError( - HttpStatus.BAD_REQUEST, - "Province cannot be found.", - "missing_or_invalid_parameter", - ); - if (body.districtId && !district) - throw new HttpError( - HttpStatus.BAD_REQUEST, - "District cannot be found.", - "missing_or_invalid_parameter", - ); - if (body.subDistrictId && !subDistrict) - throw new HttpError( - HttpStatus.BAD_REQUEST, - "Sub-district cannot be found.", - "missing_or_invalid_parameter", - ); - if (body.customerBranchId && !customerBranch) - throw new HttpError( - HttpStatus.BAD_REQUEST, - "Customer cannot be found.", - "missing_or_invalid_parameter", - ); + const [province, district, subDistrict, customerBranch, employee] = await prisma.$transaction([ + prisma.province.findFirst({ where: { id: body.provinceId || undefined } }), + prisma.district.findFirst({ where: { id: body.districtId || undefined } }), + prisma.subDistrict.findFirst({ where: { id: body.subDistrictId || undefined } }), + prisma.customerBranch.findFirst({ + where: { id: body.customerBranchId || undefined }, + include: { customer: true }, + }), + prisma.employee.findFirst({ where: { id: employeeId } }), + ]); + if (body.provinceId && !province) + throw new HttpError( + HttpStatus.BAD_REQUEST, + "Province cannot be found.", + "missing_or_invalid_parameter", + ); + if (body.districtId && !district) + throw new HttpError( + HttpStatus.BAD_REQUEST, + "District cannot be found.", + "missing_or_invalid_parameter", + ); + if (body.subDistrictId && !subDistrict) + throw new HttpError( + HttpStatus.BAD_REQUEST, + "Sub-district cannot be found.", + "missing_or_invalid_parameter", + ); + if (body.customerBranchId && !customerBranch) + throw new HttpError( + HttpStatus.BAD_REQUEST, + "Customer cannot be found.", + "missing_or_invalid_parameter", + ); + if (!employee) { + throw new HttpError(HttpStatus.NOT_FOUND, "Employee cannot be found.", "data_not_found"); } const { @@ -512,93 +515,110 @@ export class EmployeeController extends Controller { } } - const record = await prisma.employee.update({ - where: { id: employeeId }, - include: { - province: true, - district: true, - subDistrict: true, - employeeOtherInfo: true, - employeeCheckup: { - include: { - province: true, + const record = await prisma.$transaction(async (tx) => { + let code: string | undefined; + + if (customerBranch && customerBranch.id !== customerBranchId) { + const last = await tx.runningNo.upsert({ + where: { + key: `EMPLOYEE_${customerBranch.customer.code}-${customerBranch.branchNo.toString().padStart(2, "0")}-${new Date().getFullYear().toString().slice(-2).padStart(2, "0")}`, }, - }, - employeeWork: true, - }, - data: { - ...rest, - customerBranch: { connect: customerBranchId ? { id: customerBranchId } : undefined }, - employeeWork: employeeWork - ? { - deleteMany: { - id: { - notIn: employeeWork.map((v) => v.id).filter((v): v is string => !!v) || [], - }, - }, - upsert: employeeWork.map((v) => ({ - where: { id: v.id || "" }, - create: { - ...v, - createdBy: req.user.name, - updateBy: req.user.name, - id: undefined, - }, - update: { - ...v, - updateBy: req.user.name, - }, - })), - } - : undefined, + create: { + key: `EMPLOYEE_${customerBranch.customer.code}-${customerBranch.branchNo.toString().padStart(2, "0")}-${new Date().getFullYear().toString().slice(-2).padStart(2, "0")}`, + value: 1, + }, + update: { value: { increment: 1 } }, + }); + code = `${customerBranch.customer.code}-${customerBranch.branchNo.toString().padStart(2, "0")}-${new Date().getFullYear().toString().slice(-2).padStart(2, "0")}${last.value.toString().padStart(4, "0")}`; + } - employeeCheckup: employeeCheckup - ? { - deleteMany: { - id: { - notIn: employeeCheckup.map((v) => v.id).filter((v): v is string => !!v) || [], - }, - }, - upsert: employeeCheckup.map((v) => ({ - where: { id: v.id || "" }, - create: { - ...v, - createdBy: req.user.name, - updateBy: req.user.name, - id: undefined, - }, - update: { - ...v, - updateBy: req.user.name, - }, - })), - } - : undefined, - employeeOtherInfo: employeeOtherInfo - ? { - deleteMany: {}, - create: employeeOtherInfo, - } - : undefined, - province: { - connect: provinceId ? { id: provinceId } : undefined, - disconnect: provinceId === null || undefined, + return await prisma.employee.update({ + where: { id: employeeId }, + include: { + province: true, + district: true, + subDistrict: true, + employeeOtherInfo: true, + employeeCheckup: { + include: { + province: true, + }, + }, + employeeWork: true, }, - district: { - connect: districtId ? { id: districtId } : undefined, - disconnect: districtId === null || undefined, + data: { + ...rest, + code, + customerBranch: { connect: customerBranchId ? { id: customerBranchId } : undefined }, + employeeWork: employeeWork + ? { + deleteMany: { + id: { + notIn: employeeWork.map((v) => v.id).filter((v): v is string => !!v) || [], + }, + }, + upsert: employeeWork.map((v) => ({ + where: { id: v.id || "" }, + create: { + ...v, + createdBy: req.user.name, + updateBy: req.user.name, + id: undefined, + }, + update: { + ...v, + updateBy: req.user.name, + }, + })), + } + : undefined, + + employeeCheckup: employeeCheckup + ? { + deleteMany: { + id: { + notIn: employeeCheckup.map((v) => v.id).filter((v): v is string => !!v) || [], + }, + }, + upsert: employeeCheckup.map((v) => ({ + where: { id: v.id || "" }, + create: { + ...v, + createdBy: req.user.name, + updateBy: req.user.name, + id: undefined, + }, + update: { + ...v, + updateBy: req.user.name, + }, + })), + } + : undefined, + employeeOtherInfo: employeeOtherInfo + ? { + deleteMany: {}, + create: employeeOtherInfo, + } + : undefined, + province: { + connect: provinceId ? { id: provinceId } : undefined, + disconnect: provinceId === null || undefined, + }, + district: { + connect: districtId ? { id: districtId } : undefined, + disconnect: districtId === null || undefined, + }, + subDistrict: { + connect: subDistrictId ? { id: subDistrictId } : undefined, + disconnect: subDistrictId === null || undefined, + }, + createdBy: req.user.name, + updateBy: req.user.name, }, - subDistrict: { - connect: subDistrictId ? { id: subDistrictId } : undefined, - disconnect: subDistrictId === null || undefined, - }, - createdBy: req.user.name, - updateBy: req.user.name, - }, + }); }); - this.setStatus(HttpStatus.CREATED); - return Object.assign(record, { profileImageUrl: await presignedGetObjectIfExist( MINIO_BUCKET,