private DynamicParameters CreateParametersForCreateAynsc(TransactionEntityModel transaction) { var parameters = new DynamicParameters(); parameters.Add("@AccessKey", transaction.AccessKey); parameters.Add("@Symbol", transaction.Symbol); parameters.Add("@TradeDate", transaction.TradeDate, DbType.DateTime2); parameters.Add("@TradePrice", transaction.TradePrice); parameters.Add("@Quantity", transaction.Quantity); parameters.Add("@Notional", transaction.Notional); return(parameters); }
public int EnactTransaction(AccountServiceModel sender, decimal amount, int currentUserId, string toIBAN, AccountServiceModel recipient = null) { int senderTransactionId = int.MinValue; decimal unconvertedAmount = amount; string uniqueIdentifier = Guid.NewGuid().ToString(); using (var dbTransaction = _unitOfWork.BankContext.Database.BeginTransaction()) { try { _unitOfWork.AddRepository <AccountEntityModel>().AddRepository <TransactionEntityModel>(); var accountRepo = _unitOfWork.GetRepository <AccountEntityModel>(); var transactionRepo = _unitOfWork.GetRepository <TransactionEntityModel>(); // deduct money from the senders account sender.Balance -= amount; if (recipient != null) { // give money to recipient if (recipient.CurrencyId != sender.CurrencyId) { double rate = _currencyService.GetExchangeRate(sender.CurrencyId, recipient.CurrencyId); // do we have the exchange rate if (rate == double.MinValue) { // exchange rate should at least exist backwards rate = _currencyService.GetExchangeRate(recipient.CurrencyId, sender.CurrencyId); amount /= decimal.Parse(rate.ToString()); } else { amount *= decimal.Parse(rate.ToString()); } } recipient.Balance += amount; var recipientEntity = _mapper.Map <AccountEntityModel>(recipient); accountRepo.Update(recipientEntity); var recipientTransactionEntity = new TransactionEntityModel { AccountId = recipientEntity.Id, CurrencyId = sender.CurrencyId, Amount = unconvertedAmount, CreatedById = currentUserId, UniqueTransactionIdentifier = uniqueIdentifier, ToIBAN = null, TransactionTypeId = (int)TransactionTypeEnum.TransactionType.Debit }; _dateService.SetDateCreatedNow(ref recipientTransactionEntity); transactionRepo.AddItem(recipientTransactionEntity); } var senderEntity = _mapper.Map <AccountEntityModel>(sender); accountRepo.Update(senderEntity); var senderTransactionEntity = new TransactionEntityModel { AccountId = senderEntity.Id, CurrencyId = sender.CurrencyId, Amount = unconvertedAmount, CreatedById = currentUserId, UniqueTransactionIdentifier = uniqueIdentifier, ToIBAN = toIBAN, TransactionTypeId = (int)TransactionTypeEnum.TransactionType.Credit }; _dateService.SetDateCreatedNow(ref senderTransactionEntity); transactionRepo.AddItem(senderTransactionEntity); _unitOfWork.Save(); senderTransactionId = senderTransactionEntity.Id; dbTransaction.Commit(); } catch (Exception) { senderTransactionId = int.MinValue; dbTransaction.Rollback(); } } return(senderTransactionId); }