Skip to content

Commit e7e4d57

Browse files
committed
Test
1 parent c4483b4 commit e7e4d57

File tree

8 files changed

+274
-49
lines changed

8 files changed

+274
-49
lines changed

DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/SelfAssessmentDataService.cs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
namespace DigitalLearningSolutions.Data.DataServices.SelfAssessmentDataService
22
{
3-
using System;
4-
using System.Collections.Generic;
5-
using System.Data;
6-
using System.Linq;
73
using Dapper;
84
using DigitalLearningSolutions.Data.Models.Common.Users;
95
using DigitalLearningSolutions.Data.Models.External.Filtered;
106
using DigitalLearningSolutions.Data.Models.Frameworks;
117
using DigitalLearningSolutions.Data.Models.SelfAssessments;
128
using DigitalLearningSolutions.Data.Models.SelfAssessments.Export;
139
using Microsoft.Extensions.Logging;
10+
using System;
11+
using System.Collections.Generic;
12+
using System.Data;
13+
using System.Linq;
1414

1515
public interface ISelfAssessmentDataService
1616
{
@@ -171,6 +171,7 @@ int GetSelfAssessmentActivityDelegatesExportCount(string searchString, string so
171171
ActivitySummaryCompetencySelfAssesment? GetActivitySummaryCompetencySelfAssesment(int CandidateAssessmentSupervisorVerificationsId);
172172
bool IsUnsupervisedSelfAssessment(int selfAssessmentId);
173173
bool IsCentreSelfAssessment(int selfAssessmentId, int centreId);
174+
bool HasMinimumOptionalCompetencies(int selfAssessmentId, int delegateUserId);
174175
}
175176

176177
public partial class SelfAssessmentDataService : ISelfAssessmentDataService
@@ -729,5 +730,24 @@ public bool IsCentreSelfAssessment(int selfAssessmentId, int centreId)
729730
);
730731
return ResultCount > 0;
731732
}
733+
734+
public bool HasMinimumOptionalCompetencies(int selfAssessmentId, int delegateUserId)
735+
{
736+
return connection.ExecuteScalar<bool>(
737+
@"SELECT CASE WHEN COUNT(SAS.ID)>=(SELECT MinimumOptionalCompetencies FROM SelfAssessments WHERE ID = @selfAssessmentId)
738+
THEN 1 ELSE 0 END AS HasMinimumOptionalCompetencies
739+
FROM CandidateAssessmentOptionalCompetencies AS CAOC
740+
INNER JOIN CandidateAssessments AS CA
741+
ON CAOC.CandidateAssessmentID = CA.ID AND CA.SelfAssessmentID = @selfAssessmentId
742+
AND CA.DelegateUserID = @delegateUserId AND CA.RemovedDate IS NULL
743+
INNER JOIN SelfAssessmentStructure AS SAS
744+
ON CAOC.CompetencyID = SAS.CompetencyID AND CAOC.CompetencyGroupID = SAS.CompetencyGroupID
745+
AND SAS.SelfAssessmentID = @selfAssessmentId
746+
INNER JOIN SelfAssessments AS SA
747+
ON SAS.SelfAssessmentID = SA.ID
748+
WHERE (CAOC.IncludedInSelfAssessment = 1)",
749+
new { selfAssessmentId, delegateUserId }
750+
);
751+
}
732752
}
733753
}

DigitalLearningSolutions.Web/Controllers/LearningPortalController/SelfAssessment.cs

