示例#1
0
        public void Reschedule_Annuity_ChangeInterestRate_PartiallyPaid_Overpaid()
        {
            Loan loan = _GetLoan(_GetAnnuityProduct_RoundingTypeBegin(), 10000, 0.04m, 6, new DateTime(2010, 1, 15));
            loan.Repay(1, new DateTime(2010, 2, 12), 1906, false, true);
            loan.Repay(2, new DateTime(2010, 3, 12), 1908, false, true);
            PaymentMethod paymentMethod = new PaymentMethod(1, "Cash", "", false);
            loan.Repay(3, new DateTime(2010, 4, 5), 1500, false, 0, 0, true, 200, true, false, false, paymentMethod);
            Assert.AreEqual(loan.GetInstallment(0).IsRepaid, true);
            Assert.AreEqual(loan.GetInstallment(1).IsRepaid, true);
            Assert.AreEqual(loan.GetInstallment(2).IsPartiallyRepaid, true);

            ReschedulingOptions ro = new ReschedulingOptions
            {
                InterestRate = 0.03m,
                NewInstallments = 0,
                RepaymentDateOffset = 0,
                ChargeInterestDuringShift = true
            };
            loan.Reschedule(ro);

            _AssertInstallment(loan, 2, "2010-04-15", 169, 2643, 6926, 1300, 169);
            _AssertInstallment(loan, 3, "2010-05-17", 128, 1386, 4283, 0, 31);
            _AssertInstallment(loan, 4, "2010-06-15", 87, 1427, 2897, 0, 0);
            _AssertInstallment(loan, 5, "2010-07-15", 44, 1470, 1470, 0, 0);
        }
示例#2
0
        public void DeletePaymentMethodFromBranach(PaymentMethod paymentMethod)
        {
            const string q =
                @"UPDATE LinkBranchesPaymentMethods SET deleted = 1
                                     WHERE id = @link_id";

            using (SqlConnection conn = GetConnection())
            using (OpenCbsCommand c = new OpenCbsCommand(q, conn))
            {
                c.AddParam("@link_id", paymentMethod.LinkId);
                c.ExecuteNonQuery();
            }
        }
示例#3
0
 public void AddPaymentMethodToBranch(PaymentMethod paymentMethod)
 {
     const string q =
         @"INSERT INTO LinkBranchesPaymentMethods (branch_id, payment_method_id, account_id)
                                     VALUES (@branch_id, @payment_method_id, @account_id)";
     using (SqlConnection conn = GetConnection())
     using (OpenCbsCommand c = new OpenCbsCommand(q, conn))
     {
         c.AddParam("@branch_id", paymentMethod.Branch.Id);
         c.AddParam("@payment_method_id", paymentMethod.Id);
         c.AddParam("@account_id", paymentMethod.Account.Id);
         c.ExecuteNonQuery();
     }
 }
示例#4
0
        private void Initialize(PaymentMethod paymentMethod)
        {
            _isNew = paymentMethod == null;
            _paymentMethod = paymentMethod;

            List<PaymentMethod> methods = ServicesProvider.GetInstance().GetPaymentMethodServices().GetAllPaymentMethods();
            cmbPaymentMethod.Items.Clear();
            cmbPaymentMethod.ValueMember = "Id";
            cmbPaymentMethod.DisplayMember = "Name";
            cmbPaymentMethod.DataSource = methods;
            if (_paymentMethod != null && _paymentMethod.Name != null)
                cmbPaymentMethod.SelectedValue = _paymentMethod.Id;
            
            cmbAccount.Items.Clear();
            cmbAccount.ValueMember = "Number";
            cmbAccount.DisplayMember = "";
            cmbAccount.DataSource = ServicesProvider.GetInstance().GetChartOfAccountsServices().FindAllAccounts().OrderBy(item => item.Number).ToList();
            if (_paymentMethod != null && _paymentMethod.Account != null)
               cmbAccount.SelectedValue = _paymentMethod.Account.Number;
        }
示例#5
0
        public void AddLoanDisbursmentEvent()
        {
            EventManager eventManager = (EventManager)container["EventManager"];

            LoanDisbursmentEvent loanDisbursmentEvent = new LoanDisbursmentEvent
                                            {
                                                Id = 10,
                                                User = new User { Id = 1 },
                                                Date = new DateTime(2006, 7, 21),
                                                Amount = 100,
                                            };
            loanDisbursmentEvent.Commissions = new List<LoanEntryFeeEvent>();
            LoanEntryFeeEvent commission = new LoanEntryFeeEvent();
            commission.Fee = 10;
            loanDisbursmentEvent.Commissions.Add(commission);

            PaymentMethod method = new PaymentMethod(1, "Savings", "Savings method", false);
            loanDisbursmentEvent.PaymentMethod = method;

            eventManager.AddLoanEvent(loanDisbursmentEvent, 1);
            Assert.AreNotEqual(0, loanDisbursmentEvent.Id);
        }
示例#6
0
        public override List<SavingEvent> Withdraw(OCurrency pAmount, DateTime pDate, string pDescription, User pUser, bool pIsDesactivateFees, Teller teller, PaymentMethod paymentMethod)
        {
            List<SavingEvent> events = new List<SavingEvent>();

            int? tellerId = null;
            if (teller != null && teller.Id != 0) tellerId = teller.Id;

            SavingWithdrawEvent withdrawEvent = new SavingWithdrawEvent
            {
                Amount = pAmount,
                Date = pDate,
                Description = pDescription,
                User = pUser,
                Cancelable = true,
                Fee = 0m,
                TellerId = tellerId,
                ProductType = typeof(SavingsBookProduct),
                SavingsMethod = OSavingsMethods.Cash
            };
            Events.Add(withdrawEvent);
            events.Add(withdrawEvent);

            if (Status != OSavingsStatus.Closed && !pIsDesactivateFees)
               withdrawEvent.Fee = Product.WithdrawFeesType == OSavingsFeesType.Flat ? FlatWithdrawFees : pAmount * RateWithdrawFees.Value;

            return events;
        }
示例#7
0
        public override List<SavingEvent> Deposit(OCurrency pAmount, DateTime pDate, string pDescription, User pUser,
                bool pIsDesactivateFees, bool isPending, OSavingsMethods savingsMethod, PaymentMethod paymentMethod, int? pendingEventId, Teller teller)
        {
            List<SavingEvent> events = new List<SavingEvent>();

            int? tellerId = null;
            if (teller != null && teller.Id != 0) tellerId = teller.Id;

            SavingEvent savingEvent;

            if (isPending)
            {
                savingEvent = new SavingPendingDepositEvent();
            }
            else
            {
                savingEvent = new SavingDepositEvent();
            }

            savingEvent.Amount = pAmount;
            savingEvent.Date = pDate;
            savingEvent.Description = pDescription;
            savingEvent.User = pUser;
            savingEvent.Cancelable = true;
            savingEvent.IsPending = isPending;
            savingEvent.SavingsMethod = savingsMethod;
            savingEvent.PaymentsMethod = paymentMethod;
            savingEvent.PendingEventId = pendingEventId;
            savingEvent.TellerId = tellerId;
            savingEvent.ProductType = typeof(SavingsBookProduct);

            Events.Add(savingEvent);
            events.Add(savingEvent);

            if (Status != OSavingsStatus.Closed && !pIsDesactivateFees)
                savingEvent.Fee = savingsMethod == OSavingsMethods.Cheque ? ChequeDepositFees : DepositFees;

            return events;
        }
