diff --git a/application/controllers/lehre/Pruefungsprotokoll.php b/application/controllers/lehre/Pruefungsprotokoll.php new file mode 100644 index 000000000..594d3a9e1 --- /dev/null +++ b/application/controllers/lehre/Pruefungsprotokoll.php @@ -0,0 +1,223 @@ + 'lehre/pruefungsbeurteilung:r', + 'Protokoll' => 'lehre/pruefungsbeurteilung:r', + 'saveProtokoll' => 'lehre/pruefungsbeurteilung:rw', + ) + ); + + // Load models + $this->load->model('education/Abschlusspruefung_model', 'AbschlusspruefungModel'); + $this->load->model('education/Abschlussbeurteilung_model', 'AbschlussbeurteilungModel'); + + $this->load->library('PermissionLib'); + $this->load->library('AuthLib'); + + // Load language phrases + $this->loadPhrases( + array( + 'ui', + 'global', + 'person', + 'abschlusspruefung', + 'password', + 'lehre' + ) + ); + + $this->_setAuthUID(); // sets property uid + + $this->setControllerId(); // sets the controller id + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + public function index() + { + $this->load->library('WidgetLib'); + $this->load->view('lehre/pruefungsprotokollUebersicht.php'); + } + + /** + * Show Pruefungsprotokoll. + */ + public function Protokoll() + { + $abschlusspruefung_id = $this->input->get('abschlusspruefung_id'); + + if (!is_numeric($abschlusspruefung_id)) + show_error('invalid abschlusspruefung'); + + $abschlusspruefung_saved = false; + $abschlusspruefung = $this->_getAbschlusspruefungBerechtigt($abschlusspruefung_id); + + if (isError($abschlusspruefung)) + show_error(getError($abschlusspruefung)); + else + { + $abschlusspruefung = getData($abschlusspruefung); + $abschlusspruefung_saved = isset($abschlusspruefung->protokoll) && isset($abschlusspruefung->abschlussbeurteilung_kurzbz); + } + + $this->AbschlussbeurteilungModel->addOrder("sort", "ASC"); + $this->AbschlussbeurteilungModel->addOrder("(CASE WHEN abschlussbeurteilung_kurzbz = 'ausgezeichnet' THEN 1 + WHEN abschlussbeurteilung_kurzbz = 'gut' THEN 2 + WHEN abschlussbeurteilung_kurzbz = 'bestanden' THEN 3 + WHEN abschlussbeurteilung_kurzbz = 'angerechnet' THEN 4 + ELSE 5 + END + )"); + $abschlussbeurteilung = $this->AbschlussbeurteilungModel->load(); + + if (isError($abschlussbeurteilung)) + show_error(getError($abschlussbeurteilung)); + else + $abschlussbeurteilung = getData($abschlussbeurteilung); + + $language = getUserLanguage(); + + $data = array( + 'abschlusspruefung' => $abschlusspruefung, + 'abschlussbeurteilung' => $abschlussbeurteilung, + 'abschlusspruefung_saved' => $abschlusspruefung_saved, + 'language' => $language + ); + + $this->load->view('lehre/pruefungsprotokoll.php', $data); + } + + /** + * Save Pruefungsprotokoll (including possible Freigabe) + */ + public function saveProtokoll() + { + $abschlusspruefung_id = $this->input->post('abschlusspruefung_id'); + $data = $this->input->post('protocoldata'); + + if (isset($abschlusspruefung_id) && is_numeric($abschlusspruefung_id) && isset($data)) + { + // check permission + $berechtigt = $this->_getAbschlusspruefungBerechtigt($abschlusspruefung_id); + if (isError($berechtigt)) + $this->outputJsonError(getError($berechtigt)); + else + { + $freigabe = isset($data['freigabedatum']) && $data['freigabedatum']; + + if ($freigabe) + { + // Verify password + $password = $data['password']; + unset($data['password']); + if (!isEmptyString($password)) + { + $result = $this->authlib->checkUserAuthByUsernamePassword($this->_uid, $password); + if (isError($result)) + { + return $this->outputJsonError($this->p->t('password', 'wrongPassword')); // exit if password is incorrect + } + } + else + { + return $this->outputJsonError($this->p->t('password', 'passwordMissing')); + } + } + + $data = $this->_prepareAbschlusspruefungDataForSave($data); + $result = $this->AbschlusspruefungModel->update($abschlusspruefung_id, $data); + + if (hasData($result)) + { + $abschlusspruefung_id = getData($result); + $updateresult = array('abschlusspruefung_id' => $abschlusspruefung_id); + if ($freigabe) + $updateresult['freigabedatum'] = date_format(date_create($data['freigabedatum']), 'd.m.Y'); + + $this->outputJsonSuccess($updateresult); + } + else + $this->outputJsonError('Fehler beim Speichern des Prüfungsprotokolls'); + } + } + else + $this->outputJsonError($this->p->t('ui', 'ungueltigeParameter')); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Private methods + + /** + * Retrieve the UID of the logged user and checks if it is valid + */ + private function _setAuthUID() + { + $this->_uid = getAuthUID(); + + if (!$this->_uid) show_error('User authentification failed'); + } + + /** + * Retrieves an Abschlussprüfung, with permission check + * permission: admin, assistance of study programe or Vorsitz of the Prüfung + * @param $abschlusspruefung_id + * @return object success or error + */ + private function _getAbschlusspruefungBerechtigt($abschlusspruefung_id) + { + $result = error('Error when getting Abschlusspruefung'); + + if (isset($this->_uid)) + { + $abschlusspruefung = $this->AbschlusspruefungModel->getAbschlusspruefung($abschlusspruefung_id); + + if (hasData($abschlusspruefung)) + { + $abschlusspruefung_data = getData($abschlusspruefung); + if ($this->permissionlib->isBerechtigt('admin') || + (isset($abschlusspruefung_data->studiengang_kz) && $this->permissionlib->isBerechtigt('assistenz', 'suid', $abschlusspruefung_data->studiengang_kz)) + || $this->_uid === $abschlusspruefung_data->uid_vorsitz) + $result = $abschlusspruefung; + else + $result = error('Permission denied'); + } + } + + return $result; + } + + /** + * Prepares Abschlussprüfung for save in database, replaces '' with null, sets Freigabedatum + * @param $data + * @return array + */ + private function _prepareAbschlusspruefungDataForSave($data) + { + $nullfields = array('uhrzeit', 'endezeit', 'abschlussbeurteilung_kurzbz', 'protokoll'); + foreach ($data as $idx => $item) + { + if (in_array($idx, $nullfields) & $item === '') + $data[$idx] = null; + } + + if (isset($data['freigabedatum']) && $data['freigabedatum']) + $data['freigabedatum'] = date('Y-m-d'); + + return $data; + } +} diff --git a/application/models/education/Abschlusspruefung_model.php b/application/models/education/Abschlusspruefung_model.php index aef5f67c3..2762496f9 100644 --- a/application/models/education/Abschlusspruefung_model.php +++ b/application/models/education/Abschlusspruefung_model.php @@ -11,4 +11,93 @@ class Abschlusspruefung_model extends DB_Model $this->dbTable = 'lehre.tbl_abschlusspruefung'; $this->pk = 'abschlusspruefung_id'; } + + /** + * Gets data of an Abschlusspruefung, including Abschlussarbeit. + * @param $abschlusspruefung_id + * @return object + */ + public function getAbschlusspruefung($abschlusspruefung_id) + { + $this->load->model('crm/Student_model', 'StudentModel'); + $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + + $abschlusspruefungdata = array(); + + $this->addSelect('tbl_abschlusspruefung.abschlusspruefung_id, tbl_abschlusspruefung.datum, tbl_abschlusspruefung.abschlussbeurteilung_kurzbz, tbl_abschlusspruefung.uhrzeit AS pruefungsbeginn, tbl_abschlusspruefung.endezeit AS pruefungsende, + tbl_abschlusspruefung.freigabedatum, tbl_abschlusspruefung_antritt.bezeichnung AS pruefungsantritt_bezeichnung, tbl_abschlusspruefung_antritt.bezeichnung_english AS pruefungsantritt_bezeichnung_english, tbl_abschlusspruefung.protokoll, + studentpers.vorname AS vorname_student, studentpers.nachname AS nachname_student, studentpers.titelpre AS titelpre_student, studentpers.titelpost AS titelpost_student, studentben.uid AS uid_student, matrikelnr, + vorsitzenderben.uid AS uid_vorsitz, vorsitzenderpers.vorname AS vorname_vorsitz, vorsitzenderpers.nachname AS nachname_vorsitz, vorsitzenderpers.titelpre AS titelpre_vorsitz, vorsitzenderpers.titelpost AS titelpost_vorsitz, + erstprueferpers.vorname AS vorname_erstpruefer, erstprueferpers.nachname AS nachname_erstpruefer, erstprueferpers.titelpre AS titelpre_erstpruefer, erstprueferpers.titelpost AS titelpost_erstpruefer, + zweitprueferpers.vorname AS vorname_zweitpruefer, zweitprueferpers.nachname AS nachname_zweitpruefer, zweitprueferpers.titelpre AS titelpre_zweitpruefer, zweitprueferpers.titelpost AS titelpost_zweitpruefer + '); + $this->addJoin('lehre.tbl_abschlusspruefung_antritt', 'pruefungsantritt_kurzbz', 'LEFT'); + $this->addJoin('public.tbl_benutzer studentben', 'tbl_abschlusspruefung.student_uid = studentben.uid'); + $this->addJoin('public.tbl_person studentpers', 'studentben.person_id = studentpers.person_id'); + $this->addJoin('public.tbl_student', 'studentben.uid = tbl_student.student_uid'); + $this->addJoin('public.tbl_benutzer vorsitzenderben', 'vorsitz = vorsitzenderben.uid', 'LEFT'); + $this->addJoin('public.tbl_person vorsitzenderpers', 'vorsitzenderben.person_id = vorsitzenderpers.person_id', 'LEFT'); + $this->addJoin('public.tbl_person erstprueferpers', 'pruefer1 = erstprueferpers.person_id', 'LEFT'); + $this->addJoin('public.tbl_person zweitprueferpers', 'pruefer2 = zweitprueferpers.person_id', 'LEFT'); + + $abschlusspruefung = $this->load($abschlusspruefung_id); + + if (isError($abschlusspruefung)) + return $abschlusspruefung; + elseif (hasData($abschlusspruefung)) + { + $abschlusspruefungdata = getData($abschlusspruefung)[0]; + + // get Studiengang of Student + $student_uid = $abschlusspruefungdata->uid_student; + $this->StudentModel->addSelect('prestudent_id'); + $prestudent_id = $this->StudentModel->load(array('student_uid' => $student_uid)); + + if (isError($prestudent_id)) + return $prestudent_id; + elseif (hasData($prestudent_id)) + { + //get Studiengangname from Studienplan and -ordnung + $studienordnung = $this->PrestudentstatusModel->getStudienordnungFromPrestudent(getData($prestudent_id)[0]->prestudent_id); + + if (isError($studienordnung)) + return $studienordnung; + elseif (hasData($studienordnung)) + { + $studienordnungdata = getData($studienordnung)[0]; + + $abschlusspruefungdata->studiengang_kz = $studienordnungdata->studiengang_kz; + $abschlusspruefungdata->studiengangbezeichnung = $studienordnungdata->studiengangbezeichnung; + $abschlusspruefungdata->studiengangbezeichnung_englisch = $studienordnungdata->studiengangbezeichnung_englisch; + + $this->StudiengangModel->addSelect('typ'); + $typ = $this->StudiengangModel->load($studienordnungdata->studiengang_kz); + if (isError($typ)) + return $typ; + elseif (hasData($typ)) + { + $abschlusspruefungdata->studiengangstyp = getData($typ)[0]->typ; + } + + // get Abschlussarbeit + $projekttyp = array('Bachelor','Diplom','Master','Dissertation','Lizenziat','Magister'); + $abschlussarbeit = $this->ProjektarbeitModel->getProjektarbeit($student_uid, $studienordnungdata->studiengang_kz, null, $projekttyp, true); + + if (isError($abschlussarbeit)) + return $abschlussarbeit; + if (hasData($abschlussarbeit)) + { + $abschlussarbeit = getData($abschlussarbeit)[0]; + $abschlusspruefungdata->projektarbeit_studiengangstyp_name = $abschlussarbeit->projekttyp_kurzbz; + $abschlusspruefungdata->abschlussarbeit_titel = $abschlussarbeit->titel; + $abschlusspruefungdata->abschlussarbeit_note = $abschlussarbeit->note; + } + } + } + } + + return success($abschlusspruefungdata); + } } diff --git a/application/models/education/Projektarbeit_model.php b/application/models/education/Projektarbeit_model.php index e5652d6ff..109e23373 100644 --- a/application/models/education/Projektarbeit_model.php +++ b/application/models/education/Projektarbeit_model.php @@ -11,4 +11,62 @@ class Projektarbeit_model extends DB_Model $this->dbTable = 'lehre.tbl_projektarbeit'; $this->pk = 'projektarbeit_id'; } + + /** + * Gets Projektarbeit(en) of a student for a Studiengang, Semester, Projekttyp, final. + * @param $student_uid + * @param $studiengang_kz + * @param $studiensemester_kurzbz + * @param $projekttyp + * @param $final + * @return object + */ + public function getProjektarbeit($student_uid, $studiengang_kz = null, $studiensemester_kurzbz = null, $projekttyp = null, $final = null) + { + $qry = "SELECT + tbl_projektarbeit.* , tbl_projekttyp.bezeichnung + FROM + lehre.tbl_projektarbeit + JOIN + lehre.tbl_projekttyp USING (projekttyp_kurzbz), lehre.tbl_lehreinheit, lehre.tbl_lehrveranstaltung + + WHERE + tbl_projektarbeit.lehreinheit_id=tbl_lehreinheit.lehreinheit_id AND + tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id AND + tbl_projektarbeit.student_uid = ?"; + + $params = array($student_uid); + + if (isset($studiengang_kz)) + { + $qry .= ' AND tbl_lehrveranstaltung.studiengang_kz=?'; + $params[] = $studiengang_kz; + } + + if (isset($studiensemester_kurzbz)) + { + $qry .= ' AND tbl_lehreinheit.studiensemester_kurzbz=?'; + $params[] = $studiensemester_kurzbz; + } + + if (isset($projekttyp)) + { + if (is_array($projekttyp)) + $qry .= ' AND tbl_projektarbeit.projekttyp_kurzbz IN ?'; + else + $qry .= ' AND tbl_projektarbeit.projekttyp_kurzbz=?'; + + $params[] = $projekttyp; + } + + if (isset($final)) + { + $qry .= ' AND tbl_projektarbeit.final=?'; + $params[] = $final; + } + + $qry .= ' ORDER BY beginn DESC, projektarbeit_id DESC'; + + return $this->execQuery($qry, $params); + } } diff --git a/application/views/lehre/pruefungsprotokoll.php b/application/views/lehre/pruefungsprotokoll.php new file mode 100644 index 000000000..7a06f3286 --- /dev/null +++ b/application/views/lehre/pruefungsprotokoll.php @@ -0,0 +1,232 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => 'Pruefungsprotokoll', + 'jquery' => true, + 'jqueryui' => true, + 'bootstrap' => true, + 'fontawesome' => true, + 'dialoglib' => true, + 'ajaxlib' => true, + 'sbadmintemplate' => true, + 'phrases' => array( + 'abschlusspruefung' => array( + 'freigegebenAm', + 'pruefungGespeichert', + 'pruefungSpeichernFehler', + 'abschlussbeurteilungLeer', + 'beginnzeitLeer', + 'beginnzeitFormatError', + 'endezeitLeer', + 'endezeitFormatError', + 'endezeitBeforeError', + 'verfNotice' + ), + 'ui' => array( + 'stunde', + 'minute' + ) + ), + 'customCSSs' => array( + 'public/css/sbadmin2/admintemplate_contentonly.css', + 'vendor/fgelinas/timepicker/jquery.ui.timepicker.css', + 'public/css/lehre/pruefungsprotokoll.css' + ), + 'customJSs' => array( + 'vendor/fgelinas/timepicker/jquery.ui.timepicker.js', + 'public/js/lehre/pruefungsprotokoll.js' + ) + ) +); +?> +
++ studiengangstyp == 'b' ? $this->p->t('abschlusspruefung', 'abgehaltenAmBachelor') : $this->p->t('abschlusspruefung', 'abgehaltenAmMaster'); ?> + studiengangbezeichnung : $abschlusspruefung->studiengangbezeichnung_englisch ?>, p->t('abschlusspruefung', 'studiengangskennzahl') ?> + studiengang_kz ?> +
+p->t('abschlusspruefung', 'personenkennzeichen') ?>: matrikelnr ?>
++ freigabedatum); ?> + +
+