예제 #1
0
        private Organisation GetOrganisationElementValue(string key, FormAnswers formAnswers)
        {
            var orgObject                  = new Organisation();
            var organisationKey            = $"{key}{OrganisationConstants.SELECT_SUFFIX}";
            var organisationDescriptionKey = $"{key}{OrganisationConstants.DESCRIPTION_SUFFIX}";

            var value = formAnswers.Pages.SelectMany(_ => _.Answers)
                        .Where(_ => _.QuestionId.Equals(organisationKey) || _.QuestionId.Equals(organisationDescriptionKey))
                        .ToList();

            orgObject.Reference = value.FirstOrDefault(_ => _.QuestionId.Equals(organisationKey))?.Response ?? string.Empty;
            orgObject.Name      = value.FirstOrDefault(_ => _.QuestionId.Equals(organisationDescriptionKey))?.Response ?? string.Empty;

            return(orgObject);
        }
예제 #2
0
        public async Task <FWTObjectID> CreateAsync(StockportGovUK.NetStandard.Models.Verint.Organisation organisation)
        {
            _logger.LogDebug($"OrganisationService.Create: Attempting to Create - { organisation.Name }");

            if (organisation.Address != null)
            {
                organisation.Address.UPRN = await _propertyService.CheckUPRNForId(organisation.Address);
            }

            var fwtOrganisation = organisation.Map();
            var response        = await _verintConnection.createOrganisationAsync(fwtOrganisation);

            _logger.LogDebug($"OrganisationService.ResolveOrganisation: Created new organisation - { fwtOrganisation.Name.First().FullName }, { response.FLNewOrganisationID.ObjectReference.First() }");
            return(response.FLNewOrganisationID);
        }
예제 #3
0
        public int Calculate(FWTOrganisation organisationObject, StockportGovUK.NetStandard.Models.Verint.Organisation organisation)
        {
            if (organisation.Address == null ||
                organisationObject.ContactPostals == null ||
                !string.IsNullOrEmpty(organisation.Address.UPRN))
            {
                _logger.LogDebug($"AddressWeighting.Calculate - No contact postals or address null or uprn is not empty - Returning 0 - {organisation.Name}");
                return(0);
            }

            var hasMatchingPostcode = false;
            var hasMatchingNumber   = false;

            // This is effectively the same as a UPRN match (i.e. House Number and Postcode must match to be given weight)
            if (!string.IsNullOrEmpty(organisation.Address.Postcode) &&
                organisationObject.ContactPostals.Any(x => !string.IsNullOrEmpty(x.Postcode) &&
                                                      string.Equals(x.Postcode.Trim().Replace(" ", string.Empty), organisation.Address.Postcode.Trim().Replace(" ", string.Empty), StringComparison.CurrentCultureIgnoreCase)))
            {
                _logger.LogDebug($"AddressWeighting.Calculate - IS matching postcode {organisation.Address.Postcode}, {organisation.Name}");
                hasMatchingPostcode = true;
            }
            else
            {
                _logger.LogDebug($"AddressWeighting.Calculate - NON matching postcode {organisation.Address.Postcode}, {organisation.Name}");
            }

            // if (!string.IsNullOrEmpty(organisation.Address.Number) &&
            //     organisationObject.ContactPostals.Any(x => !string.IsNullOrEmpty(x.AddressNumber) &&
            //     string.Equals(x.AddressNumber.Trim(), organisation.Address.Number.ToString(), StringComparison.CurrentCultureIgnoreCase)))
            // {
            //     _logger.LogDebug($"AddressWeighting.Calculate - IS matching number {organisation.Address.Number}, {organisation.Name}");
            //     hasMatchingNumber = true;
            // }
            // else{
            //     _logger.LogDebug($"AddressWeighting.Calculate - NON matching number {organisation.Address.Number}, {organisation.Name}");
            // }

            if (hasMatchingPostcode)
            {
                _logger.LogDebug($"AddressWeighting.Calculate - IS Matching address (postcode, number) - Returning 1 - {organisation.Name}");
                return(1);
            }

            _logger.LogDebug($"AddressWeighting.Calculate - NON Matching address (postcode, number) - Returning 0 - {organisation.Name}");
            return(0);
        }
