public RepaymentEvent CopyAsRepaymentEvent()
        {
            RepaymentEvent rPe;

            if (Code == "PBLR")
            {
                rPe = new BadLoanRepaymentEvent();
            }
            else if (Code == "PRWO")
            {
                rPe = new RepaymentOverWriteOffEvent();
            }
            else
            {
                rPe = new RepaymentEvent();
            }

            rPe.AccruedInterest    = this.AccruedInterest;
            rPe.Cancelable         = this.Cancelable;
            rPe.ClientType         = this.ClientType;
            rPe.Commissions        = this.Commissions;
            rPe.Date               = this.Date;
            rPe.InstallmentNumber  = this.InstallmentNumber;
            rPe.InterestPrepayment = this.InterestPrepayment;
            rPe.Interests          = this.Interests;
            rPe.PastDueDays        = this.PastDueDays;
            rPe.Penalties          = this.Penalties;
            rPe.Principal          = this.Principal;
            rPe.RepaymentType      = this.RepaymentType;

            return(rPe);
        }
Пример #2
0
        public RepaymentEvent CopyAsRepaymentEvent()
        {
            RepaymentEvent rPe;

            if (Code == "PRLR")
                rPe = new RescheduledLoanRepaymentEvent();
            else if (Code == "PBLR")
                rPe = new BadLoanRepaymentEvent();
            else if (Code == "PRWO")
                rPe = new RepaymentOverWriteOffEvent();
            else
                rPe = new RepaymentEvent();

            rPe.AccruedInterest = this.AccruedInterest;
            rPe.Cancelable = this.Cancelable;
            rPe.ClientType = this.ClientType;
            rPe.Commissions = this.Commissions;
            rPe.Date = this.Date;
            rPe.InstallmentNumber = this.InstallmentNumber;
            rPe.InterestPrepayment = this.InterestPrepayment;
            rPe.Interests = this.Interests;
            rPe.PastDueDays = this.PastDueDays;
            rPe.Penalties = this.Penalties;
            rPe.Principal = this.Principal;
            rPe.RepaymentType = this.RepaymentType;

            return rPe;
        }
Пример #3
0
 public PendingRepaymentEvent(RepaymentEvent pEvent)
 {
     if (pEvent is BadLoanRepaymentEvent)
         Code = "PBLR";
     else if (pEvent is RepaymentOverWriteOffEvent)
         Code = "PRWO";
     else
         Code = "PERE";
 }
Пример #4
0
 public void TestEventCopy()
 {
     RepaymentEvent rE = new RepaymentEvent{InstallmentNumber = 1,Principal = 100,Interests = 230,Commissions = 4,Penalties = 0,ClientType = OClientTypes.Group};
     RepaymentEvent rEFakeCopy = rE;
     RepaymentEvent rECopy = rE.Copy() as RepaymentEvent;
     rE.Principal = 3456;
     Assert.AreEqual(3456m,rEFakeCopy.Principal.Value);
     Assert.AreEqual(100m,rECopy.Principal.Value);
 }
 public PendingRepaymentEvent(RepaymentEvent pEvent)
 {
     if (pEvent is BadLoanRepaymentEvent)
     {
         Code = "PBLR";
     }
     else if (pEvent is RepaymentOverWriteOffEvent)
     {
         Code = "PRWO";
     }
     else
     {
         Code = "PERE";
     }
 }
Пример #6
0
        public void Add_RepaymentEvent()
        {
            EventManager eventManager = (EventManager)container["EventManager"];

            RepaymentEvent repaymentEvent = new RepaymentEvent
            {
                Id = 13,
                User = new User { Id = 1 },
                Date = new DateTime(2006, 7, 21),
                PastDueDays = 3,
                Principal = 1999,
                Interests = 2333,
                Commissions = 23,
                InstallmentNumber = 3,
                PaymentMethod = new PaymentMethod(1, "Cash", "", false)
            };
            using(SqlTransaction tran = eventManager.GetConnection().BeginTransaction())
                eventManager.AddLoanEvent(repaymentEvent, 1, tran);

            Assert.AreNotEqual(0, repaymentEvent.Id);
        }
