public decimal GetAccountBalance(string account) { using (CAP_EventSourcingEntities entities = new CAP_EventSourcingEntities()) { DateTime dateOfBusiness = AccountUtility.GetDateOfBusiness(entities); DateTime snapshotDate = dateOfBusiness - TimeSpan.FromDays(2.0); return AccountUtility.GetAccountBalance(account, snapshotDate, dateOfBusiness, entities); } }
public decimal GetAccountBalance(string account) { using (CAP_EventSourcingEntities entities = new CAP_EventSourcingEntities()) { DateTime dateOfBusiness = AccountUtility.GetDateOfBusiness(entities); DateTime snapshotDate = dateOfBusiness - TimeSpan.FromDays(2.0); return(AccountUtility.GetAccountBalance(account, snapshotDate, dateOfBusiness, entities)); } }
private static AccountBalance GetSnapshot(string account, DateTime snapshotDate, CAP_EventSourcingEntities entities) { IQueryable<AccountBalance> snapshots = from b in entities.AccountBalances where b.Account == account && b.DateOfBusiness == snapshotDate select b; AccountBalance snapshot = snapshots.FirstOrDefault(); if (snapshot == null) throw new ApplicationException("No such account."); return snapshot; }
// TODO 3c: Query is more complex. public static decimal GetAccountBalance(string account, DateTime snapshotDate, DateTime closingDate, CAP_EventSourcingEntities entities) { AccountBalance snapshot = GetSnapshot(account, snapshotDate, entities); IQueryable<decimal?> transfersFrom = from t in entities.Transfers where t.From == account && t.DateOfBusiness > snapshotDate && t.DateOfBusiness <= closingDate select (decimal?)t.Amount; IQueryable<decimal?> transfersTo = from t in entities.Transfers where t.To == account && t.DateOfBusiness > snapshotDate && t.DateOfBusiness <= closingDate select (decimal?)t.Amount; return snapshot.Balance - (transfersFrom.Sum() ?? 0.0m) + (transfersTo.Sum() ?? 0.0m); }
// TODO 3d: Command is just an insert. public void Transfer(string fromAccount, string toAccount, decimal amount) { using (CAP_EventSourcingEntities entities = new CAP_EventSourcingEntities()) { DateTime dateOfBusiness = AccountUtility.GetDateOfBusiness(entities); DateTime snapshotDate = dateOfBusiness - TimeSpan.FromDays(2.0); decimal accountBalance = AccountUtility.GetAccountBalance(fromAccount, snapshotDate, dateOfBusiness, entities); if (accountBalance < amount) throw new ApplicationException("Insufficient funds"); entities.AddToTransfers(new Transfer() { From = fromAccount, To = toAccount, Amount = amount, DateOfBusiness = dateOfBusiness }); entities.SaveChanges(); } }
// TODO 3d: Command is just an insert. public void Transfer(string fromAccount, string toAccount, decimal amount) { using (CAP_EventSourcingEntities entities = new CAP_EventSourcingEntities()) { DateTime dateOfBusiness = AccountUtility.GetDateOfBusiness(entities); DateTime snapshotDate = dateOfBusiness - TimeSpan.FromDays(2.0); decimal accountBalance = AccountUtility.GetAccountBalance(fromAccount, snapshotDate, dateOfBusiness, entities); if (accountBalance < amount) { throw new ApplicationException("Insufficient funds"); } entities.AddToTransfers(new Transfer() { From = fromAccount, To = toAccount, Amount = amount, DateOfBusiness = dateOfBusiness }); entities.SaveChanges(); } }
public static DateTime GetDateOfBusiness(CAP_EventSourcingEntities entities) { return entities.Current.Single().DateOfBusiness; }
private static AccountBalance GetSnapshot(string account, DateTime snapshotDate, CAP_EventSourcingEntities entities) { IQueryable <AccountBalance> snapshots = from b in entities.AccountBalances where b.Account == account && b.DateOfBusiness == snapshotDate select b; AccountBalance snapshot = snapshots.FirstOrDefault(); if (snapshot == null) { throw new ApplicationException("No such account."); } return(snapshot); }
// TODO 3c: Query is more complex. public static decimal GetAccountBalance(string account, DateTime snapshotDate, DateTime closingDate, CAP_EventSourcingEntities entities) { AccountBalance snapshot = GetSnapshot(account, snapshotDate, entities); IQueryable <decimal?> transfersFrom = from t in entities.Transfers where t.From == account && t.DateOfBusiness > snapshotDate && t.DateOfBusiness <= closingDate select(decimal?) t.Amount; IQueryable <decimal?> transfersTo = from t in entities.Transfers where t.To == account && t.DateOfBusiness > snapshotDate && t.DateOfBusiness <= closingDate select(decimal?) t.Amount; return(snapshot.Balance - (transfersFrom.Sum() ?? 0.0m) + (transfersTo.Sum() ?? 0.0m)); }
public static DateTime GetDateOfBusiness(CAP_EventSourcingEntities entities) { return(entities.Current.Single().DateOfBusiness); }