private async Task UpdateAccount(Coinbase.Models.Account coinbaseAccount, IEnumerable <AccountDto> accountsInDb)
    {
        var exchangeRate = await _exchangeRateService.GetExchangeRate(coinbaseAccount.Currency.Code);

        if (exchangeRate == null)
        {
            _logger.LogWarning("Could not get exchange rate for currency {Currency}", coinbaseAccount.Currency.Name);
            return;
        }

        var correspondingAccountInDb =
            accountsInDb.FirstOrDefault(x => x.Currency.ToString() == coinbaseAccount.Currency.Code);

        if (correspondingAccountInDb == null)
        {
            correspondingAccountInDb = new AccountDto
            {
                Currency = coinbaseAccount.Currency.Code,
                Balance  = coinbaseAccount.Balance.Amount * exchangeRate.NOKRate,
                Exchange = "Coinbase"
            };

            _dbRepository.QueueAdd <Account, AccountDto>(correspondingAccountInDb);
        }
        else
        {
            correspondingAccountInDb.Balance = coinbaseAccount.Balance.Amount * exchangeRate.NOKRate;
            _dbRepository.QueueUpdate <Account, AccountDto>(correspondingAccountInDb);
        }
    }
Ejemplo n.º 2
0
        /// <summary>
        /// Обменять валюту
        /// </summary>
        /// <param name="sourceCurrencyId">Идентификатор исходящей валюты</param>
        /// <param name="destinationCurrencyId">Идентификатор входящей валюты</param>
        /// <param name="sumInSourceCurrency">Сумма в исходящей валюте</param>
        public void Exchange(long userId, int sourceCurrencyId, int destinationCurrencyId, decimal sumInSourceCurrency)
        {
            var wallet = walletRepository.GetWalletByUserId(userId);

            if (wallet == null)
            {
                throw new ArgumentException($"В системе не заведен кошелек для пользователя с ИД = {userId}");
            }

            var sourceCurrency      = currencyRepository.GetCurrencyById(sourceCurrencyId);
            var destinationCurrency = currencyRepository.GetCurrencyById(destinationCurrencyId);

            if (sourceCurrency == null)
            {
                throw new ArgumentException($"В БД не найдена валюта с ИД = {sourceCurrencyId}");
            }

            if (destinationCurrency == null)
            {
                throw new ArgumentException($"В БД не найдена валюта с ИД = {destinationCurrencyId}");
            }

            var exchangeRate = exchangeRateService.GetExchangeRate(sourceCurrency.Code, destinationCurrency.Code);

            wallet.Withdraw(sourceCurrencyId, sumInSourceCurrency);

            var sumInDestinationCurrency = sumInSourceCurrency * exchangeRate;

            wallet.Deposit(destinationCurrencyId, sumInDestinationCurrency);
            walletRepository.Update(wallet);
        }
Ejemplo n.º 3
0
 private void LoadExchangeIndexes()
 {
     _exchangeRateService.GetExchangeRate(RateType.USD).ContinueWith(task =>
     {
         if (task.Exception == null)
         {
             USD = task.Result;
         }
     });
     _exchangeRateService.GetExchangeRate(RateType.EUR).ContinueWith(task =>
     {
         if (task.Exception == null)
         {
             EUR = task.Result;
         }
     });
 }
Ejemplo n.º 4
0
        public MessageModel <List <CurrencyInfoDTO> > GetCurrencyInfo([FromRoute, SwaggerParameter("國家 e.g. VN ", Required = true)] string country)
        {
            Logger.LogInformation(country);
            List <CurrencyCode>    currencyCodes    = currencyService.GetCurrencyByCountry(country.ToUpper());
            List <CurrencyInfoDTO> currencyInfoDTOs = mapper.Map <List <CurrencyInfoDTO> >(currencyCodes);
            List <ExchangeRate>    exchangeRates    = exchangeRateService.GetExchangeRate();

            foreach (CurrencyInfoDTO currency in currencyInfoDTOs)
            {
                currency.rate = exchangeRates.Find(rate => rate.CurrencyName.Equals(currency.currencyName)).Rate;
            }

            return(new MessageModel <List <CurrencyInfoDTO> >
            {
                Data = currencyInfoDTOs
            });
        }
Ejemplo n.º 5
0
 public decimal GetExchangeRate(CurrencyPair currencyPair)
 {
     if (currencyPair.HaveSameCurrency())
     {
         return(1);
     }
     return(_exchangeRateProvider.GetExchangeRate(currencyPair.FromCurrency, currencyPair.ToCurrency));
 }