Пример #7
0
        public List<SavingEvent> RepayLoanFromSaving(Loan loan,
                                                     RepaymentEvent repaymentEvent, 
                                                     ISavingsContract savingsContract, 
                                                     DateTime date, 
                                                     OCurrency amount, 
                                                     string description, 
                                                     SqlTransaction sqlTransaction)
        {
            if (savingsContract.GetBalance() - amount < 0)
                throw new OpenCbsSavingException(OpenCbsSavingExceptionEnum.WithdrawAmountIsInvalid);

            User user = User.CurrentUser;
            Teller teller = Teller.CurrentTeller;

            if (date.Hour == 0
                && date.Minute == 0
                && date.Second == 0)
            {
                date = new DateTime(date.Year, date.Month, date.Day, TimeProvider.Now.Hour, TimeProvider.Now.Minute,
                                    TimeProvider.Now.Second);
            }

            ISavingsContract savingSimulation = (ISavingsContract) savingsContract.Clone();
            savingSimulation.RepayLoanFromSaving(loan, repaymentEvent.Id, date, amount, description, user, teller);

            List<SavingEvent> events = savingsContract.RepayLoanFromSaving(loan, repaymentEvent.Id, date, amount,
                                                                           description, user, teller);
            foreach (SavingEvent savingEvent in events)
            {
                _ePS.FireEvent(savingEvent, savingsContract, sqlTransaction);
            }

            return events;
        }
