Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FAI-413 legal entity bug #1151

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using Esfa.Recruit.Employer.Web.Orchestrators;
using Esfa.Recruit.Employer.Web.RouteModel;
using Esfa.Recruit.Employer.Web.ViewModels.Preview;
using Esfa.Recruit.Employer.Web.ViewModels.VacancyPreview;
using Esfa.Recruit.Shared.Web.Extensions;
using Esfa.Recruit.Shared.Web.ViewModels;
using Microsoft.AspNetCore.Mvc;
Expand All @@ -26,9 +27,13 @@ public VacancyCheckYourAnswersController (VacancyTaskListOrchestrator orchestrat

public async Task<IActionResult> CheckYourAnswers(VacancyRouteModel vrm)
{
var viewModel = await _orchestrator.GetVacancyTaskListModel(vrm);
var viewModel = await _orchestrator.GetVacancyTaskListModel(vrm, User.ToVacancyUser());
viewModel.CanHideValidationSummary = true;
viewModel.SetSectionStates(viewModel, ModelState);
if (viewModel.TaskListSectionFourState == VacancyTaskListSectionState.InProgress)
{
return RedirectToRoute(RouteNames.EmployerTaskListGet);
}

if (TempData.ContainsKey(TempDataKeys.VacancyClonedInfoMessage))
viewModel.VacancyClonedInfoMessage = TempData[TempDataKeys.VacancyClonedInfoMessage].ToString();
Expand Down Expand Up @@ -60,7 +65,7 @@ public async Task<IActionResult> CheckYourAnswers(SubmitReviewModel m)
{
VacancyId = m.VacancyId,
EmployerAccountId = m.EmployerAccountId
});
}, User.ToVacancyUser());
viewModel.SoftValidationErrors = null;
viewModel.SubmitToEsfa = m.SubmitToEsfa;
viewModel.RejectedReason = m.RejectedReason;
Expand Down Expand Up @@ -91,7 +96,7 @@ public async Task<IActionResult> CheckYourAnswers(SubmitEditModel m)
throw new Exception("Unknown submit state");
}

var viewModel = await _orchestrator.GetVacancyTaskListModel(m);
var viewModel = await _orchestrator.GetVacancyTaskListModel(m, User.ToVacancyUser());
viewModel.SoftValidationErrors = null;
viewModel.SetSectionStates(viewModel, ModelState);
viewModel.ValidationErrors = new ValidationSummaryViewModel
Expand Down
22 changes: 4 additions & 18 deletions src/Employer/Employer.Web/Controllers/VacancyManageController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -111,26 +111,12 @@ private void EnsureProposedChangesCookiesAreCleared(Guid vacancyId)

private IActionResult HandleRedirectOfEditableVacancy(Vacancy vacancy)
{
if (_feature.IsFeatureEnabled(FeatureNames.EmployerTaskList))
if (_utility.IsTaskListCompleted(vacancy))
{
if (_utility.IsTaskListCompleted(vacancy))
{
return RedirectToRoute(RouteNames.EmployerCheckYourAnswersGet);
}
return RedirectToRoute(RouteNames.EmployerTaskListGet);
return RedirectToRoute(RouteNames.EmployerCheckYourAnswersGet);
}

if (_utility.VacancyHasCompletedPartOne(vacancy))
{
if (_utility.VacancyHasStartedPartTwo(vacancy) == false)
return RedirectToRoute(RouteNames.Part1Complete_Get);

return RedirectToRoute(RouteNames.Vacancy_Preview_Get);
}

var resumeRouteName = _utility.GetPermittedRoutesForVacancy(vacancy).Last();

return RedirectToRoute(resumeRouteName);
return RedirectToRoute(RouteNames.EmployerTaskListGet);

}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Threading.Tasks;
using Esfa.Recruit.Employer.Web.Configuration.Routing;
using Esfa.Recruit.Employer.Web.Extensions;
using Esfa.Recruit.Employer.Web.Orchestrators;
using Esfa.Recruit.Employer.Web.RouteModel;
using Esfa.Recruit.Employer.Web.ViewModels.VacancyPreview;
Expand Down Expand Up @@ -37,7 +38,7 @@ public async Task<IActionResult> CreateEmployerTaskList(VacancyRouteModel vrm)