示例#8
0
        public bool SetInstallmentAsPending(Installment installment, PaymentMethod pPaymentMethod)
        {
            ClientServices clientServices = new ClientServices(_user);
            LoanServices loanServices = new LoanServices(_user);

            var client = clientServices.FindTiers(installment.ClientId, OpenCBS.Enums.OClientTypes.Person);
            var loan = loanServices.SelectLoan(installment.ContractId, true, true, true);

            loanServices.Repay(loan, client, installment.InstallmentNumber, installment.InstallmentDate, installment.InstallmentAmount,
                false, 0, 0, false, 0, true, false, pPaymentMethod, "", true);

            return true;
        }
        public void RepayLoanBeforeDisburse()
        {
            ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.ALLOWSMULTIPLELOANS, false);
            ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.INCREMENTALDURINGDAYOFF, false);
            ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.ACCOUNTINGPROCESS, OAccountingProcesses.Cash);
            ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.CALCULATIONLATEFEESDURINGPUBLICHOLIDAYS, 0);
            ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.INTERESTS_ALSO_CREDITED_IN_FL, 1);
            ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.DONOTSKIPWEEKENDSININSTALLMENTSDATE, 0);
            ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.BAD_LOAN_DAYS, "180");
            ProvisionTable _provisionningTable = ProvisionTable.GetInstance(new User() { Id = 1 });
            _provisionningTable.ProvisioningRates = new List<ProvisioningRate>();
            _provisionningTable.Add(new ProvisioningRate { Number = 1, NbOfDaysMin = 0, NbOfDaysMax = 0, ProvisioningValue = 0.02, ProvisioningInterest = 0.02, ProvisioningPenalty = 0.02 });
            _provisionningTable.Add(new ProvisioningRate { Number = 2, NbOfDaysMin = 1, NbOfDaysMax = 30, ProvisioningValue = 0.1, ProvisioningInterest = 0.1, ProvisioningPenalty = 0.1 });
            _provisionningTable.Add(new ProvisioningRate { Number = 3, NbOfDaysMin = 31, NbOfDaysMax = 60, ProvisioningValue = 0.25, ProvisioningInterest = 0.25, ProvisioningPenalty = 0.25 });
            _provisionningTable.Add(new ProvisioningRate { Number = 4, NbOfDaysMin = 61, NbOfDaysMax = 90, ProvisioningValue = 0.5, ProvisioningInterest= 0.5, ProvisioningPenalty= 0.5 });
            _provisionningTable.Add(new ProvisioningRate { Number = 5, NbOfDaysMin = 91, NbOfDaysMax = 180, ProvisioningValue = 0.75, ProvisioningInterest = 0.75, ProvisioningPenalty = 0.75 });
            _provisionningTable.Add(new ProvisioningRate { Number = 6, NbOfDaysMin = 181, NbOfDaysMax = 365, ProvisioningValue = 1, ProvisioningInterest = 1, ProvisioningPenalty= 1 });
            _provisionningTable.Add(new ProvisioningRate { Number = 7, NbOfDaysMin = 366, NbOfDaysMax = 99999, ProvisioningValue = 1, ProvisioningInterest= 1, ProvisioningPenalty= 1 });

            Teller.CurrentTeller = null;

             AddDataForTestingTransaction dataHelper = new AddDataForTestingTransaction();
            int _creditId = dataHelper.AddGenericCreditContractIntoDatabase();

            IClient _client = new Group { Id = 5 };
            LoanManager _loanManager = new LoanManager(new User() { Id = 1 });
            Loan _loan = _loanManager.SelectLoan(_creditId, true, true, true);

            _loan.CreditCommiteeDate = _loan.StartDate;

            FundingLine f = _loan.FundingLine;
            f.Currency.Id = _loan.Product.Currency.Id;
            FundingLineServices fundingLineServices = new FundingLineServices(new User() { Id = 1 });

            var ev = new FundingLineEvent
            {
                Code = "KAO",
                Type = OFundingLineEventTypes.Entry,
                CreationDate = new DateTime(2008, 1, 10),
                EndDate = DateTime.Now.AddDays(1),
                Amount = 1000,
                FundingLine = f,
                Movement = OBookingDirections.Credit,
                IsDeleted = false
            };
            fundingLineServices.AddFundingLineEvent(ev, null);
            f.AddEvent(ev);
            LoanServices loanServices = new LoanServices(new User() { Id = 1 });

            PaymentMethod method = new PaymentMethod(1, "Savings", "Savings method", false);

            _loan = loanServices.Disburse(_loan, new DateTime(2005, 10, 10), true, false, method);

            Assert.AreEqual(_loan.Disbursed, true);
            PaymentMethod paymentMethod = new PaymentMethod(1, "Cash", "", false);
            loanServices.Repay(_loan, _client, 1, new DateTime(2005, 1, 5), 100, true, 0, 0, false, 5, false, false, paymentMethod, null, false);
        }
示例#10
0
 private PaymentMethod GetPaymentMethodFromReader(OpenCbsReader r)
 {
     //Do not change this calling of constructor by Object initializer
     PaymentMethod pm = new PaymentMethod(
                                             r.GetInt("id"),
                                             r.GetString("name"),
                                             r.GetString("description"),
                                             r.GetBool("pending")
                                         );
     pm.Account = _accountManager.Select(r.GetInt("account_id"));
     return pm;
 }
示例#11
0
        public List<PaymentMethod> SelectPaymentMethodOfBranch(int branchId)
        {
            string q = @"SELECT [lbpm].[payment_method_id],
                                [lbpm].[id],
                                [pm].[name],
                                [pm].[description],
                                [pm].[pending],
                                [lbpm].[branch_id],
                                [lbpm].[date],
                                [lbpm].[account_id]
                         FROM PaymentMethods pm
                         INNER JOIN LinkBranchesPaymentMethods lbpm ON lbpm.payment_method_id = pm.id
                         WHERE [lbpm].[branch_id] = @id AND [lbpm].[deleted] = 0";

            List<PaymentMethod> paymentMethods = new List<PaymentMethod>();

            using (SqlConnection conn = GetConnection())
            using (OpenCbsCommand c = new OpenCbsCommand(q, conn))
            {
                c.AddParam("@id", branchId);
                using (OpenCbsReader r = c.ExecuteReader())
                {
                    if (r.Empty) return paymentMethods;
                    while (r.Read())
                    {
                        PaymentMethod paymentMethod = new PaymentMethod
                                                          {
                                                              Id = r.GetInt("payment_method_id"),
                                                              Name = r.GetString("name"),
                                                              Description = r.GetString("description"),
                                                              IsPending = r.GetBool("pending"),
                                                              LinkId = r.GetInt("id"),
                                                              Branch = _branchManager.Select(r.GetInt("branch_id")),
                                                              Date = r.GetDateTime("date"),
                                                              Account = _accountManager.Select(r.GetInt("account_id"))
                                                          };
                        paymentMethods.Add(paymentMethod);
                    }
                }
            }
            return paymentMethods;
        }
示例#12
0
        public void TestCalculatePendingRepayment()
        {
            LoanProduct package = new LoanProduct
            {
                InstallmentType = new InstallmentType(1, "Monthly", 0, 1),
                LoanType = OLoanTypes.Flat,
                ChargeInterestWithinGracePeriod = true,
                KeepExpectedInstallment = false,
                Currency = new Currency { Id = 1 }
            };
            Loan myContract = new Loan(package, 1000, 0.03m, 6, 2, new DateTime(2006, 1, 1), new User(),
                                       ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""),
                                       ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User()));

            PaymentMethod paymentMethod = new PaymentMethod(2, "Voucher", "", true);
            RepaymentEvent pEvent = myContract.Repay(1, new DateTime(2006, 6, 1), 30, true, 0, 0, false, 0, true, false, true,
                                                     paymentMethod);

            Assert.IsTrue(myContract.GetInstallment(0).IsRepaid);
            Assert.AreEqual(pEvent.Code, "PBLR");
            Assert.IsTrue(myContract.GetInstallment(0).IsPending);
            myContract.ConfirmPendingRepayment();
            Assert.IsFalse(myContract.GetInstallment(0).IsPending);
        }
示例#13
0
        public KeyValuePair<Loan, RepaymentEvent> ShowNewContract(Loan pContract,
                                                                  int installmentNumber,
                                                                  DateTime date,
                                                                  OCurrency amount,
                                                                  bool disableFees,
                                                                  OCurrency manualFeesAmount,
                                                                  OCurrency manualCommissionAmount,
                                                                  bool disableInterests,
                                                                  OCurrency manualInterests,
                                                                  bool pKeepExpectedInstallment,
                                                                  bool doProportionPayment,
                                                                  PaymentMethod pPaymentMethod,
                                                                  bool pPending,
                                                                  bool isTotalRepayment)
        {
            if (!pContract.UseCents)
            {
                if (amount != Decimal.Ceiling(amount.Value))
                {
                    throw new OpenCbsRepayException(OpenCbsRepayExceptionsEnum.DecimalAmount);
                }
            }
            else if (amount < 0)
                throw new OpenCbsRepayException(OpenCbsRepayExceptionsEnum.NegativeAmount);

            Loan fakeContract = pContract.Copy();

            OCurrency expectedMaxAmount = fakeContract.CalculateMaximumAmountAuthorizedToRepay(installmentNumber, date,
                                                                                               disableFees,
                                                                                               manualFeesAmount,
                                                                                               manualCommissionAmount,
                                                                                               disableInterests,
                                                                                               manualInterests,
                                                                                               pKeepExpectedInstallment);

            expectedMaxAmount = fakeContract.UseCents
                                    ? Math.Round(expectedMaxAmount.Value, 2, MidpointRounding.AwayFromZero)
                                    : expectedMaxAmount;

            if (!disableFees && !isTotalRepayment)
            {
                if (AmountComparer.Compare(amount, expectedMaxAmount) > 0)
                    throw new OpenCbsRepayException(OpenCbsRepayExceptionsEnum.AmountGreaterThanTotalRemainingAmount);

            }
            else
            {
                if (isTotalRepayment)
                    amount = expectedMaxAmount;
            }

            RepaymentEvent e = fakeContract.Repay(installmentNumber, date, amount, disableFees, manualFeesAmount,
                                                  manualCommissionAmount, disableInterests, manualInterests,
                                                  pKeepExpectedInstallment, doProportionPayment, pPaymentMethod, null,
                                                  pPending);

            return new KeyValuePair<Loan, RepaymentEvent>(fakeContract, e);
        }
