diff --git a/application/controllers/lehre/anrechnung/RequestAnrechnung.php b/application/controllers/lehre/anrechnung/RequestAnrechnung.php new file mode 100644 index 000000000..ed09b131a --- /dev/null +++ b/application/controllers/lehre/anrechnung/RequestAnrechnung.php @@ -0,0 +1,302 @@ + 'student/anrechnung_beantragen:rw', + 'apply' => 'student/anrechnung_beantragen:rw', + 'download' => 'student/anrechnung_beantragen:rw', + ) + ); + + // Load models + $this->load->model('education/Anrechnung_model', 'AnrechnungModel'); + $this->load->model('content/DmsVersion_model', 'DmsVersionModel'); + + // Load libraries + $this->load->library('WidgetLib'); + $this->load->library('PermissionLib'); + $this->load->library('AnrechnungLib'); + $this->load->library('DmsLib'); + + // Load helpers + $this->load->helper('form'); + $this->load->helper('url'); + $this->load->helper('hlp_sancho_helper'); + + // Load language phrases + $this->loadPhrases( + array( + 'global', + 'ui', + 'anrechnung', + 'person', + 'lehre' + ) + ); + + $this->_setAuthUID(); + + $this->setControllerId(); + } + + public function index() + { + $studiensemester_kurzbz = $this->input->get('studiensemester'); + $lehrveranstaltung_id = $this->input->get('lv_id'); + + if (!is_numeric($lehrveranstaltung_id) || !is_string($studiensemester_kurzbz)) + { + show_error('Missing correct parameter'); + } + + // Check if application deadline is expired + // $is_expired = $this->_checkAntragDeadline($studiensemester_kurzbz); + $is_expired = false; // Set to false until Deadline is defined + + // Get Anrechung data + $result = $this->anrechnunglib->getAnrechnungDataByLv($lehrveranstaltung_id); + if (!$anrechnungData = getData($result)) + { + show_error(getError($anrechnungData)); + } + + // Overwrite progress status for student view. If no Anrechnung exists yet, set to new. + $anrechnungData->status = empty($anrechnungData->status) + ? getUserLanguage() == 'German' ? 'neu' : 'new' + : $this->_getLastAnrechnungstatus($anrechnungData->anrechnung_id); + + $viewData = array( + 'antragData' => $this->anrechnunglib->getAntragData($this->_uid, $studiensemester_kurzbz, $lehrveranstaltung_id), + 'anrechnungData' => $anrechnungData, + 'is_expired' => $is_expired, + 'disabled' => $is_expired && empty($anrechnungData->anrechnung_id) || !empty($anrechnungData->anrechnung_id) + ? 'disabled' + : '' + ); + + $this->load->view('lehre/anrechnung/requestAnrechnung.php', $viewData); + } + + public function apply() + { + $anmerkung = $this->input->post('anmerkung'); + $begruendung_id = $this->input->post('begruendung'); + $lehrveranstaltung_id = $this->input->post('lv_id'); + $studiensemester_kurzbz = $this->input->post('studiensemester'); + + if (empty($_FILES['uploadfile']['name'])) + { + show_error('Missing upload file'); + } + + if (!is_numeric($begruendung_id) || !is_numeric($lehrveranstaltung_id) || !is_string($studiensemester_kurzbz)) + { + show_error('Missing correct parameter'); + } + + $result = $this->_getAnrechnung($lehrveranstaltung_id); + if (hasData($result)) + { + show_error('Der Antrag wurde bereits gestellt'); + } + + // Start DB transaction + $this->db->trans_start(false); + + // Upload document + $dms = array( + 'kategorie_kurzbz' => 'anrechnung', + 'version' => 0, + 'name' => $_FILES['uploadfile']['name'], + 'mimetype' => $_FILES['uploadfile']['type'], + 'insertamum' => (new DateTime())->format('Y-m-d H:i:s'), + 'insertvon' => $this->_uid + ); + + if(isError($uploaddata = $this->dmslib->upload($dms, array('jpg', 'pdf')))) + { + show_error(getError($uploaddata)); + } + + // Get PrestudentID + $result = $this->_loadPrestudent($this->_uid, $studiensemester_kurzbz); + + if (!$prestudent = getData($result)[0]) + { + show_error('Failed retrieving prestudent'); + } + + // Save Anrechnung with Status 'inProgressSTGL' + $result = $this->AnrechnungModel->insert(array( + 'prestudent_id' => $prestudent->prestudent_id, + 'lehrveranstaltung_id' => $lehrveranstaltung_id, + 'begruendung_id' => $begruendung_id, + 'dms_id' => $uploaddata->retval['dms_id'], + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'anmerkung_student' => $anmerkung + )); + + if (isError($result)) + { + show_error('Failed inserting Anrechnung'); + } + + $result = $this->AnrechnungModel->saveAnrechnungstatus($result->retval, self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL); + + if (isError($result)) + { + show_error('Failed saving Anrechnungstatus'); + } + + // Transaction complete! + $this->db->trans_complete(); + + if ($this->db->trans_status() === false || isError($result)) + { + $this->db->trans_rollback(); + show_error($result->msg, EXIT_ERROR); + } + + // Send mail to STGL + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $studiengang = $this->StudiengangModel->load($prestudent->studiengang_kz); + + // Send mail + $this->load->library('MailLib'); + if(!$this->maillib->send( + "noreply@". DOMAIN, + $studiengang->retval[0]->email, + 'Neuer LV-Anrechnungsantrag', + 'Eine neuer LV Anrechnungsantrag steht zur Prüfung bereit.')) + { + show_error('Failed sending email to STGL'); + } + else + { + redirect(site_url(). self::REQUEST_ANRECHNUNG_URI. '?studiensemester='. $studiensemester_kurzbz. '&lv_id='. $lehrveranstaltung_id); + } + } + + /** + * Download and open uploaded document (Nachweisdokument). + */ + public function download() + { + $dms_id = $this->input->get('dms_id'); + + if (!is_numeric($dms_id)) + { + show_error('Wrong parameter'); + } + + $this->dmslib->download($dms_id); + } + + /** + * 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'); + } + + /** + * Load Prestudent by uid and Studiensemester. + * @param $uid + * @param $studiensemester_kurzbz + * @return mixed + */ + private function _loadPrestudent($uid, $studiensemester_kurzbz) + { + $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + $this->load->model('crm/Student_model', 'StudentModel'); + + $this->PrestudentstatusModel->addJoin('public.tbl_student', 'prestudent_id'); + return $this->PrestudentstatusModel->loadWhere(array( + 'student_uid' => $uid, + 'studiensemester_kurzbz' => $studiensemester_kurzbz + ) + ); + } + + /** + * Check if application deadline is expired. + * @param $studiensemester_kurzbz + * @return bool True if semester start is more then 1 week ago + * @throws Exception + */ + private function _checkAntragDeadline($studiensemester_kurzbz) + { + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $this->StudiensemesterModel->addSelect('start'); + if (!$start = getData($this->StudiensemesterModel->load($studiensemester_kurzbz))) + { + show_error(getError($start)); + } + + $start = new DateTime($start[0]->start); + $today = new DateTime('today midnight'); + + // True if today > application deadline + return ($today > $start->add((new DateInterval(self::DEADLINE_INTERVAL_NACH_SEMESTERSTART)))); + } + + /** + * Get Anrechnung by Lehrveranstaltung + * @param $lehrveranstaltung_id + * @return mixed + */ + private function _getAnrechnung($lehrveranstaltung_id) + { + $result = $this->AnrechnungModel->loadWhere(array( + 'lehrveranstaltung_id' => $lehrveranstaltung_id + )); + + if (isError($result)) + { + show_error(getError($result)); + } + + return $result; + } + + /** + * Get last Anrechnungstatus. Modify progress status for student view. + * @param $anrechnung_id + * @return string + */ + private function _getLastAnrechnungstatus($anrechnung_id) + { + $result = $this->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id); + $status_kurzbz = getData($result)[0]->status_kurzbz; + + // Dont show who is progressing the application + if ($status_kurzbz == 'inProgressDP' || $status_kurzbz == 'inProgressKF') + { + return getUserLanguage() == 'German' ? 'in Bearbeitung' : 'in process'; + } + else + { + $status_mehrsprachig = getData($result)[0]->bezeichnung_mehrsprachig; + return getUserLanguage() == 'German' ? $status_mehrsprachig[0] : $status_mehrsprachig[1]; + } + } +} \ No newline at end of file diff --git a/application/libraries/AnrechnungLib.php b/application/libraries/AnrechnungLib.php new file mode 100644 index 000000000..4a8f0f962 --- /dev/null +++ b/application/libraries/AnrechnungLib.php @@ -0,0 +1,179 @@ +ci =& get_instance(); + + $this->ci->load->model('education/Anrechnung_model', 'AnrechnungModel'); + $this->ci->load->model('person/Person_model', 'PersonModel'); + $this->ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $this->ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $this->ci->load->model('content/DmsVersion_model', 'DmsVersionModel'); + } + + /** + * Get Antrag data + * @param $uid + * @param $studiensemester_kurzbz + * @param $lv_id + * @return StdClass + */ + public function getAntragData($uid, $studiensemester_kurzbz, $lv_id) + { + $antrag_data = new StdClass(); + + // Get lehrveranstaltung data. Break, if course is not assigned to student. + if(!$lv = getData($this->ci->LehrveranstaltungModel->getLvByStudent($uid, $studiensemester_kurzbz, $lv_id))[0]) + { + show_error('You are not assigned to this course yet.'); + } + + // Get the students personal data + if (!$person = getData($this->ci->PersonModel->getByUid($uid))[0]) + { + show_error('Failed loading person data.'); + } + + // Get studiengang bezeichnung + if (!$studiengang = getData($this->ci->StudiengangModel->load($lv->studiengang_kz))[0]) + { + show_error('Failed loading studiengang data.'); + } + + // Get lectors of lehrveranstaltung + $antrag_data->lektoren = array(); + if (!$lv_lektoren = getData($this->ci->LehrveranstaltungModel->getLecturersByLv($studiensemester_kurzbz, $lv_id))) + { + show_error('Failed loading course lectors.'); + } + + // Set the given studiensemester + $antrag_data->lv_id = $lv_id; + $antrag_data->lv_bezeichnung = $lv->bezeichnung; + $antrag_data->ects = $lv->ects; + $antrag_data->studiensemester_kurzbz = $studiensemester_kurzbz; + $antrag_data->vorname = $person->vorname; + $antrag_data->nachname = $person->nachname; +// $antrag_data->bpk = $person->bpk; + $antrag_data->bpk = $person->matr_nr; + $antrag_data->stg_bezeichnung = $studiengang->bezeichnung; + $antrag_data->lektoren = $lv_lektoren; + + return $antrag_data; + } + + /** + * Get Anrechnung data, last status and Nachweisdokument dms data. + * @param $anrechnung_id + * @return array + * @throws Exception + */ + public function getAnrechnungData($anrechnung_id) + { + if (!is_numeric($anrechnung_id)) + { + show_error('Incorrect parameter'); + } + + $anrechnung_data = new StdClass(); + + $result = $this->ci->AnrechnungModel->load($anrechnung_id); + + if (isError($result)) + { + show_error(getError($result)); + } + + if ($anrechnung = getData($result)[0]) + { + $anrechnung_data = $this->_setAnrechnungDataObject($anrechnung); + } + + return success($anrechnung_data); + + } + + /** + * Get Anrechnung data by Lehrveranstaltung. Also retrieves last status and Nachweisdokument dms data. + * @param $lehrveranstaltung_id + * @return array + * @throws Exception + */ + public function getAnrechnungDataByLv($lehrveranstaltung_id) + { + $anrechnung_data = new StdClass(); + $anrechnung_data->anrechnung_id = ''; + $anrechnung_data->begruendung_id = ''; + $anrechnung_data->anmerkung = ''; + $anrechnung_data->dms_id = ''; + $anrechnung_data->insertamum = ''; + $anrechnung_data->insertvon = ''; + $anrechnung_data->studiensemester_kurzbz = ''; + $anrechnung_data->empfehlung = ''; + $anrechnung_data->status = ''; + $anrechnung_data->dokumentname = ''; + + $result = $this->ci->AnrechnungModel->loadWhere(array('lehrveranstaltung_id' => $lehrveranstaltung_id)); + + if (isError($result)) + { + show_error(getError($result)); + } + + if ($anrechnung = getData($result)[0]) + { + $anrechnung_data = $this->_setAnrechnungDataObject($anrechnung); + } + + return success($anrechnung_data); + } + + /** + * @param $anrechnung_id + * @return mixed + */ + public function getLastAnrechnungstatus($anrechnung_id) + { + $result = $this->ci->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id); + + $status_mehrsprachig = getData($result)[0]->bezeichnung_mehrsprachig; + $status = getUserLanguage() == 'German' ? $status_mehrsprachig[0] : $status_mehrsprachig[1]; + + return $status; + } + + private function _setAnrechnungDataObject($anrechnung) + { + $anrechnung_data = new StdClass(); + + // Get Anrechnung data + $anrechnung_data->anrechnung_id = $anrechnung->anrechnung_id; + $anrechnung_data->begruendung_id = $anrechnung->begruendung_id; + $anrechnung_data->anmerkung = $anrechnung->anmerkung_student; + $anrechnung_data->dms_id = $anrechnung->dms_id; + $anrechnung_data->insertamum = (new DateTime($anrechnung->insertamum))->format('d.m.Y'); + $anrechnung_data->insertvon= $anrechnung->insertvon; + $anrechnung_data->studiensemester_kurzbz= $anrechnung->studiensemester_kurzbz; + $anrechnung_data->empfehlung= $anrechnung->empfehlung_anrechnung; + + // Get last status bezeichnung in the users language + $anrechnung_data->status = $this->getLastAnrechnungstatus($anrechnung->anrechnung_id); + + // Get document name + $this->ci->DmsVersionModel->addSelect('name'); + $result = $this->ci->DmsVersionModel->loadWhere(array('dms_id' => $anrechnung->dms_id)); + + if (isError($result)) + { + show_error(getError($result)); + } + + $anrechnung_data->dokumentname = $result->retval[0]->name; + + return $anrechnung_data; + } +} \ No newline at end of file diff --git a/application/libraries/DmsLib.php b/application/libraries/DmsLib.php index f32df5fd1..64d58f987 100644 --- a/application/libraries/DmsLib.php +++ b/application/libraries/DmsLib.php @@ -5,7 +5,10 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); class DmsLib { const FILE_CONTENT_PROPERTY = 'file_content'; - + + const FILE_INPUT_NAME = 'uploadfile'; // name of the HTML input tag containing the uploaded file + private $UPLOAD_PATH = DMS_PATH; // temporary directory to store the upload file + /** * Object initialization */ @@ -92,6 +95,84 @@ class DmsLib return $result; } + + /** + * Uploads a document and saves it to DMS + * @param $dms DMS assoc array + * @param array $allowed_types Default: all. Param example: array(jpg, pdf) + * @return array + */ + public function upload($dms, $allowed_types = array('*')) + { + // Init upload configs + $this->_loadUploadLibrary($allowed_types); + + if (!$this->ci->upload->do_upload(DmsLib::FILE_INPUT_NAME)) + { + return error($this->ci->upload->display_errors()); + } + + $upload_data = $this->ci->upload->data(); // data about the uploaded file + $filename = $upload_data['file_name']; + + // Insert to DMS table + if (!$result = $this->ci->DmsModel->insert($this->ci->DmsModel->filterFields($dms))) + { + return error('Failed inserting to DMS'); + } + $upload_data['dms_id'] = $result->retval; + + // Insert DMS version + if (!$result = $this->ci->DmsVersionModel->insert( + $this->ci->DmsVersionModel->filterFields($dms, $result->retval, $filename))) + { + return error('Failed inserting DMS version'); + } + + // return result of uploaded data + return success($upload_data); // data about the uploaded file + } + + /** + * Download a document + * @param $dms_id + */ + public function download($dms_id) + { + if (!is_numeric($dms_id)) + { + show_error('Wrong parameter'); + } + + $this->ci->DmsVersionModel->addSelect('filename'); + $result = $this->ci->DmsVersionModel->loadWhere(array('dms_id' => $dms_id)); + + if (isError($result)) + { + show_error(getError($result)); + } + + $filename = $result->retval[0]->filename; + $file = DMS_PATH. $filename; + + if (file_exists($file)) + { + $finfo = new finfo(FILEINFO_MIME); + + header('Content-Description: File Transfer'); + header('Content-Type: '.$finfo->file($file)); + header('Expires: 0'); + header('Cache-Control: must-revalidate'); + header('Pragma: public'); + header('Content-Length: ' . filesize($file)); + readfile($file); + exit; + } + else + { + show_error('File does not exist'); + } + } /** * Saves a Document @@ -302,4 +383,17 @@ class DmsLib return $result; } + + /** + * Loads the upload library of CI + */ + private function _loadUploadLibrary($allowed_types) + { + $config['upload_path'] = $this->UPLOAD_PATH; + $config['allowed_types'] = implode('|', $allowed_types); + $config['overwrite'] = true; + + $this->ci->load->library('upload', $config); + $this->ci->upload->initialize($config); + } } diff --git a/application/models/education/Anrechnung_model.php b/application/models/education/Anrechnung_model.php index f16310fe4..56d3f3062 100644 --- a/application/models/education/Anrechnung_model.php +++ b/application/models/education/Anrechnung_model.php @@ -11,4 +11,40 @@ class Anrechnung_model extends DB_Model $this->dbTable = 'lehre.tbl_anrechnung'; $this->pk = 'anrechnung_id'; } + + /** + * Save Anrechnungstatus. + * @param $anrechnung_id + * @param $status_kurzbz + * @return array|null + */ + public function saveAnrechnungstatus($anrechnung_id, $status_kurzbz) + { + $qry = ' + INSERT INTO lehre.tbl_anrechnung_anrechnungstatus ( + anrechnung_id, status_kurzbz, insertvon + ) VALUES ( ?, ?, ?); + '; + + return $this->execQuery($qry, array($anrechnung_id, $status_kurzbz, getAuthUID())); + } + + /** + * Get the last inserted Anrechnungstatus + * @param $anrechnung_id + * @return array|null + */ + public function getLastAnrechnungstatus($anrechnung_id) + { + $qry = ' + SELECT status_kurzbz, bezeichnung_mehrsprachig + FROM lehre.tbl_anrechnungstatus + JOIN lehre.tbl_anrechnung_anrechnungstatus USING (status_kurzbz) + WHERE anrechnung_id = ? + ORDER BY insertamum DESC + LIMIT 1 + '; + + return $this->execQuery($qry, array($anrechnung_id)); + } } diff --git a/application/models/education/Anrechnungstatus_model.php b/application/models/education/Anrechnungstatus_model.php new file mode 100644 index 000000000..6ae5ffd22 --- /dev/null +++ b/application/models/education/Anrechnungstatus_model.php @@ -0,0 +1,15 @@ +dbTable = 'lehre.tbl_anrechnungstatus'; + $this->pk = 'status_kurzbz'; + } +} diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php index d80d02b41..ef5373f5f 100644 --- a/application/models/education/Lehrveranstaltung_model.php +++ b/application/models/education/Lehrveranstaltung_model.php @@ -273,4 +273,24 @@ class Lehrveranstaltung_model extends DB_Model return $this->execQuery($query, $parametersarray); } + + /** + * Gets Lehrveranstaltung and its Lehreinheiten (multiple rows possible). + * Returns empty array if student has no Lehrveranstaltung. + * @param $uid + * @param $studiensemester_kurzbz + * @param $lehrveranstaltung_id + * @return array|null + */ + public function getLvByStudent($uid, $studiensemester_kurzbz, $lehrveranstaltung_id) + { + $query = ' + SELECT * FROM campus.vw_student_lehrveranstaltung + WHERE uid = ? + AND studiensemester_kurzbz = ? + AND lehrveranstaltung_id = ?; + '; + + return $this->execQuery($query, array($uid, $studiensemester_kurzbz, $lehrveranstaltung_id)); + } } diff --git a/application/models/person/Person_model.php b/application/models/person/Person_model.php index d8ddb381c..128af7860 100644 --- a/application/models/person/Person_model.php +++ b/application/models/person/Person_model.php @@ -191,7 +191,7 @@ class Person_model extends DB_Model */ public function getByUid($uid) { - $this->addSelect('vorname, nachname, gebdatum, person_id'); + $this->addSelect('vorname, nachname, gebdatum, person_id, bpk, matr_nr'); $this->addJoin('tbl_benutzer', 'person_id'); return $this->loadWhere(array('uid' => $uid)); diff --git a/application/views/lehre/anrechnung/requestAnrechnung.php b/application/views/lehre/anrechnung/requestAnrechnung.php new file mode 100644 index 000000000..7e37e9e52 --- /dev/null +++ b/application/views/lehre/anrechnung/requestAnrechnung.php @@ -0,0 +1,200 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => $this->p->t('anrechnung', 'antragStellen'), + 'jquery' => true, + 'bootstrap' => true, + 'fontawesome' => true, + 'ajaxlib' => true, + 'dialoglib' => true, + 'phrases' => array( + 'global' => array( + 'anerkennungNachgewiesenerKenntnisse', + 'antragStellen' + ), + 'ui' => array( + 'hilfeZuDieserSeite', + 'hochladen' + ), + 'person' => array( + 'student', + 'personenkennzeichen' + ), + 'lehre' => array( + 'studiensemester', + 'studiengang', + 'lehrveranstaltung', + 'ects', + 'lektor', + ) + ), + 'customJSs' => array( + 'public/js/bootstrapper.js' + ) + ) +); +?> + + +
+
+ +
+ +
+ + 'requestAnrechnung-form'], + ['lv_id' => $antragData->lv_id, 'studiensemester' => $antragData->studiensemester_kurzbz] + ); ?> +
+
+
+
+ +
+
+ +
+
+
+
+ p->t('anrechnung', 'antrag'); ?> + p->t('anrechnung', 'antragdatum'); ?>: anrechnung_id) ? $anrechnungData->insertamum : '-' ?> +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
p->t('person', 'student'); ?>vorname. ' '. $antragData->nachname; ?>
p->t('person', 'personenkennzeichen'); ?>bpk ?>
p->t('lehre', 'studiensemester'); ?>studiensemester_kurzbz ?>
p->t('lehre', 'studiengang'); ?>stg_bezeichnung ?>
p->t('lehre', 'lehrveranstaltung'); ?>lv_bezeichnung ?>
p->t('lehre', 'ects'); ?>ects ?>
p->t('lehre', 'lektor'); ?> + lektoren) - 1 ?> + lektoren as $key => $lektor): ?> + vorname. ' '. $lektor->nachname; + echo $key === $len ? '' : ', ' ?> + +
+
+
+
+ +
+
+
+

