private async Task <BvsComponenDto> CreateReadBvsTransactionByComponents(DateTime assessmentEventDate, BaseValueSegmentDto baseValueSegmentDto, int assessmentEventType)
        {
            var bvsDto = new BvsComponenDto {
                Source = baseValueSegmentDto
            };

            // get the events defined for the this bvs based on the SubComponentand revenue object
            var events = (await _grmEventDomain.GetValueHeaderGrmEvents(baseValueSegmentDto)).ToList();
            var conclusionHeaderEvents = _baseValueSegmentRepository.GetConclusionsData(baseValueSegmentDto.RevenueObjectId, baseValueSegmentDto.AsOf).Result;

            foreach (var grmEvent in events)
            {
                var conclusionEvent = conclusionHeaderEvents.FirstOrDefault(conclusion => conclusion.GrmEventId == grmEvent.GrmEventId);
                if (conclusionEvent != null)
                {
                    grmEvent.EventType = conclusionEvent.Description;
                }
            }

            events.PopulateEvent(bvsDto);

            // take the first transaction for the bvs
            var firstTransaction = baseValueSegmentDto.FirstTransaction();

            bvsDto.Components = CreateComponents(firstTransaction, events, baseValueSegmentDto.AsOf, baseValueSegmentDto.RevenueObjectId, assessmentEventDate, assessmentEventType);

            bvsDto.ValueHeaders = GetBaseValueSegmentHeaderEvents(baseValueSegmentDto, firstTransaction);

            bvsDto.BaseValueSegmentTransactionTypeDescription = firstTransaction.BaseValueSegmentTransactionType.Description;

            // get the legal parties and document information associated to base value segment
            var legalPartyRoleDocuments = (await _legalPartyDomain.GetLegalPartyRoleDocuments(baseValueSegmentDto)).ToList();

            bvsDto.Owners = firstTransaction.BaseValueSegmentOwners.ToList().Select(bvsOwner =>
            {
                var doc = legalPartyRoleDocuments.First(d => d.LegalPartyRoleId == bvsOwner.LegalPartyRoleId);

                // We are only populating 3 fields for the sub components because only the 3 fields are used for
                // determing what's the base value, market values for each BI based on the ordering of these 3
                // fields. These values are used to reallocate base values/ market values if they are changed by
                // the user in the UI.
                return(new OwnerDto
                {
                    // We must have an Owner Id.
                    // ReSharper disable once PossibleInvalidOperationException
                    OwnerId = bvsOwner.Id.Value,
                    BeneficialInterest = doc.LegalPartyDisplayName,
                    BiPercentage = bvsOwner.BeneficialInterestPercent
                });
            }).ToArray();

            return(bvsDto);
        }
        private HeaderValue[] GetBaseValueSegmentHeaderEvents(BaseValueSegmentDto baseValueSegmentDto, BaseValueSegmentTransactionDto transaction)
        {
            var headerRelatedEvents    = _grmEventDomain.GetValueHeaderGrmEvents(baseValueSegmentDto).Result.ToArray();
            var conclusionHeaderEvents = _baseValueSegmentRepository.GetConclusionsData(baseValueSegmentDto.RevenueObjectId, baseValueSegmentDto.AsOf).Result.ToList();

            var valueHeaders = new List <HeaderValue>();

            foreach (var baseValueSegmentValueHeaderDto in transaction.BaseValueSegmentValueHeaders)
            {
                var headerRelatedEvent = headerRelatedEvents.Single(he => he.GrmEventId == baseValueSegmentValueHeaderDto.GRMEventId);
                BaseValueSegmentConclusionDto conclusionEvent = null;

                if (conclusionHeaderEvents.Count > 0)
                {
                    conclusionEvent = conclusionHeaderEvents.FirstOrDefault(conclusion => conclusion.GrmEventId == headerRelatedEvent.GrmEventId);
                }

                var headerValue = new HeaderValue
                {
                    HeaderValueId = baseValueSegmentValueHeaderDto.Id,
                    GrmEventId    = headerRelatedEvent.GrmEventId,
                    DisplayName   = headerRelatedEvent.EventType + " " + headerRelatedEvent.EffectiveDate.Year,
                    BaseYear      = baseValueSegmentValueHeaderDto.BaseYear,
                    EventDate     = headerRelatedEvent.EventDate,
                    EventType     = headerRelatedEvent.EventType,
                    EffectiveDate = headerRelatedEvent.EffectiveDate
                };

                if (conclusionEvent != null)
                {
                    headerValue.DisplayName = conclusionEvent.Description + " " + conclusionEvent.ConclusionDate.Year;
                    headerValue.EventType   = conclusionEvent.Description;
                }

                valueHeaders.Add(headerValue);
            }

            return(valueHeaders.OrderByDescending(vh => vh.BaseYear).ToArray());
        }