From f79bcfe268c886d1ac6146375ff0b5ef06b5bb3a Mon Sep 17 00:00:00 2001 From: Angel Fernando Quiroz Campos Date: Tue, 24 Mar 2020 13:58:30 -0500 Subject: [PATCH] MigrationMoodle: Fix user views for scorm - refs BT#15992 --- .../src/Loader/UsersScormsViewLoader.php | 29 ++++++++++++- .../Property/ScormScoTrackData.php | 41 ++++++++++++++++--- 2 files changed, 62 insertions(+), 8 deletions(-) diff --git a/plugin/migrationmoodle/src/Loader/UsersScormsViewLoader.php b/plugin/migrationmoodle/src/Loader/UsersScormsViewLoader.php index 59a0a178e9..33e65984a6 100644 --- a/plugin/migrationmoodle/src/Loader/UsersScormsViewLoader.php +++ b/plugin/migrationmoodle/src/Loader/UsersScormsViewLoader.php @@ -29,6 +29,8 @@ class UsersScormsViewLoader implements LoaderInterface $sessionId ); + $lpItemViewId = $this->getLpItemView($lpViewId, $incomingData['lp_item_id']); + $itemView = [ 'c_id' => $incomingData['c_id'], 'lp_item_id' => $incomingData['lp_item_id'], @@ -47,8 +49,12 @@ class UsersScormsViewLoader implements LoaderInterface } } - $lpItemViewId = \Database::insert($tblLpItemView, $itemView); - \Database::query("UPDATE $tblLpItemView SET id = iid WHERE iid = $lpItemViewId"); + if (empty($lpItemViewId)) { + $lpItemViewId = \Database::insert($tblLpItemView, $itemView); + \Database::query("UPDATE $tblLpItemView SET id = iid WHERE iid = $lpItemViewId"); + } else { + \Database::update($tblLpItemView, $itemView, ['iid = ?' => [$lpItemViewId]]); + } \Database::query( "UPDATE $tblLpView @@ -135,4 +141,23 @@ class UsersScormsViewLoader implements LoaderInterface return $lpView['iid']; } + + /** + * @param int $lpViewId + * @param int $lpItemId + * + * @return int + */ + private function getLpItemView($lpViewId, $lpItemId) + { + $lpItemView = \Database::fetch_assoc( + \Database::query("SELECT iid FROM c_lp_item_view WHERE lp_view_id = $lpViewId AND lp_item_id = $lpItemId") + ); + + if (empty($lpItemView)) { + return 0; + } + + return $lpItemView['iid']; + } } diff --git a/plugin/migrationmoodle/src/Transformer/Property/ScormScoTrackData.php b/plugin/migrationmoodle/src/Transformer/Property/ScormScoTrackData.php index b84d21bdd0..d5dc975cd1 100644 --- a/plugin/migrationmoodle/src/Transformer/Property/ScormScoTrackData.php +++ b/plugin/migrationmoodle/src/Transformer/Property/ScormScoTrackData.php @@ -23,7 +23,13 @@ class ScormScoTrackData implements TransformPropertyInterface $trackData = current($data); $strComponents = explode(self::SEPARATOR_COMPONENTS, $trackData); - $itemData = []; + $trackData = []; + + foreach ($strComponents as $strComponent) { + list($component, $value) = explode(self::SEPARATOR_VALUES, $strComponent); + + $trackData[$component] = $value; + } $elements = [ 'x.start.time' => 'start_time', @@ -33,22 +39,25 @@ class ScormScoTrackData implements TransformPropertyInterface 'cmi.suspend_data' => 'suspend_data', 'cmi.core.score.raw' => 'score', 'cmi.core.score.max' => 'max_score', + 'cmi.total_time' => 'total_time', ]; - foreach ($strComponents as $strComponent) { - list($component, $value) = explode(self::SEPARATOR_VALUES, $strComponent); + $itemData = []; + foreach ($trackData as $component => $value) { if ('cmi.core.total_time' === $component) { $value = $this->hmsToSeconds($value); } elseif ('cmi.core.exit' === $component) { $value = $this->coreExit($value); + } elseif ('cmi.total_time' === $component && !empty($trackData['x.start.time'])) { + $value = $this->cmiTotalTime($trackData['x.start.time'], $value); } if (isset($elements[$component])) { - $component = $elements[$component]; - } + $variable = $elements[$component]; - $itemData[$component] = $value; + $itemData[$variable] = $value; + } } return $itemData; @@ -83,4 +92,24 @@ class ScormScoTrackData implements TransformPropertyInterface $value; } + + /** + * @param int $startTimeValue + * @param string $value + * + * @throws \Exception + * + * @return int + */ + private function cmiTotalTime($startTimeValue, $value) + { + $startTime = new \DateTime(); + $startTime->setTimestamp($startTimeValue); + $startTime->setTimezone(new \DateTimeZone('UTC')); + + $endTime = clone $startTime; + $endTime->add(new \DateInterval($value)); + + return $endTime->getTimestamp() - $startTime->getTimestamp(); + } }