public Loan Reschedule(Loan pContract, DateTime pDate, int pNbOfMaturity, int dateOffset, bool pAccruedInterestDuringTheGracePeriod, decimal pNewInterestRate, int gracePeriod, bool chargeInterestDuringGracePeriod) { using (SqlConnection conn = _loanManager.GetConnection()) using (SqlTransaction sqlTransac = conn.BeginTransaction()) { try { Loan copyOfLoan = pContract.Copy(); //create the rescheduling loan event ReschedulingOptions ro = new ReschedulingOptions { ReschedulingDate = pDate, ChargeInterestDuringShift = pAccruedInterestDuringTheGracePeriod, InterestRate = pNewInterestRate, RepaymentDateOffset = dateOffset, NewInstallments = pNbOfMaturity, GracePeriod = gracePeriod, ChargeInterestDuringGracePeriod = chargeInterestDuringGracePeriod }; RescheduleLoanEvent rescheduleLoanEvent = pContract.Reschedule(ro); rescheduleLoanEvent.User = _user; //insert into table ReschedulingOfALoanEvents _ePs.FireEvent(rescheduleLoanEvent, pContract, sqlTransac); OverdueEvent overdueEvent = pContract.AddRecheduleTransformationEvent(pDate); if (overdueEvent != null) _ePs.FireEvent(overdueEvent, pContract, sqlTransac); ArchiveInstallments(copyOfLoan, rescheduleLoanEvent, sqlTransac); //delete all the old installments of the table Installments _instalmentManager.DeleteInstallments(pContract.Id, sqlTransac); //insert all the new installments in the table Installments _instalmentManager.AddInstallments(pContract.InstallmentList, pContract.Id, sqlTransac); _loanManager.UpdateLoanToRescheduled(pNewInterestRate, pNbOfMaturity, pContract, sqlTransac); sqlTransac.Commit(); return pContract; } catch (Exception ex) { sqlTransac.Rollback(); throw ex; } } }