From e97908d4c43d642be9148f920153ea078a0c46d9 Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Thu, 2 Jul 2026 23:03:43 +0330 Subject: [PATCH] transfer chats --- src/modules/chat/providers/chat.service.ts | 4 ++++ src/modules/invoice/invoice.module.ts | 2 ++ src/modules/invoice/invoice.service.ts | 23 ++++---------------- src/modules/order/dto/create-order.dto.ts | 6 ++++- src/modules/order/providers/order.service.ts | 9 ++++++++ src/modules/request/request.module.ts | 1 + src/modules/request/request.service.ts | 10 ++++++--- 7 files changed, 32 insertions(+), 23 deletions(-) diff --git a/src/modules/chat/providers/chat.service.ts b/src/modules/chat/providers/chat.service.ts index ad7d9a3..f826f58 100755 --- a/src/modules/chat/providers/chat.service.ts +++ b/src/modules/chat/providers/chat.service.ts @@ -146,6 +146,10 @@ export class ChattService { await em.nativeDelete(Chat, { refId }); } + async moveChatsRefId(fromRefId: string, toRefId: string, em: EntityManager = this.em) { + await em.nativeUpdate(Chat, { refId: fromRefId }, { refId: toRefId }); + } + async updateChat(chat: Chat, dto: UpdateChatDto) { this.chatRepository.assign(chat, dto, { diff --git a/src/modules/invoice/invoice.module.ts b/src/modules/invoice/invoice.module.ts index e242e6a..742fe94 100644 --- a/src/modules/invoice/invoice.module.ts +++ b/src/modules/invoice/invoice.module.ts @@ -5,6 +5,7 @@ import { InvoiceController } from './invoice.controller'; import { Invoice } from './entities/invoice.entity'; import { InvoiceItem } from './entities/invoice-item.entity'; import { ProductModule } from '../product/product.module'; +import { RequestModule } from '../request/request.module'; import { InvoiceRepository } from './repositories/invoice.repository'; import { InvoiceListeners } from './listeners/invoice.listeners'; import { JwtModule } from '@nestjs/jwt'; @@ -16,6 +17,7 @@ import { NotificationsModule } from '../notification/notifications.module'; imports: [ MikroOrmModule.forFeature([Invoice, InvoiceItem]), ProductModule, + RequestModule, RolesModule, JwtModule, AuthModule, diff --git a/src/modules/invoice/invoice.service.ts b/src/modules/invoice/invoice.service.ts index 30818bc..5dd87c8 100644 --- a/src/modules/invoice/invoice.service.ts +++ b/src/modules/invoice/invoice.service.ts @@ -9,6 +9,7 @@ import { InvoiceItem } from './entities/invoice-item.entity'; import { Request } from '../request/entities/request.entity'; import { User } from '../user/entities/user.entity'; import { ProductService } from '../product/providers/product.service'; +import { RequestService } from '../request/request.service'; import { InvoiceRepository } from './repositories/invoice.repository'; import { InvoiceCreatedEvent } from './events/invoice.events'; const TAX_RATE = 0.1; @@ -23,6 +24,7 @@ export class InvoiceService { constructor( private readonly em: EntityManager, private readonly productService: ProductService, + private readonly requestService: RequestService, private readonly invoiceRepository: InvoiceRepository, private readonly eventEmitter: EventEmitter2, ) { } @@ -129,27 +131,10 @@ export class InvoiceService { }); invoice.items.add(invoiceItem); } - - // const taxAmount = enableTax - // ? Math.round((subTotal - discount) * TAX_RATE) - // : 0; - // const total = Math.max(0, subTotal - discount + taxAmount); - - // invoice.subTotal = subTotal; - // invoice.attachments = dto.attachments; - // invoice.taxAmount = taxAmount; - // invoice.total = total; - // invoice.balance = total - invoice.paidAmount; + if (dto.requestId) { - const requestEntity = await em.findOne( - Request, - { id: dto.requestId }, - ); - if (!requestEntity) { - throw new NotFoundException('Request not found'); - } - requestEntity.deletedAt = new Date(); + await this.requestService.hardDeleteRequestAndItems(dto.requestId, em); } await em.flush(); diff --git a/src/modules/order/dto/create-order.dto.ts b/src/modules/order/dto/create-order.dto.ts index cc0dfd1..83ea47e 100644 --- a/src/modules/order/dto/create-order.dto.ts +++ b/src/modules/order/dto/create-order.dto.ts @@ -4,6 +4,7 @@ import { IsNotEmpty, IsOptional, IsArray, + IsBoolean, } from 'class-validator'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IAttachment } from '../interface/order.interface'; @@ -53,6 +54,9 @@ export class CreateOrderAsAdminDto { @IsOptional() @IsString() description?: string; - + + @ApiProperty({ description: 'When true, reassign request chats to the created order' }) + @IsBoolean() + keepRequestChats: boolean; } diff --git a/src/modules/order/providers/order.service.ts b/src/modules/order/providers/order.service.ts index 2a6f636..4d9a756 100644 --- a/src/modules/order/providers/order.service.ts +++ b/src/modules/order/providers/order.service.ts @@ -28,6 +28,7 @@ import { Request } from 'src/modules/request/entities/request.entity'; import { Invoice } from 'src/modules/invoice/entities/invoice.entity'; import { OrderCreatedEvent } from '../events/order.events'; import { InvoiceConfirmStatusEnum } from 'src/modules/invoice/enum/invoice-confirm-status.enum'; +import { ChattService } from 'src/modules/chat/providers/chat.service'; @Injectable() export class OrderService { @@ -40,6 +41,7 @@ export class OrderService { private readonly adminService: AdminService, private readonly orderPrintRepository: OrderPrintRepository, private readonly eventEmitter: EventEmitter2, + private readonly chatService: ChattService, ) {} async createOrderAsAdmin(adminId: string, dto: CreateOrderAsAdminDto): Promise { @@ -114,6 +116,13 @@ export class OrderService { await this.em.persistAndFlush(order); + if (dto.keepRequestChats) { + const requestId = invoiceItem?.invoice?.requestId; + if (requestId) { + await this.chatService.moveChatsRefId(requestId, order.id); + } + } + this.eventEmitter.emit( OrderCreatedEvent.name, new OrderCreatedEvent(order.id, user.id, order.orderNumber), diff --git a/src/modules/request/request.module.ts b/src/modules/request/request.module.ts index 98dc502..c959c00 100644 --- a/src/modules/request/request.module.ts +++ b/src/modules/request/request.module.ts @@ -29,5 +29,6 @@ import { ChatModule } from '../chat/chat.module'; ], controllers: [RequestController], providers: [RequestService, RequestRepository, RequestListeners], + exports: [RequestService], }) export class RequestModule {} diff --git a/src/modules/request/request.service.ts b/src/modules/request/request.service.ts index 86b848e..d866636 100644 --- a/src/modules/request/request.service.ts +++ b/src/modules/request/request.service.ts @@ -219,10 +219,14 @@ export class RequestService { }); } - private async hardDeleteRequest(id: string, em: EntityManager) { - await this.chatService.deleteChatsByRefId(id, em); - await em.nativeUpdate(Invoice, { requestId: id }, { requestId: null }); + async hardDeleteRequestAndItems(id: string, em: EntityManager) { await em.nativeDelete(RequestItem, { request: { id } }); await em.nativeDelete(Request, { id }); } + + private async hardDeleteRequest(id: string, em: EntityManager) { + await this.chatService.deleteChatsByRefId(id, em); + await em.nativeUpdate(Invoice, { requestId: id }, { requestId: null }); + await this.hardDeleteRequestAndItems(id, em); + } }