示例#14
0
        public Loan Repay(Loan curentLoan,
                          IClient client,
                          int installmentNumber,
                          DateTime payDate,
                          OCurrency amount,
                          bool disableFees,
                          OCurrency manualFeesAmount,
                          OCurrency manualCommission,
                          bool disableInterests,
                          OCurrency manualInterestsAmount,
                          bool keepExpectedInstallment,
                          bool proportionPayment,
                          PaymentMethod paymentMethod,
                          string comment,
                          bool isPending)
        {
            if (payDate.Date < curentLoan.StartDate.Date)
            {
                throw new OpenCbsRepayException(OpenCbsRepayExceptionsEnum.RepaymentBeforeDisburse);
            }

            if (curentLoan.Events.GetRepaymentEvents().Any(r => !r.Deleted && r.Date > payDate))
            {
                throw new OpenCbsRepayException(OpenCbsRepayExceptionsEnum.RepaymentBeforeLastEventDate);
            }
            CheckOperationDate(payDate);

            Loan savedContract = curentLoan.Copy();
            using (SqlConnection conn = _loanManager.GetConnection())
            using (SqlTransaction sqlTransaction = conn.BeginTransaction())
            {
                try
                {
                    //Repay
                    // Accrued Interest Event generation
                    if (ApplicationSettings.GetInstance(_user.Md5).AccountingProcesses == OAccountingProcesses.Accrual)
                    {
                        DateTime dateTime = payDate;

                        AccruedInterestEvent e = savedContract.GetAccruedInterestEvent(dateTime);

                        if (e != null)
                        {
                            if (Teller.CurrentTeller != null && Teller.CurrentTeller.Id != 0)
                                e.TellerId = Teller.CurrentTeller.Id;

                            ServicesProvider.GetInstance().GetContractServices().AddAccruedInterestEvent(savedContract,
                                                                                                         e,
                                                                                                         sqlTransaction);
                        }
                    }

                    RepaymentEvent repayEvent = savedContract.Repay(installmentNumber, payDate, amount, disableFees,
                                                                    manualFeesAmount, manualCommission,
                                                                    disableInterests, manualInterestsAmount,
                                                                    keepExpectedInstallment, proportionPayment,
                                                                    paymentMethod, comment,
                                                                    isPending);

                    savedContract.EscapedMember = curentLoan.EscapedMember;
                    repayEvent.User = _user;
                    //the code below should be moved into event generation proccess
                    if (Teller.CurrentTeller != null && Teller.CurrentTeller.Id != 0)
                        repayEvent.TellerId = Teller.CurrentTeller.Id;

                    if (!isPending)
                    {
                        FundingLineEvent repayFlFundingLineEvent = new FundingLineEvent
                            {
                                Code =
                                    String.Concat("RE_", curentLoan.Code,
                                                  "_INS_", installmentNumber),
                                Type = OFundingLineEventTypes.Repay,
                                Amount =
                                    ApplicationSettings.GetInstance(
                                        _user != null
                                            ? _user.Md5
                                            : "")
                                                       .InterestsCreditedInFL
                                        ? amount
                                        : repayEvent.Principal,
                                Movement = OBookingDirections.Credit,
                                CreationDate = TimeProvider.Now,
                                FundingLine = curentLoan.FundingLine,
                                AttachTo = repayEvent
                            };
                        //the code below should be moved into event generation proccess
                        if (Teller.CurrentTeller != null && Teller.CurrentTeller.Id != 0)
                            repayFlFundingLineEvent.TellerId = Teller.CurrentTeller.Id;

                        //this line is to prevent errors from popping up when client makes a repayment of
                        //everything but the principal
                        if (repayFlFundingLineEvent.Amount > 0
                            || ApplicationSettings.GetInstance(_user != null ? _user.Md5 : "").InterestsCreditedInFL)
                            curentLoan.FundingLine.AddEvent(
                                new FundingLineServices(_user).AddFundingLineEvent(repayFlFundingLineEvent,
                                                                                   sqlTransaction));
                    }

                    foreach (RepaymentEvent loanEvent in savedContract.Events.GetLoanRepaymentEvents())
                    {
                        if (loanEvent.IsFired) continue;
                        loanEvent.Comment = comment;
                    }

                    _ePs.FireEvent(repayEvent, savedContract, sqlTransaction);
                    if (paymentMethod.Method == OPaymentMethods.Savings)
                        DoRepaymentFromSavings(savedContract, repayEvent, amount, sqlTransaction);

                    if (repayEvent.RepaymentType == OPaymentType.TotalPayment && savedContract.HasCompulsoryAmount())
                    {
                        SavingBookContract compulsorySaving = savedContract.CompulsorySavings;
                        SavingUnblockCompulsorySavingsEvent savingUnblockEvent =
                            compulsorySaving.GetUnblockCompulsorySavingEvent();
                        if (savingUnblockEvent != null)
                            _ePs.FireSavingUnblockEvent(savingUnblockEvent, compulsorySaving.Id, repayEvent.Id,
                                                        sqlTransaction);
                    }

                    // Put a copy of installments into the history
                    ArchiveInstallments(curentLoan, repayEvent, sqlTransaction);

                    CreditInsuranceEvent cie = savedContract.Events.GetCreditInsuranceEvents();
                    if (cie != null)
                        _ePs.FireEvent(cie, savedContract, sqlTransaction);

                    //Update Installments
                    foreach (Installment installment in savedContract.InstallmentList)
                        _instalmentManager.UpdateInstallment(installment, savedContract.Id, repayEvent.Id,
                                                             sqlTransaction);

                    for (int i = savedContract.Events.GetNumberOfEvents - 1; i >= 0; i--)
                    {
                        Event e = savedContract.Events.GetEvent(i);
                        if ((e is RepaymentEvent) || (e is LoanDisbursmentEvent))
                        {
                            e.Cancelable = true;
                            if (!e.Cancelable)
                                break;
                        }
                        else
                        {
                            break;
                        }
                    }

                    var repaymentEvents = (from item in savedContract.Events.GetRepaymentEvents()
                                           where item.ParentId == repayEvent.Id || item.Id == repayEvent.Id
                                           select item).ToList();
                    var listOfRble = (from item in repaymentEvents where item.Code == "RBLE" select item).ToList();
                    var listOfRgle = repaymentEvents.Except(listOfRble).ToList();
                    if (repayEvent.Code == "RBLE")
                        CallInterceptor(new Dictionary<string, object>
                        {
                            {"Loan", savedContract},
                            {
                                "Event", new RepaymentEvent
                                {
                                    Code = "RBLE",
                                    Principal = listOfRble.Sum(item => item.Principal.Value),
                                    Interests = listOfRble.Sum(item => item.Interests.Value),
                                    Commissions = listOfRble.Sum(item => item.Commissions.Value),
                                    Penalties = listOfRble.Sum(item => item.Fees.Value),
                                    Id = repayEvent.Id,
                                    Date = repayEvent.Date
                                }
                            },
                            {"SqlTransaction", sqlTransaction}
                        });
                    CallInterceptor(new Dictionary<string, object>
                    {
                        {"Loan", savedContract},
                        {
                            "Event", new RepaymentEvent
                            {
                                Code = "RGLE",
                                Principal = listOfRgle.Sum(item => item.Principal.Value),
                                Interests = listOfRgle.Sum(item => item.Interests.Value),
                                Commissions = listOfRgle.Sum(item => item.Commissions.Value),
                                Penalties = listOfRgle.Sum(item => item.Fees.Value),
                                Id = repayEvent.Id,
                                Date = repayEvent.Date
                            }
                        },
                        {"SqlTransaction", sqlTransaction}
                    });

                    if (savedContract.AllInstallmentsRepaid)
                    {
                        _ePs.FireEvent(savedContract.GetCloseEvent(payDate), savedContract, sqlTransaction);
                    }

                    _loanManager.UpdateLoan(savedContract, sqlTransaction);

                    if (sqlTransaction != null)
                    {
                        sqlTransaction.Commit();
                        sqlTransaction.Dispose();
                    }

                    SetClientStatus(savedContract, client);
                    savedContract.EscapedMember = null;
                    return savedContract;
                }
                catch (Exception)
                {
                    if (sqlTransaction != null) sqlTransaction.Rollback();
                    throw;
                }
            }
        }
示例#15
0
 private void comboBoxPaymentMethod_SelectedIndexChanged(object sender, EventArgs e)
 {
     _paymentMethod = cmbPaymentMethod.SelectedItem as PaymentMethod;
     if (_paymentMethod != null)
         checkBoxPending.Visible = _paymentMethod.IsPending;
     DisplayInstallmentsAndEvent();
 }
