private static BankStmtCashFlowForecast ReconcileForecast(Session session, BankStmt bankStmtObj, CashFlow cashFlowObj, bool commit) { // use the same session for both BankStmt and CashFlow object BankStmt bankStmt = bankStmtObj; if (session != bankStmtObj.Session) { bankStmt = session.GetObjectByKey <BankStmt>(session.GetKeyValue(bankStmtObj)); } CashFlow cashFlow = cashFlowObj; if (session != cashFlowObj.Session) { cashFlow = session.GetObjectByKey <CashFlow>(session.GetKeyValue(cashFlowObj)); } // associate the bank stmt object with the cash flow forecast object using a link object (BankStmtCashFlowForecast) // if link object does not exist, then create it var bsCff = session.FindObject <BankStmtCashFlowForecast>(CriteriaOperator.Parse( "BankStmt = ?", bankStmt)); if (bsCff == null) { bsCff = new BankStmtCashFlowForecast(session); bsCff.BankStmt = bankStmt; } bsCff.CashFlow = cashFlow; if (commit) { session.CommitTransaction(); } return(bsCff); }
public void AutoreconcileTransfers(System.Collections.IEnumerable bankStmts, bool commit) { // get session from first BankStmt. This assumes the same sessions are being used. Session session = null; foreach (BankStmt bs in bankStmts) { session = bs.Session; break; } var snapshot = SetOfBooks.GetInstance(session).CurrentCashFlowSnapshot; if (session == null) { return; } var transferActivity = session.GetObjectByKey <Activity>( SetOfBooks.CachedInstance.ForexSettleActivity.Oid); foreach (BankStmt bsi in bankStmts) { //Debug.Print(string.Format("Autoreconcile Activity {0} with {1}", bsi.Activity.Name, transferActivity.Name)); if (bsi.Activity != null && bsi.Activity.Oid == transferActivity.Oid) { // reconcile transfer var cf = session.FindObject <CashFlow>(CriteriaOperator.Parse( "TranDate = ? And Activity = ? And AccountCcyAmt = ? And Snapshot = ?", bsi.TranDate, transferActivity, bsi.TranAmount, snapshot)); if (cf == null) { break; } BankStmtCashFlowForecast bsCff = ReconcileForecast(session, bsi, cf); ChangeBankStmtToCashFlowForecast(bsCff.BankStmt, bsCff.CashFlow); } else { // reconcile anything else with matching date and amount var cf = session.FindObject <CashFlow>(CriteriaOperator.Parse( "TranDate = ? And AccountCcyAmt = ? And Snapshot = ?", bsi.TranDate, bsi.TranAmount, snapshot)); if (cf == null) { break; } BankStmtCashFlowForecast bsCff = ReconcileForecast(session, bsi, cf); ChangeBankStmtToCashFlowForecast(bsCff.BankStmt, bsCff.CashFlow); } } if (commit) { session.CommitTransaction(); } }
public BankStmtCashFlowForecast ReconcileItem(BankStmt bankStmt, CashFlow cashFlow) { // TODO: can selected objects be cast into a List? // Record the Cash Flow Forecast that was reconciled with the Bank Stmt BankStmtCashFlowForecast bsCff = ReconcileForecast(objSpace.Session, bankStmt, cashFlow); ChangeBankStmtToCashFlowForecast(bsCff.BankStmt, bsCff.CashFlow); return(bsCff); }
public void ReconcileBankStmtToCashFlowSnapshot() { #region Arrange Forex objects // Currencies var ccyAUD = ObjectSpace.FindObject <Currency>(CriteriaOperator.Parse("Name = ?", "AUD")); var ccyUSD = ObjectSpace.FindObject <Currency>(CriteriaOperator.Parse("Name = ?", "USD")); // Forex Rates var rate = ObjectSpace.CreateObject <ForexRate>(); rate.ConversionDate = new DateTime(2013, 11, 01); rate.FromCurrency = ccyAUD; rate.ToCurrency = ccyUSD; rate.ConversionRate = 0.9M; rate.Save(); ObjectSpace.CommitChanges(); // Constants decimal rate1 = 0.95M; #endregion #region Arrange Lookup Objects var priAccount = ObjectSpace.CreateObject <Account>(); priAccount.Name = "VHA ANZ 70086"; priAccount.Currency = ccyAUD; var couAccount = ObjectSpace.CreateObject <Account>(); couAccount.Name = "VHA ANZ USD"; couAccount.Currency = ccyUSD; var forexActivity = SetOfBooks.GetInstance(ObjectSpace).ForexSettleActivity; var outActivity = ObjectSpace.CreateObject <Activity>(); outActivity.Name = "AP Pymt"; var outCounterparty = ObjectSpace.CreateObject <Counterparty>(); outCounterparty.Name = "UNDEFINED"; var inCounterparty = ObjectSpace.CreateObject <Counterparty>(); inCounterparty.Name = "ANZ"; var forexCounterparty = ObjectSpace.CreateObject <ForexCounterparty>(); forexCounterparty.Name = "ANZ"; forexCounterparty.CashFlowCounterparty = inCounterparty; var snapshot1 = ObjectSpace.CreateObject <CashFlowSnapshot>(); snapshot1.Name = "Snapshot 1"; #endregion #region Create Cash Flow Forex Trade Objects var cfCouForex1 = ObjectSpace.CreateObject <CashFlow>(); cfCouForex1.CalculateEnabled = false; cfCouForex1.TranDate = new DateTime(2013, 11, 16); cfCouForex1.Account = couAccount; cfCouForex1.Activity = forexActivity; cfCouForex1.Counterparty = inCounterparty; cfCouForex1.AccountCcyAmt = 100; cfCouForex1.FunctionalCcyAmt = 100 / rate1; cfCouForex1.CounterCcyAmt = 100; cfCouForex1.CounterCcy = ccyUSD; cfCouForex1.ForexSettleType = CashFlowForexSettleType.In; cfCouForex1.Description = "cfCouForex1"; cfCouForex1.Save(); var cfPriForex1 = ObjectSpace.CreateObject <CashFlow>(); cfPriForex1.CalculateEnabled = false; cfPriForex1.TranDate = new DateTime(2013, 11, 16); cfPriForex1.Account = priAccount; cfPriForex1.Activity = forexActivity; cfPriForex1.Counterparty = inCounterparty; cfPriForex1.AccountCcyAmt = -100 / rate1; cfPriForex1.FunctionalCcyAmt = -100 / rate1; cfPriForex1.CounterCcyAmt = 100; cfPriForex1.CounterCcy = ccyUSD; cfPriForex1.ForexSettleType = CashFlowForexSettleType.In; cfPriForex1.Description = "cfPriForex1"; cfPriForex1.Save(); var cfCouForex1a = ObjectSpace.CreateObject <CashFlow>(); cfCouForex1a.CalculateEnabled = false; cfCouForex1a.TranDate = new DateTime(2013, 11, 16); cfCouForex1a.Account = couAccount; cfCouForex1a.Activity = forexActivity; cfCouForex1a.Counterparty = inCounterparty; cfCouForex1a.AccountCcyAmt = 100; cfCouForex1a.FunctionalCcyAmt = 100 / rate1; cfCouForex1a.CounterCcyAmt = 100; cfCouForex1a.CounterCcy = ccyUSD; cfCouForex1a.ForexSettleType = CashFlowForexSettleType.In; cfCouForex1a.Description = "cfCouForex1a"; cfCouForex1a.Snapshot = snapshot1; cfCouForex1a.Save(); var cfPriForex1a = ObjectSpace.CreateObject <CashFlow>(); cfPriForex1a.CalculateEnabled = false; cfPriForex1a.TranDate = new DateTime(2013, 11, 16); cfPriForex1a.Account = priAccount; cfPriForex1a.Activity = forexActivity; cfPriForex1a.Counterparty = inCounterparty; cfPriForex1a.AccountCcyAmt = -100 / rate1; cfPriForex1a.FunctionalCcyAmt = -100 / rate1; cfPriForex1a.CounterCcyAmt = 100; cfPriForex1a.CounterCcy = ccyUSD; cfPriForex1a.ForexSettleType = CashFlowForexSettleType.In; cfPriForex1a.Description = "cfPriForex1a"; cfPriForex1a.Snapshot = snapshot1; cfPriForex1a.Save(); #endregion #region Arrange Bank Stmt Forex Trade objects var bsCouForex1 = ObjectSpace.CreateObject <BankStmt>(); bsCouForex1.TranDate = new DateTime(2013, 11, 16); bsCouForex1.Account = couAccount; bsCouForex1.Activity = forexActivity; bsCouForex1.Counterparty = outCounterparty; bsCouForex1.TranAmount = 100; bsCouForex1.ForexSettleType = CashFlowForexSettleType.In; bsCouForex1.SummaryDescription = "bsCouForex1"; bsCouForex1.Save(); var bsPriForex1 = ObjectSpace.CreateObject <BankStmt>(); bsPriForex1.TranDate = new DateTime(2013, 11, 16); bsPriForex1.Account = priAccount; bsPriForex1.Activity = forexActivity; bsPriForex1.Counterparty = outCounterparty; bsPriForex1.TranAmount = -100 / rate1; bsPriForex1.ForexSettleType = CashFlowForexSettleType.In; bsPriForex1.SummaryDescription = "bsPriForex1"; bsPriForex1.Save(); #endregion #region Reconcile Bank Stmt ObjectSpace.CommitChanges(); var bankStmts = ObjectSpace.GetObjects <BankStmt>(); var reconciler = new BankStmtForecastReconciler((XPObjectSpace)ObjectSpace); BankStmtCashFlowForecast bsCff = reconciler.ReconcileItem(bsCouForex1, cfCouForex1a); ObjectSpace.CommitChanges(); #endregion #region Assert Assert.AreEqual("cfCouForex1a", bsCouForex1.SummaryDescription); #endregion }