public CreditContractRepayment(Loan contract, CreditContractOptions creditOptions, DateTime pDate, int pInstallmentNumber, User user, ApplicationSettings pGeneralSettings, NonWorkingDateSingleton pNonWorkingDate) { _generalSettings = pGeneralSettings; _nWds = pNonWorkingDate; _date = pDate.Date; _installmentNumber = pInstallmentNumber; PaidIstallments = new List <Installment>(); _amountToRepayTotalyLoan = new CalculateMaximumAmountToRepayStrategy(creditOptions, contract.Copy(), user, _generalSettings, _nWds); _amountToRegradingLoan = new CalculateMaximumAmountToRegradingLoanStrategy(creditOptions, contract.Copy(), user, _generalSettings, _nWds); _amountToRepayInstallment = new CalculateAmountToRepaySpecifiedInstallmentStrategy(creditOptions, contract.Copy(), user, _generalSettings, _nWds); _calculateInstallments = new Repayment.RepayLateInstallments.CalculateInstallments(creditOptions, contract, user, _generalSettings, _nWds); _calculateRealInterestInstallments = new CalculateRealInterestInstallments(creditOptions, _amountToRepayTotalyLoan, contract, _generalSettings, _nWds); _feesForAnticipatedRepayment = new CalculateAnticipatedFeesStrategy(creditOptions, contract, _generalSettings); _repayNextInstallments = new RepayNextInstallmentsStrategy(contract, creditOptions, user, _generalSettings); _repaymentMethod = new RepaymentMethod(contract, creditOptions); _loan = contract; CalculateMaximumAmountAuthorizedToRepay(); CalculateAmountToRegradingLoan(); CalculateMaximumAmountForEscapedMember(); LoanOptions = creditOptions; }
public OCurrency CalculateMaximumAmountForEscapedMember(DateTime pDate) { Installment installment = null; OCurrency interests = 0; OCurrency commission = 0; OCurrency aTprComission = 0; Installment priorInstallment; bool calculated = false; Loan contract = _contract.Copy(); for (int i = 0; i < contract.NbOfInstallments; i++) { Installment getInstallment = contract.GetInstallment(i); if (!getInstallment.IsRepaid && getInstallment.ExpectedDate > pDate || (getInstallment.ExpectedDate == pDate && _contract.EscapedMember != null)) { if (installment == null) { installment = getInstallment; if (_generalSettings.AccountingProcesses == OAccountingProcesses.Accrual) { DateTime expectedDate; int daysInTheInstallment = contract.NumberOfDaysInTheInstallment(installment.Number, pDate); if (i == 0) { expectedDate = contract.StartDate; } else { priorInstallment = contract.GetInstallment(i - 1); expectedDate = priorInstallment.ExpectedDate; if (contract.GetLastRepaymentDate() > expectedDate) { expectedDate = contract.GetLastRepaymentDate(); daysInTheInstallment = (installment.ExpectedDate - expectedDate).Days; } } if (getInstallment.ExpectedDate == pDate && _contract.EscapedMember != null) { expectedDate = getInstallment.ExpectedDate; } int daySpan = (pDate - expectedDate).Days < 0 ? 0 : (pDate - expectedDate).Days; if (contract.EscapedMember != null) { //calculate new interes for the person of the group OCurrency amount = contract.Product.LoanType == OLoanTypes.Flat ? contract.Amount : contract.GetOlb(); if (daySpan != 0) { interests = (amount*contract.EscapedMember.LoanShareAmount/contract.Amount)*daySpan/ daysInTheInstallment*contract.InterestRate; } else { interests = (amount*contract.EscapedMember.LoanShareAmount/contract.Amount)* contract.InterestRate; } } else { interests = installment.InterestsRepayment * daySpan / daysInTheInstallment; } } else { interests = installment.InterestsRepayment == installment.PaidInterests ? installment.InterestsRepayment : (installment.ExpectedDate > pDate ? 0 : installment.InterestsRepayment); if (contract.EscapedMember != null) { interests = interests*contract.EscapedMember.LoanShareAmount/contract.Amount; } } } commission += new Repayment.RepayLateInstallments.CalculateInstallments(_cCo, contract, _user, _generalSettings, _nWDS). CalculateCommision(pDate, getInstallment.Number, OPaymentType.TotalPayment, 0, ref calculated); if (getInstallment.ExpectedDate == pDate && _contract.EscapedMember != null && _contract.Product.AnticipatedTotalRepaymentPenaltiesBase != OAnticipatedRepaymentPenaltiesBases.RemainingInterest) aTprComission = commission; if (getInstallment.ExpectedDate > pDate && _contract.EscapedMember != null && aTprComission > 0 && _contract.Product.AnticipatedTotalRepaymentPenaltiesBase != OAnticipatedRepaymentPenaltiesBases.RemainingInterest) commission = aTprComission; if (_cCo.ManualFeesAmount > 0) { commission = _cCo.ManualFeesAmount; } foreach (RepaymentEvent rPayment in _contract.Events.GetRepaymentEvents()) { if (rPayment.Date == pDate && installment.Number == rPayment.InstallmentNumber) { installment.FeesUnpaid = 0; } } } } if (contract.EscapedMember != null) { OCurrency amount = interests + commission + contract.GetOlb()*contract.EscapedMember.LoanShareAmount/contract.Amount; return _contract.UseCents ? Math.Round(amount.Value, 2, MidpointRounding.AwayFromZero) : Math.Round(amount.Value, 0, MidpointRounding.AwayFromZero); } return 0; }
public OCurrency CalculateMaximumAmountForEscapedMember(DateTime pDate) { Installment installment = null; OCurrency interests = 0; OCurrency commission = 0; OCurrency aTprComission = 0; Installment priorInstallment; bool calculated = false; Loan contract = _contract.Copy(); for (int i = 0; i < contract.NbOfInstallments; i++) { Installment getInstallment = contract.GetInstallment(i); if (!getInstallment.IsRepaid && getInstallment.ExpectedDate > pDate || (getInstallment.ExpectedDate == pDate && _contract.EscapedMember != null)) { if (installment == null) { installment = getInstallment; if (_generalSettings.AccountingProcesses == OAccountingProcesses.Accrual) { DateTime expectedDate; OCurrency daysInTheInstallment = installment.Number == 1 ? (installment.ExpectedDate - _contract.StartDate).Days : (installment.ExpectedDate - _contract.GetInstallment(installment.Number - 2).ExpectedDate) .Days; if (i == 0) { expectedDate = contract.StartDate; } else { priorInstallment = contract.GetInstallment(i - 1); expectedDate = priorInstallment.ExpectedDate; if (contract.GetLastRepaymentDate() > expectedDate) { if (installment.ExpectedDate > contract.GetLastRepaymentDate()) { expectedDate = contract.GetLastRepaymentDate(); } daysInTheInstallment = (installment.ExpectedDate - expectedDate).Days; } } if (getInstallment.ExpectedDate == pDate && _contract.EscapedMember != null) { expectedDate = getInstallment.ExpectedDate; } int daySpan = (pDate - expectedDate).Days < 0 ? 0 : (pDate - expectedDate).Days; if (contract.EscapedMember != null) { //calculate new interes for the person of the group OCurrency amount = contract.Product.LoanType == OLoanTypes.Flat ? contract.Amount : contract.GetOlb(); if (daySpan != 0) { interests = (amount * contract.EscapedMember.LoanShareAmount / contract.Amount) * daySpan / daysInTheInstallment * contract.InterestRate; } else { interests = (amount * contract.EscapedMember.LoanShareAmount / contract.Amount) * contract.InterestRate; } } else { interests = installment.InterestsRepayment * daySpan / daysInTheInstallment; } } else { interests = installment.InterestsRepayment == installment.PaidInterests ? installment.InterestsRepayment : (installment.ExpectedDate > pDate ? 0 : installment.InterestsRepayment); if (contract.EscapedMember != null) { interests = interests * contract.EscapedMember.LoanShareAmount / contract.Amount; } } } commission += new Repayment.RepayLateInstallments.CalculateInstallments(_cCo, contract, _user, _generalSettings, _nWds). CalculateCommision(pDate, getInstallment.Number, OPaymentType.TotalPayment, 0, ref calculated); if (getInstallment.ExpectedDate == pDate && _contract.EscapedMember != null && _contract.Product.AnticipatedTotalRepaymentPenaltiesBase != OAnticipatedRepaymentPenaltiesBases.RemainingInterest) { aTprComission = commission; } if (getInstallment.ExpectedDate > pDate && _contract.EscapedMember != null && aTprComission > 0 && _contract.Product.AnticipatedTotalRepaymentPenaltiesBase != OAnticipatedRepaymentPenaltiesBases.RemainingInterest) { commission = aTprComission; } if (_cCo.ManualFeesAmount > 0) { commission = _cCo.ManualFeesAmount; } foreach (RepaymentEvent rPayment in _contract.Events.GetRepaymentEvents()) { if (rPayment.Date == pDate && installment.Number == rPayment.InstallmentNumber) { installment.FeesUnpaid = 0; } } } } if (contract.EscapedMember != null) { OCurrency amount = interests + commission + contract.GetOlb() * contract.EscapedMember.LoanShareAmount / contract.Amount; return(_contract.UseCents ? Math.Round(amount.Value, 2, MidpointRounding.AwayFromZero) : Math.Round(amount.Value, 0, MidpointRounding.AwayFromZero)); } return(0); }