private void PopulateCategoriesCodes(ApprenticeshipSummaryUpdate vacancySummaryToIndex)
        {
            if (!string.IsNullOrEmpty(vacancySummaryToIndex.Category) &&
                !string.IsNullOrEmpty(vacancySummaryToIndex.CategoryCode) &&
                !string.IsNullOrEmpty(vacancySummaryToIndex.SubCategory) &&
                !string.IsNullOrEmpty(vacancySummaryToIndex.SubCategoryCode))
            {
                return;
            }

            var categories = _referenceDataService.GetCategories();

            if (categories == null)
            {
                _logService.Error("Reference data service return null categories");
                return;
            }

            var category = categories.FirstOrDefault(c => c.FullName == vacancySummaryToIndex.Category);

            if (category == null)
            {
                vacancySummaryToIndex.CategoryCode    = "Unknown";
                vacancySummaryToIndex.SubCategoryCode = "Unknown";
                _logService.Warn(_strictEtlValidation, "The vacancy with Id {0} has an unknown Category and SubCategory: {1} | {2}. It is likely these were deprecated", vacancySummaryToIndex.Id, vacancySummaryToIndex.Category, vacancySummaryToIndex.SubCategory);
            }
            else
            {
                vacancySummaryToIndex.CategoryCode = category.CodeName;

                var subCategory = category.SubCategories.FirstOrDefault(sc => sc.FullName == vacancySummaryToIndex.SubCategory);

                if (subCategory == null)
                {
                    vacancySummaryToIndex.CategoryCode    = "Unknown";
                    vacancySummaryToIndex.SubCategoryCode = "Unknown";
                    _logService.Warn(_strictEtlValidation, "The vacancy with Id {0} has a mismatched Category/SubCategory: {1} | {2}", vacancySummaryToIndex.Id, vacancySummaryToIndex.Category, vacancySummaryToIndex.SubCategory);
                }
                else
                {
                    vacancySummaryToIndex.SubCategoryCode = subCategory.CodeName;
                }
            }
        }
        public void QueueVacancyIfExpiring(ApprenticeshipSummaryUpdate vacancySummary, int aboutToExpireThreshold)
        {
            try
            {
                if (vacancySummary.ClosingDate < DateTime.UtcNow.AddHours(aboutToExpireThreshold))
                {
                    _logService.Debug("Queueing expiring vacancy");

                    var vacancyAboutToExpireMessage = new VacancyAboutToExpire {
                        Id = vacancySummary.Id
                    };
                    _serviceBus.PublishMessage(vacancyAboutToExpireMessage);
                }
            }
            catch (Exception ex)
            {
                _logService.Warn("Failed queueing expiring vacancy {0}", ex, vacancySummary.Id);
            }
        }
        public void ShouldQueueTheVacancyIfTheVacancyIsAboutToExpire()
        {
            const int aVacancyId = 5;

            var processor = new ApprenticeshipSummaryUpdateProcessor(
                _logService.Object,
                _serviceBus.Object,
                _configurationService.Object,
                _vacancyIndexer.Object,
                _referenceDataService.Object);

            var vacancySummary = new ApprenticeshipSummaryUpdate
            {
                Id          = aVacancyId,
                ClosingDate = DateTime.UtcNow.AddHours(VacancyAboutToExpireNotificationHours - 1)
            };

            processor.QueueVacancyIfExpiring(vacancySummary, VacancyAboutToExpireNotificationHours);

            _serviceBus.Verify(x => x.PublishMessage(It.Is <VacancyAboutToExpire>(m => m.Id == aVacancyId)));
        }
 public void Process(ApprenticeshipSummaryUpdate vacancySummaryToIndex)
 {
     PopulateCategoriesCodes(vacancySummaryToIndex);
     _vacancyIndexerService.Index(vacancySummaryToIndex);
     QueueVacancyIfExpiring(vacancySummaryToIndex, _vacancyAboutToExpireThreshold);
 }