public Loan SaveInstallmentsAndRepaymentEvents(Loan loan, IList<Installment> newInstallments, EventStock eventStock) { var repayEvent = eventStock.GetRepaymentEvents().First(i => !i.IsFired).Copy(); var amount = eventStock.GetRepaymentEvents() .Where(i => !i.IsFired) .Sum(i => i.Commissions.Value + i.Penalties.Value + i.Interests.Value + i.Principal.Value); using (var sqlTransaction = _loanManager.GetConnection().BeginTransaction()) { try { if (ApplicationSettings.GetInstance(User.CurrentUser.Md5).UseMandatorySavingAccount) { var saving = (from item in loan.Project.Client.Savings where item.Product.Code == "default" select item) .FirstOrDefault(); if (saving == null) { MessageBox.Show("Make sure that client has default saving account"); return loan; } saving = ServicesProvider.GetInstance().GetSavingServices().GetSaving(saving.Id); var balance = saving.GetBalance(repayEvent.Date); if (amount > balance) { MessageBox.Show("Balance is not enough to repay"); return loan; } if (amount <= 0) return loan; ServicesProvider.GetInstance() .GetSavingServices() .Withdraw(saving, repayEvent.Date, amount, "Withdraw for loan repayment " + loan.Code, User.CurrentUser, new Teller(), sqlTransaction); eventStock.GetRepaymentEvents().First(i => !i.IsFired).Comment = saving.Events.Last().Id.ToString(CultureInfo.InvariantCulture); } loan.Events = eventStock; _ePs.FireEvent(repayEvent, loan, sqlTransaction); ArchiveInstallments(loan, repayEvent, sqlTransaction); loan.InstallmentList = newInstallments.ToList(); foreach (var installment in newInstallments) _instalmentManager.UpdateInstallment(installment, loan.Id, repayEvent.Id, sqlTransaction); if (newInstallments.All(installment => installment.IsRepaid)) { _ePs.FireEvent(loan.GetCloseEvent(TimeProvider.Now), loan, sqlTransaction); loan.Closed = true; loan.ContractStatus = OContractStatus.Closed; _loanManager.UpdateLoan(loan, sqlTransaction); } var repaymentEvents = (from item in loan.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", loan}, { "Event", new BadLoanRepaymentEvent { 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", loan}, { "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} }); sqlTransaction.Commit(); } catch (Exception) { sqlTransaction.Rollback(); throw; } } if(loan.Closed) SetClientStatus(loan, loan.Project.Client); return loan; }
public void TestClosureEventWithCurrency() { EventStock eventStock = new EventStock { new LoanDisbursmentEvent { Id = 1, Date = new DateTime(2000,1,1), Amount = 100, PaymentMethod = new PaymentMethod {Id = 0}, ClientType = OClientTypes.Person, EconomicActivity = new EconomicActivity(1, "Agriculture", null, false), Currency = new Currency{Id =1} }, new RepaymentEvent { Id = 2, Principal = 100, Interests = 5, Penalties = 1, Commissions = 0, Date = new DateTime(2000,1,1), Currency = new Currency {Id = 1}, ClientType = OClientTypes.Person }, }; eventStock.GetRepaymentEvents()[0].LoanProduct = new LoanProduct { Id = 2, Code = "EDE60", Name = "EDEN 60", Currency = new Currency {Id = 1} }; AccountingClosure closure = new AccountingClosure(); List<FiscalYear> fYears = new List<FiscalYear> {new FiscalYear{OpenDate = new DateTime(1900,1,1)}}; List<Booking> bookings = closure.GetBookings(_rules, eventStock, null, null, null, fYears); Assert.AreEqual(bookings[0].Amount, 100); Assert.AreEqual(bookings[0].DebitAccount.Number, "1052"); Assert.AreEqual(bookings[0].CreditAccount.Number, "1020"); }