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..b0bcbd6e4 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(
@@ -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,7 +11463,7 @@ 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
@@ -11377,7 +11476,7 @@ 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).
@@ -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).