diff --git a/application/config/navigation.php b/application/config/navigation.php
index 11fd1a3a6..bb6cc50ba 100644
--- a/application/config/navigation.php
+++ b/application/config/navigation.php
@@ -336,3 +336,18 @@ $config['navigation_menu']['system/issues/Issues/*'] = array(
'requiredPermissions' => array('admin:rw')
),
);
+
+$config['navigation_menu']['apps'] = [
+ 'stv' => [
+ 'link' => site_url('studentenverwaltung'),
+ 'description' => 'Studierendenverwaltung',
+ #'icon' => 'users',
+ 'requiredPermissions' => array('admin:r', 'assistenz:r')
+ ],
+ 'lvv' => [
+ 'link' => site_url('lVVerwaltung'),
+ 'description' => 'LV Verwaltung',
+ #'icon' => 'person-chalkboard',
+ 'requiredPermissions' => array('admin:r', 'assistenz:r')
+ ]
+];
diff --git a/application/config/routes.php b/application/config/routes.php
index de8e6e098..eba6688ff 100644
--- a/application/config/routes.php
+++ b/application/config/routes.php
@@ -1,6 +1,6 @@
my_controller/my_method
*/
$route['default_controller'] = defined('CIS4') && CIS4 ? 'Cis4' : 'Vilesci';
-$route['translate_uri_dashes'] = FALSE;
+$route['translate_uri_dashes'] = false;
// Class name conflicts
$route['api/v1/organisation/[S|s]tudiengang/(:any)'] = 'api/v1/organisation/studiengang2/$1';
@@ -71,9 +71,9 @@ $route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv
// (studiensemester_kurzbz)/inout[/(incoming|outgoing|gemeinsamestudien)]
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout'] = 'api/frontend/v1/stv/Students/index';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/incoming'] = 'api/frontend/v1/stv/Students/getIncoming';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/outgoing'] = 'api/frontend/v1/stv/Students/getOutgoing';
-$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/gemeinsamestudien'] = 'api/frontend/v1/stv/Students/getGemeinsamestudien';
+$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/incoming'] = 'api/frontend/v1/stv/Students/getIncoming/$1';
+$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/outgoing'] = 'api/frontend/v1/stv/Students/getOutgoing/$1';
+$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/gemeinsamestudien'] = 'api/frontend/v1/stv/Students/getGemeinsamestudien/$1';
// (studiengang_kz)/prestudent[/(studiensemester_kurzbz)[/(filter)[/(otherfilter)]]]
$route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent'] = 'api/frontend/v1/stv/Students/getPrestudents/$1';
diff --git a/application/config/searchfunctions.php b/application/config/searchfunctions.php
index 276652997..ddf7692d5 100644
--- a/application/config/searchfunctions.php
+++ b/application/config/searchfunctions.php
@@ -29,7 +29,7 @@ $config['similar'] = [
$config['vector'] = [
'priority' => 1,
- 'rank' => "ts_rank({field}, to_tsquery('simple', {word}))",
- 'compare' => "to_tsquery('simple', {word}) @@ {field}"
+ 'rank' => "ts_rank({field}, plainto_tsquery('simple', {word}))",
+ 'compare' => "plainto_tsquery('simple', {word}) @@ {field}"
];
diff --git a/application/config/searchstv.php b/application/config/searchstv.php
index 96c118ac8..d507f7250 100644
--- a/application/config/searchstv.php
+++ b/application/config/searchstv.php
@@ -7,5 +7,43 @@ $CI =& get_instance();
$config['student'] = $CI->config->item('student', 'search');
+$config['student']['searchfields']['pkz'] = [
+ 'alias' => ['personenkennzeichen', 'personalid'],
+ 'comparison' => 'equals',
+ 'field' => 'matrikelnr'
+];
+$config['student']['searchfields']['matrnr'] = [
+ 'alias' => ['matrikelnr', 'matrikelnummer', 'matrno', 'matriculationno', 'matriculationnumber', 'studno', 'studentno', 'studentnumber'],
+ 'comparison' => 'equals',
+ 'field' => 'matr_nr',
+ 'join' => [
+ [
+ 'table' => "public.tbl_prestudent",
+ 'using' => "prestudent_id"
+ ],
+ [
+ 'table' => "public.tbl_person",
+ 'using' => "person_id"
+ ]
+ ]
+];
$config['prestudent'] = $CI->config->item('prestudent', 'search');
+$config['prestudent']['searchfields']['pkz'] = [
+ 'alias' => ['personenkennzeichen', 'personalid'],
+ 'comparison' => 'equals',
+ 'field' => 'matrikelnr',
+ 'join' => [
+ 'table' => "public.tbl_student",
+ 'using' => "prestudent_id"
+ ]
+];
+$config['prestudent']['searchfields']['matrnr'] = [
+ 'alias' => ['matrikelnr', 'matrikelnummer', 'matrno', 'matriculationno', 'matriculationnumber', 'studno', 'studentno', 'studentnumber'],
+ 'comparison' => 'equals',
+ 'field' => 'matr_nr',
+ 'join' => [
+ 'table' => "public.tbl_person",
+ 'using' => "person_id"
+ ]
+];
diff --git a/application/config/stv.php b/application/config/stv.php
index 42afc318c..e03c00084 100644
--- a/application/config/stv.php
+++ b/application/config/stv.php
@@ -63,7 +63,7 @@ $config['tabs'] =
'showCountNotes' => true
]
];
-
+
// List of fields to show when ZGV_DOKTOR_ANZEIGEN is defined
$fieldsZgvDoktor = ['zgvdoktorort', 'zgvdoktordatum', 'zgvdoktornation', 'zgvdoktor_erfuellt', 'zgvdoktor_code'];
@@ -84,6 +84,11 @@ if (!defined('ZGV_DOKTOR_ANZEIGEN') || !ZGV_DOKTOR_ANZEIGEN) {
);
}
+$config['tabs']['projektarbeit']['defaultProjektbetreuerStunden'] = '4.0';
+$config['tabs']['projektarbeit']['defaultProjektbetreuerStundenDiplom'] = '5.0';
+$config['tabs']['projektarbeit']['lvLektroinnenzuteilungFixangestelltStundensatz'] = true;
+$config['tabs']['projektarbeit']['defaultProjektbetreuerStundensatz'] = '80.0';
+
$config['student_tab_order'] = [
'details',
'notes',
@@ -97,6 +102,7 @@ $config['student_tab_order'] = [
'grades',
'exam',
'exemptions',
+ 'projektarbeit',
'finalexam',
'mobility',
'jointstudies',
diff --git a/application/controllers/Cis/Documents.php b/application/controllers/Cis/Documents.php
index c5a6684d3..0b8d08a56 100644
--- a/application/controllers/Cis/Documents.php
+++ b/application/controllers/Cis/Documents.php
@@ -72,7 +72,7 @@ class Documents extends Auth_Controller
$stgs = [];
$stsemArray = [];
- $buchungstypen = implode('\',\'', defined("CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN") ? unserialize(CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN) : []);
+ $buchungstypen = defined("CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN") ? unserialize(CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN) : [];
$person_ids = [];
foreach ($stati as $status) {
$person_ids[] = $status->person_id;
diff --git a/application/controllers/api/frontend/v1/ProfilUpdate.php b/application/controllers/api/frontend/v1/ProfilUpdate.php
index 604ae33c9..f97546288 100644
--- a/application/controllers/api/frontend/v1/ProfilUpdate.php
+++ b/application/controllers/api/frontend/v1/ProfilUpdate.php
@@ -637,7 +637,7 @@ class ProfilUpdate extends FHCAPI_Controller
//? Send email to the Studiengangsassistentinnen
$this->StudentModel->addSelect(["public.tbl_studiengang.email"]);
$this->StudentModel->addJoin("public.tbl_benutzer", "public.tbl_benutzer.uid = public.tbl_student.student_uid");
- $this->StudentModel->addJoin("public.tbl_prestudent", "public.tbl_benutzer.person_id = public.tbl_prestudent.person_id");
+ $this->StudentModel->addJoin("public.tbl_prestudent", "public.tbl_benutzer.person_id = public.tbl_prestudent.person_id and public.tbl_student.studiengang_kz = public.tbl_prestudent.studiengang_kz");
$this->StudentModel->addJoin("public.tbl_prestudentstatus", "public.tbl_prestudentstatus.prestudent_id = public.tbl_prestudent.prestudent_id");
$this->StudentModel->addJoin("public.tbl_studiengang", "public.tbl_studiengang.studiengang_kz = public.tbl_prestudent.studiengang_kz");
$this->StudentModel->addGroupBy(["public.tbl_studiengang.email"]);
diff --git a/application/controllers/api/frontend/v1/messages/Messages.php b/application/controllers/api/frontend/v1/messages/Messages.php
index fa6748f6a..355fe79a4 100644
--- a/application/controllers/api/frontend/v1/messages/Messages.php
+++ b/application/controllers/api/frontend/v1/messages/Messages.php
@@ -16,7 +16,7 @@ class Messages extends FHCAPI_Controller
'getNameOfDefaultRecipient' => ['admin:r', 'assistenz:r'],
'sendMessage' => ['admin:r', 'assistenz:r'],
'deleteMessage' => ['admin:r', 'assistenz:r'],
- 'getVorlagentext' => ['admin:r', 'assistenz:r'],
+ 'getDataVorlage' => ['admin:r', 'assistenz:r'],
'getPreviewText' => ['admin:r', 'assistenz:r'],
'getReplyData' => ['admin:r', 'assistenz:r'],
'getPersonId' => ['admin:r', 'assistenz:r'],
@@ -52,11 +52,14 @@ class Messages extends FHCAPI_Controller
$result = $this->MessageModel->getMessagesForTable($id, $offset, $limit);
- $data = $this->getDataOrTerminateWithError($result);
+ if (hasData($result))
+ {
+ $data = getData($result);
+ $this->addMeta('count', $data['count']);
+ $this->terminateWithSuccess($data['data']);
+ }
- $this->addMeta('count', $data['count']);
-
- $this->terminateWithSuccess($data['data']);
+ $this->terminateWithSuccess(array());
}
public function getVorlagen()
@@ -66,33 +69,23 @@ class Messages extends FHCAPI_Controller
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
$result = $this->BenutzerfunktionModel->getBenutzerfunktionByUid($uid, 'oezuordnung');
- $data = $this->getDataOrTerminateWithError($result);
- $oe_kurzbz = current($data);
+ if (hasData($result))
+ {
+ $this->load->model('system/Vorlage_model', 'VorlageModel');
- $this->load->model('system/Vorlage_model', 'VorlageModel');
+ $data = getData($result);
- $result = $this->VorlageModel->getAllVorlagenByOe($oe_kurzbz->oe_kurzbz);
- $data = $this->getDataOrTerminateWithError($result);
+ $oe_kurzbz = array_column($data, 'oe_kurzbz');
+ $result = $this->VorlageModel->getAllVorlagenByOe($oe_kurzbz);
- $this->terminateWithSuccess($data);
+ $this->terminateWithSuccess(hasData($result) ? getData($result) : array());
+ }
- //If admin
- $this->VorlageModel->addOrder('vorlage_kurzbz', 'ASC');
- $result = $this->VorlageModel->loadWhere(
- array(
- 'mimetype' => 'text/html'
- ));
-
-
- $data = $this->getDataOrTerminateWithError($result);
-
- $this->terminateWithSuccess($data);
+ $this->terminateWithSuccess(array());
}
- public function getVorlagentext($vorlage_kurzbz)
+ public function getDataVorlage($vorlage_kurzbz)
{
- //$this->terminateWithError("vor " . $vorlage_kurzbz, self::ERROR_TYPE_GENERAL);
- //$studiengang_kz = 227; //TODO(Manu) dynamisieren NULL
$studiengang_kz = 0;
$this->load->model('system/Vorlagestudiengang_model', 'VorlagestudiengangModel');
$this->VorlagestudiengangModel->addOrder('version', 'DESC');
@@ -104,12 +97,8 @@ class Messages extends FHCAPI_Controller
]);
$data = $this->getDataOrTerminateWithError($result);
-
- //not correct with Vorlage
$vorlage = current($data);
-
- //$this->terminateWithSuccess($data);
- $this->terminateWithSuccess($vorlage->text);
+ $this->terminateWithSuccess($vorlage);
}
public function getMessageVarsPerson($id, $typeId)
@@ -154,7 +143,7 @@ class Messages extends FHCAPI_Controller
public function sendMessage($recipient_id)
{
//has to be uid
- // $this->terminateWithError("uid", $recipient_id, self::ERROR_TYPE_GENERAL);
+ // $this->terminateWithError("uid", $recipient_id, self::ERROR_TYPE_GENERAL);
//default setting
$receiversPersonId = $this->_getPersonId($recipient_id, 'uid');
@@ -223,8 +212,6 @@ class Messages extends FHCAPI_Controller
}
elseif($typeId == 'prestudent_id')
{
- // $this->terminateWithError("prestudent_id ", self::ERROR_TYPE_GENERAL);
-
$result = $this->MessagesModel->parseMessageTextPrestudent($id, $body);
$bodyParsed = $this->getDataOrTerminateWithError($result);
}
@@ -429,7 +416,7 @@ class Messages extends FHCAPI_Controller
private function _getPrestudentIdFromUid($uid)
{
- // $this->terminateWithError($uid, self::ERROR_TYPE_GENERAL);
+ // $this->terminateWithError($uid, self::ERROR_TYPE_GENERAL);
$this->load->model('crm/Student_model', 'StudentModel');
$result = $this->StudentModel->loadWhere(
['student_uid' => $uid]
@@ -463,4 +450,4 @@ class Messages extends FHCAPI_Controller
date_format(date_create($sentDate), 'd.m.Y H:i'), $receiverName, $receiverSurname, $body
);
}
-}
\ No newline at end of file
+}
diff --git a/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php b/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php
index d8bc067f9..def4f6502 100644
--- a/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php
+++ b/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php
@@ -20,8 +20,6 @@ class Abschlusspruefung extends FHCAPI_Controller
'getBeurteilungen' => ['admin:rw', 'assistenz:rw'],
'getAkadGrade' => ['admin:rw', 'assistenz:rw'],
'getMitarbeiter' => ['admin:rw', 'assistenz:rw'],
- 'getAllMitarbeiter' => ['admin:rw', 'assistenz:rw'],
- 'getAllPersons' => ['admin:rw', 'assistenz:rw'],
'getPruefer' => ['admin:rw', 'assistenz:rw'],
'getTypStudiengang' => ['admin:rw', 'assistenz:rw'],
'checkForExistingExams' => ['admin:rw', 'assistenz:rw'],
@@ -102,35 +100,45 @@ class Abschlusspruefung extends FHCAPI_Controller
{
$abschlusspruefung_id = $this->input->post('id');
- $this->AbschlusspruefungModel->addSelect('lehre.tbl_abschlusspruefung.*');
- $this->AbschlusspruefungModel->addSelect("
- CASE
- WHEN pruefer1 IS NOT NULL
- THEN CONCAT(p1.nachname, ' ', p1.vorname, COALESCE(' ' || p1.titelpre, ''))
- ELSE NULL
- END AS p1
- ");
- $this->AbschlusspruefungModel->addSelect("
- CASE
- WHEN pruefer2 IS NOT NULL
- THEN CONCAT(p2.nachname, ' ', p2.vorname, COALESCE(' ' || p2.titelpre, ''))
- ELSE NULL
- END AS p2
- ");
- $this->AbschlusspruefungModel->addSelect("
- CASE
- WHEN pruefer3 IS NOT NULL
- THEN CONCAT(p3.nachname, ' ', p3.vorname, COALESCE(' ' || p3.titelpre, ''))
- ELSE NULL
- END AS p3
- ");
- $this->AbschlusspruefungModel->addSelect("
- CASE
- WHEN vorsitz IS NOT NULL
- THEN CONCAT(pv.nachname, ' ', pv.vorname, COALESCE(' ' || pv.titelpre, ''), ' (', ben.uid , ')' )
- ELSE NULL
- END AS pv
- ");
+ $this->AbschlusspruefungModel->addSelect(
+ 'lehre.tbl_abschlusspruefung.*,
+ p1.person_id AS p1_person_id, p1.vorname AS p1_vorname, p1.nachname AS p1_nachname,
+ p1.titelpre AS p1_titelpre, p1.titelpost AS p1_titelpost,
+ p2.person_id AS p2_person_id, p2.vorname AS p2_vorname, p2.nachname AS p2_nachname,
+ p2.titelpre AS p2_titelpre, p2.titelpost AS p2_titelpost,
+ p3.person_id AS p3_person_id, p3.vorname AS p3_vorname, p3.nachname AS p3_nachname,
+ p3.titelpre AS p3_titelpre, p3.titelpost AS p3_titelpost,
+ pv.person_id AS pv_person_id, pv.vorname AS pv_vorname, pv.nachname AS pv_nachname,
+ pv.titelpre AS pv_titelpre, pv.titelpost AS pv_titelpost, ben.uid AS pv_uid'
+ );
+ //~ $this->AbschlusspruefungModel->addSelect("
+ //~ CASE
+ //~ WHEN pruefer1 IS NOT NULL
+ //~ THEN CONCAT(p1.nachname, ' ', p1.vorname, COALESCE(' ' || p1.titelpre, ''))
+ //~ ELSE NULL
+ //~ END AS p1
+ //~ ");
+ //~ $this->AbschlusspruefungModel->addSelect("
+ //~ CASE
+ //~ WHEN pruefer2 IS NOT NULL
+ //~ THEN CONCAT(p2.nachname, ' ', p2.vorname, COALESCE(' ' || p2.titelpre, ''))
+ //~ ELSE NULL
+ //~ END AS p2
+ //~ ");
+ //~ $this->AbschlusspruefungModel->addSelect("
+ //~ CASE
+ //~ WHEN pruefer3 IS NOT NULL
+ //~ THEN CONCAT(p3.nachname, ' ', p3.vorname, COALESCE(' ' || p3.titelpre, ''))
+ //~ ELSE NULL
+ //~ END AS p3
+ //~ ");
+ //~ $this->AbschlusspruefungModel->addSelect("
+ //~ CASE
+ //~ WHEN vorsitz IS NOT NULL
+ //~ THEN CONCAT(pv.nachname, ' ', pv.vorname, COALESCE(' ' || pv.titelpre, ''), ' (', ben.uid , ')' )
+ //~ ELSE NULL
+ //~ END AS pv
+ //~ ");
$this->AbschlusspruefungModel->addJoin('public.tbl_benutzer ben', 'ON (ben.uid = lehre.tbl_abschlusspruefung.vorsitz)', 'LEFT');
$this->AbschlusspruefungModel->addJoin('public.tbl_person pv', 'ON (pv.person_id = ben.person_id)', 'LEFT');
$this->AbschlusspruefungModel->addJoin('public.tbl_person p1', 'ON (p1.person_id = lehre.tbl_abschlusspruefung.pruefer1)', 'LEFT');
@@ -220,8 +228,10 @@ class Abschlusspruefung extends FHCAPI_Controller
$this->terminateWithSuccess($typStudiengang);
}
- public function getMitarbeiter($searchString)
+ public function getMitarbeiter()
{
+ $searchString = $this->input->get('searchString') ?? '';
+
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'mitAkadGrad');
@@ -232,8 +242,10 @@ class Abschlusspruefung extends FHCAPI_Controller
$this->terminateWithSuccess($result ?: []);
}
- public function getPruefer($searchString)
+ public function getPruefer()
{
+ $searchString = $this->input->get('searchString') ?? '';
+
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'ohneMaUid');
@@ -444,58 +456,4 @@ class Abschlusspruefung extends FHCAPI_Controller
}
$this->terminateWithSuccess('step3');
}
-
- /*
- * returns list of all Mitarbeiter
- * as key value list to be used in select or autocomplete
- */
- public function getAllMitarbeiter()
- {
- $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
-
- $sql = "
- SELECT
- ma.mitarbeiter_uid as mitarbeiter_uid,
- CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid, ')') as label
- FROM
- public.tbl_mitarbeiter ma
- JOIN public.tbl_benutzer bn ON (bn.uid = ma.mitarbeiter_uid)
- JOIN public.tbl_person p ON (p.person_id = bn.person_id)
- ORDER BY
- p.nachname ASC
- ";
-
- $result = $this->MitarbeiterModel->execReadOnlyQuery($sql);
- $data = $this->getDataOrTerminateWithError($result);
-
- $this->terminateWithSuccess($data);
- }
-
- /*
- * returns list of all Persons
- * as key value list to be used in select or autocomplete
- */
- public function getAllPersons()
- {
- $this->load->model('person/Person_model', 'PersonModel');
-
- $sql = "
- SELECT
- p.vorname, p.nachname, p.person_id,
- CONCAT(p.nachname, ' ', p.vorname) as label
- FROM
- public.tbl_person p
- -- JOIN public.tbl_benutzer bn ON (p.person_id = bn.person_id)
- -- and bn.aktiv = 'true'
- ORDER BY
- p.nachname ASC
- ";
-
- //TODO(manu) check if filter active benutzer
-
- $result = $this->PersonModel->execReadOnlyQuery($sql);
- $data = $this->getDataOrTerminateWithError($result);
-
- $this->terminateWithSuccess($data);
- }
}
diff --git a/application/controllers/api/frontend/v1/stv/Archiv.php b/application/controllers/api/frontend/v1/stv/Archiv.php
index cc636951d..6b8388fbb 100644
--- a/application/controllers/api/frontend/v1/stv/Archiv.php
+++ b/application/controllers/api/frontend/v1/stv/Archiv.php
@@ -39,7 +39,7 @@ class Archiv extends FHCAPI_Controller
'archive' => ['admin:w', 'assistenz:w'],
'download' => ['admin:w', 'assistenz:w'],
'update' => ['admin:w'],
- 'delete' => ['admin:w', 'assistenz:w']
+ 'delete' => ['admin:w', 'assistenz:w'],
]);
// Load models
@@ -107,13 +107,9 @@ class Archiv extends FHCAPI_Controller
$result = $this->AkteModel->load($akte_id);
-
if (!hasData($result)) $this->terminateWithError('Akte not found');
- $data = $this->getDataOrTerminateWithError($result);
-
$data = getData($result)[0];
- //$this->addMeta("daa", $data->inhalt);
$fileObj = new stdClass();
if (isset($data->inhalt) && $data->inhalt != '')
@@ -133,12 +129,7 @@ class Archiv extends FHCAPI_Controller
//header("Content-type: $data->mimetype");
header('Content-Disposition: attachment; filename="'.$data->titel.'"');
readfile($filename);
- //echo base64_decode($data->inhalt);
die();
- //~ $fileObj->file = $data->inhalt;
- //~ $fileObj->name = $data->titel;
- //~ $fileObj->mimetype = $data->mimetype;
- //~ $fileObj->disposition = 'attachment';
}
else
{
@@ -146,12 +137,6 @@ class Archiv extends FHCAPI_Controller
$result = $this->aktelib->get($akte_id);
}
-
- /* $fileObj->filename
- * $fileObj->file
- * $fileObj->name
- * $fileObj->mimetype
- * $fileObj->disposition*/
}
/**
diff --git a/application/controllers/api/frontend/v1/stv/Config.php b/application/controllers/api/frontend/v1/stv/Config.php
index d52016943..97d626246 100644
--- a/application/controllers/api/frontend/v1/stv/Config.php
+++ b/application/controllers/api/frontend/v1/stv/Config.php
@@ -33,6 +33,7 @@ class Config extends FHCAPI_Controller
{
// TODO(chris): permissions
parent::__construct([
+ 'filter' => ['admin:r', 'assistenz:r'],
'student' => ['admin:r', 'assistenz:r'],
'students' => ['admin:r', 'assistenz:r']
]);
@@ -45,13 +46,166 @@ class Config extends FHCAPI_Controller
'lehre',
'stv',
'konto',
- 'abschlusspruefung'
+ 'abschlusspruefung',
+ 'projektarbeit'
]);
// Load Config
$this->load->config('stv');
}
+ /**
+ * Get the config for the student filters
+ *
+ * @return void
+ */
+ public function filter()
+ {
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+
+ $this->load->model('crm/Buchungstyp_model', 'BuchungstypModel');
+
+ $this->BuchungstypModel->addOrder('beschreibung');
+
+ $result = $this->BuchungstypModel->load();
+
+ $buchungstyp_kurzbz = $this->getDataOrTerminateWithError($result);
+ $buchungstyp_kurzbz_plus_all = array_merge([[
+ 'buchungstyp_kurzbz' => 'all',
+ 'beschreibung' => $this->p->t('stv', 'konto_all_types')
+ ]], $buchungstyp_kurzbz);
+
+ $this->load->model('crm/Statusgrund_model', 'StatusgrundModel');
+
+ $result = $this->StatusgrundModel->getAktiveGruende();
+
+ $statusgruende = $this->getDataOrTerminateWithError($result);
+
+ $result = [];
+
+ $result[] = [
+ 'id' => 'filter_konto_count_0',
+ 'label' => $this->p->t('stv', 'filter_konto_count_0'),
+ 'type' => 'konto',
+ 'fixed' => [
+ 'missing' => true,
+ 'usestdsem' => true
+ ],
+ 'dynamic' => [
+ 'buchungstyp_kurzbz' => [
+ 'type' => 'select',
+ 'values' => $buchungstyp_kurzbz,
+ 'value_key' => 'buchungstyp_kurzbz',
+ 'label_key' => 'beschreibung'
+ ]
+ ]
+ ];
+ $result[] = [
+ 'id' => 'filter_konto_missing_counter',
+ 'label' => $this->p->t('stv', 'filter_konto_missing_counter'),
+ 'type' => 'konto_counter',
+ 'dynamic' => [
+ 'buchungstyp_kurzbz' => [
+ 'type' => 'select',
+ 'values' => $buchungstyp_kurzbz_plus_all,
+ 'value_key' => 'buchungstyp_kurzbz',
+ 'label_key' => 'beschreibung'
+ ],
+ 'samestg' => [
+ 'type' => 'bool',
+ 'label' => $this->p->t('stv', 'filter_konto_samestg'),
+ 'default' => $this->variablelib->getVar('kontofilterstg') == 'true'
+ ]
+ ]
+ ];
+ $result[] = [
+ 'id' => 'filter_documents',
+ 'label' => $this->p->t('stv', 'filter_documents'),
+ 'type' => 'documents'
+ ];
+ $result[] = [
+ 'id' => 'filter_konto_missing_counter_past',
+ 'label' => $this->p->t('stv', 'filter_konto_missing_counter_past'),
+ 'type' => 'konto_counter',
+ 'fixed' => [
+ 'past' => true
+ ],
+ 'dynamic' => [
+ 'buchungstyp_kurzbz' => [
+ 'type' => 'select',
+ 'values' => $buchungstyp_kurzbz_plus_all,
+ 'value_key' => 'buchungstyp_kurzbz',
+ 'label_key' => 'beschreibung'
+ ],
+ 'samestg' => [
+ 'type' => 'bool',
+ 'label' => $this->p->t('stv', 'filter_konto_samestg'),
+ 'default' => $this->variablelib->getVar('kontofilterstg') == 'true'
+ ]
+ ]
+ ];
+ $result[] = [
+ 'id' => 'filter_konto_missing_studiengebuehr',
+ 'label' => $this->p->t('stv', 'filter_konto_missing_studiengebuehr'),
+ 'type' => 'konto',
+ 'fixed' => [
+ 'missing' => true,
+ 'usestdsem' => true
+ ],
+ 'dynamic' => [
+ 'buchungstyp_kurzbz' => [
+ 'type' => 'select',
+ 'values' => $buchungstyp_kurzbz,
+ 'value_key' => 'buchungstyp_kurzbz',
+ 'label_key' => 'beschreibung'
+ ]
+ ]
+ ];
+ $result[] = [
+ 'id' => 'filter_konto_studiengebuehrerhoeht',
+ 'label' => $this->p->t('stv', 'filter_konto_studiengebuehrerhoeht'),
+ 'type' => 'konto',
+ 'fixed' => [
+ 'usestdsem' => true
+ ],
+ 'dynamic' => [
+ 'buchungstyp_kurzbz' => [
+ 'type' => 'select',
+ 'values' => $buchungstyp_kurzbz,
+ 'value_key' => 'buchungstyp_kurzbz',
+ 'label_key' => 'beschreibung'
+ ]
+ ]
+ ];
+ $result[] = [
+ 'id' => 'filter_zgv_without_date',
+ 'label' => $this->p->t('stv', 'filter_zgv_without_date'),
+ 'type' => 'zgv'
+ ];
+ $result[] = [
+ 'id' => 'filter_statusgrund',
+ 'label' => $this->p->t('stv', 'filter_statusgrund'),
+ 'type' => 'statusgrund',
+ 'fixed' => [
+ 'usestdsem' => true
+ ],
+ 'dynamic' => [
+ 'statusgrund_id' => [
+ 'type' => 'select',
+ 'values' => $statusgruende,
+ 'value_key' => 'statusgrund_id',
+ 'label_key' => 'bezeichnung'
+ ]
+ ]
+ ];
+
+ Events::trigger('stv_conf_filter', function & () use (&$result) {
+ return $result;
+ });
+
+ $this->terminateWithSuccess($result);
+ }
+
public function student()
{
$result = [];
@@ -59,21 +213,21 @@ class Config extends FHCAPI_Controller
$result['details'] = [
'title' => $this->p->t('stv', 'tab_details'),
- 'component' => './Stv/Studentenverwaltung/Details/Details.js',
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Details.js'),
'config' => $config['details']
];
$result['notes'] = [
'title' => $this->p->t('stv', 'tab_notes'),
- 'component' => './Stv/Studentenverwaltung/Details/Notizen.js',
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Notizen.js'),
'config' => $config['notes'],
'showSuffix' => ($config['notes']['showCountNotes'] ?? false),
- 'suffixhelper' => APP_ROOT . 'public/js/helpers/Stv/Studentenverwaltung/Details/Notizen/NotizenSuffixHelper.js'
+ 'suffixhelper' => absoluteJsImportUrl('public/js/helpers/Stv/Studentenverwaltung/Details/Notizen/NotizenSuffixHelper.js')
];
$result['contact'] = [
'title' => $this->p->t('stv', 'tab_contact'),
- 'component' => './Stv/Studentenverwaltung/Details/Kontakt.js',
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Kontakt.js'),
'config' => [
'showBankaccount' => $this->permissionlib->isBerechtigt('mitarbeiter/bankdaten')
|| $this->permissionlib->isBerechtigt('student/bankdaten')
@@ -81,20 +235,20 @@ class Config extends FHCAPI_Controller
];
$result['prestudent'] = [
'title' => $this->p->t('stv', 'tab_prestudent'),
- 'component' => './Stv/Studentenverwaltung/Details/Prestudent.js',
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Prestudent.js'),
'config' => $config['prestudent']
];
$result['status'] = [
'title' => 'Status',
- 'component' => './Stv/Studentenverwaltung/Details/MultiStatus.js'
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/MultiStatus.js')
];
$result['documents'] = [
'title' => $this->p->t('stv', 'tab_documents'),
- 'component' => './Stv/Studentenverwaltung/Details/Dokumente.js'
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Dokumente.js')
];
$result['banking'] = [
'title' => $this->p->t('stv', 'tab_banking'),
- 'component' => './Stv/Studentenverwaltung/Details/Konto.js',
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Konto.js'),
'config' => [
'showZahlungsbestaetigung' => (defined('ZAHLUNGSBESTAETIGUNG_ANZEIGEN') && ZAHLUNGSBESTAETIGUNG_ANZEIGEN),
'showBuchungsnr' => $this->permissionlib->isBerechtigt('admin'),
@@ -106,20 +260,23 @@ class Config extends FHCAPI_Controller
];
$result['resources'] = [
'title' => $this->p->t('stv', 'tab_resources'),
- 'component' => './Stv/Studentenverwaltung/Details/Betriebsmittel.js'
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Betriebsmittel.js'),
+ 'showOnlyWithUid' => true
];
$result['groups'] = [
'title' => $this->p->t('stv', 'tab_groups'),
- 'component' => './Stv/Studentenverwaltung/Details/Gruppen.js'
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Groups.js'),
+ 'showOnlyWithUid' => true
];
$result['messages'] = [
'title' => $this->p->t('stv', 'tab_messages'),
- 'component' => './Stv/Studentenverwaltung/Details/Messages.js'
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Messages.js'),
+ 'showOnlyWithUid' => true
];
$result['grades'] = [
'title' => $this->p->t('stv', 'tab_grades'),
- 'component' => './Stv/Studentenverwaltung/Details/Noten.js',
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Noten.js'),
'showOnlyWithUid' => true,
'config' => [
'usePoints' => defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE,
@@ -132,29 +289,42 @@ class Config extends FHCAPI_Controller
$result['exam'] = [
'title' => $this->p->t('stv', 'tab_exam'),
- 'component' => './Stv/Studentenverwaltung/Details/Pruefung.js'
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Pruefung.js'),
+ 'showOnlyWithUid' => true
];
$result['exemptions'] = [
'title' => $this->p->t('lehre', 'anrechnungen'),
- 'component' => './Stv/Studentenverwaltung/Details/Anrechnungen.js',
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Anrechnungen.js'),
'config' => $config['exemptions']
];
$result['finalexam'] = [
'title' => $this->p->t('stv', 'tab_finalexam'),
- 'component' => './Stv/Studentenverwaltung/Details/Abschlusspruefung.js',
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Abschlusspruefung.js'),
+ 'showOnlyWithUid' => true,
'config' => $config['finalexam']
];
+ $result['projektarbeit'] = [
+ 'title' => $this->p->t('stv', 'tab_projektarbeit'),
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Projektarbeit.js'),
+ 'config' => array_merge(
+ $config['projektarbeit'],
+ ['showVertragsdetails' =>
+ defined('FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN') && FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN]
+ )
+ ];
+
$result['mobility'] = [
'title' => $this->p->t('stv', 'tab_mobility'),
- 'component' => './Stv/Studentenverwaltung/Details/Mobility.js'
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Mobility.js'),
+ 'showOnlyWithUid' => true
];
$result['archive'] = [
'title' => $this->p->t('stv', 'tab_archive'),
- 'component' => './Stv/Studentenverwaltung/Details/Archiv.js',
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Archiv.js'),
'config' => [
'showEdit' => $this->permissionlib->isBerechtigt('admin')
]
@@ -162,22 +332,24 @@ class Config extends FHCAPI_Controller
$result['jointstudies'] = [
'title' => $this->p->t('stv', 'tab_jointstudies'),
- 'component' => './Stv/Studentenverwaltung/Details/JointStudies.js'
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/JointStudies.js'),
+ 'showOnlyWithUid' => true
];
$result['coursedates'] = [
'title' => $this->p->t('stv', 'tab_courseDates'),
- 'component' => './Stv/Studentenverwaltung/Details/Lehrveranstaltungstermine.js'
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Lehrveranstaltungstermine.js')
];
$result['admissionDates'] = [
'title' => $this->p->t('stv', 'tab_admissionDates'),
- 'component' => './Stv/Studentenverwaltung/Details/Aufnahmetermine.js'
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Aufnahmetermine.js')
];
$result['functions'] = [
'title' => $this->p->t('stv', 'tab_functions'),
- 'component' => './Stv/Studentenverwaltung/Details/Funktionen.js'
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Funktionen.js'),
+ 'showOnlyWithUid' => true
];
Events::trigger('stv_conf_student', function & () use (&$result) {
@@ -195,7 +367,7 @@ class Config extends FHCAPI_Controller
$config = $this->config->item('tabs');
$result['banking'] = [
'title' => $this->p->t('stv', 'tab_banking'),
- 'component' => './Stv/Studentenverwaltung/Details/Konto.js',
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Konto.js'),
'config' => [
'showZahlungsbestaetigung' => (defined('ZAHLUNGSBESTAETIGUNG_ANZEIGEN') && ZAHLUNGSBESTAETIGUNG_ANZEIGEN),
'showBuchungsnr' => $this->permissionlib->isBerechtigt('admin'),
@@ -205,9 +377,14 @@ class Config extends FHCAPI_Controller
'additionalCols' => []
]
];
+ $result['groups'] = [
+ 'title' => $this->p->t('stv', 'tab_groups'),
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Groups.js'),
+ 'showOnlyWithUid' => true
+ ];
$result['status'] = [
'title' => 'Status',
- 'component' => './Stv/Studentenverwaltung/Details/MultiStatus.js',
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/MultiStatus.js'),
'config' => [
'changeStatusToAbbrecherStgl' => $this->permissionlib->isBerechtigt('admin'),
'changeStatusToAbbrecherStud' => $this->permissionlib->isBerechtigt('admin'),
@@ -218,17 +395,23 @@ class Config extends FHCAPI_Controller
];
$result['finalexam'] = [
'title' => $this->p->t('stv', 'tab_finalexam'),
- 'component' => './Stv/Studentenverwaltung/Details/Abschlusspruefung.js',
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Abschlusspruefung.js'),
+ 'showOnlyWithUid' => true,
'config' => $config['finalexam']
];
$result['archive'] = [
'title' => $this->p->t('stv', 'tab_archive'),
- 'component' => './Stv/Studentenverwaltung/Details/Archiv.js',
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Archiv.js'),
'config' => [
'showEdit' => $this->permissionlib->isBerechtigt('admin')
]
];
+ $result['kontaktieren'] = [
+ 'title' => $this->p->t('stv', 'tab_kontaktieren'),
+ 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Kontaktieren.js'),
+ ];
+
Events::trigger('stv_conf_students', function & () use (&$result) {
return $result;
});
diff --git a/application/controllers/api/frontend/v1/stv/Dokumente.php b/application/controllers/api/frontend/v1/stv/Dokumente.php
index 18c976eb6..e6f6f4351 100644
--- a/application/controllers/api/frontend/v1/stv/Dokumente.php
+++ b/application/controllers/api/frontend/v1/stv/Dokumente.php
@@ -2,6 +2,7 @@
if (! defined('BASEPATH')) exit('No direct script access allowed');
+use \CI3_Events as Events;
use \DateTime as DateTime;
class Dokumente extends FHCAPI_Controller
@@ -19,6 +20,8 @@ class Dokumente extends FHCAPI_Controller
'getDoktypen' => ['admin:r', 'assistenz:r'],
'uploadDokument' => ['admin:rw', 'assistenz:rw'],
'download' => ['admin:rw', 'assistenz:rw'],
+ 'getDocumentDropDown' => ['admin:rw', 'assistenz:rw'],
+ 'getDocumentDropDownMulti' => ['admin:rw', 'assistenz:rw'],
]);
// Load Libraries
@@ -566,4 +569,395 @@ class Dokumente extends FHCAPI_Controller
return false;
}
}
+
+ public function getDocumentDropDown($prestudent_id, $studiensemester_kurzbz, $studiengang_kz)
+ {
+ $this->load->helper('hlp_common');
+ //permission to create also odt, and doc outputs of certain documents(menu abschlusspruefung)
+ $hasPermissionOutputformat = $this->permissionlib->isBerechtigt('system/change_outputformat', 's');
+
+ if (!$prestudent_id)
+ $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Prestudent_id']), self::ERROR_TYPE_GENERAL);
+ if (!$studiensemester_kurzbz)
+ $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiensemester']), self::ERROR_TYPE_GENERAL);
+ if(!$studiengang_kz)
+ $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiengang_kz']), self::ERROR_TYPE_GENERAL);
+
+
+ $uid = $this->_loadUIDFromPrestudent($prestudent_id);
+ $semArray = $this->_getEntriesStudiensemester();
+ $stgTyp = $this->_getStudiengangstyp($studiengang_kz);
+
+ $documents = [
+ buildDropdownEntryPrintArray("accountinfo", "Accountinfoblatt", "xml=accountinfoblatt.xml.php&xsl=AccountInfo&output=pdf", $uid, 10, null),
+ buildDropdownEntryPrintArray("ausbildungsvertrag", "Ausbildungsvertrag", "xml=ausbildungsvertrag.xml.php&xsl=Ausbildungsver&output=pdf", $uid, 20, null),
+ buildDropdownEntryPrintArray("ausbildungsvertrag_en", "Ausbildungsvertrag Englisch", "xml=ausbildungsvertrag.xml.php&xsl=AusbVerEng&output=pdf", $uid, 21, null),
+ buildDropdownEntryPrintArray("studienbestaetigung", "Studienbestätigung", "xml=student.rdf.php&xsl=Inskription&output=pdf", $uid, 40, null),
+ buildDropdownEntryPrintArray("studienbestaetigung_en", "Studienbestätigung Englisch", "xml=student.rdf.php&xsl=InskriptionEng&output=pdf", $uid, 41, null),
+ buildDropdownEntryPrintArray("zutrittskarte", "Zutrittskarte", "xsl=ZutrittskarteStud&output=pdf&data=$uid", $uid,100, "zutrittskarte.php"),
+ buildDropdownEntryPrintArray("studienblatt", "Studienblatt", "xml=studienblatt.xml.php&xsl=Studienblatt&output=pdf&ss=$studiensemester_kurzbz", $uid, 60, null),
+ buildDropdownEntryPrintArray("studienblatt_eng", "Studienblatt Englisch", "xml=studienblatt.xml.php&xsl=StudienblattEng&output=pdf&ss=$studiensemester_kurzbz", $uid, 61, null),
+
+ $this->buildStudienerfolgSubmenu("de", $uid, $semArray, $studiensemester_kurzbz),
+ $this->buildStudienerfolgSubmenu("en", $uid, $semArray, $studiensemester_kurzbz),
+ $this->buildStudienerfolgSubmenu("de", $uid, $semArray, $studiensemester_kurzbz, true),
+ $this->buildStudienerfolgSubmenu("en", $uid, $semArray, $studiensemester_kurzbz, true),
+
+ [
+ "id" => "submenu_studstatus",
+ "type" => "submenu",
+ "name" => "Verwaltung des StudierendenStatus",
+ "order" => 110,
+ "data" => [
+ buildDropdownEntryPrintArray("Abmeldung", "Abmeldung", "xml=AntragAbmeldung.xml.php&xsl=AntragAbmeldung&prestudent_id=$prestudent_id&output=pdf", $uid, null, null),
+ buildDropdownEntryPrintArray("Abmeldung durch Stgl", "AntragAbmeldungStgl", "xml=AntragAbmeldungStgl.xml.php&xsl=AntragAbmeldungStgl&prestudent_id=$prestudent_id&output=pdf", $uid, null, null),
+ buildDropdownEntryPrintArray("Unterbrechung", "Unterbrechung", "xml=AntragUnterbrechung.xml.php&xsl=AntragUnterbrechung&prestudent_id=$prestudent_id&output=pdf", $uid, null, null),
+ buildDropdownEntryPrintArray("Wiederholung", "Abmeldung durch Ablauf der Wiederholungsfrist", "xml=AntragWiederholung.xml.php&xsl=AntragWiederholung&prestudent_id=$prestudent_id&output=pdf", $uid, null, null),
+ ]
+ ],
+
+ $this->loadDropDownEntriesFinalExam($hasPermissionOutputformat, $stgTyp, $uid),
+
+ buildDropdownEntryPrintArray("bescheid", "Bescheid (nur Voransicht)", "xml=abschlusspruefung.rdf.php&xsl_stg_kz=$studiengang_kz&xsl=Bescheid&output=pdf", $uid, 80, null),
+ buildDropdownEntryPrintArray("diplomasupp", "Diploma Supplement (nur Voransicht)", "xml=diplomasupplement.xml.php&xsl_stg_kz=$studiengang_kz&xsl=DiplSupplement&output=pdf", $uid, 81, null)
+ ];
+
+ Events::trigger('DocumentGenerationDropDown',
+ // passing $menu per reference
+ function & () use (&$documents) {
+ return $documents;
+ },
+ $prestudent_id,
+ $studiensemester_kurzbz,
+ $studiengang_kz
+ );
+
+ usort($documents, function ($a, $b) {
+ $orderA = isset($a['order']) ? (int)$a['order'] : PHP_INT_MAX;
+ $orderB = isset($b['order']) ? (int)$b['order'] : PHP_INT_MAX;
+ return $orderA <=> $orderB;
+ });
+
+
+ $this->terminateWithSuccess($documents);
+ return $documents || null;
+ }
+
+ public function getDocumentDropDownMulti($studiensemester_kurzbz,$studiengang_kz)
+ {
+ //permission to create also odt, and doc outputs of certain documents (menu abschlusspruefung)
+ $hasPermissionOutputformat = $this->permissionlib->isBerechtigt('system/change_outputformat', 's');
+
+ $studentUids = $this->input->get('studentUids');
+ $prestudentIds = [];
+
+ if (is_array($studentUids) && !empty($studentUids)) {
+ foreach ($studentUids as $uid) {
+ $prestudent_id = $this-> _loadPrestudentFromUid($uid);
+ $prestudentIds[] = $prestudent_id;
+ }
+ }
+ else
+ {
+ $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Array StudentUIDs']), self::ERROR_TYPE_GENERAL);
+ }
+
+ if (!$studiensemester_kurzbz)
+ $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiensemester']), self::ERROR_TYPE_GENERAL);
+ if(!$studiengang_kz)
+ $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiengang_kz']), self::ERROR_TYPE_GENERAL);
+
+
+ $uidString = implode(";", $studentUids);
+ $prestudentIdsString = implode(";", $prestudentIds);
+
+ $semArray = $this->_getEntriesStudiensemester();
+ $stgTyp = $this->_getStudiengangstyp($studiengang_kz);
+
+ $documents = [
+ buildDropdownEntryPrintArray("accountinfo", "Accountinfoblatt", "xml=accountinfoblatt.xml.php&xsl=AccountInfo&output=pdf", $uidString, 10, null),
+ buildDropdownEntryPrintArray("ausbildungsvertrag", "Ausbildungsvertrag", "xml=ausbildungsvertrag.xml.php&xsl=Ausbildungsver&output=pdf", $uidString, 20, null),
+ buildDropdownEntryPrintArray("ausbildungsvertrag_en", "Ausbildungsvertrag Englisch", "xml=ausbildungsvertrag.xml.php&xsl=AusbVerEng&output=pdf", $uidString, 21, null),
+ buildDropdownEntryPrintArray("studienbestaetigung", "Studienbestätigung", "xml=student.rdf.php&xsl=Inskription&output=pdf", $uidString, 40, null),
+ buildDropdownEntryPrintArray("studienbestaetigung_en", "Studienbestätigung Englisch", "xml=student.rdf.php&xsl=InskriptionEng&output=pdf", $uidString, 41, null),
+ buildDropdownEntryPrintArray("zutrittskarte", "Zutrittskarte", "xsl=ZutrittskarteStud&output=pdf&data=$uidString", $uidString,100, "zutrittskarte.php"),
+ buildDropdownEntryPrintArray("studienblatt", "Studienblatt", "xml=studienblatt.xml.php&xsl=Studienblatt&output=pdf&ss=$studiensemester_kurzbz", $uidString, 60, null),
+ buildDropdownEntryPrintArray("studienblatt_eng", "Studienblatt Englisch", "xml=studienblatt.xml.php&xsl=StudienblattEng&output=pdf&ss=$studiensemester_kurzbz", $uidString, 61, null),
+
+ // Studienerfolg Menüs automatisch
+ $this->buildStudienerfolgSubmenu("de", $uidString, $semArray, $studiensemester_kurzbz),
+ $this->buildStudienerfolgSubmenu("en", $uidString, $semArray, $studiensemester_kurzbz),
+ $this->buildStudienerfolgSubmenu("de", $uidString, $semArray, $studiensemester_kurzbz, true),
+ $this->buildStudienerfolgSubmenu("en", $uidString, $semArray, $studiensemester_kurzbz, true),
+
+ [
+ "id" => "submenu_studstatus",
+ "type" => "submenu",
+ "name" => "Verwaltung des StudierendenStatus",
+ "order" => 110,
+ "data" => [
+ buildDropdownEntryPrintArray("Abmeldung", "Abmeldung", "xml=AntragAbmeldung.xml.php&xsl=AntragAbmeldung&prestudent_id=$prestudentIdsString&output=pdf", $uidString, null, null),
+ buildDropdownEntryPrintArray("Abmeldung durch Stgl", "AntragAbmeldungStgl", "xml=AntragAbmeldungStgl.xml.php&xsl=AntragAbmeldungStgl&prestudent_id=$prestudentIdsString&output=pdf", $uidString, null, null),
+ buildDropdownEntryPrintArray("Unterbrechung", "Unterbrechung", "xml=AntragUnterbrechung.xml.php&xsl=AntragUnterbrechung&prestudent_id=$prestudentIdsString&output=pdf", $uidString, null, null),
+ buildDropdownEntryPrintArray("Wiederholung", "Abmeldung durch Ablauf der Wiederholungsfrist", "xml=AntragWiederholung.xml.php&xsl=AntragWiederholung&prestudent_id=$prestudentIdsString&output=pdf", $uidString, null, null),
+ ]
+ ],
+
+ $this->loadDropDownEntriesFinalExam($hasPermissionOutputformat, $stgTyp, $uidString),
+
+ //TODO(Manu) also in Fas multi not working
+/* buildDropdownEntryPrintArray("bescheid", "Bescheid (nur Voransicht)", "xml=abschlusspruefung.rdf.php&xsl_stg_kz=$studiengang_kz&xsl=Bescheid&output=pdf", $uidString, 80, null),
+ */
+
+ buildDropdownEntryPrintArray("diplomasupp", "Diploma Supplement (nur Voransicht)", "xml=diplomasupplement.xml.php&xsl_stg_kz=$studiengang_kz&xsl=DiplSupplement&output=pdf", $uidString, 81, null)
+ ];
+
+ Events::trigger('DocumentGenerationDropDownMulti',
+ // passing $menu per reference
+ function & () use (&$documents) {
+ return $documents;
+ },
+ $studentUids,
+ $studiensemester_kurzbz,
+ $studiengang_kz
+ );
+
+ usort($documents, function ($a, $b) {
+ $orderA = isset($a['order']) ? (int)$a['order'] : PHP_INT_MAX;
+ $orderB = isset($b['order']) ? (int)$b['order'] : PHP_INT_MAX;
+ return $orderA <=> $orderB;
+ });
+
+
+ $this->terminateWithSuccess($documents);
+
+ return $documents || null;
+ }
+
+ private function _loadUIDFromPrestudent($prestudent_id)
+ {
+ if(!$prestudent_id){
+ return $this->terminateWithError("no prestudent ID received.");
+ }
+ $this->load->model('crm/Student_model', 'StudentModel');
+ $result = $this->StudentModel->loadWhere(
+ ['prestudent_id' => $prestudent_id]
+ );
+
+ $data = $this->getDataOrTerminateWithError($result);
+ $student = current($data);
+
+ return $student->student_uid;
+ }
+
+ private function _loadPrestudentFromUid($studentUid)
+ {
+
+ $this->load->model('crm/Student_model', 'StudentModel');
+ $result = $this->StudentModel->loadWhere(
+ ['student_uid' => $studentUid]
+ );
+
+ $data = $this->getDataOrTerminateWithError($result);
+ $student = current($data);
+
+
+ return $student->prestudent_id;
+ }
+
+ /**
+ * is building an array with studiensemesterkurzb
+ * actual studiensemester plus the 5 studiensemester in the past
+
+ * @return Array Studiensemester_kurzbz
+ */
+ private function _getEntriesStudiensemester(){
+ $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+
+ $this->StudiensemesterModel->addPlusMinus(1, 5);
+ $this->StudiensemesterModel->addOrder('ende', 'DESC');
+ $result = $this->StudiensemesterModel->load();
+ $data = $this->getDataOrTerminateWithError($result);
+
+ foreach($data as $sem)
+ {
+ $semArray[] = $sem->studiensemester_kurzbz;
+ }
+
+ array_shift($semArray);
+
+ return $semArray;
+ }
+ /**
+ * is returning the typ of Studiengang (Bakk oder Master)
+
+ * @return character eg. 'b' or 'm'
+ */
+ private function _getStudiengangstyp($studiengang_kz)
+ {
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+
+ $result = $this->StudiengangModel->loadWhere(
+ array('studiengang_kz' => $studiengang_kz)
+ );
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $typStudiengang = current($data)->typ;
+
+ return $typStudiengang;
+ }
+
+ /**
+ * helper function to create ArrayStructure
+ * actual studiensemester plus the 5 studiensemester in the past
+
+ * @return Array Studiensemester_kurzbz
+ */
+ private function buildStudienerfolgSubmenu($lang, $uid, $semArray, $studiensemester_kurzbz, $fa = false)
+ {
+ $entries = [];
+
+ $xsl = $lang === "de" ? "Studienerfolg" : "StudienerfolgEng";
+ $idPrefix = "submenu_studienerfolg_" . $lang . ($fa ? "_fa" : "");
+
+ $entries[] = buildDropdownEntryPrintArray(
+ $idPrefix . "_aktuell",
+ "ausgewähltes Semester",
+ "xml=studienerfolg.rdf.php&xsl=$xsl&ss=$studiensemester_kurzbz" . ($fa ? "&typ=finanzamt" : ""),
+ $uid
+ );
+
+ //all semester
+ $entries[] = buildDropdownEntryPrintArray(
+ $idPrefix . "_all",
+ "alle Semester",
+ "xml=studienerfolg.rdf.php&xsl=$xsl&ss=$studiensemester_kurzbz&all=true" . ($fa ? "&typ=finanzamt" : ""),
+ $uid
+ );
+
+ //sem from array
+ foreach ($semArray as $i => $sem) {
+ $entries[] = buildDropdownEntryPrintArray(
+ $idPrefix . ($i === 0 ? "_akt" : "_minus" . $i),
+ $sem,
+ "xml=studienerfolg.rdf.php&xsl=$xsl&ss=$sem" . ($fa ? "&typ=finanzamt" : ""),
+ $uid
+ );
+
+ }
+ $order = 0;
+ if ($lang === "de" && !$fa) $order = 75; // Studienerfolg
+ if ($lang === "en" && !$fa) $order = 76; // Studienerfolg Englisch
+ if ($lang === "de" && $fa) $order = 77; // Studienerfolg Finanzamt
+ if ($lang === "en" && $fa) $order = 78; // Studienerfolg Finanzamt Englisch
+
+ return [
+ "id" => $idPrefix,
+ "type" => "submenu",
+ "name" => "Studienerfolg " . ($fa ? " Finanzamt" : "") . ($lang === "de" ? "" : "Englisch") ,
+ "order" => $order,
+ "data" => $entries,
+ ];
+ }
+
+ private function loadDropDownEntriesFinalExam($hasPermissionOutputformat, $stgTyp, $uid)
+ {
+ if ($stgTyp == 'b')
+ $postfix = 'Bakk';
+ else if ($stgTyp == 'm' || $stgTyp == 'd')
+ $postfix = 'Master';
+ else
+ return [];
+
+ $arrayFinalExam = [
+ 'pruefungsprotokoll' => [
+ 'de' => [
+ 'Bakk' => 'PrProtBA',
+ 'Master' => 'PrProtMA',
+ ],
+ 'en' => [
+ 'Bakk' => 'PrProtBAEng',
+ 'Master' => 'PrProtMAEng',
+ ],
+ ],
+ 'pruefungszeugnis' => [
+ 'de' => [
+ 'Bakk' => 'Bakkzeugnis',
+ 'Master' => 'Diplomzeugnis',
+ ],
+ 'en' => [
+ 'Bakk' => 'BakkzeugnisEng',
+ 'Master' => 'DiplomzeugnisEng',
+ ],
+ ],
+ 'urkunde' => [
+ 'de' => [
+ 'Bakk' => 'Bakkurkunde',
+ 'Master' => 'Diplomurkunde',
+ ],
+ 'en' => [
+ 'Bakk' => 'BakkurkundeEng',
+ 'Master' => 'DiplomurkundeEng',
+ ],
+ ],
+ ];
+
+ $langLabels = [
+ "de" => "Deutsch",
+ "en" => "Englisch"
+ ];
+
+ $docLabels = [
+ "pruefungsprotokoll" => "Prüfungsprotokoll",
+ "pruefungszeugnis" => "Zeugnis",
+ "urkunde" => "Urkunde"
+ ];
+
+ $submenuData = [];
+ if ($hasPermissionOutputformat) {
+ foreach ($arrayFinalExam as $docType => $langs) {
+ foreach ($langs as $lang => $types) {
+ $xsl = $types[$postfix];
+ $idPrefix = $docType . "_" . $lang;
+
+ $baseName = $docLabels[$docType] . " " . $langLabels[$lang];
+ $baseUrl = "xml=abschlusspruefung.rdf.php&xsl={$xsl}";
+
+ //3 outputformates
+ foreach (["pdf", "odt", "docx"] as $format) {
+ $submenuData[] = buildDropdownEntryPrintArray(
+ $idPrefix . "_" . $format,
+ $baseName . " (" . strtoupper($format) . ")",
+ $baseUrl . "&output=" . $format,
+ $uid
+ );
+ }
+ }
+ }
+ }
+ else
+ {
+ foreach ($arrayFinalExam as $docType => $langs) {
+ foreach ($langs as $lang => $types) {
+ $xsl = $types[$postfix]; // Auswahl Bakk/Master für jeweilige Sprache
+ $id = $docType . "_" . $lang;
+
+ $name = $docLabels[$docType] . " " . $langLabels[$lang];
+
+ $url = "xml=abschlusspruefung.rdf.php&xsl=" . $xsl . "&output=pdf";
+
+ $submenuData[] = buildDropdownEntryPrintArray($id, $name, $url, $uid);
+ }
+ }
+ }
+ return [
+ "id" => "submenu_finalexam",
+ "type" => "submenu",
+ "name" => "Abschlussprüfung",
+ "data" => $submenuData,
+ "order" => null,
+ "order" => 80,
+ ];
+ }
+
}
diff --git a/application/controllers/api/frontend/v1/stv/Gruppen.php b/application/controllers/api/frontend/v1/stv/Gruppen.php
index c30816f2a..c45165b41 100644
--- a/application/controllers/api/frontend/v1/stv/Gruppen.php
+++ b/application/controllers/api/frontend/v1/stv/Gruppen.php
@@ -9,6 +9,8 @@ class Gruppen extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
+ 'add' => ['admin:rw', 'assistenz:rw'],
+ 'search' => ['admin:r', 'assistenz:r'],
'getGruppen' => ['admin:r', 'assistenz:r'],
'deleteGruppe' => ['admin:rw', 'assistenz:rw'],
]);
@@ -18,7 +20,9 @@ class Gruppen extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
- 'ui', 'gruppenmanagement'
+ 'ui',
+ 'gruppenmanagement',
+ 'lehre'
]);
// Load models
@@ -26,15 +30,140 @@ class Gruppen extends FHCAPI_Controller
$this->load->model('organisation/Gruppe_model', 'GruppeModel');
}
+ public function add()
+ {
+ $this->load->library("form_validation");
+
+ $this->form_validation->set_rules(
+ 'gruppe_kurzbz',
+ $this->p->t('gruppenmanagement', 'gruppe'),
+ 'required|is_in_db[organisation/Gruppe_model]',
+ [
+ 'required' => $this->p->t('ui', 'error_fieldRequired'),
+ 'is_in_db' => $this->p->t('ui', 'error_fieldNotFound')
+ ]
+ );
+ $this->form_validation->set_rules(
+ 'uid',
+ $this->p->t('ui', 'student_uid'),
+ 'required|is_in_db[crm/Student_model:student_uid]',
+ [
+ 'required' => $this->p->t('ui', 'error_fieldRequired'),
+ 'is_in_db' => $this->p->t('ui', 'error_fieldNotFound')
+ ]
+ );
+ $this->form_validation->set_rules(
+ 'studiensemester_kurzbz',
+ $this->p->t('lehre', 'studiensemester'),
+ 'required|is_in_db[organisation/Studiensemester_model]',
+ [
+ 'required' => $this->p->t('ui', 'error_fieldRequired'),
+ 'is_in_db' => $this->p->t('ui', 'error_fieldNotFound')
+ ]
+ );
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $gruppe_kurzbz = $this->input->post('gruppe_kurzbz');
+ $uid = $this->input->post('uid');
+ $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
+
+ $result = $this->BenutzergruppeModel->load([
+ $gruppe_kurzbz,
+ $uid
+ ]);
+ $benutzergruppe = $this->getDataOrTerminateWithError($result);
+
+ if ($benutzergruppe) {
+ $this->terminateWithError(
+ $this->p->t('gruppenmanagement', 'error_alreadyInGroup', [
+ 'uid' => $uid,
+ 'studiensemester_kurzbz' => current($benutzergruppe)->studiensemester_kurzbz
+ ]),
+ self::ERROR_TYPE_GENERAL
+ );
+ }
+
+ $result = $this->BenutzergruppeModel->insert([
+ 'uid' => $uid,
+ 'gruppe_kurzbz' => $gruppe_kurzbz,
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz,
+ 'insertamum' => date('c'),
+ 'insertvon' => getAuthUID()
+ ]);
+
+ $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess();
+ }
+
+ public function search()
+ {
+ $query = $this->input->post('query');
+ if (!$query)
+ $this->terminateWithSuccess([]);
+
+ // add query to where clause
+ $query = strtoupper($query);
+ $query = $this->GruppeModel->db->escape_like_str($query);
+ $query = '%' . str_replace(' ', '%', $query) . '%';
+
+ $this->GruppeModel->db->group_start();
+ $this->GruppeModel->db->or_like('UPPER(gruppe_kurzbz)', $query, 'none', false);
+ $this->GruppeModel->db->or_like('UPPER(bezeichnung)', $query, 'none', false);
+ $this->GruppeModel->db->or_like('UPPER(beschreibung)', $query, 'none', false);
+ $this->GruppeModel->db->group_end();
+
+ // add stg sorting 1
+ $studiengang_kz = $this->input->post('studiengang_kz');
+ $sort_stg = $studiengang_kz ? "WHEN studiengang_kz = " . $this->GruppeModel->escape($studiengang_kz) . " THEN 0" : "";
+
+ // add stg sorting 2
+ $studiengang_kzs = [];
+ $result = $this->permissionlib->getSTG_isEntitledFor('admin');
+ if ($result)
+ $studiengang_kzs = array_merge($studiengang_kzs, $result);
+ $result = $this->permissionlib->getSTG_isEntitledFor('assistenz');
+ if ($result)
+ $studiengang_kzs = array_merge($studiengang_kzs, $result);
+
+ // selects
+ $this->GruppeModel->addSelect("*");
+ $this->GruppeModel->addSelect("CASE
+ " . $sort_stg . "
+ WHEN studiengang_kz IN (" . implode(",", $this->GruppeModel->db->escape($studiengang_kzs)) . ")
+ THEN 1
+ ELSE 2
+ END AS sort_stg");
+
+ // ordering
+ $this->GruppeModel->addOrder("sort_stg");
+ $this->GruppeModel->addOrder("sort");
+ $this->GruppeModel->addOrder("gruppe_kurzbz");
+
+ // default where clause & execute
+ $result = $this->GruppeModel->loadWhere([
+ 'lehre' => true,
+ 'sichtbar' => true,
+ 'aktiv' => true,
+ 'direktinskription' => false
+ ]);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
public function getGruppen($student_uid)
{
- $this->BenutzergruppeModel ->addSelect('gruppe_kurzbz');
- $this->BenutzergruppeModel ->addSelect('bezeichnung');
- $this->BenutzergruppeModel ->addSelect('generiert');
- $this->BenutzergruppeModel ->addSelect('uid');
- $this->BenutzergruppeModel ->addSelect('studiensemester_kurzbz');
- $this->BenutzergruppeModel ->addJoin('public.tbl_gruppe', 'gruppe_kurzbz');
- $this->BenutzergruppeModel-> addOrder('bezeichnung', 'ASC');
+ $this->BenutzergruppeModel->addSelect('gruppe_kurzbz');
+ $this->BenutzergruppeModel->addSelect('bezeichnung');
+ $this->BenutzergruppeModel->addSelect('generiert');
+ $this->BenutzergruppeModel->addSelect('uid');
+ $this->BenutzergruppeModel->addSelect('studiensemester_kurzbz');
+ $this->BenutzergruppeModel->addJoin('public.tbl_gruppe', 'gruppe_kurzbz');
+ $this->BenutzergruppeModel->addOrder('bezeichnung', 'ASC');
$result = $this->BenutzergruppeModel->loadWhere(
array(
@@ -49,29 +178,48 @@ class Gruppen extends FHCAPI_Controller
public function deleteGruppe()
{
- $student_uid = $this->input->post('id');
+ $this->load->library("form_validation");
+
+ $this->form_validation->set_rules(
+ 'uid',
+ $this->p->t('person', 'UID'),
+ 'required',
+ [
+ 'required' => $this->p->t('ui', 'error_fieldRequired')
+ ]
+ );
+
+ $this->form_validation->set_rules(
+ 'gruppe_kurzbz',
+ $this->p->t('gruppenmanagement', 'gruppe'),
+ 'required',
+ [
+ 'required' => $this->p->t('ui', 'error_fieldRequired')
+ ]
+ );
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $uid = $this->input->post('uid');
$gruppe_kurzbz = $this->input->post('gruppe_kurzbz');
- //Validate if automatic group generation
- $result = $this->GruppeModel-> loadWhere(
- array(
- 'gruppe_kurzbz' => $gruppe_kurzbz
- )
- );
+ // Validate if automatic group generation
+ $result = $this->GruppeModel->loadWhere([
+ 'gruppe_kurzbz' => $gruppe_kurzbz
+ ]);
$data = $this->getDataOrTerminateWithError($result);
$generation = current($data);
- if($generation->generiert)
+ if ($generation->generiert)
{
$this->terminateWithError($this->p->t('gruppenmanagement', 'error_deleteGeneratedGroups'), self::ERROR_TYPE_GENERAL);
}
- $result = $this->BenutzergruppeModel->delete(
- array(
- 'gruppe_kurzbz' => $gruppe_kurzbz,
- 'uid' => $student_uid
- )
- );
+ $result = $this->BenutzergruppeModel->delete([
+ 'gruppe_kurzbz' => $gruppe_kurzbz,
+ 'uid' => $uid
+ ]);
$data = $this->getDataOrTerminateWithError($result);
diff --git a/application/controllers/api/frontend/v1/stv/Kontakt.php b/application/controllers/api/frontend/v1/stv/Kontakt.php
index 3a8268775..d246a04d9 100644
--- a/application/controllers/api/frontend/v1/stv/Kontakt.php
+++ b/application/controllers/api/frontend/v1/stv/Kontakt.php
@@ -52,6 +52,7 @@ class Kontakt extends FHCAPI_Controller
// Extra Permissionchecks
$permsMa = [];
$permsStud = [];
+ $permsDefault = null;
switch ($this->router->method) {
case 'getBankverbindung':
case 'loadBankverbindung':
@@ -68,7 +69,7 @@ class Kontakt extends FHCAPI_Controller
case 'getKontakte':
case 'loadAddress':
case 'loadContact':
- $permsMa = $permsStud = ['admin:r', 'assistenz:r'];
+ $permsMa = $permsStud = $permsDefault = ['admin:r', 'assistenz:r'];
break;
case 'addNewAddress':
case 'addNewContact':
@@ -76,7 +77,7 @@ class Kontakt extends FHCAPI_Controller
case 'updateContact':
case 'deleteAddress':
case 'deleteContact':
- $permsMa = $permsStud = ['admin:rw', 'assistenz:rw'];
+ $permsMa = $permsStud = $permsDefault = ['admin:rw', 'assistenz:rw'];
break;
}
if ($this->router->method == 'getAdressen'
@@ -91,7 +92,7 @@ class Kontakt extends FHCAPI_Controller
if (is_null($person_id) || !ctype_digit((string)$person_id))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
- $this->checkPermissionsForPerson($person_id, $permsMa, $permsStud);
+ $this->checkPermissionsForPerson($person_id, $permsMa, $permsStud, $permsDefault);
} elseif ($this->router->method == 'loadAddress'
|| $this->router->method == 'loadContact'
|| $this->router->method == 'loadBankverbindung'
@@ -135,7 +136,7 @@ class Kontakt extends FHCAPI_Controller
$person_id = current($data)->person_id;
- $this->checkPermissionsForPerson($person_id, $permsMa, $permsStud);
+ $this->checkPermissionsForPerson($person_id, $permsMa, $permsStud, $permsDefault);
}
}
public function getAdressen($person_id)
diff --git a/application/controllers/api/frontend/v1/stv/Konto.php b/application/controllers/api/frontend/v1/stv/Konto.php
index a33680ea0..384452f3e 100644
--- a/application/controllers/api/frontend/v1/stv/Konto.php
+++ b/application/controllers/api/frontend/v1/stv/Konto.php
@@ -352,7 +352,7 @@ class Konto extends FHCAPI_Controller
continue;
}
-
+
$result = $this->KontoModel->insert([
'person_id' => $buchung['person_id'],
'studiengang_kz' => $buchung['studiengang_kz'],
@@ -361,7 +361,7 @@ class Konto extends FHCAPI_Controller
'buchungstyp_kurzbz' => $buchung['buchungstyp_kurzbz'],
'credit_points' => $buchung['credit_points'],
'zahlungsreferenz' => $buchung['zahlungsreferenz'],
- 'betrag' => $betrag,
+ 'betrag' => number_format($betrag, 2, '.', ''),
'buchungsdatum' => $buchungsdatum,
'mahnspanne' => '0',
'buchungsnr_verweis' => $buchung['buchungsnr'],
diff --git a/application/controllers/api/frontend/v1/stv/Lehrverband.php b/application/controllers/api/frontend/v1/stv/Lehrverband.php
new file mode 100644
index 000000000..72610dd63
--- /dev/null
+++ b/application/controllers/api/frontend/v1/stv/Lehrverband.php
@@ -0,0 +1,63 @@
+ ['admin:r', 'assistenz:r'],
+ 'getTree' => ['admin:r', 'assistenz:r'],
+ 'getSpecialgroups' => ['admin:r', 'assistenz:r']
+ ]);
+ }
+
+ public function hasOrgforms($studiengang_kz)
+ {
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+
+ $result = $this->StudiengangModel->load($studiengang_kz);
+
+ $data = $this->getDataOrTerminateWithError($result);
+ if ($data) {
+ $data = current($data)->mischform;
+ }
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function getTree($studiengang_kz)
+ {
+ $this->load->model('organisation/Lehrverband_model', 'LehrverbandModel');
+
+ $result = $this->LehrverbandModel->loadWhere([
+ 'studiengang_kz' => $studiengang_kz,
+ 'aktiv' => true
+ ]);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function getSpecialgroups($studiengang_kz)
+ {
+ $this->load->model('organisation/Gruppe_model', 'GruppeModel');
+
+ $where = [
+ 'studiengang_kz' => $studiengang_kz,
+ 'lehre' => true,
+ 'sichtbar' => true,
+ 'aktiv' => true,
+ 'direktinskription' => false
+ ];
+
+ $result = $this->GruppeModel->loadWhere($where);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+}
diff --git a/application/controllers/api/frontend/v1/stv/Projektarbeit.php b/application/controllers/api/frontend/v1/stv/Projektarbeit.php
new file mode 100644
index 000000000..75478332f
--- /dev/null
+++ b/application/controllers/api/frontend/v1/stv/Projektarbeit.php
@@ -0,0 +1,368 @@
+ ['admin:r', 'assistenz:r'],
+ 'loadProjektarbeit' => ['admin:r', 'assistenz:r'],
+ 'insertProjektarbeit' => ['admin:rw', 'assistenz:rw'],
+ 'updateProjektarbeit' => ['admin:rw', 'assistenz:rw'],
+ 'deleteProjektarbeit' => ['admin:rw', 'assistenz:rw'],
+ 'getTypenProjektarbeit' => ['admin:r', 'assistenz:r'],
+ 'getFirmen' => ['admin:r', 'assistenz:r'],
+ 'getLehrveranstaltungen' => ['admin:r', 'assistenz:r'],
+ 'getNoten' => ['admin:r', 'assistenz:r']
+ ]);
+
+ // Load Libraries
+ $this->load->library('form_validation');
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'ui',
+ 'person',
+ 'projektarbeit'
+ ]);
+
+ // Load models
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $this->load->model('education/Projekttyp_model', 'ProjekttypModel');
+ $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
+ $this->load->model('ressource/Firma_model', 'FirmaModel');
+ $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
+ $this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
+ $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
+ $this->load->model('education/Note_model', 'NoteModel');
+ $this->load->model('education/Projektbetreuer_model', 'BetreuerModel');
+
+ // load libraries
+ $this->load->library('PermissionLib');
+ }
+
+ public function getProjektarbeit()
+ {
+ $student_uid = $this->input->get('uid');
+
+ if (!isset($student_uid)) $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL);
+
+ $result = $this->ProjektarbeitModel->getProjektarbeit($student_uid);
+
+ if (isError($result))
+ {
+ $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+ }
+
+ if (!hasData($result)) $this->terminateWithSuccess([]);
+
+ $projektarbeiten = getData($result);
+
+ foreach ($projektarbeiten as $projektarbeit)
+ {
+ $projektarbeit_id = $projektarbeit->projektarbeit_id;
+ $abgabeRes = $this->PaabgabeModel->getEndabgabe($projektarbeit_id);
+
+ if (isError($abgabeRes)) $this->terminateWithError(getError($abgabeRes), self::ERROR_TYPE_GENERAL);
+
+ if (hasData($abgabeRes))
+ {
+ $paabgabe = getData($abgabeRes)[0];
+ $projektarbeit->abgabedatum = $paabgabe->abgabedatum;
+ }
+ }
+
+ $this->terminateWithSuccess($projektarbeiten);
+ }
+
+ public function loadProjektarbeit()
+ {
+ $projektarbeit_id = $this->input->get('projektarbeit_id');
+
+ if (!isset($projektarbeit_id) || !is_numeric($projektarbeit_id)) return $this->terminateWithError('Projektarbeit Id missing', self::ERROR_TYPE_GENERAL);
+
+ $this->ProjektarbeitModel->addSelect(
+ 'lehre.tbl_projektarbeit.projektarbeit_id, titel, titel_english, themenbereich, projekttyp_kurzbz, lehrveranstaltung_id, lehreinheit_id,
+ firma_id, beginn, ende, gesperrtbis, note, final, freigegeben, tbl_projektarbeit.anmerkung, fa.name AS firma_name'
+ );
+ $this->ProjektarbeitModel->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id');
+ $this->ProjektarbeitModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
+ $this->ProjektarbeitModel->addJoin('public.tbl_firma fa', 'firma_id', 'LEFT');
+ $result = $this->ProjektarbeitModel->loadWhere(
+ array('projektarbeit_id' => $projektarbeit_id)
+ );
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess(current($data));
+ }
+
+ public function insertProjektarbeit()
+ {
+ $student_uid = $this->input->post('uid');
+
+ if (!$student_uid) return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL);
+
+ if (!$this->_hasBerechtigungForStudent($student_uid))
+ return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]);
+
+ $formData = $this->input->post('formData');
+
+ if ($this->_validate($formData) == false)
+ {
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+ }
+
+ $projektarbeit = $this->_getProjektarbeitArr($formData);
+
+ $result = $this->ProjektarbeitModel->insert(
+ array_merge($projektarbeit, ['insertamum' => date('c'), 'insertvon' => getAuthUID(), 'student_uid' => $student_uid])
+ );
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function updateProjektarbeit()
+ {
+ $projektarbeit_id = $this->input->post('projektarbeit_id');
+
+ if (!$projektarbeit_id || !is_numeric($projektarbeit_id))
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Projektarbeit ID']), self::ERROR_TYPE_GENERAL);
+
+ if (!$this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id))
+ return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]);
+
+ $formData = $this->input->post('formData');
+
+ if ($this->_validate($formData) == false)
+ {
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+ }
+
+ $projektarbeit = $this->_getProjektarbeitArr($formData);
+
+ $result = $this->ProjektarbeitModel->update(
+ $projektarbeit_id,
+ array_merge($projektarbeit, ['updateamum' => date('c'), 'updatevon' => getAuthUID()])
+ );
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function deleteProjektarbeit()
+ {
+ $projektarbeit_id = $this->input->post('projektarbeit_id');
+
+ if (!isset($projektarbeit_id) || !is_numeric($projektarbeit_id))
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Projektarbeit ID'], self::ERROR_TYPE_GENERAL));
+
+ if (!$this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id))
+ return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]);
+
+ $validate = $this->_validateDelete($projektarbeit_id);
+
+ if (isError($validate)) return $this->terminateWithError(getError($validate), self::ERROR_TYPE_GENERAL);
+
+ $result = $this->ProjektarbeitModel->delete(
+ ['projektarbeit_id' => $projektarbeit_id]
+ );
+
+ if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ if (!hasData($result))
+ {
+ $this->outputJson($result);
+ }
+
+ return $this->terminateWithSuccess(current(getData($result)) ? : null);
+ }
+
+ public function getTypenProjektarbeit()
+ {
+ $result = $this->ProjekttypModel->loadWhere(['aktiv' => true]);
+
+ if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ return $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
+ }
+
+ public function getFirmen()
+ {
+ $searchString = $this->input->get('searchString');
+
+ if (!isset($searchString))
+ $this->terminateWithError($this->p->t('ui', 'error_fieldRequired', ['field' => 'Search term']), self::ERROR_TYPE_GENERAL);
+
+ $result = $this->FirmaModel->searchFirmen($searchString, $aktiv = true);
+
+ if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ return $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
+ }
+
+ public function getLehrveranstaltungen()
+ {
+ $student_uid = $this->input->get('student_uid');
+ $studiengang_kz = $this->input->get('studiengang_kz');
+ $studiensemester_kurzbz = $this->input->get('studiensemester_kurzbz');
+ $additional_lehrveranstaltung_id = $this->input->get('additional_lehrveranstaltung_id');
+
+ if (!isset($student_uid)) $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL);
+ if (!isset($studiensemester_kurzbz)) $this->terminateWithError('Studiensemster missing', self::ERROR_TYPE_GENERAL);
+
+ $lvsResult = $this->LehrveranstaltungModel->getLvsForProjektarbeit($student_uid, $studiengang_kz, $additional_lehrveranstaltung_id);
+
+ if (isError($lvsResult)) return $this->terminateWithError($lvsResult, self::ERROR_TYPE_GENERAL);
+
+ $lvs = hasData($lvsResult) ? getData($lvsResult) : [];
+
+ foreach ($lvs as $lv)
+ {
+ $lehreinheiten = $this->LehreinheitModel->getLesForLv(
+ $lv->lehrveranstaltung_id, $studiensemester_kurzbz
+ );
+
+ foreach ($lehreinheiten as $lehreinheit)
+ {
+ if (!isEmptyArray($lehreinheit->lektoren))
+ {
+ $this->MitarbeiterModel->addSelect('kurzbz');
+ $this->MitarbeiterModel->db->where_in('tbl_mitarbeiter.mitarbeiter_uid', $lehreinheit->lektoren);
+ $maResult = $this->MitarbeiterModel->load();
+
+ if (isError($maResult)) return $this->terminateWithError($lvsResult, self::ERROR_TYPE_GENERAL);
+
+ $lehreinheit->lektoren = array_column(getData($maResult), 'kurzbz');
+ }
+ }
+
+ $lv->lehreinheiten = $lehreinheiten;
+ }
+
+ return $this->terminateWithSuccess($lvs);
+ }
+
+ public function getNoten()
+ {
+ $result = $this->NoteModel->load();
+
+ if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ return $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
+ }
+
+ /**
+ *
+ * @param
+ * @return object success or error
+ */
+ private function _validate($formData)
+ {
+ $this->form_validation->set_data($formData);
+
+ $this->form_validation->set_rules('titel', 'Titel', 'required', [
+ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Titel'])
+ ]);
+
+ $this->form_validation->set_rules('projekttyp_kurzbz', 'Projekttyp', 'required', [
+ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Projekttyp'])
+ ]);
+
+ $this->form_validation->set_rules('lehreinheit_id', 'Lehreinheit', 'required|is_natural', [
+ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehreinheit']),
+ 'is_natural' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Lehreinheit'])
+ ]);
+
+ $this->form_validation->set_rules('beginn', 'Beginn', 'is_valid_date', [
+ 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Beginn'])
+ ]);
+
+ $this->form_validation->set_rules('ende', 'Ende', 'is_valid_date', [
+ 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Ende'])
+ ]);
+
+ $this->form_validation->set_rules('gesperrtbis', 'Ende', 'is_valid_date', [
+ 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Gesperrt bis'])
+ ]);
+
+ return $this->form_validation->run();
+ }
+
+ /**
+ *
+ * @param
+ * @return object success or error
+ */
+ private function _getProjektarbeitArr($formData)
+ {
+ return [
+ 'titel' => $formData['titel'],
+ 'titel_english' => $formData['titel_english'] ?? null,
+ 'themenbereich' => $formData['themenbereich'] ?? null,
+ 'projekttyp_kurzbz' => $formData['projekttyp_kurzbz'],
+ 'firma_id' => $formData['firma_id'] ?? null,
+ 'lehreinheit_id' => $formData['lehreinheit_id'],
+ 'beginn' => isset($formData['beginn']) && !isEmptyString($formData['beginn']) ? $formData['beginn'] : null,
+ 'ende' => isset($formData['ende']) && !isEmptyString($formData['ende']) ? $formData['ende'] : null,
+ 'note' => $formData['note'] ?? null,
+ 'final' => $formData['final'] ?? null,
+ 'freigegeben' => $formData['freigegeben'] ?? null,
+ 'anmerkung' => $formData['anmerkung'] ?? null,
+ 'gesperrtbis' => isset($formData['gesperrtbis']) && !isEmptyString($formData['gesperrtbis']) ? $formData['gesperrtbis'] : null
+ ];
+ }
+
+ /**
+ *
+ * @param
+ * @return object success or error
+ */
+ private function _validateDelete($projektarbeit_id)
+ {
+ $this->BetreuerModel->addSelect('1');
+ $result = $this->BetreuerModel->loadWhere(['projektarbeit_id' => $projektarbeit_id]);
+
+ if (isError($result)) return $result;
+
+ if (hasData($result)) return error($this->p->t('projektarbeit', 'error_betreuerNichtGeloescht'));
+
+ $this->PaabgabeModel->addSelect('1');
+ $result = $this->PaabgabeModel->loadWhere(['projektarbeit_id' => $projektarbeit_id]);
+
+ if (isError($result)) return $result;
+
+ if (hasData($result)) return error($this->p->t('projektarbeit', 'error_paabgabeNichtGeloescht'));
+
+ return success();
+ }
+
+ private function _hasBerechtigungForStudent($student_uid)
+ {
+ if (!$student_uid)
+ return false;
+
+ $this->load->model('crm/Student_model', 'StudentModel');
+
+ $this->StudentModel->addSelect('studiengang_kz');
+ $result = $this->StudentModel->load([$student_uid]);
+ if (isError($result) || !hasData($result))
+ return false;
+
+ $studiengang_kz = getData($result)[0]->studiengang_kz;
+
+ if ($this->permissionlib->isBerechtigt('admin', 'suid', $studiengang_kz))
+ return true;
+ if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $studiengang_kz))
+ return true;
+
+ return false;
+ }
+}
diff --git a/application/controllers/api/frontend/v1/stv/Projektbetreuer.php b/application/controllers/api/frontend/v1/stv/Projektbetreuer.php
new file mode 100644
index 000000000..98567ecde
--- /dev/null
+++ b/application/controllers/api/frontend/v1/stv/Projektbetreuer.php
@@ -0,0 +1,341 @@
+ ['admin:r', 'assistenz:r'],
+ 'saveProjektbetreuer' => ['admin:rw', 'assistenz:rw'],
+ 'deleteProjektbetreuer' => ['admin:rw', 'assistenz:rw'],
+ 'getBetreuerarten' => ['admin:r', 'assistenz:r'],
+ 'getNoten' => ['admin:r', 'assistenz:r'],
+ 'getDefaultStundensaetze' => ['admin:r', 'assistenz:r'],
+ 'getProjektbetreuerBySearchQuery' => ['admin:r', 'assistenz:r'],
+ 'getPerson' => ['admin:r', 'assistenz:r'],
+ 'validateProjektbetreuer' => ['admin:r', 'assistenz:r']
+ ]);
+
+ // Load Libraries
+ $this->load->library('form_validation');
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'ui',
+ 'person',
+ 'projektarbeit'
+ ]);
+
+ // Load models
+ $this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel');
+ $this->load->model('education/Betreuerart_model', 'BetreuerartModel');
+ $this->load->model('ressource/Stundensatz_model', 'StundensatzModel');
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $this->load->model('education/Note_model', 'NoteModel');
+ $this->load->model('person/Person_model', 'PersonModel');
+
+ // load libraries
+ $this->load->library('PermissionLib');
+ }
+
+ public function getProjektbetreuer()
+ {
+ $projektarbeit_id = $this->input->get('projektarbeit_id');
+
+ if (!isset($projektarbeit_id))
+ $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Projektarbeit ID']), self::ERROR_TYPE_GENERAL);
+
+ $this->ProjektbetreuerModel->addSelect(
+ 'projektarbeit_id, person_id, nachname, vorname, note, punkte, round(stunden, 1) AS stunden,
+ stundensatz, betreuerart_kurzbz, vertrag_id, titelpre, titelpost'
+ );
+ $this->ProjektbetreuerModel->addSelect("CASE
+ WHEN EXISTS
+ (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid) WHERE person_id=pers.person_id)
+ THEN 'Mitarbeiter'
+ WHEN EXISTS
+ (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_student ON(uid=student_uid) WHERE person_id=pers.person_id)
+ THEN 'Student'
+ ELSE 'Person'
+ END AS status");
+ $this->ProjektbetreuerModel->addJoin('public.tbl_person pers', 'person_id');
+ $result = $this->ProjektbetreuerModel->loadWhere(['projektarbeit_id' => $projektarbeit_id]);
+
+ if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ if (!hasData($result)) $this->terminateWithSuccess([]);
+
+ $projektbetreuer = getData($result);
+
+ //~ foreach ($projektbetreuer as $projektarbeit)
+ //~ {
+ //~ $projektarbeit_id = $projektarbeit->projektarbeit_id;
+ //~ $abgabeRes = $this->PaabgabeModel->getEndabgabe($projektarbeit_id);
+
+ //~ if (isError($abgabeRes)) $this->terminateWithError(getError($abgabeRes), self::ERROR_TYPE_GENERAL);
+
+ //~ if (hasData($abgabeRes))
+ //~ {
+ //~ $paabgabe = getData($abgabeRes)[0];
+ //~ $projektarbeit->abgabedatum = $paabgabe->abgabedatum;
+ //~ }
+ //~ }
+
+ foreach ($projektbetreuer as $pb)
+ {
+ $downloadLink = null;
+ Events::trigger(
+ 'projektbeurteilung_download_link',
+ $pb->projektarbeit_id,
+ $pb->betreuerart_kurzbz,
+ $pb->person_id,
+ function ($value) use (&$downloadLink) {
+ $downloadLink = $value;
+ }
+ );
+ $pb->beurteilungDownloadLink = $downloadLink;
+ }
+
+ $this->terminateWithSuccess($this->_addFullNameToBetreuer($projektbetreuer));
+ }
+
+ public function saveProjektbetreuer()
+ {
+ $projektarbeit_id = $this->input->post('projektarbeit_id');
+
+ if (!isset($projektarbeit_id) || !is_numeric($projektarbeit_id))
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Projektarbeit ID']), self::ERROR_TYPE_GENERAL);
+
+ if (!$this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id))
+ return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]);
+
+ $projektbetreuer = $this->input->post('projektbetreuer');
+
+ if ($this->_validate($projektbetreuer) == false) $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $result = null;
+
+ $betreuer = [
+ 'projektarbeit_id' => $projektarbeit_id,
+ 'person_id' => $projektbetreuer['person_id'],
+ 'note' => $projektbetreuer['note'],
+ 'stunden' => $projektbetreuer['stunden'],
+ 'stundensatz' => $projektbetreuer['stundensatz'],
+ 'betreuerart_kurzbz' => $projektbetreuer['betreuerart_kurzbz']
+ ];
+
+ if (isset($projektbetreuer['person_id_old']) && isset($projektbetreuer['betreuerart_kurzbz_old']))
+ {
+ $result = $this->ProjektbetreuerModel->update(
+ [
+ 'projektarbeit_id' => $projektarbeit_id,
+ 'person_id' => $projektbetreuer['person_id_old'],
+ 'betreuerart_kurzbz' => $projektbetreuer['betreuerart_kurzbz_old']
+ ],
+ array_merge($betreuer, ['updateamum' => date('c'), 'updatevon' => getAuthUID()])
+ );
+ }
+ else
+ {
+ $result = $this->ProjektbetreuerModel->insert(
+ array_merge($betreuer, ['insertamum' => date('c'), 'insertvon' => getAuthUID()])
+ );
+ }
+
+ if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
+ }
+
+ public function deleteProjektbetreuer()
+ {
+ $projektarbeit_id = $this->input->post('projektarbeit_id');
+ $person_id = $this->input->post('person_id');
+ $betreuerart_kurzbz = $this->input->post('betreuerart_kurzbz');
+
+ if (!isset($projektarbeit_id) || !is_numeric($projektarbeit_id))
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> $this->p->t('projektarbeit', 'projektarbeit').' ID'], self::ERROR_TYPE_GENERAL));
+
+ if (!isset($person_id) || !is_numeric($person_id))
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID'], self::ERROR_TYPE_GENERAL));
+
+ if (!isset($betreuerart_kurzbz))
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> $this->p->t('projektarbeit', 'betreuerart')], self::ERROR_TYPE_GENERAL));
+
+ if (!$this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id))
+ return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]);
+
+ $validate = $this->_validateDelete($projektarbeit_id, $person_id);
+
+ if (isError($validate)) return $this->terminateWithError(getError($validate), self::ERROR_TYPE_GENERAL);
+
+ $result = $this->ProjektbetreuerModel->delete(
+ ['projektarbeit_id' => $projektarbeit_id, 'person_id' => $person_id, 'betreuerart_kurzbz' => $betreuerart_kurzbz]
+ );
+
+ if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ if (!hasData($result))
+ {
+ $this->outputJson($result);
+ }
+
+ return $this->terminateWithSuccess(current(getData($result)) ? : null);
+ }
+
+ public function getBetreuerarten()
+ {
+ $result = $this->BetreuerartModel->loadWhere(['aktiv' => true]);
+
+ if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ return $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
+ }
+
+ public function getNoten()
+ {
+ $result = $this->NoteModel->load();
+
+ if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ return $this->terminateWithSuccess(hasData($result) ? getData($result) : []);
+ }
+
+ public function getDefaultStundensaetze()
+ {
+ $person_id = $this->input->get('person_id');
+ $studiensemester_kurzbz = $this->input->get('studiensemester_kurzbz');
+
+ $result = $this->StundensatzModel->getStundensatzForMitarbeiter($person_id, $studiensemester_kurzbz);
+
+ return $this->terminateWithSuccess($result);
+ }
+
+ public function getProjektbetreuerBySearchQuery()
+ {
+ $searchString = $this->input->get('searchString');
+
+ if (!isset($searchString))
+ $this->terminateWithError($this->p->t('ui', 'error_fieldRequired', ['field' => 'Search term']), self::ERROR_TYPE_GENERAL);
+
+ $result = $this->PersonModel->searchPerson($searchString);
+
+ if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ return $this->terminateWithSuccess(hasData($result) ? $this->_addFullNameToBetreuer(getData($result)) : []);
+ }
+
+ public function getPerson()
+ {
+ $person_id = $this->input->get('person_id');
+
+ if (!isset($person_id))
+ $this->terminateWithError($this->p->t('ui', 'error_fieldRequired', ['field' => 'Person']), self::ERROR_TYPE_GENERAL);
+
+ $this->PersonModel->addSelect("CASE
+ WHEN EXISTS
+ (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid) WHERE person_id=tbl_person.person_id)
+ THEN 'Mitarbeiter'
+ WHEN EXISTS
+ (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_student ON(uid=student_uid) WHERE person_id=tbl_person.person_id)
+ THEN 'Student'
+ ELSE 'Person'
+ END AS status");
+ $result = $this->PersonModel->addSelect('titelpre, titelpost, vorname, nachname, person_id');
+ $result = $this->PersonModel->load($person_id);
+
+ if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ return $this->terminateWithSuccess(hasData($result) ? $this->_addFullNameToBetreuer(getData($result))[0] : []);
+ }
+
+ /**
+ *
+ * @param
+ * @return object success or error
+ */
+ public function validateProjektbetreuer()
+ {
+ $projektbetreuerArr = $this->input->post('projektbetreuer');
+
+ if (!is_array($projektbetreuerArr)) $projektbetreuerArr = [$projektbetreuerArr];
+
+ foreach ($projektbetreuerArr as $pb)
+ {
+ if ($this->_validate($pb) == false)
+ {
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+ }
+ }
+
+ $this->terminateWithSuccess([]);
+ }
+
+ /**
+ *
+ * @param
+ * @return object success or error
+ */
+ private function _validate($formData)
+ {
+ $this->form_validation->set_data($formData);
+
+ $this->form_validation->set_rules('betreuerart_kurzbz', 'Betreuerart', 'required', [
+ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('projektarbeit', 'betreuerart')])
+ ]);
+
+ $this->form_validation->set_rules('person_id', 'Person', 'required', [
+ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('projektarbeit', 'betreuer')])
+ ]);
+
+ $this->form_validation->set_rules('stunden', 'Stunden', 'numeric', [
+ 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => $this->p->t('projektarbeit', 'stunden')])
+ ]);
+
+ $this->form_validation->set_rules('stundensatz', 'Stundensatz', 'numeric', [
+ 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => $this->p->t('projektarbeit', 'stundensatz')])
+ ]);
+
+
+ return $this->form_validation->run();
+ }
+
+ /**
+ *
+ * @param
+ * @return object success or error
+ */
+ private function _validateDelete($projektarbeit_id, $person_id)
+ {
+ $this->ProjektbetreuerModel->addSelect('vertrag_id');
+ $result = $this->ProjektbetreuerModel->loadWhere(['projektarbeit_id' => $projektarbeit_id, 'person_id' => $person_id]);
+
+ if (isError($result)) return $result;
+
+ if (hasData($result) && getData($result)[0]->vertrag_id != null) return error($this->p->t('projektarbeit', 'error_betreuerHatVertrag'));
+
+ return success();
+ }
+
+ /**
+ *
+ * @param
+ * @return object success or error
+ */
+ private function _addFullNameToBetreuer($betreuerArr)
+ {
+ foreach ($betreuerArr as $betreuer)
+ {
+ $betreuer->name = ($betreuer->titelpre ? $betreuer->titelpre . ' ' : '') .
+ $betreuer->nachname . ' ' . $betreuer->vorname . ($betreuer->titelpost ? ' ' . $betreuer->titelpre : '').
+ ' (' . $betreuer->status . ')';
+ }
+
+ return $betreuerArr;
+ }
+}
diff --git a/application/controllers/api/frontend/v1/stv/Status.php b/application/controllers/api/frontend/v1/stv/Status.php
index dc48a47ff..e490772db 100644
--- a/application/controllers/api/frontend/v1/stv/Status.php
+++ b/application/controllers/api/frontend/v1/stv/Status.php
@@ -114,9 +114,8 @@ class Status extends FHCAPI_Controller
$this->load->model('codex/Bismeldestichtag_model', 'BismeldestichtagModel');
$result = $this->BismeldestichtagModel->getLastReachedMeldestichtag();
- $data = $this->getDataOrTerminateWithError($result);
- $this->terminateWithSuccess($data);
+ $this->terminateWithSuccess(hasData($result) ? getData($result) : array());
}
public function isLastStatus($prestudent_id)
@@ -296,7 +295,7 @@ class Status extends FHCAPI_Controller
}],
//Check if Rolle already exists
['rolle_doesnt_exist', function () use ($prestudent_id, $status_kurzbz, $studiensemester_kurzbz, $ausbildungssemester) {
- if (!$status_kurzbz || !$studiensemester_kurzbz || !$ausbildungssemester)
+ if (!$status_kurzbz || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '')
return true; // Error will be handled by the required statements above
$result = $this->PrestudentstatusModel->load([$ausbildungssemester, $studiensemester_kurzbz, $status_kurzbz, $prestudent_id]);
@@ -903,7 +902,7 @@ class Status extends FHCAPI_Controller
$this->form_validation->set_rules('_default', '', [
['rolle_doesnt_exist', function () use ($prestudent_id, $status_kurzbz, $studiensemester_kurzbz, $ausbildungssemester) {
- if (!$status_kurzbz || !$studiensemester_kurzbz || !$ausbildungssemester)
+ if (!$status_kurzbz || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '')
return true; // Error will be handled by the required statements above
$result = $this->PrestudentstatusModel->load([$ausbildungssemester, $studiensemester_kurzbz, $status_kurzbz, $prestudent_id]);
@@ -920,7 +919,7 @@ class Status extends FHCAPI_Controller
) {
if ($isBerechtigtNoStudstatusCheck)
return true; // Skip if access right says so
- if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !$ausbildungssemester)
+ if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '')
return true; // Error will be handled by the required statements above
$result = $this->prestudentstatuschecklib->checkStatusHistoryTimesequence(
@@ -945,7 +944,7 @@ class Status extends FHCAPI_Controller
) {
if ($isBerechtigtNoStudstatusCheck)
return true; // Skip if access right says so
- if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !$ausbildungssemester)
+ if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '')
return true; // Error will be handled by the required statements above
$result = $this->prestudentstatuschecklib->checkStatusHistoryLaststatus(
@@ -970,7 +969,7 @@ class Status extends FHCAPI_Controller
) {
if ($isBerechtigtNoStudstatusCheck)
return true; // Skip if access right says so
- if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !$ausbildungssemester)
+ if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '')
return true; // Error will be handled by the required statements above
$result = $this->prestudentstatuschecklib->checkStatusHistoryUnterbrechersemester(
@@ -995,7 +994,7 @@ class Status extends FHCAPI_Controller
) {
if ($isBerechtigtNoStudstatusCheck)
return true; // Skip if access right says so
- if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !$ausbildungssemester)
+ if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '')
return true; // Error will be handled by the required statements above
$result = $this->prestudentstatuschecklib->checkStatusHistoryAbbrechersemester(
@@ -1020,7 +1019,7 @@ class Status extends FHCAPI_Controller
) {
if ($isBerechtigtNoStudstatusCheck)
return true; // Skip if access right says so
- if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !$ausbildungssemester)
+ if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '')
return true; // Error will be handled by the required statements above
$result = $this->prestudentstatuschecklib->checkStatusHistoryDiplomant(
diff --git a/application/controllers/api/frontend/v1/stv/Student.php b/application/controllers/api/frontend/v1/stv/Student.php
index f2845572f..f87afff9e 100644
--- a/application/controllers/api/frontend/v1/stv/Student.php
+++ b/application/controllers/api/frontend/v1/stv/Student.php
@@ -36,6 +36,7 @@ class Student extends FHCAPI_Controller
parent::__construct([
'get' => ['admin:r', 'assistenz:r'],
'save' => ['admin:rw', 'assistenz:rw'],
+ 'saveStudent' => ['admin:rw', 'assistenz:rw'],
'check' => ['admin:rw', 'assistenz:rw'],
'add' => ['admin:rw', 'assistenz:rw'] // TODO(chris): extra permissions
]);
@@ -55,7 +56,7 @@ class Student extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
- 'ui', 'lehre'
+ 'ui', 'lehre', 'person'
]);
}
@@ -424,6 +425,31 @@ class Student extends FHCAPI_Controller
), ''));
}
+ /**
+ * Saves data to a prestudent using their student_uid
+ *
+ * @param string $student_uid
+ * @param string $studiensemester_kurzbz
+ * @return void
+ */
+ public function saveStudent($student_uid, $studiensemester_kurzbz)
+ {
+ $this->load->model('crm/Student_model', 'StudentModel');
+
+ $result = $this->StudentModel->load([$student_uid]);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ if (!$data)
+ show_404(); // No Student with that ID
+
+ $student = current($data);
+
+ $this->checkPermissionsForPrestudent($student->prestudent_id, ['admin:rw', 'assistenz:rw']);
+
+ return $this->save($student->prestudent_id, $studiensemester_kurzbz);
+ }
+
public function check()
{
$this->load->library('form_validation');
@@ -465,7 +491,6 @@ class Student extends FHCAPI_Controller
if (!$this->input->post('person_id')) {
if (!isset($_POST['address']) || !is_array($_POST['address']))
$_POST['address'] = [];
- $_POST['address']['func'] = 1;
}
if ($this->input->post('incoming')) {
$_POST['ausbildungssemester'] = 0;
@@ -474,31 +499,37 @@ class Student extends FHCAPI_Controller
$this->load->library('form_validation');
$this->form_validation->set_rules('nachname', 'Nachname', 'callback_requiredIfNotPersonId', [
- 'requiredIfNotPersonId' => $this->p->t('ui', 'error_required')
+ 'requiredIfNotPersonId' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'nachname')])
]);
$this->form_validation->set_rules('geschlecht', 'Geschlecht', 'callback_requiredIfNotPersonId', [
- 'requiredIfNotPersonId' => $this->p->t('ui', 'error_required')
+ 'requiredIfNotPersonId' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'geschlecht')])
]);
- $this->form_validation->set_rules('gebdatum', 'Geburtsdatum', 'callback_isValidDate', [
+ $this->form_validation->set_rules('gebdatum', 'Geburtsdatum', ['isValidDate', function($value) { return isValidDate($value); }], [
'isValidDate' => $this->p->t('ui', 'error_invalid_date')
]);
$this->form_validation->set_rules('address[func]', 'Address', 'required|integer|less_than[2]|greater_than[-2]');
$this->form_validation->set_rules('address[plz]', 'PLZ', 'callback_requiredIfAddressFunc', [
- 'requiredIfAddressFunc' => $this->p->t('ui', 'error_required')
+ 'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'plz')])
]);
$this->form_validation->set_rules('address[gemeinde]', 'Gemeinde', 'callback_requiredIfAddressFunc', [
- 'requiredIfAddressFunc' => $this->p->t('ui', 'error_required')
+ 'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'gemeinde')])
]);
$this->form_validation->set_rules('address[ort]', 'Ort', 'callback_requiredIfAddressFunc', [
- 'requiredIfAddressFunc' => $this->p->t('ui', 'error_required')
+ 'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'ort')])
]);
$this->form_validation->set_rules('address[address]', 'Adresse', 'callback_requiredIfAddressFunc', [
- 'requiredIfAddressFunc' => $this->p->t('ui', 'error_required')
+ 'requiredIfAddressFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'adresse')])
]);
$this->form_validation->set_rules('email', 'E-Mail', 'valid_email');
- $this->form_validation->set_rules('studiengang_kz', 'Studiengang', 'required');
- $this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'required');
- $this->form_validation->set_rules('ausbildungssemester', 'Ausbildungssemester', 'required|integer|less_than[9]|greater_than[-1]');
+ $this->form_validation->set_rules('studiengang_kz', 'Studiengang', 'callback_requiredIfStudentFunc', [
+ 'requiredIfStudentFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'studiengang')])
+ ]);
+ $this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'callback_requiredIfStudentFunc', [
+ 'requiredIfStudentFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'studiensemester')])
+ ]);
+ $this->form_validation->set_rules('ausbildungssemester', 'Ausbildungssemester', 'callback_requiredIfStudentFunc|integer|less_than[9]|greater_than[-1]', [
+ 'requiredIfStudentFunc' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'ausbildungssemester')])
+ ]);
// TODO(chris): validate studienplan with studiengang, semester and orgform?
// TODO(chris): validate person_id, studiengang_kz, studiensemester_kurzbz, orgform_kurzbz, nation, gemeinde, ort, geschlecht?
@@ -518,7 +549,9 @@ class Student extends FHCAPI_Controller
if ($this->db->trans_status() === FALSE)
$this->terminateWithError('TODO(chris): TEXT', self::ERROR_TYPE_GENERAL);
- $this->terminateWithSuccess($result);
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
}
protected function addInteressent()
@@ -575,6 +608,8 @@ class Student extends FHCAPI_Controller
'zustelladresse' => true,
];
if ($anlegen < 0) { // Überschreiben
+ $this->AdresseModel->addSelect('adresse_id');
+ $this->AdresseModel->addJoin('public.tbl_adressentyp', 'typ = adressentyp_kurzbz');
$this->AdresseModel->addOrder('zustelladresse', 'DESC');
$this->AdresseModel->addOrder('sort');
$result = $this->AdresseModel->loadWhere([
@@ -631,70 +666,74 @@ class Student extends FHCAPI_Controller
}
}
- // Prestudent anlegen
- $data = [
- 'aufmerksamdurch_kurzbz' => 'k.A.',
- 'person_id' => $person_id,
- 'studiengang_kz' => $this->input->post('studiengang_kz'),
- 'ausbildungcode' => $this->input->post('letzteausbildung'),
- 'anmerkung' => $this->input->post('anmerkungen'),
- 'reihungstestangetreten' => false,
- 'bismelden' => true
- ];
- $ausbildungsart = $this->input->post('ausbildungsart');
- if ($ausbildungsart)
- $data['anmerkung'] .= ' Ausbildungsart:' . $ausbildungsart;
- // Incomings und ausserordentliche sind bei Meldung nicht förderrelevant
- $incoming = $this->input->post('incoming');
- if ($incoming || substr($data['studiengang_kz'], 0, 1) == '9')
- $data['foerderrelevant'] = false;
- // Wenn die Person schon im System erfasst ist, dann die ZGV des Datensatzes uebernehmen
- $this->PrestudentModel->addOrder('zgvmas_code');
- $this->PrestudentModel->addOrder('zgv_code', 'DESC');
- $this->PrestudentModel->addLimit(1);
- $result = $this->PrestudentModel->loadWhere([
- 'person_id' => $person_id
- ]);
- $prestudent = $this->getDataOrTerminateWithError($result);
- if ($prestudent) {
- $prestudent = current($prestudent);
- if ($prestudent->zgv_code) {
- $data['zgv_code'] = $prestudent->zgv_code;
- $data['zgvort'] = $prestudent->zgvort;
- $data['zgvdatum'] = $prestudent->zgvdatum;
+ $personOnly = $anlegen = $this->input->post('personOnly');
- $data['zgvmas_code'] = $prestudent->zgvmas_code;
- $data['zgvmaort'] = $prestudent->zgvmaort;
- $data['zgvmadatum'] = $prestudent->zgvmadatum;
+ if (!$personOnly)
+ {
+ // Prestudent anlegen
+ $data = [
+ 'aufmerksamdurch_kurzbz' => 'k.A.',
+ 'person_id' => $person_id,
+ 'studiengang_kz' => $this->input->post('studiengang_kz'),
+ 'ausbildungcode' => $this->input->post('letzteausbildung'),
+ 'anmerkung' => $this->input->post('anmerkungen'),
+ 'reihungstestangetreten' => false,
+ 'bismelden' => true
+ ];
+ $ausbildungsart = $this->input->post('ausbildungsart');
+ if ($ausbildungsart)
+ $data['anmerkung'] .= ' Ausbildungsart:' . $ausbildungsart;
+ // Incomings und ausserordentliche sind bei Meldung nicht förderrelevant
+ $incoming = $this->input->post('incoming');
+ if ($incoming || substr($data['studiengang_kz'], 0, 1) == '9')
+ $data['foerderrelevant'] = false;
+ // Wenn die Person schon im System erfasst ist, dann die ZGV des Datensatzes uebernehmen
+ $this->PrestudentModel->addOrder('zgvmas_code');
+ $this->PrestudentModel->addOrder('zgv_code', 'DESC');
+ $this->PrestudentModel->addLimit(1);
+ $result = $this->PrestudentModel->loadWhere([
+ 'person_id' => $person_id
+ ]);
+ $prestudent = $this->getDataOrTerminateWithError($result);
+ if ($prestudent) {
+ $prestudent = current($prestudent);
+ if ($prestudent->zgv_code) {
+ $data['zgv_code'] = $prestudent->zgv_code;
+ $data['zgvort'] = $prestudent->zgvort;
+ $data['zgvdatum'] = $prestudent->zgvdatum;
+
+ $data['zgvmas_code'] = $prestudent->zgvmas_code;
+ $data['zgvmaort'] = $prestudent->zgvmaort;
+ $data['zgvmadatum'] = $prestudent->zgvmadatum;
+ }
+ }
+ // Prestudent speichern
+ $result = $this->PrestudentModel->insert($data);
+ $prestudent_id = $this->getDataOrTerminateWithError($result);
+
+ // Prestudent Rolle Anlegen
+ $data = [
+ 'prestudent_id' => $prestudent_id,
+ 'status_kurzbz' => $incoming ? 'Incoming' : 'Interessent',
+ 'studiensemester_kurzbz' => $this->input->post('studiensemester_kurzbz'),
+ 'ausbildungssemester' => $this->input->post('ausbildungssemester') ?: 0,
+ 'orgform_kurzbz' => $this->input->post('orgform_kurzbz') ?: null,
+ 'studienplan_id' => $this->input->post('studienplan_id') ?: null,
+ 'datum' => date('Y-m-d'),
+ 'insertamum' => date('c'),
+ 'insertvon' => getAuthUID()
+ ];
+ $result = $this->PrestudentstatusModel->insert($data);
+ $this->getDataOrTerminateWithError($result);
+
+ if ($incoming) {
+ // TODO(chris): IMPLEMENT!
+ //Matrikelnummer und UID generieren
+ //Benutzerdatensatz anlegen
+ //Studentendatensatz anlegen
+ //StudentLehrverband anlegen
}
}
- // Prestudent speichern
- $result = $this->PrestudentModel->insert($data);
- $prestudent_id = $this->getDataOrTerminateWithError($result);
-
- // Prestudent Rolle Anlegen
- $data = [
- 'prestudent_id' => $prestudent_id,
- 'status_kurzbz' => $incoming ? 'Incoming' : 'Interessent',
- 'studiensemester_kurzbz' => $this->input->post('studiensemester_kurzbz'),
- 'ausbildungssemester' => $this->input->post('ausbildungssemester') ?: 0,
- 'orgform_kurzbz' => $this->input->post('orgform_kurzbz') ?: null,
- 'studienplan_id' => $this->input->post('studienplan_id') ?: null,
- 'datum' => date('Y-m-d'),
- 'insertamum' => date('c'),
- 'insertvon' => getAuthUID()
- ];
- $result = $this->PrestudentstatusModel->insert($data);
- $this->getDataOrTerminateWithError($result);
-
- if ($incoming) {
- // TODO(chris): IMPLEMENT!
- //Matrikelnummer und UID generieren
- //Benutzerdatensatz anlegen
- //Studentendatensatz anlegen
- //StudentLehrverband anlegen
- }
-
// TODO(chris): DEBUG
/*$result = $this->PrestudentModel->loadWhere([
'pestudent_id' => 1
@@ -703,7 +742,7 @@ class Student extends FHCAPI_Controller
return $result;
}*/
- return success(true);
+ return success($person_id);
}
public function requiredIfNotPersonId($value)
@@ -715,7 +754,14 @@ class Student extends FHCAPI_Controller
public function requiredIfAddressFunc($value)
{
- if (!$_POST['address']['func'])
+ if (!$_POST['address']['func'] || $_POST['address']['func'] == 0)
+ return true;
+ return !!$value;
+ }
+
+ public function requiredIfStudentFunc($value)
+ {
+ if ($_POST['personOnly'])
return true;
return !!$value;
}
diff --git a/application/controllers/api/frontend/v1/stv/Students.php b/application/controllers/api/frontend/v1/stv/Students.php
index 9de0c29b1..12440f036 100644
--- a/application/controllers/api/frontend/v1/stv/Students.php
+++ b/application/controllers/api/frontend/v1/stv/Students.php
@@ -44,14 +44,12 @@ class Students extends FHCAPI_Controller
}
// Load Libraries
- $this->load->library('VariableLib', ['uid' => getAuthUID()]);
$this->load->library('PhrasesLib');
$this->loadPhrases(
array(
'lehre'
)
);
-
}
/**
@@ -75,7 +73,7 @@ class Students extends FHCAPI_Controller
* /(studiengang_kz)/(orgform)/prestudent/(studiensemester_kurzbz)/(filter) => getPrestudentsOrgform
* /(studiengang_kz)/(orgform)/prestudent/(studiensemester_kurzbz)/(filter)/(otherfilter) => getPrestudentsOrgform
*
- * /(studiensemester_kurzbz)/(studiengang_kz)/(semester)/grp/(gruppe) => getStudentsSpezialguppe
+ * /(studiensemester_kurzbz)/(studiengang_kz)/(semester)/grp/(gruppe) => getStudentsSpezialgruppe
*
* /(studiensemester_kurzbz)/(studiengang_kz) => getStudents
* /(studiensemester_kurzbz)/(studiengang_kz)/(semester) => getStudents
@@ -101,39 +99,183 @@ class Students extends FHCAPI_Controller
}
/**
+ * @param string $studiensemester_kurzbz
+ *
* @return void
*/
- public function getIncoming()
+ public function getIncoming($studiensemester_kurzbz)
{
$this->addMeta('ci_method', __FUNCTION__);
- // TODO(chris): IMPLEMENT!
- $this->terminateWithSuccess([]);
+ $this->addMeta('ci_params', [
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz
+ ]);
+
+
+ $this->load->model('crm/Prestudent_model', 'PrestudentModel');
+
+
+ $this->PrestudentModel->addJoin(
+ "(
+ SELECT prestudent_id
+ FROM public.tbl_prestudentstatus
+ WHERE status_kurzbz = 'Incoming'
+ AND studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
+ ) test",
+ "prestudent_id"
+ );
+
+
+ $this->prepareQuery($studiensemester_kurzbz);
+
+ $this->PrestudentModel->addSelect("COALESCE(
+ v.semester::text,
+ CASE
+ WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent')
+ THEN pls.ausbildungssemester::text
+ ELSE ''::text
+ END
+ ) AS semester", false);
+ $this->PrestudentModel->addSelect("COALESCE(v.verband::text, ''::text)");
+ $this->PrestudentModel->addSelect("COALESCE(v.gruppe::text, ''::text)");
+
+ $this->addSelectPrioRel();
+
+ $this->addFilter($studiensemester_kurzbz);
+
+
+ $result = $this->PrestudentModel->load();
+
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
}
/**
+ * @param string $studiensemester_kurzbz
+ *
* @return void
*/
- public function getOutgoing()
+ public function getOutgoing($studiensemester_kurzbz)
{
$this->addMeta('ci_method', __FUNCTION__);
- // TODO(chris): IMPLEMENT!
- $this->terminateWithSuccess([]);
+ $this->addMeta('ci_params', [
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz
+ ]);
+
+
+ $this->load->model('crm/Prestudent_model', 'PrestudentModel');
+
+
+ $this->PrestudentModel->addJoin(
+ "(
+ SELECT prestudent_id
+ FROM bis.tbl_bisio bis
+ JOIN public.tbl_student USING (student_uid)
+ JOIN public.tbl_studiensemester stdsem ON (
+ (bis.von >= stdsem.start AND bis.von <= stdsem.ende)
+ OR
+ (bis.bis >= stdsem.start AND bis.bis <= stdsem.ende)
+ OR
+ (bis.von <= stdsem.start AND bis.bis >= stdsem.ende)
+ )
+ WHERE NOT EXISTS (
+ SELECT 1
+ FROM public.tbl_prestudentstatus
+ WHERE status_kurzbz = 'Incoming'
+ AND prestudent_id = tbl_student.prestudent_id
+ ) AND stdsem.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
+ GROUP BY prestudent_id
+ ) test",
+ "prestudent_id"
+ );
+
+
+ $this->prepareQuery($studiensemester_kurzbz);
+
+
+ $this->PrestudentModel->addSelect("COALESCE(
+ v.semester::text,
+ CASE
+ WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent')
+ THEN pls.ausbildungssemester::text
+ ELSE ''::text
+ END
+ ) AS semester", false);
+ $this->PrestudentModel->addSelect("COALESCE(v.verband::text, ''::text)");
+ $this->PrestudentModel->addSelect("COALESCE(v.gruppe::text, ''::text)");
+
+ $this->addSelectPrioRel();
+
+ $this->addFilter($studiensemester_kurzbz);
+
+
+ $result = $this->PrestudentModel->load();
+
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
}
/**
+ * @param string $studiensemester_kurzbz
+ *
* @return void
*/
- public function getGemeinsamestudien()
+ public function getGemeinsamestudien($studiensemester_kurzbz)
{
$this->addMeta('ci_method', __FUNCTION__);
- // TODO(chris): IMPLEMENT!
- $this->terminateWithSuccess([]);
+ $this->addMeta('ci_params', [
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz
+ ]);
+
+
+ $this->load->model('crm/Prestudent_model', 'PrestudentModel');
+
+
+ $this->PrestudentModel->addJoin(
+ "(
+ SELECT prestudent_id
+ FROM bis.tbl_mobilitaet
+ WHERE studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
+ ) bis",
+ "prestudent_id"
+ );
+
+
+ $this->prepareQuery($studiensemester_kurzbz);
+
+
+ $this->PrestudentModel->addSelect("COALESCE(
+ v.semester::text,
+ CASE
+ WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent')
+ THEN pls.ausbildungssemester::text
+ ELSE ''::text
+ END
+ ) AS semester", false);
+ $this->PrestudentModel->addSelect("COALESCE(v.verband::text, ''::text)");
+ $this->PrestudentModel->addSelect("COALESCE(v.gruppe::text, ''::text)");
+
+ $this->addSelectPrioRel();
+
+ $this->addFilter($studiensemester_kurzbz);
+
+
+ $result = $this->PrestudentModel->load();
+
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
}
- public function getPrestudents($studiengang_kz,
- $studiensemester_kurzbz = null, $filter = null
- )
- {
+ public function getPrestudents(
+ $studiengang_kz,
+ $studiensemester_kurzbz = null,
+ $filter = null
+ ) {
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiengang_kz' => $studiengang_kz,
@@ -144,10 +286,12 @@ class Students extends FHCAPI_Controller
$this->fetchPrestudents($studiengang_kz, $studiensemester_kurzbz, $filter);
}
- public function getPrestudentsOrgform($studiengang_kz, $orgform_kurzbz,
- $studiensemester_kurzbz = null, $filter = null
- )
- {
+ public function getPrestudentsOrgform(
+ $studiengang_kz,
+ $orgform_kurzbz,
+ $studiensemester_kurzbz = null,
+ $filter = null
+ ) {
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiengang_kz' => $studiengang_kz,
@@ -227,7 +371,7 @@ class Students extends FHCAPI_Controller
$stg = $this->getDataOrTerminateWithError($result);
if (!$stg)
- $this->terminateWithValidationErrors(['' => 'Studiengang does not exist']); // TODO(chris): phrase
+ $this->terminateWithSuccess([]);
$stg = current($stg);
$where['ps.status_kurzbz'] = 'Interessent';
@@ -296,7 +440,10 @@ class Students extends FHCAPI_Controller
break;
default:
if (!$studiensemester_kurzbz) {
- // TODO(chris): this does not work with $orgform_kurzbz != null
+ /** NOTE(chris):
+ * show all prestudents in this stg who don't have a status
+ * $orgform_kurzbz does not change the results since orgform is stored in the status table
+ */
$where['ps.status_kurzbz'] = null;
} else {
$this->PrestudentModel->db->where_in('ps.status_kurzbz', [
@@ -310,42 +457,18 @@ class Students extends FHCAPI_Controller
break;
}
- /*
- $this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
- $this->PrestudentModel->addJoin('public.tbl_person p', 'person_id');
- $this->PrestudentModel->addJoin('public.tbl_prestudentstatus pls', '
- pls.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL)
- AND pls.prestudent_id=tbl_prestudent.prestudent_id
- AND pls.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, NULL)
- AND pls.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)', 'LEFT');
- $this->PrestudentModel->addJoin('lehre.tbl_studienplan sp', 'studienplan_id', 'LEFT');
- $this->PrestudentModel->addJoin('public.tbl_prestudentstatus ps', '
- ps.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')
- AND ps.prestudent_id=tbl_prestudent.prestudent_id
- AND ps.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')
- AND ps.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')', 'LEFT');*/
$this->prepareQuery($studiensemester_kurzbz);
$this->PrestudentModel->addSelect("
- CASE WHEN ps.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent')
- THEN ps.ausbildungssemester::text
- ELSE ''::text END AS semester", false);
+ CASE
+ WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent')
+ THEN ps.ausbildungssemester::text
+ ELSE ''::text
+ END AS semester", false);
$this->PrestudentModel->addSelect("'' AS verband");
$this->PrestudentModel->addSelect("'' AS gruppe");
$this->addSelectPrioRel();
- //add status per semester
- $this->PrestudentModel->addSelect(
- "(
- SELECT status_kurzbz
- FROM public.tbl_prestudentstatus pss
- WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
- AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
- ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
- LIMIT 1
- ) AS statusofsemester"
- );
-
$this->addFilter($studiensemester_kurzbz);
$result = $this->PrestudentModel->loadWhere($where);
@@ -355,10 +478,13 @@ class Students extends FHCAPI_Controller
$this->terminateWithSuccess($data);
}
- public function getStudents($studiensemester_kurzbz,
- $studiengang_kz, $semester = null, $verband = null, $gruppe = null
- )
- {
+ public function getStudents(
+ $studiensemester_kurzbz,
+ $studiengang_kz,
+ $semester = null,
+ $verband = null,
+ $gruppe = null
+ ) {
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
@@ -371,10 +497,14 @@ class Students extends FHCAPI_Controller
$this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, $verband, $gruppe, null, null);
}
- public function getStudentsOrgform($studiensemester_kurzbz,
- $studiengang_kz, $orgform_kurzbz, $semester = null, $verband = null, $gruppe = null
- )
- {
+ public function getStudentsOrgform(
+ $studiensemester_kurzbz,
+ $studiengang_kz,
+ $orgform_kurzbz,
+ $semester = null,
+ $verband = null,
+ $gruppe = null
+ ) {
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
@@ -388,10 +518,12 @@ class Students extends FHCAPI_Controller
$this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, $verband, $gruppe, null, $orgform_kurzbz);
}
- public function getStudentsSpezialgruppe($studiensemester_kurzbz,
- $studiengang_kz, $semester, $gruppe_kurzbz,
- $orgform_kurzbz = null)
- {
+ public function getStudentsSpezialgruppe(
+ $studiensemester_kurzbz,
+ $studiengang_kz,
+ $semester,
+ $gruppe_kurzbz
+ ) {
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
@@ -403,10 +535,13 @@ class Students extends FHCAPI_Controller
$this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, null, null, $gruppe_kurzbz, null);
}
- public function getStudentsOrgformSpezialgruppe($studiensemester_kurzbz,
- $orgform_kurzbz, $studiengang_kz, $semester, $gruppe_kurzbz
- )
- {
+ public function getStudentsOrgformSpezialgruppe(
+ $studiensemester_kurzbz,
+ $orgform_kurzbz,
+ $studiengang_kz,
+ $semester,
+ $gruppe_kurzbz
+ ) {
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiensemester_kurzbz' => $studiensemester_kurzbz,
@@ -430,8 +565,15 @@ class Students extends FHCAPI_Controller
*
* @return void
*/
- protected function fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester = null, $verband = null, $gruppe = null, $gruppe_kurzbz = null, $orgform_kurzbz = null)
- {
+ protected function fetchStudents(
+ $studiensemester_kurzbz,
+ $studiengang_kz,
+ $semester = null,
+ $verband = null,
+ $gruppe = null,
+ $gruppe_kurzbz = null,
+ $orgform_kurzbz = null
+ ) {
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
@@ -440,21 +582,6 @@ class Students extends FHCAPI_Controller
$this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester'));
}
- /*
- $this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
- $this->PrestudentModel->addJoin('public.tbl_person p', 'person_id');
- $this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id');
- $this->PrestudentModel->addJoin('public.tbl_prestudentstatus pls', '
- pls.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL)
- AND pls.prestudent_id=tbl_prestudent.prestudent_id
- AND pls.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, NULL)
- AND pls.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)', 'LEFT');
- $this->PrestudentModel->addJoin('lehre.tbl_studienplan sp', 'studienplan_id', 'LEFT');
- $this->PrestudentModel->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid');
- $this->PrestudentModel->addJoin(
- 'public.tbl_studentlehrverband v',
- 'v.student_uid=s.student_uid AND v.studiensemester_kurzbz=' . $this->PrestudentModel->escape($studiensemester_kurzbz)
- );*/
$this->prepareQuery($studiensemester_kurzbz, '');
$this->PrestudentModel->addSelect('v.semester');
@@ -462,18 +589,6 @@ class Students extends FHCAPI_Controller
$this->PrestudentModel->addSelect('v.gruppe');
$this->PrestudentModel->addSelect("'' AS priorisierung_relativ");
- //add status per semester
- $this->PrestudentModel->addSelect(
- "(
- SELECT status_kurzbz
- FROM public.tbl_prestudentstatus pss
- WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
- AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
- ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
- LIMIT 1
- ) AS statusofsemester"
- );
-
$where = [];
@@ -506,7 +621,6 @@ class Students extends FHCAPI_Controller
false
);
}
-
}
$this->addFilter($studiensemester_kurzbz);
@@ -540,39 +654,18 @@ class Students extends FHCAPI_Controller
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
- /*
- $this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
- $this->PrestudentModel->addJoin('public.tbl_person p', 'person_id');
- $this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT');
- $this->PrestudentModel->addJoin('public.tbl_prestudentstatus pls', '
- pls.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL)
- AND pls.prestudent_id=tbl_prestudent.prestudent_id
- AND pls.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, NULL)
- AND pls.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)', 'LEFT');
- $this->PrestudentModel->addJoin('lehre.tbl_studienplan sp', 'studienplan_id', 'LEFT');
- $this->PrestudentModel->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid', 'LEFT');
- $this->PrestudentModel->addJoin(
- 'public.tbl_studentlehrverband v',
- 'v.student_uid=s.student_uid AND v.studiensemester_kurzbz=' . $this->PrestudentModel->escape($studiensemester_kurzbz),
- 'LEFT'
- );*/
$this->prepareQuery($studiensemester_kurzbz);
- $this->PrestudentModel->addSelect("COALESCE(v.semester::text, CASE WHEN public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') THEN public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)::text ELSE ''::text END) AS semester", false);
- $this->PrestudentModel->addSelect('v.verband');
- $this->PrestudentModel->addSelect('v.gruppe');
-
- //add status per semester
- $this->PrestudentModel->addSelect(
- "(
- SELECT status_kurzbz
- FROM public.tbl_prestudentstatus pss
- WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
- AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
- ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
- LIMIT 1
- ) AS statusofsemester"
- );
+ $this->PrestudentModel->addSelect("COALESCE(
+ v.semester::text,
+ CASE
+ WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent')
+ THEN pls.ausbildungssemester::text
+ ELSE ''::text
+ END
+ ) AS semester", false);
+ $this->PrestudentModel->addSelect("COALESCE(v.verband::text, ''::text)");
+ $this->PrestudentModel->addSelect("COALESCE(v.gruppe::text, ''::text)");
$this->addSelectPrioRel();
@@ -609,40 +702,12 @@ class Students extends FHCAPI_Controller
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
- /*
- $this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
- $this->PrestudentModel->addJoin('public.tbl_person p', 'person_id');
- $this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id');
- $this->PrestudentModel->addJoin('public.tbl_prestudentstatus pls', '
- pls.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL)
- AND pls.prestudent_id=tbl_prestudent.prestudent_id
- AND pls.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, NULL)
- AND pls.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)', 'LEFT');
- $this->PrestudentModel->addJoin('lehre.tbl_studienplan sp', 'studienplan_id', 'LEFT');
- $this->PrestudentModel->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid');
- $this->PrestudentModel->addJoin(
- 'public.tbl_studentlehrverband v',
- 'v.student_uid=s.student_uid AND v.studiensemester_kurzbz=' . $this->PrestudentModel->escape($studiensemester_kurzbz),
- 'LEFT'
- );*/
$this->prepareQuery($studiensemester_kurzbz);
$this->PrestudentModel->addSelect('v.semester');
$this->PrestudentModel->addSelect('v.verband');
$this->PrestudentModel->addSelect('v.gruppe');
- //add status per semester
- $this->PrestudentModel->addSelect(
- "(
- SELECT status_kurzbz
- FROM public.tbl_prestudentstatus pss
- WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
- AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
- ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
- LIMIT 1
- ) AS statusofsemester"
- );
-
$this->addSelectPrioRel();
@@ -681,33 +746,12 @@ class Students extends FHCAPI_Controller
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
- /*
- $this->PrestudentModel->addJoin('public.tbl_person p', 'person_id');
- $this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id');
- $this->PrestudentModel->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid');
- $this->PrestudentModel->addJoin(
- 'public.tbl_studentlehrverband v',
- 'v.student_uid=s.student_uid AND v.studiensemester_kurzbz=' . $this->PrestudentModel->escape($studiensemester_kurzbz),
- 'LEFT'
- );*/
$this->prepareQuery($studiensemester_kurzbz);
$this->PrestudentModel->addSelect('v.semester');
$this->PrestudentModel->addSelect('v.verband');
$this->PrestudentModel->addSelect('v.gruppe');
- //add status per semester
- $this->PrestudentModel->addSelect(
- "(
- SELECT status_kurzbz
- FROM public.tbl_prestudentstatus pss
- WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
- AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
- ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
- LIMIT 1
- ) AS statusofsemester"
- );
-
$this->addSelectPrioRel();
$this->addFilter($studiensemester_kurzbz);
@@ -771,6 +815,18 @@ class Students extends FHCAPI_Controller
// verband
// gruppe
+ //add status per semester
+ $this->PrestudentModel->addSelect(
+ "(
+ SELECT status_kurzbz
+ FROM public.tbl_prestudentstatus pss
+ WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
+ AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
+ ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
+ LIMIT 1
+ ) AS statusofsemester"
+ );
+
$this->PrestudentModel->addSelect('UPPER(stg.typ || stg.kurzbz) AS studiengang');
$this->PrestudentModel->addSelect('tbl_prestudent.studiengang_kz');
$this->PrestudentModel->addSelect('stg.bezeichnung AS stg_bezeichnung');
@@ -806,13 +862,6 @@ class Students extends FHCAPI_Controller
$this->PrestudentModel->addSelect('mentor');
$this->PrestudentModel->addSelect('b.aktiv AS bnaktiv');
- /*$this->PrestudentModel->addSelect('tbl_prestudent.reihungstest_id');
- $this->PrestudentModel->addSelect('tbl_prestudent.anmeldungreihungstest');
- $this->PrestudentModel->addSelect('tbl_prestudent.gsstudientyp_kurzbz');
- $this->PrestudentModel->addSelect('tbl_prestudent.priorisierung');
- $this->PrestudentModel->addSelect('p.zugangscode');
- $this->PrestudentModel->addSelect('p.bpk');*/
-
$this->PrestudentModel->db->where_in('tbl_prestudent.studiengang_kz', $this->allowedStgs);
$this->PrestudentModel->addOrder('nachname');
@@ -827,13 +876,13 @@ class Students extends FHCAPI_Controller
$this->PrestudentModel->addSelect("(
SELECT count(*)
FROM (
- SELECT *, public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) AS laststatus
- FROM PUBLIC.tbl_prestudent pss
- JOIN PUBLIC.tbl_prestudentstatus USING (prestudent_id)
+ SELECT *, public.get_rolle_prestudent(pss.prestudent_id, NULL) AS laststatus
+ FROM public.tbl_prestudent pss
+ JOIN public.tbl_prestudentstatus USING (prestudent_id)
WHERE person_id = p.person_id
AND studiensemester_kurzbz = (
SELECT studiensemester_kurzbz
- FROM PUBLIC.tbl_prestudentstatus
+ FROM public.tbl_prestudentstatus
WHERE prestudent_id = tbl_prestudent.prestudent_id
AND status_kurzbz = 'Interessent'
LIMIT 1
@@ -842,7 +891,7 @@ class Students extends FHCAPI_Controller
) prest
WHERE laststatus NOT IN ('Abbrecher', 'Abgewiesener', 'Absolvent')
AND priorisierung <= tbl_prestudent.priorisierung
- ) || ' (' || tbl_prestudent.priorisierung || ')' AS priorisierung_relativ", false);
+ ) || ' (' || COALESCE(tbl_prestudent.priorisierung::text, ' '::text) || ')' AS priorisierung_relativ", false);
}
/**
@@ -854,40 +903,20 @@ class Students extends FHCAPI_Controller
*/
protected function addFilter($studiensemester_kurzbz)
{
- $filter = json_decode($this->input->get('filter'), true);
+ $filter = $this->input->post('filter');
+
if (!is_array($filter))
{
- $this->addMeta('addfilter', 'invalid filter: ' . $this->input->get('filter'));
+ $this->addMeta('addfilter', 'invalid filter: ' . json_encode($this->input->post('filter')));
return;
}
- if (isset($filter['konto_count_0'])) {
- $bt = $this->PrestudentModel->escape($filter['konto_count_0']);
- $stdsem = $this->PrestudentModel->escape($studiensemester_kurzbz);
-
- $this->PrestudentModel->db->where('(
- SELECT count(*)
- FROM public.tbl_konto
- WHERE person_id=tbl_prestudent.person_id
- AND buchungstyp_kurzbz=' . $bt . '
- AND studiensemester_kurzbz=' . $stdsem . '
- ) =', 0);
- $this->PrestudentModel->db->where('get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) !=', 'Incoming');
- }
- if (isset($filter['konto_missing_counter'])) {
- $bt = $this->PrestudentModel->escape($filter['konto_missing_counter']);
- $stg = '';
- if ($this->variablelib->getVar('kontofilterstg') == 'true')
- $stg = ' AND studiengang_kz=tbl_prestudent.studiengang_kz';
-
- $bt = $bt == 'alle' ? '' : ' AND buchungstyp_kurzbz=' . $bt;
-
- $this->PrestudentModel->db->where('(
- SELECT sum(betrag)
- FROM public.tbl_konto
- WHERE person_id=tbl_prestudent.person_id' .
- $bt .
- $stg . '
- ) !=', 0);
+ foreach ($filter as $item) {
+ if (isset($item['usestdsem']) && $item['usestdsem'])
+ $item['studiensemester_kurzbz'] = $studiensemester_kurzbz;
+ if (!$this->PrestudentModel->addFilter($item)) {
+ $this->addMeta('addfilter', 'invalid filter: ' . json_encode($item));
+ return;
+ }
}
}
}
diff --git a/application/controllers/api/frontend/v1/stv/Verband.php b/application/controllers/api/frontend/v1/stv/Verband.php
index 6487b6263..9fcd97c91 100644
--- a/application/controllers/api/frontend/v1/stv/Verband.php
+++ b/application/controllers/api/frontend/v1/stv/Verband.php
@@ -272,6 +272,7 @@ class Verband extends FHCAPI_Controller
$this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, verband, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester AND verband=v.verband ORDER BY gruppe LIMIT 1)) AS name", false);
$this->StudiengangModel->addSelect("CASE WHEN MAX(gruppe)='' OR MAX(gruppe)=' ' THEN TRUE ELSE FALSE END AS leaf");
+ $this->StudiengangModel->addSelect($this->StudiengangModel->escape($semester) . ' AS semester');
$this->StudiengangModel->addSelect('verband');
$this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
@@ -320,6 +321,8 @@ class Verband extends FHCAPI_Controller
$this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, verband, gruppe, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester AND verband=v.verband AND gruppe=v.gruppe ORDER BY gruppe LIMIT 1)) AS name", false);
$this->StudiengangModel->addSelect("TRUE AS leaf", false);
+ $this->StudiengangModel->addSelect('v.semester');
+ $this->StudiengangModel->addSelect('v.verband');
$this->StudiengangModel->addSelect('gruppe');
$this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
diff --git a/application/controllers/api/frontend/v1/stv/Vertrag.php b/application/controllers/api/frontend/v1/stv/Vertrag.php
new file mode 100644
index 000000000..f94fe795e
--- /dev/null
+++ b/application/controllers/api/frontend/v1/stv/Vertrag.php
@@ -0,0 +1,104 @@
+ ['admin:r', 'assistenz:r'],
+ 'cancelVertrag' => ['admin:r', 'assistenz:r']
+ ]);
+
+ // Load Libraries
+ $this->load->library('form_validation');
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'ui',
+ 'person',
+ 'projektarbeit'
+ ]);
+
+ // Load models
+ $this->load->model('accounting/Vertrag_model', 'VertragModel');
+ $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
+ $this->load->model('person/Benutzer_model', 'BenutzerModel');
+
+ // load libraries
+ $this->load->library('PermissionLib');
+ }
+
+ public function getVertrag()
+ {
+ $vertrag_id = $this->input->get('vertrag_id');
+
+ if (!isset($vertrag_id) || !is_numeric($vertrag_id))
+ $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Vertrag ID']), self::ERROR_TYPE_GENERAL);
+
+ $result = $this->VertragModel->getVertragById($vertrag_id);
+
+ if (isError($result))
+ {
+ $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+ }
+
+ if (!hasData($result)) $this->terminateWithSuccess([]);
+
+ $vertrag = getData($result)[0];
+
+ $this->terminateWithSuccess($vertrag);
+ }
+
+ public function cancelVertrag()
+ {
+ $vertrag_id = $this->input->post('vertrag_id');
+ $person_id = $this->input->post('person_id');
+
+ if (!isset($vertrag_id) || !is_numeric($vertrag_id))
+ $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Vertrag ID']), self::ERROR_TYPE_GENERAL);
+ if (!isset($person_id) || !is_numeric($person_id))
+ $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL);
+
+ // * first find lehrveranstaltung_id of the contracts lehrveranstaltung
+ $this->VertragModel->addSelect('lehrveranstaltung_id');
+ $this->VertragModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id', 'LEFT');
+ $result = $this->VertragModel->loadWhere(['vertrag_id' => $vertrag_id]);
+
+ if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+
+ if (!hasData($result)) $this->terminateWithSuccess([]);
+
+ $lehrveranstaltung_id = getData($result)[0]->lehrveranstaltung_id;
+
+ $allOe = $this->LehrveranstaltungModel->getAllOe($lehrveranstaltung_id);
+
+ if (isError($allOe)) $this->terminateWithError(getError($allOe), self::ERROR_TYPE_GENERAL);
+
+ $allOe = hasData($allOe) ? getData($allOe) : [];
+
+ $this->addMeta('oe', $allOe);
+
+ // * then check if the user has permissions to cancel the corresponding lv-organisational units
+ if (!$this->permissionlib->isBerechtigtMultipleOe('admin', $allOe, 'suid') &&
+ !$this->permissionlib->isBerechtigtMultipleOe('lehre/lehrauftrag_bestellen', $allOe, 'suid'))
+ {
+ return $this->_outputAuthError([$this->router->method => ['admin:rw', 'lehrauftrag_bestellen:rw']]);
+ }
+
+ $uidResult = $this->BenutzerModel->getFromPersonId($person_id);
+
+ if (isError($uidResult)) $this->terminateWithError(getError($uidResult), self::ERROR_TYPE_GENERAL);
+
+ if (!hasData($uidResult)) $this->terminateWithError("no user found", self::ERROR_TYPE_GENERAL);
+
+ $mitarbeiter_uid = getData($uidResult)[0]->uid;
+
+ $result = $this->VertragModel->cancelVertrag($vertrag_id, $mitarbeiter_uid);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+}
diff --git a/application/controllers/api/frontend/v1/vorlagen/Vorlagen.php b/application/controllers/api/frontend/v1/vorlagen/Vorlagen.php
index 01edb33d1..cf76746ef 100644
--- a/application/controllers/api/frontend/v1/vorlagen/Vorlagen.php
+++ b/application/controllers/api/frontend/v1/vorlagen/Vorlagen.php
@@ -51,13 +51,17 @@ class Vorlagen extends FHCAPI_Controller
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
$result = $this->BenutzerfunktionModel->getBenutzerfunktionByUid($uid, 'oezuordnung');
- $data = $this->getDataOrTerminateWithError($result);
- $oe_kurzbz = current($data);
+ if (hasData($result))
+ {
+ $data = getData($result);
- $result = $this->VorlageModel->getAllVorlagenByOe($oe_kurzbz->oe_kurzbz);
- $data = $this->getDataOrTerminateWithError($result);
+ $oe_kurzbz = array_column($data, 'oe_kurzbz');
+ $result = $this->VorlageModel->getAllVorlagenByOe($oe_kurzbz);
+
+ $this->terminateWithSuccess(hasData($result) ? getData($result) : array());
+ }
+ $this->terminateWithSuccess(array());
- $this->terminateWithSuccess($data);
}
}
\ No newline at end of file
diff --git a/application/core/Auth_Controller.php b/application/core/Auth_Controller.php
index 466627fe3..d6c89be57 100644
--- a/application/core/Auth_Controller.php
+++ b/application/core/Auth_Controller.php
@@ -70,20 +70,22 @@ abstract class Auth_Controller extends FHC_Controller
/**
* Checks for Permissions depending if the given person is a
* Mitarbeiter and/or Student
+ * If neither Student nor Mitarbeiter, default permissions are checked
* and exits/outputs an error if they are not met.
*
* @param integer $person_id
* @param array $permMa Perms if the person is a Mitarbeiter
* @param array $permStud Perms if the person is a Student
+ * @param array $permDefault Perms if the person is neither a Student nor a Mitarbeiter
*
* @return void
*/
- protected function checkPermissionsForPerson($person_id, $permMa, $permStud)
+ protected function checkPermissionsForPerson($person_id, $permMa, $permStud, $permDefault = null)
{
- $res = $this->hasPermissionsForPerson($person_id, $permMa, $permStud);
-
+ $res = $this->hasPermissionsForPerson($person_id, $permMa, $permStud, $permDefault);
+
if ($res) {
- $perm = array_keys(array_flip(array_merge($res|1 ? $permMa : [], $res|2 ? $permStud : [])));
+ $perm = array_keys(array_flip(array_merge($res&1 ? $permMa : [], $res&2 ? $permStud : [], $res&4 ? $permDefault : [])));
$this->_outputAuthError([$this->router->method => $perm]);
}
}
@@ -108,16 +110,19 @@ abstract class Auth_Controller extends FHC_Controller
* Checks for Permissions depending if the given person is a
* Mitarbeiter and/or Student
* and returns the result.
- *
+ * If neither Student nor Mitarbeiter, default permissions are checked
+ *
* @param integer $person_id
* @param array $permMa Perms if the person is a Mitarbeiter
* @param array $permStud Perms if the person is a Student
- *
+ * @param array $permDefault Perms if the person is neither a Student nor a Mitarbeiter
* @return integer 0 if permission is granted
*/
- protected function hasPermissionsForPerson($person_id, $permMa, $permStud)
+ protected function hasPermissionsForPerson($person_id, $permMa, $permStud, $permDefault)
{
- $res = 3;
+ $res = 8;
+ $isMitarbeiter = false;
+ $isStudent = false;
$this->load->model('person/Person_model', 'PersonModel');
$this->PersonModel->addJoin('public.tbl_benutzer', 'person_id');
$this->PersonModel->addJoin('public.tbl_mitarbeiter', 'uid = mitarbeiter_uid');
@@ -125,7 +130,8 @@ abstract class Auth_Controller extends FHC_Controller
if (hasData($result)) {
if ($this->permissionlib->isEntitled(['a' => $permMa], 'a'))
return 0;
- $res = 1;
+ $isMitarbeiter = true;
+ $res += 1;
}
$this->PersonModel->addJoin('public.tbl_prestudent', 'person_id');
$result = $this->PersonModel->load($person_id);
@@ -140,8 +146,15 @@ abstract class Auth_Controller extends FHC_Controller
return 0;
}
}
+ $isStudent = true;
$res += 2;
}
+ if (isset($permDefault) && !$isMitarbeiter && !$isStudent)
+ {
+ if ($this->permissionlib->isEntitled(['a' => $permDefault], 'a'))
+ return 0;
+ $res += 4;
+ }
return $res;
}
diff --git a/application/helpers/hlp_common_helper.php b/application/helpers/hlp_common_helper.php
index 00c0a1b93..b13d9d44d 100644
--- a/application/helpers/hlp_common_helper.php
+++ b/application/helpers/hlp_common_helper.php
@@ -515,3 +515,73 @@ function has_permissions_for_stg($studiengang_kz, $permissions = '')
return false;
}
+
+/**
+ * check if an entry exists in the database
+ */
+function is_in_db($key, $model = '')
+{
+ if (!$model)
+ return false;
+
+ $field = strstr($model, ":");
+ if ($field) {
+ $model = strstr($model, ":", true);
+ $field = substr($field, 1);
+ }
+
+ $CI =& get_instance();
+ $CI->load->model($model, $model);
+
+ if ($field) {
+ $result = $CI->$model->loadWhere([
+ $field => $key
+ ]);
+ } else {
+ $result = $CI->$model->load($key);
+ }
+
+ return (isSuccess($result) && hasData($result));
+}
+
+/**
+ * is building an array for Dropdown Entry in Print Dropdown
+ * @param $id id for the Document to add to the Document Array
+ * @param $name title of the dropdownEntry
+ * @param $parameterUrl url of parameters xml, xsl, format etc as needed
+ * WITHOUT BASEURL eg. "xml=abschlusspruefung.rdf.php&xsl_stg_kz=$studiengang_kz&xsl=Bescheid&output=pdf"
+ * @param $uid default parameter, if null only parameterurl will be added
+ * additional needed parameter: put in the parameterUrl
+ * @param $alternativeBaseUrl: if baseUrl not pdfExport.php, put here alternative without ? char, eg. "zutrittskarte.php"
+ *
+ * @return Array
+ */
+function buildDropdownEntryPrintArray($id, $name, $parameterurl, $uid=null, $order=null, $alternativeBaseUrl=null)
+{
+ //DEFAULT BASEURL
+ $baseurl = "pdfExport.php?";
+
+ $uidString = $uid ? "&uid=" . $uid : "";
+
+
+
+ if($alternativeBaseUrl)
+ {
+ return [
+ "id" => $id,
+ "type" => "documenturl",
+ "name" => $name,
+ "url" => $alternativeBaseUrl . "?" . $parameterurl . $uidString,
+ "order" => $order
+ ];
+ }
+ else
+ return [
+ "id" => $id,
+ "type" => "documenturl",
+ "name" => $name,
+ "url" => $baseurl . $parameterurl . "&uid=" . $uid,
+ "order" => $order
+ ];
+
+}
diff --git a/application/helpers/hlp_header_helper.php b/application/helpers/hlp_header_helper.php
index 24c02eac5..309bdedbd 100644
--- a/application/helpers/hlp_header_helper.php
+++ b/application/helpers/hlp_header_helper.php
@@ -246,3 +246,10 @@ function generateSkipLink($skipID)
$toPrint.='" class="fhcSkipLink" aria-label="Skip to main content">';
echo $toPrint;
}
+
+function absoluteJsImportUrl($relurl)
+{
+ $ci =& get_instance();
+ $url = base_url($relurl) . '?'. $ci->config->item('fhcomplete_build_version');
+ return $url;
+}
\ No newline at end of file
diff --git a/application/language/english/form_validation_lang.php b/application/language/english/form_validation_lang.php
index b8918a721..2777cd05e 100644
--- a/application/language/english/form_validation_lang.php
+++ b/application/language/english/form_validation_lang.php
@@ -41,3 +41,4 @@ if (!defined('BASEPATH')) exit('No direct script access allowed');
$lang['form_validation_has_write_permissions'] = 'You have no rights to edit {field} field.';
$lang['form_validation_is_valid_date'] = 'The date format is invalid or out of range.';
$lang['form_validation_has_permissions_for_stg'] = 'You have no rights for stg {field}.';
+$lang['form_validation_is_in_db'] = '{field} does not exist.';
diff --git a/application/models/accounting/Vertrag_model.php b/application/models/accounting/Vertrag_model.php
index c17c676c7..4c036369b 100644
--- a/application/models/accounting/Vertrag_model.php
+++ b/application/models/accounting/Vertrag_model.php
@@ -402,6 +402,26 @@ class Vertrag_model extends DB_Model
return $this->loadWhere(array('mitarbeiter_uid' => $mitarbeiter_uid, 'lehreinheit_id' => $lehreinheit_id));
}
+ public function getVertragById($vertrag_id)
+ {
+ $this->addSelect(
+ 'tbl_vertrag.vertrag_id, vertragstyp_kurzbz, vertragsstunden, vertragsstunden_studiensemester_kurzbz, status.vertragsstatus_kurzbz,
+ status.bezeichnung AS vertragsstatus, tbl_vertrag.betrag, lema.semesterstunden, lema.stundensatz'
+ );
+ $this->addJoin('lehre.tbl_lehreinheitmitarbeiter lema', 'tbl_vertrag.vertrag_id = lema.vertrag_id', 'LEFT');
+ $this->addJoin('
+ (
+ SELECT DISTINCT ON(vst.vertrag_id) vst.vertrag_id,
+ bezeichnung,
+ tbl_vertragsstatus.vertragsstatus_kurzbz
+ FROM lehre.tbl_vertrag_vertragsstatus vst
+ JOIN lehre.tbl_vertragsstatus USING(vertragsstatus_kurzbz)
+ ORDER BY vst.vertrag_id, datum DESC
+ ) as status', 'status.vertrag_id = lehre.tbl_vertrag.vertrag_id', 'LEFT');
+
+ return $this->loadWhere(['tbl_vertrag.vertrag_id' => $vertrag_id]);
+ }
+
public function cancelVertrag($vertrag_id, $mitarbeiter_uid)
{
$vertrag = $this->load($vertrag_id);
diff --git a/application/models/crm/Prestudent_model.php b/application/models/crm/Prestudent_model.php
index ff56c3268..ad5c3e141 100644
--- a/application/models/crm/Prestudent_model.php
+++ b/application/models/crm/Prestudent_model.php
@@ -1,5 +1,7 @@
execQuery($query, array($person_id));
}
+
+ /**
+ * Adds a filter to the query builder
+ *
+ * @param array $filter
+ * @return boolean
+ */
+ public function addFilter($filter)
+ {
+ if (!isset($filter['type']))
+ return false;
+
+ switch ($filter['type']) {
+ case 'konto':
+ $bt = '';
+ $stdsem = '';
+ $comp = '!=';
+
+ if (isset($filter['buchungstyp_kurzbz']) && $filter['buchungstyp_kurzbz'] != 'all')
+ $bt = ' AND buchungstyp_kurzbz=' . $this->escape($filter['buchungstyp_kurzbz']);
+
+ if (isset($filter['studiensemester_kurzbz']))
+ $stdsem = ' AND studiensemester_kurzbz=' . $this->escape($filter['studiensemester_kurzbz']);
+
+ if (isset($filter['missing']) && $filter['missing']) {
+ $comp = '=';
+ $this->db->where('get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) !=', 'Incoming');
+ }
+
+ $this->db->where('(
+ SELECT count(*)
+ FROM public.tbl_konto
+ WHERE person_id=tbl_prestudent.person_id
+ ' . $bt . '
+ ' . $stdsem . '
+ ) ' . $comp, 0);
+ break;
+
+ case 'konto_counter':
+ $bt = '';
+ $samestg = '';
+ $past = '';
+
+ if (isset($filter['buchungstyp_kurzbz']) && $filter['buchungstyp_kurzbz'] != 'all')
+ $bt = ' AND buchungstyp_kurzbz = ' . $this->escape($filter['buchungstyp_kurzbz']);
+
+ if (isset($filter['samestg']) && $filter['samestg'])
+ $samestg = ' AND studiengang_kz = tbl_prestudent.studiengang_kz';
+
+ if (isset($filter['past']) && $filter['past'])
+ $past = ' AND buchungsdatum < NOW()';
+
+ $this->db->where('(
+ SELECT sum(betrag)
+ FROM public.tbl_konto
+ WHERE person_id = tbl_prestudent.person_id
+ ' . $bt . '
+ ' . $samestg . '
+ ' . $past . '
+ ) !=', 0);
+ break;
+
+ case 'zgv':
+ $this->db
+ ->group_start()
+ ->group_start()
+ ->where('zgv_code IS NOT NULL')
+ ->where('zgvdatum IS NULL')
+ ->group_end()
+ ->or_group_start()
+ ->where('zgvmas_code IS NOT NULL')
+ ->where('zgvmadatum IS NULL')
+ ->group_end()
+ ->or_group_start()
+ ->where('zgvdoktor_code IS NOT NULL')
+ ->where('zgvdoktordatum IS NULL')
+ ->group_end()
+ ->group_end();
+ break;
+
+ case 'documents':
+ $this->db->where('(
+ SELECT count(*)
+ FROM public.tbl_dokumentstudiengang
+ WHERE dokument_kurzbz NOT IN (
+ SELECT dokument_kurzbz
+ FROM tbl_dokumentprestudent
+ WHERE prestudent_id=tbl_prestudent.prestudent_id
+ )
+ AND studiengang_kz=tbl_prestudent.studiengang_kz
+ ) !=', 0);
+ break;
+
+ case 'statusgrund':
+ if (!isset($filter['statusgrund_id']))
+ return false;
+
+ if (isset($filter['studiensemester_kurzbz']))
+ $stdsem = ' AND studiensemester_kurzbz=' . $this->escape($filter['studiensemester_kurzbz']);
+
+ $this->db->where('(
+ SELECT count(*)
+ FROM public.tbl_prestudentstatus
+ WHERE prestudent_id = tbl_prestudent.prestudent_id
+ AND statusgrund_id = ' . $this->escape($filter['statusgrund_id']) . '
+ ' . $stdsem . '
+ ) !=', 0);
+ break;
+ }
+
+ Events::trigger('prestudent_add_filter', $filter);
+
+ return true;
+ }
}
diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php
index 97bb48cbf..ccac33bc7 100644
--- a/application/models/education/Lehrveranstaltung_model.php
+++ b/application/models/education/Lehrveranstaltung_model.php
@@ -1286,4 +1286,61 @@ class Lehrveranstaltung_model extends DB_Model
return $this->execReadOnlyQuery($qry, $params);
}
+
+ /**
+ * Gets Lehrveranstaltungen for a student, as needed for a Projektarbeit.
+ * @param student_uid
+ * @param studiengang_kz optional, all Lvs of this Studiengang will be included
+ * @param additional_lehrveranstaltung_id optional, this lv will be added to result
+ * @return object success or error
+ */
+ public function getLvsForProjektarbeit($student_uid, $studiengang_kz = null, $additional_lehrveranstaltung_id = null)
+ {
+ $params = array($student_uid, $student_uid);
+
+ $qry = "
+ SELECT *
+ FROM
+ lehre.tbl_lehrveranstaltung
+ WHERE
+ (
+ lehrveranstaltung_id IN (
+
+ SELECT
+ lehrveranstaltung_id
+ FROM
+ campus.vw_student_lehrveranstaltung
+ WHERE
+ uid=?
+
+ UNION
+
+ SELECT
+ lehrveranstaltung_id
+ FROM
+ lehre.tbl_zeugnisnote
+ WHERE
+ student_uid=?
+ )";
+
+ if (isset($studiengang_kz))
+ {
+ $params[] = $studiengang_kz;
+ $qry .= " OR (studiengang_kz = ? AND semester IS NOT NULL)";
+ }
+
+ if (isset($additional_lehrveranstaltung_id))
+ {
+ $params[] = $additional_lehrveranstaltung_id;
+ $qry .= " OR lehrveranstaltung_id = ?";
+ }
+
+ $qry .= "
+ )
+ AND projektarbeit = TRUE
+ ORDER BY
+ semester, bezeichnung";
+
+ return $this->execQuery($qry, $params);
+ }
}
diff --git a/application/models/education/Projektarbeit_model.php b/application/models/education/Projektarbeit_model.php
index 4083dbf6e..1ca2a18a8 100644
--- a/application/models/education/Projektarbeit_model.php
+++ b/application/models/education/Projektarbeit_model.php
@@ -24,15 +24,16 @@ class Projektarbeit_model extends DB_Model
public function getProjektarbeit($student_uid, $studiengang_kz = null, $studiensemester_kurzbz = null, $projekttyp = null, $final = null)
{
$qry = "SELECT
- tbl_projektarbeit.* , tbl_projekttyp.bezeichnung
+ tbl_projektarbeit.*, tbl_projekttyp.bezeichnung,
+ tbl_lehreinheit.studiensemester_kurzbz, tbl_lehrveranstaltung.lehrveranstaltung_id,
+ tbl_firma.name AS firma_name
FROM
lehre.tbl_projektarbeit
- JOIN
- lehre.tbl_projekttyp USING (projekttyp_kurzbz), lehre.tbl_lehreinheit, lehre.tbl_lehrveranstaltung
-
+ JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
+ JOIN lehre.tbl_lehreinheit USING (lehreinheit_id)
+ JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
+ LEFT JOIN public.tbl_firma USING (firma_id)
WHERE
- tbl_projektarbeit.lehreinheit_id=tbl_lehreinheit.lehreinheit_id AND
- tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id AND
tbl_projektarbeit.student_uid = ?";
$params = array($student_uid);
@@ -261,4 +262,30 @@ class Projektarbeit_model extends DB_Model
return $this->execReadOnlyQuery($qry, array($projektarbeit_id));
}
+
+ /**
+ *
+ * @param
+ * @return object success or error
+ */
+ public function hasBerechtigungForProjektarbeit($projektarbeit_id)
+ {
+ if (!$projektarbeit_id || !is_numeric($projektarbeit_id))
+ return false;
+
+ $this->ProjektarbeitModel->addSelect('studiengang_kz');
+ $this->ProjektarbeitModel->addJoin('public.tbl_student', 'student_uid');
+ $result = $this->ProjektarbeitModel->load($projektarbeit_id);
+ if (isError($result) || !hasData($result))
+ return false;
+
+ $studiengang_kz = getData($result)[0]->studiengang_kz;
+
+ if ($this->permissionlib->isBerechtigt('admin', 'suid', $studiengang_kz))
+ return true;
+ if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $studiengang_kz))
+ return true;
+
+ return false;
+ }
}
diff --git a/application/models/education/Projektbetreuer_model.php b/application/models/education/Projektbetreuer_model.php
index 95950bf95..02368ae21 100644
--- a/application/models/education/Projektbetreuer_model.php
+++ b/application/models/education/Projektbetreuer_model.php
@@ -10,6 +10,7 @@ class Projektbetreuer_model extends DB_Model
parent::__construct();
$this->dbTable = 'lehre.tbl_projektbetreuer';
$this->pk = array('betreuerart_kurzbz', 'projektarbeit_id', 'person_id');
+ $this->hasSequence = false;
}
/**
diff --git a/application/models/organisation/Studienplan_model.php b/application/models/organisation/Studienplan_model.php
index 481a0564c..4a5f87832 100644
--- a/application/models/organisation/Studienplan_model.php
+++ b/application/models/organisation/Studienplan_model.php
@@ -157,7 +157,6 @@ class Studienplan_model extends DB_Model
return $this->execReadOnlyQuery($qry, array($lv_id));
}
-
public function getStudienplaeneForPerson($person_id)
{
$this->addDistinct();
diff --git a/application/models/person/Notiz_model.php b/application/models/person/Notiz_model.php
index bc4494f57..64fce8944 100644
--- a/application/models/person/Notiz_model.php
+++ b/application/models/person/Notiz_model.php
@@ -207,7 +207,6 @@ class Notiz_model extends DB_Model
";
return $this->execQuery($qry, array($type, $id));
-
}
diff --git a/application/models/person/Person_model.php b/application/models/person/Person_model.php
index 3947378cf..233cfc751 100644
--- a/application/models/person/Person_model.php
+++ b/application/models/person/Person_model.php
@@ -151,12 +151,21 @@ class Person_model extends DB_Model
*/
public function searchPerson($filter)
{
- $this->addSelect('vorname, nachname, gebdatum, person_id');
+ $this->addSelect('vorname, nachname, gebdatum, person_id, titelpre, titelpost');
+ $this->addSelect("CASE
+ WHEN EXISTS
+ (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid) WHERE person_id=tbl_person.person_id)
+ THEN 'Mitarbeiter'
+ WHEN EXISTS
+ (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_student ON(uid=student_uid) WHERE person_id=tbl_person.person_id)
+ THEN 'Student'
+ ELSE 'Person'
+ END AS status");
$result = $this->loadWhere(
- 'lower(nachname) like '.$this->db->escape('%'.$filter.'%')."
+ 'lower(nachname) like '.$this->db->escape('%'.mb_strtolower($filter).'%')."
OR lower(vorname) like ".$this->db->escape('%'.$filter.'%')."
- OR lower(nachname || ' ' || vorname) like ".$this->db->escape('%'.$filter.'%')."
- OR lower(vorname || ' ' || nachname) like ".$this->db->escape('%'.$filter.'%')
+ OR lower(nachname || ' ' || vorname) like ".$this->db->escape('%'.mb_strtolower($filter).'%')."
+ OR lower(vorname || ' ' || nachname) like ".$this->db->escape('%'.mb_strtolower($filter).'%')
);
return $result;
@@ -411,4 +420,4 @@ class Person_model extends DB_Model
return success($result);
}
}
-}
\ No newline at end of file
+}
diff --git a/application/models/ressource/Firma_model.php b/application/models/ressource/Firma_model.php
index 431f0815f..5ae53eeaf 100644
--- a/application/models/ressource/Firma_model.php
+++ b/application/models/ressource/Firma_model.php
@@ -12,17 +12,24 @@ class Firma_model extends DB_Model
$this->pk = 'firma_id';
}
- public function searchFirmen($filter)
+ public function searchFirmen($filter, $aktiv = null)
{
+ $params = [];
$filter = strtoLower($filter);
$qry = "
- SELECT
+ SELECT
f.name, f.firma_id
- FROM
- public.tbl_firma f
- WHERE
- lower (f.name) LIKE '%". $this->db->escape_like_str($filter)."%'";
+ FROM
+ public.tbl_firma f
+ WHERE
+ lower (f.name) LIKE '%". $this->db->escape_like_str($filter)."%'";
- return $this->execQuery($qry);
+ if (isset($aktiv) && is_bool($aktiv))
+ {
+ $params[] = $aktiv;
+ $qry .= " AND aktiv = ?";
+ }
+
+ return $this->execQuery($qry, $params);
}
}
diff --git a/application/models/ressource/Mitarbeiter_model.php b/application/models/ressource/Mitarbeiter_model.php
index f6cdc74b8..a650643f1 100644
--- a/application/models/ressource/Mitarbeiter_model.php
+++ b/application/models/ressource/Mitarbeiter_model.php
@@ -353,12 +353,14 @@ class Mitarbeiter_model extends DB_Model
{
$filter = strtoLower($filter);
+ $returnwert = "p.person_id, p.nachname, p.vorname, p.titelpost, p.titelpre";
+
if ($mode == "mitAkadGrad")
- $returnwert = "ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter";
+ $returnwert .= ", ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter";
elseif ($mode == "ohneMaUid")
- $returnwert = "p.person_id, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre) as mitarbeiter";
+ $returnwert .= ", CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre) as mitarbeiter";
else
- $returnwert = "ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter";
+ $returnwert .= ", ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter";
$qry = "
SELECT " . $returnwert . "
@@ -373,7 +375,11 @@ class Mitarbeiter_model extends DB_Model
OR
lower (p.vorname) LIKE '%". $this->db->escape_like_str($filter)."%'
OR
- (ma.mitarbeiter_uid) LIKE '%". $this->db->escape_like_str($filter)."%'";
+ (ma.mitarbeiter_uid) LIKE '%". $this->db->escape_like_str($filter)."%'
+ OR
+ lower(vorname || ' ' || nachname || ' ' || vorname) like ".$this->db->escape('%'.mb_strtolower($filter).'%')."
+ ORDER BY
+ p.nachname, p.vorname, b.uid, p.person_id";
return $this->execQuery($qry);
}
diff --git a/application/models/ressource/Stundensatz_model.php b/application/models/ressource/Stundensatz_model.php
index f34ad07ed..c8ee367d8 100644
--- a/application/models/ressource/Stundensatz_model.php
+++ b/application/models/ressource/Stundensatz_model.php
@@ -2,7 +2,7 @@
class Stundensatz_model extends DB_Model
{
-
+
/**
* Constructor
*/
@@ -43,6 +43,97 @@ class Stundensatz_model extends DB_Model
return $this->execQuery($qry, $params);
}
+ public function getStundensatzForMitarbeiter($person_id, $studiensemester_kurzbz)
+ {
+ $this->load->config('stv');
+
+ $useFixangestelltStundensatz = $this->config->item('tabs')['projektarbeit']['lvLektroinnenzuteilungFixangestelltStundensatz'];
+ $defaultStundensatz = $this->config->item('tabs')['projektarbeit']['defaultProjektbetreuerStundensatz'];
+
+ $stundensatz = '';
+
+ if(isset($person_id) && isset($studiensemester_kurzbz))
+ {
+ $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+
+ $this->StudiensemesterModel->addSelect('start, ende');
+ $result = $this->StudiensemesterModel->load($studiensemester_kurzbz);
+
+ if (hasData($result))
+ {
+ $studiensemester = getData($result)[0];
+
+ if (isset($useFixangestelltStundensatz) && !$useFixangestelltStundensatz)
+ {
+ // load Mitarbeiter
+ $params = [$person_id];
+ $qry = "
+ SELECT
+ mitarbeiter_uid, fixangestellt
+ FROM
+ public.tbl_mitarbeiter
+ JOIN public.tbl_benutzer ON(tbl_benutzer.uid=tbl_mitarbeiter.mitarbeiter_uid)
+ WHERE
+ person_id=?
+ ORDER BY
+ tbl_mitarbeiter.insertamum DESC NULLS LAST
+ LIMIT 1";
+
+ $result = $this->execQuery($qry, $params);
+
+ if (hasData($result))
+ {
+ foreach (getData($result) as $ma)
+ {
+ if (!$ma->fixangestellt)
+ {
+ $stundensatzRes = $this->getStundensatzByDatum(
+ $ma->mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'lehre'
+ );
+
+ if (hasData($stundensatzRes))
+ $stundensatz = getData($stundensatzRes)[0]->stundensatz;
+ else
+ $stundensatz = '0.00';
+ }
+ }
+ }
+ else
+ {
+ $stundensatz = '0.00';
+ }
+
+ }
+ else
+ {
+ $params = [$person_id, $studiensemester->ende, $studiensemester->start];
+ $qry = "SELECT ss.stundensatz
+ FROM hr.tbl_stundensatz ss
+ JOIN public.tbl_mitarbeiter ON ss.uid = tbl_mitarbeiter.mitarbeiter_uid
+ JOIN public.tbl_benutzer ON(tbl_benutzer.uid=tbl_mitarbeiter.mitarbeiter_uid)
+ WHERE person_id=?
+ AND stundensatztyp = 'lehre'
+ AND gueltig_von <= ?
+ AND (gueltig_bis >= ? OR gueltig_bis IS NULL)
+ ORDER BY gueltig_bis DESC NULLS FIRST, gueltig_von DESC NULLS LAST LIMIT 1";
+
+ $result = $this->execQuery($qry, $params);
+
+ if (hasData($result))
+ {
+ $stundensatz = getData($result)[0]->stundensatz;
+ }
+ else
+ {
+ $stundensatz = $defaultStundensatz;
+ }
+ }
+ }
+ }
+
+ return $stundensatz;
+ }
+
public function getDefaultStundensatz($mitarbeiter_uid, $beginn, $ende = null, $typ = null)
{
$stundensatz_result = $this->getStundensatzByDatum($mitarbeiter_uid, $beginn, $ende, $typ);
@@ -58,4 +149,4 @@ class Stundensatz_model extends DB_Model
}
return $default_stundensatz;
}
-}
\ No newline at end of file
+}
diff --git a/cis/private/profile/studienplan.php b/cis/private/profile/studienplan.php
index 8545b2e34..74102fd09 100644
--- a/cis/private/profile/studienplan.php
+++ b/cis/private/profile/studienplan.php
@@ -107,16 +107,10 @@ if(isset($_GET['getAnmeldung']))
$abgeschlossen = false;
$semesterlock = false;
$regelerfuellt = true;
+
if ($kompatible_lv)
{
$lvregelExists = $lvregel->exists($kompatible_lv);
- if($lvregelExists)
- {
- if($lvregel->isAbgeschlossen($uid, $kompatible_lv))
- $abgeschlossen=true;
- else
- $abgeschlossen=false;
- }
if(!$lvregel->checkSemester($kompatible_lv, $semester))
{
@@ -135,7 +129,7 @@ if(isset($_GET['getAnmeldung']))
}
}
- if (!(($lvregelExists && !$abgeschlossen) || $semesterlock || !$regelerfuellt))
+ if (!$semesterlock && $regelerfuellt)
{
$anzahl++;
// LV wird angeboten und Anmeldefenster ist offen
@@ -152,7 +146,6 @@ if(isset($_GET['getAnmeldung']))
echo '
'.$lv->bezeichnung.'
';
}
}
-
}
/* else
{
diff --git a/public/css/Studentenverwaltung.css b/public/css/Studentenverwaltung.css
index bb2588926..56e99b937 100644
--- a/public/css/Studentenverwaltung.css
+++ b/public/css/Studentenverwaltung.css
@@ -1,15 +1,21 @@
@import './Fhc.css';
+@import './SvgIcons.css';
@import './components/searchbar/searchbar.css';
@import './components/verticalsplit.css';
@import './components/FilterComponent.css';
@import './components/Tabs.css';
@import './components/Notiz.css';
@import './components/Messages.css';
+@import './components/AppMenu.css';
html {
font-size: .875em;
}
+#appMenu {
+ width: 300px;
+}
+
.navbar-dark .navbar-brand:focus {
box-shadow: 0 0 0 .25rem rgba(13,110,253,.25);
z-index: 3;
@@ -37,10 +43,6 @@ html {
flex: 1 1 auto;
}
-#sidebarMenu {
- width: 0%;
-}
-
.tabulator-row.disabled.tabulator-row-odd .tabulator-cell {
color: var(--gray-400);
}
diff --git a/public/css/SvgIcons.css b/public/css/SvgIcons.css
new file mode 100644
index 000000000..f25d842a4
--- /dev/null
+++ b/public/css/SvgIcons.css
@@ -0,0 +1,28 @@
+/* Themable Variables */
+:root {
+ --svg-icon-apps: var(--fhc-icon-apps, url('data:image/svg+xml,\
+ '));
+}
+.svg-icon {
+ display: inline-block;
+ width: 1rem;
+ line-height: 1;
+ background-color: currentColor;
+}
+.svg-icon:before {
+ content: "\00a0";
+}
+.svg-icon.svg-icon-apps {
+ -webkit-mask-image: var(--svg-icon-apps);
+ mask-image: var(--svg-icon-apps);
+}
diff --git a/public/css/components/AppMenu.css b/public/css/components/AppMenu.css
new file mode 100644
index 000000000..b980c1efc
--- /dev/null
+++ b/public/css/components/AppMenu.css
@@ -0,0 +1,26 @@
+.fhc-app-menu {
+ display: flex;
+ flex-direction: column;
+ padding-left: 0;
+ margin: calc(var(--bs-offcanvas-padding-y) * -1) calc(var(--bs-offcanvas-padding-x) * -1);
+}
+.fhc-app-menu li {
+ display: block;
+ border: var(--bs-border-width) solid var(--bs-border-color);
+}
+.fhc-app-menu li + li {
+ border-top-width: 0;
+}
+.fhc-app-menu li a {
+ display: block;
+ padding: .5rem 1rem;
+ text-decoration: none;
+}
+.fhc-app-menu li a.active,
+.fhc-app-menu li a:hover {
+ --bs-link-color-rgb: var(--bs-link-hover-color-rgb);
+ background: var(--surface-hover);
+}
+.fhc-app-menu li a.active {
+ pointer-events: none;
+}
diff --git a/public/css/components/primevue.css b/public/css/components/primevue.css
index 5949d6ecc..ac1950334 100644
--- a/public/css/components/primevue.css
+++ b/public/css/components/primevue.css
@@ -5690,3 +5690,32 @@
outline: 0;
box-shadow: 0 0 0 .25rem rgba(13,110,253,.25);
}
+
+/* input-group */
+/* autocomplete */
+.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3) > .p-autocomplete-input,
+.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control > .p-autocomplete-input,
+.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select > .p-autocomplete-input,
+.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating) > .p-autocomplete-input,
+.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3) > .p-autocomplete > .p-autocomplete-input,
+.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control > .p-autocomplete > .p-autocomplete-input,
+.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select > .p-autocomplete > .p-autocomplete-input,
+.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating) > .p-autocomplete > .p-autocomplete-input {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) > .p-autocomplete-input,
+.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) > .p-autocomplete > .p-autocomplete-input {
+ margin-left: calc(var(--bs-border-width) * -1);
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.p-inputtext.is-invalid:enabled:hover {
+ border-color: var(--bs-form-invalid-border-color);
+}
+.p-inputtext.is-invalid:enabled:focus,
+.was-validated .p-inputtext:invalid:focus {
+ border-color: var(--bs-form-invalid-border-color);
+ box-shadow: 0 0 0 .25rem rgba(var(--bs-danger-rgb),.25);
+}
diff --git a/public/js/api/factory/messages/messages.js b/public/js/api/factory/messages/messages.js
index cec34ad8b..c6d4b67b6 100644
--- a/public/js/api/factory/messages/messages.js
+++ b/public/js/api/factory/messages/messages.js
@@ -62,10 +62,10 @@ export default {
url: 'api/frontend/v1/messages/messages/getUid/' + userParams.id + '/' + userParams.type_id
};
},
- getVorlagentext(vorlage_kurzbz){
+ getDataVorlage(vorlage_kurzbz){
return {
method: 'get',
- url: 'api/frontend/v1/messages/messages/getVorlagentext/' + vorlage_kurzbz
+ url: 'api/frontend/v1/messages/messages/getDataVorlage/' + vorlage_kurzbz
};
},
getNameOfDefaultRecipient(params){
diff --git a/public/js/api/factory/studstatus/leitung.js b/public/js/api/factory/studstatus/leitung.js
index cc6b87d25..7f6bc9f54 100644
--- a/public/js/api/factory/studstatus/leitung.js
+++ b/public/js/api/factory/studstatus/leitung.js
@@ -34,7 +34,7 @@ export default {
url: '/api/frontend/v1/studstatus/leitung/getHistory/' + antrag_id
};
},
- getPrestudents(query, signal) {
+ getPrestudents(query) {
return {
method: 'post',
url: '/api/frontend/v1/studstatus/leitung/getPrestudents',
diff --git a/public/js/api/factory/stv/abschlusspruefung.js b/public/js/api/factory/stv/abschlusspruefung.js
index db8403b48..dcba61887 100644
--- a/public/js/api/factory/stv/abschlusspruefung.js
+++ b/public/js/api/factory/stv/abschlusspruefung.js
@@ -86,13 +86,15 @@ export default {
getMitarbeiter(searchString) {
return {
method: 'get',
- url: 'api/frontend/v1/stv/abschlusspruefung/getMitarbeiter/' + searchString
+ url: 'api/frontend/v1/stv/abschlusspruefung/getMitarbeiter',
+ params: { searchString }
};
},
getPruefer(searchString) {
return {
method: 'get',
- url: 'api/frontend/v1/stv/abschlusspruefung/getPruefer/' + searchString
+ url: 'api/frontend/v1/stv/abschlusspruefung/getPruefer',
+ params: { searchString }
};
},
getNoten() {
@@ -108,16 +110,11 @@ export default {
params: { uids }
};
},
- getAllMitarbeiter(){
+ searchPerson(searchString) {
return {
method: 'get',
- url: 'api/frontend/v1/stv/abschlusspruefung/getAllMitarbeiter/'
+ url: 'api/frontend/v1/stv/abschlusspruefung/searchPerson/',
+ params: { id }
};
},
- getAllPersons(){
- return {
- method: 'get',
- url: 'api/frontend/v1/stv/abschlusspruefung/getAllPersons/'
- };
- }
-};
\ No newline at end of file
+};
diff --git a/public/js/api/factory/stv/app.js b/public/js/api/factory/stv/app.js
index 6fcf46700..d75207c26 100644
--- a/public/js/api/factory/stv/app.js
+++ b/public/js/api/factory/stv/app.js
@@ -16,6 +16,12 @@
*/
export default {
+ configFilter() {
+ return {
+ method: 'get',
+ url: 'api/frontend/v1/stv/config/filter'
+ };
+ },
configStudent() {
return {
method: 'get',
diff --git a/public/js/api/factory/stv/archiv.js b/public/js/api/factory/stv/archiv.js
index ca8f25116..cf380b25d 100644
--- a/public/js/api/factory/stv/archiv.js
+++ b/public/js/api/factory/stv/archiv.js
@@ -39,5 +39,5 @@ export default {
url: 'api/frontend/v1/stv/archiv/delete',
params: {akte_id, studiengang_kz}
};
- }
+ },
};
diff --git a/public/js/api/factory/stv/details.js b/public/js/api/factory/stv/details.js
index 1077de22d..577bc14fb 100644
--- a/public/js/api/factory/stv/details.js
+++ b/public/js/api/factory/stv/details.js
@@ -35,4 +35,14 @@ export default {
params
};
},
+ saveStudent(student_uid, studiensemester_kurzbz, params) {
+ return {
+ method: 'post',
+ url: 'api/frontend/v1/stv/student/saveStudent/'
+ + encodeURIComponent(student_uid)
+ + '/'
+ + encodeURIComponent(studiensemester_kurzbz),
+ params
+ };
+ }
};
\ No newline at end of file
diff --git a/public/js/api/factory/stv/documents.js b/public/js/api/factory/stv/documents.js
index 1898023cd..633afcba1 100644
--- a/public/js/api/factory/stv/documents.js
+++ b/public/js/api/factory/stv/documents.js
@@ -73,4 +73,17 @@ export default {
params
};
},
+ getDocumentDropdown(params){
+ return {
+ method: 'get',
+ url: 'api/frontend/v1/stv/dokumente/getDocumentDropDown/' + params.prestudent_id + '/' + params.studiensemester_kurzbz + '/' + params.studiengang_kz,
+ };
+ },
+ getDocumentDropdownMulti(studentUids, params){
+ return {
+ method: 'get',
+ url: 'api/frontend/v1/stv/dokumente/getDocumentDropDownMulti/' + params.studiensemester_kurzbz + '/' + params.studiengang_kz,
+ params: {studentUids}
+ };
+ }
}
\ No newline at end of file
diff --git a/public/js/api/factory/stv/group.js b/public/js/api/factory/stv/group.js
index b395fbf43..18fcb4443 100644
--- a/public/js/api/factory/stv/group.js
+++ b/public/js/api/factory/stv/group.js
@@ -16,6 +16,27 @@
*/
export default {
+ add(uid, gruppe_kurzbz, studiensemester_kurzbz) {
+ return {
+ method: 'post',
+ url: 'api/frontend/v1/stv/gruppen/add/',
+ params: {
+ uid,
+ gruppe_kurzbz,
+ studiensemester_kurzbz
+ }
+ };
+ },
+ search(query, studiengang_kz) {
+ return {
+ method: 'post',
+ url: 'api/frontend/v1/stv/gruppen/search/',
+ params: {
+ query,
+ studiengang_kz
+ }
+ };
+ },
getGruppen(id) {
return {
method: 'get',
diff --git a/public/js/api/factory/stv/lehrverband.js b/public/js/api/factory/stv/lehrverband.js
new file mode 100644
index 000000000..676422087
--- /dev/null
+++ b/public/js/api/factory/stv/lehrverband.js
@@ -0,0 +1,31 @@
+/**
+ * Copyright (C) 2025 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 3 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, see