示例#16
0
        public void Select_Added_loanDisbursmentEvent()
        {
            EventManager eventManager = (EventManager)container["EventManager"];

            LoanDisbursmentEvent loanDisbursmentEvent = new LoanDisbursmentEvent
            {
                Id = 100,
                User = new User { Id = 1 },
                Date = new DateTime(2006, 7, 21),
                Amount = 100,
            };
            var commission = new LoanEntryFeeEvent();
            commission.Fee = 10;
            loanDisbursmentEvent.Commissions = new List<LoanEntryFeeEvent>();
            loanDisbursmentEvent.Commissions.Add(commission);

            PaymentMethod method = new PaymentMethod(1, "Savings", "Savings method", false);
            loanDisbursmentEvent.PaymentMethod = method;

            eventManager.AddLoanEvent(loanDisbursmentEvent, 2);
            EventStock eventStock = eventManager.SelectEvents(2);

            foreach (Event e in eventStock.GetEvents())
            {
                if (e is LoanDisbursmentEvent)
                    _AssertLoanDisbursmentEvent(e as LoanDisbursmentEvent, new DateTime(2006, 7, 21), 100, 10);
            }
        }
示例#17
0
        public void ShouldNotDisburseMultipleTimes()
        {
            var settings = ApplicationSettings.GetInstance("");
            settings.UpdateParameter(OGeneralSettings.ALLOWSMULTIPLELOANS, true);
            settings.UpdateParameter(OGeneralSettings.ACCOUNTINGPROCESS, OAccountingProcesses.Cash);

            Teller.CurrentTeller = null;

            AddDataForTestingTransaction dataHelper = new AddDataForTestingTransaction();
            int creditId = dataHelper.AddGenericCreditContractIntoDatabase();

            LoanManager loanManager = new LoanManager(new User { Id = 1 });
            Loan loan = loanManager.SelectLoan(creditId, true, true, true);

            FundingLine f = loan.FundingLine;
            f.Currency.Id = loan.Product.Currency.Id;
            FundingLineServices fundingLineServices = new FundingLineServices(new User() { Id = 1 });
            var ev = new FundingLineEvent
            {
                Code = "KAO",
                Type = OFundingLineEventTypes.Entry,
                CreationDate = new DateTime(2008, 1, 10),
                EndDate = DateTime.Now.AddDays(1),
                Amount = 1000,
                FundingLine = f,
                Movement = OBookingDirections.Credit,
                IsDeleted = false
            };
            fundingLineServices.AddFundingLineEvent(ev, null);
            f.AddEvent(ev);

            loan.CreditCommiteeDate = loan.StartDate;
            LoanServices loanServices = new LoanServices(new User { Id = 1 });
            PaymentMethod method = new PaymentMethod(1, "Savings", "Savings method", false);
            try
            {
                loan.Disbursed = true;
                loanServices.Disburse(loan, new DateTime(2005, 10, 10), true, false, method);
                Assert.Fail("Contract should not be validated");
            } catch(OpenCbsContractSaveException)
            {
            }
            try
            {
                loan.Disbursed = false;
                loanServices.Disburse(loan, new DateTime(2005, 10, 10), true, false, method);
                loanServices.Disburse(loan, new DateTime(2005, 10, 10), true, false, method);
                Assert.Fail("Contract should not be failed due to double disbursements");
            }
            catch (OpenCbsContractSaveException)
            {
            }
        }
示例#18
0
        public void RepayWrittenOffLoan()
        {
            ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.ALLOWSMULTIPLELOANS, false);
            ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.INCREMENTALDURINGDAYOFF, false);
            ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.ACCOUNTINGPROCESS, OAccountingProcesses.Cash);
            ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.CALCULATIONLATEFEESDURINGPUBLICHOLIDAYS, 0);
            ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.INTERESTS_ALSO_CREDITED_IN_FL, 1);
            ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.DONOTSKIPWEEKENDSININSTALLMENTSDATE, 0);
            ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.BAD_LOAN_DAYS, "180");

            ProvisionTable _provisionningTable = ProvisionTable.GetInstance(new User() {Id = 1});
            _provisionningTable.ProvisioningRates = new List<ProvisioningRate>();
            _provisionningTable.Add(new ProvisioningRate { Number = 1, NbOfDaysMin = 0, NbOfDaysMax = 0, ProvisioningValue = 0.02, ProvisioningInterest = 0.02, ProvisioningPenalty = 0.02 });
            _provisionningTable.Add(new ProvisioningRate { Number = 2, NbOfDaysMin = 1, NbOfDaysMax = 30, ProvisioningValue = 0.1, ProvisioningInterest = 0.01, ProvisioningPenalty = 0.01 });
            _provisionningTable.Add(new ProvisioningRate { Number = 3, NbOfDaysMin = 31, NbOfDaysMax = 60, ProvisioningValue = 0.25, ProvisioningInterest = 0.025, ProvisioningPenalty = 0.025 });
            _provisionningTable.Add(new ProvisioningRate { Number = 4, NbOfDaysMin = 61, NbOfDaysMax = 90, ProvisioningValue = 0.5, ProvisioningInterest = 0.5, ProvisioningPenalty = 0.5 });
            _provisionningTable.Add(new ProvisioningRate { Number = 5, NbOfDaysMin = 91, NbOfDaysMax = 180, ProvisioningValue = 0.75, ProvisioningInterest = 0.75, ProvisioningPenalty = 0.75 });
            _provisionningTable.Add(new ProvisioningRate { Number = 6, NbOfDaysMin = 181, NbOfDaysMax = 365, ProvisioningValue = 1, ProvisioningInterest = 1, ProvisioningPenalty = 1 });
            _provisionningTable.Add(new ProvisioningRate { Number = 7, NbOfDaysMin = 366, NbOfDaysMax = 99999, ProvisioningValue = 1, ProvisioningInterest = 1, ProvisioningPenalty = 1 });

            Teller.CurrentTeller = null;

            //DynamicMock mockClientManager = new DynamicMock(typeof(ClientManager));
            //DynamicMock mockLoanManager = new DynamicMock(typeof(LoanManager));

            //Loan loan = new Loan
            //{
            //    Amount = 11,
            //    Code = "Test",
            //    InterestRate = 1,
            //    NbOfInstallments = 2,
            //    InstallmentType = new InstallmentType(),
            //    AnticipatedTotalRepaymentPenalties = 2,
            //    NonRepaymentPenalties = new NonRepaymentPenalties(1, 1, 1, 1),
            //    GracePeriod = 2,
            //    Events = new EventStock(),
            //    StartDate = new DateTime(2009, 1, 1),
            //    FundingLine = new FundingLine { Currency = new Currency { Id = 1, Code = "Code", Name = "Name" } },
            //    LoanOfficer = new User(),
            //    Product = new LoanProduct { Currency = new Currency { Id = 1, Code = "Code", Name = "Name" } },
            //    InstallmentList = new List<Installment> { _installment1, _installment2 }
            //};

            //Person person = new Person { Active = false, LoanCycle = 1 };
            //IClient group = new Group { Active = false, LoanCycle = 1, Members = new List<Member> { new Member { Tiers = person } } };

            //mockClientManager.Expect("UpdateClientStatus", group, null);
            //mockClientManager.Expect("UpdateClientLoanCycle", group, null);

            //mockClientManager.Expect("UpdateClientStatus", person, null);
            //mockClientManager.Expect("UpdateClientLoanCycle", person, null);

            //LoanServices loanServices = new LoanServices(null, (ClientManager)mockClientManager.MockInstance, (LoanManager)mockLoanManager.MockInstance);
            //loanServices.SaveLoan(ref loan, 1, ref group);

            //loanServices.Disburse(loan, new DateTime(2008, 1, 1), true, true);
            //loanServices.Repay(loan, group, 1, DateTime.Now, 1, true, 0, 0, false, 0, true);

            //Loan disbursedLoan = loan;
            //disbursedLoan.Disbursed = true;
            //LoanDisbursmentEvent loanDisbursmentEvent = new LoanDisbursmentEvent
            //                                                {
            //                                                    Date = new DateTime(2008, 1, 1),
            //                                                    Amount = disbursedLoan.Amount,
            //                                                    Commission = disbursedLoan.CalculateEntryFeesAmount(),
            //                                                    ClientType = disbursedLoan.ClientType
            //                                                };
            //disbursedLoan.Events.Add(loanDisbursmentEvent);
            //loanServices.Repay(disbursedLoan, group, 1, DateTime.Now, 1, true, 0,0, false, 1, true);
            AddDataForTestingTransaction dataHelper = new AddDataForTestingTransaction();
            int _creditId = dataHelper.AddGenericCreditContractIntoDatabase();

            IClient _client = new Group {Id = 5};
            LoanManager _loanManager = new LoanManager(new User() {Id = 1});
            Loan _loan = _loanManager.SelectLoan(_creditId, true, true, true);

            _loan.CreditCommiteeDate = _loan.StartDate;

            AccountManager accountManager = new AccountManager(new User() {Id = 1});
            //accountManager.AddForCurrency(_loan.Product.Currency.Id);

            FundingLine f = _loan.FundingLine;
            f.Currency.Id = _loan.Product.Currency.Id;
            FundingLineServices fundingLineServices = new FundingLineServices(new User() {Id = 1});

            var ev = new FundingLineEvent
            {
                Code = "KAO",
                Type = OFundingLineEventTypes.Entry,
                CreationDate = new DateTime(2008,1,1),
                EndDate = DateTime.Now.AddDays(1),
                Amount = 1000,
                FundingLine = f,
                Movement = OBookingDirections.Credit,
                IsDeleted = false
            };
            fundingLineServices.AddFundingLineEvent(ev, null);
            f.AddEvent(ev);
            _loan.LoanEntryFeesList=new List<LoanEntryFee>();

            EntryFee productEntryFee = new EntryFee();
            productEntryFee.Value = 1;
            productEntryFee.IsRate = false;
            productEntryFee.Id = 21;
            LoanEntryFee loanEntryFee = new LoanEntryFee();
            loanEntryFee.FeeValue = 1;
            loanEntryFee.ProductEntryFee = productEntryFee;
            loanEntryFee.ProductEntryFeeId = 21;

            LoanServices loanServices = new LoanServices(new User() { Id = 1 });

            PaymentMethod method = new PaymentMethod(1, "Savings", "Savings method", false);
            loanServices.Disburse(_loan, new DateTime(2008, 1, 1), true, false, method);

            ////_loan.WrittenOff = true;
            ////_loan = loanServices.Repay(_loan, _client, 1, DateTime.Now, 10, true, 0, 0,false, 1, true);
            //Assert.AreEqual(_loan.Disbursed, true);
            //_loan.WrittenOff = true;
            //OCurrency prevAmount = _loan.ChartOfAccounts.GetAccountByNumber(OAccounts.RECOVERY_OF_CHARGED_OFF_ASSETS, _loan.Product.Currency.Id).Balance;
            //_loan = loanServices.Repay(_loan, _client, 1, DateTime.Now, 100, true, 0, 0, false, 5, false, OPaymentMethods.Cash, null, false);

            //Assert.AreEqual(_loan.Events.GetNumberOfEvents, 1);
            //_loan.Events.SortEventsByDate();
            //Assert.AreEqual(_loan.Events.GetEvent(0).Code, "ROWO");

            //_loan = loanServices.Repay(_loan, _client, 2, DateTime.Now, 100, true, 0, 0, false, 5, false, OPaymentMethods.Cash, null, false);

            //Assert.AreEqual(_loan.Events.GetNumberOfEvents, 2);

            //_loan.Events.SortEventsByDate();
            //Assert.AreEqual(_loan.Events.GetEvent(0).Code, "ROWO");
        }