Lines changed: 73 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
namespace DigitalLearningSolutions.Web.Controllers.LearningPortalController
22
{
3-
using System;
4-
using System.Collections.Generic;
5-
using System.Linq;
6-
using System.Net;
7-
using System.Text.Json;
8-
using System.Threading.Tasks;
93
using DigitalLearningSolutions.Data.Enums;
4+
using DigitalLearningSolutions.Data.Helpers;
105
using DigitalLearningSolutions.Data.Models.Centres;
6+
using DigitalLearningSolutions.Data.Models.Common;
117
using DigitalLearningSolutions.Data.Models.SearchSortFilterPaginate;
128
using DigitalLearningSolutions.Data.Models.SelfAssessments;
139
using DigitalLearningSolutions.Data.Models.SessionData.SelfAssessments;
@@ -19,19 +15,19 @@
1915
using DigitalLearningSolutions.Web.ViewModels.Common.SearchablePage;
2016
using DigitalLearningSolutions.Web.ViewModels.LearningPortal.Current;
2117
using DigitalLearningSolutions.Web.ViewModels.LearningPortal.SelfAssessments;
22-
using Microsoft.AspNetCore.Mvc;
23-
using Microsoft.Extensions.Logging;
2418
using GDS.MultiPageFormData.Enums;
25-
using DigitalLearningSolutions.Data.Helpers;
26-
using DigitalLearningSolutions.Web.Services;
27-
using DigitalLearningSolutions.Web.ViewModels.TrackingSystem.Delegates.ViewDelegate;
28-
using DocumentFormat.OpenXml.EMMA;
29-
using DigitalLearningSolutions.Data.Models.Supervisor;
30-
using DigitalLearningSolutions.Data.Models.Common;
19+
using Microsoft.AspNetCore.Mvc;
3120
using Microsoft.AspNetCore.Mvc.Rendering;
3221
using Microsoft.AspNetCore.Mvc.ViewEngines;
3322
using Microsoft.AspNetCore.Mvc.ViewFeatures;
23+
using Microsoft.Extensions.Logging;
24+
using System;
25+
using System.Collections.Generic;
3426
using System.IO;
27+
using System.Linq;
28+
using System.Net;
29+
using System.Text.Json;
30+
using System.Threading.Tasks;
3531

3632
public partial class LearningPortalController
3733
{
@@ -426,6 +422,55 @@ public IActionResult AddSelfAssessmentOverviewFilter(SearchSelfAssessmentOvervie
426422
return RedirectToAction("FilteredSelfAssessmentGroups", model);
427423
}
428424

425+
[ServiceFilter(typeof(IsCentreAuthorizedSelfAssessment))]
426+
[Route("LearningPortal/SelfAssessment/{selfAssessmentId}/{vocabulary}/AddOptional")]
427+
public IActionResult AddOptionalCompetencies(int selfAssessmentId, string vocabulary)
428+
{
429+
var delegateUserId = User.GetUserIdKnownNotNull();
430+
var assessment = selfAssessmentService.GetSelfAssessmentForCandidateById(delegateUserId, selfAssessmentId);
431+
if (assessment == null)
432+
{
433+
logger.LogWarning(
434+
$"Attempt to display self assessment overview for user {delegateUserId} with no self assessment"
435+
);
436+
return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
437+
}
438+
439+
var optionalCompetencies = selfAssessmentService.GetCandidateAssessmentOptionalCompetencies(selfAssessmentId, delegateUserId);
440+
if (optionalCompetencies.Any())
441+
{
442+
if (!selfAssessmentService.HasMinimumOptionalCompetencies(selfAssessmentId, delegateUserId))
443+
{
444+
var model = new AddOptionalCompetenciesViewModel { SelfAssessment = assessment };
445+
return View("SelfAssessments/AddOptionalCompetencies", model);
446+
}
447+
}
448+
449+
return RedirectToAction("SelfAssessmentOverview", new { selfAssessmentId, vocabulary });
450+
}
451+
452+
[HttpPost]
453+
[Route("LearningPortal/SelfAssessment/{selfAssessmentId}/{vocabulary}/AddOptional")]
454+
public IActionResult AddOptionalCompetencies(AddOptionalCompetenciesViewModel test)
455+
{
456+
//var delegateUserId = User.GetUserIdKnownNotNull();
457+
//var selfAssessmentId = test.SelfAssessment.Id;
458+
//var vocabulary = test.VocabPlural().ToString();
459+
460+
//var assessment = selfAssessmentService.GetSelfAssessmentForCandidateById(delegateUserId, test.SelfAssessment.Id);
461+
//if (assessment == null)
462+
//{
463+
// logger.LogWarning(
464+
// $"Attempt to display self assessment overview for user {delegateUserId} with no self assessment"
465+
// );
466+
// return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
467+
//}
468+
var a = 1;
469+
var b = "2";
470+
471+
return RedirectToAction("SelfAssessmentOverview", new { a, b });
472+
}
473+
429474
[ServiceFilter(typeof(IsCentreAuthorizedSelfAssessment))]
430475
[Route("LearningPortal/SelfAssessment/{selfAssessmentId}/{vocabulary}/{competencyGroupId}")]
431476
[Route("LearningPortal/SelfAssessment/{selfAssessmentId}/{vocabulary}")]
@@ -479,7 +524,7 @@ public IActionResult SelfAssessmentOverview(int selfAssessmentId, string vocabul
479524
CompetencyGroups = competencies.GroupBy(competency => competency.CompetencyGroup),
480525
PreviousCompetencyNumber = Math.Max(competencies.Count(), 1),
481526
NumberOfOptionalCompetencies = optionalCompetencies.Count(),
482-
NumberOfSelfAssessedOptionalCompetencies = optionalCompetencies.Count(x => x.IncludedInSelfAssessment ) ,
527+
NumberOfSelfAssessedOptionalCompetencies = optionalCompetencies.Count(x => x.IncludedInSelfAssessment),
483528
SupervisorSignOffs = supervisorSignOffs,
484529
SearchViewModel = searchViewModel
485530
};
@@ -495,6 +540,7 @@ public IActionResult SelfAssessmentOverview(int selfAssessmentId, string vocabul
495540
ViewBag.SupervisorSelfAssessmentReview = assessment.SupervisorSelfAssessmentReview;
496541
return View("SelfAssessments/SelfAssessmentOverview", model);
497542
}
543+
498544
[HttpPost]
499545
[ServiceFilter(typeof(IsCentreAuthorizedSelfAssessment))]
500546
[SetDlsSubApplication(nameof(DlsSubApplication.LearningPortal))]
@@ -1440,8 +1486,9 @@ public IActionResult SubmitVerification()
14401486

14411487
[ServiceFilter(typeof(IsCentreAuthorizedSelfAssessment))]
14421488
[Route("/LearningPortal/SelfAssessment/{selfAssessmentId:int}/{vocabulary}/Optional")]
1443-
public IActionResult ManageOptionalCompetencies(int selfAssessmentId)
1489+
public IActionResult ManageOptionalCompetencies(int selfAssessmentId, string isFromAddOptional = null)
14441490
{
1491+
ModelState.Remove("isFromAddOptional");
14451492
var delegateUserId = User.GetUserIdKnownNotNull();
14461493
var assessment = selfAssessmentService.GetSelfAssessmentForCandidateById(delegateUserId, selfAssessmentId);
14471494
var optionalCompetencies =
@@ -1463,6 +1510,12 @@ public IActionResult ManageOptionalCompetencies(int selfAssessmentId)
14631510
CompetencyGroups = optionalCompetencies.GroupBy(competency => competency.CompetencyGroup),
14641511
IncludedSelfAssessmentStructureIds = includedSelfAssessmentStructureIds,
14651512
};
1513+
1514+
if (!string.IsNullOrEmpty(isFromAddOptional))
1515+
{
1516+
ViewBag.AddOptionalVocab = model.VocabPlural();
1517+
}
1518+
14661519
return View("SelfAssessments/ManageOptionalCompetencies", model);
14671520
}
14681521

@@ -1645,23 +1698,23 @@ public IActionResult WithdrawSupervisorSignOffRequest(
16451698
);
16461699
}
16471700

