public void Parses_TrainingCode_Correctly_For_Frameworks()
        {
            var approvalsEvent = new ApprenticeshipCreatedEvent
            {
                AccountId = 12345,
                StartDate = DateTime.Today.AddMonths(-12),
                AccountLegalEntityPublicHashedId = "1234567890",
                AgreedOn         = DateTime.Today.AddMonths(-13),
                ApprenticeshipId = 12,
                CreatedOn        = DateTime.Today.AddMonths(-14),
                EndDate          = DateTime.Today.AddYears(1),
                LegalEntityName  = "Test Employer",
                ProviderId       = 1234,
                TrainingCode     = "460-3-2",
                TrainingType     = ProgrammeType.Framework,
                TransferSenderId = 123456,
                Uln           = "123456",
                PriceEpisodes = new PriceEpisode[]
                {
                    new PriceEpisode {
                        FromDate = DateTime.Today.AddMonths(-12), Cost = 1000M, ToDate = DateTime.Today.AddDays(-1)
                    },
                    new PriceEpisode {
                        FromDate = DateTime.Today, Cost = 1200M
                    }
                }
            };
            var model = Mapper.Map <ApprenticeshipModel>(approvalsEvent);

            model.ProgrammeType.Should().Be(3);
            model.FrameworkCode.Should().Be(460);
            model.PathwayCode.Should().Be(2);
        }
        public void Defaults_Programme_Type_To_25_For_Standards()
        {
            var approvalsEvent = new ApprenticeshipCreatedEvent
            {
                AccountId = 12345,
                StartDate = DateTime.Today.AddMonths(-12),
                AccountLegalEntityPublicHashedId = "1234567890",
                AgreedOn         = DateTime.Today.AddMonths(-13),
                ApprenticeshipId = 12,
                CreatedOn        = DateTime.Today.AddMonths(-14),
                EndDate          = DateTime.Today.AddYears(1),
                LegalEntityName  = "Test Employer",
                ProviderId       = 1234,
                TrainingCode     = "52",
                TrainingType     = ProgrammeType.Standard,
                TransferSenderId = 123456,
                Uln           = "123456",
                PriceEpisodes = new PriceEpisode[]
                {
                    new PriceEpisode {
                        FromDate = DateTime.Today.AddMonths(-12), Cost = 1000M, ToDate = DateTime.Today.AddDays(-1)
                    },
                    new PriceEpisode {
                        FromDate = DateTime.Today, Cost = 1200M
                    }
                }
            };
            var model = Mapper.Map <ApprenticeshipModel>(approvalsEvent);

            model.ProgrammeType.Should().Be(25);
        }
        public void Apprenticeship_Created_Defaults_Is_Levy_Payer_To_True()
        {
            var approvalsEvent = new ApprenticeshipCreatedEvent
            {
                AccountId = 12345,
                StartDate = DateTime.Today.AddMonths(-12),
                AccountLegalEntityPublicHashedId = "1234567890",
                AgreedOn         = DateTime.Today.AddMonths(-13),
                ApprenticeshipId = 12,
                CreatedOn        = DateTime.Today.AddMonths(-14),
                EndDate          = DateTime.Today.AddYears(1),
                LegalEntityName  = "Test Employer",
                ProviderId       = 1234,
                TrainingCode     = "460-3-2",
                TrainingType     = ProgrammeType.Framework,
                TransferSenderId = 123456,
                Uln           = "123456",
                PriceEpisodes = new PriceEpisode[]
                {
                    new PriceEpisode {
                        FromDate = DateTime.Today.AddMonths(-12), Cost = 1000M, ToDate = DateTime.Today.AddDays(-1)
                    },
                    new PriceEpisode {
                        FromDate = DateTime.Today, Cost = 1200M
                    }
                }
            };
            var model = Mapper.Map <ApprenticeshipModel>(approvalsEvent);

            model.IsLevyPayer.Should().BeTrue();
        }
        public async Task Process(ApprenticeshipCreatedEvent createdEvent)
        {
            try
            {
                logger.LogDebug($"Now processing the apprenticeship created event. " +
                                $"Apprenticeship id: {createdEvent.ApprenticeshipId}, " +
                                $"employer account id: {createdEvent.AccountId}, " +
                                $"Ukprn: {createdEvent.ProviderId}.");
                var model      = mapper.Map <ApprenticeshipModel>(createdEvent);
                var duplicates = await apprenticeshipService.NewApprenticeship(model).ConfigureAwait(false);

                logger.LogDebug($"Apprenticeship saved to database. " +
                                $"Apprenticeship id: {createdEvent.ApprenticeshipId}, " +
                                $"employer account id: {createdEvent.AccountId}, " +
                                $"Ukprn: {createdEvent.ProviderId}.");

                var updatedEvent = mapper.Map <ApprenticeshipUpdated>(model);
                updatedEvent.Duplicates = duplicates.Select(duplicate => new ApprenticeshipDuplicate
                {
                    Ukprn = duplicate.Ukprn, ApprenticeshipId = duplicate.ApprenticeshipId
                }).ToList();
                var endpointInstance = await endpointInstanceFactory.GetEndpointInstance().ConfigureAwait(false);

                await endpointInstance.Publish(updatedEvent).ConfigureAwait(false);

                logger.LogInfo($"Finished processing the apprenticeship created event. " +
                               $"Apprenticeship id: {createdEvent.ApprenticeshipId}, " +
                               $"employer account id: {createdEvent.AccountId}, " +
                               $"Ukprn: {createdEvent.ProviderId}.");
            }
            catch (ApprenticeshipAlreadyExistsException e)
            {
                logger.LogWarning($"Apprenticeship already exists while trying to add a new apprenticeship: {e.Message}\n" +
                                  $"Apprenticeship id: {createdEvent.ApprenticeshipId}, " +
                                  $"employer account id: {createdEvent.AccountId}, " +
                                  $"Ukprn: {createdEvent.ProviderId}.");
            }
            catch (InvalidOperationException e)
            {
                logger.LogError($"Unhandled exception while adding apprenticeship: {e.Message}\n" +
                                $"Apprenticeship id: {createdEvent.ApprenticeshipId}, " +
                                $"employer account id: {createdEvent.AccountId}, " +
                                $"Ukprn: {createdEvent.ProviderId}.", e);
                throw;
            }
            catch (Exception ex)
            {
                logger.LogError($"Error processing the apprenticeship event. Error: {ex.Message}", ex);
                throw;
            }
        }
