From 9ccddbde11701dedea101487a2983bd2a2a6bc7a Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Thu, 23 Jul 2026 18:47:56 +0330 Subject: [PATCH] count --- src/modules/invoice/invoice.controller.ts | 15 +++++++ src/modules/invoice/invoice.service.ts | 39 +++++++++++++++++++ .../repositories/invoice.repository.ts | 26 +++++++++---- 3 files changed, 73 insertions(+), 7 deletions(-) diff --git a/src/modules/invoice/invoice.controller.ts b/src/modules/invoice/invoice.controller.ts index 447f253..9e0be42 100644 --- a/src/modules/invoice/invoice.controller.ts +++ b/src/modules/invoice/invoice.controller.ts @@ -23,6 +23,13 @@ export class InvoiceController { return this.invoiceService.findAll(userId, dto); } + @Get('public/invoice/tab-counts') + @UseGuards(AuthGuard) + @ApiOperation({ summary: 'Get invoice tab counts for the current user' }) + getTabCounts(@Query() dto: FindInvoicesDto, @UserId() userId: string) { + return this.invoiceService.getTabCounts(dto, userId); + } + @Get('public/invoice/:id') @UseGuards(AuthGuard) @ApiOperation({ summary: 'Get one invoice by id' }) @@ -55,6 +62,14 @@ export class InvoiceController { return this.invoiceService.findAllAsAdmin(dto); } + @Get('admin/invoice/tab-counts') + @UseGuards(AdminAuthGuard) + @Permissions(PermissionEnum.VIEW_INVOICES) + @ApiOperation({ summary: 'Get invoice tab counts for admin invoice list' }) + getTabCountsAsAdmin(@Query() dto: FindInvoicesDto) { + return this.invoiceService.getTabCounts(dto); + } + @Get('admin/invoice/item/:id') @UseGuards(AdminAuthGuard) @Permissions(PermissionEnum.VIEW_INVOICES) diff --git a/src/modules/invoice/invoice.service.ts b/src/modules/invoice/invoice.service.ts index 89026a8..7ebe071 100644 --- a/src/modules/invoice/invoice.service.ts +++ b/src/modules/invoice/invoice.service.ts @@ -20,6 +20,12 @@ type ResolvedItemDiscount = { discountPercent?: number; }; +export type InvoiceTabCounts = { + pending: number; + confirmed: number; + archived: number; +}; + @Injectable() export class InvoiceService { constructor( @@ -176,6 +182,39 @@ export class InvoiceService { return this.invoiceRepository.findAllPaginated(dto); } + getTabCounts(dto: FindInvoicesDto, userId?: string): Promise { + const baseFilter: FindInvoicesDto & { userId?: string } = { + ...dto, + userId, + }; + + return this.countTabs(baseFilter); + } + + private async countTabs( + baseFilter: FindInvoicesDto & { userId?: string }, + ): Promise { + const [pending, confirmed, archived] = await Promise.all([ + this.invoiceRepository.countByFilters({ + ...baseFilter, + statuses: [InvoiceConfirmStatusEnum.PENDING], + }), + this.invoiceRepository.countByFilters({ + ...baseFilter, + statuses: [ + InvoiceConfirmStatusEnum.PARTIALLY_CONFIRMED, + InvoiceConfirmStatusEnum.CONFIRMED, + ], + }), + this.invoiceRepository.countByFilters({ + ...baseFilter, + statuses: [InvoiceConfirmStatusEnum.ARCHIVED], + }), + ]); + + return { pending, confirmed, archived }; + } + async findOne(id: string, userId: string) { const invoice = await this.em.findOne( Invoice, diff --git a/src/modules/invoice/repositories/invoice.repository.ts b/src/modules/invoice/repositories/invoice.repository.ts index 735ff27..871e60a 100644 --- a/src/modules/invoice/repositories/invoice.repository.ts +++ b/src/modules/invoice/repositories/invoice.repository.ts @@ -16,13 +16,9 @@ export class InvoiceRepository extends EntityRepository { super(em, Invoice); } - async findAllPaginated(opts: FindInvoicesOpts): Promise> { + private buildWhere(opts: FindInvoicesOpts): FilterQuery { const { - page = 1, - limit = 10, search, - orderBy = 'createdAt', - order = 'desc', userId, from, to, @@ -31,8 +27,6 @@ export class InvoiceRepository extends EntityRepository { statuses, } = opts; - const offset = (page - 1) * limit; - const where: FilterQuery = {}; if (userId) { @@ -86,6 +80,20 @@ export class InvoiceRepository extends EntityRepository { where.$or = searchConditions; } + return where; + } + + async findAllPaginated(opts: FindInvoicesOpts): Promise> { + const { + page = 1, + limit = 10, + orderBy = 'createdAt', + order = 'desc', + } = opts; + + const offset = (page - 1) * limit; + const where = this.buildWhere(opts); + const [data, total] = await this.findAndCount(where, { limit, offset, @@ -105,4 +113,8 @@ export class InvoiceRepository extends EntityRepository { }, }; } + + async countByFilters(opts: FindInvoicesOpts): Promise { + return this.count(this.buildWhere(opts)); + } }