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);
        }