コード例 #5
0
        public async Task ApprenticeshipCreated_Triggers_ApprenticeshipUpdated_Event_With_Duplicates()
        {
            var approvalsEvent = new ApprenticeshipCreatedEvent
            {
                AccountId = 12345,
                StartDate = DateTime.Today,
                AccountLegalEntityPublicHashedId = "1234567890",
                AgreedOn         = DateTime.Today.AddDays(-1),
                ApprenticeshipId = 12,
                CreatedOn        = DateTime.Today.AddDays(-2),
                EndDate          = DateTime.Today.AddYears(1),
                LegalEntityName  = "Test Employer",
                ProviderId       = 1234,
                TrainingCode     = "52",
                TrainingType     = ProgrammeType.Standard,
                TransferSenderId = 123456,
                Uln           = "123456",
                PriceEpisodes = new [] { new PriceEpisode {
                                             FromDate = DateTime.Today, Cost = 1000M
                                         } }
            };

            mocker.Mock <IApprenticeshipService>()
            .Setup(svc => svc.NewApprenticeship(It.IsAny <ApprenticeshipModel>()))
            .ReturnsAsync(() => new List <ApprenticeshipDuplicateModel>
            {
                new ApprenticeshipDuplicateModel
                {
                    Id               = 1,
                    Ukprn            = 4321,
                    Uln              = 123456,
                    ApprenticeshipId = 13
                }
            });

            var apprenticeshipProcessor = mocker.Create <ApprenticeshipProcessor>();
            await apprenticeshipProcessor.Process(approvalsEvent);

            mocker.Mock <IEndpointInstance>()
            .Verify(svc => svc.Publish(It.Is <ApprenticeshipUpdated>(ev =>
                                                                     ev.EmployerAccountId == approvalsEvent.AccountId &&
                                                                     ev.Id == approvalsEvent.ApprenticeshipId &&
                                                                     ev.Ukprn == approvalsEvent.ProviderId &&
                                                                     ev.Uln.ToString() == approvalsEvent.Uln &&
                                                                     ev.Duplicates.Count == 1 &&
                                                                     ev.Duplicates.All(duplicate => duplicate.ApprenticeshipId == 13 && duplicate.Ukprn == 4321)),

                                       It.IsAny <PublishOptions>()), Times.Once);
        }
        public void Maps_ApprenticeshipCreatedEvent_To_ApprenticeshipModel()
        {
            var approvalsEvent = new ApprenticeshipCreatedEvent
            {
                AccountId = 12345,
                StartDate = DateTime.Today.AddMonths(-12),
                AccountLegalEntityPublicHashedId = "1234567890",
                AgreedOn         = DateTime.Today.AddMonths(-13),
                ApprenticeshipId = 12,
                CreatedOn        = DateTime.Today.AddMonths(-14),
                EndDate          = DateTime.Today.AddYears(1),
                LegalEntityName  = "Test Employer",
                ProviderId       = 1234,
                TrainingCode     = "52",
                TrainingType     = ProgrammeType.Standard,
                TransferSenderId = 123456,
                Uln           = "123456",
                PriceEpisodes = new PriceEpisode[]
                {
                    new PriceEpisode {
                        FromDate = DateTime.Today.AddMonths(-12), Cost = 1000M, ToDate = DateTime.Today.AddDays(-1)
                    },
                    new PriceEpisode {
                        FromDate = DateTime.Today, Cost = 1200M
                    }
                }
            };
            var model = Mapper.Map <ApprenticeshipModel>(approvalsEvent);

            model.AccountId.Should().Be(approvalsEvent.AccountId);
            model.AgreedOnDate.Should().Be(approvalsEvent.AgreedOn);
            model.AgreementId.Should().Be(approvalsEvent.AccountLegalEntityPublicHashedId);
            model.EstimatedEndDate.Should().Be(approvalsEvent.EndDate);
            model.EstimatedStartDate.Should().Be(approvalsEvent.StartDate);
            model.StandardCode.ToString().Should().Be(approvalsEvent.TrainingCode);
            model.Id.Should().Be(approvalsEvent.ApprenticeshipId);
            model.LegalEntityName.Should().Be(approvalsEvent.LegalEntityName);
            model.Status.Should().Be(ApprenticeshipStatus.Active);
            model.StopDate.Should().BeNull();
            model.TransferSendingEmployerAccountId.Should().Be(approvalsEvent.TransferSenderId);
            model.Ukprn.Should().Be(approvalsEvent.ProviderId);
            model.Uln.ToString().Should().Be(approvalsEvent.Uln);
            model.ApprenticeshipPriceEpisodes.Count.Should().Be(approvalsEvent.PriceEpisodes.Length);
            approvalsEvent.PriceEpisodes.All(pe => model.ApprenticeshipPriceEpisodes.Any(ape =>
                                                                                         ape.StartDate == pe.FromDate && ape.Cost == pe.Cost && ape.EndDate == pe.ToDate)).Should().BeTrue();
        }
