Browse Source

Ajout de getCompletion

Mael ETIENNE 3 years ago
parent
commit
8717925534
1 changed files with 95 additions and 0 deletions
  1. 95
    0
      Services/ScormEngine.php

+ 95
- 0
Services/ScormEngine.php View File

@@ -9,6 +9,9 @@ use Logipro\Bundle\SCORMBundle\Entity\MapCourseZipfile;
9 9
 use Logipro\Bundle\SCORMBundle\Entity\Registration;
10 10
 use Logipro\Bundle\SCORMBundle\Entity\RegistrationAttempt;
11 11
 use Logipro\Bundle\SCORMBundle\Entity\ZipFile;
12
+use Logipro\Bundle\SCORMBundle\Entity\Scorm2004\Scorm2004Track;
13
+use Logipro\Bundle\SCORMBundle\Entity\Scorm2004\Scorm2004MapTrackItem;
14
+use Logipro\Bundle\SCORMBundle\Entity\Scorm2004\Scorm2004AttemptProgressInformation;
12 15
 use Logipro\Bundle\SCORMBundle\LearningModels\DOMSCORM12;
13 16
 use Logipro\Bundle\SCORMBundle\LearningModels\DOMSCORM2004;
14 17
 use Logipro\Bundle\SCORMBundle\Package\Common\PackageTypeDetector;
@@ -771,6 +774,98 @@ class ScormEngine implements ContainerAwareInterface
771 774
         return $variables;
772 775
     }
773 776
 
777
+    /**
778
+     * Récupération de la complétion d'une activité
779
+     *
780
+     * @param string $registrationKey
781
+     */
782
+    public function getCompletion(string $registrationKey)
783
+    {
784
+        $em = $this->getDoctrine()->getManager();
785
+        
786
+        // Vérification de l'existance de l'inscription
787
+        $registration = $this->requireRegistration($registrationKey);
788
+        if (empty($registration)) {
789
+            return 0;
790
+        }
791
+        
792
+        // Récupération du dernier essai pour cette inscription
793
+        $registrationAttemptRepository = $em->getRepository(RegistrationAttempt::class);
794
+        $lastAttempt = $registrationAttemptRepository->findOneBy(array('registration' => $registration), array('registrationAttemptId' => 'desc'));
795
+
796
+// DETECTER AVANT LE TYPE DE SCORM POUR SAVOIR QUEL STANDARD
797
+// CODE SCORM 2004
798
+        // On récupère le track correspondant
799
+        $track2004Repository = $em->getRepository(Scorm2004Track::class);
800
+        $track2004 = $track2004Repository->findOneBy(array('registrationAttempt' => $lastAttempt));
801
+        if (empty($track2004)) {
802
+            return 0;
803
+        }
804
+
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
+        // Dans un premier temps on détermine si la complétion peut être remontée
810
+        // en se basant sur l'état de complétion de l'ensemble des items terminaux
811
+        
812
+        $mapTrackItemRepository = $em->getRepository(Scorm2004MapTrackItem::class);
813
+        $attemptItemRepository = $em->getRepository(Scorm2004AttemptProgressInformation::class);
814
+        
815
+        $mapTrackItems = $mapTrackItemRepository->findBy(array('scorm2004Track' => $track2004));
816
+
817
+        if (!empty($mapTrackItems)) {
818
+            $numCompletedItems = 0;
819
+            $numFinalItems = 0;
820
+            foreach ($mapTrackItems as $item) {
821
+                // Si les items sont terminaux
822
+                if ($item->getAvailableOrder() > -1) {
823
+                    $numFinalItems ++;
824
+                    $identifier = $item->getItemIdentifier();
825
+                    $attemptItem = $attemptItemRepository->findOneBy(array('scorm2004Track'=> $track2004, 'item_identifier' => $identifier), array('attempt_id' => 'desc'));
826
+                    if (!empty($attemptItem)) {
827
+                        $progressStatus = $attemptItem->getProgressStatus();
828
+                        $completionStatus = $attemptItem->getCompletionStatus();
829
+                        if (true == $progressStatus && true == $completionStatus) {
830
+                            $numCompletedItems ++;
831
+                        }
832
+                    }
833
+                }
834
+            }
835
+
836
+            if ($numFinalItems != 0) {
837
+                $completion = 100.0 * ($numCompletedItems / $numFinalItems);
838
+                $completion = round($completion, 2);
839
+                // Si on obtient une valeur de complétion elle est retournée
840
+                if ($completion > 0) {
841
+                    return $completion;
842
+                }
843
+            }
844
+        }
845
+
846
+        // Si aucune complétion n'a été déterminée précédement on controle que l'on aie pas un taux de complétion présent au niveau de l'organisation
847
+        $organization = $track2004->getOrganizationId();
848
+        if (empty($organization)) {
849
+            return 0;
850
+        }
851
+
852
+        $lastOrganizationAttempt = $attemptItemRepository->findOneBy(array('scorm2004Track'=> $track2004, 'item_identifier' => $organization), array('attempt_id' => 'desc'));
853
+        if (empty($lastOrganizationAttempt)) {
854
+            return 0;
855
+        }
856
+
857
+        $completionAmount = $lastOrganizationAttempt->getCompletionAmount();
858
+        if ($completionAmount > 0) {
859
+            return round(100.0 * $completionAmount, 2);
860
+        }
861
+
862
+        $progressStatus = $attelastOrganizationAttemptmptItem->getProgressStatus();
863
+        $completionStatus = $lastOrganizationAttempt->getCompletionStatus();
864
+        if (true == $progressStatus && true == $completionStatus) {
865
+            return 100;
866
+        }
867
+    }
868
+
774 869
     /**
775 870
      * supprime une inscription
776 871
      *

Loading…
Cancel
Save