Beispiel #1
0
        public async Task <IActionResult> Get([FromQuery][Required] GetTransactionsRequest request)
        {
            var input = new GetTransactionsInput(request.WalletId, request.StartDate, request.EndDate);
            await _mediator.PublishAsync(input);

            return(this._presenter.ViewModel);
        }
        /// <summary>
        /// The get transactions async.
        /// </summary>
        /// <param name="input">
        /// The input.
        /// </param>
        /// <returns>
        /// The <see cref="Task"/>.
        /// </returns>
        public async Task <Abp.Application.Services.Dto.PagedResultDto <TransactionPreviewDto> > GetTransactionsAsync(GetTransactionsInput input)
        {
            var output = new Abp.Application.Services.Dto.PagedResultDto <TransactionPreviewDto>();

            IQueryable <Transaction> query;

            var tenantId = AbpSession.TenantId;

            switch (input.Type)
            {
            case "tenant":
                query = _transactionRepository.GetAll()
                        .Include(t => t.Account)
                        .ThenInclude(account => account.Currency)
                        .Include(t => t.Category)
                        .Where(t => t.Account.TenantId == tenantId);
                break;

            case "user":
                var userId = input.UserId ?? AbpSession.UserId;
                query = _transactionRepository.GetAll()
                        .Include(t => t.Account)
                        .ThenInclude(account => account.Currency)
                        .Include(t => t.Category)
                        .Where(t => t.CreatorUserId == userId);
                break;

            case "account":
                // TODO : NULL | Account owner tenant validation
                query = _transactionRepository.GetAll()
                        .Include(t => t.Account)
                        .ThenInclude(account => account.Currency)
                        .Include(t => t.Category)
                        .Where(t => t.AccountId == input.AccountId.Value);
                break;

            case "category":
                query = _transactionRepository.GetAll()
                        .Include(t => t.Account)
                        .ThenInclude(account => account.Currency)
                        .Include(t => t.Category)
                        .Where(t => t.CategoryId == input.CategoryId.Value);
                break;

            default:
                query = _transactionRepository.GetAll()
                        .Include(t => t.Account)
                        .ThenInclude(account => account.Currency)
                        .Include(t => t.Category)
                        .Where(t => t.Account.TenantId == tenantId);
                break;
            }

            // transaction period
            DateTime startDate;
            DateTime endDate;

            if (input.StartDate.HasValue && input.EndDate.HasValue)
            {
                startDate = input.StartDate.Value.Date;
                endDate   = input.EndDate.Value.Date.AddDays(1).AddTicks(-1);
            }
            else
            {
                startDate = DateTime.Today.FirstDayOfMonth();
                endDate   = startDate.AddMonths(1).AddTicks(-1);
            }

            // search
            if (!string.IsNullOrWhiteSpace(input.Query))
            {
                query = query.Where(t => t.Description.Contains(input.Query));
            }

            var transactions = await query.Include(c => c.CreatorUser)
                               .Where(t => t.TransactionTime >= startDate && t.TransactionTime <= endDate)
                               .OrderByDescending(t => t.TransactionTime)
                               .ThenByDescending(t => t.CreationTime)
                               .ToListAsync();

            output.Items = (await _currencyRateExchangeService.GetTransactionsWithAmountInDefaultCurrency(transactions)).ToList();

            return(output);
        }