diff --git a/application/config/anrechnung.php b/application/config/anrechnung.php
new file mode 100644
index 000000000..d1f4f0958
--- /dev/null
+++ b/application/config/anrechnung.php
@@ -0,0 +1,22 @@
+load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
+ $this->load->model('education/Anrechnung_model', 'AnrechnungModel');
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+
+ $this->load->helper('url');
+ $this->load->helper('hlp_sancho_helper');
}
/**
@@ -84,4 +94,318 @@ class AnrechnungJob extends JOB_Controller
}
$this->logInfo('End Anrechnung Grades Job', array('Number of Grades added'=>$cnt));
}
+
+ /**
+ * Deletes Zeugnisnoten 'angerechnet', when Anrechnung is rejected afterwards.
+ * E.g., when STGL first accepts, then withdraws and finally rejects the approvement.
+ */
+ public function deleteAnrechnungGrades()
+ {
+ $this->logInfo('Start AnrechnungJob to delete Grades');
+
+ // Get all Zeungisnoten,
+ // WHERE note is angerechnet
+ // AND Anrechnung was rejected AFTER the Zeugnisnote was created
+ $qry = '
+ SELECT DISTINCT ON (status.anrechnung_id) anrechnung_id,
+ status.status_kurzbz AS "last_anrechnungstatus",
+ status.insertamum AS "last_anrechnungstatus_insertamum",
+ zeugnisnote.insertamum AS "zeugnisdatum_insertamum",
+ student.student_uid,
+ zeugnisnote.lehrveranstaltung_id,
+ zeugnisnote.studiensemester_kurzbz,
+ note
+ FROM lehre.tbl_zeugnisnote zeugnisnote
+ JOIN public.tbl_student student USING (student_uid)
+ JOIN lehre.tbl_anrechnung anrechnung
+ ON (zeugnisnote.lehrveranstaltung_id = anrechnung.lehrveranstaltung_id)
+ AND (student.prestudent_id = anrechnung.prestudent_id)
+ AND (zeugnisnote.studiensemester_kurzbz = anrechnung.studiensemester_kurzbz)
+ JOIN lehre.tbl_anrechnung_anrechnungstatus status USING (anrechnung_id)
+ WHERE note = 6
+ AND status.insertamum > zeugnisnote.insertamum
+ AND status.status_kurzbz = '. $this->db->escape(self::ANRECHNUNGSTATUS_REJECTED). '
+ ORDER BY status.anrechnung_id, status.insertamum DESC
+ ';
+
+ $db = new DB_Model();
+ $result = $db->execReadOnlyQuery($qry);
+ $cnt = 0;
+
+ if (hasData($result))
+ {
+ $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
+
+ foreach (getData($result) as $row)
+ {
+ // Delete Zeugnisnote
+ $this->ZeugnisnoteModel->delete(array(
+ 'lehrveranstaltung_id' => $row->lehrveranstaltung_id,
+ 'student_uid' => $row->student_uid,
+ 'studiensemester_kurzbz' => $row->studiensemester_kurzbz
+ ));
+
+ // Count up
+ $cnt++;
+ }
+ }
+
+ $this->logInfo('End AnrechnungJob to delete Grades', array('Number of Grades deleted: ' => $cnt));
+ }
+
+ // Send Sancho mail to STGL with yesterdays new Anrechnungen
+ public function sendMailToSTGL()
+ {
+ $this->logInfo('Start AnrechnungJob to send emails to STGL about yesterdays new Anrechnungen.');
+
+ // Get all yesterdays Anrechnungen, that did not process further than first status
+ // (If Anrechnung is new, but STGL already started the process yesterday,
+ // he does not need to be informed about this new Anrechnung anymore)
+ $this->AnrechnungModel->addSelect('anrechnung_id, studiensemester_kurzbz, lv.studiengang_kz, lv.bezeichnung, vorname, nachname');
+ $this->AnrechnungModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
+ $this->AnrechnungModel->addJoin('public.tbl_student student', 'prestudent_id');
+ $this->AnrechnungModel->addJoin('public.tbl_benutzer benutzer', 'ON (benutzer.uid = student.student_uid)');
+ $this->AnrechnungModel->addJoin('public.tbl_person person', 'person_id');
+ $this->AnrechnungModel->addOrder('lv.studiengang_kz, lv.bezeichnung');
+
+ $result = $this->AnrechnungModel->loadWhere(
+ '(lehre.tbl_anrechnung.insertamum)::date = (NOW() - INTERVAL \'24 HOURS\')::DATE
+ AND 1 = (SELECT COUNT(*) FROM lehre.tbl_anrechnung_anrechnungstatus status WHERE status.anrechnung_id = tbl_anrechnung.anrechnung_id)'
+ );
+
+ // Exit if there are no Anrechnungen
+ if (!$anrechnungen = getData($result)) {
+ $this->logInfo('ABORTED: Sending emails to STGL about yesterdays new Anrechnungen aborted - No new Anrechnungen found.');
+ exit;
+ }
+
+ $unique_studiengang_kz_arr = array_unique(array_column($anrechnungen, 'studiengang_kz'));
+
+ foreach ($unique_studiengang_kz_arr as $studiengang_kz)
+ {
+ // Get STG bezeichnung
+ $this->StudiengangModel->addSelect('UPPER( typ || kurzbz ) AS "stg_bezeichnung"');
+ $studiengang_bezeichnung = $this->StudiengangModel->load($studiengang_kz)->retval[0]->stg_bezeichnung;
+
+ // Get STGL mail address
+ list ($to, $vorname) = self::_getSTGLMailAddress($studiengang_kz);
+
+ // Get HTML table with new Anrechnungen of that STG plus amount of them
+ list ($anrechnungen_amount, $anrechnungen_table) = self::_getSTGLMailDataTable($studiengang_kz, $anrechnungen);
+
+ // Link to Antrag genehmigen dashboard
+ $url =
+ CIS_ROOT. 'cis/index.php?menu='.
+ CIS_ROOT. 'cis/menu.php?content_id=&content='.
+ CIS_ROOT. index_page(). self::APPROVE_ANRECHNUNG_URI;
+
+ // Prepare mail content
+ $body_fields = array(
+ 'vorname' => $vorname,
+ 'studiengang' => $studiengang_bezeichnung,
+ 'anzahl' => $anrechnungen_amount,
+ 'datentabelle' => $anrechnungen_table,
+ 'link' => anchor($url, 'Anrechnungsanträge Übersicht')
+ );
+
+ // Send mail
+ sendSanchoMail(
+ 'AnrechnungAntragStellen',
+ $body_fields,
+ $to,
+ 'Anerkennung nachgewiesener Kenntnisse: Neuer Antrag wurde gestellt'
+ );
+ }
+
+ $this->logInfo('SUCCEDED: Sending emails to STGL about yesterdays new Anrechnungen succeded.');
+ }
+
+ /**
+ * Send Sancho mail to students, whose Anrechnungen were approved 24 hours ago.
+ */
+ public function sendMailApproved(){
+
+ $this->logInfo('Start AnrechnungJob to send emails to students, whose Anrechnungen were approved.');
+
+ // Get all yesterdays approvements
+ $this->AnrechnungModel->addSelect('student.student_uid, vorname, nachname, geschlecht, lv.bezeichnung');
+ $this->AnrechnungModel->addJoin('lehre.tbl_anrechnung_anrechnungstatus status', 'anrechnung_id');
+ $this->AnrechnungModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
+ $this->AnrechnungModel->addJoin('public.tbl_student student', 'prestudent_id');
+ $this->AnrechnungModel->addJoin('public.tbl_benutzer benutzer', 'ON (benutzer.uid = student.student_uid)');
+ $this->AnrechnungModel->addJoin('public.tbl_person person', 'person_id');
+
+ $result = $this->AnrechnungModel->loadWhere(
+ '(status.insertamum)::date = (NOW() - INTERVAL \'24 HOURS\')::DATE AND
+ status.status_kurzbz = '. $this->db->escape(self::ANRECHNUNGSTATUS_APPROVED)
+ );
+
+ // Exit if there are no approved Anrechnungen
+ if (!hasData($result))
+ {
+ $this->logInfo('ABORTED sending emails to students, whose Anrechnungen were approved. No new approvements found.');
+ exit;
+ }
+
+ // Loop through students
+ foreach ($result->retval as $student)
+ {
+ $to = $student->student_uid. '@'. DOMAIN;
+
+ $anrede = $student->geschlecht == 'w' ? 'Sehr geehrte Frau ' : 'Sehr geehrter Herr ';
+
+ $text = 'Ihrem Antrag auf Anerkennung nachgewiesener Kenntnisse der Lehrveranstaltung "'.
+ $student->bezeichnung. '" wurde stattgegeben.';
+
+ // Prepare mail content
+ $body_fields = array(
+ 'anrede_name' => $anrede. $student->vorname. ' '. $student->nachname,
+ 'text' => $text
+ );
+
+ // Send mail
+ sendSanchoMail(
+ 'AnrechnungGenehmigen',
+ $body_fields,
+ $to,
+ 'Anerkennung nachgewiesener Kenntnisse: Ihr Antrag ist abgeschlossen'
+ );
+ }
+ }
+
+ /**
+ * Send Sancho mail to students, whose Anrechnungen were rejected 24 hours ago.
+ */
+ public function sendMailRejected(){
+
+ $this->logInfo('Start AnrechnungJob to send emails to students, whose Anrechnungen were rejected.');
+
+ // Get all yesterdays rejections
+ $this->AnrechnungModel->addSelect('student.student_uid, vorname, nachname, geschlecht, lv.bezeichnung, notiz.text');
+ $this->AnrechnungModel->addJoin('lehre.tbl_anrechnung_anrechnungstatus status', 'anrechnung_id');
+ $this->AnrechnungModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
+ $this->AnrechnungModel->addJoin('public.tbl_student student', 'prestudent_id');
+ $this->AnrechnungModel->addJoin('public.tbl_benutzer benutzer', 'ON (benutzer.uid = student.student_uid)');
+ $this->AnrechnungModel->addJoin('public.tbl_person person', 'person_id');
+ $this->AnrechnungModel->addJoin('public.tbl_notizzuordnung', 'anrechnung_id');
+ $this->AnrechnungModel->addJoin('public.tbl_notiz notiz', 'notiz_id');
+
+ $this->AnrechnungModel->addOrder('notiz.insertamum', 'DESC');
+ $this->AnrechnungModel->addLimit(1);
+
+
+ $result = $this->AnrechnungModel->loadWhere(
+ '(status.insertamum)::date = (NOW() - INTERVAL \'24 HOURS\')::DATE AND
+ status.status_kurzbz = '. $this->db->escape(self::ANRECHNUNGSTATUS_REJECTED). ' AND
+ notiz.titel = '. $this->db->escape(self::ANRECHNUNG_NOTIZTITEL_NOTIZ_BY_STGL)
+ );
+
+ // Exit if there are no rejected Anrechnungen
+ if (!hasData($result))
+ {
+ $this->logInfo('ABORTED sending emails to students, whose Anrechnungen were rejected. No new rejectments found.');
+ exit;
+ }
+
+ // Loop through students
+ foreach ($result->retval as $student)
+ {
+ $to = $student->student_uid. '@'. DOMAIN;
+
+ $anrede = $student->geschlecht == 'w' ? 'Sehr geehrte Frau ' : 'Sehr geehrter Herr ';
+
+ $text = <<bezeichnung" leider nicht anrechnen, weil die Gleichwertigkeit nicht festgestellt werden konnte.
+ Begründung: $student->text
+html;
+
+ // Prepare mail content
+ $body_fields = array(
+ 'anrede_name' => $anrede. $student->vorname. ' '. $student->nachname,
+ 'text' => $text
+ );
+
+ // Send mail
+ sendSanchoMail(
+ 'AnrechnungGenehmigen',
+ $body_fields,
+ $to,
+ 'Anerkennung nachgewiesener Kenntnisse: Ihr Antrag ist abgeschlossen'
+ );
+ }
+
+ }
+
+ // Get STGL mail address
+ private function _getSTGLMailAddress($studiengang_kz)
+ {
+ $result = $this->StudiengangModel->getLeitung($studiengang_kz);
+
+ // Get STGL mail address
+ if (hasData($result))
+ {
+ return array(
+ $result->retval[0]->uid. '@'. DOMAIN,
+ $result->retval[0]->vorname
+ );
+ }
+ // If not available, get assistance mail address
+ else
+ {
+ $result = $this->StudiengangModel->load($studiengang_kz);
+
+ if (hasData($result))
+ {
+ return array(
+ $result->retval[0]->email,
+ ''
+ );
+ }
+ }
+ }
+
+ // Build HTML table with yesterdays new Anrechnungen of the given STG
+ private function _getSTGLMailDataTable($studiengang_kz, $anrechnungen)
+ {
+ $html = '';
+ $lv_bezeichnung = '';
+
+ // Filter Anrechnungen of given STG
+ $anrechnungen = array_filter(
+ $anrechnungen,
+ function ($anrechnung) use (&$studiengang_kz) {
+ return $anrechnung->studiengang_kz == $studiengang_kz;
+ });
+
+ // Amount of Anrechnungen
+ $amount = count($anrechnungen);
+
+ // HTML table body
+ $html .= '
+
+
+ ';
+
+ foreach ($anrechnungen as $anrechnung)
+ {
+ // Head line for each LV bezeichnung
+ if ($anrechnung->bezeichnung != $lv_bezeichnung)
+ {
+ $html .= '
';
+ echo $htmlstr;
+ echo '
+';
+?>
diff --git a/content/student/studentanrechnungenoverlay.xul.php b/content/student/studentanrechnungenoverlay.xul.php
index db62917cd..089f70aec 100644
--- a/content/student/studentanrechnungenoverlay.xul.php
+++ b/content/student/studentanrechnungenoverlay.xul.php
@@ -79,6 +79,10 @@ echo '';
class="sortDirectionIndicator"
sort="rdf:http://www.technikum-wien.at/anrechnung/rdf#lehrveranstaltung_bez_kompatibel"/>
+
+
@@ -99,6 +103,7 @@ echo '';
+
diff --git a/content/student/studentoverlay.js.php b/content/student/studentoverlay.js.php
index f034ae473..ec61ebc07 100644
--- a/content/student/studentoverlay.js.php
+++ b/content/student/studentoverlay.js.php
@@ -5318,6 +5318,7 @@ function StudentAnrechnungAuswahl()
lehrveranstaltung_id_kompatibel = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#lehrveranstaltung_id_kompatibel" ));
genehmigt_von = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#genehmigt_von" ));
anzahl_notizen = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#anzahl_notizen" ));
+ status = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#status" ));
// Studiengang ermitteln
var tree = document.getElementById('student-tree');
diff --git a/include/anrechnung.class.php b/include/anrechnung.class.php
index 6ab323a96..8700977a0 100644
--- a/include/anrechnung.class.php
+++ b/include/anrechnung.class.php
@@ -243,7 +243,8 @@ class anrechnung extends basis_db
*/
public function delete($anrechnung_id)
{
- $qry = "DELETE FROM lehre.tbl_anrechnung WHERE anrechnung_id = " . $this->db_add_param($anrechnung_id);
+ $qry = "DELETE FROM lehre.tbl_anrechnung_anrechnungstatus WHERE anrechnung_id = " . $this->db_add_param($anrechnung_id). "; ";
+ $qry.= "DELETE FROM lehre.tbl_anrechnung WHERE anrechnung_id = " . $this->db_add_param($anrechnung_id);
if ($this->db_query($qry))
{
@@ -362,4 +363,43 @@ class anrechnung extends basis_db
return false;
}
}
+
+ public function getLastAnrechnungstatus($anrechnung_id)
+ {
+ $sprache = new sprache();
+ $bezeichnung_mehrsprachig = $sprache->getSprachQuery('bezeichnung_mehrsprachig');
+
+ $qry = '
+ SELECT *, '. $bezeichnung_mehrsprachig. '
+ FROM lehre.tbl_anrechnungstatus
+ JOIN lehre.tbl_anrechnung_anrechnungstatus USING (status_kurzbz)
+ WHERE anrechnung_id = ' . $this->db_add_param($anrechnung_id). '
+ ORDER BY insertamum DESC
+ LIMIT 1
+ ';
+
+ if ($this->db_query($qry))
+ {
+ if ($row = $this->db_fetch_object())
+ {
+ $obj = new stdClass();
+ $obj->anrechnungstatus_id = $row->anrechnungstatus_id;
+ $obj->status_kurzbz = $row->status_kurzbz;
+ $obj->bezeichnung_mehrsprachig = $sprache->parseSprachResult('bezeichnung_mehrsprachig', $row);
+
+ $this->result[]= $obj;
+ return true;
+ }
+ else
+ {
+ $this->errormsg = 'Daten konnten nicht geladen werden';
+ return false;
+ }
+ }
+ else
+ {
+ $this->errormsg = 'Daten konnten nicht geladen werden';
+ return false;
+ }
+ }
}
diff --git a/include/tw/cis_menu_lv.inc.php b/include/tw/cis_menu_lv.inc.php
index e91431a8e..4b3005c07 100644
--- a/include/tw/cis_menu_lv.inc.php
+++ b/include/tw/cis_menu_lv.inc.php
@@ -465,7 +465,7 @@ function checkZeilenUmbruch()
}
}
- // Anerkennung nachgewiesener Kenntnisse (Anrechnung)
+ // Anerkennung nachgewiesener Kenntnisse (Anrechnung) - Anzeige fuer Studenten
if((!defined('CIS_LEHRVERANSTALTUNG_ANRECHNUNG_ANZEIGEN') || CIS_LEHRVERANSTALTUNG_ANRECHNUNG_ANZEIGEN)
&& $rechte->isBerechtigt('student/anrechnung_beantragen'))
{
@@ -479,6 +479,20 @@ function checkZeilenUmbruch()
);
}
+// Anerkennung nachgewiesener Kenntnisse (Anrechnung) - Anzeige fuer LektorInnen
+if((!defined('CIS_LEHRVERANSTALTUNG_ANRECHNUNG_ANZEIGEN') || CIS_LEHRVERANSTALTUNG_ANRECHNUNG_ANZEIGEN)
+ && $rechte->isBerechtigt('lehre/anrechnung_empfehlen'))
+{
+ $menu[]=array
+ (
+ 'id'=>'core_menu_anerkennungNachgewiesenerKenntnisse_empfehlen',
+ 'position'=>'128',
+ 'name'=>$p->t('lehre/anrechnungen'),
+ 'icon'=>'../../../skin/images/button_listen.png',
+ 'link' => APP_ROOT. 'index.ci.php/lehre/anrechnung/ReviewAnrechnungUebersicht?studiensemester='.urlencode($angezeigtes_stsem)
+ );
+}
+
//************* Menuepunkte anzeigen ****************
diff --git a/locale/de-AT/lehre.php b/locale/de-AT/lehre.php
index 3f44edcb9..fb938322f 100644
--- a/locale/de-AT/lehre.php
+++ b/locale/de-AT/lehre.php
@@ -42,4 +42,5 @@ $this->phrasen['lehre/studienplan']='Studienplan';
$this->phrasen['lehre/noteneingabedeaktiviert']='Noteneingabe deaktiviert';
$this->phrasen['lehre/anerkennungNachgewiesenerKenntnisse']='Anerkennung nachgewiesener Kenntnisse';
$this->phrasen['lehre/anrechnung']='Anrechnung';
+$this->phrasen['lehre/anrechnungen']='Anrechnungen';
?>
diff --git a/locale/en-US/lehre.php b/locale/en-US/lehre.php
index 603492c84..1fd41700f 100644
--- a/locale/en-US/lehre.php
+++ b/locale/en-US/lehre.php
@@ -42,5 +42,6 @@ $this->phrasen['lehre/studienplan']='Studienplan';
$this->phrasen['lehre/noteneingabedeaktiviert']='Grading disabled';
$this->phrasen['lehre/anerkennungNachgewiesenerKenntnisse']='Crediting for proven knowledge';
$this->phrasen['lehre/anrechnung']='Exemption';
+$this->phrasen['lehre/anrechnungen']='Exemptions';
?>
diff --git a/public/css/Tabulator.css b/public/css/Tabulator.css
index e9045dc85..e8f2aec36 100644
--- a/public/css/Tabulator.css
+++ b/public/css/Tabulator.css
@@ -69,4 +69,10 @@
.btn-mr50
{
margin-right: 50px;
+}
+
+.table-fixed
+{
+ table-layout: fixed;
+ word-wrap: break-word;
}
\ No newline at end of file
diff --git a/public/css/lehre/anrechnung.css b/public/css/lehre/anrechnung.css
new file mode 100644
index 000000000..36956d79c
--- /dev/null
+++ b/public/css/lehre/anrechnung.css
@@ -0,0 +1,7 @@
+.select-w500 {
+ width: 500px;
+}
+
+.pl-15 {
+ padding-left: 15px !important;
+}
\ No newline at end of file
diff --git a/public/js/AjaxLib.js b/public/js/AjaxLib.js
index 47cc2b67f..fb98e4fb8 100644
--- a/public/js/AjaxLib.js
+++ b/public/js/AjaxLib.js
@@ -379,6 +379,57 @@ var FHC_AjaxClient = {
this._veilTimeout);
},
+ /**
+ * Check if controllerParameters has a FileList of uploaded file(s).
+ *
+ * @param controllerParameters
+ * Example: {
+ * name1: value,
+ * name2: value,
+ * files: $(selector)[0].files --> this is the FileList
+ * }
+ * @returns {boolean}
+ * @private
+ */
+ _hasFileList(controllerParameters){
+ return Object.values(controllerParameters)
+ .some((value) => value instanceof FileList === true);
+ },
+
+ /**
+ * Returns a FormData object. Useful for passing uploaded files via AJAX.
+ *
+ * @param controllerParameters
+ * @returns {FormData}
+ * @private
+ */
+ _convertToFormDataObject: function(controllerParameters)
+ {
+ // The new FormData instance
+ const formData = new FormData();
+
+ // Loop through controllerParameters
+ for (const [key, value] of Object.entries(controllerParameters)) {
+
+ // When FileList is found ( parameter with uploaded file(s))
+ if (value instanceof FileList)
+ {
+ // Loop through uploaded files
+ for (let file of value)
+ {
+ // Append file to FormData object (if more than 1 file, append as array)
+ formData.append(value.length == 1 ? key : key + '[]', file);
+ }
+ }
+ else
+ {
+ // For any other then FileList, just append to FormData object
+ formData.append(key, value);
+ }
+ }
+ return formData;
+ },
+
/**
* Checks call parameters, if they are present and are valid
* It generates and returns all the parameters needed to perform an ajax remote call
@@ -419,8 +470,22 @@ var FHC_AjaxClient = {
// controllerParameters must be an object
if (typeof controllerParameters == "object")
{
- // Copy the properties of controllerParameters into a new object
- var data = FHC_AjaxClient._cpObjProps(controllerParameters);
+ // If controllerParameters contains uploaded file(s) as FileList
+ if (controllerParameters !== null && FHC_AjaxClient._hasFileList(controllerParameters))
+ {
+ // Convert controllerParameters to FormData object to easily pass uploaded files via AJAX
+ var data = FHC_AjaxClient._convertToFormDataObject(controllerParameters); // data is a FormData object now
+
+ // Add options to tell jQuery not to process data or worry about content-type
+ ajaxParameters.processData = false;
+ ajaxParameters.contentType = false;
+ }
+ // Anything else
+ else
+ {
+ // Copy the properties of controllerParameters into a new object
+ var data = FHC_AjaxClient._cpObjProps(controllerParameters);
+ }
// fhc_controller_id is given if present
data[FHC_CONTROLLER_ID] = FHC_AjaxClient.getUrlParameter(FHC_CONTROLLER_ID);
diff --git a/public/js/TableWidget.js b/public/js/TableWidget.js
index c7eea73c3..6df20066e 100644
--- a/public/js/TableWidget.js
+++ b/public/js/TableWidget.js
@@ -544,7 +544,7 @@ var FHC_TableWidget = {
options.columns = arrayTabulatorColumns;
options.data = data.dataset;
- if (options.tableWidgetHeader == 'undefined')
+ if (typeof options.tableWidgetHeader == 'undefined')
{
options.persistentLayout = true; // enables persistence (default store in localStorage if available, else in cookie)
options.persistenceID = data.tableUniqueId; // TableWidget unique id to store persistence data seperately for multiple tables
@@ -552,9 +552,13 @@ var FHC_TableWidget = {
options.movableColumns = true; // allows changing column order
options.tooltipsHeader = true; // set header tooltip with column title
options.placeholder = _func_placeholder(); // display text when table is empty
- options.rowSelectionChanged = function(data, rows){
- _func_rowSelectionChanged(data, rows);
- };
+
+ if (typeof options.rowSelectionChanged == 'undefined')
+ {
+ options.rowSelectionChanged = function(data, rows){
+ _func_rowSelectionChanged(data, rows);
+ };
+ }
options.columnVisibilityChanged = function(column, visible) {
_func_columnVisibilityChanged(column, visible);
};
@@ -569,8 +573,8 @@ var FHC_TableWidget = {
// -------------------------------------------------------------------------------------------------------------
// Render tableWidgetHeader
- if (options.tableWidgetHeader == 'undefined' ||
- (options.tableWidgetHeader != 'undefined' && options.tableWidgetHeader != false))
+ if (typeof options.tableWidgetHeader == 'undefined' ||
+ (typeof options.tableWidgetHeader != 'undefined' && options.tableWidgetHeader != false))
{
var tabulatorHeaderHTML = _renderTabulatorHeaderHTML(tableWidgetDiv);
tableWidgetDiv.find('#tableWidgetHeader').append(tabulatorHeaderHTML);
@@ -588,7 +592,7 @@ var FHC_TableWidget = {
* selectButtons: true // tableWidgetFooter properties are checked in _renderTabulatorFooterHTML function
* }
*/
- if (options.tableWidgetFooter != 'undefined' && options.tableWidgetFooter != null)
+ if (typeof options.tableWidgetFooter != 'undefined' && options.tableWidgetFooter != null)
{
var tabulatorFooterHTML = _renderTabulatorFooterHTML(options.tableWidgetFooter);
tableWidgetDiv.find('#tableWidgetFooter').append(tabulatorFooterHTML);
@@ -860,7 +864,7 @@ function _renderTabulatorFooterHTML(tableWidgetFooterOptions){
var tabulatorFooterHTML = '';
// If property selectButtons is true, render 'Alle auswaehlen / Alle abwaehlen' buttons
- if (tableWidgetFooterOptions.selectButtons != 'undefined' && tableWidgetFooterOptions.selectButtons == true)
+ if (typeof tableWidgetFooterOptions.selectButtons != 'undefined' && tableWidgetFooterOptions.selectButtons == true)
{
tabulatorFooterHTML += '
';
tabulatorFooterHTML += '
';
diff --git a/public/js/lehre/anrechnung/approveAnrechnungDetail.js b/public/js/lehre/anrechnung/approveAnrechnungDetail.js
index 3b80da205..c2c2899ee 100644
--- a/public/js/lehre/anrechnung/approveAnrechnungDetail.js
+++ b/public/js/lehre/anrechnung/approveAnrechnungDetail.js
@@ -24,6 +24,9 @@ $(function(){
// Set status alert color
approveAnrechnungDetail.setStatusAlertColor();
+ // Set Empfehlungstext
+ approveAnrechnungDetail.setEmpfehlungstext();
+
// Init tooltips
approveAnrechnungDetail.initTooltips();
@@ -34,14 +37,23 @@ $(function(){
if (genehmigung_panel.is(":hidden"))
{
- // Show begruendung panel if is hidden
- genehmigung_panel.slideDown('slow');
+ // Show genehmigung panel if is hidden
+ genehmigung_panel.css('display', 'block');
+ genehmigung_panel.slideDown(400, function() {
+ $('html, body').animate({
+ scrollTop: genehmigung_panel.offset().top // Move genehmigung panel bottom up to be visible within window screen
+ }, 400);
+ });
+
return;
}
});
// Approve Anrechnungen
- $("#approveAnrechnungDetail-approve-anrechnung-confirm").click(function(){
+ $("#approveAnrechnungDetail-approve-anrechnung-confirm").click(function(e){
+
+ // Avoid bubbling click event to sibling break button
+ e.stopImmediatePropagation();
// Get form data
let form_data = $('form').serializeArray();
@@ -93,13 +105,22 @@ $(function(){
if (begruendung_panel.is(":hidden"))
{
// Show begruendung panel if is hidden
- begruendung_panel.slideDown('slow');
+ begruendung_panel.css('display', 'block');
+ begruendung_panel.slideDown(400, function() {
+ $('html, body').animate({
+ scrollTop: begruendung_panel.offset().top // Move begruendung panel bottom up to be visible within window screen
+ }, 400);
+ });
+
return;
}
});
// Reject Anrechnungen
- $("#approveAnrechnungDetail-reject-anrechnung-confirm").click(function(){
+ $("#approveAnrechnungDetail-reject-anrechnung-confirm").click(function(e){
+
+ // Avoid bubbling click event to sibling break button
+ e.stopImmediatePropagation();
let begruendung = $('#approveAnrechnungDetail-begruendung').val();
@@ -110,9 +131,6 @@ $(function(){
return;
}
- // Avoid form redirecting automatically
- event.preventDefault();
-
// Get form data
let form_data = $('form').serializeArray();
@@ -158,10 +176,12 @@ $(function(){
});
// Request Recommendation for Anrechnungen
- $("#approveAnrechnungDetail-request-recommendation").click(function(){
+ $("#approveAnrechnungDetail-request-recommendation").click(function(e){
+
+ e.preventDefault();
// Get form data
- let form_data = $('form').serializeArray();
+ let form_data = $('#form-empfehlung').serializeArray();
// Prepare data object for ajax call
@@ -186,8 +206,9 @@ $(function(){
if (!data.error && data.retval != null)
{
approveAnrechnungDetail.formatEmpfehlungIsRequested(
- data.retval[0].empfehlung_angefordert_am,
- data.retval[0].status_bezeichnung
+ data.retval[0].status_bezeichnung,
+ data.retval[0].empfehlungsanfrageAm,
+ data.retval[0].empfehlungsanfrageAn
);
}
},
@@ -199,6 +220,139 @@ $(function(){
);
});
+ // Withdraw approvement or rejection
+ $("#approveAnrechnungDetail-withdraw-anrechnung-approvement").click(function(){
+
+ if(!confirm(FHC_PhrasesLib.t("anrechnung", "genehmigungAblehnungWirklichZuruecknehmen")))
+ {
+ return;
+ }
+
+ // Get form data
+ let form_data = $('form').serializeArray();
+
+ // Prepare data object for ajax call
+ let data = {
+ 'anrechnung_id' : form_data[0].value
+ };
+
+ FHC_AjaxClient.ajaxCallPost(
+ FHC_JS_DATA_STORAGE_OBJECT.called_path + "/withdraw",
+ data,
+ {
+ successCallback: function (data, textStatus, jqXHR)
+ {
+ console.log(data);
+ if (data.error && data.retval != null)
+ {
+ console.log('inside error');
+ // Print error message
+ FHC_DialogLib.alertWarning(data.retval);
+ }
+
+ if (!data.error && data.retval != null)
+ {
+ console.log('inside success');
+ approveAnrechnungDetail.formatGenehmigungIsWithdrawed(
+ data.retval.status_bezeichnung
+ );
+
+ FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("anrechnung", "erfolgreichZurueckgenommen"));
+
+ }
+ },
+ errorCallback: function (jqXHR, textStatus, errorThrown)
+ {
+ FHC_DialogLib.alertError(FHC_PhrasesLib.t("ui", "systemfehler"));
+ }
+ }
+ );
+ });
+
+ // Withdraw request for recommendation
+ $("#approveAnrechnungDetail-withdraw-request-recommedation").click(function(e){
+
+ e.preventDefault();
+
+ if(!confirm(FHC_PhrasesLib.t("anrechnung", "empfehlungsanforderungWirklichZuruecknehmen")))
+ {
+ return;
+ }
+
+ // Get form data
+ let form_data = $('#form-empfehlung').serializeArray();
+
+ // Prepare data object for ajax call
+ let data = {
+ 'anrechnung_id' : form_data[0].value
+ };
+
+ FHC_AjaxClient.ajaxCallPost(
+ FHC_JS_DATA_STORAGE_OBJECT.called_path + "/withdrawRequestRecommendation",
+ data,
+ {
+ successCallback: function (data, textStatus, jqXHR)
+ {
+ console.log(data);
+ if (data.error && data.retval != null)
+ {
+ // Print error message
+ FHC_DialogLib.alertWarning(data.retval);
+ }
+
+ if (!data.error && data.retval != null)
+ {
+ approveAnrechnungDetail.formatEmpfehlungIsWithdrawed(
+ data.retval.status_bezeichnung
+ );
+
+ FHC_DialogLib.alertSuccess(
+ FHC_PhrasesLib.t("anrechnung", "erfolgreichZurueckgenommen")
+ );
+
+ }
+ },
+ errorCallback: function (jqXHR, textStatus, errorThrown)
+ {
+ FHC_DialogLib.alertError(FHC_PhrasesLib.t("ui", "systemfehler"));
+ }
+ }
+ );
+ });
+
+ $('#form-empfehlungNotiz').submit(function(e){
+
+ e.preventDefault();
+
+ FHC_AjaxClient.ajaxCallPost(
+ FHC_JS_DATA_STORAGE_OBJECT.called_path + "/saveEmpfehlungsNotiz",
+ {
+ anrechnung_id: this.anrechnung_id.value,
+ notiz_id: this.notiz_id.value,
+ empfehlung_text: this.empfehlungText.value
+ },
+ {
+ successCallback: function (data){
+
+ if (FHC_AjaxClient.isError(data)){
+
+ // Print error message
+ FHC_DialogLib.alertWarning(FHC_AjaxClient.getError(data));
+ }
+
+ if (FHC_AjaxClient.hasData(data)){
+
+ // Print success message
+ FHC_DialogLib.alertSuccess((FHC_AjaxClient.getData(data)))
+ }
+ },
+ errorCallback(){
+ FHC_DialogLib.alertError(FHC_PhrasesLib.t("ui", "systemfehler"));
+ }
+ }
+ )
+ })
+
// Copy Begruendung into textarea
$(".btn-copyIntoTextarea").click(function(){
approveAnrechnungDetail.copyIntoTextarea(this);
@@ -212,7 +366,7 @@ $(function(){
// Break Begruendung abgeben
$('#approveAnrechnungDetail-begruendung-abbrechen').click(function(){
- $('#approveAnrechnungDetail-begruendung').val('');
+
begruendung_panel.slideUp('slow');
})
@@ -238,6 +392,24 @@ var approveAnrechnungDetail = {
$('#approveAnrechnungDetail-status_kurzbz').closest('div').addClass('alert-warning');
}
},
+ setEmpfehlungstext: function () {
+ let empfehlung = $('#approveAnrechnungDetail-empfehlung').data('empfehlung');
+
+ switch (empfehlung) {
+ case true:
+ $('#approveAnrechnungDetail-empfehlungDetail-empfehlung')
+ .addClass('text-success')
+ .html(FHC_PhrasesLib.t("anrechnung", "empfehlungPositivConfirmed"));
+ break;
+ case false:
+ $('#approveAnrechnungDetail-empfehlungDetail-empfehlung')
+ .addClass('text-danger')
+ .html(FHC_PhrasesLib.t("anrechnung", "empfehlungNegativConfirmed"));
+ break;
+ default:
+ $('#approveAnrechnungDetail-empfehlungDetail-empfehlung').html('-');
+ }
+ },
initTooltips: function (){
$('[data-toggle="tooltip"]').tooltip({
delay: { "show": 200, "hide": 200 },
@@ -250,20 +422,30 @@ var approveAnrechnungDetail = {
// Find closest textarea
let textarea = $(elem).closest('div').find('textarea');
- // Copy begruendung into textarea
- textarea.val($.trim($(elem).parent().find('span:first').text()));
+ if (elem.id.length && elem.id == 'empfehlungstextUebernehmen')
+ {
+ // Copy Empfehlungstext into textarea
+ textarea.val($.trim($('#approveAnrechnungDetail-empfehlungDetail-begruendung').text()));
+ return;
+ }
+ else
+ {
+ // Copy begruendung into textarea
+ textarea.val($.trim($(elem).parent().find('span:first').text()));
+ }
},
- formatEmpfehlungIsRequested: function(empfehlungAngefordertAm, statusBezeichnung) {
- $('#approveAnrechnungDetail-empfehlungDetail').children().addClass('hidden');
- $('#approveAnrechnungDetail-empfehlungDetail-empfehlungIsAngefordert').removeClass('hidden');
- $('#approveAnrechnungDetail-empfehlungDetail-empfehlungAngefordertAm').text(empfehlungAngefordertAm);
+ formatEmpfehlungIsRequested: function(statusBezeichnung, empfehlungsanfrageAm, empfehlungsanfrageAn) {
+ $('#approveAnrechnungDetail-empfehlungDetail-empfehlungsanfrageAm').html(empfehlungsanfrageAm);
+ $('#approveAnrechnungDetail-empfehlungDetail-empfehlungsanfrageAn').html(empfehlungsanfrageAn);
$('#approveAnrechnungDetail-status_kurzbz').text(statusBezeichnung);
$('#approveAnrechnungDetail-request-recommendation').prop('disabled', true);
$('#approveAnrechnungDetail-approve-anrechnung-ask').prop('disabled', true);
$('#approveAnrechnungDetail-reject-anrechnung-ask').prop('disabled', true);
+ $('#approveAnrechnungDetail-withdraw-request-recommedation').removeClass('hidden');
},
formatGenehmigungIsPositiv: function(abgeschlossenAm, abgeschlossenVon, statusBezeichnung){
- $('#approveAnrechnungDetail-genehmigungDetail').children().addClass('hidden');
+ $('#approveAnrechnungDetail-genehmigungDetail-genehmigungIsNull').addClass('hidden');
+ $('#approveAnrechnungDetail-genehmigungDetail-genehmigungIsNegativ').addClass('hidden');
$('#approveAnrechnungDetail-genehmigungDetail-genehmigungIsPositiv').removeClass('hidden');
$('#approveAnrechnungDetail-status_kurzbz').text(statusBezeichnung);
$('#approveAnrechnungDetail-status_kurzbz').closest('div').removeClass('alert-warning').addClass('alert-success');
@@ -272,9 +454,13 @@ var approveAnrechnungDetail = {
$('#approveAnrechnungDetail-request-recommendation').prop('disabled', true);
$('#approveAnrechnungDetail-approve-anrechnung-ask').prop('disabled', true);
$('#approveAnrechnungDetail-reject-anrechnung-ask').prop('disabled', true);
+
+ // Show button to withdraw approval
+ $('#approveAnrechnungDetail-withdraw-anrechnung-approvement').removeClass('hidden');
},
formatGenehmigungIsNegativ: function(abgeschlossenAm, abgeschlossenVon, statusBezeichnung, begruendung){
- $('#approveAnrechnungDetail-genehmigungDetail').children().addClass('hidden');
+ $('#approveAnrechnungDetail-genehmigungDetail-genehmigungIsNull').addClass('hidden');
+ $('#approveAnrechnungDetail-genehmigungDetail-genehmigungIsPositiv').addClass('hidden');
$('#approveAnrechnungDetail-genehmigungDetail-genehmigungIsNegativ').removeClass('hidden');
$('#approveAnrechnungDetail-status_kurzbz').text(statusBezeichnung);
$('#approveAnrechnungDetail-status_kurzbz').closest('div').removeClass('alert-warning').addClass('alert-danger');
@@ -284,5 +470,45 @@ var approveAnrechnungDetail = {
$('#approveAnrechnungDetail-request-recommendation').prop('disabled', true);
$('#approveAnrechnungDetail-approve-anrechnung-ask').prop('disabled', true);
$('#approveAnrechnungDetail-reject-anrechnung-ask').prop('disabled', true);
+
+ // Show button to withdraw approval
+ $('#approveAnrechnungDetail-withdraw-anrechnung-approvement').removeClass('hidden');
+ },
+ formatGenehmigungIsWithdrawed: function (statusBezeichnung){
+ let empfehlung = $('#approveAnrechnungDetail-empfehlung').data('empfehlung'); // null / false / true
+
+ $('#approveAnrechnungDetail-status_kurzbz').text(statusBezeichnung);
+ $('#approveAnrechnungDetail-status_kurzbz').closest('div').removeClass('alert-danger').removeClass('alert-success');
+ $('#approveAnrechnungDetail-status_kurzbz').closest('div').addClass('alert-warning');
+
+ $('#approveAnrechnungDetail-genehmigungDetail-genehmigungIsNull').removeClass('hidden');
+ $('#approveAnrechnungDetail-genehmigungDetail-genehmigungIsPositiv').addClass('hidden');
+ $('#approveAnrechnungDetail-genehmigungDetail-genehmigungIsNegativ').addClass('hidden');
+
+ $('#approveAnrechnungDetail-abgeschlossenAm').text('-');
+ $('#approveAnrechnungDetail-abgeschlossenVon').text('-');
+
+ // Only enable recommendation button again if no recommendation was submitted until now
+ if (empfehlung === null)
+ {
+ $('#approveAnrechnungDetail-request-recommendation').prop('disabled', false);
+ }
+ $('#approveAnrechnungDetail-approve-anrechnung-ask').prop('disabled', false);
+ $('#approveAnrechnungDetail-reject-anrechnung-ask').prop('disabled', false);
+ // Hide button to withdraw approval
+ $('#approveAnrechnungDetail-withdraw-anrechnung-approvement').addClass('hidden');
+ },
+ formatEmpfehlungIsWithdrawed: function (statusBezeichnung){
+ $('#approveAnrechnungDetail-status_kurzbz').text(statusBezeichnung);
+
+ $('#approveAnrechnungDetail-empfehlungDetail-empfehlungIsNull').removeClass('hidden');
+ $('#approveAnrechnungDetail-empfehlungDetail-empfehlungsanfrageAm').html('-');
+ $('#approveAnrechnungDetail-empfehlungDetail-empfehlungsanfrageAn').html('-');
+
+ $('#approveAnrechnungDetail-request-recommendation').prop('disabled', false);
+ $('#approveAnrechnungDetail-approve-anrechnung-ask').prop('disabled', false);
+ $('#approveAnrechnungDetail-reject-anrechnung-ask').prop('disabled', false);
+ // Hide button to withdraw approval
+ $('#approveAnrechnungDetail-withdraw-request-recommedation').addClass('hidden');
}
}
\ No newline at end of file
diff --git a/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js b/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js
index 28c3b74e1..ff3235e52 100644
--- a/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js
+++ b/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js
@@ -9,6 +9,20 @@ const ANRECHNUNGSTATUS_REJECTED = 'rejected';
const COLOR_LIGHTGREY = "#f5f5f5";
+// -----------------------------------------------------------------------------------------------------------------
+// Mutators - setter methods to manipulate table data when entering the tabulator
+// -----------------------------------------------------------------------------------------------------------------
+
+// Converts string date postgre style to string DD.MM.YYYY.
+// This will allow correct filtering.
+var mut_formatStringDate = function(value, data, type, params, component) {
+ if (value != null)
+ {
+ var d = new Date(value);
+ return ("0" + (d.getDate())).slice(-2) + "." + ("0" + (d.getMonth() + 1)).slice(-2) + "." + d.getFullYear();
+ }
+}
+
// TABULATOR FUNCTIONS
// ---------------------------------------------------------------------------------------------------------------------
// Returns relative height (depending on screen size)
@@ -36,6 +50,7 @@ function hf_filterTrueFalse(headerValue, rowValue){
}
// Adds column details
+// Sets focus on filterbutton, if table starts with stored filter.
function func_tableBuilt(table) {
table.addColumn(
{
@@ -49,10 +64,16 @@ function func_tableBuilt(table) {
url:function(cell){
return BASE_URL + "/" + APPROVE_ANRECHNUNG_DETAIL_URI + "?anrechnung_id=" + cell.getData().anrechnung_id
},
- // target:"_blank"
+ target:"_blank"
}
}, false, "status" // place column after status
);
+
+ // Set focus on filterbutton
+ let filters = table.getFilters();
+ if (filters.length > 0){
+ approveAnrechnung.focusFilterbuttonIfTableStartsWithStoredFilter(filters);
+ }
}
// Formats the rows
@@ -156,6 +177,26 @@ $(function(){
);
});
+ // Show only rows that are in progress by lector
+ $("#show-inProgressLektor").click(function(){
+ $('#tableWidgetTabulator').tabulator('setFilter',
+ [
+ {field: 'status_kurzbz', type: '=', value: ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR},
+ {field: 'empfehlung_anrechnung', type: '=', value: null}
+ ]
+ );
+ });
+
+ // Show only rows with empfohlene + noch nicht genehmigte/abgelehnte anrechnungen
+ $("#show-recommended").click(function(){
+ $('#tableWidgetTabulator').tabulator('setFilter',
+ [
+ {field: 'status_kurzbz', type: '=', value: ANRECHNUNGSTATUS_PROGRESSED_BY_STGL},
+ {field: 'empfehlung_anrechnung', type: '=', value: 'true'}
+ ]
+ );
+ });
+
// Show only rows with nicht empfohlene + noch nicht genehmigte/abgelehnte anrechnungen
$("#show-not-recommended").click(function(){
$('#tableWidgetTabulator').tabulator('setFilter', [
@@ -205,13 +246,21 @@ $(function(){
if (genehmigung_panel.is(":hidden"))
{
// Show begruendung panel if is hidden
- genehmigung_panel.slideDown('slow');
+ genehmigung_panel.slideDown(400, function() {
+ $('html, body').animate({
+ scrollTop: genehmigung_panel.offset().top // Move genehmigung panel bottom up to be visible within window screen
+ }, 400);
+ });
+
return;
}
});
// Approve Anrechnungen
- $("#approveAnrechnungUebersicht-approve-anrechnungen-confirm").click(function(){
+ $("#approveAnrechnungUebersicht-approve-anrechnungen-confirm").click(function(e){
+
+ // Avoid bubbling click event to sibling break button
+ e.stopImmediatePropagation();
// Get selected rows data
let selected_data = $('#tableWidgetTabulator').tabulator('getSelectedData')
@@ -274,13 +323,21 @@ $(function(){
if (begruendung_panel.is(":hidden"))
{
// Show begruendung panel if is hidden
- begruendung_panel.slideDown('slow');
+ begruendung_panel.slideDown(400, function() {
+ $('html, body').animate({
+ scrollTop: begruendung_panel.offset().top // Move begruendung panel bottom up to be visible within window screen
+ }, 400);
+ });
+
return;
}
});
// Reject Anrechnungen
- $("#approveAnrechnungUebersicht-reject-anrechnungen-confirm").click(function(){
+ $("#approveAnrechnungUebersicht-reject-anrechnungen-confirm").click(function(e){
+
+ // Avoid bubbling click event to sibling break button
+ e.stopImmediatePropagation();
let begruendung = $('#approveAnrechnungUebersicht-begruendung').val();
@@ -310,9 +367,6 @@ $(function(){
return;
}
- // Avoid form redirecting automatically
- event.preventDefault();
-
// Prepare data object for ajax call
let data = {
'data': selected_data
@@ -352,6 +406,7 @@ $(function(){
// Request Recommendation for Anrechnungen
$("#approveAnrechnungUebersicht-request-recommendation").click(function(){
+
// Get selected rows data
let selected_data = $('#tableWidgetTabulator').tabulator('getSelectedData');
@@ -398,12 +453,23 @@ $(function(){
if (!data.error && data.retval != null)
{
- // Update status 'genehmigt'
- $('#tableWidgetTabulator').tabulator('updateData', data.retval);
-
- // Print success message
- FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "empfehlungWurdeAngefordert"));
+ // Print info message, if not all selected recommendations were requested
+ if (data.retval.length < selected_data.length){
+ FHC_DialogLib.alertInfo(
+ FHC_PhrasesLib.t(
+ "ui", "empfehlungWurdeAngefordertAusnahmeWoKeineLektoren",
+ [selected_data.length, data.retval.length, selected_data.length - data.retval.length])
+ );
+ }
+ else
+ {
+ // Print success message
+ FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "empfehlungWurdeAngefordert"));
+ }
}
+
+ //Update status 'genehmigt'
+ $('#tableWidgetTabulator').tabulator('updateData', data.retval);
},
errorCallback: function (jqXHR, textStatus, errorThrown)
{
@@ -421,7 +487,7 @@ $(function(){
// Break Ablehnung abgeben
$('#approveAnrechnungUebersicht-begruendung-abbrechen').click(function(){
- $('#approveAnrechnungUebersicht-begruendung').val('');
+
begruendung_panel.slideUp('slow');
})
@@ -458,5 +524,40 @@ var approveAnrechnung = {
// Copy begruendung into textarea
textarea.val($.trim($(elem).parent().text()));
+ },
+ focusFilterbuttonIfTableStartsWithStoredFilter(filters){
+ switch (filters[0].value) {
+ case ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR:
+ $("#show-inProgressLektor").addClass('active');
+ break;
+ case ANRECHNUNGSTATUS_APPROVED:
+ $("#show-approved").addClass('active');
+ break;
+ case ANRECHNUNGSTATUS_REJECTED:
+ $("#show-rejected").addClass('active');
+ break;
+ case ANRECHNUNGSTATUS_PROGRESSED_BY_STGL:
+ if (filters.length > 1)
+ {
+ if (filters[1].field == 'empfehlung_anrechnung')
+ {
+ if (filters[1].value === 'true')
+ {
+ $("#show-recommended").addClass('active');
+ }
+ else
+ {
+ $("#show-not-recommended").addClass('active');
+ }
+ }
+ }
+ else
+ {
+ $("#show-inProgressDP").addClass('active');
+ }
+
+ break;
+
+ }
}
}
\ No newline at end of file
diff --git a/public/js/lehre/anrechnung/createAnrechnung.js b/public/js/lehre/anrechnung/createAnrechnung.js
new file mode 100644
index 000000000..176821f2c
--- /dev/null
+++ b/public/js/lehre/anrechnung/createAnrechnung.js
@@ -0,0 +1,159 @@
+$(function () {
+
+ // Disable all form fields by default
+ createAnrechnung.disableFormFields();
+
+ // Create Anrechnung on form submit
+ $('#createAnrechnung-form').submit(function(e){
+
+ e.preventDefault();
+
+ FHC_AjaxClient.ajaxCallPost(
+ FHC_JS_DATA_STORAGE_OBJECT.called_path + "/create",
+ {
+ prestudent_id: this.prestudent_id.value,
+ studiensemester_kurzbz: this.studiensemester_kurzbz.value,
+ lehrveranstaltung_id: this.lehrveranstaltung_id.value,
+ begruendung_id: this.begruendung_id.value,
+ herkunftKenntnisse: this.herkunftKenntnisse.value,
+ uploadfile: this.uploadfile.files
+ },
+ {
+ successCallback: function (data, textStatus, jqXHR)
+ {
+ if (FHC_AjaxClient.isError(data))
+ {
+ FHC_DialogLib.alertWarning(FHC_AjaxClient.getError(data));
+ }
+
+ if (FHC_AjaxClient.hasData(data))
+ {
+ FHC_DialogLib.alertSuccess(FHC_AjaxClient.getData(data).msg);
+
+ // Display button to open Anrechnung in new tab
+ createAnrechnung.displayButtonToOpenAnrechnung(FHC_AjaxClient.getData(data).anrechnung_id);
+ }
+ },
+ errorCallback: function (jqXHR, textStatus, errorThrown)
+ {
+ FHC_DialogLib.alertError(FHC_PhrasesLib.t("ui", "systemfehler"));
+ }
+ }
+ );
+ });
+})
+
+// TABULATOR FUNCTIONS
+// ---------------------------------------------------------------------------------------------------------------------
+/**
+ * Set form fields and populate selectmenu with LVs of student
+ * on row selection.
+ *
+ * @param row
+ */
+function func_rowSelected(row){
+ let studiensemester_kurzbz = $('#studiensemester_kurzbz').val();
+ let prestudent_id = row.getData().prestudent_id;
+ let vorname = row.getData().vorname;
+ let nachname = row.getData().nachname;
+
+ // Set hidden form field Prestudent ID
+ $('#prestudent_id').val(prestudent_id);
+
+ // Set field StudentIn
+ $('#student').text(vorname + ' ' + nachname);
+
+ // Populate Select with LVs of student
+ createAnrechnung.populateSelectWithStudentLVs(prestudent_id, studiensemester_kurzbz);
+
+ // Enable all form fields
+ createAnrechnung.enableFormFields();
+}
+
+/**
+ * Empty and disable form fields
+ * when none row selected.
+ *
+ * @param data
+ * @param rows
+ */
+function func_rowSelectionChanged(data, rows){
+
+ // If no student is selected in the table
+ if (rows.length == 0)
+ {
+ // ...empty form fields
+ createAnrechnung.emptyFormFields();
+
+ // ...disable form fields
+ createAnrechnung.disableFormFields();
+ }
+}
+
+// ---------------------------------------------------------------------------------------------------------------------
+
+var createAnrechnung = {
+ emptyFormFields: function(){
+
+ // Empty field StudentIn
+ $('#student').text('');
+
+ // Empty form fields (except hidden ones)
+ $('#createAnrechnung-form :input:not([type=hidden])').val('');
+
+ // Hide eventually displayed button to open Anrechnung
+ $('#createAnrechnung-openAnrechnung').addClass('hidden');
+ },
+ disableFormFields: function(){
+ let prestudent_id = $('#prestudent_id').data('prestudent_id');
+
+ if (prestudent_id == '')
+ {
+ // Disable all form elements
+ $("#createAnrechnung-form :input").prop("disabled", true);
+ }
+ },
+ enableFormFields: function(){
+ $("#createAnrechnung-form :input").prop("disabled", false);
+ },
+ populateSelectWithStudentLVs: function(prestudent_id, studiensemester_kurzbz){
+ FHC_AjaxClient.ajaxCallPost(
+ FHC_JS_DATA_STORAGE_OBJECT.called_path + "/getLVsByStudent",
+ {'prestudent_id': prestudent_id, 'studiensemester_kurzbz': studiensemester_kurzbz},
+ {
+ successCallback: function (data, textStatus, jqXHR)
+ {
+ if (FHC_AjaxClient.isError(data))
+ {
+ // Print error message
+ FHC_DialogLib.alertWarning(FHC_AjaxClient.getError(data));
+ }
+
+ if (FHC_AjaxClient.hasData(data))
+ {
+ let lehrveranstaltungen = FHC_AjaxClient.getData(data);
+
+ // Remove previous Lehrveranstaltungen
+ $('#select-lehrveranstaltung option').slice(1).remove(); // Leave first option 'Bitte wählen'
+
+ // Append Lehrveranstaltungen
+ for (let lv of lehrveranstaltungen){
+ $('#select-lehrveranstaltung').append('');
+ }
+ }
+ },
+ errorCallback: function (jqXHR, textStatus, errorThrown)
+ {
+ FHC_DialogLib.alertError(FHC_PhrasesLib.t("ui", "systemfehler"));
+ }
+ }
+ );
+ },
+ displayButtonToOpenAnrechnung: function(anrechnung_id){
+ // Display button to open Anrechnung in new tab
+ $('#createAnrechnung-openAnrechnung')
+ .removeClass('hidden')
+ .attr('href', 'ApproveAnrechnungDetail/?anrechnung_id=' + anrechnung_id)
+ .html(' ' + FHC_PhrasesLib.t("global", "antragBearbeiten"));
+ }
+}
\ No newline at end of file
diff --git a/public/js/lehre/anrechnung/requestAnrechnung.js b/public/js/lehre/anrechnung/requestAnrechnung.js
index 1f9f8b51b..fa7d02de8 100644
--- a/public/js/lehre/anrechnung/requestAnrechnung.js
+++ b/public/js/lehre/anrechnung/requestAnrechnung.js
@@ -1,14 +1,65 @@
const ANRECHNUNGSTATUS_APPROVED = 'approved';
const ANRECHNUNGSTATUS_REJECTED = 'rejected';
+const HERKUNFT_DER_KENNTNISSE_MAX_LENGTH = 125;
$(function(){
// Set status alert color
requestAnrechnung.setStatusAlertColor();
+ // Disable Form fields if Anrechnung was already applied
+ requestAnrechnung.disableFormFieldsIfAntragIsApplied();
+
+ // Check Bestaetigung checkbox if Anrechnung was already applied
+ requestAnrechnung.markAsBestaetigtIfAntragIsApplied();
+
// Init tooltips
requestAnrechnung.initTooltips();
+ // Set chars counter for textarea 'Herkunft der Kenntnisse'
+ requestAnrechnung.setCharsCounter();
+ // If Sperregrund exists: display Sperre panel, hide Status panel and disable all form elements
+ requestAnrechnung.displaySperreIfHasSperregrund();
+
+ $('#requestAnrechnung-form').submit(function(e){
+
+ // Avoid form redirecting automatically
+ e.preventDefault();
+
+ FHC_AjaxClient.ajaxCallPost(
+ FHC_JS_DATA_STORAGE_OBJECT.called_path + "/apply",
+ {
+ anmerkung: this.anmerkung.value,
+ begruendung: this.begruendung.value,
+ lv_id: this.lv_id.value,
+ studiensemester: this.studiensemester.value,
+ bestaetigung: this.bestaetigung.value,
+ uploadfile: this.uploadfile.files
+ },
+ {
+ successCallback:function(data, textStatus, jqXHR){
+ if (FHC_AjaxClient.isError(data))
+ {
+ FHC_DialogLib.alertWarning(FHC_AjaxClient.getError(data));
+ }
+
+ if (FHC_AjaxClient.hasData(data))
+ {
+ requestAnrechnung.formatAnrechnungIsApplied(
+ data.retval.antragdatum,
+ data.retval.dms_id,
+ data.retval.filename
+ );
+
+ FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("global", "antragWurdeGestellt"));
+ }
+ },
+ errorCallback: function(jqXHR, textStatus, errorThrown){
+ FHC_DialogLib.alertWarning(FHC_PhrasesLib.t("ui", "systemfehler"));
+ }
+ }
+ );
+ });
})
var requestAnrechnung = {
@@ -24,9 +75,62 @@ var requestAnrechnung = {
break;
case '':
$('#requestAnrechnung-status_kurzbz').closest('div').addClass('alert-info');
+ $('#requestAnrechnung-status_kurzbz').text(FHC_PhrasesLib.t("ui", "neu"));
break;
default:
$('#requestAnrechnung-status_kurzbz').closest('div').addClass('alert-warning');
+ $('#requestAnrechnung-status_kurzbz').text(FHC_PhrasesLib.t("ui", "inBearbeitung"));
+ }
+ },
+ disableFormFieldsIfAntragIsApplied: function(){
+ let status_kurzbz = $('#requestAnrechnung-status_kurzbz').data('status_kurzbz');
+
+ if (status_kurzbz != '')
+ {
+ // Disable all form elements
+ requestAnrechnung.disableFormFields();
+ }
+ },
+ markAsBestaetigtIfAntragIsApplied: function(){
+ let status_kurzbz = $('#requestAnrechnung-status_kurzbz').data('status_kurzbz');
+
+ if (status_kurzbz != '')
+ {
+ $("#requestAnrechnung-form :input[name='bestaetigung']").prop('checked', true);
+ }
+ },
+ disableFormFields(){
+ // Disable all form elements
+ $("#requestAnrechnung-form :input").prop("disabled", true);
+ },
+ displaySperreIfHasSperregrund: function(){
+ const anrechnung_id = $('#requestAnrechnung-sperre').data('anrechnung_id');
+ const is_expired = $('#requestAnrechnung-sperre').data('expired');
+ const is_blocked = $('#requestAnrechnung-sperre').data('blocked');
+
+ // If Deadline is expired or is blocked by grades of LV, AND not already angerechnet
+ if ((is_expired || is_blocked) && anrechnung_id == '')
+ {
+ // Hide status panel
+ $('#requestAnrechnung-status').hide();
+
+ // Show sperre panel
+ $('#requestAnrechnung-sperre')
+ .removeClass('hidden')
+ .html(function(){
+ let sperregrund = FHC_PhrasesLib.t('global', 'bearbeitungGesperrt') + ': ';
+
+ if (is_expired) {
+ sperregrund += FHC_PhrasesLib.t('anrechnung', 'deadlineUeberschritten');
+ }
+ else if (is_blocked){
+ sperregrund += FHC_PhrasesLib.t('anrechnung', 'benotungDerLV');
+ }
+ return ""+ sperregrund + "";
+ })
+
+ // Disable all form elements
+ requestAnrechnung.disableFormFields();
}
},
initTooltips: function (){
@@ -35,5 +139,27 @@ var requestAnrechnung = {
html: true
}
);
+ },
+ setCharsCounter: function(){
+ $('#requestAnrechnung-herkunftDerKenntnisse').keyup(function() {
+
+ let length = HERKUNFT_DER_KENNTNISSE_MAX_LENGTH - $(this).val().length;
+
+ $('#requestAnrechnung-herkunftDerKenntnisse-charCounter').text(length);
+ });
+ },
+ formatAnrechnungIsApplied: function (antragdatum, dms_id, filename){
+ $('#requestAnrechnung-antragdatum').text(antragdatum);
+ $('#requestAnrechnung-status_kurzbz').text(FHC_PhrasesLib.t("ui", "inBearbeitung"));
+ $('#requestAnrechnung-status_kurzbz').closest('div').addClass('alert-warning');
+
+ // Display File-Downloadlink
+ $('#requestAnrechnung-downloadDocLink')
+ .removeClass('hidden')
+ .attr('href', 'RequestAnrechnung/download?dms_id=' + dms_id)
+ .html(filename);
+
+ // Disable all form elements
+ $("#requestAnrechnung-form :input").prop("disabled", true);
}
}
\ No newline at end of file
diff --git a/public/js/lehre/anrechnung/reviewAnrechnungDetail.js b/public/js/lehre/anrechnung/reviewAnrechnungDetail.js
index 705e6c440..fc26f4577 100644
--- a/public/js/lehre/anrechnung/reviewAnrechnungDetail.js
+++ b/public/js/lehre/anrechnung/reviewAnrechnungDetail.js
@@ -25,6 +25,9 @@ $(function(){
// Set status alert color
reviewAnrechnung.setStatusAlertColor();
+ // Set Empfehlungstext
+ reviewAnrechnung.setEmpfehlungstext();
+
// Init tooltips
reviewAnrechnung.initTooltips();
@@ -41,13 +44,20 @@ $(function(){
if (empfehlung_panel.is(":hidden"))
{
// Show begruendung panel if is hidden
- empfehlung_panel.slideDown('slow');
+ empfehlung_panel.slideDown(400, function() {
+ $('html, body').animate({
+ scrollTop: empfehlung_panel.offset().top // Move empfehlung panel bottom up to be visible within window screen
+ }, 400);
+ });
return;
}
});
// Recommend Anrechnung
- $("#reviewAnrechnungDetail-recommend-anrechnung-confirm").click(function(){
+ $("#reviewAnrechnungDetail-recommend-anrechnung-confirm").click(function(e){
+
+ // Avoid bubbling click event to sibling break button
+ e.stopImmediatePropagation();
// Get form data
let form_data = $('form').serializeArray();
@@ -99,13 +109,20 @@ $(function(){
if (begruendung_panel.is(":hidden"))
{
// Show begruendung panel if is hidden
- begruendung_panel.slideDown('slow');
+ begruendung_panel.slideDown(400, function() {
+ $('html, body').animate({
+ scrollTop: begruendung_panel.offset().top // Move begruendung panel bottom up to be visible within window screen
+ }, 400);
+ });
return;
}
});
// Dont recommend Anrechnung
- $("#reviewAnrechnungDetail-dont-recommend-anrechnung-confirm").click(function(){
+ $("#reviewAnrechnungDetail-dont-recommend-anrechnung-confirm").click(function(e){
+
+ // Avoid bubbling click event to sibling break button
+ e.stopImmediatePropagation();
let begruendung = $('#reviewAnrechnungDetail-begruendung').val();
@@ -116,9 +133,6 @@ $(function(){
return;
}
- // Avoid form redirecting automatically
- event.preventDefault();
-
// Get form data
let form_data = $('form').serializeArray();
@@ -171,7 +185,7 @@ $(function(){
// Break Begruendung abgeben
$('#reviewAnrechnungDetail-begruendung-abbrechen').click(function(){
- $('#reviewAnrechnungDetail-begruendung').val('');
+
begruendung_panel.slideUp('slow');
})
@@ -196,6 +210,24 @@ var reviewAnrechnung = {
$('#reviewAnrechnungDetail-status_kurzbz').closest('div').addClass('alert-warning');
}
},
+ setEmpfehlungstext: function () {
+ let empfehlung = $('#reviewAnrechnungDetail-empfehlung').data('empfehlung');
+
+ switch (empfehlung) {
+ case true:
+ $('#reviewAnrechnungDetail-empfehlungDetail-empfehlung')
+ .addClass('text-success')
+ .html(FHC_PhrasesLib.t("anrechnung", "empfehlungPositivConfirmed"));
+ break;
+ case false:
+ $('#reviewAnrechnungDetail-empfehlungDetail-empfehlung')
+ .addClass('text-danger')
+ .html(FHC_PhrasesLib.t("anrechnung", "empfehlungNegativConfirmed"));
+ break;
+ default:
+ $('#reviewAnrechnungDetail-empfehlungDetail-empfehlung').html('-');
+ }
+ },
initTooltips: function (){
$('[data-toggle="tooltip"]').tooltip({
delay: { "show": 200, "hide": 200 },
@@ -213,22 +245,28 @@ var reviewAnrechnung = {
textarea.val($.trim($(elem).parent().find('span:first').text()));
},
formatEmpfehlungIsTrue: function(empfehlungAm, emfehlungVon, statusBezeichnung){
- $('#reviewAnrechnungDetail-empfehlungDetail').children().addClass('hidden');
- $('#reviewAnrechnungDetail-empfehlungDetail-empfehlungIsTrue').removeClass('hidden');
$('#reviewAnrechnungDetail-status_kurzbz').text(statusBezeichnung);
$('#reviewAnrechnungDetail-recommend-anrechnung-ask').prop('disabled', true);
$('#reviewAnrechnungDetail-dont-recommend-anrechnung-ask').prop('disabled', true);
$('#reviewAnrechnungDetail-empfehlungAm').text(empfehlungAm);
$('#reviewAnrechnungDetail-empfehlungVon').text(emfehlungVon);
+ $('#reviewAnrechnungDetail-empfehlungDetail-empfehlung')
+ .addClass('text-success')
+ .html(FHC_PhrasesLib.t("anrechnung", "empfehlungPositivConfirmed"));
+ $('#reviewAnrechnungDetail-empfehlungDetail-empfehlungAm').html(empfehlungAm);
+ $('#reviewAnrechnungDetail-empfehlungDetail-empfehlungVon').html(emfehlungVon);
},
formatEmpfehlungIsFalse: function(empfehlungAm, emfehlungVon, statusBezeichnung, begruendung){
- $('#reviewAnrechnungDetail-empfehlungDetail').children().addClass('hidden');
- $('#reviewAnrechnungDetail-empfehlungDetail-empfehlungIsFalse').removeClass('hidden');
$('#reviewAnrechnungDetail-status_kurzbz').text(statusBezeichnung);
$('#reviewAnrechnungDetail-recommend-anrechnung-ask').prop('disabled', true);
$('#reviewAnrechnungDetail-dont-recommend-anrechnung-ask').prop('disabled', true);
$('#reviewAnrechnungDetail-empfehlungAm').text(empfehlungAm);
$('#reviewAnrechnungDetail-empfehlungVon').text(emfehlungVon);
+ $('#reviewAnrechnungDetail-empfehlungDetail-empfehlung')
+ .addClass('text-danger')
+ .html(FHC_PhrasesLib.t("anrechnung", "empfehlungNegativConfirmed"));
+ $('#reviewAnrechnungDetail-empfehlungDetail-empfehlungAm').html(empfehlungAm);
+ $('#reviewAnrechnungDetail-empfehlungDetail-empfehlungVon').html(emfehlungVon);
$('#reviewAnrechnungDetail-empfehlungDetail-begruendung').text(begruendung);
}
}
\ No newline at end of file
diff --git a/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js b/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js
index f9bbbc310..2cf7c1623 100644
--- a/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js
+++ b/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js
@@ -9,6 +9,20 @@ const ANRECHNUNGSTATUS_REJECTED = 'rejected';
const COLOR_LIGHTGREY = "#f5f5f5";
+// -----------------------------------------------------------------------------------------------------------------
+// Mutators - setter methods to manipulate table data when entering the tabulator
+// -----------------------------------------------------------------------------------------------------------------
+
+// Converts string date postgre style to string DD.MM.YYYY.
+// This will allow correct filtering.
+var mut_formatStringDate = function(value, data, type, params, component) {
+ if (value != null)
+ {
+ var d = new Date(value);
+ return ("0" + (d.getDate())).slice(-2) + "." + ("0" + (d.getMonth() + 1)).slice(-2) + "." + d.getFullYear();
+ }
+}
+
// TABULATOR FUNCTIONS
// ---------------------------------------------------------------------------------------------------------------------
// Returns relative height (depending on screen size)
@@ -48,8 +62,8 @@ function func_tableBuilt(table) {
label:"Details",
url:function(cell){
return BASE_URL + "/" + APPROVE_ANRECHNUNG_DETAIL_URI + "?anrechnung_id=" + cell.getData().anrechnung_id
- }
- // target:"_blank"
+ },
+ target:"_blank"
}
}, false, "status" // place column after status
);
@@ -213,13 +227,20 @@ $(function(){
if (empfehlung_panel.is(":hidden"))
{
// Show begruendung panel if is hidden
- empfehlung_panel.slideDown('slow');
+ empfehlung_panel.slideDown(400, function() {
+ $('html, body').animate({
+ scrollTop: empfehlung_panel.offset().top // Move empfehlung panel bottom up to be visible within window screen
+ }, 400);
+ });
return;
}
});
// Recommend Anrechnungen
- $("#reviewAnrechnungUebersicht-recommend-anrechnungen-confirm").click(function(){
+ $("#reviewAnrechnungUebersicht-recommend-anrechnungen-confirm").click(function(e){
+
+ // Avoid bubbling click event to sibling break button
+ e.stopImmediatePropagation();
// Get selected rows data
let selected_data = $('#tableWidgetTabulator').tabulator('getSelectedData')
@@ -283,13 +304,20 @@ $(function(){
if (begruendung_panel.is(":hidden"))
{
// Show begruendung panel if is hidden
- begruendung_panel.slideDown('slow');
+ begruendung_panel.slideDown(400, function() {
+ $('html, body').animate({
+ scrollTop: begruendung_panel.offset().top // Move genehmigung panel bottom up to be visible within window screen
+ }, 400);
+ });
return;
}
});
// Dont recommend Anrechnungen
- $("#reviewAnrechnungUebersicht-dont-recommend-anrechnungen-confirm").click(function(){
+ $("#reviewAnrechnungUebersicht-dont-recommend-anrechnungen-confirm").click(function(e){
+
+ // Avoid bubbling click event to sibling break button
+ e.stopImmediatePropagation();
let begruendung = $('#reviewAnrechnungUebersicht-begruendung').val();
@@ -319,9 +347,6 @@ $(function(){
return;
}
- // Avoid form redirecting automatically
- event.preventDefault();
-
// Prepare data object for ajax call
let data = {
'data': selected_data
@@ -367,7 +392,7 @@ $(function(){
// Break Begruendung abgeben
$('#reviewAnrechnungUebersicht-begruendung-abbrechen').click(function(){
- $('#reviewAnrechnungUebersicht-begruendung').val('');
+
begruendung_panel.slideUp('slow');
})
diff --git a/rdf/anrechnung.rdf.php b/rdf/anrechnung.rdf.php
index 5d50c3161..2df9df156 100644
--- a/rdf/anrechnung.rdf.php
+++ b/rdf/anrechnung.rdf.php
@@ -28,10 +28,24 @@ $anrechnung = new anrechnung();
if(is_numeric($anrechnung_id))
{
$anrechnung->getAnrechnung($anrechnung_id);
+
+ // Add last Anrechnungstatus
+ $anrechnungstatus = new Anrechnung();
+ $anrechnungstatus->getLastAnrechnungstatus($anrechnung_id);
+
+ $anrechnung->result[0]->status = $anrechnungstatus->result[0]->bezeichnung_mehrsprachig[DEFAULT_LANGUAGE];
}
elseif(is_numeric($prestudent_id))
{
$anrechnung->getAnrechnungPrestudent($prestudent_id);
+
+ // Add last Anrechnungstatus to each Anrechnung of Prestudent
+ foreach ($anrechnung->result as $row)
+ {
+ $anrechnungstatus = new Anrechnung();
+ $status = $anrechnungstatus->getLastAnrechnungstatus($row->anrechnung_id);
+ $row->status = $anrechnungstatus->result[0]->bezeichnung_mehrsprachig[DEFAULT_LANGUAGE];
+ }
}
else
{
@@ -80,6 +94,7 @@ if(is_array($anrechnung->result))
insertvon.']]>updateamum.']]>updatevon.']]>
+ status.']]>
';
diff --git a/system/ampel_erinnerungsmail.php b/system/ampel_erinnerungsmail.php
index 02b882965..ae7efc3e1 100644
--- a/system/ampel_erinnerungsmail.php
+++ b/system/ampel_erinnerungsmail.php
@@ -43,6 +43,12 @@ foreach($ampel->result as $a)
$uid = $row->uid;
$mail = new mail($uid.'@'.DOMAIN, 'cis@'.DOMAIN, $subject, $message);
+
+ // If message has HTML content
+ if($message != strip_tags($message)) {
+ $mail->setHTMLContent(sprintf('%s', $message));
+ }
+
if($mail->send())
echo "Email an $uid versandt\n";
else
diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php
index 7e0aefe09..2bd3afed6 100644
--- a/system/dbupdate_3.3.php
+++ b/system/dbupdate_3.3.php
@@ -4637,7 +4637,7 @@ if ($result = @$db->db_query("SELECT 1 FROM campus.tbl_dms_kategorie_gruppe WHER
}
}
-// Add table anrechnung_status
+// Add table anrechnungstatus
if(!$result = @$db->db_query("SELECT 1 FROM lehre.tbl_anrechnungstatus LIMIT 1;"))
{
$qry = "
@@ -4665,42 +4665,6 @@ if(!$result = @$db->db_query("SELECT 1 FROM lehre.tbl_anrechnungstatus LIMIT 1;"
echo ' lehre.tbl_anrechnungstatus: Tabelle hinzugefuegt ';
}
-// GRANT INSERT, UPDATE, DELETE ON TABLE lehre.tbl_anrechnungstatus TO web;
-$qry = 'GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE lehre.tbl_anrechnungstatus TO web;';
-if (!$db->db_query($qry))
- echo 'lehre.tbl_anrechnungstatus '.$db->db_last_error().' ';
-else
- echo ' Granted privileges to web on lehre.tbl_anrechnungstatus';
-
-
-// SEQUENCE seq_anrechnungstatus_status_kurzbz
-if ($result = $db->db_query("SELECT 0 FROM pg_class WHERE relname = 'seq_anrechnungstatus_status_kurzbz'"))
-{
- if ($db->db_num_rows($result) == 0)
- {
- $qry = '
- CREATE SEQUENCE lehre.seq_anrechnungstatus_status_kurzbz
- START WITH 1
- INCREMENT BY 1
- NO MAXVALUE
- NO MINVALUE
- CACHE 1;
- ';
-
- if(!$db->db_query($qry))
- echo 'lehre.seq_anrechnungstatus_status_kurzbz '.$db->db_last_error().' ';
- else
- echo ' Created sequence: lehre.seq_anrechnungstatus_status_kurzbz';
-
- // GRANT SELECT, UPDATE ON SEQUENCE lehre.tbl_anrechnungstatus_status_kurzbz_seq to web;
- $qry = 'GRANT SELECT, UPDATE ON SEQUENCE lehre.seq_anrechnungstatus_status_kurzbz TO web;';
- if (!$db->db_query($qry))
- echo 'lehre.seq_anrechnungstatus_status_kurzbz '.$db->db_last_error().' ';
- else
- echo ' Granted privileges to vilesci on lehre.seq_anrechnungstatus_status_kurzbz';
- }
-}
-
// Add table anrechnung_anrechnungstatus
// Für bestehende genehmigte Anrechnungsanträge wird ein Eintrag mit dem Status 'approved' angelegt
if(!$result = @$db->db_query("SELECT 1 FROM lehre.tbl_anrechnung_anrechnungstatus LIMIT 1;"))
@@ -4730,9 +4694,10 @@ if(!$result = @$db->db_query("SELECT 1 FROM lehre.tbl_anrechnung_anrechnungstatu
INSERT INTO lehre.tbl_anrechnung_anrechnungstatus(anrechnung_id, status_kurzbz) SELECT anrechnung_id, 'approved' as status_kurzbz FROM lehre.tbl_anrechnung WHERE genehmigt_von is not null;
- GRANT SELECT ON lehre.tbl_anrechnung_anrechnungstatus TO web;
+ GRANT SELECT, UPDATE, INSERT, DELETE ON lehre.tbl_anrechnung_anrechnungstatus TO web;
GRANT SELECT, UPDATE, INSERT, DELETE ON lehre.tbl_anrechnung_anrechnungstatus TO vilesci;
GRANT SELECT, UPDATE ON lehre.seq_anrechnung_anrechnungstatus_anrechnungstatus_id TO vilesci;
+ GRANT SELECT, UPDATE ON lehre.seq_anrechnung_anrechnungstatus_anrechnungstatus_id TO web;
";
if(!$db->db_query($qry))
@@ -4796,6 +4761,19 @@ if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berecht
}
}
+// Add permission to create Anrechnung
+if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'lehre/anrechnung_anlegen';"))
+{
+ if($db->db_num_rows($result) == 0)
+ {
+ $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('lehre/anrechnung_anlegen', 'Anrechnung anlegen');";
+
+ if(!$db->db_query($qry))
+ echo 'system.tbl_berechtigung '.$db->db_last_error().' ';
+ else
+ echo ' system.tbl_berechtigung: Added permission for lehre/anrechnung_anlegen ';
+ }
+}
// INSERT,DELETE,UPDATE Berechtigung für tbl_dokumentprestudent hinzufügen
if($result = @$db->db_query("SELECT * FROM information_schema.role_table_grants WHERE table_name='tbl_dokumentprestudent' AND table_schema='public' AND grantee='web' AND privilege_type in ('INSERT','DELETE','UPDATE')"))
@@ -4851,7 +4829,7 @@ if(!$result = @$db->db_query("SELECT 1 FROM public.tbl_zgvpruefung LIMIT 1;"))
updatevon character varying(32)
);
- CREATE SEQUENCE public.tbl_zgvpruefung_id_seq
+ CREATE SEQUENCE public.tbl_zgvpruefung_id_seq
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
@@ -4863,7 +4841,7 @@ if(!$result = @$db->db_query("SELECT 1 FROM public.tbl_zgvpruefung LIMIT 1;"))
GRANT SELECT, UPDATE ON public.tbl_zgvpruefung_id_seq TO vilesci;
GRANT SELECT, INSERT, UPDATE, DELETE ON public.tbl_zgvpruefung TO vilesci;
GRANT SELECT ON public.tbl_zgvpruefung TO web;
-
+
";
if(!$db->db_query($qry))
@@ -4884,7 +4862,7 @@ if(!$result = @$db->db_query("SELECT 1 FROM public.tbl_zgvpruefungstatus_status
datum timestamp without time zone DEFAULT now()
);
- CREATE SEQUENCE public.tbl_zgvpruefungstatus_status_id_seq
+ CREATE SEQUENCE public.tbl_zgvpruefungstatus_status_id_seq
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
@@ -4906,7 +4884,6 @@ if(!$result = @$db->db_query("SELECT 1 FROM public.tbl_zgvpruefungstatus_status
echo ' public.tbl_zgvpruefungstatus_status: Tabelle hinzugefuegt ';
}
-
// Add index to system.tbl_log
if ($result = $db->db_query("SELECT * FROM pg_class WHERE relname='idx_tbl_pruefung_student_uid'"))
{
diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php
index 9c0f931cf..7cd0419ae 100644
--- a/system/phrasesupdate.php
+++ b/system/phrasesupdate.php
@@ -788,6 +788,26 @@ $phrases = array(
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'global',
+ 'phrase' => 'notizDerSTGL',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Notiz der STGL',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Note of the study course director',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'core',
'category' => 'global',
@@ -1494,7 +1514,26 @@ $phrases = array(
)
)
),
-
+ array(
+ 'app' => 'core',
+ 'category' => 'anrechnung',
+ 'phrase' => 'benotungDerLV',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Benotung der Lehrveranstaltung',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Grading of the course',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+),
//*************************** CORE/filter
array(
@@ -8168,7 +8207,7 @@ Any unusual occurrences
'insertvon' => 'system'
)
)
- ),
+ ),
array(
'app' => 'core',
'category' => 'ui',
@@ -9920,7 +9959,7 @@ Any unusual occurrences
'phrases' => array(
array(
'sprache' => 'German',
- 'text' => 'Deadline ist überschritten',
+ 'text' => 'Außerhalb der Einreichfrist',
'description' => '',
'insertvon' => 'system'
),
@@ -10672,6 +10711,26 @@ Any unusual occurrences
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'anrechnung',
+ 'phrase' => 'empfehlungAm',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => ' Empfehlung am',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Recommended on',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'core',
'category' => 'anrechnung',
@@ -11212,6 +11271,46 @@ Any unusual occurrences
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'global',
+ 'phrase' => 'zgv',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'ZGV',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'ZGV',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'global',
+ 'phrase' => 'antragWurdeAngelegt',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Antrag wurde angelegt',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Application was created',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'core',
'category' => 'anrechnung',
@@ -11364,10 +11463,10 @@ Any unusual occurrences
'sprache' => 'German',
'text' => "Bitte laden Sie den Antrag in deutscher oder englischer Sprache für das
-
Wintersemester spätestens bis 15. September
+
Wintersemester spätestens bis 22. September
Sommersemester spätestens bis 22. Februar hoch.
- Die Entscheidung über den Antrag erfolgt in der Regel innerhalb von zwei Wochen ab dem 15. September
+ Die Entscheidung über den Antrag erfolgt in der Regel innerhalb von zwei Wochen ab dem 22. September
bzw. 22. Februar.
Für jede Lehrveranstaltung ist ein gesonderter Antrag beizubringen.",
'description' => '',
@@ -11377,10 +11476,10 @@ Any unusual occurrences
'sprache' => 'English',
'text' => "Please upload the application in German or English
-
by September 15th for the winter semester
+
by September 22nd for the winter semester
by February 22nd for the summer semester at the latest.
- The decision on the application is usually made within two weeks from September 15 (winter semester) or February 22 (summer semester).
+ The decision on the application is usually made within two weeks from September 22 (winter semester) or February 22 (summer semester).
A separate application must be submitted for each course.",
'description' => '',
'insertvon' => 'system'
@@ -11416,17 +11515,17 @@ array(
array(
'sprache' => 'German',
'text' => "Bitte laden Sie mehrere Nachweis-Dokumente zusammengefasst in einem PDF-Dokument hoch.
-
Falls Sie für den Nachweis der Gleichwertigkeit in Bundesgesetzblättern veröffentlichte Lehrpläne (vgl. HTL, HAK…) verwenden,
- laden Sie bitte nur die für die Anrechnung relevanten Teile hoch oder markieren Sie diese entsprechend.
-
Falls diese Informationen nicht enthalten sind, kann der Antrag auch abgelehnt werden.",
+
Falls für den Nachweis der Gleichwertigkeit in Bundesgesetzblättern veröffentlichte Lehrpläne (vgl. HTL, HAK…) verwendet werden,
+ sind die für die Anrechnung relevanten Teile entsprechend zu markieren.
+
Falls das nicht gemacht wird, wird der Antrag aus formalen Gründen abgelehnt.",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => "Please combine and upload more than one verification document in one PDF document.
-
If you use curricula published in federal law gazettes (cf. HTL, HAK ...) to prove equivalence, please upload only the parts relevant for recognition or mark them accordingly.
-
If this information is not included, the application might be rejected.",
+
If you use curricula published in federal law gazettes (cf. HTL, HAK ...) to prove equivalence, please mark the parts relevant for recognition accordingly.
+
If this information is not included, the application must be rejected.",
'description' => '',
'insertvon' => 'system'
)
@@ -11512,7 +11611,7 @@ array(
'sprache' => 'German',
'text' => "Die Entscheidung über den Antrag durch die Studiengangsleitung sollte
-
innerhalb von zwei Wochen ab dem 15. September (Wintersemester)
+
innerhalb von zwei Wochen ab dem 22. September (Wintersemester)
innerhalb von zwei Wochen ab dem 22. Februar (Sommersemester) erfolgen.
",
'description' => '',
@@ -11522,7 +11621,7 @@ array(
'sprache' => 'English',
'text' => "The decision on the application is usually made by the program director
-
within two weeks from September 15 (winter semester)
+
within two weeks from September 22 (winter semester)
within two weeks from February 22 (summer semester).