From 843ddad987785d5dcefcb0b8b538248b8fa561fa Mon Sep 17 00:00:00 2001
From: ma0068
Date: Fri, 23 Feb 2024 12:28:26 +0100
Subject: [PATCH] Statuschecks, Berechtigungen, add new Status
---
.../controllers/Studentenverwaltung.php | 4 +
.../controllers/components/stv/Status.php | 225 ++++++++++++-
application/models/crm/Prestudent_model.php | 81 +++--
.../models/crm/Prestudentstatus_model.php | 315 ++++++++++++++++++
application/models/crm/Student_model.php | 21 ++
.../js/components/Stv/Studentenverwaltung.js | 7 +-
.../Studentenverwaltung/Details/Prestudent.js | 32 +-
.../Details/Prestudent/Status.js | 176 ++++++++--
8 files changed, 802 insertions(+), 59 deletions(-)
diff --git a/application/controllers/Studentenverwaltung.php b/application/controllers/Studentenverwaltung.php
index 29a04e51d..bd8ef7aa9 100644
--- a/application/controllers/Studentenverwaltung.php
+++ b/application/controllers/Studentenverwaltung.php
@@ -23,6 +23,10 @@ class Studentenverwaltung extends FHC_Controller
'student/bpk' => $this->permissionlib->isBerechtigt('student/bpk'),
'student/alias' => $this->permissionlib->isBerechtigt('student/alias'),
'basis/prestudent' => $this->permissionlib->isBerechtigt('basis/prestudent'),
+ 'assistenz_stgs' => $this->permissionlib->getSTG_isEntitledFor('assistenz'),
+ 'admin' => $this->permissionlib->isBerechtigt('admin'),
+ 'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz','suid'),
+ 'student/keine_studdatuspruefung' => $this->permissionlib->isBerechtigt('student/keine_studdatuspruefung')
],
'variables' => [
diff --git a/application/controllers/components/stv/Status.php b/application/controllers/components/stv/Status.php
index fa0ea5a80..a4ad5fd62 100644
--- a/application/controllers/components/stv/Status.php
+++ b/application/controllers/components/stv/Status.php
@@ -13,6 +13,7 @@ class Status extends FHC_Controller
// Load Libraries
$this->load->library('AuthLib');
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
+ $this->load->library('PermissionLib');
// Load language phrases
/* $this->loadPhrases([
@@ -53,11 +54,42 @@ class Status extends FHC_Controller
return $this->outputJsonError($this->form_validation->error_array());
}*/
+ //check rights
+ //get Studiengang von prestudent_id
+ $this->load->model('crm/Prestudent_model', 'PrestudentModel');
+ $this->PrestudentModel->addJoin('public.tbl_person p', 'ON (p.person_id = public.tbl_prestudent.person_id)');
+ $result = $this->PrestudentModel->load([
+ 'prestudent_id'=> $prestudent_id,
+ ]);
+ if(isError($result))
+ {
+ $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
+ return $this->outputJson(getError($result));
+ }
+ $result = current(getData($result));
+
+ //Variablen für Statuscheck
+ $stg = $result->studiengang_kz;
+ $reihungstest_angetreten = $result->reihungstestangetreten;
+ $name = trim($result->vorname . " ". $result->nachname);
+ $zgv_code = $result->zgv_code;
+
+ //TODO(Manu) check: Annahme, dass hier immer suid bei Berechtigung STG vergeben wird!
+ $granted_Ass = $this->permissionlib->getSTG_isEntitledFor('assistenz');
+ $granted_Adm = $this->permissionlib->getSTG_isEntitledFor('admin');
+ $granted = array_merge($granted_Ass, $granted_Adm);
+
+ if(!in_array($stg, $granted)){
+ $result = "Sie haben keine Schreibrechte fuer diesen Studiengang!";
+ $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
+ return $this->outputJson($result);
+ }
+
$_POST = json_decode(utf8_encode($this->input->raw_input_stream), true);
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
//var_dump($_POST);
-
+ $uid = getAuthUID();
$status_kurzbz = $this->input->post('status_kurzbz');
$ausbildungssemester = $this->input->post('ausbildungssemester');
$datum = $this->input->post('datum');
@@ -65,7 +97,7 @@ class Status extends FHC_Controller
$bewerbung_abgeschicktamum = $this->input->post('bewerbung_abgeschicktamum');
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
$studienplan_id = $this->input->post('studienplan_id');
- $anmerkung = $this->input->post('anmerkung ');
+ $anmerkung = $this->input->post('anmerkung');
$statusgrund_id = $this->input->post('statusgrund_id');
$rt_stufe = $this->input->post('rt_stufe');
$bestaetigtvon = $this->input->post('bestaetigtvon');
@@ -73,6 +105,123 @@ class Status extends FHC_Controller
// Start DB transaction
//$this->db->trans_start(false);
+ //GET lastStatus
+ $result = $this->PrestudentstatusModel->getLastStatus($prestudent_id);
+
+ if (isError($result))
+ {
+ $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
+ return $this->outputJson(getError($result));
+ }
+ $lastStatusData = current(getData($result));
+ //var_dump($lastStatusData);
+
+ //Different handling depending on newStatus
+ if($status_kurzbz == 'Absolvent' || $status_kurzbz == 'Diplomand')
+ {
+ //$studiensemester = $semester_aktuell; //TODO(Manu) oder ist hier defaultsemester gemeint?
+ $ausbildungssemester = $lastStatusData->ausbildungssemester;
+ }
+
+ if($status_kurzbz != 'Student')
+ {
+ $ausbildungssemester = $lastStatusData->ausbildungssemester;
+ }
+
+ //check if Rolle already exists
+ $result = $this->PrestudentstatusModel->checkIfExistingPrestudentRolle($prestudent_id, $status_kurzbz, $studiensemester_kurzbz, $ausbildungssemester);
+ if (isError($result))
+ {
+ $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
+ return $this->outputJson(getError($result));
+ //return $this->outputJson("DEBUG: in Funktion checkIfExistingPrestudentRolle");
+ }
+
+ //Check ob Reihungstest berücksichtigt werden soll
+ if(REIHUNGSTEST_CHECK)
+ {
+ if($status_kurzbz=='Bewerber' && !$reihungstest_angetreten)
+ {
+ $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
+ return $this->outputJson($name . ": Um einen Interessenten zum Bewerber zu machen, muss die Person das Reihungstestverfahren abgeschlossen haben");
+ }
+ }
+
+ //Check ZGV
+ if(!defined("ZGV_CHECK") || ZGV_CHECK)
+ {
+ if($status_kurzbz=='Bewerber' && $zgv_code=='')
+ {
+ $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
+ return $this->outputJson($name . ": Um einen Interessenten zum Bewerber zu machen, muss die Zugangsvoraussetzung eingetragen sein.");
+ }
+ }
+
+ //Check ZGV-Master
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+ $result = $this->StudiengangModel->load([
+ 'studiengang_kz'=> $stg
+ ]);
+ if(isError($result))
+ {
+ $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
+ return $this->outputJson(getError($result));
+ }
+ $result = current(getData($result));
+ $typ = $result->typ;
+
+ if(!defined("ZGV_CHECK") || ZGV_CHECK)
+ {
+ if($status_kurzbz=='Bewerber' && $zgv_code=='' && $typ=='m')
+ {
+ $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
+ return $this->outputJson($name . ": Um einen Interessenten zum Bewerber zu machen, muss die Zugangsvoraussetzung Master eingetragen sein.");
+ }
+ }
+
+ //check if bewerberstatus exists
+ if($status_kurzbz == 'Aufgenommener' || $status_kurzbz == 'Wartender')
+ {
+ //TODO(manu) Wartender NICHT in Liste!? nur in diesem Code
+ //FAS: Aufnahme ist möglich: Beispiel prestudent_id = 129629
+
+ $result = $this->PrestudentstatusModel->checkIfExistingBewerberstatus($prestudent_id);
+ if (isError($result))
+ {
+ $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
+ return $this->outputJson(getError($result));
+ }
+ }
+
+ //TODO(Manu) permission not working here...
+ $hasPermissionToSkipStatusCheck = $this->permissionlib->isBerechtigt('student/keine_studdatuspruefung');
+ /* var_dump($hasPermissionToSkipStatusCheck);
+
+ $basis = $this->permissionlib->isBerechtigt('basis/prestudent');
+ var_dump($basis);*/
+ if(!$hasPermissionToSkipStatusCheck)
+ {
+ //Block STATUSCHECKS
+ $new_status_datum = isset($datum) ? $datum : date('Y-m-d');
+ $result = $this->PrestudentstatusModel->checkDatumNewStatus($new_status_datum);
+ if (isError($result))
+ {
+ $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
+ return $this->outputJson(getError($result));
+ }
+
+ $result = $this->PrestudentstatusModel->checkIfValidStatusHistory($prestudent_id, $status_kurzbz, $studiensemester_kurzbz, $new_status_datum, $ausbildungssemester);
+ if (isError($result))
+ {
+ $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
+ return $this->outputJson(getError($result));
+ //return $this->outputJson("DEBUG: in Funktion checkIfValidStatusHistory");
+ }
+ $statusArr = $result; //wenn return result ok
+
+ }
+
+
$result = $this->PrestudentstatusModel->insert(
[
'prestudent_id' => $prestudent_id,
@@ -83,7 +232,7 @@ class Status extends FHC_Controller
'ausbildungssemester' => $ausbildungssemester,
'anmerkung' => $anmerkung,
'statusgrund_id' => $statusgrund_id,
- 'insertvon' => 'uid',
+ 'insertvon' => $uid,
'insertamum' => date('c'),
'bestaetigtam' => $bestaetigtam,
'bestaetigtvon' => $bestaetigtvon,
@@ -94,8 +243,10 @@ class Status extends FHC_Controller
if (isError($result))
{
$this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
- return $this->outputJson(getError($result));
+ //return $this->outputJson(getError($result));
+ return $this->outputJson("DEBUG: in insert Funktion");
}
+
return $this->outputJsonSuccess(true);
}
@@ -143,6 +294,13 @@ class Status extends FHC_Controller
$status_kurzbz = $this->input->post('status_kurzbz');
$ausbildungssemester = $this->input->post('ausbildungssemester');
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
+/* var_dump($prestudent_id);
+ var_dump($status_kurzbz);*/
+
+ //var_dump($_POST);
+
+ //Todo(manu)
+ //Löschen auch aus anderen Tabellen
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
@@ -166,6 +324,65 @@ class Status extends FHC_Controller
return $this->outputJsonSuccess(current(getData($result)));
}
+ public function updateStatus($prestudent_id)
+ {
+ /* $this->load->library('form_validation');
+ if ($this->form_validation->run() == false)
+ {
+ return $this->outputJsonError($this->form_validation->error_array());
+ }*/
+
+ $_POST = json_decode(utf8_encode($this->input->raw_input_stream), true);
+ $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
+
+ var_dump($_POST);
+
+ $uid = getAuthUID();
+ //$prestudent_id = $this->input->post('prestudent_id');
+ $status_kurzbz = $this->input->post('status_kurzbz');
+ $ausbildungssemester = $this->input->post('ausbildungssemester');
+ $datum = $this->input->post('datum');
+ $bestaetigtam = $this->input->post('bestaetigtam');
+ $bewerbung_abgeschicktamum = $this->input->post('bewerbung_abgeschicktamum');
+ $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
+ $studienplan_id = $this->input->post('studienplan_id');
+ $anmerkung = $this->input->post('anmerkung ');
+ $statusgrund_id = $this->input->post('statusgrund_id');
+ $rt_stufe = $this->input->post('rt_stufe');
+ $bestaetigtvon = $this->input->post('bestaetigtvon');
+
+ // Start DB transaction
+ //$this->db->trans_start(false);
+
+ $result = $this->PrestudentstatusModel->update(
+ [
+ 'prestudent_id' => $prestudent_id,
+ 'status_kurzbz' => $status_kurzbz,
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz,
+ 'ausbildungssemester' => $ausbildungssemester,
+ ],
+ [
+
+ 'bewerbung_abgeschicktamum' => $bewerbung_abgeschicktamum,
+ 'studienplan_id' => $studienplan_id,
+ 'anmerkung' => $anmerkung,
+ 'statusgrund_id' => $statusgrund_id,
+ 'updatevon' => $uid,
+ 'updateamum' => date('c'),
+ 'bestaetigtam' => $bestaetigtam,
+ 'bestaetigtvon' => $bestaetigtvon,
+ 'datum' => $datum,
+ 'rt_stufe' => $rt_stufe
+ ]
+ );
+ if (isError($result))
+ {
+ $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
+ return $this->outputJson(getError($result));
+ }
+ return $this->outputJsonSuccess(true);
+ }
+
}
diff --git a/application/models/crm/Prestudent_model.php b/application/models/crm/Prestudent_model.php
index 0d0399bed..742a823f5 100644
--- a/application/models/crm/Prestudent_model.php
+++ b/application/models/crm/Prestudent_model.php
@@ -734,20 +734,26 @@ class Prestudent_model extends DB_Model
*/
public function getHistoryPrestudent($prestudent_id)
{
- $query = "
+ //TODO(Manu) refactor
+ $this->load->model('crm/Student_model', 'StudentModel');
+
+ $result = $this->StudentModel->checkIfUID($prestudent_id);
+
+ if(isError($result))
+ {
+ $query = "
SELECT
- ps.status_kurzbz,
- ps.studiensemester_kurzbz,
- ps.ausbildungssemester,
- CASE WHEN ps.status_kurzbz = 'Student' THEN CONCAT(lv.semester, lv.verband, lv.gruppe) END AS lehrverband,
- ps.datum,
- TO_CHAR(ps.datum::timestamp, 'DD.MM.YYYY') AS format_datum,
- sp.bezeichnung,
- ps.bestaetigtam,
- TO_CHAR(ps.bestaetigtam::timestamp, 'DD.MM.YYYY') AS format_bestaetigtam,
- ps.bewerbung_abgeschicktamum,
- TO_CHAR(ps.bewerbung_abgeschicktamum::timestamp, 'DD.MM.YYYY HH24:MI:SS') AS format_bewerbung_abgeschicktamum,
- stg.statusgrund_kurzbz,
+ ps.status_kurzbz,
+ ps.studiensemester_kurzbz,
+ ps.ausbildungssemester,
+ ps.datum,
+ TO_CHAR(ps.datum::timestamp, 'DD.MM.YYYY') AS format_datum,
+ sp.bezeichnung,
+ ps.bestaetigtam,
+ TO_CHAR(ps.bestaetigtam::timestamp, 'DD.MM.YYYY') AS format_bestaetigtam,
+ ps.bewerbung_abgeschicktamum,
+ TO_CHAR(ps.bewerbung_abgeschicktamum::timestamp, 'DD.MM.YYYY HH24:MI:SS') AS format_bewerbung_abgeschicktamum,
+ stg.statusgrund_kurzbz,
ps.orgform_kurzbz,
ps.prestudent_id,
sp.studienplan_id,
@@ -760,17 +766,54 @@ class Prestudent_model extends DB_Model
TO_CHAR(ps.updateamum::timestamp, 'DD.MM.YYYY HH24:MI:SS') AS format_updateamum,
ps.updatevon
FROM public.tbl_prestudentstatus ps
- JOIN public.tbl_student st USING (prestudent_id)
- JOIN public.tbl_studentlehrverband lv ON (st.student_uid = lv.student_uid)
- JOIN public.tbl_studiengang sg ON (lv.studiengang_kz = sg.studiengang_kz)
+ LEFT JOIN public.tbl_student st USING (prestudent_id)
+ LEFT JOIN public.tbl_studiengang sg ON (st.studiengang_kz = sg.studiengang_kz)
LEFT JOIN lehre.tbl_studienplan sp USING (studienplan_id)
LEFT JOIN public.tbl_status_grund stg USING (statusgrund_id)
WHERE prestudent_id = ?
- and lv.studiensemester_kurzbz = ps.studiensemester_kurzbz
- ORDER BY datum DESC
+ ORDER BY datum DESC
";
+ }
+ else
+ {
+ $query = "
+ SELECT
+ ps.status_kurzbz,
+ ps.studiensemester_kurzbz,
+ ps.ausbildungssemester,
+ CASE WHEN ps.status_kurzbz IN ('Student', 'Diplomand') THEN CONCAT(lv.semester, lv.verband, lv.gruppe) END AS lehrverband,
+ ps.datum,
+ TO_CHAR(ps.datum::timestamp, 'DD.MM.YYYY') AS format_datum,
+ sp.bezeichnung,
+ ps.bestaetigtam,
+ TO_CHAR(ps.bestaetigtam::timestamp, 'DD.MM.YYYY') AS format_bestaetigtam,
+ ps.bewerbung_abgeschicktamum,
+ TO_CHAR(ps.bewerbung_abgeschicktamum::timestamp, 'DD.MM.YYYY HH24:MI:SS') AS format_bewerbung_abgeschicktamum,
+ stg.statusgrund_kurzbz,
+ ps.orgform_kurzbz,
+ ps.prestudent_id,
+ sp.studienplan_id,
+ ps.anmerkung,
+ ps.bestaetigtvon,
+ ps.insertamum,
+ TO_CHAR(ps.insertamum::timestamp, 'DD.MM.YYYY HH24:MI:SS') AS format_insertamum,
+ ps.insertvon,
+ ps.updateamum,
+ TO_CHAR(ps.updateamum::timestamp, 'DD.MM.YYYY HH24:MI:SS') AS format_updateamum,
+ ps.updatevon
+ FROM public.tbl_prestudentstatus ps
+ JOIN public.tbl_student st USING (prestudent_id)
+ JOIN public.tbl_studentlehrverband lv ON (st.student_uid = lv.student_uid)
+ JOIN public.tbl_studiengang sg ON (lv.studiengang_kz = sg.studiengang_kz)
+ LEFT JOIN lehre.tbl_studienplan sp USING (studienplan_id)
+ LEFT JOIN public.tbl_status_grund stg USING (statusgrund_id)
+ WHERE prestudent_id = ?
+ and lv.studiensemester_kurzbz = ps.studiensemester_kurzbz
+ ORDER BY datum DESC
+ ";
+
+ }
- // var_dump($query);
return $this->execQuery($query, array($prestudent_id));
}
diff --git a/application/models/crm/Prestudentstatus_model.php b/application/models/crm/Prestudentstatus_model.php
index 08c081153..84d281877 100644
--- a/application/models/crm/Prestudentstatus_model.php
+++ b/application/models/crm/Prestudentstatus_model.php
@@ -338,4 +338,319 @@ class Prestudentstatus_model extends DB_Model
return $this;
}
+
+ /**
+ * Check if Rolle already exists
+ * @param integer $prestudent_id
+ * @param string $status_kurzbz
+ * @param string $studiensemester_kurzbz
+ * @param integer $ausbildungssemester
+ * @return error if already exists, success if not
+ * Copy from studentDBDML.php
+ */
+ public function checkIfExistingPrestudentRolle($prestudent_id, $status_kurzbz, $studiensemester_kurzbz, $ausbildungssemester)
+ {
+ $qry = "SELECT
+ *
+ FROM
+ public.tbl_prestudentstatus
+ WHERE
+ prestudent_id = ?
+ AND
+ status_kurzbz = ?
+ AND
+ studiensemester_kurzbz = ?
+ AND
+ ausbildungssemester = ?";
+
+ $result = $this->execQuery($qry, array($prestudent_id, $status_kurzbz, $studiensemester_kurzbz, $ausbildungssemester));
+
+ if (isError($result))
+ {
+ return error($result);
+ }
+ elseif (!hasData($result)) {
+ return success($result);
+ }
+ else
+ {
+ return error('Diese Rolle ist bereits vorhanden: ' . $prestudent_id . ' / ' . $studiensemester_kurzbz . ' : ' . $status_kurzbz . ' /' . $ausbildungssemester . ')');
+ }
+ }
+
+ /**
+ * Check if Rolle there is an existing Bewerberstatus
+ * @param integer $prestudent_id
+ * @return error if no bewerberstatus, success if existing
+ */
+ public function checkIfExistingBewerberstatus($prestudent_id)
+ {
+ $qry = "SELECT
+ *
+ FROM
+ public.tbl_prestudentstatus
+ WHERE
+ prestudent_id = ?
+ AND
+ status_kurzbz = 'Bewerber'";
+
+ $result = $this->execQuery($qry, array($prestudent_id));
+
+ if (isError($result))
+ {
+ return error($result);
+ }
+ elseif (!hasData($result)) {
+ return error("Person muss zuerst zum Bewerber gemacht werden! " . $prestudent_id );
+ }
+ else
+ {
+ return success($result);
+ }
+ }
+
+ /**
+ * Check if Datum New Status is in the Past
+ * @param integer $prestudent_id
+ * @return error if in past
+ */
+ public function checkDatumNewStatus($new_status_datum)
+ {
+ $today = new DateTime('today');
+ $new_status_datum = new DateTime($new_status_datum);
+
+ if($new_status_datum < $today)
+ {
+ return error("Datum eines neuen Statuseintrags darf nicht in der Vergangenheit liegen ");
+ }
+
+ else
+ {
+ return success();
+ }
+ }
+
+ /**
+ * Check if History of StatusData is valid
+ * @param integer $prestudent_id
+ * @return error if not valid, array StatusArr if valid
+ */
+ public function checkIfValidStatusHistory($prestudent_id, $status_kurzbz, $new_status_studiensemester_kurzbz, $new_status_datum, $new_status_ausbildungssemester, $old_status_studiensemester_kurzbz = '', $old_status_ausbildungssemester = '')
+ {
+ //$isNewStatus = $this->checkIfNewStatus($prestudent_id, $status_kurzbz);
+ $isNewStatus = $old_status_studiensemester_kurzbz == '' && $old_status_ausbildungssemester == '';
+
+ //get start studiensemester
+ $result = $this->StudiensemesterModel->load([
+ 'studiensemester_kurzbz' => $new_status_studiensemester_kurzbz
+ ]);
+ if(isError($result))
+ {
+ $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
+ return $this->outputJson(getError($result));
+ }
+ elseif(!hasData($result)) {
+ return error("Kein Eintrag für Studiensemester vorhanden! :-/" . $new_status_studiensemester_kurzbz);
+ }
+
+ $studiensemester = current($result->retval);
+ $new_status_semesterstart = $studiensemester->start;
+
+ //print_r($new_status_semesterstart);
+
+ //get all prestudentstati
+ $resultPs = $this->getAllPrestudentstatiWithStudiensemester($prestudent_id);
+ if (isError($resultPs))
+ {
+ $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
+ return $this->outputJson(getError($resultPs));
+ }
+ $resultArr = $resultPs->retval;
+ $statusArr = array();
+
+ $newStatusInserted = false;
+ $new_status_datum_form = new DateTime($new_status_datum);
+ $new_status_semesterstart_form = new DateTime($new_status_semesterstart);
+
+ foreach ($resultArr as $row)
+ {
+/* print_r($row->studiensemester_start . " >= " . $row->datum . " UND ");
+ print_r($new_status_semesterstart . " >= " . $new_status_datum . " ? ");*/
+
+ $studiensemester_start = new DateTime($row->studiensemester_start);
+ $status_datum = new DateTime ($row->datum);
+
+
+ if ($new_status_datum_form >= $status_datum && $new_status_semesterstart_form >= $studiensemester_start) {
+
+ if (!$newStatusInserted)
+ {
+ // neuer Status erstmals größer als Datum eines bestehenden Status -> neuen Status EINMALIG einfügen für spätere Statusprüfung
+ $neuer_status = new stdClass();
+ $neuer_status->status_kurzbz = $status_kurzbz;
+ $neuer_status->studiensemester_kurzbz = $new_status_studiensemester_kurzbz;
+ $neuer_status->datum = $new_status_datum;
+ $neuer_status->ausbildungssemester = $new_status_ausbildungssemester;
+ $statusArr[] = $neuer_status;
+ $newStatusInserted = true;
+ }
+ $statusArr[] = $row;
+ }
+ elseif($new_status_datum_form <= $status_datum && $new_status_semesterstart_form <= $studiensemester_start){
+ $statusArr[] = $row;
+ //print_r( "cond 2 met\n");
+
+ }
+ else
+ {
+ return error("Datum des Statuseintrags muss nach dem Statusdatum, das Semesterstartdatum nach Semesterstartdatum des vorherigen Statuseintrags sein");
+ // print_r( "cond not met" . $count . "\n");
+ }
+
+ }
+ //var_dump($statusArr);
+
+ $endstatusArr = array('Absolvent', 'Abbrecher');
+ // Über alle gespeicherten Status gehen und Statusabfolge prüfen
+ for ($i = 0; $i < count($statusArr); $i++) {
+ $curr_status = $statusArr[$i];
+ $curr_status_kurzbz = $curr_status->status_kurzbz;
+ $curr_status_ausbildungssemester = $curr_status->ausbildungssemester;
+ $next_idx = $i - 1; //absteigend sortiert, nächster Status ist vorheriger Eintrag
+ $next_status = isset($statusArr[$next_idx]) ? $statusArr[$next_idx] : null;
+
+ // Abbrecher- oder Absolventenstatus muss Endstatus sein
+ if (isset($next_status) && in_array($curr_status_kurzbz, $endstatusArr)) {
+
+ return error("Nach Abbrecher- und Absolventenstatus darf kein anderer Status mehr eingetragen werden");
+ }
+
+ // wenn Unterbrecher auf Unterbrecher folgt, muss Ausbildungssemester gleich sein
+ //TODO(Manu) check, warum hier automatisch ausbildungssemester korrigiert wird
+ if (
+ $curr_status_kurzbz == 'Unterbrecher' && isset($next_status) && $next_status->status_kurzbz == 'Unterbrecher'
+ && $curr_status_ausbildungssemester != $next_status->ausbildungssemester
+ )
+ {
+ return error("Aufeinanderfolgende Unterbrecher müssen gleiches Ausbildungssemester haben");
+ }
+
+ // wenn Abbrecher auf Unterbrecher folgt, muss Ausbildungssemester gleich sein
+ //TODO(Manu) check, warum hier automatisch ausbildungssemester korrigiert wird
+ if (
+ isset($next_status) && $curr_status_kurzbz == 'Unterbrecher'
+ && $next_status->status_kurzbz == 'Abbrecher' && $curr_status_ausbildungssemester != $next_status->ausbildungssemester
+ )
+ {
+ return error("Unterbrecher und folgender Abbrecher müssen gleiches Ausbildungssemester haben");
+ }
+
+ // keine Studenten nach Diplomand Status
+ if (
+ isset($next_status) && $curr_status_kurzbz == 'Diplomand' && $next_status->status_kurzbz == 'Student'
+ )
+ {
+ return error("Nach Diplomantenstatus darf kein Studentenstatus mehr eingetragen werden");
+ }
+
+ }
+
+ //return $statusArr; //rot
+ //return $resultPs->retval; //rot
+ //TODO(Manu) check, warum Fehlermeldung bei anderem returnwert!
+ return $resultPs;
+ }
+
+ public function miniFunction()
+ {
+ $array = [
+ 'key1' => 'value1',
+ 'key2' => 'value2',
+ 'key3' => 'value3'
+ ];
+
+ return $array;
+ }
+
+ public function checkStatusabfolge($statusArr)
+ {
+ $endstatusArr = array('Absolvent', 'Abbrecher');
+ $statusArr = json_decode($statusArr);
+
+ //var_dump($statusArr);
+ var_dump($statusArr[0]->status_kurzbz);
+ // Prüfungen den Prestudentstatus betreffend
+ // Über alle gespeicherten Status gehen und Statusabfolge prüfen
+/* for ($i = 0; $i < count($statusArr); $i++) {
+ $curr_status = $statusArr[$i];
+ $curr_status_kurzbz = $curr_status->status_kurzbz;
+ $curr_status_ausbildungssemester = $curr_status->ausbildungssemester;
+ $next_idx = $i - 1; //absteigend sortiert, nächster Status ist vorheriger Eintrag
+ $next_status = isset($statusArr[$next_idx]) ? $statusArr[$next_idx] : null;
+
+ // Abbrecher- oder Absolventenstatus muss Endstatus sein
+ if (isset($next_status) && in_array($curr_status_kurzbz, $endstatusArr)) {
+
+ return error("Nach Abbrecher- und Absolventenstatus darf kein anderer Status mehr eingetragen werden");
+ }
+ }*/
+
+ return $endstatusArr;
+
+ }
+
+ public function getAllPrestudentstatiWithStudiensemester($prestudent_id, $old_status_studiensemester_kurzbz = '', $old_status_ausbildungssemester = '')
+ {
+
+ $isNewStatus = $old_status_studiensemester_kurzbz == '' && $old_status_ausbildungssemester == '';
+
+ $qry = "
+ SELECT public.tbl_prestudentstatus.status_kurzbz,
+ public.tbl_prestudentstatus.studiensemester_kurzbz,
+ public.tbl_prestudentstatus.ausbildungssemester,
+ public.tbl_prestudentstatus.datum,
+ s.start AS studiensemester_start
+ FROM public.tbl_prestudentstatus
+ JOIN public.tbl_studiensemester s USING (studiensemester_kurzbz)
+ WHERE prestudent_id = ?
+ ORDER BY public.tbl_prestudentstatus.datum DESC,
+ public.tbl_prestudentstatus.insertamum DESC,
+ public.tbl_prestudentstatus.ext_id DESC
+ ";
+
+ $result = $this->execQuery($qry, array($prestudent_id));
+
+ if (isError($result))
+ {
+ return error($result);
+ }
+ if (!hasData($result)) {
+ return error('No Statusdata vorhanden');
+ }
+
+ return $result;
+
+
+
+/* $this->addSelect($this->dbTable . '.status_kurzbz');
+ $this->addSelect($this->dbTable . '.studiensemester_kurzbz');
+ $this->addSelect($this->dbTable . '.ausbildungssemester');
+ $this->addSelect($this->dbTable . '.datum');
+ $this->addSelect('s.start AS studiensemester_start');
+
+ $this->addJoin('public.tbl_studiensemester s', 'studiensemester_kurzbz');
+ $this->addOrder($this->dbTable . '.datum', 'DESC');
+ $this->addOrder($this->dbTable . '.insertamum', 'DESC');
+
+ $this->addOrder($this->dbTable . '.ext_id', 'DESC');
+
+ return $this->loadWhere([
+ 'prestudent_id' => $prestudent_id
+ ]
+ );*/
+
+
+ }
+
+
}
diff --git a/application/models/crm/Student_model.php b/application/models/crm/Student_model.php
index e27fa68dc..d307c36c0 100644
--- a/application/models/crm/Student_model.php
+++ b/application/models/crm/Student_model.php
@@ -67,6 +67,27 @@ class Student_model extends DB_Model
return $result->retval[0]->student_uid;
}
+ /**
+ * Get students UID by PrestudentID.
+ * @param $prestudent_id
+ * @return mixed
+ */
+ public function checkIfUID($prestudent_id)
+ {
+ $this->addSelect('student_uid');
+
+ $result = $this->loadWhere(
+ array('prestudent_id' => $prestudent_id)
+ );
+
+ if (!hasData($result))
+ {
+ return error($result);
+ }
+
+ return $result->retval[0]->student_uid;
+ }
+
public function searchStudent($filter)
{
$this->addSelect('vorname, nachname, gebdatum, person.person_id, student_uid');
diff --git a/public/js/components/Stv/Studentenverwaltung.js b/public/js/components/Stv/Studentenverwaltung.js
index 4706b5b93..5a6e62a38 100644
--- a/public/js/components/Stv/Studentenverwaltung.js
+++ b/public/js/components/Stv/Studentenverwaltung.js
@@ -51,7 +51,12 @@ export default {
hasBpkPermission: this.permissions['student/bpk'],
hasAliasPermission: this.permissions['student/alias'],
hasPrestudentPermission: this.permissions['basis/prestudent'],
- lists: this.lists
+ hasAssistenzPermissionForStgs: this.permissions['assistenz_stgs'],
+ hasSchreibrechtAss: this.permissions['assistenz_schreibrechte'],
+ hasAdminPermission: this.permissions['admin'],
+ //hasPermissionToSkipStatusCheck: this.permission['student/keine_studdatuspruefung'],
+ lists: this.lists,
+ defaultSemester: this.defaultSemester
}
},
data() {
diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Prestudent.js b/public/js/components/Stv/Studentenverwaltung/Details/Prestudent.js
index 394a6de27..aaab14983 100644
--- a/public/js/components/Stv/Studentenverwaltung/Details/Prestudent.js
+++ b/public/js/components/Stv/Studentenverwaltung/Details/Prestudent.js
@@ -28,9 +28,20 @@ export default {
from: 'hasPrestudentPermission',
default: false
},
+ hasAssistenzPermission: {
+ from: 'hasAssistenzPermission',
+ default: false
+ },
+ hasAdminPermission: {
+ from: 'hasAdminPermission',
+ default: false
+ },
+ defaultSemester: {
+ from: 'defaultSemester',
+ }
},
props: {
- modelValue: Object
+ modelValue: Object,
},
data(){
return {
@@ -541,6 +552,8 @@ export default {
+
+
@@ -549,18 +562,13 @@ export default {
-
-
-
-
-
-
+
+
+
+
+
-
+
diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Prestudent/Status.js b/public/js/components/Stv/Studentenverwaltung/Details/Prestudent/Status.js
index 6acb6259b..b7e2c1b93 100644
--- a/public/js/components/Stv/Studentenverwaltung/Details/Prestudent/Status.js
+++ b/public/js/components/Stv/Studentenverwaltung/Details/Prestudent/Status.js
@@ -11,6 +11,35 @@ export default{
FormForm,
FormInput,
},
+ inject: {
+ defaultSemester: {
+ from: 'defaultSemester',
+ },
+ hasPermissionToSkipStatusCheck: {
+ from: 'hasPermissionToSkipStatusCheck',
+ default: false
+ },
+ hasPrestudentPermission: {
+ from: 'hasPrestudentPermission',
+ default: false
+ },
+ hasAssistenzPermission: {
+ from: 'hasAssistenzPermission',
+ default: false
+ },
+ hasAdminPermission: {
+ from: 'hasAdminPermission',
+ default: false
+ },
+ hasAssistenzPermissionForStgs: {
+ from: 'hasAssistenzPermissionForStgs',
+ default: false
+ },
+ hasSchreibrechtAss: {
+ from: 'hasSchreibrechtAss',
+ default: false
+ }
+ },
props: {
prestudent_id: String
},
@@ -94,11 +123,11 @@ export default{
tabulatorEvents: [],
statusData: {},
listStudiensemester: [],
- //maySem: [0,1,2,4,6,7],
maxSem: Array.from({ length: 11 }, (_, index) => index),
listStudienplaene: [],
aufnahmestufen: {'': '-- keine Auswahl --', 1: 1, 2: 2, 3: 3},
- listStatusgruende: []
+ listStatusgruende: [],
+ statusId: {}
}
},
computed: {
@@ -106,19 +135,25 @@ export default{
return this.listStatusgruende.filter(grund => grund.status_kurzbz == this.statusData.status_kurzbz);
},
},
- methods:{
- actionNewStatus(){
+ methods: {
+ actionNewStatus() {
console.log("Action: Neuen Status hinzufügen");
+ this.statusData.status_kurzbz = 'Interessent';
+ this.statusData.studiensemester_kurzbz = this.defaultSemester;
+ this.statusData.ausbildungssemester = 1;
+ this.statusData.datum = this.getDefaultDate();
+ this.statusData.bestaetigtam = this.getDefaultDate();
this.$refs.newStatusModal.show();
},
actionEditStatus(status, stdsem, ausbildungssemester){
console.log("Action: Status bearbeiten: (" + status + ": " + stdsem + "/" + ausbildungssemester + ")")
- this.loadStatus({
+ this.statusId = {
'prestudent_id': this.prestudent_id,
'status_kurzbz': status,
'studiensemester_kurzbz': stdsem,
'ausbildungssemester': ausbildungssemester
- }).then(() => {
+ };
+ this.loadStatus(this.statusId).then(() => {
if(this.statusData)
this.$refs.editStatusModal.show();
});
@@ -126,8 +161,19 @@ export default{
actionDeleteStatus(status, stdsem, ausbildungssemester){
console.log("Action: Status löschen: (" + status + ": " + stdsem + "/" + ausbildungssemester + ")")
//this.$refs.deleteStatusModal.show();
+ this.statusId = {
+ 'prestudent_id': this.prestudent_id,
+ 'status_kurzbz': status,
+ 'studiensemester_kurzbz': stdsem,
+ 'ausbildungssemester': ausbildungssemester
+ };
- this.loadStatus({
+ this.loadStatus(this.statusId).then(() => {
+ if(this.statusData)
+ this.$refs.deleteStatusModal.show();
+ });
+
+/* this.loadStatus({
'prestudent_id': this.prestudent_id,
'status_kurzbz': status,
'studiensemester_kurzbz': stdsem,
@@ -135,7 +181,7 @@ export default{
}).then(() => {
if(this.statusData)
this.$refs.deleteStatusModal.show();
- });
+ });*/
},
actionAdvanceStatus(status, stdsem, ausbildungssemester){
console.log("Action: Status vorrücken: (" + status + ": " + stdsem + "/" + ausbildungssemester + ")")
@@ -155,7 +201,7 @@ export default{
this.$refs.deleteStatusModal.show();
});*/
},
- addNewStatus(statusData){
+ addNewStatus(){
CoreRESTClient.post('components/stv/Status/addNewStatus/' + this.prestudent_id,
this.statusData
).then(response => {
@@ -171,12 +217,61 @@ export default{
});
}
}).catch(error => {
- this.$fhcAlert.alertError('Fehler bei Speichern Status aufgetreten');
+ if (error.response) {
+ console.log(error.response);
+ this.$fhcAlert.alertError(error.response.data);
+ }
}).finally(() => {
window.scrollTo(0, 0);
this.reload();
});
},
+ deleteStatus(status_id){
+ return CoreRESTClient.post('components/stv/Status/deleteStatus/',
+ status_id)
+ .then(
+ result => {
+ if(!result.data.error) {
+ this.$fhcAlert.alertSuccess('Löschen erfolgreich');
+ this.hideModal('deleteStatusModal');
+ this.resetModal();
+ }
+ else
+ {
+ const errorData = result.data.retval;
+ this.$fhcAlert.alertError('Kein Status mit Id ' + status_id + ' gefunden');
+ }
+/* return result;*/
+ }).catch(error => {
+ this.$fhcAlert.alertError('Fehler bei Löschen von Status aufgetreten');
+ }).finally(() => {
+ window.scrollTo(0, 0);
+ this.reload();
+ });
+ },
+ editStatus(status_id){
+ return CoreRESTClient.post('components/stv/Status/updateStatus/' + this.prestudent_id,
+ this.statusData)
+ .then(
+ result => {
+ if(!result.data.error) {
+ this.$fhcAlert.alertSuccess('Bearbeitung Status erfolgreich');
+ this.hideModal('editStatusModal');
+ this.resetModal();
+ }
+ else
+ {
+ const errorData = result.data.retval;
+ this.$fhcAlert.alertError('Kein Status mit Id ' + status_id + ' gefunden');
+ }
+ /* return result;*/
+ }).catch(error => {
+ this.$fhcAlert.alertError('Fehler beim Bearbeiten des Status aufgetreten');
+ }).finally(() => {
+ window.scrollTo(0, 0);
+ this.reload();
+ });
+ },
loadStatus(status_id){
return CoreRESTClient.post('components/stv/Status/loadStatus/',
status_id)
@@ -201,7 +296,12 @@ export default{
},
resetModal(){
this.statusData = {};
+ this.statusId = {};
},
+ getDefaultDate() {
+ const today = new Date();
+ return today;
+ }
},
created(){
CoreRESTClient
@@ -230,13 +330,23 @@ export default{
-
TestData
+
+
+
+
+
Neuen Status hinzufügen
-
+
@@ -256,6 +366,8 @@ export default{
+
+
@@ -267,8 +379,8 @@ export default{
type="select"
name="studiensemester_kurzbz"
v-model="statusData['studiensemester_kurzbz']"
- >
-
+ >
+
@@ -280,7 +392,7 @@ export default{
type="select"
:readonly="readonly"
name="ausbildungssemester"
- v-model="statusData['ausbildungssemester']"
+ v-model="statusData.ausbildungssemester"
>
@@ -294,7 +406,7 @@ export default{
type="DatePicker"
:readonly="readonly"
name="datum"
- v-model="statusData['datum']"
+ v-model="statusData.datum"
auto-apply
:enable-time-picker="false"
format="dd.MM.yyyy"
@@ -310,7 +422,7 @@ export default{
type="DatePicker"
:readonly="readonly"
name="datum"
- v-model="statusData['bestaetigtam']"
+ v-model="statusData.bestaetigtam"
auto-apply
:enable-time-picker="false"
format="dd.MM.yyyy"
@@ -320,7 +432,7 @@ export default{
-
+
+
Status bearbeiten
@@ -419,6 +532,8 @@ export default{
+
+
@@ -432,7 +547,7 @@ export default{
v-model="statusData['studiensemester_kurzbz']"
>
- f
+
@@ -555,7 +670,7 @@ export default{
-
+
@@ -565,10 +680,25 @@ export default{
Status löschen
Prestudentstatus {{statusData.status_kurzbz}} (id: {{statusData.prestudent_id}}
- / {{statusData.studiensemester_kurzbz}}) im {{statusData.ausbildungssemester}}. Ausbildungssemester wirklich löschen?
-
+ / {{statusData.studiensemester_kurzbz}}) im {{statusData.ausbildungssemester}}. Ausbildungssemester wirklich löschen?
+
+
+
-
+