コード例 #7
0
        public void ProcessCreatedEvent_WithExistingApprenticeship_DoesNotFail()
        {
            var approvalsEvent = new ApprenticeshipCreatedEvent
            {
                AccountId        = 12345,
                TransferSenderId = 123456,
            };

            mocker.Mock <IApprenticeshipService>().Setup(x => x.NewApprenticeship(It.Is <ApprenticeshipModel>(model =>
                                                                                                              model.AccountId == 12345 &&
                                                                                                              model.TransferSendingEmployerAccountId == 123456
                                                                                                              ))).Throws(new ApprenticeshipAlreadyExistsException(1));

            var sut = mocker.Create <ApprenticeshipProcessor>();

            Func <Task> action = async() => await sut.Process(approvalsEvent);

            action.Should().NotThrow();
        }
コード例 #8
0
        public async Task Processes_ApprenticeshipCreated()
        {
            var approvalsEvent = new ApprenticeshipCreatedEvent
            {
                AccountId = 12345,
                StartDate = DateTime.Today,
                AccountLegalEntityPublicHashedId = "1234567890",
                AgreedOn         = DateTime.Today.AddDays(-1),
                ApprenticeshipId = 12,
                CreatedOn        = DateTime.Today.AddDays(-2),
                EndDate          = DateTime.Today.AddYears(1),
                LegalEntityName  = "Test Employer",
                ProviderId       = 1234,
                TrainingCode     = "52",
                TrainingType     = ProgrammeType.Standard,
                TransferSenderId = 123456,
                Uln           = "123456",
                PriceEpisodes = new [] { new PriceEpisode {
                                             FromDate = DateTime.Today, Cost = 1000M
                                         } }
            };

            mocker.Mock <IApprenticeshipService>()
            .Setup(svc => svc.NewApprenticeship(It.IsAny <ApprenticeshipModel>()))
            .ReturnsAsync(() => new List <ApprenticeshipDuplicateModel>());

            var apprenticeshipProcessor = mocker.Create <ApprenticeshipProcessor>();
            await apprenticeshipProcessor.Process(approvalsEvent);

            mocker.Mock <IApprenticeshipService>()
            .Verify(svc => svc.NewApprenticeship(It.Is <ApprenticeshipModel>(model =>
                                                                             model.AccountId == approvalsEvent.AccountId &&
                                                                             model.Id == approvalsEvent.ApprenticeshipId &&
                                                                             model.Ukprn == approvalsEvent.ProviderId &&
                                                                             model.Uln.ToString() == approvalsEvent.Uln)
                                                 ), Times.Once);
        }
