Compare commits

...
Author SHA1 Message Date
Johann Hoffmann aeb6b0c907 fix AnrechnungJob.php person_id ambiguity; also checked some possible prestudent/student ambiguity in AnrechnungLib.php even if that would be rare; fixed a faulty transaction abort from return error to return false; 2026-10-07 09:58:26 +02:00
Johann Hoffmann a87266c325 icon fixes in request anrechnung; block request dispaly reason when lv is not in studienplan of logged in users prestudent history; added mehrsprachigkeit to anrechnung begruendung options in db; more phrasen; 2026-10-05 17:04:22 +02:00
Johann Hoffmann 663430b462 fix anrechnung email job select to always send to correct stgl; new helper methods isBerechtigtForAnrechnung & isBerechtigtForPrestudent for approval/reject & request mechanism; more phrasen; move berechtigungsprüfungen from view redundantly into controller to MAYBE have it replaced by a vuejs page in the future; 2026-10-05 15:19:29 +02:00
Johann Hoffmann 352d7b10d7 try to force using phrasen system throughout the whole Anrechnungen - WIP; fixed fontawesome bug by upgrading to v6; fixed tabulator persistence across multiple pages definitions, Filter.js and TableWidget.js by switching from columns: true to columns: ["width", "visible"], since they otherwhise might not get persisted; WIP working out the implications/solutions for multiaccount students applying for anrechnungen to an lv from a different study program of theirs; 2026-10-02 17:34:20 +02:00
Andreas Österreicher 36064afbba Fixed Testing Projektarbeit Seeds 2026-10-01 15:33:05 +02:00
Harald Bamberger f3d031ab16 cismenu: add cis-main-menu class to main nav, add li elements to ul, style cis-main-menu ul and li to prevent interferec with cms content styles, add draggable false to cis menu entries to improve menu scrolling especially on mobile devices 2026-10-01 11:48:51 +02:00
Harald Bamberger 3d8c4fa4d0 Merge branch 'feature-77757/WidgetsBerechtigung' 2026-09-30 15:48:00 +02:00
Harald Bamberger 272014bd78 remove odd phrases 2026-09-30 15:38:43 +02:00
Harald Bamberger 76a8e00edf Merge branch 'master' into feature-77757/WidgetsBerechtigung 2026-09-30 15:23:08 +02:00
Harald Bamberger ce62713790 Merge branch 'bug-82297/ausweis-date-preview-issue' 2026-09-30 12:11:13 +02:00
Harald Bamberger 34761db664 rename phrase 2026-09-30 10:56:30 +02:00
Harald Bamberger c7131ed775 revert changes to old cis since issue does not occur there 2026-09-30 10:53:01 +02:00
Harald Bamberger b57e1984a8 Merge branch 'master' into bug-82297/ausweis-date-preview-issue 2026-09-30 10:20:28 +02:00
Harald Bamberger acedc11be8 adapt styling detailheader employees 2026-09-24 14:39:38 +02:00
Harald Bamberger 15c1da74a2 CisMenu: do not overwrite calculated url if menuitem is multiple times in menu tree 2026-09-23 16:09:42 +02:00
Harald Bamberger d33b45d7cb Merge branch 'bhdev_backport_compat' 2026-09-23 14:58:26 +02:00
Andreas Österreicher b3b6d847a7 Merge branch 'feature-62260/international_skills_groupheader_filter' 2026-09-23 14:36:13 +02:00
Andreas Österreicher 80365de28c Merge branch 'feature-62602/mehrfachnennungen_innerhalb_einer_kategorie' 2026-09-23 14:35:36 +02:00
Andreas Österreicher 2d74522a4f Merge branch 'feature-54225/reihungstest_ablauf_fuer_quereinsteiger' 2026-09-23 12:28:35 +02:00
ma0048 d00aef66e1 master gemerged 2026-09-23 11:32:01 +02:00
ma0048 241eec3ef2 Merge remote-tracking branch 'origin/master' into feature-54225/reihungstest_ablauf_fuer_quereinsteiger
# Conflicts:
#	cis/testtool/menu.php
#	system/dbupdate_3.4.php
2026-09-23 11:29:43 +02:00
Harald Bamberger 8b44e4475b Merge branch 'master' of github.com:FH-Complete/FHC-Core into bhdev_backport_compat 2026-09-22 16:51:34 +02:00
Harald Bamberger d251987850 backport compat controller and component 2026-09-22 16:50:56 +02:00
ma0048 224cef7fad bug beim Loeschen von Antworten eines Prueflings in reihungstet_administration.php fixed 2026-09-17 13:29:58 +02:00
Ivymaster 5fff45e302 Added check for date existence 2026-08-27 11:00:43 +02:00
Johann Hoffmann d40040efd8 added new fkey to tbl_widget for system.tbl_berechtigung; check for permission status during load & in widget picker; if widget was already picked/configured but not permitted anymore -> show a generalized "missing permission" screen via fallback component during widget init; 2026-07-21 18:14:26 +02:00
Andreas Österreicher 9629345473 Merge branch 'master' into feature-62260/international_skills_groupheader_filter 2026-07-08 15:28:23 +02:00
Andreas Österreicher 4d72b0047a Merge branch 'master' into feature-62602/mehrfachnennungen_innerhalb_einer_kategorie 2026-07-08 15:26:41 +02:00
ma0048 c664c14afc phrase hinzugefuegt 2025-12-18 11:10:08 +01:00
ma0048 9183c4f04c massnahme einmalig flag hinzugefuegt 2025-10-01 12:03:18 +02:00
ma0048 6495f741b9 added missing phrase 2025-07-09 14:02:41 +02:00
ma0048 d3210f0d3d - foreign keys hinzugefuegt
- beim zuruecksetzen der gebiete, wird auch tbl_pruefling_gebiet zurueckgesetzt
2025-02-18 13:51:20 +01:00
ma0048 a0dce925d4 - rt holt sich zusätzlich alle gebiete aus den semestern davor 2025-01-14 10:56:28 +01:00
62 changed files with 1703 additions and 306 deletions
+44
View File
@@ -0,0 +1,44 @@
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
class Compat extends Auth_Controller
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct([
'ci' => ['basis/cis:r'],
'legacy' => ['basis/cis:r'],
]);
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* @access public
* @return void
*/
public function ci()
{
$this->load->view('CisRouterView/CisRouterView.php',['route' => 'Compat']);
}
/**
* @access public
* @return void
*/
public function legacy()
{
$this->load->view('CisRouterView/CisRouterView.php',['route' => 'Compat']);
}
}
@@ -67,8 +67,11 @@ class CisMenu extends FHCAPI_Controller
private function generateUrlForMenuItem($menuItem)
{
$menuItem->url = $this->menuItemUrlHelper($menuItem);
unset($menuItem->content);
if(!isset($menuItem->url))
{
$menuItem->url = $this->menuItemUrlHelper($menuItem);
unset($menuItem->content);
}
if ($menuItem->childs && count($menuItem->childs)) {
$menuItem->childs = $this->generateUrlsForMenuItems($menuItem->childs);
@@ -83,7 +86,7 @@ class CisMenu extends FHCAPI_Controller
return site_url("/CisVue/Cms/content/" . $menuItem->content_id);
}
if (!$menuItem->content || !mb_strlen($menuItem->content)) {
if (!isset($menuItem->content) || !$menuItem->content || !mb_strlen($menuItem->content)) {
return '';
}
@@ -101,6 +101,9 @@ class Widget extends FHCAPI_Controller
$tmpsetup = json_decode($widget->setup);
$tmpsetup->file = absoluteJsImportUrl($tmpsetup->file);
$widget->setup = $tmpsetup;
$widget->permitted = empty($widget->berechtigung_kurzbz)
|| $this->permissionlib->isBerechtigt($widget->berechtigung_kurzbz);
return $widget;
}, $widgets);
@@ -21,7 +21,7 @@ class NotizAnrechnung extends Notiz_Controller
// Load language phrases
$this->loadPhrases([
'ui'
'ui', 'lehre'
]);
}
@@ -25,7 +25,7 @@ class Anrechnungen extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
'ui', 'lehre'
'ui', 'lehre', 'anrechnung'
]);
// Load models
@@ -45,6 +45,12 @@ class Anrechnungen extends FHCAPI_Controller
{
$this->load->model('education/Anrechnungbegruendung_model', 'AnrechnungbegrueundungsModel');
// Begruendung in the users language, German name if no translation exists
$language_index = getUserLanguage() == 'German' ? 1 : 2;
$this->AnrechnungbegrueundungsModel->addSelect(
'begruendung_id, COALESCE(bezeichnung_mehrsprachig[' . $language_index . '], bezeichnung) AS bezeichnung',
false
);
$result = $this->AnrechnungbegrueundungsModel->load();
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
@@ -118,22 +124,22 @@ class Anrechnungen extends FHCAPI_Controller
: null;
$this->form_validation->set_rules('lehrveranstaltung_id', 'Lehrveranstaltung_id', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung'])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehrveranstaltung')])
]);
$this->form_validation->set_rules('begruendung', 'Begruendung', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Begruendung'])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('anrechnung', 'begruendung')])
]);
if($_POST['begruendung'] == 2)
{
$this->form_validation->set_rules('lehrveranstaltung_id_kompatibel', 'Lehrveranstaltung_id', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung Kompatibel'])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('anrechnung', 'lehrveranstaltung_bez_kompatibel')])
]);
}
$this->form_validation->set_rules('genehmigtVon', 'GenehmigtVon', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'GenehmigtVon'])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('anrechnung', 'genehmigtVon')])
]);
if ($this->form_validation->run() == false)
@@ -190,22 +196,22 @@ class Anrechnungen extends FHCAPI_Controller
$_POST['genehmigtVon'] = (isset($formData['genehmigt_von']) && !empty($formData['genehmigt_von'])) ? $formData['genehmigt_von'] : null;
$this->form_validation->set_rules('lehrveranstaltung_id', 'Lehrveranstaltung_id', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung'])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehrveranstaltung')])
]);
$this->form_validation->set_rules('begruendung', 'Begruendung', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Begruendung'])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('anrechnung', 'begruendung')])
]);
if($_POST['begruendung'] == 2)
{
$this->form_validation->set_rules('lehrveranstaltung_id_kompatibel', 'Lehrveranstaltung_id', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung Kompatibel'])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('anrechnung', 'lehrveranstaltung_bez_kompatibel')])
]);
}
$this->form_validation->set_rules('genehmigtVon', 'GenehmigtVon', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'GenehmigtVon'])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('anrechnung', 'genehmigtVon')])
]);
if ($this->form_validation->run() == false)
@@ -168,12 +168,15 @@ class AnrechnungJob extends JOB_Controller
// 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');
// Studiengang of the prestudent, not of the LV (same source as the permission checks)
$this->AnrechnungModel->addSelect('anrechnung_id, studiensemester_kurzbz, prestudent.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');
// After tbl_person: tbl_prestudent also has person_id, that would make USING (person_id) ambiguous
$this->AnrechnungModel->addJoin('public.tbl_prestudent prestudent', 'ON (prestudent.prestudent_id = student.prestudent_id)');
$this->AnrechnungModel->addOrder('prestudent.studiengang_kz, lv.bezeichnung');
$result = $this->AnrechnungModel->loadWhere(
'(lehre.tbl_anrechnung.insertamum)::date = (NOW() - INTERVAL \'24 HOURS\')::DATE
@@ -128,7 +128,7 @@ class approveAnrechnungDetail extends Auth_Controller
// Validate data
if (isEmptyArray($data))
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
return $this->outputJsonError($this->p->t('anrechnung', 'fehlerDatenuebertragung'));
}
// Get STGLs person data
@@ -159,7 +159,7 @@ class approveAnrechnungDetail extends Auth_Controller
}
else
{
return $this->outputJsonError('Es wurden keine Anrechnungen genehmigt.');
return $this->outputJsonError($this->p->t('anrechnung', 'keineAnrechnungenGenehmigt'));
}
}
@@ -173,7 +173,7 @@ class approveAnrechnungDetail extends Auth_Controller
// Validate data
if (isEmptyArray($data))
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
return $this->outputJsonError($this->p->t('anrechnung', 'fehlerDatenuebertragung'));
}
// Get STGLs person data
@@ -217,7 +217,7 @@ class approveAnrechnungDetail extends Auth_Controller
if(isEmptyString($anrechnung_id))
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
return $this->outputJsonError($this->p->t('anrechnung', 'fehlerDatenuebertragung'));
}
$retval = array();
@@ -225,7 +225,7 @@ class approveAnrechnungDetail extends Auth_Controller
// Check if Anrechnungs-LV has lector
if (!$this->anrechnunglib->LVhasLector($anrechnung_id))
{
$this->terminateWithJsonError('LV has no lector');
$this->terminateWithJsonError($this->p->t('anrechnung', 'lvHatKeineLektoren'));
}
// Get Fachbereichsleitung or LV Leitung.
@@ -258,13 +258,13 @@ class approveAnrechnungDetail extends Auth_Controller
if ($empfehlungsanfrage_an == '')
{
$this->terminateWithJsonError(
"Empfehlung wurde nicht angefordert,\nDer LV sind keine LektorInnen zugeteilt."
$this->p->t('anrechnung', 'empfehlungNichtAngefordert') . "\n" . $this->p->t('anrechnung', 'lvHatKeineLektoren')
);
}
if (isEmptyArray($retval))
{
$this->terminateWithJsonError("Empfehlung wurde nicht angefordert");
$this->terminateWithJsonError($this->p->t('anrechnung', 'empfehlungNichtAngefordert'));
}
else
{
@@ -285,6 +285,12 @@ class approveAnrechnungDetail extends Auth_Controller
$this->terminateWithJsonError($this->p->t('ui', 'errorFelderFehlen'));
}
// Exit if user has no write permission for the Studiengang of the Anrechnung
if (!$this->anrechnunglib->isBerechtigtForAnrechnung(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid', $anrechnung_id))
{
$this->terminateWithJsonError($this->p->t('ui', 'keineBerechtigung'));
}
// Delete last status approved / rejected.
// If last status is 'approved', Genehmigung is resetted.
$result = $this->AnrechnungModel->withdrawApprovement($anrechnung_id);
@@ -313,6 +319,12 @@ class approveAnrechnungDetail extends Auth_Controller
show_error('Wrong parameter.');
}
// Exit if user has no write permission for the Studiengang of the Anrechnung
if (!$this->anrechnunglib->isBerechtigtForAnrechnung(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid', $anrechnung_id))
{
return $this->outputJsonError($this->p->t('ui', 'keineBerechtigung'));
}
// Get boolean empfehlung of given Anrechnung
if (!$result = getData($this->AnrechnungModel->load($anrechnung_id))[0])
{
@@ -333,7 +345,7 @@ class approveAnrechnungDetail extends Auth_Controller
// Return if Anrechnung was not waiting for recommendation or if Anrechnung has already been recommended
if ($last_status != self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR || !is_null($empfehlung))
{
return $this->outputJsonError('No recommendation to withdraw.');
return $this->outputJsonError($this->p->t('anrechnung', 'keineEmpfehlungZumZuruecknehmen'));
}
// Reset status to 'inProgressDP'
@@ -341,7 +353,7 @@ class approveAnrechnungDetail extends Auth_Controller
if (isError($result))
{
return $this->outputJsonError('Could not withdraw this application.');
return $this->outputJsonError($this->p->t('anrechnung', 'antragNichtZurueckgenommen'));
}
// Success output to AJAX
@@ -359,7 +371,20 @@ class approveAnrechnungDetail extends Auth_Controller
// Validate data
if (isEmptyString($anrechnung_id))
{
$this->terminateWithJsonError($this->p->t('ui', 'systemFehler'));
$this->terminateWithJsonError($this->p->t('ui', 'systemfehler'));
}
// Exit if user has no write permission for the Studiengang of the Anrechnung
if (!$this->anrechnunglib->isBerechtigtForAnrechnung(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid', $anrechnung_id))
{
$this->terminateWithJsonError($this->p->t('ui', 'keineBerechtigung'));
}
// Exit if the posted Notiz is not an Empfehlungsnotiz of this Anrechnung
$result = $this->NotizModel->getNotizByAnrechnung($anrechnung_id, self::ANRECHNUNG_NOTIZTITEL_EMPFEHLUNGSNOTIZ_BY_STGL);
if (!isEmptyString($notiz_id) && !in_array($notiz_id, array_column(hasData($result) ? getData($result) : array(), 'notiz_id')))
{
$this->terminateWithJsonError($this->p->t('ui', 'keineBerechtigung'));
}
// Save Empfehlungstext
@@ -423,14 +448,8 @@ class approveAnrechnungDetail extends Auth_Controller
show_error('Failed loading Anrechnung');
}
$result = $this->LehrveranstaltungModel->loadWhere(array(
'lehrveranstaltung_id' => getData($result)[0]->lehrveranstaltung_id
));
$studiengang_kz = getData($result)[0]->studiengang_kz;
// Check if user is entitled
if (!$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's', $studiengang_kz))
// Check if user is entitled for the Studiengang of the Anrechnung
if (!$this->anrechnunglib->isBerechtigtForAnrechnung(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's', $anrechnung_id))
{
show_error('You are not entitled to read this page');
}
@@ -449,14 +468,8 @@ class approveAnrechnungDetail extends Auth_Controller
show_error('Failed retrieving Anrechnung');
}
$result = $this->LehrveranstaltungModel->loadWhere(array(
'lehrveranstaltung_id' => $result->lehrveranstaltung_id
));
$studiengang_kz = getData($result)[0]->studiengang_kz;
// Check if user is entitled
if (!$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's', $studiengang_kz))
// Check if user is entitled for the Studiengang of the Anrechnung
if (!$this->anrechnunglib->isBerechtigtForAnrechnung(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's', $result->anrechnung_id))
{
show_error('You are not entitled to read this document');
}
@@ -123,7 +123,7 @@ class approveAnrechnungUebersicht extends Auth_Controller
// Validate data
if (isEmptyArray($data))
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
return $this->outputJsonError($this->p->t('anrechnung', 'fehlerDatenuebertragung'));
}
$json = array(
@@ -154,7 +154,7 @@ class approveAnrechnungUebersicht extends Auth_Controller
}
else
{
return $this->outputJsonError('Es wurden keine Anrechnungen genehmigt.');
return $this->outputJsonError($this->p->t('anrechnung', 'keineAnrechnungenGenehmigt'));
}
}
@@ -168,7 +168,7 @@ class approveAnrechnungUebersicht extends Auth_Controller
// Validate data
if (isEmptyArray($data))
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
return $this->outputJsonError($this->p->t('anrechnung', 'fehlerDatenuebertragung'));
}
// Reject Anrechnung
@@ -191,7 +191,7 @@ class approveAnrechnungUebersicht extends Auth_Controller
}
else
{
return $this->outputJsonError('Es wurden keine Anrechnungen genehmigt.');
return $this->outputJsonError($this->p->t('anrechnung', 'keineAnrechnungenAbgelehnt'));
}
}
@@ -204,7 +204,7 @@ class approveAnrechnungUebersicht extends Auth_Controller
if(isEmptyArray($data))
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
return $this->outputJsonError($this->p->t('anrechnung', 'fehlerDatenuebertragung'));
}
$retval = array();
@@ -254,10 +254,10 @@ class approveAnrechnungUebersicht extends Auth_Controller
{
if ($counter > 0)
{
$this->terminateWithJsonError('Bei '. $counter.' LV sind keine LektorInnen zugeteilt.');
$this->terminateWithJsonError($this->p->t('anrechnung', 'lvsOhneLektoren', array($counter)));
}
$this->terminateWithJsonError('Es wurden keine Empfehlungen angefordert');
$this->terminateWithJsonError($this->p->t('anrechnung', 'keineEmpfehlungenAngefordert'));
}
$this->outputJsonSuccess($retval);
@@ -312,19 +312,8 @@ class approveAnrechnungUebersicht extends Auth_Controller
show_error('Failed retrieving Anrechnung');
}
$result = $this->LehrveranstaltungModel->loadWhere(array(
'lehrveranstaltung_id' => $result->lehrveranstaltung_id
));
if(!$result = getData($result)[0])
{
show_error('Failed loading Lehrveranstaltung');
}
$studiengang_kz = $result->studiengang_kz;
// Check if user is entitled
if (!$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's', $studiengang_kz))
// Check if user is entitled for the Studiengang of the Anrechnung
if (!$this->anrechnunglib->isBerechtigtForAnrechnung(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's', $result->anrechnung_id))
{
show_error('You are not entitled to read this document');
}
@@ -76,6 +76,13 @@ class CreateAnrechnung extends Auth_Controller
// Get Anrechnungsbegruendungen
$this->load->model('education/Anrechnungbegruendung_model', 'AnrechnungbegruendungModel');
// Begruendung in the users language, German name if no translation exists
$language_index = getUserLanguage() == 'German' ? 1 : 2;
$this->AnrechnungbegruendungModel->addSelect(
'begruendung_id, COALESCE(bezeichnung_mehrsprachig[' . $language_index . '], bezeichnung) AS bezeichnung',
false
);
$begruendung_arr = getData($this->AnrechnungbegruendungModel->load());
$viewData = array(
@@ -94,6 +101,12 @@ class CreateAnrechnung extends Auth_Controller
{
$prestudent_id = $this->input->post('prestudent_id');
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
// Exit if user has no permission for the Studiengang of the student
if (!$this->anrechnunglib->isBerechtigtForPrestudent(self::BERECHTIGUNG_ANRECHNUNG_ANLEGEN, 's', $prestudent_id))
{
$this->terminateWithJsonError($this->p->t('ui', 'keineBerechtigung'));
}
// Get Student UID
$student_uid = $this->StudentModel->getUID($prestudent_id);
@@ -136,6 +149,19 @@ class CreateAnrechnung extends Auth_Controller
{
$this->terminateWithJsonError($this->p->t('ui', 'errorFelderFehlen'));
}
// Exit if user has no write permission for the Studiengang of the student
if (!$this->anrechnunglib->isBerechtigtForPrestudent(self::BERECHTIGUNG_ANRECHNUNG_ANLEGEN, 'suid', $prestudent_id))
{
$this->terminateWithJsonError($this->p->t('ui', 'keineBerechtigung'));
}
// Exit if the Lehrveranstaltung is not one of the LVs the form offers for this student
$result = $this->LehrveranstaltungModel->getLvsByStudent($this->StudentModel->getUID($prestudent_id), $studiensemester_kurzbz);
if (!in_array($lehrveranstaltung_id, array_column(hasData($result) ? getData($result) : array(), 'lehrveranstaltung_id')))
{
$this->terminateWithJsonError($this->p->t('anrechnung', 'lvNichtZugeteilt'));
}
// Exit if application already exists
if (self::_applicationExists($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id))
@@ -88,6 +88,10 @@ class requestAnrechnung extends Auth_Controller
// Get Anrechung data
$anrechnungData = $this->anrechnunglib->getAnrechnungDataByLv($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id);
// Check if a new Antrag is for a Lehrveranstaltung outside the Studienplan (e.g. LV of a parallel study)
$is_not_in_studienplan = !is_numeric($anrechnungData->anrechnung_id)
&& !hasData($this->LehrveranstaltungModel->getLvInStudienplan($prestudent_id, $lehrveranstaltung_id));
// Get Antrag data
$antragData = $this->anrechnunglib->getAntragData($prestudent_id, $studiensemester_kurzbz, $lehrveranstaltung_id, $anrechnungData->anrechnung_id);
@@ -95,7 +99,8 @@ class requestAnrechnung extends Auth_Controller
'antragData' => $antragData,
'anrechnungData' => $anrechnungData,
'is_expired' => $is_expired,
'is_blocked' => $is_blocked
'is_blocked' => $is_blocked,
'is_not_in_studienplan' => $is_not_in_studienplan
);
$this->load->view('lehre/anrechnung/requestAnrechnung.php', $viewData);
@@ -154,7 +159,7 @@ class requestAnrechnung extends Auth_Controller
// Exit if application already exists
if (self::_applicationExists($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id))
{
return $this->outputJsonError($this->p->t('anrechnung', 'antragBereitsGestellt'));
return $this->outputJsonError($this->p->t('global', 'antragBereitsGestellt'));
}
// Exit if application is a past ( < actual ) studysemester
@@ -162,6 +167,30 @@ class requestAnrechnung extends Auth_Controller
{
return $this->outputJsonError($this->p->t('anrechnung', 'antragNichtFuerVerganganeSS'));
}
// Exit if student is not assigned to the Lehrveranstaltung
if (!hasData($this->LehrveranstaltungModel->getLvByStudent($this->_uid, $studiensemester_kurzbz, $lehrveranstaltung_id)))
{
return $this->outputJsonError($this->p->t('anrechnung', 'lvNichtZugeteilt'));
}
// Exit if Lehrveranstaltung is not in the Studienplan of the student (e.g. LV of a parallel study)
if (!hasData($this->LehrveranstaltungModel->getLvInStudienplan($prestudent_id, $lehrveranstaltung_id)))
{
return $this->outputJsonError($this->p->t('anrechnung', 'lvNichtImStudienplan'));
}
// Exit if application deadline is expired
if ($this->_isExpired($studiensemester_kurzbz))
{
return $this->outputJsonError($this->p->t('anrechnung', 'deadlineUeberschritten'));
}
// Exit if Lehrveranstaltung was already graded with application blocking grades
if (self::_LVhasBlockingGrades($studiensemester_kurzbz, $lehrveranstaltung_id))
{
return $this->outputJsonError($this->p->t('anrechnung', 'antragBenotungBlockiert'));
}
// Upload document
$result = self::_uploadFile();
@@ -116,7 +116,7 @@ class reviewAnrechnungDetail extends Auth_Controller
if(isEmptyArray($data))
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
return $this->outputJsonError($this->p->t('anrechnung', 'fehlerDatenuebertragung'));
}
// Get lectors person data
@@ -173,7 +173,7 @@ class reviewAnrechnungDetail extends Auth_Controller
if(isEmptyArray($data))
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
return $this->outputJsonError($this->p->t('anrechnung', 'fehlerDatenuebertragung'));
}
// Get lectors person data
@@ -91,7 +91,7 @@ class reviewAnrechnungUebersicht extends Auth_Controller
if(isEmptyArray($data))
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
return $this->outputJsonError($this->p->t('anrechnung', 'fehlerDatenuebertragung'));
}
foreach ($data as $item)
@@ -140,7 +140,7 @@ class reviewAnrechnungUebersicht extends Auth_Controller
if(isEmptyArray($data))
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
return $this->outputJsonError($this->p->t('anrechnung', 'fehlerDatenuebertragung'));
}
foreach ($data as $item)
+126 -16
View File
@@ -14,6 +14,8 @@ class AnrechnungLib
const ANRECHNUNG_NOTIZTITEL_NOTIZ_BY_STGL = 'AnrechnungNotizSTGL';
const ANRECHNUNG_NOTIZTITEL_EMPFEHLUNGSNOTIZ_BY_STGL = 'AnrechnungEmpfehlungsnotizSTGL';
const BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN = 'lehre/anrechnung_genehmigen';
public function __construct()
{
$this->ci =& get_instance();
@@ -57,7 +59,7 @@ class AnrechnungLib
// 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.');
show_error($this->ci->p->t('anrechnung', 'lvNichtZugeteilt'));
}
}
@@ -73,8 +75,14 @@ class AnrechnungLib
show_error(getError($student));
}
// Studiengang of the prestudent, not of the LV (same source as the permission checks)
if (!$prestudent = getData($this->ci->PrestudentModel->load($prestudent_id))[0])
{
show_error('Failed loading prestudent data.');
}
// Get studiengang bezeichnung
if (!$studiengang = getData($this->ci->StudiengangModel->load($lv->studiengang_kz))[0])
if (!$studiengang = getData($this->ci->StudiengangModel->load($prestudent->studiengang_kz))[0])
{
show_error('Failed loading studiengang data.');
}
@@ -93,15 +101,20 @@ class AnrechnungLib
$latest_zgv_bezeichnung = hasData($result) ? getData($result)[0]->bezeichnung : '';
// Get Sum of berufliche and schulische ECTS
$result = $this->ci->LehrveranstaltungModel->getEctsSumSchulisch($uid, $prestudent_id, $lv->studiengang_kz);
$result = $this->ci->LehrveranstaltungModel->getEctsSumSchulisch($uid, $prestudent_id, $prestudent->studiengang_kz);
$sumEctsSchulisch = getData($result)[0]->ectssumschulisch;
$result = $this->ci->LehrveranstaltungModel->getEctsSumBeruflich($uid);
$sumEctsBeruflich = getData($result)[0]->ectssumberuflich;
// English names only if the LV or Studiengang has one
$english = getUserLanguage() != 'German';
// Set the given studiensemester
$antrag_data->lv_id = $lv_id;
$antrag_data->lv_bezeichnung = $lv->bezeichnung;
$antrag_data->lv_bezeichnung = $english && !isEmptyString($lv->bezeichnung_english)
? $lv->bezeichnung_english
: $lv->bezeichnung;
$antrag_data->ects = $lv->ects;
$antrag_data->sumEctsSchulisch = $sumEctsSchulisch;
$antrag_data->sumEctsBeruflich = $sumEctsBeruflich;
@@ -111,7 +124,9 @@ class AnrechnungLib
$antrag_data->student_uid = $uid;
$antrag_data->matrikelnr = $student->matrikelnr;
$antrag_data->studiengang_kz = $studiengang->studiengang_kz;
$antrag_data->stg_bezeichnung = $studiengang->bezeichnung;
$antrag_data->stg_bezeichnung = $english && !isEmptyString($studiengang->english)
? $studiengang->english
: $studiengang->bezeichnung;
$antrag_data->lektoren = $lv_lektoren_arr;
$antrag_data->zgv = $latest_zgv_bezeichnung;
@@ -458,6 +473,12 @@ class AnrechnungLib
*/
public function approveAnrechnung($anrechnung_id)
{
// Exit if user has no write permission for the Studiengang of the Anrechnung
if (!$this->isBerechtigtForAnrechnung(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid', $anrechnung_id))
{
return false;
}
// Check last Anrechnungstatus
if (!$result = getData($this->ci->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0])
{
@@ -507,6 +528,12 @@ class AnrechnungLib
*/
public function rejectAnrechnung($anrechnung_id, $begruendung)
{
// Exit if user has no write permission for the Studiengang of the Anrechnung
if (!$this->isBerechtigtForAnrechnung(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid', $anrechnung_id))
{
return false;
}
// Check last Anrechnungstatus
if (!$result = getData($this->ci->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0])
{
@@ -555,6 +582,12 @@ class AnrechnungLib
*/
public function requestRecommendation($anrechnung_id)
{
// Exit if user has no write permission for the Studiengang of the Anrechnung
if (!$this->isBerechtigtForAnrechnung(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid', $anrechnung_id))
{
return false;
}
// Check last Anrechnungstatus
if (!$result = getData($this->ci->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0])
{
@@ -575,7 +608,7 @@ class AnrechnungLib
$this->ci->db->trans_start(false);
// Insert new status inProgressLektor
$result = $this->ci->AnrechnungModel->saveAnrechnungstatus($anrechnung_id, self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR);
$this->ci->AnrechnungModel->saveAnrechnungstatus($anrechnung_id, self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR);
/**
* Anyway update empfehlung_anrechnung to be null
@@ -595,7 +628,7 @@ class AnrechnungLib
if ($this->ci->db->trans_status() === false)
{
$this->ci->db->trans_rollback();
return error($result->msg, EXIT_ERROR);
return false;
}
return true; // recommended
@@ -609,6 +642,12 @@ class AnrechnungLib
*/
public function recommendAnrechnung($anrechnung_id)
{
// Exit if user did not receive the request for recommendation
if (!$this->isEmpfehlungsberechtigt($anrechnung_id))
{
return false;
}
// Check last Anrechnungstatus
if (!$result = getData($this->ci->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0])
{
@@ -620,7 +659,7 @@ class AnrechnungLib
// Exit if already approved or rejected
if ($status_kurzbz == self::ANRECHNUNGSTATUS_APPROVED || $status_kurzbz == self::ANRECHNUNGSTATUS_REJECTED)
{
return success(false); // dont approve
return false; // dont approve
}
// Start DB transaction
@@ -657,6 +696,12 @@ class AnrechnungLib
*/
public function dontRecommendAnrechnung($anrechnung_id, $begruendung)
{
// Exit if user did not receive the request for recommendation
if (!$this->isEmpfehlungsberechtigt($anrechnung_id))
{
return false;
}
// Check last Anrechnungstatus
if (!$result = getData($this->ci->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0])
{
@@ -749,7 +794,7 @@ class AnrechnungLib
$result = $this->ci->AnrechnungModel->load($anrechnung_id);
if (!hasData($result))
{
showError('Anrechnung existiert nicht');
show_error('Failed loading Anrechnung');
}
// Get lectors of lehrveranstaltung
@@ -770,16 +815,72 @@ class AnrechnungLib
*/
public function isEmpfehlungsberechtigt($anrechnung_id)
{
if($this->ci->config->item('fbl') === TRUE)
// load() without an ID loads all Anrechnungen
if (!is_numeric($anrechnung_id))
{
return true;
return false;
}
// 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 Leitungen of the LV-OE (fbl), or lv-leitungen or, if not present, all lectors of lv.
$receiver_arr = $this->ci->config->item('fbl') === TRUE
? $this->getLeitungOfLvOe($anrechnung_id)
: $this->getLectors($anrechnung_id);
// True if user received the request for recommendation
return is_array($receiver_arr) && in_array(getAuthUID(), array_column($receiver_arr, 'uid'));
}
/**
* Check the permission for the Studiengang of the Anrechnung.
* The Studiengang of an Anrechnung is the Studiengang of its prestudent, not of the LV.
*
* @param $berechtigung_kurzbz
* @param $art
* @param $anrechnung_id
* @return bool
*/
public function isBerechtigtForAnrechnung($berechtigung_kurzbz, $art, $anrechnung_id)
{
// load() without an ID loads all Anrechnungen
if (!is_numeric($anrechnung_id))
{
return false;
}
$result = $this->ci->AnrechnungModel->load($anrechnung_id);
return hasData($result)
&& $this->isBerechtigtForPrestudent($berechtigung_kurzbz, $art, getData($result)[0]->prestudent_id);
}
/**
* Check the permission for the Studiengang of the prestudent.
*
* @param $berechtigung_kurzbz
* @param $art
* @param $prestudent_id
* @return bool
*/
public function isBerechtigtForPrestudent($berechtigung_kurzbz, $art, $prestudent_id)
{
// load() without an ID loads all prestudents
if (!is_numeric($prestudent_id))
{
return false;
}
$result = $this->ci->PrestudentModel->load($prestudent_id);
// Without a Studiengang, isBerechtigt checks the permission for any OE
if (!hasData($result))
{
return false;
}
$this->ci->load->library('PermissionLib');
return $this->ci->permissionlib->isBerechtigt($berechtigung_kurzbz, $art, getData($result)[0]->studiengang_kz);
}
/**
* Get LV Leitung. If not present, get all LV lectors.
@@ -856,6 +957,11 @@ class AnrechnungLib
$this->ci->AnrechnungModel->addSelect('lehrveranstaltung_id');
$result = $this->ci->AnrechnungModel->load($anrechnung_id);
if (!hasData($result))
{
return false;
}
$lehrveranstaltung_id = getData($result)[0]->lehrveranstaltung_id;
// Get Leitungen
@@ -889,7 +995,11 @@ class AnrechnungLib
$anrechnung_data->prestudent_id = $anrechnung->prestudent_id;
$anrechnung_data->lehrveranstaltung_id = $anrechnung->lehrveranstaltung_id;
$anrechnung_data->begruendung_id = $anrechnung->begruendung_id;
$anrechnung_data->begruendung = $anrechnung->bezeichnung;
// Begruendung in the users language, German name if no translation exists
$language_index = getUserLanguage() == 'German' ? 0 : 1;
$anrechnung_data->begruendung = !empty($anrechnung->bezeichnung_mehrsprachig[$language_index])
? $anrechnung->bezeichnung_mehrsprachig[$language_index]
: $anrechnung->bezeichnung;
$anrechnung_data->anmerkung = $anrechnung->anmerkung_student;
$anrechnung_data->dms_id = $anrechnung->dms_id;
$anrechnung_data->insertamum = (new DateTime($anrechnung->insertamum))->format('d.m.Y');
@@ -61,7 +61,7 @@ class Anrechnung_model extends DB_Model
if ($this->db->trans_status() === false)
{
$this->db->trans_rollback();
return error('Failed inserting Anrechnung', EXIT_ERROR);
return error($this->p->t('ui', 'fehlerBeimSpeichern'), EXIT_ERROR);
}
return success($lastInsert_anrechnung_id);
@@ -166,7 +166,7 @@ class Anrechnung_model extends DB_Model
// Get last Anrechnungstatus
if (!$result = getData($this->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0])
{
return error('Failed loading Anrechnung');
return error($this->p->t('ui', 'fehlerBeimLesen'));
}
$last_status = $result->status_kurzbz;
@@ -175,7 +175,7 @@ class Anrechnung_model extends DB_Model
// Exit, if last status is not approved / rejected
if ($last_status != self::ANRECHNUNGSTATUS_APPROVED && $last_status != self::ANRECHNUNGSTATUS_REJECTED)
{
return error('Nothing to withdraw. Application is still in progress');
return error($this->p->t('anrechnung', 'keineGenehmigungZumZuruecknehmen'));
}
// Start DB transaction
@@ -197,7 +197,7 @@ class Anrechnung_model extends DB_Model
if ($this->db->trans_status() === false)
{
$this->db->trans_rollback();
return error('Failed withdrawing Genehmigung', EXIT_ERROR);
return error($this->p->t('anrechnung', 'antragNichtZurueckgenommen'), EXIT_ERROR);
}
return success();
@@ -211,21 +211,31 @@ class Anrechnung_model extends DB_Model
*/
public function getAnrechnungsData($prestudent_id)
{
// Names in the users language, German if no translation exists
$english = getUserLanguage() != 'German';
$language_index = $english ? 2 : 1;
$lv_bezeichnung = $english
? 'COALESCE(NULLIF(lehre.tbl_lehrveranstaltung.bezeichnung_english, \'\'), lehre.tbl_lehrveranstaltung.bezeichnung)'
: 'lehre.tbl_lehrveranstaltung.bezeichnung';
$lv_comp_bezeichnung = $english
? 'COALESCE(NULLIF(lv_comp.bezeichnung_english, \'\'), lv_comp.bezeichnung)'
: 'lv_comp.bezeichnung';
$qry = '
SELECT
lehre.tbl_anrechnung.anrechnung_id,
lehre.tbl_anrechnung.prestudent_id,
lehre.tbl_anrechnung.lehrveranstaltung_id,
lehre.tbl_lehrveranstaltung.bezeichnung AS bez_lehrveranstaltung,
lehre.tbl_anrechnung_begruendung.bezeichnung AS begruendung,
lehre.tbl_anrechnung_anrechnungstatus.status_kurzbz AS status,
' . $lv_bezeichnung . ' AS bez_lehrveranstaltung,
COALESCE(lehre.tbl_anrechnung_begruendung.bezeichnung_mehrsprachig[' . $language_index . '], lehre.tbl_anrechnung_begruendung.bezeichnung) AS begruendung,
COALESCE(lehre.tbl_anrechnungstatus.bezeichnung_mehrsprachig[' . $language_index . '], lehre.tbl_anrechnung_anrechnungstatus.status_kurzbz) AS status,
genehmigt_von,
lehre.tbl_anrechnung.insertamum,
lehre.tbl_anrechnung.insertvon,
lehre.tbl_anrechnung.updateamum,
lehre.tbl_anrechnung.updatevon,
lehrveranstaltung_id_kompatibel,
lv_comp.bezeichnung as lehrveranstaltung_bez_kompatibel,
' . $lv_comp_bezeichnung . ' as lehrveranstaltung_bez_kompatibel,
count(nz.notizzuordnung_id) AS notizen_anzahl
FROM
lehre.tbl_anrechnung
@@ -31,7 +31,7 @@ class Anrechnungszeitraum_model extends DB_Model
if (isError($result))
{
return error('Fehler bei Anrechnungszeitraum speichern.');
return error($this->p->t('ui', 'fehlerBeimSpeichern'));
}
// Return new anrechnungszeitraum_id
@@ -50,7 +50,7 @@ class Anrechnungszeitraum_model extends DB_Model
if (isError($result))
{
return error('Fehler bei Anrechnungszeitraum löschen.');
return error($this->p->t('anrechnung', 'fehlerBeimLoeschen'));
}
return success($result->retval);
@@ -78,7 +78,7 @@ class Anrechnungszeitraum_model extends DB_Model
if (isError($result))
{
return error('Fehler bei Anrechnungszeitraum update.');
return error($this->p->t('ui', 'fehlerBeimSpeichern'));
}
return success($result->retval);
@@ -658,6 +658,26 @@ class Lehrveranstaltung_model extends DB_Model
return $this->execQuery($query, array($uid, $studiensemester_kurzbz, $lehrveranstaltung_id));
}
/**
* Gets the Lehrveranstaltung if it is in a Studienplan of the prestudent.
* Checks the Studienplaene of all statuses, because the status of a future semester can be missing.
* @param $prestudent_id
* @param $lehrveranstaltung_id
* @return array|null
*/
public function getLvInStudienplan($prestudent_id, $lehrveranstaltung_id)
{
$query = '
SELECT DISTINCT spl.lehrveranstaltung_id
FROM public.tbl_prestudentstatus ps
JOIN lehre.tbl_studienplan_lehrveranstaltung spl USING (studienplan_id)
WHERE ps.prestudent_id = ?
AND spl.lehrveranstaltung_id = ?;
';
return $this->execQuery($query, array($prestudent_id, $lehrveranstaltung_id));
}
/**
* Get Lehreinheit.
*
@@ -19,12 +19,14 @@ $includesArray = array(
'anrechnungszeitraumHinzufuegen',
'anrechnungszeitraumSpeichern',
'anrechnungszeitraumStart',
'anrechnungszeitraumEnde'
'anrechnungszeitraumEnde',
'anrechnungszeitraumBearbeiten'
),
'ui' => array(
'aktion',
'geloescht',
'gespeichert',
'systemfehler',
'frageSicherLoeschen',
'spaltenEinstellen'
),
@@ -113,7 +115,7 @@ if (defined("CIS4")) {
<input type="hidden" id="defaultStudiensemester_kurzbz"
value="<?php echo $studiensemester_kurzbz ?>">
<div class="col-xs-4">
<label for="studiensemester" class="small">Studiensemester</label>
<label for="studiensemester" class="small"><?php echo ucfirst($this->p->t('lehre', 'studiensemester')); ?></label>
<?php
echo $this->widgetlib->widget(
'Studiensemester_widget',
@@ -128,11 +130,11 @@ if (defined("CIS4")) {
?>
</div>
<div class="col-xs-4">
<label for="azrStart" class="small">Anr.-Zeitraum Start</label>
<label for="azrStart" class="small"><?php echo $this->p->t('anrechnung', 'anrechnungszeitraumStart'); ?></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>
<label for="azrEnde" class="small"><?php echo $this->p->t('anrechnung', 'anrechnungszeitraumEnde'); ?></label>
<input type="date" id="azrEnde" value="" class="form-control" required>
</div>
</div>
@@ -7,7 +7,7 @@ $includesArray = array(
'jqueryui1' => true,
'bootstrap5' => true,
'cis' => true,
'fontawesome4' => true,
'fontawesome6' => true,
'ajaxlib' => true,
'dialoglib' => true,
'phrases' => array(
@@ -47,7 +47,9 @@ $includesArray = array(
'erfolgreichZurueckgenommen',
'empfehlungPositivConfirmed',
'empfehlungNegativConfirmed',
'anrechnungEctsTooltipTextBeiUeberschreitung'
'anrechnungEctsTooltipTextBeiUeberschreitung',
'hoechstgrenzeUeberschritten',
'browserNichtUnterstuetzt'
)
),
'customCSSs' => array(
@@ -161,12 +163,12 @@ if (defined("CIS4")) {
</span>
</th>
<td>
Total: <span
<?php echo $this->p->t('anrechnung', 'totalEcts'); ?>: <span
id="sumEctsTotal"><?php echo number_format($antragData->sumEctsSchulisch + $antragData->sumEctsBeruflich, 1) ?></span>
[Schulisch: <span id="sumEctsSchulisch"
[<?php echo $this->p->t('anrechnung', 'schulisch'); ?>: <span id="sumEctsSchulisch"
value="<?php echo $antragData->sumEctsSchulisch ?>"><?php echo $antragData->sumEctsSchulisch ?></span>
/
Beruflich: <span id="sumEctsBeruflich"
<?php echo $this->p->t('anrechnung', 'beruflich'); ?>: <span id="sumEctsBeruflich"
value="<?php echo $antragData->sumEctsBeruflich ?>"><?php echo $antragData->sumEctsBeruflich ?></span>
]
<div class="p-1 align-items-center" id="sumEctsMsg"></div>
@@ -498,7 +500,7 @@ if (defined("CIS4")) {
<div class="col-4">
<!-- -Statusleiste -->
<div class="mb-5 alert text-center">
Status: <b><span class="text-uppercase" id="approveAnrechnungDetail-status_kurzbz"
<?php echo $this->p->t('global', 'status'); ?>: <b><span class="text-uppercase" id="approveAnrechnungDetail-status_kurzbz"
data-status_kurzbz="<?php echo $anrechnungData->status_kurzbz ?>">
<?php echo $anrechnungData->status; ?>
</span></b>
@@ -5,7 +5,7 @@ $includesArray = array(
'jquery3' => true,
'jqueryui1' => true,
'bootstrap5' => true,
'fontawesome4' => true,
'fontawesome6' => true,
'tabulator5' => true,
'tabulator5JQuery' => true,
'ajaxlib' => true,
@@ -15,7 +15,9 @@ $includesArray = array(
'phrases' => array(
'global' => array(
'begruendung',
'zgv'
'zgv',
'details',
'status'
),
'anrechnung' => array(
'nachweisdokumente',
@@ -23,7 +25,9 @@ $includesArray = array(
'empfehlungsanfrageAn',
'empfehlungsanfrageAm',
'confirmTextAntragHatBereitsEmpfehlung',
'herkunft'
'herkunft',
'ectsSummeKurz',
'browserNichtUnterstuetzt'
),
'ui' => array(
'anzeigen',
@@ -137,7 +141,8 @@ if (defined("CIS4")) {
</div>
<button type="submit"
class="btn btn-outline-secondary col-auto"><?php echo ucfirst($this->p->t('ui', 'anzeigen')); ?></button>
class="btn btn-outline-secondary col-auto"><?php echo ucfirst($this->p->t('ui', 'anzeigen')); ?>
</button>
</form>
</div>
</div>
@@ -175,9 +180,11 @@ if (defined("CIS4")) {
</li>
<li class="list-group-item list-group-item-secondary"><?php echo $this->p->t('anrechnung', 'genehmigungNegativKenntnisseNichtGleichwertigWeilHinweis'); ?></li>
</ol>
<textarea class="form-control" name="begruendung" id="approveAnrechnungUebersicht-begruendung"
<textarea class="form-control"
name="begruendung" id="approveAnrechnungUebersicht-begruendung"
rows="2"
placeholder="<?php echo $this->p->t('anrechnung', 'textUebernehmenOderEigenenBegruendungstext'); ?>" required></textarea>
placeholder="<?php echo $this->p->t('anrechnung', 'textUebernehmenOderEigenenBegruendungstext'); ?>"
required></textarea>
</div>
<!-- Action Button 'Abbrechen'-->
@@ -227,17 +234,17 @@ if (defined("CIS4")) {
<button id="show-inProgressLektor" class="btn btn-outline-secondary btn-clearfilter" type="button"
data-bs-toggle="tooltip" data-bs-placement="left"
title="<?php echo $this->p->t('ui', 'alleInBearbeitungLektor'); ?>"><i
class='fa fa-clock-o'></i>
class='fa-regular fa-clock'></i>
</button>
<button id="show-recommended" class="btn btn-outline-secondary btn-clearfilter" type="button"
data-bs-toggle="tooltip" data-bs-placement="left"
title="<?php echo $this->p->t('ui', 'nurEmpfohleneAnzeigen'); ?>"><i
class='fa fa-thumbs-o-up'></i>
class='fa-regular fa-thumbs-up'></i>
</button>
<button id="show-not-recommended" class="btn btn-outline-secondary btn-clearfilter" type="button"
data-bs-toggle="tooltip" data-bs-placement="left"
title="<?php echo $this->p->t('ui', 'nurNichtEmpfohleneAnzeigen'); ?>"><i
class='fa fa-thumbs-o-down'></i>
class='fa-regular fa-thumbs-down'></i>
</button>
<button id="show-approved" class="btn btn-outline-secondary btn-clearfilter" type="button"
data-bs-toggle="tooltip" data-bs-placement="left"
@@ -6,6 +6,9 @@ $STUDIENSEMESTER = $studiensemester_selected;
$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';
// English names only if the Studiengang or LV has one
$STG_BEZEICHNUNG = getUserLanguage() == 'German' ? 'stg.bezeichnung' : 'COALESCE(NULLIF(stg.english, \'\'), stg.bezeichnung)';
$LV_BEZEICHNUNG = getUserLanguage() == 'German' ? 'lv.bezeichnung' : 'COALESCE(NULLIF(lv.bezeichnung_english, \'\'), lv.bezeichnung)';
$query = '
WITH anrechnungen AS
@@ -21,7 +24,7 @@ $query = '
END "schreibberechtigt",
anrechnung.studiensemester_kurzbz,
stg.studiengang_kz,
stg.bezeichnung AS stg_bezeichnung,
' . $STG_BEZEICHNUNG . ' AS stg_bezeichnung,
lv.orgform_kurzbz,
(SELECT ausbildungssemester
FROM public.tbl_prestudentstatus press
@@ -31,12 +34,12 @@ $query = '
ORDER BY press.datum DESC
LIMIT 1
),
lv.bezeichnung AS lv_bezeichnung,
' . $LV_BEZEICHNUNG . ' AS lv_bezeichnung,
lv.ects::numeric(4,1),
get_ects_summe_schulisch(student.student_uid, anrechnung.prestudent_id, stg.studiengang_kz) AS ectsSumSchulisch,
get_ects_summe_beruflich(student.student_uid) AS ectsSumBeruflich,
(person.nachname || \' \' || person.vorname) AS "student",
begruendung.bezeichnung AS "begruendung",
COALESCE(begruendung.bezeichnung_mehrsprachig[' . $LANGUAGE_INDEX . '], begruendung.bezeichnung) AS "begruendung",
dmsversion.name AS "dokument_bezeichnung",
anrechnung.anmerkung_student,
(SELECT COALESCE(
@@ -178,17 +181,17 @@ $filterWidgetArray = array(
'lehrveranstaltung_id',
'begruendung_id',
'dms_id',
'Schreibberechtigt',
$this->p->t('anrechnung', 'schreibberechtigt'),
'studiensemester_kurzbz',
'studiengang_kz',
ucfirst($this->p->t('lehre', 'studiengang')),
ucfirst($this->p->t('lehre', 'organisationsform')),
'Semester',
$this->p->t('lehre', 'semester'),
ucfirst($this->p->t('lehre', 'lehrveranstaltung')),
'ECTS (LV)',
'ECTS (LV + Bisher)',
'ECTS (Bisher schulisch)',
'ECTS (Bisher beruflich',
$this->p->t('anrechnung', 'ectsLv'),
$this->p->t('anrechnung', 'ectsLvUndBisher'),
$this->p->t('anrechnung', 'ectsBisherSchulisch'),
$this->p->t('anrechnung', 'ectsBisherBeruflich'),
ucfirst($this->p->t('global', 'begruendung')),
ucfirst($this->p->t('person', 'studentIn')),
ucfirst($this->p->t('anrechnung', 'nachweisdokumente')),
@@ -197,7 +200,7 @@ $filterWidgetArray = array(
ucfirst($this->p->t('anrechnung', 'antragdatum')),
ucfirst($this->p->t('anrechnung', 'empfehlung')),
'status_kurzbz',
'Status',
$this->p->t('global', 'status'),
'PrestudentID',
ucfirst($this->p->t('anrechnung', 'empfehlungsanfrageAm')),
ucfirst($this->p->t('anrechnung', 'empfehlungsanfrageAn'))
@@ -5,7 +5,7 @@ $includesArray = array(
'jquery3' => true,
'jqueryui1' => true,
'bootstrap5' => true,
'fontawesome4' => true,
'fontawesome6' => true,
'ajaxlib' => true,
'dialoglib' => true,
'tabulator5' => true,
@@ -20,7 +20,9 @@ $includesArray = array(
'antragBearbeiten'
),
'ui' => array(
'hochladen'
'hochladen',
'errorDokumentZuGross',
'systemfehler'
),
'lehre' => array(
'studiensemester',
@@ -3,13 +3,15 @@
$STUDIENSEMESTER = $studiensemester_selected;
$STUDIENGAENGE_ENTITLED = implode(', ', $studiengaenge_entitled);
$LANGUAGE_INDEX = getUserLanguage() == 'German' ? '1' : '2';
// English name only if the Studiengang has one
$STG_BEZEICHNUNG = getUserLanguage() == 'German' ? 'stg.bezeichnung' : 'COALESCE(NULLIF(stg.english, \'\'), stg.bezeichnung)';
$query = '
SELECT pst.prestudent_id,
person.person_id,
pststatus.studienplan_id,
stg.studiengang_kz,
stg.bezeichnung AS "stg_bezeichnung",
' . $STG_BEZEICHNUNG . ' AS "stg_bezeichnung",
ausbildungssemester,
nachname,
vorname,
@@ -47,7 +49,7 @@ $filterWidgetArray = array(
'studienplan_id',
'studiengang_kz',
ucfirst($this->p->t('lehre', 'studiengang')),
'Semester',
$this->p->t('lehre', 'semester'),
ucfirst($this->p->t('person', 'nachname')),
ucfirst($this->p->t('person', 'vorname')),
ucfirst($this->p->t('global', 'zgv'))
@@ -11,7 +11,7 @@ $includesArray = array(
'jquery3' => true,
'jqueryui1' => true,
'bootstrap5' => true,
'fontawesome4' => true,
'fontawesome6' => true,
'ajaxlib' => true,
'dialoglib' => true,
'cis'=>true,
@@ -36,8 +36,10 @@ $includesArray = array(
'anrechnung' => array(
'deadlineUeberschritten',
'benotungDerLV',
'lvNichtImStudienplan',
'anrechnungEctsTextBeiUeberschreitung',
'anrechnungEctsTooltipTextBeiUeberschreitung'
'anrechnungEctsTooltipTextBeiUeberschreitung',
'hoechstgrenzeUeberschritten'
),
'person' => array(
'student',
@@ -158,9 +160,9 @@ else
</div>
</th>
<td colspan="3">
Total ECTS: <span id="sumEctsTotal"><?php echo number_format($antragData->sumEctsSchulisch + $antragData->sumEctsBeruflich, 1) ?></span>
[ Schulisch: <span id="sumEctsSchulisch"><?php echo $antragData->sumEctsSchulisch ?></span> |
Beruflich: <span id="sumEctsBeruflich"><?php echo $antragData->sumEctsBeruflich ?></span> ]
<?php echo $this->p->t('anrechnung', 'totalEcts'); ?>: <span id="sumEctsTotal"><?php echo number_format($antragData->sumEctsSchulisch + $antragData->sumEctsBeruflich, 1) ?></span>
[ <?php echo $this->p->t('anrechnung', 'schulisch'); ?>: <span id="sumEctsSchulisch"><?php echo $antragData->sumEctsSchulisch ?></span> |
<?php echo $this->p->t('anrechnung', 'beruflich'); ?>: <span id="sumEctsBeruflich"><?php echo $antragData->sumEctsBeruflich ?></span> ]
<div class="p-1 align-items-center" id="requestAnrechnung-maxEctsUeberschrittenMsg"></div>
</td>
</tr>
@@ -184,43 +186,31 @@ else
<div class="col-lg-12">
<div class="border border-dark border-3 rounded p-3" >
<p ><?php echo $this->p->t('anrechnung', 'antragStellenText'); ?></p>
<div class="ps-3 ">
<div class="form-check mb-1">
<input class="form-check-input" type="radio" name="begruendung" value="1" <?php echo $anrechnungData->begruendung_id == '1' ? 'checked' : ''; ?> required />
<?php echo $this->p->t('anrechnung', 'antragStellenWegenZeugnis'); ?>&emsp;
<div class="d-inline" id="requestAnrechnung-anrechnungGrundZeugnisTooltip" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true"
data-bs-title="<?php echo $this->p->t('anrechnung', 'anrechnungGrundZeugnisTooltipText'); ?>" >
<i class="fa fa-lg fa-info-circle" aria-hidden="true"></i>
</div>
</div>
<div class="form-check mb-1">
<input class="form-check-input" type="radio" name="begruendung" value="5" <?php echo $anrechnungData->begruendung_id == '5' ? 'checked' : ''; ?> required />
<?php echo $this->p->t('anrechnung', 'antragStellenWegenHochschulzeugnis'); ?>&emsp;
<div class="d-inline" id="requestAnrechnung-anrechnungGrundHochschulzeugnisTooltip" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true"
data-bs-title="<?php echo $this->p->t('anrechnung', 'anrechnungGrundZeugnisTooltipText'); ?>">
<i class="fa fa-lg fa-info-circle" aria-hidden="true"></i>
</div>
</div>
<div class="form-check mb-1">
<input class="form-check-input" type="radio" name="begruendung" value="4" <?php echo $anrechnungData->begruendung_id == '4' ? 'checked' : ''; ?> required />
<?php echo $this->p->t('anrechnung', 'antragStellenWegenPraxis'); ?>&emsp;
<div class="d-inline" id="requestAnrechnung-anrechnungGrundBerufTooltip" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true"
data-bs-title="<?php echo $this->p->t('anrechnung', 'anrechnungGrundBerufTooltipText'); ?>">
<i class="fa fa-lg fa-info-circle" aria-hidden="true"></i>
</div>
</div>
</div>
</div>
</div>
@@ -285,7 +275,7 @@ else
required>
<div class="mx-4 " id="requestAnrechnung-uploadTooltip" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true"
data-bs-title="<?php echo $this->p->t('ui', 'uploadTooltipText'); ?>">
<i class="fa fa-lg fa-question-circle-o" aria-hidden="true"></i>
<i class="fa-regular fa-lg fa-circle-question" aria-hidden="true"></i>
</div>
<a class="mx-4 float-end <?php echo !empty($anrechnungData->dms_id) ? '' : 'visually-hidden' ?>"
id="requestAnrechnung-downloadDocLink"
@@ -293,9 +283,6 @@ else
target="_blank"><?php echo htmlentities($anrechnungData->dokumentname) ?>
</a>
</div>
</div>
</div>
</div>
@@ -303,38 +290,35 @@ else
<!-- Herkunft der Kenntnisse -->
<div class="row mb-3">
<div class="col-lg-12">
<div class="card">
<div class="card-header">
<span class="fw-bold"><?php echo $this->p->t('anrechnung', 'herkunftDerKenntnisse'); ?></span>&emsp;
<div class="d-inline" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true" data-bs-title="<?php echo $this->p->t('anrechnung', 'anrechnungInfoTooltipText'); ?>">
<i class="fa fa-lg fa-info-circle" aria-hidden="true"></i>
</div>
</div>
<div class="card-body">
<textarea class="form-control" name="anmerkung" rows="1" id="requestAnrechnung-herkunftDerKenntnisse"
maxlength="<?php echo CHAR_LENGTH125 ?>" required><?php echo $anrechnungData->anmerkung; ?></textarea>
<small><span class="text-muted float-end"><?php echo $this->p->t('ui', 'maxZeichen'); ?> :<span id="requestAnrechnung-herkunftDerKenntnisse-charCounter"><?php echo CHAR_LENGTH125 ?></span></span></small>
</div>
<div class="card">
<div class="card-header">
<span class="fw-bold"><?php echo $this->p->t('anrechnung', 'herkunftDerKenntnisse'); ?></span>&emsp;
<div class="d-inline" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true" data-bs-title="<?php echo $this->p->t('anrechnung', 'anrechnungInfoTooltipText'); ?>">
<i class="fa fa-lg fa-info-circle" aria-hidden="true"></i>
</div>
</div>
<div class="card-body">
<textarea class="form-control" name="anmerkung" rows="1" id="requestAnrechnung-herkunftDerKenntnisse"
maxlength="<?php echo CHAR_LENGTH125 ?>" required><?php echo $anrechnungData->anmerkung; ?></textarea>
<small><span class="text-muted float-end"><?php echo $this->p->t('ui', 'maxZeichen'); ?> :<span id="requestAnrechnung-herkunftDerKenntnisse-charCounter"><?php echo CHAR_LENGTH125 ?></span></span></small>
</div>
</div>
</div>
</div>
<!-- Bestaetigung-->
<div class="row mb-3">
<div class="col-lg-12">
<div class="border border-3 rounded border-dark p-3" >
<div class="form-check">
<div class="form-check">
<input class="form-check-input border-3" type="checkbox" name="bestaetigung" required>
<small class=" fw-bold"><?php echo $this->p->t('anrechnung', 'bestaetigungstext'); ?></small>
</div>
</div>
</div>
</div>
</div>
<!-- Button 'Anrechnung beantragen'-->
<div class="float-end">
<input type="submit" id="requestAnrechnung-apply-anrechnung" class="btn btn-primary"
<input type="submit" id="requestAnrechnung-apply-anrechnung" class="btn btn-primary"
value="<?php echo $this->p->t('anrechnung', 'anrechnungBeantragen'); ?>">
</div>
</form>
@@ -343,16 +327,18 @@ else
</div>
<div class="col-4">
<!-- Status panel -->
<div class="alert text-center" id="requestAnrechnung-status">Status: <span class="fw-bold text-uppercase" id="requestAnrechnung-status_kurzbz"
data-status_kurzbz="<?php echo $anrechnungData->status_kurzbz ?>">
<?php echo $anrechnungData->status; ?>
</span>
<div class="alert text-center" id="requestAnrechnung-status"><?php echo $this->p->t('global', 'status'); ?>:
<span class="fw-bold text-uppercase" id="requestAnrechnung-status_kurzbz"
data-status_kurzbz="<?php echo $anrechnungData->status_kurzbz ?>">
<?php echo $anrechnungData->status; ?>
</span>
</div>
<!-- Sperregrund panel (hidden by default) -->
<div class="alert bg-danger-subtle text-center visually-hidden" id="requestAnrechnung-sperre"
data-anrechnung_id="<?php echo empty($anrechnungData->anrechnung_id) ? '' : $anrechnungData->anrechnung_id; ?>"
data-expired="<?php echo json_encode($is_expired); ?>"
data-blocked="<?php echo json_encode($is_blocked) ?>">
data-blocked="<?php echo json_encode($is_blocked) ?>"
data-not_in_studienplan="<?php echo json_encode($is_not_in_studienplan) ?>">
</div>
<?php $this->load->view('lehre/anrechnung/requestAnrechnungImportant'); ?>
</div>
@@ -3,10 +3,10 @@
<?php if (isset($this->config->item('display_infobox')['fristen']) && $this->config->item('display_infobox')['fristen'] === true): ?>
<div class="accordion-item">
<h2 class="accordion-header">
<div class="bg-info-subtle accordion-button" type="button" data-bs-toggle="collapse"
data-bs-target="#Beantragung" aria-expanded="true" aria-controls="Beantragung">
<div class="d-flex">
<div class="d-flex">
<div class="bg-info-subtle accordion-button" type="button" data-bs-toggle="collapse"
data-bs-target="#Beantragung" aria-expanded="true" aria-controls="Beantragung">
<i class="me-2 fa fa-lg fa-info-circle" aria-hidden="true"></i>&ensp;
<?php echo $this->p->t('anrechnung', 'requestAnrechnungInfoFristenTitle'); ?>
</div>
@@ -23,9 +23,10 @@
<?php if (isset($this->config->item('display_infobox')['referenzbeispiele_ects']) && $this->config->item('display_infobox')['referenzbeispiele_ects'] === true): ?>
<div class="accordion-item">
<h2 class="accordion-header">
<div class="bg-info-subtle accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#Referenzbeispiele" aria-expanded="false" aria-controls="Referenzbeispiele">
<div class="d-flex">
<div class="d-flex">
<div class="bg-info-subtle accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#Referenzbeispiele" aria-expanded="false" aria-controls="Referenzbeispiele">
<i class="me-2 fa fa-lg fa-info-circle" aria-hidden="true"></i>&ensp;
<?php echo $this->p->t('anrechnung', 'requestAnrechnungInfoEctsBerechnungTitle'); ?>
</div>
@@ -63,9 +64,10 @@
<?php if (isset($this->config->item('display_infobox')['herkunft_kenntnisse']) && $this->config->item('display_infobox')['herkunft_kenntnisse'] === true): ?>
<div class="accordion-item">
<h2 class="accordion-header">
<div class="bg-info-subtle accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#HerkunftKenntnisse" aria-expanded="false" aria-controls="HerkunftKenntnisse">
<div class="d-flex">
<div class="d-flex">
<div class="bg-info-subtle accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#HerkunftKenntnisse" aria-expanded="false" aria-controls="HerkunftKenntnisse">
<i class="me-2 fa fa-lg fa-info-circle" aria-hidden="true"></i>&ensp;
<?php echo $this->p->t('anrechnung', 'requestAnrechnungInfoHerkunftKenntnisseTitle'); ?>
</div>
@@ -7,7 +7,7 @@ $includesArray = array(
'jqueryui1' => true,
'bootstrap5' => true,
'cis' => true,
'fontawesome4' => true,
'fontawesome6' => true,
'ajaxlib' => true,
'dialoglib' => true,
'phrases' => array(
@@ -39,7 +39,8 @@ $includesArray = array(
),
'anrechnung' => array(
'empfehlungPositivConfirmed',
'empfehlungNegativConfirmed'
'empfehlungNegativConfirmed',
'browserNichtUnterstuetzt'
)
),
'customCSSs' => array(
@@ -151,7 +152,6 @@ if (defined("CIS4")) {
<div class="col-lg-8">
<table class="table table-bordered table-condensed table-fixed mb-0">
<tbody>
<tr>
<th class="col-4">
<?php echo ucfirst($this->p->t('global', 'zgv')); ?>
@@ -191,7 +191,6 @@ if (defined("CIS4")) {
<?php endif; ?>
</tbody>
</table>
</div>
</div>
</div>
@@ -214,7 +213,6 @@ if (defined("CIS4")) {
<?php echo $this->p->t('anrechnung', 'empfehlungdatum'); ?>:
<span
id="reviewAnrechnungDetail-empfehlungAm"><?php echo $empfehlungData->empfehlung_am ?></span>
</div>
</div>
<div class="card-body">
@@ -380,11 +378,11 @@ if (defined("CIS4")) {
<div class="col-4 ">
<div class="mb-5 alert text-center">
Status:
<?php echo $this->p->t('global', 'status'); ?>:
<b><span class="text-uppercase" id="reviewAnrechnungDetail-status_kurzbz"
data-status_kurzbz="<?php echo $anrechnungData->status_kurzbz ?>">
<?php echo $anrechnungData->status; ?>
</span></b>
data-status_kurzbz="<?php echo $anrechnungData->status_kurzbz ?>">
<?php echo $anrechnungData->status; ?>
</span></b>
</div>
<?php $this->load->view('lehre/anrechnung/reviewAnrechnungInfo'); ?>
@@ -5,7 +5,7 @@ $includesArray = array(
'jquery3' => true,
'jqueryui1' => true,
'bootstrap5' => true,
'fontawesome4' => true,
'fontawesome6' => true,
'tabulator5' => true,
'tabulator5JQuery' => true,
'cis' => true,
@@ -15,12 +15,15 @@ $includesArray = array(
'phrases' => array(
'global' => array(
'begruendung',
'zgv'
'zgv',
'details',
'status'
),
'anrechnung' => array(
'nachweisdokumente',
'empfehlung',
'herkunft'
'herkunft',
'browserNichtUnterstuetzt'
),
'ui' => array(
'anzeigen',
@@ -103,7 +106,8 @@ if (defined("CIS4")) {
<h3 class="fw-normal">
<?php echo $this->p->t('anrechnung', 'anrechnungenPruefen'); ?>
<small class="text-secondary fs-6">|
<?php echo ucfirst($this->p->t('global', 'uebersicht')); ?></small>
<?php echo ucfirst($this->p->t('global', 'uebersicht')); ?>
</small>
</h3>
</div>
</div>
@@ -127,7 +131,8 @@ if (defined("CIS4")) {
?>
</div>
<button type="submit"
class="btn btn-outline-secondary col-auto"><?php echo ucfirst($this->p->t('ui', 'anzeigen')); ?></button>
class="btn btn-outline-secondary col-auto"><?php echo ucfirst($this->p->t('ui', 'anzeigen')); ?>
</button>
</form>
</div>
</div>
@@ -145,10 +150,12 @@ if (defined("CIS4")) {
<?php echo $this->p->t('anrechnung', 'empfehlungenNegativQuestion'); ?>
</h4>
<div class="mb-4">
<b><span>&ensp;<?php echo $this->p->t('anrechnung', 'bitteBegruendungAngeben'); ?></span>
<b>
<span>&ensp;<?php echo $this->p->t('anrechnung', 'bitteBegruendungAngeben'); ?></span>
<span class="text-danger">
<?php echo $this->p->t('anrechnung', 'begruendungWirdFuerAlleUebernommen'); ?>
</span></b>
</span>
</b>
</div>
<ul class="list-group mb-4">
@@ -216,12 +223,12 @@ if (defined("CIS4")) {
<button id="show-recommended" class="btn btn-outline-secondary btn-clearfilter" type="button"
data-bs-toggle="tooltip" data-bs-placement="left" data-bs-html="true"
title="<?php echo $this->p->t('ui', 'nurEmpfohleneAnzeigen'); ?>"><i
class='fa fa-thumbs-o-up'></i>
class='fa-regular fa-thumbs-up'></i>
</button>
<button id="show-not-recommended" class="btn btn-outline-secondary btn-clearfilter"
type="button" data-bs-toggle="tooltip" data-bs-placement="left" data-bs-html="true"
title="<?php echo $this->p->t('ui', 'nurNichtEmpfohleneAnzeigen'); ?>"><i
class='fa fa-thumbs-o-down'></i>
class='fa-regular fa-thumbs-down'></i>
</button>
<button id="show-approved" class="btn btn-outline-secondary btn-clearfilter" type="button"
data-bs-toggle="tooltip" data-bs-placement="left" data-bs-html="true"
@@ -2,6 +2,9 @@
$STUDIENSEMESTER = $studiensemester_selected;
$LEKTOR_UID = getAuthUID();
$LANGUAGE_INDEX = getUserLanguage() == 'German' ? '1' : '2';
// English names only if the Studiengang or LV has one
$STG_BEZEICHNUNG = getUserLanguage() == 'German' ? 'stg.bezeichnung' : 'COALESCE(NULLIF(stg.english, \'\'), stg.bezeichnung)';
$LV_BEZEICHNUNG = getUserLanguage() == 'German' ? 'lv.bezeichnung' : 'COALESCE(NULLIF(lv.bezeichnung_english, \'\'), lv.bezeichnung)';
$query = '
WITH anrechnungen AS
@@ -13,11 +16,11 @@ $query = '
anrechnung.dms_id,
anrechnung.studiensemester_kurzbz,
stg.studiengang_kz,
stg.bezeichnung AS "stg_bezeichnung",
lv.bezeichnung AS "lv_bezeichnung",
' . $STG_BEZEICHNUNG . ' AS "stg_bezeichnung",
' . $LV_BEZEICHNUNG . ' AS "lv_bezeichnung",
lv.ects,
(person.nachname || \' \' || person.vorname) AS "student",
begruendung.bezeichnung AS "begruendung",
COALESCE(begruendung.bezeichnung_mehrsprachig[' . $LANGUAGE_INDEX . '], begruendung.bezeichnung) AS "begruendung",
dmsversion.name AS "dokument_bezeichnung",
anrechnung.anmerkung_student,
(SELECT COALESCE(
@@ -129,7 +132,7 @@ $filterWidgetArray = array(
'requiredPermissions' => 'lehre/anrechnung_empfehlen',
'datasetRepresentation' => 'tabulator',
'columnsAliases' => array(
'Empfehlungsberechtigt',
$this->p->t('anrechnung', 'empfehlungsberechtigt'),
'anrechnung_id',
'lehrveranstaltung_id',
'begruendung_id',
@@ -138,7 +141,7 @@ $filterWidgetArray = array(
'studiengang_kz',
ucfirst($this->p->t('lehre', 'studiengang')),
ucfirst($this->p->t('lehre', 'lehrveranstaltung')),
'ECTS',
$this->p->t('lehre', 'ects'),
ucfirst($this->p->t('person', 'studentIn')),
ucfirst($this->p->t('global', 'begruendung')),
ucfirst($this->p->t('anrechnung', 'nachweisdokumente')),
@@ -147,7 +150,7 @@ $filterWidgetArray = array(
ucfirst($this->p->t('anrechnung', 'antragdatum')),
ucfirst($this->p->t('anrechnung', 'empfehlung')),
'status_kurzbz',
'Status'
$this->p->t('global', 'status')
),
'datasetRepOptions' => '{
height: func_height(this),
+3
View File
@@ -313,6 +313,9 @@ class TableWidget extends Widget
// If session is NOT empty -> a table was already loaded
if ($session != null)
{
// Aliases from the current request, otherwise the headers keep the language of the first load
$this->tablewidgetlib->setSessionElement(TableWidgetLib::SESSION_COLUMNS_ALIASES, $this->_columnsAliases);
// Get SESSION_DATASET_RELOAD from the session
$sessionReloadDataset = $this->tablewidgetlib->getSessionElement(TableWidgetLib::SESSION_DATASET_RELOAD);
+1
View File
@@ -632,6 +632,7 @@ elseif (isset($prestudent_id))
$ps_obj->lastStatus = $ps_tmp->status_kurzbz; // letzten Status dem result array hinzufügen
$ps_obj->status_mehrsprachig = $ps_tmp->status_mehrsprachig;
$ps_obj->ausbildungssemester = $ps_tmp->ausbildungssemester;
}
// Falls Status 'Abgewiesene' vorhanden, nach hinten reihen
+33 -15
View File
@@ -29,6 +29,7 @@ require_once('../../include/sprache.class.php');
require_once '../../include/phrasen.class.php';
require_once '../../include/studiengang.class.php';
require_once('../../include/gebiet.class.php');
require_once('../../include/gebiet_pruefling.class.php');
if (!$db = new basis_db())
die('Fehler beim Oeffnen der Datenbankverbindung');
@@ -198,8 +199,8 @@ else if (isset($_SESSION['pruefling_id']))
)
SELECT DISTINCT ON
(gebiet_id, semester, reihung)
SELECT * FROM (SELECT DISTINCT ON
(gebiet_id)
semester,
gebiet_id,
STRING_AGG(studiengang_kz::TEXT, ', ' ORDER BY studiengang_kz) AS studiengang_kz_list,
@@ -226,13 +227,7 @@ else if (isset($_SESSION['pruefling_id']))
JOIN
testtool.tbl_gebiet USING (gebiet_id)
WHERE
(
(prestudent_data.semester= 1 AND tbl_ablauf.semester = 1)
OR
(prestudent_data.semester= 2 AND tbl_ablauf.semester = 2)
OR
(prestudent_data.semester= 3 AND tbl_ablauf.semester IN (1,3))
)
tbl_ablauf.semester <= prestudent_data.semester
AND (
prestudent_data.studienplan_id = tbl_ablauf.studienplan_id
OR
@@ -259,9 +254,7 @@ else if (isset($_SESSION['pruefling_id']))
JOIN
testtool.tbl_gebiet USING (gebiet_id)
WHERE
(prestudent_data.semester= 1 AND tbl_ablauf.semester = 1)
OR
(prestudent_data.semester= 3 AND tbl_ablauf.semester IN (1,3))
tbl_ablauf.semester <= prestudent_data.semester
)
) temp
) temp2
@@ -270,7 +263,7 @@ else if (isset($_SESSION['pruefling_id']))
semester,
gebiet_id,
bezeichnung,
". $bezeichnung_mehrsprachig_sel ."
". $bezeichnung_mehrsprachig_sel ." ) temp3
ORDER BY
semester,
@@ -283,6 +276,8 @@ else if (isset($_SESSION['pruefling_id']))
$lastsemester = '';
$quereinsteiger_stg = '';
$_SESSION['alleGebiete']= [];
$gebiet_pruefling = new gebiet_pruefling();
$quereinsteiger_menu = false;
while($row = $db->db_fetch_object($result))
{
//Jedes Semester in einer eigenen Tabelle anzeigen
@@ -294,8 +289,25 @@ else if (isset($_SESSION['pruefling_id']))
}
$lastsemester = $row->semester;
echo '<table border="0" cellspacing="0" cellpadding="0" id="Gebiet" style="display: visible; border-collapse: separate; border-spacing: 0 3px; margin-top: 5px;">';
echo '<tr><td class="HeaderTesttool">'. ($row->semester == '1' ? $p->t('testtool/basisgebiete') : $p->t('testtool/quereinstiegsgebiete')).'</td></tr>';
if ($row->semester == '1')
{
// Basisgebiete anzeigen
echo '<table border="0" cellspacing="0" cellpadding="0" id="Gebiet" style="display: visible; border-collapse: separate; border-spacing: 0 3px; margin-top: 5px;">';
echo '<tr><td class="HeaderTesttool">' . $p->t('testtool/basisgebiete') . '</td></tr>';
}
else
{
if (!$quereinsteiger_menu)
{
echo '<table border="0" cellspacing="0" cellpadding="0" id="Gebiet" style="display: visible; border-collapse: separate; border-spacing: 0 3px; margin-top: 5px;">';
echo '<tr><td class="HeaderTesttool">' . $p->t('testtool/quereinstiegsgebiete') . '</td></tr>';
$quereinsteiger_menu = true;
}
else
{
echo '<table border="0" cellspacing="0" cellpadding="0" id="Gebiet" style="display: visible; border-collapse: separate; border-spacing: 0 3px; margin-top: 5px;">';
}
}
}
// Bei Quereinstiegsgebieten nach STG clustern und die STG anzeigen
@@ -394,6 +406,12 @@ else if (isset($_SESSION['pruefling_id']))
</td>
<!--<td width="10" class="ItemTesttoolRight" nowrap>&nbsp;</td>-->
</tr>';
if (!$gebiet_pruefling->checkIfExists($_SESSION['pruefling_id'], $row->gebiet_id))
{
$gebiet_pruefling->pruefling_id = $_SESSION['pruefling_id'];
$gebiet_pruefling->gebiet_id = $row->gebiet_id;
$gebiet_pruefling->saveGebietForPruefling();
}
$_SESSION['alleGebiete'][] = $row->gebiet_id;
}
else
+97
View File
@@ -0,0 +1,97 @@
<?php
/* Copyright (C) 2024 Technikum-Wien
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
require_once(dirname(__FILE__).'/basis_db.class.php');
class gebiet_pruefling extends basis_db
{
//Tabellenspalten
public $prueflinggebiet_id;
public $pruefling_id;
public $gebiet_id;
public $insertamum;
public function __construct()
{
parent::__construct();
}
public function loadByPruefling($pruefling_id)
{
$qry = "SELECT *
FROM testtool.tbl_pruefling_gebiet
WHERE pruefling_id = ".$this->db_add_param($pruefling_id, FHC_INTEGER);
if($this->db_query($qry))
{
if($row = $this->db_fetch_object())
{
$this->prueflinggebiet_id = $row->prueflinggebiet_id;
$this->pruefling_id = $row->pruefling_id;
$this->gebiet_id = $row->gebiet_id;
return true;
}
else
{
$this->errormsg = "Pruefling nicht gefunden";
return false;
}
}
else
{
$this->errormsg = "Fehler beim Laden der Gebiete für den Pruefling";
return false;
}
}
public function checkIfExists($pruefling_id, $gebiet_id)
{
$qry = "SELECT 1
FROM testtool.tbl_pruefling_gebiet
WHERE pruefling_id =".$this->db_add_param($pruefling_id, FHC_INTEGER) ." AND gebiet_id =".$this->db_add_param($gebiet_id, FHC_INTEGER);
if ($result = $this->db_query($qry))
{
if ($this->db_num_rows($result) > 0)
return true;
else
return false;
}
}
public function saveGebietForPruefling()
{
$qry = "INSERT INTO testtool.tbl_pruefling_gebiet
(pruefling_id, gebiet_id)
VALUES(".
$this->db_add_param($this->pruefling_id, FHC_INTEGER).','.
$this->db_add_param($this->gebiet_id, FHC_INTEGER).');';
if ($this->db_query($qry))
{
return true;
}
else
{
$this->errormsg = 'Fehler beim Speichern der Daten';
return true;
}
}
}
?>
+17 -1
View File
@@ -853,4 +853,20 @@ html {
border: 1px solid rgba(0, 0, 0, 0.15);
border-radius: 0.5rem;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);
}
}
.cis-main-menu {
max-width: 100vw;
}
.cis-main-menu ul {
list-style: none;
margin: 0;
padding: 0;
}
.cis-main-menu ul li {
margin: 0;
padding: 0;
width: 100%;
}
+1 -1
View File
@@ -585,7 +585,7 @@ var FHC_TableWidget = {
let defaultPersistence = {
sort: true,
columns: true,
columns: ["width", "visible"],
filter: false,
headerFilter: false,
group: false,
+14 -1
View File
@@ -19,6 +19,7 @@ import DeadlineOverview from "../../components/Cis/Abgabetool/DeadlineOverview.j
import Studium from "../../components/Cis/Studium/Studium.js";
import StgOrgLvPlan from "../../components/Cis/LvPlan/StgOrg.js";
import OtherLvPlan from "../../components/Cis/LvPlan/OtherLvPlan.js";
import Compat from "../../components/Cis/Compat.js";
import ApiRouteInfo from '../../api/factory/routeinfo.js';
import {capitalize} from "../../helpers/StringHelpers.js";
@@ -29,6 +30,18 @@ const isMobile = window.matchMedia("(max-width: 767px)").matches;
const router = VueRouter.createRouter({
history: VueRouter.createWebHistory(`/${ciPath}`),
routes: [
{
path: `/Cis/Compat/:mode(ci|legacy)/:path(.*)`,
name: 'Compat',
component: Compat,
props: (route) => {
return {
mode: route.params.mode,
path: route.params.path,
query_string: VueRouter.stringifyQuery(route.query)
};
}
},
{
path: `/Cis/Studium`,
name: 'Studium',
@@ -277,7 +290,7 @@ const app = Vue.createApp({
if (target && this.isInternalRoute(target.href)) {
const url = new URL(target.href)
const path = url.pathname
const path = url.pathname + url.search;
const base = this.$router.options.history.base
const route = path.replace(base, '') || '/'
+93
View File
@@ -0,0 +1,93 @@
export default {
name: "Compat",
props: {
mode: { type: String, required: true },
path: { type: String, required: true },
query_string: { type: String, required: true, default: ''}
},
data: function() {
return {
lastLoadediFrameURL: '',
srcUrl: ''
};
},
computed: {
propsWatchHelper: function() {
return this.mode + '#' + this.path + '#' + this.query_string;
}
},
mounted: function() {
this.srcUrl = this.buildSrcUrl();
},
watch: {
propsWatchHelper: function() {
if(this.lastLoadediFrameURL === '') {
return;
}
let currentiFrameURL = this.$refs.compatiframe ? this.$refs.compatiframe.src : '';
let url = this.buildSrcUrl();
if(this.lastLoadediFrameURL !== url) {
this.srcUrl = url;
if(this.srcUrl === url) {
this.$refs.compatiframe.contentWindow.location.href = url;
}
}
}
},
methods: {
buildSrcUrl: function() {
let url = false;
switch(this.mode) {
case 'ci':
url = FHC_JS_DATA_STORAGE_OBJECT.app_root + 'index.ci.php/' + this.path;
break;
case 'legacy':
url = FHC_JS_DATA_STORAGE_OBJECT.app_root + this.path;
break;
default:
url = false;
}
if(this.query_string !== '' && url) {
url += '?' + this.query_string;
}
return url;
},
loadHandler: function() {
let iframe_href = this.$refs.compatiframe.contentWindow.location.href;
let ci_urlstart = FHC_JS_DATA_STORAGE_OBJECT.app_root + 'index.ci.php/';
let legacy_urlstart = FHC_JS_DATA_STORAGE_OBJECT.app_root;
let routerpath = null;
this.lastLoadediFrameURL = iframe_href;
if(iframe_href.startsWith(ci_urlstart)) {
routerpath = iframe_href.replace(
ci_urlstart, '/Cis/Compat/ci/');
} else if(iframe_href.startsWith(legacy_urlstart)) {
routerpath = iframe_href.replace(
legacy_urlstart, '/Cis/Compat/legacy/');
} else {
return;
}
if(this.$route.fullPath !== routerpath) {
this.$router.push(routerpath);
}
}
},
template: `
<div class="w-100">
<iframe
ref="compatiframe"
v-if="srcUrl"
:src="srcUrl"
@load="loadHandler"
style="width:100%; height:90vh; border:0; display:block;"
></iframe>
<div v-else class="alert alert-warning">Keine URL gefunden.</div>
</div>
`
};
+1 -1
View File
@@ -186,7 +186,7 @@ export default {
</div>
</div>
<nav id="nav-main" class="offcanvas offcanvas-start" tabindex="-1" aria-labelledby="nav-main-btn" data-bs-backdrop="false">
<nav id="nav-main" class="cis-main-menu offcanvas offcanvas-start" tabindex="-1" aria-labelledby="nav-main-btn" data-bs-backdrop="false">
<div id="nav-main-sticky">
<div class="d-flex flex-row h-100">
<div class="offcanvas-body p-0">
+5 -1
View File
@@ -162,6 +162,7 @@ export default {
<div class="btn-group w-100">
<a :target="target"
:href="(entry.menu_open && hasFullLink) ? entry.url : null"
draggable="false"
@click="toggleCollapse"
:class="{
'btn btn-default rounded-0 text-start': true,
@@ -180,12 +181,15 @@ export default {
</div>
<ul ref="children"
class="nav w-100 collapse">
<cis-menu-entry :highestMatchingUrlCount="highestMatchingUrlCount" :activeContent="activeContent" v-for="child in entry.childs" :key="child" :entry="child" :level="level + 1"/>
<li>
<cis-menu-entry :highestMatchingUrlCount="highestMatchingUrlCount" :activeContent="activeContent" v-for="child in entry.childs" :key="child" :entry="child" :level="level + 1"/>
</li>
</ul>
</template>
<a v-else
:href="entry.url"
:target="target"
draggable="false"
:class="{
'btn btn-default rounded-0 w-100 text-start': true,
['btn-level-' + level]: true,
@@ -2,15 +2,16 @@ export default {
props: {
data: {
type: String,
}
},
},
data() {
return {}
return {};
},
template: /*html*/`
template: /*html*/ `
<div class="card">
<div class="card-body">
<span >{{$p.t('profil','fhAusweisStatus',[data])}}</span>
<span v-if="data">{{$p.t('profil','fhAusweisStatus',[data])}}</span>
<span v-else>{{$p.t('profil','fhAusweisStatusNichtAusgegeben')}}</span>
</div>
</div>`,
}
};
+13 -2
View File
@@ -1,5 +1,6 @@
import BsModal from "../Bootstrap/Modal.js";
import HeightTransition from "../Tranistion/HeightTransition.js";
import MissingPermissionWidget from "../DashboardWidget/MissingPermission.js";
import { enableDragDropTouch } from "../../../../vendor/drag-drop-touch-js/dragdroptouch/dist/drag-drop-touch.esm.min.js";
@@ -112,6 +113,12 @@ export default {
isPinned() {
return this.place?.pinned ? true : false;
},
permitted() {
// widgets without a linked permission (or before the template loaded)
// are considered permitted; the backend sets permitted === false only
// when the user is missing the widget's required permission
return this.widgetTemplate?.permitted !== false;
},
ready() {
return this.component && this.arguments !== null;
}
@@ -169,7 +176,11 @@ export default {
&& this.widgetTemplate.widget_id
&& this.widgetTemplate.arguments
) {
let component = (await import(this.widgetTemplate.setup.file)).default;
// render the "missing permission" screen instead of the actual
// widget when the user does not hold the widget's linked permission
let component = this.permitted
? (await import(this.widgetTemplate.setup.file)).default
: MissingPermissionWidget;
this.$options.components["widget" + this.widgetTemplate.widget_id] = component;
this.component = "widget" + this.widgetTemplate.widget_id;
this.arguments = { ...this.widgetTemplate.arguments, ...this.config };
@@ -269,7 +280,7 @@ export default {
</template>
<!-- widget link -->
<a
v-if="widgetTemplate.setup.cis4link"
v-if="widgetTemplate.setup.cis4link && permitted"
:href="getWidgetC4Link(widgetTemplate)"
class="col-auto ms-auto"
:aria-label="$p.t('dashboard/widget_link')"
@@ -14,10 +14,14 @@ export default {
callbacks: {}
}),
computed: {
// filter widgets away the user has no permissions for
availableWidgets() {
return (this.widgets || []).filter(widget => widget.permitted !== false);
},
hasAnyWidgets() {
if (!this.widgets)
return false;
if (!this.widgets.length && !this.hiddenWidgets?.length)
if (!this.availableWidgets.length && !this.hiddenWidgets?.length)
return false;
return true;
}
@@ -54,7 +58,7 @@ export default {
<template v-slot:default>
<template v-if="widgets && hiddenWidgets">
<div
v-if="!widgets.length && !hiddenWidgets.length"
v-if="!availableWidgets.length && !hiddenWidgets.length"
class="row g-2"
>
<div>{{ $p.t('dashboard/noWidgetsAvailable') }}</div>
@@ -74,16 +78,17 @@ export default {
</div>
</div>
<div
v-if="widgets.length"
v-if="availableWidgets.length"
class="row g-2"
>
<div
v-for="widget in widgets"
<template
v-for="widget in availableWidgets"
:key="widget.widget_id"
class="widget-icon-container col-sm-6 col-md-4 col-lg-3 col-xl-2"
>
<widget-icon @select="pick" :widget="widget"></widget-icon>
</div>
<div v-if="widget.permitted" class="widget-icon-container col-sm-6 col-md-4 col-lg-3 col-xl-2">
<widget-icon @select="pick" :widget="widget"></widget-icon>
</div>
</template>
</div>
</template>
</template>
@@ -0,0 +1,21 @@
import AbstractWidget from './Abstract.js';
/**
* Fallback screen rendered in place of a widget when the current user is missing
* the permission (berechtigung_kurzbz) linked to that widget. Used for widgets
* that are already on a user's dashboard but whose required permission the user
* no longer holds.
*/
export default {
mixins: [
AbstractWidget
],
created() {
this.$emit('setConfig', false);
},
template: /*html*/`
<div class="dashboard-widget-missing-permission d-flex flex-column justify-content-center align-items-center text-center h-100 p-3 text-body-secondary">
<i class="fa-solid fa-lock fa-2x mb-2" aria-hidden="true"></i>
<p class="mb-0">{{ $p.t('dashboard/widget_missing_permission') }}</p>
</div>`
}
@@ -542,10 +542,10 @@ export default {
<template v-if="typeHeader==='mitarbeiter'">
<div class="foto-container col-md-2 d-flex justify-content-start align-items-center w-30 pb-3 gap-3 mt-3 position-relative" style="max-height: 8rem; max-width: 6rem; overflow: hidden;">
<div class="foto-container d-flex flex-column align-items-center h-100 position-relative d-inline-block">
<img
class="d-block w-100 h-100 rounded"
style="height: 84px; object-fit: contain;"
class="d-block rounded"
style="height: 96px;"
alt="Profilbild"
:src="getFotoSrc(headerDataMa.foto)"
/>
@@ -558,15 +558,13 @@ export default {
<template v-if="fotoEditable">
<button
type="button"
class="fotoedit btn btn-outline-dark btn-sm d-flex justify-content-center align-items-center position-absolute start-0"
style="z-index: 104; font-size: 1rem; width: 2.5rem; height: 2.5rem; opacity:0; transition: opacity 0.2s; top:13%;"
class="fotoedit buttonleft btn btn-outline-dark btn-sm d-flex justify-content-center align-items-center position-absolute start-0"
@click="showDeleteModal(person_id)">
<i class="fa fa-xmark"></i>
</button>
<button
type="button"
class="fotoedit btn btn-outline-dark btn-sm d-flex justify-content-center align-items-center position-absolute end-0"
style="z-index: 104; font-size: 1rem; width: 2.5rem; height: 2.5rem; opacity:0; transition: opacity 0.2s; top:13%;"
class="fotoedit buttonright btn btn-outline-dark btn-sm d-flex justify-content-center align-items-center position-absolute end-0"
@click="showModal(person_id)">
<i class="fa fa-pen"></i>
</button>
@@ -134,7 +134,7 @@ export default {
event: 'tableBuilt',
handler: async () => {
await this.$p.loadCategory(['anrechnungen', 'global', 'ui', 'lehre']);
await this.$p.loadCategory(['anrechnung', 'global', 'ui', 'lehre']);
const setHeader = (field, text) => {
const col = this.$refs.table.tabulator.getColumn(field);
@@ -158,6 +158,10 @@ export default {
setHeader( 'genehmigt_von', this.$p.t('anrechnung', 'genehmigtVon'));
setHeader( 'notizen_anzahl', this.$p.t('anrechnung', 'existingNotes'));
setHeader( 'insertamum', this.$p.t('global', 'datum'));
setHeader( 'actions', this.$p.t('global', 'aktionen'));
// Render the action buttons again, their phrases can arrive after the data
this.$refs.table.tabulator.redraw(true);
}
}
];
@@ -280,6 +284,12 @@ export default {
resetLvKompatibel(){
this.formData.lehrveranstaltung_id_kompatibel = null;
this.handleInput();
},
lvBezeichnung(lv) {
// English name only if the LV has one
return this.$p.user_language.value != 'German' && lv.bezeichnung_english
? lv.bezeichnung_english
: lv.bezeichnung;
}
},
created() {
@@ -380,7 +390,7 @@ export default {
:key="entry.lehrveranstaltung_id"
:value="entry.lehrveranstaltung_id"
>
{{entry.bezeichnung}} Semester {{entry.semester}} {{entry.lehrform_kurzbz}}
{{lvBezeichnung(entry)}} Semester {{entry.semester}} {{entry.lehrform_kurzbz}}
</option>
</form-input>
</div>
@@ -407,7 +417,7 @@ export default {
<div v-if="formData.begruendung_id == '2'" class="row mb-3">
<form-input
type="select"
label="Lehrveranstaltung Kompatibel"
:label="$p.t('anrechnung/lehrveranstaltung_bez_kompatibel')"
name="lehrveranstaltung_id_kompatibel"
v-model="formData.lehrveranstaltung_id_kompatibel"
>
@@ -416,7 +426,7 @@ export default {
:key="entry.lehrveranstaltung_id"
:value="entry.lehrveranstaltung_id"
>
{{entry.bezeichnung}} Semester {{entry.semester}} {{entry.lehrform_kurzbz}}
{{lvBezeichnung(entry)}} Semester {{entry.semester}} {{entry.lehrform_kurzbz}}
</option>
</form-input>
</div>
@@ -236,7 +236,7 @@ export default {
selectableRows: 1,
index: 'projektarbeit_id',
persistence:{
columns: true, //persist column layout
columns: ["width", "visible"], //persist column layout
},
persistenceID: 'stv-details-projektarbeit-20260217'
}
@@ -124,7 +124,7 @@ export default {
selectableRows: 1,
index: 'betreuer_id',
persistence:{
columns: true, //persist column layout
columns: ["width", "visible"], //persist column layout
},
persistenceID: 'stv-details-projektbetreuer-20260217'
},
+1 -1
View File
@@ -135,7 +135,7 @@ export default {
persistence: {
sort: true,
page: true,
columns: true,
columns: ["width", "visible"],
filter: false //to avoids js errors
},
persistenceID: 'core-contracts-2026050501',
+2 -1
View File
@@ -136,7 +136,8 @@ export const CoreFilterCmpt = {
selectedData: [],
persistence: {
sort: true,
columns: true,
// Not true: that also stores the title, and the stored title hides a translated header
columns: ["width", "visible"],
filter: false,
headerFilter: false,
group: false,
@@ -9,7 +9,7 @@ function func_tableBuilt(table) {
table.tabulator(
"addColumn",
{
title: "Aktion",
title: FHC_PhrasesLib.t("ui", "aktion"),
align: "center",
width: 150,
formatter: addActionButtons,
@@ -193,7 +193,7 @@ var adminAnrechnung = {
var anrechnungstart = row.getData().anrechnungstart;
var anrechnungende = row.getData().anrechnungende;
$(".modal-header #azrModalLabel").text("Anrechnungszeitraum bearbeiten");
$(".modal-header #azrModalLabel").text(FHC_PhrasesLib.t("anrechnung", "anrechnungszeitraumBearbeiten"));
$(".modal-body #anrechnungszeitraum_id").val(anrechnungszeitraum_id);
$(".modal-body #studiensemester").val(studiensemester_kurzbz).change();
@@ -15,7 +15,7 @@ $(function(){
var canPromise = !! window.Promise;
if(!canPromise)
{
alert("Diese Seite kann mit ihrem Browser nicht angezeigt werden. Bitte verwenden Sie Firefox, Chrome oder Edge um die Seite anzuzeigen");
alert(FHC_PhrasesLib.t("anrechnung", "browserNichtUnterstuetzt"));
window.location.href='about:blank';
return;
}
@@ -630,7 +630,7 @@ var approveAnrechnungDetail = {
){
$('#sumEctsMsg')
.html("<span class='flex-fill fw-bold'>Die Höchstgrenze für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz ist überschritten. </span><i class='mx-4 fa fa-lg fa-info-circle'></i>")
.html("<span class='flex-fill fw-bold'>" + FHC_PhrasesLib.t("anrechnung", "hoechstgrenzeUeberschritten") + " </span><i class='mx-4 fa fa-lg fa-info-circle'></i>")
.addClass('bg-danger-subtle')
.tooltip({
title: FHC_PhrasesLib.t("anrechnung", "anrechnungEctsTooltipTextBeiUeberschreitung"),
@@ -55,7 +55,7 @@ function hf_filterTrueFalse(headerValue, rowValue) {
return rowValue == "false";
}
if ((headerValue = "-")) {
if (headerValue === "-") {
return rowValue == null;
}
}
@@ -73,13 +73,13 @@ function func_tableBuilt(table) {
table.tabulator(
"addColumn",
{
title: "Details",
title: FHC_PhrasesLib.t("global", "details"),
field: "details",
hozAlign: "center",
width: 100,
formatter: "link",
formatterParams: {
label: "Details",
label: FHC_PhrasesLib.t("global", "details"),
url: function (cell) {
return (
BASE_URL +
@@ -173,15 +173,11 @@ var format_ectsSumBisherUndNeu = function (cell, formatterParams, onRendered) {
"</u></b></span>"
: ectsSumBisherUndNeuBeruflich;
return (
"T: " +
ectsSumBisherUndNeuTotal +
" [ S: " +
ectsSumBisherUndNeuSchulisch +
" | B: " +
ectsSumBisherUndNeuBeruflich +
" ]"
);
return FHC_PhrasesLib.t("anrechnung", "ectsSummeKurz", [
ectsSumBisherUndNeuTotal,
ectsSumBisherUndNeuSchulisch,
ectsSumBisherUndNeuBeruflich,
]);
};
// Formats row selectable/unselectable
@@ -244,7 +240,7 @@ function func_tooltips(e, cell, onRendered) {
//onRendered - onRendered callback registration function
// Return tooltip if row is unselectable
if (!func_selectableCheck(cell.getRow())) {
return FHC_PhrasesLib.t("ui", "nichtSelektierbarAufgrundVon") + "Status";
return FHC_PhrasesLib.t("ui", "nichtSelektierbarAufgrundVon") + FHC_PhrasesLib.t("global", "status");
}
}
@@ -317,7 +313,7 @@ $(function () {
var canPromise = !!window.Promise;
if (!canPromise) {
alert(
"Diese Seite kann mit ihrem Browser nicht angezeigt werden. Bitte verwenden Sie Firefox, Chrome oder Edge um die Seite anzuzeigen"
FHC_PhrasesLib.t("anrechnung", "browserNichtUnterstuetzt")
);
window.location.href = "about:blank";
return;
@@ -850,7 +846,7 @@ var approveAnrechnung = {
},
showNumberSelectedRows(rows) {
$("#number-selected").html(
"Ausgewählte Zeilen: <strong>" + rows.length + "</strong>"
FHC_PhrasesLib.t("ui", "ausgewaehlteZeilen") + ": <strong>" + rows.length + "</strong>"
);
},
};
@@ -170,7 +170,11 @@ var createAnrechnung = {
// Append Lehrveranstaltungen
for (let lv of lehrveranstaltungen){
$('#select-lehrveranstaltung').append('<option value="'+ lv.lehrveranstaltung_id +'">'+ lv.bezeichnung +'</option>');
// English name only if the LV has one
let bezeichnung = FHC_JS_DATA_STORAGE_OBJECT.user_language != 'German' && lv.bezeichnung_english
? lv.bezeichnung_english
: lv.bezeichnung;
$('#select-lehrveranstaltung').append('<option value="'+ lv.lehrveranstaltung_id +'">'+ bezeichnung +'</option>');
}
}
},
@@ -181,9 +181,10 @@ var requestAnrechnung = {
const anrechnung_id = $('#requestAnrechnung-sperre').data('anrechnung_id');
const is_expired = $('#requestAnrechnung-sperre').data('expired');
const is_blocked = $('#requestAnrechnung-sperre').data('blocked');
const is_not_in_studienplan = $('#requestAnrechnung-sperre').data('not_in_studienplan');
// If Deadline is expired or is blocked by grades of LV, AND not already angerechnet
if ((is_expired || is_blocked) && anrechnung_id == '')
// If Deadline is expired, LV is blocked by grades or LV is not in the Studienplan, AND not already angerechnet
if ((is_expired || is_blocked || is_not_in_studienplan) && anrechnung_id == '')
{
// Hide status panel
$('#requestAnrechnung-status').hide();
@@ -194,7 +195,10 @@ var requestAnrechnung = {
.html(function(){
let sperregrund = FHC_PhrasesLib.t('global', 'bearbeitungGesperrt') + ': ';
if (is_expired) {
if (is_not_in_studienplan) {
sperregrund += FHC_PhrasesLib.t('anrechnung', 'lvNichtImStudienplan');
}
else if (is_expired) {
sperregrund += FHC_PhrasesLib.t('anrechnung', 'deadlineUeberschritten');
}
else if (is_blocked){
@@ -294,7 +298,7 @@ var requestAnrechnung = {
)
{
$('#requestAnrechnung-maxEctsUeberschrittenMsg')
.html("<span class='flex-fill fw-bold'>Die Höchstgrenze für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz ist überschritten. </span><i class='mx-4 fa fa-lg fa-info-circle'></i>")
.html("<span class='flex-fill fw-bold'>" + FHC_PhrasesLib.t("anrechnung", "hoechstgrenzeUeberschritten") + " </span><i class='mx-4 fa fa-lg fa-info-circle'></i>")
.addClass('bg-danger-subtle')
.tooltip({
title: FHC_PhrasesLib.t("anrechnung", "anrechnungEctsTooltipTextBeiUeberschreitung"),
@@ -351,11 +355,12 @@ var requestAnrechnung = {
},
getMsgBeiEctsUeberschreitung: function(begruendung_id, ects, sumEctsSchulisch, sumEctsBeruflich){
const phraseUsed = '<span class="d-block">Die Höchstgrenze für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz wird überschritten.</span><span class=" fw-bold">Bisherige ECTS + ECTS dieser LV: Total: {0} [ Schulisch: {1} | Beruflich: {2} ]</span>&emsp;';
return $('<div class="p-1" id="sumEctsMsg"></div>')
.html(phraseUsed) // schulisch
.append('<i class="fa fa-lg fa-info-circle"></i>')
.html(FHC_PhrasesLib.t("anrechnung", "anrechnungEctsTextBeiUeberschreitung",
begruendung_id == 4
? [(sumEctsSchulisch + sumEctsBeruflich + ects), sumEctsSchulisch, (sumEctsBeruflich + ects)] // beruflich
: [(sumEctsSchulisch + sumEctsBeruflich + ects), (sumEctsSchulisch + ects), sumEctsBeruflich])) // schulisch
.append('&emsp;<i class="fa fa-lg fa-info-circle"></i>')
.addClass('bg-danger-subtle')
.tooltip({
title: FHC_PhrasesLib.t("anrechnung", "anrechnungEctsTooltipTextBeiUeberschreitung"),
@@ -16,7 +16,7 @@ $(function(){
var canPromise = !! window.Promise;
if(!canPromise)
{
alert("Diese Seite kann mit ihrem Browser nicht angezeigt werden. Bitte verwenden Sie Firefox, Chrome oder Edge um die Seite anzuzeigen");
alert(FHC_PhrasesLib.t("anrechnung", "browserNichtUnterstuetzt"));
window.location.href='about:blank';
return;
}
@@ -48,7 +48,7 @@ function hf_filterTrueFalse(headerValue, rowValue) {
return rowValue == "false";
}
if ((headerValue = "-")) {
if (headerValue === "-") {
return rowValue == null;
}
}
@@ -63,13 +63,13 @@ function func_tableBuilt(table) {
table.tabulator(
"addColumn",
{
title: "Details",
title: FHC_PhrasesLib.t("global", "details"),
field: "details",
align: "center",
width: 100,
formatter: "link",
formatterParams: {
label: "Details",
label: FHC_PhrasesLib.t("global", "details"),
url: function (cell) {
return (
BASE_URL +
@@ -122,7 +122,7 @@ function func_tooltips(e, cell, onRendered) {
// Return tooltip if row is unselectable
if (!func_selectableCheck(cell.getRow())) {
return FHC_PhrasesLib.t("ui", "nichtSelektierbarAufgrundVon") + "Status";
return FHC_PhrasesLib.t("ui", "nichtSelektierbarAufgrundVon") + FHC_PhrasesLib.t("global", "status");
}
}
@@ -175,7 +175,7 @@ $(function () {
var canPromise = !!window.Promise;
if (!canPromise) {
alert(
"Diese Seite kann mit ihrem Browser nicht angezeigt werden. Bitte verwenden Sie Firefox, Chrome oder Edge um die Seite anzuzeigen"
FHC_PhrasesLib.t("anrechnung", "browserNichtUnterstuetzt")
);
window.location.href = "about:blank";
return;
+6 -2
View File
@@ -102,6 +102,9 @@ require_once('dbupdate_3.4/75959_StudVw_Automatische_Tags.php');
require_once('dbupdate_3.4/76160_lvv_favorites.php');
require_once('dbupdate_3.4/77080_tabulator_presets_table.php');
require_once('dbupdate_3.4/78292_gehaltsanpassungtyp.php');
require_once('dbupdate_3.4/54225_reihungstest_ablauf_fuer_quereinsteiger.php');
require_once('dbupdate_3.4/77757_widgets_berechtigungen.php');
require_once('dbupdate_3.4/83598_anrechnung_begruendung_mehrsprachig.php');
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
echo '<H2>Pruefe Tabellen und Attribute!</H2>';
@@ -253,7 +256,7 @@ $tabellen=array(
"hr.tbl_lohnguide_modellfunktion" => array("modellfunktion_kurzbz", "bezeichnung", "jobfamilie_kurzbz", "aktiv", "sort", "insertvon", "insertamum", "updatevon", "updateamum"),
"hr.tbl_lohnguide_modellstelle" => array("modellstelle_kurzbz", "bezeichnung", "grade", "modellfunktion_kurzbz", "aktiv", "sort", "insertvon", "insertamum", "updatevon", "updateamum"),
"hr.tbl_lohnguide_fachrichtung" => array("fachrichtung_kurzbz", "bezeichnung", "aktiv", "insertvon", "insertamum", "updatevon", "updateamum"),
"hr.tbl_vertragsbestandteil_lohnguide" => array("vertragsbestandteil_id", "stellenbezeichnung", "vordienstzeit", "fachrichtung_kurzbz", "modellstelle_kurzbz", "kommentar_person", "kommentar_modellstelle"),
"hr.tbl_vertragsbestandteil_lohnguide" => array("vertragsbestandteil_id", "stellenbezeichnung", "vordienstzeit", "fachrichtung_kurzbz", "modellstelle_kurzbz", "kommentar_person", "kommentar_modellstelle"),
"lehre.tbl_abschlussbeurteilung" => array("abschlussbeurteilung_kurzbz","bezeichnung","bezeichnung_english","sort"),
"lehre.tbl_abschlusspruefung" => array("abschlusspruefung_id","student_uid","vorsitz","pruefer1","pruefer2","pruefer3","abschlussbeurteilung_kurzbz","akadgrad_id","pruefungstyp_kurzbz","datum","uhrzeit","sponsion","anmerkung","updateamum","updatevon","insertamum","insertvon","ext_id","note","protokoll","endezeit","pruefungsantritt_kurzbz","freigabedatum"),
"lehre.tbl_abschlusspruefung_antritt" => array("pruefungsantritt_kurzbz","bezeichnung","bezeichnung_english","sort"),
@@ -261,7 +264,7 @@ $tabellen=array(
"lehre.tbl_anrechnung" => array("anrechnung_id","prestudent_id","lehrveranstaltung_id","begruendung_id","lehrveranstaltung_id_kompatibel","genehmigt_von","insertamum","insertvon","updateamum","updatevon","ext_id", "dms_id", "studiensemester_kurzbz", "anmerkung_student", "empfehlung_anrechnung", "begruendung_ects", "begruendung_lvinhalt"),
"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_anrechnung_begruendung" => array("begruendung_id","bezeichnung","bezeichnung_mehrsprachig"),
"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"),
@@ -421,6 +424,7 @@ $tabellen=array(
"testtool.tbl_pruefling_frage" => array("prueflingfrage_id","pruefling_id","frage_id","nummer","begintime","endtime"),
"testtool.tbl_frage_sprache" => array("frage_id","sprache","text","bild","audio","insertamum","insertvon","updateamum","updatevon"),
"testtool.tbl_vorschlag_sprache" => array("vorschlag_id","sprache","text","bild","audio","insertamum","insertvon","updateamum","updatevon"),
"testtool.tbl_pruefling_gebiet" => array("prueflinggebiet_id","pruefling_id","gebiet_id","insertamum"),
"system.tbl_app" => array("app"),
"system.tbl_appdaten" => array("appdaten_id","uid","app","appversion","version","bezeichnung","daten","freigabe","insertamum","insertvon","updateamum","updatevon"),
"system.tbl_cronjob" => array("cronjob_id","server_kurzbz","titel","beschreibung","file","last_execute","aktiv","running","jahr","monat","tag","wochentag","stunde","minute","standalone","reihenfolge","updateamum", "updatevon","insertamum","insertvon","variablen"),
@@ -0,0 +1,41 @@
<?php
if (! defined('DB_NAME')) exit('No direct script access allowed');
// Creates table public.tbl_notiz_typ if it doesn't exist and grants privileges
if (!$result = @$db->db_query('SELECT 1 FROM testtool.tbl_pruefling_gebiet LIMIT 1'))
{
$qry = 'CREATE TABLE testtool.tbl_pruefling_gebiet
(
prueflinggebiet_id integer NOT NULL,
pruefling_id integer NOT NULL,
gebiet_id integer NOT NULL,
insertamum timestamp DEFAULT now()
);
ALTER TABLE testtool.tbl_pruefling_gebiet OWNER TO fhcomplete;
ALTER TABLE testtool.tbl_pruefling_gebiet ADD CONSTRAINT pk_tbl_pruefling_gebiet PRIMARY KEY (prueflinggebiet_id);
ALTER TABLE testtool.tbl_pruefling_gebiet ADD CONSTRAINT fk_tbl_pruefling_gebiet_pruefling_id FOREIGN KEY (pruefling_id) REFERENCES testtool.tbl_pruefling(pruefling_id) ON UPDATE CASCADE ON DELETE RESTRICT;
ALTER TABLE testtool.tbl_pruefling_gebiet ADD CONSTRAINT fk_tbl_pruefling_gebiet_gebiet_id FOREIGN KEY (gebiet_id) REFERENCES testtool.tbl_gebiet(gebiet_id) ON UPDATE CASCADE ON DELETE RESTRICT;
CREATE SEQUENCE testtool.tbl_pruefling_gebiet_prueflinggebiet_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE testtool.tbl_pruefling_gebiet_prueflinggebiet_id_seq OWNER TO fhcomplete;
ALTER TABLE testtool.tbl_pruefling_gebiet ALTER COLUMN prueflinggebiet_id SET DEFAULT nextval(\'testtool.tbl_pruefling_gebiet_prueflinggebiet_id_seq\');
GRANT SELECT, UPDATE, INSERT, DELETE ON testtool.tbl_pruefling_gebiet TO web;
GRANT SELECT, UPDATE, INSERT, DELETE ON testtool.tbl_pruefling_gebiet TO vilesci;
GRANT SELECT, UPDATE ON testtool.tbl_pruefling_gebiet_prueflinggebiet_id_seq TO vilesci;
GRANT SELECT, UPDATE ON testtool.tbl_pruefling_gebiet_prueflinggebiet_id_seq TO web;
';
if (!$db->db_query($qry))
echo '<strong>public.tbl_pruefling_gebiet: '.$db->db_last_error().'</strong><br>';
else
echo '<br>public.tbl_pruefling_gebiet table created';
}
@@ -0,0 +1,57 @@
<?php
/* Copyright (C) 2026 fhcomplete.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* Beschreibung:
* Dashboard Widgets: Verknüpfung einer (einzelnen) Berechtigung pro Widget.
* Neue Spalte dashboard.tbl_widget.berechtigung_kurzbz mit FK auf
* system.tbl_berechtigung. Ist die Spalte NULL, erfordert das Widget keine
* gesonderte Berechtigung. Benutzer denen die verknüpfte Berechtigung fehlt,
* bekommen das Widget nicht mehr zur Auswahl angezeigt bzw. sehen (falls bereits
* am Dashboard) einen "Fehlende Berechtigung"-Screen.
*/
if (! defined('DB_NAME')) exit('No direct script access allowed');
// Add column dashboard.tbl_widget.berechtigung_kurzbz (FK => system.tbl_berechtigung)
if ($result = @$db->db_query("
SELECT 1
FROM information_schema.columns
WHERE table_schema = 'dashboard'
AND table_name = 'tbl_widget'
AND column_name = 'berechtigung_kurzbz';"))
{
if ($db->db_num_rows($result) == 0)
{
$qry = "
ALTER TABLE dashboard.tbl_widget
ADD COLUMN berechtigung_kurzbz VARCHAR(32) NULL;
ALTER TABLE dashboard.tbl_widget
ADD CONSTRAINT tbl_widget_berechtigung_fk
FOREIGN KEY (berechtigung_kurzbz)
REFERENCES system.tbl_berechtigung (berechtigung_kurzbz)
ON UPDATE CASCADE ON DELETE SET NULL;";
if (!$db->db_query($qry))
{
echo '<strong>dashboard.tbl_widget: '.$db->db_last_error().'</strong><br>';
}
else
{
echo 'dashboard.tbl_widget: Spalte berechtigung_kurzbz (FK system.tbl_berechtigung) hinzugefuegt<br>';
}
}
}
@@ -0,0 +1,31 @@
<?php
if (! defined('DB_NAME')) exit('No direct script access allowed');
// Add multilingual name to Anrechnung Begruendung (German, English)
if ($result = $db->db_query("SELECT 1 FROM information_schema.columns WHERE table_schema = 'lehre' AND table_name = 'tbl_anrechnung_begruendung' AND column_name = 'bezeichnung_mehrsprachig'"))
{
if ($db->db_num_rows($result) == 0)
{
// Unknown names keep the German name as English name
$qry = "
ALTER TABLE lehre.tbl_anrechnung_begruendung ADD COLUMN bezeichnung_mehrsprachig character varying(128)[];
UPDATE lehre.tbl_anrechnung_begruendung SET bezeichnung_mehrsprachig = ARRAY[
bezeichnung,
CASE bezeichnung
WHEN 'schulisches Zeugnis' THEN 'school certificate'
WHEN 'kompatible Lehrveranstaltung' THEN 'compatible course'
WHEN 'Prüfung' THEN 'examination'
WHEN 'berufliche Praxis' THEN 'professional practice'
WHEN 'Hochschulzeugnis' THEN 'university certificate'
ELSE bezeichnung
END
];
";
if (!$db->db_query($qry))
echo '<strong>lehre.tbl_anrechnung_begruendung: ' . $db->db_last_error() . '</strong><br>';
else
echo '<br>lehre.tbl_anrechnung_begruendung: Spalte bezeichnung_mehrsprachig hinzugefuegt';
}
}
+646 -6
View File
@@ -13216,7 +13216,7 @@ Any unusual occurrences
),
array(
'sprache' => 'English',
'text' => 'Sum of previous recognized ECTS. Lateral Entries are considered with ECTS of the recognized semester.<br><br>Maximum ECTS limits are applied since Octobre 2021:<br><br>max. 60 ECTS school qualification (BHS and AHS only)<br>max. 60 ECTS professional qualification<br>max. 90 ECTS OVERALL for school and professional qualification',
'text' => 'Sum of previous recognized ECTS. Lateral Entries are considered with ECTS of the recognized semester.<br><br>Maximum ECTS limits are applied since October 2021:<br><br>max. 60 ECTS school qualification (BHS and AHS only)<br>max. 60 ECTS professional qualification<br>max. 90 ECTS OVERALL for school and professional qualification',
'description' => '',
'insertvon' => 'system'
)
@@ -13236,7 +13236,7 @@ Any unusual occurrences
),
array(
'sprache' => 'English',
'text' => 'Maximum ECTS limits are applied since Octobre 2021:<br>max. 60 ECTS school qualification (BHS and AHS only)<br>max. 60 ECTS professional qualification<br>max. 90 ECTS OVERALL for school and professional qualification',
'text' => 'Maximum ECTS limits are applied since October 2021:<br>max. 60 ECTS school qualification (BHS and AHS only)<br>max. 60 ECTS professional qualification<br>max. 90 ECTS OVERALL for school and professional qualification',
'description' => '',
'insertvon' => 'system'
)
@@ -13250,13 +13250,533 @@ Any unusual occurrences
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Die Höchstgrenze für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz wird überschritten.<span class="fw-bold">Bisherige ECTS + ECTS dieser LV: Total: {0} [ Schulisch: {1} | Beruflich: {2} ]</span>',
'text' => '<span class="d-block">Die Höchstgrenze für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz wird überschritten.</span><span class="fw-bold">Bisherige ECTS + ECTS dieser LV: Total: {0} [ Schulisch: {1} | Beruflich: {2} ]</span>',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => '<br>Exceedance of maximum limit for exemption (see § 12 para. 3, Regulations of the UASTW).<br><b>Former ECTS + ECTS of this course: Total: {0} [ School qualification: {1} | Professional qualification: {2} ]</b> ',
'text' => '<span class="d-block">Exceedance of maximum limit for exemption (see § 12 para. 3, Regulations of the UASTW).</span><span class="fw-bold">Former ECTS + ECTS of this course: Total: {0} [ School qualification: {1} | Professional qualification: {2} ]</span>',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'hoechstgrenzeUeberschritten',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Die Höchstgrenze für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz ist überschritten.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'The maximum limit for exemption (see § 12 para. 3, Regulations of the UASTW) is exceeded.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'totalEcts',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Total ECTS',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Total ECTS',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'schulisch',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Schulisch',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'School qualification',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'beruflich',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Beruflich',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Professional qualification',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'browserNichtUnterstuetzt',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Diese Seite kann mit ihrem Browser nicht angezeigt werden. Bitte verwenden Sie Firefox, Chrome oder Edge um die Seite anzuzeigen',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'This page cannot be displayed in your browser. Please use Firefox, Chrome or Edge to display the page',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'ectsSummeKurz',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'T: {0} [ S: {1} | B: {2} ]',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'T: {0} [ S: {1} | P: {2} ]',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'schreibberechtigt',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Schreibberechtigt',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Write access',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'empfehlungsberechtigt',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Empfehlungsberechtigt',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Entitled to recommend',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'ectsLv',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'ECTS (LV)',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'ECTS (course)',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'ectsLvUndBisher',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'ECTS (LV + Bisher)',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'ECTS (course + previous)',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'ectsBisherSchulisch',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'ECTS (Bisher schulisch)',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'ECTS (previous school qualification)',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'ectsBisherBeruflich',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'ECTS (Bisher beruflich)',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'ECTS (previous professional qualification)',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'anrechnungszeitraumBearbeiten',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Anrechnungszeitraum bearbeiten',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Edit application period',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'fehlerDatenuebertragung',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Fehler beim Übertragen der Daten.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Error while transferring the data.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'keineAnrechnungenGenehmigt',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Es wurden keine Anrechnungen genehmigt.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'No applications have been approved.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'keineAnrechnungenAbgelehnt',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Es wurden keine Anrechnungen abgelehnt.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'No applications have been rejected.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'empfehlungNichtAngefordert',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Empfehlung wurde nicht angefordert.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Recommendation has not been requested.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'keineEmpfehlungenAngefordert',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Es wurden keine Empfehlungen angefordert.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'No recommendations have been requested.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'lvHatKeineLektoren',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Der LV sind keine LektorInnen zugeteilt.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'No lecturers are assigned to the course.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'lvsOhneLektoren',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Bei {0} LV sind keine LektorInnen zugeteilt.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'No lecturers are assigned to {0} courses.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'keineEmpfehlungZumZuruecknehmen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Es gibt keine Empfehlungsanforderung zum Zurücknehmen.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'There is no request for recommendation to withdraw.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'antragNichtZurueckgenommen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Der Antrag konnte nicht zurückgenommen werden.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'The application could not be withdrawn.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'lvNichtImStudienplan',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Diese Lehrveranstaltung ist nicht Teil Ihres Studienplans. Wenn Sie mehrere Studiengänge studieren, melden Sie sich mit dem Account des passenden Studiengangs an. Sonst wenden Sie sich an Ihre Studiengangsassistenz.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'This course is not part of your study plan. If you study more than one degree program, log in with the account of the matching degree program. Otherwise, contact your degree program assistant.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'lvNichtZugeteilt',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Die Lehrveranstaltung ist diesem Account nicht zugeteilt.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'The course is not assigned to this account.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'keineGenehmigungZumZuruecknehmen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Es gibt keine Genehmigung oder Ablehnung zum Zurücknehmen. Der Antrag ist noch in Bearbeitung.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'There is no approval or rejection to withdraw. The application is still in progress.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'fehlerBeimLoeschen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Fehler beim Löschen',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Error while deleting',
'description' => '',
'insertvon' => 'system'
)
@@ -14848,7 +15368,7 @@ Any unusual occurrences
),
array(
'sprache' => 'English',
'text' => 'Set appplication period',
'text' => 'Set application period',
'description' => '',
'insertvon' => 'system'
)
@@ -14868,7 +15388,7 @@ Any unusual occurrences
),
array(
'sprache' => 'English',
'text' => 'Add appplication period',
'text' => 'Add application period',
'description' => '',
'insertvon' => 'system'
)
@@ -19829,6 +20349,26 @@ array(
)
)
),
array(
'app' => 'international',
'category' => 'international',
'phrase' => 'massnahmeneinmalig',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Diese Maßnahme ist nur einmalig planbar.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'This measure may only be planned once.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'international',
'category' => 'international',
@@ -20609,6 +21149,26 @@ array(
)
)
),
array(
'app' => 'international',
'category' => 'international',
'phrase' => 'personenMassnahmen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'alle Maßnahmen der Personen',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => ' all measures of the people',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'international',
'category' => 'international',
@@ -20689,6 +21249,46 @@ array(
)
)
),
array(
'app' => 'international',
'category' => 'international',
'phrase' => 'einmalig',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Nur einmal planbar',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'One-time only',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'international',
'category' => 'international',
'phrase' => 'erroreinmalig',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Diese Maßnahme kann nur einmal geplant werden',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'This measure can only be planned once.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'gruppenmanagement',
@@ -29363,6 +29963,26 @@ array(
)
)
),
array(
'app' => 'core',
'category' => 'profil',
'phrase' => 'fhAusweisStatusNichtAusgegeben',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Der FH Ausweis wurde noch nicht ausgegeben.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'The FH ID card has not been issued yet.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'profil',
@@ -49520,6 +50140,26 @@ array(
)
)
),
array(
'app' => 'core',
'category' => 'dashboard',
'phrase' => 'widget_missing_permission',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Ihnen fehlt die erforderliche Berechtigung, um dieses Widget anzuzeigen.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'You do not have the permission required to display this widget.',
'description' => '',
'insertvon' => 'system'
)
)
),
// CIS4 phrases from legacy code end
// FHC4 Phrases Abschlusspruefung
array(
@@ -1,9 +1,9 @@
INSERT INTO lehre.tbl_projektarbeit
(projektarbeit_id, projekttyp_kurzbz, titel, lehreinheit_id, student_uid, firma_id, note, punkte, beginn, ende, faktor, freigegeben, gesperrtbis, stundensatz, themenbereich, anmerkung, updateamum, updatevon, insertamum, insertvon, ext_id, gesamtstunden, titel_english, sprache, seitenanzahl, abgabedatum, kontrollschlagwoerter, schlagwoerter, schlagwoerter_en, abstract, abstract_en, "final") VALUES
(1, 'Bachelor', 'Auswirkung der Sonneneinstrahlung auf die Gesundheit', 46111, 's46b413', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true),
(2, 'Bachelor', 'Neue Unterrichtsmethoden mit KI', 46111, 's46b414', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true),
(3, 'Bachelor', 'Betrugsbekämpfung bei Anwesenheitskontrolle', 46111, 's46b415', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true),
(4, 'Bachelor', 'Neuronale Netze', 46111, 's46b416', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true)
(projektarbeit_id, projekttyp_kurzbz, titel, lehreinheit_id, student_uid, firma_id, note, punkte, beginn, ende, faktor, freigegeben, gesperrtbis, stundensatz, themenbereich, anmerkung, updateamum, updatevon, insertamum, insertvon, ext_id, gesamtstunden, titel_english, sprache, seitenanzahl, abgabedatum, kontrollschlagwoerter, schlagwoerter, schlagwoerter_en, abstract, abstract_en, "final", lehrveranstaltung_id, studiensemester_kurzbz) VALUES
(1, 'Bachelor', 'Auswirkung der Sonneneinstrahlung auf die Gesundheit', 46111, 's46b413', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, 4611, NearestWintersemester(1)),
(2, 'Bachelor', 'Neue Unterrichtsmethoden mit KI', 46111, 's46b414', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, 4611, NearestWintersemester(1)),
(3, 'Bachelor', 'Betrugsbekämpfung bei Anwesenheitskontrolle', 46111, 's46b415', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, 4611, NearestWintersemester(1)),
(4, 'Bachelor', 'Neuronale Netze', 46111, 's46b416', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, 4611, NearestWintersemester(1))
;
INSERT INTO lehre.tbl_projektbetreuer
+55 -2
View File
@@ -251,6 +251,31 @@ if ($deleteSingleResult)
exit();
}
$qry = "SELECT * FROM testtool.tbl_pruefling_gebiet
WHERE pruefling_id=" . $db->db_add_param($pruefling->pruefling_id) . " AND gebiet_id=" . $db->db_add_param($_POST['gebiet_id']) . "";
if ($db->db_query($qry))
{
while ($row = $db->db_fetch_object())
{
$undo .= " INSERT INTO testtool.tbl_pruefling_gebiet(prueflinggebiet_id,pruefling_id,gebiet_id, insertamum) VALUES (" .
$db->db_add_param($row->prueflinggebiet_id, FHC_INTEGER) . ', ' .
$db->db_add_param($row->pruefling_id, FHC_INTEGER) . ', ' .
$db->db_add_param($row->gebiet_id, FHC_INTEGER) . ', ' .
$db->db_add_param($row->insertamum) . ');';
}
}
else
{
$db->db_query('ROLLBACK');
echo json_encode(array(
'status' => 'fehler',
'msg' => 'Fehler beim Erstellen des UNDO Befehls fuer testtool.tbl_pruefling_gebiet'
));
exit();
}
//Antworten loeschen
$qry = "DELETE FROM testtool.tbl_pruefling_frage where pruefling_id=" . $db->db_add_param($pruefling->pruefling_id, FHC_INTEGER) . " AND
frage_id IN (SELECT frage_id FROM testtool.tbl_frage WHERE gebiet_id=" . $db->db_add_param($_POST['gebiet_id']) . ");
@@ -258,7 +283,9 @@ if ($deleteSingleResult)
DELETE FROM testtool.tbl_antwort
WHERE pruefling_id=" . $db->db_add_param($pruefling->pruefling_id) . " AND
vorschlag_id IN (SELECT vorschlag_id FROM testtool.tbl_vorschlag WHERE frage_id IN
(SELECT frage_id FROM testtool.tbl_frage WHERE gebiet_id=" . $db->db_add_param($_POST['gebiet_id']) . "));";
(SELECT frage_id FROM testtool.tbl_frage WHERE gebiet_id=" . $db->db_add_param($_POST['gebiet_id']) . "));
DELETE FROM testtool.tbl_pruefling_gebiet where pruefling_id=" . $db->db_add_param($pruefling->pruefling_id, FHC_INTEGER) . " AND gebiet_id=" . $db->db_add_param($_POST['gebiet_id']) . ";";
if ($result = $db->db_query($qry))
{
@@ -388,9 +415,35 @@ if ($deleteAllResults)
exit();
}
$qry = "SELECT * FROM testtool.tbl_pruefling_gebiet WHERE pruefling_id=" . $db->db_add_param($pruefling->pruefling_id, FHC_INTEGER) . ";
";
if ($db->db_query($qry))
{
while ($row = $db->db_fetch_object())
{
$undo .= " INSERT INTO testtool.tbl_pruefling_gebiet(prueflinggebiet_id,pruefling_id,gebiet_id,insertamum) VALUES (" .
$db->db_add_param($row->prueflinggebiet_id, FHC_INTEGER) . ', ' .
$db->db_add_param($row->pruefling_id, FHC_INTEGER) . ', ' .
$db->db_add_param($row->gebiet_id, FHC_INTEGER) . ', ' .
$db->db_add_param($row->insertamum) . ');';
}
}
else
{
$db->db_query('ROLLBACK');
echo json_encode(array(
'status' => 'fehler',
'msg' => 'Fehler beim Erstellen des UNDO Befehls fuer testtool.tbl_pruefling_gebiet'
));
exit();
}
//Antworten loeschen
$qry = " DELETE FROM testtool.tbl_pruefling_frage where pruefling_id=".$db->db_add_param($pruefling->pruefling_id).";
DELETE FROM testtool.tbl_antwort WHERE pruefling_id=".$db->db_add_param($pruefling->pruefling_id).";";
DELETE FROM testtool.tbl_antwort where pruefling_id=".$db->db_add_param($pruefling->pruefling_id).";
DELETE FROM testtool.tbl_pruefling_gebiet WHERE pruefling_id=".$db->db_add_param($pruefling->pruefling_id).";";
if ($result = $db->db_query($qry))
{
@@ -402,7 +402,10 @@ if(isset($_POST['deleteteilgebiet']))
DELETE FROM testtool.tbl_antwort
WHERE pruefling_id=".$db->db_add_param($pruefling->pruefling_id)." AND
vorschlag_id IN (SELECT vorschlag_id FROM testtool.tbl_vorschlag WHERE frage_id IN
(SELECT frage_id FROM testtool.tbl_frage WHERE gebiet_id=".$db->db_add_param($_POST['gebiet'])."));";
(SELECT frage_id FROM testtool.tbl_frage WHERE gebiet_id=".$db->db_add_param($_POST['gebiet'])."));
DELETE FROM testtool.tbl_pruefling_gebiet
WHERE pruefling_id=".$db->db_add_param($pruefling->pruefling_id)." AND gebiet_id=".$db->db_add_param($_POST['gebiet']).";";
if($result = $db->db_query($qry))
{
@@ -497,7 +500,8 @@ if(isset($_POST['delete_all']))
}
//Gebiet loeschen
$qry = "DELETE FROM testtool.tbl_pruefling_frage where pruefling_id=".$db->db_add_param($pruefling->pruefling_id).";
DELETE FROM testtool.tbl_antwort WHERE pruefling_id=".$db->db_add_param($pruefling->pruefling_id).";";
DELETE FROM testtool.tbl_antwort WHERE pruefling_id=".$db->db_add_param($pruefling->pruefling_id).";
DELETE FROM testtool.tbl_pruefling_gebiet WHERE pruefling_id=".$db->db_add_param($pruefling->pruefling_id).";";
if($result = $db->db_query($qry))
{