示例#19
0
        public void TestCalculatePastDueSinceLastRepayment()
        {
            LoanProduct package = new LoanProduct
                                      {
                                          InstallmentType = new InstallmentType(1, "Monthly", 0, 1),
                                          LoanType = OLoanTypes.Flat,
                                          ChargeInterestWithinGracePeriod = true,
                                          KeepExpectedInstallment = false,
                                          Currency = new Currency { Id = 1 }
                                      };
            Loan myContract = new Loan(package, 1000, 0.03m, 6, 2, new DateTime(2006, 1, 1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User()));

            //before repayment
            Assert.AreEqual(0, myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 2, 1)));
            Assert.AreEqual(14, myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 2, 15)));
            Assert.AreEqual(59, myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 4, 1)));
            Assert.AreEqual(152, myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 7, 3)));

            //partially repayment
            PaymentMethod paymentMethod = new PaymentMethod(1, "Cash", "", false);
            myContract.Repay(1, new DateTime(2006, 2, 1), 30, true, 0, 0, false, 0, false, false, false, paymentMethod);
            myContract.Repay(2, new DateTime(2006, 3, 6), 10, true, 0, 0, false, 0, false, false, false, paymentMethod);

            Assert.AreEqual(0, myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 2, 1)));
            Assert.AreEqual(0, myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 2, 15)));
            Assert.AreEqual(28, myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 4, 3)));
            Assert.AreEqual(119, myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 7, 3)));

            //totally repayment
            myContract.Repay(2, new DateTime(2006, 3, 6), 20, true, 0, 0, false, 0, false, false, false, paymentMethod);
            Assert.AreEqual(0, myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 2, 1)));
            Assert.AreEqual(0, myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 2, 15)));
            Assert.AreEqual(0, myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 4, 3)));
            Assert.AreEqual(91, myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 7, 3)));
        }
示例#20
0
        public Loan AddTranche(Loan loan, IClient client, ITrancheConfiguration trancheConfiguration, IList<LoanEntryFee> entryFees, PaymentMethod paymentMethod)
        {
            using (var connection = _loanManager.GetConnection())
            using (var transaction = connection.BeginTransaction())
            {
                try
                {
                    CheckTranche(trancheConfiguration.StartDate, loan, trancheConfiguration.Amount);

                    var copyOfLoan = SimulateTranche(loan, trancheConfiguration);
                    var startInstallment =
                        copyOfLoan.InstallmentList
                                  .FindAll(i => i.ExpectedDate <= trancheConfiguration.StartDate)
                                  .LastOrDefault();
                    var trancheEvent = new TrancheEvent
                        {
                            Amount = trancheConfiguration.Amount,
                            ApplyNewInterest = trancheConfiguration.ApplyNewInterestRateToOlb,
                            Maturity = trancheConfiguration.NumberOfInstallments,
                            StartDate = trancheConfiguration.StartDate,
                            Date = trancheConfiguration.StartDate,
                            InterestRate = trancheConfiguration.InterestRate/100,
                            Number = copyOfLoan.GivenTranches.Count,
                            FirstRepaymentDate = trancheConfiguration.PreferredFirstInstallmentDate,
                            GracePeriod = trancheConfiguration.GracePeriod,
                            StartedFromInstallment = startInstallment == null ? 0 : startInstallment.Number,
                            User = _user,
                            PaymentMethod = paymentMethod
                        };

                    trancheEvent.User = _user;

                    //insert into table TrancheEvent
                    _ePs.FireEvent(trancheEvent, copyOfLoan, transaction);
                    copyOfLoan.Events.Add(trancheEvent);

                    CallInterceptor(new Dictionary<string, object>
                    {
                        {"Loan", copyOfLoan},
                        {"Event", trancheEvent},
                        {"SqlTransaction", transaction}
                    });

                    // Add entry fee events
                    foreach (var entryFee in entryFees)
                    {
                        if (entryFee.FeeValue == 0) continue;
                        var entryFeeEvent = new LoanEntryFeeEvent
                        {
                            Fee = entryFee.FeeValue,
                            Code = "LEE" + entryFee.ProductEntryFee.Index,
                            DisbursementEventId = trancheEvent.Id,
                            Cancelable = true,
                            User = User.CurrentUser,
                            Date = trancheEvent.Date
                        };
                        _ePs.FireEvent(entryFeeEvent, copyOfLoan, transaction);
                        copyOfLoan.Events.Add(entryFeeEvent);
                    }

                    var trancheEntryFeeEvent =
                        copyOfLoan.Events.OfType<LoanEntryFeeEvent>()
                                  .First(i => i.DisbursementEventId == trancheEvent.Id);
                    if (trancheEntryFeeEvent != null)
                        CallInterceptor(new Dictionary<string, object>
                        {
                            {"Loan", copyOfLoan},
                            {
                                "Event", new LoanEntryFeeEvent
                                    {
                                        Id = trancheEntryFeeEvent.Id,
                                        Fee = entryFees.Sum(i => i.FeeValue),
                                        Code = "LEE0"
                                    }
                            },
                            {"SqlTransaction", transaction}
                        });

                    ArchiveInstallments(loan, trancheEvent, transaction);

                    //delete all the old installments of the table Installments
                    _instalmentManager.DeleteInstallments(loan.Id, transaction);

                    //insert all the new installments in the table Installments
                    _instalmentManager.AddInstallments(copyOfLoan.InstallmentList, copyOfLoan.Id, transaction);

                    //Activate the contract if it's closed because of new tranch
                    if (copyOfLoan.Closed)
                    {
                        copyOfLoan.ContractStatus = OContractStatus.Active;
                        copyOfLoan.Closed = false;
                        _loanManager.UpdateLoan(copyOfLoan, transaction);
                    }
                    //in the feature might be combine UpdateLoan + UpdateLoanWithinTranche
                    _loanManager.UpdateLoanWithinTranche(
                        trancheConfiguration.InterestRate/100,
                        copyOfLoan.NbOfInstallments,
                        copyOfLoan,
                        transaction);
                    copyOfLoan.GivenTranches.Add(trancheEvent);
                    transaction.Commit();

                    SetClientStatus(copyOfLoan, client);
                    return copyOfLoan;
                }
                catch
                {
                    transaction.Rollback();
                    throw;
                }
            }
        }