Ejemplo n.º 6
0
        public async Task <SignResult> Sign(Guid transferId)
        {
            var signResult = new SignResult();

            var transfer = _transferRepository.GetById(transferId);

            if (transfer == null)
            {
                signResult.ValidationResult.Messages.Add("The transfer that you want to sign doesn't exist");
                return(signResult);
            }
            var account = _accountService.GetByUserId(transfer.UserId);

            var transferValidation = _transferValidator.Validate(transfer);

            if (transferValidation.Succeded)
            {
                var transaction = _mapper.Map <Transaction>(transfer);

                var exchangeRate = await _exchangeRateService.GetExchangeRate(DateTime.Today, transfer.DestinationCurrencyCode, account.CurrencyCode);

                if (exchangeRate == null)
                {
                    signResult.ValidationResult.Messages.Add("There is no exchange rate available for the selected currencies.");
                    return(signResult);
                }
                transaction.UsedRate               = exchangeRate.Rate;
                transaction.UsedRateDate           = exchangeRate.RateDate;
                transaction.IsBaseCurrencySameAsTo = exchangeRate.IsBaseCurrencySameAsTo;

                var transactionValidation = _transactionValidator.Validate(transaction);
                if (transactionValidation.Succeded)
                {
                    transfer.Status    = Status.Signed;
                    transfer.UpdatedOn = DateTime.UtcNow;
                    if (exchangeRate.IsBaseCurrencySameAsTo)
                    {
                        account.Balance -= transaction.Amount / transaction.UsedRate;
                    }
                    else
                    {
                        account.Balance -= transaction.Amount * transaction.UsedRate;
                    }

                    signResult.TransactionId = _transferRepository.SignTransfer(transfer, transaction, account);
                }
                else
                {
                    signResult.ValidationResult.Messages.AddRange(transactionValidation.Messages);
                }
            }
            else
            {
                signResult.ValidationResult.Messages.AddRange(transferValidation.Messages);
            }
            return(signResult);
        }
Ejemplo n.º 7
0
        public async Task <ActionResult <string> > Get()
        {
            try
            {
                var rate = await _rateService.GetExchangeRate();

                return(Ok(rate));
            }
            catch (Exception e)
            {
                return(BadRequest(e.Message));
            }
        }
Ejemplo n.º 8
0
        public async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "exchangerate")] HttpRequest req,
            ILogger log, IBinder binder)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            var result = await _exchangeRateService.GetExchangeRate(binder);

            if (result.ServiceResultCode == (int)HttpStatusCode.OK)
            {
                return(new OkObjectResult(result.Data.rate));
            }

            return(new StatusCodeResult(result.ServiceResultCode));
        }
Ejemplo n.º 9
0
        //
        // GET: CreateEdit
        public ActionResult CreateEdit(string xid)
        {
            UExchangeRate exRate = new UExchangeRate();

            exRate.CurrencySelect = new SelectList(exchangeRateService.CurrencyObj.GetCurrencies(countryProg.Id), "Id", "Name");
            exRate.MainCurrencyId = mbCurrency.Id.ToString();
            exRate.MonthSelect    = new SelectList(ExchangeRateExtension.GetMonths(), "Month", "MonthName");
            exRate.Month          = DateTime.Today.Month;
            exRate.Year           = DateTime.Today.Year;
            Guid excRateId;

            if (Guid.TryParse(xid, out excRateId))
            {
                ViewBag.Action       = "Edit";
                exRate._ExchangeRate = exchangeRateService.GetExchangeRate(excRateId);
            }
            return(View(exRate));
        }
Ejemplo n.º 10
0
        public async Task ShouldUpdateBalanceAndSetStatusSignedToTheTransfer()
        {
            //Arrange
            var transfer = new Transfer
            {
                Amount = 100,
                DestinationCurrencyCode = "USD",
                CartId = Guid.NewGuid(),
                DestinationAccountNumber = "TEST",
                Status = "Pending",
                UserId = Guid.NewGuid()
            };
            var account = new Account
            {
                CurrencyCode = "EUR",
                Balance      = 15200
            };
            var transaction = new Transaction
            {
                DestinationAccountNumber = transfer.DestinationAccountNumber,
                Amount = transfer.Amount,
                DestinationCurrencyCode = transfer.DestinationCurrencyCode,
                UserId = transfer.UserId
            };

            transferRepository.GetById(Arg.Any <Guid>()).Returns(transfer);
            accountService.GetByUserId(Arg.Any <Guid>()).Returns(account);
            mapper.Map <Transaction>(Arg.Any <Transfer>()).Returns(transaction);

            exchangeRateService.GetExchangeRate(Arg.Any <DateTime>(), "USD", "EUR").Returns(
                new CachedExchangeRate
            {
                CurrencyCodeFrom       = "EUR",
                CurrencyCodeTo         = "USD",
                Rate                   = 1.18M,
                RateDate               = DateTime.Today,
                IsBaseCurrencySameAsTo = true
            });

            //Act
            var transferService = new TransferService(transferRepository, accountService, mapper, userRepository, exchangeRateService, new TransferValidator(), new TransactionValidator(accountService));
            await transferService.Sign(transfer.Id);

            //Assert
            account.Balance.Should().BeApproximately(15115.25M, 2);
            transfer.Status.Should().Be(Status.Signed);
        }