Browse Source

TLD-532/533 Ajout des méthodes getAverageScore et getInteractions

Mael ETIENNE 3 years ago
parent
commit
1646e93c50
1 changed files with 158 additions and 6 deletions
  1. 158
    6
      Services/ScormEngine.php

+ 158
- 6
Services/ScormEngine.php View File

@@ -12,6 +12,7 @@ use Logipro\Bundle\SCORMBundle\Entity\ZipFile;
12 12
 use Logipro\Bundle\SCORMBundle\Entity\Scorm2004\Scorm2004Track;
13 13
 use Logipro\Bundle\SCORMBundle\Entity\Scorm2004\Scorm2004MapTrackItem;
14 14
 use Logipro\Bundle\SCORMBundle\Entity\Scorm2004\Scorm2004AttemptProgressInformation;
15
+use Logipro\Bundle\SCORMBundle\Entity\Scorm2004\Scorm2004Interaction;
15 16
 use Logipro\Bundle\SCORMBundle\LearningModels\DOMSCORM12;
16 17
 use Logipro\Bundle\SCORMBundle\LearningModels\DOMSCORM2004;
17 18
 use Logipro\Bundle\SCORMBundle\Package\Common\PackageTypeDetector;
@@ -775,7 +776,7 @@ class ScormEngine implements ContainerAwareInterface
775 776
     }
776 777
 
777 778
     /**
778
-     * Récupération de la complétion d'une activité
779
+     * Récupération de la complétion d'un cours
779 780
      *
780 781
      * @param string $registrationKey
781 782
      */
@@ -802,10 +803,6 @@ class ScormEngine implements ContainerAwareInterface
802 803
             return 0;
803 804
         }
804 805
 
805
-/*      // Récupération du DOM afin d'avoir des infos sur les items
806
-        $packageFolder = $this->container->getParameter('logipro_scorm.package_folder');
807
-        $domScorm2004 = $lastAttempt->getDOM($packageFolder); */
808
-
809 806
         // Dans un premier temps on détermine si la complétion peut être remontée
810 807
         // en se basant sur l'état de complétion de l'ensemble des items terminaux
811 808
         
@@ -859,11 +856,166 @@ class ScormEngine implements ContainerAwareInterface
859 856
             return round(100.0 * $completionAmount, 2);
860 857
         }
861 858
 
862
-        $progressStatus = $attelastOrganizationAttemptmptItem->getProgressStatus();
859
+        $progressStatus = $lastOrganizationAttempt->getProgressStatus();
863 860
         $completionStatus = $lastOrganizationAttempt->getCompletionStatus();
864 861
         if (true == $progressStatus && true == $completionStatus) {
865 862
             return 100;
866 863
         }