示例#21
0
        public void TestCalculatePastDueSinceLastRepayment2()
        {
            LoanProduct package = new LoanProduct
                                      {
                                          InstallmentType = new InstallmentType(1, "Monthly", 0, 1),
                                          LoanType = OLoanTypes.Flat,
                                          ChargeInterestWithinGracePeriod = true,
                                          KeepExpectedInstallment = false,
                                          Currency = new Currency { Id = 1 }
                                      };
            Loan myContract = new Loan(package, 1000, 0.03m, 6, 2, new DateTime(2006, 1, 1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User()));
            PaymentMethod paymentMethod = new PaymentMethod(1, "Cash", "", false);
            myContract.Repay(1, new DateTime(2006, 6, 1), 30, true, 0, 0, false, 0, true, false, false, paymentMethod);

            Assert.IsTrue(myContract.GetInstallment(0).IsRepaid);

            Assert.AreEqual(122, myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 7, 1)));
        }
示例#22
0
文件: Loan.cs 项目: TalasZh/opencbs
        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;
        }
示例#23
0
 public PaymentMethod SelectPaymentMethodByName(string name)
 {
     const string q = @"SELECT pm.[id]
                           ,[name]
                           ,[description]
                           ,[pending]
                           ,0 AS account_id
                     FROM [PaymentMethods] pm
                     WHERE [name] = @name";
     PaymentMethod pm = new PaymentMethod();
     using (SqlConnection conn = GetConnection())
     using (OpenCbsCommand c = new OpenCbsCommand(q, conn))
     {
         c.AddParam("@name", name);
         using (OpenCbsReader r = c.ExecuteReader())
         {
             if (r != null && !r.Empty)
             {
                 r.Read();
                 pm = GetPaymentMethodFromReader(r);
             }
         }
     }
     return pm;
 }
示例#24
0
文件: Loan.cs 项目: TalasZh/opencbs
        /// <summary>
        /// This method manages all the repayment cases implemented in the software
        /// </summary>
        /// <param name="pNumber">pNumber of the installment paid</param>
        /// <param name="pDate">pDate of the payment</param>
        /// <param name="pAmountPaid">amount paid by the client which can be lower, equal or greater than the expected amount for an installment</param>
        /// <param name="cancelFees">when true, cancel anticipated payment Commission</param>
        /// <param name="manualFeesAmount">manual amount of commission (when anticipated payment commission are cancelled)</param>
        /// <returns>A RepaymentEvent or null if : 
        /// - repayment amount lower than 0
        /// - repayment amount greater than olb + interestsToPay + commission
        /// - installment already repaid
        /// - bad loan and past due days greater than 180
        /// </returns>
        /// <param name="manualCommissionAmount"></param>
        /// <param name="disableInterests"></param>
        /// <param name="manualInterests"></param>
        /// <param name="keepExpectedInstallment"></param>
        /// <param name="payProportion"></param>
        /// <param name="paymentMethod"></param>
        /// <param name="comment"></param>
        /// <param name="pending"></param>
        public RepaymentEvent Repay(int pNumber, 
                                    DateTime pDate, 
                                    OCurrency pAmountPaid,
                                    bool cancelFees, 
                                    OCurrency manualFeesAmount, 
                                    OCurrency manualCommissionAmount,
                                    bool disableInterests, 
                                    OCurrency manualInterests, 
                                    bool keepExpectedInstallment,
                                    bool payProportion,
                                    PaymentMethod paymentMethod, 
                                    string comment, 
                                    bool pending)
        {
            OCurrency anticipatePayment =
                CalculateAnticipateInteresAmountForClosure(pDate, OPaymentType.PartialPayment, payProportion) +
                CalculateTotalNonRepaymentPenalties(pDate);

            if (anticipatePayment >= pAmountPaid
                || (anticipatePayment == 0 && GetInstallment(pNumber - 1).ExpectedDate <= pDate))
            {
                keepExpectedInstallment = true;
                payProportion = false;
            }

            var cCo = new CreditContractOptions(Product.LoanType,
                                                keepExpectedInstallment,
                                                cancelFees,
                                                manualFeesAmount,
                                                manualCommissionAmount,
                                                disableInterests,
                                                manualInterests,
                                                Product.AnticipatedTotalRepaymentPenaltiesBase,
                                                Product.IsExotic,
                                                payProportion);

            var cCr = new CreditContractRepayment(this, cCo, pDate, pNumber, _user, _generalSettings, _nwdS);

            if (AmountComparer.Compare(pAmountPaid, cCr.MaximumAmountAuthorizeToRepay, pNumber) > 0)
            {
                return null;
            }

            OCurrency principalEvent = 0;
            OCurrency interestEvent = 0;
            OCurrency interestPrepayment = 0;
            OCurrency penaltiesEvent = 0;
            OCurrency commissionsEvent = 0;
            OCurrency manualInterestEvent = cCo.ManualInterestsAmount;

            int pastDueDays = CalculatePastDueSinceLastRepayment(pDate);

            OPaymentType paymentType = OPaymentType.StandardPayment;

            foreach (Installment installment in InstallmentList)
            {
                if (!installment.IsRepaid && installment.Number == pNumber && !keepExpectedInstallment)
                {
                    paymentType = OPaymentType.PartialPayment;
                }
            }

            //we have total repayment for a person
            if(EscapedMember != null)
            {
                paymentType = OPaymentType.PartialPayment;
                keepExpectedInstallment = false;
                cCo.KeepExpectedInstallments = false;
            }

            if (AmountComparer.Compare(pAmountPaid, cCr.MaximumAmountAuthorizeToRepay, pNumber) == 0 && !keepExpectedInstallment)
            {
                paymentType = OPaymentType.TotalPayment;
            }

            if (payProportion && _product.LoanType == OLoanTypes.DecliningFixedPrincipal)
            {
                paymentType = OPaymentType.ProportionalPayment;
                keepExpectedInstallment = false;
                cCo.KeepExpectedInstallments = false;
            }

            if (_product.LoanType == OLoanTypes.DecliningFixedPrincipalWithRealInterest)
                paymentType = OPaymentType.StandardPayment;

            // We have to calculate penalties here because
            // once the repayment is done it is impossible to do
            // reliably afterward. These values are later used (see below)
            // during the event generation.

            cCr.Repay(pAmountPaid, ref penaltiesEvent, ref commissionsEvent, ref interestEvent,
                      ref interestPrepayment, ref principalEvent, ref manualInterestEvent, ref paymentType);

            //this part of code to correct calculation of principal
            OCurrency principalAmount = principalEvent;
            foreach (RepaymentEvent rPayment in Events.GetRepaymentEvents())
            {
                if (!rPayment.Deleted)
                    principalAmount += rPayment.Principal;

                if (principalAmount > Amount)
                {
                    principalEvent -= Math.Round(principalAmount.Value, 2) - Amount;
                }
            }

            // when we keep initial schedule and total payment
            if (AmountComparer.Compare(pAmountPaid, cCr.MaximumAmountAuthorizeToRepay, pNumber) == 0 && (pNumber != InstallmentList.Count) && AllInstallmentsRepaid)
            {
                paymentType = OPaymentType.TotalPayment;
            }

            //////////////////////////////////////////////////////////////
            RepaymentEvent rPe = CreateRepaymentEvent(pNumber,
                                                      pDate,
                                                      penaltiesEvent,
                                                      commissionsEvent,
                                                      interestEvent,
                                                      interestPrepayment,
                                                      principalEvent,
                                                      pastDueDays,
                                                      _clientType == OClientTypes.Group,
                                                      paymentType,
                                                      pending);

            if (AllInstallmentsRepaid && !pending)
            {
                if (ContractStatus != OContractStatus.WrittenOff)
                {
                    _closed = true;
                    ContractStatus = OContractStatus.Closed;
                    CloseDate = pDate;
                }

                // check if Client has other 'active' loans if so, mark him as active client
                if (Project != null)
                    foreach (var loan in Project.Credits)
                        Project.Client.Active = loan.ContractStatus == OContractStatus.Active;
            }

            //Event identification
            Events.Add(GenerateRepaymentEvents(cCr,
                                               pDate,
                                               penaltiesEvent, commissionsEvent, interestEvent,
                                                   interestPrepayment, principalEvent, pastDueDays, paymentType,
                                                   pending, pNumber, paymentMethod, cancelFees, manualFeesAmount,
                                                   manualInterestEvent,
                                               ref rPe));

            if (paymentType == OPaymentType.TotalPayment)
            {
                int installmentNumber = penaltiesEvent > 0 ? 0 : 1;
                Events.Add(GenerateCreditInsuranceEvent(installmentNumber));

                if (HasCompulsoryAmount())
                {
                    SavingBlockCompulsarySavingsEvent savingBlockEvent = CompulsorySavings.GetBlockCompulsorySavingEvent();
                    if (savingBlockEvent != null)
                        CompulsorySavings.GenerateUnblockCompulsoruSavingEvent(_user, true);
                }
            }

            //principal amount correction in case of shit which is taken place when we do big prepayment
            //please remove it when all shity contracts will be closed
            OCurrency paidPrincipal = 0;
            foreach (RepaymentEvent repaymentEvent in Events.GetLoanRepaymentEvents())
            {
                if(repaymentEvent.Deleted == false)
                {
                    paidPrincipal += repaymentEvent.Principal;
                }

                if(paidPrincipal >  Amount)
                {
                    repaymentEvent.Principal += Amount - paidPrincipal;
                }
            }
            //////////////////////////////////////////////////////////////////////////////////////////////

            _installmentList.Sort((x, y) => x.ExpectedDate.CompareTo(y.ExpectedDate));

            foreach (Installment installment in InstallmentList)
            {
                //setup paid date for installments
                if (installment.IsRepaid && installment.Number > pNumber)
                {
                    installment.PaidDate = pDate;
                    installment.Comment = comment;
                    installment.IsPending = pending;
                }
                else if (installment.Number == pNumber)
                {
                    installment.PaidDate = pDate;
                    installment.Comment = comment;
                    installment.IsPending = pending;
                }

                installment.OLB = CalculateExpectedOlb(installment.Number, keepExpectedInstallment);
            }
            EscapedMember = null;
            return rPe;
        }
