Esempio n. 1
0
        private async Task <DetailDto[]> CreateDetails(BaseValueSegmentTransactionDto bvsTransaction,
                                                       List <GrmEventInformationDto> grmEventInformationDtos,
                                                       List <LegalPartyDocumentDto> legalPartyDocumentDtos,
                                                       DateTime assessmentEventDate,
                                                       int baseValueSegmentRevObjId)
        {
            var list = new List <DetailDto>();

            // now build segments and base value segment per owner
            foreach (var bvsOwner in bvsTransaction.BaseValueSegmentOwners)
            {
                // per meeting  with bob do not error out if grm even information is missing, return unknown
                var grmOwnerEventInformationDto = grmEventInformationDtos.FirstOrDefault(grm => grm.GrmEventId == bvsOwner.GRMEventId);

                DateTime?ownerEventDate = null;
                string   ownerEventType;
                string   ownerEventName;

                if (grmOwnerEventInformationDto != null)
                {
                    ownerEventName = grmOwnerEventInformationDto.Description;
                    ownerEventType = grmOwnerEventInformationDto.EventType;
                    ownerEventDate = grmOwnerEventInformationDto.EffectiveDate;
                }
                else
                {
                    ownerEventName = Constants.EventUnknownName;
                    ownerEventType = Constants.EventUnknownName;
                }

                var allTheOwnersDocuments = legalPartyDocumentDtos.Where(x => x.LegalPartyRoleId == bvsOwner.LegalPartyRoleId).ToList();

                foreach (var ownerValue in bvsOwner.BaseValueSegmentOwnerValueValues)
                {
                    // get the values associated with the owner value
                    var baseValueHeaders = bvsTransaction.BaseValueSegmentValueHeaders.Where(v => ownerValue.BaseValueSegmentValueHeaderId == v.Id);

                    foreach (var bvsValueHeader in baseValueHeaders)
                    {
                        // per meeting with bob do not error out if grm even information is missing, return unknown
                        var grmValueHeaderEventInformationDto = grmEventInformationDtos.FirstOrDefault(grm => grm.GrmEventId == bvsValueHeader.GRMEventId);

                        // HACK: this should set but the migration process, bob told arpan to set revobject
                        // to zero for dummy grmevents created for bvs, need to discuss
                        grmValueHeaderEventInformationDto.RevenueObjectId = baseValueSegmentRevObjId;

                        string   valueHeaderEventName;
                        string   valueHeaderEventType;
                        DateTime?valueHeaderEventDate = null;

                        if (grmOwnerEventInformationDto != null)
                        {
                            valueHeaderEventName = grmValueHeaderEventInformationDto.Description;
                            valueHeaderEventType = grmValueHeaderEventInformationDto.EventType;
                            valueHeaderEventDate = grmValueHeaderEventInformationDto.EffectiveDate;
                        }
                        else
                        {
                            valueHeaderEventName = Constants.EventUnknownName;
                            valueHeaderEventType = Constants.EventUnknownName;
                        }

                        var subComponentDetailDtos = _baseValueSegmentRepository.GetSubComponentDetails(baseValueSegmentRevObjId, assessmentEventDate).Result.ToList();

                        foreach (var value in bvsValueHeader.BaseValueSegmentValues)
                        {
                            var subComponentDetail = subComponentDetailDtos.FirstOrDefault(x => x.SubComponentId == value.SubComponent);

                            if (subComponentDetail is null)
                            {
                                continue;
                            }

                            var ownerSpecificEventDocument = allTheOwnersDocuments.SingleOrDefault(x => x.GrmEventId == bvsOwner.GRMEventId);

                            string beneficialInterest;
                            string docNumber;

                            decimal?percentageInterestGain = null;

                            if (ownerSpecificEventDocument != null)
                            {
                                beneficialInterest     = ownerSpecificEventDocument.LegalPartyDisplayName;
                                docNumber              = ownerSpecificEventDocument.DocNumber;
                                percentageInterestGain = ownerSpecificEventDocument.PctGain;
                            }
                            else
                            {
                                var legalPartyRole = (await _legalPartyDomain.GetLegalPartyRole(bvsOwner.LegalPartyRoleId, assessmentEventDate));

                                beneficialInterest = legalPartyRole.LegalParty.DisplayName;
                                docNumber          = Constants.DocumentUnknownName;
                            }

                            // now build dto
                            var detail = new DetailDto
                            {
                                BeneficialInterest     = beneficialInterest,
                                DocNumber              = docNumber,
                                PercentageInterestGain = percentageInterestGain,

                                OwnershipEventName = ownerEventName,
                                OwnershipEventType = ownerEventType,
                                OwnershipEventDate = ownerEventDate,

                                BaseValueSegmentEventName = valueHeaderEventName,
                                BaseValueSegmentEventType = valueHeaderEventType,
                                BaseValueSegmentEventDate = valueHeaderEventDate,

                                BiPercentage = bvsOwner.BeneficialInterestPercent,

                                ComponentName       = subComponentDetail.Component,
                                SubComponentName    = subComponentDetail.SubComponent,
                                SubComponentId      = subComponentDetail.SubComponentId,
                                BaseYear            = bvsValueHeader.BaseYear,
                                OwnerIsOverride     = bvsOwner.IsOverride,
                                ComponentIsOverride = bvsValueHeader.BaseValueSegmentValues.Any(x => x.IsOverride == true && x.SubComponent == subComponentDetail.SubComponentId),
                                OwnerId             = bvsOwner.Id,
                                AssessmentEventDate = assessmentEventDate,
                                ValueHeaderId       = bvsValueHeader.Id
                            };

                            list.Add(detail);
                        }
                    }
                }
            }

            return(list.ToArray());
        }
        public async Task <IEnumerable <BvsHistoryDetailDto> > GetBaseValueSegmentHistoryAsync(string pin, DateTime fromDate,
                                                                                               DateTime toDate)
        {
            List <BvsHistoryDetailDto> bvsHistoryDetails = new List <BvsHistoryDetailDto>();

            var revenueObject = _revenueObjectRepository.GetByPin(pin).Result;

            if (revenueObject == null)
            {
                return(bvsHistoryDetails);
            }

            var revenueObjectId = revenueObject.Id;

            //Retrieve core Base Value Segment History entities which contains id's required to retrieve all details for
            //Base Value Segment HistoryDetail
            var baseValueSegmentHistoryDtos =
                _baseValueSegmentRepository.GetBaseValueSegmentHistory(revenueObjectId, fromDate, toDate).Result.ToList();

            if (baseValueSegmentHistoryDtos.Count == 0)
            {
                return(bvsHistoryDetails);
            }

            //Retrieve GrmEvent Information
            //
            //Build GrmEvent Search object
            var grmEventSearchDto = new GrmEventSearchDto();
            var grmEventIdList    = new List <int>();
            // get owner grm event ids
            var ownerGrmEventIds = baseValueSegmentHistoryDtos.Select(t => t.OwnerGrmEventId).Distinct();

            grmEventIdList.AddRange(ownerGrmEventIds);
            // get value header grm event ids
            var valueHeaderGrmEventIds = baseValueSegmentHistoryDtos.Select(t => t.ValueHeaderGrmEventId).Distinct();

            grmEventIdList.AddRange(valueHeaderGrmEventIds);
            if (grmEventIdList.Count == 0)
            {
                return(bvsHistoryDetails);
            }
            grmEventSearchDto.GrmEventIdList.AddRange(grmEventIdList.Distinct());
            // call service with search object to get grm events
            var grmEventInformationDtos   = (await _grmEventRepository.SearchAsync(grmEventSearchDto)).ToList();
            var baseValueSegmentEventDtos =
                _baseValueSegmentRepository.GetEventsAsync(revenueObjectId).Result.ToList();


            //Retrieve Original BVS Event and Date
            var firstBaseValueSegmentEventDto = baseValueSegmentEventDtos.Last();
            var grmFirstEventSearchDto        = new GrmEventSearchDto();

            grmFirstEventSearchDto.GrmEventIdList.Add(firstBaseValueSegmentEventDto.GRMEventId.Value);

            //Retrieve Legal Party Roles
            IEnumerable <int> legalPartyRoleIds = baseValueSegmentHistoryDtos.Select(t => t.LegalPartyRoleId).Distinct().ToList();

            //Retrieve SubComponent Details and Market Value/Restricted Value
            var subComponentDetailDtos       = new List <SubComponentDetailDto>();
            var marketAndRestrictedValueDtos = new List <MarketAndRestrictedValueDto>();
            var legalPartyDocumentDtos       = new List <LegalPartyDocumentDto>();

            var asOfDates = baseValueSegmentHistoryDtos.Where(t => t.AsOf >= fromDate && t.AsOf <= toDate).Select(t => t.AsOf).Distinct().OrderByDescending(t => t.Date);

            foreach (DateTime asOfDate in asOfDates)
            {
                var subComponentDetailAsOfDate = _baseValueSegmentRepository.GetSubComponentDetails(revenueObjectId, asOfDate).Result.ToList();
                subComponentDetailDtos.AddRange(subComponentDetailAsOfDate);

                var marketAndRestrictedValueAsOfDate = (await _revenueObjectRepository.Get(revenueObjectId, asOfDate)).MarketAndRestrictedValues.ToList();
                marketAndRestrictedValueDtos.AddRange(marketAndRestrictedValueAsOfDate);


                var legalPartySearchDto = new LegalPartySearchDto();
                legalPartySearchDto.LegalPartyRoleIdList.AddRange(legalPartyRoleIds);
                legalPartySearchDto.EffectiveDate = asOfDate;
                var legalPartyDocumentsAsOfDate = (await _legalPartyRepository.SearchAsync(legalPartySearchDto)).ToList();
                legalPartyDocumentDtos.AddRange(legalPartyDocumentsAsOfDate);
            }

            foreach (BaseValueSegmentHistoryDto bvsHistoryDto in baseValueSegmentHistoryDtos)
            {
                var bvsHistoryDetail = new BvsHistoryDetailDto();

                //BaseValueSegment
                //
                bvsHistoryDetail.BaseValue = bvsHistoryDto.BaseValue;
                bvsHistoryDetail.BaseYear  = bvsHistoryDto.BaseYear;
                bvsHistoryDetail.BeneficialInterestPercentage = bvsHistoryDto.BeneficialInterestPercentage;
                bvsHistoryDetail.BvsTransactionType           = bvsHistoryDto.BvsTransactionType;

                //LegalParty
                //

                var currentLegalPartyDocument =
                    legalPartyDocumentDtos.FirstOrDefault(t => t.LegalPartyRoleId == bvsHistoryDto.LegalPartyRoleId);
                if (currentLegalPartyDocument == null)
                {
                    _logger.LogWarning($"Missing LegalPartyRoleId: {bvsHistoryDto.LegalPartyRoleId}");
                    continue;
                }

                bvsHistoryDetail.BeneficialInterest    = currentLegalPartyDocument.LegalPartyDisplayName;
                bvsHistoryDetail.DocumentNumber        = currentLegalPartyDocument.DocNumber;
                bvsHistoryDetail.PercentInterestGained = currentLegalPartyDocument.PctGain;

                //Component
                //Same logic as in CreateComponents for handling not finding the subcomponents
                var currentComponent = subComponentDetailDtos.FirstOrDefault(t => t.SubComponentId == bvsHistoryDto.SubComponentId);
                if (currentComponent != null)
                {
                    bvsHistoryDetail.Component    = currentComponent.Component;
                    bvsHistoryDetail.SubComponent = currentComponent.SubComponent;
                }
                else
                {
                    bvsHistoryDetail.Component    = Constants.ComponentUnknownName;
                    bvsHistoryDetail.SubComponent = Constants.SubComponentUnknownName;
                }

                //Market/Restricted Value
                //Same logic as in CreateComponents for handling not finding the subcomponents
                //
                bvsHistoryDetail.MarketValue     = 0;
                bvsHistoryDetail.RestrictedValue = 0;
                if (marketAndRestrictedValueDtos.Count != 0)
                {
                    var currentMmarketAndRestrictedValue = marketAndRestrictedValueDtos.FirstOrDefault(t => t.SubComponent == bvsHistoryDto.SubComponentId);
                    if (currentMmarketAndRestrictedValue != null)
                    {
                        bvsHistoryDetail.MarketValue     = currentMmarketAndRestrictedValue.MarketValue;
                        bvsHistoryDetail.RestrictedValue = currentMmarketAndRestrictedValue.RestrictedValue;
                    }
                }

                //Event Date/Type
                //if (grmEventInformationDtos.Any(t => t.GrmEventId == bvsHistoryDto.OwnerGrmEventId))
                if (grmEventInformationDtos.Any(t => t.GrmEventId == bvsHistoryDto.ValueHeaderGrmEventId))
                {
                    var currentGrmEventInformation = grmEventInformationDtos.First(t => t.GrmEventId == bvsHistoryDto.ValueHeaderGrmEventId);
                    bvsHistoryDetail.EventDate         = currentGrmEventInformation.EffectiveDate;
                    bvsHistoryDetail.EventType         = currentGrmEventInformation.Description;
                    bvsHistoryDetail.OriginalEventDate = currentGrmEventInformation.EffectiveDate;
                    bvsHistoryDetail.OriginalEventType = currentGrmEventInformation.Description;
                }
                else
                {
                    var currentGrmEventInformation = grmEventInformationDtos[0];
                    bvsHistoryDetail.EventDate         = currentGrmEventInformation.EffectiveDate;
                    bvsHistoryDetail.EventType         = currentGrmEventInformation.Description;
                    bvsHistoryDetail.OriginalEventDate = currentGrmEventInformation.EffectiveDate;
                    bvsHistoryDetail.OriginalEventType = currentGrmEventInformation.Description;
                }

                bvsHistoryDetails.Add(bvsHistoryDetail);
            }

            return(bvsHistoryDetails);
        }
        private ComponentDto[] CreateComponents(BaseValueSegmentTransactionDto bvsTransaction,
                                                List <GrmEventInformationDto> grmEventInformationDtos,
                                                DateTime baseValueSegmentAsOfDate,
                                                int baseValueSegmentRevObjId,
                                                DateTime assessmentEventDate,
                                                int assessmentEventType)
        {
            var componentDtos = new List <ComponentDto>();

            // now build segments and base value segment per subComponents
            foreach (var bvsValueHeader in bvsTransaction.BaseValueSegmentValueHeaders)
            {
                // per meeting  with bob do not error out if grm even information is missing, return unknown
                var grmEventInformationDto = grmEventInformationDtos.FirstOrDefault(grm => grm.GrmEventId == bvsValueHeader.GRMEventId);
                if (grmEventInformationDto == null)
                {
                    continue;
                }

                grmEventInformationDto.RevenueObjectId = baseValueSegmentRevObjId;

                var eventName     = grmEventInformationDto.Description;
                var eventType     = grmEventInformationDto.EventType;
                var eventDate     = string.Format("{0:d}", grmEventInformationDto.EventDate);
                var effectiveDate = string.Format("{0:d}", grmEventInformationDto.EffectiveDate);

                var subComponentDetailDtos = _baseValueSegmentRepository.GetSubComponentDetails(baseValueSegmentRevObjId, baseValueSegmentAsOfDate).Result.ToList();

                // Build Component dto
                var component = new ComponentDto
                {
                    EventName     = eventName,
                    EventType     = eventType,
                    EventDate     = eventDate,
                    EffectiveDate = effectiveDate,
                    EventId       = bvsValueHeader.GRMEventId,
                    BaseYear      = bvsValueHeader.BaseYear,
                    FbyvAsOfYear  = (grmEventInformationDto.EventDate.Month < 7) ? grmEventInformationDto.EventDate.Year : grmEventInformationDto.EventDate.Year + 1,
                    ValueHeaderId = bvsValueHeader.Id
                };

                // Build Component Details
                var componentDetails = new List <ComponentDetailDto>();
                foreach (var value in bvsValueHeader.BaseValueSegmentValues)
                {
                    var subComponentDetail = subComponentDetailDtos.FirstOrDefault(x => x.SubComponentId == value.SubComponent);

                    int    componentId      = -1;
                    int    subComponentId   = -1;
                    string componentName    = Constants.ComponentUnknownName;
                    string subComponentName = Constants.SubComponentUnknownName;

                    if (subComponentDetail != null)
                    {
                        componentId      = subComponentDetail.ComponentTypeId;
                        subComponentId   = subComponentDetail.SubComponentId;
                        componentName    = subComponentDetail.Component;
                        subComponentName = subComponentDetail.SubComponent;
                    }


                    // build new component detail dto
                    var componentDetail = new ComponentDetailDto
                    {
                        ComponentId    = componentId,
                        Component      = componentName,
                        SubComponentId = subComponentId,
                        SubComponent   = subComponentName,
                        BaseValue      = decimal.Truncate(value.ValueAmount),
                        // ReSharper disable once PossibleInvalidOperationException
                        ValueId = value.Id.Value
                    };
                    var fbyvDetail = _baseValueSegmentRepository.GetFactorBaseYearValueDetail(assessmentEventDate,
                                                                                              bvsValueHeader.BaseYear, value.ValueAmount, assessmentEventType);

                    componentDetail.Fbyv       = fbyvDetail.Result.Fbyv;
                    componentDetail.IsOverride = value.IsOverride;
                    componentDetails.Add(componentDetail);
                }

                component.IsOverride       = bvsValueHeader.BaseValueSegmentValues.All(x => x.IsOverride == true);
                component.ComponentDetails = componentDetails;
                componentDtos.Add(component);
            }

            //Add default sorting
            componentDtos = componentDtos.OrderBy(x => x.BaseYear)
                            .ThenBy(x => x.EffectiveDate).ToList();

            return(componentDtos.ToArray());
        }