refactor: customer create and update process

This commit is contained in:
Methapon Metanipat 2024-08-20 15:41:48 +07:00
parent b167a612b4
commit 5bb8da818c
6 changed files with 261 additions and 462 deletions

View file

@ -137,27 +137,30 @@ export class CustomerBranchController extends Controller {
const where = {
OR: [
{ nameEN: { contains: query }, zipCode, ...filterStatus(status) },
{ name: { contains: query }, zipCode, ...filterStatus(status) },
{ email: { contains: query }, zipCode, ...filterStatus(status) },
{ code: { contains: query }, zipCode, ...filterStatus(status) },
{ address: { contains: query }, zipCode, ...filterStatus(status) },
{ addressEN: { contains: query }, zipCode, ...filterStatus(status) },
{ province: { name: { contains: query } }, zipCode, ...filterStatus(status) },
{ province: { nameEN: { contains: query } }, zipCode, ...filterStatus(status) },
{ district: { name: { contains: query } }, zipCode, ...filterStatus(status) },
{ district: { nameEN: { contains: query } }, zipCode, ...filterStatus(status) },
{ subDistrict: { name: { contains: query } }, zipCode, ...filterStatus(status) },
{ subDistrict: { nameEN: { contains: query } }, zipCode, ...filterStatus(status) },
{ registerName: { contains: query } },
{ registerNameEN: { contains: query } },
{ email: { contains: query } },
{ code: { contains: query } },
{ address: { contains: query } },
{ addressEN: { contains: query } },
{ province: { name: { contains: query } } },
{ province: { nameEN: { contains: query } } },
{ district: { name: { contains: query } } },
{ district: { nameEN: { contains: query } } },
{ subDistrict: { name: { contains: query } } },
{ subDistrict: { nameEN: { contains: query } } },
{
customer: {
OR: [{ customerName: { contains: query } }, { customerNameEN: { contains: query } }],
OR: [
{ firstName: { contains: query } },
{ firstNameEN: { contains: query } },
{ lastName: { contains: query } },
{ lastNameEN: { contains: query } },
],
},
zipCode,
status,
},
],
AND: { customerId },
AND: { customerId, subDistrict: zipCode ? { zipCode } : undefined, ...filterStatus(status) },
} satisfies Prisma.CustomerBranchWhereInput;
const [result, total] = await prisma.$transaction([
@ -263,7 +266,15 @@ export class CustomerBranchController extends Controller {
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.customer.findFirst({ where: { id: body.customerId || undefined } }),
prisma.customer.findFirst({
where: { id: body.customerId || undefined },
include: {
branch: {
take: 1,
orderBy: { createdAt: "asc" },
},
},
}),
]);
if (body.provinceId && !province)
throw new HttpError(
@ -294,48 +305,37 @@ export class CustomerBranchController extends Controller {
const record = await prisma.$transaction(
async (tx) => {
const conflict = await tx.customerBranch.findFirst({
where: { customerId, branchNo: rest.branchNo },
});
if (conflict) {
throw new HttpError(
HttpStatus.BAD_REQUEST,
"Branch with current no already exists.",
"branchSameNoExist",
);
}
const last = await tx.runningNo.upsert({
where: {
key: `CUSTOMER_${customer.code.slice(0, -6)}`,
},
create: {
key: `CUSTOMER_${customer.code.slice(0, -6)}`,
value: 1,
},
update: { value: { increment: 1 } },
});
return await tx.customerBranch.create({
include: {
province: true,
district: true,
subDistrict: true,
createdBy: true,
updatedBy: true,
},
data: {
...rest,
statusOrder: +(rest.status === "INACTIVE"),
code: `${customer.code.slice(0, -6)}${`${last.value - 1}`.padStart(6, "0")}`,
customer: { connect: { id: customerId } },
province: { connect: provinceId ? { id: provinceId } : undefined },
district: { connect: districtId ? { id: districtId } : undefined },
subDistrict: { connect: subDistrictId ? { id: subDistrictId } : undefined },
createdBy: { connect: { id: req.user.sub } },
updatedBy: { connect: { id: req.user.sub } },
},
});
// const last = await tx.runningNo.upsert({
// where: {
// key: `CUSTOMER_${customer.code.slice(0, -6)}`,
// },
// create: {
// key: `CUSTOMER_${customer.code.slice(0, -6)}`,
// value: 1,
// },
// update: { value: { increment: 1 } },
// });
//
// return await tx.customerBranch.create({
// include: {
// province: true,
// district: true,
// subDistrict: true,
// createdBy: true,
// updatedBy: true,
// },
// data: {
// ...rest,
// statusOrder: +(rest.status === "INACTIVE"),
// code: `${customer.code.slice(0, -6)}${`${last.value - 1}`.padStart(6, "0")}`,
// customer: { connect: { id: customerId } },
// province: { connect: provinceId ? { id: provinceId } : undefined },
// district: { connect: districtId ? { id: districtId } : undefined },
// subDistrict: { connect: subDistrictId ? { id: subDistrictId } : undefined },
// createdBy: { connect: { id: req.user.sub } },
// updatedBy: { connect: { id: req.user.sub } },
// },
// });
},
{ isolationLevel: Prisma.TransactionIsolationLevel.Serializable },
);
@ -352,6 +352,12 @@ export class CustomerBranchController extends Controller {
@Body() body: CustomerBranchUpdate,
@Path() branchId: string,
) {
const branch = await prisma.customerBranch.findUnique({ where: { id: branchId } });
if (!branch) {
throw new HttpError(HttpStatus.NOT_FOUND, "Branch cannot be found.", "branchNotFound");
}
if (body.provinceId || body.districtId || body.subDistrictId || body.customerId) {
const [province, district, subDistrict, customer] = await prisma.$transaction([
prisma.province.findFirst({ where: { id: body.provinceId || undefined } }),
@ -385,44 +391,41 @@ export class CustomerBranchController extends Controller {
);
}
const { provinceId, districtId, subDistrictId, customerId, ...rest } = body;
if (!(await prisma.customerBranch.findUnique({ where: { id: branchId } }))) {
throw new HttpError(HttpStatus.NOT_FOUND, "Branch cannot be found.", "branchNotFound");
}
const record = await prisma.customerBranch.update({
where: { id: branchId },
include: {
province: true,
district: true,
subDistrict: true,
createdBy: true,
updatedBy: true,
},
data: {
...rest,
statusOrder: +(rest.status === "INACTIVE"),
customer: { connect: customerId ? { id: customerId } : 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,
},
updatedBy: { connect: { id: req.user.sub } },
},
});
this.setStatus(HttpStatus.CREATED);
return record;
// const { provinceId, districtId, subDistrictId, customerId, ...rest } = body;
//
//
// const record = await prisma.customerBranch.update({
// where: { id: branchId },
// include: {
// province: true,
// district: true,
// subDistrict: true,
// createdBy: true,
// updatedBy: true,
// },
// data: {
// ...rest,
// statusOrder: +(rest.status === "INACTIVE"),
// customer: { connect: customerId ? { id: customerId } : 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,
// },
// updatedBy: { connect: { id: req.user.sub } },
// },
// });
//
// this.setStatus(HttpStatus.CREATED);
//
// return record;
}
@Delete("{branchId}")