public int SaveContract(ISavingsContract saving, Client client, Action<SqlTransaction, int> action) { if (client == null) throw new OpenCbsTiersSaveException(OpenCbsTiersSaveExceptionEnum.TiersIsNull); ValidateSavingsContract(saving, client); int savingsCount = _savingManager.GetNumberOfSavings(client.Id); saving.GenerateSavingCode( client, savingsCount, ApplicationSettings.GetInstance(_user.Md5).SavingsCodeTemplate, ApplicationSettings.GetInstance(_user.Md5).ImfCode, client.Branch.Code ); saving.Status = OSavingsStatus.Pending; if (((SavingBookContract) saving).UseTermDeposit) { ((SavingBookContract) saving).NextMaturity = DateCalculationStrategy.GetNextMaturity( saving.CreationDate, ((SavingBookContract) saving).Product.Periodicity, ((SavingBookContract) saving).NumberOfPeriods); } using (SqlConnection connection = _savingManager.GetConnection()) using (SqlTransaction sqlTransaction = connection.BeginTransaction()) { try { saving.Id = _savingManager.Add(saving, client, sqlTransaction); string code = saving.Code + '/' + saving.Id.ToString(CultureInfo.InvariantCulture); _savingManager.UpdateSavingContractCode(saving.Id, code, sqlTransaction); if (action != null) action(sqlTransaction, saving.Id); sqlTransaction.Commit(); return saving.Id; } catch (Exception) { sqlTransaction.Rollback(); throw; } } }