Spaces:
Sleeping
Sleeping
Trần Viết Sơn
commited on
Commit
•
3367e34
1
Parent(s):
f97bd0c
feat: all thing about order
Browse files- backend/src/entities/order-item.entity.ts +2 -2
- backend/src/entities/order.entity.ts +7 -6
- backend/src/migrations/{1730432721785-RefactorAll.ts → 1730474673934-RefactorAll.ts} +12 -12
- backend/src/modules/order/dto/create-order.dto.ts +14 -12
- backend/src/modules/order/dto/order-items.dto.ts +7 -1
- backend/src/modules/order/order.controller.ts +26 -4
- backend/src/modules/order/order.module.ts +3 -0
- backend/src/modules/order/order.service.ts +119 -3
backend/src/entities/order-item.entity.ts
CHANGED
@@ -16,7 +16,7 @@ export class OrderItemEntity extends BaseEntity {
|
|
16 |
id: number;
|
17 |
|
18 |
@Column()
|
19 |
-
order_id:
|
20 |
|
21 |
@ManyToOne(() => OrderEntity, (a) => a.order_items)
|
22 |
@JoinColumn({ name: 'order_id' })
|
@@ -26,7 +26,7 @@ export class OrderItemEntity extends BaseEntity {
|
|
26 |
branch_menu_id: string;
|
27 |
|
28 |
@ManyToOne(() => BranchMenuEntity)
|
29 |
-
@JoinColumn({ name: '
|
30 |
branch_menu: Relation<BranchMenuEntity>;
|
31 |
|
32 |
@Column()
|
|
|
16 |
id: number;
|
17 |
|
18 |
@Column()
|
19 |
+
order_id: number;
|
20 |
|
21 |
@ManyToOne(() => OrderEntity, (a) => a.order_items)
|
22 |
@JoinColumn({ name: 'order_id' })
|
|
|
26 |
branch_menu_id: string;
|
27 |
|
28 |
@ManyToOne(() => BranchMenuEntity)
|
29 |
+
@JoinColumn({ name: 'branch_menu_id' })
|
30 |
branch_menu: Relation<BranchMenuEntity>;
|
31 |
|
32 |
@Column()
|
backend/src/entities/order.entity.ts
CHANGED
@@ -26,6 +26,7 @@ export class OrderEntity extends BaseEntity {
|
|
26 |
customer_id: string;
|
27 |
|
28 |
@ManyToOne(() => UserEntity, { nullable: true })
|
|
|
29 |
customer: Relation<UserEntity>;
|
30 |
|
31 |
@Column()
|
@@ -35,12 +36,12 @@ export class OrderEntity extends BaseEntity {
|
|
35 |
@JoinColumn({ name: 'branch_id' })
|
36 |
branch: Relation<BranchEntity>;
|
37 |
|
38 |
-
@Column()
|
39 |
-
|
40 |
|
41 |
-
@ManyToOne(() => UserEntity)
|
42 |
-
@JoinColumn({ name: '
|
43 |
-
|
44 |
|
45 |
@Column({ nullable: true })
|
46 |
table_number: number;
|
@@ -64,6 +65,6 @@ export class OrderEntity extends BaseEntity {
|
|
64 |
payment_id: number;
|
65 |
|
66 |
@OneToOne(() => PaymentEntity, (a) => a.order)
|
67 |
-
@JoinColumn()
|
68 |
payment: Relation<PaymentEntity>;
|
69 |
}
|
|
|
26 |
customer_id: string;
|
27 |
|
28 |
@ManyToOne(() => UserEntity, { nullable: true })
|
29 |
+
@JoinColumn({ name: 'customer_id' })
|
30 |
customer: Relation<UserEntity>;
|
31 |
|
32 |
@Column()
|
|
|
36 |
@JoinColumn({ name: 'branch_id' })
|
37 |
branch: Relation<BranchEntity>;
|
38 |
|
39 |
+
@Column({ nullable: true })
|
40 |
+
staff_id: string;
|
41 |
|
42 |
+
@ManyToOne(() => UserEntity, { nullable: true })
|
43 |
+
@JoinColumn({ name: 'staff_id' })
|
44 |
+
staff: Relation<UserEntity>;
|
45 |
|
46 |
@Column({ nullable: true })
|
47 |
table_number: number;
|
|
|
65 |
payment_id: number;
|
66 |
|
67 |
@OneToOne(() => PaymentEntity, (a) => a.order)
|
68 |
+
@JoinColumn({ name: 'payment_id' })
|
69 |
payment: Relation<PaymentEntity>;
|
70 |
}
|
backend/src/migrations/{1730432721785-RefactorAll.ts → 1730474673934-RefactorAll.ts}
RENAMED
@@ -1,7 +1,7 @@
|
|
1 |
import { MigrationInterface, QueryRunner } from "typeorm";
|
2 |
|
3 |
-
export class
|
4 |
-
name = '
|
5 |
|
6 |
public async up(queryRunner: QueryRunner): Promise<void> {
|
7 |
await queryRunner.query(`CREATE TABLE "feeds" ("id" SERIAL NOT NULL, "author_id" character varying, "image_url" character varying, "title" character varying NOT NULL, "description" character varying, "create_at" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_3dafbf766ecbb1eb2017732153f" PRIMARY KEY ("id"))`);
|
@@ -15,26 +15,26 @@ export class RefactorAll1730432721785 implements MigrationInterface {
|
|
15 |
await queryRunner.query(`CREATE TABLE "payments" ("id" SERIAL NOT NULL, "payment_method" "public"."payments_payment_method_enum" NOT NULL DEFAULT 'cash', "value" integer NOT NULL, CONSTRAINT "PK_197ab7af18c93fbb0c9b28b4a59" PRIMARY KEY ("id"))`);
|
16 |
await queryRunner.query(`CREATE TYPE "public"."orders_order_type_enum" AS ENUM('take_away', 'offline', 'online')`);
|
17 |
await queryRunner.query(`CREATE TYPE "public"."orders_order_status_enum" AS ENUM('pending', 'confirmed', 'preparing', 'delivering', 'done')`);
|
18 |
-
await queryRunner.query(`CREATE TABLE "orders" ("id" SERIAL NOT NULL, "customer_id"
|
19 |
-
await queryRunner.query(`CREATE TABLE "order_items" ("id" SERIAL NOT NULL, "order_id" integer NOT NULL, "branch_menu_id"
|
20 |
await queryRunner.query(`ALTER TABLE "branches" ADD CONSTRAINT "FK_8c6ae9f9c654c4fac71bccbb7ed" FOREIGN KEY ("ownerId") REFERENCES "users"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
|
21 |
await queryRunner.query(`ALTER TABLE "branch_menu" ADD CONSTRAINT "FK_96fd74bed807987cf2ee5d8f168" FOREIGN KEY ("branch_id") REFERENCES "branches"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
|
22 |
await queryRunner.query(`ALTER TABLE "branch_menu" ADD CONSTRAINT "FK_703aa953158d2e80f3fbb0eb9ea" FOREIGN KEY ("menu_id") REFERENCES "menu_items"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
|
23 |
-
await queryRunner.query(`ALTER TABLE "orders" ADD CONSTRAINT "
|
24 |
await queryRunner.query(`ALTER TABLE "orders" ADD CONSTRAINT "FK_17b723da2c12837f4bc21e33398" FOREIGN KEY ("branch_id") REFERENCES "branches"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
|
25 |
-
await queryRunner.query(`ALTER TABLE "orders" ADD CONSTRAINT "
|
26 |
-
await queryRunner.query(`ALTER TABLE "orders" ADD CONSTRAINT "
|
27 |
await queryRunner.query(`ALTER TABLE "order_items" ADD CONSTRAINT "FK_145532db85752b29c57d2b7b1f1" FOREIGN KEY ("order_id") REFERENCES "orders"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
|
28 |
-
await queryRunner.query(`ALTER TABLE "order_items" ADD CONSTRAINT "
|
29 |
}
|
30 |
|
31 |
public async down(queryRunner: QueryRunner): Promise<void> {
|
32 |
-
await queryRunner.query(`ALTER TABLE "order_items" DROP CONSTRAINT "
|
33 |
await queryRunner.query(`ALTER TABLE "order_items" DROP CONSTRAINT "FK_145532db85752b29c57d2b7b1f1"`);
|
34 |
-
await queryRunner.query(`ALTER TABLE "orders" DROP CONSTRAINT "
|
35 |
-
await queryRunner.query(`ALTER TABLE "orders" DROP CONSTRAINT "
|
36 |
await queryRunner.query(`ALTER TABLE "orders" DROP CONSTRAINT "FK_17b723da2c12837f4bc21e33398"`);
|
37 |
-
await queryRunner.query(`ALTER TABLE "orders" DROP CONSTRAINT "
|
38 |
await queryRunner.query(`ALTER TABLE "branch_menu" DROP CONSTRAINT "FK_703aa953158d2e80f3fbb0eb9ea"`);
|
39 |
await queryRunner.query(`ALTER TABLE "branch_menu" DROP CONSTRAINT "FK_96fd74bed807987cf2ee5d8f168"`);
|
40 |
await queryRunner.query(`ALTER TABLE "branches" DROP CONSTRAINT "FK_8c6ae9f9c654c4fac71bccbb7ed"`);
|
|
|
1 |
import { MigrationInterface, QueryRunner } from "typeorm";
|
2 |
|
3 |
+
export class RefactorAll1730474673934 implements MigrationInterface {
|
4 |
+
name = 'RefactorAll1730474673934'
|
5 |
|
6 |
public async up(queryRunner: QueryRunner): Promise<void> {
|
7 |
await queryRunner.query(`CREATE TABLE "feeds" ("id" SERIAL NOT NULL, "author_id" character varying, "image_url" character varying, "title" character varying NOT NULL, "description" character varying, "create_at" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_3dafbf766ecbb1eb2017732153f" PRIMARY KEY ("id"))`);
|
|
|
15 |
await queryRunner.query(`CREATE TABLE "payments" ("id" SERIAL NOT NULL, "payment_method" "public"."payments_payment_method_enum" NOT NULL DEFAULT 'cash', "value" integer NOT NULL, CONSTRAINT "PK_197ab7af18c93fbb0c9b28b4a59" PRIMARY KEY ("id"))`);
|
16 |
await queryRunner.query(`CREATE TYPE "public"."orders_order_type_enum" AS ENUM('take_away', 'offline', 'online')`);
|
17 |
await queryRunner.query(`CREATE TYPE "public"."orders_order_status_enum" AS ENUM('pending', 'confirmed', 'preparing', 'delivering', 'done')`);
|
18 |
+
await queryRunner.query(`CREATE TABLE "orders" ("id" SERIAL NOT NULL, "customer_id" uuid, "branch_id" character varying NOT NULL, "staff_id" uuid, "table_number" integer, "total_value" integer NOT NULL, "create_at" TIMESTAMP NOT NULL DEFAULT now(), "order_type" "public"."orders_order_type_enum" NOT NULL DEFAULT 'online', "order_status" "public"."orders_order_status_enum" NOT NULL DEFAULT 'pending', "payment_id" integer, CONSTRAINT "REL_5b3e94bd2aedc184f9ad8c1043" UNIQUE ("payment_id"), CONSTRAINT "PK_710e2d4957aa5878dfe94e4ac2f" PRIMARY KEY ("id"))`);
|
19 |
+
await queryRunner.query(`CREATE TABLE "order_items" ("id" SERIAL NOT NULL, "order_id" integer NOT NULL, "branch_menu_id" uuid NOT NULL, "quantity" integer NOT NULL, "price" integer NOT NULL, CONSTRAINT "PK_005269d8574e6fac0493715c308" PRIMARY KEY ("id"))`);
|
20 |
await queryRunner.query(`ALTER TABLE "branches" ADD CONSTRAINT "FK_8c6ae9f9c654c4fac71bccbb7ed" FOREIGN KEY ("ownerId") REFERENCES "users"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
|
21 |
await queryRunner.query(`ALTER TABLE "branch_menu" ADD CONSTRAINT "FK_96fd74bed807987cf2ee5d8f168" FOREIGN KEY ("branch_id") REFERENCES "branches"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
|
22 |
await queryRunner.query(`ALTER TABLE "branch_menu" ADD CONSTRAINT "FK_703aa953158d2e80f3fbb0eb9ea" FOREIGN KEY ("menu_id") REFERENCES "menu_items"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
|
23 |
+
await queryRunner.query(`ALTER TABLE "orders" ADD CONSTRAINT "FK_772d0ce0473ac2ccfa26060dbe9" FOREIGN KEY ("customer_id") REFERENCES "users"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
|
24 |
await queryRunner.query(`ALTER TABLE "orders" ADD CONSTRAINT "FK_17b723da2c12837f4bc21e33398" FOREIGN KEY ("branch_id") REFERENCES "branches"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
|
25 |
+
await queryRunner.query(`ALTER TABLE "orders" ADD CONSTRAINT "FK_40337bbb0e0cc7113dc3037fc60" FOREIGN KEY ("staff_id") REFERENCES "users"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
|
26 |
+
await queryRunner.query(`ALTER TABLE "orders" ADD CONSTRAINT "FK_5b3e94bd2aedc184f9ad8c10439" FOREIGN KEY ("payment_id") REFERENCES "payments"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
|
27 |
await queryRunner.query(`ALTER TABLE "order_items" ADD CONSTRAINT "FK_145532db85752b29c57d2b7b1f1" FOREIGN KEY ("order_id") REFERENCES "orders"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
|
28 |
+
await queryRunner.query(`ALTER TABLE "order_items" ADD CONSTRAINT "FK_927879f38b3098216737427d2f0" FOREIGN KEY ("branch_menu_id") REFERENCES "branch_menu"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
|
29 |
}
|
30 |
|
31 |
public async down(queryRunner: QueryRunner): Promise<void> {
|
32 |
+
await queryRunner.query(`ALTER TABLE "order_items" DROP CONSTRAINT "FK_927879f38b3098216737427d2f0"`);
|
33 |
await queryRunner.query(`ALTER TABLE "order_items" DROP CONSTRAINT "FK_145532db85752b29c57d2b7b1f1"`);
|
34 |
+
await queryRunner.query(`ALTER TABLE "orders" DROP CONSTRAINT "FK_5b3e94bd2aedc184f9ad8c10439"`);
|
35 |
+
await queryRunner.query(`ALTER TABLE "orders" DROP CONSTRAINT "FK_40337bbb0e0cc7113dc3037fc60"`);
|
36 |
await queryRunner.query(`ALTER TABLE "orders" DROP CONSTRAINT "FK_17b723da2c12837f4bc21e33398"`);
|
37 |
+
await queryRunner.query(`ALTER TABLE "orders" DROP CONSTRAINT "FK_772d0ce0473ac2ccfa26060dbe9"`);
|
38 |
await queryRunner.query(`ALTER TABLE "branch_menu" DROP CONSTRAINT "FK_703aa953158d2e80f3fbb0eb9ea"`);
|
39 |
await queryRunner.query(`ALTER TABLE "branch_menu" DROP CONSTRAINT "FK_96fd74bed807987cf2ee5d8f168"`);
|
40 |
await queryRunner.query(`ALTER TABLE "branches" DROP CONSTRAINT "FK_8c6ae9f9c654c4fac71bccbb7ed"`);
|
backend/src/modules/order/dto/create-order.dto.ts
CHANGED
@@ -1,24 +1,26 @@
|
|
1 |
-
import {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
import { OrderType } from '../../../common/enums/OrderType.enum.js';
|
3 |
import { OrderItemsDto } from './order-items.dto.js';
|
|
|
4 |
|
5 |
export class CreateOrderDto {
|
6 |
-
@IsString()
|
7 |
-
customer_id: string;
|
8 |
-
|
9 |
-
@IsString()
|
10 |
-
branch_id: string;
|
11 |
-
|
12 |
-
@IsString()
|
13 |
-
employee_id: string;
|
14 |
-
|
15 |
@IsOptional()
|
16 |
-
@
|
17 |
table_number?: number;
|
18 |
|
19 |
@IsEnum(OrderType)
|
20 |
order_type: OrderType;
|
21 |
|
22 |
-
|
|
|
|
|
23 |
order_items: OrderItemsDto[];
|
24 |
}
|
|
|
1 |
+
import {
|
2 |
+
IsArray,
|
3 |
+
IsEnum,
|
4 |
+
IsNumber,
|
5 |
+
IsObject,
|
6 |
+
IsOptional,
|
7 |
+
IsString,
|
8 |
+
ValidateNested,
|
9 |
+
} from 'class-validator';
|
10 |
import { OrderType } from '../../../common/enums/OrderType.enum.js';
|
11 |
import { OrderItemsDto } from './order-items.dto.js';
|
12 |
+
import { Type } from 'class-transformer';
|
13 |
|
14 |
export class CreateOrderDto {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
@IsOptional()
|
16 |
+
@IsNumber()
|
17 |
table_number?: number;
|
18 |
|
19 |
@IsEnum(OrderType)
|
20 |
order_type: OrderType;
|
21 |
|
22 |
+
@IsArray()
|
23 |
+
@ValidateNested()
|
24 |
+
@Type(() => OrderItemsDto)
|
25 |
order_items: OrderItemsDto[];
|
26 |
}
|
backend/src/modules/order/dto/order-items.dto.ts
CHANGED
@@ -1,3 +1,9 @@
|
|
|
|
|
|
1 |
export class OrderItemsDto {
|
2 |
-
|
|
|
|
|
|
|
|
|
3 |
}
|
|
|
1 |
+
import { IsNumber, IsString } from 'class-validator';
|
2 |
+
|
3 |
export class OrderItemsDto {
|
4 |
+
@IsString()
|
5 |
+
menu_id: string;
|
6 |
+
|
7 |
+
@IsNumber()
|
8 |
+
quantity: number;
|
9 |
}
|
backend/src/modules/order/order.controller.ts
CHANGED
@@ -6,21 +6,43 @@ import {
|
|
6 |
Patch,
|
7 |
Param,
|
8 |
Delete,
|
|
|
9 |
} from '@nestjs/common';
|
10 |
import { OrderService } from './order.service.js';
|
11 |
import { CreateOrderDto } from './dto/create-order.dto.js';
|
|
|
12 |
|
13 |
-
@Controller('
|
14 |
export class OrderController {
|
15 |
constructor(private readonly orderService: OrderService) {}
|
16 |
|
17 |
@Post()
|
18 |
-
async create(
|
19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 |
}
|
21 |
|
22 |
@Get()
|
23 |
-
async findAll() {
|
|
|
|
|
24 |
return this.orderService.findAll();
|
25 |
}
|
26 |
|
|
|
6 |
Patch,
|
7 |
Param,
|
8 |
Delete,
|
9 |
+
Req,
|
10 |
} from '@nestjs/common';
|
11 |
import { OrderService } from './order.service.js';
|
12 |
import { CreateOrderDto } from './dto/create-order.dto.js';
|
13 |
+
import { Role } from '../../common/enums/role.enum.js';
|
14 |
|
15 |
+
@Controller('branchs/:branchId/orders')
|
16 |
export class OrderController {
|
17 |
constructor(private readonly orderService: OrderService) {}
|
18 |
|
19 |
@Post()
|
20 |
+
async create(
|
21 |
+
@Param('branchId') branchId: string,
|
22 |
+
@Req() req: Request,
|
23 |
+
@Body() createOrderDto: CreateOrderDto,
|
24 |
+
) {
|
25 |
+
const userId = req['user'].sub;
|
26 |
+
const role = req['user'].roles;
|
27 |
+
console.log(req['user']);
|
28 |
+
if (role == Role.CUSTOMER)
|
29 |
+
return this.orderService.createFromCustomer(
|
30 |
+
branchId,
|
31 |
+
userId,
|
32 |
+
createOrderDto,
|
33 |
+
);
|
34 |
+
else
|
35 |
+
return this.orderService.createFromStaff(
|
36 |
+
branchId,
|
37 |
+
userId,
|
38 |
+
createOrderDto,
|
39 |
+
);
|
40 |
}
|
41 |
|
42 |
@Get()
|
43 |
+
async findAll(@Req() req: Request) {
|
44 |
+
const userId = req['user'].sub;
|
45 |
+
console.log(req['user']);
|
46 |
return this.orderService.findAll();
|
47 |
}
|
48 |
|
backend/src/modules/order/order.module.ts
CHANGED
@@ -1,8 +1,11 @@
|
|
1 |
import { Module } from '@nestjs/common';
|
2 |
import { OrderService } from './order.service.js';
|
3 |
import { OrderController } from './order.controller.js';
|
|
|
|
|
4 |
|
5 |
@Module({
|
|
|
6 |
controllers: [OrderController],
|
7 |
providers: [OrderService],
|
8 |
})
|
|
|
1 |
import { Module } from '@nestjs/common';
|
2 |
import { OrderService } from './order.service.js';
|
3 |
import { OrderController } from './order.controller.js';
|
4 |
+
import { BranchModule } from '../branch/branch.module.js';
|
5 |
+
import { BranchMenusModule } from '../branch-menus/branch-menus.module.js';
|
6 |
|
7 |
@Module({
|
8 |
+
imports: [BranchModule, BranchMenusModule],
|
9 |
controllers: [OrderController],
|
10 |
providers: [OrderService],
|
11 |
})
|
backend/src/modules/order/order.service.ts
CHANGED
@@ -1,10 +1,126 @@
|
|
1 |
-
import { Injectable } from '@nestjs/common';
|
2 |
import { CreateOrderDto } from './dto/create-order.dto.js';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
4 |
@Injectable()
|
5 |
export class OrderService {
|
6 |
-
|
7 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
}
|
9 |
|
10 |
findAll() {
|
|
|
1 |
+
import { BadRequestException, Injectable } from '@nestjs/common';
|
2 |
import { CreateOrderDto } from './dto/create-order.dto.js';
|
3 |
+
import { UserEntity } from '../../entities/user.entity.js';
|
4 |
+
import { OrderEntity } from '../../entities/order.entity.js';
|
5 |
+
import { BranchService } from '../branch/branch.service.js';
|
6 |
+
import { OrderType } from '../../common/enums/OrderType.enum.js';
|
7 |
+
import { isUUID } from 'class-validator';
|
8 |
+
import { OrderItemEntity } from '../../entities/order-item.entity.js';
|
9 |
+
import { BranchMenuEntity } from '../../entities/branch-menu.entity.js';
|
10 |
+
import { OrderStatus } from '../../common/enums/OrderStatus.enum.js';
|
11 |
|
12 |
@Injectable()
|
13 |
export class OrderService {
|
14 |
+
constructor(private readonly branchService: BranchService) {}
|
15 |
+
async createFromCustomer(
|
16 |
+
branchId: string,
|
17 |
+
userId: string,
|
18 |
+
createOrderDto: CreateOrderDto,
|
19 |
+
) {
|
20 |
+
console.log('??');
|
21 |
+
if (createOrderDto.order_type != OrderType.ONLINE) {
|
22 |
+
throw new BadRequestException('customer cannot create offline order');
|
23 |
+
}
|
24 |
+
|
25 |
+
const user = await UserEntity.findOneBy({ id: userId });
|
26 |
+
if (!user) {
|
27 |
+
throw new BadRequestException('User not found');
|
28 |
+
}
|
29 |
+
const branch = await this.branchService.getBranchOrError(branchId);
|
30 |
+
if (!branch) {
|
31 |
+
throw new BadRequestException('Branch not found');
|
32 |
+
}
|
33 |
+
const order = OrderEntity.create();
|
34 |
+
order.branch = branch;
|
35 |
+
order.customer = user;
|
36 |
+
order.order_type = createOrderDto.order_type;
|
37 |
+
order.order_status = OrderStatus.PENDING;
|
38 |
+
order.total_value = 0;
|
39 |
+
await order.save();
|
40 |
+
|
41 |
+
let orderItems: OrderItemEntity[] = [];
|
42 |
+
let totalValue = 0;
|
43 |
+
for (const item of createOrderDto.order_items) {
|
44 |
+
let branchMenu: BranchMenuEntity;
|
45 |
+
if (!isUUID(item.menu_id)) {
|
46 |
+
branchMenu = await BranchMenuEntity.findOne({
|
47 |
+
where: { branch_id: branchId, menu_id: item.menu_id },
|
48 |
+
relations: ['menu_item'],
|
49 |
+
});
|
50 |
+
} else {
|
51 |
+
branchMenu = await BranchMenuEntity.findOne({
|
52 |
+
where: { branch_id: branchId, id: item.menu_id },
|
53 |
+
relations: ['menu_item'],
|
54 |
+
});
|
55 |
+
}
|
56 |
+
if (!branchMenu) {
|
57 |
+
throw new BadRequestException('Item not found in branch menu');
|
58 |
+
}
|
59 |
+
const orderItem = OrderItemEntity.create();
|
60 |
+
orderItem.branch_menu = branchMenu;
|
61 |
+
orderItem.price = branchMenu.menu_item.price;
|
62 |
+
orderItem.quantity = item.quantity;
|
63 |
+
orderItem.order_id = order.id;
|
64 |
+
totalValue += orderItem.price * orderItem.quantity;
|
65 |
+
orderItems.push(orderItem);
|
66 |
+
}
|
67 |
+
await order.save();
|
68 |
+
order.total_value = totalValue;
|
69 |
+
await OrderItemEntity.save(orderItems);
|
70 |
+
return { ...order, order_items: orderItems };
|
71 |
+
}
|
72 |
+
|
73 |
+
async createFromStaff(
|
74 |
+
branchId: string,
|
75 |
+
userId: string,
|
76 |
+
createOrderDto: CreateOrderDto,
|
77 |
+
) {
|
78 |
+
if (createOrderDto.order_type == OrderType.ONLINE) {
|
79 |
+
throw new BadRequestException('staff cannot create online order');
|
80 |
+
}
|
81 |
+
// staff
|
82 |
+
const staff = await UserEntity.findOneBy({ id: userId });
|
83 |
+
const branch = await this.branchService.getBranchOrError(branchId);
|
84 |
+
const order = OrderEntity.create();
|
85 |
+
|
86 |
+
order.branch = branch;
|
87 |
+
order.staff = staff;
|
88 |
+
order.order_type = createOrderDto.order_type;
|
89 |
+
order.table_number = createOrderDto.table_number;
|
90 |
+
order.order_status = OrderStatus.PREPARING;
|
91 |
+
order.total_value = 0;
|
92 |
+
await order.save();
|
93 |
+
|
94 |
+
let orderItems: OrderItemEntity[] = [];
|
95 |
+
let totalValue = 0;
|
96 |
+
for (const item of createOrderDto.order_items) {
|
97 |
+
let branchMenu: BranchMenuEntity;
|
98 |
+
if (!isUUID(item.menu_id)) {
|
99 |
+
branchMenu = await BranchMenuEntity.findOne({
|
100 |
+
where: { branch_id: branchId, menu_id: item.menu_id },
|
101 |
+
relations: ['menu_item'],
|
102 |
+
});
|
103 |
+
} else {
|
104 |
+
branchMenu = await BranchMenuEntity.findOne({
|
105 |
+
where: { branch_id: branchId, id: item.menu_id },
|
106 |
+
relations: ['menu_item'],
|
107 |
+
});
|
108 |
+
}
|
109 |
+
if (!branchMenu) {
|
110 |
+
throw new BadRequestException('Item not found in branch menu');
|
111 |
+
}
|
112 |
+
const orderItem = OrderItemEntity.create();
|
113 |
+
orderItem.branch_menu = branchMenu;
|
114 |
+
orderItem.price = branchMenu.menu_item.price;
|
115 |
+
orderItem.quantity = item.quantity;
|
116 |
+
orderItem.order_id = order.id;
|
117 |
+
totalValue += orderItem.price * orderItem.quantity;
|
118 |
+
orderItems.push(orderItem);
|
119 |
+
}
|
120 |
+
await order.save();
|
121 |
+
order.total_value = totalValue;
|
122 |
+
await OrderItemEntity.save(orderItems);
|
123 |
+
return { ...order, order_items: orderItems };
|
124 |
}
|
125 |
|
126 |
findAll() {
|