Skip to content

Commit 6e84700

Browse files
committed
TD-5400-Feature 'Working group- add/remove contributors/reviewers' added.
1 parent 5de5a2a commit 6e84700

File tree

14 files changed

+567
-29
lines changed

14 files changed

+567
-29
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
namespace DigitalLearningSolutions.Data.Migrations
2+
{
3+
using FluentMigrator;
4+
[Migration(202510021000)]
5+
public class AddIsdeletedSelfAssessmentCollaborators : Migration
6+
{
7+
public override void Up()
8+
{
9+
Alter.Table("SelfAssessmentCollaborators").AddColumn("IsDeleted").AsBoolean().WithDefaultValue(false);
10+
}
11+
public override void Down()
12+
{
13+
Delete.Column("IsDeleted").FromTable("SelfAssessmentCollaborators");
14+
}
15+
}
16+
}

DigitalLearningSolutions.Data/DataServices/CompetencyAssessmentDataService.cs

Lines changed: 164 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ int categoryId
5757
bool UpdateSelectCompetenciesTaskStatus(int assessmentId, bool taskStatus, bool? previousStatus);
5858
bool UpdateOptionalCompetenciesTaskStatus(int assessmentId, bool taskStatus, bool? previousStatus);
5959
bool UpdateRoleRequirementsTaskStatus(int assessmentId, bool taskStatus, bool? previousStatus);
60+
bool UpdateWorkingGroupTaskStatus(int assessmentId, bool taskStatus, bool? previousStatus);
6061
void MoveCompetencyInSelfAssessment(int competencyAssessmentId,
6162
int competencyId,
6263
string direction
@@ -77,6 +78,10 @@ public bool UpdateCompetencyAssessmentFeaturesTaskStatus(int id, bool descriptio
7778
//DELETE DATA
7879
bool RemoveFrameworkCompetenciesFromAssessment(int competencyAssessmentId, int frameworkId);
7980
bool RemoveCompetencyFromAssessment(int competencyAssessmentId, int competencyId);
81+
IEnumerable<CompetencyAssessmentCollaboratorDetail> GetCollaboratorsForCompetencyAssessmentId(int competencyAssessmentId);
82+
int AddCollaboratorToCompetencyAssessment(int competencyAssessmentId, string? userEmail, bool canModify, int? centreID);
83+
void RemoveCollaboratorFromCompetencyAssessment(int competencyAssessmentId, int id);
84+
CompetencyAssessmentCollaboratorNotification? GetCollaboratorNotification(int id, int invitedByAdminId);
8085
}
8186

8287
public class CompetencyAssessmentDataService : ICompetencyAssessmentDataService
@@ -646,6 +651,23 @@ public bool UpdateRoleRequirementsTaskStatus(int assessmentId, bool taskStatus,
646651
}
647652
return true;
648653
}
654+
public bool UpdateWorkingGroupTaskStatus(int assessmentId, bool taskStatus, bool? previousStatus)
655+
{
656+
var numberOfAffectedRows = connection.Execute(
657+
@"UPDATE SelfAssessmentTaskStatus SET WorkingGroupTaskStatus = @taskStatus
658+
WHERE SelfAssessmentId = @assessmentId AND (@previousStatus IS NULL OR WorkingGroupTaskStatus = @previousStatus)",
659+
new { assessmentId, taskStatus, previousStatus }
660+
);
661+
if (numberOfAffectedRows < 1)
662+
{
663+
logger.LogWarning(
664+
"Not updating WorkingGroupTaskStatus as db update failed. " +
665+
$"assessmentId: {assessmentId}, taskStatus: {taskStatus}"
666+
);
667+
return false;
668+
}
669+
return true;
670+
}
649671

650672
public IEnumerable<Competency> GetCompetenciesForCompetencyAssessment(int competencyAssessmentId)
651673
{
@@ -747,7 +769,7 @@ public void MoveCompetencyInSelfAssessment(int competencyAssessmentId, int compe
747769
new { SelfAssessmentID = competencyAssessmentId, CompetencyID = competencyId, Direction = direction },
748770
commandType: CommandType.StoredProcedure
749771
);
750-
772+
751773
}
752774

753775
public void MoveCompetencyGroupInSelfAssessment(int competencyAssessmentId, int groupId, string direction)
@@ -811,12 +833,12 @@ FROM SelfAssessments s INNER JOIN
811833
WHERE s.ID = @competencyAssessmentId",
812834
new { competencyAssessmentId }
813835
);
814-
836+
815837
}
816838

