Untitled

mail@pastecode.io avatarunknown
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;