示例#25
0
        public void UpdatePaymentMethodFromBranch(PaymentMethod paymentMethod)
        {
            const string q =
                @"UPDATE LinkBranchesPaymentMethods SET account_id = @account_id, payment_method_id = @payment_method_id
                                    WHERE id = @id";

            using (SqlConnection conn = GetConnection())
            using (OpenCbsCommand c = new OpenCbsCommand(q, conn))
            {
                c.AddParam("@account_id", paymentMethod.Account.Id);
                c.AddParam("@payment_method_id", paymentMethod.Id);
                c.AddParam("@id", paymentMethod.LinkId);
                c.ExecuteNonQuery();
            }
        }
        public void TestRepayFlatExoticWhenKeepNotExpectedInstallmentAndTwoGracePeriod()
        {
            Assert.Ignore();
            ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.CALCULATIONLATEFEESDURINGPUBLICHOLIDAYS, true);
            ExoticInstallmentsTable exoticProduct = new ExoticInstallmentsTable();
            exoticProduct.Add(new ExoticInstallment(1, 0.1, 0.1));
            exoticProduct.Add(new ExoticInstallment(2, 0.1, 0.1));
            exoticProduct.Add(new ExoticInstallment(3, 0.1, 0.1));
            exoticProduct.Add(new ExoticInstallment(4, 0.1, 0.1));
            exoticProduct.Add(new ExoticInstallment(5, 0.1, 0.1));
            exoticProduct.Add(new ExoticInstallment(6, 0.5, 0.5));

            LoanProduct package = new LoanProduct
                                      {
                                          InstallmentType = new InstallmentType(1, "Monthly", 0, 1),
                                          LoanType = OLoanTypes.Flat,
                                          ChargeInterestWithinGracePeriod = true,
                                          Currency = new Currency { Id = 1, UseCents = true}
                                      };
            package.KeepExpectedInstallment = false;
            package.AnticipatedTotalRepaymentPenaltiesBase = OAnticipatedRepaymentPenaltiesBases.RemainingOLB;
            package.ExoticProduct = exoticProduct;

            Loan myContract = new Loan(package, 900, 0.026m, 9, 3, new DateTime(2006, 1, 1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User()));

            PaymentMethod paymentMethod = new PaymentMethod(1, "Cash","",false );
            myContract.Repay(1, new DateTime(2006, 2, 1), 900, true, 0, 0, false, 0, false, false, false, paymentMethod);
            myContract.Repay(4, new DateTime(2006, 5, 2), 50, true, 0, 0, false, 0, false, false, false, paymentMethod);

            Assert.AreEqual(new DateTime(2006, 2, 1), myContract.GetInstallment(0).ExpectedDate);
            Assert.AreEqual(23.40m, myContract.GetInstallment(0).InterestsRepayment.Value);
            Assert.AreEqual(0m, myContract.GetInstallment(0).CapitalRepayment.Value);
            Assert.AreEqual(900m, myContract.GetInstallment(0).OLB.Value);
            Assert.AreEqual(23.40m, myContract.GetInstallment(0).PaidInterests.Value);
            Assert.AreEqual(0m, myContract.GetInstallment(0).PaidCapital.Value);

            Assert.AreEqual(new DateTime(2006, 3, 1), myContract.GetInstallment(1).ExpectedDate); //1
            Assert.AreEqual(0m, myContract.GetInstallment(1).InterestsRepayment.Value);
            Assert.AreEqual(0m, myContract.GetInstallment(1).CapitalRepayment.Value);
            Assert.AreEqual(210.60m, myContract.GetInstallment(1).OLB.Value);
            Assert.AreEqual(0m, myContract.GetInstallment(1).PaidInterests.Value);
            Assert.AreEqual(0m, myContract.GetInstallment(1).PaidCapital.Value);

            Assert.AreEqual(new DateTime(2006, 4, 3), myContract.GetInstallment(2).ExpectedDate); //2
            Assert.AreEqual(0m, myContract.GetInstallment(2).InterestsRepayment.Value);
            Assert.AreEqual(0m, myContract.GetInstallment(2).CapitalRepayment.Value);
            Assert.AreEqual(210.60m, myContract.GetInstallment(2).OLB.Value);
            Assert.AreEqual(0m, myContract.GetInstallment(2).PaidInterests.Value);
            Assert.AreEqual(0m, myContract.GetInstallment(2).PaidCapital.Value);

            Assert.AreEqual(new DateTime(2006, 5, 2), myContract.GetInstallment(3).ExpectedDate);//1
            Assert.AreEqual(0m, myContract.GetInstallment(3).InterestsRepayment.Value);
            Assert.AreEqual(21.06m, myContract.GetInstallment(3).CapitalRepayment.Value);
            Assert.AreEqual(210.60m, myContract.GetInstallment(3).OLB.Value);
            Assert.AreEqual(0m, myContract.GetInstallment(3).PaidInterests.Value);
            Assert.AreEqual(21.06m, myContract.GetInstallment(3).PaidCapital.Value);

            Assert.AreEqual(new DateTime(2006, 6, 1), myContract.GetInstallment(4).ExpectedDate);//0
            Assert.AreEqual(0m, myContract.GetInstallment(4).InterestsRepayment.Value);
            Assert.AreEqual(17.844m, myContract.GetInstallment(4).CapitalRepayment.Value);
            Assert.AreEqual(160.6m, myContract.GetInstallment(4).OLB.Value);
            Assert.AreEqual(0m, myContract.GetInstallment(4).PaidInterests.Value);
            Assert.AreEqual(0m, myContract.GetInstallment(4).PaidCapital.Value);

            Assert.AreEqual(new DateTime(2006, 7, 3), myContract.GetInstallment(5).ExpectedDate);//4
            Assert.AreEqual(0m, myContract.GetInstallment(5).InterestsRepayment.Value);
            Assert.AreEqual(17.844m, myContract.GetInstallment(5).CapitalRepayment.Value);
            Assert.AreEqual(142.76m, myContract.GetInstallment(5).OLB.Value);
            Assert.AreEqual(0m, myContract.GetInstallment(5).PaidInterests.Value);
            Assert.AreEqual(0m, myContract.GetInstallment(5).PaidCapital.Value);

            Assert.AreEqual(new DateTime(2006, 8, 1), myContract.GetInstallment(6).ExpectedDate);//2
            Assert.AreEqual(0m, myContract.GetInstallment(6).InterestsRepayment.Value);
            Assert.AreEqual(17.844m, myContract.GetInstallment(6).CapitalRepayment.Value);
            Assert.AreEqual(124.91m, myContract.GetInstallment(6).OLB.Value);
            Assert.AreEqual(0m, myContract.GetInstallment(6).PaidInterests.Value);
            Assert.AreEqual(0m, myContract.GetInstallment(6).PaidCapital.Value);

            Assert.AreEqual(new DateTime(2006, 9, 1), myContract.GetInstallment(7).ExpectedDate);//2
            Assert.AreEqual(0m, myContract.GetInstallment(7).InterestsRepayment.Value);
            Assert.AreEqual(17.844m, myContract.GetInstallment(7).CapitalRepayment.Value);
            Assert.AreEqual(107.07m, myContract.GetInstallment(7).OLB.Value);
            Assert.AreEqual(0m, myContract.GetInstallment(7).PaidInterests.Value);
            Assert.AreEqual(0m, myContract.GetInstallment(7).PaidCapital.Value);

            Assert.AreEqual(new DateTime(2006, 10, 2), myContract.GetInstallment(8).ExpectedDate);//2
            Assert.AreEqual(0m, myContract.GetInstallment(8).InterestsRepayment.Value);
            Assert.AreEqual(89.222m, myContract.GetInstallment(8).CapitalRepayment.Value);
            Assert.AreEqual(89.22m, myContract.GetInstallment(8).OLB.Value);
            Assert.AreEqual(0m, myContract.GetInstallment(8).PaidInterests.Value);
            Assert.AreEqual(0m, myContract.GetInstallment(8).PaidCapital.Value);
        }
