public CGTEventViewModel(CgtLiabilityResponse.CgtLiabilityEvent cgtEvent)
 {
     Stock          = new StockViewItem(cgtEvent.Stock);
     EventDate      = cgtEvent.EventDate;
     CostBase       = cgtEvent.CostBase;
     AmountReceived = cgtEvent.AmountReceived;
     CapitalGain    = cgtEvent.CapitalGain;
     if (cgtEvent.Method == CgtMethod.Discount)
     {
         Method = "Discount";
     }
     else if (cgtEvent.Method == CgtMethod.Indexation)
     {
         Method = "Indexation";
     }
     else
     {
         Method = "Other";
     }
 }
        public ServiceResult <CgtLiabilityResponse> GetCGTLiability(DateRange dateRange)
        {
            if (_Portfolio == null)
            {
                return(ServiceResult <CgtLiabilityResponse> .NotFound());
            }

            var response = new CgtLiabilityResponse();

            // Get a list of all the cgt events for the year
            var cgtEvents = _Portfolio.CgtEvents.InDateRange(dateRange);

            foreach (var cgtEvent in cgtEvents)
            {
                var item = new CgtLiabilityResponse.CgtLiabilityEvent()
                {
                    Stock          = cgtEvent.Stock.ToSummaryResponse(cgtEvent.Date),
                    EventDate      = cgtEvent.Date,
                    CostBase       = cgtEvent.CostBase,
                    AmountReceived = cgtEvent.AmountReceived,
                    CapitalGain    = cgtEvent.CapitalGain,
                    Method         = cgtEvent.CgtMethod.ToResponse()
                };

                response.Events.Add(item);

                // Apportion capital gains
                if (cgtEvent.CapitalGain < 0)
                {
                    response.CurrentYearCapitalLossesTotal += -cgtEvent.CapitalGain;
                }
                else if (cgtEvent.CgtMethod == Domain.Portfolios.CgtMethod.Discount)
                {
                    response.CurrentYearCapitalGainsDiscounted += cgtEvent.CapitalGain;
                }
                else
                {
                    response.CurrentYearCapitalGainsOther += cgtEvent.CapitalGain;
                }
            }

            response.CurrentYearCapitalGainsTotal = response.CurrentYearCapitalGainsOther + response.CurrentYearCapitalGainsDiscounted;

            if (response.CurrentYearCapitalGainsOther > response.CurrentYearCapitalLossesTotal)
            {
                response.CurrentYearCapitalLossesOther = response.CurrentYearCapitalLossesTotal;
            }
            else
            {
                response.CurrentYearCapitalLossesOther = response.CurrentYearCapitalGainsOther;
            }

            if (response.CurrentYearCapitalGainsOther > response.CurrentYearCapitalLossesTotal)
            {
                response.CurrentYearCapitalLossesDiscounted = 0.00m;
            }
            else
            {
                response.CurrentYearCapitalLossesDiscounted = response.CurrentYearCapitalLossesTotal - response.CurrentYearCapitalGainsOther;
            }

            response.GrossCapitalGainOther      = response.CurrentYearCapitalGainsOther - response.CurrentYearCapitalLossesOther;
            response.GrossCapitalGainDiscounted = response.CurrentYearCapitalGainsDiscounted - response.CurrentYearCapitalLossesDiscounted;
            response.GrossCapitalGainTotal      = response.GrossCapitalGainOther + response.GrossCapitalGainDiscounted;
            if (response.GrossCapitalGainDiscounted > 0)
            {
                response.Discount = (response.GrossCapitalGainDiscounted / 2).ToCurrency(RoundingRule.Round);
            }
            else
            {
                response.Discount = 0.00m;
            }
            response.NetCapitalGainOther      = response.GrossCapitalGainOther;
            response.NetCapitalGainDiscounted = response.GrossCapitalGainDiscounted - response.Discount;
            response.NetCapitalGainTotal      = response.NetCapitalGainOther + response.NetCapitalGainDiscounted;

            return(ServiceResult <CgtLiabilityResponse> .Ok(response));
        }