864
+
865
+        return 0;
866
+    }
867
+
868
+    /**
869
+     * Récupération du score moyen d'un cours
870
+     *
871
+     * @param string $registrationKey
872
+     */
873
+    public function getAverageScore(string $registrationKey)
874
+    {
875
+        $em = $this->getDoctrine()->getManager();
876
+        
877
+        // Vérification de l'existance de l'inscription
878
+        $registration = $this->requireRegistration($registrationKey);
879
+        if (empty($registration)) {
880
+            return null;
881
+        }
882
+        
883
+        // Récupération du dernier essai pour cette inscription
884
+        $registrationAttemptRepository = $em->getRepository(RegistrationAttempt::class);
885
+        $lastAttempt = $registrationAttemptRepository->findOneBy(array('registration' => $registration), array('registrationAttemptId' => 'desc'));
886
+
887
+// DETECTER AVANT LE TYPE DE SCORM POUR SAVOIR QUEL STANDARD
888
+// CODE SCORM 2004
889
+        // On récupère le track correspondant
890
+        $track2004Repository = $em->getRepository(Scorm2004Track::class);
891
+        $track2004 = $track2004Repository->findOneBy(array('registrationAttempt' => $lastAttempt));
892
+        if (empty($track2004)) {
893
+            return null;
894
+        }
895
+        
896
+        $mapTrackItemRepository = $em->getRepository(Scorm2004MapTrackItem::class);
897
+        
898
+        $mapTrackItems = $mapTrackItemRepository->findBy(array('scorm2004Track' => $track2004));
899
+
900
+        $averageScore = null;
901
+
902
+        if (!empty($mapTrackItems)) {
903
+            $scoreSum = 0;
904
+            $scoreNum = 0;
905
+
906
+            foreach ($mapTrackItems as $item) {
907
+                $scoreMax = $item->getScoreMax();
908
+                // Si pas de score max, pas de score valide
909
+                if ($scoreMax > 0) {
910
+                    $score = $item->getScoreRaw();
911
+                    $score = $score * 100 / $scoreMax;
912
+                    $score = max(min($score, 100), 0);
913
+
914
+                    $scoreNum ++;
915
+                    $scoreSum += $score;
916
+                }
917
+            }
918
+
919
+            if ($scoreNum > 0) {
920
+                $averageScore = $scoreSum / $scoreNum;
921
+                $averageScore = round($averageScore, 2);
922
+            }
923
+        }
924
+
925
+        return $averageScore;
926
+    }
927
+
928
+    /**
929
+     * Récupération des interactions d'un cours
930
+     * Elles sont rangées par item
931
+     *
932
+     * @param string $registrationKey
933
+     */
934
+    public function getInteractions(string $registrationKey)
935
+    {
936
+        $em = $this->getDoctrine()->getManager();
937
+        
938
+        // Vérification de l'existance de l'inscription
939
+        $registration = $this->requireRegistration($registrationKey);
940
+        if (empty($registration)) {
941
+            return null;
942
+        }
943
+        
944
+        // Récupération du dernier essai pour cette inscription
945
+        $registrationAttemptRepository = $em->getRepository(RegistrationAttempt::class);
946
+        $lastAttempt = $registrationAttemptRepository->findOneBy(array('registration' => $registration), array('registrationAttemptId' => 'desc'));
947
+
948
+// DETECTER AVANT LE TYPE DE SCORM POUR SAVOIR QUEL STANDARD
949
+// CODE SCORM 2004
950
+        // On récupère le track correspondant
951
+        $track2004Repository = $em->getRepository(Scorm2004Track::class);
952
+        $track2004 = $track2004Repository->findOneBy(array('registrationAttempt' => $lastAttempt));
953
+        if (empty($track2004)) {
954
+            return null;
955
+        }
956
+        
957
+        $mapTrackItemRepository = $em->getRepository(Scorm2004MapTrackItem::class);
958
+        
959
+        // Récupération des données pour chaque items
960
+        $mapTrackItems = $mapTrackItemRepository->findBy(array('scorm2004Track' => $track2004));
961
+
962
+        $interactions = array();
963
+
964
+        if (!empty($mapTrackItems)) {
965
+            // Récupération du DOM afin d'avoir des infos sur les items
966
+            $packageFolder = $this->container->getParameter('logipro_scorm.package_folder');
967
+            $domScorm2004 = $lastAttempt->getDOM($packageFolder);
968
+
969
+            $attemptItemRepository = $em->getRepository(Scorm2004AttemptProgressInformation::class);
970
+            $interactionRepository = $em->getRepository(Scorm2004Interaction::class);
971
+
972
+            // Pour chaque item
973
+            foreach ($mapTrackItems as $item) {
974
+                // On récupère l'identifiant de l'item
975
+                $identifier = $item->getItemIdentifier();
976
+
977
+                // On récupère le dernier AttemptProgressInfo en cours
978
+                $attemptItem = $attemptItemRepository->findOneBy(array('scorm2004Track'=> $track2004, 'item_identifier' => $identifier), array('attempt_id' => 'desc'));
979
+
980
+                // On récupère les interactions pour cet item et cet Attempt
981
+                $itemInteractions = $interactionRepository->findBy(array('scorm2004Track' => $track2004, 'scorm2004AttemptProgressInformation' => $attemptItem, 'itemIdentifier' => $identifier), array('interaction_id' => 'asc'));
982
+
983
+                // Si il existe des interactions
984
+                if (!empty($itemInteractions)) {
985
+                    $result = array();
986
+                    
987
+                    // On récupère le nom de l'item
988
+                    $result['title'] = $domScorm2004->getTitle($identifier);
989
+                    
990
+                    // On Récupère le Score sur le mapTrackItem
991
+                    $score = null;
992
+                    $scoreMax = $item->getScoreMax();
993
+                    // Si pas de score max, pas de score valide
994
+                    if ($scoreMax > 0) {
995
+                        $score = $item->getScoreRaw();
996
+                        $score = $score * 100 / $scoreMax;
997
+                        $score = max(min($score, 100), 0);
998
+                    }
999
+                    $result['score'] = $score;
1000
+
1001
+                    // On récupère le Lesson Status (si on peut / voir Dans AI quoi envoyé pour avoir un résultat neutre à l'affichage)
1002
+                    $status = $attemptItem->getSuccessStatus();
1003
+                    $result['lessonStatus'] = $status;
1004
+
1005
+                    // On ajoute les objets interactions
1006
+                    $result['interactions'] = $itemInteractions;
1007
+
1008
+                    // On ajoute ce lot d'interaction aux interactions du cours
1009
+                    $interactions[] = $result;
1010
+                }
1011
+            }
1012
+        }
1013
+
1014
+        if (count($interactions) > 0) {
1015
+            return $interactions;
1016
+        }
1017
+
1018
+        return null;
867 1019
     }
868 1020
 
869 1021
     /**

Loading…
Cancel
Save