public CardAccountStatementModel GetCardAccountStatement(CardAccountStatementQuery query) { EnsureIsValid(query); try { var cardAccount = _deps.CardAccounts.SurelyFind(query.AccountNo); var transactions = _deps.Transactions.Query(query.ToDbQuery(cardAccount)); var statement = new CardAccountStatementModel { AccountCurrency = cardAccount.Currency.ToModel <CurrencyModel>(), AccountNo = cardAccount.AccountNo, AccountOwner = cardAccount.Owner.ToModel <UserNameModel>(), CreatedDateUtc = DateTime.UtcNow, DateRange = query.DateRange, StatementBalance = transactions.AsQueryable() .Where(Specs.ForTransaction.CalculatedDeposits || Specs.ForTransaction.CalculatedWithdrawals) .Sum(x => x.AccountAmount), StatementDeposits = transactions.AsQueryable() .Where(Specs.ForTransaction.CalculatedDeposits) .Sum(x => x.AccountAmount), StatementWithdrawals = transactions.AsQueryable() .Where(Specs.ForTransaction.CalculatedWithdrawals) .Sum(x => x.AccountAmount), Transactions = transactions.Map <CardAccountStatementItemModel>().ToList() }; return(statement); } catch (Exception ex) { throw new ServiceException("Can't get card account statement.", ex); } }
public static DbQuery <Transaction> ToDbQuery(this CardAccountStatementQuery query, Account account) { Argument.NotNull(query, "query"); return(DbQuery.For <Transaction>() .FilterBy(x => x.CreatedDateUtc >= query.DateRange.LowerBound && x.CreatedDateUtc <= query.DateRange.UpperBound && x.AccountNo == account.AccountNo) .SortBy(x => x.OrderByDescending(y => y.CreatedDateUtc))); }
public IHttpActionResult Statement(string accountNo, DateTime from, DateTime to) { var query = new CardAccountStatementQuery { AccountNo = accountNo, DateRange = new Range <DateTime>(from.ToUniversalTime(), to.ToUniversalTime()) }; return(Ok(_cardAccountService.GetCardAccountStatement(query))); }