public void Apply(IncomeOccurredEvent @event) { var holding = _Holdings[@event.Stock]; if (holding == null) { throw new NoSharesOwnedException("No shares owned"); } var incomeReceived = new IncomeReceived { Id = @event.TransactionId, Date = @event.Date, Stock = holding.Stock, Comment = @event.Comment, RecordDate = @event.RecordDate, FrankedAmount = @event.FrankedAmount, UnfrankedAmount = @event.UnfrankedAmount, FrankingCredits = @event.FrankingCredits, Interest = @event.Interest, TaxDeferred = @event.TaxDeferred, CreateCashTransaction = @event.CreateCashTransaction, DrpCashBalance = @event.DrpCashBalance }; var handler = _TransactionHandlers.GetService <IncomeReceived>(); handler.Apply(incomeReceived, holding, _CashAccount); _Transactions.Add(incomeReceived); }
public void HasBeenApplied() { var mockRepository = new MockRepository(MockBehavior.Strict); var stock = new Stock(Guid.NewGuid()); stock.List("ABC", "ABC Pty Ltd", new Date(1974, 01, 01), false, AssetCategory.AustralianStocks); var dividend = new Dividend(Guid.NewGuid(), stock, new Date(2020, 01, 01), "Test Dividend", new Date(2020, 02, 01), 100.00m, 100.0m, 0.00m); var transaction = new IncomeReceived() { Id = Guid.NewGuid(), Date = new Date(2020, 02, 01), Stock = stock, Comment = "Test Dividend", RecordDate = new Date(2020, 01, 01), FrankedAmount = 10.00m, UnfrankedAmount = 20.00m, FrankingCredits = 30.00m, Interest = 40.00m, TaxDeferred = 0.00m, CreateCashTransaction = false, DrpCashBalance = 0.00m }; var transactions = mockRepository.Create <IPortfolioTransactionList>(); transactions.Setup(x => x.ForHolding(stock.Id, dividend.PaymentDate)).Returns(new IPortfolioTransaction[] { transaction }); var result = dividend.HasBeenApplied(transactions.Object); result.Should().BeTrue(); mockRepository.Verify(); }
public void TaxDeferredAmount() { var stock = new Stock(Guid.NewGuid()); stock.List("ABC", "ABC Pty Ltd", new Date(1974, 01, 01), false, AssetCategory.AustralianStocks); var transaction = new IncomeReceived() { Id = Guid.NewGuid(), Date = new Date(2020, 02, 01), Stock = stock, Comment = "Test Dividend", RecordDate = new Date(2020, 01, 01), FrankedAmount = 10.00m, UnfrankedAmount = 20.00m, FrankingCredits = 30.00m, Interest = 40.00m, TaxDeferred = 50.00m, CreateCashTransaction = false, DrpCashBalance = 0.00m }; var mockRepository = new MockRepository(MockBehavior.Strict); var drpAccount = mockRepository.Create <ICashAccount>(); drpAccount.Setup(x => x.Balance(new Date(2020, 02, 01))).Returns(0.00m); var parcel1 = mockRepository.Create <IParcel>(); parcel1.Setup(x => x.Properties[new Date(2020, 01, 01)]).Returns(new ParcelProperties(100, 1000.00m, 1000.00m)); parcel1.Setup(x => x.Change(new Date(2020, 01, 01), 0, 0.00m, 14.29m, transaction)).Verifiable(); var parcel2 = mockRepository.Create <IParcel>(); parcel2.Setup(x => x.Properties[new Date(2020, 01, 01)]).Returns(new ParcelProperties(50, 500.00m, 500.00m)); parcel2.Setup(x => x.Change(new Date(2020, 01, 01), 0, 0.00m, 7.14m, transaction)).Verifiable(); var parcel3 = mockRepository.Create <IParcel>(); parcel3.Setup(x => x.Properties[new Date(2020, 01, 01)]).Returns(new ParcelProperties(200, 1000.00m, 1000.00m)); parcel3.Setup(x => x.Change(new Date(2020, 01, 01), 0, 0.00m, 28.57m, transaction)).Verifiable(); var holding = mockRepository.Create <IHolding>(); holding.Setup(x => x.IsEffectiveAt(new Date(2020, 01, 01))).Returns(true); holding.Setup(x => x.DrpAccount).Returns(drpAccount.Object); holding.Setup(x => x.Parcels(new Date(2020, 01, 01))).Returns(new IParcel[] { parcel1.Object, parcel2.Object, parcel3.Object }); var cashAccount = mockRepository.Create <ICashAccount>(); var handler = new IncomeReceivedHandler(); handler.Apply(transaction, holding.Object, cashAccount.Object); mockRepository.Verify(); }
public void IncomeReceived() { var mockRepository = new MockRepository(MockBehavior.Strict); var stock = new Stock(Guid.NewGuid()); stock.List("ABC", "ABC Pty Ltd", new Date(1974, 01, 01), false, AssetCategory.AustralianStocks); var stockResolver = mockRepository.Create <IStockResolver>(); stockResolver.Setup(x => x.GetStock(stock.Id)).Returns(stock); var handler = mockRepository.Create <ITransactionHandler>(); IncomeReceived transaction = null; handler.Setup(x => x.Apply(It.IsAny <IPortfolioTransaction>(), It.IsAny <IHolding>(), It.IsAny <ICashAccount>())) .Callback <IPortfolioTransaction, IHolding, ICashAccount>((t, h, c) => transaction = (IncomeReceived)t) .Verifiable(); var transactionHandlers = mockRepository.Create <IServiceFactory <ITransactionHandler> >(); transactionHandlers.Setup(x => x.GetService <IncomeReceived>()).Returns(handler.Object); transactionHandlers.Setup(x => x.GetService <OpeningBalance>()).Returns(new OpeningBalanceHandler()); var portfolio = new Portfolio(Guid.NewGuid(), stockResolver.Object, transactionHandlers.Object); portfolio.AddOpeningBalance(stock.Id, new Date(1999, 01, 01), new Date(1999, 01, 01), 100, 100.00m, "", Guid.Empty); var transactionId = Guid.NewGuid(); portfolio.IncomeReceived(stock.Id, new Date(2000, 01, 01), new Date(2000, 02, 01), 100.00m, 101.00m, 30.00m, 2.00m, 3.00m, 20.00m, true, "Comment", transactionId); transaction.Should().BeEquivalentTo(new { Id = transaction.Id, Date = new Date(2000, 02, 01), Stock = stock, Comment = "Comment", RecordDate = new Date(2000, 01, 01), FrankedAmount = 100.00m, UnfrankedAmount = 101.00m, FrankingCredits = 30.00m, Interest = 2.00m, TaxDeferred = 3.00m, DrpCashBalance = 20.00m, CreateCashTransaction = true }); mockRepository.Verify(); }
public void ApplyIncomeReceived() { var mockRepository = new MockRepository(MockBehavior.Strict); var portfolio = PortfolioTestCreator.CreateDefaultPortfolio(); var events = new List <Event>(); var repository = mockRepository.Create <IRepository <Portfolio> >(); repository.Setup(x => x.Update(It.IsAny <Portfolio>())).Callback <Portfolio>(x => events.AddRange(x.FetchEvents())); var service = new PortfolioTransactionService(portfolio, repository.Object); var transaction = new IncomeReceived() { Id = Guid.NewGuid(), Stock = PortfolioTestCreator.Stock_ARG.Id, TransactionDate = new Date(2007, 01, 01), Comment = "", RecordDate = new Date(2006, 12, 27), FrankedAmount = 1.00m, UnfrankedAmount = 2.00m, FrankingCredits = 3.00m, Interest = 4.00m, TaxDeferred = 5.00m, CreateCashTransaction = true, DrpCashBalance = 2.50m }; var result = service.ApplyTransaction(transaction); result.Should().HaveOkStatus(); events.Should().BeEquivalentTo(new[] { new IncomeOccurredEvent(portfolio.Id, 1, transaction.Id, new Date(2007, 01, 01), PortfolioTestCreator.Stock_ARG.Id, "") { RecordDate = new Date(2006, 12, 27), FrankedAmount = 1.00m, UnfrankedAmount = 2.00m, FrankingCredits = 3.00m, Interest = 4.00m, TaxDeferred = 5.00m, CreateCashTransaction = true, DrpCashBalance = 2.50m } }); mockRepository.Verify(); }
public void CreateCashTransaction() { var stock = new Stock(Guid.NewGuid()); stock.List("ABC", "ABC Pty Ltd", new Date(1974, 01, 01), false, AssetCategory.AustralianStocks); var transaction = new IncomeReceived() { Id = Guid.NewGuid(), Date = new Date(2020, 02, 01), Stock = stock, Comment = "Test Dividend", RecordDate = new Date(2020, 01, 01), FrankedAmount = 10.00m, UnfrankedAmount = 20.00m, FrankingCredits = 30.00m, Interest = 40.00m, TaxDeferred = 0.00m, CreateCashTransaction = true, DrpCashBalance = 0.00m }; var mockRepository = new MockRepository(MockBehavior.Strict); var drpAccount = mockRepository.Create <ICashAccount>(); drpAccount.Setup(x => x.Balance(new Date(2020, 02, 01))).Returns(0.00m); var holding = mockRepository.Create <IHolding>(); holding.Setup(x => x.IsEffectiveAt(new Date(2020, 01, 01))).Returns(true); holding.Setup(x => x.DrpAccount).Returns(drpAccount.Object); var cashAccount = mockRepository.Create <ICashAccount>(); cashAccount.Setup(x => x.Transfer(new Date(2020, 02, 01), 70.00m, "Distribution for ABC")).Verifiable(); var handler = new IncomeReceivedHandler(); handler.Apply(transaction, holding.Object, cashAccount.Object); mockRepository.Verify(); }
public void HasBeenAppliedResultStocksNoDisposalsAtImplementationDate() { var mockRepository = new MockRepository(MockBehavior.Strict); var stock = new Stock(Guid.NewGuid()); stock.List("ABC", "ABC Pty Ltd", new Date(1974, 01, 01), false, AssetCategory.AustralianStocks); var stock2 = new Stock(Guid.NewGuid()); stock2.List("XYZ", "XYZ Pty Ltd", new Date(1974, 01, 01), false, AssetCategory.AustralianStocks); var resultStocks = new Transformation.ResultingStock[] { new Transformation.ResultingStock(stock2.Id, 1, 1, 10.00m, new Date(2020, 02, 01)) }; var transformation = new Transformation(Guid.NewGuid(), stock, new Date(2020, 01, 01), "Test Transformation", new Date(2020, 02, 01), 10.00m, true, resultStocks); var transaction = new IncomeReceived() { Id = Guid.NewGuid(), Date = new Date(2020, 02, 01), Stock = stock2, Comment = "Test Dividend", RecordDate = new Date(2020, 01, 01), FrankedAmount = 10.00m, UnfrankedAmount = 20.00m, FrankingCredits = 30.00m, Interest = 40.00m, TaxDeferred = 0.00m, CreateCashTransaction = false, DrpCashBalance = 0.00m }; var transactions = mockRepository.Create <IPortfolioTransactionList>(); transactions.Setup(x => x.ForHolding(stock2.Id, transformation.ImplementationDate)).Returns(new IPortfolioTransaction[] { transaction }); var result = transformation.HasBeenApplied(transactions.Object); result.Should().BeFalse(); mockRepository.Verify(); }
public void DeserializeIncomeReceived() { var serializer = new RestClientSerializer(); var transactionId = Guid.NewGuid(); var stockId = Guid.NewGuid(); var json = "{\"id\":\"" + transactionId + "\"," + "\"stock\":\"" + stockId + "\"," + "\"type\":\"incomereceived\"," + "\"transactionDate\":\"2000-01-10\"," + "\"comment\":\"comment\"," + "\"description\":\"description\"," + "\"recordDate\":\"2000-01-02\"," + "\"frankedAmount\":10.00," + "\"unfrankedAmount\":11.00," + "\"frankingCredits\":3.00," + "\"interest\":4.00," + "\"taxDeferred\":7.00," + "\"drpCashBalance\":9.00," + "\"createCashTransaction\":true}"; var transaction = serializer.Deserialize <Transaction>(json); var expected = new IncomeReceived() { Id = transactionId, Stock = stockId, TransactionDate = new Date(2000, 01, 10), Comment = "comment", Description = "description", RecordDate = new Date(2000, 01, 02), FrankedAmount = 10.00m, UnfrankedAmount = 11.00m, FrankingCredits = 3.00m, Interest = 4.00m, TaxDeferred = 7.00m, DrpCashBalance = 9.00m, CreateCashTransaction = true }; transaction.Should().BeEquivalentTo(expected); }
protected override void CopyFieldsToTransaction() { if (_Transaction == null) { _Transaction = new IncomeReceived(); } base.CopyFieldsToTransaction(); var income = (IncomeReceived)_Transaction; income.RecordDate = RecordDate; income.TransactionDate = PaymentDate; income.FrankedAmount = FrankedAmount; income.UnfrankedAmount = UnfrankedAmount; income.FrankingCredits = FrankingCredits; income.TaxDeferred = TaxDeferred; income.Interest = Interest; income.CreateCashTransaction = CreateCashTransaction; income.DrpCashBalance = DrpCashBalance; }
public void NoSharesOwned() { var stock = new Stock(Guid.NewGuid()); stock.List("ABC", "ABC Pty Ltd", new Date(1974, 01, 01), false, AssetCategory.AustralianStocks); var transaction = new IncomeReceived() { Id = Guid.NewGuid(), Date = new Date(2020, 02, 01), Stock = stock, Comment = "Test Dividend", RecordDate = new Date(2020, 01, 01), FrankedAmount = 10.00m, UnfrankedAmount = 20.00m, FrankingCredits = 30.00m, Interest = 40.00m, TaxDeferred = 0.00m, CreateCashTransaction = false, DrpCashBalance = 0.00m }; var mockRepository = new MockRepository(MockBehavior.Strict); var holding = mockRepository.Create <IHolding>(); holding.Setup(x => x.IsEffectiveAt(new Date(2020, 01, 01))).Returns(false); var cashAccount = mockRepository.Create <ICashAccount>(); var handler = new IncomeReceivedHandler(); Action a = () => handler.Apply(transaction, holding.Object, cashAccount.Object); a.Should().Throw <NoSharesOwnedException>(); mockRepository.Verify(); }
public IncomeReceivedViewModel(IncomeReceived incomeReceived, RestClient restClient) : base(incomeReceived, "Income Received", TransactionStockSelection.Holdings, restClient) { }
public override IEnumerable <IPortfolioTransaction> GetTransactionList(IReadOnlyHolding holding, IStockResolver stockResolver) { var transactions = new List <IPortfolioTransaction>(); var holdingProperties = holding.Properties[Date]; if (holdingProperties.Units == 0) { return(transactions); } var dividendRules = Stock.DividendRules[Date]; var totalAmount = holdingProperties.Units * DividendAmount; var amountPaid = totalAmount.ToCurrency(dividendRules.DividendRoundingRule); var franked = (totalAmount * PercentFranked).ToCurrency(dividendRules.DividendRoundingRule); var unFranked = (totalAmount * (1 - PercentFranked)).ToCurrency(dividendRules.DividendRoundingRule); var frankingCredits = (((totalAmount / (1 - dividendRules.CompanyTaxRate)) - totalAmount) * PercentFranked).ToCurrency(dividendRules.DividendRoundingRule); var incomeReceived = new IncomeReceived() { Id = Guid.NewGuid(), Date = PaymentDate, Stock = Stock, RecordDate = Date, FrankedAmount = franked, UnfrankedAmount = unFranked, FrankingCredits = frankingCredits, Interest = 0.00m, TaxDeferred = 0.00m, CreateCashTransaction = true, DrpCashBalance = 0.00m, Comment = Description }; transactions.Add(incomeReceived); /* Handle Dividend Reinvestment Plan */ var holdingSettings = holding.Settings; if (dividendRules.DrpActive && holdingSettings.ParticipateInDrp && (DrpPrice != 0.00m)) { incomeReceived.CreateCashTransaction = false; int drpUnits; decimal costBase; if (dividendRules.DrpMethod == DrpMethod.RoundUp) { drpUnits = (int)Math.Ceiling(amountPaid / DrpPrice); costBase = amountPaid; } else if (dividendRules.DrpMethod == DrpMethod.RoundDown) { drpUnits = (int)Math.Floor(amountPaid / DrpPrice); costBase = amountPaid; } else if (dividendRules.DrpMethod == DrpMethod.RetainCashBalance) { var drpCashBalance = holding.DrpAccount.Balance(Date); var availableAmount = amountPaid + drpCashBalance; drpUnits = (int)Math.Floor(availableAmount / DrpPrice); costBase = (drpUnits * DrpPrice).ToCurrency(dividendRules.DividendRoundingRule); incomeReceived.DrpCashBalance = availableAmount - costBase; } else { drpUnits = (int)Math.Round(amountPaid / DrpPrice); costBase = amountPaid; } if (drpUnits > 0) { transactions.Add(new OpeningBalance() { Id = Guid.NewGuid(), Date = PaymentDate, Stock = Stock, Units = drpUnits, CostBase = costBase, AquisitionDate = PaymentDate, Comment = "DRP " + MathUtils.FormatCurrency(DrpPrice, false, true) }); } } return(transactions); }