public void RepayNextInstallment_Declining_KeepNotExpectedInstallment()
        {
            Loan myContract = _SetContract(OLoanTypes.DecliningFixedInstallments, false, 1, 7, null);
            RepayNextInstallmentsStrategy rNI = _SetRepaymentOptions(myContract, false, 0);

            OCurrency amountPaid = 342, interestEvent = 0, principalEvent = 0, interestPrepayment = 0;
            OCurrency penaltyEvent    = 0;
            OCurrency commissionEvent = 0;

            rNI.RepayNextInstallments(ref amountPaid, ref interestEvent, ref interestPrepayment, ref principalEvent, ref penaltyEvent, ref commissionEvent);

            AssertRepayEvent(interestEvent, 0, principalEvent, 342, amountPaid, 0, interestPrepayment, 0);
        }
        public void RepayNextInstallment_Flat_KeepNotExpectedInstallment()
        {
            Loan myContract = _SetContract(OLoanTypes.Flat, false, 1, 6, null);
            RepayNextInstallmentsStrategy rNI = _SetRepaymentOptions(myContract, false, 0);

            OCurrency amountPaid = 680, interestEvent = 0, principalEvent = 0, interestPrepayment = 0;
            OCurrency penaltyEvent    = 0;
            OCurrency commissionEvent = 0;

            rNI.RepayNextInstallments(ref amountPaid, ref interestEvent, ref interestPrepayment, ref principalEvent, ref penaltyEvent, ref commissionEvent);
            AssertRepayEvent(interestEvent, 0, principalEvent, 680, amountPaid, 0, interestPrepayment, 0);

            AssertSpecifiedInstallment(myContract.GetInstallment(0), 9.6m, 0, 320, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(1), 9.6m, 64, 320, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(2), 9.6m, 64, 256, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(3), 9.6m, 64, 192, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(4), 9.6m, 64, 128, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(5), 9.6m, 64, 64, 0, 0);
        }
        public void RepayNextInstallment_Flat_DontManualInterest_KeepExpectedInstallment()
        {
            Loan myContract = _SetContract(OLoanTypes.Flat, true, 1, 6, null);
            RepayNextInstallmentsStrategy rNI = _SetRepaymentOptions(myContract, false, 0);

            OCurrency amountPaid = 200, interestEvent = 0, principalEvent = 0, interestPrepayment = 0;
            OCurrency penaltyEvent    = 0;
            OCurrency commissionEvent = 0;

            rNI.RepayNextInstallments(ref amountPaid, ref interestEvent, ref interestPrepayment, ref principalEvent, ref penaltyEvent, ref commissionEvent);
            AssertRepayEvent(interestEvent, 60, principalEvent, 140, amountPaid, 0, interestPrepayment, 60);

            AssertSpecifiedInstallment(myContract.GetInstallment(0), 30, 0, 0, 30);
            AssertSpecifiedInstallment(myContract.GetInstallment(1), 30, 200, 140, 30);
            AssertSpecifiedInstallment(myContract.GetInstallment(2), 30, 200, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(3), 30, 200, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(4), 30, 200, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(5), 30, 200, 0, 0);
        }
        public void RepayNextInstallment_ExoticDeclining_ManualInterest_KeepNotExpectedInstallment()
        {
            Loan myContract = _SetContract(OLoanTypes.DecliningFixedInstallments, false, 0, 6, _SetExotic(true));
            RepayNextInstallmentsStrategy rNI = _SetRepaymentOptions(myContract, true, 40);

            OCurrency amountPaid = 298, interestEvent = 0, principalEvent = 0, interestPrepayment = 0;
            OCurrency penaltyEvent    = 0;
            OCurrency commissionEvent = 0;

            rNI.RepayNextInstallments(ref amountPaid, ref interestEvent, ref interestPrepayment, ref principalEvent, ref penaltyEvent, ref commissionEvent);
            AssertRepayEvent(interestEvent, 0, principalEvent, 298, amountPaid, 0, interestPrepayment, 0);

            AssertSpecifiedInstallment(myContract.GetInstallment(0), 21.06m, 70.2m, 702, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(1), 18.95m, 140.4m, 631.8m, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(2), 14.74m, 280.8m, 491.4m, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(3), 6.32m, 0, 210.6m, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(4), 6.32m, 140.4m, 210.6m, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(5), 2.11m, 70.2m, 70.2m, 0, 0);
        }
        public void RepayNextInstallment_ExoticDeclining_KeepNotExpectedInstallment()
        {
            Loan myContract = _SetContract(OLoanTypes.DecliningFixedInstallments, false, 0, 6, _SetExotic(true));
            RepayNextInstallmentsStrategy rNI = _SetRepaymentOptions(myContract, false, 0);

            OCurrency amountPaid = 355, interestEvent = 0, principalEvent = 0, interestPrepayment = 0;
            OCurrency penaltyEvent    = 0;
            OCurrency commissionEvent = 0;

            rNI.RepayNextInstallments(ref amountPaid, ref interestEvent, ref interestPrepayment, ref principalEvent, ref penaltyEvent, ref commissionEvent);
            AssertRepayEvent(interestEvent, 0, principalEvent, 355, amountPaid, 0, interestPrepayment, 0);

            AssertSpecifiedInstallment(myContract.GetInstallment(0), 19.35m, 64.5m, 645, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(1), 17.42m, 129, 580.5m, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(2), 13.54m, 258, 451.5m, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(3), 5.80m, 0, 193.5m, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(4), 5.80m, 129, 193.5m, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(5), 1.94m, 64.5m, 64.5m, 0, 0);
        }
        public void RepayNextInstallment_ExoticDeclining_ManualInterest_KeepExpectedInstallment()
        {
            Loan myContract = _SetContract(OLoanTypes.DecliningFixedInstallments, true, 0, 6, _SetExotic(true));
            RepayNextInstallmentsStrategy rNI = _SetRepaymentOptions(myContract, true, 40);

            OCurrency amountPaid = 298, interestEvent = 0, principalEvent = 0, interestPrepayment = 0;
            OCurrency penaltyEvent    = 0;
            OCurrency commissionEvent = 0;

            rNI.RepayNextInstallments(ref amountPaid, ref interestEvent, ref interestPrepayment, ref principalEvent, ref penaltyEvent, ref commissionEvent);
            AssertRepayEvent(interestEvent, 0, principalEvent, 298, amountPaid, 0, interestPrepayment, 0);

            AssertSpecifiedInstallment(myContract.GetInstallment(0), 30, 100, 100, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(1), 27, 200, 198, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(2), 21, 400, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(3), 9, 0, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(4), 9, 200, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(5), 3, 100, 0, 0);
        }
        public void RepayNextInstallment_ExoticFlat_ManualFees_KeepExpectedInstallment()
        {
            Loan myContract = _SetContract(OLoanTypes.Flat, true, 0, 6, _SetExotic(false));
            RepayNextInstallmentsStrategy rNI = _SetRepaymentOptions(myContract, true, 20);

            OCurrency amountPaid = 301, interestEvent = 0, principalEvent = 0, interestPrepayment = 0;
            OCurrency penaltyEvent    = 0;
            OCurrency commissionEvent = 0;

            rNI.RepayNextInstallments(ref amountPaid, ref interestEvent, ref interestPrepayment, ref principalEvent, ref penaltyEvent, ref commissionEvent);
            AssertRepayEvent(interestEvent, 0, principalEvent, 301, amountPaid, 0, interestPrepayment, 0);

            AssertSpecifiedInstallment(myContract.GetInstallment(0), 18, 100, 100, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(1), 0, 200, 200, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(2), 36, 100, 1, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(3), 0, 0, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(4), 90, 400, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(5), 36, 200, 0, 0);
        }
        public void RepayNextInstallment_ExoticFlat_KeepNotExpectedInstallment()
        {
            Loan myContract = _SetContract(OLoanTypes.Flat, false, 0, 6, _SetExotic(false));
            RepayNextInstallmentsStrategy rNI = _SetRepaymentOptions(myContract, false, 0);

            OCurrency amountPaid = 680, interestEvent = 0, principalEvent = 0, interestPrepayment = 0;
            OCurrency penaltyEvent    = 0;
            OCurrency commissionEvent = 0;

            rNI.RepayNextInstallments(ref amountPaid, ref interestEvent, ref interestPrepayment, ref principalEvent, ref penaltyEvent, ref commissionEvent);
            AssertRepayEvent(interestEvent, 180, principalEvent, 500, amountPaid, 0, interestPrepayment, 180);

            AssertSpecifiedInstallment(myContract.GetInstallment(0), 0, 50, 0, 0); //repay interest first
            AssertSpecifiedInstallment(myContract.GetInstallment(1), 0, 100, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(2), 0, 50, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(3), 0, 0, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(4), 0, 200, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(5), 0, 100, 0, 0);
        }
        public void RepayNextInstallment_Declining_ManualInterest_KeepNotExpectedInstallment()
        {
            Loan myContract = _SetContract(OLoanTypes.DecliningFixedInstallments, false, 0, 7, null);
            RepayNextInstallmentsStrategy rNI = _SetRepaymentOptions(myContract, true, 30);

            OCurrency amountPaid = 342, interestEvent = 0, principalEvent = 0, interestPrepayment = 0;
            OCurrency penaltyEvent    = 0;
            OCurrency commissionEvent = 0;

            rNI.RepayNextInstallments(ref amountPaid, ref interestEvent, ref interestPrepayment, ref principalEvent, ref penaltyEvent, ref commissionEvent);
            AssertRepayEvent(interestEvent, 0, principalEvent, 342, amountPaid, 0, interestPrepayment, 0);

            AssertSpecifiedInstallment(myContract.GetInstallment(0), 19.74m, 85.87m, 658, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(1), 17.16m, 88.45m, 572.13m, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(2), 14.51m, 91.10m, 483.68m, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(3), 11.78m, 93.84m, 392.58m, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(4), 8.96m, 96.65m, 298.74m, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(5), 6.06m, 99.55m, 202.09m, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(6), 3.08m, 102.54m, 102.54m, 0, 0);
        }
        public void RepayNextInstallment_Declining_KeepExpectedInstallment()
        {
            Loan myContract = _SetContract(OLoanTypes.DecliningFixedInstallments, true, 1, 7, null);
            RepayNextInstallmentsStrategy rNI = _SetRepaymentOptions(myContract, false, 0);

            OCurrency amountPaid = 342, interestEvent = 0, principalEvent = 0, interestPrepayment = 0;
            OCurrency penaltyEvent    = 0;
            OCurrency commissionEvent = 0;

            rNI.RepayNextInstallments(ref amountPaid, ref interestEvent, ref interestPrepayment, ref principalEvent, ref penaltyEvent, ref commissionEvent);
            AssertRepayEvent(interestEvent.Value, 85.36m, principalEvent.Value, 256.64m, amountPaid.Value, 0, interestPrepayment.Value, 85.36m);

            Assert.AreEqual(1000, _CheckInstalmentsTotalPrincipal(myContract).Value);

            AssertSpecifiedInstallment(myContract.GetInstallment(0), 30, 0, 1000, 0, 30);
            AssertSpecifiedInstallment(myContract.GetInstallment(1), 30, 154.60m, 1000, 154.60m, 30);
            AssertSpecifiedInstallment(myContract.GetInstallment(2), 25.36m, 159.24m, 845.40m, 102.04m, 25.36m);
            AssertSpecifiedInstallment(myContract.GetInstallment(3), 20.58m, 164.02m, 686.16m, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(4), 15.66m, 168.93m, 522.14m, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(5), 10.60m, 173.99m, 353.21m, 0, 0);
            AssertSpecifiedInstallment(myContract.GetInstallment(6), 5.38m, 179.22m, 179.22m, 0, 0);
        }
