public DomainVacancy Update(DomainVacancy entity)
        {
            _logger.Debug("Calling database to update apprenticeship vacancy with id={0}", entity.VacancyId);

            _logger.Info(
                $"[{entity.VacancyGuid}] Calling database to update the following vacancy: {JsonConvert.SerializeObject(entity, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new ExcludeLiveClosingDateResolver() })}");

            UpdateEntityTimestamps(entity); // Do we need this?

            var dbVacancy = _mapper.Map <DomainVacancy, Vacancy>(entity);

            PopulateIds(entity, dbVacancy);

            var previousVacancyState = GetBy(entity.VacancyId);

            _logger.Info(
                $"[{entity.VacancyGuid}] Calling database to update the following vacancy: {JsonConvert.SerializeObject(dbVacancy, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new ExcludeLiveClosingDateResolver() })}");

            _getOpenConnection.UpdateSingle(dbVacancy);

            SaveTextFieldsFor(dbVacancy.VacancyId, entity);
            SaveAdditionalQuestionsFor(dbVacancy.VacancyId, entity);
            SaveCommentsFor(dbVacancy.VacancyId, entity);

            UpdateVacancyHistory(previousVacancyState, dbVacancy);

            _logger.Debug("Updated apprenticeship vacancy with to database with id={0}", entity.VacancyId);

            return(GetByMapped(entity.VacancyId));
        }
 private void SaveCommentsFor(int vacancyId, DomainVacancy entity)
 {
     SaveComment(vacancyId, ReferralCommentCodeName.TitleComment, entity.TitleComment);
     SaveComment(vacancyId, ReferralCommentCodeName.ApprenticeshipLevelComment, entity.ApprenticeshipLevelComment);
     SaveComment(vacancyId, ReferralCommentCodeName.ClosingDateComment, entity.ClosingDateComment);
     SaveComment(vacancyId, ReferralCommentCodeName.ContactDetailsComment, entity.ContactDetailsComment); // Maybe CFS
     SaveComment(vacancyId, ReferralCommentCodeName.DesiredQualificationsComment, entity.DesiredQualificationsComment);
     SaveComment(vacancyId, ReferralCommentCodeName.DesiredSkillsComment, entity.DesiredSkillsComment);
     SaveComment(vacancyId, ReferralCommentCodeName.DurationComment, entity.DurationComment);
     SaveComment(vacancyId, ReferralCommentCodeName.EmployerDescriptionComment, entity.EmployerDescriptionComment);
     SaveComment(vacancyId, ReferralCommentCodeName.EmployerWebsiteUrlComment, entity.EmployerWebsiteUrlComment);
     SaveComment(vacancyId, ReferralCommentCodeName.FirstQuestionComment, entity.FirstQuestionComment);
     SaveComment(vacancyId, ReferralCommentCodeName.SecondQuestionComment, entity.SecondQuestionComment);
     SaveComment(vacancyId, ReferralCommentCodeName.FrameworkCodeNameComment, entity.FrameworkCodeNameComment);
     SaveComment(vacancyId, ReferralCommentCodeName.FutureProspectsComment, entity.FutureProspectsComment);
     SaveComment(vacancyId, ReferralCommentCodeName.LongDescriptionComment, entity.LongDescriptionComment);
     SaveComment(vacancyId, ReferralCommentCodeName.NumberOfPositionsComment, entity.NumberOfPositionsComment);
     SaveComment(vacancyId, ReferralCommentCodeName.OfflineApplicationInstructionsComment, entity.OfflineApplicationInstructionsComment);
     SaveComment(vacancyId, ReferralCommentCodeName.OfflineApplicationUrlComment, entity.OfflineApplicationUrlComment);
     SaveComment(vacancyId, ReferralCommentCodeName.PersonalQualitiesComment, entity.PersonalQualitiesComment);
     SaveComment(vacancyId, ReferralCommentCodeName.PossibleStartDateComment, entity.PossibleStartDateComment);
     SaveComment(vacancyId, ReferralCommentCodeName.SectorCodeNameComment, entity.SectorCodeNameComment); // Or needs a new one?
     SaveComment(vacancyId, ReferralCommentCodeName.ShortDescriptionComment, entity.ShortDescriptionComment);
     SaveComment(vacancyId, ReferralCommentCodeName.StandardIdComment, entity.StandardIdComment);
     SaveComment(vacancyId, ReferralCommentCodeName.ThingsToConsiderComment, entity.ThingsToConsiderComment);
     SaveComment(vacancyId, ReferralCommentCodeName.TrainingProvidedComment, entity.TrainingProvidedComment);
     SaveComment(vacancyId, ReferralCommentCodeName.WageComment, entity.WageComment);
     SaveComment(vacancyId, ReferralCommentCodeName.WorkingWeekComment, entity.WorkingWeekComment);
     SaveComment(vacancyId, ReferralCommentCodeName.LocationAddressesComment, entity.LocationAddressesComment);
     SaveComment(vacancyId, ReferralCommentCodeName.AdditionalLocationInformationComment, entity.AdditionalLocationInformationComment);
     SaveComment(vacancyId, ReferralCommentCodeName.AnonymousEmployerReasonComment, entity.AnonymousEmployerReasonComment);
     SaveComment(vacancyId, ReferralCommentCodeName.AnonymousAboutTheEmployerComment, entity.AnonymousAboutTheEmployerComment);
     SaveComment(vacancyId, ReferralCommentCodeName.AnonymousEmployerDescriptionComment, entity.AnonymousEmployerDescriptionComment);
 }
        public DomainVacancy Create(DomainVacancy entity)
        {
            _logger.Debug("Calling database to save apprenticeship vacancy with id={0}", entity.VacancyId);

            _logger.Info(
                $"[{entity.VacancyGuid}] Calling database to create the following domain vacancy: {JsonConvert.SerializeObject(entity, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new ExcludeLiveClosingDateResolver() })}");

            UpdateEntityTimestamps(entity);

            var dbVacancy = _mapper.Map <DomainVacancy, Vacancy>(entity);

            PopulateIds(entity, dbVacancy);

            _logger.Info(
                $"[{entity.VacancyGuid}] Calling database to create the following database vacancy: {JsonConvert.SerializeObject(dbVacancy, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new ExcludeLiveClosingDateResolver() })}");

            dbVacancy.VacancyId = (int)_getOpenConnection.Insert(dbVacancy);

            SaveTextFieldsFor(dbVacancy.VacancyId, entity);
            SaveAdditionalQuestionsFor(dbVacancy.VacancyId, entity);

            CreateVacancyHistoryRow(dbVacancy.VacancyId, _currentUserService.CurrentUserName, VacancyHistoryEventType.StatusChange,
                                    (int)entity.Status, StatusChangeText);

            _logger.Debug("Saved apprenticeship vacancy to database with id={0}", entity.VacancyId);

            return(_mapper.Map <Vacancy, DomainVacancy>(dbVacancy));
        }
 private void SaveTextFieldsFor(int vacancyId, DomainVacancy entity)
 {
     SaveTextField(vacancyId, TextFieldCodeName.TrainingProvided, entity.TrainingProvided);
     SaveTextField(vacancyId, TextFieldCodeName.DesiredQualifications, entity.DesiredQualifications);
     SaveTextField(vacancyId, TextFieldCodeName.DesiredSkills, entity.DesiredSkills);
     SaveTextField(vacancyId, TextFieldCodeName.PersonalQualities, entity.PersonalQualities);
     SaveTextField(vacancyId, TextFieldCodeName.ThingsToConsider, entity.ThingsToConsider);
     SaveTextField(vacancyId, TextFieldCodeName.FutureProspects, entity.FutureProspects);
 }
 private void PopulateIds(DomainVacancy entity, Vacancy dbVacancy)
 {
     PopulateCountyId(entity, dbVacancy);
     PopulateVacancyLocationTypeId(entity, dbVacancy);
     PopulateApprenticeshipTypeId(entity, dbVacancy);
     PopulateFrameworkId(entity, dbVacancy);
     PopulateSectorId(entity, dbVacancy);
     PopulateLocalAuthorityId(entity, dbVacancy);
 }
 private void UpdateEntityTimestamps(DomainVacancy entity)
 {
     // determine whether this is a "new" entity being saved for the first time
     if (entity.CreatedDateTime == _dateTimeService.MinValue)
     {
         entity.CreatedDateTime = _dateTimeService.UtcNow;
         entity.UpdatedDateTime = null;
     }
     else
     {
         entity.UpdatedDateTime = _dateTimeService.UtcNow;
     }
 }
        private void PopulateCountyId(DomainVacancy entity, Vacancy dbVacancy)
        {
            if (!string.IsNullOrWhiteSpace(entity.Address?.County))
            {
                dbVacancy.CountyId = _getOpenConnection.QueryCached <int>(_cacheDuration, @"
SELECT CountyId
FROM   dbo.County
WHERE  FullName = @CountyFullName",
                                                                          new
                {
                    CountyFullName = entity.Address.County
                }).SingleOrDefault();
            }
        }
        private void PopulateVacancyLocationTypeId(DomainVacancy entity, Vacancy dbVacancy)
        {
            // A vacancy is multilocation if IsEmployerAddressMainAddress is set to false
            var vacancyLocationTypeCodeName = entity.IsEmployerLocationMainApprenticeshipLocation.HasValue && entity.IsEmployerLocationMainApprenticeshipLocation.Value
                ? "STD"
                : "MUL";

            dbVacancy.VacancyLocationTypeId = _getOpenConnection.QueryCached <int>(_cacheDuration, @"
SELECT VacancyLocationTypeId
FROM   dbo.VacancyLocationType
WHERE  CodeName = @VacancyLocationTypeCodeName",
                                                                                   new
            {
                VacancyLocationTypeCodeName = vacancyLocationTypeCodeName
            }).Single();
        }
        private void PopulateSectorId(DomainVacancy entity, Vacancy dbVacancy)
        {
            if (!string.IsNullOrWhiteSpace(entity.SectorCodeName))
            {
                dbVacancy.SectorId = _getOpenConnection.QueryCached <int>(_cacheDuration, @"
SELECT ApprenticeshipOccupationId
FROM   dbo.ApprenticeshipOccupation
WHERE  CodeName = @SectorCodeName",
                                                                          new
                {
                    entity.SectorCodeName
                }).Single();
            }
            else
            {
                dbVacancy.SectorId = null;
            }
        }
        private void PopulateLocalAuthorityId(DomainVacancy entity, Vacancy dbVacancy)
        {
            if (!string.IsNullOrWhiteSpace(entity.LocalAuthorityCode))
            {
                dbVacancy.LocalAuthorityId = _getOpenConnection.QueryCached <int>(_cacheDuration, @"
SELECT LocalAuthorityId
FROM   dbo.LocalAuthority
WHERE  CodeName LIKE '%' + @LocalAuthorityCode",
                                                                                  new
                {
                    entity.LocalAuthorityCode
                }).Single();
            }
            else
            {
                dbVacancy.LocalAuthorityId = null;
            }
        }
        private void PopulateApprenticeshipTypeId(DomainVacancy entity, Vacancy dbVacancy)
        {
            if (entity.VacancyType == VacancyType.Traineeship)
            {
                dbVacancy.ApprenticeshipType = _getOpenConnection.QueryCached <int>(_cacheDuration, @"
SELECT ApprenticeshipTypeId
FROM   dbo.ApprenticeshipType
WHERE  CodeName = 'TRA'").Single();
                return;
            }

            dbVacancy.ApprenticeshipType = _getOpenConnection.QueryCached <int>(_cacheDuration, @"
SELECT ApprenticeshipTypeId
FROM   dbo.ApprenticeshipType at JOIN Reference.EducationLevel el ON at.EducationLevelId = el.EducationLevelId
WHERE  el.CodeName = @EducationLevel",
                                                                                new
            {
                EducationLevel = (int)entity.ApprenticeshipLevel
            }).Single();     // There's a better way to do this?
        }
        private void PatchTrainingType(DomainVacancy result)
        {
            if (result?.TrainingType != TrainingType.Unknown)
            {
                return;
            }

            if (!string.IsNullOrWhiteSpace(result.SectorCodeName))
            {
                result.TrainingType = TrainingType.Sectors;
            }
            else if (result?.StandardId != null)
            {
                result.TrainingType = TrainingType.Standards;
            }
            else if (!string.IsNullOrWhiteSpace(result.FrameworkCodeName))
            {
                result.TrainingType = TrainingType.Frameworks;
            }
        }
        private void PopulateFrameworkId(DomainVacancy entity, Vacancy dbVacancy)
        {
            if (!string.IsNullOrWhiteSpace(entity.FrameworkCodeName))
            {
                dbVacancy.ApprenticeshipFrameworkId = _getOpenConnection.QueryCached <int>(_cacheDuration, @"
SELECT ApprenticeshipFrameworkId
FROM   dbo.ApprenticeshipFramework
WHERE  CodeName = @FrameworkCodeName",
                                                                                           new
                {
                    entity.FrameworkCodeName
                }).Single();
            }
            else
            {
                dbVacancy.ApprenticeshipFrameworkId = null;
            }

            if (entity.VacancyType == VacancyType.Traineeship)
            {
                dbVacancy.ApprenticeshipFrameworkId = TraineeshipFrameworkId;
            }
        }
 private string MapExpectedDuration(DomainVacancy vacancy)
 {
     return(!vacancy.Duration.HasValue
         ? vacancy.ExpectedDuration
         : new Duration(vacancy.DurationType, vacancy.Duration).GetDisplayText());
 }
 private void SaveAdditionalQuestionsFor(int vacancyId, DomainVacancy entity)
 {
     UpsertAdditionalQuestion(vacancyId, 1, entity.FirstQuestion);
     UpsertAdditionalQuestion(vacancyId, 2, entity.SecondQuestion);
 }