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);
        }