diff --git a/application/controllers/components/Antrag/Leitung.php b/application/controllers/components/Antrag/Leitung.php
index 8d333d5b8..437030d08 100644
--- a/application/controllers/components/Antrag/Leitung.php
+++ b/application/controllers/components/Antrag/Leitung.php
@@ -116,6 +116,96 @@ class Leitung extends FHC_Controller
$this->outputJsonSuccess($studierendenantrag_id);
}
+ public function pauseAntrag()
+ {
+ $this->load->library('form_validation');
+
+ $_POST = json_decode($this->input->raw_input_stream, true);
+
+ $this->form_validation->set_rules(
+ 'studierendenantrag_id',
+ 'Studierenden Antrag',
+ [
+ 'required',
+ [
+ 'isEntitledToPauseAntrag',
+ [$this->antraglib, 'isEntitledToPauseAntrag']
+ ],
+ [
+ 'antragCanBeManualPaused',
+ [$this->antraglib, 'antragCanBeManualPaused']
+ ]
+ ],
+ [
+ 'isEntitledToPauseAntrag' => $this->p->t('studierendenantrag', 'error_no_right'),
+ 'antragCanBeManualPaused' => $this->p->t(
+ 'studierendenantrag',
+ 'error_not_pauseable',
+ ['id' => $this->input->post('studierendenantrag_id')]
+ )
+ ]
+ );
+
+ if ($this->form_validation->run() == false)
+ {
+ return $this->outputJsonError($this->form_validation->error_array());
+ }
+
+ $studierendenantrag_id = $this->input->post('studierendenantrag_id');
+
+ $result = $this->antraglib->pauseAntrag($studierendenantrag_id, getAuthUID());
+
+ if (isError($result))
+ return $this->outputJsonError(['studierendenantrag_id' => getError($result)]);
+
+ $this->outputJsonSuccess($studierendenantrag_id);
+ }
+
+ public function unpauseAntrag()
+ {
+ $this->load->library('form_validation');
+
+ $_POST = json_decode($this->input->raw_input_stream, true);
+
+ $this->form_validation->set_rules(
+ 'studierendenantrag_id',
+ 'Studierenden Antrag',
+ [
+ 'required',
+ [
+ 'isEntitledToUnpauseAntrag',
+ [$this->antraglib, 'isEntitledToUnpauseAntrag']
+ ],
+ [
+ 'antragCanBeManualUnpaused',
+ [$this->antraglib, 'antragCanBeManualUnpaused']
+ ]
+ ],
+ [
+ 'isEntitledToUnpauseAntrag' => $this->p->t('studierendenantrag', 'error_no_right'),
+ 'antragCanBeManualUnpaused' => $this->p->t(
+ 'studierendenantrag',
+ 'error_not_paused',
+ ['id' => $this->input->post('studierendenantrag_id')]
+ )
+ ]
+ );
+
+ if ($this->form_validation->run() == false)
+ {
+ return $this->outputJsonError($this->form_validation->error_array());
+ }
+
+ $studierendenantrag_id = $this->input->post('studierendenantrag_id');
+
+ $result = $this->antraglib->unpauseAntrag($studierendenantrag_id, getAuthUID());
+
+ if (isError($result))
+ return $this->outputJsonError(['studierendenantrag_id' => getError($result)]);
+
+ $this->outputJsonSuccess($studierendenantrag_id);
+ }
+
public function objectAntrag()
{
$this->load->library('form_validation');
diff --git a/application/controllers/components/Antrag/Unterbrechung.php b/application/controllers/components/Antrag/Unterbrechung.php
index 33bd0035d..f19139e00 100644
--- a/application/controllers/components/Antrag/Unterbrechung.php
+++ b/application/controllers/components/Antrag/Unterbrechung.php
@@ -86,7 +86,7 @@ class Unterbrechung extends FHC_Controller
$data = getData($result);
- $data->studiensemester = $this->antraglib->getSemesterForUnterbrechung($data->studiensemester_kurzbz);
+ $data->studiensemester = $this->antraglib->getSemesterForUnterbrechung($prestudent_id, null);
$this->outputJsonSuccess($data);
}
@@ -136,7 +136,7 @@ class Unterbrechung extends FHC_Controller
$datum_wiedereinstieg = $this->input->post('datum_wiedereinstieg');
$dms_id = null;
- $result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($prestudent_id);
+ $result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($prestudent_id, $studiensemester, $datum_wiedereinstieg);
if (isError($result)) {
return $this->outputJsonError(['db' => getError($result)]);
}
diff --git a/application/controllers/components/Antrag/Wiederholung.php b/application/controllers/components/Antrag/Wiederholung.php
index 418d05f45..2c672be54 100644
--- a/application/controllers/components/Antrag/Wiederholung.php
+++ b/application/controllers/components/Antrag/Wiederholung.php
@@ -161,6 +161,18 @@ class Wiederholung extends FHC_Controller
{
return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_no_student')]);
}
+ elseif ($result == -1)
+ {
+ $result = $this->PrestudentstatusModel->getLastStatus($prestudent_id);
+ if (isError($result))
+ return $this->outputJsonError(['db' => getError($result)]);
+ if (!hasData($result))
+ return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_no_prestudentstatus', [
+ 'prestudent_id' => $prestudent_id
+ ])]);
+ if (!in_array(current(getData($result))->status_kurzbz, $this->config->item('antrag_prestudentstatus_whitelist')))
+ return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_no_student')]);
+ }
elseif ($result == -2)
{
return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_antrag_exists')]);
@@ -241,7 +253,8 @@ class Wiederholung extends FHC_Controller
if (!hasData($result))
return $this->outputJsonError($this->p->t('studierendenantrag', 'error_no_antrag_found', ['id' => $antrag_id]));
$antrag = current(getData($result));
- if ($antrag->status != Studierendenantragstatus_model::STATUS_CREATED && $antrag->status != Studierendenantragstatus_model::STATUS_LVSASSIGNED)
+ if ($antrag->status != Studierendenantragstatus_model::STATUS_CREATED
+ && $antrag->status != Studierendenantragstatus_model::STATUS_LVSASSIGNED)
return $this->outputJsonError($this->p->t('studierendenantrag', 'error_antrag_locked'));
}
diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php
index 131cfdced..717561589 100644
--- a/application/controllers/jobs/AntragJob.php
+++ b/application/controllers/jobs/AntragJob.php
@@ -19,6 +19,8 @@ class AntragJob extends JOB_Controller
// Loads SanchoHelper
$this->load->helper('hlp_sancho_helper');
+ $this->load->library('AntragLib');
+
// Load Model
$this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel');
$this->load->model('education/Studierendenantragstatus_model', 'StudierendenantragstatusModel');
@@ -172,7 +174,16 @@ class AntragJob extends JOB_Controller
$cc = $leitung['Details']->email;
// NOTE(chris): Sancho mail
- if (sendSanchoMail("Sancho_Mail_Antrag_Stgl", $data, $to, 'Anträge - Aktion(en) erforderlich', DEFAULT_SANCHO_HEADER_IMG, DEFAULT_SANCHO_FOOTER_IMG, '', $cc))
+ if (sendSanchoMail(
+ "Sancho_Mail_Antrag_Stgl",
+ $data,
+ $to,
+ 'Anträge - Aktion(en) erforderlich',
+ DEFAULT_SANCHO_HEADER_IMG,
+ DEFAULT_SANCHO_FOOTER_IMG,
+ '',
+ $cc
+ ))
$count++;
}
@@ -306,11 +317,64 @@ class AntragJob extends JOB_Controller
foreach ($prestudents as $prestudent)
{
- $result = $this->prestudentlib->setAbbrecher($prestudent->prestudent_id, $prestudent->studiensemester_kurzbz, $insertvon);
- if (isError($result))
+ $result = $this->StudierendenantragstatusModel->insert([
+ 'studierendenantrag_id' => $prestudent->studierendenantrag_id,
+ 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_DEREGISTERED,
+ 'insertvon' => 'AntragJob'
+ ]);
+ if (isError($result)) {
$this->logError(getError($result));
- else
- $count++;
+ } else {
+ $deregisterStatus = getData($result);
+
+ $result = $this->antraglib->pauseAntrag(
+ $prestudent->studierendenantrag_id,
+ Studierendenantragstatus_model::INSERTVON_DEREGISTERED
+ );
+ if (isError($result))
+ $this->logError(getError($result));
+
+ $result = $this->prestudentlib->setAbbrecher($prestudent->prestudent_id, '', $insertvon);
+ if (isError($result)) {
+ $this->StudierendenantragstatusModel->delete($deregisterStatus);
+ $this->logError(getError($result));
+ } else {
+ $count++;
+
+ $datum_kp = new DateTime($prestudent->datum);
+ $dataMail = array(
+ 'name'=> trim($prestudent->vorname . ' '. $prestudent->nachname),
+ 'vorname' => $prestudent->vorname,
+ 'nachname' => $prestudent->nachname,
+ 'pers_kz'=> $prestudent->matrikelnr,
+ 'stg' => $prestudent->bezeichnung,
+ 'lvbezeichnung' => $prestudent->lvbezeichnung,
+ 'datum_kp' => $datum_kp->format('d.m.Y'),
+ 'studiensemester'=> $prestudent->studiensemester_kurzbz,
+ 'Orgform'=> $prestudent->orgform,
+ 'prestudent_id' => $prestudent->prestudent_id,
+ 'fristablauf' => $dateDeadline->format('d.m.Y')
+ );
+
+ $email = $this->StudentModel->getEmailFH($this->StudentModel->getUID($prestudent->prestudent_id));
+ // Mail to Student
+ if (!sendSanchoMail('Sancho_Mail_Antrag_W_DL_Stud', $dataMail, $email, 'Wiederholung: Frist abgelaufen')) {
+ $this->logWarning("Failed to send Notification to " . $email);
+ }
+
+ $result = $this->StudiengangModel->load($prestudent->studiengang_kz);
+ if (!hasData($result)) {
+ $this->logWarning('No Studiengang found');
+ continue;
+ }
+ $studiengang = current(getData($result));
+ $email = $studiengang->email;
+ // Mail to Assistenz
+ if (!sendSanchoMail('Sancho_Mail_Antrag_W_DL_Assist', $dataMail, $email, 'Wiederholung: Frist abgelaufen')) {
+ $this->logWarning("Failed to send Notification to " . $email);
+ }
+ }
+ }
}
$this->logInfo($count . " Students set to Abbrecher");
}
@@ -326,8 +390,6 @@ class AntragJob extends JOB_Controller
{
$this->logInfo('Start Job handleAbmeldungenStglDeadline');
- $this->load->library('AntragLib');
-
$insertvon = $this->config->item('antrag_job_systemuser');
if (!$insertvon) {
$this->logError('Config "antrag_job_systemuser" nicht gesetzt');
@@ -351,7 +413,10 @@ class AntragJob extends JOB_Controller
$this->StudierendenantragModel->addSelect('s.insertamum');
$this->StudierendenantragModel->addSelect('s.insertvon');
- $this->StudierendenantragModel->db->where_in('public.get_rolle_prestudent(prestudent_id, studiensemester_kurzbz)', $this->config->item('antrag_prestudentstatus_whitelist'));
+ $this->StudierendenantragModel->db->where_in(
+ 'public.get_rolle_prestudent(prestudent_id, studiensemester_kurzbz)',
+ $this->config->item('antrag_prestudentstatus_whitelist')
+ );
$result = $this->StudierendenantragModel->getWithLastStatusWhere([
'typ' => Studierendenantrag_model::TYP_ABMELDUNG_STGL,
@@ -380,6 +445,10 @@ class AntragJob extends JOB_Controller
else {
$deregisterStatus = getData($result);
+ $result = $this->antraglib->pauseAntrag($antrag->studierendenantrag_id, Studierendenantragstatus_model::INSERTVON_DEREGISTERED);
+ if (isError($result))
+ $this->logError(getError($result));
+
$result = $this->prestudentlib->setAbbrecher(
$antrag->prestudent_id,
$antrag->studiensemester_kurzbz,
@@ -425,7 +494,6 @@ class AntragJob extends JOB_Controller
$this->logWarning("Failed to send Notification to " . $email);
}
}
-
}
}
$this->logInfo($count . "/" . count($antraege) . " Students set to Abbrecher");
@@ -556,12 +624,6 @@ class AntragJob extends JOB_Controller
}
}
- $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
- $result = $this->PrestudentstatusModel->loadLastWithStgDetails($prestudent->prestudent_id, $prestudent->studiensemester_kurzbz);
- if (hasData($result)) {
- $ausbildungssemester = current(getData($result))->semester;
- }
-
$dataMail = array(
'name'=> trim($prestudent->vorname . ' '. $prestudent->nachname),
'vorname' => $prestudent->vorname,
@@ -578,7 +640,7 @@ class AntragJob extends JOB_Controller
'fristablauf' => $fristende->format('d.m.Y'),
'pre_wiederholer_sem' => $next_sem,
'wiederholer_sem' => $sem_after_next_sem,
- 'sem' => $ausbildungssemester
+ 'sem' => $prestudent->ausbildungssemester
);
// NOTE(chris): Sancho mail
diff --git a/application/controllers/jobs/ESIJob.php b/application/controllers/jobs/ESIJob.php
new file mode 100644
index 000000000..c9a558a46
--- /dev/null
+++ b/application/controllers/jobs/ESIJob.php
@@ -0,0 +1,165 @@
+load->model('person/Person_model', 'PersonModel');
+ $this->load->model('person/Kennzeichen_model', 'KennzeichenModel');
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * Initialises generateESI job, handles job queue, logs infos/errors
+ */
+ public function generateESI()
+ {
+ //$jobType = 'DVUHSendPruefungsaktivitaeten';
+ $this->logInfo(ESIScheduler::JOB_TYPE_GENERATE_ESI.' job start');
+
+ // Gets the latest jobs
+ $lastJobs = $this->getLastJobs(ESIScheduler::JOB_TYPE_GENERATE_ESI);
+
+ if (isError($lastJobs))
+ {
+ $this->logError(getCode($lastJobs).': '.getError($lastJobs), ESIScheduler::JOB_TYPE_GENERATE_ESI);
+ }
+ else
+ {
+ $this->updateJobs(
+ getData($lastJobs), // Jobs to be updated
+ array(JobsQueueLib::PROPERTY_START_TIME), // Job properties to be updated
+ array(date('Y-m-d H:i:s')) // Job properties new values
+ );
+
+ $person_arr = $this->_getInputObjArray(getData($lastJobs));
+
+ foreach ($person_arr as $persobj)
+ {
+ if (!isset($persobj->person_id))
+ $this->logError("Error when generating ESI: invalid parameters");
+ else
+ {
+ $person_id = $persobj->person_id;
+
+ // check if there already is an active ESI
+ $this->KennzeichenModel->addSelect('1');
+ $activeKennzeichenRes = $this->KennzeichenModel->loadWhere(
+ array('person_id' => $person_id, 'kennzeichentyp_kurzbz' => ESIScheduler::KENNZEICHENTYP_KURZBZ, 'aktiv' => true)
+ );
+
+ if (hasData($activeKennzeichenRes))
+ {
+ $this->logError("Active ESI for person Id $person_id already exists");
+ continue;
+ }
+
+ // get Matrikelnr for person for which ESI should be generated
+ $this->PersonModel->addSelect('matr_nr');
+ $personRes = $this->PersonModel->load($person_id);
+
+ if (!hasData($personRes))
+ {
+ $this->logError("Person with Id $person_id not found");
+ continue;
+ }
+
+ $matr_nr = getData($personRes)[0]->matr_nr;
+
+ if (isEmptyString($matr_nr))
+ {
+ $this->logError("Matrikelnummer for person with Id $person_id is empty");
+ continue;
+ }
+
+ $esi = self::ESI_PREFIX.$matr_nr;
+
+ // check if ESI was already used
+ $this->KennzeichenModel->addSelect('1');
+ $existingKennzeichenRes = $this->KennzeichenModel->loadWhere(
+ array('person_id' => $person_id, 'kennzeichentyp_kurzbz' => ESIScheduler::KENNZEICHENTYP_KURZBZ, 'inhalt' => $esi)
+ );
+
+ if (hasData($existingKennzeichenRes))
+ {
+ $this->logError("ESI $esi for person Id $person_id already exists");
+ continue;
+ }
+
+ // if everything ok, save the esi for the person
+ $saveEsiResult = $this->KennzeichenModel->insert(
+ array(
+ 'person_id' => $person_id,
+ 'kennzeichentyp_kurzbz' => ESIScheduler::KENNZEICHENTYP_KURZBZ,
+ 'inhalt' => $esi,
+ 'aktiv' => true,
+ 'insertvon' => self::INSERT_VON
+ )
+ );
+
+ if (isError($saveEsiResult))
+ {
+ $this->logError("Error when sending ESI, person Id $person_id ".getError($saveEsiResult));
+ }
+ }
+ }
+
+ // Update jobs properties values
+ $this->updateJobs(
+ getData($lastJobs), // Jobs to be updated
+ array(JobsQueueLib::PROPERTY_STATUS, JobsQueueLib::PROPERTY_END_TIME), // Job properties to be updated
+ array(JobsQueueLib::STATUS_DONE, date('Y-m-d H:i:s')) // Job properties new values
+ );
+
+ if (hasData($lastJobs)) $this->updateJobsQueue(ESIScheduler::JOB_TYPE_GENERATE_ESI, getData($lastJobs));
+ }
+
+ $this->logInfo(ESIScheduler::JOB_TYPE_GENERATE_ESI.' job stop');
+ }
+
+ // --------------------------------------------------------------------------------------------
+ // Private methods
+
+ /**
+ * Extracts input data from jobs.
+ * @param $jobs
+ * @return array with jobinput
+ */
+ private function _getInputObjArray($jobs)
+ {
+ $mergedUsersArray = array();
+
+ if (count($jobs) == 0) return $mergedUsersArray;
+
+ foreach ($jobs as $job)
+ {
+ $decodedInput = json_decode($job->input);
+ if ($decodedInput != null)
+ {
+ foreach ($decodedInput as $el)
+ {
+ $mergedUsersArray[] = $el;
+ }
+ }
+ }
+ return $mergedUsersArray;
+ }
+}
diff --git a/application/controllers/jobs/schedulers/ESIScheduler.php b/application/controllers/jobs/schedulers/ESIScheduler.php
new file mode 100644
index 000000000..3ab858937
--- /dev/null
+++ b/application/controllers/jobs/schedulers/ESIScheduler.php
@@ -0,0 +1,108 @@
+load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * Creates jobs queue entries for generateESI job.
+ * @param string $studiensemester_kurzbz semester for which ESIs should be generated
+ */
+ public function generateESI($studiensemester_kurzbz = null)
+ {
+ // if no semester given, get current studiensemester
+ if (!isset($studiensemester_kurzbz))
+ {
+ $semRes = $this->StudiensemesterModel->getAkt();
+
+ if (hasData($semRes))
+ {
+ $studiensemester_kurzbz = getData($semRes)[0]->studiensemester_kurzbz;
+ }
+ }
+
+ if (isset($studiensemester_kurzbz))
+ {
+ $this->logInfo('Start job queue scheduler '.self::JOB_TYPE_GENERATE_ESI);
+
+ $qry = "
+ SELECT
+ DISTINCT person_id
+ FROM
+ public.tbl_person pers
+ JOIN public.tbl_prestudent ps USING (person_id)
+ JOIN public.tbl_prestudentstatus pss USING (prestudent_id)
+ WHERE
+ pss.studiensemester_kurzbz = ?
+ AND pers.matr_nr IS NOT NULL
+ AND pss.status_kurzbz IN ?
+ AND NOT EXISTS ( -- has no ESI yet
+ SELECT 1
+ FROM
+ public.tbl_kennzeichen
+ WHERE
+ person_id = pers.person_id
+ AND kennzeichentyp_kurzbz = ?
+ AND aktiv
+ )
+ AND NOT EXISTS ( -- making sure it's not an incoming
+ SELECT 1
+ FROM
+ public.tbl_prestudentstatus
+ WHERE
+ prestudent_id = ps.prestudent_id
+ AND status_kurzbz = 'Incoming'
+ )";
+
+ $db = new DB_Model();
+ $jobInputResult = $db->execReadOnlyQuery($qry, array($studiensemester_kurzbz, $this->_active_status_kurzbz, self::KENNZEICHENTYP_KURZBZ));
+
+ // If an error occured then log it
+ if (isError($jobInputResult))
+ {
+ $this->logError(getError($jobInputResult));
+ }
+ elseif (hasData($jobInputResult)) // if persons found
+ {
+ // Add the new job to the jobs queue
+ $addNewJobResult = $this->addNewJobsToQueue(
+ self::JOB_TYPE_GENERATE_ESI, // job type
+ $this->generateJobs( // gnerate the structure of the new job
+ JobsQueueLib::STATUS_NEW,
+ json_encode(getData($jobInputResult))
+ )
+ );
+
+ // If error occurred return it
+ if (isError($addNewJobResult)) $this->logError(getError($addNewJobResult));
+ }
+ }
+ else
+ {
+ $this->logError('Error when getting Studiensemester');
+ }
+
+ $this->logInfo('End job queue scheduler '.self::JOB_TYPE_GENERATE_ESI);
+ }
+}
diff --git a/application/core/FHCAPI_Controller.php b/application/core/FHCAPI_Controller.php
index fea4e76f0..e59740ded 100644
--- a/application/core/FHCAPI_Controller.php
+++ b/application/core/FHCAPI_Controller.php
@@ -89,6 +89,10 @@ class FHCAPI_Controller extends FHC_Controller
// For JSON Requests (as opposed to multipart/form-data) get the $_POST variable from the input stream instead
if ($this->input->get_request_header('Content-Type', true) == 'application/json')
$_POST = json_decode($this->security->xss_clean($this->input->raw_input_stream), true);
+ elseif (isset($_POST['_jsondata'])) {
+ $_POST = array_merge($_POST, json_decode($_POST['_jsondata'], true));
+ unset($_POST['_jsondata']);
+ }
}
@@ -98,7 +102,7 @@ class FHCAPI_Controller extends FHC_Controller
/**
* @param array $data
- * @param string (optional) $type
+ * @param string $type (optional)
* @return void
*/
public function addError($data, $type = null)
@@ -171,6 +175,33 @@ class FHCAPI_Controller extends FHC_Controller
exit;
}
+ /**
+ * @param array $error
+ * @param string $type (optional)
+ * @return void
+ */
+ protected function terminateWithError($error, $type = null)
+ {
+ $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
+ $this->addError($error, $type);
+ $this->setStatus(self::STATUS_ERROR);
+ exit;
+ }
+
+ /**
+ * @param stdclass $result
+ * @param string $errortype
+ * @return void
+ */
+ protected function checkForErrors($result, $errortype = self::ERROR_TYPE_GENERAL)
+ {
+ // TODO(chris): IMPLEMENT!
+ if (isError($result)) {
+ $this->terminateWithError(getError($result), $errortype);
+ }
+ return $result->retval;
+ }
+
// TODO(chris): complete list
diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php
index 298c3652f..7d1b6a5ac 100644
--- a/application/libraries/AntragLib.php
+++ b/application/libraries/AntragLib.php
@@ -62,9 +62,11 @@ class AntragLib
'insertvon' => $insertvon
]);
- // NOTE(chris): remove "preabbrecher" statusgrund for Stgl-Abmeldungen if set
+ // NOTE(chris): remove "preabbrecher" statusgrund and paused stati for sibling Anträge for Stgl-Abmeldungen if set
$res = $this->_ci->StudierendenantragModel->load($antrag_id);
if (hasData($res) && current(getData($res))->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL) {
+ $this->unpauseAntrag($antrag_id, Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL);
+
$this->_ci->PrestudentstatusModel->addSelect('tbl_status_grund.statusgrund_kurzbz');
$res = $this->_ci->PrestudentstatusModel->getLastStatusWithStgEmail(current(getData($res))->prestudent_id, '', 'Student');
if (hasData($res) && current(getData($res))->statusgrund_kurzbz == 'preabbrecher') {
@@ -83,6 +85,67 @@ class AntragLib
return $result;
}
+ /**
+ * @param integer $antrag_id
+ * @param string $insertvon
+ *
+ * @return stdClass
+ */
+ public function pauseAntrag($antrag_id, $insertvon)
+ {
+ switch ($insertvon) {
+ case Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL:
+ $result = $this->_ci->StudierendenantragstatusModel->stopAntraegeForAbmeldungStgl($antrag_id);
+ break;
+ case Studierendenantragstatus_model::INSERTVON_DEREGISTERED:
+ $result = $this->_ci->StudierendenantragstatusModel->stopAntraegeForAbbruchBy($antrag_id);
+ break;
+ default:
+ $result = $this->_ci->StudierendenantragstatusModel->insert([
+ 'studierendenantrag_id' => $antrag_id,
+ 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_PAUSE,
+ 'insertvon' => $insertvon
+ ]);
+ break;
+ }
+
+ return $result;
+ }
+
+ /**
+ * @param integer $antrag_id
+ * @param string $insertvon
+ *
+ * @return stdClass
+ */
+ public function unpauseAntrag($antrag_id, $insertvon)
+ {
+ if ($insertvon == Studierendenantragstatus_model::INSERTVON_DEREGISTERED)
+ return error($this->p->t('studierendenantrag', 'error_no_right'));
+ if ($insertvon == Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL) {
+ return $this->_ci->StudierendenantragstatusModel->resumeAntraegeForAbmeldungStgl($antrag_id);
+ }
+ // NOTE(chris): get last status that is not pause
+ $this->_ci->StudierendenantragstatusModel->addOrder('insertamum');
+ $this->_ci->StudierendenantragstatusModel->addLimit(1);
+ $result = $this->_ci->StudierendenantragstatusModel->loadWhere([
+ 'studierendenantrag_id' => $antrag_id,
+ 'studierendenantrag_statustyp_kurzbz !=' => Studierendenantragstatus_model::STATUS_PAUSE
+ ]);
+ if (isError($result))
+ return $result;
+ if (!hasData($result))
+ return error($this->_ci->p->t('studierendenantrag', 'error_no_antragstatus', ['id' => $antrag_id]));
+ $status = current(getData($result));
+
+ $result = $this->_ci->StudierendenantragstatusModel->insert([
+ 'studierendenantrag_id' => $antrag_id,
+ 'studierendenantrag_statustyp_kurzbz' => $status->studierendenantrag_statustyp_kurzbz,
+ 'insertvon' => $insertvon
+ ]);
+ return $result;
+ }
+
/**
* NOTE(chris): permissions & verification must be handled outside
*
@@ -169,7 +232,7 @@ class AntragLib
if (isError($result))
$errors[] = getError($result);
else {
- $this->_ci->StudiengangModel->addJoin('public.tbl_prestudent ps','studiengang_kz');
+ $this->_ci->StudiengangModel->addJoin('public.tbl_prestudent ps', 'studiengang_kz');
$result = $this->_ci->StudiengangModel->loadWhere(['prestudent_id' => $antrag->prestudent_id]);
$stg = '';
$orgform = '';
@@ -190,6 +253,10 @@ class AntragLib
$vorlage ='Sancho_Mail_Antrag_A_Approve';
$subject = $this->_ci->p->t('studierendenantrag', 'mail_subject_A_Approve');
+ $result = $this->pauseAntrag($studierendenantrag_id, Studierendenantragstatus_model::INSERTVON_DEREGISTERED);
+ if (isError($result))
+ $errors[] = getError($result);
+
$result = $this->_ci->prestudentlib->setAbbrecher(
$antrag->prestudent_id,
$antrag->studiensemester_kurzbz,
@@ -208,7 +275,13 @@ class AntragLib
$data = [
'student' => $this->_ci->p->t('person', 'studentIn'),
'sem' => $antrag->studiensemester_kurzbz,
- 'linkPdf' => base_url('content/pdfExport.php?xml=Antrag' . $antrag->typ . '.xml.php&xsl=Antrag' . $antrag->typ . '&id=' . $antrag->studierendenantrag_id . '&output=pdf')
+ 'linkPdf' => base_url('content/pdfExport.php?xml=Antrag' .
+ $antrag->typ .
+ '.xml.php&xsl=Antrag' .
+ $antrag->typ .
+ '&id=' .
+ $antrag->studierendenantrag_id .
+ '&output=pdf')
];
if (hasData($result)) {
$person = current(getData($result));
@@ -229,6 +302,10 @@ class AntragLib
sendSanchoMail($vorlage, $data, $prestudent_status->email, $subject);
}
} else { // ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL)
+ $result = $this->pauseAntrag($studierendenantrag_id, Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL);
+ if (isError($result))
+ $errors[] = getError($result);
+
$result = $this->_ci->PrestudentstatusModel->getLastStatusWithStgEmail($antrag->prestudent_id, '', 'Student');
if (isError($result))
{
@@ -340,6 +417,10 @@ class AntragLib
if (isError($result))
return $result;
else {
+ $result = $this->pauseAntrag($studierendenantrag_id, Studierendenantragstatus_model::INSERTVON_DEREGISTERED);
+ // NOTE(chris): here we should have error handling but at the
+ // moment there is no way to notify the user for "soft" errors
+
$result = $this->_ci->prestudentlib->setAbbrecher(
$antrag->prestudent_id,
$antrag->studiensemester_kurzbz,
@@ -471,7 +552,6 @@ class AntragLib
' Details: ' .
$error_msg;
} else {
-
$data = getData($data);
$result = $this->_ci->StudierendenantragstatusModel->insert([
@@ -582,7 +662,11 @@ class AntragLib
'nachname' => $data['person']->nachname,
'UID' => $data['UID'],
'sem' => $resultAntrag->studiensemester_kurzbz,
- 'linkPdf' => base_url('content/pdfExport.php?xml=AntragUnterbrechung.xml.php&xsl=AntragUnterbrechung&id=' . $studierendenantrag_id . '&output=pdf'),
+ 'linkPdf' => base_url(
+ 'content/pdfExport.php?xml=AntragUnterbrechung.xml.php&xsl=AntragUnterbrechung&id=' .
+ $studierendenantrag_id .
+ '&output=pdf'
+ ),
'insertvon' => $approvedBy
],
$data['prestudent_status']->email,
@@ -699,7 +783,9 @@ class AntragLib
'Orgform' => $data['prestudent_status']->orgform_kurzbz,
'prestudent_id' => $data['prestudent_status']->prestudent_id,
'abmeldungLink' => site_url('lehre/Studierendenantrag/abmeldung/' . $data['prestudent_status']->prestudent_id),
- 'abmeldungLinkCIS' => CIS_ROOT . 'index.ci.php/lehre/Studierendenantrag/abmeldung/' . $data['prestudent_status']->prestudent_id
+ 'abmeldungLinkCIS' => CIS_ROOT .
+ 'index.ci.php/lehre/Studierendenantrag/abmeldung/' .
+ $data['prestudent_status']->prestudent_id
],
$data['email'],
$this->_ci->p->t('studierendenantrag', 'mail_subject_U_Reject')
@@ -734,7 +820,7 @@ class AntragLib
return error($this->_ci->p->t('studierendenantrag', 'error_no_antrag_found', ['id' => $studierendenantrag_id]));
$result['antrag'] = $antrag = current($res);
- $this->_ci->StudiengangModel->addJoin('public.tbl_prestudent ps','studiengang_kz');
+ $this->_ci->StudiengangModel->addJoin('public.tbl_prestudent ps', 'studiengang_kz');
$res = $this->_ci->StudiengangModel->loadWhere(['prestudent_id' => $antrag->prestudent_id]);
if (hasData($res)) {
$result['studiengang'] = current(getData($res));
@@ -862,7 +948,9 @@ class AntragLib
$result = $this->_ci->StudierendenantragstatusModel->insert([
'studierendenantrag_id' => $antrag_id,
- 'studierendenantrag_statustyp_kurzbz' => $repeat ? Studierendenantragstatus_model::STATUS_CREATED : Studierendenantragstatus_model::STATUS_PASS,
+ 'studierendenantrag_statustyp_kurzbz' => $repeat
+ ? Studierendenantragstatus_model::STATUS_CREATED
+ : Studierendenantragstatus_model::STATUS_PASS,
'insertvon' => $insertvon
]);
@@ -878,8 +966,7 @@ class AntragLib
$email = $prestudent_status->email;
// NOTE(chris): Sancho mail
$lvzuweisungLink = site_url('lehre/Antrag/Wiederholung/assistenz/' . $antrag_id);
- if( defined('VILESCI_ROOT') )
- {
+ if (defined('VILESCI_ROOT')) {
$lvzuweisungLink = VILESCI_ROOT . 'index.ci.php/lehre/Antrag/Wiederholung/assistenz/' . $antrag_id;
}
sendSanchoMail(
@@ -888,7 +975,7 @@ class AntragLib
'antrag_id' => $antrag_id,
'stg' => $prestudent_status->stg_bezeichnung,
'Orgform' => $prestudent_status->orgform,
- 'lvzuweisungLink' => $lvzuweisungLink
+ 'lvzuweisungLink' => $lvzuweisungLink
],
$email,
$this->_ci->p->t('studierendenantrag', 'mail_subject_W_New')
@@ -1062,7 +1149,11 @@ class AntragLib
if (isError($result))
return $result;
if (!hasData($result))
- return error($this->_ci->p->t('studierendenantrag', 'error_no_stdsem', ['studiensemester_kurzbz' => $antrag->studiensemester_kurzbz]));
+ return error($this->_ci->p->t(
+ 'studierendenantrag',
+ 'error_no_stdsem',
+ ['studiensemester_kurzbz' => $antrag->studiensemester_kurzbz]
+ ));
$asem = current(getData($result));
foreach ($stdsems as $sem) {
@@ -1117,7 +1208,6 @@ class AntragLib
$lv->antrag_anmerkung = $lvszugewiesen[$lv->lehrveranstaltung_id]->anmerkung;
$lv->antrag_zugelassen = true;
}
-
}
} else {
$lvsA = null;
@@ -1224,10 +1314,10 @@ class AntragLib
* @param integer $prestudent_id
*
* @return \stdClass on success retval 0 means not a student;
- * retval 1 means Berechtigt;
- * retval -1 means has already an Antrag pending;
- * retval -2 means other Antrag pending;
- * retval -3 means in blacklist stg
+ * retval 1 means Berechtigt;
+ * retval -1 means has already an Antrag pending;
+ * retval -2 means other Antrag pending;
+ * retval -3 means in blacklist stg
*/
public function getPrestudentAbmeldeBerechtigt($prestudent_id)
{
@@ -1251,12 +1341,24 @@ class AntragLib
if (!in_array($result->status_kurzbz, $this->_ci->config->item('antrag_prestudentstatus_whitelist_abmeldung'))) {
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
- 'prestudent_id' => $prestudent_id,
- 'campus.get_status_studierendenantrag(studierendenantrag_id)' => Studierendenantragstatus_model::STATUS_APPROVED
- ], [
- Studierendenantrag_model::TYP_ABMELDUNG,
- Studierendenantrag_model::TYP_ABMELDUNG_STGL
- ]);
+ 'prestudent_id' => $prestudent_id,
+ 's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED
+ ], [
+ Studierendenantrag_model::TYP_ABMELDUNG,
+ Studierendenantrag_model::TYP_ABMELDUNG_STGL
+ ]);
+ if (isError($result))
+ return $result;
+ if (hasData($result))
+ return success(-1);
+
+ $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
+ 'prestudent_id' => $prestudent_id,
+ 's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_PAUSE
+ ], [
+ Studierendenantrag_model::TYP_ABMELDUNG,
+ Studierendenantrag_model::TYP_ABMELDUNG_STGL
+ ]);
if (isError($result))
return $result;
if (hasData($result))
@@ -1297,12 +1399,12 @@ class AntragLib
* @param string $studiensemester_kurzbz (optional)
*
* @return \stdClass on success retval 0 means not a student;
- * retval 1 means Berechtigt;
+ * retval 1 means Berechtigt;
* retval -1 means has already an Antrag pending;
* retval -2 means other Antrag pending;
* retval -3 means in blacklist stg
*/
- public function getPrestudentUnterbrechungsBerechtigt($prestudent_id, $studiensemester_kurzbz = null)
+ public function getPrestudentUnterbrechungsBerechtigt($prestudent_id, $studiensemester_kurzbz = null, $datum_wiedereinstieg = null)
{
$result = $this->_ci->PrestudentModel->load($prestudent_id);
if (isError($result))
@@ -1320,18 +1422,10 @@ class AntragLib
if (!hasData($result))
return success(0);
$result = current(getData($result));
+ $prestudent_stdsem = $result->studiensemester_kurzbz;
$datumStatus = $result->datum;
- if (!in_array($result->status_kurzbz, $this->_ci->config->item('antrag_prestudentstatus_whitelist'))) {
- $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
- 'prestudent_id' => $prestudent_id,
- 'typ' => Studierendenantrag_model::TYP_UNTERBRECHUNG,
- 'campus.get_status_studierendenantrag(studierendenantrag_id)' => Studierendenantragstatus_model::STATUS_APPROVED
- ]);
- if (isError($result))
- return $result;
- if (hasData($result))
- return success(-1);
-
+ if (!in_array($result->status_kurzbz, $this->_ci->config->item('antrag_prestudentstatus_whitelist'))
+ && $result->status_kurzbz != 'Unterbrecher') {
return success(0);
}
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere(['prestudent_id' => $prestudent_id]);
@@ -1339,7 +1433,8 @@ class AntragLib
return $result;
if (!hasData($result))
return success(1);
- $result= getData($result);
+
+ $result = getData($result);
foreach ($result as $antrag)
{
if ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG || $antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL)
@@ -1349,11 +1444,11 @@ class AntragLib
elseif($antrag->status == Studierendenantragstatus_model::STATUS_APPROVED && $antrag->datum > $datumStatus)
return success(-2);
}
- if ($studiensemester_kurzbz && $antrag->typ == Studierendenantrag_model::TYP_UNTERBRECHUNG)
+ if ($antrag->typ == Studierendenantrag_model::TYP_UNTERBRECHUNG)
{
- // NOTE(chris): check if this is an old or canceled one
- if ($antrag->studiensemester_kurzbz == $studiensemester_kurzbz && $antrag->status != Studierendenantragstatus_model::STATUS_CANCELLED)
- return success(-1);
+ // NOTE(chris): Ignore canceled ones
+ if ($antrag->status == Studierendenantragstatus_model::STATUS_CANCELLED)
+ continue;
}
if ($antrag->typ == Studierendenantrag_model::TYP_WIEDERHOLUNG)
{
@@ -1362,6 +1457,17 @@ class AntragLib
}
}
+ if (!$studiensemester_kurzbz) {
+ $sems = $this->getSemesterForUnterbrechung($prestudent_id, $prestudent_stdsem);
+ if (!count(array_filter($sems, function ($item) {
+ return !$item['disabled'];
+ })))
+ return success(-1);
+ } else {
+ if ($this->_ci->StudierendenantragModel->hasRunningUnterbrechungBetween($prestudent_id, $studiensemester_kurzbz, $datum_wiedereinstieg))
+ return success(-1);
+ }
+
return success(1);
}
@@ -1406,7 +1512,27 @@ class AntragLib
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
'prestudent_id' => $prestudent_id,
'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG,
- 'campus.get_status_studierendenantrag(studierendenantrag_id)' => Studierendenantragstatus_model::STATUS_APPROVED
+ 's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED
+ ]);
+ if (isError($result))
+ return $result;
+ if (hasData($result))
+ return success(-1);
+
+ $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
+ 'prestudent_id' => $prestudent_id,
+ 'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG,
+ 's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_DEREGISTERED
+ ]);
+ if (isError($result))
+ return $result;
+ if (hasData($result))
+ return success(-1);
+
+ $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
+ 'prestudent_id' => $prestudent_id,
+ 'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG,
+ 's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_PAUSE
]);
if (isError($result))
return $result;
@@ -1457,15 +1583,16 @@ class AntragLib
return success($result);
}
+ /**
+ * Gets details for the latest Antrag of one or more types
+ *
+ * @param integer $prestudent_id
+ * @param array|string $typ
+ *
+ * @return \stdClass
+ */
public function getDetailsForLastAntrag($prestudent_id, $typ = null)
{
- $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails($prestudent_id);
- if (isError($result))
- return $result;
- if (!hasData($result))
- return error($this->_ci->p->t('studierendenantrag', 'error_no_prestudentstatus', ['prestudent_id' => $prestudent_id]));
- $resultDetails = current(getData($result));
-
$where = [
'prestudent_id' => $prestudent_id
];
@@ -1494,21 +1621,20 @@ class AntragLib
'prestudent_id' => $prestudent_id
]));
- $resultDetails->status = $resultAntrag->status;
- $resultDetails->statustyp = $resultAntrag->statustyp;
- $resultDetails->grund = $resultAntrag->grund;
- $resultDetails->studierendenantrag_id = $resultAntrag->studierendenantrag_id;
- $resultDetails->typ = $resultAntrag->typ;
- $resultDetails->datum = $resultAntrag->datum;
- $resultDetails->studiensemester_kurzbz = $resultAntrag->studiensemester_kurzbz;
-
- return success($resultDetails);
+ return $this->addDetailsToAntrag($resultAntrag);
}
+ /**
+ * Gets details for a specific Antrag
+ *
+ * @param integer $studierendenantrag_id
+ *
+ * @return \stdClass
+ */
public function getDetailsForAntrag($studierendenantrag_id)
{
$where = [
- 'studierendenantrag_id' => $studierendenantrag_id
+ 's.studierendenantrag_id' => $studierendenantrag_id
];
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere($where);
@@ -1519,76 +1645,99 @@ class AntragLib
return error($this->_ci->p->t('studierendenantrag', "error_no_antrag_found", ['id' => $studierendenantrag_id]));
$resultAntrag = current(getData($result));
- $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails($resultAntrag->prestudent_id, $resultAntrag->studiensemester_kurzbz);
+ return $this->addDetailsToAntrag($resultAntrag);
+ }
+
+ /**
+ * Helper function for getDetailsForAntrag and getDetailsForLastAntrag
+ *
+ * @param \stdClass $antrag
+ *
+ * @return \stdClass
+ */
+ protected function addDetailsToAntrag($antrag)
+ {
+ $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails(
+ $antrag->prestudent_id,
+ $antrag->studiensemester_kurzbz,
+ $antrag->insertamum
+ );
if (isError($result))
return $result;
if (!hasData($result)) {
- $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails($resultAntrag->prestudent_id);
+ $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails(
+ $antrag->prestudent_id,
+ null,
+ $antrag->insertamum
+ );
if (isError($result))
return $result;
if (!hasData($result))
- return error($this->_ci->p->t('studierendenantrag', 'error_no_prestudentstatus', $resultAntrag));
+ return error($this->_ci->p->t('studierendenantrag', 'error_no_prestudent_in_sem', $antrag));
+ $tmp = current(getData($result));
+ $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+ $res = $this->_ci->StudiensemesterModel->load($antrag->studiensemester_kurzbz);
+ if (hasData($res))
+ $tmp->studienjahr_kurzbz = current(getData($res))->studienjahr_kurzbz;
+ else
+ $tmp->studienjahr_kurzbz = '';
+ // NOTE(chris): the semester might not be correct on this fallback so we disable it
+ $tmp->semester = '';
}
- $resultDetails = current(getData($result));
- $resultDetails->status = $resultAntrag->status;
- $resultDetails->statustyp = $resultAntrag->statustyp;
- $resultDetails->grund = $resultAntrag->grund;
- $resultDetails->studierendenantrag_id = $resultAntrag->studierendenantrag_id;
- $resultDetails->typ = $resultAntrag->typ;
- $resultDetails->dms_id = $resultAntrag->dms_id;
- $resultDetails->datum_wiedereinstieg = $resultAntrag->datum_wiedereinstieg;
+ $result = current(getData($result));
- return success($resultDetails);
+ $result->status = $antrag->status;
+ $result->statustyp = $antrag->statustyp;
+ $result->status_insertvon = $antrag->status_insertvon;
+ $result->grund = $antrag->grund;
+ $result->studierendenantrag_id = $antrag->studierendenantrag_id;
+ $result->typ = $antrag->typ;
+ $result->datum = $antrag->datum;
+ $result->dms_id = $antrag->dms_id;
+ $result->datum_wiedereinstieg = $antrag->datum_wiedereinstieg;
+
+ return success($result);
}
- public function getSemesterForUnterbrechung($studiensemester_kurzbz)
+ /**
+ * Rearrange the free semester slots for a new Unterbrechung
+ *
+ * @param integer $prestudent_id
+ * @param string $studiensemester_kurzbz
+ *
+ * @return array
+ */
+ public function getSemesterForUnterbrechung($prestudent_id, $studiensemester_kurzbz)
{
- $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
-
- $semester = [];
-
- $result = $this->_ci->StudiensemesterModel->getNextFrom($studiensemester_kurzbz);
- if (!hasData($result))
- return $semester;
- $nextSem = current(getData($result));
-
- $semester[0] = [
- 'studiensemester_kurzbz' => $studiensemester_kurzbz,
- 'wiedereinstieg' => [$nextSem]
- ];
-
- $result = $this->_ci->StudiensemesterModel->getNextFrom($nextSem->studiensemester_kurzbz);
- if (!hasData($result))
- return $semester;
-
- $currSemester = current(getData($result));
- $followingSemester = [$currSemester];
-
- $max = $this->_ci->config->item('unterbrecher_semester_max_length');
- if(!$max || $max < 1)
- $max = 2;
-
- for ($i = 1; $i < $max; $i++) {
- $result = $this->_ci->StudiensemesterModel->getNextFrom($currSemester->studiensemester_kurzbz);
- if (!hasData($result))
- break;
- $currSemester = current(getData($result));
- $followingSemester[] = $currSemester;
- }
-
- $semester[1] = [
- 'studiensemester_kurzbz' => $nextSem->studiensemester_kurzbz,
- 'wiedereinstieg' => $followingSemester
- ];
-
- //remove last Semester of the array
- array_pop($followingSemester);
-
- foreach ($followingSemester as $sem)
- $semester[0]['wiedereinstieg'][] = $sem;
-
- return $semester;
+ $result = $this->_ci->StudierendenantragModel->getFreeSlotsForUnterbrechung($prestudent_id, $studiensemester_kurzbz);
+ if (isError($result))
+ return [];
+ $result = getData($result);
+ if (!$result)
+ return [];
+ return array_reduce($result, function ($carry, $item) {
+ if (!isset($carry[$item->von]))
+ $carry[$item->von] = [
+ 'studienjahr_kurzbz' => $item->studienjahr_kurzbz,
+ 'studiensemester_kurzbz' => $item->von,
+ 'wiedereinstieg' => [],
+ 'disabled' => true
+ ];
+
+ $carry[$item->von]['wiedereinstieg'][] = [
+ 'studiensemester_kurzbz' => $item->bis,
+ 'start' => $item->ende,
+ 'disabled' => (boolean)$item->studierendenantrag_id
+ ];
+
+ if ($carry[$item->von]['disabled'] && !$item->studierendenantrag_id) {
+ $carry[$item->von]['disabled'] = false;
+ }
+
+ return $carry;
+ }, []);
+ return $result;
}
public function getAktivePrestudentenInStgs($studiengaenge, $query)
@@ -1664,7 +1813,6 @@ class AntragLib
return error($this->_ci->p->t('studierendenantrag', 'error_no_stg_antrag', ['id' => $antrag_id]));
$stg = current($result);
- $studiengang_kz = $stg->studiengang_kz;
$semester = $stg->ausbildungssemester;
$result = $this->_ci->StudierendenantragModel->load($antrag_id);
@@ -1726,9 +1874,7 @@ class AntragLib
$result = $this->getLvsForAntrag($antrag_id);
if (hasData($result)) {
$lvs = getData($result);
- $repeat_last = false;
if (isset($lvs['repeat_last'])) {
- $repeat_last = true;
unset($lvs['repeat_last']);
$vorlage .= '_Lst';
}
@@ -1895,6 +2041,26 @@ class AntragLib
return $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag');
}
+ /**
+ * @param integer $antrag_id
+ *
+ * @return boolean
+ */
+ public function isEntitledToPauseAntrag($antrag_id)
+ {
+ return ($this->hasAccessToAntrag($antrag_id, 'student/antragfreigabe') || $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag'));
+ }
+
+ /**
+ * @param integer $antrag_id
+ *
+ * @return boolean
+ */
+ public function isEntitledToUnpauseAntrag($antrag_id)
+ {
+ return $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag');
+ }
+
/**
* @param integer $antrag_id
*
@@ -1935,6 +2101,36 @@ class AntragLib
return $this->hasAccessToAntrag($antrag_id, 'student/antragfreigabe');
}
+ /**
+ * @param integer $antrag_id
+ *
+ * @return boolean
+ */
+ public function antragCanBeManualPaused($antrag_id)
+ {
+ $this->_ci->StudierendenantragModel->db->where_not_in('campus.get_status_studierendenantrag(studierendenantrag_id)', [
+ Studierendenantragstatus_model::STATUS_DEREGISTERED,
+ Studierendenantragstatus_model::STATUS_APPROVED,
+ Studierendenantragstatus_model::STATUS_PAUSE
+ ]);
+ $result = $this->_ci->StudierendenantragModel->loadWhere([
+ 'studierendenantrag_id' => $antrag_id,
+ 'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG
+ ]);
+
+ return hasData($result);
+ }
+
+ /**
+ * @param integer $antrag_id
+ *
+ * @return boolean
+ */
+ public function antragCanBeManualUnpaused($antrag_id)
+ {
+ return $this->_ci->StudierendenantragModel->isManuallyPaused($antrag_id);
+ }
+
/**
* @param integer $antrag_id
* @param string|array $status
diff --git a/application/libraries/PrestudentLib.php b/application/libraries/PrestudentLib.php
index 989e14585..ae4ad59c6 100644
--- a/application/libraries/PrestudentLib.php
+++ b/application/libraries/PrestudentLib.php
@@ -74,7 +74,7 @@ class PrestudentLib
$result = $this->_ci->PrestudentstatusModel->withGrund($statusgrund_kurzbz)->insert([
'prestudent_id' => $prestudent_id,
'status_kurzbz' => Prestudentstatus_model::STATUS_ABBRECHER,
- 'studiensemester_kurzbz' => $studiensemester_kurzbz,
+ 'studiensemester_kurzbz' => $prestudent_status->studiensemester_kurzbz,
'ausbildungssemester' => $prestudent_status->ausbildungssemester,
'datum' => $datum,
'insertvon' => $insertvon,
@@ -135,7 +135,7 @@ class PrestudentLib
}
//noch nicht eingetragene Zeugnisnoten auf 9 setzen
- $result = $this->_ci->ZeugnisnoteModel->getZeugnisnoten($student->student_uid, $studiensemester_kurzbz);
+ $result = $this->_ci->ZeugnisnoteModel->getZeugnisnoten($student->student_uid, $prestudent_status->studiensemester_kurzbz);
if (isError($result))
return $result;
$result = getData($result) ?: [];
@@ -181,7 +181,7 @@ class PrestudentLib
//Studentlehrverband setzen
$this->_ci->StudentlehrverbandModel->update([
- 'studiensemester_kurzbz' => $studiensemester_kurzbz,
+ 'studiensemester_kurzbz' => $prestudent_status->studiensemester_kurzbz,
'student_uid' => $student->student_uid
], [
'studiengang_kz' => $student->studiengang_kz,
diff --git a/application/models/crm/Prestudentstatus_model.php b/application/models/crm/Prestudentstatus_model.php
index 08c081153..b3dc45321 100644
--- a/application/models/crm/Prestudentstatus_model.php
+++ b/application/models/crm/Prestudentstatus_model.php
@@ -267,7 +267,7 @@ class Prestudentstatus_model extends DB_Model
return $this->loadWhere($where);
}
- public function loadLastWithStgDetails($prestudent_id, $studiensemester_kurzbz = null)
+ public function loadLastWithStgDetails($prestudent_id, $studiensemester_kurzbz = null, $max_date = null)
{
$this->load->config('studierendenantrag');
@@ -304,7 +304,8 @@ class Prestudentstatus_model extends DB_Model
$this->addLimit(1);
- $this->db->where_in($this->dbTable . '.status_kurzbz', $this->config->item('antrag_prestudentstatus_whitelist'));
+ if ($max_date)
+ $this->db->where($this->dbTable . '.insertamum <', $max_date);
$whereArr = [
$this->dbTable . '.prestudent_id' => $prestudent_id,
diff --git a/application/models/education/Pruefung_model.php b/application/models/education/Pruefung_model.php
index 0d6ad4158..214d6519f 100644
--- a/application/models/education/Pruefung_model.php
+++ b/application/models/education/Pruefung_model.php
@@ -87,7 +87,13 @@ class Pruefung_model extends DB_Model
$this->addJoin('public.tbl_person pers', 'person_id');
$this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid');
$this->addJoin('public.tbl_studiengang g', 'ps.studiengang_kz=g.studiengang_kz');
- $this->addJoin('public.tbl_prestudentstatus pss', 'pss.prestudent_id=ps.prestudent_id AND pss.studiensemester_kurzbz=le.studiensemester_kurzbz AND pss.status_kurzbz=get_rolle_prestudent(ps.prestudent_id, le.studiensemester_kurzbz)', 'LEFT');
+ $this->addJoin(
+ 'public.tbl_prestudentstatus pss',
+ 'pss.prestudent_id=ps.prestudent_id
+ AND pss.studiensemester_kurzbz=le.studiensemester_kurzbz
+ AND pss.status_kurzbz=get_rolle_prestudent(ps.prestudent_id, le.studiensemester_kurzbz)',
+ 'LEFT'
+ );
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
$this->addJoin('bis.tbl_orgform o', 'COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz, g.orgform_kurzbz)=o.orgform_kurzbz');
$this->db->join('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ = ?', 'LEFT', false);
@@ -164,8 +170,10 @@ class Pruefung_model extends DB_Model
$this->addSelect('ps.prestudent_id');
$this->addSelect('lv.bezeichnung as lvbezeichnung');
$this->addSelect('le.studiensemester_kurzbz');
+ $this->addSelect('a.studierendenantrag_id');
$this->addSelect('a.typ');
$this->addSelect('campus.get_status_studierendenantrag(a.studierendenantrag_id) status');
+ $this->addSelect('pss.ausbildungssemester');
$this->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id');
$this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
@@ -174,12 +182,20 @@ class Pruefung_model extends DB_Model
$this->addJoin('public.tbl_person pers', 'person_id');
$this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid');
$this->addJoin('public.tbl_studiengang g', 'ps.studiengang_kz=g.studiengang_kz');
- $this->addJoin('public.tbl_prestudentstatus pss', 'pss.prestudent_id=ps.prestudent_id AND pss.studiensemester_kurzbz=le.studiensemester_kurzbz AND pss.status_kurzbz=get_rolle_prestudent(ps.prestudent_id, le.studiensemester_kurzbz)', 'LEFT');
+ $this->addJoin(
+ 'public.tbl_prestudentstatus pss',
+ 'pss.prestudent_id=ps.prestudent_id
+ AND pss.studiensemester_kurzbz=le.studiensemester_kurzbz
+ AND pss.status_kurzbz=get_rolle_prestudent(ps.prestudent_id, le.studiensemester_kurzbz)',
+ 'LEFT'
+ );
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
$this->addJoin('bis.tbl_orgform o', 'COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz, g.orgform_kurzbz)=o.orgform_kurzbz');
- $this->addJoin('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ=' . $this->escape(Studierendenantrag_model::TYP_WIEDERHOLUNG), 'LEFT');
-
- $this->db->where_in("get_rolle_prestudent(ps.prestudent_id, null)", $this->config->item('antrag_prestudentstatus_whitelist'));
+ $this->addJoin(
+ 'campus.tbl_studierendenantrag a',
+ 'ps.prestudent_id=a.prestudent_id and a.typ=' . $this->escape(Studierendenantrag_model::TYP_WIEDERHOLUNG),
+ 'LEFT'
+ );
$this->db->where("g.aktiv", true);
@@ -237,6 +253,8 @@ class Pruefung_model extends DB_Model
$this->db->where("b.aktiv", true);
+ $this->db->where_in("get_rolle_prestudent(ps.prestudent_id, null)", $this->config->item('antrag_prestudentstatus_whitelist'));
+
if (is_array($status)) {
if (in_array(null, $status)) {
$status = array_filter($status);
diff --git a/application/models/education/Studierendenantrag_model.php b/application/models/education/Studierendenantrag_model.php
index ea481ebef..e138d1a1c 100644
--- a/application/models/education/Studierendenantrag_model.php
+++ b/application/models/education/Studierendenantrag_model.php
@@ -46,6 +46,8 @@ class Studierendenantrag_model extends DB_Model
$this->addSelect('datum_wiedereinstieg');
$this->addSelect($this->dbTable . '.typ');
$this->addSelect('st.studierendenantrag_statustyp_kurzbz as status');
+ $this->addSelect('s.insertvon as status_insertvon');
+ $this->addSelect('s.insertamum as status_insertamum');
$this->addSelect('dms_id');
$this->addSelect('st.bezeichnung[(' . $sql . ')] as statustyp');
@@ -54,7 +56,13 @@ class Studierendenantrag_model extends DB_Model
$this->addJoin('public.tbl_person', 'person_id');
$this->addJoin('public.tbl_studiengang stg', 'p.studiengang_kz=stg.studiengang_kz');
$this->addJoin('public.tbl_studiensemester ss', 'studiensemester_kurzbz');
- $this->addJoin('public.tbl_prestudentstatus ps', 'ps.prestudent_id=p.prestudent_id AND ps.studiensemester_kurzbz=ss.studiensemester_kurzbz AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, ss.studiensemester_kurzbz)', 'LEFT');
+ $this->addJoin(
+ 'public.tbl_prestudentstatus ps',
+ 'ps.prestudent_id=p.prestudent_id
+ AND ps.studiensemester_kurzbz=ss.studiensemester_kurzbz
+ AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, ss.studiensemester_kurzbz)',
+ 'LEFT'
+ );
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
$this->addJoin('bis.tbl_orgform of', 'of.orgform_kurzbz=COALESCE(plan.orgform_kurzbz, ps.orgform_kurzbz, stg.orgform_kurzbz)');
$this->addJoin(
@@ -76,7 +84,9 @@ class Studierendenantrag_model extends DB_Model
public function loadActiveForStudiengaenge($studiengaenge)
{
- // NOTE(chris): get language before changing things in the global db object because getUserLanguage() might use it and it should not have been tampered with
+ // NOTE(chris): get language before changing things in the global
+ // db object because getUserLanguage() might use it and it should
+ // not have been tampered with
$sql = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1";
$this->db->group_start();
@@ -85,7 +95,8 @@ class Studierendenantrag_model extends DB_Model
Studierendenantragstatus_model::STATUS_APPROVED,
Studierendenantragstatus_model::STATUS_REJECTED,
Studierendenantragstatus_model::STATUS_OBJECTION_DENIED,
- Studierendenantragstatus_model::STATUS_DEREGISTERED
+ Studierendenantragstatus_model::STATUS_DEREGISTERED,
+ Studierendenantragstatus_model::STATUS_PAUSE
]);
$this->db->or_group_start();
$this->db->where('s.studierendenantrag_statustyp_kurzbz', Studierendenantragstatus_model::STATUS_APPROVED);
@@ -133,12 +144,18 @@ class Studierendenantrag_model extends DB_Model
$lang = 'SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage());
$this->addSelect('*');
- $this->addSelect('campus.get_status_studierendenantrag(studierendenantrag_id) status');
+ $this->addSelect($this->dbTable . '.grund AS grund');
+ $this->addSelect('s.studierendenantrag_statustyp_kurzbz status');
+ $this->addSelect('s.insertvon status_insertvon');
$this->addSelect('t.bezeichnung[(' . $lang . ')] statustyp');
+ $this->addJoin(
+ 'campus.tbl_studierendenantrag_status s',
+ 'campus.get_status_id_studierendenantrag(' . $this->dbTable . '.studierendenantrag_id)=s.studierendenantrag_status_id'
+ );
$this->addJoin(
'campus.tbl_studierendenantrag_statustyp t',
- 'campus.get_status_studierendenantrag(studierendenantrag_id)=t.studierendenantrag_statustyp_kurzbz'
+ 's.studierendenantrag_statustyp_kurzbz=t.studierendenantrag_statustyp_kurzbz'
);
if ($types && is_array($types)) {
@@ -168,7 +185,11 @@ class Studierendenantrag_model extends DB_Model
$this->addJoin(
'public.tbl_prestudentstatus s',
- $this->dbTable . '.prestudent_id=s.prestudent_id AND ' . $this->dbTable . '.studiensemester_kurzbz=s.studiensemester_kurzbz'
+ $this->dbTable . '.prestudent_id=s.prestudent_id
+ AND ' .
+ $this->dbTable . '.studiensemester_kurzbz=s.studiensemester_kurzbz
+ AND ' .
+ $this->dbTable . '.insertamum > s.insertamum'
);
$this->addJoin('public.tbl_prestudent p', $this->dbTable . '.prestudent_id=p.prestudent_id');
$this->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
@@ -180,8 +201,6 @@ class Studierendenantrag_model extends DB_Model
$this->addLimit(1);
- $this->db->where_in('s.status_kurzbz', $this->config->item('antrag_prestudentstatus_whitelist'));
-
return $this->loadWhere([
$this->pk => $antrag_id
]);
@@ -233,20 +252,45 @@ class Studierendenantrag_model extends DB_Model
$this->addSelect($this->dbTable . '.datum_wiedereinstieg');
$this->addSelect($this->dbTable . '.grund');
$this->addSelect($this->dbTable . '.dms_id');
- $this->addSelect("(SELECT count(1) FROM campus.tbl_studierendenantrag_status WHERE studierendenantrag_id = " . $this->dbTable . ".studierendenantrag_id AND studierendenantrag_statustyp_kurzbz = 'Genehmigt') AS isapproved", false);
+ $this->addSelect('s.insertvon AS status_insertvon');
+ $this->addSelect(
+ "(SELECT count(1) FROM campus.tbl_studierendenantrag_status WHERE studierendenantrag_id = " .
+ $this->dbTable .
+ ".studierendenantrag_id AND studierendenantrag_statustyp_kurzbz = 'Genehmigt') AS isapproved",
+ false
+ );
$this->addJoin('public.tbl_prestudent p', 'prestudent_id', 'RIGHT');
$this->addJoin('public.tbl_studiengang stg', 'p.studiengang_kz=stg.studiengang_kz');
- $this->addJoin('public.tbl_prestudentstatus ps', 'ps.prestudent_id=p.prestudent_id AND ps.studiensemester_kurzbz=' . $this->dbTable . '.studiensemester_kurzbz AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, ' . $this->dbTable . '.studiensemester_kurzbz)', 'LEFT');
+ $this->addJoin(
+ 'public.tbl_prestudentstatus ps',
+ 'ps.prestudent_id=p.prestudent_id AND ps.studiensemester_kurzbz=' .
+ $this->dbTable .
+ '.studiensemester_kurzbz AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, ' .
+ $this->dbTable .
+ '.studiensemester_kurzbz)',
+ 'LEFT'
+ );
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
$this->addJoin('bis.tbl_orgform of', 'of.orgform_kurzbz=COALESCE(plan.orgform_kurzbz, ps.orgform_kurzbz, stg.orgform_kurzbz)');
+ $this->addJoin(
+ 'campus.tbl_studierendenantrag_status s',
+ 'campus.get_status_id_studierendenantrag(' . $this->dbTable . '.studierendenantrag_id)=s.studierendenantrag_status_id',
+ 'LEFT'
+ );
$this->addJoin(
'campus.tbl_studierendenantrag_statustyp st',
- 'campus.get_status_studierendenantrag(studierendenantrag_id)=st.studierendenantrag_statustyp_kurzbz',
+ 's.studierendenantrag_statustyp_kurzbz=st.studierendenantrag_statustyp_kurzbz',
'LEFT'
);
- $this->db->where("(SELECT status_kurzbz FROM public.tbl_prestudentstatus WHERE prestudent_id=p.prestudent_id AND status_kurzbz='Student' LIMIT 1) IS NOT NULL", null, false);
+ $this->db->where("(
+ SELECT status_kurzbz
+ FROM public.tbl_prestudentstatus
+ WHERE prestudent_id=p.prestudent_id
+ AND status_kurzbz='Student'
+ LIMIT 1
+ ) IS NOT NULL", null, false);
return $this->loadWhere([
@@ -287,4 +331,144 @@ class Studierendenantrag_model extends DB_Model
return $this->loadWhere($where);
}
+
+ /**
+ * Checks if the Prestudent has an active Unterbrechung between
+ * the start of the given semester and the given enddate.
+ * If the enddate is omitted the end of the given semester is used.
+ *
+ * @param integer $prestudent_id
+ * @param string $studiensemester_kurzbz
+ * @param string $enddate (optional)
+ *
+ * @return boolean
+ */
+ public function hasRunningUnterbrechungBetween($prestudent_id, $studiensemester, $enddate = null)
+ {
+ $start = '(SELECT start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz=' . $this->db->escape($studiensemester) . ')';
+ $end = $enddate
+ ? $this->db->escape($enddate)
+ : '(SELECT ende FROM public.tbl_studiensemester WHERE studiensemester_kurzbz=' . $this->db->escape($studiensemester) . ')';
+
+ $this->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+ $this->db->where([
+ 'prestudent_id' => $prestudent_id,
+ 'typ' => Studierendenantrag_model::TYP_UNTERBRECHUNG,
+ 'campus.get_status_studierendenantrag(studierendenantrag_id) !=' => Studierendenantragstatus_model::STATUS_CANCELLED,
+ 'start < ' . $end => null,
+ 'datum_wiedereinstieg > ' . $start => null,
+ ]);
+ return (boolean)$this->db->count_all_results($this->dbTable);
+ }
+
+ /**
+ * Gets free semester slots for a new Unterbrechung.
+ *
+ * @param integer $prestudent_id
+ * @param string $studiensemester_kurzbz (optional)
+ *
+ * @return stdClass
+ */
+ public function getFreeSlotsForUnterbrechung($prestudent_id, $studiensemester = null)
+ {
+ $max_starters = 2;
+ $max_length = max(
+ 2,
+ (integer)$this->config->item('unterbrecher_semester_max_length')
+ );
+
+
+ $subquery = '';
+ if ($studiensemester)
+ $subquery = 'SELECT start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz=?';
+ else
+ $subquery = 'SELECT start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz=public.get_stdsem_prestudent (?, null)';
+
+ $sql = "WITH numbered_sems AS (
+ SELECT
+ a.studienjahr_kurzbz AS studienjahr_kurzbz,
+ a.studiensemester_kurzbz AS von,
+ b.studiensemester_kurzbz AS bis,
+ a.start AS start,
+ b.start AS ende,
+ ROW_NUMBER() OVER (
+ PARTITION BY a.studiensemester_kurzbz
+ ORDER BY b.start
+ ) AS row_number
+ FROM public.tbl_studiensemester a
+ LEFT JOIN public.tbl_studiensemester b ON (b.start > a.ende)
+ ),
+ last_sems AS (
+ SELECT *
+ FROM numbered_sems
+ WHERE numbered_sems.row_number <= ?
+ )
+ SELECT s.von, s.bis, s.start, s.ende, studierendenantrag_id, studienjahr_kurzbz
+ FROM last_sems s
+ LEFT JOIN (
+ SELECT studierendenantrag_id, start, datum_wiedereinstieg AS ende
+ FROM campus.tbl_studierendenantrag
+ LEFT JOIN public.tbl_studiensemester USING(studiensemester_kurzbz)
+ WHERE typ=?
+ AND campus.get_status_studierendenantrag(studierendenantrag_id) != ?
+ AND prestudent_id=?
+ ) a ON (s.start < a.ende AND s.ende > a.start)
+ WHERE s.start >= (" . $subquery . ")
+ ORDER BY s.start, s.ende
+ LIMIT ?;";
+
+ return $this->execQuery($sql, [
+ $max_length,
+ self::TYP_UNTERBRECHUNG,
+ Studierendenantragstatus_model::STATUS_CANCELLED,
+ $prestudent_id,
+ $studiensemester ?: $prestudent_id,
+ $max_length * $max_starters
+ ]);
+ }
+
+ /**
+ * Returns if an Antrag is manually paused
+ *
+ * @param integer $antrag_id
+ *
+ * @return boolean
+ */
+ public function isManuallyPaused($antrag_id)
+ {
+ $this->addJoin(
+ 'campus.tbl_studierendenantrag_status s',
+ 'campus.get_status_id_studierendenantrag(' . $this->dbTable . '.studierendenantrag_id)=s.studierendenantrag_status_id'
+ );
+
+ $this->db->where([
+ 's.studierendenantrag_id' => $antrag_id,
+ 's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_PAUSE
+ ]);
+
+ $this->db->group_start();
+ $this->db->where_not_in('s.insertvon', [
+ Studierendenantragstatus_model::INSERTVON_DEREGISTERED,
+ Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL
+ ]);
+ $this->db->or_group_start();
+ $this->db->where('s.insertvon', Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL);
+ $this->db->where('1 !=', '(
+ SELECT COUNT(*)%2
+ FROM campus.tbl_studierendenantrag_status i
+ WHERE i.studierendenantrag_id = s.studierendenantrag_id
+ AND i.insertamum > (
+ SELECT ii.insertamum
+ FROM campus.tbl_studierendenantrag_status ii
+ WHERE ii.studierendenantrag_id = s.studierendenantrag_id
+ AND ii.insertvon <> ' . $this->escape(Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL) . '
+ ORDER BY ii.insertamum DESC
+ LIMIT 1
+ )
+ )', false);
+ $this->db->group_end();
+ $this->db->group_end();
+
+ return hasData($this->load());
+ }
}
diff --git a/application/models/education/Studierendenantragstatus_model.php b/application/models/education/Studierendenantragstatus_model.php
index c134cc4ee..cf9cce1be 100644
--- a/application/models/education/Studierendenantragstatus_model.php
+++ b/application/models/education/Studierendenantragstatus_model.php
@@ -15,6 +15,10 @@ class Studierendenantragstatus_model extends DB_Model
const STATUS_OBJECTED = 'Beeinsprucht';
const STATUS_OBJECTION_DENIED = 'EinspruchAbgelehnt';
const STATUS_DEREGISTERED = 'Abgemeldet';
+ const STATUS_PAUSE = 'Pause';
+
+ const INSERTVON_ABMELDUNGSTGL = "AbmeldungStgl";
+ const INSERTVON_DEREGISTERED = "Studienabbruch";
/**
* Constructor
@@ -49,4 +53,157 @@ class Studierendenantragstatus_model extends DB_Model
return $this->loadWhere($where);
}
+
+ public function stopAntraegeForAbmeldungStgl($antrag_id)
+ {
+ $sql = 'INSERT INTO campus.tbl_studierendenantrag_status
+ (studierendenantrag_id, studierendenantrag_statustyp_kurzbz, insertvon, insertamum)
+ SELECT studierendenantrag_id, ?, ?, (
+ SELECT insertamum
+ FROM campus.tbl_studierendenantrag_status
+ WHERE studierendenantrag_status_id = campus.get_status_id_studierendenantrag(?)
+ )
+ FROM campus.tbl_studierendenantrag
+ WHERE prestudent_id = (
+ SELECT prestudent_id
+ FROM campus.tbl_studierendenantrag
+ WHERE studierendenantrag_id = ?
+ )
+ AND studierendenantrag_id <> ?
+ AND (
+ (
+ typ = ?
+ AND campus.get_status_studierendenantrag(studierendenantrag_id) IN ?
+ ) OR (
+ typ = ?
+ AND campus.get_status_studierendenantrag(studierendenantrag_id) IN ?
+ ) OR (
+ typ = ?
+ AND campus.get_status_studierendenantrag(studierendenantrag_id) IN ?
+ )
+ )';
+
+ return $this->execQuery($sql, [
+ self::STATUS_PAUSE,
+ self::INSERTVON_ABMELDUNGSTGL,
+ $antrag_id,
+ $antrag_id,
+ $antrag_id,
+ Studierendenantrag_model::TYP_ABMELDUNG,
+ [
+ Studierendenantragstatus_model::STATUS_CREATED
+ ],
+ Studierendenantrag_model::TYP_UNTERBRECHUNG,
+ [
+ Studierendenantragstatus_model::STATUS_CREATED
+ ],
+ Studierendenantrag_model::TYP_WIEDERHOLUNG,
+ [
+ Studierendenantragstatus_model::STATUS_REQUESTSENT_1,
+ Studierendenantragstatus_model::STATUS_REQUESTSENT_2,
+ Studierendenantragstatus_model::STATUS_CREATED,
+ Studierendenantragstatus_model::STATUS_LVSASSIGNED,
+ Studierendenantragstatus_model::STATUS_PAUSE
+ ],
+ ]);
+ }
+
+ public function resumeAntraegeForAbmeldungStgl($antrag_id)
+ {
+ $sql = 'INSERT INTO campus.tbl_studierendenantrag_status
+ (studierendenantrag_id, studierendenantrag_statustyp_kurzbz, insertvon, insertamum)
+ SELECT studierendenantrag_id, (
+ SELECT studierendenantrag_statustyp_kurzbz
+ FROM campus.tbl_studierendenantrag_status s
+ WHERE s.studierendenantrag_id=a.studierendenantrag_id
+ AND campus.get_status_id_studierendenantrag(a.studierendenantrag_id) <> studierendenantrag_status_id
+ ORDER BY insertamum DESC
+ LIMIT 1
+ ), ?, (
+ SELECT insertamum
+ FROM campus.tbl_studierendenantrag_status
+ WHERE studierendenantrag_status_id = campus.get_status_id_studierendenantrag(?)
+ )
+ FROM campus.tbl_studierendenantrag a
+ WHERE prestudent_id = (
+ SELECT prestudent_id
+ FROM campus.tbl_studierendenantrag
+ WHERE studierendenantrag_id = ?
+ )
+ AND typ <> ?
+ AND campus.get_status_studierendenantrag(studierendenantrag_id) = ?
+ ';
+
+ return $this->execQuery($sql, [
+ self::INSERTVON_ABMELDUNGSTGL,
+ $antrag_id,
+ $antrag_id,
+ Studierendenantrag_model::TYP_ABMELDUNG_STGL,
+ Studierendenantragstatus_model::STATUS_PAUSE
+ ]);
+ }
+
+ public function stopAntraegeForAbbruchBy($antrag_id)
+ {
+ $sql = 'INSERT INTO campus.tbl_studierendenantrag_status
+ (studierendenantrag_id, studierendenantrag_statustyp_kurzbz, insertvon, insertamum)
+ SELECT studierendenantrag_id, ?, ?, (
+ SELECT insertamum
+ FROM campus.tbl_studierendenantrag_status
+ WHERE studierendenantrag_status_id = campus.get_status_id_studierendenantrag(?)
+ )
+ FROM campus.tbl_studierendenantrag
+ WHERE prestudent_id = (
+ SELECT prestudent_id
+ FROM campus.tbl_studierendenantrag
+ WHERE studierendenantrag_id = ?
+ )
+ AND studierendenantrag_id <> ?
+ AND (
+ (
+ typ = ?
+ AND campus.get_status_studierendenantrag(studierendenantrag_id) NOT IN ?
+ ) OR (
+ typ = ?
+ AND campus.get_status_studierendenantrag(studierendenantrag_id) NOT IN ?
+ ) OR (
+ typ = ?
+ AND campus.get_status_studierendenantrag(studierendenantrag_id) NOT IN ?
+ ) OR (
+ typ = ?
+ AND campus.get_status_studierendenantrag(studierendenantrag_id) NOT IN ?
+ )
+ )';
+
+ return $this->execQuery($sql, [
+ self::STATUS_PAUSE,
+ self::INSERTVON_DEREGISTERED,
+ $antrag_id,
+ $antrag_id,
+ $antrag_id,
+ Studierendenantrag_model::TYP_ABMELDUNG,
+ [
+ Studierendenantragstatus_model::STATUS_APPROVED,
+ Studierendenantragstatus_model::STATUS_CANCELLED
+ ],
+ Studierendenantrag_model::TYP_UNTERBRECHUNG,
+ [
+ Studierendenantragstatus_model::STATUS_APPROVED,
+ Studierendenantragstatus_model::STATUS_CANCELLED,
+ Studierendenantragstatus_model::STATUS_REMINDERSENT,
+ Studierendenantragstatus_model::STATUS_REJECTED
+ ],
+ Studierendenantrag_model::TYP_ABMELDUNG_STGL,
+ [
+ Studierendenantragstatus_model::STATUS_CANCELLED,
+ Studierendenantragstatus_model::STATUS_DEREGISTERED,
+ Studierendenantragstatus_model::STATUS_OBJECTION_DENIED
+ ],
+ Studierendenantrag_model::TYP_WIEDERHOLUNG,
+ [
+ Studierendenantragstatus_model::STATUS_DEREGISTERED,
+ Studierendenantragstatus_model::STATUS_APPROVED
+ ],
+ ]);
+ }
}
diff --git a/application/models/person/Kennzeichen_model.php b/application/models/person/Kennzeichen_model.php
new file mode 100644
index 000000000..fe8a9ac62
--- /dev/null
+++ b/application/models/person/Kennzeichen_model.php
@@ -0,0 +1,15 @@
+dbTable = 'public.tbl_kennzeichen';
+ $this->pk = 'kennzeichen_id';
+ }
+
+}
diff --git a/application/views/lehre/Antrag/Create.php b/application/views/lehre/Antrag/Create.php
index 2c9d0d382..f0b681c2a 100644
--- a/application/views/lehre/Antrag/Create.php
+++ b/application/views/lehre/Antrag/Create.php
@@ -31,9 +31,9 @@ $this->load->view(
load->view(
@@ -63,7 +66,16 @@ $this->load->view(
= $antrag->studierendenantrag_id; ?>
= $this->p->t('studierendenantrag', 'antrag_typ_' . $antrag->typ); ?>
- = $antrag->status_bezeichnung; ?>
+
+ =
+ (
+ $antrag->status == Studierendenantragstatus_model::STATUS_PAUSE
+ && $antrag->status_insertvon == Studierendenantragstatus_model::INSERTVON_DEREGISTERED
+ )
+ ? $this->p->t('studierendenantrag', 'status_stop')
+ : $antrag->status_bezeichnung;
+ ?>
+
= $antrag->studiensemester_kurzbz; ?>
= (new DateTime($antrag->datum))->format('d.m.Y'); ?>
= $antrag->datum_wiedereinstieg ? (new DateTime($antrag->datum_wiedereinstieg))->format('d.m.Y') : ''; ?>
@@ -74,15 +86,32 @@ $this->load->view(
-
+
@@ -100,18 +129,78 @@ $this->load->view(
-
- typ != Studierendenantrag_model::TYP_WIEDERHOLUNG && in_array($antrag->status, [
- Studierendenantragstatus_model::STATUS_APPROVED,
- Studierendenantragstatus_model::STATUS_OBJECTED,
- Studierendenantragstatus_model::STATUS_OBJECTION_DENIED,
- Studierendenantragstatus_model::STATUS_REMINDERSENT
- ])) { ?>
-
+
+
+
+ typ) {
+ case Studierendenantrag_model::TYP_ABMELDUNG:
+ $allowed = [
+ Studierendenantragstatus_model::STATUS_APPROVED
+ ];
+ break;
+ case Studierendenantrag_model::TYP_ABMELDUNG_STGL:
+ $allowed = [
+ Studierendenantragstatus_model::STATUS_APPROVED,
+ Studierendenantragstatus_model::STATUS_OBJECTED,
+ Studierendenantragstatus_model::STATUS_OBJECTION_DENIED,
+ Studierendenantragstatus_model::STATUS_DEREGISTERED
+ ];
+ break;
+ case Studierendenantrag_model::TYP_UNTERBRECHUNG:
+ $allowed = [
+ Studierendenantragstatus_model::STATUS_APPROVED,
+ Studierendenantragstatus_model::STATUS_REMINDERSENT
+ ];
+ break;
+ case Studierendenantrag_model::TYP_WIEDERHOLUNG:
+ $allowed = [
+ Studierendenantragstatus_model::STATUS_DEREGISTERED
+ ];
+ break;
+ }
+ if (in_array($antrag->status, $allowed)) { ?>
+
+
+
+
- typ == Studierendenantrag_model::TYP_WIEDERHOLUNG && $antrag->status == Studierendenantragstatus_model::STATUS_APPROVED) { ?>
- = $this->p->t('studierendenantrag', 'btn_show_lvs'); ?>
-
+ typ == Studierendenantrag_model::TYP_WIEDERHOLUNG
+ && $antrag->status == Studierendenantragstatus_model::STATUS_APPROVED
+ ) { ?>
+
+ = $this->p->t('studierendenantrag', 'btn_show_lvs'); ?>
+
+
= $this->p->t('studierendenantrag', 'my_lvs'); ?>
diff --git a/application/views/lehre/lehrauftrag/acceptLehrauftrag.php b/application/views/lehre/lehrauftrag/acceptLehrauftrag.php
index d018beda8..6c65559d9 100644
--- a/application/views/lehre/lehrauftrag/acceptLehrauftrag.php
+++ b/application/views/lehre/lehrauftrag/acceptLehrauftrag.php
@@ -142,14 +142,17 @@ $this->load->view(
-
+
- p->t('dms' , 'informationsblattExterneLehrende'); ?>
+ p->t('ui' , 'hinweistextLehrauftrag'); ?>
+
+ p->t('dms' , 'informationsblattExterneLehrende'); ?>
+
-
+
diff --git a/cis/private/lehre/notenliste.xls.php b/cis/private/lehre/notenliste.xls.php
index 63cf45d29..6c8db5246 100644
--- a/cis/private/lehre/notenliste.xls.php
+++ b/cis/private/lehre/notenliste.xls.php
@@ -114,12 +114,15 @@ else
$format_highlight->setFgColor(15);
$format_highlight->setBorder(1);
$format_highlight->setBorderColor('white');
+ $format_highlight->setAlign('left');
+ $format_highlight->setNumFormat(49);
$format_highlightright=& $workbook->addFormat();
$format_highlightright->setFgColor(15);
$format_highlightright->setBorder(1);
$format_highlightright->setBorderColor('white');
$format_highlightright->setAlign('right');
+ $format_highlightright->setNumFormat(49);
$format_highlightright_date=& $workbook->addFormat();
$format_highlightright_date->setFgColor(15);
@@ -318,17 +321,23 @@ else
$worksheet->write($lines,1,$elem->uid);
$worksheet->write($lines,2,$elem->nachname.$inc);
- $worksheet->write($lines,3,$elem->vorname);
- //wenn Wahlname vorhanden überschreibt dieser den Vornamen
- $worksheet->write($lines,3,$elem->wahlname);
- $worksheet->write($lines,4,'="'.$elem->semester.$elem->verband.$elem->gruppe.'"');
- $worksheet->write($lines,5,'="'.trim($elem->matrikelnr).'"',$format_highlight);
+ if( NULL !== $elem->wahlname )
+ {
+ //wenn Wahlname vorhanden überschreibt dieser den Vornamen
+ $worksheet->write($lines,3,$elem->wahlname);
+ }
+ else
+ {
+ $worksheet->write($lines,3,$elem->vorname);
+ }
+ $worksheet->write($lines,4,$elem->semester.$elem->verband.$elem->gruppe);
+ $worksheet->write($lines,5,trim($elem->matrikelnr),$format_highlight);
$worksheet->write($lines,6, $note, $format_highlightright);
// Nachprüfung
if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN2') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN2)
{
- $worksheet->write($lines,8, '="'.trim($elem->matrikelnr).'"', $format_highlight);
+ $worksheet->write($lines,8, trim($elem->matrikelnr), $format_highlight);
$pr = new Pruefung();
$pr->getPruefungen($elem->uid, "Termin2", $lvid, $sem);
$output2 = $pr->result;
@@ -349,7 +358,7 @@ else
// Nachprüfung
if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN3') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN3)
{
- $worksheet->write($lines,12, '="'.trim($elem->matrikelnr).'"', $format_highlight);
+ $worksheet->write($lines,12, trim($elem->matrikelnr), $format_highlight);
$pr = new Pruefung();
$pr->getPruefungen($elem->uid, "Termin3", $lvid, $sem);
$output3 = $pr->result;
diff --git a/cis/testtool/frage.php b/cis/testtool/frage.php
index 9f6cd4fb7..0aa37b299 100644
--- a/cis/testtool/frage.php
+++ b/cis/testtool/frage.php
@@ -148,6 +148,30 @@ echo '
alert(t("testtool/alleFragenBeantwortet")."'"?>);
return true;
}
+
+ $(document).ready(function () {
+ $(document).bind('cut copy paste', function(e)
+ {
+ if (document.querySelector('.frage'))
+ {
+ e.preventDefault();
+ }
+ });
+
+ $(document).on("keydown", function (e)
+ {
+ if (((e.ctrlKey || e.metaKey) && e.keyCode === 85) || e.keyCode === 123)
+ {
+ e.preventDefault();
+ }
+ });
+
+ $(document).on("contextmenu", function (e)
+ {
+ e.preventDefault();
+ });
+
+ });
//]]>
@@ -598,7 +622,7 @@ if($frage->frage_id!='')
$display_well = $frage->nummer == 0 ? '' : 'well'; // don't style frage 0 because this is always the introduction to gebiet
echo '
-
+
diff --git a/cis/testtool/gebietfertig.php b/cis/testtool/gebietfertig.php
index d8f9982d0..cf0a86ae2 100644
--- a/cis/testtool/gebietfertig.php
+++ b/cis/testtool/gebietfertig.php
@@ -50,9 +50,22 @@ $p = new phrasen($sprache_user);
-
+
+
t('testtool/zeitAbgelaufen');?>
diff --git a/cis/testtool/login.php b/cis/testtool/login.php
index 475ee9f00..d1944fe7a 100644
--- a/cis/testtool/login.php
+++ b/cis/testtool/login.php
@@ -426,6 +426,26 @@ if (isset($_POST['save']) && isset($_SESSION['prestudent_id']))
});';
?>
+ $(document).bind('cut copy paste', function(e)
+ {
+ if (document.querySelector('.frage'))
+ {
+ e.preventDefault();
+ }
+ });
+
+ $(document).on("keydown", function (e)
+ {
+ if (((e.ctrlKey || e.metaKey) && e.keyCode === 85) || e.keyCode === 123)
+ {
+ e.preventDefault();
+ }
+ });
+
+ $(document).on("contextmenu", function (e)
+ {
+ e.preventDefault();
+ });
// If Browser is any other than Mozilla Firefox and the test includes any MathML,
// show message to use Mozilla Firefox
var ua = navigator.userAgent;
diff --git a/cis/testtool/menu.php b/cis/testtool/menu.php
index 11fbc61d5..7c8b12b9d 100644
--- a/cis/testtool/menu.php
+++ b/cis/testtool/menu.php
@@ -414,7 +414,17 @@ else
+
+
t('testtool/prueflingGesperrt');?>
diff --git a/cis/testtool/topbar.php b/cis/testtool/topbar.php
index 8432d4f41..7ca218ede 100644
--- a/cis/testtool/topbar.php
+++ b/cis/testtool/topbar.php
@@ -71,6 +71,18 @@ function changeSprache(sprache)
parent.menu.location.href = parent.menu.location.pathname + '?sprache_user=' + sprache; // refreshes menu.php
parent.content.location.href = parent.content.location.pathname + '?' + content_params; // refreshes login.php or frage.php
}
+
+ $(document).on("keydown", function (e) {
+ if (((e.ctrlKey || e.metaKey) && e.keyCode === 85) || e.keyCode === 123)
+ {
+ e.preventDefault();
+ }
+ });
+
+ $(document).on("contextmenu", function (e)
+ {
+ e.preventDefault();
+ });
array('StudiengebuehrErhoeht', 'Studiengebuehr', 'StudiengebuehrRestzahlung'),
'OEH' => array('OEH')
))
-));
+);
// Spezialnoten die am Zeunigs und Diplomasupplement ignoriert werden
define('ZEUGNISNOTE_NICHT_ANZEIGEN',serialize(array('iar', 'nz')));
@@ -295,4 +295,13 @@ define ('DEFAULT_LEHRMODUS','regulaer');
//Echter Dienstvertrag
define ('DEFAULT_ECHTER_DIENSTVERTRAG',[103,110]);
+//Buchungstypen die fix auf eine bestimmte Kostenstelle gebucht werden sollen
+//Buchungstyp => Studiengang_kz
+define('FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE', serialize(
+ array(
+ 'Test_1' => 0,
+ 'Test_2' => 2
+ )
+));
+
?>
diff --git a/content/fas.xul.php b/content/fas.xul.php
index abe7f613e..29515eae6 100644
--- a/content/fas.xul.php
+++ b/content/fas.xul.php
@@ -141,7 +141,9 @@ foreach($addon_obj->result as $addon)
+
+
@@ -518,6 +520,13 @@ foreach($addon_obj->result as $addon)
command = "menu-dokumente-antrag-abmeldung:command"
accesskey = "&menu-dokumente-antrag-abmeldung.accesskey;"
/>
+
-
+
{{sem.studiensemester_kurzbz}}
diff --git a/public/js/components/Studierendenantrag/Form/Wiederholung.js b/public/js/components/Studierendenantrag/Form/Wiederholung.js
index c2aea93f2..eca1dba94 100644
--- a/public/js/components/Studierendenantrag/Form/Wiederholung.js
+++ b/public/js/components/Studierendenantrag/Form/Wiederholung.js
@@ -35,10 +35,14 @@ export default {
statusSeverity() {
switch (this.data.status)
{
- case 'Erstellt': return 'info';
+ case 'Offen':
+ case 'Erstellt':
+ case 'ErsteAufforderungVersandt': return 'info';
case 'Genehmigt': return 'success';
- case 'Verzichtet': return 'danger';
- default: return 'info';
+ case 'Pause':
+ case 'Verzichtet':
+ case 'Abgemeldet': return 'danger';
+ default: return 'warning';
}
},
loadUrl() {
@@ -66,8 +70,12 @@ export default {
this.data.statustyp = this.$p.t('studierendenantrag', 'status_open');
}
this.$emit('update:status', this.data.status);
+ const msg = (this.data.status == 'Pause' && this.data.status_insertvon == "Studienabbruch") ? Vue.computed(() => {
+ let status = this.$p.t('studierendenantrag/status_stop');
+ return this.$p.t('studierendenantrag', 'status_x', {status});
+ }) : Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp}));
this.$emit("setStatus", {
- msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
+ msg,
severity: this.statusSeverity
});
return result;
diff --git a/public/js/components/Studierendenantrag/Leitung.js b/public/js/components/Studierendenantrag/Leitung.js
index a56e23725..3f7c74e5b 100644
--- a/public/js/components/Studierendenantrag/Leitung.js
+++ b/public/js/components/Studierendenantrag/Leitung.js
@@ -184,6 +184,44 @@ export default {
.then(this.showValidation)
.catch(this.showError);
},
+ actionPause(evt) {
+ var antraege = evt || this.selectedData;
+ this.$refs.loader.show();
+ axios
+ .all(
+ antraege.map(
+ antrag => axios.post(
+ FHC_JS_DATA_STORAGE_OBJECT.app_root +
+ FHC_JS_DATA_STORAGE_OBJECT.ci_router +
+ '/components/Antrag/Leitung/pauseAntrag/',
+ {
+ studierendenantrag_id: antrag.studierendenantrag_id
+ }
+ )
+ )
+ )
+ .then(this.showValidation)
+ .catch(this.showError);
+ },
+ actionUnpause(evt) {
+ var antraege = evt || this.selectedData;
+ this.$refs.loader.show();
+ axios
+ .all(
+ antraege.map(
+ antrag => axios.post(
+ FHC_JS_DATA_STORAGE_OBJECT.app_root +
+ FHC_JS_DATA_STORAGE_OBJECT.ci_router +
+ '/components/Antrag/Leitung/unpauseAntrag/',
+ {
+ studierendenantrag_id: antrag.studierendenantrag_id
+ }
+ )
+ )
+ )
+ .then(this.showValidation)
+ .catch(this.showError);
+ },
actionObject(evt) {
var antraege = evt || this.selectedData;
this.$refs.loader.show();
@@ -347,6 +385,8 @@ export default {
@action:objectionDeny="actionoObjectionDeny"
@action:objectionApprove="actionObjectionApprove"
@action:cancel="actionCancel"
+ @action:pause="actionPause"
+ @action:unpause="actionUnpause"
@reload="reload"
>
diff --git a/public/js/components/Studierendenantrag/Leitung/Table.js b/public/js/components/Studierendenantrag/Leitung/Table.js
index 68f93cb11..9e63a94f7 100644
--- a/public/js/components/Studierendenantrag/Leitung/Table.js
+++ b/public/js/components/Studierendenantrag/Leitung/Table.js
@@ -25,7 +25,9 @@ export default {
'action:object',
'action:objectionDeny',
'action:objectionApprove',
- 'action:cancel'
+ 'action:cancel',
+ 'action:pause',
+ 'action:unpause'
],
data() {
return {
@@ -60,6 +62,29 @@ export default {
this.historyData = res.data.retval.sort((a, b) => a.insertamum > b.insertamum);
});
},
+ getHistoryStatus(data, index) {
+ if (data.insertvon == 'Studienabbruch')
+ return this.$p.t('studierendenantrag/status_stop');
+ if (index > 0 && this.historyData[index-1].studierendenantrag_statustyp_kurzbz == 'Pause') {
+ if (index > 1 && this.historyData[index-2].studierendenantrag_statustyp_kurzbz != 'Pause') {
+ // NOTE(chris): this is a AbmeldungStgl Pause right after a manual Pause
+ if (data.studierendenantrag_statustyp_kurzbz == 'Pause')
+ return data.typ;
+ // NOTE(chris): this is a manual Pause resumed
+ else
+ return data.typ + ' (' + this.$p.t('studierendenantrag/status_unpaused') + ')';
+ }
+ // NOTE(chris): a series of pause stati always starts with a manual and alternate afterwards
+ let i = 2;
+ while (index-i > 0 && this.historyData[index-i].studierendenantrag_statustyp_kurzbz == 'Pause') i++;
+ if (data.studierendenantrag_statustyp_kurzbz == 'Pause')
+ i++;
+ return i%2
+ ? data.typ
+ : data.typ + ' (' + this.$p.t('studierendenantrag/status_unpaused') + ')';
+ }
+ return data.typ;
+ },
showHistoryGrund(grund) {
this.$refs.modalGrund.$el.addEventListener(
'hidden.bs.modal',
@@ -89,7 +114,7 @@ export default {
this.table = new Tabulator(this.$refs.table, {
placeholder:"Keine zu bearbeitenden Datensätze",
movableColumns: true,
- maxHeight: '50vh',
+ height: '65vh',
layout: "fitDataFill",
ajaxURL: this.ajaxUrl + (this.filter || ''),
persistence: { // NOTE(chris): do not store column titles
@@ -153,9 +178,13 @@ export default {
autocomplete: true,
},
formatter: (cell, formatterParams, onRendered) => {
+ let data = cell.getData();
+ let status = cell.getValue();
+ if (data.status_insertvon == 'Studienabbruch' && data.status == 'Pause')
+ status = this.$p.t('studierendenantrag/status_stop');
let link = document.createElement('a');
link.href = "#";
- link.innerHTML = cell.getValue();
+ link.innerHTML = status;
link.addEventListener('click', e => {
e.preventDefault();
this.lastHistoryClickedId = cell.getData().studierendenantrag_id;
@@ -234,7 +263,22 @@ export default {
container.className = "d-flex gap-2";
- if ((data.typ == 'Abmeldung' || data.typ == 'AbmeldungStgl' || data.typ == 'Unterbrechung') && (data.status == 'Genehmigt' || data.status == 'Beeinsprucht' || data.status == 'EinspruchAbgelehnt' || data.status == 'EmailVersandt')) {
+ let allowed_status_for_download = [];
+ switch (data.typ) {
+ case 'Abmeldung':
+ allowed_status_for_download = ['Genehmigt'];
+ break;
+ case 'AbmeldungStgl':
+ allowed_status_for_download = ['Genehmigt', 'Beeinsprucht', 'EinspruchAbgelehnt', 'Abgemeldet'];
+ break;
+ case 'Unterbrechung':
+ allowed_status_for_download = ['Genehmigt', 'EmailVersandt'];
+ break;
+ case 'Wiederholung':
+ allowed_status_for_download = ['Abgemeldet'];
+ break;
+ }
+ if (allowed_status_for_download.includes(data.status)) {
// NOTE(chris): Download PDF
let button = document.createElement('a');
// NOTE(chris): phrasen in attribues don't work if they are not preloaded
@@ -246,6 +290,56 @@ export default {
'content/pdfExport.php?xml=Antrag' + data.typ + '.xml.php&xsl=Antrag' + data.typ + '&id=' + data.studierendenantrag_id + '&output=pdf';
container.append(button);
}
+
+ if (data.typ == 'Wiederholung' && (data.status == 'ErsteAufforderungVersandt' || data.status == 'ZweiteAufforderungVersandt')) {
+ // NOTE(chris): Pause
+ let button = document.createElement('button');
+ let icon = document.createElement('i');
+ let span = document.createElement('span');
+
+ icon.className = "fa-solid fa-pause";
+ icon.setAttribute('aria-hidden', true);
+ icon.setAttribute('title', this.$p.t('studierendenantrag', 'btn_pause'));
+
+ span.className = "fa-sr-only";
+ span.append(this.$p.t('studierendenantrag', 'btn_pause'));
+
+ button.append(icon);
+ button.append(span);
+ button.className = "btn btn-outline-secondary";
+ button.addEventListener('click', () => this.$emit('action:pause', [cell.getData()]));
+ container.append(button);
+ }
+
+ let canUnpause = data.status == 'Pause' && !['AbmeldungStgl', 'Studienabbruch'].includes(data.status_insertvon);
+ if (!canUnpause && data.status == 'Pause' && data.status_insertvon == 'AbmeldungStgl') {
+ canUnpause = cell.getTable().getData().filter(row =>
+ row.prestudent_id == data.prestudent_id
+ && row.typ == 'AbmeldungStgl'
+ && row.status == 'Zurueckgezogen'
+ && row.status_insertamum == data.status_insertamum
+ ).length;
+ }
+ if (canUnpause) {
+ // NOTE(chris): Unpause
+ let button = document.createElement('button');
+ let icon = document.createElement('i');
+ let span = document.createElement('span');
+
+ icon.className = "fa-solid fa-play";
+ icon.setAttribute('aria-hidden', true);
+ icon.setAttribute('title', this.$p.t('studierendenantrag', 'btn_unpause'));
+
+ span.className = "fa-sr-only";
+ span.append(this.$p.t('studierendenantrag', 'btn_unpause'));
+
+ button.append(icon);
+ button.append(span);
+ button.className = "btn btn-outline-secondary";
+ button.addEventListener('click', () => this.$emit('action:unpause', [cell.getData()]));
+ container.append(button);
+ }
+
if (data.typ == 'AbmeldungStgl' && data.status == 'Genehmigt') {
// NOTE(chris): Object
let button = document.createElement('button');
@@ -377,10 +471,10 @@ export default {
{{$p.t('studierendenantrag', 'title_history', {id: lastHistoryClickedId})}}
-
+
{{(new Date(status.insertamum)).toLocaleString()}}
{{status.insertvon}}
- {{status.typ}}
+ {{getHistoryStatus(status, index)}}
{{$p.t('studierendenantrag', 'antrag_grund')}}
diff --git a/public/js/components/Tabs.js b/public/js/components/Tabs.js
index 25f225e01..36b6406c5 100644
--- a/public/js/components/Tabs.js
+++ b/public/js/components/Tabs.js
@@ -11,7 +11,6 @@ export default {
'changed'
],
props: {
- // TODO(chris): rename to config?
config: {
type: [String, Object],
required: true
@@ -118,10 +117,10 @@ export default {
{{tab.title}}
- `
-};
\ No newline at end of file
+};
diff --git a/public/js/plugin/FhcApi.js b/public/js/plugin/FhcApi.js
index 335dec45e..bacd27d43 100644
--- a/public/js/plugin/FhcApi.js
+++ b/public/js/plugin/FhcApi.js
@@ -52,6 +52,45 @@ export default {
baseURL: FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + "/"
});
+ fhcApiAxios.interceptors.request.use(config => {
+ if (config.method != 'post' || !config.data)
+ return config;
+
+ if (config.data instanceof FormData)
+ return config;
+
+ if (!Object.values(config.data).every(item => {
+ if (item instanceof FileList)
+ return false;
+ if (Array.isArray(item))
+ return item.every(i => !(i instanceof File));
+ return true;
+ })) {
+ const newData = Object.entries(config.data).reduce((nd, [key, item]) => {
+ if (item instanceof FileList) {
+ for (const file of item)
+ nd.FormData.append(key + (item.length > 1 ? '[]' : ''), file);
+ } else if (Array.isArray(item)) {
+ if (item.every(i => !(i instanceof File))) {
+ nd.jsondata[key] = item;
+ } else {
+ item.forEach(file => nd.FormData.append(key + (item.length > 1 ? '[]' : ''), file));
+ }
+ } else {
+ nd.jsondata[key] = item;
+ }
+ return nd;
+ }, {
+ FormData: new FormData(),
+ jsondata: {}
+ });
+ newData.FormData.append('_jsondata', JSON.stringify(newData.jsondata));
+ config.data = newData.FormData;
+ }
+
+ return config;
+ });
+
fhcApiAxios.interceptors.response.use(response => {
if (response.config?.errorHandling == 'off'
|| response.config?.errorHandling === false
diff --git a/rdf/AntragAbmeldung.xml.php b/rdf/AntragAbmeldung.xml.php
index 515b1809a..28210d280 100644
--- a/rdf/AntragAbmeldung.xml.php
+++ b/rdf/AntragAbmeldung.xml.php
@@ -36,7 +36,7 @@ else
$query = "
- SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, public.get_absem_prestudent(a.prestudent_id, NULL) AS semester, a.grund
+ SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, pss.ausbildungssemester AS semester, a.grund
FROM
campus.tbl_studierendenantrag a
JOIN public.tbl_student USING (prestudent_id)
diff --git a/rdf/AntragAbmeldungStgl.xml.php b/rdf/AntragAbmeldungStgl.xml.php
index 4511be232..1e18e798b 100644
--- a/rdf/AntragAbmeldungStgl.xml.php
+++ b/rdf/AntragAbmeldungStgl.xml.php
@@ -14,7 +14,7 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml")
$id = $_GET['id'];
$where = " WHERE studierendenantrag_id = " . $db->db_add_param($id) . "
- AND a.typ = 'AbmeldungStgl' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) IN ('Genehmigt', 'Beeinsprucht', 'EinspruchAbgelehnt');";
+ AND a.typ = 'AbmeldungStgl' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) IN ('Genehmigt', 'Beeinsprucht', 'EinspruchAbgelehnt', 'Abgemeldet');";
$not_found_error = 'Studierendenantrag not found'. $id;
} elseif(isset($_GET['uid']) && isset($_GET['prestudent_id'])) {
$uid = $_GET['uid'];
@@ -26,7 +26,7 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml")
$prestudent_id = (array_filter($prestudent_id, 'strlen'));
$where = " WHERE a.prestudent_id in (" . $db->db_implode4SQL($prestudent_id) . ")
- AND a.typ = 'AbmeldungStgl' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) IN ('Genehmigt', 'Beeinsprucht', 'EinspruchAbgelehnt');";
+ AND a.typ = 'AbmeldungStgl' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) IN ('Genehmigt', 'Beeinsprucht', 'EinspruchAbgelehnt', 'Abgemeldet');";
$not_found_error = 'Studierendenantrag not found for: ' . implode(',', $uid);
} else
die('wrong parameters ');
@@ -36,7 +36,7 @@ else
$query = "
- SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, public.get_absem_prestudent(a.prestudent_id, NULL) AS semester, a.grund
+ SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, pss.ausbildungssemester AS semester, a.grund
FROM
campus.tbl_studierendenantrag a
JOIN public.tbl_student USING (prestudent_id)
diff --git a/rdf/AntragUnterbrechung.xml.php b/rdf/AntragUnterbrechung.xml.php
index ff3e68afa..38a584377 100644
--- a/rdf/AntragUnterbrechung.xml.php
+++ b/rdf/AntragUnterbrechung.xml.php
@@ -37,7 +37,7 @@ else
$query = "
- SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, public.get_absem_prestudent(a.prestudent_id, NULL) AS semester, a.grund, datum_wiedereinstieg, a.datum
+ SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, pss.ausbildungssemester AS semester, a.grund, datum_wiedereinstieg, a.datum
FROM
campus.tbl_studierendenantrag a
JOIN public.tbl_student USING (prestudent_id)
diff --git a/rdf/AntragWiederholung.xml.php b/rdf/AntragWiederholung.xml.php
new file mode 100644
index 000000000..c3ef6a183
--- /dev/null
+++ b/rdf/AntragWiederholung.xml.php
@@ -0,0 +1,70 @@
+db_add_param($id) . "
+ AND a.typ = 'Wiederholung' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) = 'Abgemeldet';";
+ $not_found_error = 'Studierendenantrag not found'. $id;
+ } elseif(isset($_GET['uid']) && isset($_GET['prestudent_id'])) {
+ $uid = $_GET['uid'];
+ $uid = explode(';', $uid);
+ $uid = (array_filter($uid, 'strlen'));
+
+ $prestudent_id = $_GET['prestudent_id'];
+ $prestudent_id = explode(';', $prestudent_id);
+ $prestudent_id = (array_filter($prestudent_id, 'strlen'));
+
+ $where = " WHERE a.prestudent_id in (" . $db->db_implode4SQL($prestudent_id) . ")
+ AND a.typ = 'Wiederholung' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) = 'Abgemeldet';";
+ $not_found_error = 'Studierendenantrag not found for: ' . implode(',', $uid);
+ } else
+ die('wrong parameters ');
+}
+else
+ die('Format not supported ');
+
+
+$query = "
+ SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, pss.ausbildungssemester AS semester, (SELECT pt.text FROM system.tbl_phrase p JOIN system.tbl_phrasentext pt USING(phrase_id) WHERE p.category=" . $db->db_add_param('studierendenantrag', FHC_STRING) . " AND p.phrase=" . $db->db_add_param('grund_Wiederholung_deadline', FHC_STRING) . " AND pt.sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . " LIMIT 1) AS grund
+ FROM
+ campus.tbl_studierendenantrag a
+ JOIN public.tbl_student USING (prestudent_id)
+ JOIN public.tbl_benutzer ON tbl_student.student_uid=uid
+ JOIN public.tbl_person USING (person_id)
+ JOIN public.tbl_studiengang stg USING (studiengang_kz)
+ JOIN public.tbl_studiensemester USING (studiensemester_kurzbz)
+ LEFT JOIN public.tbl_prestudentstatus pss ON (pss.prestudent_id = a.prestudent_id AND pss.studiensemester_kurzbz=a.studiensemester_kurzbz AND pss.status_kurzbz=get_rolle_prestudent(a.prestudent_id, a.studiensemester_kurzbz))
+ LEFT JOIN lehre.tbl_studienplan plan USING (studienplan_id)
+ JOIN bis.tbl_orgform ON (tbl_orgform.orgform_kurzbz = COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz, stg.orgform_kurzbz))" . $where;
+
+
+if (!$db->db_query($query) || !$db->db_num_rows())
+ die('' . $not_found_error . ' ');
+
+?>
+
+
+ db_fetch_object()) { ?>
+
+ vorname . ' ' . $row->nachname); ?>]]>
+ bezeichnung; ?>]]>
+ bezeichnung_mehrsprachig; ?>]]>
+ matrikelnr; ?>]]>
+ studienjahr_kurzbz; ?>]]>
+ studiensemester_kurzbz; ?>]]>
+ semester; ?>]]>
+ grund; ?>]]>
+
+
+
diff --git a/rdf/lehrverbandsgruppe.rdf.php b/rdf/lehrverbandsgruppe.rdf.php
index 755444b6d..4df07637a 100644
--- a/rdf/lehrverbandsgruppe.rdf.php
+++ b/rdf/lehrverbandsgruppe.rdf.php
@@ -85,7 +85,6 @@ if(isset($_GET['prestudent']) && $_GET['prestudent']=='false')
else
$berechtigt_studiengang = array_merge($berechtigt_studiengang, $berechtigung->getStgKz('assistenz'));
-//var_dump($berechtigung);
array_unique($berechtigt_studiengang);
$stg_kz_query='';
if (count($berechtigt_studiengang)>0)
@@ -382,13 +381,13 @@ function draw_orgformsubmenu($stg_kz, $orgform)
$orgform_sequence[$stg_kz].= "\n\t\t\t\n";
$orgform_sequence[$stg_kz].= "\t\t\t";
- $orgform_sequence[$stg_kz].= "\n\t\t\t\tstudiensemester_kurzbz/bewerber\">\n";
+ $orgform_sequence[$stg_kz].= "\n\t\t\t\tstudiensemester_kurzbz/bewerber\">\n";
$orgform_sequence[$stg_kz].= "\t\t\tstudiensemester_kurzbz/bewerber/reihungstestnichtangemeldet\" />\n";
$orgform_sequence[$stg_kz].= "\t\t\t";
$orgform_sequence[$stg_kz].= "\t\t\tstudiensemester_kurzbz/bewerber/reihungstestangemeldet\">\n";
- $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/bewerber/reihungstestangemeldet/reihungstestnichtangemeldet/teilgenommen\" />\n";
- $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/bewerber/reihungstestangemeldet/reihungstestnichtangemeldet/nichtteilgenommen\" />\n";
+ $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/bewerber/reihungstestangemeldet/teilgenommen\" />\n";
+ $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/bewerber/reihungstestangemeldet/nichtteilgenommen\" />\n";
$orgform_sequence[$stg_kz].= "\t\t\t\t ";
$orgform_sequence[$stg_kz].= "\n\t\t\t \n";
@@ -915,7 +914,7 @@ draw_orgformpart($stg_kz);
echo "\n\t\t\t \n";
echo "\t\t\t";
- echo "\t\t\t\tstudiensemester_kurzbz/bewerber\">\n";
+ echo "\n\t\t\t\tstudiensemester_kurzbz/bewerber\">\n";
echo "\t\t\t\tstudiensemester_kurzbz/bewerber/reihungstestnichtangemeldet\" />\n";
echo "\t\t\t";
echo "\t\t\t\tstudiensemester_kurzbz/bewerber/reihungstestangemeldet\">\n";
diff --git a/rdf/studienblatt.xml.php b/rdf/studienblatt.xml.php
index f0caadeb8..3ee805c04 100644
--- a/rdf/studienblatt.xml.php
+++ b/rdf/studienblatt.xml.php
@@ -269,11 +269,23 @@ foreach($uid_arr as $uid)
echo "\t\tsprache."]]> \n";
echo "\t\tregelstudiendauer."]]> \n";
- $akadgrad = new akadgrad();
- $akadgrad->getAkadgradStudent($student->uid);
+ // Abschlussgrad ermitteln
+ // Erst aus Studienordnung, wenn nicht gesetzt aus akadgrad-Tabelle
- echo "\t\ttitel."]]> \n";
- echo "\t\takadgrad_kurzbz."]]> \n";
+ if ($studienordnung->akadgrad_id != '')
+ {
+ $akadgrad = new akadgrad($studienordnung->akadgrad_id);
+ echo "\t\ttitel."]]> \n";
+ echo "\t\takadgrad_kurzbz."]]> \n";
+ }
+ else
+ {
+ $akadgrad = new akadgrad();
+ $akadgrad->getAkadgradStudent($student->uid);
+
+ echo "\t\ttitel."]]> \n";
+ echo "\t\takadgrad_kurzbz."]]> \n";
+ }
//für ao. Studierende wird die StgKz der Lehrveranstaltungen benötigt, die sie besuchen
$lv_studiengang_kz='';
diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php
index c8669de28..7baeca953 100644
--- a/system/dbupdate_3.4.php
+++ b/system/dbupdate_3.4.php
@@ -49,12 +49,16 @@ require_once('dbupdate_3.4/30181_tabelle_anrechnung_neue_attribute_fuer_begruend
require_once('dbupdate_3.4/29529_infocenter_anpassungen.php');
require_once('dbupdate_3.4/29835_uhstat1_erfassung_der_uhstat1_daten_ueber_das_bewerbungstool.php');
require_once('dbupdate_3.4/33714_erhoehter_studienbeitrag_fuer_drittsaatenangehoerig.php');
-
+require_once('dbupdate_3.4/36275_zeitaufzeichnung_karenz.php');
+require_once('dbupdate_3.4/21620_neues_feld_zum_erfassen_des_ESI.php');
+require_once('dbupdate_3.4/36530_bis_internationsalisierung_codextabelle_neuerungen.php');
+require_once('dbupdate_3.4/34543_ux_template.php');
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
echo 'Pruefe Tabellen und Attribute! ';
$tabellen=array(
+ "bis.tbl_abschluss" => array("ausbildung_code","abschluss_bez","bezeichnung","aktiv","in_oesterreich"),
"bis.tbl_bisorgform" => array("bisorgform_kurzbz","code","bezeichnung"),
"bis.tbl_archiv" => array("archiv_id","studiensemester_kurzbz","meldung","html","studiengang_kz","insertamum","insertvon","typ"),
"bis.tbl_aufenthaltfoerderung" => array("aufenthaltfoerderung_code", "bezeichnung"),
@@ -86,6 +90,7 @@ $tabellen=array(
"bis.tbl_nationengruppe" => array("nationengruppe_kurzbz","nationengruppe_bezeichnung","aktiv"),
"bis.tbl_oehbeitrag" => array("oehbeitrag_id","studierendenbeitrag","versicherung","von_studiensemester_kurzbz","bis_studiensemester_kurzbz","insertamum","insertvon","updateamum","updatevon"),
"bis.tbl_orgform" => array("orgform_kurzbz","code","bezeichnung","rolle","bisorgform_kurzbz","bezeichnung_mehrsprachig"),
+ "bis.tbl_uhstat1daten" => array("uhstat1daten_id", "mutter_geburtsstaat", "mutter_bildungsstaat", "mutter_geburtsjahr", "mutter_bildungmax", "vater_geburtsstaat", "vater_bildungsstaat", "vater_geburtsjahr", "vater_bildungmax", "person_id", "insertamum", "insertvon", "updateamum", "updatevon"),
"bis.tbl_verwendung" => array("verwendung_code","verwendungbez"),
"bis.tbl_zgv" => array("zgv_code","zgv_bez","zgv_kurzbz","bezeichnung","aktiv"),
"bis.tbl_zgvmaster" => array("zgvmas_code","zgvmas_bez","zgvmas_kurzbz","bezeichnung","aktiv"),
@@ -134,6 +139,10 @@ $tabellen=array(
"campus.tbl_pruefungsanmeldung" => array("pruefungsanmeldung_id","uid","pruefungstermin_id","lehrveranstaltung_id","status_kurzbz","wuensche","reihung","kommentar","statusupdatevon","statusupdateamum","anrechnung_id","pruefungstyp_kurzbz","insertamum"),
"campus.tbl_pruefungsstatus" => array("status_kurzbz","bezeichnung"),
"campus.tbl_reservierung" => array("reservierung_id","ort_kurzbz","studiengang_kz","uid","stunde","datum","titel","beschreibung","semester","verband","gruppe","gruppe_kurzbz","veranstaltung_id","insertamum","insertvon"),
+ "campus.tbl_studierendenantrag" => array("studierendenantrag_id","prestudent_id","studiensemester_kurzbz","datum","typ","insertamum","insertvon","datum_wiedereinstieg","grund","dms_id"),
+ "campus.tbl_studierendenantrag_lehrveranstaltung" => array("studierendenantrag_lehrveranstaltung_id","studierendenantrag_id","lehrveranstaltung_id","studiensemester_kurzbz","note","anmerkung","insertamum","insertvon"),
+ "campus.tbl_studierendenantrag_status" => array("studierendenantrag_status_id","studierendenantrag_id","studierendenantrag_statustyp_kurzbz","insertamum","insertvon", "grund"),
+ "campus.tbl_studierendenantrag_statustyp"=> array("studierendenantrag_statustyp_kurzbz","bezeichnung"),
"campus.tbl_studentbeispiel" => array("student_uid","beispiel_id","vorbereitet","probleme","updateamum","updatevon","insertamum","insertvon"),
"campus.tbl_studentuebung" => array("student_uid","mitarbeiter_uid","abgabe_id","uebung_id","note","mitarbeitspunkte","punkte","anmerkung","benotungsdatum","updateamum","updatevon","insertamum","insertvon"),
"campus.tbl_template" => array("template_kurzbz","bezeichnung","xsd","xslt_xhtml","xslfo_pdf"),
@@ -157,8 +166,12 @@ $tabellen=array(
"fue.tbl_ressource" => array("ressource_id","student_uid","mitarbeiter_uid","betriebsmittel_id","firma_id","bezeichnung","beschreibung","insertamum","insertvon","updateamum","updatevon"),
"fue.tbl_scrumteam" => array("scrumteam_kurzbz","bezeichnung","punkteprosprint","tasksprosprint","gruppe_kurzbz"),
"fue.tbl_scrumsprint" => array("scrumsprint_id","scrumteam_kurzbz","sprint_kurzbz","sprintstart","sprintende","insertamum","insertvon","updateamum","updatevon"),
+ "hr.tbl_audit_log" => array("audit_log_id","mtime","action","username","table_name","diff_data","row_data"),
"hr.tbl_sachaufwand" => array("sachaufwand_id","mitarbeiter_uid","sachaufwandtyp_kurzbz","dienstverhaeltnis_id","beginn","ende","anmerkung","insertamum","insertvon","updateamum","updatevon"),
"hr.tbl_sachaufwandtyp" => array("sachaufwandtyp_kurzbz","bezeichnung","sort", "aktiv"),
+ "hr.tbl_stundensatz" => array("stundensatz_id","uid","stundensatztyp","stundensatz","oe_kurzbz","gueltig_von","gueltig_bis","insertamum","insertvon","updateamum","updatevon"),
+ "hr.tbl_stundensatztyp" => array("stundensatztyp","bezeichnung","aktiv","insertamum","insertvon","updateamum","updatevon"),
+ "hr.tbl_tmp_store" => array("tmp_store_id","typ","mitarbeiter_uid","formdata","insertvon","insertamum","updatevon","updateamum"),
"hr.tbl_dienstverhaeltnis" => array("dienstverhaeltnis_id","mitarbeiter_uid","vertragsart_kurzbz","oe_kurzbz","von","bis","insertamum","insertvon","updateamum","updatevon"),
"hr.tbl_vertragsart" => array("vertragsart_kurzbz","bezeichnung","anmerkung","dienstverhaeltnis","vertragsart_kurzbz_parent","aktiv","sort"),
"hr.tbl_vertragsbestandteil" => array("vertragsbestandteil_id","dienstverhaeltnis_id","vertragsbestandteiltyp_kurzbz","von", "bis","insertamum", "insertvon","updateamum","updatevon"),
@@ -261,6 +274,8 @@ $tabellen=array(
"public.tbl_geschaeftsjahr" => array("geschaeftsjahr_kurzbz","start","ende","bezeichnung"),
"public.tbl_gruppe" => array("gruppe_kurzbz","studiengang_kz","semester","bezeichnung","beschreibung","sichtbar","lehre","aktiv","sort","mailgrp","generiert","updateamum","updatevon","insertamum","insertvon","ext_id","orgform_kurzbz","gid","content_visible","gesperrt","zutrittssystem","aufnahmegruppe","direktinskription"),
"public.tbl_gruppe_manager" => array("gruppe_manager_id","gruppe_kurzbz","uid","insertamum","insertvon"),
+ "public.tbl_kennzeichen" => array("kennzeichen_id", "person_id", "kennzeichentyp_kurzbz", "inhalt", "aktiv", "insertamum", "insertvon", "updateamum", "updatevon"),
+ "public.tbl_kennzeichentyp" => array("kennzeichentyp_kurzbz", "bezeichnung", "aktiv"),
"public.tbl_kontakt" => array("kontakt_id","person_id","kontakttyp","anmerkung","kontakt","zustellung","updateamum","updatevon","insertamum","insertvon","ext_id","standort_id"),
"public.tbl_kontaktmedium" => array("kontaktmedium_kurzbz","beschreibung"),
"public.tbl_kontakttyp" => array("kontakttyp","beschreibung","bezeichnung_mehrsprachig"),
@@ -293,8 +308,10 @@ $tabellen=array(
"public.tbl_preoutgoing_status" => array("preoutgoing_status_kurzbz","bezeichnung"),
"public.tbl_prestudent" => array("prestudent_id","aufmerksamdurch_kurzbz","person_id","studiengang_kz","berufstaetigkeit_code","ausbildungcode","zgv_code","zgvort","zgvdatum","zgvmas_code","zgvmaort","zgvmadatum","aufnahmeschluessel","facheinschlberuf","reihungstest_id","anmeldungreihungstest","reihungstestangetreten","rt_gesamtpunkte","rt_punkte1","rt_punkte2","bismelden","anmerkung","dual","insertamum","insertvon","updateamum","updatevon","ext_id","ausstellungsstaat","rt_punkte3", "zgvdoktor_code", "zgvdoktorort", "zgvdoktordatum","mentor","zgvnation","zgvmanation","zgvdoktornation","gsstudientyp_kurzbz","aufnahmegruppe_kurzbz","udf_values","priorisierung","foerderrelevant","standort_code","zgv_erfuellt","zgvmas_erfuellt","zgvdoktor_erfuellt"),
"public.tbl_prestudentstatus" => array("prestudent_id","status_kurzbz","studiensemester_kurzbz","ausbildungssemester","datum","orgform_kurzbz","insertamum","insertvon","updateamum","updatevon","ext_id","studienplan_id","bestaetigtam","bestaetigtvon","fgm","faktiv", "anmerkung","bewerbung_abgeschicktamum","rt_stufe","statusgrund_id"),
- "public.tbl_raumtyp" => array("raumtyp_kurzbz","beschreibung","kosten"),
+ "public.tbl_raumtyp" => array("raumtyp_kurzbz","beschreibung","kosten","aktiv"),
"public.tbl_reihungstest" => array("reihungstest_id","studiengang_kz","ort_kurzbz","anmerkung","datum","uhrzeit","updateamum","updatevon","insertamum","insertvon","ext_id","freigeschaltet","max_teilnehmer","oeffentlich","studiensemester_kurzbz","aufnahmegruppe_kurzbz","stufe","anmeldefrist","zugangs_ueberpruefung","zugangscode"),
+ "public.tbl_rueckstellung" => array("rueckstellung_id","person_id","status_kurzbz","datum_bis","insertamum","insertvon"),
+ "public.tbl_rueckstellung_status" => array("status_kurzbz", "bezeichnung_mehrsprachig", "sort", "aktiv"),
"public.tbl_rt_ort" => array("rt_id","ort_kurzbz","uid"),
"public.tbl_rt_person" => array("rt_person_id","person_id","rt_id","studienplan_id","anmeldedatum","teilgenommen","ort_kurzbz","punkte","insertamum","insertvon","updateamum","updatevon"),
"public.tbl_rt_studienplan" => array("reihungstest_id","studienplan_id"),
diff --git a/system/dbupdate_3.4/21620_neues_feld_zum_erfassen_des_ESI.php b/system/dbupdate_3.4/21620_neues_feld_zum_erfassen_des_ESI.php
new file mode 100644
index 000000000..5b6b22918
--- /dev/null
+++ b/system/dbupdate_3.4/21620_neues_feld_zum_erfassen_des_ESI.php
@@ -0,0 +1,146 @@
+db_query('SELECT 0 FROM public.tbl_kennzeichentyp WHERE 0 = 1'))
+{
+ $qry = 'CREATE TABLE public.tbl_kennzeichentyp (
+ kennzeichentyp_kurzbz varchar(32) NOT NULL,
+ bezeichnung varchar(256) NOT NULL,
+ aktiv boolean NOT NULL DEFAULT TRUE
+ );
+
+ COMMENT ON TABLE public.tbl_kennzeichentyp IS \'Tabelle zur Verwaltung von Typen von externen Personenkennzeichen.\';
+ COMMENT ON COLUMN public.tbl_kennzeichentyp.bezeichnung IS \'Voller Name des Kennzeichentyps.\';
+ COMMENT ON COLUMN public.tbl_kennzeichentyp.aktiv IS \'Ob der Kennzeichentyp noch aktiv und verwendet wird.\';
+
+ ALTER TABLE public.tbl_kennzeichentyp ADD CONSTRAINT pk_tbl_kennzeichentyp PRIMARY KEY (kennzeichentyp_kurzbz)';
+
+ if (!$db->db_query($qry))
+ echo 'public.tbl_kennzeichentyp: '.$db->db_last_error().' ';
+ else
+ echo ' public.tbl_kennzeichentyp table created';
+
+ $qry = 'GRANT SELECT ON TABLE public.tbl_kennzeichentyp TO web;';
+ if (!$db->db_query($qry))
+ echo 'public.tbl_kennzeichentyp: '.$db->db_last_error().' ';
+ else
+ echo ' Granted privileges to web on public.tbl_kennzeichentyp';
+
+ $qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE public.tbl_kennzeichentyp TO vilesci;';
+ if (!$db->db_query($qry))
+ echo 'public.tbl_kennzeichentyp: '.$db->db_last_error().' ';
+ else
+ echo ' Granted privileges to vilesci on public.tbl_kennzeichentyp';
+}
+
+// SEQUENCE tbl_kennzeichen_id_seq
+if ($result = $db->db_query("SELECT 0 FROM pg_class WHERE relname = 'tbl_kennzeichen_id_seq'"))
+{
+ if ($db->db_num_rows($result) == 0)
+ {
+ $qry = 'CREATE SEQUENCE public.tbl_kennzeichen_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MAXVALUE
+ NO MINVALUE
+ CACHE 1;';
+
+ if(!$db->db_query($qry))
+ echo 'public.tbl_kennzeichen_id_seq '.$db->db_last_error().' ';
+ else
+ echo ' Created sequence: public.tbl_kennzeichen_id_seq';
+
+ // GRANT SELECT, UPDATE ON SEQUENCE public.tbl_kennzeichen_id_seq TO vilesci;
+ $qry = 'GRANT SELECT, UPDATE ON SEQUENCE public.tbl_kennzeichen_id_seq TO vilesci;';
+ if (!$db->db_query($qry))
+ echo 'public.tbl_kennzeichen_id_seq '.$db->db_last_error().' ';
+ else
+ echo ' Granted privileges to vilesci on public.tbl_kennzeichen_id_seq';
+
+ // GRANT SELECT, UPDATE ON SEQUENCE public.tbl_kennzeichen_id_seq TO fhcomplete;
+ $qry = 'GRANT SELECT, UPDATE ON SEQUENCE public.tbl_kennzeichen_id_seq TO fhcomplete;';
+ if (!$db->db_query($qry))
+ echo 'public.tbl_kennzeichen_id_seq '.$db->db_last_error().' ';
+ else
+ echo ' Granted privileges to fhcomplete on public.tbl_kennzeichen_id_seq';
+ }
+}
+
+// Creates table public.tbl_kennzeichen if it doesn't exist and grants privileges
+if (!$result = @$db->db_query('SELECT 0 FROM public.tbl_kennzeichen WHERE 0 = 1'))
+{
+ $qry = 'CREATE TABLE public.tbl_kennzeichen (
+ kennzeichen_id integer NOT NULL DEFAULT NEXTVAL(\'public.tbl_kennzeichen_id_seq\'),
+ person_id integer NOT NULL,
+ kennzeichentyp_kurzbz varchar(32) NOT NULL,
+ inhalt text NOT NULL,
+ aktiv boolean NOT NULL DEFAULT TRUE,
+ insertamum timestamp DEFAULT NOW(),
+ insertvon varchar(32),
+ updateamum timestamp,
+ updatevon varchar(32)
+ );
+
+ COMMENT ON TABLE public.tbl_kennzeichen IS \'Tabelle zum Speichern von externen Personenkennzeichen.\';
+ COMMENT ON COLUMN public.tbl_kennzeichen.kennzeichentyp_kurzbz IS \'Typ des externen Personen Kennzeichens.\';
+ COMMENT ON COLUMN public.tbl_kennzeichen.inhalt IS \'Das externe Kennzeichen.\';
+ COMMENT ON COLUMN public.tbl_kennzeichen.aktiv IS \'Ob das Kennzeichen noch aktiv ist und verwendet wird.\';
+
+ ALTER TABLE public.tbl_kennzeichen ADD CONSTRAINT pk_tbl_kennzeichen PRIMARY KEY (kennzeichen_id);
+
+ ALTER TABLE public.tbl_kennzeichen ADD CONSTRAINT fk_kennzeichen_person FOREIGN KEY (person_id)
+ REFERENCES public.tbl_person(person_id) ON UPDATE CASCADE ON DELETE RESTRICT;
+ ALTER TABLE public.tbl_kennzeichen ADD CONSTRAINT fk_kennzeichen_kennzeichentyp_kurzbz FOREIGN KEY (kennzeichentyp_kurzbz)
+ REFERENCES public.tbl_kennzeichentyp(kennzeichentyp_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT;
+
+ -- create unique constraint, no person can have the same kennzeichen twice
+ ALTER TABLE public.tbl_kennzeichen ADD CONSTRAINT uk_kennzeichen_person_id_inhalt UNIQUE (person_id, kennzeichentyp_kurzbz, inhalt);
+ -- create unique index - person can only have one active kennzeichen of each type
+ CREATE UNIQUE INDEX kennzeichen_aktiv_constraint ON public.tbl_kennzeichen (person_id, kennzeichentyp_kurzbz) WHERE aktiv;';
+
+ if (!$db->db_query($qry))
+ echo 'public.tbl_kennzeichen: '.$db->db_last_error().' ';
+ else
+ echo ' public.tbl_kennzeichen table created';
+
+ $qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE public.tbl_kennzeichen TO web;';
+ if (!$db->db_query($qry))
+ echo 'public.tbl_kennzeichen: '.$db->db_last_error().' ';
+ else
+ echo ' Granted privileges to web on public.tbl_kennzeichen';
+
+ $qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE public.tbl_kennzeichen TO vilesci;';
+ if (!$db->db_query($qry))
+ echo 'public.tbl_kennzeichen: '.$db->db_last_error().' ';
+ else
+ echo ' Granted privileges to vilesci on public.tbl_kennzeichen';
+}
+
+// public.tbl_kennzeichentyp: add type esi
+if ($result = $db->db_query("SELECT 1 FROM public.tbl_kennzeichentyp WHERE kennzeichentyp_kurzbz='esi'"))
+{
+ if($db->db_num_rows($result)==0)
+ {
+ $qry = "INSERT INTO public.tbl_kennzeichentyp(kennzeichentyp_kurzbz, bezeichnung) VALUES('esi', 'European Student Identifier');";
+
+ if(!$db->db_query($qry))
+ echo 'Kennzeichentyp: '.$db->db_last_error().' ';
+ else
+ echo ' Neuer Kennzeichentyp esi in public.tbl_kennzeichentyp hinzugefügt';
+ }
+}
+
+// system.tbl_jobtypes: add type esi
+if ($result = $db->db_query("SELECT 1 FROM system.tbl_jobtypes WHERE type='generateESI'"))
+{
+ if($db->db_num_rows($result)==0)
+ {
+ $qry = "INSERT INTO system.tbl_jobtypes(type, description) VALUES('generateESI', 'Generate and save European Student Identifier');";
+
+ if(!$db->db_query($qry))
+ echo 'Jobtyp: '.$db->db_last_error().' ';
+ else
+ echo ' Neuer Jobtyp generateESI in system.tbl_jobtypes hinzugefügt';
+ }
+}
diff --git a/system/dbupdate_3.4/27351_digitalisierung_formulare.php b/system/dbupdate_3.4/27351_digitalisierung_formulare.php
index d05b69604..ce572cc8e 100644
--- a/system/dbupdate_3.4/27351_digitalisierung_formulare.php
+++ b/system/dbupdate_3.4/27351_digitalisierung_formulare.php
@@ -7,7 +7,8 @@ if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_status
$qry = "CREATE TABLE campus.tbl_studierendenantrag_statustyp (
studierendenantrag_statustyp_kurzbz VARCHAR(32) NOT NULL,
bezeichnung VARCHAR(128)[] NOT NULL,
- CONSTRAINT tbl_studierendenantrag_statustyp_pk PRIMARY KEY(studierendenantrag_statustyp_kurzbz)
+ CONSTRAINT tbl_studierendenantrag_statustyp_pk
+ PRIMARY KEY(studierendenantrag_statustyp_kurzbz)
);
GRANT SELECT, INSERT ON campus.tbl_studierendenantrag_statustyp TO vilesci;
@@ -62,6 +63,22 @@ if($result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_statust
}
}
+if($result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_statustyp WHERE studierendenantrag_statustyp_kurzbz = 'Pause' "))
+{
+ if($db->db_num_rows($result) == 0)
+ {
+ $qry = "INSERT INTO campus.tbl_studierendenantrag_statustyp
+ (studierendenantrag_statustyp_kurzbz, bezeichnung)
+ VALUES
+ ('Pause', '{\"Pausiert\",\"Paused\"}');
+ ";
+ if (!$db->db_query($qry))
+ echo 'campus.tbl_studierendenantrag_statustyp (insert): '.$db->db_last_error().' ';
+ else
+ echo ' campus.tbl_studierendenantrag_statustyp: "Pause" added';
+ }
+}
+
if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag LIMIT 1"))
{
$qry = "CREATE TABLE campus.tbl_studierendenantrag (
@@ -82,7 +99,9 @@ if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag LIMIT
NO MAXVALUE
NO MINVALUE
CACHE 1;
- ALTER TABLE campus.tbl_studierendenantrag ALTER COLUMN studierendenantrag_id SET DEFAULT nextval('campus.tbl_studierendenantrag_studierendenantrag_id_seq');
+ ALTER TABLE campus.tbl_studierendenantrag
+ ALTER COLUMN studierendenantrag_id
+ SET DEFAULT nextval('campus.tbl_studierendenantrag_studierendenantrag_id_seq');
GRANT SELECT, INSERT ON campus.tbl_studierendenantrag TO vilesci;
GRANT SELECT, INSERT ON campus.tbl_studierendenantrag TO web;
@@ -104,16 +123,27 @@ if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_status
insertamum TIMESTAMP DEFAULT NOW(),
insertvon VARCHAR(32) NOT NULL,
grund TEXT NULL,
- CONSTRAINT tbl_studierendenantrag_status_pk PRIMARY KEY(studierendenantrag_status_id),
- CONSTRAINT tbl_studierendenantrag_fk FOREIGN KEY (studierendenantrag_id) REFERENCES campus.tbl_studierendenantrag(studierendenantrag_id) ON UPDATE CASCADE ON DELETE RESTRICT,
- CONSTRAINT tbl_studierendenantrag_statustyp_fk FOREIGN KEY (studierendenantrag_statustyp_kurzbz) REFERENCES campus.tbl_studierendenantrag_statustyp(studierendenantrag_statustyp_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT
+ CONSTRAINT tbl_studierendenantrag_status_pk
+ PRIMARY KEY(studierendenantrag_status_id),
+ CONSTRAINT tbl_studierendenantrag_fk
+ FOREIGN KEY (studierendenantrag_id)
+ REFERENCES campus.tbl_studierendenantrag(studierendenantrag_id)
+ ON UPDATE CASCADE
+ ON DELETE RESTRICT,
+ CONSTRAINT tbl_studierendenantrag_statustyp_fk
+ FOREIGN KEY (studierendenantrag_statustyp_kurzbz)
+ REFERENCES campus.tbl_studierendenantrag_statustyp(studierendenantrag_statustyp_kurzbz)
+ ON UPDATE CASCADE
+ ON DELETE RESTRICT
);
CREATE SEQUENCE campus.tbl_studierendenantrag_status_studierendenantrag_status_id_seq
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;
- ALTER TABLE campus.tbl_studierendenantrag_status ALTER COLUMN studierendenantrag_status_id SET DEFAULT nextval('campus.tbl_studierendenantrag_status_studierendenantrag_status_id_seq');
+ ALTER TABLE campus.tbl_studierendenantrag_status
+ ALTER COLUMN studierendenantrag_status_id
+ SET DEFAULT nextval('campus.tbl_studierendenantrag_status_studierendenantrag_status_id_seq');
GRANT SELECT, INSERT, DELETE ON campus.tbl_studierendenantrag_status TO vilesci;
GRANT SELECT, INSERT, DELETE ON campus.tbl_studierendenantrag_status TO web;
@@ -137,17 +167,32 @@ if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_lehrve
anmerkung TEXT NULL,
insertamum TIMESTAMP DEFAULT NOW(),
insertvon VARCHAR(32) NOT NULL,
- CONSTRAINT tbl_studierendenantrag_lehrveranstaltung_pk PRIMARY KEY(studierendenantrag_lehrveranstaltung_id),
- CONSTRAINT tbl_studiensemester_fk FOREIGN KEY (studiensemester_kurzbz) REFERENCES public.tbl_studiensemester(studiensemester_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT,
- CONSTRAINT tbl_note_fk FOREIGN KEY (note) REFERENCES lehre.tbl_note(note) ON UPDATE CASCADE ON DELETE RESTRICT,
- CONSTRAINT tbl_studierendenantrag_fk FOREIGN KEY (studierendenantrag_id) REFERENCES campus.tbl_studierendenantrag(studierendenantrag_id) ON UPDATE CASCADE ON DELETE RESTRICT
+ CONSTRAINT tbl_studierendenantrag_lehrveranstaltung_pk
+ PRIMARY KEY(studierendenantrag_lehrveranstaltung_id),
+ CONSTRAINT tbl_studiensemester_fk
+ FOREIGN KEY (studiensemester_kurzbz)
+ REFERENCES public.tbl_studiensemester(studiensemester_kurzbz)
+ ON UPDATE CASCADE
+ ON DELETE RESTRICT,
+ CONSTRAINT tbl_note_fk
+ FOREIGN KEY (note)
+ REFERENCES lehre.tbl_note(note)
+ ON UPDATE CASCADE
+ ON DELETE RESTRICT,
+ CONSTRAINT tbl_studierendenantrag_fk
+ FOREIGN KEY (studierendenantrag_id)
+ REFERENCES campus.tbl_studierendenantrag(studierendenantrag_id)
+ ON UPDATE CASCADE
+ ON DELETE RESTRICT
);
CREATE SEQUENCE campus.tbl_studierendenantrag_lehrveranstaltung_studierendenantrag_lehrveranstaltung_id_seq
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;
- ALTER TABLE campus.tbl_studierendenantrag_lehrveranstaltung ALTER COLUMN studierendenantrag_lehrveranstaltung_id SET DEFAULT nextval('campus.tbl_studierendenantrag_lehrveranstaltung_studierendenantrag_lehrveranstaltung_id_seq');
+ ALTER TABLE campus.tbl_studierendenantrag_lehrveranstaltung
+ ALTER COLUMN studierendenantrag_lehrveranstaltung_id
+ SET DEFAULT nextval('campus.tbl_studierendenantrag_lehrveranstaltung_studierendenantrag_lehrveranstaltung_id_seq');
GRANT SELECT, INSERT, DELETE ON campus.tbl_studierendenantrag_lehrveranstaltung TO vilesci;
GRANT SELECT, INSERT ON campus.tbl_studierendenantrag_lehrveranstaltung TO web;
@@ -164,7 +209,8 @@ if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berecht
{
if($db->db_num_rows($result) == 0)
{
- $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('student/studierendenantrag', 'Berechtigung für Bearbeiten Studierendenanträge');";
+ $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung)
+ VALUES ('student/studierendenantrag', 'Berechtigung für Bearbeiten Studierendenanträge');";
if(!$db->db_query($qry))
echo 'system.tbl_berechtigung '.$db->db_last_error().' ';
@@ -177,7 +223,8 @@ if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berecht
{
if($db->db_num_rows($result) == 0)
{
- $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('student/antragfreigabe', 'Berechtigung für Freigabe der Studierendenanträge');";
+ $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung)
+ VALUES ('student/antragfreigabe', 'Berechtigung für Freigabe der Studierendenanträge');";
if(!$db->db_query($qry))
echo 'system.tbl_berechtigung '.$db->db_last_error().' ';
@@ -375,7 +422,8 @@ if($result = @$db->db_query("SELECT 1 FROM public.tbl_status_grund WHERE statusg
{
if($db->db_num_rows($result) == 0)
{
- $qry = "INSERT INTO public.tbl_status_grund(statusgrund_kurzbz, status_kurzbz, aktiv, beschreibung, bezeichnung_mehrsprachig) VALUES('abbrecherStgl', 'Abbrecher', TRUE, '{\"durch Stgl\", \"by Course Director\"}', '{\"durch Stgl\", \"by Course Director\"}');";
+ $qry = "INSERT INTO public.tbl_status_grund(statusgrund_kurzbz, status_kurzbz, aktiv, beschreibung, bezeichnung_mehrsprachig)
+ VALUES ('abbrecherStgl', 'Abbrecher', TRUE, '{\"durch Stgl\", \"by Course Director\"}', '{\"durch Stgl\", \"by Course Director\"}');";
if(!$db->db_query($qry))
echo 'public.tbl_status_grund '.$db->db_last_error().' ';
@@ -388,7 +436,8 @@ if($result = @$db->db_query("SELECT 1 FROM public.tbl_status_grund WHERE statusg
{
if($db->db_num_rows($result) == 0)
{
- $qry = "INSERT INTO public.tbl_status_grund(statusgrund_kurzbz, status_kurzbz, aktiv, beschreibung, bezeichnung_mehrsprachig) VALUES('abbrecherStud', 'Abbrecher', TRUE, '{\"durch Stud\", \"by Student\"}', '{\"durch Stud\", \"by Student\"}');";
+ $qry = "INSERT INTO public.tbl_status_grund(statusgrund_kurzbz, status_kurzbz, aktiv, beschreibung, bezeichnung_mehrsprachig)
+ VALUES ('abbrecherStud', 'Abbrecher', TRUE, '{\"durch Stud\", \"by Student\"}', '{\"durch Stud\", \"by Student\"}');";
if(!$db->db_query($qry))
echo 'public.tbl_status_grund '.$db->db_last_error().' ';
@@ -401,7 +450,8 @@ if($result = @$db->db_query("SELECT 1 FROM public.tbl_status_grund WHERE statusg
{
if($db->db_num_rows($result) == 0)
{
- $qry = "INSERT INTO public.tbl_status_grund(statusgrund_kurzbz, status_kurzbz, aktiv, beschreibung, bezeichnung_mehrsprachig) VALUES('preabbrecher', 'Student', TRUE, '{\"Pre-Abbrecher\", \"Pre-Aborted\"}', '{\"Pre-Abbrecher\", \"Pre-Aborted\"}');";
+ $qry = "INSERT INTO public.tbl_status_grund(statusgrund_kurzbz, status_kurzbz, aktiv, beschreibung, bezeichnung_mehrsprachig)
+ VALUES ('preabbrecher', 'Student', TRUE, '{\"Pre-Abbrecher\", \"Pre-Aborted\"}', '{\"Pre-Abbrecher\", \"Pre-Aborted\"}');";
if(!$db->db_query($qry))
echo 'public.tbl_status_grund '.$db->db_last_error().' ';
diff --git a/system/dbupdate_3.4/34543_ux_template.php b/system/dbupdate_3.4/34543_ux_template.php
new file mode 100644
index 000000000..d502d8998
--- /dev/null
+++ b/system/dbupdate_3.4/34543_ux_template.php
@@ -0,0 +1,16 @@
+db_query("SELECT 1 FROM system.tbl_app WHERE app='fhctemplate'"))
+{
+ if($db->db_num_rows($result) === 0)
+ {
+ $qry = "INSERT INTO system.tbl_app (app) VALUES('fhctemplate');";
+
+ if(!$db->db_query($qry))
+ echo 'System Tabelle app: '.$db->db_last_error().' ';
+ else
+ echo ' app fhctemplate hinzugefuegt';
+ }
+}
diff --git a/system/dbupdate_3.4/36275_zeitaufzeichnung_karenz.php b/system/dbupdate_3.4/36275_zeitaufzeichnung_karenz.php
new file mode 100644
index 000000000..ecdbe31f5
--- /dev/null
+++ b/system/dbupdate_3.4/36275_zeitaufzeichnung_karenz.php
@@ -0,0 +1,16 @@
+db_query("SELECT * FROM information_schema.role_table_grants WHERE table_name='tbl_vertragsbestandteil_funktion' AND table_schema='hr' AND grantee='web' AND privilege_type='SELECT'"))
+{
+ if ($db->db_num_rows($result) == 0)
+ {
+ $qry = "GRANT SELECT ON hr.tbl_vertragsbestandteil_funktion TO web;";
+
+ if (! $db->db_query($qry))
+ echo 'Vertragsbestandteil Funktion Rechte: ' . $db->db_last_error() . ' ';
+ else
+ echo 'Leserechte für Web User auf vertragsbetandteil_funktion hinzugefuegt';
+ }
+}
diff --git a/system/dbupdate_3.4/36530_bis_internationsalisierung_codextabelle_neuerungen.php b/system/dbupdate_3.4/36530_bis_internationsalisierung_codextabelle_neuerungen.php
new file mode 100644
index 000000000..1545187d6
--- /dev/null
+++ b/system/dbupdate_3.4/36530_bis_internationsalisierung_codextabelle_neuerungen.php
@@ -0,0 +1,30 @@
+db_query("SELECT 1 FROM bis.tbl_mobilitaetsprogramm WHERE mobilitaetsprogramm_code IN (43, 44, 45, 46, 47, 48, 49, 50, 51, 52)"))
+{
+ if($db->db_num_rows($result) < 10)
+ {
+ $qry = "
+ INSERT INTO bis.tbl_mobilitaetsprogramm(mobilitaetsprogramm_code, kurzbz, beschreibung, sichtbar, sichtbar_outgoing) VALUES
+ (43, 'AMinKunst', 'Auslandsstipendium des Bundesministeriums für Kunst', TRUE, TRUE),
+ (44, 'BundeslandProg', 'Bundesland-Programm', TRUE, TRUE),
+ (45, 'ERASMUSSMS', 'ERASMUS+ (SMS) - Studienaufenthalte', TRUE, TRUE),
+ (46, 'ERASMUSSMT', 'ERASMUS+ (SMT) - Studierendenpraktika', TRUE, TRUE),
+ (47, 'ERASMUSMundus', 'Erasmus Mundus Joint Master Degrees / Erasmus Mundus Joint Master', FALSE, FALSE),
+ (48, 'EUGrad', 'Mobilitätsprogramm für Graduierte im EU-Bereich', TRUE, TRUE),
+ (49, 'ÖStiftung', 'Stipendienstiftung der Republik Österreich', TRUE, FALSE),
+ (50, 'ÖAkadWiss', 'Stipendienabkommen der Österreichischen Akademie der Wissenschaften', TRUE, TRUE),
+ (51, 'FondWissForsch', 'Stipendium des Fonds zur Förderung der wissenschaftlichen Forschung', TRUE, TRUE),
+ (52, 'SEMP', 'Swiss-European Mobility Programme (SEMP)', TRUE, TRUE)
+ ON CONFLICT (mobilitaetsprogramm_code) DO NOTHING;
+ ";
+
+ if(!$db->db_query($qry))
+ echo 'bis.tbl_mobilitaetsprogramm: '.$db->db_last_error().' ';
+ else
+ echo ' bis.tbl_mobilitaetsprogramm: Mobilitätsprogramme hinzugefuegt ';
+ }
+}
diff --git a/system/filtersupdate.php b/system/filtersupdate.php
index a70617592..a65c510eb 100644
--- a/system/filtersupdate.php
+++ b/system/filtersupdate.php
@@ -378,7 +378,8 @@ $filters = array(
{"name" : "FoerderfallId"},
{"name" : "LeistungsdatenId"},
{"name" : "startjahr"},
- {"name" : "endjahr"}
+ {"name" : "endjahr"},
+ {"name" : "Uebermittelt"}
],
"filters": []
}
@@ -1280,24 +1281,25 @@ $filters = array(
'oe_kurzbz' => null,
),
array(
- 'app' => 'core',
- 'dataset_name' => 'anrechnungTableData',
- 'filter_kurzbz' => 'AnrechnungTable',
- 'description' => '{Alle Anrechnungen}',
+ 'app' => 'fhctemplate',
+ 'dataset_name' => 'exampledata',
+ 'filter_kurzbz' => 'exampledata',
+ 'description' => '{Beispieldaten Filter}',
'sort' => 1,
'default_filter' => true,
'filter' => '
{
- "name": "AnrechnungTable",
+ "name": "Alle Beispieldaten",
"columns": [
- {"name": "studiengang_kz"},
- {"name": "stg_bezeichnung"},
- {"name": "studiensemester_kurzbz"},
- {"name": "student"},
- {"name": "lv_bezeichnung"},
+ {"name": "uid"},
+ {"name": "stringval"},
+ {"name": "integerval"},
+ {"name": "dateval"},
+ {"name": "booleanval"},
+ {"name": "moneyval"},
{"name": "dokument_bezeichnung"},
- {"name": "anmerkung_student"},
- {"name": "status_kurzbz"}
+ {"name": "textval"},
+ {"name": "examplestatus_kurzbz"}
],
"filters": []
}
diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php
index 7c176ffa4..1144eed90 100644
--- a/system/phrasesupdate.php
+++ b/system/phrasesupdate.php
@@ -4408,7 +4408,7 @@ When on hold, the date is only a reminder.',
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'Procedure and terms of payment',
'description' => '',
'insertvon' => 'system'
)
@@ -4424,7 +4424,7 @@ When on hold, the date is only a reminder.',
'sprache' => 'German',
'text' => 'Wir möchten Sie darauf aufmerksam machen, dass bei der Überweisung *immer* die Rechnungsnummer als Zahlungsreferenz anzuführen ist.
Andernfalls erfolgt keine automatische Zahlungszuordnung und es kann zu einer Verzögerung der Darstellung des aktuellen Zahlungsstatus
- der Rechnung im CIS kommen.
+ der Rechnung im Campus Informations-System kommen.
Im Falle dass der Betrag an ein falsches Konto überwiesen wurde, bitten wir Sie höflichst sich an Ihre Bank zu wenden.
@@ -4438,7 +4438,16 @@ When on hold, the date is only a reminder.',
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'We would like to draw your attention to the fact that the invoice number must *always* be quoted as the payment reference when making a bank transfer.
+ Otherwise, no automatic payment allocation will take place and there may be a delay in displaying the current payment status of the invoice in Campus Informations-System.
+
+
+ In the event that the amount has been transferred to an incorrect account, we kindly ask you to contact your bank.
+
+
+ Each invoice is considered "paid" when the total amount has been credited to our account in full.
+
+ ',
'description' => '',
'insertvon' => 'system'
)
@@ -4458,7 +4467,7 @@ When on hold, the date is only a reminder.',
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'FHTW account information',
'description' => '',
'insertvon' => 'system'
)
@@ -4478,7 +4487,7 @@ When on hold, the date is only a reminder.',
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'All payments must be made to the following account number and the invoice number must be entered as the payment reference.',
'description' => '',
'insertvon' => 'system'
)
@@ -4502,7 +4511,11 @@ When on hold, the date is only a reminder.',
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'Foreign bank transfers:
+
+ In the case of foreign bank transfers, the charges are to be paid by
+
+ the payer in addition to the invoice amounts.',
'description' => '',
'insertvon' => 'system'
)
@@ -4522,7 +4535,7 @@ When on hold, the date is only a reminder.',
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'Invoices & payment confirmations',
'description' => '',
'insertvon' => 'system'
)
@@ -4543,7 +4556,7 @@ When on hold, the date is only a reminder.',
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'Why is the deposit still outstanding despite payment?',
'description' => '',
'insertvon' => 'system'
)
@@ -4565,7 +4578,9 @@ Die Transaktion und die Bearbeitung der Zahlung, kann bis zu sechs Werktage daue
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'The most common reason for this is that the invoice number is not entered as the payment reference in the bank transfer.
+In this case, we kindly ask you to send an e-mail to billing@technikum-wien.at with a payment confirmation.
+The transaction and processing of the payment can take up to six working days.',
'description' => '',
'insertvon' => 'system'
)
@@ -4585,7 +4600,7 @@ Die Transaktion und die Bearbeitung der Zahlung, kann bis zu sechs Werktage daue
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'I have not received an invoice, what should I do?',
'description' => '',
'insertvon' => 'system'
)
@@ -4606,7 +4621,8 @@ Die Rechnung wird Ihnen erneut zugesendet. Erst nach Erhalt der Rechn
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'In this case, please check your spam folder. If the invoice has not been sent, please inform us at billing@technikum-wien.at .
+The invoice will be sent to you again. The amount is only to be transferred after receipt of the invoice! ',
'description' => '',
'insertvon' => 'system'
)
@@ -4626,7 +4642,7 @@ Die Rechnung wird Ihnen erneut zugesendet. Erst nach Erhalt der Rechn
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'Refund of the tuition fee',
'description' => '',
'insertvon' => 'system'
)
@@ -4652,7 +4668,13 @@ Die Rechnung wird Ihnen erneut zugesendet. Erst nach Erhalt der Rechn
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'The tuition fee will not be refunded if...
+-Freshmen who do not take up their study place after the start of the semester (September 1 / February 16)
+-Students who discontinue their studies after the start of the semester (September 1 / February 16).
+
+-Interruption before 15.10. or 15.3.: tuition fees will be refunded
+-Interruption after 15.10. or 15.3.: Tuition fee will not be refunded
+-No tuition fees are payable in the semesters following the interruption; however, the ÖH fee must be paid in each semester of the interruption',
'description' => '',
'insertvon' => 'system'
)
@@ -4672,7 +4694,7 @@ Die Rechnung wird Ihnen erneut zugesendet. Erst nach Erhalt der Rechn
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'You are exempt from paying tuition fees and have received an invoice for tuition fees?',
'description' => '',
'insertvon' => 'system'
)
@@ -4692,7 +4714,7 @@ Die Rechnung wird Ihnen erneut zugesendet. Erst nach Erhalt der Rechn
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'Please contact your degree program assistant. The outstanding invoice will be canceled.',
'description' => '',
'insertvon' => 'system'
)
@@ -4712,7 +4734,7 @@ Die Rechnung wird Ihnen erneut zugesendet. Erst nach Erhalt der Rechn
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'I made a mistake with the transfer, what should I do?',
'description' => '',
'insertvon' => 'system'
)
@@ -4732,7 +4754,7 @@ Die Rechnung wird Ihnen erneut zugesendet. Erst nach Erhalt der Rechn
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'Please report the error to billing@technikum-wien.at .',
'description' => '',
'insertvon' => 'system'
)
@@ -4752,7 +4774,7 @@ Die Rechnung wird Ihnen erneut zugesendet. Erst nach Erhalt der Rechn
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'An invoice has been transferred twice, what should I do?',
'description' => '',
'insertvon' => 'system'
)
@@ -4772,7 +4794,7 @@ Die Rechnung wird Ihnen erneut zugesendet. Erst nach Erhalt der Rechn
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'If an invoice has been transferred twice, please report this to billing@technikum-wien.at . We will refund you one payment.',
'description' => '',
'insertvon' => 'system'
)
@@ -4792,7 +4814,7 @@ Die Rechnung wird Ihnen erneut zugesendet. Erst nach Erhalt der Rechn
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'There are several items on the invoice - should a transfer be made for each item?',
'description' => '',
'insertvon' => 'system'
)
@@ -4812,7 +4834,7 @@ Die Rechnung wird Ihnen erneut zugesendet. Erst nach Erhalt der Rechn
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'No, the total amount shown on the invoice must always be transferred.',
'description' => '',
'insertvon' => 'system'
)
@@ -4832,7 +4854,7 @@ Die Rechnung wird Ihnen erneut zugesendet. Erst nach Erhalt der Rechn
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'When can the amount be transferred?',
'description' => '',
'insertvon' => 'system'
)
@@ -4852,13 +4874,32 @@ Die Rechnung wird Ihnen erneut zugesendet. Erst nach Erhalt der Rechn
),
array(
'sprache' => 'English',
- 'text' => '',
+ 'text' => 'We would like to point out that bank transfers should only be made on receipt of the invoice. Please state the invoice number as the payment reference.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'infocenter',
+ 'category' => 'infocenter',
+ 'phrase' => 'zahlungsempfaenger',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Fachhochschule Technikum Wien',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'University of Applied Sciences Technikum Wien',
'description' => '',
'insertvon' => 'system'
)
)
),
-
array(
'app' => 'core',
'category' => 'password',
@@ -10821,6 +10862,7 @@ Any unusual occurrences
'app' => 'projektarbeitsbeurteilung',
'category' => 'projektarbeitsbeurteilung',
'phrase' => 'kommissionellePruefungHinweis',
+ 'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
@@ -20487,6 +20529,46 @@ array(
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'studierendenantrag',
+ 'phrase' => 'btn_pause',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Pausieren',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Pause',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'studierendenantrag',
+ 'phrase' => 'btn_unpause',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Fortsetzen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Resume',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'core',
'category' => 'studierendenantrag',
@@ -21288,6 +21370,46 @@ array(
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'studierendenantrag',
+ 'phrase' => 'status_unpaused',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Fortgesetzt',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Resumed',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'studierendenantrag',
+ 'phrase' => 'status_stop',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Gestoppt',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Stopped',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'core',
'category' => 'studierendenantrag',
@@ -21488,6 +21610,26 @@ array(
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'studierendenantrag',
+ 'phrase' => 'error_no_antragstatus',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Kein Status für Bekanntgabe #{id} gefunden',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'No status found announcement #{id}',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'core',
'category' => 'studierendenantrag',
@@ -21708,6 +21850,46 @@ array(
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'studierendenantrag',
+ 'phrase' => 'error_not_pausable',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Bekanntgabe mit Id {id} kann nicht pausiert werden',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Announcement with Id {id} cannot be not paused',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'studierendenantrag',
+ 'phrase' => 'error_not_paused',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Bekanntgabe mit Id {id} ist nicht pausiert',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Announcement with Id {id} is not paused',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'core',
'category' => 'studierendenantrag',
@@ -22652,6 +22834,7 @@ array(
'app' => 'core',
'category' => 'studierendenantrag',
'phrase' => 'dropdown_bitteWaehlen',
+ 'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
@@ -22667,6 +22850,26 @@ array(
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'studierendenantrag',
+ 'phrase' => 'grund_Wiederholung_deadline',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'negative kommissionelle Beurteilung und keine fristgerechte Bekanntgabe der Wiederholung des Studienjahres',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'negative assessment by the committee and no timely announcement of the repetition of the academic year',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
// Personalverwaltung begin
array(
'app' => 'core',
@@ -24156,6 +24359,26 @@ array(
)
)
),
+ array(
+ 'app' => 'lehrauftrag',
+ 'category' => 'ui',
+ 'phrase' => 'hinweistextLehrauftrag',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Hinweis: Das Akzeptieren von Lehraufträgen ersetzt alle vorhergehenden Lehraufträge dieses Studiensemesters.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Note: Accepting teaching assignments replaces all previous teaching assignments for this study semester.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'core',
'category' => 'global',
@@ -24195,6 +24418,186 @@ array(
'insertvon' => 'system'
)
)
+ ),
+ array(
+ 'app' => 'fhctemplate',
+ 'category' => 'global',
+ 'phrase' => 'datensatz',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Datensatz',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Dataset',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'fhctemplate',
+ 'category' => 'global',
+ 'phrase' => 'datensatzGenehmigen',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Datensatz genehmigen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Approve dataset',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'fhctemplate',
+ 'category' => 'global',
+ 'phrase' => 'datensatzAblehnen',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Datensatz ablehnen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Reject dataset',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'fhctemplate',
+ 'category' => 'global',
+ 'phrase' => 'datensatzAnlegen',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Datensatz anlegen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Add dataset',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'fhctemplate',
+ 'category' => 'global',
+ 'phrase' => 'datensatzBearbeiten',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Datensatz bearbeiten',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Edit dataset',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'global',
+ 'phrase' => 'alleGenehmigt',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Alle genehmigt',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'All accepted',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'global',
+ 'phrase' => 'alleAbgelehnt',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Alle abgelehnt',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'All rejected',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'global',
+ 'phrase' => 'dokument',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Dokument',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Document',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'global',
+ 'phrase' => 'aktionen',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Aktionen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Actions',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
)
);
diff --git a/system/vorlage_zip/AntragWiederholung.odt b/system/vorlage_zip/AntragWiederholung.odt
new file mode 100644
index 000000000..2e11ca60a
Binary files /dev/null and b/system/vorlage_zip/AntragWiederholung.odt differ
diff --git a/system/xsl/AntragWiederholung.xsl b/system/xsl/AntragWiederholung.xsl
new file mode 100644
index 000000000..aa6a28073
--- /dev/null
+++ b/system/xsl/AntragWiederholung.xsl
@@ -0,0 +1,378 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Studiengang:
+
+
+
+
+
+ Organisationsform:
+
+
+
+
+
+
+
+ Abmeldung vom Studium durch Studiengang
+
+
+
+
+
+
+ Name der*des Studierenden
+
+
+
+
+
+
+
+
+
+
+ Personenkennzeichen
+
+
+
+
+
+
+
+
+
+ Studienjahr
+
+
+
+
+
+
+
+
+
+ Studiensemester
+
+
+
+
+
+
+
+
+
+ Semester
+
+
+
+
+
+
+
+
+
+ Grund der Abmeldung:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Wir weisen Sie darauf hin, dass Ihr FHTW Account noch 21 Tage aktiv ist. Wir bitten Sie, alle benötigte Dateien (Zeugnisse, Studienerfolgsbestätigungen, Studienbestätigungen, etc.) innerhalb dieses Zeitraums herunterzuladen. Für die Ausstellung von Duplikaten fallen nach Inaktivsetzung des CIS-Accounts Kosten an.
+
+
+ Sie sind gem. Ausbildungsvertrag verpflichtet, unverzüglich alle zur Verfügung gestellten Gerätschaften, Bücher, Schlüssel und sonstige Materialien zurückzugeben.
+
+ Bei Abmeldung vor dem 01.09. bzw. 15.02. und bereits eingezahltem Studienbeitrag für das kommende Semester: Wir informieren Sie darüber, dass der Studienbeitrag für das kommende Semester von Ihnen zurückgefordert werden kann. Bitte geben Sie uns dafür innerhalb von 14 Tagen Ihre Bankdaten an folgende E-Mail-Adresse bekannt: billing@technikum-wien.at.
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/vilesci/personen/zeitwunsch.php b/vilesci/personen/zeitwunsch.php
index 8e365fb68..520bb5e4d 100644
--- a/vilesci/personen/zeitwunsch.php
+++ b/vilesci/personen/zeitwunsch.php
@@ -56,7 +56,7 @@ $uid_benutzer = get_uid();
$rechte = new benutzerberechtigung();
$rechte->getBerechtigungen($uid_benutzer);
-if(!$rechte->isBerechtigt('mitarbeiter', null, 's'))
+if(!$rechte->isBerechtigt('mitarbeiter/zeitwuensche', null, 's'))
die($rechte->errormsg);
$datum_obj = new datum();
diff --git a/vilesci/stammdaten/auswertung_fhtw.php b/vilesci/stammdaten/auswertung_fhtw.php
index e52235fda..aa39889cb 100644
--- a/vilesci/stammdaten/auswertung_fhtw.php
+++ b/vilesci/stammdaten/auswertung_fhtw.php
@@ -1081,77 +1081,6 @@ if ($punkteUebertragen)
$msg_warning .= ' Der Prestudent '.$array['prestudent_id'].' hat bereits Gesamtpunkte eingetragen.';
}
}
-
- $zuBewerberMachen = filter_input(INPUT_POST, 'zuBewerberMachen', FILTER_VALIDATE_BOOLEAN);
- // Wenn zuBewerberMachen true ist, wird der Prestudent auch zum Bewerber gemacht
- if ($zuBewerberMachen)
- {
- $prestudent = new prestudent($array['prestudent_id']);
-
- // Checken, ob schon Bewerberstatus vorhanden ist
- if (!$prestudent->load_rolle($array['prestudent_id'], 'Bewerber', $prestudentrolle->studiensemester_kurzbz, $prestudentrolle->ausbildungssemester))
- {
- // Checken, ob Abgewiesener-Status vorhanden ist
- if (!$prestudent->load_rolle($array['prestudent_id'], 'Abgewiesener', $prestudentrolle->studiensemester_kurzbz, $prestudentrolle->ausbildungssemester))
- {
- // Um einen Bewerberstatus zu setzen, muss "reihungstestangetreten" true sein
- if ($prestudent->reihungstestangetreten == true)
- {
- // Um einen Bewerberstatus zu setzen, muss die ZGV ausgefüllt sein
- if ($prestudent->zgv_code != '')
- {
- $studiengang = new studiengang($prestudent->studiengang_kz);
- // Bei Mastern muss auch die ZGV-Master ausgefüllt sein
- if ($studiengang->typ == 'm' && $prestudent->zgvmas_code == '')
- {
- $msg_error .= ' Fehler beim speichern des Bewerberstatus für Prestudent '.$array['prestudent_id'].'. Es muss zuerst eine Master-ZGV eingetragen sein.';
- }
- else
- {
- $prestudent->new = true;
- $prestudent->prestudent_id = $array['prestudent_id'];
- $prestudent->status_kurzbz = 'Bewerber';
- $prestudent->studiensemester_kurzbz = $prestudentrolle->studiensemester_kurzbz;
- $prestudent->ausbildungssemester = $prestudentrolle->ausbildungssemester;
- $prestudent->datum = date('Y-m-d');
- $prestudent->insertamum = date('Y-m-d H:i:s');
- $prestudent->insertvon = $user;
- $prestudent->orgform_kurzbz = $prestudentrolle->orgform_kurzbz;
- $prestudent->bestaetigtam = '';
- $prestudent->bestaetigtvon = '';
- $prestudent->bewerbung_abgeschicktamum = '';
- $prestudent->studienplan_id = $prestudentrolle->studienplan_id;
-
- if (!$prestudent->save_rolle())
- {
- $msg_error .= ' Fehler beim speichern des Bewerberstatus für Prestudent '.$array['prestudent_id'].': '.$prestudent->errormsg;
- }
- else
- {
- $count_success_bewerber++;
- }
- }
- }
- else
- {
- $msg_error .= ' Fehler beim speichern des Bewerberstatus für Prestudent '.$array['prestudent_id'].'. Es muss zuerst eine ZGV eingetragen sein.';
- }
- }
- else
- {
- $msg_error .= ' Fehler beim speichern des Bewerberstatus für Prestudent '.$array['prestudent_id'].'. Zuerst muss "Reihungstestverfahren absolviert" gesetzt sein.';
- }
- }
- else
- {
- $msg_error .= ' Fehler beim speichern des Bewerberstatus für Prestudent '.$array['prestudent_id'].'. Es ist bereits ein Abgewiesener-Status vorhanden';
- }
- }
- else
- {
- $msg_warning .= ' Der Prestudent '.$array['prestudent_id'].' hat bereits einen Bewerberstatus';
- }
- }
}
}
@@ -2440,30 +2369,7 @@ else
{
$("#uebertragenOptions").toggle(300);
});
-
- if($("#uebertragenOptionGesamtpunkte").not(":checked"))
- {
- $("#div_checkbox_bewerber").addClass("disabled");
- $("#div_checkbox_bewerber").find("label").addClass("text-muted");
- $("#div_checkbox_bewerber").find("label").prop("title", "Erst \"Gesamtpunkte\" und \"Reihungsverfahren absolviert\" setzen");
- $("#uebertragenOptionBewerber").prop("disabled", true);
- }
- $("#uebertragenOptionGesamtpunkte").on("click", function(e)
- {
- if($(this).is(":checked"))
- {
- $("#div_checkbox_bewerber").removeClass("disabled");
- $("#div_checkbox_bewerber").find("label").removeClass("text-muted");
- $("#uebertragenOptionBewerber").prop("disabled", false);
- }
- else
- {
- $("#div_checkbox_bewerber").addClass("disabled");
- $("#div_checkbox_bewerber").find("label").addClass("text-muted");
- $("#div_checkbox_bewerber").find("label").prop("title", "Erst \"Gesamtpunkte\" und \"Reihungsverfahren absolviert\" setzen");
- $("#uebertragenOptionBewerber").prop("disabled", true);
- }
- });
+
});
function deleteResult(prestudent_id, gebiet_id, name, gebiet_bezeichnung)
@@ -2859,17 +2765,11 @@ else
{
var prestudentPunkteArr = [];
var gesamtpunkteSetzen = false;
- var zuBewerberMachen = false;
if ($("input.prestudentCheckbox:checked").length === 0)
{
alert("Bitte wählen Sie mindestens einen Eintrag aus der Liste");
return false;
}
- else if ($("#uebertragenOptionBewerber:checked").length === 1 && $("#uebertragenOptionGesamtpunkte:checked").length !== 1)
- {
- alert("Um den Bewerberstatus setzen zu können, muss \"Gesamtpunkte\" und \"Reihungsverfahren absolviert\" gesetzt sein");
- return false;
- }
else
{
$("input.prestudentCheckbox:checked").each(function()
@@ -2886,15 +2786,10 @@ else
{
gesamtpunkteSetzen = true;
}
- if ($("#uebertragenOptionBewerber:checked").length === 1)
- {
- zuBewerberMachen = true;
- }
data = {
prestudentPunkteArr: prestudentPunkteArr,
gesamtpunkteSetzen: gesamtpunkteSetzen,
- zuBewerberMachen: zuBewerberMachen,
punkteUebertragen: true
};
@@ -3246,8 +3141,9 @@ else
"Gesamtpunkte" und "Reihungsverfahren absolviert" setzen
+
- Zu Bewerber machen
+ Zu Bewerber machen
Jetzt übertragen
diff --git a/vilesci/stammdaten/benutzerberechtigung_details.php b/vilesci/stammdaten/benutzerberechtigung_details.php
index b230d702f..d1f88102d 100644
--- a/vilesci/stammdaten/benutzerberechtigung_details.php
+++ b/vilesci/stammdaten/benutzerberechtigung_details.php
@@ -38,6 +38,8 @@ require_once('../../include/benutzer.class.php');
require_once('../../include/funktion.class.php');
require_once('../../include/wawi_kostenstelle.class.php');
require_once('../../include/log.class.php');
+require_once('../../include/mitarbeiter.class.php');
+require_once('../../include/datum.class.php');
/*
* TODOs
@@ -60,6 +62,7 @@ BEschreibungstexte bestehender Rechte
*/
$user = get_uid();
+$datum = new datum();
$rechte = new benutzerberechtigung();
$rechte->getBerechtigungen($user);
@@ -68,7 +71,14 @@ if (!$db = new basis_db())
die('Fehler beim öffnen der Datenbankverbindung');
if(!$rechte->isBerechtigt('basis/berechtigung'))
- die('Sie haben keine Berechtigung fuer diese Seite');
+ die($rechte->errormsg);
+
+$mitarbeiter = new mitarbeiter($user);
+$userKuerzel = $user;
+if ($mitarbeiter->kurzbz != '')
+{
+ $userKuerzel = $mitarbeiter->kurzbz;
+}
//$reloadstr = ''; // neuladen der liste im oberen frame
$htmlstr = '';
@@ -104,7 +114,27 @@ if(isset($_POST['delete']) && $_POST['delete'] != '')
$ber = new benutzerberechtigung();
if(!$ber->delete($benutzerberechtigung_id))
+ {
$errorstr .= 'Datensatz konnte nicht gelöscht werden!';
+ }
+ else
+ {
+ //Log schreiben
+ $log = new log();
+
+ $logdata = var_export((array) $ber, true);
+ $log->new = true;
+ $log->sql = $logdata;
+ $log->sqlundo = 'Kein Undo vorhanden';
+ $log->executetime = date('Y-m-d H:i:s');
+ $log->mitarbeiter_uid = $user;
+ $log->beschreibung = 'Berechtigung gelöscht';
+
+ if(!$log->save())
+ {
+ $errorstr .= "Fehler beim schreiben des Log-Eintrags ";
+ }
+ }
//$reloadstr .= "";
+
+}
+
+if(isset($_POST['save_anmerkung_multi']) && $_POST['anmerkung_multi'] != '')
+{
+ if(!$rechte->isBerechtigt('basis/berechtigung', null, 'su'))
+ die($rechte->errormsg);
+
+ $anmerkungNeu = $_POST['anmerkung_multi'];
+
+ if (isset($_POST['dataset']))
+ {
+ $i = 0;
+ foreach ($_POST['dataset'] AS $benutzerberechtigung_id => $value)
+ {
+ // Nur markierte Einträge bearbeiten
+ if (!isset($value['check']))
+ {
+ continue;
+ }
+
+ $ber = new benutzerberechtigung();
+ if(!$ber->load($benutzerberechtigung_id))
+ {
+ die('Fehler beim Laden der Berechtigung');
+ }
+
+ // Bestehende Anmerkungen belassen und neue Ergänzen
+ if ($ber->anmerkung != '')
+ {
+ $ber->anmerkung = $ber->anmerkung.'; '.$anmerkungNeu;
+ }
+ else
+ {
+ $ber->anmerkung = $anmerkungNeu;
+ }
+
+ // Wenn Anmerkung länger als 256 Zeichen ist (DB-Beschränkung), String kürzen und Warnung ausgeben
+ if (strlen($ber->anmerkung) > 256)
+ {
+ $ber->anmerkung = cutString($ber->anmerkung, 256, '...');
+ $errorstr .= "Die Anmerkung bei der ID ".$benutzerberechtigung_id." übersteigt die maximale Länge von 256 Zeichen und wurde nicht vollständig gespeichert ";
+ }
+
+ $ber->updateamum = date('Y-m-d H:i:s');
+ $ber->updatevon = $user;
+
+ if(!$ber->save())
+ {
+ $errorstr .= "Die Anmerkung des Datensatzes mit der ID ".$benutzerberechtigung_id." konnte nicht gespeichert werden!".$ber->errormsg;
+ }
+ else
+ {
+ $i ++;
+ //Log schreiben
+ $log = new log();
+
+ $logdata = var_export((array) $ber, true);
+ $log->new = true;
+ $log->sql = $logdata;
+ $log->sqlundo = 'Kein Undo vorhanden';
+ $log->executetime = date('Y-m-d H:i:s');
+ $log->mitarbeiter_uid = $user;
+ $log->beschreibung = 'Anmerkung bearbeitet';
+
+ if(!$log->save())
+ {
+ $errorstr .= "Fehler beim schreiben des Log-Eintrags ";
+ }
+ }
+ }
+ if ($i > 0)
+ {
+ $successstr .= "Anmerkung bei ".$i." Einträgen erfolgreich gespeichert ";
+ }
+ }
+
+
+
//$reloadstr .= "";
@@ -424,6 +542,10 @@ if(isset($_POST['schick']))
}
}
}
+ if ($errorstr == '')
+ {
+ $successstr .= "Änderungen erfolgreich gespeichert ";
+ }
}
}
else
@@ -503,14 +625,16 @@ $oe = new organisationseinheit();
$oe->getAll();
foreach ($oe->result AS $row)
{
- $oe_arr[$row->oe_kurzbz] = $row->organisationseinheittyp_kurzbz.' '.$row->bezeichnung;
+ $oe_arr[$row->oe_kurzbz]['bezeichnung'] = $row->organisationseinheittyp_kurzbz.' '.$row->bezeichnung;
+ $oe_arr[$row->oe_kurzbz]['aktiv'] = $row->aktiv;
}
$kostenstelle = new wawi_kostenstelle();
$kostenstelle->getAll();
foreach ($kostenstelle->result AS $row)
{
- $kst_arr[$row->kostenstelle_id] = $row->bezeichnung;
+ $kst_arr[$row->kostenstelle_id]['bezeichnung'] = $row->bezeichnung;
+ $kst_arr[$row->kostenstelle_id]['aktiv'] = $row->aktiv;
}
if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz']))
@@ -536,23 +660,27 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz']))
$name = new benutzer();
$name->load($uid);
- $htmlstr .= "Berechtigungen von ".$name->nachname." ".$name->vorname." (".$uid.") ";
+ $htmlstr .= "Berechtigungen von ".$name->nachname." ".$name->vorname." (".$uid.") Zum CIS-Profil ";
+
$message = '';
$class = '';
+ $messageString = '';
if ($errorstr != '' || $successstr != '')
{
if ($successstr != '')
{
$class = 'class="alert alert-success"';
$message = $successstr;
+ $messageString .= ' '.$message.'
';
}
- elseif ($errorstr != '')
+ if ($errorstr != '')
{
$class = 'class="alert alert-danger"';
$message = $errorstr;
+ $messageString .= ' '.$message.'
';
}
}
- $htmlstr .= ' '.$message.'
';
+ $htmlstr .= ' '.$messageString.'
';
$i = 0;
@@ -643,8 +771,9 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz']))
";
$htmlstr .= "";
- $htmlstr .= "";
$htmlstr .= "
";
@@ -726,8 +855,8 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz']))
// Tabelle für bestehende Berechtigungen
////////////////
- $htmlstr .= "
";
- $htmlstr .= " ";
+ $countInaktiveUndWawi = 0;
foreach($rights->berechtigungen as $b)
{
switch($filter)
@@ -775,7 +905,6 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz']))
default: break;
}
- $htmlstr .= " ";
$heute = strtotime(date('Y-m-d'));
if ($b->ende!='' && strtotime($b->ende) < $heute)
{
@@ -798,6 +927,17 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz']))
$inaktiv_class = '';
$data = 'gruen';
}
+ // Inaktive Elemente sowie WaWi-Rechte ausblenden
+ if ($b->ende!='' && strtotime($b->ende) < $heute || $b->rolle_kurzbz == 'wawi' || substr($b->berechtigung_kurzbz, 0, 4) == 'wawi')
+ {
+ $htmlstr .= " ";
+ $countInaktiveUndWawi++;
+ }
+ else
+ {
+ $htmlstr .= " ";
+ }
+
// Auswahlcheckbox
$htmlstr .= " ";
$htmlstr .= " ".$titel." ";
@@ -862,9 +1002,10 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz']))
else
{
$htmlstr .= " ";
- $htmlstr .= " ".($b->oe_kurzbz != '' ? $oe_arr[$b->oe_kurzbz] : '')." ";
+ $htmlstr .= " ".($b->oe_kurzbz != '' ? $oe_arr[$b->oe_kurzbz]['bezeichnung'] : '')." ";
$htmlstr .= " ";
- $htmlstr .= " oe_kurzbz] : '')."'>";
+ $style = isset($oe_arr[$b->oe_kurzbz]) && $oe_arr[$b->oe_kurzbz]['aktiv'] == false? 'style="text-decoration: line-through"' : '';
+ $htmlstr .= " oe_kurzbz]['bezeichnung'] : '')."'>";
$htmlstr .= " ";
}
@@ -872,7 +1013,8 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz']))
$htmlstr .= " ";
$htmlstr .= " ".$b->kostenstelle_id." ";
$htmlstr .= " ";
- $htmlstr .= " kostenstelle_id] : '')."'>";
+ $style = isset($kst_arr[$b->kostenstelle_id]) && $kst_arr[$b->kostenstelle_id]['aktiv'] == false ? 'style="text-decoration: line-through"' : '';
+ $htmlstr .= " kostenstelle_id]['bezeichnung'] : '')."'>";
$htmlstr .= " ";
@@ -960,20 +1102,39 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz']))
$htmlstr .= " ";
}
$htmlstr .= " ";
+
+ //Button zum einblenden ausgeblendeter Zeilen
+ if ($countInaktiveUndWawi > 0)
+ {
+ $htmlstr .= "Inaktive und WaWi anzeigen ";
+ }
+
+ // Speichern und Aktions-Bereich
$htmlstr .= '
';
@@ -992,6 +1153,7 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz']))
+
@@ -1268,6 +1430,7 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz']))
/*border-right: 1px solid #999;*/
margin-left: auto;
display: block ruby;
+ border-top-left-radius: 4px;
}
#msgbox
{
@@ -1306,8 +1469,35 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz']))
{
background-color: #f3f3f3 !important;
}
+ .ausgeblendet
+ {
+ display: none;
+ }
+ /*.multi-options*/
+ /*{*/
+ /* display: none;*/
+ /*}*/
diff --git a/vilesci/stammdaten/benutzerberechtigung_uebersicht.php b/vilesci/stammdaten/benutzerberechtigung_uebersicht.php
index 0be268b70..381d3eaa8 100644
--- a/vilesci/stammdaten/benutzerberechtigung_uebersicht.php
+++ b/vilesci/stammdaten/benutzerberechtigung_uebersicht.php
@@ -29,17 +29,20 @@ require_once('../../include/benutzer.class.php');
require_once('../../include/berechtigung.class.php');
require_once ('../../include/organisationseinheit.class.php');
require_once ('../../include/benutzerfunktion.class.php');
+require_once ('../../include/funktion.class.php');
echo '
Berechtigungen Uebersicht
-
';
+
+
';
include('../../include/meta/jquery.php');
include('../../include/meta/jquery-tablesorter.php');
echo '
+
rolle_kurzbz = $rolle_kurzbz;
+ $berechtigung->berechtigung_kurzbz = $recht;
+ $berechtigung->art = $art;
+ $berechtigung->insertamum = date('Y-m-d H:i:s');
+ $berechtigung->insertvon = $user;
+
+ if($berechtigung->saveRolleBerechtigung())
+ {
+ echo json_encode(array(
+ 'status' => 'ok',
+ 'msg' => ''
+ ));
+ exit();
+ }
+ else
+ {
+ echo json_encode(array(
+ 'status' => 'error',
+ 'msg' => 'Fehler beim Speichern der Rolle'
+ ));
+ exit();
+ }
+ }
+
if(isset($rolle_kurzbz))
{
echo '
Berechtigungen der Rolle "'.$rolle_kurzbz.'" ';
@@ -335,35 +458,46 @@ $vergleich = filter_input(INPUT_GET, 'vergleich');
Kurzbz
Art
+
';
foreach ($rollenGesamt AS $recht => $art)
{
- if (array_key_exists($recht, $rollen1Arr))
+ if (array_key_exists($recht, $rollen1Arr) || !array_key_exists($recht, $rollen2Arr))
{
if ($art != $rollen1Arr[$recht])
{
- echo '
- '.$recht.'
- '.$rollen1Arr[$recht].'
+ echo '
+ '.$recht.'
+ '.$rollen1Arr[$recht].'
+ ->
+ ';
+ }
+ elseif (!array_key_exists($recht, $rollen2Arr))
+ {
+ echo '
+ '.$recht.'
+ '.$art.'
+ ->
';
}
else
{
- echo '
- '.$recht.'
- '.$art.'
+ echo '
+ '.$recht.'
+ '.$art.'
+
';
}
-
}
else
{
- echo '
-
-
+ echo '
+
+
+
';
}
}
@@ -395,6 +529,7 @@ $vergleich = filter_input(INPUT_GET, 'vergleich');
echo '
+
Kurzbz
Art
@@ -402,28 +537,39 @@ $vergleich = filter_input(INPUT_GET, 'vergleich');
';
foreach ($rollenGesamt AS $recht => $art)
{
- if (array_key_exists($recht, $rollen2Arr))
+ if (array_key_exists($recht, $rollen2Arr) || !array_key_exists($recht, $rollen1Arr))
{
if ($art != $rollen2Arr[$recht])
{
- echo '
- '.$recht.'
- '.$rollen2Arr[$recht].'
+ echo '
+ <-
+ '.$recht.'
+ '.$rollen2Arr[$recht].'
+ ';
+ }
+ elseif (!array_key_exists($recht, $rollen1Arr))
+ {
+ echo '
+ <-
+ '.$recht.'
+ '.$art.'
';
}
else
{
- echo '
- '.$recht.'
- '.$art.'
+ echo '
+
+ '.$recht.'
+ '.$art.'
';
}
}
else
{
- echo '
-
-
+ echo '
+
+
+
';
}
}
diff --git a/vilesci/stammdaten/personen_wartung.php b/vilesci/stammdaten/personen_wartung.php
index ee95854ed..d2b5c3446 100644
--- a/vilesci/stammdaten/personen_wartung.php
+++ b/vilesci/stammdaten/personen_wartung.php
@@ -229,7 +229,7 @@ if (isset($personToDelete) && isset($personToKeep) && $personToDelete >= 0 && $p
die('Es sind bereits beide Personen in SAP vorhanden. Bitte zuerst direkt in der tbl_sap_students lösen.');
}
}
-
+
$personToDelete_obj = new person();
if ($personToDelete_obj->load($personToDelete))
{
@@ -319,6 +319,199 @@ if (isset($personToDelete) && isset($personToKeep) && $personToDelete >= 0 && $p
}
}
}
+
+ if($result = @$db->db_query("SELECT 1 FROM public.tbl_kennzeichen LIMIT 1"))
+ {
+ $kennzeichen_has_personToKeep = array();
+ $kennzeichen_has_personToDelete = array();
+
+ $kennzeichen_query = "
+ SELECT *
+ FROM public.tbl_kennzeichen
+ WHERE (
+ person_id = " . $db->db_add_param($personToKeep, FHC_INTEGER) . " OR
+ person_id = " . $db->db_add_param($personToDelete, FHC_INTEGER) . "
+ )
+ ORDER BY kennzeichentyp_kurzbz, aktiv DESC";
+
+ if ($result = $db->db_query($kennzeichen_query))
+ {
+ while ($row = $db->db_fetch_object($result))
+ {
+ if ($row->person_id === $personToKeep)
+ {
+ $kennzeichen_has_personToKeep[] = $row;
+ }
+ else if ($row->person_id === $personToDelete)
+ {
+ $kennzeichen_has_personToDelete[] = $row;
+ }
+ }
+ }
+
+ if (!empty($kennzeichen_has_personToDelete))
+ {
+ foreach ($kennzeichen_has_personToDelete as $kennzeichen_toDelete)
+ {
+ $kennzeichen_toKeep_Kurzbz = array_column($kennzeichen_has_personToKeep, 'kennzeichentyp_kurzbz');
+
+ if (in_array($kennzeichen_toDelete->kennzeichentyp_kurzbz, $kennzeichen_toKeep_Kurzbz))
+ {
+ $kennzeichen_toKeep_Keys = array_keys($kennzeichen_toKeep_Kurzbz, $kennzeichen_toDelete->kennzeichentyp_kurzbz);
+
+ foreach ($kennzeichen_toKeep_Keys as $key)
+ {
+ if (($kennzeichen_has_personToKeep[$key]->aktiv === 't' && $kennzeichen_toDelete->aktiv === 'f') ||
+ ($kennzeichen_has_personToKeep[$key]->aktiv === 'f' && $kennzeichen_toDelete->aktiv === 't') ||
+ ($kennzeichen_has_personToKeep[$key]->aktiv === 'f' && $kennzeichen_toDelete->aktiv === 'f'))
+ {
+ if ($kennzeichen_has_personToKeep[$key]->inhalt !== $kennzeichen_toDelete->inhalt)
+ {
+ $sql_query_upd1 .= "UPDATE public.tbl_kennzeichen SET person_id=" . $db->db_add_param($personToKeep, FHC_INTEGER) . " WHERE kennzeichen_id=" . $db->db_add_param($kennzeichen_toDelete->kennzeichen_id, FHC_INTEGER) . ";";
+ $kennzeichen_has_personToKeep[] = $kennzeichen_toDelete;
+ continue 2;
+ }
+ else
+ {
+ if ($kennzeichen_toDelete->aktiv === 'f')
+ {
+ $sql_query_upd1 .= "DELETE FROM public.tbl_kennzeichen WHERE kennzeichen_id=" . $db->db_add_param($kennzeichen_toDelete->kennzeichen_id, FHC_INTEGER) . ";";
+ $msg_warning[] = "Das nicht aktive Kennzeichen mit der ID '" . $kennzeichen_toDelete->kennzeichen_id . "' wurde gelöscht,
+ da es der gleiche Inhalt wie beim Kennzeichen mit der ID '". $kennzeichen_has_personToKeep[$key]->kennzeichen_id ."' ist.";
+ continue 2;
+ }
+ $msg_error[] = 'Beide Personen haben ein Kennzeichen mit dem gleichen Typ ('. $kennzeichen_toDelete->kennzeichentyp_kurzbz.') und den gleichen Inhalt. Können nicht zusammengelegt werden.
+ Sie müssen die Datensätze manuell bereinigen, bevor Sie die Personen zusammenlegen können.';
+ $error = true;
+ break 2;
+ }
+ }
+ else if ($kennzeichen_has_personToKeep[$key]->aktiv === 't' && $kennzeichen_toDelete->aktiv === 't')
+ {
+ $msg_error[] = 'Beide Personen haben ein aktives Kennzeichen mit dem gleichen Typ ('. $kennzeichen_toDelete->kennzeichentyp_kurzbz.'). Können nicht zusammengelegt werden.
+ Sie müssen die Datensätze manuell bereinigen, bevor Sie die Personen zusammenlegen können.';
+ $error = true;
+ break 2;
+ }
+ }
+ }
+ else
+ {
+ $sql_query_upd1 .= "UPDATE public.tbl_kennzeichen SET person_id=" . $db->db_add_param($personToKeep, FHC_INTEGER) . " WHERE kennzeichen_id=" . $db->db_add_param($kennzeichen_toDelete->kennzeichen_id, FHC_INTEGER) . ";";
+ }
+ }
+ }
+ }
+
+ if($result = @$db->db_query("SELECT 1 FROM bis.tbl_uhstat1daten LIMIT 1"))
+ {
+ $uhstat_has_personToKeep = array();
+ $uhstat_has_personToDelete = array();
+
+ $uhstat_query = "
+ SELECT uhstat1daten_id, person_id
+ FROM bis.tbl_uhstat1daten
+ WHERE (
+ person_id = " . $db->db_add_param($personToKeep, FHC_INTEGER) . " OR
+ person_id = " . $db->db_add_param($personToDelete, FHC_INTEGER) . "
+ )
+ ORDER BY updateamum DESC NULLS LAST, insertamum DESC NULLS LAST";
+
+ // Herausfinden, ob UHSTAT Daten der löschenden oder zu belassenden Person zugeordnet sind
+ if ($result = $db->db_query($uhstat_query))
+ {
+ while ($row = $db->db_fetch_object($result))
+ {
+ if ($row->person_id === $personToKeep)
+ {
+ $uhstat_has_personToKeep[] = $row;
+ }
+ else if ($row->person_id === $personToDelete)
+ {
+ $uhstat_has_personToDelete[] = $row;
+ }
+ }
+ }
+
+ // wenn UHSTAT Daten an Person, die gelöscht werden soll, hängen
+ if (!empty($uhstat_has_personToDelete))
+ {
+ // Wenn es auch UHSTAT Daten für die Person, die bleibt, gibt
+ if (!empty($uhstat_has_personToKeep))
+ {
+ // Unklar: welche Version der Daten soll behalten werden?
+ $msg_error[] = 'Beide Personen haben UHSTAT1 Daten. Können nicht zusammengelegt werden.
+ Sie müssen die Datensätze manuell bereinigen, bevor Sie die Personen zusammenlegen können:
+ zum UHSTAT von Person A
+ /
+ zum UHSTAT von Person B
+ ';
+
+ $error = true;
+ }
+ else
+ {
+ // Es gibt nur UHSTAT Daten für die zu löschende Person: Update
+ foreach ($uhstat_has_personToDelete as $uhstat_toDelete)
+ {
+ $sql_query_upd1 .= "UPDATE bis.tbl_uhstat1daten SET person_id=" . $db->db_add_param($personToKeep, FHC_INTEGER) . " WHERE uhstat1daten_id=" . $db->db_add_param($uhstat_toDelete->uhstat1daten_id, FHC_INTEGER) . ";";
+ }
+ }
+ }
+ }
+
+ if($result = @$db->db_query("SELECT 1 FROM public.tbl_rueckstellung LIMIT 1"))
+ {
+ $rueckstellung_has_personToKeep = array();
+ $rueckstellung_has_personToDelete = array();
+
+ $rueckstellung_query = "
+ SELECT rueckstellung_id, person_id
+ FROM public.tbl_rueckstellung
+ WHERE (
+ person_id = " . $db->db_add_param($personToKeep, FHC_INTEGER) . " OR
+ person_id = " . $db->db_add_param($personToDelete, FHC_INTEGER) . "
+ )
+ ORDER BY insertamum DESC NULLS LAST";
+
+ // Herausfinden, ob Rueckstellung Daten der löschenden oder zu belassenden Person zugeordnet sind
+ if ($result = $db->db_query($rueckstellung_query))
+ {
+ while ($row = $db->db_fetch_object($result))
+ {
+ if ($row->person_id === $personToKeep)
+ {
+ $rueckstellung_has_personToKeep[] = $row;
+ }
+ else if ($row->person_id === $personToDelete)
+ {
+ $rueckstellung_has_personToDelete[] = $row;
+ }
+ }
+ }
+
+ // wenn Rueckstellung Daten an Person, die gelöscht werden soll, hängen
+ if (!empty($rueckstellung_has_personToDelete))
+ {
+ // Wenn es auch Rueckstellung Daten für die Person, die bleibt, gibt
+ if (!empty($rueckstellung_has_personToKeep))
+ {
+ // Unklar: welche Version der Daten soll behalten werden?
+ $msg_error[] = 'Beide Personen haben Rückstellung Daten. Können nicht zusammengelegt werden.
+ Sie müssen die Datensätze manuell bereinigen, bevor Sie die Personen zusammenlegen können.';
+ $error = true;
+ }
+ else
+ {
+ // Es gibt nur Rueckstellung Daten für die zu löschende Person: Update
+ foreach ($rueckstellung_has_personToDelete as $rueckstellung_toDelete)
+ {
+ $sql_query_upd1 .= "UPDATE public.tbl_rueckstellung SET person_id=" . $db->db_add_param($personToKeep, FHC_INTEGER) . " WHERE rueckstellung_id=" . $db->db_add_param($rueckstellung_toDelete->rueckstellung_id, FHC_INTEGER) . ";";
+ }
+ }
+ }
+ }
+
if ($error == false)
{
// Wenn bei einer der Personen das Foto gesperrt ist, dann die Sperre uebernehmen
@@ -437,7 +630,7 @@ if (isset($personToDelete) && isset($personToKeep) && $personToDelete >= 0 && $p
Alte Anmerkungen: ".$personToDelete_obj->anmerkungen;
$anmerkung .= "
-
+
Zusammengelegt mit Person-ID ".$personToDelete_obj->person_id." am ".date('d.m.Y H:i:s')." von ".$uid;
// Letztbenutzten Zugangscode abfragen und übernehmen
@@ -1335,7 +1528,7 @@ if ($filter != '' || ($person_id_1 != '' && $person_id_2 != ''))
$messageOutput .= ' '.$value;
}
}
- echo '' . $messageOutput . '
';
+ echo '' . $messageOutput . '
';
// Tabellen anzeigen
echo '