public async Task<IActionResult> EmployerTaskList(VacancyRouteModel vrm)
{
var viewModel = await _orchestrator.GetVacancyTaskListModel(vrm);
var viewModel = await _orchestrator.GetVacancyTaskListModel(vrm, User.ToVacancyUser());

viewModel.SetSectionStates(viewModel, ModelState);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,12 @@ public class VacancyTaskListOrchestrator : EntityValidatingOrchestrator<Vacancy,
private readonly IReviewSummaryService _reviewSummaryService;
private readonly ILegalEntityAgreementService _legalEntityAgreementService;
private readonly IMessaging _messaging;
private readonly IRecruitVacancyClient _vacancyClient;
private const VacancyRuleSet SoftValidationRules = VacancyRuleSet.MinimumWage | VacancyRuleSet.TrainingExpiryDate;
private const VacancyRuleSet SubmitValidationRules = VacancyRuleSet.All;

public VacancyTaskListOrchestrator(ILogger<VacancyTaskListOrchestrator> logger,IRecruitVacancyClient recruitVacancyClient, IUtility utility,
IEmployerVacancyClient employerVacancyClient, DisplayVacancyViewModelMapper displayVacancyViewModelMapper,IReviewSummaryService reviewSummaryService,
ILegalEntityAgreementService legalEntityAgreementService, IMessaging messaging) : base(logger)
public VacancyTaskListOrchestrator(ILogger<VacancyTaskListOrchestrator> logger,IRecruitVacancyClient recruitVacancyClient, IUtility utility, ILegalEntityAgreementService legalEntityAgreementService, IMessaging messaging,
IEmployerVacancyClient employerVacancyClient, DisplayVacancyViewModelMapper displayVacancyViewModelMapper,IReviewSummaryService reviewSummaryService, IRecruitVacancyClient vacancyClient) : base(logger)
{
_recruitVacancyClient = recruitVacancyClient;
_utility = utility;
Expand All @@ -43,19 +43,43 @@ public VacancyTaskListOrchestrator(ILogger<VacancyTaskListOrchestrator> logger,I
_reviewSummaryService = reviewSummaryService;
_legalEntityAgreementService = legalEntityAgreementService;
_messaging = messaging;
_vacancyClient = vacancyClient;
}

public async Task<VacancyPreviewViewModel> GetVacancyTaskListModel(VacancyRouteModel vrm)
public async Task<VacancyPreviewViewModel> GetVacancyTaskListModel(VacancyRouteModel vrm, VacancyUser user)
{
var vacancyTask = _utility.GetAuthorisedVacancyForEditAsync(vrm, RouteNames.EmployerTaskListGet);
var programmesTask = _recruitVacancyClient.GetActiveApprenticeshipProgrammesAsync();
var getEmployerDataTask = _employerVacancyClient.GetEditVacancyInfoAsync(vrm.EmployerAccountId);

await Task.WhenAll(vacancyTask, programmesTask, getEmployerDataTask);

var employerInfo = getEmployerDataTask.Result;
var vacancy = vacancyTask.Result;
var programme = programmesTask.Result.SingleOrDefault(p => p.Id == vacancy.ProgrammeId);

if (employerInfo.LegalEntities.FirstOrDefault(c =>
c.AccountLegalEntityPublicHashedId.Equals(vacancy.AccountLegalEntityPublicHashedId)) == null)
{
if (employerInfo.LegalEntities.Count() == 1)
{
vacancy.LegalEntityName = employerInfo.LegalEntities.FirstOrDefault()?.Name;
vacancy.AccountLegalEntityPublicHashedId = employerInfo.LegalEntities.FirstOrDefault()?.AccountLegalEntityPublicHashedId;
}
else
{
vacancy.LegalEntityName = null;
vacancy.AccountLegalEntityPublicHashedId = null;
}
vacancy.EmployerName = null;

vacancy.EmployerLocation = null;

vacancy.EmployerNameOption = null;
vacancy.EmployerDescription = null;
await _vacancyClient.UpdateDraftVacancyAsync(vacancy, user);
}

var vm = new VacancyPreviewViewModel();
await _displayVacancyViewModelMapper.MapFromVacancyAsync(vm, vacancy);

Expand All @@ -76,7 +100,7 @@ public async Task<VacancyPreviewViewModel> GetVacancyTaskListModel(VacancyRouteM
ReviewFieldMappingLookups.GetPreviewReviewFieldIndicators());
}

vm.AccountLegalEntityCount = getEmployerDataTask.Result.LegalEntities.Count();
vm.AccountLegalEntityCount = employerInfo.LegalEntities.Count();
return vm;
}

Expand Down
177 changes: 2 additions & 175 deletions src/Employer/Employer.Web/Utility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
using Esfa.Recruit.Employer.Web.Exceptions;
using Esfa.Recruit.Employer.Web.Models;
using Esfa.Recruit.Employer.Web.RouteModel;
using Esfa.Recruit.Shared.Web.FeatureToggle;
using Esfa.Recruit.Shared.Web.Models;
using Esfa.Recruit.Shared.Web.ViewModels;
using Esfa.Recruit.Vacancies.Client.Infrastructure.Client;
Expand All @@ -24,21 +23,6 @@ public interface IUtility : IVacancyTaskListStatusService
Task<Vacancy> GetAuthorisedVacancyAsync(VacancyRouteModel vrm, string routeName);
void CheckCanEdit(Vacancy vacancy);
void CheckAuthorisedAccess(Vacancy vacancy, string employerAccountId);
void CheckRouteIsValidForVacancy(Vacancy vacancy, string currentRouteName);

/// <summary>
/// Returns a list of routes the user may access based on the current
/// state of the vacancy.
/// </summary>
/// <param name="vacancy"></param>
/// <returns>
/// - null if section 1 of the wizard is complete
/// - otherwise a list of accessible routes, where the last entry is the page to start the user on when editing the vacancy
/// </returns>
IList<string> GetPermittedRoutesForVacancy(Vacancy vacancy);

bool VacancyHasCompletedPartOne(Vacancy vacancy);
bool VacancyHasStartedPartTwo(Vacancy vacancy);
PartOnePageInfoViewModel GetPartOnePageInfo(Vacancy vacancy);
Task<ApplicationReview> GetAuthorisedApplicationReviewAsync(ApplicationReviewRouteModel rm);

Expand All @@ -49,12 +33,10 @@ Task UpdateEmployerProfile(VacancyEmployerInfoModel employerInfoModel,
public class Utility : VacancyTaskListStatusService, IUtility
{
private readonly IRecruitVacancyClient _vacancyClient;
private readonly IFeature _feature;

public Utility (IRecruitVacancyClient vacancyClient, IFeature feature)
public Utility (IRecruitVacancyClient vacancyClient)
{
_vacancyClient = vacancyClient;
_feature = feature;
}

public async Task<Vacancy> GetAuthorisedVacancyForEditAsync(VacancyRouteModel vrm, string routeName)
Expand All @@ -72,8 +54,6 @@ public async Task<Vacancy> GetAuthorisedVacancyAsync(VacancyRouteModel vrm, stri

CheckAuthorisedAccess(vacancy, vrm.EmployerAccountId);

CheckRouteIsValidForVacancy(vacancy, routeName);

return vacancy;
}

Expand All @@ -92,162 +72,9 @@ public void CheckAuthorisedAccess(Vacancy vacancy, string employerAccountId)
throw new AuthorisationException(string.Format(ExceptionMessages.UserIsNotTheOwner, OwnerType.Employer));
}

public void CheckRouteIsValidForVacancy(Vacancy vacancy, string currentRouteName)
{
var validRoutes = GetPermittedRoutesForVacancy(vacancy);

if (validRoutes == null || validRoutes.Contains(currentRouteName))
{
return;
}

var redirectRoute = validRoutes.Last();

throw new InvalidRouteForVacancyException(string.Format(RecruitWebExceptionMessages.RouteNotValidForVacancy, currentRouteName, redirectRoute),
redirectRoute, new VacancyRouteModel{ EmployerAccountId = vacancy.EmployerAccountId, VacancyId = vacancy.Id });
}

/// <summary>
/// Returns a list of routes the user may access based on the current
/// state of the vacancy.
/// </summary>
/// <param name="vacancy"></param>
/// <returns>
/// - null if section 1 of the wizard is complete
/// - otherwise a list of accessible routes, where the last entry is the page to start the user on when editing the vacancy
/// </returns>
public IList<string> GetPermittedRoutesForVacancy(Vacancy vacancy)
{
var validRoutes = new List<string>();

validRoutes.AddRange(new [] {RouteNames.Title_Post, RouteNames.Title_Get});

if (_feature.IsFeatureEnabled(FeatureNames.EmployerTaskList))
{
validRoutes.AddRange( new[]
{
RouteNames.EmployerTaskListGet,
RouteNames.EmployerCheckYourAnswersGet,
RouteNames.Employer_Post,
RouteNames.Employer_Get,
RouteNames.EmployerName_Post,
RouteNames.EmployerName_Get,
});
}

if (string.IsNullOrWhiteSpace(vacancy.Title))
return validRoutes;

validRoutes.AddRange(new[]
{
RouteNames.Training_Help_Get,
RouteNames.Training_First_Time_Post,
RouteNames.Training_First_Time_Get,
RouteNames.Training_Confirm_Post,
RouteNames.Training_Confirm_Get,
RouteNames.Training_Post,
RouteNames.Training_Get
});
if (string.IsNullOrWhiteSpace(vacancy.ProgrammeId))
return validRoutes;

validRoutes.AddRange(new[] {
RouteNames.TrainingProvider_Confirm_Post,
RouteNames.TrainingProvider_Confirm_Get,
RouteNames.TrainingProvider_Select_Post,
RouteNames.TrainingProvider_Select_Get,
RouteNames.NumberOfPositions_Post,
RouteNames.NumberOfPositions_Get
});

if (vacancy.TrainingProvider == null && string.IsNullOrWhiteSpace(vacancy.NumberOfPositions?.ToString()))
{
//Move Training Provider Get to last valid route for resuming
validRoutes.Remove(RouteNames.TrainingProvider_Select_Get);
validRoutes.Add(RouteNames.TrainingProvider_Select_Get);
}

if (_feature.IsFeatureEnabled(FeatureNames.EmployerTaskList))
{
validRoutes.AddRange(new []
{
RouteNames.ShortDescription_Get,
RouteNames.ShortDescription_Post,
RouteNames.VacancyDescription_Index_Post,
RouteNames.VacancyDescription_Index_Get,
RouteNames.Dates_Post,
RouteNames.Dates_Get,
RouteNames.Duration_Post,
RouteNames.Duration_Get,
RouteNames.Wage_Post,
RouteNames.Wage_Get,
RouteNames.Skills_Post,
RouteNames.Skills_Get,
RouteNames.Qualification_Add_Post,
RouteNames.Qualification_Delete_Post,
RouteNames.Qualification_Edit_Post,
RouteNames.Qualification_Edit_Get,
RouteNames.Qualification_Add_Get,
RouteNames.Qualifications_Get,
RouteNames.FutureProspects_Get,
RouteNames.FutureProspects_Post,
RouteNames.Considerations_Post,
RouteNames.Considerations_Get,

RouteNames.AboutEmployer_Post,
RouteNames.AboutEmployer_Get,
RouteNames.EmployerContactDetails_Post,
RouteNames.EmployerContactDetails_Get,
RouteNames.ApplicationProcess_Post,
RouteNames.ApplicationProcess_Get
});
}
else
{
if (!vacancy.NumberOfPositions.HasValue)
return validRoutes;
}


validRoutes.AddRange(new[]
{
RouteNames.LegalEntityAgreement_SoftStop_Get,
RouteNames.Location_Get,
RouteNames.Location_Post,
RouteNames.EmployerName_Post,
RouteNames.EmployerName_Get,
RouteNames.Employer_Post,
RouteNames.Employer_Get
});

if (string.IsNullOrWhiteSpace(vacancy.LegalEntityName)
|| vacancy.EmployerNameOption == null
|| string.IsNullOrWhiteSpace(vacancy.EmployerLocation?.Postcode))
return validRoutes;

validRoutes.AddRange(new[] { RouteNames.Dates_Post, RouteNames.Dates_Get });
if (vacancy.StartDate == null)
return validRoutes;

validRoutes.AddRange(new[] { RouteNames.Duration_Post, RouteNames.Duration_Get });
if (vacancy.Wage?.Duration == null)
return validRoutes;

validRoutes.AddRange(new[] { RouteNames.Wage_Post, RouteNames.Wage_Get});
if (vacancy.Wage?.WageType == null)
return validRoutes;

return null;
}

public bool VacancyHasCompletedPartOne(Vacancy vacancy)
{
if (_feature.IsFeatureEnabled(FeatureNames.EmployerTaskList))
{
return vacancy.ApplicationMethod != null;
}

return GetPermittedRoutesForVacancy(vacancy) == null;
return vacancy.ApplicationMethod != null;
}

public bool VacancyHasStartedPartTwo(Vacancy vacancy)
Expand Down
7 changes: 0 additions & 7 deletions src/Employer/Employer.Web/Views/Vacancies/Vacancies.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,6 @@
</td>
<td class="govuk-table__cell" data-label="Action">
<a id="manage-@vacancy.Id" asp-show="@vacancy.IsNotSubmittable" asp-route="@RouteNames.VacancyManage_Get" asp-route-vacancyId="@vacancy.Id" class="govuk-link">Manage</a>
<esfaFeatureEnabled name="@FeatureNames.EmployerTaskList">
@if (vacancy.Status == VacancyStatus.Referred || vacancy.Status == VacancyStatus.Rejected || vacancy.Status == VacancyStatus.Review || vacancy.IsTaskListCompleted)
{
<a id="task-list-@vacancy.Id" asp-show="@vacancy.IsSubmittable" asp-route="@RouteNames.EmployerCheckYourAnswersGet" asp-route-vacancyId="@vacancy.Id" class="govuk-link">@GetLinkText(vacancy)</a>
Expand All @@ -159,12 +158,6 @@
{
<a id="preview-@vacancy.Id" asp-show="@vacancy.IsSubmittable" asp-route="@RouteNames.EmployerTaskListGet" asp-route-vacancyId="@vacancy.Id" class="govuk-link">@GetLinkText(vacancy)</a>
}

</esfaFeatureEnabled>
<esfaFeatureDisabled name="@FeatureNames.EmployerTaskList">
<a id="task-list-@vacancy.Id" asp-show="@vacancy.IsSubmittable" asp-route="@RouteNames.DisplayVacancy_Get" asp-route-vacancyId="@vacancy.Id" class="govuk-link">@GetLinkText(vacancy)</a>
</esfaFeatureDisabled>

</td>
</tr>
}
Expand Down
Loading