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); } } }