817-
public void UpdateSelfAssessmentFromFramework( int selfAssessmentId, int? frameworkId)
839+
public void UpdateSelfAssessmentFromFramework(int selfAssessmentId, int? frameworkId)
818840
{
819-
841+
820842
var numberOfAffectedRows = connection.Execute(
821843
@"UPDATE s
822844
SET
@@ -828,22 +850,22 @@ FROM SelfAssessments s
828850
INNER JOIN AdminUsers AU ON F.OwnerAdminID = AU.AdminID
829851
WHERE s.id = @selfAssessmentId;"
830852
,
831-
new {selfAssessmentId, frameworkId }
853+
new { selfAssessmentId, frameworkId }
832854
);
833855
}
834856
public bool InsertSelfAssessmentStructure(int selfAssessmentId, int? frameworkId)
835857
{
836858

837-
var numberOfAffectedRows = connection.Execute(
838-
@"INSERT INTO SelfAssessmentStructure (SelfAssessmentID, CompetencyID, Ordering, CompetencyGroupID)
859+
var numberOfAffectedRows = connection.Execute(
860+
@"INSERT INTO SelfAssessmentStructure (SelfAssessmentID, CompetencyID, Ordering, CompetencyGroupID)
839861
SELECT s.ID, FC.CompetencyID, ROW_NUMBER() OVER( ORDER BY FCG.Ordering, FC.Ordering ), FCG.CompetencyGroupID
840862
FROM FrameworkCompetencies AS FC
841863
INNER JOIN FrameworkCompetencyGroups AS FCG ON FC.FrameworkCompetencyGroupID = FCG.ID INNER JOIN
842864
SelfAssessments s ON s.id = @selfAssessmentId
843865
WHERE FC.FrameworkID = @frameworkId"
844-
,
845-
new { selfAssessmentId, frameworkId }
846-
);
866+
,
867+
new { selfAssessmentId, frameworkId }
868+
);
847869
if (numberOfAffectedRows < 1)
848870
{
849871
logger.LogWarning(
@@ -863,5 +885,137 @@ FROM FrameworkCompetencies AS FC
863885
);
864886

865887
}
888+
public IEnumerable<CompetencyAssessmentCollaboratorDetail> GetCollaboratorsForCompetencyAssessmentId(int competencyAssessmentId)
889+
{
890+
return connection.Query<CompetencyAssessmentCollaboratorDetail>(
891+
@"SELECT
892+
0 AS ID,
893+
sa.ID AS SelfAssessmentID,
894+
au.AdminID AS AdminID,
895+
1 AS CanModify,
896+
au.Email AS UserEmail,
897+
au.Active AS UserActive,
898+
'Owner' AS CompetencyAssessmentRole
899+
FROM SelfAssessments AS sa
900+
INNER JOIN AdminUsers AS au ON sa.CreatedByAdminID = au.AdminID
901+
WHERE (sa.ID = @competencyAssessmentId)
902+
UNION ALL
903+
SELECT
904+
ID,
905+
SelfAssessmentID,
906+
sc.AdminID,
907+
CanModify,
908+
UserEmail,
909+
au.Active AS UserActive,
910+
CASE WHEN CanModify = 1 THEN 'Contributor' ELSE 'Reviewer' END AS CompetencyAssessmentRole
911+
FROM SelfAssessmentCollaborators sc
912+
INNER JOIN AdminUsers AS au ON sc.AdminID = au.AdminID
913+
AND sc.IsDeleted = 0
914+
WHERE (SelfAssessmentID = @competencyAssessmentId)",
915+
new { competencyAssessmentId }
916+
);
917+
}
918+
public int AddCollaboratorToCompetencyAssessment(int competencyAssessmentId, string? userEmail, bool canModify, int? centreID)
919+
{
920+
if (userEmail is null || userEmail.Length == 0)
921+
{
922+
logger.LogWarning(
923+
$"Not adding collaborator to competency assessment as it failed server side valiidation. competencyAssessmentId: {competencyAssessmentId}, userEmail: {userEmail}, canModify:{canModify}"
924+
);
925+
return -3;
926+
}
927+
928+
var existingId = connection.QuerySingle<int>(
929+
@"SELECT COALESCE
930+
((SELECT ID
931+
FROM SelfAssessmentCollaborators
932+
WHERE (SelfAssessmentID = @competencyAssessmentId) AND (UserEmail = @userEmail) AND (IsDeleted=0)), 0) AS ID",
933+
new { competencyAssessmentId, userEmail }
934+
);
935+
if (existingId > 0)
936+
{
937+
return -2;
938+
}
939+
940+
var adminId = (int?)connection.ExecuteScalar(
941+
@"SELECT AdminID FROM AdminUsers WHERE Email = @userEmail AND Active = 1 AND CentreID = @centreID",
942+
new { userEmail, centreID }
943+
);
944+
if (adminId is null)
945+
{
946+
return -4;
947+
}
948+
949+
var ownerEmail = (string?)connection.ExecuteScalar(@"SELECT AU.Email FROM SelfAssessments SA
950+
INNER JOIN AdminUsers AU ON AU.AdminID = SA.CreatedByAdminID
951+
WHERE SA.ID = @competencyAssessmentId", new { competencyAssessmentId });
952+
if (ownerEmail == userEmail)
953+
{
954+
return -5;
955+
}
956+
957+
var numberOfAffectedRows = connection.Execute(
958+
@"INSERT INTO SelfAssessmentCollaborators (SelfAssessmentID, AdminID, UserEmail, CanModify)
959+
VALUES (@competencyAssessmentId, @adminId, @userEmail, @canModify)",
960+
new { competencyAssessmentId, adminId, userEmail, canModify }
961+
);
962+
if (numberOfAffectedRows < 1)
963+
{
964+
logger.LogWarning(
965+
$"Not inserting framework collaborator as db insert failed. AdminId: {adminId}, userEmail: {userEmail}, competencyAssessmentId: {competencyAssessmentId}, canModify: {canModify}"
966+
);
967+
return -1;
968+
}
969+
970+
if (adminId > 0)
971+
{
972+
connection.Execute(
973+
@"UPDATE AdminUsers SET IsWorkforceManager = 1 WHERE AdminId = @adminId AND IsWorkforceManager = 0",
974+
new { adminId }
975+
);
976+
}
977+
978+
existingId = connection.QuerySingle<int>(
979+
@"SELECT COALESCE
980+
((SELECT ID
981+
FROM SelfAssessmentCollaborators
982+
WHERE (SelfAssessmentID = @competencyAssessmentId) AND (UserEmail = @userEmail) AND (IsDeleted=0)), 0) AS AdminID",
983+
new { competencyAssessmentId, adminId, userEmail }
984+
);
985+
return existingId;
986+
}
987+
988+
public void RemoveCollaboratorFromCompetencyAssessment(int competencyAssessmentId, int id)
989+
{
990+
var adminId = (int?)connection.ExecuteScalar(
991+
@"SELECT AdminID FROM SelfAssessmentCollaborators WHERE (SelfAssessmentID = @competencyAssessmentId) AND (ID = @id)",
992+
new { competencyAssessmentId, id }
993+
);
994+
connection.Execute(
995+
@"UPDATE SelfAssessmentCollaborators SET IsDeleted=1 WHERE (SelfAssessmentID = @competencyAssessmentId) AND (ID = @id);
996+
UPDATE AdminUsers SET IsWorkforceManager = 0 WHERE AdminID = @adminId AND AdminID NOT IN (SELECT DISTINCT AdminID FROM SelfAssessmentCollaborators);",
997+
new { competencyAssessmentId, id, adminId }
998+
);
999+
}
1000+
public CompetencyAssessmentCollaboratorNotification? GetCollaboratorNotification(int id, int invitedByAdminId)
1001+
{
1002+
return connection.Query<CompetencyAssessmentCollaboratorNotification>(
1003+
@"SELECT
1004+
sc.SelfAssessmentID,
1005+
sc.AdminID,
1006+
sc.CanModify,
1007+
sc.UserEmail,
1008+
au.Active AS UserActive,
1009+
CASE WHEN sc.CanModify = 1 THEN 'Contributor' ELSE 'Reviewer' END AS CompetencyAssessmentRole,
1010+
sa.[Name] AS CompetencyAssessmentName,
1011+
(SELECT Forename + ' ' + Surname + (CASE WHEN Active = 1 THEN '' ELSE ' (Inactive)' END) AS Expr1 FROM AdminUsers AS au1 WHERE (AdminID = @invitedByAdminId)) AS InvitedByName,
1012+
(SELECT Email FROM AdminUsers AS au2 WHERE (AdminID = @invitedByAdminId)) AS InvitedByEmail
1013+
FROM SelfAssessmentCollaborators AS sc
1014+
INNER JOIN SelfAssessments AS sa ON sc.SelfAssessmentID = sa.ID
1015+
INNER JOIN AdminUsers AS au ON sc.AdminID = au.AdminID
1016+
WHERE (sc.ID = @id) AND (sc.IsDeleted=0)",
1017+
new { invitedByAdminId, id }
1018+
).FirstOrDefault();
1019+
}
8661020
}
8671021
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace DigitalLearningSolutions.Data.Models.CompetencyAssessments
2+
{
3+
public class CompetencyAssessmentCollaborator
4+
{
5+
public int ID { get; set; }
6+
public int SelfAssessmentID { get; set; }
7+
public int? AdminID { get; set; }
8+
public bool CanModify { get; set; }
9+
}
10+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace DigitalLearningSolutions.Data.Models.CompetencyAssessments
2+
{
3+
public class CompetencyAssessmentCollaboratorDetail : CompetencyAssessmentCollaborator
4+
{
5+
public string? UserEmail { get; set; }
6+
public bool? UserActive { get; set; }
7+
public string? CompetencyAssessmentRole { get; set; }
8+
}
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace DigitalLearningSolutions.Data.Models.CompetencyAssessments
2+
{
3+
public class CompetencyAssessmentCollaboratorNotification : CompetencyAssessmentCollaboratorDetail
4+
{
5+
public string InvitedByEmail { get; set; } = string.Empty;
6+
public string InvitedByName { get; set; } = string.Empty;
7+
public string CompetencyAssessmentName { get; set; } = string.Empty;
8+
}
9+
}

0 commit comments

Comments
 (0)