count
deploy to danak / build_and_deploy (push) Has been cancelled

This commit is contained in:
2026-07-23 18:47:56 +03:30
parent 3314113e7a
commit 9ccddbde11
3 changed files with 73 additions and 7 deletions
+15
View File
@@ -23,6 +23,13 @@ export class InvoiceController {
return this.invoiceService.findAll(userId, dto); 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') @Get('public/invoice/:id')
@UseGuards(AuthGuard) @UseGuards(AuthGuard)
@ApiOperation({ summary: 'Get one invoice by id' }) @ApiOperation({ summary: 'Get one invoice by id' })
@@ -55,6 +62,14 @@ export class InvoiceController {
return this.invoiceService.findAllAsAdmin(dto); 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') @Get('admin/invoice/item/:id')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(PermissionEnum.VIEW_INVOICES) @Permissions(PermissionEnum.VIEW_INVOICES)
+39
View File
@@ -20,6 +20,12 @@ type ResolvedItemDiscount = {
discountPercent?: number; discountPercent?: number;
}; };
export type InvoiceTabCounts = {
pending: number;
confirmed: number;
archived: number;
};
@Injectable() @Injectable()
export class InvoiceService { export class InvoiceService {
constructor( constructor(
@@ -176,6 +182,39 @@ export class InvoiceService {
return this.invoiceRepository.findAllPaginated(dto); return this.invoiceRepository.findAllPaginated(dto);
} }
getTabCounts(dto: FindInvoicesDto, userId?: string): Promise<InvoiceTabCounts> {
const baseFilter: FindInvoicesDto & { userId?: string } = {
...dto,
userId,
};
return this.countTabs(baseFilter);
}
private async countTabs(
baseFilter: FindInvoicesDto & { userId?: string },
): Promise<InvoiceTabCounts> {
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) { async findOne(id: string, userId: string) {
const invoice = await this.em.findOne( const invoice = await this.em.findOne(
Invoice, Invoice,
@@ -16,13 +16,9 @@ export class InvoiceRepository extends EntityRepository<Invoice> {
super(em, Invoice); super(em, Invoice);
} }
async findAllPaginated(opts: FindInvoicesOpts): Promise<PaginatedResult<Invoice>> { private buildWhere(opts: FindInvoicesOpts): FilterQuery<Invoice> {
const { const {
page = 1,
limit = 10,
search, search,
orderBy = 'createdAt',
order = 'desc',
userId, userId,
from, from,
to, to,
@@ -31,8 +27,6 @@ export class InvoiceRepository extends EntityRepository<Invoice> {
statuses, statuses,
} = opts; } = opts;
const offset = (page - 1) * limit;
const where: FilterQuery<Invoice> = {}; const where: FilterQuery<Invoice> = {};
if (userId) { if (userId) {
@@ -86,6 +80,20 @@ export class InvoiceRepository extends EntityRepository<Invoice> {
where.$or = searchConditions; where.$or = searchConditions;
} }
return where;
}
async findAllPaginated(opts: FindInvoicesOpts): Promise<PaginatedResult<Invoice>> {
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, { const [data, total] = await this.findAndCount(where, {
limit, limit,
offset, offset,
@@ -105,4 +113,8 @@ export class InvoiceRepository extends EntityRepository<Invoice> {
}, },
}; };
} }
async countByFilters(opts: FindInvoicesOpts): Promise<number> {
return this.count(this.buildWhere(opts));
}
} }