public async Task <ServiceResult> GetAccountBalance() { try { if (_accountId <= 0) { return(new ServiceResult { StatusCode = StatusCodes.Status400BadRequest, ContentResult = JsonConvert.SerializeObject(new ErrorResponseDto { Message = Messages.Account_InvalidAccountId }) }); } Account account = await _accountRepo.GetAsync(_accountId); if (account == null) { return(new ServiceResult { StatusCode = StatusCodes.Status404NotFound, ContentResult = JsonConvert.SerializeObject(new ErrorResponseDto { Message = Messages.Account_AccountNotFound }) }); } IEnumerable <Transaction> payments = await _transRepo.GetAllAsync(t => t.AccountId == _accountId && t.TransactionType == TransactionTypeEnum.Withdrawal, orderBy : q => q.OrderByDescending(t => t.Date)); IEnumerable <Transaction> deposits = await _transRepo.GetAllAsync(t => t.AccountId == _accountId && t.TransactionType == TransactionTypeEnum.Deposit, orderBy : q => q.OrderByDescending(t => t.Date)); AccountBalanceResultDto result = new AccountBalanceResultDto { AccountId = _accountId, OpeningBalance = await _accountRepo.GetAccountOpeningBalanceAsync(_accountId), ProcessedPaymentsBalance = await _accountRepo.GetAccountProcessedBalanceAsync(_accountId), ClosingBalance = await _accountRepo.GetAccountBalanceAsync(_accountId), PendingdPaymentsBalance = await _accountRepo.GetAccountPendingBalanceAsync(_accountId), Payments = _mapper.Map <List <PaymentTransactionResultDto> >(payments), Deposits = _mapper.Map <List <DepositTransactionResultDto> >(deposits), }; return(new ServiceResult { StatusCode = StatusCodes.Status200OK, ContentResult = JsonConvert.SerializeObject(result, new DecimalFormatConverter()) }); } catch (Exception ex) { _logger.LogError(ex.Message, $"An error has occurred executing GetAccountBalance for Account {_accountId}"); return(new ServiceResult { StatusCode = StatusCodes.Status500InternalServerError, ContentResult = JsonConvert.SerializeObject(new ErrorResponseDto { Message = ex.Message }) }); } }
public async Task <ServiceResult> CreateTransaction() { try { Account account = await _accountRepo.GetAsync(_accountId); if (account == null) { return(new ServiceResult { StatusCode = StatusCodes.Status404NotFound, ContentResult = JsonConvert.SerializeObject(new ErrorResponseDto { Message = Messages.Account_AccountNotFound }) }); } DateTime creationDate = DateTime.Now; bool insufficientBalance = false; Transaction newTransaction = new Transaction { TransactionStatus = _status, TransactionType = _type, Date = _date, CreationDate = creationDate, LastUpdateDate = creationDate, AccountId = _accountId, Amount = _amount }; if (_type == TransactionTypeEnum.Withdrawal) { decimal accountAvailableBalance = await _accountRepo.GetAccountBalanceAsync(account.Id); insufficientBalance = accountAvailableBalance < _amount; if (insufficientBalance) { newTransaction.TransactionStatus = TransactionStatusEnum.Closed; newTransaction.ClosedReason = Messages.Payment_NotEnoughFundsReason; } } bool result = await _transRepo.AddAsync(newTransaction); if (!result) { return(new ServiceResult { StatusCode = StatusCodes.Status500InternalServerError, ContentResult = JsonConvert.SerializeObject(new ErrorResponseDto { Message = _server500Error }) }); } return(new ServiceResult { StatusCode = StatusCodes.Status201Created, ContentResult = JsonConvert.SerializeObject(_mapper.Map <TransactionResultDto>(newTransaction), new DecimalFormatConverter()) }); } catch (Exception ex) { _logger.LogError(ex.Message, $"An error has occurred executing CreateTransaction for Account {_accountId}, Amount {_amount}, Type {_type.ToString()}, Date {_date.ToShortDateString()}"); return(new ServiceResult { StatusCode = StatusCodes.Status500InternalServerError, ContentResult = JsonConvert.SerializeObject(new ErrorResponseDto { Message = ex.Message }) }); } }