41 lines
1.4 KiB
TypeScript
41 lines
1.4 KiB
TypeScript
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),
|
|
};
|
|
}),
|
|
};
|
|
}
|
|
}
|