Пример #8
0
        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,
                                                   PaymentMethod paymentMethod,
                                                   bool overridePenalty,
                                                   OCurrency manualPenalty,
                                                   OCurrency manualInterestEvent,
                                                   ref RepaymentEvent totalEvent)
        {
            RepaymentEvent rpEvent;
            totalEvent.Penalties = 0;
            totalEvent.Commissions = 0;
            EventStock listOfLoanEvents = new EventStock();

            #region Event identification
            //////////////////////////////////////////////////////////////////////////////////////////////////////////
            if (cCr.PaidIstallments.Count > 0)
            {
                List<Installment> lateInstallments = cCr.PaidIstallments.FindAll(i => i.CalculatedPenalty > 0);
                Installment lastLate = 0 == lateInstallments.Count ? null : lateInstallments.OrderBy(i => i.Number).Last();

                foreach (Installment paidInstallment in cCr.PaidIstallments)
                {
                    int number = paidInstallment.Number;
                    OCurrency rpeCapital = 0;
                    OCurrency rpeInterests = 0;
                    OCurrency rpeCommission = 0;
                    OCurrency rpePenalty = 0;
                    int overdueDays = (payDate.Date - paidInstallment.ExpectedDate).Days > 0
                                          ? (payDate.Date - paidInstallment.ExpectedDate).Days
                                          : 0;

                    foreach (RepaymentEvent rpe in Events.GetLoanRepaymentEvents())
                    {
                        if (rpe.InstallmentNumber == paidInstallment.Number && !rpe.Deleted)
                        {
                            if (rpe.RepaymentType != OPaymentType.PersonTotalPayment)
                            {
                                if ((rpe.RepaymentType != OPaymentType.PartialPayment)
                                    && (rpe.RepaymentType != OPaymentType.ProportionalPayment))
                                {
                                    rpeCapital += rpe.Principal;
                                    rpeInterests += rpe.Interests;
                                }

                                if (rpe.RepaymentType == OPaymentType.PartialPayment && paymentType == OPaymentType.TotalPayment)
                                {
                                    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 > paidInstallment.PaidCapital)
                        rpeCapital = 0;

                    if (rpeInterests < 0)
                        rpeInterests = 0;

                    if (rpeInterests > paidInstallment.InterestsRepayment)
                    {
                        rpeInterests = 0;
                    }

                    OCurrency principalAmount = paidInstallment.CapitalRepayment -
                                                (paidInstallment.CapitalRepayment - (paidInstallment.PaidCapital - rpeCapital));

                    OCurrency interestAmount = paidInstallment.InterestsRepayment -
                                               (paidInstallment.InterestsRepayment - (paidInstallment.PaidInterests - rpeInterests));

                    if (interestAmount < 0)
                        interestAmount = 0;

                    principalEvent -= principalAmount;
                    interestEvent -= interestAmount;

                    if (principalAmount == 0
                        && interestAmount == 0
                        && paidInstallment.PaidCapital == 0 && manualInterestEvent == 0)
                    {
                        principalAmount = principalEvent;
                        interestAmount = interestEvent;
                    }

                    if (interestAmount < 0)
                        interestAmount = 0;

                    OCurrency commissionAmount = paidInstallment.CommissionsUnpaid -
                                               (paidInstallment.CommissionsUnpaid - (paidInstallment.PaidCommissions - rpeCommission));

                    OCurrency penaltyAmount;
                    if (overridePenalty)
                    {
                        if (lastLate != null && paidInstallment.CalculatedPenalty <= manualPenalty && paidInstallment.Number < lastLate.Number)
                        {
                            penaltyAmount = paidInstallment.CalculatedPenalty;
                            manualPenalty -= penaltyAmount;
                        }
                        else
                        {
                            penaltyAmount = manualPenalty;
                            manualPenalty = 0m;
                        }
                    }
                    else
                    {
                        penaltyAmount = paidInstallment.FeesUnpaid -
                                                  (paidInstallment.FeesUnpaid - (paidInstallment.PaidFees - rpePenalty));
                    }

                    //just to be sure that we do not have negative in the base
                    penaltyAmount = penaltyAmount < 0 ? 0 : penaltyAmount;
                    commissionAmount = commissionAmount < 0 ? 0 : commissionAmount;

                    if (overridePenalty && penaltyAmount > 0)
                    {
                        penaltyAmount = (-1.0) * penaltyAmount;
                    }

                    rpEvent = CreateRepaymentEvent(number,
                                                       payDate,
                                                       penaltyAmount,
                                                       commissionAmount,
                                                       interestAmount,
                                                       interestAmount,
                                                       principalAmount,
                                                       overdueDays,
                                                       _clientType == OClientTypes.Group,
                                                       paymentType,
                                                       isPending);

                    if (overridePenalty && penaltyAmount < 0)
                        penaltyAmount = (-1.0)*penaltyAmount;
                    rpEvent.PaymentMethod = paymentMethod;
                    rpEvent.CalculatedPenalties = paidInstallment.CalculatedPenalty;
                    if (rpEvent.CalculatedPenalties > penaltyAmount)
                    {
                        if (overridePenalty)
                        {
                            rpEvent.WrittenOffPenalties = rpEvent.CalculatedPenalties - penaltyAmount;
                        }
                        else
                        {
                            rpEvent.UnpaidPenalties = rpEvent.CalculatedPenalties - penaltyAmount;
                        }
                    }
                    totalEvent.Penalties += rpEvent.Penalties;
                    totalEvent.Commissions += rpEvent.Commissions;

                    if (rpEvent.InterestPrepayment != 0
                        || rpEvent.Principal != 0
                        || rpEvent.Penalties != 0
                        || rpEvent.Commissions != 0)
                        listOfLoanEvents.Add(rpEvent);
                }
            }
            else
            {
                rpEvent = CreateRepaymentEvent(instNumber,
                                               payDate,
                                               penaltiesEvent,
                                               commissionsEvent,
                                               interestEvent,
                                               interestPrepayment,
                                               principalEvent,
                                               pastDueDays,
                                               _clientType == OClientTypes.Group,
                                               paymentType,
                                               isPending);
                rpEvent.PaymentMethod = paymentMethod;
                // Calculate penalties
                Installment installment = GetInstallment(instNumber - 1);
                rpEvent.CalculatedPenalties = installment.CalculatedPenalty;
                if (rpEvent.CalculatedPenalties > penaltiesEvent)
                {
                    if (overridePenalty)
                    {
                        rpEvent.WrittenOffPenalties = rpEvent.CalculatedPenalties - penaltiesEvent;
                    }
                    else
                    {
                        rpEvent.UnpaidPenalties = rpEvent.CalculatedPenalties - penaltiesEvent;
                    }
                }
                totalEvent.Penalties += rpEvent.Penalties;
                totalEvent.Commissions += rpEvent.Commissions;
                listOfLoanEvents.Add(rpEvent);
            }
            #endregion

            return listOfLoanEvents;
        }
Пример #9
0
 public void TestRepaymentEventCodeCorrectlyGeneratedWhenGoodLoan()
 {
     RepaymentEvent rPE = new RepaymentEvent();
     Assert.AreEqual("RGLE",rPE.Code);
 }
Пример #10
0
 private static void _AssertSpecifiedEvent(RepaymentEvent pEvent, OCurrency pFees, OCurrency pInterest, OCurrency pCapital)
 {
     Assert.AreEqual(pFees, pEvent.Fees.Value);
     Assert.AreEqual(pInterest, pEvent.Interests.Value);
     Assert.AreEqual(pCapital, pEvent.Principal.Value);
 }
Пример #11
0
        private void DoRepaymentFromSavings(Loan savedContract, RepaymentEvent repayEvent, OCurrency amount,
                                            SqlTransaction sqlTransaction)
        {
            if (savedContract.CompulsorySavings == null)
                throw new OpenCbsSavingException(OpenCbsSavingExceptionEnum.NoCompulsorySavings);

            string description = string.Format("Repayment for loan {0}", savedContract.Code);

            _savingServices.RepayLoanFromSaving(savedContract, repayEvent, savedContract.CompulsorySavings,
                                                repayEvent.Date, amount, description, sqlTransaction);
        }
Пример #12
0
        private void SetEvent(RepaymentEvent pEvent)
        {
            _repaymentEvent = pEvent;
            _lbICPrincipal.Text = string.Format("{0} {1}", pEvent.Principal.GetFormatedValue(_loan.UseCents), _loan.Product.Currency.Code);
            lbInterest.Text = string.Format("{0} {1}", pEvent.Interests.GetFormatedValue(_loan.UseCents), _loan.Product.Currency.Code);
            _lbICFees.Text = string.Format("{0} {1}", pEvent.Penalties.GetFormatedValue(_loan.UseCents), _loan.Product.Currency.Code);
            _lbICCommisions.Text = string.Format("{0} {1}", pEvent.Commissions.GetFormatedValue(_loan.UseCents), _loan.Product.Currency.Code);

             if (_client is Group)
            {
                buttonSelectAGroupPerson.Visible = _client is Group;
                bool activeButton = false;

                foreach (Installment installment in _loan.InstallmentList)
                {
                    if (!installment.IsRepaid && installment.ExpectedDate >= pEvent.Date)
                        activeButton = true;
                }

                buttonSelectAGroupPerson.Visible = pEvent.Penalties > 0 || !activeButton ? false : true;
            }

            bool visible = ServicesProvider.GetInstance().GetCurrencyServices().FindAllCurrencies().Count > 1 &&
                           !_loan.Product.Currency.IsPivot && _exchangeRate != null;
            _lbECPrincipal.Text = visible
                                             ? string.Format("{0} {1}",(pEvent.Principal/ _exchangeRate.Rate).GetFormatedValue(_loan.UseCents),
                                                             ServicesProvider.GetInstance().GetCurrencyServices().GetPivot().Code)
                                             : string.Empty;

            lbCInterest.Text = visible
                                           ? string.Format("{0} {1}", (pEvent.Interests / _exchangeRate.Rate).GetFormatedValue(_loan.UseCents),
                                                            ServicesProvider.GetInstance().GetCurrencyServices().GetPivot().Code)
                                           : string.Empty;

            _lbECFees.Text = visible
                                        ? string.Format("{0} {1}", (pEvent.Penalties / _exchangeRate.Rate).GetFormatedValue(_loan.UseCents),
                                                            ServicesProvider.GetInstance().GetCurrencyServices().GetPivot().Code)
                                        : string.Empty;

            _lbECCommissions.Text = visible
                                        ? string.Format("{0} {1}", (pEvent.Commissions / _exchangeRate.Rate).GetFormatedValue(_loan.UseCents),
                                                            ServicesProvider.GetInstance().GetCurrencyServices().GetPivot().Code)
                                        : string.Empty;
        }
Пример #13
0
        public void AddLoanEvent(RepaymentEvent evnt, int contractId, SqlTransaction sqlTransac)
        {
            const string q = @"INSERT INTO [RepaymentEvents]
                                       ([id],
                                        [past_due_days],
                                        [principal],
                                        [interests],
                                        [installment_number],
                                        [commissions],
                                        [penalties],
                                        [payment_method_id],
                                        [calculated_penalties],
                                        [written_off_penalties],
                                        [unpaid_penalties])
                                     VALUES
                                       (@id,
                                        @pastDueDays,
                                        @principal,
                                        @interests,
                                        @installmentNumber,
                                        @commissions,
                                        @penalties,
                                        @payment_method_id,
                                        @calculated_penalties,
                                        @written_off_penalties,
                                        @unpaid_penalties)
                                     ";

            using (OpenCbsCommand c = new OpenCbsCommand(q, sqlTransac.Connection, sqlTransac))
            {
                SetLoanRepaymentEvent(evnt, c);
                c.ExecuteNonQuery();
            }
        }
Пример #14
0
 private static void SetLoanRepaymentEvent(RepaymentEvent evnt, OpenCbsCommand c)
 {
     c.AddParam("@id", evnt.Id);
     c.AddParam("@pastDueDays", evnt.PastDueDays);
     c.AddParam("@principal", evnt.Principal);
     c.AddParam("@interests", evnt.Interests);
     c.AddParam("@commissions", evnt.Commissions);
     c.AddParam("@penalties", evnt.Penalties);
     c.AddParam("@installmentNumber", evnt.InstallmentNumber);
     c.AddParam("@payment_method_id", evnt.PaymentMethod.Id);
     c.AddParam("@calculated_penalties", evnt.CalculatedPenalties);
     c.AddParam("@written_off_penalties", evnt.WrittenOffPenalties);
     c.AddParam("@unpaid_penalties", evnt.UnpaidPenalties);
 }
Пример #15
0
 public void TestRepaymentEventPrincipal()
 {
     RepaymentEvent rPE = new RepaymentEvent();
     rPE.Principal = 100.43m;
     Assert.AreEqual(100.43m,rPE.Principal.Value);
 }
Пример #16
0
 public void TestRepaymentEventInterests()
 {
     RepaymentEvent rPE = new RepaymentEvent();
     rPE.Interests = 50.32m;
     Assert.AreEqual(50.32m,rPE.Interests.Value);
 }
Пример #17
0
 public void TestRepaymentEventInstallmentNumber()
 {
     RepaymentEvent rPE = new RepaymentEvent();
     rPE.InstallmentNumber = 3;
     Assert.AreEqual(3,rPE.InstallmentNumber);
 }
Пример #18
0
 public void TestRepaymentEventFees()
 {
     RepaymentEvent rPE = new RepaymentEvent();
     rPE.Commissions = 20.53m;
     Assert.AreEqual(20.53m,rPE.Fees.Value);
 }
Пример #19
0
        public void Select_Added_RepaymentEvent()
        {
            EventManager eventManager = (EventManager)container["EventManager"];

            RepaymentEvent repaymentEvent = new RepaymentEvent
                                     {
                                         Id = 130,
                                         Code = "RGLE",
                                         User = new User {Id = 1},
                                         Date = new DateTime(2006, 7, 21),
                                         PastDueDays =  3,
                                         Principal = 1999,
                                         Interests = 2333,
                                         Commissions = 23,
                                         InstallmentNumber = 3,
                                         PaymentMethod = new PaymentMethod(1, "Cash", "", false)
                                     };
            using (SqlTransaction tran = eventManager.GetConnection().BeginTransaction())
            eventManager.AddLoanEvent(repaymentEvent, 1, tran);

            EventStock eventStock = eventManager.SelectEvents(2);
            foreach (Event e in eventStock.GetEvents())
            {
                if (e is RepaymentEvent)
                    _AssertRepaymentEvent(e as RepaymentEvent, "RGLE", new DateTime(2006, 7, 21), 3, 1999, 2333, 23, 3);
            }
        }
Пример #20
0
 private static void _AssertRepaymentEvent(RepaymentEvent pEvent, string pCode, DateTime pDate, int pPastDueDays, OCurrency pPrincipal,
                                                  OCurrency pInterest, OCurrency pFees, int pInstallmentNumber)
 {
     Assert.AreEqual(pCode, pEvent.Code);
     Assert.AreEqual(pDate, pEvent.Date);
     Assert.AreEqual(pPastDueDays, pEvent.PastDueDays);
     Assert.AreEqual(pPrincipal.Value, pEvent.Principal.Value);
     Assert.AreEqual(pInterest.Value, pEvent.Interests.Value);
     Assert.AreEqual(pFees.Value, pEvent.Fees.Value);
     Assert.AreEqual(pInstallmentNumber, pEvent.InstallmentNumber);
 }
Пример #21
0
        private RepaymentEvent GetRepaymentEvent(OpenCbsReader r)
        {
            RepaymentEvent e = new RepaymentEvent {Id = r.GetInt("rpe_id")};
            switch (r.GetString("event_type"))
            {
                case "RBLE":
                    {
                        e = new BadLoanRepaymentEvent {Id = r.GetInt("rpe_id")};
                        break;
                    }
                case "RRLE":
                    {
                        e = new RescheduledLoanRepaymentEvent {Id = r.GetInt("rpe_id")};
                        break;
                    }
                case "ROWO":
                    {
                        e = new RepaymentOverWriteOffEvent { Id = r.GetInt("rpe_id") };
                        break;
                    }
                case "PRLR":
                    {
                        e = new PendingRepaymentEvent(r.GetString("event_type"))
                                {Id = r.GetInt("rpe_id")};
                        break;
                    }
                case "PBLR":
                    {
                        e = new PendingRepaymentEvent(r.GetString("event_type"))
                                {Id = r.GetInt("rpe_id")};
                        break;
                    }
                case "PRWO":
                    {
                        e = new PendingRepaymentEvent(r.GetString("event_type"))
                                {Id = r.GetInt("rpe_id")};
                        break;
                    }
                case "PERE":
                    {
                        e = new PendingRepaymentEvent(r.GetString("event_type"))
                                {Id = r.GetInt("rpe_id")};
                        break;
                    }
            }

            e.Principal = r.GetMoney("rpe_principal");
            e.Interests = r.GetMoney("rpe_interests");
            e.Penalties = r.GetMoney("rpe_penalties");
            e.Commissions = r.GetMoney("rpe_commissions");
            e.PastDueDays = r.GetInt("rpe_past_due_days");
            e.InstallmentNumber = r.GetInt("rpe_installment_number");
            e.PaymentMethodId = r.GetNullInt("rpe_pm");
            e.PaymentMethod = e.PaymentMethodId == null ? null :
                _paymentMethodManager.SelectPaymentMethodById(e.PaymentMethodId.Value);

            e.CalculatedPenalties = r.GetMoney("rpe_calculated_penalties");
            e.WrittenOffPenalties = r.GetMoney("rpe_written_off_penalties");
            e.UnpaidPenalties = r.GetMoney("rpe_unpaid_penalties");

            e.Code = r.GetString("event_type");

            if (e.Code != "RBLE")
                e.RepaymentType = OPaymentType.StandardPayment;

            // set type of payment
            switch (r.GetString("event_type").Trim())
            {
                case "ATR":
                    {
                        e.RepaymentType = OPaymentType.TotalPayment;
                        break;
                    }
                case "APR":
                    {
                        e.RepaymentType = OPaymentType.PartialPayment;
                        break;
                    }
                case "APTR":
                    {
                        e.RepaymentType = OPaymentType.PersonTotalPayment;
                        break;
                    }
            }

            return e;
        }
Пример #22
0
        private void SetRepaymentExplanation(RepaymentEvent pEvent)
        {
            _penaltiesExplanation = string.Empty;
            if (pEvent.PastDueDays != 0)
            {
                var strPenaltiesCalculation = new StringBuilder();
                var strPenalties = new StringBuilder();
                string pastDueDays = pEvent.PastDueDays.ToString();

                if (ServicesProvider.GetInstance().GetGeneralSettings().LateDaysAfterAccrualCeases < pEvent.PastDueDays)
                {
                    pastDueDays = ServicesProvider.GetInstance().GetGeneralSettings().LateDaysAfterAccrualCeases.ToString();
                }

                if (_loan.NonRepaymentPenalties.OverDuePrincipal != 0)
                {
                    strPenalties.AppendFormat("{0} = ", MultiLanguageStrings.GetString(Ressource.CreditContractRepayForm, "Penalty.Text"));
                    strPenalties.AppendFormat("{0} * ", MultiLanguageStrings.GetString(Ressource.CreditContractRepayForm, "amount.Text"));
                    strPenalties.AppendFormat(" % {0} * ", MultiLanguageStrings.GetString(Ressource.CreditContractRepayForm,
                                                                                    "OverDuePrincipall.Text"));
                    strPenalties.AppendFormat("{0}\n", MultiLanguageStrings.GetString(Ressource.CreditContractRepayForm, "Latedays.Text"));

                    strPenaltiesCalculation.AppendFormat("{0} = {1} * {2} * {3}", pEvent.Penalties.GetFormatedValue(_loan.UseCents),
                                pEvent.Principal.GetFormatedValue(_loan.UseCents), _loan.NonRepaymentPenalties.OverDuePrincipal, pastDueDays);
                }

                if (_loan.NonRepaymentPenalties.OverDueInterest != 0)
                {
                    if (strPenalties.Length == 0)
                    {
                        strPenalties.AppendFormat("{0} = ", MultiLanguageStrings.GetString(Ressource.CreditContractRepayForm,"Penalty.Text"));
                        strPenaltiesCalculation.Append(pEvent.Penalties.GetFormatedValue(_loan.UseCents) + " = ");
                    }
                    else
                        strPenaltiesCalculation.Append(" + ");

                    strPenalties.Append(" + ");
                    strPenalties.AppendFormat("{0} * ", MultiLanguageStrings.GetString(Ressource.CreditContractRepayForm, "amount.Text"));
                    strPenalties.AppendFormat(" % {0} * ", MultiLanguageStrings.GetString(Ressource.CreditContractRepayForm,
                                                                                    "OverDueInterest.Text"));
                    strPenalties.AppendFormat("{0}\n", MultiLanguageStrings.GetString(Ressource.CreditContractRepayForm, "Latedays.Text"));
                    strPenaltiesCalculation.AppendFormat("{0} * {1} * {2}", pEvent.Principal.GetFormatedValue(_loan.UseCents),
                                        _loan.NonRepaymentPenalties.OverDueInterest, pastDueDays);
                }

                if (_loan.NonRepaymentPenalties.OLB != 0)
                {
                    if (strPenalties.Length == 0)
                    {
                        strPenalties.AppendFormat("{0} = ", MultiLanguageStrings.GetString(Ressource.CreditContractRepayForm,"Penalty.Text"));
                        strPenaltiesCalculation.AppendFormat("{0} = ", pEvent.Penalties.GetFormatedValue(_loan.UseCents));
                    }
                    else
                        strPenaltiesCalculation.Append(" + ");

                    strPenalties.Append(" + ");
                    strPenalties.AppendFormat("{0} * ", MultiLanguageStrings.GetString(Ressource.CreditContractRepayForm, "amount.Text"));
                    strPenalties.Append(" % OLB * ");
                    strPenalties.AppendFormat("{0}\n", MultiLanguageStrings.GetString(Ressource.CreditContractRepayForm, "Latedays.Text"));
                    strPenaltiesCalculation.AppendFormat("{0} * {1} * {2}", pEvent.Principal.GetFormatedValue(_loan.UseCents),
                                            _loan.NonRepaymentPenalties.OLB, pastDueDays);
                }

                if (_loan.NonRepaymentPenalties.InitialAmount != 0)
                {
                    if (strPenalties.Length == 0)
                    {
                        strPenalties.AppendFormat("{0} = ", MultiLanguageStrings.GetString(Ressource.CreditContractRepayForm,"Penalty.Text"));
                        strPenaltiesCalculation.AppendFormat("{0} = ", pEvent.Penalties.GetFormatedValue(_loan.UseCents));
                    }
                    else
                        strPenaltiesCalculation.Append(" + ");

                    strPenalties.Append(" + ");
                    strPenalties.AppendFormat("{0} * ", MultiLanguageStrings.GetString(Ressource.CreditContractRepayForm, "amount.Text"));
                    strPenalties.AppendFormat(" % {0} * ", MultiLanguageStrings.GetString(Ressource.CreditContractRepayForm,
                                                                                    "InitialAmount.Text"));
                    strPenalties.AppendFormat("{0}\n", MultiLanguageStrings.GetString(Ressource.CreditContractRepayForm, "Latedays.Text"));
                    strPenaltiesCalculation.AppendFormat("{0} * {1} * {2}", pEvent.Principal.GetFormatedValue(_loan.UseCents),
                                            _loan.NonRepaymentPenalties.InitialAmount, pastDueDays);
                }

                strPenalties.AppendLine("\n");
                strPenalties.AppendLine(strPenaltiesCalculation.ToString());
                _penaltiesExplanation = strPenalties.ToString();
            }
        }
Пример #23
0
 public RepaymentEvent GetNotDeletedRepaymentEvent()
 {
     RepaymentEvent repaymentEvent = new RepaymentEvent();
     List<RepaymentEvent> evnts = Events.GetRepaymentEvents();
     foreach (RepaymentEvent evnt in evnts)
     {
         if (evnt.Deleted) continue;
         if (evnt.Date.Date > repaymentEvent.Date)
             repaymentEvent = evnt;
     }
     return repaymentEvent;
 }
Пример #24
0
        public void TestMethodeCopyCredit()
        {
            LoanProduct package = new LoanProduct
                                      {
                                          InstallmentType = new InstallmentType(1, "Monthly", 0, 1),
                                          LoanType = OLoanTypes.DecliningFixedInstallments,
                                          ChargeInterestWithinGracePeriod = true,
                                          Currency = new Currency { Id = 1 }
                                      };
            package.KeepExpectedInstallment = false;
            Loan contractSource = new Loan(package,1500,0.03m,9,1,new DateTime(2006,1,2),
                new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""),
                ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User()));
            RepaymentEvent rE1 = new RepaymentEvent
                                     {
                                         Id = 1,
                                         InstallmentNumber = 1,
                                         Principal = 200,
                                         Interests = 100,
                                         Commissions = 0,
                                         Penalties = 0,
                                         ClientType = OClientTypes.Group
                                     };
            LoanDisbursmentEvent lDE = new LoanDisbursmentEvent{Id = 2,Date = DateTime.Today,Amount = 100, ClientType = OClientTypes.Group};

            contractSource.Code = "HHHHJKLLJJBNBJJ";
            contractSource.AnticipatedTotalRepaymentPenalties = 0.02;
            contractSource.Events.Add(rE1);
            contractSource.Events.Add(lDE);

            Loan contractDestination = contractSource.Copy();

            Assert.AreEqual(contractSource.Amount.Value, contractDestination.Amount.Value);
            Assert.AreEqual(contractSource.AnticipatedTotalRepaymentPenalties,contractDestination.AnticipatedTotalRepaymentPenalties);
            Assert.AreEqual(contractSource.Code,contractDestination.Code);
            Assert.AreEqual(contractSource.ClientType,contractDestination.ClientType);
            Assert.AreEqual(contractSource.InstallmentList.Count,contractDestination.InstallmentList.Count);
            Assert.AreEqual(contractSource.InstallmentList[0].Number,contractDestination.InstallmentList[0].Number);
            Assert.AreEqual(contractSource.InstallmentList[1].Number,contractDestination.InstallmentList[1].Number);

            //            ((LoanDisbursmentEvent)contractSource.Events.GetEvent(1)).Commission = 22;
            //            Assert.IsTrue(((LoanDisbursmentEvent)contractDestination.Events.GetEvent(1)).Commission == 0);
            //            Assert.IsFalse(((LoanDisbursmentEvent)contractDestination.Events.GetEvent(1)).Commission == 22);

            contractSource.InstallmentList[0].Number = 4;
            Assert.IsFalse(contractDestination.InstallmentList[0].Number == 4);
            Assert.IsTrue(contractDestination.InstallmentList[0].Number == 1);
        }
Пример #25
0
        /// <summary>
        /// Test if the client has repaid the total principal, interests and penalties owed at date D
        /// </summary>
        /// <param name="rPe"></param>
        /// <param name="date"></param>
        /// <returns></returns>
        public bool _IsBadLoan(RepaymentEvent rPe, DateTime date)
        {
            if (rPe is BadLoanRepaymentEvent)
            {
                ((BadLoanRepaymentEvent) rPe).OLB = CalculateActualOlb();

                if (AmountComparer.Equals(0, CalculateRemainingInterests(date)) &&
                    AmountComparer.Equals(0, CalculateActualOlb(date)))
                {
                    ((BadLoanRepaymentEvent) rPe).AccruedProvision += 0;
                    return false;
                }
                return true;
            }
            return false;
        }
Пример #26
0
        private void LoanRepaymentOrigination(RepaymentEvent repaymentEvent, Loan loanContract, SqlTransaction sqlTransac)
        {
            int parentId = -1;
            foreach (RepaymentEvent loanEvent in loanContract.Events.GetLoanRepaymentEvents())
            {
                if (loanEvent.IsFired) continue;

                loanEvent.User = repaymentEvent.User;
                loanEvent.TellerId = repaymentEvent.TellerId;
                loanEvent.IsFired = true;

                if (parentId > 0)
                    loanEvent.ParentId = parentId;

                loanEvent.Id = _eventManagement.AddLoanEventHead(loanEvent, loanContract.Id, sqlTransac);

                if (parentId < 0)
                {
                    parentId = loanEvent.Id;
                    repaymentEvent.Id = parentId;
                }

                _eventManagement.AddLoanEvent(loanEvent, loanContract.Id, sqlTransac);
            }
        }
Пример #27
0
        private static OCurrency GetValue(RepaymentEvent eventItem, ContractAccountingRule rule)
        {
            OCurrency amount = 0;

            if (rule.EventAttribute.Name.ToLower() == "principal")
            {
                amount = eventItem.Principal;
            }

            if (rule.EventAttribute.Name.ToLower() == "interests")
            {
                amount = eventItem.Interests;
            }

            if (rule.EventAttribute.Name.ToLower() == "penalties")
            {
                amount = eventItem.Penalties;
            }

            if (rule.EventAttribute.Name.ToLower() == "commissions")
            {
                amount = eventItem.Commissions;
            }
            return amount;
        }