p->t('anrechnung', 'antragStellenText'); ?>

+
+ +
+
+ +
+
+
+
+ +
+
+
+
+ p->t('anrechnung', 'nachweisdokumente'); ?> +
+
+
+ > +
+ dms_id)): ?> + dokumentname ?> + +
+
+
+
+ +
+
+
+
+
+
+ p->t('anrechnung', 'weitereInformationen'); ?> +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+ Status: status; ?> +
+ +
+ p->t('global', 'bearbeitungGesperrt'); ?> + anrechnung_id)? ': '. $this->p->t('anrechnung', 'deadlineUeberschritten') : ''; ?> +
+ +
+
+ +
+
+ > +
+
+ +
+
+ + +load->view('templates/FHC-Footer'); ?> diff --git a/config/global.config-default.inc.php b/config/global.config-default.inc.php index 496eb73cb..b31447994 100644 --- a/config/global.config-default.inc.php +++ b/config/global.config-default.inc.php @@ -26,6 +26,7 @@ define('CIS_LEHRVERANSTALTUNG_LEISTUNGSUEBERSICHT_ANZEIGEN',true); define('CIS_LEHRVERANSTALTUNG_SEMESTERINFO_ANZEIGEN',true); define('CIS_LEHRVERANSTALTUNG_LEHRFACH_ANZEIGEN',false); define('CIS_LEHRVERANSTALTUNG_GESAMTNOTE_ANZEIGEN', true); +define('CIS_LEHRVERANSTALTUNG_ANRECHNUNG_ANZEIGEN', true); // Im CIS Menue Links bei Modulen anzeigen wenn Lehrauftrag define('CIS_LEHRVERANSTALTUNG_MODULE_LINK',true); diff --git a/include/tw/cis_menu_lv.inc.php b/include/tw/cis_menu_lv.inc.php index b8c42da11..173b8d88c 100644 --- a/include/tw/cis_menu_lv.inc.php +++ b/include/tw/cis_menu_lv.inc.php @@ -421,7 +421,6 @@ function checkZeilenUmbruch() 'link'=>'../../../cms/news.php?studiengang_kz='.urlencode($studiengang_kz).'&semester='.urlencode($semester), 'text'=>$text ); - } if(!defined('CIS_LEHRVERANSTALTUNG_ABMELDUNG_ANZEIGEN') || CIS_LEHRVERANSTALTUNG_ABMELDUNG_ANZEIGEN) @@ -466,6 +465,20 @@ function checkZeilenUmbruch() } } + // Anerkennung nachgewiesener Kenntnisse (Anrechnung) + if((!defined('CIS_LEHRVERANSTALTUNG_ANRECHNUNG_ANZEIGEN') || CIS_LEHRVERANSTALTUNG_ANRECHNUNG_ANZEIGEN) + && $rechte->isBerechtigt('student/anrechnung_beantragen')) + { + $menu[]=array + ( + 'id'=>'core_menu_anerkennungNachgewiesenerKenntnisse', + 'position'=>'128', + 'name'=>$p->t('lehre/anerkennungNachgewiesenerKenntnisse'), + 'icon'=>'../../../skin/images/button_kreuzerltool.png', + 'link' => APP_ROOT. 'index.ci.php/lehre/anrechnung/RequestAnrechnung?studiensemester='.urlencode($angezeigtes_stsem).'&lv_id='.urlencode($lvid) + ); + } + //************* Menuepunkte anzeigen **************** diff --git a/locale/de-AT/lehre.php b/locale/de-AT/lehre.php index 46633c747..3262020d8 100644 --- a/locale/de-AT/lehre.php +++ b/locale/de-AT/lehre.php @@ -40,4 +40,5 @@ $this->phrasen['lehre/nichtzugeteilt']='Sie sind nicht zu dieser Lehrveranstaltu $this->phrasen['lehre/studienordnung']='Studienordnung'; $this->phrasen['lehre/studienplan']='Studienplan'; $this->phrasen['lehre/noteneingabedeaktiviert']='Noteneingabe deaktiviert'; +$this->phrasen['lehre/anerkennungNachgewiesenerKenntnisse']='Anerkennung nachgewiesener Kenntnisse'; ?> diff --git a/locale/en-US/lehre.php b/locale/en-US/lehre.php index 3fd6e5cd0..df990b6a1 100644 --- a/locale/en-US/lehre.php +++ b/locale/en-US/lehre.php @@ -40,4 +40,6 @@ $this->phrasen['lehre/nichtzugeteilt']='Sie sind nicht zu dieser Lehrveranstaltu $this->phrasen['lehre/studienordnung']='Studienordnung'; $this->phrasen['lehre/studienplan']='Studienplan'; $this->phrasen['lehre/noteneingabedeaktiviert']='Grading disabled'; +$this->phrasen['lehre/anerkennungNachgewiesenerKenntnisse']='Crediting for proven knowledge'; + ?> diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index 2336ebad4..0e172f9f0 100644 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -4465,6 +4465,176 @@ if($result = $db->db_query("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE } } +// Add column dms_id, studiensemester_kurzbz, anmerkung_student und empfehlung_anrechnung +// Change genehmigt_von and begruendung_id to be NULLABLE +if(!$result = @$db->db_query("SELECT dms_id FROM lehre.tbl_anrechnung")) +{ + $qry = " + ALTER TABLE lehre.tbl_anrechnung ADD COLUMN dms_id bigint; + ALTER TABLE lehre.tbl_anrechnung ADD COLUMN studiensemester_kurzbz varchar(6); + ALTER TABLE lehre.tbl_anrechnung ADD COLUMN anmerkung_student text; + ALTER TABLE lehre.tbl_anrechnung ADD COLUMN empfehlung_anrechnung boolean; + + ALTER TABLE lehre.tbl_anrechnung ADD CONSTRAINT fk_anrechnung_studiensemester FOREIGN KEY (studiensemester_kurzbz) REFERENCES public.tbl_studiensemester(studiensemester_kurzbz) ON DELETE RESTRICT ON UPDATE CASCADE; + ALTER TABLE lehre.tbl_anrechnung ADD CONSTRAINT fk_anrechnung_dms FOREIGN KEY (dms_id) REFERENCES campus.tbl_dms(dms_id) ON DELETE RESTRICT ON UPDATE CASCADE; + + ALTER TABLE lehre.tbl_anrechnung ALTER COLUMN genehmigt_von DROP NOT NULL; + ALTER TABLE lehre.tbl_anrechnung ALTER COLUMN begruendung_id DROP NOT NULL; + ALTER TABLE lehre.tbl_anrechnung ALTER COLUMN insertamum SET DEFAULT NOW(); + "; + + + if(!$db->db_query($qry)) + echo 'lehre.tbl_anrechnung: '.$db->db_last_error().'
'; + else + echo '
lehre.tbl_anrechnung: Neue Spalten dms_id, studiensemester_kurzbz, anmerkung_student und empfehlung_anrechnung hinzugefuegt. Not null constraint entfernt für genehmigt_von und begruendung_id'; +} + +// Add DMS category "anrechnung" +if ($result = @$db->db_query("SELECT 1 FROM campus.tbl_dms_kategorie WHERE kategorie_kurzbz = 'anrechnung';")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO campus.tbl_dms_kategorie ( + kategorie_kurzbz, + bezeichnung, + beschreibung, + parent_kategorie_kurzbz, + oe_kurzbz, + berechtigung_kurzbz + ) VALUES( + 'anrechnung', + 'Anrechnung', + 'Dokumente zur Anrechnung von Lehrveranstaltungen', + 'studium', + 'etw', + NULL + );"; + if (!$db->db_query($qry)) + echo 'campus.tbl_dms_kategorie '.$db->db_last_error().'
'; + else + echo ' campus.tbl_dms_kategorie: Added category "anrechnung"!
'; + } +} + + +// Add DMS category permissiongroup for DMS category "anrechnung" +if ($result = @$db->db_query("SELECT 1 FROM campus.tbl_dms_kategorie_gruppe WHERE kategorie_kurzbz = 'anrechnung';")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO campus.tbl_dms_kategorie_gruppe ( + kategorie_kurzbz, + gruppe_kurzbz, + insertamum, + insertvon + ) VALUES( + 'anrechnung', + 'CMS_LOCK', + NOW(), + 'dbcheck' + );"; + if (!$db->db_query($qry)) + echo 'campus.tbl_dms_kategorie_gruppe '.$db->db_last_error().'
'; + else + echo ' campus.tbl_dms_kategorie_gruppe: Added category group "CMS_LOCK" to category "anrechnung"!
'; + } +} + +// Add table anrechnung_status +if(!$result = @$db->db_query("SELECT 1 FROM lehre.tbl_anrechnungstatus LIMIT 1;")) +{ + $qry = " + CREATE TABLE lehre.tbl_anrechnungstatus + ( + status_kurzbz varchar(32) NOT NULL, + bezeichnung_mehrsprachig varchar(64)[] + ); + + ALTER TABLE lehre.tbl_anrechnungstatus ADD CONSTRAINT pk_anrechnungstatus PRIMARY KEY (status_kurzbz); + + INSERT INTO lehre.tbl_anrechnungstatus(status_kurzbz, bezeichnung_mehrsprachig) VALUES('inProgressDP', '{\'bearbeitet von STG-Leitung\',\'processed by STG-Director\'}'); + INSERT INTO lehre.tbl_anrechnungstatus(status_kurzbz, bezeichnung_mehrsprachig) VALUES('inProgressKF', '{\'bearbeitet von KF-Leitung\',\'processed by KF-Manager\'}'); + INSERT INTO lehre.tbl_anrechnungstatus(status_kurzbz, bezeichnung_mehrsprachig) VALUES('approved', '{\'genehmigt\',\'approved\'}'); + INSERT INTO lehre.tbl_anrechnungstatus(status_kurzbz, bezeichnung_mehrsprachig) VALUES('rejected', '{\'abgelehnt\',\'rejected\'}'); + + GRANT SELECT ON lehre.tbl_anrechnungstatus TO web; + GRANT SELECT, UPDATE, INSERT, DELETE ON lehre.tbl_anrechnungstatus TO vilesci; + "; + + if(!$db->db_query($qry)) + echo 'lehre.tbl_anrechnungstatus: '.$db->db_last_error().'
'; + else + echo ' lehre.tbl_anrechnungstatus: Tabelle hinzugefuegt
'; +} + +// Add table anrechnung_anrechnungstatus +// Für bestehende genehmigte Anrechnungsanträge wird ein Eintrag mit dem Status 'approved' angelegt +if(!$result = @$db->db_query("SELECT 1 FROM lehre.tbl_anrechnung_anrechnungstatus LIMIT 1;")) +{ + $qry = " + CREATE TABLE lehre.tbl_anrechnung_anrechnungstatus + ( + anrechnungstatus_id integer NOT NULL, + anrechnung_id integer, + status_kurzbz varchar(32), + datum date default now(), + insertamum timestamp default now(), + insertvon varchar(32) + ); + + ALTER TABLE lehre.tbl_anrechnung_anrechnungstatus ADD CONSTRAINT pk_anrechnung_anrechnungstatus PRIMARY KEY (anrechnungstatus_id); + ALTER TABLE lehre.tbl_anrechnung_anrechnungstatus ADD CONSTRAINT fk_anrechnung_anrechnungstatus_anrechnung FOREIGN KEY (anrechnung_id) REFERENCES lehre.tbl_anrechnung(anrechnung_id) ON DELETE RESTRICT ON UPDATE CASCADE; + ALTER TABLE lehre.tbl_anrechnung_anrechnungstatus ADD CONSTRAINT fk_anrechnung_anrechnungstatus_anrechnungstatus FOREIGN KEY (status_kurzbz) REFERENCES lehre.tbl_anrechnungstatus (status_kurzbz) ON DELETE RESTRICT ON UPDATE CASCADE; + + CREATE SEQUENCE lehre.seq_anrechnung_anrechnungstatus_anrechnungstatus_id + START WITH 1 + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + ALTER TABLE lehre.tbl_anrechnung_anrechnungstatus ALTER COLUMN anrechnungstatus_id SET DEFAULT nextval('lehre.seq_anrechnung_anrechnungstatus_anrechnungstatus_id'); + + INSERT INTO lehre.tbl_anrechnung_anrechnungstatus(anrechnung_id, status_kurzbz) SELECT anrechnung_id, 'approved' as status_kurzbz FROM lehre.tbl_anrechnung WHERE genehmigt_von is not null; + + GRANT SELECT ON lehre.tbl_anrechnung_anrechnungstatus TO web; + GRANT SELECT, UPDATE, INSERT, DELETE ON lehre.tbl_anrechnung_anrechnungstatus TO vilesci; + GRANT SELECT, UPDATE ON lehre.seq_anrechnung_anrechnungstatus_anrechnungstatus_id TO vilesci; + "; + + if(!$db->db_query($qry)) + echo 'lehre.tbl_anrechnung_anrechnungstatus: '.$db->db_last_error().'
'; + else + echo ' lehre.tbl_anrechnung_anrechnungstatus: Tabelle hinzugefuegt
'; +} + +// Added Bezeichnung 'berufliche Praxis' to Anrechnungbegruendung +if ($result = @$db->db_query("SELECT 1 FROM lehre.tbl_anrechnung_begruendung WHERE bezeichnung = 'berufliche Praxis';")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO lehre.tbl_anrechnung_begruendung (bezeichnung) VALUES('berufliche Praxis');"; + if (!$db->db_query($qry)) + echo 'lehre.tbl_anrechnung_begruendung '.$db->db_last_error().'
'; + else + echo ' lehre.tbl_anrechnung_begruendung: Added bezeichnung "berufliche Praxis"
'; + } +} + +// Add permission to apply for Anrechnung +if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'student/anrechnung_beantragen';")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('student/anrechnung_beantragen', 'Anrechnung beantragen');"; + + if(!$db->db_query($qry)) + echo 'system.tbl_berechtigung '.$db->db_last_error().'
'; + else + echo ' system.tbl_berechtigung: Added permission for student/anrechnung_beantragen
'; + } +} + // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; @@ -4571,8 +4741,10 @@ $tabellen=array( "lehre.tbl_abschlusspruefung" => array("abschlusspruefung_id","student_uid","vorsitz","pruefer1","pruefer2","pruefer3","abschlussbeurteilung_kurzbz","akadgrad_id","pruefungstyp_kurzbz","datum","uhrzeit","sponsion","anmerkung","updateamum","updatevon","insertamum","insertvon","ext_id","note","protokoll","endezeit","pruefungsantritt_kurzbz","freigabedatum"), "lehre.tbl_abschlusspruefung_antritt" => array("pruefungsantritt_kurzbz","bezeichnung","bezeichnung_english","sort"), "lehre.tbl_akadgrad" => array("akadgrad_id","akadgrad_kurzbz","studiengang_kz","titel","geschlecht"), - "lehre.tbl_anrechnung" => array("anrechnung_id","prestudent_id","lehrveranstaltung_id","begruendung_id","lehrveranstaltung_id_kompatibel","genehmigt_von","insertamum","insertvon","updateamum","updatevon","ext_id"), + "lehre.tbl_anrechnung" => array("anrechnung_id","prestudent_id","lehrveranstaltung_id","begruendung_id","lehrveranstaltung_id_kompatibel","genehmigt_von","insertamum","insertvon","updateamum","updatevon","ext_id", "dms_id", "studiensemester_kurzbz", "anmerkung_student", "empfehlung_anrechnung"), + "lehre.tbl_anrechnung_anrechnungstatus" => array("anrechnungstatus_id", "anrechnung_id","status_kurzbz","datum", "insertamum","insertvon"), "lehre.tbl_anrechnung_begruendung" => array("begruendung_id","bezeichnung"), + "lehre.tbl_anrechnungstatus" => array("status_kurzbz","bezeichnung_mehrsprachig"), "lehre.tbl_betreuerart" => array("betreuerart_kurzbz","beschreibung","aktiv"), "lehre.tbl_ferien" => array("bezeichnung","studiengang_kz","vondatum","bisdatum"), "lehre.tbl_lehreinheit" => array("lehreinheit_id","lehrveranstaltung_id","studiensemester_kurzbz","lehrfach_id","lehrform_kurzbz","stundenblockung","wochenrythmus","start_kw","raumtyp","raumtypalternativ","sprache","lehre","anmerkung","unr","lvnr","updateamum","updatevon","insertamum","insertvon","ext_id","lehrfach_id_old","gewicht"), diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 727a389e4..d6cec5a1e 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -48,6 +48,26 @@ $phrases = array( ) ) ), + array( + 'app' => 'core', + 'category' => 'global', + 'phrase' => 'bearbeitungGesperrt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bearbeitung gesperrt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Locked for editing', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'global', @@ -1549,7 +1569,7 @@ $phrases = array( 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'Student', + 'text' => 'StudentIn', 'description' => '', 'insertvon' => 'system' ), @@ -2471,7 +2491,7 @@ $phrases = array( 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'Lektor', + 'text' => 'LektorIn', 'description' => '', 'insertvon' => 'system' ), @@ -7988,6 +8008,306 @@ Any unusual occurrences 'insertvon' => 'system' ) ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'anerkennungNachgewiesenerKenntnisse', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Anerkennung nachgewiesener Kenntnisse', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Crediting for proven knowledge', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'anrechnungBeantragen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Anrechnung beantragen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Apply', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'antragStellen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Antrag stellen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Submit an application', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'antragsdaten', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Antragsdaten', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Application data', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'nachweisdokumente', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Nachweisdokumente', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Verification documents', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'person', + 'phrase' => 'personenkennzeichen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Personenkennzeichen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Personal identity number', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'hochladen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Hochladen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Upload', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'antragStellenText', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ich beantrage die Feststellung der Gleichwertigkeit aufgrund', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'antragStellenWegenZeugnis', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'eines Zeugnisses (vgl. § 4 Abs. 4, Satzungsteil 5 der FHTW)', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'antragStellenWegenPraxis', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'der nachgewiesenen beruflichen Praxis (vgl. § 4 Abs. 5, Satzungsteil 5 der FHTW)', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'weitereInformationen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Weitere Informationen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Further information', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'antrag', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Antrag', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Application', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'anrechnungIst', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Antrag ist', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Application is', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'deadlineUeberschritten', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Deadline ist überschritten', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Deadline is exceeded', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'antragdatum', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Antragsdatum', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Application date', + 'description' => '', + 'insertvon' => 'system' + ) + ) ) );