Untitled
plain_text
2 months ago
3.2 kB
1
Indexable
Never
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;