public async Task <IActionResult> BuyCurrencyAsync([FromBody] TransactionBuyCurrency tbc) { try { var user_id = int.Parse(User.Claims.First(i => i.Type == "UserId").Value); await _transactionBusiness.BuyCurrency(tbc, user_id); return(StatusCode(201)); } catch { throw; } }
public async Task BuyCurrency(TransactionBuyCurrency tbc, int user_id) { //Get accounts and balances int ARS_accountId = _unitOfWork.Accounts.GetAccountId(user_id, "ARS"); int USD_accountId = _unitOfWork.Accounts.GetAccountId(user_id, "USD"); double balance_ARS = _accountBusiness.GetAccountBalance(user_id, "ARS"); double balance_USD = _accountBusiness.GetAccountBalance(user_id, "USD"); double cost; Rates rates = await _rates.GetRates(); Transactions transactionOrigin; Transactions transactionDestiny; if (tbc.Type == "Compra") { cost = tbc.Amount * rates.BuyingPrice; if (balance_ARS >= cost) { //en USD transactionOrigin = new Transactions { Amount = tbc.Amount, Concept = "Compra de divisas", Type = "Topup", AccountId = USD_accountId, CategoryId = 2 }; //en ARS transactionDestiny = new Transactions { Amount = cost, Concept = "Compra de divisas", Type = "Payment", AccountId = ARS_accountId, CategoryId = 2 }; } else { throw new CustomException(400, "Saldo insuficiente"); } } else { cost = tbc.Amount * rates.SellingPrice; if (tbc.Amount <= balance_USD) { //en USD transactionOrigin = new Transactions { AccountId = (int)USD_accountId, Amount = tbc.Amount, Concept = "Compra de divisas", Type = "Payment", CategoryId = 2 }; //en ARS transactionDestiny = new Transactions { AccountId = (int)ARS_accountId, Amount = cost, Concept = "Compra de divisas", Type = "Topup", CategoryId = 2 }; } else { throw new CustomException(400, "Saldo insuficiente"); } } _unitOfWork.Transactions.Insert(transactionOrigin); _unitOfWork.Transactions.Insert(transactionDestiny); await _unitOfWork.Complete(); return; }