Skip to content

Commit 6a7ddec

Browse files
committed
TD-5547 : Rewrote the Self Assessment report code to incorporate and dynamically generate CENTRE custom fields into it.
1 parent 0fce67c commit 6a7ddec

File tree

3 files changed

+441
-290
lines changed

3 files changed

+441
-290
lines changed
Lines changed: 139 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -1,135 +1,139 @@
1-
namespace DigitalLearningSolutions.Data.DataServices.SelfAssessmentDataService
2-
{
3-
using Dapper;
4-
using DigitalLearningSolutions.Data.Models.SelfAssessments.Export;
5-
using DigitalLearningSolutions.Data.Models.SelfAssessments;
6-
using Microsoft.Extensions.Logging;
7-
using System.Collections.Generic;
8-
using System.Data;
9-
10-
public interface ISelfAssessmentReportDataService
11-
{
12-
IEnumerable<SelfAssessmentSelect> GetSelfAssessmentsForReportList(int centreId, int? categoryId);
13-
IEnumerable<SelfAssessmentReportData> GetSelfAssessmentReportDataForCentre(int centreId, int selfAssessmentId);
14-
}
15-
public partial class SelfAssessmentReportDataService : ISelfAssessmentReportDataService
16-
{
17-
private readonly IDbConnection connection;
18-
private readonly ILogger<SelfAssessmentReportDataService> logger;
19-
20-
public SelfAssessmentReportDataService(IDbConnection connection, ILogger<SelfAssessmentReportDataService> logger)
21-
{
22-
this.connection = connection;
23-
this.logger = logger;
24-
}
25-
26-
public IEnumerable<SelfAssessmentSelect> GetSelfAssessmentsForReportList(int centreId, int? categoryId)
27-
{
28-
return connection.Query<SelfAssessmentSelect>(
29-
@"SELECT csa.SelfAssessmentID AS Id, sa.Name,
30-
(SELECT COUNT (DISTINCT da.UserID) AS Learners
31-
FROM CandidateAssessments AS ca1 INNER JOIN
32-
DelegateAccounts AS da ON ca1.DelegateUserID = da.UserID
33-
WHERE (da.CentreID = @centreId) AND (ca1.RemovedDate IS NULL) AND (ca1.SelfAssessmentID = csa.SelfAssessmentID) AND ca1.NonReportable=0) AS LearnerCount
34-
FROM CentreSelfAssessments AS csa INNER JOIN
35-
SelfAssessments AS sa ON csa.SelfAssessmentID = sa.ID
36-
WHERE (csa.CentreID = @centreId) AND (sa.CategoryID = @categoryId) AND (sa.SupervisorResultsReview = 1) AND (sa.ArchivedDate IS NULL) OR
37-
(csa.CentreID = @centreId) AND (sa.CategoryID = @categoryId) AND (sa.ArchivedDate IS NULL) AND (sa.SupervisorSelfAssessmentReview = 1) OR
38-
(csa.CentreID = @centreId) AND (sa.SupervisorResultsReview = 1) AND (sa.ArchivedDate IS NULL) AND (@categoryId = 0) OR
39-
(csa.CentreID = @centreId) AND (sa.ArchivedDate IS NULL) AND (sa.SupervisorSelfAssessmentReview = 1) AND (@categoryId = 0)
40-
ORDER BY sa.Name",
41-
new { centreId, categoryId = categoryId ??= 0 }
42-
);
43-
}
44-
45-
public IEnumerable<SelfAssessmentReportData> GetSelfAssessmentReportDataForCentre(int centreId, int selfAssessmentId)
46-
{
47-
return connection.Query<SelfAssessmentReportData>(
48-
@"WITH LatestAssessmentResults AS
49-
(
50-
SELECT s.DelegateUserID
51-
, CASE WHEN COALESCE (rr.LevelRAG, 0) = 3 THEN s.ID ELSE NULL END AS SelfAssessed
52-
, CASE WHEN sv.Verified IS NOT NULL AND sv.SignedOff = 1 AND COALESCE (rr.LevelRAG, 0) = 3 THEN s.ID ELSE NULL END AS Confirmed
53-
, CASE WHEN sas.Optional = 1 THEN s.CompetencyID ELSE NULL END AS Optional
54-
FROM SelfAssessmentResults AS s LEFT OUTER JOIN
55-
SelfAssessmentStructure AS sas ON sas.SelfAssessmentID = @selfAssessmentId AND s.CompetencyID = sas.CompetencyID LEFT OUTER JOIN
56-
SelfAssessmentResultSupervisorVerifications AS sv ON s.ID = sv.SelfAssessmentResultId AND sv.Superceded = 0 LEFT OUTER JOIN
57-
CompetencyAssessmentQuestionRoleRequirements AS rr ON s.CompetencyID = rr.CompetencyID AND s.AssessmentQuestionID = rr.AssessmentQuestionID AND sas.SelfAssessmentID = rr.SelfAssessmentID AND s.Result = rr.LevelValue
58-
WHERE (sas.SelfAssessmentID = @selfAssessmentId)
59-
)
60-
SELECT
61-
sa.Name AS SelfAssessment
62-
, u.LastName + ', ' + u.FirstName AS Learner
63-
, da.Active AS LearnerActive
64-
, u.ProfessionalRegistrationNumber AS PRN
65-
, jg.JobGroupName AS JobGroup
66-
, CASE WHEN c.CustomField1PromptID = 10 THEN da.Answer1 WHEN c.CustomField2PromptID = 10 THEN da.Answer2 WHEN c.CustomField3PromptID = 10 THEN da.Answer3 WHEN c.CustomField4PromptID = 10 THEN da.Answer4 WHEN c.CustomField5PromptID = 10 THEN da.Answer5 WHEN c.CustomField6PromptID = 10 THEN da.Answer6 ELSE '' END AS 'ProgrammeCourse'
67-
, CASE WHEN c.CustomField1PromptID = 4 THEN da.Answer1 WHEN c.CustomField2PromptID = 4 THEN da.Answer2 WHEN c.CustomField3PromptID = 4 THEN da.Answer3 WHEN c.CustomField4PromptID = 4 THEN da.Answer4 WHEN c.CustomField5PromptID = 4 THEN da.Answer5 WHEN c.CustomField6PromptID = 4 THEN da.Answer6 ELSE '' END AS 'Organisation'
68-
, CASE WHEN c.CustomField1PromptID = 1 THEN da.Answer1 WHEN c.CustomField2PromptID = 1 THEN da.Answer2 WHEN c.CustomField3PromptID = 1 THEN da.Answer3 WHEN c.CustomField4PromptID = 1 THEN da.Answer4 WHEN c.CustomField5PromptID = 1 THEN da.Answer5 WHEN c.CustomField6PromptID = 1 THEN da.Answer6 ELSE '' END AS 'DepartmentTeam'
69-
, dbo.GetOtherCentresForSelfAssessment(da.UserID, @SelfAssessmentID, c.CentreID) AS OtherCentres
70-
, CASE
71-
WHEN aa.ID IS NULL THEN 'Learner'
72-
WHEN aa.IsCentreManager = 1 THEN 'Centre Manager'
73-
WHEN aa.IsCentreAdmin = 1 AND aa.IsCentreManager = 0 THEN 'Centre Admin'
74-
WHEN aa.IsSupervisor = 1 THEN 'Supervisor'
75-
WHEN aa.IsNominatedSupervisor = 1 THEN 'Nominated supervisor'
76-
END AS DLSRole
77-
, da.DateRegistered AS Registered
78-
, ca.StartedDate AS Started
79-
, ca.LastAccessed
80-
, COALESCE(COUNT(DISTINCT LAR.Optional), NULL) AS [OptionalProficienciesAssessed]
81-
, COALESCE(COUNT(DISTINCT LAR.SelfAssessed), NULL) AS [SelfAssessedAchieved]
82-
, COALESCE(COUNT(DISTINCT LAR.Confirmed), NULL) AS [ConfirmedResults]
83-
, max(casv.Requested) AS SignOffRequested
84-
, max(1*casv.SignedOff) AS SignOffAchieved
85-
, min(casv.Verified) AS ReviewedDate
86-
FROM
87-
CandidateAssessments AS ca INNER JOIN
88-
DelegateAccounts AS da ON ca.DelegateUserID = da.UserID and da.CentreID = @centreId INNER JOIN
89-
Users as u ON u.ID = da.UserID INNER JOIN
90-
SelfAssessments AS sa INNER JOIN
91-
CentreSelfAssessments AS csa ON sa.ID = csa.SelfAssessmentID INNER JOIN
92-
Centres AS c ON csa.CentreID = c.CentreID ON da.CentreID = c.CentreID AND ca.SelfAssessmentID = sa.ID INNER JOIN
93-
JobGroups AS jg ON u.JobGroupID = jg.JobGroupID LEFT OUTER JOIN
94-
AdminAccounts AS aa ON da.UserID = aa.UserID AND aa.CentreID = da.CentreID AND aa.Active = 1 LEFT OUTER JOIN
95-
CandidateAssessmentSupervisors AS cas ON ca.ID = cas.CandidateAssessmentID left JOIN
96-
CandidateAssessmentSupervisorVerifications AS casv ON casv.CandidateAssessmentSupervisorID = cas.ID LEFT JOIN
97-
SupervisorDelegates AS sd ON cas.SupervisorDelegateId = sd.ID
98-
LEFT OUTER JOIN LatestAssessmentResults AS LAR ON LAR.DelegateUserID = ca.DelegateUserID
99-
WHERE
100-
(sa.ID = @SelfAssessmentID) AND (sa.ArchivedDate IS NULL) AND (c.Active = 1) AND (ca.RemovedDate IS NULL AND ca.NonReportable = 0)
101-
Group by sa.Name
102-
, u.LastName + ', ' + u.FirstName
103-
, da.Active
104-
, u.ProfessionalRegistrationNumber
105-
, c.CustomField1PromptID
106-
, c.CustomField2PromptID
107-
, c.CustomField3PromptID
108-
, c.CustomField4PromptID
109-
, c.CustomField5PromptID
110-
, c.CustomField6PromptID
111-
, c.CentreID
112-
, jg.JobGroupName
113-
, da.ID
114-
, da.Answer1
115-
, da.Answer2
116-
, da.Answer3
117-
, da.Answer4
118-
, da.Answer5
119-
, da.Answer6
120-
, da.DateRegistered
121-
, da.UserID
122-
, aa.ID
123-
, aa.IsCentreManager
124-
, aa.IsCentreAdmin
125-
, aa.IsSupervisor
126-
, aa.IsNominatedSupervisor
127-
, ca.StartedDate
128-
, ca.LastAccessed
129-
ORDER BY
130-
SelfAssessment, u.LastName + ', ' + u.FirstName",
131-
new { centreId, selfAssessmentId }
132-
);
133-
}
134-
}
135-
}
1+
namespace DigitalLearningSolutions.Data.DataServices.SelfAssessmentDataService
2+
{
3+
using Dapper;
4+
using DigitalLearningSolutions.Data.Models.SelfAssessments.Export;
5+
using DigitalLearningSolutions.Data.Models.SelfAssessments;
6+
using Microsoft.Extensions.Logging;
7+
using System.Collections.Generic;
8+
using System.Data;
9+
using ClosedXML.Excel;
10+
11+
public interface ISelfAssessmentReportDataService
12+
{
13+
IEnumerable<SelfAssessmentSelect> GetSelfAssessmentsForReportList(int centreId, int? categoryId);
14+
IEnumerable<SelfAssessmentReportData> GetSelfAssessmentReportDataForCentre(int centreId, int selfAssessmentId);
15+
}
16+
public partial class SelfAssessmentReportDataService : ISelfAssessmentReportDataService
17+
{
18+
private readonly IDbConnection connection;
19+
private readonly ILogger<SelfAssessmentReportDataService> logger;
20+
21+
public SelfAssessmentReportDataService(IDbConnection connection, ILogger<SelfAssessmentReportDataService> logger)
22+
{
23+
this.connection = connection;
24+
this.logger = logger;
25+
}
26+
27+
public IEnumerable<SelfAssessmentSelect> GetSelfAssessmentsForReportList(int centreId, int? categoryId)
28+
{
29+
return connection.Query<SelfAssessmentSelect>(
30+
@"SELECT csa.SelfAssessmentID AS Id, sa.Name,
31+
(SELECT COUNT (DISTINCT da.UserID) AS Learners
32+
FROM CandidateAssessments AS ca1 INNER JOIN
33+
DelegateAccounts AS da ON ca1.DelegateUserID = da.UserID
34+
WHERE (da.CentreID = @centreId) AND (ca1.RemovedDate IS NULL) AND (ca1.SelfAssessmentID = csa.SelfAssessmentID) AND ca1.NonReportable=0) AS LearnerCount
35+
FROM CentreSelfAssessments AS csa INNER JOIN
36+
SelfAssessments AS sa ON csa.SelfAssessmentID = sa.ID
37+
WHERE (csa.CentreID = @centreId) AND (sa.CategoryID = @categoryId) AND (sa.SupervisorResultsReview = 1) AND (sa.ArchivedDate IS NULL) OR
38+
(csa.CentreID = @centreId) AND (sa.CategoryID = @categoryId) AND (sa.ArchivedDate IS NULL) AND (sa.SupervisorSelfAssessmentReview = 1) OR
39+
(csa.CentreID = @centreId) AND (sa.SupervisorResultsReview = 1) AND (sa.ArchivedDate IS NULL) AND (@categoryId = 0) OR
40+
(csa.CentreID = @centreId) AND (sa.ArchivedDate IS NULL) AND (sa.SupervisorSelfAssessmentReview = 1) AND (@categoryId = 0)
41+
ORDER BY sa.Name",
42+
new { centreId, categoryId = categoryId ??= 0 }
43+
);
44+
}
45+
46+
public IEnumerable<SelfAssessmentReportData> GetSelfAssessmentReportDataForCentre(int centreId, int selfAssessmentId)
47+
{
48+
return connection.Query<SelfAssessmentReportData>(
49+
@"WITH LatestAssessmentResults AS
50+
(
51+
SELECT s.DelegateUserID
52+
, CASE WHEN COALESCE (rr.LevelRAG, 0) = 3 THEN s.ID ELSE NULL END AS SelfAssessed
53+
, CASE WHEN sv.Verified IS NOT NULL AND sv.SignedOff = 1 AND COALESCE (rr.LevelRAG, 0) = 3 THEN s.ID ELSE NULL END AS Confirmed
54+
, CASE WHEN sas.Optional = 1 THEN s.CompetencyID ELSE NULL END AS Optional
55+
FROM SelfAssessmentResults AS s LEFT OUTER JOIN
56+
SelfAssessmentStructure AS sas ON sas.SelfAssessmentID = @selfAssessmentId AND s.CompetencyID = sas.CompetencyID LEFT OUTER JOIN
57+
SelfAssessmentResultSupervisorVerifications AS sv ON s.ID = sv.SelfAssessmentResultId AND sv.Superceded = 0 LEFT OUTER JOIN
58+
CompetencyAssessmentQuestionRoleRequirements AS rr ON s.CompetencyID = rr.CompetencyID AND s.AssessmentQuestionID = rr.AssessmentQuestionID AND sas.SelfAssessmentID = rr.SelfAssessmentID AND s.Result = rr.LevelValue
59+
WHERE (sas.SelfAssessmentID = @selfAssessmentId)
60+
)
61+
SELECT
62+
sa.Name AS SelfAssessment
63+
, u.LastName + ', ' + u.FirstName AS Learner
64+
, da.Active AS LearnerActive
65+
, u.ProfessionalRegistrationNumber AS PRN
66+
, jg.JobGroupName AS JobGroup
67+
, da.Answer1 AS RegistrationAnswer1
68+
, da.Answer2 AS RegistrationAnswer2
69+
, da.Answer3 AS RegistrationAnswer3
70+
, da.Answer4 AS RegistrationAnswer4
71+
, da.Answer5 AS RegistrationAnswer5
72+
, da.Answer6 AS RegistrationAnswer6
73+
, dbo.GetOtherCentresForSelfAssessment(da.UserID, @SelfAssessmentID, c.CentreID) AS OtherCentres
74+
, CASE
75+
WHEN aa.ID IS NULL THEN 'Learner'
76+
WHEN aa.IsCentreManager = 1 THEN 'Centre Manager'
77+
WHEN aa.IsCentreAdmin = 1 AND aa.IsCentreManager = 0 THEN 'Centre Admin'
78+
WHEN aa.IsSupervisor = 1 THEN 'Supervisor'
79+
WHEN aa.IsNominatedSupervisor = 1 THEN 'Nominated supervisor'
80+
END AS DLSRole
81+
, da.DateRegistered AS Registered
82+
, ca.StartedDate AS Started
83+
, ca.LastAccessed
84+
, COALESCE(COUNT(DISTINCT LAR.Optional), NULL) AS [OptionalProficienciesAssessed]
85+
, COALESCE(COUNT(DISTINCT LAR.SelfAssessed), NULL) AS [SelfAssessedAchieved]
86+
, COALESCE(COUNT(DISTINCT LAR.Confirmed), NULL) AS [ConfirmedResults]
87+
, max(casv.Requested) AS SignOffRequested
88+
, max(1*casv.SignedOff) AS SignOffAchieved
89+
, min(casv.Verified) AS ReviewedDate
90+
FROM
91+
CandidateAssessments AS ca INNER JOIN
92+
DelegateAccounts AS da ON ca.DelegateUserID = da.UserID and da.CentreID = @centreId INNER JOIN
93+
Users as u ON u.ID = da.UserID INNER JOIN
94+
SelfAssessments AS sa INNER JOIN
95+
CentreSelfAssessments AS csa ON sa.ID = csa.SelfAssessmentID INNER JOIN
96+
Centres AS c ON csa.CentreID = c.CentreID ON da.CentreID = c.CentreID AND ca.SelfAssessmentID = sa.ID INNER JOIN
97+
JobGroups AS jg ON u.JobGroupID = jg.JobGroupID LEFT OUTER JOIN
98+
AdminAccounts AS aa ON da.UserID = aa.UserID AND aa.CentreID = da.CentreID AND aa.Active = 1 LEFT OUTER JOIN
99+
CandidateAssessmentSupervisors AS cas ON ca.ID = cas.CandidateAssessmentID left JOIN
100+
CandidateAssessmentSupervisorVerifications AS casv ON casv.CandidateAssessmentSupervisorID = cas.ID LEFT JOIN
101+
SupervisorDelegates AS sd ON cas.SupervisorDelegateId = sd.ID
102+
LEFT OUTER JOIN LatestAssessmentResults AS LAR ON LAR.DelegateUserID = ca.DelegateUserID
103+
WHERE
104+
(sa.ID = @SelfAssessmentID) AND (sa.ArchivedDate IS NULL) AND (c.Active = 1) AND (ca.RemovedDate IS NULL AND ca.NonReportable = 0)
105+
Group by sa.Name
106+
, u.LastName + ', ' + u.FirstName
107+
, da.Active
108+
, u.ProfessionalRegistrationNumber
109+
, c.CustomField1PromptID
110+
, c.CustomField2PromptID
111+
, c.CustomField3PromptID
112+
, c.CustomField4PromptID
113+
, c.CustomField5PromptID
114+
, c.CustomField6PromptID
115+
, c.CentreID
116+
, jg.JobGroupName
117+
, da.ID
118+
, da.Answer1
119+
, da.Answer2
120+
, da.Answer3
121+
, da.Answer4
122+
, da.Answer5
123+
, da.Answer6
124+
, da.DateRegistered
125+
, da.UserID
126+
, aa.ID
127+
, aa.IsCentreManager
128+
, aa.IsCentreAdmin
129+
, aa.IsSupervisor
130+
, aa.IsNominatedSupervisor
131+
, ca.StartedDate
132+
, ca.LastAccessed
133+
ORDER BY
134+
SelfAssessment, u.LastName + ', ' + u.FirstName",
135+
new { centreId, selfAssessmentId }
136+
);
137+
}
138+
}
139+
}

0 commit comments

Comments
 (0)