private EventStock GenerateRepaymentEvents(CreditContractRepayment cCr, DateTime payDate, OCurrency penaltiesEvent, OCurrency commissionsEvent, OCurrency interestEvent, OCurrency interestPrepayment, OCurrency principalEvent, int pastDueDays, OPaymentType paymentType, bool isPending, int instNumber, OPaymentMethods paymentMethods) { RepaymentEvent rpEvent; EventStock listOfLoanEvents = new EventStock(); #region Event identification ////////////////////////////////////////////////////////////////////////////////////////////////////////// if (cCr.PaidIstallments.Count > 0) { foreach (Installment paidIstallment in cCr.PaidIstallments) { int number = paidIstallment.Number; OCurrency rpeCapital = 0; OCurrency rpeInterests = 0; OCurrency rpeCommission = 0; OCurrency rpePenalty = 0; int overdueDays = paidIstallment.ExpectedDate >= payDate ? 0 : pastDueDays; foreach (RepaymentEvent rpe in Events.GetLoanRepaymentEvents()) { if (rpe.InstallmentNumber == paidIstallment.Number && !rpe.Deleted) { if (rpe.RepaymentType != OPaymentType.PersonTotalPayment) { rpeCapital += rpe.Principal; rpeInterests += rpe.Interests; rpePenalty += rpe.Penalties; } rpeCommission += rpe.Commissions; if (rpe.RepaymentType == OPaymentType.PersonTotalPayment && cCr.LoanOptions.ManualCommissionAmount != 0) rpeCommission -= rpe.Commissions; } } if (rpeCapital > paidIstallment.PaidCapital) rpeCapital = 0; if (rpeInterests < 0) rpeInterests = 0; if (rpeInterests > paidIstallment.InterestsRepayment) { rpeInterests = 0; } OCurrency principalAmount = paidIstallment.CapitalRepayment - (paidIstallment.CapitalRepayment - (paidIstallment.PaidCapital - rpeCapital)); OCurrency interestAmount = paidIstallment.InterestsRepayment - (paidIstallment.InterestsRepayment - (paidIstallment.PaidInterests - rpeInterests)); principalEvent -= principalAmount; interestEvent -= interestAmount; if (principalAmount == 0 && interestAmount == 0 && paidIstallment.PaidCapital == 0) { principalAmount = principalEvent; interestAmount = interestEvent; } if (interestAmount < 0) interestAmount = 0; OCurrency commissionAmount = paidIstallment.CommissionsUnpaid - (paidIstallment.CommissionsUnpaid - (paidIstallment.PaidCommissions - rpeCommission)); OCurrency penaltyAmount = paidIstallment.FeesUnpaid - (paidIstallment.FeesUnpaid - (paidIstallment.PaidFees - rpePenalty)); //just to be sure that we do not have negative in the base penaltyAmount = penaltyAmount < 0 ? 0 : penaltyAmount; rpEvent = CreateRepaymentEvent(number, payDate, penaltyAmount, commissionAmount, interestAmount, interestAmount, principalAmount, overdueDays, _clientType == OClientTypes.Group, paymentType, isPending); rpEvent.PaymentMethod = paymentMethods; listOfLoanEvents.Add(rpEvent); } } else { rpEvent = CreateRepaymentEvent(instNumber, payDate, penaltiesEvent, commissionsEvent, interestEvent, interestPrepayment, principalEvent, pastDueDays, _clientType == OClientTypes.Group, paymentType, isPending); rpEvent.PaymentMethod = paymentMethods; listOfLoanEvents.Add(rpEvent); } #endregion return listOfLoanEvents; }
/// <summary> /// Instancy a new CreditContract. Use it if installments need'nt calculate /// </summary> /// <param name="pUser"></param> /// <param name="pGeneralSettings"></param> /// <param name="pNwds"></param> /// <param name="pPt"></param> /// <param name="pChartOfAccounts"></param> public Loan(User pUser, ApplicationSettings pGeneralSettings, NonWorkingDateSingleton pNwds, ProvisionTable pPt, ChartOfAccounts pChartOfAccounts) { _user = pUser; _generalSettings = pGeneralSettings; _nwdS = pNwds; NonRepaymentPenalties = new NonRepaymentPenalties(); _installmentList = new List<Installment>(); _guarantors = new List<Guarantor>(); _collaterals = new List<ContractCollateral>(); _events = new EventStock(); EntryFeesPercentage = true; }
public Loan(LoanProduct pAckage, OCurrency pAmount, double pInterestRate, int pNbOfInstallments, int pGracePeriod, DateTime pStartDate, DayOfWeek? meetingDay, User pUser, ApplicationSettings pGeneralSettings, NonWorkingDateSingleton pNwds, ProvisionTable pPt, ChartOfAccounts pChartOfAccounts) { _user = pUser; _generalSettings = pGeneralSettings; _nwdS = pNwds; Product = pAckage; NonRepaymentPenalties = new NonRepaymentPenalties(); _events = new EventStock(); _guarantors = new List<Guarantor>(); _collaterals = new List<ContractCollateral>(); _installmentType = pAckage.InstallmentType; _amount = pAmount; _interestRate = pInterestRate; _nbOfInstallments = pNbOfInstallments; GracePeriod = pGracePeriod; CreationDate = pStartDate; _startDate = pStartDate; _firstInstallmentDate = CalculateInstallmentDate(pStartDate, 1); if (meetingDay.HasValue) _firstInstallmentDate = GetMeetingDate(_firstInstallmentDate, meetingDay); _alignAlignDisbursementDate = CalculateAlignDisbursementDate(_firstInstallmentDate); //with this constructor, installment are directly calculated when a new CreditContract is instanciated _installmentList = CalculateInstallments(true); EntryFeesPercentage = pAckage.EntryFeesPercentage; }
public void Add(EventStock eventStock) { _list.AddRange(eventStock._list); SortEventsById(); }