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/api/frontend/v1/stv/Archiv.php b/application/controllers/api/frontend/v1/stv/Archiv.php
index cc636951d..55f4270d6 100644
--- a/application/controllers/api/frontend/v1/stv/Archiv.php
+++ b/application/controllers/api/frontend/v1/stv/Archiv.php
@@ -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..9a2e49fe4 100644
--- a/application/controllers/api/frontend/v1/stv/Config.php
+++ b/application/controllers/api/frontend/v1/stv/Config.php
@@ -45,7 +45,8 @@ class Config extends FHCAPI_Controller
'lehre',
'stv',
'konto',
- 'abschlusspruefung'
+ 'abschlusspruefung',
+ 'projektarbeit'
]);
// Load Config
@@ -147,6 +148,16 @@ class Config extends FHCAPI_Controller
'config' => $config['finalexam']
];
+ $result['projektarbeit'] = [
+ 'title' => $this->p->t('stv', 'tab_projektarbeit'),
+ 'component' => './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'
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/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/Student.php b/application/controllers/api/frontend/v1/stv/Student.php
index f2845572f..52fb94ce1 100644
--- a/application/controllers/api/frontend/v1/stv/Student.php
+++ b/application/controllers/api/frontend/v1/stv/Student.php
@@ -55,7 +55,7 @@ class Student extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
- 'ui', 'lehre'
+ 'ui', 'lehre', 'person'
]);
}
@@ -465,7 +465,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 +473,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 +523,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 +582,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 +640,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 +716,7 @@ class Student extends FHCAPI_Controller
return $result;
}*/
- return success(true);
+ return success($person_id);
}
public function requiredIfNotPersonId($value)
@@ -715,7 +728,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/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/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/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/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php
index 1b3b9e9d7..7347cf2ca 100644
--- a/application/models/education/Lehrveranstaltung_model.php
+++ b/application/models/education/Lehrveranstaltung_model.php
@@ -1255,4 +1255,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/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/public/js/api/factory/stv/projektarbeit.js b/public/js/api/factory/stv/projektarbeit.js
new file mode 100644
index 000000000..4412f1842
--- /dev/null
+++ b/public/js/api/factory/stv/projektarbeit.js
@@ -0,0 +1,80 @@
+/**
+ * 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
[{{$p.t('ui', 'neu')}}]
+ +{{$p.t('projektarbeit', 'projektarbeitAnlegen')}}
+{{$p.t('projektarbeit', 'projektarbeitBearbeiten')}}
+ + + + + + +{{$p.t('projektarbeit', 'kontaktdatenBearbeiten')}}
+ + +| {{suggestion.vorname + ' ' + suggestion.nachname}} | @@ -286,34 +303,34 @@ export default {