Ejemplo n.º 1
0
        public void SourceSubVacancyDictionaryTest()
        {
            //Arrange
            const int legacyApplicationId = 42;
            var       vacancyApplication  = new VacancyApplicationBuilder().WithStatus(ApplicationStatuses.Unsuccessful).WithLegacyApplicationId(legacyApplicationId).Build();
            const int applicationId       = -42;
            var       applicationIds      = new Dictionary <Guid, int>
            {
                { vacancyApplication.Id, applicationId }
            };
            var subVacancy = new SubVacancy {
                SubVacancyId = 1, VacancyId = 2, AllocatedApplicationId = legacyApplicationId, StartDate = DateTime.Now.AddDays(7), ILRNumber = "123456"
            };
            var sourceSubVacancies = new Dictionary <int, SubVacancy>
            {
                { legacyApplicationId, subVacancy }
            };

            //Act
            var applicationWithHistory = _applicationMappers.MapApplicationWithHistory(vacancyApplication, legacyApplicationId, applicationIds, new Dictionary <int, ApplicationSummary>(), new Dictionary <int, int>(), sourceSubVacancies, new Dictionary <int, Dictionary <int, int> >(), new Dictionary <int, List <ApplicationHistorySummary> >());
            var subVacancyDictionary   = _applicationMappers.MapSubVacancyDictionary(applicationWithHistory.ApplicationWithSubVacancy.SubVacancy);

            //Assert
            subVacancyDictionary["SubVacancyId"].Should().Be(subVacancy.SubVacancyId);
            subVacancyDictionary["VacancyId"].Should().Be(subVacancy.VacancyId);
            subVacancyDictionary["AllocatedApplicationId"].Should().Be(subVacancy.AllocatedApplicationId);
            subVacancyDictionary["StartDate"].Should().Be(subVacancy.StartDate);
            subVacancyDictionary["ILRNumber"].Should().Be(subVacancy.ILRNumber);
        }
        public void BulkUpsert(IList <ApplicationWithHistory> applicationsWithHistory, IDictionary <Guid, int> applicationIds)
        {
            //Bulk insert any applications with valid ids that are not already in the database
            _genericSyncRespository.BulkInsert(_applicationTable, applicationsWithHistory.Where(a => a.ApplicationWithSubVacancy.Application.ApplicationId != 0 && !applicationIds.ContainsKey(a.ApplicationWithSubVacancy.Application.ApplicationGuid)).Select(a => _applicationMappers.MapApplicationDictionary(a.ApplicationWithSubVacancy.Application)));

            //Now insert any remaining applications one at a time
            foreach (var applicationWithHistory in applicationsWithHistory.Where(a => a.ApplicationWithSubVacancy.Application.ApplicationId == 0))
            {
                //Ensure schools attended and application histories have the correct application id
                var applicationId = (int)_targetDatabase.Insert(applicationWithHistory.ApplicationWithSubVacancy.Application);
                if (applicationWithHistory.ApplicationWithSubVacancy.SchoolAttended != null)
                {
                    applicationWithHistory.ApplicationWithSubVacancy.SchoolAttended.ApplicationId = applicationId;
                }
                foreach (var applicationHistory in applicationWithHistory.ApplicationHistory)
                {
                    applicationHistory.ApplicationId = applicationId;
                }
            }

            //Finally, update existing applications
            _genericSyncRespository.BulkUpdate(_applicationTable, applicationsWithHistory.Where(a => a.ApplicationWithSubVacancy.Application.ApplicationId != 0 && applicationIds.ContainsKey(a.ApplicationWithSubVacancy.Application.ApplicationGuid)).Select(a => _applicationMappers.MapApplicationDictionary(a.ApplicationWithSubVacancy.Application)));

            //Insert new application history records
            var newApplicationHistories = applicationsWithHistory.SelectMany(a => a.ApplicationHistory).Where(a => a.ApplicationHistoryId == 0);

            _genericSyncRespository.BulkInsert(_applicationHistoryTable, newApplicationHistories.Select(ah => ah.MapApplicationHistoryDictionary()));

            //Update existing application history records
            var existingApplicationHistories = applicationsWithHistory.SelectMany(a => a.ApplicationHistory).Where(a => a.ApplicationHistoryId != 0);

            _genericSyncRespository.BulkUpdate(_applicationHistoryTable, existingApplicationHistories.Select(ah => ah.MapApplicationHistoryDictionary()));

            //Insert new schools attended
            var newSchoolsAttended = applicationsWithHistory.Where(a => a.ApplicationWithSubVacancy.SchoolAttended != null && a.ApplicationWithSubVacancy.SchoolAttended.SchoolAttendedId == 0).Select(a => a.ApplicationWithSubVacancy.SchoolAttended);

            _genericSyncRespository.BulkInsert(_schoolsAttendedTable, newSchoolsAttended.Select(sa => sa.MapSchoolAttendedDictionary()));

            //Update existing schools attended
            var existingSchoolsAttended = applicationsWithHistory.Where(a => a.ApplicationWithSubVacancy.SchoolAttended != null && a.ApplicationWithSubVacancy.SchoolAttended.SchoolAttendedId != 0).Select(a => a.ApplicationWithSubVacancy.SchoolAttended);

            _genericSyncRespository.BulkUpdate(_schoolsAttendedTable, existingSchoolsAttended.Select(sa => sa.MapSchoolAttendedDictionary()));

            var subVacancies         = applicationsWithHistory.Where(a => a.ApplicationWithSubVacancy.SubVacancy != null).Select(a => a.ApplicationWithSubVacancy.SubVacancy).ToList();
            var existingSubVacancies = _destinationSubVacancyRepository.GetApplicationSummariesByIds(subVacancies.Select(sv => sv.AllocatedApplicationId));

            //Insert new sub vacancies
            _genericSyncRespository.BulkInsert(_subVacanciesTable, subVacancies.Where(sv => !existingSubVacancies.ContainsKey(sv.AllocatedApplicationId)).Select(sv => _applicationMappers.MapSubVacancyDictionary(sv)));

            //Update existing sub vacancies
            _genericSyncRespository.BulkUpdate(_subVacanciesTable, subVacancies.Where(sv => existingSubVacancies.ContainsKey(sv.AllocatedApplicationId)).Select(sv => _applicationMappers.MapSubVacancyDictionary(sv)));

            //Patch in any changes to the applications in Mongo based on what was discovered through processing
            foreach (var applicationWithSubVacancy in applicationsWithHistory.Select(a => a.ApplicationWithSubVacancy))
            {
                if (applicationWithSubVacancy.UpdateNotes)
                {
                    _updateVacancyApplicationsRepository.UpdateApplicationNotes(applicationWithSubVacancy.Application.ApplicationGuid, applicationWithSubVacancy.Application.AllocatedTo);
                }
                if (applicationWithSubVacancy.UpdateStatusTo.HasValue)
                {
                    _updateVacancyApplicationsRepository.UpdateApplicationStatus(applicationWithSubVacancy.Application.ApplicationGuid, applicationWithSubVacancy.UpdateStatusTo.Value);
                }
            }
        }