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 {
+ +
Status @@ -549,18 +562,13 @@ export default {
- - -
- Gesamthistorie - -
+ +
+ Gesamthistorie + +
- + 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

+ + + + + - +
@@ -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{
- +
+ @@ -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{ + / {{statusData.studiensemester_kurzbz}}) im {{statusData.ausbildungssemester}}. Ausbildungssemester wirklich löschen?

+ + +