diff --git a/cis/private/profile/studienplan.php b/cis/private/profile/studienplan.php
index f6d45777b..df0ac09b7 100755
--- a/cis/private/profile/studienplan.php
+++ b/cis/private/profile/studienplan.php
@@ -469,23 +469,43 @@ function drawTree($tree, $depth)
//check if compatible course has grade
elseif(count($kompatibleLVs) > 0)
{
- foreach($kompatibleLVs as $komp)
- {
- if(isset($noten_arr[$komp]))
- {
- $positiv=false;
- foreach($noten_arr[$komp] as $note)
- {
- if($note_pruef_arr[$note]->positiv)
- $positiv=true;
- }
-
- if($positiv)
- echo ''.$p->t('studienplan/abgeschlossen').'';
- else
- echo ''.$p->t('studienplan/negativ').'';
- }
- }
+ $positiv = false;
+ $found = false;
+ $i = 0;
+ while(!$found && $i < count($kompatibleLVs))
+ {
+ for($i; $i < (count($kompatibleLVs)); $i++)
+ {
+ if(isset($noten_arr[$kompatibleLVs[$i]]))
+ {
+ $positiv=false;
+ foreach($noten_arr[$kompatibleLVs[$i]] as $note)
+ {
+ if($note_pruef_arr[$note]->positiv)
+ $positiv=true;
+ }
+
+ $found = true;
+ }
+ }
+ $i++;
+ }
+ if($found)
+ {
+ if($positiv)
+ echo ''.$p->t('studienplan/abgeschlossen').'';
+ else
+ echo ''.$p->t('studienplan/negativ').'';
+ }
+ elseif(!$found)
+ {
+ if($abgeschlossen)
+ echo ''.$p->t('studienplan/regelabgeschlossen'),'';
+ elseif(!$row_tree->stpllv_pflicht)
+ echo ''.$p->t('studienplan/optional').'';
+ else
+ echo ''.$p->t('studienplan/offen').'';
+ }
}
else
{
diff --git a/system/moodlePlugin/fhcompletews30/README b/system/moodlePlugin/fhcompletews30/README
new file mode 100644
index 000000000..c18543606
--- /dev/null
+++ b/system/moodlePlugin/fhcompletews30/README
@@ -0,0 +1,23 @@
+FHComplete Moodle 3.0 Webservice Plugin
+=======================================
+
+Mit diesem Plugin wird Moodle 3.0 um zusätzliche Webservices erweitert
+die für die Syncronisation mit FHComplete benötigt werden.
+
+
+Installation
+============
+
+- ) Zur Installation des Plugins muss der gesamte Ordner fhcompletews in den
+ Ordner local der Moodleinstallation kopiert werden.
+
+ zB: cp /var/www/fhcomplete/system/moodlePlugin/fhcompletews /var/www/moodle/local/
+
+- ) Danach muss die Moodle Startseite aufgerufen werden.
+ Das neue Plugin wird automatisch erkannt uns installiert.
+
+Sonstiges
+=========
+
+Falls Änderungen am Plugin durchgeführt werden, muss in version.php die Versionsnummer erhöht werden
+damit Moodle die Änderung an dem Plugin erkennt und ein Update durchführt.
diff --git a/system/moodlePlugin/fhcompletews30/db/services.php b/system/moodlePlugin/fhcompletews30/db/services.php
new file mode 100644
index 000000000..f272cbb7a
--- /dev/null
+++ b/system/moodlePlugin/fhcompletews30/db/services.php
@@ -0,0 +1,53 @@
+.
+
+/**
+ * Web service local plugin template external functions and service definitions.
+ *
+ * @package localwstemplate
+ * @copyright 2011 Jerome Mouneyrac
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+// We defined the web service functions to install.
+$functions = array(
+ 'fhcomplete_get_course_grades' => array(
+ 'classname' => 'local_fhcompletews_external',
+ 'methodname' => 'get_course_grades',
+ 'classpath' => 'local/fhcompletews/externallib.php',
+ 'description' => 'Get Grades of a course',
+ 'type' => 'read',
+ 'capabilities'=> 'moodle/course:update,moodle/course:viewhiddencourses',
+ ),
+
+ 'fhcomplete_courses_by_shortname' => array(
+ 'classname' => 'local_fhcompletews_external',
+ 'methodname' => 'get_courses_by_shortname',
+ 'classpath' => 'local/fhcompletews/externallib.php',
+ 'description' => 'Get course contents by Shortname',
+ 'type' => 'read',
+ 'capabilities'=> 'moodle/course:update,moodle/course:viewhiddencourses',
+ ),
+
+ 'fhcomplete_user_get_users' => array(
+ 'classname' => 'core_user_external',
+ 'methodname' => 'get_users',
+ 'classpath' => 'user/externallib.php',
+ 'description' => 'get Users by Criteria',
+ 'type' => 'read',
+ 'capabilities'=> 'moodle/user:viewdetails, moodle/user:viewhiddendetails, moodle/course:useremail, moodle/user:update',
+ ),
+
+);
diff --git a/system/moodlePlugin/fhcompletews30/externallib.php b/system/moodlePlugin/fhcompletews30/externallib.php
new file mode 100644
index 000000000..000607454
--- /dev/null
+++ b/system/moodlePlugin/fhcompletews30/externallib.php
@@ -0,0 +1,371 @@
+.
+
+/**
+ * External Web Service Template
+ *
+ * @package localwstemplate
+ * @copyright 2011 Moodle Pty Ltd (http://moodle.com)
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+require_once($CFG->libdir . "/externallib.php");
+
+class local_fhcompletews_external extends external_api
+{
+
+/**************************************************
+ * Webservice get_course_grades
+ *
+ * Laedt die Noten eines Kurses
+ **************************************************/
+ public static function get_course_grades_parameters()
+ {
+ return new external_function_parameters(
+ array(
+ 'courseid' => new external_value(PARAM_INT, 'Moodle CourseID'),
+ 'type' => new external_value(PARAM_INT,'Type 1=Punkte, 2=Prozent, 3=Endnote lt Skala')
+ ), 'Get Course Grades'
+ );
+ }
+
+ /**
+ * Get course Grades
+ * @param int courseid
+ * @return array
+ */
+ public static function get_course_grades($courseid, $type)
+ {
+ global $CFG, $DB;
+ require_once($CFG->dirroot . "/course/lib.php");
+ require_once($CFG->dirroot.'/grade/export/lib.php');
+
+ //validate parameter
+ $params = self::validate_parameters(self::get_course_grades_parameters(),
+ array('courseid' => $courseid, 'type'=>$type));
+
+ $notenart = $type;
+ //$notenart=2; // 1=Punkte; 2=Prozent; 3=Endnote nach Skala
+ $gui=array();
+ $final_id='';
+ $data = array();
+
+ // Kursdaten Laden
+ if (!$course = $DB->get_record('course', array('id'=>$courseid)))
+ {
+ throw new moodle_exception('Course not found', '', '', null, 'The course ' . $courseid . ' is not found');
+ return false;
+ }
+
+ $id=$course->id;
+ $kursname=$course->fullname;
+ $shortname=$course->shortname;
+
+ //ODS Notenexport starten
+ require_login($course);
+ $context = get_context_instance(CONTEXT_COURSE, $courseid);
+ require_once($CFG->dirroot.'/grade/export/ods/grade_export_ods.php');
+
+ $moodle28=false;
+
+ try
+ {
+ $method = new ReflectionMethod('grade_export_ods','__construct');
+
+ if(count($method->getParameters())==3)
+ $moodle28=true;
+ }
+ catch(ReflectionException $e)
+ {
+ }
+
+ if($moodle28)
+ {
+ //ab Moodle 2.8 hat grade_export_ods nur noch 3 Parameter
+ $formdata = new stdClass();
+ $formdata->display=$notenart;
+ $formdata->itemids=0;
+ $formdata->decimals=2;
+ $formdata->export_feedback=false;
+ if (!$export = new grade_export_ods($course, 0, $formdata))
+ {
+ throw new moodle_exception('Fehler', '', '', null, "Moodle-Kurs ".$id." ".$shortname." - keine Export Information gefunden");
+ return false;
+ }
+ }
+ else
+ {
+ if (!$export = new grade_export_ods($course, 0, 0, false, false, $notenart, 2))
+ {
+ throw new moodle_exception('Fehler', '', '', null, "Moodle-Kurs ".$id." ".$shortname." - keine Export Information gefunden");
+ return false;
+ }
+ }
+ $grad =$export->columns;
+
+ // Im Export sind die Noten fuer alle Abgaben, Quiz, etc enthalten
+ // Wir brauchen hier nur die Gesamtnote fuer die ganzen Kurs
+ foreach ($export->columns as $key=>$grade_item)
+ {
+ // Gesamtnote hat den itemtype "course"
+ if($grade_item->itemtype=='course')
+ {
+ $final_id=$key;
+ $finalitem = $grade_item;
+ break;
+ }
+ }
+
+ if($final_id=='')
+ {
+ throw new moodle_exception('Fehler', '', '', null,"Moodle-Kurs ".$id." ".$shortname." - keine Endnote gefunden");
+ return false;
+ }
+
+ // Liste mit allen Studierenden des Kurses durchlaufen
+ $geub = new grade_export_update_buffer();
+ $gui = new graded_users_iterator($export->course, array($final_id=>$finalitem), $export->groupid); //$export->columns
+
+ $gui->init();
+ $kursgrad =array();
+
+ while ($userdata = $gui->next_user())
+ {
+ $user_item=array();
+ $user = $userdata->user;
+ $user_item['vorname']=$user->firstname;
+ $user_item['nachname']=$user->lastname;
+ $user_item['idnummer']=$user->idnumber;
+ $user_item['username']=$user->username;
+
+ // Aus den vorhanden Noten wird die Endnote fuer den Kurs herausgesucht
+ if(isset($userdata->grades[$final_id]))
+ {
+ $gradestr = $export->format_grade($userdata->grades[$final_id]);
+ $user_item['note']=$gradestr;
+
+ // Wenn Prozent dann Prozentzeichen entfernen
+ if(strpos($user_item['note'],'%')!==false)
+ $user_item['note']=trim(str_replace('%','',$user_item['note']));
+
+ // nur zurueckliefern wenn eine Note gefunden wurde und diese nicht '-' ist
+ if($user_item['note']!='-')
+ $data[]=$user_item;
+ }
+ }
+
+ $gui->close();
+ $geub->close();
+
+ if (count($data)==0)
+ {
+ throw new moodle_exception('Fehler', '', '', null,"Moodle-Kurs ".$id." ".$shortname." - keine Kurs-Noten Informationen gefunden ");
+ return false;
+ }
+
+ return $data;
+ }
+
+ /**
+ * Returns description of method result value
+ * @return external_description
+ */
+ public static function get_course_grades_returns()
+ {
+ return new external_multiple_structure(
+ new external_single_structure(
+ array(
+ 'vorname' => new external_value(PARAM_TEXT, 'vorname'),
+ 'nachname' => new external_value(PARAM_TEXT, 'nachname'),
+ 'idnummer' => new external_value(PARAM_TEXT, 'idnummer'),
+ 'username' => new external_value(PARAM_TEXT, 'username'),
+ 'note' => new external_value(PARAM_TEXT, 'note'),
+ ), 'course'
+ )
+ );
+ }
+
+/**************************************************
+ * Webservice get_courses_by_shortname
+ *
+ * Laedt Kurse anhand der Kurzbezeichnung
+ **************************************************/
+ public static function get_courses_by_shortname_parameters()
+ {
+ return new external_function_parameters(
+ array('options' => new external_single_structure(
+ array('shortnames' => new external_multiple_structure(
+ new external_value(PARAM_RAW, 'Short Name')
+ , 'List of short names. If empty return all courses
+ except front page course.',
+ VALUE_OPTIONAL)
+ ), 'options - operator OR is used', VALUE_DEFAULT, array())
+ )
+ );
+ }
+
+ /**
+ * Get courses
+ * @param array $options
+ * @return array
+ */
+ public static function get_courses_by_shortname($options)
+ {
+ global $CFG, $DB;
+ require_once($CFG->dirroot . "/course/lib.php");
+
+ //validate parameter
+ $params = self::validate_parameters(self::get_courses_by_shortname_parameters(),
+ array('options' => $options));
+
+ //retrieve courses
+ if (!key_exists('shortnames', $params['options'])
+ or empty($params['options']['shortnames'])) {
+ $courses = $DB->get_records('course');
+ } else {
+ $courses = $DB->get_records_list('course', 'shortname', $params['options']['shortnames']);
+ }
+
+ //create return value
+ $coursesinfo = array();
+ foreach ($courses as $course)
+ {
+
+ // now security checks
+ $context = get_context_instance(CONTEXT_COURSE, $course->id);
+ try
+ {
+ self::validate_context($context);
+ }
+ catch (Exception $e)
+ {
+ $exceptionparam = new stdClass();
+ $exceptionparam->message = $e->getMessage();
+ $exceptionparam->shortname = $course->shortname;
+ throw new moodle_exception(
+ get_string('errorcoursecontextnotvalid', 'webservice', $exceptionparam));
+ }
+ require_capability('moodle/course:view', $context);
+
+ $courseinfo = array();
+ $courseinfo['id'] = $course->id;
+ $courseinfo['fullname'] = $course->fullname;
+ $courseinfo['shortname'] = $course->shortname;
+ $courseinfo['categoryid'] = $course->category;
+ $courseinfo['summary'] = $course->summary;
+ $courseinfo['summaryformat'] = $course->summaryformat;
+ $courseinfo['format'] = $course->format;
+ $courseinfo['startdate'] = $course->startdate;
+ $courseinfo['numsections'] = $course->numsections;
+
+ //some field should be returned only if the user has update permission
+ $courseadmin = has_capability('moodle/course:update', $context);
+ if ($courseadmin)
+ {
+ $courseinfo['categorysortorder'] = $course->sortorder;
+ $courseinfo['idnumber'] = $course->idnumber;
+ $courseinfo['showgrades'] = $course->showgrades;
+ $courseinfo['showreports'] = $course->showreports;
+ $courseinfo['newsitems'] = $course->newsitems;
+ $courseinfo['visible'] = $course->visible;
+ $courseinfo['maxbytes'] = $course->maxbytes;
+ $courseinfo['hiddensections'] = $course->hiddensections;
+ $courseinfo['groupmode'] = $course->groupmode;
+ $courseinfo['groupmodeforce'] = $course->groupmodeforce;
+ $courseinfo['defaultgroupingid'] = $course->defaultgroupingid;
+ $courseinfo['lang'] = $course->lang;
+ $courseinfo['timecreated'] = $course->timecreated;
+ $courseinfo['timemodified'] = $course->timemodified;
+ $courseinfo['forcetheme'] = $course->theme;
+ $courseinfo['enablecompletion'] = $course->enablecompletion;
+ $courseinfo['completionstartonenrol'] = $course->completionstartonenrol;
+ $courseinfo['completionnotify'] = $course->completionnotify;
+ }
+
+ if ($courseadmin or $course->visible
+ or has_capability('moodle/course:viewhiddencourses', $context))
+ {
+ $coursesinfo[] = $courseinfo;
+ }
+ }
+
+ return $coursesinfo;
+ }
+
+ /**
+ * Returns description of method result value
+ * @return external_description
+ */
+ public static function get_courses_by_shortname_returns()
+ {
+ return new external_multiple_structure(
+ new external_single_structure(
+ array(
+ 'id' => new external_value(PARAM_INT, 'course id'),
+ 'shortname' => new external_value(PARAM_TEXT, 'course short name'),
+ 'categoryid' => new external_value(PARAM_INT, 'category id'),
+ 'categorysortorder' => new external_value(PARAM_INT,
+ 'sort order into the category', VALUE_OPTIONAL),
+ 'fullname' => new external_value(PARAM_TEXT, 'full name'),
+ 'idnumber' => new external_value(PARAM_RAW, 'id number', VALUE_OPTIONAL),
+ 'summary' => new external_value(PARAM_RAW, 'summary'),
+ 'summaryformat' => new external_value(PARAM_INT,
+ 'the summary text Moodle format'),
+ 'format' => new external_value(PARAM_ALPHANUMEXT,
+ 'course format: weeks, topics, social, site,..'),
+ 'showgrades' => new external_value(PARAM_INT,
+ '1 if grades are shown, otherwise 0', VALUE_OPTIONAL),
+ 'newsitems' => new external_value(PARAM_INT,
+ 'number of recent items appearing on the course page', VALUE_OPTIONAL),
+ 'startdate' => new external_value(PARAM_INT,
+ 'timestamp when the course start'),
+ 'numsections' => new external_value(PARAM_INT, 'number of weeks/topics'),
+ 'maxbytes' => new external_value(PARAM_INT,
+ 'largest size of file that can be uploaded into the course',
+ VALUE_OPTIONAL),
+ 'showreports' => new external_value(PARAM_INT,
+ 'are activity report shown (yes = 1, no =0)', VALUE_OPTIONAL),
+ 'visible' => new external_value(PARAM_INT,
+ '1: available to student, 0:not available', VALUE_OPTIONAL),
+ 'hiddensections' => new external_value(PARAM_INT,
+ 'How the hidden sections in the course are displayed to students',
+ VALUE_OPTIONAL),
+ 'groupmode' => new external_value(PARAM_INT, 'no group, separate, visible',
+ VALUE_OPTIONAL),
+ 'groupmodeforce' => new external_value(PARAM_INT, '1: yes, 0: no',
+ VALUE_OPTIONAL),
+ 'defaultgroupingid' => new external_value(PARAM_INT, 'default grouping id',
+ VALUE_OPTIONAL),
+ 'timecreated' => new external_value(PARAM_INT,
+ 'timestamp when the course have been created', VALUE_OPTIONAL),
+ 'timemodified' => new external_value(PARAM_INT,
+ 'timestamp when the course have been modified', VALUE_OPTIONAL),
+ 'enablecompletion' => new external_value(PARAM_INT,
+ 'Enabled, control via completion and activity settings. Disbaled,
+ not shown in activity settings.',
+ VALUE_OPTIONAL),
+ 'completionstartonenrol' => new external_value(PARAM_INT,
+ '1: begin tracking a student\'s progress in course completion
+ after course enrolment. 0: does not',
+ VALUE_OPTIONAL),
+ 'completionnotify' => new external_value(PARAM_INT,
+ '1: yes 0: no', VALUE_OPTIONAL),
+ 'lang' => new external_value(PARAM_ALPHANUMEXT,
+ 'forced course language', VALUE_OPTIONAL),
+ 'forcetheme' => new external_value(PARAM_ALPHANUMEXT,
+ 'name of the force theme', VALUE_OPTIONAL),
+ ), 'course'
+ )
+ );
+ }
+}
diff --git a/system/moodlePlugin/fhcompletews30/lang/en/local_fhcompletews.php b/system/moodlePlugin/fhcompletews30/lang/en/local_fhcompletews.php
new file mode 100644
index 000000000..4c72c54e4
--- /dev/null
+++ b/system/moodlePlugin/fhcompletews30/lang/en/local_fhcompletews.php
@@ -0,0 +1,25 @@
+.
+
+/**
+ * plugin related strings
+ * @package localfhcompletws
+ * @copyright 2011 Moodle Pty Ltd (http://moodle.com)
+ * @author Jerome Mouneyrac
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+$string['pluginname'] = 'FH-Complete Webservice Plugin';
diff --git a/system/moodlePlugin/fhcompletews30/version.php b/system/moodlePlugin/fhcompletews30/version.php
new file mode 100644
index 000000000..6fd689c4e
--- /dev/null
+++ b/system/moodlePlugin/fhcompletews30/version.php
@@ -0,0 +1,25 @@
+.
+
+$plugin->version = 2015020404; // The (date) version of this module + 2 extra digital for daily versions
+ // This version number is displayed into /admin/forms.php
+ // TODO: if ever this plugin get branched, the old branch number
+ // will not be updated to the current date but just incremented. We will
+ // need then a $plugin->release human friendly date. For the moment, we use
+ // display this version number with userdate (dev friendly)
+$plugin->requires = 2013051400; // Requires this Moodle version - at least 2.5
+$plugin->cron = 0;
+$plugin->release = '1.2 (Build: 2015020404)';
+$plugin->maturity = MATURITY_STABLE;
+$plugin->component = 'local_fhcompletews';