public void expect_exception_when_argument_equals_null() { ICalculation <MarketRateInputModel, MarketRateOutputModel> rateCalculation = new RateCalculation(); rateCalculation.Calculate(null); }
public void MapToViewModel_CorrectObject_FullObject() { // arrange var rateInput = new RateCalculation { Rate = (decimal)2.51, RateValue = (decimal)2.5 }; var calculationInput = new CalculateRatesInputModel { SecondCurrency = "USD", FirstCurrency = "LOT", Value = (decimal)12.3 }; // act var result = RateMapper.MapToViewModel(rateInput, calculationInput); // assert Assert.Equal(rateInput.RateValue, result.RateValue); Assert.Equal(rateInput.Rate, result.Rate); Assert.Equal(calculationInput.FirstCurrency, result.FirtsCurrency); Assert.Equal(calculationInput.SecondCurrency, result.SecondCurrency); Assert.Equal(calculationInput.Value, result.Amount); }
public override Builder set(string propertyName, object newValue) { switch (propertyName.GetHashCode()) { case -885469925: // payReceive this.payReceive_Renamed = (PayReceive)newValue; break; case 304659814: // accrualSchedule this.accrualSchedule_Renamed = (PeriodicSchedule)newValue; break; case -1499086147: // paymentSchedule this.paymentSchedule_Renamed = (PaymentSchedule)newValue; break; case 1447860727: // notionalSchedule this.notionalSchedule_Renamed = (NotionalSchedule)newValue; break; case -934682935: // calculation this.calculation_Renamed = (RateCalculation)newValue; break; default: throw new NoSuchElementException("Unknown property: " + propertyName); } return(this); }
public void EmployeeCostWithoutDiscountShouldBe() { RateCalculation rateCalculation = new RateCalculation(); var costWithoutDiscount = Math.Round(rateCalculation.calculateCostWithoutDiscount(0), 2); Assert.Equal(38.46, costWithoutDiscount); }
/// <summary> /// Restricted copy constructor. </summary> /// <param name="beanToCopy"> the bean to copy from, not null </param> internal Builder(RateCalculationSwapLeg beanToCopy) { this.payReceive_Renamed = beanToCopy.PayReceive; this.accrualSchedule_Renamed = beanToCopy.AccrualSchedule; this.paymentSchedule_Renamed = beanToCopy.PaymentSchedule; this.notionalSchedule_Renamed = beanToCopy.NotionalSchedule; this.calculation_Renamed = beanToCopy.Calculation; }
public void EmployeeCostWithDiscountShouldBe() { RateCalculation rateCalculation = new RateCalculation(); rateCalculation.Discounts = new List <double>(new double[] { .1 }); var costWithDiscount = Math.Round(rateCalculation.calculateCostWithDiscount(0), 2); Assert.Equal(Math.Round(34.62, 2), costWithDiscount); }
// parse a single leg private static RateCalculationSwapLeg parseLeg(CsvRow row, string leg, FloatingRateIndex index, DayCount defaultFixedLegDayCount) { PayReceive payReceive = LoaderUtils.parsePayReceive(getValue(row, leg, DIRECTION_FIELD)); PeriodicSchedule accrualSch = parseAccrualSchedule(row, leg); PaymentSchedule paymentSch = parsePaymentSchedule(row, leg, accrualSch.Frequency); NotionalSchedule notionalSch = parseNotionalSchedule(row, leg); RateCalculation calc = parseRateCalculation(row, leg, index, defaultFixedLegDayCount, accrualSch.BusinessDayAdjustment, notionalSch.Currency); return(RateCalculationSwapLeg.builder().payReceive(payReceive).accrualSchedule(accrualSch).paymentSchedule(paymentSch).notionalSchedule(notionalSch).calculation(calc).build()); }
public void expect_true_for_correct_requested_amount() { ICalculation <MarketRateInputModel, MarketRateOutputModel> rateCalculation = new RateCalculation(); var loanAmount = 1000; var rate = 0.07; var term = 36; var result = rateCalculation.Calculate(new MarketRateInputModel(loanAmount, term, rate)); Assert.AreEqual(loanAmount, result.RequstedAmount); }
private RateCalculationSwapLeg(PayReceive payReceive, PeriodicSchedule accrualSchedule, PaymentSchedule paymentSchedule, NotionalSchedule notionalSchedule, RateCalculation calculation) { JodaBeanUtils.notNull(payReceive, "payReceive"); JodaBeanUtils.notNull(accrualSchedule, "accrualSchedule"); JodaBeanUtils.notNull(paymentSchedule, "paymentSchedule"); JodaBeanUtils.notNull(notionalSchedule, "notionalSchedule"); JodaBeanUtils.notNull(calculation, "calculation"); this.payReceive = payReceive; this.accrualSchedule = accrualSchedule; this.paymentSchedule = paymentSchedule; this.notionalSchedule = notionalSchedule; this.calculation = calculation; }
public static CalculateRatesResponseModel MapToViewModel(RateCalculation rateItem, CalculateRatesInputModel rateInput) { var result = new CalculateRatesResponseModel() { Rate = rateItem.Rate, RateValue = rateItem.RateValue, Amount = rateInput.Value, FirtsCurrency = rateInput.FirstCurrency, SecondCurrency = rateInput.SecondCurrency }; return(result); }
public void expect_true_for_correct_total_repayment() { ICalculation <MarketRateInputModel, MarketRateOutputModel> rateCalculation = new RateCalculation(); var loanAmount = 1000; var rate = 0.07; var term = 36; var result = rateCalculation.Calculate(new MarketRateInputModel(loanAmount, term, rate)); // excepted result is true var expectedTotalPayment = (decimal)1111.57; var currentTotalPayment = Math.Truncate(result.TotalPayment * 100) / 100; Assert.AreEqual(expectedTotalPayment, currentTotalPayment); }
// a summary of the leg private string legSummary(SwapLeg leg) { if (leg is RateCalculationSwapLeg) { RateCalculationSwapLeg rcLeg = (RateCalculationSwapLeg)leg; RateCalculation calculation = rcLeg.Calculation; if (calculation is FixedRateCalculation) { FixedRateCalculation calc = (FixedRateCalculation)calculation; string vary = calc.Rate.Steps.Count > 0 || calc.Rate.StepSequence.Present ? " variable" : ""; return(SummarizerUtils.percent(calc.Rate.InitialValue) + vary); } if (calculation is IborRateCalculation) { IborRateCalculation calc = (IborRateCalculation)calculation; string gearing = calc.Gearing.map(g => " * " + SummarizerUtils.value(g.InitialValue)).orElse(""); string spread = calc.Spread.map(s => " + " + SummarizerUtils.percent(s.InitialValue)).orElse(""); return(calc.Index.Name + gearing + spread); } if (calculation is OvernightRateCalculation) { OvernightRateCalculation calc = (OvernightRateCalculation)calculation; string avg = calc.AccrualMethod == OvernightAccrualMethod.AVERAGED ? " avg" : ""; string gearing = calc.Gearing.map(g => " * " + SummarizerUtils.value(g.InitialValue)).orElse(""); string spread = calc.Spread.map(s => " + " + SummarizerUtils.percent(s.InitialValue)).orElse(""); return(calc.Index.Name + avg + gearing + spread); } if (calculation is InflationRateCalculation) { InflationRateCalculation calc = (InflationRateCalculation)calculation; string gearing = calc.Gearing.map(g => " * " + SummarizerUtils.value(g.InitialValue)).orElse(""); return(calc.Index.Name + gearing); } } if (leg is KnownAmountSwapLeg) { KnownAmountSwapLeg kaLeg = (KnownAmountSwapLeg)leg; string vary = kaLeg.Amount.Steps.Count > 0 || kaLeg.Amount.StepSequence.Present ? " variable" : ""; return(SummarizerUtils.amount(kaLeg.Currency, kaLeg.Amount.InitialValue) + vary); } ImmutableSet <Index> allIndices = leg.allIndices(); return(allIndices.Empty ? "Fixed" : allIndices.ToString()); }
public async Task <CalculateRatesResponseModel> CalculateRates(CalculateRatesInputModel calculateRatesInputModel) { var firstCurrency = await _dataLoadLogic.GetCurrency(calculateRatesInputModel.FirstCurrency); var secondCurrency = await _dataLoadLogic.GetCurrency(calculateRatesInputModel.SecondCurrency); if (firstCurrency == null || secondCurrency == null) { throw new CurrencyNotFoundException(); } var rateCalculation = new RateCalculation() { RateValue = CaclulateRateValue(firstCurrency.Value, secondCurrency.Value, calculateRatesInputModel.Value), Rate = CaclulateRate(firstCurrency.Value, secondCurrency.Value) }; return(RateMapper.MapToViewModel(rateCalculation, calculateRatesInputModel)); }
// parses the swap internal Swap parseSwap(FpmlDocument document, XmlElement tradeEl, TradeInfoBuilder tradeInfoBuilder) { XmlElement swapEl = tradeEl.getChild("swap"); ImmutableList <XmlElement> legEls = swapEl.getChildren("swapStream"); ImmutableList.Builder <SwapLeg> legsBuilder = ImmutableList.builder(); foreach (XmlElement legEl in legEls) { // calculation XmlElement calcPeriodAmountEl = legEl.getChild("calculationPeriodAmount"); XmlElement calcEl = calcPeriodAmountEl.findChild("calculation").orElse(XmlElement.ofChildren("calculation", ImmutableList.of())); PeriodicSchedule accrualSchedule = parseSwapAccrualSchedule(legEl, document); PaymentSchedule paymentSchedule = parseSwapPaymentSchedule(legEl, calcEl, document); // known amount or rate calculation Optional <XmlElement> knownAmountOptEl = calcPeriodAmountEl.findChild("knownAmountSchedule"); if (knownAmountOptEl.Present) { XmlElement knownAmountEl = knownAmountOptEl.get(); document.validateNotPresent(legEl, "stubCalculationPeriodAmount"); document.validateNotPresent(legEl, "resetDates"); // pay/receive and counterparty PayReceive payReceive = document.parsePayerReceiver(legEl, tradeInfoBuilder); ValueSchedule amountSchedule = parseSchedule(knownAmountEl, document); // build legsBuilder.add(KnownAmountSwapLeg.builder().payReceive(payReceive).accrualSchedule(accrualSchedule).paymentSchedule(paymentSchedule).amount(amountSchedule).currency(document.parseCurrency(knownAmountEl.getChild("currency"))).build()); } else { document.validateNotPresent(calcEl, "fxLinkedNotionalSchedule"); document.validateNotPresent(calcEl, "futureValueNotional"); // pay/receive and counterparty PayReceive payReceive = document.parsePayerReceiver(legEl, tradeInfoBuilder); NotionalSchedule notionalSchedule = parseSwapNotionalSchedule(legEl, calcEl, document); RateCalculation calculation = parseSwapCalculation(legEl, calcEl, accrualSchedule, document); // build legsBuilder.add(RateCalculationSwapLeg.builder().payReceive(payReceive).accrualSchedule(accrualSchedule).paymentSchedule(paymentSchedule).notionalSchedule(notionalSchedule).calculation(calculation).build()); } } return(Swap.of(legsBuilder.build())); }
/// <summary> /// Get offer for good match with requested amount /// </summary> /// <param name="requestedAmount"></param> /// <param name="lenderMarkerDatas"></param> private List <MarketRateOutputModel> FindPossibleQuotes(decimal requestedAmount, List <MarketData> lenderMarkerDatas) { var rateCalculation = new RateCalculation(); var possibleQuotes = new List <MarketRateOutputModel>(); // requestedAmount assign to neededAmount var neededAmount = requestedAmount; foreach (var lenderData in lenderMarkerDatas) { // if lender has amount which I needed, get all money. Otherwise, get money which is available var available = neededAmount >= lenderData.Available ? lenderData.Available : neededAmount; var rateInput = new MarketRateInputModel { Amount = available, Rate = lenderData.Rate, Term = Term }; // calculate rate and repayment var rateOutput = rateCalculation.Calculate(rateInput); possibleQuotes.Add(rateOutput); // subtraction avaible money from needed amount neededAmount -= available; // exit loop when we get money which I needed if (neededAmount <= 0) { break; } } return(possibleQuotes); }
public void expect_exception_when_interest_rate_equal_zero() { ICalculation <MarketRateInputModel, MarketRateOutputModel> rateCalculation = new RateCalculation(); var loanAmount = 1000; var rate = 0; var term = 36; Exception exception = null; try { rateCalculation.Calculate(new MarketRateInputModel(loanAmount, term, rate)); } catch (Exception ex) { exception = ex; } var isTrue = CheckException(exception, ErrorMessage.ArgumentRateGreaterThanZero); Assert.IsTrue(isTrue); }
/// <summary> /// Sets the interest rate accrual calculation. /// <para> /// Different kinds of swap leg are determined by the subclass used here. /// See <seealso cref="FixedRateCalculation"/>, <seealso cref="IborRateCalculation"/> and <seealso cref="OvernightRateCalculation"/>. /// </para> /// </summary> /// <param name="calculation"> the new value, not null </param> /// <returns> this, for chaining, not null </returns> public Builder calculation(RateCalculation calculation) { JodaBeanUtils.notNull(calculation, "calculation"); this.calculation_Renamed = calculation; return(this); }