public void Apply(IPortfolioTransaction transaction, IHolding holding, ICashAccount cashAccount) { var aquisition = transaction as Aquisition; if (aquisition == null) { throw new ArgumentException("Expected transaction to be an Aquisition"); } if (!aquisition.Stock.IsEffectiveAt(aquisition.Date)) { throw new StockNotActiveException("Stock is not active"); } decimal cost = aquisition.Units * aquisition.AveragePrice; decimal amountPaid = cost + aquisition.TransactionCosts; decimal costBase = amountPaid; holding.AddParcel(aquisition.Date, aquisition.Date, aquisition.Units, amountPaid, costBase, transaction); if (aquisition.CreateCashTransaction) { var asxCode = aquisition.Stock.Properties[aquisition.Date].AsxCode; cashAccount.Transfer(aquisition.Date, -cost, String.Format("Purchase of {0}", asxCode)); if (aquisition.TransactionCosts > 0.00m) { cashAccount.FeeDeducted(aquisition.Date, aquisition.TransactionCosts, String.Format("Brokerage for purchase of {0}", asxCode)); } } }
public void Apply(IPortfolioTransaction transaction, IHolding holding, ICashAccount cashAccount) { var openingBalance = transaction as OpeningBalance; if (openingBalance == null) { throw new ArgumentException("Expected transaction to be an OpeningBalance"); } if (!openingBalance.Stock.IsEffectiveAt(openingBalance.Date)) { throw new StockNotActiveException("Stock is not active"); } holding.AddParcel(openingBalance.Date, openingBalance.AquisitionDate, openingBalance.Units, openingBalance.CostBase, openingBalance.CostBase, transaction); }