diff --git a/plugin/migrationmoodle/admin.php b/plugin/migrationmoodle/admin.php index 50fd3934d4..e670c518ee 100644 --- a/plugin/migrationmoodle/admin.php +++ b/plugin/migrationmoodle/admin.php @@ -97,6 +97,7 @@ $menu = [ ], 'users_learn_paths' => [ 'users_learn_paths_lesson_timer', + 'users_learn_paths_lesson_branch', ], 'users_scorms_view' => [ 'users_scorms_progress', diff --git a/plugin/migrationmoodle/lang/english.php b/plugin/migrationmoodle/lang/english.php index cd00b3e84b..bc6e863493 100644 --- a/plugin/migrationmoodle/lang/english.php +++ b/plugin/migrationmoodle/lang/english.php @@ -61,3 +61,4 @@ $strings['UsersLearnPathsTask'] = 'Learn paths views of users'; $strings['UsersLearnPathsLessonTimerTask'] = 'Lesson timer to start time of Learn paths section'; $strings['QuizzesScoresTask'] = 'Update quiz scores in learn path'; $strings['QuestionGapselectTask'] = 'Answers for gapselect questions'; +$strings['UsersLearnPathsLessonBranchTask'] = 'Lesson branch to total time in learn paths documents'; diff --git a/plugin/migrationmoodle/src/Loader/UserLearnPathLessonBranchLoader.php b/plugin/migrationmoodle/src/Loader/UserLearnPathLessonBranchLoader.php new file mode 100644 index 0000000000..530ebd93ef --- /dev/null +++ b/plugin/migrationmoodle/src/Loader/UserLearnPathLessonBranchLoader.php @@ -0,0 +1,105 @@ +find('ChamiloCourseBundle:CLpItem', $incomingData['item_id']); + + if (!$item) { + throw new \Exception("LP item ({$incomingData['item_id']}) not found."); + } + + $itemView = $this->findViewOfItem($incomingData); + + if ($item->getDisplayOrder() !== 1) { + $previuousItemView = $this->findViewOfPreviousItem($incomingData); + + $itemView->setStartTime( + $previuousItemView->getStartTime() + $previuousItemView->getTotalTime() + ); + } + + $totalTime = $incomingData['end_time'] - $itemView->getStartTime(); + + $itemView + ->setStatus('completed') + ->setTotalTime($totalTime); + + $em->persist($itemView); + $em->flush(); + + return $itemView->getId(); + } + + /** + * @param array $incomingData + * + * @throws \Doctrine\ORM\NonUniqueResultException + * + * @return CLpItemView + */ + private function findViewOfItem(array $incomingData) + { + /** @var CLpItemView $itemView */ + $itemView = \Database::getManager() + ->createQuery("SELECT lpiv + FROM ChamiloCourseBundle:CLpItemView lpiv + INNER JOIN ChamiloCourseBundle:CLpView lpv WITH (lpv.iid = lpiv.lpViewId AND lpv.cId = lpiv.cId) + WHERE lpiv.lpItemId = :item_id AND lpv.userId = :user_id") + ->setMaxResults(1) + ->setParameters(['item_id' => $incomingData['item_id'], 'user_id' => $incomingData['user_id']]) + ->getOneOrNullResult(); + + if (!$itemView) { + throw new \Exception("Item view not found for " + ."item ({$incomingData['item_id']}) and user ({$incomingData['user_id']})."); + } + + return $itemView; + } + + /** + * @param array $incomingData + * + * @throws \Doctrine\ORM\NonUniqueResultException + * + * @return CLpItemView + */ + private function findViewOfPreviousItem(array $incomingData) + { + /** @var CLpItemView $previuousItemView */ + $previuousItemView = \Database::getManager() + ->createQuery("SELECT lpiv + FROM ChamiloCourseBundle:CLpItemView lpiv + INNER JOIN ChamiloCourseBundle:CLpView lpv WITH (lpv.iid = lpiv.lpViewId AND lpv.cId = lpiv.cId) + INNER JOIN ChamiloCourseBundle:CLpItem lpi WITH (lpi.iid = lpiv.lpItemId AND lpi.cId = lpiv.cId) + WHERE lpi.nextItemId = :item_id AND lpv.userId = :user_id") + ->setMaxResults(1) + ->setParameters(['item_id' => $incomingData['item_id'], 'user_id' => $incomingData['user_id']]) + ->getOneOrNullResult(); + + if (!$previuousItemView) { + throw new \Exception("Item view not found for " + ."previous item ({$incomingData['item_id']}) and user ({$incomingData['user_id']})."); + } + + return $previuousItemView; + } +} diff --git a/plugin/migrationmoodle/src/Task/UsersLearnPathsLessonBranchTask.php b/plugin/migrationmoodle/src/Task/UsersLearnPathsLessonBranchTask.php new file mode 100644 index 0000000000..1f5b64a7c0 --- /dev/null +++ b/plugin/migrationmoodle/src/Task/UsersLearnPathsLessonBranchTask.php @@ -0,0 +1,71 @@ + LoadedUsersFilterExtractor::class, + 'query' => "SELECT * FROM mdl_lesson_branch", + ]; + } + + /** + * @inheritDoc + */ + public function getTransformConfiguration() + { + return [ + 'class' => BaseTransformer::class, + 'map' => [ + 'parent_item_id' => [ + 'class' => LoadedCourseModuleLessonLookup::class, + 'properties' => ['lessonid'], + ], + 'item_id' => [ + 'class' => LoadedLessonPageLookup::class, + 'properties' => ['pageid'], + ], + 'user_id' => [ + 'class' => LoadedUserLookup::class, + 'properties' => ['userid'], + ], + 'end_time' => 'timeseen', + 'session_id' => [ + 'class' => LoadedUserSessionLookup::class, + 'properties' => ['userid'], + ], + 'view_count' => 'retry', + ], + ]; + } + + /** + * @inheritDoc + */ + public function getLoadConfiguration() + { + return [ + 'class' => UserLearnPathLessonBranchLoader::class, + ]; + } +}