Skip to content

Commit ee60d8b

Browse files
committed
TD-480 Amends previous migration and sets up basic services and controller for creating a new assessment
1 parent 265c891 commit ee60d8b

File tree

10 files changed

+161
-40
lines changed

10 files changed

+161
-40
lines changed

DigitalLearningSolutions.Data.Migrations/202501280929_CreateCompetencyAssessmentTables.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ public override void Up()
1212
.WithColumn("SelfAssessmentId").AsInt32().NotNullable().ForeignKey("SelfAssessments", "ID")
1313
.WithColumn("FrameworkId").AsInt32().NotNullable().ForeignKey("Frameworks", "ID")
1414
.WithColumn("CreatedDate").AsDateTime().NotNullable().WithDefault(SystemMethods.CurrentDateTime)
15-
.WithColumn("CreatedByUserId").AsInt32().NotNullable().ForeignKey("Users", "ID")
15+
.WithColumn("CreatedByAdminId").AsInt32().NotNullable().ForeignKey("AdminAccounts", "ID")
1616
.WithColumn("RemovedDate").AsDateTime().Nullable()
17-
.WithColumn("RemovedByUserId").AsInt32().Nullable().ForeignKey("Users", "ID")
17+
.WithColumn("RemovedByAdminId").AsInt32().Nullable().ForeignKey("AdminAccounts", "ID")
1818
.WithColumn("AmendedDate").AsDateTime().Nullable()
19-
.WithColumn("AmendedByUserId").AsInt32().Nullable().ForeignKey("Users", "ID");
19+
.WithColumn("AmendedByAdminId").AsInt32().Nullable().ForeignKey("AdminAccounts", "ID");
2020
Create.Table("SelfAssessmentTaskStatus")
2121
.WithColumn("ID").AsInt32().NotNullable().PrimaryKey().Identity()
2222
.WithColumn("SelfAssessmentId").AsInt32().NotNullable().ForeignKey("SelfAssessments", "ID").Unique()
@@ -32,13 +32,12 @@ public override void Up()
3232
.WithColumn("SupervisorRolesTaskStatus").AsBoolean().Nullable()
3333
.WithColumn("SelfAssessmentOptionsTaskStatus").AsBoolean().Nullable()
3434
.WithColumn("ReviewTaskStatus").AsBoolean().Nullable();
35-
Execute.Sql($@"INSERT INTO SelfAssessmentFrameworks (SelfAssessmentId, FrameworkId, CreatedByUserId)
36-
SELECT sa.ID, fc.FrameworkID, aa.UserID
35+
Execute.Sql($@"INSERT INTO SelfAssessmentFrameworks (SelfAssessmentId, FrameworkId, CreatedByAdminId)
36+
SELECT sa.ID, fc.FrameworkID, sa.CreatedByAdminID
3737
FROM SelfAssessments AS sa INNER JOIN
3838
SelfAssessmentStructure AS sas ON sa.ID = sas.SelfAssessmentID INNER JOIN
39-
FrameworkCompetencies AS fc ON sas.CompetencyID = fc.CompetencyID INNER JOIN
40-
AdminAccounts AS aa ON sa.CreatedByAdminID = aa.ID
41-
GROUP BY sa.ID, fc.FrameworkID, aa.UserID
39+
FrameworkCompetencies AS fc ON sas.CompetencyID = fc.CompetencyID
40+
GROUP BY sa.ID, fc.FrameworkID, sa.CreatedByAdminID
4241
");
4342
Execute.Sql($@"INSERT INTO SelfAssessmentTaskStatus (SelfAssessmentId, IntroductoryTextTaskStatus, BrandingTaskStatus, VocabularyTaskStatus, WorkingGroupTaskStatus, NationalRoleProfileTaskStatus, FrameworkLinksTaskStatus, SelectCompetenciesTaskStatus, OptionalCompetenciesTaskStatus, RoleRequirementsTaskStatus, SupervisorRolesTaskStatus, SelfAssessmentOptionsTaskStatus)
4443
SELECT ID, 1,1,1,1,1,1,1,1,1,1,1

DigitalLearningSolutions.Data/DataServices/CompetencyAssessmentDataService.cs

Lines changed: 114 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
namespace DigitalLearningSolutions.Data.DataServices
22
{
3+
using System;
34
using System.Collections.Generic;
45
using System.Data;
56
using System.Linq;
67
using Dapper;
8+
using DigitalLearningSolutions.Data.Models.Common;
79
using DigitalLearningSolutions.Data.Models.CompetencyAssessments;
10+
using DigitalLearningSolutions.Data.Models.Frameworks;
11+
using DocumentFormat.OpenXml.Wordprocessing;
812
using Microsoft.Extensions.Logging;
913

1014
public interface ICompetencyAssessmentDataService
@@ -24,8 +28,16 @@ public interface ICompetencyAssessmentDataService
2428
bool UpdateCompetencyAssessmentName(int competencyAssessmentId, int adminId, string competencyAssessmentName);
2529

2630
bool UpdateCompetencyAssessmentProfessionalGroup(int competencyAssessmentId, int adminId, int? nrpProfessionalGroupID);
31+
bool UpdateCompetencyAssessmentBranding(
32+
int competencyAssessmentId,
33+
int brandId,
34+
int categoryId,
35+
int adminId
36+
);
37+
bool UpdateCompetencyAssessmentDescription(int competencyAssessmentId, int adminId, string competencyAssessmentDescription);
2738
//INSERT DATA
28-
39+
int InsertCompetencyAssessment(int adminId, int centreId, string competencyAssessmentName);
40+
bool InsertSelfAssessmentFramework(int adminId, int selfAssessmentId, int frameworkId);
2941
//DELETE DATA
3042
}
3143

@@ -121,6 +133,33 @@ FROM SelfAssessmentCollaborators
121133
).FirstOrDefault();
122134
}
123135

136+
public int InsertCompetencyAssessment(int adminId, int centreId, string competencyAssessmentName)
137+
{
138+
if ((competencyAssessmentName.Length == 0) | (adminId < 1))
139+
{
140+
logger.LogWarning(
141+
$"Not inserting competency assessmente as it failed server side validation. AdminId: {adminId}, competencyAssessmentName: {competencyAssessmentName}"
142+
);
143+
return -1;
144+
}
145+
var result = connection.ExecuteScalar(
146+
@"SELECT COUNT(*) FROM SelfAssessments WHERE [Name] = @competencyAssessmentName",
147+
new { competencyAssessmentName }
148+
);
149+
int existingSelfAssessments = Convert.ToInt32(result);
150+
if (existingSelfAssessments > 0)
151+
{
152+
return -1;
153+
}
154+
var assessmentId = connection.QuerySingle<int>(
155+
@"INSERT INTO SelfAssessments ([Name], CreatedByCentreID, CreatedByAdminID)
156+
OUTPUT INSERTED.Id
157+
VALUES (@competencyAssessmentName, @centreId, @adminId)"
158+
,
159+
new { competencyAssessmentName, centreId, adminId }
160+
);
161+
return assessmentId;
162+
}
124163
public bool UpdateCompetencyAssessmentName(int competencyAssessmentId, int adminId, string competencyAssessmentName)
125164
{
126165
if ((competencyAssessmentName.Length == 0) | (adminId < 1) | (competencyAssessmentId < 1))
@@ -130,11 +169,11 @@ public bool UpdateCompetencyAssessmentName(int competencyAssessmentId, int admin
130169
);
131170
return false;
132171
}
133-
134-
var existingSelfAssessments = (int)connection.ExecuteScalar(
172+
var result = connection.ExecuteScalar(
135173
@"SELECT COUNT(*) FROM SelfAssessments WHERE [Name] = @competencyAssessmentName AND ID <> @competencyAssessmentId",
136174
new { competencyAssessmentName, competencyAssessmentId }
137175
);
176+
int existingSelfAssessments = Convert.ToInt32(result);
138177
if (existingSelfAssessments > 0)
139178
{
140179
return false;
@@ -179,10 +218,11 @@ ORDER BY ProfessionalGroup"
179218

180219
public bool UpdateCompetencyAssessmentProfessionalGroup(int competencyAssessmentId, int adminId, int? nrpProfessionalGroupID)
181220
{
182-
var sameCount = (int)connection.ExecuteScalar(
221+
var result = connection.ExecuteScalar(
183222
@"SELECT COUNT(*) FROM CompetencyAssessments WHERE ID = @competencyAssessmentId AND NRPProfessionalGroupID = @nrpProfessionalGroupID",
184223
new { competencyAssessmentId, nrpProfessionalGroupID }
185224
);
225+
int sameCount = Convert.ToInt32(result);
186226
if (sameCount > 0)
187227
{
188228
//same so don't update:
@@ -202,5 +242,75 @@ public bool UpdateCompetencyAssessmentProfessionalGroup(int competencyAssessment
202242

203243
return false;
204244
}
245+
public bool UpdateCompetencyAssessmentBranding(
246+
int competencyAssessmentId,
247+
int brandId,
248+
int categoryId,
249+
int adminId
250+
)
251+
{
252+
if ((competencyAssessmentId < 1) | (brandId < 1) | (categoryId < 1) | (adminId < 1))
253+
{
254+
logger.LogWarning(
255+
$"Not updating competency assessment as it failed server side validation. competencyAssessmentId: {competencyAssessmentId}, brandId: {brandId}, categoryId: {categoryId}, AdminId: {adminId}"
256+
);
257+
return false;
258+
}
259+
260+
var numberOfAffectedRows = connection.Execute(
261+
@"UPDATE SelfAssessments SET BrandID = @brandId, CategoryID = @categoryId, UpdatedByAdminID = @adminId
262+
WHERE ID = @competencyAssessmentId",
263+
new { brandId, categoryId, adminId, competencyAssessmentId }
264+
);
265+
if (numberOfAffectedRows < 1)
266+
{
267+
logger.LogWarning(
268+
"Not updating competency assessment as db update failed. " +
269+
$"frameworkId: {competencyAssessmentId}, brandId: {brandId}, categoryId: {categoryId}, AdminId: {adminId}"
270+
);
271+
return false;
272+
}
273+
274+
return true;
275+
}
276+
277+
public bool UpdateCompetencyAssessmentDescription(int competencyAssessmentId, int adminId, string competencyAssessmentDescription)
278+
{
279+
var numberOfAffectedRows = connection.Execute(
280+
@"UPDATE SelfAssessments SET Description = @competencyAssessmentDescription, UpdatedByAdminID = @adminId
281+
WHERE ID = @competencyAssessmentId",
282+
new { adminId, competencyAssessmentId, competencyAssessmentDescription }
283+
);
284+
if (numberOfAffectedRows < 1)
285+
{
286+
logger.LogWarning(
287+
"Not updating competency assessment as db update failed. " +
288+
$"frameworkId: {competencyAssessmentId}, competencyAssessmentDescription: {competencyAssessmentDescription}, AdminId: {adminId}"
289+
);
290+
return false;
291+
}
292+
return true;
293+
}
294+
295+
public bool InsertSelfAssessmentFramework(int adminId, int selfAssessmentId, int frameworkId)
296+
{
297+
var numberOfAffectedRows = connection.Execute(
298+
@"Insert SelfAssessmentFrameworks (SelfAssessmentId, FrameworkId, CreatedByAdminId)
299+
VALUES (@selfAssessmentId, @frameworkId, @adminId)
300+
WHERE NOT EXISTS (SELECT 1 FROM SelfAssessmentFrameworks WHERE SelfAssessmentId = @selfAssessmentId AND FrameworkId = @frameworkId)"
301+
,
302+
new { adminId, selfAssessmentId, frameworkId }
303+
);
304+
if (numberOfAffectedRows < 1)
305+
{
306+
logger.LogWarning(
307+
"Not inserting SelfAssessmentFrameworks record as db insert failed. " +
308+
$"selfAssessmentId: {selfAssessmentId}, frameworkId: {frameworkId}, AdminId: {adminId}"
309+
);
310+
return false;
311+
}
312+
313+
return true;
314+
}
205315
}
206316
}

DigitalLearningSolutions.Data/DataServices/FrameworkDataService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ public class FrameworkDataService : IFrameworkDataService
284284
fwr.ID AS FrameworkReviewID";
285285

286286
private const string BrandedFrameworkFields =
287-
@",(SELECT BrandName
287+
@", FW.Description, (SELECT BrandName
288288
FROM Brands
289289
WHERE (BrandID = FW.BrandID)) AS Brand,
290290
(SELECT CategoryName

DigitalLearningSolutions.Data/Models/Frameworks/BrandedFramework.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
{
33
public class BrandedFramework : BaseFramework
44
{
5+
public string? Description { get; set; }
56
public string? Brand
67
{
78
get => brand;

DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessments.cs

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -179,48 +179,40 @@ public IActionResult CompetencyAssessmentName(string actionname, int competencyA
179179
[Route("/CompetencyAssessments/Name/{actionname}/{competencyAssessmentId}")]
180180
[Route("/CompetencyAssessments/Name/{actionname}")]
181181
[SetSelectedTab(nameof(NavMenuTab.CompetencyAssessments))]
182-
public IActionResult SaveProfileName(CompetencyAssessmentBase competencyAssessmentBase, string actionname, int competencyAssessmentId = 0)
182+
public IActionResult SaveProfileName(CompetencyAssessmentBase competencyAssessmentBase, string actionname, int competencyAssessmentId = 0, int? frameworkId = null)
183183
{
184184
if (!ModelState.IsValid)
185185
{
186186
ModelState.Remove(nameof(CompetencyAssessmentBase.CompetencyAssessmentName));
187187
ModelState.AddModelError(nameof(CompetencyAssessmentBase.CompetencyAssessmentName), "Please enter a valid competency assessment name (between 3 and 255 characters)");
188-
// do something
189188
return View("Name", competencyAssessmentBase);
190189
}
191190
else
192191
{
192+
var userCentreId = (int)GetCentreId();
193+
var adminId = GetAdminID();
193194
if (actionname == "New")
194195
{
195196
var sameItems = competencyAssessmentService.GetCompetencyAssessmentByName(competencyAssessmentBase.CompetencyAssessmentName, GetAdminID());
196197
if (sameItems != null)
197198
{
198199
ModelState.Remove(nameof(CompetencyAssessmentBase.CompetencyAssessmentName));
199200
ModelState.AddModelError(nameof(CompetencyAssessmentBase.CompetencyAssessmentName), "Another competency assessment exists with that name. Please choose a different name.");
200-
// do something
201201
return View("Name", competencyAssessmentBase);
202202
}
203-
SessionNewCompetencyAssessment sessionNewCompetencyAssessment = TempData.Peek<SessionNewCompetencyAssessment>();
204-
sessionNewCompetencyAssessment.CompetencyAssessmentBase = competencyAssessmentBase;
205-
TempData.Set(sessionNewCompetencyAssessment);
206-
return RedirectToAction("CompetencyAssessmentProfessionalGroup", "CompetencyAssessments", new { actionname });
203+
competencyAssessmentService.InsertCompetencyAssessment(adminId, userCentreId, competencyAssessmentBase.CompetencyAssessmentName, frameworkId);
207204
}
208205
else
209-
{
210-
var adminId = GetAdminID();
206+
{
207+
211208
var isUpdated = competencyAssessmentService.UpdateCompetencyAssessmentName(competencyAssessmentBase.ID, adminId, competencyAssessmentBase.CompetencyAssessmentName);
212-
if (isUpdated)
213-
{
214-
return RedirectToAction("ViewCompetencyAssessment", new { tabname = "Details", competencyAssessmentId });
215-
}
216-
else
209+
if (!isUpdated)
217210
{
218211
ModelState.AddModelError(nameof(CompetencyAssessmentBase.CompetencyAssessmentName), "Another competency assessment exists with that name. Please choose a different name.");
219-
// do something
220212
return View("Name", competencyAssessmentBase);
221213
}
222214
}
223-
215+
return RedirectToAction("ManageCompetencyAssessment", new { competencyAssessmentId });
224216
}
225217
}
226218

@@ -290,7 +282,7 @@ public IActionResult SaveProfessionalGroup(CompetencyAssessmentBase competencyAs
290282
}
291283
else
292284
{
293-
return RedirectToAction("ViewCompetencyAssessment", new { tabname = "Details", competencyAssessmentId });
285+
return RedirectToAction("ManageCompetencyAssessment", new { tabname = "Details", competencyAssessmentId });
294286
}
295287
}
296288
}

DigitalLearningSolutions.Web/Services/CompetencyAssessmentService.cs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,18 @@ public interface ICompetencyAssessmentService
2222

2323
bool UpdateCompetencyAssessmentProfessionalGroup(int competencyAssessmentId, int adminId, int? nrpProfessionalGroupID);
2424

25+
//INSERT DATA
26+
int InsertCompetencyAssessment(int adminId, int centreId, string competencyAssessmentName, int? frameworkId);
27+
2528
}
2629
public class CompetencyAssessmentService : ICompetencyAssessmentService
2730
{
2831
private readonly ICompetencyAssessmentDataService competencyAssessmentDataService;
29-
public CompetencyAssessmentService(ICompetencyAssessmentDataService competencyAssessmentDataService)
32+
private readonly IFrameworkDataService frameworkDataService;
33+
public CompetencyAssessmentService(ICompetencyAssessmentDataService competencyAssessmentDataService, IFrameworkDataService frameworkDataService)
3034
{
3135
this.competencyAssessmentDataService = competencyAssessmentDataService;
36+
this.frameworkDataService = frameworkDataService;
3237
}
3338
public IEnumerable<CompetencyAssessment> GetAllCompetencyAssessments(int adminId)
3439
{
@@ -54,6 +59,20 @@ public IEnumerable<CompetencyAssessment> GetCompetencyAssessmentsForAdminId(int
5459
{
5560
return competencyAssessmentDataService.GetCompetencyAssessmentsForAdminId(adminId);
5661
}
62+
public int InsertCompetencyAssessment(int adminId, int centreId, string competencyAssessmentName, int? frameworkId)
63+
{
64+
var assessmentId = competencyAssessmentDataService.InsertCompetencyAssessment(adminId, centreId, competencyAssessmentName);
65+
if(assessmentId > 0 && frameworkId != null)
66+
{
67+
var framework = frameworkDataService.GetBrandedFrameworkByFrameworkId((int)frameworkId, adminId);
68+
if (framework != null) {
69+
competencyAssessmentDataService.InsertSelfAssessmentFramework(adminId, assessmentId, framework.ID);
70+
competencyAssessmentDataService.UpdateCompetencyAssessmentDescription(adminId, assessmentId, framework.Description);
71+
competencyAssessmentDataService.UpdateCompetencyAssessmentBranding(assessmentId, (int)framework.BrandID, (int)framework.CategoryID, adminId);
72+
}
73+
}
74+
return assessmentId;
75+
}
5776

5877
public bool UpdateCompetencyAssessmentName(int competencyAssessmentId, int adminId, string competencyAssessmentName)
5978
{

DigitalLearningSolutions.Web/Views/CompetencyAssessments/Name.cshtml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ else
2929
<div class="nhsuk-width-container">
3030
<ol class="nhsuk-breadcrumb__list">
3131
<li class="nhsuk-breadcrumb__item"><a class="nhsuk-breadcrumb__link trigger-loader" asp-action="ViewCompetencyAssessments" asp-route-tabname="Mine">Competency Assessments</a></li>
32-
<li class="nhsuk-breadcrumb__item"><a class="nhsuk-breadcrumb__link trigger-loader" asp-action="ViewCompetencyAssessment" asp-route-competencyAssessmentId="@Model.ID" asp-route-tabname="Details">Competency Assessment Details</a></li>
32+
<li class="nhsuk-breadcrumb__item"><a class="nhsuk-breadcrumb__link trigger-loader" asp-action="ManageCompetencyAssessment" asp-route-competencyAssessmentId="@Model.ID" asp-route-tabname="Details">Competency Assessment Details</a></li>
3333
<li class="nhsuk-breadcrumb__item">Name</li>
3434
</ol>
35-
<p class="nhsuk-breadcrumb__back"><a class="nhsuk-breadcrumb__backlink" asp-action="ViewCompetencyAssessment" asp-route-competencyAssessmentId="@Model.ID" asp-route-tabname="Details">Back to competency assessment detail</a></p>
35+
<p class="nhsuk-breadcrumb__back"><a class="nhsuk-breadcrumb__backlink" asp-action="ManageCompetencyAssessment" asp-route-competencyAssessmentId="@Model.ID" asp-route-tabname="Details">Back to competency assessment detail</a></p>
3636
</div>
3737
</nav>
3838
}
@@ -97,7 +97,7 @@ else
9797
Save
9898
</button>
9999
<div class="nhsuk-back-link">
100-
<a class="nhsuk-back-link__link" asp-action="ViewCompetencyAssessment" asp-route-frameworkId="@Model.ID" asp-route-tabname="Details">
100+
<a class="nhsuk-back-link__link" asp-action="ManageCompetencyAssessment" asp-route-frameworkId="@Model.ID" asp-route-tabname="Details">
101101
<svg class="nhsuk-icon nhsuk-icon__chevron-left" focusable='false' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
102102
<path d="M13.41 12l5.3-5.29a1 1 0 1 0-1.42-1.42L12 10.59l-5.29-5.3a1 1 0 0 0-1.42 1.42l5.3 5.29-5.3 5.29a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l5.29-5.3 5.29 5.3a1 1 0 0 0 1.42 0 1 1 0 0 0 0-1.42z"></path>
103103
</svg>

0 commit comments

Comments
 (0)