public static IEnumerable <object[]> CalculateCapitalGainData(CgtCalculationMethod method)
        {
            var p1 = new Parcel(Guid.NewGuid(), new Date(2010, 01, 01), new Date(2019, 01, 01), new ParcelProperties(1000, 1000.00m, 1000.00m), null);
            var p2 = new Parcel(Guid.NewGuid(), new Date(2010, 01, 01), new Date(2019, 01, 01), new ParcelProperties(1000, 2000.00m, 2000.00m), null);
            var p3 = new Parcel(Guid.NewGuid(), new Date(2010, 01, 01), new Date(2019, 06, 30), new ParcelProperties(1000, 1000.00m, 1000.00m), null);
            var p4 = new Parcel(Guid.NewGuid(), new Date(2010, 01, 01), new Date(2019, 06, 30), new ParcelProperties(1000, 2000.00m, 2000.00m), null);

            var scenarios = new CapitalGainScenario[]
            {
                new CapitalGainScenario(new Date(2019, 08, 01), p1, p3, "Parcel 1, no discount before Parcel 2, no discount", -1, 1, -1, -1),
                new CapitalGainScenario(new Date(2020, 02, 01), p1, p3, "Parcel 1, discount before Parcel 2, no discount", -1, 1, -1, -1),
                new CapitalGainScenario(new Date(2020, 08, 01), p1, p3, "Parcel 1, discount before Parcel 2, discount", -1, 1, -1, -1),
                new CapitalGainScenario(new Date(2019, 08, 01), p3, p1, "Parcel 1, no discount after Parcel 2, no discount", 1, -1, 1, 1),
                new CapitalGainScenario(new Date(2020, 02, 01), p3, p1, "Parcel 1, no discount after Parcel 2, discount", 1, -1, 1, 1),
                new CapitalGainScenario(new Date(2019, 08, 01), p3, p1, "Parcel 1, discount after Parcel 2, discount", 1, -1, 1, 1),
                new CapitalGainScenario(new Date(2019, 08, 01), p1, p2, "Parcel 1 same date as Parcel 2", 0, 0, -1, 1),
                new CapitalGainScenario(new Date(2019, 08, 01), p4, p1, "Parcel 1, no discount > Parcel 2, no discount", 1, -1, 1, -1),
                new CapitalGainScenario(new Date(2020, 02, 01), p4, p1, "Parcel 1, no discount > Parcel 2, discount", 1, -1, 1, 1),
                new CapitalGainScenario(new Date(2020, 02, 01), p2, p3, "Parcel 1, discount > Parcel 2, no discount", -1, 1, -1, -1),
                new CapitalGainScenario(new Date(2020, 08, 01), p2, p3, "Parcel 1, discount > Parcel 2, discount", -1, 1, 1, -1),
                new CapitalGainScenario(new Date(2019, 08, 01), p2, p3, "Parcel 1, no discount < Parcel 2, no discount", -1, 1, 1, -1),
                new CapitalGainScenario(new Date(2020, 02, 01), p3, p2, "Parcel 1, no discount < Parcel 2, discount", 1, -1, 1, 1),
                new CapitalGainScenario(new Date(2020, 02, 01), p1, p4, "Parcel 1, discount < Parcel 2, no discount", -1, 1, -1, -1),
                new CapitalGainScenario(new Date(2020, 08, 01), p1, p4, "Parcel 1, discount < Parcel 2, discount", -1, 1, -1, 1)
            };

            return(scenarios.Select(x => x.TestData(method)));
        }
            public object[] TestData(CgtCalculationMethod method)
            {
                switch (method)
                {
                case CgtCalculationMethod.FirstInFirstOut:
                    return(new object[] { DisposalDate, new ParcelPair(Parcel1, Parcel2), FirstInFirstOutResult, "FirstInFirstOut(" + Message + ")" });

                case CgtCalculationMethod.LastInFirstOut:
                    return(new object[] { DisposalDate, new ParcelPair(Parcel1, Parcel2), LastInFirstOutResult, "LastInFirstOut(" + Message + ")" });

                case CgtCalculationMethod.MaximizeGain:
                    return(new object[] { DisposalDate, new ParcelPair(Parcel1, Parcel2), MaximizeGainResult, "MaximizeGain(" + Message + ")" });

                case CgtCalculationMethod.MinimizeGain:
                    return(new object[] { DisposalDate, new ParcelPair(Parcel1, Parcel2), MinimizeGainResult, "MinimizeGain(" + Message + ")" });

                default:
                    return(null);
                }
            }
Example #3
0
        public static IComparer <IReadOnlyParcel> GetCgtComparer(Date disposalDate, CgtCalculationMethod method)
        {
            switch (method)
            {
            case CgtCalculationMethod.FirstInFirstOut:
                return(new FirstInFirstOutCgtComparer());

            case CgtCalculationMethod.LastInFirstOut:
                return(new LastInFirstOutCgtComparer());

            case CgtCalculationMethod.MaximizeGain:
                return(new MaximizeGainCgtComparer(disposalDate));

            case CgtCalculationMethod.MinimizeGain:
                return(new MinimizeGainCgtComparer(disposalDate));

            default:
                throw new ArgumentException();
            }
        }
        public void DisposeOfShares(Guid stockId, Date disposalDate, int units, decimal averagePrice, decimal transactionCosts, CgtCalculationMethod cgtMethod, bool createCashTransaction, string comment, Guid transactionId)
        {
            var @event = new DisposalOccurredEvent(Id, Version, transactionId, disposalDate, stockId, comment)
            {
                Units                 = units,
                AveragePrice          = averagePrice,
                TransactionCosts      = transactionCosts,
                CgtMethod             = cgtMethod,
                CreateCashTransaction = createCashTransaction
            };

            Apply(@event);

            PublishEvent(@event);
        }
        public void CheckAllCgtMethodsHaveAComparere(CgtCalculationMethod method)
        {
            var comparer = CgtCalculator.GetCgtComparer(Date.MinValue, method);

            comparer.Should().BeAssignableTo <IComparer <Parcel> >();
        }