Untitled
unknown
plain_text
2 years ago
3.2 kB
10
Indexable
var result = new ApiResult<WalletsReport>();
var transactionRepo = _uow.TransactionRepository;
var userWalletGroups = _uow.Repository<UserWalletGroup>().Query()
.Where(x => x.UserId == _currentUser.UserId);
var dateFrom = range.From.ToDateTime(TimeOnly.MinValue);
var dateTo = range.To.ToDateTime(TimeOnly.MinValue);
var statistics = _uow.Repository<Wallet>().Query()
.Include(w => w.Transactions)
.GroupJoin(
_uow.Repository<UserWalletGroup>().Query().Where(uwg => uwg.UserId == _currentUser.UserId),
w => w.Id,
uwg => uwg.WalletId,
(w, uwgs) => new { Wallet = w, UserWalletGroups = uwgs })
.SelectMany(x => x.UserWalletGroups.DefaultIfEmpty(), (w, uwg) => new { w.Wallet, UserWalletGroup = uwg })
.GroupBy(x => x.UserWalletGroup.WalletGroup)
.OrderByDescending(group => group.Key == null)
.Select(group => new WalletGroupStatisticsViewModel
{
GroupId = group.Key == null ? 0 : group.Key.Id,
GroupName = group.Key == null ? "Ungrouped" : group.Key.Name,
WalletStatistics = group.Select(x => new WalletStatisticsViewModel
{
Id = x.Wallet.Id,
Name = x.Wallet.Name,
Begin = x.Wallet.Transactions.Where(y => y.Date <= dateFrom).Sum(s => s.Amount),
Income = x.Wallet.Transactions.Where(y => y.Amount > 0 && y.Date >= dateFrom && y.Date <= dateTo).Sum(s => s.Amount),
Expense = Math.Abs(x.Wallet.Transactions.Where(y => y.Amount < 0 && y.Date >= dateFrom && y.Date <= dateTo).Sum(s => s.Amount)),
Saldo = x.Wallet.Transactions.Where(y => y.Amount > 0 && y.Date >= dateFrom && y.Date <= dateTo).Sum(s => s.Amount) -
Math.Abs(x.Wallet.Transactions.Where(y => y.Amount < 0 && y.Date >= dateFrom && y.Date <= dateTo).Sum(s => s.Amount)),
Debt = _uow.Repository<CustomerInvoice>()
.Query()
.Where(ci => ci.WalletId == x.Wallet.Id && !ci.IsSent)
.Join(
_uow.Repository<CustomerInvoicePayment>().Query(),
ci => ci.Id,
cip => cip.CustomerInvoiceId,
(ci, cip) => cip.Amount)
.Sum(),
End = x.Wallet.Transactions.Where(y => y.Date <= dateTo).Sum(s => s.Amount),
CurrencyId = x.Wallet.CurrencyId,
CurrencyName = x.Wallet.Currency.Name,
CurrencySymbol = x.Wallet.Currency.Symbol,
}),
});
var query = statistics.ToQueryString();
var report = new WalletsReport { WalletGroupStatistics = await statistics.ToListAsync() };
result.Data = report;
result.Status = StatusCodes.Status200OK;
return result;Editor is loading...