public async Task <WageViewModel> GetWageViewModelAsync(VacancyRouteModel vrm) { var vacancy = await Utility.GetAuthorisedVacancyForEditAsync(_client, _vacancyClient, vrm, RouteNames.Wage_Get); var wagePeriod = _minimumWageProvider.GetWagePeriod(vacancy.StartDate.Value); var vm = new WageViewModel { WageType = vacancy.Wage?.WageType, FixedWageYearlyAmount = vacancy.Wage?.FixedWageYearlyAmount?.AsMoney(), WageAdditionalInformation = vacancy.Wage?.WageAdditionalInformation, MinimumWageStartFrom = wagePeriod.ValidFrom.ToMonthNameYearString(), NationalMinimumWageLowerBoundHourly = wagePeriod.NationalMinimumWageLowerBound.ToString("C"), NationalMinimumWageUpperBoundHourly = wagePeriod.NationalMinimumWageUpperBound.ToString("C"), NationalMinimumWageYearly = GetMinimumWageYearlyText(SFA.DAS.VacancyServices.Wage.WageType.NationalMinimum, vacancy.Wage?.WeeklyHours, vacancy.StartDate.Value), ApprenticeshipMinimumWageHourly = wagePeriod.ApprenticeshipMinimumWage.ToString("C"), ApprenticeshipMinimumWageYearly = GetMinimumWageYearlyText(SFA.DAS.VacancyServices.Wage.WageType.ApprenticeshipMinimum, vacancy.Wage?.WeeklyHours, vacancy.StartDate.Value), WeeklyHours = vacancy.Wage.WeeklyHours.Value, PageInfo = Utility.GetPartOnePageInfo(vacancy) }; if (vacancy.Status == VacancyStatus.Referred) { vm.Review = await _reviewSummaryService.GetReviewSummaryViewModelAsync(vacancy.VacancyReference.Value, ReviewFieldMappingLookups.GetWageReviewFieldIndicators()); } return(vm); }
internal static IRuleBuilderInitial <Vacancy, Vacancy> FixedWageMustBeGreaterThanApprenticeshipMinimumWage(this IRuleBuilder <Vacancy, Vacancy> ruleBuilder, IMinimumWageProvider minimumWageService) { return(ruleBuilder.Custom((vacancy, context) => { var wagePeriod = minimumWageService.GetWagePeriod(vacancy.StartDate.Value); if (vacancy.Wage.FixedWageYearlyAmount == null || vacancy.Wage.FixedWageYearlyAmount / 52 / vacancy.Wage.WeeklyHours < wagePeriod.ApprenticeshipMinimumWage) { var minimumYearlyWageForApprentices = WagePresenter.GetDisplayText(WageType.ApprenticeshipMinimum, WageUnit.Annually, new WageDetails { HoursPerWeek = vacancy.Wage.WeeklyHours, StartDate = vacancy.StartDate.Value }).AsWholeMoneyAmount(); var errorMessage = (vacancy.Status == VacancyStatus.Live) ? $"National Minimum Wage is changing from {wagePeriod.ValidFrom:d MMM yyyy}. So the fixed wage you entered before will no longer be valid. Change the date to before {wagePeriod.ValidFrom:d MMM yyyy} or to change the wage, create a new vacancy." : $"Yearly wage must be at least {minimumYearlyWageForApprentices}"; var failure = new ValidationFailure(string.Empty, errorMessage) { ErrorCode = "49", CustomState = VacancyRuleSet.MinimumWage, PropertyName = $"{nameof(Wage)}.{nameof(Wage.FixedWageYearlyAmount)}" }; context.AddFailure(failure); } })); }
public async Task <SearchResultPreviewViewModel> GetSearchResultPreviewViewModelAsync(VacancyRouteModel vrm) { var vacancy = await Utility.GetAuthorisedVacancyForEditAsync(_client, _vacancyClient, vrm, RouteNames.SearchResultPreview_Get); var wagePeriod = _wageProvider.GetWagePeriod(vacancy.StartDate.Value); var vm = new SearchResultPreviewViewModel { EmployerName = vacancy.EmployerName, NumberOfPositions = vacancy.NumberOfPositions?.ToString(), ShortDescription = vacancy.ShortDescription, ClosingDate = vacancy.ClosingDate?.AsGdsDate(), StartDate = vacancy.StartDate?.AsGdsDate(), LevelName = await GetLevelName(vacancy.ProgrammeId), Title = vacancy.Title, Wage = vacancy.Wage?.ToText(vacancy.StartDate), HasYearlyWage = (vacancy.Wage != null && vacancy.Wage.WageType != WageType.Unspecified), IsDisabilityConfident = vacancy.IsDisabilityConfident }; if (vacancy.EmployerLocation != null) { vm.MapUrl = vacancy.EmployerLocation.HasGeocode ? _mapService.GetMapImageUrl(vacancy.EmployerLocation.Latitude.ToString(), vacancy.EmployerLocation.Longitude.ToString(), MapImageWidth, MapImageHeight) : _mapService.GetMapImageUrl(vacancy.EmployerLocation?.Postcode, MapImageWidth, MapImageHeight); } return(vm); }
internal static IRuleBuilderInitial <Vacancy, Vacancy> FixedWageMustBeGreaterThanApprenticeshipMinimumWage(this IRuleBuilder <Vacancy, Vacancy> ruleBuilder, IMinimumWageProvider minimumWageService) { return(ruleBuilder.Custom((vacancy, context) => { var wagePeriod = minimumWageService.GetWagePeriod(vacancy.StartDate.Value); if (vacancy.Wage.FixedWageYearlyAmount == null || vacancy.Wage.FixedWageYearlyAmount / 52 / vacancy.Wage.WeeklyHours < wagePeriod.ApprenticeshipMinimumWage) { var errorMessage = (vacancy.Status == VacancyStatus.Live) ? $"National Minimum Wage is changing from {wagePeriod.ValidFrom:d MMM yyyy}. So the fixed wage you entered before will no longer be valid. Change the date to before {wagePeriod.ValidFrom:d MMM yyyy} or to change the wage, create a new vacancy." : $"The wage should not be less than the new National Minimum Wage for apprentices effective from {wagePeriod.ValidFrom:d MMM yyyy}"; var failure = new ValidationFailure(string.Empty, errorMessage) { ErrorCode = "49", CustomState = VacancyRuleSet.MinimumWage }; context.AddFailure(failure); } })); }
public async Task <ReviewViewModel> Map(VacancyReview review) { var vacancy = review.VacancySnapshot; var programmeTask = _vacancyClient.GetApprenticeshipProgrammeAsync(vacancy.ProgrammeId); var reviewHistoryTask = _vacancyClient.GetVacancyReviewHistoryAsync(review.VacancyReference); var approvedCountTask = _vacancyClient.GetApprovedCountAsync(vacancy.SubmittedByUser.UserId); var approvedFirstTimeCountTask = _vacancyClient.GetApprovedFirstTimeCountAsync(vacancy.SubmittedByUser.UserId); var reviewSummaryTask = _reviewSummaryService.GetReviewSummaryViewModelAsync(review.Id, ReviewFieldMappingLookups.GetPreviewReviewFieldIndicators()); await Task.WhenAll(programmeTask, approvedCountTask, approvedFirstTimeCountTask, reviewHistoryTask, reviewSummaryTask); var programme = programmeTask.Result; var historiesVm = GetReviewHistoriesViewModel(reviewHistoryTask.Result); var wagePeriod = _wageProvider.GetWagePeriod(vacancy.StartDate.Value); var vm = new ReviewViewModel(); vm.Review = reviewSummaryTask.Result; try { vm.SubmittedByName = vacancy.SubmittedByUser.Name; vm.SubmittedByEmail = vacancy.SubmittedByUser.Email; vm.ApplicationInstructions = vacancy.ApplicationInstructions; vm.ApplicationMethod = vacancy.ApplicationMethod.Value; vm.ApplicationUrl = vacancy.ApplicationUrl; vm.ContactName = vacancy.EmployerContact?.Name; vm.ContactEmail = vacancy.EmployerContact?.Email; vm.ContactTelephone = vacancy.EmployerContact?.Phone; vm.ClosingDate = vacancy.ClosingDate?.AsGdsDate(); vm.EmployerDescription = vacancy.EmployerDescription; vm.EmployerName = vacancy.EmployerName; vm.EmployerWebsiteUrl = vacancy.EmployerWebsiteUrl; SetEmployerAddressElements(vm, vacancy); vm.IsDisabilityConfident = vacancy.IsDisabilityConfident; vm.NumberOfPositionsCaption = $"{"position".ToQuantity(vacancy.NumberOfPositions.Value)} available"; vm.OutcomeDescription = vacancy.OutcomeDescription; vm.PossibleStartDate = vacancy.StartDate?.AsGdsDate(); vm.ProviderName = vacancy.TrainingProvider.Name; vm.Qualifications = vacancy.Qualifications.SortQualifications(_qualifications.Value).AsText(); vm.ShortDescription = vacancy.ShortDescription; vm.Skills = vacancy.Skills ?? Enumerable.Empty <string>(); vm.ThingsToConsider = vacancy.ThingsToConsider; vm.Title = vacancy.Title; vm.TrainingDescription = vacancy.TrainingDescription; vm.VacancyDescription = vacancy.Description; vm.VacancyReferenceNumber = $"VAC{vacancy.VacancyReference}"; vm.TrainingTitle = programme.Title; vm.TrainingType = programme.ApprenticeshipType.GetDisplayName(); vm.TrainingLevel = programme.Level.GetDisplayName(); vm.ExpectedDuration = (vacancy.Wage.DurationUnit.HasValue && vacancy.Wage.Duration.HasValue) ? vacancy.Wage.DurationUnit.Value.GetDisplayName().ToQuantity(vacancy.Wage.Duration.Value) : null; vm.HoursPerWeek = $"{vacancy.Wage.WeeklyHours:0.##}"; vm.WageInfo = vacancy.Wage.WageAdditionalInformation; vm.WageText = vacancy.StartDate.HasValue ? vacancy.Wage.ToText(vacancy.StartDate) : null; vm.WorkingWeekDescription = vacancy.Wage.WorkingWeekDescription; vm.SubmittedDate = vacancy.SubmittedDate.Value; vm.VacancyReviewsApprovedCount = approvedCountTask.Result; vm.VacancyReviewsApprovedFirstTimeCount = approvedFirstTimeCountTask.Result; vm.FieldIdentifiers = await GetFieldIdentifiersViewModel(review); vm.ReviewerComment = review.ManualQaComment; vm.ReviewHistories = historiesVm; vm.IsResubmission = review.SubmissionCount > 1; vm.ReviewerName = review.ReviewedByUser.Name; vm.ReviewedDate = review.ReviewedDate.GetValueOrDefault(); vm.ManualOutcome = review.ManualOutcome; if (review.Status == ReviewStatus.Closed) { vm.PageTitle = GetPageTitle(historiesVm, review.Id, review.ManualOutcome); } vm.AutomatedQaResults = GetAutomatedQaResultViewModel(review); } catch (NullReferenceException ex) { _logger.LogError(ex, "Unable to map vacancy to view model. Unexpected null fields."); throw; } return(vm); }