11namespace  DigitalLearningSolutions . Data . DataServices 
22{ 
33    using  Dapper ; 
4+     using  DigitalLearningSolutions . Data . Extensions ; 
45    using  DigitalLearningSolutions . Data . Models . CompetencyAssessments ; 
56    using  Microsoft . Extensions . Logging ; 
67    using  System ; 
@@ -57,6 +58,7 @@ int categoryId
5758        bool  UpdateSelectCompetenciesTaskStatus ( int  assessmentId ,  bool  taskStatus ,  bool ?  previousStatus ) ; 
5859        bool  UpdateOptionalCompetenciesTaskStatus ( int  assessmentId ,  bool  taskStatus ,  bool ?  previousStatus ) ; 
5960        bool  UpdateRoleRequirementsTaskStatus ( int  assessmentId ,  bool  taskStatus ,  bool ?  previousStatus ) ; 
61+         bool  UpdateWorkingGroupTaskStatus ( int  assessmentId ,  bool  taskStatus ,  bool ?  previousStatus ) ; 
6062        void  MoveCompetencyInSelfAssessment ( int  competencyAssessmentId , 
6163            int  competencyId , 
6264            string  direction 
@@ -68,6 +70,7 @@ string direction
6870        public  bool  UpdateCompetencyAssessmentFeaturesTaskStatus ( int  id ,  bool  descriptionStatus ,  bool  providerandCategoryStatus ,  bool  vocabularyStatus , 
6971           bool  workingGroupStatus ,  bool  AllframeworkCompetenciesStatus ) ; 
7072        void  UpdateSelfAssessmentFromFramework ( int  selfAssessmentId ,  int ?  frameworkId ) ; 
73+         bool  UpdatePrimaryFrameworkCompetencies ( int  assessmentId ,  int  frameworkId ) ; 
7174
7275        //INSERT DATA 
7376        int  InsertCompetencyAssessment ( int  adminId ,  int  centreId ,  string  competencyAssessmentName ) ; 
@@ -77,6 +80,10 @@ public bool UpdateCompetencyAssessmentFeaturesTaskStatus(int id, bool descriptio
7780        //DELETE DATA 
7881        bool  RemoveFrameworkCompetenciesFromAssessment ( int  competencyAssessmentId ,  int  frameworkId ) ; 
7982        bool  RemoveCompetencyFromAssessment ( int  competencyAssessmentId ,  int  competencyId ) ; 
83+         IEnumerable < CompetencyAssessmentCollaboratorDetail >  GetCollaboratorsForCompetencyAssessmentId ( int  competencyAssessmentId ) ; 
84+         int  AddCollaboratorToCompetencyAssessment ( int  competencyAssessmentId ,  string ?  userEmail ,  bool  canModify ,  int ?  centreID ) ; 
85+         void  RemoveCollaboratorFromCompetencyAssessment ( int  competencyAssessmentId ,  int  id ) ; 
86+         CompetencyAssessmentCollaboratorNotification ?  GetCollaboratorNotification ( int  id ,  int  invitedByAdminId ) ; 
8087    } 
8188
8289    public  class  CompetencyAssessmentDataService  :  ICompetencyAssessmentDataService 
@@ -646,6 +653,23 @@ public bool UpdateRoleRequirementsTaskStatus(int assessmentId, bool taskStatus,
646653            } 
647654            return  true ; 
648655        } 
656+         public  bool  UpdateWorkingGroupTaskStatus ( int  assessmentId ,  bool  taskStatus ,  bool ?  previousStatus ) 
657+         { 
658+             var  numberOfAffectedRows  =  connection . Execute ( 
659+                @"UPDATE SelfAssessmentTaskStatus SET WorkingGroupTaskStatus = @taskStatus 
660+                     WHERE SelfAssessmentId = @assessmentId AND (@previousStatus IS NULL OR WorkingGroupTaskStatus = @previousStatus)" , 
661+                new  {  assessmentId ,  taskStatus ,  previousStatus  } 
662+            ) ; 
663+             if  ( numberOfAffectedRows  <  1 ) 
664+             { 
665+                 logger . LogWarning ( 
666+                     "Not updating WorkingGroupTaskStatus as db update failed. "  + 
667+                     $ "assessmentId: { assessmentId } , taskStatus: { taskStatus } "
668+                 ) ; 
669+                 return  false ; 
670+             } 
671+             return  true ; 
672+         } 
649673
650674        public  IEnumerable < Competency >  GetCompetenciesForCompetencyAssessment ( int  competencyAssessmentId ) 
651675        { 
@@ -747,7 +771,7 @@ public void MoveCompetencyInSelfAssessment(int competencyAssessmentId, int compe
747771                    new  {  SelfAssessmentID  =  competencyAssessmentId ,  CompetencyID  =  competencyId ,  Direction  =  direction  } , 
748772                    commandType :  CommandType . StoredProcedure 
749773                ) ; 
750-              
774+ 
751775        } 
752776
753777        public  void  MoveCompetencyGroupInSelfAssessment ( int  competencyAssessmentId ,  int  groupId ,  string  direction ) 
@@ -811,12 +835,12 @@ FROM  SelfAssessments s INNER JOIN
811835	          WHERE s.ID = @competencyAssessmentId" , 
812836               new  {  competencyAssessmentId  } 
813837           ) ; 
814-              
838+ 
815839        } 
816840
817-         public  void  UpdateSelfAssessmentFromFramework (   int  selfAssessmentId ,  int ?  frameworkId ) 
841+         public  void  UpdateSelfAssessmentFromFramework ( int  selfAssessmentId ,  int ?  frameworkId ) 
818842        { 
819-             
843+ 
820844            var  numberOfAffectedRows  =  connection . Execute ( 
821845                @"UPDATE s 
822846                    SET  
@@ -828,22 +852,22 @@ FROM SelfAssessments s
828852                    INNER JOIN AdminUsers AU ON F.OwnerAdminID = AU.AdminID 
829853                    WHERE s.id = @selfAssessmentId;" 
830854            , 
831-                 new  { selfAssessmentId ,  frameworkId  } 
855+                 new  {   selfAssessmentId ,  frameworkId  } 
832856            ) ; 
833857        } 
834858        public  bool  InsertSelfAssessmentStructure ( int  selfAssessmentId ,  int ?  frameworkId ) 
835859        { 
836860
837-                  var  numberOfAffectedRows  =  connection . Execute ( 
838-                  @"INSERT INTO SelfAssessmentStructure (SelfAssessmentID, CompetencyID, Ordering, CompetencyGroupID) 
861+             var  numberOfAffectedRows  =  connection . Execute ( 
862+             @"INSERT INTO SelfAssessmentStructure (SelfAssessmentID, CompetencyID, Ordering, CompetencyGroupID) 
839863                SELECT s.ID, FC.CompetencyID, ROW_NUMBER() OVER( ORDER BY FCG.Ordering, FC.Ordering ), FCG.CompetencyGroupID 
840864                 FROM FrameworkCompetencies AS FC  
841865                INNER JOIN FrameworkCompetencyGroups AS FCG ON FC.FrameworkCompetencyGroupID = FCG.ID INNER JOIN 
842866				SelfAssessments s ON s.id = @selfAssessmentId 
843867                WHERE FC.FrameworkID = @frameworkId" 
844-              , 
845-                  new  {  selfAssessmentId ,  frameworkId  } 
846-              ) ; 
868+         , 
869+             new  {  selfAssessmentId ,  frameworkId  } 
870+         ) ; 
847871            if  ( numberOfAffectedRows  <  1 ) 
848872            { 
849873                logger . LogWarning ( 
@@ -855,13 +879,183 @@ FROM FrameworkCompetencies AS FC
855879
856880            return  true ; 
857881        } 
882+        
883+         public  bool  UpdatePrimaryFrameworkCompetencies ( int  assessmentId ,  int  frameworkId ) 
884+         { 
885+             connection . EnsureOpen ( ) ; 
886+             using  ( var  transaction  =  connection . BeginTransaction ( ) ) 
887+             { 
888+                     var  numberOfAffectedRows  =  connection . Execute ( 
889+                         @"UPDATE SelfAssessmentFrameworks  
890+                   SET IsPrimary = 0   
891+                   WHERE (SelfAssessmentId = @assessmentId)  
892+                     AND (RemovedDate IS NULL)" , 
893+                         new  {  assessmentId  } , 
894+                         transaction :  transaction 
895+                     ) ; 
896+ 
897+                     var  numberOfAffectedRow  =  connection . Execute ( 
898+                         @"UPDATE SelfAssessmentFrameworks  
899+                   SET IsPrimary = 1   
900+                   WHERE (SelfAssessmentId = @assessmentId)  
901+                     AND (FrameworkId = @frameworkId)  
902+                     AND (RemovedDate IS NULL)" , 
903+                         new  {  assessmentId ,  frameworkId  } , 
904+                         transaction :  transaction 
905+                     ) ; 
906+ 
907+                     if  ( ( numberOfAffectedRow  <  1 )  ||  ( numberOfAffectedRows  <  1 ) ) 
908+                     { 
909+                         logger . LogWarning ( 
910+                             "Not updating SelfAssessmentFrameworks as db update failed. "  + 
911+                             $ "assessmentId: { assessmentId } , frameworkId: { frameworkId } "
912+                         ) ; 
913+                         transaction . Rollback ( ) ; 
914+                         return  false ; 
915+                     } 
916+ 
917+                     transaction . Commit ( ) ; 
918+                     return  true ; 
919+             } 
920+         } 
858921        public  int ?  GetSelfAssessmentStructure ( int  competencyAssessmentId ) 
859922        { 
860923            return  connection . QueryFirstOrDefault < int > ( 
861924               @"SELECT 1 from dbo.SelfAssessmentStructure where selfassessmentid  = @competencyAssessmentId" , 
862925               new  {  competencyAssessmentId  } 
863-            ) ; 
926+                ) ; 
927+         } 
928+         public  IEnumerable < CompetencyAssessmentCollaboratorDetail >  GetCollaboratorsForCompetencyAssessmentId ( int  competencyAssessmentId ) 
929+         { 
930+             return  connection . Query < CompetencyAssessmentCollaboratorDetail > ( 
931+                 @"SELECT 
932+                         0 AS ID, 
933+                         sa.ID AS SelfAssessmentID, 
934+                         au.AdminID AS AdminID, 
935+                         1 AS CanModify, 
936+                         au.Email AS UserEmail, 
937+                         au.Active AS UserActive, 
938+                         'Owner' AS CompetencyAssessmentRole 
939+                     FROM SelfAssessments AS sa 
940+                     INNER JOIN AdminUsers AS au ON sa.CreatedByAdminID = au.AdminID 
941+                     WHERE (sa.ID = @competencyAssessmentId) 
942+                     UNION ALL 
943+                     SELECT 
944+                         ID, 
945+                         SelfAssessmentID, 
946+                         sc.AdminID, 
947+                         CanModify, 
948+                         UserEmail, 
949+                         au.Active AS UserActive, 
950+                         CASE WHEN CanModify = 1 THEN 'Contributor' ELSE 'Reviewer' END AS CompetencyAssessmentRole 
951+                     FROM SelfAssessmentCollaborators sc 
952+                     INNER JOIN AdminUsers AS au ON sc.AdminID = au.AdminID 
953+                         AND sc.IsDeleted = 0 
954+                     WHERE (SelfAssessmentID = @competencyAssessmentId)" , 
955+                 new  {  competencyAssessmentId  } 
956+             ) ; 
957+         } 
958+         public  int  AddCollaboratorToCompetencyAssessment ( int  competencyAssessmentId ,  string ?  userEmail ,  bool  canModify ,  int ?  centreID ) 
959+         { 
960+             if  ( userEmail  is  null  ||  userEmail . Length  ==  0 ) 
961+             { 
962+                 logger . LogWarning ( 
963+                     $ "Not adding collaborator to competency assessment as it failed server side valiidation. competencyAssessmentId: { competencyAssessmentId } , userEmail: { userEmail } , canModify:{ canModify } "
964+                 ) ; 
965+                 return  - 3 ; 
966+             } 
967+ 
968+             var  existingId  =  connection . QuerySingle < int > ( 
969+                 @"SELECT COALESCE 
970+                      ((SELECT ID 
971+                       FROM    SelfAssessmentCollaborators 
972+                       WHERE (SelfAssessmentID = @competencyAssessmentId) AND (UserEmail = @userEmail) AND (IsDeleted=0)), 0) AS ID" , 
973+                 new  {  competencyAssessmentId ,  userEmail  } 
974+             ) ; 
975+             if  ( existingId  >  0 ) 
976+             { 
977+                 return  - 2 ; 
978+             } 
979+ 
980+             var  adminId  =  ( int ? ) connection . ExecuteScalar ( 
981+                 @"SELECT AdminID FROM AdminUsers WHERE Email = @userEmail AND Active = 1 AND CentreID = @centreID" , 
982+                 new  {  userEmail ,  centreID  } 
983+             ) ; 
984+             if  ( adminId  is  null ) 
985+             { 
986+                 return  - 4 ; 
987+             } 
988+ 
989+             var  ownerEmail  =  ( string ? ) connection . ExecuteScalar ( @"SELECT AU.Email FROM SelfAssessments SA 
990+                             INNER JOIN AdminUsers AU ON AU.AdminID = SA.CreatedByAdminID 
991+                             WHERE SA.ID = @competencyAssessmentId" ,  new  {  competencyAssessmentId  } ) ; 
992+             if  ( ownerEmail  ==  userEmail ) 
993+             { 
994+                 return  - 5 ; 
995+             } 
996+ 
997+             var  numberOfAffectedRows  =  connection . Execute ( 
998+                 @"INSERT INTO SelfAssessmentCollaborators (SelfAssessmentID, AdminID, UserEmail, CanModify) 
999+                     VALUES (@competencyAssessmentId, @adminId, @userEmail, @canModify)" , 
1000+                 new  {  competencyAssessmentId ,  adminId ,  userEmail ,  canModify  } 
1001+             ) ; 
1002+             if  ( numberOfAffectedRows  <  1 ) 
1003+             { 
1004+                 logger . LogWarning ( 
1005+                     $ "Not inserting framework collaborator as db insert failed. AdminId: { adminId } , userEmail: { userEmail } , competencyAssessmentId: { competencyAssessmentId } , canModify: { canModify } "
1006+                 ) ; 
1007+                 return  - 1 ; 
1008+             } 
8641009
1010+             if  ( adminId  >  0 ) 
1011+             { 
1012+                 connection . Execute ( 
1013+                     @"UPDATE AdminUsers SET IsWorkforceManager = 1 WHERE AdminId = @adminId AND IsWorkforceManager = 0" , 
1014+                     new  {  adminId  } 
1015+                 ) ; 
1016+             } 
1017+ 
1018+             existingId  =  connection . QuerySingle < int > ( 
1019+                 @"SELECT COALESCE 
1020+                      ((SELECT ID 
1021+                       FROM    SelfAssessmentCollaborators 
1022+                       WHERE (SelfAssessmentID = @competencyAssessmentId) AND (UserEmail = @userEmail) AND (IsDeleted=0)), 0) AS AdminID" , 
1023+                 new  {  competencyAssessmentId ,  adminId ,  userEmail  } 
1024+             ) ; 
1025+             return  existingId ; 
1026+         } 
1027+ 
1028+         public  void  RemoveCollaboratorFromCompetencyAssessment ( int  competencyAssessmentId ,  int  id ) 
1029+         { 
1030+             var  adminId  =  ( int ? ) connection . ExecuteScalar ( 
1031+                 @"SELECT AdminID FROM SelfAssessmentCollaborators WHERE  (SelfAssessmentID = @competencyAssessmentId) AND (ID = @id)" , 
1032+                 new  {  competencyAssessmentId ,  id  } 
1033+             ) ; 
1034+             connection . Execute ( 
1035+                 @"UPDATE SelfAssessmentCollaborators SET IsDeleted=1 WHERE (SelfAssessmentID = @competencyAssessmentId) AND (ID = @id); 
1036+                     UPDATE AdminUsers SET IsWorkforceManager = 0 WHERE AdminID = @adminId AND AdminID NOT IN (SELECT DISTINCT AdminID FROM SelfAssessmentCollaborators);" , 
1037+                 new  {  competencyAssessmentId ,  id ,  adminId  } 
1038+             ) ; 
1039+         } 
1040+         public  CompetencyAssessmentCollaboratorNotification ?  GetCollaboratorNotification ( int  id ,  int  invitedByAdminId ) 
1041+         { 
1042+             return  connection . Query < CompetencyAssessmentCollaboratorNotification > ( 
1043+                 @"SELECT 
1044+                     sc.SelfAssessmentID, 
1045+                     sc.AdminID, 
1046+                     sc.CanModify, 
1047+                     sc.UserEmail, 
1048+                     au.Active AS UserActive, 
1049+                     CASE WHEN sc.CanModify = 1 THEN 'Contributor' ELSE 'Reviewer' END AS CompetencyAssessmentRole, 
1050+                     sa.[Name] AS CompetencyAssessmentName, 
1051+                     (SELECT Forename + ' ' + Surname + (CASE WHEN Active = 1 THEN '' ELSE ' (Inactive)' END) AS Expr1 FROM AdminUsers AS au1 WHERE (AdminID = @invitedByAdminId)) AS InvitedByName, 
1052+                     (SELECT Email FROM AdminUsers AS au2 WHERE (AdminID = @invitedByAdminId)) AS InvitedByEmail 
1053+                 FROM SelfAssessmentCollaborators AS sc 
1054+                 INNER JOIN SelfAssessments AS sa ON sc.SelfAssessmentID = sa.ID 
1055+                 INNER JOIN AdminUsers AS au ON sc.AdminID = au.AdminID 
1056+                 WHERE (sc.ID = @id) AND (sc.IsDeleted=0)" , 
1057+                 new  {  invitedByAdminId ,  id  } 
1058+             ) . FirstOrDefault ( ) ; 
8651059        } 
8661060    } 
8671061} 
0 commit comments