BudgetApp/BudgetApp.Services/TransactionService.cs
Martin Svrcina e14e552388 Initial commit
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-21 01:52:43 +01:00

105 lines
3.8 KiB
C#

using BudgetApp.PublicModels;
using BudgetApp.Storage;
using Microsoft.EntityFrameworkCore;
namespace BudgetApp.Services
{
public class TransactionService(BudgetContext context) : ITransactionService
{
private readonly BudgetContext _context = context ?? throw new ArgumentNullException(nameof(context));
public async Task<ListResponse<YearSummaryDto>> GetTransactions(CancellationToken cancellationToken = default)
{
var response = new ListResponse<YearSummaryDto>();
var transactions = await _context.Transactions
.AsNoTracking()
.OrderBy(t => t.Date)
.ToListAsync(cancellationToken)
.ConfigureAwait(false);
var years = transactions
.GroupBy(t => t.Date.Year)
.OrderBy(g => g.Key)
.Select(yearGroup =>
{
var months = yearGroup
.GroupBy(t => t.Date.Month)
.OrderBy(monthGroup => monthGroup.Key)
.Select(monthGroup =>
{
var days = monthGroup
.GroupBy(t => t.Date.Day)
.OrderBy(dayGroup => dayGroup.Key)
.Select(dayGroup =>
{
var dayTransactions = dayGroup
.OrderBy(t => t.Date)
.ThenBy(t => t.Created)
.Select(MapTransaction)
.ToList();
var dayBalance = dayTransactions.Sum(t => t.Amount);
return new DaySummaryDto
{
Date = dayTransactions.First().Date,
Balance = dayBalance,
Transactions = dayTransactions
};
})
.ToList();
var monthBalance = days.Sum(d => d.Balance);
return new MonthSummaryDto
{
Month = monthGroup.Key,
Balance = monthBalance,
Days = days
};
})
.ToList();
var yearBalance = months.Sum(m => m.Balance);
return new YearSummaryDto
{
Year = yearGroup.Key,
Balance = yearBalance,
Months = months
};
})
.ToList();
response.Data = years;
response.Total = transactions.Count;
return response;
}
private static TransactionDto MapTransaction(Transaction source)
{
return new TransactionDto
{
Id = source.Id,
Date = source.Date,
Amount = source.Amount,
Balance = source.Balance,
OperationDescription = source.OperationDescription,
Note = source.Note,
Category = source.Category,
TransactionId = source.TransactionId,
Created = source.Created,
Updated = source.Updated,
Deleted = source.Deleted
};
}
}
public interface ITransactionService
{
Task<ListResponse<YearSummaryDto>> GetTransactions(CancellationToken cancellationToken = default);
}
}