예제 #4
0
        public async Task <FWTObjectID> ResolveAsync(StockportGovUK.NetStandard.Models.Verint.Organisation organisation)
        {
            _logger.LogDebug($"OrganisationService.Resolve: Attempting to resolve { organisation.Name }");

            if (organisation.Address != null)
            {
                organisation.Address.UPRN = await _propertyService.CheckUPRNForId(organisation.Address);
            }

            var organisationObject = await MatchAsync(organisation);

            if (organisationObject != null)
            {
                return(organisationObject);
            }

            _logger.LogDebug($"OrganisationService.Resolve: No match - Creating new organisation - { organisation.Name }");
            return(await CreateAsync(organisation));
        }
예제 #5
0
        public async Task <FWTObjectID> MatchAsync(StockportGovUK.NetStandard.Models.Verint.Organisation organisation)
        {
            _logger.LogDebug($"OrganisationService.MatchAsync - Organisation: {organisation.Name.Trim()}");

            var search = new FWTPartySearch
            {
                SearchType = "organisation",
                Name       = organisation.Name.Trim()
            };

            if (!string.IsNullOrEmpty(organisation.Telephone))
            {
                search.PhoneNumber = organisation.Telephone;
            }

            if (!string.IsNullOrEmpty(organisation.Email))
            {
                search.EmailAddress = organisation.Email;
            }

            var searchResults = await _verintConnection.searchForPartyAsync(search);

            _logger.LogDebug($"OrganisationService.MatchAsync - SearchResults: { searchResults.FWTObjectBriefDetailsList.Count() }");

            FWTObjectID matchingOrganisation = null;

            if (searchResults.FWTObjectBriefDetailsList.Any() && searchResults != null)
            {
                matchingOrganisation = await GetBestMatchingOrganisationAsync(searchResults.FWTObjectBriefDetailsList.Take(50).ToArray(), organisation);

                if (matchingOrganisation != null)
                {
                    _logger.LogDebug($"OrganisationService.MatchAsync - Organisation Found: { matchingOrganisation.ObjectReference.First() }");
                    return(matchingOrganisation);
                }
            }

            _logger.LogDebug($"OrganisationService.MatchAsync - Organisation Not Found: { organisation.Name }");
            return(null);
        }
예제 #6
0
        private async Task <FWTObjectID> GetBestMatchingOrganisationAsync(FWTObjectBriefDetails[] searchResults, StockportGovUK.NetStandard.Models.Verint.Organisation organisation)
        {
            FWTOrganisation bestMatch            = null;
            FWTObjectID     bestMatchingObjectID = null;
            var             bestMatchScore       = 0;

            var tasks = new List <Task <retrieveOrganisationResponse> >();

            foreach (var result in searchResults)
            {
                tasks.Add(Task.Run(async() =>
                {
                    _logger.LogDebug($"OrganisationService.GetBestMatchingOrganisationAsync - Get core Orgnisation Record : { result.ObjectID }");
                    return(await _verintConnection.retrieveOrganisationAsync(result.ObjectID));
                }));
            }

            var results = await Task.WhenAll(tasks);

            results.ToList().ForEach((result) =>
            {
                var orgnisationResult = result.FWTOrganisation;
                var score             = 0;

                _organisationWeightings.ToList().ForEach(_ => score += _.Calculate(orgnisationResult, organisation));
                _logger.LogDebug($"OrganisationService.GetBestMatchingOrganisationAsync - Organisation: { orgnisationResult.Name } Score: { score }");

                if (score > bestMatchScore)
                {
                    bestMatchScore = score;
                    bestMatch      = orgnisationResult;
                }
            });

            if (bestMatch != null && bestMatchScore >= 3)
            {
                _logger.LogDebug($"OrganisationService.GetBestMatchingOrganisation Match Found - Organisation: {bestMatch.Name} Score: {bestMatchScore}");
                // await UpdateIndividual(bestMatch, customer);
                bestMatchingObjectID = bestMatch.BriefDetails.ObjectID;
            }

            _logger.LogDebug($"OrganisationService.GetBestMatchingOrganisation Match Not Found");
            return(bestMatchingObjectID);
        }