From 38d86296a13ea2ecf9b16f01a4a40e850026c705 Mon Sep 17 00:00:00 2001
From: Nathan Lewis <nathan.lewis@totaralms.com>
Date: Fri, 10 Jul 2015 11:24:15 +1200
Subject: [PATCH] TL-6829 SCORM: Add Mastery score overrides status setting

Change-Id: I24cc0d7a54bc051fa9c58053b9f57c535afc8644
Reviewed-on: https://review.totaralms.com/8425
Reviewed-by: Sam Hemelryk <sam.hemelryk@totaralms.com>
Tested-by: Nathan Lewis <nathan.lewis@totaralms.com>
Reviewed-by: Maria Torres <maria.torres@totaralms.com>
---
 mod/scorm/backup/moodle1/lib.php                   |  1 +
 mod/scorm/backup/moodle2/backup_scorm_stepslib.php |  2 +-
 mod/scorm/datamodels/scorm_12.js.php               |  2 +-
 mod/scorm/db/install.xml                           |  1 +
 mod/scorm/db/upgrade.php                           | 12 ++++++++++++
 mod/scorm/lang/en/scorm.php                        |  3 +++
 mod/scorm/mod_form.php                             |  5 +++++
 mod/scorm/settings.php                             |  3 +++
 mod/scorm/tests/generator/lib.php                  |  1 +
 mod/scorm/version.php                              |  2 +-
 10 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/mod/scorm/backup/moodle1/lib.php b/mod/scorm/backup/moodle1/lib.php
