public RescheduleLoanEvent Reschedule(ReschedulingOptions ro, Loan contract, NonWorkingDateSingleton nwdS, ApplicationSettings applicationSettings) { _contract = contract; _nwdS = nwdS; _generalSettings = applicationSettings; switch (contract.Product.LoanType) { case OLoanTypes.Flat: _Reschedule_Flat(ro); break; case OLoanTypes.DecliningFixedPrincipal: _Reschedule_FixedPrincipal(ro); break; case OLoanTypes.DecliningFixedInstallments: _Reschedule_DecliningFixedInstallments(ro); break; } _Reschedule_AdjustOverpaid(); RescheduleLoanEvent rSe = new RescheduleLoanEvent { Date = ro.ReschedulingDate, Amount = contract.CalculateActualOlb(), Interest = contract.GetTotalInterestDue(), ClientType = contract.ClientType, BadLoan = contract.BadLoan, NbOfMaturity = ro.NewInstallments, DateOffset = ro.RepaymentDateOffset, GracePeriod = ro.GracePeriod, ChargeInterestDuringShift = ro.ChargeInterestDuringShift, ChargeInterestDuringGracePeriod = ro.ChargeInterestDuringGracePeriod, InstallmentNumber = contract.GetLastFullyRepaidInstallment() == null ? 1 : contract.GetLastFullyRepaidInstallment().Number + 1 }; _contract.CalculateStartDates(); return rSe; }
private static void CheckTranche(DateTime date, Loan loan, decimal amount) { if (loan.GetLastFullyRepaidInstallment() != null) { if (date.Date < loan.GetLastFullyRepaidInstallment().PaidDate.Value.Date) { throw new OpenCbsContractSaveException(OpenCbsContractSaveExceptionEnum.TrancheDate); } } else { if (loan.StartDate > date.Date) { throw new OpenCbsContractSaveException(OpenCbsContractSaveExceptionEnum.TrancheDate); } } if (loan.AmountUnderLoc.HasValue) { if (loan.Amount + amount > loan.AmountUnderLoc) { throw new OpenCbsContractSaveException(OpenCbsContractSaveExceptionEnum.TrancheAmount); } } else { if (amount > loan.Product.AmountUnderLoc) { throw new OpenCbsContractSaveException(OpenCbsContractSaveExceptionEnum.TrancheAmount); } } if (amount == 0) throw new OpenCbsContractSaveException(OpenCbsContractSaveExceptionEnum.TrancheAmount); }