1648-
1701+
16491702
[Route("/LearningPortal/selfAssessments/{CandidateAssessmentId:int}/{vocabulary}/Certificate")]
16501703

16511704
public IActionResult CompetencySelfAssessmentCertificate(int CandidateAssessmentId, string vocabulary)
16521705
{
16531706
int supervisorDelegateId = 0;
16541707
var adminId = User.GetAdminId();
1655-
var competencymaindata = selfAssessmentService.GetCompetencySelfAssessmentCertificate(CandidateAssessmentId);
1656-
if ((competencymaindata == null)|| ( competencymaindata.LearnerId != User.GetUserIdKnownNotNull()) || (CandidateAssessmentId == 0))
1708+
var competencymaindata = selfAssessmentService.GetCompetencySelfAssessmentCertificate(CandidateAssessmentId);
1709+
if ((competencymaindata == null) || (competencymaindata.LearnerId != User.GetUserIdKnownNotNull()) || (CandidateAssessmentId == 0))
16571710
{
16581711
return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
16591712
}
16601713
var delegateUserId = competencymaindata.LearnerId;
16611714
if (vocabulary == "Supervise")
16621715
{
16631716
var supervisorDelegateDetails = supervisorService.GetSupervisorDelegateDetailsForAdminId(adminId.Value);
1664-
var checkSupervisorDelegate = supervisorDelegateDetails.Where(x=> x.DelegateUserID == competencymaindata.LearnerId).FirstOrDefault();
1717+
var checkSupervisorDelegate = supervisorDelegateDetails.Where(x => x.DelegateUserID == competencymaindata.LearnerId).FirstOrDefault();
16651718
if (checkSupervisorDelegate == null)
16661719
{
16671720
return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });

DigitalLearningSolutions.Web/Services/SelfAssessmentService.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
namespace DigitalLearningSolutions.Web.Services
22
{
3-
using System;
4-
using System.Collections.Generic;
5-
using System.Linq;
6-
using AngleSharp.Attributes;
73
using DigitalLearningSolutions.Data.DataServices.SelfAssessmentDataService;
8-
using DigitalLearningSolutions.Data.Models.Centres;
94
using DigitalLearningSolutions.Data.Models.Common.Users;
105
using DigitalLearningSolutions.Data.Models.External.Filtered;
116
using DigitalLearningSolutions.Data.Models.Frameworks;
127
using DigitalLearningSolutions.Data.Models.SelfAssessments;
138
using DigitalLearningSolutions.Data.Models.SelfAssessments.Export;
9+
using System;
10+
using System.Collections.Generic;
11+
using System.Linq;
1412

1513
public interface ISelfAssessmentService
1614
{
@@ -150,6 +148,7 @@ public int GetSelfAssessmentActivityDelegatesExportCount(string searchString, st
150148
bool IsUnsupervisedSelfAssessment(int selfAssessmentId);
151149
IEnumerable<CandidateAssessment> GetCandidateAssessments(int delegateUserId, int selfAssessmentId);
152150
bool IsCentreSelfAssessment(int selfAssessmentId, int centreId);
151+
bool HasMinimumOptionalCompetencies(int selfAssessmentId, int delegateUserId);
153152

154153
}
155154

@@ -554,5 +553,10 @@ public bool IsCentreSelfAssessment(int selfAssessmentId, int centreId)
554553
{
555554
return selfAssessmentDataService.IsCentreSelfAssessment(selfAssessmentId, centreId);
556555
}
556+
557+
public bool HasMinimumOptionalCompetencies(int selfAssessmentId, int delegateUserId)
558+
{
559+
return selfAssessmentDataService.HasMinimumOptionalCompetencies(selfAssessmentId, delegateUserId);
560+
}
557561
}
558562
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using DigitalLearningSolutions.Data.Models.SelfAssessments;
2+
using DigitalLearningSolutions.Web.Helpers;
3+
4+
namespace DigitalLearningSolutions.Web.ViewModels.LearningPortal.SelfAssessments
5+
{
6+
public class AddOptionalCompetenciesViewModel
7+
{
8+
public CurrentSelfAssessment SelfAssessment { get; set; }
9+
public string VocabPlural()
10+
{
11+
return FrameworkVocabularyHelper.VocabularyPlural(SelfAssessment.Vocabulary);
12+
}
13+
}
14+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
@using DigitalLearningSolutions.Web.ViewModels.LearningPortal.SelfAssessments
2+
@model AddOptionalCompetenciesViewModel
3+
@{
4+
ViewData["Title"] = "Add optional " + Model.VocabPlural();
5+
Layout = "SelfAssessments/_Layout";
6+
}
7+
@section breadcrumbs {
8+
<li class="nhsuk-breadcrumb__item">
9+
<a class="nhsuk-breadcrumb__link" asp-action="SelfAssessment" asp-route-selfAssessmentId="@Model.SelfAssessment.Id">@(Model.SelfAssessment.Name) introduction</a>
10+
</li>
11+
<li class="nhsuk-breadcrumb__item">Add optional @(Model.VocabPlural().ToLower())?</li>
12+
}
13+
14+
@section mobilebacklink
15+
{
16+
<p class="nhsuk-breadcrumb__back">
17+
<a class="nhsuk-breadcrumb__backlink" asp-action="SelfAssessment"
18+
asp-route-selfAssessmentId="@Model.SelfAssessment.Id">
19+
Back to @Model.SelfAssessment.Name
20+
</a>
21+
</p>
22+
}
23+
<form method="post" asp-action="AddOptionalCompetencies">
24+
<div class="nhsuk-grid-row">
25+
<input type="hidden" name="FromAddOptional" value="@Model.VocabPlural()" />
26+
<div class="nhsuk-grid-column-full">
27+
<h1 id="page-heading" class="nhsuk-heading-xl">Add optional proficiency to your assessment?</h1>
28+
</div>
29+
<div class="nhsuk-grid-column-two-thirds">
30+
<p class="nhsuk-u-padding-top-5">During your assessment you will need to add one or more optional proficiencies to your assessment to be certified within your role</p>
31+
<details class="nhsuk-details">
32+
<summary class="nhsuk-details__summary nhsuk-u-padding-10">
33+
<span class="nhsuk-u-margin-bottom-0">
34+
<span class="nhsuk-details__summary-text">What are optional proficiencies?</span>
35+
</span>
36+
</summary>
37+
<div class="nhsuk-details__text nhsuk-u-margin-left-6 nhsuk-u-margin-top-2">
38+
<p>Optional proficiencies refer to specific skills or competencies that are not part of the core requirements but may be added based on your role, specialisation, or the needs of your workplace.</p>
39+
<p>These proficiencies might be different depending on your role or organisation, you may need to discuss this with your educator or manager.</p>
40+
</div>
41+
</details>
42+
<p class="nhsuk-u-padding-bottom-5">These proficiencies might be different depending on your role or organization so you may need to discuss this with your educator or manager</p>
43+
44+
@* <a class="nhsuk-button trigger-loader"
45+
asp-route-selfAssessmentId="@Model.SelfAssessment.Id"
46+
asp-route-vocabulary="@Model.VocabPlural()"
47+
asp-route-isFromAddOptional="True"
48+
asp-action="ManageOptionalCompetencies"
49+
role="button">
50+
Add optional @Model.VocabPlural().ToLower() to assessment
51+
</a> *@
52+
<button class="nhsuk-button" type="submit">Add optional @Model.VocabPlural().ToLower() to assessment</button>
53+
<a class="nhsuk-button nhsuk-button--secondary trigger-loader" role="button" asp-action="SelfAssessmentOverview" asp-route-vocabulary="@Model.VocabPlural()" asp-route-selfAssessmentId="@Model.SelfAssessment.Id">Remind me later</a>
54+
</div>
55+
</div>
56+
</form>

0 commit comments

Comments
 (0)