コード例 #9
0
        public async Task Process(ApprenticeshipCreatedEvent createdEvent)
        {
            try
            {
                logger.LogDebug($"Now processing the apprenticeship created event. Apprenticeship id: {createdEvent.ApprenticeshipId}, employer account id: {createdEvent.AccountId}, Ukprn: {createdEvent.ProviderId}.");
                var model      = mapper.Map <ApprenticeshipModel>(createdEvent);
                var duplicates = await apprenticeshipService.NewApprenticeship(model).ConfigureAwait(false);

                var updatedEvent = mapper.Map <ApprenticeshipUpdated>(model);
                updatedEvent.Duplicates = duplicates.Select(duplicate => new ApprenticeshipDuplicate {
                    Ukprn = duplicate.Ukprn, ApprenticeshipId = duplicate.ApprenticeshipId
                }).ToList();
                var endpointInstance = await endpointInstanceFactory.GetEndpointInstance().ConfigureAwait(false);

                await endpointInstance.Publish(updatedEvent).ConfigureAwait(false);

                logger.LogInfo($"Finished processing the apprenticeship created event. Apprenticeship id: {createdEvent.ApprenticeshipId}, employer account id: {createdEvent.AccountId}, Ukprn: {createdEvent.ProviderId}.");
            }
            catch (Exception ex)
            {
                logger.LogError($"Error processing the apprenticeship event. Error: {ex.Message}", ex);
                throw;
            }
        }
        public bool IsValid(ApprenticeshipEmployerType apprenticeshipEmployerType, Apprenticeship apprenticeship, ApprenticeshipCreatedEvent apprenticeshipCreatedEvent)
        {
            var isValid = apprenticeshipCreatedEvent.ApprenticeshipId == apprenticeship.Id &&
                          apprenticeshipCreatedEvent.CreatedOn.Date == DateTime.UtcNow.Date &&
                          apprenticeshipCreatedEvent.AgreedOn == apprenticeship.Cohort.EmployerAndProviderApprovedOn &&
                          apprenticeshipCreatedEvent.AccountId == apprenticeship.Cohort.EmployerAccountId &&
                          apprenticeshipCreatedEvent.AccountLegalEntityPublicHashedId == apprenticeship.Cohort.AccountLegalEntity.PublicHashedId &&
                          apprenticeshipCreatedEvent.LegalEntityName == apprenticeship.Cohort.AccountLegalEntity.Name &&
                          apprenticeshipCreatedEvent.ProviderId == apprenticeship.Cohort.Provider.UkPrn &&
                          apprenticeshipCreatedEvent.TransferSenderId == apprenticeship.Cohort.TransferSenderId &&
                          apprenticeshipCreatedEvent.ApprenticeshipEmployerTypeOnApproval == apprenticeshipEmployerType &&
                          apprenticeshipCreatedEvent.Uln == apprenticeship.Uln &&
                          apprenticeshipCreatedEvent.TrainingType == apprenticeship.ProgrammeType.Value &&
                          apprenticeshipCreatedEvent.TrainingCode == apprenticeship.CourseCode &&
                          apprenticeshipCreatedEvent.StartDate == apprenticeship.StartDate.Value &&
                          apprenticeshipCreatedEvent.EndDate == apprenticeship.EndDate.Value &&
                          apprenticeshipCreatedEvent.PriceEpisodes.Count() == apprenticeship.PriceHistory.Count;

            for (var i = 0; i < apprenticeship.PriceHistory.Count; i++)
            {
                var priceHistory = apprenticeship.PriceHistory.ElementAt(i);
                var priceEpisode = apprenticeshipCreatedEvent.PriceEpisodes.ElementAtOrDefault(i);

                isValid = isValid &&
                          priceEpisode?.FromDate == priceHistory.FromDate &
                          priceEpisode?.ToDate == priceHistory.ToDate &
                          priceEpisode?.Cost == priceHistory.Cost;
            }

            return(isValid);
        }
 public Task Handle(ApprenticeshipCreatedEvent message, IMessageHandlerContext context)
 {
     return(Log(message, context));
 }