From 6836d34967105bbef023536785775c36e736920e Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Thu, 19 Feb 2026 11:38:44 +0330 Subject: [PATCH] update invoice entity --- src/modules/invoice/dto/create-invoice.dto.ts | 10 +++++-- .../invoice/entities/invoice.entity.ts | 6 ++-- src/modules/invoice/invoice.controller.ts | 2 +- src/modules/invoice/invoice.service.ts | 30 +++++++++++++------ 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/modules/invoice/dto/create-invoice.dto.ts b/src/modules/invoice/dto/create-invoice.dto.ts index 703b32f..da1c96f 100644 --- a/src/modules/invoice/dto/create-invoice.dto.ts +++ b/src/modules/invoice/dto/create-invoice.dto.ts @@ -40,9 +40,15 @@ export class CreateInvoiceItemDto { } export class CreateInvoiceDto { + @IsOptional() @IsString() - @ApiProperty({ description: 'Request ID to create invoice for' }) - requestId!: string; + @ApiPropertyOptional({ description: 'Request ID to link invoice to (optional)' }) + requestId?: string; + + @IsOptional() + @IsString() + @ApiPropertyOptional({ description: 'User ID (required when requestId is not provided)' }) + userId?: string; @IsArray() @ArrayMinSize(1) diff --git a/src/modules/invoice/entities/invoice.entity.ts b/src/modules/invoice/entities/invoice.entity.ts index ea0ace0..ca3ed21 100644 --- a/src/modules/invoice/entities/invoice.entity.ts +++ b/src/modules/invoice/entities/invoice.entity.ts @@ -22,7 +22,7 @@ import { Request } from 'src/modules/request/entities/request.entity'; @Entity({ tableName: 'invoices' }) @Index({ properties: ['user'] }) export class Invoice extends BaseEntity { - [OptionalProps]?: 'createdAt' | 'deletedAt' | 'invoiceNumber' + [OptionalProps]?: 'createdAt' | 'deletedAt' | 'invoiceNumber' | 'request' @PrimaryKey({ type: 'string', columnType: 'char(26)' }) id: string = ulid() @@ -30,8 +30,8 @@ export class Invoice extends BaseEntity { @ManyToOne(() => User) user!: User; - @ManyToOne(() => Request) - request!: Request; + @ManyToOne(() => Request, { nullable: true }) + request?: Request; @OneToMany(() => Payment, payment => payment.invoice, { cascade: [Cascade.ALL], diff --git a/src/modules/invoice/invoice.controller.ts b/src/modules/invoice/invoice.controller.ts index c92edcc..4dd9177 100644 --- a/src/modules/invoice/invoice.controller.ts +++ b/src/modules/invoice/invoice.controller.ts @@ -32,7 +32,7 @@ export class InvoiceController { @Get('public/invoice/item/:id') @UseGuards(AuthGuard) - @ApiOperation({ summary: 'Get one invoice item by id' }) + @ApiOperation({ summary: 'Confirm invoice item by id' }) confirmInvoiceItem(@Param('id') id: string,@UserId() userId: string) { return this.invoiceService.confirmInvoiceItem(id,userId); } diff --git a/src/modules/invoice/invoice.service.ts b/src/modules/invoice/invoice.service.ts index 22929cd..7064afd 100644 --- a/src/modules/invoice/invoice.service.ts +++ b/src/modules/invoice/invoice.service.ts @@ -6,6 +6,7 @@ import { FindInvoicesDto } from './dto/find-invoices.dto'; import { Invoice } from './entities/invoice.entity'; 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 { InvoiceRepository } from './repositories/invoice.repository'; @@ -21,13 +22,24 @@ export class InvoiceService { async create(dto: CreateInvoiceDto) { - const request = await this.em.findOne( - Request, - { id: dto.requestId }, - { populate: ['user'] }, - ); - if (!request) { - throw new NotFoundException('Request not found'); + let user: User; + let request: Request | undefined; + + if (dto.requestId) { + const requestEntity = await this.em.findOne( + Request, + { id: dto.requestId }, + { populate: ['user'] }, + ); + if (!requestEntity) { + throw new NotFoundException('Request not found'); + } + user = requestEntity.user; + request = requestEntity; + } else if (dto.userId) { + user = await this.em.findOneOrFail(User, { id: dto.userId }); + } else { + throw new BadRequestException('Either requestId or userId must be provided'); } const enableTax = dto.enableTax ?? false; @@ -39,8 +51,8 @@ export class InvoiceService { return this.em.transactional(async (em) => { const invoice = em.create(Invoice, { - user: request.user, - request, + user, + ...(request && { request }), enableTax, approvalDeadline, discount,