예제 #1
0
        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;
        }
예제 #2
0
        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);
        }