示例#27
0
 public Loan ChangeRepaymentType(Loan loan, IClient client, int installmentNumber, DateTime date,
                                 OCurrency amount, bool disableFees, OCurrency manualFeesAmount,
                                 OCurrency manualCommission,
                                 bool disableInterests, OCurrency manualInterestsAmount,
                                 bool keepExpectedInstallment, bool proportionPayment,
                                 PaymentMethod paymentMethod, string comment, bool pending)
 {
     return Repay(loan, client, installmentNumber, date, amount, disableFees, manualFeesAmount, manualCommission,
                  disableInterests, manualInterestsAmount, keepExpectedInstallment, proportionPayment,
                  paymentMethod, comment, pending);
 }
示例#28
0
        public void DoRepaymentFromSavingsAccount()
        {
            SetApplicationSettings();

            AddDataForTestingTransaction dataHelper = new AddDataForTestingTransaction();
            int _creditId = dataHelper.AddGenericCreditContractIntoDatabase();

            IClient _client = ServicesProvider.GetInstance().GetClientServices().FindGroupByName("SCG");
            LoanManager _loanManager = new LoanManager(new User() { Id = 1 });
            Loan _loan = _loanManager.SelectLoan(_creditId, true, true, true);

            _loan.CreditCommiteeDate = _loan.StartDate;

            _loan.CompulsorySavings = GetSavingContract(_client);
            _loanManager.UpdateLoan(_loan);

            AddFundingLineEvent(_loan);
            LoanServices loanServices = new LoanServices(new User() { Id = 1 });

            PaymentMethod method = new PaymentMethod(1, "Cash", "Cash", false);

            _loan = loanServices.Disburse(_loan, new DateTime(2005, 10, 10), true, false, method);

            Assert.AreEqual(_loan.Disbursed, true);
            PaymentMethod paymentMethod = new PaymentMethod(1, "Savings", "", false);
            loanServices.Repay(_loan, _client, 1, new DateTime(2005, 10, 11), 100, true, 0, 0, false, 5, false, false, paymentMethod, null, false);

            Assert.IsTrue(_loan.CompulsorySavings.Events.FindAll(item => item is LoanRepaymentFromSavingEvent).Count==1);
        }
示例#29
0
 public PaymentMethod SelectPaymentMethodById(int paymentMethodId)
 {
     string q = @"SELECT pm.[id]
                           ,[name]
                           ,[description]
                           ,[pending]
                           , 0 AS account_id
                     FROM [dbo].[PaymentMethods] pm
                     WHERE pm.id = @id";
     PaymentMethod pm = new PaymentMethod();
     using (SqlConnection conn = GetConnection())
     using (OpenCbsCommand c = new OpenCbsCommand(q, conn))
     {
         c.AddParam("@id", paymentMethodId);
         using (OpenCbsReader r = c.ExecuteReader())
         {
             if (r != null && !r.Empty)
             {
                 r.Read();
                 pm = GetPaymentMethodFromReader(r);
             }
         }
     }
     return pm;
 }
示例#30
0
        public Loan Disburse(Loan pLoan, DateTime pDateToDisburse, bool pAlignInstallmentsDatesOnRealDisbursmentDate,
                             bool pDisableFees, PaymentMethod method)
        {
            Loan copyLoan = pLoan.Copy();
            CheckDisbursedLoan(copyLoan, pDateToDisburse);
            CheckOperationDate(pDateToDisburse);

            using (SqlConnection connection = _loanManager.GetConnection())
            using (SqlTransaction sqlTransaction = connection.BeginTransaction())
            {
                try
                {
                    LoanDisbursmentEvent loanDisbursmentEvent = copyLoan.Disburse(pDateToDisburse,
                                                                                  pAlignInstallmentsDatesOnRealDisbursmentDate,
                                                                                  pDisableFees);
                    loanDisbursmentEvent.User = _user;
                    loanDisbursmentEvent.PaymentMethod = method;

                    if (pLoan.CompulsorySavings != null)
                        loanDisbursmentEvent.Comment = pLoan.CompulsorySavings.Code;

                    FundingLineEvent flFundingLineEvent = new FundingLineEvent
                        {
                            Code = String.Concat("DE_", copyLoan.Code),
                            Type = OFundingLineEventTypes.Disbursment,
                            Amount = loanDisbursmentEvent.Amount,
                            Movement = OBookingDirections.Debit,
                            CreationDate = TimeProvider.Now,
                            FundingLine =
                                _fundingLineServices.SelectFundingLineById(
                                    copyLoan.FundingLine.Id, sqlTransaction),
                            AttachTo = loanDisbursmentEvent
                        };

                    if (Teller.CurrentTeller != null && Teller.CurrentTeller.Id != 0)
                    {
                        loanDisbursmentEvent.TellerId = Teller.CurrentTeller.Id;
                        flFundingLineEvent.TellerId = Teller.CurrentTeller.Id;
                    }
                    loanDisbursmentEvent.Comment = copyLoan.Comments;
                    _ePs.FireEvent(loanDisbursmentEvent, copyLoan, sqlTransaction);

                    flFundingLineEvent = _fundingLineServices.AddFundingLineEvent(flFundingLineEvent, sqlTransaction);

                    foreach (Event item in copyLoan.Events)
                    {
                        if (item is CreditInsuranceEvent)
                        {
                            _ePs.FireEvent(item, copyLoan, sqlTransaction);
                            break;
                        }
                    }

                    copyLoan.ContractStatus = OContractStatus.Active;

                    if (copyLoan.Project != null)
                        copyLoan.Project.Client.Active = true;

                    _loanManager.UpdateLoan(copyLoan, sqlTransaction);

                    int loanDisbEventId = loanDisbursmentEvent.Id;
                    if (pAlignInstallmentsDatesOnRealDisbursmentDate ||
                        ApplicationSettings.GetInstance(_user != null ? _user.Md5 : string.Empty).
                                            PayFirstInterestRealValue)
                        foreach (Installment installment in copyLoan.InstallmentList)
                            _instalmentManager.UpdateInstallment(installment, copyLoan.Id, loanDisbEventId,
                                                                 sqlTransaction);

                    copyLoan.FundingLine.AddEvent(flFundingLineEvent);

                    loanDisbursmentEvent.Cancelable = true;

                    if (copyLoan.HasCompulsoryAmount())
                    {
                        SavingBookContract compulsorySaving = copyLoan.CompulsorySavings;
                        SavingBlockCompulsarySavingsEvent savingBlockEvent =
                            compulsorySaving.GetBlockCompulsorySavingEvent();
                        Debug.Assert(savingBlockEvent != null,
                                     "Saving should have block event on disbursment if it has compulsary saving");
                        savingBlockEvent.LoanEventId = loanDisbEventId;

                        _ePs.FireSavingBlockEvent(savingBlockEvent, compulsorySaving.Id, sqlTransaction);
                    }

                    _clientManager.IncrementLoanCycleByContractId(pLoan.Id, sqlTransaction);

                    SetEconomicActivity(pLoan, sqlTransaction);

                    loanDisbursmentEvent.PaymentMethodId = method.Id;
                    CallInterceptor(new Dictionary<string, object>
                    {
                        {"Loan", pLoan},
                        {"Event", loanDisbursmentEvent},
                        {"SqlTransaction", sqlTransaction}
                    });
                    if (loanDisbursmentEvent.Commissions != null && loanDisbursmentEvent.Commissions.Count != 0)
                        CallInterceptor(new Dictionary<string, object>
                        {
                            {"Loan", pLoan},
                            {
                                "Event", new LoanEntryFeeEvent
                                    {
                                        Id = loanDisbursmentEvent.Commissions.First().Id,
                                        Fee = loanDisbursmentEvent.Commissions.Sum(i => i.Fee.Value),
                                        Code = "LEE0",
                                        Date = loanDisbursmentEvent.Date
                                    }
                            },
                            {"SqlTransaction", sqlTransaction}
                        });

                    sqlTransaction.Commit();
                    return copyLoan;
                }
                catch
                {
                    if (sqlTransaction != null) sqlTransaction.Rollback();
                    throw;
                }
            }
        }