Merge branch 'merged_Anrechnungen_26625_27388_28278_28557'

This commit is contained in:
Harald Bamberger
2023-04-24 14:49:29 +02:00
30 changed files with 1783 additions and 319 deletions
+6 -5
View File
@@ -6,10 +6,6 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
// Deadline for Application given as Time-Interval after Semesterstart.
$config['interval_blocking_application'] = 'P1M';
// Application submission period given by start- and enddate.
$config['submit_application_start'] = '05.09.2022';
$config['submit_application_end'] = '22.09.2022';
// Lehrveranstaltungen with these grades will be blocked for application
$config['grades_blocking_application'] = array(
5, // nicht genügend
@@ -19,4 +15,9 @@ $config['grades_blocking_application'] = array(
14, // nicht bestanden,
15, // nicht teilgenommen
18 // unentschuldigt
);
);
//Enables Fachbereichsleiter instead of LV Leiter
$config['fbl'] = FALSE;
//Enables Info Mails
$config['send_mail'] = TRUE;
+17 -1
View File
@@ -164,7 +164,14 @@ $config['navigation_header'] = array(
'expand' => true,
'sort' => 20,
'requiredPermissions' => 'system/developer:r'
)
),
'anrechnungen' => array(
'link' => site_url('lehre/anrechnung/AdminAnrechnung'),
'description' => 'Anrechnungen',
'expand' => true,
'sort' => 30,
'requiredPermissions' => 'lehre/anrechnungszeitfenster:rw'
)
)
)
)
@@ -184,6 +191,15 @@ $config['navigation_menu']['Vilesci/index'] = array(
)
);
$config['navigation_menu']['Vilesci/index'] = array(
'dashboard' => array(
'link' => '#',
'description' => 'Dashboard',
'icon' => 'dashboard',
'sort' => 1
)
);
$config['navigation_menu']['organisation/Reihungstest/index'] = array(
'reihungstestverwalung' => array(
'link' => base_url('vilesci/stammdaten/reihungstestverwaltung.php'),
@@ -0,0 +1,187 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class AdminAnrechnung extends Auth_Controller
{
public function __construct()
{
// Set required permissions
parent::__construct(
array(
'index' => 'lehre/anrechnungszeitfenster:rw',
'save' => 'lehre/anrechnungszeitfenster:rw',
'edit' => 'lehre/anrechnungszeitfenster:rw',
'delete' => 'lehre/anrechnungszeitfenster:rw'
)
);
// Load models
$this->load->model('education/Anrechnung_model', 'AnrechnungModel');
$this->load->model('education/Anrechnungszeitraum_model', 'AnrechnungszeitraumModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
// Load libraries
$this->load->library('WidgetLib');
$this->load->library('PermissionLib');
$this->load->library('AnrechnungLib');
// Load language phrases
$this->loadPhrases(
array(
'global',
'ui',
'lehre',
'anrechnung',
'table'
)
);
$this->_setAuthUID();
$this->setControllerId();
}
public function index()
{
// Set nearest Studiensemester as default
$result = $this->StudiensemesterModel->getNearest();
$studiensemester_kurzbz = hasData($result) ? getData($result)[0]->studiensemester_kurzbz : '';
// Get existing Anrechnungszeitraeume
$this->AnrechnungszeitraumModel->addOrder('anrechnungszeitraum_id', 'DESC');
$result = $this->AnrechnungszeitraumModel->load();
$anrechnungszeitraum_arr = hasData($result) ? getData($result) : array();
$viewData = array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'anrechnungszeitraum_arr' => $anrechnungszeitraum_arr
);
$this->load->view('lehre/anrechnung/adminAnrechnung.php', $viewData);
}
/**
* Save new Anrechnungszeitraum.
*/
public function save()
{
$this->_validate($this->input->post());
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
$anrechnungstart = $this->input->post('anrechnungstart');
$anrechnungende = $this->input->post('anrechnungende');
$result = $this->AnrechnungszeitraumModel->insertAzr($studiensemester_kurzbz, $anrechnungstart, $anrechnungende);
if (isError($result))
{
$this->terminateWithJsonError(getError($result));
}
if (hasData($result))
{
$this->outputJsonSuccess(array('anrechnungszeitraum_id' => getData($result)));
}
}
/**
* Edit Anrechnungszeitraum.
*/
public function edit()
{
$this->_validate($this->input->post());
$anrechnungszeitraum_id = $this->input->post('anrechnungszeitraum_id');
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
$anrechnungstart = $this->input->post('anrechnungstart');
$anrechnungende = $this->input->post('anrechnungende');
$result = $this->AnrechnungszeitraumModel->updateAzr(
$anrechnungszeitraum_id,
$studiensemester_kurzbz,
$anrechnungstart,
$anrechnungende
);
if (isError($result))
{
$this->terminateWithJsonError(getError($result));
}
if (hasData($result))
{
$this->outputJsonSuccess(array('anrechnungszeitraum_id' => getData($result)));
}
}
/**
* Delete Anrechnungszeitraum.
*/
public function delete()
{
$anrechnungszeitraum_id = $this->input->post('anrechnungszeitraum_id');
$result = $this->AnrechnungszeitraumModel->deleteAzr($anrechnungszeitraum_id);
if (isError($result))
{
$this->terminateWithJsonError(getError($result));
}
if (hasData($result))
{
$this->outputJsonSuccess(array('anrechnungszeitraum_id' => getData($result)));
}
}
/**
* Validates post parameters.
*
* @param $post
*/
private function _validate($post)
{
$studiensemester_kurzbz = $post['studiensemester_kurzbz'];
$anrechnungstart = $post['anrechnungstart'];
$anrechnungende = $post['anrechnungende'];
if (isEmptyString($studiensemester_kurzbz)
|| isEmptyString($anrechnungstart)
|| isEmptyString($anrechnungende))
{
$this->terminateWithJsonError($this->p->t('ui', 'errorFelderFehlen'));
}
if ($anrechnungstart > $anrechnungende)
{
$this->terminateWithJsonError($this->p->t('ui', 'errorStartdatumNachEndedatum'));
}
$result = $this->StudiensemesterModel->load($studiensemester_kurzbz);
$studiensemester = getData($result)[0];
if ($anrechnungstart < $studiensemester->start || $anrechnungstart > $studiensemester->ende)
{
$this->terminateWithJsonError($this->p->t('ui', 'errorStartdatumNichtInStudiensemester'));
}
if ($anrechnungende < $studiensemester->start || $anrechnungende > $studiensemester->ende)
{
$this->terminateWithJsonError($this->p->t('ui', 'errorEndedatumNichtInStudiensemester'));
}
}
/**
* Retrieve the UID of the logged user and checks if it is valid
*/
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid) show_error('User authentification failed');
}
}
@@ -33,6 +33,9 @@ class approveAnrechnungDetail extends Auth_Controller
)
);
//Load configs
$this->load->config('anrechnung');
// Load models
$this->load->model('education/Anrechnung_model', 'AnrechnungModel');
$this->load->model('education/Anrechnungstatus_model', 'AnrechnungstatusModel');
@@ -90,7 +93,8 @@ class approveAnrechnungDetail extends Auth_Controller
$antragData = $this->anrechnunglib->getAntragData(
$anrechnungData->prestudent_id,
$anrechnungData->studiensemester_kurzbz,
$anrechnungData->lehrveranstaltung_id
$anrechnungData->lehrveranstaltung_id,
$anrechnungData->anrechnung_id
);
// Get Empfehlung data
@@ -209,48 +213,46 @@ class approveAnrechnungDetail extends Auth_Controller
*/
public function requestRecommendation()
{
$data = $this->input->post('data');
$anrechnung_id = $this->input->post('anrechnung_id');
if(isEmptyArray($data))
if(isEmptyString($anrechnung_id))
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
$retval = array();
$counter = 0;
// Check if Anrechnungs-LV has lector
if (!$this->anrechnunglib->LVhasLector($anrechnung_id))
{
$this->terminateWithJsonError('LV has no lector');
}
foreach ($data as $item)
{
// Check if Anrechnungs-LV has lector
if (!$this->anrechnunglib->LVhasLector($item['anrechnung_id']))
{
// Count up LV with no lector
$counter++;
// Get Fachbereichsleitung or LV Leitung.
if($this->config->item('fbl') === TRUE)
{
$result = $this->anrechnunglib->getLeitungOfLvOe($anrechnung_id);
}
else
{
// If LV Leitung is not present, gets all LV lectors.
$result = $this->anrechnunglib->getLectors($anrechnung_id);
}
// Break, if LV has no lector
break;
}
$empfehlungsanfrage_an = !isEmptyArray($result) ? implode(', ', array_column($result, 'fullname')) : '';
// Get full name of LV Leitung.
// If LV Leitung is not present, get full name of LV lectors.
$lector_arr = $this->anrechnunglib->getLectors($item['anrechnung_id']);
$empfehlungsanfrage_an = !isEmptyArray($lector_arr)
? implode(', ', array_column($lector_arr, 'fullname'))
: '';
// Request Recommendation
if($this->anrechnunglib->requestRecommendation($item['anrechnung_id']))
{
$retval[]= array(
'anrechnung_id' => $item['anrechnung_id'],
'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR,
'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR),
'empfehlung_anrechnung' => null,
'empfehlungsanfrageAm' => (new DateTime())->format('d.m.Y'),
'empfehlungsanfrageAn' => $empfehlungsanfrage_an
);
}
}
// Request Recommendation
if($this->anrechnunglib->requestRecommendation($anrechnung_id))
{
$retval[]= array(
'anrechnung_id' => $anrechnung_id,
'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR,
'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR),
'empfehlung_anrechnung' => null,
'empfehlungsanfrageAm' => (new DateTime())->format('d.m.Y'),
'empfehlungsanfrageAn' => $empfehlungsanfrage_an
);
}
/**
* Send mails to lectors
@@ -259,21 +261,24 @@ class approveAnrechnungDetail extends Auth_Controller
* */
if (!isEmptyArray($retval))
{
self::_sendSanchoMailToLectors($retval);
if ($this->config->item('send_mail') === TRUE)
{
$this->_sendSanchoMailToLectors($anrechnung_id);
}
// Output json to ajax
return $this->outputJsonSuccess($retval);
}
// Output json to ajax
if (isEmptyArray($retval) && $counter > 0)
if (isEmptyArray($retval))
{
return $this->outputJsonError(
$this->terminateWithJsonError(
"Empfehlung wurde nicht angefordert,\nDer LV sind keine LektorInnen zugeteilt."
);
}
return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt'));
$this->terminateWithJsonError($this->p->t('ui', 'errorNichtAusgefuehrt'));
}
/**
@@ -467,39 +472,33 @@ class approveAnrechnungDetail extends Auth_Controller
/**
* Send mail to lectors asking for recommendation. (first to LV-Leitung, if not present to all lectors of lv)
* @param $mail_params
* @param $anrechnung_id
* @return bool
*/
private function _sendSanchoMailToLectors($mail_params)
private function _sendSanchoMailToLectors($anrechnung_id)
{
// Get Lehrveranstaltungen
$anrechnung_arr = array();
foreach ($mail_params as $item)
{
$this->AnrechnungModel->addSelect('lehrveranstaltung_id, studiensemester_kurzbz');
$anrechnung_arr[]= array(
'lehrveranstaltung_id' => $this->AnrechnungModel->load($item['anrechnung_id'])->retval[0]->lehrveranstaltung_id,
'studiensemester_kurzbz' => $this->AnrechnungModel->load($item['anrechnung_id'])->retval[0]->studiensemester_kurzbz
);
}
$anrechnung_arr = array_unique($anrechnung_arr, SORT_REGULAR);
$lehrveranstaltung_id = $this->AnrechnungModel->load($anrechnung_id)->retval[0]->lehrveranstaltung_id;
$studiensemester_kurzbz = $this->AnrechnungModel->load($anrechnung_id)->retval[0]->studiensemester_kurzbz;
/**
* Get lectors (prio for LV-Leitung, if not present to all lectors of LV.
* Get mail receivers.
* If config is default (lectors): prio for LV-Leitung, if not present to all lectors of LV.
* Anyway this function will receive a unique array to avoid sending more mails to one and the same lector.
* **/
$lector_arr = $this->_getLectors($anrechnung_arr);
if ($this->config->item('fbl') === TRUE)
{
$receiver_arr = $this->_getLeitungOfLvOe($lehrveranstaltung_id);
}
else
{
$receiver_arr = $this->_getLectors($studiensemester_kurzbz, $lehrveranstaltung_id);
}
// Send mail to lectors
foreach ($lector_arr as $lector)
// Send mail
foreach ($receiver_arr as $receiver)
{
$to = $lector->uid;
$vorname = $lector->vorname;
$to = $receiver->uid. '@'. DOMAIN;;
$vorname = $receiver->vorname;
// Get full name of stgl
$this->load->model('person/Person_model', 'PersonModel');
@@ -537,35 +536,30 @@ class approveAnrechnungDetail extends Auth_Controller
* @param $anrechnung_arr
* @return array
*/
private function _getLectors($anrechnung_arr)
private function _getLectors($studiensemester_kurzbz, $lehrveranstaltung_id)
{
$lector_arr = array();
// Get lectors
foreach($anrechnung_arr as $anrechnung)
{
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$result = $this->LehrveranstaltungModel->getLecturersByLv($anrechnung['studiensemester_kurzbz'], $anrechnung['lehrveranstaltung_id']);
$result = $this->LehrveranstaltungModel->getLecturersByLv($studiensemester_kurzbz, $lehrveranstaltung_id);
if (!$result = getData($result))
{
show_error('Failed retrieving lectors of Lehrveranstaltung');
}
if (!$result = getData($result))
{
show_error('Failed retrieving lectors of Lehrveranstaltung');
}
// Check if lv has LV-Leitung
$key = array_search(true, array_column($result, 'lvleiter'));
// Check if lv has LV-Leitung
$key = array_search(true, array_column($result, 'lvleiter'));
// If lv has LV-Leitung, keep only the one
if ($key !== false)
{
$lector_arr[]= $result[$key];
}
// ...otherwise keep all lectors
else
{
$lector_arr = array_merge($lector_arr, $result);
}
}
// If lv has LV-Leitung, keep only the one
if ($key !== false)
{
$lector_arr[]= $result[$key];
}
// ...otherwise keep all lectors
else
{
$lector_arr = array_merge($lector_arr, $result);
}
/**
* NOTE: This step is only done to make the array unique by uid, vorname and nachname in the following step
@@ -584,6 +578,14 @@ class approveAnrechnungDetail extends Auth_Controller
}
// Get Leitungen of Lehrveranstaltungs-Organisationseinheit
private function _getLeitungOfLvOe($lehrveranstaltung_id)
{
$result = $this->LehrveranstaltungModel->getLeitungOfLvOe($lehrveranstaltung_id);
return hasData($result) ? getData($result) : show_error('Failed retrieving Leitung of Lehrveranstaltungs-Organisationseinheit');
}
private function _saveEmpfehlungsNotiz($anrechnung_id, $empfehlungstext, $notiz_id)
{
$this->load->model('person/Notiz_model', 'NotizModel');
@@ -606,8 +608,5 @@ class approveAnrechnungDetail extends Auth_Controller
trim($empfehlungstext),
$this->_uid
);
}
}
@@ -28,6 +28,9 @@ class approveAnrechnungUebersicht extends Auth_Controller
)
);
// Load configs
$this->load->config('anrechnung');
// Load models
$this->load->model('education/Anrechnung_model', 'AnrechnungModel');
$this->load->model('education/Anrechnungstatus_model', 'AnrechnungstatusModel');
@@ -78,6 +81,19 @@ class approveAnrechnungUebersicht extends Auth_Controller
show_error(getError($studiengang_kz_arr));
}
// Get oes the user is entitled for
$oe_kurzbz_arr_schreibberechtigt = array();
if ($oe_arr = $this->permissionlib->getOE_isEntitledFor(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN))
{
foreach($oe_arr as $oe)
{
$berechtigt = $this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid', $oe);
if ($berechtigt) $oe_kurzbz_arr_schreibberechtigt[]= $oe;
}
}
// Check if permission is readonly
$hasReadOnlyAccess =
$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's')
&& !$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid');
@@ -87,9 +103,11 @@ class approveAnrechnungUebersicht extends Auth_Controller
$viewData = array(
'studiensemester_selected' => $studiensemester_kurzbz,
'studiengaenge_entitled' => $studiengang_kz_arr,
'studiengaenge_entitled' => $studiengang_kz_arr, // alle STG mit Lese- und Schreibberechtigung
'oes_schreibberechtigt' => $oe_kurzbz_arr_schreibberechtigt, // alle STG nur mit Schreibberechtigung
'hasReadOnlyAccess' => $hasReadOnlyAccess,
'hasCreateAnrechnungAccess' => $hasCreateAnrechnungAccess
'hasCreateAnrechnungAccess' => $hasCreateAnrechnungAccess,
'configFachbereichsleitung' => $this->config->item('fbl')
);
$this->load->view('lehre/anrechnung/approveAnrechnungUebersicht.php', $viewData);
@@ -207,14 +225,20 @@ class approveAnrechnungUebersicht extends Auth_Controller
// Request Recommendation
if($this->anrechnunglib->requestRecommendation($item['anrechnung_id']))
{
// Get full name of LV Leitung.
// If LV Leitung is not present, get full name of LV lectors.
$lector_arr = $this->anrechnunglib->getLectors($item['anrechnung_id']);
$empfehlungsanfrage_an = !isEmptyArray($lector_arr)
? implode(', ', array_column($lector_arr, 'fullname'))
: '';
// Get full name of Fachbereichsleitung or LV Leitung.
if($this->config->item('fbl') === TRUE)
{
$result = $this->anrechnunglib->getLeitungOfLvOe($item['anrechnung_id']);
}
else
{
// If LV Leitung is not present, get full name of LV lectors.
$result = $this->anrechnunglib->getLectors($item['anrechnung_id']);
}
$retval[]= array(
$empfehlungsanfrage_an = !isEmptyArray($result) ? implode(', ', array_column($result, 'fullname')) : '';
$retval[]= array(
'anrechnung_id' => $item['anrechnung_id'],
'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR,
'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR),
@@ -226,19 +250,27 @@ class approveAnrechnungUebersicht extends Auth_Controller
}
/**
* Send mails to lectors
* Send mails
* NOTE: mails are sent at the end to ensure sending only ONE mail to each LV-Leitung or lector
* even if they are required for more recommendations
* */
if (!isEmptyArray($retval))
{
self::_sendSanchoMailToLectors($retval);
if ($this->config->item('send_mail') === TRUE)
{
$this->_sendSanchoMail($retval);
}
}
// Output json to ajax
if (isEmptyArray($retval) && $counter == 0)
if (isEmptyArray($retval))
{
return $this->outputJsonError('Es wurden keine Empfehlungen angefordert');
if ($counter > 0)
{
$this->terminateWithJsonError('Bei '. $counter.' LV sind keine LektorInnen zugeteilt.');
}
$this->terminateWithJsonError('Es wurden keine Empfehlungen angefordert');
}
return $this->outputJsonSuccess($retval);
@@ -316,7 +348,7 @@ class approveAnrechnungUebersicht extends Auth_Controller
* @param $mail_params
* @return bool
*/
private function _sendSanchoMailToLectors($mail_params)
private function _sendSanchoMail($mail_params)
{
// Get Lehrveranstaltungen
$anrechnung_arr = array();
@@ -332,18 +364,25 @@ class approveAnrechnungUebersicht extends Auth_Controller
$anrechnung_arr = array_unique($anrechnung_arr, SORT_REGULAR);
/**
* Get lectors (prio for LV-Leitung, if not present to all lectors of LV.
* Anyway this function will receive a unique array to avoid sending more mails to one and the same lector.
* **/
$lector_arr = $this->_getLectors($anrechnung_arr);
/**
* Get mail receivers.
* If retrieving lectors: prio for LV-Leitung, if not present to all lectors of LV.
* This function will receive a unique array to avoid sending more mails to one and the same user.
**/
if($this->config->item('fbl') === TRUE)
{
$receiver_arr = $this->_getLeitungOfLvOe($anrechnung_arr);
}
else
{
$receiver_arr = $this->_getLectors($anrechnung_arr);
}
// Send mail to lectors
foreach ($lector_arr as $lector)
foreach ($receiver_arr as $receiver)
{
$to = $lector->uid;
$vorname = $lector->vorname;
$to = $receiver->uid. '@'. DOMAIN;
$vorname = $receiver->vorname;
// Get full name of stgl
$this->load->model('person/Person_model', 'PersonModel');
@@ -427,4 +466,34 @@ class approveAnrechnungUebersicht extends Auth_Controller
return $lector_arr;
}
/**
* Get Leitungen of Lehrveranstaltungs-Organisationseinheit with unique uids.
*
* @param $anrechnung_arr
* @return array
*/
private function _getLeitungOfLvOe($anrechnung_arr)
{
$oeLeitung_arr = array();
// Get Leitungen
foreach($anrechnung_arr as $anrechnung)
{
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$result = $this->LehrveranstaltungModel->getLeitungOfLvOe($anrechnung['lehrveranstaltung_id']);
if (!hasData($result))
{
show_error('No Leitung found');
}
$oeLeitung_arr = array_merge($oeLeitung_arr, getData($result));
}
// Make array unique
$oeLeitung_arr = array_unique($oeLeitung_arr, SORT_REGULAR);
return $oeLeitung_arr;
}
}
@@ -80,11 +80,7 @@ class requestAnrechnung extends Auth_Controller
$prestudent_id = getData($result)[0]->prestudent_id;
// Check if application deadline is expired
$is_expired = self::_isExpired(
$this->config->item('submit_application_start'),
$this->config->item('submit_application_end'),
$studiensemester_kurzbz
);
$is_expired = $this->_isExpired($studiensemester_kurzbz);
// Check if Lehrveranstaltung was already graded with application blocking grades
$is_blocked = self::_LVhasBlockingGrades($studiensemester_kurzbz, $lehrveranstaltung_id);
@@ -93,7 +89,7 @@ class requestAnrechnung extends Auth_Controller
$anrechnungData = $this->anrechnunglib->getAnrechnungDataByLv($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id);
// Get Antrag data
$antragData = $this->anrechnunglib->getAntragData($prestudent_id, $studiensemester_kurzbz, $lehrveranstaltung_id);
$antragData = $this->anrechnunglib->getAntragData($prestudent_id, $studiensemester_kurzbz, $lehrveranstaltung_id, $anrechnungData->anrechnung_id);
$viewData = array(
'antragData' => $antragData,
@@ -234,32 +230,30 @@ class requestAnrechnung extends Auth_Controller
* @return bool True if deadline is expired
* @throws Exception
*/
private function _isExpired($start, $ende, $studiensemester_kurzbz)
private function _isExpired($studiensemester_kurzbz)
{
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$today = new DateTime('today midnight');
// If start is not given, set to Semesterstart.
if (!isset($start) || isEmptyString($start))
{
$this->StudiensemesterModel->addSelect('start');
$result = $this->StudiensemesterModel->load($studiensemester_kurzbz);
$start = getData($result)[0]->start;
}
// Load all Anrechnungszeitfenster for this Studiensemester
$this->load->model('education/Anrechnungszeitraum_model', 'AnrechnungszeitraumModel');
$result = $this->AnrechnungszeitraumModel->loadWhere(array('studiensemester_kurzbz' => $studiensemester_kurzbz));
// If ende is not given, set to Semesterende.
if (!isset($ende) || isEmptyString($ende))
{
$this->StudiensemesterModel->addSelect('ende');
$result = $this->StudiensemesterModel->load($studiensemester_kurzbz);
$ende = getData($result)[0]->ende;
}
if (hasData($result))
{
// Loop through Anrechnungszeitfenster
foreach (getData($result) as $azrObj)
{
$start = new DateTime($azrObj->anrechnungstart);
$ende = new DateTime($azrObj->anrechnungende);
$today = new DateTime('today midnight');
$start = new DateTime($start);
$ende = new DateTime($ende);
// Return false if today is at least within one Anrechnungszeitraum
if (($today >= $start && $today <= $ende)) return false;
// True if expired
return ($today < $start || $today > $ende);
}
}
// Return true if today is in none Anrechnungszeitraum
return true;
}
/**
@@ -28,6 +28,9 @@ class reviewAnrechnungDetail extends Auth_Controller
)
);
// Load configs
$this->load->config('anrechnung');
// Load models
$this->load->model('education/Anrechnung_model', 'AnrechnungModel');
$this->load->model('education/Anrechnungstatus_model', 'AnrechnungstatusModel');
@@ -84,16 +87,21 @@ class reviewAnrechnungDetail extends Auth_Controller
$antragData = $this->anrechnunglib->getAntragData(
$anrechnungData->prestudent_id,
$anrechnungData->studiensemester_kurzbz,
$anrechnungData->lehrveranstaltung_id
$anrechnungData->lehrveranstaltung_id,
$anrechnungData->anrechnung_id
);
// Get Empfehlung data
$empfehlungData = $this->anrechnunglib->getEmpfehlungData($anrechnung_id);
// False if LV-Leitung is present and user is not LV-Leitung. Otherwise always true.
$isEmpfehlungsberechtigt = $this->anrechnunglib->isEmpfehlungsberechtigt($anrechnung_id);
$viewData = array(
'antragData' => $antragData,
'anrechnungData' => $anrechnungData,
'empfehlungData' => $empfehlungData
'empfehlungData' => $empfehlungData,
'isEmpfehlungsberechtigt' => $isEmpfehlungsberechtigt
);
$this->load->view('lehre/anrechnung/reviewAnrechnungDetail.php', $viewData);
@@ -140,10 +148,13 @@ class reviewAnrechnungDetail extends Auth_Controller
* Send mails to STGL (if not present STGL, send to STGL assistance)
* NOTE: mails are sent at the end to ensure sending only one mail to each STGL
* */
if (!$this->_sendSanchoMails($json, true))
{
return $this->outputJsonError('Failed sending emails');
}
if ($this->config->item('send_mail') === TRUE)
{
if (!$this->_sendSanchoMails($json, true))
{
return $this->outputJsonError('Failed sending emails');
}
}
return $this->outputJsonSuccess($json);
}
@@ -191,10 +202,13 @@ class reviewAnrechnungDetail extends Auth_Controller
if (isset($json) && !isEmptyArray($json))
{
// Send mails to STGL (if not present STGL, send to STGL assistance)
if (!$this->_sendSanchoMails($json, false))
{
return $this->outputJsonError('Failed sending emails');
}
if ($this->config->item('send_mail') === TRUE)
{
if (!$this->_sendSanchoMails($json, false))
{
return $this->outputJsonError('Failed sending emails');
}
}
return $this->outputJsonSuccess($json);
}
@@ -253,8 +267,14 @@ class reviewAnrechnungDetail extends Auth_Controller
show_error('Failed retrieving Anrechnung');
}
$result = $this->LehrveranstaltungModel
->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id);
if($this->config->item('fbl') === TRUE)
{
$result = $this->LehrveranstaltungModel->getLeitungOfLvOe($result->lehrveranstaltung_id);
}
else
{
$result = $this->LehrveranstaltungModel->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id);
}
if($result = getData($result))
{
@@ -282,14 +302,20 @@ class reviewAnrechnungDetail extends Auth_Controller
show_error('Failed retrieving Anrechnung');
}
$result = $this->LehrveranstaltungModel
->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id);
if($this->config->item('fbl') === TRUE)
{
$result = $this->LehrveranstaltungModel->getLeitungOfLvOe($result->lehrveranstaltung_id);
}
else
{
$result = $this->LehrveranstaltungModel->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id);
}
if($result = getData($result))
{
$entitled_lector_arr = array_column($result, 'uid');
$entitled_uid_arr = array_column($result, 'uid');
if (in_array($this->_uid, $entitled_lector_arr))
if (in_array($this->_uid, $entitled_uid_arr))
{
return;
}
@@ -26,6 +26,9 @@ class reviewAnrechnungUebersicht extends Auth_Controller
)
);
// Load configs
$this->load->config('anrechnung');
// Load models
$this->load->model('education/Anrechnung_model', 'AnrechnungModel');
$this->load->model('education/Anrechnungstatus_model', 'AnrechnungstatusModel');
@@ -72,7 +75,8 @@ class reviewAnrechnungUebersicht extends Auth_Controller
}
$viewData = array(
'studiensemester_selected' => $studiensemester_kurzbz
'studiensemester_selected' => $studiensemester_kurzbz,
'configFachbereichsleitung' => $this->config->item('fbl')
);
$this->load->view('lehre/anrechnung/reviewAnrechnungUebersicht.php', $viewData);
@@ -111,16 +115,19 @@ class reviewAnrechnungUebersicht extends Auth_Controller
* Send mails to STGL (if not present STGL, send to STGL assistance)
* NOTE: mails are sent at the end to ensure sending only one mail to each STGL
* */
if (!$this->_sendSanchoMails($json, true))
{
show_error('Failed sending emails');
}
if ($this->config->item('send_mail') === TRUE)
{
if (!$this->_sendSanchoMails($json, true))
{
show_error('Failed sending emails');
}
}
return $this->outputJsonSuccess($json);
}
else
{
return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt'));
$this->terminateWithJsonError($this->p->t('ui', 'errorNichtAusgefuehrt'));
}
}
@@ -154,10 +161,13 @@ class reviewAnrechnungUebersicht extends Auth_Controller
if (isset($json) && !isEmptyArray($json))
{
// Send mails to STGL (if not present STGL, send to STGL assistance)
if (!$this->_sendSanchoMails($json, false))
{
show_error('Failed sending emails');
}
if ($this->config->item('send_mail') === TRUE)
{
if (!$this->_sendSanchoMails($json, false))
{
show_error('Failed sending emails');
}
}
return $this->outputJsonSuccess($json);
}
@@ -217,14 +227,20 @@ class reviewAnrechnungUebersicht extends Auth_Controller
show_error('Failed retrieving Anrechnung');
}
$result = $this->LehrveranstaltungModel
->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id);
if ($this->config->item('fbl') === TRUE)
{
$result = $this->LehrveranstaltungModel->getLeitungOfLvOe($result->lehrveranstaltung_id);
}
else
{
$result = $this->LehrveranstaltungModel->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id);
}
if($result = getData($result))
{
$entitled_lector_arr = array_column($result, 'uid');
$entitled_uid_arr = array_column($result, 'uid');
if (in_array($this->_uid, $entitled_lector_arr))
if (in_array($this->_uid, $entitled_uid_arr))
{
return;
}
+91 -17
View File
@@ -37,19 +37,30 @@ class AnrechnungLib
* @param $lv_id
* @return StdClass
*/
public function getAntragData($prestudent_id, $studiensemester_kurzbz, $lv_id)
public function getAntragData($prestudent_id, $studiensemester_kurzbz, $lv_id, $anrechnung_id = null)
{
$antrag_data = new StdClass();
// Get students UID.
$uid = $this->ci->StudentModel->getUID($prestudent_id);
// Get lehrveranstaltung data. Break, if course is not assigned to student.
if(!$lv = getData($this->ci->LehrveranstaltungModel->getLvByStudent($uid, $studiensemester_kurzbz, $lv_id))[0])
// If Anrechnung exists
if (is_numeric($anrechnung_id))
{
show_error('You are not assigned to this course yet.');
// Just load LV by lv_id
$result = $this->ci->LehrveranstaltungModel->load($lv_id);
$lv = getData($result)[0];
}
// If Anrechnung not exists
else
{
// Load LV, but check if student is assigned to that LV. Break, if not.
if(!$lv = getData($this->ci->LehrveranstaltungModel->getLvByStudent($uid, $studiensemester_kurzbz, $lv_id))[0])
{
show_error('You are not assigned to this course yet.');
}
}
// Get the students personal data
if (!$person = getData($this->ci->PersonModel->getByUid($uid))[0])
{
@@ -274,14 +285,21 @@ class AnrechnungLib
if (hasData($result))
{
$empfehlung_data->empfehlungsanfrageAm = (new DateTime($result->retval[0]->insertamum))->format('d.m.Y');
// Get lectors who received request for recommendation
$lector_arr = self::getLectors($anrechnung_id);
if (!isEmptyArray($lector_arr))
{
$empfehlung_data->empfehlungsanfrageAn = implode(', ', array_column($lector_arr, 'fullname'));
}
// Get users who received request for recommendation
if($this->ci->config->item('fbl') === TRUE)
{
$res = $this->getLeitungOfLvOe($anrechnung_id);
}
else
{
$res = $this->getLectors($anrechnung_id);
}
if (!isEmptyArray($res))
{
$empfehlung_data->empfehlungsanfrageAn = implode(', ', array_column($res, 'fullname'));
}
}
if (is_null($anrechnung->empfehlung_anrechnung))
@@ -741,6 +759,25 @@ class AnrechnungLib
// Continue, if LV has no lector (there is no one to ask for recommendation)
return hasData($result) ? true : false;
}
/**
* Check if user is allowed to recommend Anrechnung.
*
* @param $anrechnung_id
* @return bool
*/
public function isEmpfehlungsberechtigt($anrechnung_id)
{
if($this->ci->config->item('fbl') === TRUE)
{
return true;
}
// Get lv-leitungen or, if not present, all lectors of lv.
$lector_arr = $this->getLectors($anrechnung_id);
// Return false if lv-leitung is present and user is not lv-leitung. Otherways return always true.
return in_array(getAuthUID(), array_column($lector_arr, 'uid'));
}
/**
* Get LV Leitung. If not present, get all LV lectors.
@@ -774,11 +811,14 @@ class AnrechnungLib
// Check if lv has LV-Leitung
$key = array_search(true, array_column($result, 'lvleiter'));
// If lv has LV-Leitung, keep only the one
// If lv has 1 or more LV-Leitungen, keep only them
if ($key !== false)
{
$lector_arr[]= $result[$key];
foreach ($result as $lector)
{
if ($lector->lvleiter) $lector_arr[]= $lector;
}
}
// ...otherwise keep all lectors
else
@@ -803,6 +843,40 @@ class AnrechnungLib
return $lector_arr;
}
/**
* Get Leitung of Lehrveranstaltungs-Organisationseinheit.
*
* @param $anrechnung_id
* @return false|mixed|null
*/
public function getLeitungOfLvOe($anrechnung_id)
{
$this->ci->AnrechnungModel->addSelect('lehrveranstaltung_id');
$result = $this->ci->AnrechnungModel->load($anrechnung_id);
$lehrveranstaltung_id = getData($result)[0]->lehrveranstaltung_id;
// Get Leitungen
$result = $this->ci->LehrveranstaltungModel->getLeitungOfLvOe($lehrveranstaltung_id);
if (!hasData($result))
{
return false;
}
$oeLeitung_arr = getData($result);
foreach ($oeLeitung_arr as $oeLeitung)
{
$oeLeitung->fullname = $oeLeitung->vorname. ' '. $oeLeitung->nachname;
}
// Now make the array unique
$oeLeitung_arr = array_unique($oeLeitung_arr, SORT_REGULAR);
return $oeLeitung_arr;
}
// Return an object with Anrechnungdata
private function _setAnrechnungDataObject($anrechnung)
{
@@ -0,0 +1,87 @@
<?php
class Anrechnungszeitraum_model extends DB_Model
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->dbTable = 'lehre.tbl_anrechnungszeitraum';
$this->pk = 'anrechnungszeitraum_id';
}
/**
* Save new Anrechnungszeitraum.
*
* @param $studiensemester_kurzbz
* @param $anrechnungstart
* @param $anrechnungende
* @return array|stdClass
*/
public function insertAzr($studiensemester_kurzbz, $anrechnungstart, $anrechnungende)
{
$result = $this->insert(array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'anrechnungstart' => $anrechnungstart,
'anrechnungende' => $anrechnungende,
'insertvon' => getAuthUID()
));
if (isError($result))
{
return error('Fehler bei Anrechnungszeitraum speichern.');
}
// Return new anrechnungszeitraum_id
return success($result->retval);
}
/**
* Delete Anrechnungszeitraum.
*
* @param $anrechnungszeitraum_id
* @return array|stdClass
*/
public function deleteAzr($anrechnungszeitraum_id)
{
$result = $this->delete(array('anrechnungszeitraum_id' => $anrechnungszeitraum_id));
if (isError($result))
{
return error('Fehler bei Anrechnungszeitraum löschen.');
}
return success($result->retval);
}
/**
* Update existing Anrechnungszeitraum.
*
* @param $anrechnungszeitraum_id
* @param $studiensemester_kurzbz
* @param $anrechnungstart
* @param $anrechnungende
* @return array|stdClass
*/
public function updateAzr($anrechnungszeitraum_id, $studiensemester_kurzbz, $anrechnungstart, $anrechnungende)
{
$result = $this->update(
$anrechnungszeitraum_id,
array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'anrechnungstart' => $anrechnungstart,
'anrechnungende' => $anrechnungende
)
);
if (isError($result))
{
return error('Fehler bei Anrechnungszeitraum update.');
}
return success($result->retval);
}
}
@@ -200,6 +200,28 @@ class Lehrveranstaltung_model extends DB_Model
return $this->execQuery($query, array($lehrveranstaltung_id, $studiensemester_kurzbz));
}
/**
* Gets all Leiter of Lehrveranstaltungsorganisationseinheit
* @param $lehrveranstaltung_id
* @return array|null
*/
public function getLeitungOfLvOe($lehrveranstaltung_id)
{
$query = "select distinct vorname, nachname, uid
FROM
lehre.tbl_lehrveranstaltung lv
JOIN public.tbl_organisationseinheit og using (oe_kurzbz)
JOIN public.tbl_benutzerfunktion bf using (oe_kurzbz)
join public.tbl_benutzer b using (uid)
join public.tbl_person p using (person_id)
where
bf.datum_von <= now()::date
and (bf.datum_bis >= now()::date or bf.datum_bis is null)
and bf.funktion_kurzbz = 'Leitung' -- Leitung of LV-OE
and lehrveranstaltung_id = ?";
return $this->execQuery($query, array($lehrveranstaltung_id));
}
/**
* Gets Lehrveranstaltungen of a student
@@ -0,0 +1,137 @@
<?php
$includesArray = array(
'title' => $this->p->t('anrechnung', 'anrechnungenVerwalten'),
'jquery3' => true,
'jqueryui1' => true,
'bootstrap3' => true,
'fontawesome6' => true,
'ajaxlib' => true,
'dialoglib' => true,
'tabulator4' => true,
'tablewidget' => true,
'sbadmintemplate3' => true,
'navigationwidget' => true,
'phrases' => array(
'anrechnung' => array(
'anrechnungenVerwalten',
'anrechnungszeitraumFestlegen',
'anrechnungszeitraumHinzufuegen',
'anrechnungszeitraumSpeichern',
'anrechnungszeitraumStart',
'anrechnungszeitraumEnde'
),
'ui' => array(
'aktion',
'geloescht',
'gespeichert',
'frageSicherLoeschen',
'spaltenEinstellen'
),
'lehre' => array('studiensemester'),
'table' => array(
'spaltenEinAusblenden',
'spaltenEinAusblendenMitKlickOeffnen',
'spaltenEinAusblendenAufEinstellungenKlicken',
'spaltenEinAusblendenMitKlickAktivieren',
'spaltenEinAusblendenMitKlickSchliessen',
'spaltenbreiteVeraendern',
'spaltenbreiteVeraendernText',
'spaltenbreiteVeraendernInfotext',
'zeilenAuswaehlen',
'zeilenAuswaehlenEinzeln',
'zeilenAuswaehlenBereich',
'zeilenAuswaehlenAlle'
)
),
'customJSs' => array(
'public/js/bootstrapper.js',
'public/js/lehre/anrechnung/adminAnrechnung.js'
),
'customCSSs' => array(
'public/css/sbadmin2/tablesort_bootstrap.css'
)
);
$this->load->view('templates/FHC-Header', $includesArray);
?>
<div id="wrapper">
<?php echo $this->widgetlib->widget('NavigationWidget'); ?>
<div id="page-wrapper">
<div class="container-fluid">
<!--Titel-->
<div class="page-header">
<h3><?php echo $this->p->t('anrechnung', 'anrechnungenVerwalten'); ?></h3>
</div><br>
<!--Untertitel-->
<h4><?php echo $this->p->t('anrechnung', 'anrechnungszeitraumFestlegen'); ?></h4><br>
<div class="row">
<div class="col-xs-4">
<button class="btn btn-primary azrOpenModal" data-toggle="modal" data-target="#azrModal">
<i class="fa fa-plus"></i> <?php echo $this->p->t('anrechnung', 'anrechnungszeitraumHinzufuegen'); ?>
</button>
</div>
</div>
<!-- Tabelle -->
<div class="row">
<div class="col-lg-12">
<?php $this->load->view('lehre/anrechnung/adminAnrechnungData.php'); ?>
</div>
</div>
<!-- Modal (für insert und update von Anrechnungszeitraum)-->
<div class="modal fade" id="azrModal" tabindex="-1" role="dialog" aria-labelledby="azrModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="azrModalLabel"></h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
</div>
<div class="modal-body">
<div class="row">
<input type="hidden" id="anrechnungszeitraum_id" value="">
<input type="hidden" id="defaultStudiensemester_kurzbz" value="<?php echo $studiensemester_kurzbz ?>">
<div class="col-xs-4">
<label for="studiensemester" class="small">Studiensemester</label>
<?php
echo $this->widgetlib->widget(
'Studiensemester_widget',
array(
DropdownWidget::SELECTED_ELEMENT => $studiensemester_kurzbz
),
array(
'name' => 'studiensemester',
'id' => 'studiensemester'
)
);
?>
</div>
<div class="col-xs-4">
<label for="azrStart" class="small">Anr.-Zeitraum Start</label>
<input type="date" id="azrStart" value="" class="form-control" required>
</div>
<div class="col-xs-4">
<label for="azrEnde" class="small">Anr.-Zeitraum Ende</label>
<input type="date" id="azrEnde" value="" class="form-control" required>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" id="azrInsertBtn" class="btn btn-primary" value=""><?php echo $this->p->t('ui', 'speichern'); ?></button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<?php $this->load->view('templates/FHC-Footer', $includesArray); ?>
@@ -0,0 +1,45 @@
<?php
$query = '
SELECT *
FROM lehre.tbl_anrechnungszeitraum
ORDER BY anrechnungstart DESC
';
$filterWidgetArray = array(
'query' => $query,
'tableUniqueId' => 'adminAnrechnung',
'requiredPermissions' => 'lehre/anrechnungszeitfenster',
'datasetRepresentation' => 'tabulator',
'columnsAliases' => array(
'AzrID',
ucfirst($this->p->t('lehre', 'studiensemester')),
ucfirst($this->p->t('anrechnung', 'anrechnungszeitraumStart')),
ucfirst($this->p->t('anrechnung', 'anrechnungszeitraumEnde')),
ucfirst($this->p->t('ui', 'bearbeitetAm')),
ucfirst($this->p->t('ui', 'bearbeitetVon')),
),
'datasetRepOptions' => '{
height: func_height(this),
layout: "fitDataFill",
persistentLayout:true,
autoResize: false, // prevent auto resizing of table (false to allow adapting table size when cols are (de-)activated
headerFilterPlaceholder: " ",
index: "anrechnungszeitraum_id", // assign specific column as unique id (important for row indexing)
selectable: false, // allow row selection
tableWidgetHeader: true,
tableBuilt: function(){
func_tableBuilt(this);
},
}',
'datasetRepFieldsDefs' => '{
anrechnungszeitraum_id: {visible: false, headerFilter:"input"},
studiensemester_kurzbz: {headerFilter:"input"},
anrechnungstart: {headerFilter:"input", formatter: formatDate},
anrechnungende: {headerFilter:"input", formatter: formatDate},
insertamum: {visible: false, headerFilter:"input"},
insertvon: {visible: false, headerFilter:"input"}
}'
);
echo $this->widgetlib->widget('TableWidget', $filterWidgetArray);
@@ -23,6 +23,7 @@ $this->load->view(
'systemfehler',
'bitteMindEinenAntragWaehlen',
'bitteBegruendungAngeben',
'bitteBegruendungVervollstaendigen',
'empfehlungWurdeAngefordert',
'anrechnungenWurdenGenehmigt',
'anrechnungenWurdenAbgelehnt',
@@ -322,14 +323,6 @@ $this->load->view(
<i class="fa fa-clipboard fa-lg" aria-hidden="true"></i>
</span>
</li>
<li class="list-group-item">
<span><?php echo $this->p->t('anrechnung', 'genehmigungNegativKenntnisseNichtGleichwertig'); ?></span>
<span class="btn-copyIntoTextarea pull-right" data-toggle="tooltip"
data-placement="right"
title="<?php echo $this->p->t('ui', 'textUebernehmen'); ?>">
<i class="fa fa-clipboard fa-lg" aria-hidden="true"></i>
</span>
</li>
<li class="list-group-item">
<span><?php echo $this->p->t('anrechnung', 'genehmigungNegativEctsHoechstgrenzeUeberschritten'); ?></span>
<span class="btn-copyIntoTextarea pull-right" data-toggle="tooltip"
@@ -338,6 +331,14 @@ $this->load->view(
<i class="fa fa-clipboard fa-lg" aria-hidden="true"></i>
</span>
</li>
<li class="list-group-item">
<span><?php echo $this->p->t('anrechnung', 'genehmigungNegativKenntnisseNichtGleichwertigWeil'); ?></span>
<span class="btn-copyIntoTextarea pull-right" data-toggle="tooltip"
data-placement="right"
title="<?php echo $this->p->t('ui', 'textUebernehmen'); ?>">
<i class="fa fa-clipboard fa-lg" aria-hidden="true"></i>
</span>
</li>
<li class="list-group-item">
<span><?php echo $this->p->t('anrechnung', 'genehmigungNegativEmpfehlungstextUebernehmen'); ?></span>
<span id="empfehlungstextUebernehmen" class="btn-copyIntoTextarea pull-right" data-toggle="tooltip"
@@ -346,6 +347,9 @@ $this->load->view(
<i class="fa fa-clipboard fa-lg" aria-hidden="true"></i>
</span>
</li>
<li class="list-group-item" onclick="{ $(this).closest('div').find('textarea').val('').focus()}">
<span><?php echo $this->p->t('anrechnung', 'andereBegruendung'); ?></span>
</li>
</ul>
<textarea class="form-control" name="begruendung"
id="approveAnrechnungDetail-begruendung"
@@ -124,7 +124,7 @@ $this->load->view(
<!-- Tabelle -->
<div class="row">
<div class="col-xs-12">
<?php $this->load->view('lehre/anrechnung/approveAnrechnungUebersichtData.php'); ?>
<?php $this->load->view('lehre/anrechnung/approveAnrechnungUebersichtData.php'); ?>
</div>
</div>
<!-- Genehmigen / Ablehnen Panel -->
@@ -145,18 +145,13 @@ $this->load->view(
<i class="fa fa-clipboard fa-lg" aria-hidden="true"></i>
</span>
</li>
<li class="list-group-item"><?php echo $this->p->t('anrechnung', 'genehmigungNegativKenntnisseNichtGleichwertig'); ?>
<span class="btn-copyIntoTextarea pull-right" data-toggle="tooltip" data-placement="left"
title="<?php echo $this->p->t('ui', 'textUebernehmen'); ?>">
<i class="fa fa-clipboard fa-lg" aria-hidden="true"></i>
</span>
</li>
<li class="list-group-item"><?php echo $this->p->t('anrechnung', 'genehmigungNegativEctsHoechstgrenzeUeberschritten'); ?>
<span class="btn-copyIntoTextarea pull-right" data-toggle="tooltip" data-placement="left"
title="<?php echo $this->p->t('ui', 'textUebernehmen'); ?>">
<i class="fa fa-clipboard fa-lg" aria-hidden="true"></i>
</span>
</li>
<li class="list-group-item disabled"><?php echo $this->p->t('anrechnung', 'genehmigungNegativKenntnisseNichtGleichwertigWeilHinweis'); ?></li>
</ol>
<textarea class="form-control" name="begruendung" id="approveAnrechnungUebersicht-begruendung"
rows="2"
@@ -3,8 +3,9 @@ const ANRECHNUNGSTATUS_PROGRESSED_BY_STGL = 'inProgressDP';
const ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR = 'inProgressLektor';
$STUDIENSEMESTER = $studiensemester_selected;
$STUDIENGAENGE_ENTITLED = implode(', ', $studiengaenge_entitled);
$LANGUAGE_INDEX = getUserLanguage() == 'German' ? '0' : '1';
$STUDIENGAENGE_ENTITLED = implode(', ', $studiengaenge_entitled); // alle STG mit Lese- und Schreibberechtigung
$ORGANISATIONSEINHEITEN_SCHREIBBERECHTIGT = "'". implode('\',\'', $oes_schreibberechtigt). "'"; // alle OE nur mit Schreibberechtigung; singlequote für jeden string notwendig
$LANGUAGE_INDEX = getUserLanguage() == 'German' ? '1' : '2';
$query = '
WITH anrechnungen AS
@@ -14,6 +15,10 @@ $query = '
anrechnung.lehrveranstaltung_id,
anrechnung.begruendung_id,
anrechnung.dms_id,
CASE
WHEN stg.typ || stg.kurzbz IN (' . $ORGANISATIONSEINHEITEN_SCHREIBBERECHTIGT . ') THEN TRUE
ELSE FALSE
END "schreibberechtigt",
anrechnung.studiensemester_kurzbz,
stg.studiengang_kz,
stg.bezeichnung AS stg_bezeichnung,
@@ -35,8 +40,8 @@ $query = '
dmsversion.name AS "dokument_bezeichnung",
anrechnung.anmerkung_student,
(SELECT COALESCE(
array_to_json(zgvmaster.bezeichnung::varchar[])->>' . $LANGUAGE_INDEX . ',
array_to_json(zgv.bezeichnung::varchar[])->>' . $LANGUAGE_INDEX . '
zgvmaster.bezeichnung[' . $LANGUAGE_INDEX . '],
zgv.bezeichnung[' . $LANGUAGE_INDEX . ']
) AS zgv
FROM public.tbl_prestudent
LEFT JOIN bis.tbl_zgv zgv USING (zgv_code)
@@ -71,6 +76,7 @@ $query = '
anrechnungen.lehrveranstaltung_id,
anrechnungen.begruendung_id,
anrechnungen.dms_id,
anrechnungen.schreibberechtigt,
anrechnungen.studiensemester_kurzbz,
anrechnungen.studiengang_kz,
anrechnungen.stg_bezeichnung,
@@ -89,7 +95,7 @@ $query = '
anrechnungen.antragsdatum,
anrechnungen.empfehlung_anrechnung,
anrechnungen.status_kurzbz,
array_to_json(anrechnungstatus.bezeichnung_mehrsprachig::varchar[])->>' . $LANGUAGE_INDEX . ' AS "status_bezeichnung",
anrechnungstatus.bezeichnung_mehrsprachig[' . $LANGUAGE_INDEX . '] AS "status_bezeichnung",
anrechnungen.prestudent_id,
CASE
WHEN (anrechnungen.empfehlung_anrechnung IS NULL AND anrechnungen.status_kurzbz = \'' . ANRECHNUNGSTATUS_PROGRESSED_BY_STGL . '\') THEN NULL
@@ -101,8 +107,39 @@ $query = '
AND status_kurzbz = \'' . ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR . '\'
ORDER BY insertamum DESC
LIMIT 1)
END "empfehlungsanfrageAm",
CASE
END "empfehlungsanfrageAm",';
if ($configFachbereichsleitung === TRUE)
{
$query.= ' CASE
WHEN (anrechnungen.empfehlung_anrechnung IS NULL AND anrechnungen.status_kurzbz = \'' . ANRECHNUNGSTATUS_PROGRESSED_BY_STGL . '\') THEN NULL
ELSE
(SELECT COALESCE(
STRING_AGG(CONCAT_WS(\' \', vorname, nachname), \', \')
) empfehlungsanfrageAn
FROM (
SELECT DISTINCT ON (benutzer.uid) bf.uid, vorname, nachname
FROM lehre.tbl_lehreinheit
JOIN lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id)
JOIN public.tbl_organisationseinheit og using (oe_kurzbz)
JOIN public.tbl_benutzerfunktion bf using (oe_kurzbz)
JOIN public.tbl_benutzer benutzer ON bf.uid = benutzer.uid
JOIN public.tbl_person USING (person_id)
WHERE studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\'
and bf.datum_von <= now()
and (bf.datum_bis >= now() or bf.datum_bis is null)
AND bf.funktion_kurzbz = \'Leitung\'
AND lehrveranstaltung_id = anrechnungen.lehrveranstaltung_id
AND benutzer.aktiv = TRUE
AND tbl_person.aktiv = TRUE
ORDER BY benutzer.uid, nachname, vorname
) as tmp_empfehlungsanfrageEmpfaenger
)
END "empfehlungsanfrageAn"';
}
else
{
$query.= ' CASE
WHEN (anrechnungen.empfehlung_anrechnung IS NULL AND anrechnungen.status_kurzbz = \'' . ANRECHNUNGSTATUS_PROGRESSED_BY_STGL . '\') THEN NULL
ELSE
(SELECT COALESCE(
@@ -122,10 +159,12 @@ $query = '
AND benutzer.aktiv = TRUE
AND tbl_person.aktiv = TRUE
ORDER BY benutzer.uid, lvleiter DESC, nachname, vorname
) as tmp_lvlektoren
) as tmp_empfehlungsanfrageEmpfaenger
)
END "empfehlungsanfrageAn"
FROM anrechnungen
END "empfehlungsanfrageAn"';
}
$query.= ' FROM anrechnungen
JOIN lehre.tbl_anrechnungstatus as anrechnungstatus ON (anrechnungstatus.status_kurzbz = anrechnungen.status_kurzbz)
WHERE studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\'
AND studiengang_kz IN (' . $STUDIENGAENGE_ENTITLED . ')
@@ -141,6 +180,7 @@ $filterWidgetArray = array(
'lehrveranstaltung_id',
'begruendung_id',
'dms_id',
'Schreibberechtigt',
'studiensemester_kurzbz',
'studiengang_kz',
ucfirst($this->p->t('lehre', 'studiengang')),
@@ -167,9 +207,7 @@ $filterWidgetArray = array(
'datasetRepOptions' => '{
height: func_height(this),
layout: "fitColumns", // fit columns to width of table
persistentLayout:true,
persistentSort:true,
persistentFilter:true,
persistenceID: "approveAnrechnungUebersicht_V1",
autoResize: false, // prevent auto resizing of table (false to allow adapting table size when cols are (de-)activated
headerFilterPlaceholder: " ",
index: "anrechnung_id", // assign specific column as unique id (important for row indexing)
@@ -200,6 +238,10 @@ $filterWidgetArray = array(
lehrveranstaltung_id: {visible: false, headerFilter:"input"},
begruendung_id: {visible: false, headerFilter:"input"},
dms_id: {visible: false, headerFilter:"input"},
schreibberechtigt: {
formatter:"tickCross", align:"center",
headerFilter:"tickCross", headerFilterParams:{tristate: true}, headerFilterFunc: hf_schreibberechtigt
},
studiensemester_kurzbz: {visible: false, headerFilter:"input"},
studiengang_kz: {visible: false, headerFilter:"input"},
stg_bezeichnung: {headerFilter:"input"},
@@ -212,7 +254,7 @@ $filterWidgetArray = array(
ectsSumBeruflich: {visible: false, headerFilter:"input", align:"right"},
begruendung: {headerFilter:"input", visible: true},
student: {headerFilter:"input"},
zgv: {visible: false, headerFilter:"input"},
zgv: {headerFilter:"input"},
dokument_bezeichnung: {headerFilter:"input", formatter:"link", formatterParams: paramLookup_dokBez},
anmerkung_student: {headerFilter:"input"},
antragsdatum: {align:"center", headerFilter:"input", mutator: mut_formatStringDate},
@@ -2,7 +2,7 @@
$STUDIENSEMESTER = $studiensemester_selected;
$STUDIENGAENGE_ENTITLED = implode(', ', $studiengaenge_entitled);
$LANGUAGE_INDEX = getUserLanguage() == 'German' ? '0' : '1';
$LANGUAGE_INDEX = getUserLanguage() == 'German' ? '1' : '2';
$query = '
SELECT pst.prestudent_id,
@@ -14,8 +14,8 @@ $query = '
nachname,
vorname,
(SELECT COALESCE(
array_to_json(zgvmaster.bezeichnung::varchar[])->>' . $LANGUAGE_INDEX . ',
array_to_json(zgv.bezeichnung::varchar[])->>' . $LANGUAGE_INDEX . '
zgvmaster.bezeichnung[' . $LANGUAGE_INDEX . '],
zgv.bezeichnung[' . $LANGUAGE_INDEX . ']
) AS zgv
FROM public.tbl_prestudent
LEFT JOIN bis.tbl_zgv zgv USING (zgv_code)
@@ -21,6 +21,7 @@ $this->load->view(
'systemfehler',
'bitteMindEinenAntragWaehlen',
'bitteBegruendungAngeben',
'bitteBegruendungVervollstaendigen',
'anrechnungenWurdenEmpfohlen',
'anrechnungenWurdenNichtEmpfohlen'
),
@@ -234,13 +235,16 @@ $this->load->view(
</span>
</li>
<li class="list-group-item">
<span><?php echo $this->p->t('anrechnung', 'empfehlungNegativKenntnisseNichtGleichwertig'); ?></span>&emsp;
<span><?php echo $this->p->t('anrechnung', 'empfehlungNegativKenntnisseNichtGleichwertigWeil'); ?></span>&emsp;
<span class="btn-copyIntoTextarea pull-right" data-toggle="tooltip"
data-placement="right"
title="<?php echo $this->p->t('ui', 'textUebernehmen'); ?>">
<i class="fa fa-clipboard fa-lg" aria-hidden="true"></i>
</span>
</li>
<li class="list-group-item" onclick="{ $(this).closest('div').find('textarea').val('').focus()}">
<span><?php echo $this->p->t('anrechnung', 'andereBegruendung'); ?></span>
</li>
</ul>
<textarea class="form-control" name="begruendung"
id="reviewAnrechnungDetail-begruendung"
@@ -287,12 +291,12 @@ $this->load->view(
<div class="pull-right">
<button id="reviewAnrechnungDetail-dont-recommend-anrechnung-ask" class="btn btn-danger btn-w200"
type="button"
<?php echo is_null($empfehlungData->empfehlung) ? '' : 'disabled' ?>>
<?php echo (is_null($empfehlungData->empfehlung) && $isEmpfehlungsberechtigt) ? '' : 'disabled' ?>>
<?php echo ucfirst($this->p->t('anrechnung', 'nichtEmpfehlen')); ?>
</button>
<button id="reviewAnrechnungDetail-recommend-anrechnung-ask" class="btn btn-primary btn-w200"
type="button"
<?php echo is_null($empfehlungData->empfehlung) ? '' : 'disabled' ?>>
<?php echo (is_null($empfehlungData->empfehlung) && $isEmpfehlungsberechtigt) ? '' : 'disabled' ?>>
<?php echo ucfirst($this->p->t('anrechnung', 'empfehlen')); ?>
</button>
</div>
@@ -117,7 +117,7 @@ $this->load->view(
<!-- Tabelle -->
<div class="row">
<div class="col-xs-12">
<?php $this->load->view('lehre/anrechnung/reviewAnrechnungUebersichtData.php'); ?>
<?php $this->load->view('lehre/anrechnung/reviewAnrechnungUebersichtData.php');?>
</div>
</div>
<!-- Empfehlung / Nicht Empfehlung Panel -->
@@ -139,12 +139,8 @@ $this->load->view(
<i class="fa fa-clipboard fa-lg" aria-hidden="true"></i>
</span>
</li>
<li class="list-group-item">
<span><?php echo $this->p->t('anrechnung', 'empfehlungNegativKenntnisseNichtGleichwertig'); ?></span>
<span class="btn-copyIntoTextarea pull-right" data-toggle="tooltip" data-placement="right"
title="<?php echo $this->p->t('ui', 'textUebernehmen'); ?>">
<i class="fa fa-clipboard fa-lg" aria-hidden="true"></i>
</span>
<li class="list-group-item disabled">
<?php echo $this->p->t('anrechnung', 'empfehlungNegativKenntnisseNichtGleichwertigWeilHinweis'); ?>
</li>
</ul>
<textarea class="form-control" name="begruendung" id="reviewAnrechnungUebersicht-begruendung"
@@ -1,12 +1,12 @@
<?php
$STUDIENSEMESTER = $studiensemester_selected;
$LEKTOR_UID = getAuthUID();
$LANGUAGE_INDEX = getUserLanguage() == 'German' ? '0' : '1';
$LANGUAGE_INDEX = getUserLanguage() == 'German' ? '1' : '2';
$query = '
WITH anrechnungen AS
(
SELECT DISTINCT
SELECT DISTINCT ON (anrechnung_id)
anrechnung.anrechnung_id,
anrechnung.lehrveranstaltung_id,
anrechnung.begruendung_id,
@@ -21,8 +21,8 @@ $query = '
dmsversion.name AS "dokument_bezeichnung",
anrechnung.anmerkung_student,
(SELECT COALESCE(
array_to_json(zgvmaster.bezeichnung::varchar[])->>' . $LANGUAGE_INDEX . ',
array_to_json(zgv.bezeichnung::varchar[])->>' . $LANGUAGE_INDEX . '
zgvmaster.bezeichnung[' . $LANGUAGE_INDEX . '],
zgv.bezeichnung[' . $LANGUAGE_INDEX . ']
) AS zgv
FROM public.tbl_prestudent
LEFT JOIN bis.tbl_zgv zgv USING (zgv_code)
@@ -37,7 +37,8 @@ $query = '
WHERE anrechnung_id = anrechnung.anrechnung_id
ORDER BY insertamum DESC
LIMIT 1
) AS status_kurzbz
) AS status_kurzbz,
anrechnungstatus.bezeichnung_mehrsprachig[' . $LANGUAGE_INDEX . '] AS "status_bezeichnung"
FROM lehre.tbl_anrechnung AS anrechnung
JOIN public.tbl_prestudent USING (prestudent_id)
JOIN public.tbl_person AS person USING (person_id)
@@ -46,25 +47,83 @@ $query = '
LEFT JOIN campus.tbl_dms_version AS dmsversion USING (dms_id)
JOIN lehre.tbl_anrechnung_anrechnungstatus USING (anrechnung_id)
JOIN lehre.tbl_anrechnung_begruendung AS begruendung USING (begruendung_id)
)
JOIN lehre.tbl_anrechnungstatus as anrechnungstatus USING (status_kurzbz)
WHERE studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\'
-- Order to distinct on last anrechnungstatus
ORDER BY anrechnung.anrechnung_id, lehre.tbl_anrechnung_anrechnungstatus.insertamum DESC
),
-- Allen Lektoren einer LV und flag, welche LV-Leitung innehaben
tbl_lvleitungen AS
(
SELECT DISTINCT ON (benutzer.uid, lehrveranstaltung_id) lehrveranstaltung_id, uid,
CASE WHEN lehrfunktion_kurzbz = \'LV-Leitung\' THEN TRUE
ELSE FALSE
END AS lvleiter
FROM lehre.tbl_lehreinheit
JOIN anrechnungen USING (lehrveranstaltung_id) -- LVs auf Anrechnungen beschränken
JOIN lehre.tbl_lehreinheitmitarbeiter lema USING (lehreinheit_id)
JOIN public.tbl_benutzer benutzer ON lema.mitarbeiter_uid = benutzer.uid
JOIN public.tbl_person USING (person_id)
WHERE tbl_lehreinheit.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\'
AND benutzer.aktiv = TRUE
AND tbl_person.aktiv = TRUE
ORDER BY lehrveranstaltung_id, benutzer.uid, lehrfunktion_kurzbz DESC
)';
SELECT DISTINCT ON (anrechnungen.*, lema.mitarbeiter_uid) anrechnungen.*,
array_to_json(anrechnungstatus.bezeichnung_mehrsprachig::varchar[])->>' . $LANGUAGE_INDEX . ' AS "status_bezeichnung"
FROM anrechnungen
JOIN lehre.tbl_anrechnungstatus as anrechnungstatus ON (anrechnungstatus.status_kurzbz = anrechnungen.status_kurzbz)
JOIN lehre.tbl_lehreinheit le USING (lehrveranstaltung_id)
JOIN lehre.tbl_lehreinheitmitarbeiter lema USING (lehreinheit_id)
WHERE anrechnungen.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\'
AND le.studiensemester_kurzbz = anrechnungen.studiensemester_kurzbz
AND lema.mitarbeiter_uid = \'' . $LEKTOR_UID . '\'
AND le.lehre = TRUE
AND EXISTS (
SELECT 1
FROM lehre.tbl_anrechnung_anrechnungstatus
WHERE anrechnung_id = anrechnungen.anrechnung_id
AND status_kurzbz=\'inProgressLektor\'
)
';
if ($configFachbereichsleitung === TRUE)
{
$query.= '
SELECT
-- immer empfehlungsberechtigt, da hier nur Leitungen der LV-OE eine Empfehlungsanfrage erhalten
TRUE AS empfehlungsberechtigt,
anrechnungen.*
FROM anrechnungen
JOIN lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id)
JOIN public.tbl_organisationseinheit og using (oe_kurzbz) -- OE der LV
JOIN public.tbl_benutzerfunktion bf using (oe_kurzbz)
-- Aktive Leitung der LV-OE
WHERE bf.funktion_kurzbz = \'Leitung\'
and bf.datum_von <= now()
and (bf.datum_bis >= now() or bf.datum_bis is null)
AND bf.uid = \'' . $LEKTOR_UID . '\'
-- check, dass es für diese Anrechnung eine Empfehlungsanfrage gibt
AND EXISTS (
SELECT 1
FROM lehre.tbl_anrechnung_anrechnungstatus
WHERE anrechnung_id = anrechnungen.anrechnung_id
AND status_kurzbz=\'inProgressLektor\'
)
order by empfehlung_anrechnung NULLS FIRST, antragsdatum
';
}
else
{
$query.= '
SELECT DISTINCT ON (anrechnungen.*, lema.mitarbeiter_uid)
CASE
-- erst prüfen, ob es überhaupt eine LV Leitung gibt (wenn nicht, dann immer empfehlungsberechtigt)
WHEN EXISTS (SELECT 1 FROM tbl_lvleitungen WHERE lehrveranstaltung_id = anrechnungen.lehrveranstaltung_id AND lvleiter = TRUE)
-- wenn ja, return true, wenn user LV Leitung ist oder false, wenn nicht
THEN (SELECT EXISTS (SELECT 1 FROM tbl_lvleitungen WHERE lehrveranstaltung_id = anrechnungen.lehrveranstaltung_id AND lvleiter = TRUE AND uid = \'' . $LEKTOR_UID . '\'))
-- wenn es keine LV Leitung, return immer true
ELSE TRUE
END AS empfehlungsberechtigt,
anrechnungen.*
FROM anrechnungen
JOIN lehre.tbl_lehreinheit le USING (lehrveranstaltung_id)
JOIN lehre.tbl_lehreinheitmitarbeiter lema USING (lehreinheit_id)
WHERE le.studiensemester_kurzbz = anrechnungen.studiensemester_kurzbz
AND lema.mitarbeiter_uid = \'' . $LEKTOR_UID . '\'
AND le.lehre = TRUE
-- check, dass es für diese Anrechnung eine Empfehlungsanfrage gibt
AND EXISTS (
SELECT 1
FROM lehre.tbl_anrechnung_anrechnungstatus
WHERE anrechnung_id = anrechnungen.anrechnung_id
AND status_kurzbz=\'inProgressLektor\'
)
';
}
$filterWidgetArray = array(
'query' => $query,
@@ -72,6 +131,7 @@ $filterWidgetArray = array(
'requiredPermissions' => 'lehre/anrechnung_empfehlen',
'datasetRepresentation' => 'tabulator',
'columnsAliases' => array(
'Empfehlungsberechtigt',
'anrechnung_id',
'lehrveranstaltung_id',
'begruendung_id',
@@ -98,6 +158,7 @@ $filterWidgetArray = array(
persistentSort:true,
autoResize: false, // prevent auto resizing of table (false to allow adapting table size when cols are (de-)activated
headerFilterPlaceholder: " ",
initialHeaderFilter: [{field:"empfehlungsberechtigt", value: true}],
index: "anrechnung_id", // assign specific column as unique id (important for row indexing)
selectable: true, // allow row selection
selectableRangeMode: "click", // allow range selection using shift end click on end of range
@@ -122,6 +183,9 @@ $filterWidgetArray = array(
}
}', // tabulator properties
'datasetRepFieldsDefs' => '{
empfehlungsberechtigt: {formatter:"tickCross", align:"center", headerTooltip:"Berechtigt wenn man die LV leitet oder wenn der LV keine LV-Leitung zugeordnet ist.",
headerFilter:"tickCross", headerFilterParams:{"tristate": true}, headerFilterFunc: hf_empfehlungsberechtigt
},
anrechnung_id: {visible: false, headerFilter:"input"},
lehrveranstaltung_id: {visible: false, headerFilter:"input"},
begruendung_id: {visible: false, headerFilter:"input"},
@@ -133,7 +197,7 @@ $filterWidgetArray = array(
ects: {headerFilter:"input", align:"center"},
student: {headerFilter:"input"},
begruendung: {headerFilter:"input"},
zgv: {visible: false, headerFilter:"input"},
zgv: {headerFilter:"input"},
dokument_bezeichnung: {headerFilter:"input", formatter:"link", formatterParams: paramLookup_dokBez},
anmerkung_student: {headerFilter:"input"},
antragsdatum: {align:"center", headerFilter:"input", mutator: mut_formatStringDate},
+1 -1
View File
@@ -65,4 +65,4 @@ table.tablesort-hover tr:hover, .tablesort-active {
/* bring datepicker to front */
#ui-datepicker-div {
z-index: 9999 !important;
}
}
+5 -8
View File
@@ -544,13 +544,10 @@ var FHC_TableWidget = {
options.columns = arrayTabulatorColumns;
options.data = data.dataset;
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
}
options.movableColumns = true; // allows changing column order
options.tooltipsHeader = true; // set header tooltip with column title
options.persistence = (typeof options.persistence == 'undefined') ? true : options.persistence; // enables persistence (default store in localStorage if available, else in cookie)
options.persistenceID = (typeof options.persistenceID == 'undefined') ? data.tableUniqueId : options.persistenceID; // persistenceID to store persistence data seperately for multiple tables
options.movableColumns = (typeof options.movableColumns == 'undefined') ? true : options.movableColumns; // allows changing column order
options.tooltipsHeader = (typeof options.tooltipsHeader == 'undefined') ? true : options.tooltipsHeader; // set header tooltip with column title
options.placeholder = _func_placeholder(); // display text when table is empty
if (typeof options.rowSelectionChanged == 'undefined')
@@ -827,7 +824,7 @@ function _renderTabulatorHeaderCollapseHTML(tableWidgetDiv){
{
var field = column.getField();
var title = column.getDefinition().title;
var btn_select_col_selected = column.getVisibility() ? 'btn-select-col-selected' : '';
var btn_select_col_selected = column.isVisible() ? 'btn-select-col-selected' : '';
// If certain columns should be excluded from the column picker (define them in a blacklist array)
if (typeof tableWidgetBlacklistArray_columnUnselectable != 'undefined' &&
@@ -0,0 +1,242 @@
// TABULATOR
// ---------------------------------------------------------------------------------------------------------------------
// Add Edit and Update Buttons to table rows
function func_tableBuilt(table) {
table.addColumn(
{
title: "Aktion",
align: "center",
width: 150,
formatter: addActionButtons,
}, false // place column right
);
}
// Returns relative height (depending on screen size)
function func_height(table){
return $(window).height() * 0.50;
}
// Converts string date postgre style to string DD.MM.YYYY.
// This will allow correct filtering.
var formatDate = function(cell, formatterParams){
let postgreDate = cell.getValue();
if (postgreDate != null)
{
var d = new Date(postgreDate);
return ("0" + (d.getDate())).slice(-2) + "." + ("0" + (d.getMonth() + 1)).slice(-2) + "." + d.getFullYear();
}
}
// Create Edit and Update Buttons for table rows
var addActionButtons = function(cell) {
// Create edit button
var editBtn = document.createElement("button");
editBtn.type = "button";
editBtn.innerHTML = "<i class=\"fa fa-edit\"></i>";
editBtn.classList.add("azrEditBtn");
editBtn.classList.add("btn");
editBtn.classList.add("btn-default");
editBtn.addEventListener("click", function(){
adminAnrechnung.editRow(cell);
});
// Create delete button
var delBtn= document.createElement("button");
delBtn.type = "button";
delBtn.innerHTML = "<i class=\"fa fa-times\"></i>";
delBtn.classList.add("azrDeleteBtn");
delBtn.classList.add("btn");
delBtn.classList.add("btn-default");
delBtn.style.marginLeft = '5px';
delBtn.addEventListener("click", function(){
adminAnrechnung.deleteRow(cell);
});
// Add buttons to cell
var buttonHolder = document.createElement("span");
buttonHolder.appendChild(editBtn);
buttonHolder.appendChild(delBtn);
return buttonHolder;
}
// ---------------------------------------------------------------------------------------------------------------------
$(function () {
// Empty Modal fields on 'Anrechnungszeitraum hinzufuegen'
$(document).on('click', '.azrOpenModal', function(){
let defaultStudiensemester_kurzbz = $('.modal-body #defaultStudiensemester_kurzbz').val();
$('.modal-header #azrModalLabel').text(FHC_PhrasesLib.t("anrechnung", "anrechnungszeitraumHinzufuegen"));
$('.modal-body #anrechnungszeitraum_id').val('');
$('.modal-body #studiensemester').val(defaultStudiensemester_kurzbz).change();
$('.modal-body #azrStart').val('');
$('.modal-body #azrEnde').val('');
});
// Insert Anrechnungszeitraum
$(document).on('click', '#azrInsertBtn', function(){
var studiensemester_kurzbz = $('.modal-body #studiensemester').val();
var anrechnungstart = $('.modal-body #azrStart').val();
var anrechnungende = $('.modal-body #azrEnde').val();
// Insert Anrechnungszeitraum
adminAnrechnung.insertAzr(studiensemester_kurzbz, anrechnungstart, anrechnungende);
});
})
var adminAnrechnung = {
insertAzr: function(studiensemester_kurzbz, anrechnungstart, anrechnungende){
FHC_AjaxClient.ajaxCallPost(
FHC_JS_DATA_STORAGE_OBJECT.called_path + "/save",
{
studiensemester_kurzbz: studiensemester_kurzbz,
anrechnungstart: anrechnungstart,
anrechnungende: anrechnungende
},
{
successCallback: function (data, textStatus, jqXHR)
{
if (FHC_AjaxClient.isError(data))
{
FHC_DialogLib.alertWarning(FHC_AjaxClient.getError(data));
}
if (FHC_AjaxClient.hasData(data))
{
data = FHC_AjaxClient.getData(data);
// Update row
$('#tableWidgetTabulator').tabulator('addData', [{
anrechnungszeitraum_id: data.anrechnungszeitraum_id,
studiensemester_kurzbz: studiensemester_kurzbz,
anrechnungstart: anrechnungstart,
anrechnungende: anrechnungende
}], true); // true to add row on top
// Close Modal
$('#azrModal').modal('hide');
// Success message
FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "gespeichert"));
}
},
errorCallback: function (jqXHR, textStatus, errorThrown)
{
FHC_DialogLib.alertError(FHC_PhrasesLib.t("ui", "systemfehler"));
}
}
);
},
editRow: function (cell){
// Open Modal
$('#azrModal').modal('show');
let row = cell.getRow();
var anrechnungszeitraum_id = row.getData().anrechnungszeitraum_id;
var studiensemester_kurzbz = row.getData().studiensemester_kurzbz;
var anrechnungstart = row.getData().anrechnungstart;
var anrechnungende = row.getData().anrechnungende;
$('.modal-header #azrModalLabel').text('Anrechnungszeitraum bearbeiten');
$('.modal-body #anrechnungszeitraum_id').val(anrechnungszeitraum_id);
$('.modal-body #studiensemester').val(studiensemester_kurzbz).change();
$('.modal-body #azrStart').val(anrechnungstart);
$('.modal-body #azrEnde').val(anrechnungende);
},
updateAzr: function (anrechnungszeitraum_id, studiensemester_kurzbz, anrechnungstart, anrechnungende) {
FHC_AjaxClient.ajaxCallPost(
FHC_JS_DATA_STORAGE_OBJECT.called_path + "/edit",
{
anrechnungszeitraum_id: anrechnungszeitraum_id,
studiensemester_kurzbz: studiensemester_kurzbz,
anrechnungstart: anrechnungstart,
anrechnungende: anrechnungende
},
{
successCallback: function (data, textStatus, jqXHR)
{
if (FHC_AjaxClient.isError(data))
{
FHC_DialogLib.alertWarning(FHC_AjaxClient.getError(data));
}
if (FHC_AjaxClient.hasData(data))
{
// Update row
$('#tableWidgetTabulator').tabulator('updateData', [{
anrechnungszeitraum_id: anrechnungszeitraum_id,
studiensemester_kurzbz: studiensemester_kurzbz,
anrechnungstart: anrechnungstart,
anrechnungende: anrechnungende
}]);
// Close Modal
$('#azrModal').modal('hide');
// Success message
FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "gespeichert"));
}
},
errorCallback: function (jqXHR, textStatus, errorThrown)
{
FHC_DialogLib.alertError(FHC_PhrasesLib.t("ui", "systemfehler"));
}
}
);
},
deleteAzr: function(anrechnungszeitraum_id){
FHC_AjaxClient.ajaxCallPost(
FHC_JS_DATA_STORAGE_OBJECT.called_path + "/delete",
{
anrechnungszeitraum_id: anrechnungszeitraum_id
},
{
successCallback: function (data, textStatus, jqXHR)
{
if (FHC_AjaxClient.isError(data))
{
FHC_DialogLib.alertWarning(FHC_AjaxClient.getError(data));
}
if (FHC_AjaxClient.hasData(data))
{
let row = $('#tableWidgetTabulator').tabulator('getRow', anrechnungszeitraum_id);
row.delete(anrechnungszeitraum_id);
// Success message
FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "geloescht"));
}
},
errorCallback: function (jqXHR, textStatus, errorThrown)
{
FHC_DialogLib.alertError(FHC_PhrasesLib.t("ui", "systemfehler"));
}
}
);
},
deleteRow: function (cell){
if(!confirm(FHC_PhrasesLib.t("ui", "frageSicherLoeschen")))
{
return;
}
// Delete Anrechnungszeitraum
adminAnrechnung.deleteAzr(cell.getRow().getData().anrechnungszeitraum_id);
}
}
@@ -141,6 +141,13 @@ $(function(){
return;
}
// Check if forgot to fulfill begruendung
if (begruendung.trim().endsWith('weil') || begruendung.endsWith('because of'))
{
FHC_DialogLib.alertInfo(FHC_PhrasesLib.t("ui", "bitteBegruendungVervollstaendigen"));
return;
}
// Get form data
let form_data = $('form').serializeArray();
@@ -194,17 +201,9 @@ $(function(){
// Get form data
let form_data = $('#form-empfehlung').serializeArray();
// Prepare data object for ajax call
let data = {
'data': [{
'anrechnung_id' : form_data[0].value
}]
};
FHC_AjaxClient.ajaxCallPost(
FHC_JS_DATA_STORAGE_OBJECT.called_path + "/requestRecommendation",
data,
{anrechnung_id: form_data[0].value},
{
successCallback: function (data, textStatus, jqXHR)
{
@@ -471,11 +470,27 @@ var approveAnrechnungDetail = {
textarea.val($.trim($('#approveAnrechnungDetail-empfehlungDetail-begruendung').text()));
return;
}
else
// Find Begruendung span
let textspan = $(elem).parent().find('span:first');
// Get Begruendung
let begruendung = textspan.text();
// Check if Begruendung has helptext
let hasHelptext = textspan.children('span #helpTxtBegruendungErgaenzen').length > 0;
if (hasHelptext)
{
// Copy begruendung into textarea
textarea.val($.trim($(elem).parent().find('span:first').text()));
let helptext = textspan.children('span #helpTxtBegruendungErgaenzen').text();
// Remove helptext
begruendung = begruendung.replace(helptext, '');
}
// Copy begruendung into textarea and set focus
textarea.val($.trim(begruendung)).focus();
},
formatEmpfehlungIsRequested: function(statusBezeichnung, empfehlungsanfrageAm, empfehlungsanfrageAn) {
$('#approveAnrechnungDetail-empfehlungDetail-empfehlungsanfrageAm').html(empfehlungsanfrageAm);
@@ -57,6 +57,12 @@ function hf_filterTrueFalse(headerValue, rowValue){
}
}
// Filters schreibberechtigt boolean values
function hf_schreibberechtigt(headerValue, rowValue){
return rowValue == headerValue.toString();
}
// Adds column details
// Sets focus on filterbutton, if table starts with stored filter.
function func_tableBuilt(table) {
@@ -173,19 +179,22 @@ function func_selectableCheck(row){
// data = selected data, rows = selected rows
function func_rowSelectionChanged(data, rows){
// Sum up over all anzurechnenden LV-ECTS by Prestudent
selectedPrestudentWithAccumulatedLvEcts = approveAnrechnung.getSumLvEctsByPreStudent(data);
if (tabulator != null)
{
// Sum up over all anzurechnenden LV-ECTS by Prestudent
selectedPrestudentWithAccumulatedLvEcts = approveAnrechnung.getSumLvEctsByPreStudent(data);
// Loop through all active rows
var rowManager = tabulator.rowManager;
for (var i = 0; i < rowManager.activeRows.length; i++) {
// Loop through all active rows
var rowManager = tabulator.rowManager;
for (var i = 0; i < rowManager.activeRows.length; i++) {
// Reinitialize row -> triggers formatters.
rowManager.activeRows[i].reinitialize();
// Reinitialize row -> triggers formatters.
rowManager.activeRows[i].reinitialize();
}
// Show number of selected rows.
approveAnrechnung.showNumberSelectedRows(rows);
}
// Show number of selected rows.
approveAnrechnung.showNumberSelectedRows(rows);
}
// Returns tooltip
@@ -570,12 +579,8 @@ $(function(){
}
}
selected_data.map(function(data){
// reduce to necessary fields
return {
'anrechnung_id' : data.anrechnung_id,
}
});
// Reduce to necessary fields
selected_data = selected_data.map(data => ({'anrechnung_id' : data.anrechnung_id}));
// Alert and exit if no anrechnung is selected
if (selected_data.length == 0)
@@ -584,14 +589,9 @@ $(function(){
return;
}
// Prepare data object for ajax call
let data = {
'data': selected_data
};
FHC_AjaxClient.ajaxCallPost(
FHC_JS_DATA_STORAGE_OBJECT.called_path + "/requestRecommendation",
data,
{data: selected_data},
{
successCallback: function (data, textStatus, jqXHR)
{
@@ -617,14 +617,14 @@ $(function(){
// Print success message
FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "empfehlungWurdeAngefordert"));
}
//Update status 'genehmigt'
$('#tableWidgetTabulator').tabulator('updateData', data);
// Deselect rows
var indexesToDeselect = data.map(x => x.anrechnung_id);
$("#tableWidgetTabulator").tabulator('deselectRow', indexesToDeselect);
}
//Update status 'genehmigt'
$('#tableWidgetTabulator').tabulator('updateData', data);
// Deselect rows
var indexesToDeselect = data.map(x => x.anrechnung_id);
$("#tableWidgetTabulator").tabulator('deselectRow', indexesToDeselect);
},
errorCallback: function (jqXHR, textStatus, errorThrown)
{
@@ -701,8 +701,8 @@ var approveAnrechnung = {
// Find closest textarea
let textarea = $(elem).closest('div').find('textarea');
// Copy begruendung into textarea
textarea.val($.trim($(elem).parent().text()));
// Copy begruendung into textarea and set focus
textarea.val($.trim($(elem).parent().text())).focus();
},
focusFilterbuttonIfTableStartsWithStoredFilter(filters){
switch (filters[0].value) {
@@ -133,6 +133,13 @@ $(function(){
return;
}
// Check if forgot to fulfill begruendung
if (begruendung.trim().endsWith('weil') || begruendung.endsWith('because of'))
{
FHC_DialogLib.alertInfo(FHC_PhrasesLib.t("ui", "bitteBegruendungVervollstaendigen"));
return;
}
// Get form data
let form_data = $('form').serializeArray();
@@ -241,8 +248,26 @@ var reviewAnrechnung = {
// Find closest textarea
let textarea = $(elem).closest('div').find('textarea');
// Copy begruendung into textarea
textarea.val($.trim($(elem).parent().find('span:first').text()));
// Find Begruendung span
let textspan = $(elem).parent().find('span:first');
// Get Begruendung
let begruendung = textspan.text();
// Check if Begruendung has helptext
let hasHelptext = textspan.children('span #helpTxtBegruendungErgaenzen').length > 0;
if (hasHelptext)
{
let helptext = textspan.children('span #helpTxtBegruendungErgaenzen').text();
// Remove helptext
begruendung = begruendung.replace(helptext, '');
}
// Copy begruendung into textarea and set focus
textarea.val($.trim(begruendung)).focus();
},
formatEmpfehlungIsTrue: function(empfehlungAm, emfehlungVon, statusBezeichnung){
$('#reviewAnrechnungDetail-status_kurzbz').text(statusBezeichnung);
@@ -51,6 +51,12 @@ function hf_filterTrueFalse(headerValue, rowValue){
}
}
// Filters empfehlungsberechtigt boolean values
function hf_empfehlungsberechtigt(headerValue, rowValue){
return rowValue == headerValue.toString();
}
// Adds column details
function func_tableBuilt(table) {
table.addColumn(
@@ -74,9 +80,10 @@ function func_tableBuilt(table) {
// Formats the rows
function func_rowFormatter(row){
let status_kurzbz = row.getData().status_kurzbz;
let empfehlungsberechtigt = row.getData().empfehlungsberechtigt;
row.getCells().forEach(function(cell){
if (status_kurzbz != ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR)
if (status_kurzbz != ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR || empfehlungsberechtigt == "false")
{
row.getElement().style["background-color"] = COLOR_LIGHTGREY; // default
}
@@ -86,9 +93,10 @@ function func_rowFormatter(row){
// Formats row selectable/unselectable
function func_selectableCheck(row){
let status_kurzbz = row.getData().status_kurzbz;
let empfehlungsberechtigt = row.getData().empfehlungsberechtigt;
return (
status_kurzbz == ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR
status_kurzbz == ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR || empfehlungsberechtigt == "false"
);
}
@@ -441,7 +449,7 @@ var reviewAnrechnung = {
// Find closest textarea
let textarea = $(elem).closest('div').find('textarea');
// Copy begruendung into textarea
textarea.val($.trim($(elem).parent().text()));
// Copy begruendung into textarea and set focus
textarea.val($.trim($(elem).parent().text())).focus();
}
}
+2
View File
@@ -31,6 +31,7 @@ require_once('dbupdate_3.4/example2.php');
require_once('dbupdate_3.4/26173_index_webservicelog.php');
require_once('dbupdate_3.4/24682_reihungstest_zugangscode_fuer_login.php');
require_once('dbupdate_3.4/17512_fehlercode_constraints.php');
require_once('dbupdate_3.4/27388_anrechnungen_zeitfenster_pflegen.php');
require_once('dbupdate_3.4/19154_beurteilungsformulare_pruefungssenat.php');
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
@@ -146,6 +147,7 @@ $tabellen=array(
"lehre.tbl_anrechnungstatus" => array("status_kurzbz", "bezeichnung_mehrsprachig"),
"lehre.tbl_anrechnung_anrechnungstatus" => array("anrechnungstatus_id", "anrechnung_id", "status_kurzbz", "datum", "insertamum", "insertvon"),
"lehre.tbl_anrechnung_begruendung" => array("begruendung_id","bezeichnung"),
"lehre.tbl_anrechnungszeitraum" => array("anrechnungszeitraum_id","studiensemester_kurzbz","anrechnungstart","anrechnungende", "insertamum", "insertvon"),
"lehre.tbl_betreuerart" => array("betreuerart_kurzbz","beschreibung","aktiv"),
"lehre.tbl_ferien" => array("bezeichnung","studiengang_kz","vondatum","bisdatum"),
"lehre.tbl_lehreinheit" => array("lehreinheit_id","lehrveranstaltung_id","studiensemester_kurzbz","lehrfach_id","lehrform_kurzbz","stundenblockung","wochenrythmus","start_kw","raumtyp","raumtypalternativ","sprache","lehre","anmerkung","unr","lvnr","updateamum","updatevon","insertamum","insertvon","ext_id","lehrfach_id_old","gewicht"),
@@ -0,0 +1,57 @@
<?php
if (! defined('DB_NAME')) exit('No direct script access allowed');
if (!$result = @$db->db_query('SELECT 1 FROM lehre.tbl_anrechnungszeitraum LIMIT 1'))
{
$qry = 'CREATE TABLE lehre.tbl_anrechnungszeitraum
(
anrechnungszeitraum_id integer,
studiensemester_kurzbz varchar(16) NOT NULL,
anrechnungstart date,
anrechnungende date,
insertamum timestamp default NOW(),
insertvon varchar(32)
);
COMMENT ON TABLE lehre.tbl_anrechnungszeitraum IS \'Zeitfenster fuer Anrechnungen pro Studiensemester\';
COMMENT ON COLUMN lehre.tbl_anrechnungszeitraum.anrechnungstart IS \'Zeitfenster Startdatum\';
COMMENT ON COLUMN lehre.tbl_anrechnungszeitraum.anrechnungende IS \'Zeitfenster Enddatum\';
ALTER TABLE lehre.tbl_anrechnungszeitraum ADD CONSTRAINT pk_anrechnungszeitraum PRIMARY KEY (anrechnungszeitraum_id);
ALTER TABLE lehre.tbl_anrechnungszeitraum ADD CONSTRAINT fk_anrechnungszeitraum_studiensemester_kurzbz FOREIGN KEY (studiensemester_kurzbz) REFERENCES public.tbl_studiensemester(studiensemester_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT;
CREATE SEQUENCE lehre.seq_anrechnungszeitraum_anrechnungszeitraum_id
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;
ALTER TABLE lehre.tbl_anrechnungszeitraum ALTER COLUMN anrechnungszeitraum_id SET DEFAULT nextval(\'lehre.seq_anrechnungszeitraum_anrechnungszeitraum_id\');
GRANT SELECT, UPDATE, INSERT, DELETE ON lehre.tbl_anrechnungszeitraum TO web;
GRANT SELECT, UPDATE, INSERT, DELETE ON lehre.tbl_anrechnungszeitraum TO vilesci;
GRANT SELECT, UPDATE ON lehre.seq_anrechnungszeitraum_anrechnungszeitraum_id TO vilesci;
GRANT SELECT, UPDATE ON lehre.seq_anrechnungszeitraum_anrechnungszeitraum_id TO web;
';
if(!$db->db_query($qry))
echo '<strong>lehre.tbl_anrechnungszeitraum: '.$db->db_last_error().'</strong><br>';
else
echo ' lehre.tbl_anrechnungszeitraum: Tabelle hinzugefuegt<br>';
}
// Add permission to admin Anrechnungen
if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'lehre/anrechnungszeitfenster';"))
{
if($db->db_num_rows($result) == 0)
{
$qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('lehre/anrechnungszeitfenster', 'Anrechnungszeitfenster anlegen');";
if(!$db->db_query($qry))
echo '<strong>system.tbl_berechtigung '.$db->db_last_error().'</strong><br>';
else
echo ' system.tbl_berechtigung: Added permission for lehre/anrechnungszeitfenster<br>';
}
}
+344 -4
View File
@@ -11529,6 +11529,86 @@ Any unusual occurrences
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'empfehlungNegativKenntnisseNichtGleichwertigWeil',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Die anzurechnenden Kenntnisse sind umfangmäßig und/oder inhaltlich nicht gleichwertig, weil<span id="helpTxtBegruendungErgaenzen">...[Erläuterung: Bitte Begründung ergänzen.]</span>',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'The equivalence in terms of learning objectives and the length of the course can not be determined because of<span id="helpTxtBegruendungErgaenzen">...[Explanation: Please add reason.]</span>',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'empfehlungNegativKenntnisseNichtGleichwertigWeilHinweis',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Die anzurechnenden Kenntnisse sind umfangmäßig und/oder inhaltlich nicht gleichwertig, weil... <span class="text-danger"><b>Bei einer Ablehnung ist eine individuelle Begründung erforderlich. Dies kann nur über die Detailseite erfolgen.</b></span>',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'The equivalence in terms of learning objectives and the length of the course can not be determined because of... <span class="text-danger"><b>If the application is rejected, an individual reason is required. This can only be done from the detail page.</b></span>',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'genehmigungNegativKenntnisseNichtGleichwertigWeil',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Die anzurechnenden Kenntnisse sind umfangmäßig und/oder inhaltlich nicht gleichwertig, weil<span id="helpTxtBegruendungErgaenzen">...[Erläuterung: Bitte ergänzen oder Empfehlungstext des Lektors übernehmen und ggf. redigieren.]</span>',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'The equivalence in terms of learning objectives and the length of the course can not be determined because of<span id="helpTxtBegruendungErgaenzen">...[Explanation: Please complete or adopt the text of the lectors recommendation and edit it if necessary]</span>',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'genehmigungNegativKenntnisseNichtGleichwertigWeilHinweis',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Die anzurechnenden Kenntnisse sind umfangmäßig und/oder inhaltlich nicht gleichwertig, weil... <span class="text-danger"><b>Bei einer Ablehnung ist eine individuelle Begründung erforderlich. Dies kann nur über die Detailseite erfolgen.</b></span>',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'The equivalence in terms of learning objectives and the length of the course can not be determined because of... <span class="text-danger"><b>If the application is rejected, an individual reason is required. This can only be done from the detail page.</b></span>',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
@@ -11589,6 +11669,26 @@ Any unusual occurrences
)
)
),
array(
'app' => 'core',
'category' => 'ui',
'phrase' => 'bitteBegruendungVervollstaendigen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Bitte vervollständigen Sie die Begründung.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Please complete the reason.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
@@ -11617,13 +11717,13 @@ Any unusual occurrences
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Andere Begr&uuml;ndung. Bitte im Notizfeld kurz angeben.',
'text' => 'Andere Begründung. Bitte im Notizfeld angeben.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Other reasons. Please briefly state the reasons in the field for comments.',
'text' => 'Other reasons. Please state the reasons in the field for comments.',
'description' => '',
'insertvon' => 'system'
)
@@ -12129,6 +12229,206 @@ Any unusual occurrences
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'anrechnungenVerwalten',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Anrechnungen verwalten',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Administration of applications.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'anrechnungszeitraumFestlegen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Anrechnungszeitraum festlegen',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Set appplication period',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'anrechnungszeitraumHinzufuegen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Anrechnungszeitraum hinzufügen',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Add appplication period',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'anrechnungszeitraumSpeichern',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Anrechnungszeitraum speichern',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Save application period',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'anrechnungszeitraumStart',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Anrechnungszeitraum Start',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Startdate application',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'anrechnungszeitraumEnde',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Anrechnungszeitraum Ende',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Enddate application',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ui',
'phrase' => 'errorStartdatumNichtInStudiensemester',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Das Startdatum liegt außerhalb des gewählten Studiensemesters.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'The startdate is not within the selected study semester.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ui',
'phrase' => 'errorEndedatumNichtInStudiensemester',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Das Endedatum liegt außerhalb des gewählten Studiensemesters.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'The enddate is not within the selected study semester.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ui',
'phrase' => 'errorStartdatumNachEndedatum',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Das Startdatum muss VOR dem Endedatum liegen.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'The startdate must be BEFORE the enddate.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ui',
'phrase' => 'frageSicherLoeschen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => "Sicher löschen?",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => "Definitely delete?",
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ui',
@@ -13145,6 +13445,46 @@ array(
)
)
),
array(
'app' => 'core',
'category' => 'ui',
'phrase' => 'bearbeitetVon',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => "bearbeitet von",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => "edited by",
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ui',
'phrase' => 'bearbeitetAm',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => "bearbeitet am",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => "edited on",
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'global',
@@ -13193,13 +13533,13 @@ array(
'phrases' => array(
array(
'sprache' => 'German',
'text' => "Empfehlungstext des Lektors als Begr&uuml;ndung &uuml;bernehmen.",
'text' => "Empfehlungstext des Lektors als Begründung übernehmen und ggf. redigieren.",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => "Copy the lectors recommendation text as reason for the rejection.",
'text' => "Copy the lectors recommendation text as reason for the rejection and edit if necessary",
'description' => '',
'insertvon' => 'system'
)