Esempio n. 1
0
        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);
        }