index 3382ff0..6008a3e 100644
--- a/mod/scorm/backup/moodle1/lib.php
+++ b/mod/scorm/backup/moodle1/lib.php
@@ -60,6 +60,7 @@ class moodle1_mod_scorm_handler extends moodle1_mod_handler {
                         'forcecompleted' => 1,
                         'forcenewattempt' => 0,
                         'lastattemptlock' => 0,
+                        'masteryoverride' => 1,
                         'displayattemptstatus' => 1,
                         'displaycoursestructure' => 1,
                         'timeopen' => '0',
diff --git a/mod/scorm/backup/moodle2/backup_scorm_stepslib.php b/mod/scorm/backup/moodle2/backup_scorm_stepslib.php
index 8695749..452a53f 100644
--- a/mod/scorm/backup/moodle2/backup_scorm_stepslib.php
+++ b/mod/scorm/backup/moodle2/backup_scorm_stepslib.php
@@ -40,7 +40,7 @@ class backup_scorm_activity_structure_step extends backup_activity_structure_ste
             'name', 'scormtype', 'reference', 'intro',
             'introformat', 'version', 'maxgrade', 'grademethod',
             'whatgrade', 'maxattempt', 'forcecompleted', 'forcenewattempt',
-            'lastattemptlock', 'displayattemptstatus', 'displaycoursestructure', 'updatefreq',
+            'lastattemptlock', 'masteryoverride', 'displayattemptstatus', 'displaycoursestructure', 'updatefreq',
             'sha1hash', 'md5hash', 'revision', 'launch',
             'skipview', 'hidebrowse', 'hidetoc', 'nav', 'navpositionleft', 'navpositiontop',
             'auto', 'popup', 'options', 'width',
diff --git a/mod/scorm/datamodels/scorm_12.js.php b/mod/scorm/datamodels/scorm_12.js.php
index 6e18824..9aee183 100644
--- a/mod/scorm/datamodels/scorm_12.js.php
+++ b/mod/scorm/datamodels/scorm_12.js.php
@@ -665,7 +665,7 @@ function SCORMapi1_2() {
             }
             if (cmi.core.lesson_mode == 'normal') {
                 if (cmi.core.credit == 'credit') {
-                    if (cmi.student_data.mastery_score !== '' && cmi.core.score.raw !== '') {
+                    if (<?php echo $scorm->masteryoverride ?> == 1 && cmi.student_data.mastery_score !== '' && cmi.core.score.raw !== '') {
                         if (parseFloat(cmi.core.score.raw) >= parseFloat(cmi.student_data.mastery_score)) {
                             cmi.core.lesson_status = 'passed';
                         } else {
diff --git a/mod/scorm/db/install.xml b/mod/scorm/db/install.xml
index 09551f7..00ae504 100644
--- a/mod/scorm/db/install.xml
+++ b/mod/scorm/db/install.xml
@@ -21,6 +21,7 @@
         <FIELD NAME="forcecompleted" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="1" SEQUENCE="false"/>
         <FIELD NAME="forcenewattempt" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
         <FIELD NAME="lastattemptlock" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
+        <FIELD NAME="masteryoverride" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="1" SEQUENCE="false"/>
         <FIELD NAME="displayattemptstatus" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="1" SEQUENCE="false"/>
         <FIELD NAME="displaycoursestructure" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="1" SEQUENCE="false"/>
         <FIELD NAME="updatefreq" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="Define when the package must be automatically update"/>
diff --git a/mod/scorm/db/upgrade.php b/mod/scorm/db/upgrade.php
index ca8ac38..4650002 100644
--- a/mod/scorm/db/upgrade.php
+++ b/mod/scorm/db/upgrade.php
@@ -357,6 +357,18 @@ function xmldb_scorm_upgrade($oldversion) {
         upgrade_mod_savepoint(true, 2014051201, 'scorm');
     }
 
+    // TL-6829 Add mastery override option.
+    if ($oldversion < 2014051203) {
+        $table = new xmldb_table('scorm');
+
+        $field = new xmldb_field('masteryoverride', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '1', 'lastattemptlock');
+        if (!$dbman->field_exists($table, $field)) {
+            $dbman->add_field($table, $field);
+        }
+
+        upgrade_mod_savepoint(true, 2014051203, 'scorm');
+    }
+
     return true;
 }
 
diff --git a/mod/scorm/lang/en/scorm.php b/mod/scorm/lang/en/scorm.php
index eab5055..6980bda 100644
--- a/mod/scorm/lang/en/scorm.php
+++ b/mod/scorm/lang/en/scorm.php
@@ -196,6 +196,9 @@ $string['identifier'] = 'Question identifier';
 $string['incomplete'] = 'Incomplete';
 $string['info'] = 'Info';
 $string['interactions'] = 'Interactions';
+$string['masteryoverride'] = 'Mastery score overrides status';
+$string['masteryoverride_help'] = 'If enabled and a mastery score is provided, then when LMSFinish is called and if a raw score has been determined, then status will be recalculated using the raw score and mastery score, and any status provided by the SCORM (including "incomplete") will be overridden. (Only applicable to SCORM 1.2 packages.)';
+$string['masteryoverridedesc'] = 'This preference sets the default value for the mastery score overrides status setting';
 $string['repositorynotsupported'] = 'Only file system repositories are supported when linking directly to an imsmanifest.xml file.';
 $string['trackid'] = 'Id';
 $string['trackid_help'] = 'This is the identifier set by your SCORM package for this question, the SCORM specification doesn\'t allow the full question text to be provided.';
diff --git a/mod/scorm/mod_form.php b/mod/scorm/mod_form.php
index 3b3bb41..75de04c 100644
--- a/mod/scorm/mod_form.php
+++ b/mod/scorm/mod_form.php
@@ -256,6 +256,11 @@ class mod_scorm_mod_form extends moodleform_mod {
         $mform->addHelpButton('auto', 'autocontinue', 'scorm');
         $mform->setDefault('auto', $cfgscorm->auto);
 
+        // Mastery score overrides status.
+        $mform->addElement('selectyesno', 'masteryoverride', get_string('masteryoverride', 'scorm'));
+        $mform->addHelpButton('masteryoverride', 'masteryoverride', 'scorm');
+        $mform->setDefault('masteryoverride', $cfgscorm->masteryoverride);
+
         // Hidden Settings.
         $mform->addElement('hidden', 'datadir', null);
         $mform->setType('datadir', PARAM_RAW);
diff --git a/mod/scorm/settings.php b/mod/scorm/settings.php
index 057a06c..1cf0636 100644
--- a/mod/scorm/settings.php
+++ b/mod/scorm/settings.php
@@ -111,6 +111,9 @@ if ($ADMIN->fulltree) {
     $settings->add(new admin_setting_configselect('scorm/forcenewattempt',
         get_string('forcenewattempt', 'scorm'), get_string('forcenewattemptdesc', 'scorm'), 0, $yesno));
 
+    $settings->add(new admin_setting_configselect('scorm/masteryoverride',
+        get_string('masteryoverride', 'scorm'), get_string('masteryoverridedesc', 'scorm'), 1, $yesno));
+
     $settings->add(new admin_setting_configselect('scorm/lastattemptlock',
         get_string('lastattemptlock', 'scorm'), get_string('lastattemptlockdesc', 'scorm'), 0, $yesno));
 
diff --git a/mod/scorm/tests/generator/lib.php b/mod/scorm/tests/generator/lib.php
index 59af301..9743597 100644
--- a/mod/scorm/tests/generator/lib.php
+++ b/mod/scorm/tests/generator/lib.php
@@ -68,6 +68,7 @@ class mod_scorm_generator extends testing_module_generator {
             'forcenewattempt' => $cfgscorm->forcenewattempt,
             'lastattemptlock' => $cfgscorm->lastattemptlock,
             'forcecompleted' => $cfgscorm->forcecompleted,
+            'masteryoverride' => $cfgscorm->masteryoverride,
             'auto' => $cfgscorm->auto,
             'displayactivityname' => $cfgscorm->displayactivityname
         );
diff --git a/mod/scorm/version.php b/mod/scorm/version.php
index 58d17c5..4f985ef 100644
--- a/mod/scorm/version.php
+++ b/mod/scorm/version.php
@@ -24,7 +24,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2014051202;    // The current module version (Date: YYYYMMDDXX).
+$plugin->version   = 2014051203;    // The current module version (Date: YYYYMMDDXX).
 $plugin->requires  = 2014050800;    // Requires this Moodle version.
 $plugin->component = 'mod_scorm';   // Full name of the plugin (used for diagnostics).
 $plugin->cron      = 300;
-- 
2.5.0

