refactor: customer structure
This commit is contained in:
parent
eaf8ce3fd1
commit
4dee7bfe71
4 changed files with 156 additions and 79 deletions
37
prisma/migrations/20240913062608_update_fields/migration.sql
Normal file
37
prisma/migrations/20240913062608_update_fields/migration.sql
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
Warnings:
|
||||||
|
|
||||||
|
- You are about to drop the column `birthDate` on the `Customer` table. All the data in the column will be lost.
|
||||||
|
- You are about to drop the column `firstName` on the `Customer` table. All the data in the column will be lost.
|
||||||
|
- You are about to drop the column `firstNameEN` on the `Customer` table. All the data in the column will be lost.
|
||||||
|
- You are about to drop the column `gender` on the `Customer` table. All the data in the column will be lost.
|
||||||
|
- You are about to drop the column `lastName` on the `Customer` table. All the data in the column will be lost.
|
||||||
|
- You are about to drop the column `lastNameEN` on the `Customer` table. All the data in the column will be lost.
|
||||||
|
- You are about to drop the column `namePrefix` on the `Customer` table. All the data in the column will be lost.
|
||||||
|
- Made the column `registeredBranchId` on table `Customer` required. This step will fail if there are existing NULL values in that column.
|
||||||
|
|
||||||
|
*/
|
||||||
|
-- DropForeignKey
|
||||||
|
ALTER TABLE "Customer" DROP CONSTRAINT "Customer_registeredBranchId_fkey";
|
||||||
|
|
||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "Customer" DROP COLUMN "birthDate",
|
||||||
|
DROP COLUMN "firstName",
|
||||||
|
DROP COLUMN "firstNameEN",
|
||||||
|
DROP COLUMN "gender",
|
||||||
|
DROP COLUMN "lastName",
|
||||||
|
DROP COLUMN "lastNameEN",
|
||||||
|
DROP COLUMN "namePrefix",
|
||||||
|
ALTER COLUMN "registeredBranchId" SET NOT NULL;
|
||||||
|
|
||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "CustomerBranch" ADD COLUMN "birthDate" DATE,
|
||||||
|
ADD COLUMN "firstName" TEXT,
|
||||||
|
ADD COLUMN "firstNameEN" TEXT,
|
||||||
|
ADD COLUMN "gender" TEXT,
|
||||||
|
ADD COLUMN "lastName" TEXT,
|
||||||
|
ADD COLUMN "lastNameEN" TEXT,
|
||||||
|
ADD COLUMN "namePrefix" TEXT;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "Customer" ADD CONSTRAINT "Customer_registeredBranchId_fkey" FOREIGN KEY ("registeredBranchId") REFERENCES "Branch"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
|
|
@ -420,22 +420,6 @@ model Customer {
|
||||||
id String @id @default(cuid())
|
id String @id @default(cuid())
|
||||||
|
|
||||||
customerType CustomerType
|
customerType CustomerType
|
||||||
telephoneNo String
|
|
||||||
|
|
||||||
namePrefix String?
|
|
||||||
firstName String?
|
|
||||||
firstNameEN String?
|
|
||||||
lastName String?
|
|
||||||
lastNameEN String?
|
|
||||||
gender String?
|
|
||||||
birthDate DateTime? @db.Date
|
|
||||||
citizenId String?
|
|
||||||
|
|
||||||
legalPersonNo String?
|
|
||||||
registerName String?
|
|
||||||
registerNameEN String?
|
|
||||||
businessType String?
|
|
||||||
jobPosition String?
|
|
||||||
|
|
||||||
status Status @default(CREATED)
|
status Status @default(CREATED)
|
||||||
statusOrder Int @default(0)
|
statusOrder Int @default(0)
|
||||||
|
|
@ -464,8 +448,18 @@ model CustomerBranch {
|
||||||
code String
|
code String
|
||||||
codeCustomer String
|
codeCustomer String
|
||||||
|
|
||||||
|
telephoneNo String
|
||||||
|
|
||||||
// NOTE: About (Natural Person)
|
// NOTE: About (Natural Person)
|
||||||
citizenId String?
|
namePrefix String?
|
||||||
|
firstName String?
|
||||||
|
firstNameEN String?
|
||||||
|
lastName String?
|
||||||
|
lastNameEN String?
|
||||||
|
gender String?
|
||||||
|
birthDate DateTime? @db.Date
|
||||||
|
citizenId String?
|
||||||
|
|
||||||
// NOTE: About (Legal Entity)
|
// NOTE: About (Legal Entity)
|
||||||
legalPersonNo String?
|
legalPersonNo String?
|
||||||
registerName String?
|
registerName String?
|
||||||
|
|
@ -496,7 +490,6 @@ model CustomerBranch {
|
||||||
|
|
||||||
email String
|
email String
|
||||||
contactName String
|
contactName String
|
||||||
telephoneNo String
|
|
||||||
|
|
||||||
employmentOffice String
|
employmentOffice String
|
||||||
businessType String
|
businessType String
|
||||||
|
|
|
||||||
|
|
@ -177,17 +177,11 @@ export class CustomerBranchController extends Controller {
|
||||||
{ registerNameEN: { contains: query } },
|
{ registerNameEN: { contains: query } },
|
||||||
{ email: { contains: query } },
|
{ email: { contains: query } },
|
||||||
{ code: { contains: query } },
|
{ code: { contains: query } },
|
||||||
|
{ firstName: { contains: query } },
|
||||||
|
{ firstNameEN: { contains: query } },
|
||||||
|
{ lastName: { contains: query } },
|
||||||
|
{ lastNameEN: { contains: query } },
|
||||||
...whereAddressQuery(query),
|
...whereAddressQuery(query),
|
||||||
{
|
|
||||||
customer: {
|
|
||||||
OR: [
|
|
||||||
{ firstName: { contains: query } },
|
|
||||||
{ firstNameEN: { contains: query } },
|
|
||||||
{ lastName: { contains: query } },
|
|
||||||
{ lastNameEN: { contains: query } },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
]
|
]
|
||||||
: undefined,
|
: undefined,
|
||||||
AND: {
|
AND: {
|
||||||
|
|
@ -263,7 +257,6 @@ export class CustomerBranchController extends Controller {
|
||||||
{ firstNameEN: { contains: query } },
|
{ firstNameEN: { contains: query } },
|
||||||
{ lastName: { contains: query } },
|
{ lastName: { contains: query } },
|
||||||
{ lastNameEN: { contains: query } },
|
{ lastNameEN: { contains: query } },
|
||||||
{ passportNumber: { contains: query } },
|
|
||||||
...whereAddressQuery(query),
|
...whereAddressQuery(query),
|
||||||
],
|
],
|
||||||
AND: {
|
AND: {
|
||||||
|
|
|
||||||
|
|
@ -45,52 +45,60 @@ function globalAllow(user: RequestWithUser["user"]) {
|
||||||
const permissionCond = createPermCondition(globalAllow);
|
const permissionCond = createPermCondition(globalAllow);
|
||||||
const permissionCheck = createPermCheck(globalAllow);
|
const permissionCheck = createPermCheck(globalAllow);
|
||||||
|
|
||||||
export type CustomerCreate = (
|
export type CustomerCreate = {
|
||||||
| {
|
|
||||||
namePrefix: string;
|
|
||||||
firstName: string;
|
|
||||||
firstNameEN?: string;
|
|
||||||
lastName: string;
|
|
||||||
lastNameEN?: string;
|
|
||||||
gender: string;
|
|
||||||
birthDate: Date;
|
|
||||||
telephoneNo: string;
|
|
||||||
}
|
|
||||||
| {
|
|
||||||
legalPersonNo: string;
|
|
||||||
registerName: string;
|
|
||||||
registerNameEN?: string;
|
|
||||||
businessType: string;
|
|
||||||
jobPosition: string;
|
|
||||||
telephoneNo: string;
|
|
||||||
}
|
|
||||||
) & {
|
|
||||||
registeredBranchId: string;
|
registeredBranchId: string;
|
||||||
status?: Status;
|
|
||||||
customerType: CustomerType;
|
customerType: CustomerType;
|
||||||
|
status?: Status;
|
||||||
selectedImage?: string;
|
selectedImage?: string;
|
||||||
|
|
||||||
|
branch: ((
|
||||||
|
| {
|
||||||
|
// NOTE: About (Natural Person)
|
||||||
|
citizenId: string;
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
// NOTE: About (Legal Entity)
|
||||||
|
legalPersonNo: string;
|
||||||
|
registerName: string;
|
||||||
|
registerNameEN: string;
|
||||||
|
registerDate: Date;
|
||||||
|
authorizedCapital: string;
|
||||||
|
}
|
||||||
|
) & {
|
||||||
|
status?: Status;
|
||||||
|
|
||||||
|
workplace: string;
|
||||||
|
workplaceEN: string;
|
||||||
|
address: string;
|
||||||
|
addressEN: string;
|
||||||
|
soi?: string | null;
|
||||||
|
soiEN?: string | null;
|
||||||
|
moo?: string | null;
|
||||||
|
mooEN?: string | null;
|
||||||
|
street?: string | null;
|
||||||
|
streetEN?: string | null;
|
||||||
|
|
||||||
|
email: string;
|
||||||
|
contactName: string;
|
||||||
|
telephoneNo: string;
|
||||||
|
|
||||||
|
employmentOffice: string;
|
||||||
|
businessType: string;
|
||||||
|
businessTypeEN: string;
|
||||||
|
jobPosition: string;
|
||||||
|
jobPositionEN: string;
|
||||||
|
jobDescription: string;
|
||||||
|
saleEmployee: string;
|
||||||
|
payDate: Date;
|
||||||
|
wageRate: number;
|
||||||
|
|
||||||
|
subDistrictId?: string | null;
|
||||||
|
districtId?: string | null;
|
||||||
|
provinceId?: string | null;
|
||||||
|
})[];
|
||||||
};
|
};
|
||||||
|
|
||||||
export type CustomerUpdate = (
|
export type CustomerUpdate = {
|
||||||
| {
|
|
||||||
namePrefix: string;
|
|
||||||
firstName: string;
|
|
||||||
firstNameEN?: string;
|
|
||||||
lastName: string;
|
|
||||||
lastNameEN?: string;
|
|
||||||
gender: string;
|
|
||||||
birthDate: Date;
|
|
||||||
telephoneNo: string;
|
|
||||||
}
|
|
||||||
| {
|
|
||||||
legalPersonNo: string;
|
|
||||||
registerName: string;
|
|
||||||
registerNameEN: string;
|
|
||||||
businessType: string;
|
|
||||||
jobPosition: string;
|
|
||||||
telephoneNo: string;
|
|
||||||
}
|
|
||||||
) & {
|
|
||||||
registeredBranchId?: string;
|
registeredBranchId?: string;
|
||||||
status?: "ACTIVE" | "INACTIVE";
|
status?: "ACTIVE" | "INACTIVE";
|
||||||
customerType?: CustomerType;
|
customerType?: CustomerType;
|
||||||
|
|
@ -135,11 +143,15 @@ export class CustomerController extends Controller {
|
||||||
@Query() includeBranch: boolean = false,
|
@Query() includeBranch: boolean = false,
|
||||||
) {
|
) {
|
||||||
const where = {
|
const where = {
|
||||||
OR: [
|
OR: query
|
||||||
{ namePrefix: { contains: query } },
|
? [
|
||||||
{ firstName: { contains: query } },
|
{ branch: { some: { namePrefix: { contains: query } } } },
|
||||||
{ firstNameEN: { contains: query } },
|
{ branch: { some: { firstName: { contains: query } } } },
|
||||||
],
|
{ branch: { some: { firstNameEN: { contains: query } } } },
|
||||||
|
{ branch: { some: { lastName: { contains: query } } } },
|
||||||
|
{ branch: { some: { lastNameEN: { contains: query } } } },
|
||||||
|
]
|
||||||
|
: undefined,
|
||||||
AND: {
|
AND: {
|
||||||
customerType,
|
customerType,
|
||||||
...filterStatus(status),
|
...filterStatus(status),
|
||||||
|
|
@ -160,7 +172,15 @@ export class CustomerController extends Controller {
|
||||||
},
|
},
|
||||||
orderBy: { createdAt: "asc" },
|
orderBy: { createdAt: "asc" },
|
||||||
}
|
}
|
||||||
: undefined,
|
: {
|
||||||
|
include: {
|
||||||
|
province: true,
|
||||||
|
district: true,
|
||||||
|
subDistrict: true,
|
||||||
|
},
|
||||||
|
take: 1,
|
||||||
|
orderBy: { createdAt: "asc" },
|
||||||
|
},
|
||||||
createdBy: true,
|
createdBy: true,
|
||||||
updatedBy: true,
|
updatedBy: true,
|
||||||
},
|
},
|
||||||
|
|
@ -204,14 +224,14 @@ export class CustomerController extends Controller {
|
||||||
@Post()
|
@Post()
|
||||||
@Security("keycloak", MANAGE_ROLES)
|
@Security("keycloak", MANAGE_ROLES)
|
||||||
async create(@Request() req: RequestWithUser, @Body() body: CustomerCreate) {
|
async create(@Request() req: RequestWithUser, @Body() body: CustomerCreate) {
|
||||||
const [branch] = await prisma.$transaction([
|
const [registeredBranch] = await prisma.$transaction([
|
||||||
prisma.branch.findFirst({
|
prisma.branch.findFirst({
|
||||||
where: { id: body.registeredBranchId },
|
where: { id: body.registeredBranchId },
|
||||||
include: branchRelationPermInclude(req.user),
|
include: branchRelationPermInclude(req.user),
|
||||||
}),
|
}),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
await permissionCheck(req.user, branch);
|
await permissionCheck(req.user, registeredBranch);
|
||||||
|
|
||||||
const record = await prisma.$transaction(
|
const record = await prisma.$transaction(
|
||||||
async (tx) => {
|
async (tx) => {
|
||||||
|
|
@ -225,6 +245,31 @@ export class CustomerController extends Controller {
|
||||||
statusOrder: 1,
|
statusOrder: 1,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const { branch, ...rest } = body;
|
||||||
|
|
||||||
|
const company = (registeredBranch?.headOffice || registeredBranch)?.code;
|
||||||
|
const headoffice = branch[0];
|
||||||
|
|
||||||
|
if (!headoffice) {
|
||||||
|
throw new HttpError(
|
||||||
|
HttpStatus.BAD_REQUEST,
|
||||||
|
"Require at least one branch as headoffice",
|
||||||
|
"requireOneMinBranch",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const runningKey = `CUSTOMER_BRANCH_${company}_${"citizenId" in headoffice ? headoffice.citizenId : headoffice.legalPersonNo}`;
|
||||||
|
|
||||||
|
const last = await tx.runningNo.upsert({
|
||||||
|
where: { key: runningKey },
|
||||||
|
create: {
|
||||||
|
key: runningKey,
|
||||||
|
value: branch.length,
|
||||||
|
},
|
||||||
|
update: { value: { increment: branch.length } },
|
||||||
|
});
|
||||||
|
|
||||||
return await tx.customer.create({
|
return await tx.customer.create({
|
||||||
include: {
|
include: {
|
||||||
branch: {
|
branch: {
|
||||||
|
|
@ -238,7 +283,16 @@ export class CustomerController extends Controller {
|
||||||
updatedBy: true,
|
updatedBy: true,
|
||||||
},
|
},
|
||||||
data: {
|
data: {
|
||||||
...body,
|
...rest,
|
||||||
|
branch: {
|
||||||
|
create: branch.map((v, i) => ({
|
||||||
|
...v,
|
||||||
|
code: `${runningKey.replace("CUSTOMER_BRANCH_", "")}-${`${last.value - branch.length + i}`.padStart(2, "0")}`,
|
||||||
|
codeCustomer: runningKey.replace("CUSTOMER_BRANCH_", ""),
|
||||||
|
createdBy: { connect: { id: req.user.sub } },
|
||||||
|
updatedBy: { connect: { id: req.user.sub } },
|
||||||
|
})),
|
||||||
|
},
|
||||||
statusOrder: +(body.status === "INACTIVE"),
|
statusOrder: +(body.status === "INACTIVE"),
|
||||||
createdByUserId: req.user.sub,
|
createdByUserId: req.user.sub,
|
||||||
updatedByUserId: req.user.sub,
|
updatedByUserId: req.user.sub,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue