From bca1932ae337035b7f6f009be8c43948ed2bfcf3 Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Sun, 25 Jan 2026 14:08:28 +0330 Subject: [PATCH] order kitem entity update --- .../order/controllers/order.controller.ts | 4 +- .../order/dto/create-order-as-admin.dto.ts | 26 +++++------ src/modules/order/dto/create-order.dto.ts | 17 ++++--- .../order/entities/order-item.entity.ts | 6 +++ src/modules/order/providers/order.service.ts | 45 +++++-------------- 5 files changed, 39 insertions(+), 59 deletions(-) diff --git a/src/modules/order/controllers/order.controller.ts b/src/modules/order/controllers/order.controller.ts index 035532b..32d7f40 100644 --- a/src/modules/order/controllers/order.controller.ts +++ b/src/modules/order/controllers/order.controller.ts @@ -23,14 +23,14 @@ export class OrderController { @UseGuards(AuthGuard) @ApiOperation({ summary: 'create order as user' }) createOrder(@UserId() userId: string, @Body() body: CreateOrderDto) { - return this.orderService.createOrder(userId, body); + return this.orderService.createNewOrder(userId, body); } @Get('public/orders') @UseGuards(AuthGuard) @ApiOperation({ summary: 'Get all orders with pagination and filters' }) async findAll(@Query() dto: FindOrdersDto, @UserId() userId: string) { - const orders = await this.orderService.findAllForUser(userId, dto); + const orders = await this.orderService.findUserOrders(userId, dto); return orders } diff --git a/src/modules/order/dto/create-order-as-admin.dto.ts b/src/modules/order/dto/create-order-as-admin.dto.ts index f960c90..5b4ee5a 100644 --- a/src/modules/order/dto/create-order-as-admin.dto.ts +++ b/src/modules/order/dto/create-order-as-admin.dto.ts @@ -1,6 +1,6 @@ import { - IsString, IsOptional, IsBoolean, - IsInt, Min, IsArray, IsNumber, + IsString, + IsInt, IsArray, IsNumber, IsNotEmpty, ArrayMinSize, IsMobilePhone @@ -25,6 +25,15 @@ export class CreateOrderItemDto { @ApiProperty() @IsNumber() unitPrice: number + + @ApiPropertyOptional({ example: 'توضیحات' }) + @IsString() + content: string + + @ApiPropertyOptional({ example: [] }) + @IsArray() + @IsString({ each: true }) + attachments: { url: string, type: string }[] } export class CreateOrderAsAdminDto { @@ -49,18 +58,5 @@ export class CreateOrderAsAdminDto { @Type(() => CreateOrderItemDto) items: CreateOrderItemDto[]; - @ApiPropertyOptional({ example: 'توضیحات' }) - @IsString() - content: string - - @ApiPropertyOptional({ example: [] }) - @IsArray() - @IsString({ each: true }) - attachments: string[] - - - @ApiProperty() - @IsNumber() - discount: number } diff --git a/src/modules/order/dto/create-order.dto.ts b/src/modules/order/dto/create-order.dto.ts index 1756adc..39f79aa 100644 --- a/src/modules/order/dto/create-order.dto.ts +++ b/src/modules/order/dto/create-order.dto.ts @@ -20,6 +20,14 @@ export class CreateOrderItemDto { @ApiProperty() @IsArray() attributesValues: string[] + + @ApiPropertyOptional({ example: 'توضیحات' }) + @IsString() + description: string + + @ApiPropertyOptional({ example: [] }) + @IsArray() + attachments: { url: string, type: string }[] } export class CreateOrderDto { @@ -37,14 +45,5 @@ export class CreateOrderDto { @ArrayMinSize(1, { message: 'At least one product is required' }) @Type(() => CreateOrderItemDto) items: CreateOrderItemDto[]; - - @ApiPropertyOptional({ example: 'توضیحات' }) - @IsString() - content: string - - @ApiPropertyOptional({ example: [] }) - @IsArray() - @IsString({ each: true }) - attachments: string[] } diff --git a/src/modules/order/entities/order-item.entity.ts b/src/modules/order/entities/order-item.entity.ts index 6217d01..3bb1886 100644 --- a/src/modules/order/entities/order-item.entity.ts +++ b/src/modules/order/entities/order-item.entity.ts @@ -40,6 +40,12 @@ export class OrderItem extends BaseEntity { @Property({ nullable: true }) description?: string; + @Property({ nullable: true }) + adminDescription?: string; + + @Property({ type: 'json', nullable: true }) + attachments?: { type: string, url: string }[] // user attachments like voice and photos + // @Enum(() => OrderItemStatus) // status!: OrderItemStatus; @Property({ nullable: true, columnType: 'timestamptz' }) diff --git a/src/modules/order/providers/order.service.ts b/src/modules/order/providers/order.service.ts index 986a2a6..0b10098 100644 --- a/src/modules/order/providers/order.service.ts +++ b/src/modules/order/providers/order.service.ts @@ -35,8 +35,8 @@ export class OrderService { private readonly adminRepository: AdminRepository, ) { } - async createOrder(userId: string, dto: CreateOrderDto) { - const { attachments, content, items } = dto + async createNewOrder(userId: string, dto: CreateOrderDto) { + const { items } = dto const order = await this.em.transactional(async (em) => { const user = await this.userService.findById(userId) @@ -48,7 +48,6 @@ export class OrderService { user, discount: 0, subTotal: 0, - orderNumber: 1, total: 0, paidAmount: 0, balance: 0, @@ -79,19 +78,13 @@ export class OrderService { unitPrice: 0, total: 0, subTotal: 0, - discount: 0 + discount: 0, + attachments: item.attachments, + description: item.description }) em.persist(orderItem) }); - const ticket = this.ticketRepository.create({ - content, - user, - attachments, - admin: null, - order - }) - em.persist(ticket) await em.flush() @@ -102,7 +95,7 @@ export class OrderService { } async createOrdeAsAdmin(adminId: string, dto: CreateOrderAsAdminDto) { - const { attachments, content, items, discount, userPhone } = dto + const { items, userPhone } = dto const user = await this.userService.findByPhone(userPhone) if (!user) { @@ -116,18 +109,14 @@ export class OrderService { const order = await this.em.transactional(async (em) => { - let subTotal = 0 - items.forEach(item => { subTotal += item.unitPrice * item.quantity }) - const total = subTotal - discount - const order = this.orderRepository.create({ creator: admin, user, - discount, - subTotal, - total, + discount: 0, + subTotal: 0, + total: 0, paidAmount: 0, - balance: total, + balance: 0, status: OrderStatusEnum.INVOICED, taxAmount: 0 }) @@ -150,7 +139,6 @@ export class OrderService { throw new BadRequestException(`product ${product} not found`) } - const orderItem = this.orderItemRepository.create({ order, attributesValues: item.attributesValues, @@ -165,16 +153,7 @@ export class OrderService { em.persist(orderItem) }); - - const ticket = this.ticketRepository.create({ - content, - user, - attachments, - admin: null, - order - }) - - em.persist(ticket) + // TODO : calculation must be done after create order await em.flush() @@ -185,7 +164,7 @@ export class OrderService { } - async findAllForUser(userId: string, dto: FindOrdersDto) { + async findUserOrders(userId: string, dto: FindOrdersDto) { const orders = await this.orderRepository.findAllPaginated({ userId, ...dto }) return orders }