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();
        }
Beispiel #3
0
        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();
        }
Beispiel #5
0
        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();
        }
Beispiel #6
0
        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();
        }
Beispiel #7
0
        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();
        }
Beispiel #8
0
        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;
        }
Beispiel #10
0
        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);
        }