Example #11
0
        public void Repay(OCurrency amountPaid,
                          ref OCurrency penaltiesEvent,
                          ref OCurrency commissionsEvent,
                          ref OCurrency interestsEvent,
                          ref OCurrency iterestPrepayment,
                          ref OCurrency principalEvent,
                          ref OCurrency manualInterestAmount,
                          ref OPaymentType paymentType)
        {
            _repaymentMethod.Repay(ref amountPaid, ref penaltiesEvent, ref commissionsEvent, ref interestsEvent);
            //repayLateInstallment + eventualy a good installment => Penalties
            _calculateInstallments.CalculateNewInstallmentsWithLateFees(_date);

            if (paymentType == OPaymentType.PartialPayment ||
                paymentType == OPaymentType.TotalPayment ||
                paymentType == OPaymentType.ProportionalPayment)
            {
                _calculateInstallments.CalculateAnticipateRepayment(_date, paymentType, amountPaid);
            }

            switch (paymentType)
            {
            case OPaymentType.StandardPayment:
            {
                if (LoanOptions.LoansType == OLoanTypes.DecliningFixedPrincipalWithRealInterest)
                {
                    _calculateRealInterestInstallments.RepayInstallments(_date,
                                                                         ref amountPaid,
                                                                         ref interestsEvent,
                                                                         ref principalEvent,
                                                                         ref penaltiesEvent,
                                                                         ref commissionsEvent,
                                                                         ref paymentType);
                    PaidIstallments.AddRange(AddInstallments(_calculateRealInterestInstallments.PaidIstallments, PaidIstallments));
                }
                else
                {
                    _calculateInstallments.RepayInstallments(_date,
                                                             ref amountPaid,
                                                             ref interestsEvent,
                                                             ref principalEvent,
                                                             ref penaltiesEvent,
                                                             ref commissionsEvent);
                }

                break;
            }

            case OPaymentType.TotalPayment:
            {
                _calculateInstallments.RepayTotalAnticipateInstallments(_date, ref amountPaid,
                                                                        ref interestsEvent, ref principalEvent,
                                                                        ref penaltiesEvent,
                                                                        ref commissionsEvent);
                break;
            }

            case OPaymentType.PartialPayment:
            {
                _calculateInstallments.RepayPartialAnticipateInstallments(_date, ref amountPaid,
                                                                          ref interestsEvent,
                                                                          ref principalEvent,
                                                                          ref penaltiesEvent,
                                                                          ref commissionsEvent);
                break;
            }

            case OPaymentType.ProportionalPayment:
            {
                _calculateInstallments.RepayProportinalyInstallments(_date, ref amountPaid,
                                                                     ref interestsEvent,
                                                                     ref principalEvent,
                                                                     ref penaltiesEvent,
                                                                     ref commissionsEvent);
                break;
            }
            }

            PaidIstallments.AddRange(AddInstallments(_calculateInstallments.PaidIstallments, PaidIstallments));
            PaidIstallments.AddRange(AddInstallments(_repaymentMethod.PaidIstallments, PaidIstallments));

            //old legacy one day we will remove it
            if (paymentType == OPaymentType.StandardPayment)
            {
                _feesForAnticipatedRepayment.calculateFees(_date, ref amountPaid, ref commissionsEvent);
            }

            //repaynextinstallment
            if (amountPaid > 0)
            {
                _repayNextInstallments.RepayNextInstallments(ref amountPaid, ref interestsEvent, ref iterestPrepayment,
                                                             ref principalEvent, ref penaltiesEvent,
                                                             ref commissionsEvent);

                PaidIstallments.AddRange(AddInstallments(_repayNextInstallments.PaidInstallments, PaidIstallments));
            }
        }