From d254b9c10b7066ed481d28952e8d7c4747a568d6 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Fri, 23 Aug 2024 11:58:08 +0200 Subject: [PATCH 1/9] Start Tab Pruefung, Abfrage Pruefungen --- .../api/frontend/v1/stv/Config.php | 4 + .../api/frontend/v1/stv/Pruefung.php | 48 +++++++++ .../models/education/LePruefung_model.php | 41 +++++++ .../Studentenverwaltung/Details/Pruefung.js | 25 +++++ .../Details/Pruefung/Pruefunglist.js | 101 ++++++++++++++++++ system/phrasesupdate.php | 20 ++++ 6 files changed, 239 insertions(+) create mode 100644 application/controllers/api/frontend/v1/stv/Pruefung.php create mode 100644 public/js/components/Stv/Studentenverwaltung/Details/Pruefung.js create mode 100644 public/js/components/Stv/Studentenverwaltung/Details/Pruefung/Pruefunglist.js diff --git a/application/controllers/api/frontend/v1/stv/Config.php b/application/controllers/api/frontend/v1/stv/Config.php index c28c49485..bfff14580 100644 --- a/application/controllers/api/frontend/v1/stv/Config.php +++ b/application/controllers/api/frontend/v1/stv/Config.php @@ -97,6 +97,10 @@ class Config extends FHCAPI_Controller 'component' => './Stv/Studentenverwaltung/Details/Noten.js' ]; */ + $result['exam'] = [ + 'title' => $this->p->t('stv', 'tab_exam'), + 'component' => './Stv/Studentenverwaltung/Details/Pruefung.js' + ]; Events::trigger('stv_conf_student', function & () use (&$result) { return $result; diff --git a/application/controllers/api/frontend/v1/stv/Pruefung.php b/application/controllers/api/frontend/v1/stv/Pruefung.php new file mode 100644 index 000000000..60666c610 --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/Pruefung.php @@ -0,0 +1,48 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +/** + * This controller operates between (interface) the JS (GUI) and the back-end + * Provides data to the ajax get calls about addresses + * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON + */ +class Pruefung extends FHCAPI_Controller +{ + public function __construct() + { + //TODO(Manu) Berechtigungen + parent::__construct([ + 'getPruefungen' => self::PERM_LOGGED + ]); + + //Load Models + $this->load->model('education/LePruefung_model', 'PruefungModel'); + } + + public function getPruefungen($student_uid, $studiensemester_kurzbz = null) + { + $result = $this->PruefungModel->getPruefungenByStudentuid($student_uid); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + +} diff --git a/application/models/education/LePruefung_model.php b/application/models/education/LePruefung_model.php index ac6c7f9b2..5522a3998 100644 --- a/application/models/education/LePruefung_model.php +++ b/application/models/education/LePruefung_model.php @@ -11,4 +11,45 @@ class LePruefung_model extends DB_Model $this->dbTable = 'lehre.tbl_pruefung'; $this->pk = 'pruefung_id'; } + + /** + * CI_STYLE + * @param string $student_uid + * @param string $studiensemester_kurzbz + * + * @return stdClass + */ + public function getPruefungenByStudentuid($student_uid, $studiensemester_kurzbz = null) + { + $this->addSelect('tbl_pruefung.datum'); + $this->addSelect("TO_CHAR(tbl_pruefung.datum::timestamp, 'DD.MM.YYYY') AS format_datum"); + $this->addSelect('tbl_pruefung.anmerkung'); + $this->addSelect('tbl_pruefung.pruefungstyp_kurzbz'); + $this->addSelect('tbl_pruefung.pruefung_id'); + $this->addSelect('tbl_pruefung.lehreinheit_id'); + $this->addSelect('tbl_pruefung.student_uid'); + $this->addSelect('tbl_pruefung.mitarbeiter_uid'); + $this->addSelect('tbl_pruefung.punkte'); + + $this->addSelect('tbl_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung'); + $this->addSelect('tbl_lehrveranstaltung.lehrveranstaltung_id'); + $this->addSelect('tbl_note.bezeichnung as note_bezeichnung'); + $this->addSelect('tbl_pruefungstyp.beschreibung as typ_beschreibung'); + $this->addSelect('tbl_lehreinheit.studiensemester_kurzbz as studiensemester_kurzbz'); + + $this->addJoin('lehre.tbl_lehreinheit', 'lehre.tbl_pruefung.lehreinheit_id=lehre.tbl_lehreinheit.lehreinheit_id'); + $this->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id'); + $this->addJoin('lehre.tbl_note', 'note'); + $this->addJoin('lehre.tbl_pruefungstyp', 'pruefungstyp_kurzbz'); + + if ($studiensemester_kurzbz) + $this->db->where("tbl_lehreinheit.studiensemester_kurzbz = ", $studiensemester_kurzbz); + + $this->addOrder('tbl_pruefung.datum', 'DESC'); + $this->addOrder('tbl_pruefung.pruefung_id', 'DESC'); + + return $this->loadWhere([ + 'student_uid' => $student_uid + ]); + } } diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Pruefung.js b/public/js/components/Stv/Studentenverwaltung/Details/Pruefung.js new file mode 100644 index 000000000..eb43e36be --- /dev/null +++ b/public/js/components/Stv/Studentenverwaltung/Details/Pruefung.js @@ -0,0 +1,25 @@ +import PruefungList from "./Pruefung/Pruefunglist.js"; + +export default { + components: { + PruefungList + }, + props: { + modelValue: Object, + config: Object + }, + data() { + return { + pruefungen: [] + } + }, + template: ` +
+ + {{modelValue}} +
+ + +
+
` +}; \ No newline at end of file diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Pruefung/Pruefunglist.js b/public/js/components/Stv/Studentenverwaltung/Details/Pruefung/Pruefunglist.js new file mode 100644 index 000000000..6f034e087 --- /dev/null +++ b/public/js/components/Stv/Studentenverwaltung/Details/Pruefung/Pruefunglist.js @@ -0,0 +1,101 @@ +import {CoreFilterCmpt} from "../../../../filter/Filter.js"; +import FormInput from "../../../../Form/Input.js"; + +export default{ + components: { + CoreFilterCmpt, + FormInput + }, + inject: { + defaultSemester: { + from: 'defaultSemester', + }, + }, + props: { + uid: Number + }, + data(){ + return { + tabulatorOptions: { + ajaxURL: 'api/frontend/v1/stv/pruefung/getPruefungen/' + this.uid, + ajaxRequestFunc: this.$fhcApi.get, + ajaxResponse: (url, params, response) => response.data, + columns: [ + {title: "Datum", field: "format_datum"}, + {title: "Lehrveranstaltung", field: "lehrveranstaltung_bezeichnung"}, + {title: "Note", field: "note_bezeichnung"}, + {title: "Anmerkung", field: "anmerkung"}, + {title: "Typ", field: "pruefungstyp_kurzbz"}, + {title: "PruefungId", field: "pruefung_id", visible:false}, + {title: "LehreinheitId", field: "lehreinheit_id", visible:false}, + {title: "Student_uid", field: "student_uid", visible:false}, + {title: "Mitarbeiter_uid", field: "mitarbeiter_uid", visible:false}, + {title: "Punkte", field: "punkte", visible:false}, + ], + layout: 'fitDataFill', + layoutColumnsOnNewData: false, + height: 'auto', + }, + tabulatorEvents: [{}], + pruefungData: {}, + filter: false + } + }, + computed:{}, +/* watch: { + modelValue() { + this.$refs.table.reloadTable(); + } + },*/ + methods:{ }, + template: ` +
+ +
+ + + +
+ +
+ +
+ + +
+ +
+

Form

+ + aktuelles Sem: {{defaultSemester}} + +
+
+
` +}; + diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 56a7304d4..00ae67abc 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -29300,6 +29300,26 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'stv', + 'phrase' => 'tab_exam', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Prüfung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Exam', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), // konto array( 'app' => 'core', From de0fbdb72c8bbb7d1eb1084d33e8283fb7dd364d Mon Sep 17 00:00:00 2001 From: ma0068 Date: Thu, 29 Aug 2024 09:53:34 +0200 Subject: [PATCH 2/9] Form, Table and Queries for new Tab Pruefung --- .../api/frontend/v1/stv/Pruefung.php | 273 +++++++++- .../models/education/LePruefung_model.php | 2 +- .../models/education/Lehreinheit_model.php | 53 ++ application/models/education/Note_model.php | 14 + .../models/ressource/Mitarbeiter_model.php | 24 + .../Studentenverwaltung/Details/Pruefung.js | 2 +- .../Details/Pruefung/Pruefunglist.js | 481 ++++++++++++++++-- 7 files changed, 811 insertions(+), 38 deletions(-) create mode 100644 application/models/education/Note_model.php diff --git a/application/controllers/api/frontend/v1/stv/Pruefung.php b/application/controllers/api/frontend/v1/stv/Pruefung.php index 60666c610..9ddd22897 100644 --- a/application/controllers/api/frontend/v1/stv/Pruefung.php +++ b/application/controllers/api/frontend/v1/stv/Pruefung.php @@ -29,7 +29,19 @@ class Pruefung extends FHCAPI_Controller { //TODO(Manu) Berechtigungen parent::__construct([ - 'getPruefungen' => self::PERM_LOGGED + 'getPruefungen' => ['admin:r', 'assistenz:r'], + 'loadPruefung' => ['admin:r', 'assistenz:r'], + 'getTypenPruefungen' => self::PERM_LOGGED, + 'getLehreinheiten' => self::PERM_LOGGED, + 'getAllLehreinheiten' => self::PERM_LOGGED, + 'getLvsByStudent' => self::PERM_LOGGED, + 'getLvsandLesByStudent' => self::PERM_LOGGED, + 'getLvsAndMas' => self::PERM_LOGGED, + 'getMitarbeiterLv' => self::PERM_LOGGED, + 'getNoten' => self::PERM_LOGGED, + 'insertPruefung' => ['admin:r', 'assistenz:r'], + 'updatePruefung' =>['admin:r', 'assistenz:r'], + 'deletePruefung' =>['admin:r', 'assistenz:r'], ]); //Load Models @@ -45,4 +57,263 @@ class Pruefung extends FHCAPI_Controller $this->terminateWithSuccess($data); } + public function loadPruefung($pruefung_id) + { + $this->PruefungModel->addSelect('tbl_pruefung.datum'); + $this->PruefungModel->addSelect("TO_CHAR(tbl_pruefung.datum::timestamp, 'DD.MM.YYYY') AS format_datum"); + $this->PruefungModel->addSelect('tbl_pruefung.anmerkung'); + $this->PruefungModel->addSelect('tbl_pruefung.pruefungstyp_kurzbz'); + $this->PruefungModel->addSelect('tbl_pruefung.pruefung_id'); + $this->PruefungModel->addSelect('tbl_pruefung.lehreinheit_id'); + $this->PruefungModel->addSelect('tbl_pruefung.student_uid'); + $this->PruefungModel->addSelect('tbl_pruefung.mitarbeiter_uid'); + $this->PruefungModel->addSelect('tbl_pruefung.punkte'); + $this->PruefungModel->addSelect('tbl_pruefung.note'); + + $this->PruefungModel->addSelect('tbl_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung'); + $this->PruefungModel->addSelect('tbl_lehrveranstaltung.lehrveranstaltung_id'); + $this->PruefungModel->addSelect('tbl_lehrveranstaltung.semester'); + $this->PruefungModel->addSelect('tbl_lehrveranstaltung.lehrform_kurzbz'); + $this->PruefungModel->addSelect('tbl_note.bezeichnung as note_bezeichnung'); + $this->PruefungModel->addSelect('tbl_pruefungstyp.beschreibung as typ_beschreibung'); + $this->PruefungModel->addSelect('tbl_lehreinheit.studiensemester_kurzbz as studiensemester_kurzbz'); + + $this->PruefungModel->addJoin('lehre.tbl_lehreinheit', 'lehre.tbl_pruefung.lehreinheit_id=lehre.tbl_lehreinheit.lehreinheit_id'); + $this->PruefungModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id'); + $this->PruefungModel->addJoin('lehre.tbl_note', 'note'); + $this->PruefungModel->addJoin('lehre.tbl_pruefungstyp', 'pruefungstyp_kurzbz'); + + + $this->PruefungModel->addLimit(1); + + $result = $this->PruefungModel->loadWhere( + array('pruefung_id' => $pruefung_id) + ); + if (isError($result)) { + return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + + if (!hasData($result)) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Pruefung_id']), self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess(current(getData($result)) ? : null); + } + + public function insertPruefung(){ + //TODO(Manu) validations + + $authUID = getAuthUID(); + $lehreinheit_id = $this->input->post('lehreinheit_id'); + $student_uid = $this->input->post('student_uid'); + $mitarbeiter_uid = $this->input->post('mitarbeiter_uid'); + $datum = $this->input->post('datum'); + $note = $this->input->post('note'); + $pruefungstyp_kurzbz = $this->input->post('pruefungstyp_kurzbz'); + $anmerkung = $this->input->post('anmerkung'); + + + $result = $this->PruefungModel->insert([ + 'lehreinheit_id' => $lehreinheit_id, + 'student_uid' => $student_uid, + 'mitarbeiter_uid' => $mitarbeiter_uid, + 'datum' => $datum, + 'pruefungstyp_kurzbz' => $pruefungstyp_kurzbz, + 'note' => $note, + 'anmerkung' => $anmerkung, + 'insertamum' => date('c'), + 'insertvon' => $authUID, + ]); + + $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(true); + + } + + public function updatePruefung($pruefung_id){ + //TODO(Manu) validations + $result = $this->PruefungModel->load($pruefung_id); + + $oldpruefung = $this->getDataOrTerminateWithError($result); + if (!$oldpruefung) + show_404(); // Pruefung that should be updated does not exist + + $authUID = getAuthUID(); + + $lehreinheit_id = $this->input->post('lehreinheit_id'); + $student_uid = $this->input->post('student_uid'); + $mitarbeiter_uid = $this->input->post('mitarbeiter_uid'); + $datum = $this->input->post('datum'); + $note = $this->input->post('note'); + $pruefungstyp_kurzbz = $this->input->post('pruefungstyp_kurzbz'); + $anmerkung = $this->input->post('anmerkung'); + + $result = $this->PruefungModel->update( + [ + 'pruefung_id' => $pruefung_id + ], + [ 'lehreinheit_id' => $lehreinheit_id, + 'student_uid' => $student_uid, + 'mitarbeiter_uid' => $mitarbeiter_uid, + 'note' => $note, + 'pruefungstyp_kurzbz' => $pruefungstyp_kurzbz, + 'datum' => $datum, + 'anmerkung' => $anmerkung, + 'updatevon' => $authUID, + 'updateamum' => date('c'), + ] + ); + + $this->getDataOrTerminateWithError($result); + + return $this->outputJsonSuccess(true); + } + + public function deletePruefung($pruefung_id){ + $result = $this->PruefungModel->load($pruefung_id); + + $oldpruefung = $this->getDataOrTerminateWithError($result); + if (!$oldpruefung) + show_404(); // Pruefung that should be deleted does not exist + + $result = $this->PruefungModel->delete( + [ + 'pruefung_id' => $pruefung_id + ] + ); + + $this->getDataOrTerminateWithError($result); + + return $this->terminateWithSuccess(true); + } + + public function getTypenPruefungen() + { + $this->load->model('education/Pruefungstyp_model', 'PruefungtypModel'); + + //TODO(Manu) sort Termin3 + $this->PruefungtypModel->addOrder('sort', 'ASC'); + $result = $this->PruefungtypModel->loadWhere( + array('abschluss' => 'false') + ); + + if (isError($result)) { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + return $this->terminateWithSuccess(getData($result) ?: []); + } + + public function getAllLehreinheiten(){ + + //TODO MANU (validations) + + $lv_id = $this->input->post('lv_id'); + $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); + + $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + + $result = $this->LehreinheitModel->getLesFromLvIds($lv_id, $studiensemester_kurzbz); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getLvsandLesByStudent($student_uid) + { + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + + $result = $this->LehrveranstaltungModel->getLvsByStudent($student_uid); + + $data = $this->getDataOrTerminateWithError($result); + + $lv_ids = array(); + $allData = array(); + + foreach ($data as $lehrveranstaltung) { + $lv_ids[] = $lehrveranstaltung->lehrveranstaltung_id; + } + + $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + + foreach ($lv_ids as $id) + { + $result = $this->LehreinheitModel->getLesFromLvIds($id); + $data = $this->getDataOrTerminateWithError($result); + + if (is_array($data)) { + $allData = array_merge($allData, $data); + } + } + + return $this->terminateWithSuccess($allData); + } + + public function getLvsAndMas($student_uid) + { + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + + $result = $this->LehrveranstaltungModel->getLvsByStudent($student_uid); + + $data = $this->getDataOrTerminateWithError($result); + + $lv_ids = array(); + $allDataMa = array(); + + foreach ($data as $lehrveranstaltung) { + $lv_ids[] = $lehrveranstaltung->lehrveranstaltung_id; + } + + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + + foreach ($lv_ids as $id) { + + $resultMa = $this->MitarbeiterModel->getMitarbeiterFromLV($id); + $dataMa = $this->getDataOrTerminateWithError($resultMa); + + if (is_array($dataMa)) { + $allDataMa = array_merge($allDataMa, $dataMa); + } + } + + return $this->terminateWithSuccess($allDataMa); + } + + public function getLvsByStudent($student_uid) + { + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + + $result = $this->LehrveranstaltungModel->getLvsByStudent($student_uid); + + $data = $this->getDataOrTerminateWithError($result); + + return $this->terminateWithSuccess($data); + } + + public function getMitarbeiterLv($lv_id) + { + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + + $result = $this->MitarbeiterModel->getMitarbeiterFromLV($lv_id); + + $data = $this->getDataOrTerminateWithError($result); + + return $this->terminateWithSuccess($data); + } + + public function getNoten() + { + $this->load->model('education/Note_model', 'NoteModel'); + + $this->NoteModel->addOrder('note', 'ASC'); + $result = $this->NoteModel->load(); + + if (isError($result)) { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + return $this->terminateWithSuccess(getData($result) ?: []); + } + + } diff --git a/application/models/education/LePruefung_model.php b/application/models/education/LePruefung_model.php index 5522a3998..6e51f1975 100644 --- a/application/models/education/LePruefung_model.php +++ b/application/models/education/LePruefung_model.php @@ -13,7 +13,7 @@ class LePruefung_model extends DB_Model } /** - * CI_STYLE + * gets all Pruefungen for a student_uid * @param string $student_uid * @param string $studiensemester_kurzbz * diff --git a/application/models/education/Lehreinheit_model.php b/application/models/education/Lehreinheit_model.php index 10c122b94..3b7e8d330 100644 --- a/application/models/education/Lehreinheit_model.php +++ b/application/models/education/Lehreinheit_model.php @@ -113,4 +113,57 @@ class Lehreinheit_model extends DB_Model return $this->execQuery($query, array($lehreinheit_id)); } + + /** + * Gets Lehreinheiten for Lehrveranstaltungen in a Studiensemester. + * Without using tbl_lehrfach: bezeichnung and kurzbz ALWAYS from lehrveranstaltung + * @param $lehrveranstaltung_id + * @param $studiensemester + * @return array with Lehreinheiten and their Lehreinheitgruppen + */ + public function getLesFromLvIds($lehrveranstaltung_id, $studiensemester_kurzbz = null) + { + $params = array($lehrveranstaltung_id); + + $query = " + SELECT + lv.lehrveranstaltung_id, + le.lehreinheit_id, + le.lehrform_kurzbz, + lv.kurzbz, + lv.bezeichnung, + lv.semester, + ma.mitarbeiter_uid, + ( + SELECT + STRING_AGG(CONCAT(leg.semester, leg.verband, leg.gruppe), ' ') + FROM lehre.tbl_lehreinheitgruppe leg + WHERE leg.lehreinheit_id = le.lehreinheit_id + ) AS gruppe + FROM + lehre.tbl_lehreinheit le + JOIN + lehre.tbl_lehrveranstaltung lv ON lv.lehrveranstaltung_id = le.lehrveranstaltung_id + JOIN + lehre.tbl_lehreinheitmitarbeiter ma USING (lehreinheit_id) + WHERE + lv.lehrveranstaltung_id = ? + --AND le.studiensemester_kurzbz = 'WS2021' + "; + + if (isset($studiensemester_kurzbz)) + { + $query .= " AND le.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + $query .=" + ORDER BY + le.lehreinheit_id; + "; + + return $this->execQuery($query, $params); + + } + } diff --git a/application/models/education/Note_model.php b/application/models/education/Note_model.php new file mode 100644 index 000000000..80b454398 --- /dev/null +++ b/application/models/education/Note_model.php @@ -0,0 +1,14 @@ +dbTable = 'lehre.tbl_note'; + $this->pk = 'note'; + } +} \ No newline at end of file diff --git a/application/models/ressource/Mitarbeiter_model.php b/application/models/ressource/Mitarbeiter_model.php index c38fcf054..52ed62be1 100644 --- a/application/models/ressource/Mitarbeiter_model.php +++ b/application/models/ressource/Mitarbeiter_model.php @@ -238,4 +238,28 @@ class Mitarbeiter_model extends DB_Model return $this->execQuery($qry); } + + /** + * Gets Mitarbeiter for a certain Lehrveranstaltung. + * + * @param $lehrveranstaltung_id + * @return array with Mitarbeiter and their Lehreinheiten + */ + public function getMitarbeiterFromLV($lehrveranstaltung_id){ + //TODO(manu) maybe filter that in pruefungslist.js ? + $qry = "SELECT DISTINCT + lehrveranstaltung_id, uid, vorname, wahlname, vornamen, nachname, titelpre, titelpost, kurzbz, mitarbeiter_uid + FROM + lehre.tbl_lehreinheitmitarbeiter, campus.vw_mitarbeiter, lehre.tbl_lehreinheit + WHERE + lehrveranstaltung_id= ? + AND + mitarbeiter_uid=uid + AND + tbl_lehreinheitmitarbeiter.lehreinheit_id=tbl_lehreinheit.lehreinheit_id;"; + + $parametersArray = array($lehrveranstaltung_id); + + return $this->execQuery($qry, $parametersArray); + } } diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Pruefung.js b/public/js/components/Stv/Studentenverwaltung/Details/Pruefung.js index eb43e36be..e45f97240 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Pruefung.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Pruefung.js @@ -16,7 +16,7 @@ export default { template: `
- {{modelValue}} +
diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Pruefung/Pruefunglist.js b/public/js/components/Stv/Studentenverwaltung/Details/Pruefung/Pruefunglist.js index 6f034e087..006cc6218 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Pruefung/Pruefunglist.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Pruefung/Pruefunglist.js @@ -1,10 +1,12 @@ import {CoreFilterCmpt} from "../../../../filter/Filter.js"; import FormInput from "../../../../Form/Input.js"; +import BsModal from "../../../../Bootstrap/Modal.js"; export default{ components: { CoreFilterCmpt, - FormInput + FormInput, + BsModal }, inject: { defaultSemester: { @@ -26,40 +28,327 @@ export default{ {title: "Note", field: "note_bezeichnung"}, {title: "Anmerkung", field: "anmerkung"}, {title: "Typ", field: "pruefungstyp_kurzbz"}, - {title: "PruefungId", field: "pruefung_id", visible:false}, - {title: "LehreinheitId", field: "lehreinheit_id", visible:false}, - {title: "Student_uid", field: "student_uid", visible:false}, - {title: "Mitarbeiter_uid", field: "mitarbeiter_uid", visible:false}, - {title: "Punkte", field: "punkte", visible:false}, - ], + {title: "PruefungId", field: "pruefung_id", visible: false}, + {title: "LehreinheitId", field: "lehreinheit_id", visible: false}, + {title: "Student_uid", field: "student_uid", visible: false}, + {title: "LV_id", field: "lehrveranstaltung_id", visible: false}, //just for testing + {title: "Mitarbeiter_uid", field: "mitarbeiter_uid", visible: false}, + {title: "Punkte", field: "punkte", visible: false}, + { + title: 'Aktionen', field: 'actions', + minWidth: 150, + maxWidth: 150, + formatter: (cell, formatterParams, onRendered) => { + let container = document.createElement('div'); + container.className = "d-flex gap-2"; + + let button = document.createElement('button'); + button.className = 'btn btn-outline-secondary btn-action'; + button.innerHTML = ''; + button.title = 'neue Prüfung aus dieser LV erstellen'; + button.addEventListener( + 'click', + (event) => + this.actionNewFromOldPruefung(cell.getData().pruefung_id) + ); + container.append(button); + + button = document.createElement('button'); + button.className = 'btn btn-outline-secondary btn-action'; + button.innerHTML = ''; + button.title = 'Prüfung bearbeiten'; + button.addEventListener( + 'click', + (event) => + this.actionEditPruefung(cell.getData().pruefung_id) + ); + container.append(button); + + button = document.createElement('button'); + button.className = 'btn btn-outline-secondary btn-action'; + button.innerHTML = ''; + button.title = 'Prüfung löschen'; + button.addEventListener( + 'click', + () => + this.actionDeletePruefung(cell.getData().pruefung_id) + ); + container.append(button); + + return container; + }, + frozen: true + }], layout: 'fitDataFill', layoutColumnsOnNewData: false, height: 'auto', }, - tabulatorEvents: [{}], + tabulatorEvents: [ + { + event: 'tableBuilt', + handler: async () => { + await this.$p.loadCategory(['fristenmanagement', 'global', 'person', 'ui',]); + let cm = this.$refs.table.tabulator.columnManager; + + cm.getColumnByField('bezeichnung').component.updateDefinition({ + title: this.$p.t('global', 'typ') + }); + + cm.getColumnByField('anmerkung').component.updateDefinition({ + title: this.$p.t('global', 'anmerkung') + }); + } + } + ], pruefungData: {}, - filter: false + listTypesExam: [], + listLvsAndLes: [], + listLvsAndMas: [], + listLvs: [], //TODO(Manu) nachträglich sortieren + listLes: [], + listMas: [], //TODO(Manu) Filter statt SELECT DISTINCT + listMarks: [], + filter: false, + statusNew: true, + isStartDropDown: false + } + }, + computed:{ +/* lehrveranstaltungen(){ + return this.listLvsAndLes.filter((value, index, self) => { + return self.indexOf(value) === index; + }); + },*/ + lv_teile(){ + return this.listLvsAndLes.filter(lv => lv.lehrveranstaltung_id == this.pruefungData.lehrveranstaltung_id); + }, + lv_teile_ma(){ + return this.listLvsAndMas.filter(lv => lv.lehrveranstaltung_id == this.pruefungData.lehrveranstaltung_id); } }, - computed:{}, /* watch: { modelValue() { this.$refs.table.reloadTable(); } },*/ - methods:{ }, + methods:{ + loadPruefung(pruefung_id) { + return this.$fhcApi.get('api/frontend/v1/stv/pruefung/loadPruefung/' + pruefung_id) + .then(result => { + this.pruefungData = result.data; + return result; + }) + .catch(this.$fhcAlert.handleSystemError); + }, + actionNewPruefung(){ + this.statusNew = true; + this.isStartDropDown = true; + +/* this.getLvsByStudent(this.uid).then(() => { + this.$refs.pruefungModal.show(); + });*/ + + this.$refs.pruefungModal.show(); + // this.prepareDropdowns(); + // this.$refs.pruefungModal.show(); + + }, + actionNewFromOldPruefung(pruefung_id) { + this.statusNew = true; + this.isStartDropDown = false; + this.loadPruefung(pruefung_id).then(() => { + this.pruefungData.note_bezeichnung = 'Noch nicht eingetragen'; + this.pruefungData.datum = new Date(); + this.prepareDropdowns(); + + this.$refs.pruefungModal.show(); + }); + }, + actionEditPruefung(pruefung_id) { + this.statusNew = false; + this.isStartDropDown = false; + this.loadPruefung(pruefung_id).then(() => { + + this.prepareDropdowns(); + + this.$refs.pruefungModal.show(); + }); + }, + actionDeletePruefung(pruefung_id) { + console.log("action delete Prüfung" + pruefung_id); + this.loadPruefung(pruefung_id).then(() => { + if(this.pruefungData.pruefung_id) + + this.$fhcAlert + .confirmDelete() + .then(result => result + ? pruefung_id + : Promise.reject({handled: true})) + .then(this.deletePruefung) + .catch(this.$fhcAlert.handleSystemError); + + }); + }, + addPruefung(){ + this.$fhcApi.post('api/frontend/v1/stv/pruefung/insertPruefung/', + this.pruefungData + ).then(response => { + this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); + this.hideModal('pruefungModal'); + this.resetModal(); + }).catch(this.$fhcAlert.handleSystemError) + .finally(() => { + window.scrollTo(0, 0); + this.reload(); + }); + }, + updatePruefung(pruefung_id){ + console.log("update Prüfung" + pruefung_id); + this.$fhcApi.post('api/frontend/v1/stv/pruefung/updatePruefung/' + pruefung_id, + this.pruefungData + ).then(response => { + this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); + this.hideModal('pruefungModal'); + this.resetModal(); + }).catch(this.$fhcAlert.handleSystemError) + .finally(() => { + window.scrollTo(0, 0); + this.reload(); + }); + }, + deletePruefung(pruefung_id) { + this.$fhcApi.post('api/frontend/v1/stv/pruefung/deletePruefung/' + pruefung_id) + .then(response => { + this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successDelete')); + }).catch(this.$fhcAlert.handleSystemError) + .finally(()=> { + window.scrollTo(0, 0); + this.reload(); + }); + }, + hideModal(modalRef) { + this.$refs[modalRef].hide(); + }, + resetModal() { + this.pruefungData = {}; + +/* this.pruefungData.strasse = null; + this.pruefungData.zustellpruefunge = true; + this.pruefungData.heimatpruefunge = true; + this.pruefungData.rechnungspruefunge = false; + this.pruefungData.co_name = null; + this.pruefungData.firma_id = null; + this.pruefungData.name = null; + this.pruefungData.anmerkung = null; + this.pruefungData.typ = 'h'; + this.pruefungData.nation = 'A'; + this.pruefungData.plz = null;*/ + + this.statusNew = true; + }, + reload() { + this.$refs.table.reloadTable(); + }, + getLvsByStudent(student_uid){ + return this.$fhcApi.get('api/frontend/v1/stv/pruefung/getLvsByStudent/' + student_uid) + .then(result => { + this.listLvs = result.data; + }) + .catch(this.$fhcAlert.handleSystemError); + }, + getMaFromLv(lv_id){ + return this.$fhcApi.get('api/frontend/v1/stv/pruefung/getMitarbeiterLv/' + lv_id) + .then(result => { + this.listMas = result.data; + }) + .catch(this.$fhcAlert.handleSystemError); + }, + getLehreinheiten(lv_id, studiensemester_kurzbz) { + const data = { + lv_id: lv_id, + studiensemester_kurzbz: studiensemester_kurzbz + }; + + return this.$fhcApi.post('api/frontend/v1/stv/pruefung/getAllLehreinheiten/', data) + .then(response => { + this.listLes = response.data; + }) + .catch(this.$fhcAlert.handleSystemError); + }, + prepareDropdowns(){ + + // Get Lvs from Student +/* this.getLvsByStudent(this.pruefungData.student_uid).then(() => { + + }).catch(error => { + console.error('Error loading Lvs:', error); + });*/ + + + // Get Ma from Lv + this.getMaFromLv(this.pruefungData.lehrveranstaltung_id).then(() => { + }).catch(error => { + console.error('Error loading Ma data:', error); + }); + + // Get Lehreinheiten + this.getLehreinheiten(this.pruefungData.lehrveranstaltung_id, this.pruefungData.studiensemester_kurzbz).then(() => { + + }).catch(error => { + console.error('Error loading Lehreinheiten multiple:', error); + }); + + + + this.$refs.pruefungModal.show(); + } + }, + created(){ + this.$fhcApi.get('api/frontend/v1/stv/pruefung/getLvsByStudent/' + this.uid) + .then(result => { + this.listLvs = result.data; + }) + .catch(this.$fhcAlert.handleSystemError); + + this.$fhcApi.get('api/frontend/v1/stv/pruefung/getLvsandLesByStudent/' + this.uid) + .then(result => { + this.listLvsAndLes = result.data; + }) + .catch(this.$fhcAlert.handleSystemError); + + this.$fhcApi.get('api/frontend/v1/stv/pruefung/getLvsAndMas/' + this.uid) + .then(result => { + this.listLvsAndMas = result.data; + }) + .catch(this.$fhcAlert.handleSystemError); + + this.$fhcApi.get('api/frontend/v1/stv/pruefung/getTypenPruefungen') + .then(result => { + this.listTypesExam = result.data; + }) + .catch(this.$fhcAlert.handleSystemError); + + this.$fhcApi.get('api/frontend/v1/stv/pruefung/getNoten') + .then(result => { + this.listMarks = result.data; + }) + .catch(this.$fhcAlert.handleSystemError); + }, template: `
- + + aktuelles Sem: {{defaultSemester}} +
+
- - +
-
- -
- - -
- -
-

Form

+ + + +

Form

+ + + + + +
+ Details - aktuelles Sem: {{defaultSemester}} - -
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
` }; From 4d5ea1f519c68569ed504c8388988084688778cc Mon Sep 17 00:00:00 2001 From: ma0068 Date: Tue, 17 Sep 2024 15:28:18 +0200 Subject: [PATCH 3/9] adapt addNewPruefung, pruefungModal, function getLvsByStudent --- .../api/frontend/v1/stv/Pruefung.php | 17 ++- .../education/Lehrveranstaltung_model.php | 7 +- .../Details/Pruefung/Pruefunglist.js | 128 +++++++++++++++--- 3 files changed, 125 insertions(+), 27 deletions(-) diff --git a/application/controllers/api/frontend/v1/stv/Pruefung.php b/application/controllers/api/frontend/v1/stv/Pruefung.php index 9ddd22897..cdac93b4b 100644 --- a/application/controllers/api/frontend/v1/stv/Pruefung.php +++ b/application/controllers/api/frontend/v1/stv/Pruefung.php @@ -101,7 +101,7 @@ class Pruefung extends FHCAPI_Controller } public function insertPruefung(){ - //TODO(Manu) validations + //TODO(Manu) Berechtigungen $authUID = getAuthUID(); $lehreinheit_id = $this->input->post('lehreinheit_id'); @@ -112,6 +112,11 @@ class Pruefung extends FHCAPI_Controller $pruefungstyp_kurzbz = $this->input->post('pruefungstyp_kurzbz'); $anmerkung = $this->input->post('anmerkung'); + $this->load->library('form_validation'); + + $this->form_validation->set_rules( + 'datum', $this->p->t('global', 'datum'), ['is_valid_date'] + ); $result = $this->PruefungModel->insert([ 'lehreinheit_id' => $lehreinheit_id, @@ -132,7 +137,7 @@ class Pruefung extends FHCAPI_Controller } public function updatePruefung($pruefung_id){ - //TODO(Manu) validations + //TODO(Manu) validations and Berechtigungen $result = $this->PruefungModel->load($pruefung_id); $oldpruefung = $this->getDataOrTerminateWithError($result); @@ -280,11 +285,15 @@ class Pruefung extends FHCAPI_Controller return $this->terminateWithSuccess($allDataMa); } - public function getLvsByStudent($student_uid) + public function getLvsByStudent($student_uid, $studiensemester_kurzbz=null ) { + //bei post request +/* $student_uid = $this->input->post('student_uid'); + $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');*/ + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); - $result = $this->LehrveranstaltungModel->getLvsByStudent($student_uid); + $result = $this->LehrveranstaltungModel->getLvsByStudent($student_uid, $studiensemester_kurzbz); $data = $this->getDataOrTerminateWithError($result); diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php index cefd147b9..f343f2583 100644 --- a/application/models/education/Lehrveranstaltung_model.php +++ b/application/models/education/Lehrveranstaltung_model.php @@ -226,7 +226,7 @@ class Lehrveranstaltung_model extends DB_Model /** * Gets Lehrveranstaltungen of a student * @param $student_uid - * @param null $studiensemester_kurzbz + * @param $studiensemester_kurzbz * @return array|null */ public function getLvsByStudent($student_uid, $studiensemester_kurzbz = null) @@ -236,6 +236,7 @@ class Lehrveranstaltung_model extends DB_Model $qry = "SELECT * FROM lehre.tbl_lehrveranstaltung WHERE lehrveranstaltung_id IN(SELECT lehrveranstaltung_id FROM campus.vw_student_lehrveranstaltung WHERE uid=?"; + if (isset($studiensemester_kurzbz)) { $qry .= " AND studiensemester_kurzbz=?"; @@ -243,11 +244,11 @@ class Lehrveranstaltung_model extends DB_Model } $qry .= ") OR lehrveranstaltung_id IN(SELECT lehrveranstaltung_id FROM lehre.tbl_zeugnisnote WHERE student_uid=?"; $params[] = $student_uid; - if (isset($studiensemester_kurzbz)) +/* if (isset($studiensemester_kurzbz)) { $qry .= " AND studiensemester_kurzbz=?"; $params[] = $studiensemester_kurzbz; - } + }*/ $qry .= ") ORDER BY semester, bezeichnung"; return $this->execQuery($qry, $params); diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Pruefung/Pruefunglist.js b/public/js/components/Stv/Studentenverwaltung/Details/Pruefung/Pruefunglist.js index 006cc6218..31f709e26 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Pruefung/Pruefunglist.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Pruefung/Pruefunglist.js @@ -12,6 +12,10 @@ export default{ defaultSemester: { from: 'defaultSemester', }, +/* $reloadList: { + from: '$reloadList', + required: true + }*/ }, props: { uid: Number @@ -26,6 +30,7 @@ export default{ {title: "Datum", field: "format_datum"}, {title: "Lehrveranstaltung", field: "lehrveranstaltung_bezeichnung"}, {title: "Note", field: "note_bezeichnung"}, + {title: "StudSem", field: "studiensemester_kurzbz"}, //just testing {title: "Anmerkung", field: "anmerkung"}, {title: "Typ", field: "pruefungstyp_kurzbz"}, {title: "PruefungId", field: "pruefung_id", visible: false}, @@ -110,7 +115,10 @@ export default{ listMarks: [], filter: false, statusNew: true, - isStartDropDown: false + isStartDropDown: false, + currentSemester: false, + // componentKey: 0, + isFilterSet: false, } }, computed:{ @@ -124,13 +132,31 @@ export default{ }, lv_teile_ma(){ return this.listLvsAndMas.filter(lv => lv.lehrveranstaltung_id == this.pruefungData.lehrveranstaltung_id); - } + }, + semester_intern: { + get() { + if (this.currentSemester) + return this.currentSemester; + else + return false; + }, + set(value) { + this.currentSemester = value; + } + }, }, -/* watch: { + watch: { +/* defaultSemester(newVal, oldVal) { + if (newVal !== oldVal) { + console.log("variable did change"); + //this.reload(); // Methode aufrufen, um die Komponente neu zu laden + this.componentKey += 1; + } + }, modelValue() { this.$refs.table.reloadTable(); - } - },*/ + }*/ + }, methods:{ loadPruefung(pruefung_id) { return this.$fhcApi.get('api/frontend/v1/stv/pruefung/loadPruefung/' + pruefung_id) @@ -143,6 +169,7 @@ export default{ actionNewPruefung(){ this.statusNew = true; this.isStartDropDown = true; + this.resetModal(); /* this.getLvsByStudent(this.uid).then(() => { this.$refs.pruefungModal.show(); @@ -157,8 +184,9 @@ export default{ this.statusNew = true; this.isStartDropDown = false; this.loadPruefung(pruefung_id).then(() => { - this.pruefungData.note_bezeichnung = 'Noch nicht eingetragen'; + this.pruefungData.note = 9; this.pruefungData.datum = new Date(); + this.pruefungData.pruefungstyp_kurzbz = null; this.prepareDropdowns(); this.$refs.pruefungModal.show(); @@ -249,6 +277,16 @@ export default{ reload() { this.$refs.table.reloadTable(); }, +/* setFilter(semester) { + if (semester == 'open') + window.localStorage.setItem(LOCAL_STORAGE_ID_FILTER, this.filter ? 1 : 0); + else if( semester == 'default_semester') + this.$fhcApi.factory + .stv.filter.setSemester(this.defaultSemester) + .catch(this.$fhcAlert.handleSystemError); + + this.$nextTick(this.$refs.table.reloadTable); + },*/ getLvsByStudent(student_uid){ return this.$fhcApi.get('api/frontend/v1/stv/pruefung/getLvsByStudent/' + student_uid) .then(result => { @@ -256,6 +294,18 @@ export default{ }) .catch(this.$fhcAlert.handleSystemError); }, +/* //version post request +getLvsByStudent(student_uid, studiensemester_kurzbz){ + const data = { + student_uid: student_uid, + studiensemester_kurzbz: studiensemester_kurzbz + }; + return this.$fhcApi.post('api/frontend/v1/stv/pruefung/getLvsByStudent/', data) + .then(result => { + this.listLvs = result.data; + }) + .catch(this.$fhcAlert.handleSystemError); + },*/ getMaFromLv(lv_id){ return this.$fhcApi.get('api/frontend/v1/stv/pruefung/getMitarbeiterLv/' + lv_id) .then(result => { @@ -301,7 +351,17 @@ export default{ this.$refs.pruefungModal.show(); - } + }, + onSwitchChange() { + if (this.isFilterSet) { + console.log('filter gesetzt: ' + this.defaultSemester + ' uid ' + this.uid); + this.$refs.table.setFilter("studiensemester_kurzbz", "=", this.defaultSemester); + //TODO(Manu) TypeError: this.$refs.table.setFilter is not a function + + } else { + console.log('Alle anzeigen'); + } + }, }, created(){ this.$fhcApi.get('api/frontend/v1/stv/pruefung/getLvsByStudent/' + this.uid) @@ -337,19 +397,41 @@ export default{ template: `
- aktuelles Sem: {{defaultSemester}} + + + aktuelles Sem: {{defaultSemester}}
+ current Sem: {{currentSemester}}
+
+ + + +
- - - -
+ Details @@ -429,8 +435,8 @@ export default{ @@ -466,8 +472,8 @@ export default{ @@ -530,7 +536,7 @@ export default{ rows="4" > - +