コード例 #1
0
        public void expect_exception_when_argument_equals_null()
        {
            ICalculation <MarketRateInputModel, MarketRateOutputModel> rateCalculation =
                new RateCalculation();

            rateCalculation.Calculate(null);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
            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);
            }
コード例 #4
0
        public void EmployeeCostWithoutDiscountShouldBe()
        {
            RateCalculation rateCalculation     = new RateCalculation();
            var             costWithoutDiscount = Math.Round(rateCalculation.calculateCostWithoutDiscount(0), 2);

            Assert.Equal(38.46, costWithoutDiscount);
        }
コード例 #5
0
 /// <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;
 }
コード例 #6
0
        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);
        }
コード例 #7
0
        // 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());
        }
コード例 #8
0
        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);
        }
コード例 #9
0
 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;
 }
コード例 #10
0
        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);
        }
コード例 #11
0
        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);
        }
コード例 #12
0
        // 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());
        }
コード例 #13
0
        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));
        }
コード例 #14
0
        // 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()));
        }
コード例 #15
0
        /// <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);
        }
コード例 #16
0
        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);
        }
コード例 #17
0
 /// <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);
 }