import { Injectable } from '@nestjs/common'; import { bankSummary } from '../domain/bank-card.calculations'; import { rubMoney } from '../domain/rub-money'; import { BankCardsRepository } from '../infrastructure/bank-cards.repository'; import { BankSummaryQueryDto } from '../presentation/bank-card.dto'; import { periodBounds } from './bank-card-input'; @Injectable() export class GetBankSummaryUseCase { constructor(private readonly repository: BankCardsRepository) {} async execute(userId: string, query: BankSummaryQueryDto) { const period = periodBounds(query); const { operations, categories } = await this.repository.summaryData( userId, period, query.cardId, ); const totals = bankSummary(period, operations); return { month: query.month, ...period, cardId: query.cardId ?? null, expenses: rubMoney(totals.expenses), refunds: rubMoney(totals.refunds), net: rubMoney(totals.net), categories: totals.categories.map((row) => { const category = categories.find((c) => c.id === row.categoryId); if (!category) throw new Error('Bank operation category is missing'); return { categoryId: row.categoryId, categoryName: category.name, expenses: rubMoney(row.expenses), refunds: rubMoney(row.refunds), net: rubMoney(row.net), }; }), }; } }