public async Task UpdateReferralsAsync(OpportunityItemDto dto)
        {
            var existingReferrals = _referralRepository.GetManyAsync(r => r.OpportunityItemId == dto.OpportunityItemId)
                                    .ToList();

            var newReferrals = _mapper.Map <List <Referral> >(dto.Referral);

            foreach (var nr in newReferrals)
            {
                nr.OpportunityItemId = dto.OpportunityItemId;
            }

            var comparer    = new ReferralEqualityComparer();
            var toBeAdded   = newReferrals.Except(existingReferrals, comparer).ToList();
            var same        = existingReferrals.Intersect(newReferrals, comparer).ToList();
            var toBeDeleted = existingReferrals.Except(same).ToList();

            Referral Find(Referral referral) => existingReferrals.First(r => r.Id == referral.Id);

            var deleteReferrals = toBeDeleted.Select(Find).ToList();
            await _referralRepository.DeleteManyAsync(deleteReferrals);

            await _referralRepository.CreateManyAsync(toBeAdded);

            var updateReferrals = same.Select(Find).ToList();
            await _referralRepository.UpdateManyAsync(updateReferrals);
        }
Exemple #2
0
        public When_OpportunityService_Is_Called_To_Update_Referrals()
        {
            var httpContextAccessor = Substitute.For <IHttpContextAccessor>();

            httpContextAccessor.HttpContext.Returns(new DefaultHttpContext
            {
                User = new ClaimsPrincipal(new ClaimsIdentity(new[]
                {
                    new Claim(ClaimTypes.GivenName, "adminUserName")
                }))
            });

            var config = new MapperConfiguration(c =>
            {
                c.AddMaps(typeof(OpportunityMapper).Assembly);
                c.ConstructServicesUsing(type =>
                                         type.Name.Contains("LoggedInUserEmailResolver") ?
                                         new LoggedInUserEmailResolver <ReferralDto, Domain.Models.Referral>(httpContextAccessor) :
                                         type.Name.Contains("LoggedInUserNameResolver") ?
                                         (object)new LoggedInUserNameResolver <ReferralDto, Domain.Models.Referral>(httpContextAccessor) :
                                         type.Name.Contains("UtcNowResolver") ?
                                         new UtcNowResolver <ReferralDto, Domain.Models.Referral>(new DateTimeProvider()) :
                                         null);
            });

            var mapper = new Mapper(config);

            var opportunityRepository           = Substitute.For <IOpportunityRepository>();
            var opportunityItemRepository       = Substitute.For <IRepository <OpportunityItem> >();
            var provisionGapRepository          = Substitute.For <IRepository <ProvisionGap> >();
            var googleMapApiClient              = Substitute.For <IGoogleMapApiClient>();
            var opportunityPipelineReportWriter = Substitute.For <IFileWriter <OpportunityReportDto> >();
            var dateTimeProvider = Substitute.For <IDateTimeProvider>();

            _referralRepository = Substitute.For <IRepository <Domain.Models.Referral> >();

            var opportunityService = new OpportunityService(mapper, opportunityRepository, opportunityItemRepository,
                                                            provisionGapRepository, _referralRepository, googleMapApiClient,
                                                            opportunityPipelineReportWriter, dateTimeProvider);

            var dto = new OpportunityItemDto
            {
                Referral = new List <ReferralDto>
                {
                    new ReferralDto
                    {
                        ProviderVenueId      = 1,
                        DistanceFromEmployer = 3.5M
                    }
                }
            };

            opportunityService.UpdateReferralsAsync(dto).GetAwaiter().GetResult();
        }
        public async Task <int> CreateOpportunityItemAsync(OpportunityItemDto dto)
        {
            dto.OpportunityItemId = 0;
            var opportunityItem = _mapper.Map <OpportunityItem>(dto);

            opportunityItem.Town = await _googleMapApiClient.GetAddressDetailsAsync(opportunityItem.Postcode);

            var opportunityItemId = await _opportunityItemRepository.CreateAsync(opportunityItem);

            return(opportunityItemId);
        }
        public When_OpportunityService_Is_Called_To_Create_Opportunity_Item()
        {
            var httpContextAccessor = Substitute.For <IHttpContextAccessor>();

            httpContextAccessor.HttpContext.Returns(new DefaultHttpContext
            {
                User = new ClaimsPrincipal(new ClaimsIdentity(new[]
                {
                    new Claim(ClaimTypes.GivenName, "adminUserName")
                }))
            });

            var config = new MapperConfiguration(c =>
            {
                c.AddMaps(typeof(OpportunityMapper).Assembly);
                c.ConstructServicesUsing(type =>
                                         type.Name.Contains("LoggedInUserEmailResolver") ?
                                         new LoggedInUserEmailResolver <OpportunityItemDto, OpportunityItem>(httpContextAccessor) :
                                         type.Name.Contains("LoggedInUserNameResolver") ?
                                         (object)new LoggedInUserNameResolver <OpportunityItemDto, OpportunityItem>(httpContextAccessor) :
                                         type.Name.Contains("UtcNowResolver") ?
                                         new UtcNowResolver <OpportunityItemDto, OpportunityItem>(new DateTimeProvider()) :
                                         null);
            });
            var mapper = new Mapper(config);

            _opportunityItemRepository = Substitute.For <IRepository <OpportunityItem> >();

            _googleMapApiClient = Substitute.For <IGoogleMapApiClient>();
            _googleMapApiClient.GetAddressDetailsAsync(Arg.Is <string>(s => s == "AA1 1AA")).Returns("Coventry");

            var opportunityPipelineReportWriter = Substitute.For <IFileWriter <OpportunityReportDto> >();
            var dateTimeProvider = Substitute.For <IDateTimeProvider>();

            var opportunityRepository  = Substitute.For <IOpportunityRepository>();
            var provisionGapRepository = Substitute.For <IRepository <ProvisionGap> >();
            var referralRepository     = Substitute.For <IRepository <Domain.Models.Referral> >();

            _opportunityItemRepository.CreateAsync(Arg.Any <OpportunityItem>())
            .Returns(OpportunityItemId);

            var opportunityService = new OpportunityService(mapper, opportunityRepository, _opportunityItemRepository,
                                                            provisionGapRepository, referralRepository, _googleMapApiClient,
                                                            opportunityPipelineReportWriter, dateTimeProvider);

            var dto = new OpportunityItemDto
            {
                OpportunityId             = OpportunityId,
                OpportunityType           = OpportunityType.Referral,
                RouteId                   = 5,
                Postcode                  = "AA1 1AA",
                SearchRadius              = 10,
                JobRole                   = "Test Title",
                PlacementsKnown           = true,
                Placements                = 3,
                SearchResultProviderCount = 15,
                IsSaved                   = true,
                IsSelectedForReferral     = true,
                IsCompleted               = true,
                EmployerFeedbackSent      = true
            };

            _result = opportunityService.CreateOpportunityItemAsync(dto).GetAwaiter().GetResult();
        }