From 49390ce62e32b62858d4c8014a05a359ca7f213a Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Sat, 24 Jan 2026 11:08:54 +0330 Subject: [PATCH] add tax to order --- src/modules/order/dto/create-invoice.dto.ts | 6 ++++- src/modules/order/entities/order.entity.ts | 12 ++++++++++ src/modules/order/providers/order.service.ts | 23 ++++++++++++++----- src/modules/ticket/entities/ticket.entity.ts | 7 ++++-- .../controllers/uploader.controller.ts | 8 +++---- 5 files changed, 43 insertions(+), 13 deletions(-) diff --git a/src/modules/order/dto/create-invoice.dto.ts b/src/modules/order/dto/create-invoice.dto.ts index 00279ff..a054b00 100644 --- a/src/modules/order/dto/create-invoice.dto.ts +++ b/src/modules/order/dto/create-invoice.dto.ts @@ -1,7 +1,8 @@ import { IsInt, IsArray, IsNumber, IsNotEmpty, - ArrayMinSize + ArrayMinSize, + IsBoolean } from 'class-validator'; import { ApiProperty } from '@nestjs/swagger'; import { Type } from 'class-transformer'; @@ -36,6 +37,9 @@ export class CreateInvoiceDto { @Type(() => InvoiceItemDto) items: InvoiceItemDto[]; + @ApiProperty() + @IsBoolean() + enableTax: boolean } diff --git a/src/modules/order/entities/order.entity.ts b/src/modules/order/entities/order.entity.ts index 43dd6f6..2b21853 100644 --- a/src/modules/order/entities/order.entity.ts +++ b/src/modules/order/entities/order.entity.ts @@ -60,6 +60,9 @@ export class Order extends BaseEntity { @Property({ type: 'decimal', precision: 10, scale: 0 }) subTotal!: number; + @Property({ type: 'decimal', precision: 10, scale: 0 }) + taxAmount: number; + // @Property({ type: 'decimal', precision: 10, scale: 0, default: 0 }) // deliveryFee: number = 0; @@ -75,6 +78,9 @@ export class Order extends BaseEntity { @Property({ type: 'decimal', precision: 10, scale: 0 }) balance!: number; + + @Property({ type: 'decimal', precision: 10, scale: 0, nullable: true }) + dueDate?: number; // get balance(): number { // return this._balance // } @@ -88,6 +94,12 @@ export class Order extends BaseEntity { @Enum(() => OrderStatusEnum) status!: OrderStatusEnum; + @Property({ nullable: true, columnType: 'timestamptz' }) + confirmedAt?: Date; + + @Property({ type: 'json', nullable: true }) + attachments?: string[] + @BeforeCreate() async generateOrderNumber(args: EventArgs) { const em = args.em; diff --git a/src/modules/order/providers/order.service.ts b/src/modules/order/providers/order.service.ts index bef5424..b1bd174 100644 --- a/src/modules/order/providers/order.service.ts +++ b/src/modules/order/providers/order.service.ts @@ -1,4 +1,4 @@ -import { Injectable, NotFoundException, BadRequestException, Logger } from '@nestjs/common'; +import { Injectable, BadRequestException, Logger } from '@nestjs/common'; import { EntityManager } from '@mikro-orm/postgresql'; import { OrderItem } from '../entities/order-item.entity'; import { OrderRepository } from '../repositories/order.repository'; @@ -53,7 +53,8 @@ export class OrderService { total: 0, paidAmount: 0, balance: 0, - status: OrderStatusEnum.DRAFT + status: OrderStatusEnum.DRAFT, + taxAmount: 0 }) em.persist(order) @@ -128,7 +129,8 @@ export class OrderService { total, paidAmount: 0, balance: total, - status: OrderStatusEnum.INVOICED + status: OrderStatusEnum.INVOICED, + taxAmount: 0 }) em.persist(order) @@ -200,7 +202,7 @@ export class OrderService { } async createInvoice(orderId: string, dto: CreateInvoiceDto) { - const { items } = dto + const { items, enableTax } = dto const targetOrder = await this.findOneOrFail(orderId) @@ -236,8 +238,17 @@ export class OrderService { targetOrder.subTotal = subTotal targetOrder.discount = totalDiscount - targetOrder.total = subTotal - totalDiscount - targetOrder.balance = subTotal - totalDiscount + const total = subTotal - totalDiscount + let tax = 0 + + if (enableTax) { + tax = 0.1 * total + } + + targetOrder.taxAmount = tax + targetOrder.total = total + tax + targetOrder.balance = total + tax + // change status targetOrder.status = OrderStatusEnum.INVOICED diff --git a/src/modules/ticket/entities/ticket.entity.ts b/src/modules/ticket/entities/ticket.entity.ts index 19841b9..d5f6be0 100755 --- a/src/modules/ticket/entities/ticket.entity.ts +++ b/src/modules/ticket/entities/ticket.entity.ts @@ -11,8 +11,8 @@ import { Order } from 'src/modules/order/entities/order.entity'; @Entity() export class Ticket { - [OptionalProps]?: 'createdAt' - + [OptionalProps]?: 'createdAt' + @PrimaryKey({ type: "bigint", autoincrement: true }) id: bigint; @@ -31,6 +31,9 @@ export class Ticket { @ManyToOne(() => Order) order!: Order + @ManyToOne(() => Ticket, { nullable: true }) + parent?: Ticket + @Property({ defaultRaw: 'now()', columnType: 'timestamptz' }) createdAt: Date = new Date(); diff --git a/src/modules/uploader/controllers/uploader.controller.ts b/src/modules/uploader/controllers/uploader.controller.ts index 60d924f..b8289ec 100644 --- a/src/modules/uploader/controllers/uploader.controller.ts +++ b/src/modules/uploader/controllers/uploader.controller.ts @@ -33,8 +33,8 @@ export class UploaderController { return this.uploaderService.uploadMultiple(files); } - @UseGuards(AdminAuthGuard) - @ApiBearerAuth() + // @UseGuards(AdminAuthGuard) + // @ApiBearerAuth() @ApiOperation({ summary: 'Upload a file (admin)' }) @ApiConsumes('multipart/form-data') @UseInterceptors(FileInterceptor('file')) @@ -44,8 +44,8 @@ export class UploaderController { return this.uploaderService.uploadFile(file); } - @UseGuards(AdminAuthGuard) - @ApiBearerAuth() + // @UseGuards(AdminAuthGuard) + // @ApiBearerAuth() @ApiOperation({ summary: 'Uploads multiple files' }) @ApiConsumes('multipart/form-data') @UseInterceptors(FilesInterceptor('files'))