diff --git a/application/config/anrechnung.php b/application/config/anrechnung.php new file mode 100644 index 000000000..d1f4f0958 --- /dev/null +++ b/application/config/anrechnung.php @@ -0,0 +1,22 @@ +load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); + $this->load->model('education/Anrechnung_model', 'AnrechnungModel'); + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + + $this->load->helper('url'); + $this->load->helper('hlp_sancho_helper'); } /** @@ -84,4 +94,318 @@ class AnrechnungJob extends JOB_Controller } $this->logInfo('End Anrechnung Grades Job', array('Number of Grades added'=>$cnt)); } + + /** + * Deletes Zeugnisnoten 'angerechnet', when Anrechnung is rejected afterwards. + * E.g., when STGL first accepts, then withdraws and finally rejects the approvement. + */ + public function deleteAnrechnungGrades() + { + $this->logInfo('Start AnrechnungJob to delete Grades'); + + // Get all Zeungisnoten, + // WHERE note is angerechnet + // AND Anrechnung was rejected AFTER the Zeugnisnote was created + $qry = ' + SELECT DISTINCT ON (status.anrechnung_id) anrechnung_id, + status.status_kurzbz AS "last_anrechnungstatus", + status.insertamum AS "last_anrechnungstatus_insertamum", + zeugnisnote.insertamum AS "zeugnisdatum_insertamum", + student.student_uid, + zeugnisnote.lehrveranstaltung_id, + zeugnisnote.studiensemester_kurzbz, + note + FROM lehre.tbl_zeugnisnote zeugnisnote + JOIN public.tbl_student student USING (student_uid) + JOIN lehre.tbl_anrechnung anrechnung + ON (zeugnisnote.lehrveranstaltung_id = anrechnung.lehrveranstaltung_id) + AND (student.prestudent_id = anrechnung.prestudent_id) + AND (zeugnisnote.studiensemester_kurzbz = anrechnung.studiensemester_kurzbz) + JOIN lehre.tbl_anrechnung_anrechnungstatus status USING (anrechnung_id) + WHERE note = 6 + AND status.insertamum > zeugnisnote.insertamum + AND status.status_kurzbz = '. $this->db->escape(self::ANRECHNUNGSTATUS_REJECTED). ' + ORDER BY status.anrechnung_id, status.insertamum DESC + '; + + $db = new DB_Model(); + $result = $db->execReadOnlyQuery($qry); + $cnt = 0; + + if (hasData($result)) + { + $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); + + foreach (getData($result) as $row) + { + // Delete Zeugnisnote + $this->ZeugnisnoteModel->delete(array( + 'lehrveranstaltung_id' => $row->lehrveranstaltung_id, + 'student_uid' => $row->student_uid, + 'studiensemester_kurzbz' => $row->studiensemester_kurzbz + )); + + // Count up + $cnt++; + } + } + + $this->logInfo('End AnrechnungJob to delete Grades', array('Number of Grades deleted: ' => $cnt)); + } + + // Send Sancho mail to STGL with yesterdays new Anrechnungen + public function sendMailToSTGL() + { + $this->logInfo('Start AnrechnungJob to send emails to STGL about yesterdays new Anrechnungen.'); + + // Get all yesterdays Anrechnungen, that did not process further than first status + // (If Anrechnung is new, but STGL already started the process yesterday, + // he does not need to be informed about this new Anrechnung anymore) + $this->AnrechnungModel->addSelect('anrechnung_id, studiensemester_kurzbz, lv.studiengang_kz, lv.bezeichnung, vorname, nachname'); + $this->AnrechnungModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id'); + $this->AnrechnungModel->addJoin('public.tbl_student student', 'prestudent_id'); + $this->AnrechnungModel->addJoin('public.tbl_benutzer benutzer', 'ON (benutzer.uid = student.student_uid)'); + $this->AnrechnungModel->addJoin('public.tbl_person person', 'person_id'); + $this->AnrechnungModel->addOrder('lv.studiengang_kz, lv.bezeichnung'); + + $result = $this->AnrechnungModel->loadWhere( + '(lehre.tbl_anrechnung.insertamum)::date = (NOW() - INTERVAL \'24 HOURS\')::DATE + AND 1 = (SELECT COUNT(*) FROM lehre.tbl_anrechnung_anrechnungstatus status WHERE status.anrechnung_id = tbl_anrechnung.anrechnung_id)' + ); + + // Exit if there are no Anrechnungen + if (!$anrechnungen = getData($result)) { + $this->logInfo('ABORTED: Sending emails to STGL about yesterdays new Anrechnungen aborted - No new Anrechnungen found.'); + exit; + } + + $unique_studiengang_kz_arr = array_unique(array_column($anrechnungen, 'studiengang_kz')); + + foreach ($unique_studiengang_kz_arr as $studiengang_kz) + { + // Get STG bezeichnung + $this->StudiengangModel->addSelect('UPPER( typ || kurzbz ) AS "stg_bezeichnung"'); + $studiengang_bezeichnung = $this->StudiengangModel->load($studiengang_kz)->retval[0]->stg_bezeichnung; + + // Get STGL mail address + list ($to, $vorname) = self::_getSTGLMailAddress($studiengang_kz); + + // Get HTML table with new Anrechnungen of that STG plus amount of them + list ($anrechnungen_amount, $anrechnungen_table) = self::_getSTGLMailDataTable($studiengang_kz, $anrechnungen); + + // Link to Antrag genehmigen dashboard + $url = + CIS_ROOT. 'cis/index.php?menu='. + CIS_ROOT. 'cis/menu.php?content_id=&content='. + CIS_ROOT. index_page(). self::APPROVE_ANRECHNUNG_URI; + + // Prepare mail content + $body_fields = array( + 'vorname' => $vorname, + 'studiengang' => $studiengang_bezeichnung, + 'anzahl' => $anrechnungen_amount, + 'datentabelle' => $anrechnungen_table, + 'link' => anchor($url, 'Anrechnungsanträge Übersicht') + ); + + // Send mail + sendSanchoMail( + 'AnrechnungAntragStellen', + $body_fields, + $to, + 'Anerkennung nachgewiesener Kenntnisse: Neuer Antrag wurde gestellt' + ); + } + + $this->logInfo('SUCCEDED: Sending emails to STGL about yesterdays new Anrechnungen succeded.'); + } + + /** + * Send Sancho mail to students, whose Anrechnungen were approved 24 hours ago. + */ + public function sendMailApproved(){ + + $this->logInfo('Start AnrechnungJob to send emails to students, whose Anrechnungen were approved.'); + + // Get all yesterdays approvements + $this->AnrechnungModel->addSelect('student.student_uid, vorname, nachname, geschlecht, lv.bezeichnung'); + $this->AnrechnungModel->addJoin('lehre.tbl_anrechnung_anrechnungstatus status', 'anrechnung_id'); + $this->AnrechnungModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id'); + $this->AnrechnungModel->addJoin('public.tbl_student student', 'prestudent_id'); + $this->AnrechnungModel->addJoin('public.tbl_benutzer benutzer', 'ON (benutzer.uid = student.student_uid)'); + $this->AnrechnungModel->addJoin('public.tbl_person person', 'person_id'); + + $result = $this->AnrechnungModel->loadWhere( + '(status.insertamum)::date = (NOW() - INTERVAL \'24 HOURS\')::DATE AND + status.status_kurzbz = '. $this->db->escape(self::ANRECHNUNGSTATUS_APPROVED) + ); + + // Exit if there are no approved Anrechnungen + if (!hasData($result)) + { + $this->logInfo('ABORTED sending emails to students, whose Anrechnungen were approved. No new approvements found.'); + exit; + } + + // Loop through students + foreach ($result->retval as $student) + { + $to = $student->student_uid. '@'. DOMAIN; + + $anrede = $student->geschlecht == 'w' ? 'Sehr geehrte Frau ' : 'Sehr geehrter Herr '; + + $text = 'Ihrem Antrag auf Anerkennung nachgewiesener Kenntnisse der Lehrveranstaltung "'. + $student->bezeichnung. '" wurde stattgegeben.'; + + // Prepare mail content + $body_fields = array( + 'anrede_name' => $anrede. $student->vorname. ' '. $student->nachname, + 'text' => $text + ); + + // Send mail + sendSanchoMail( + 'AnrechnungGenehmigen', + $body_fields, + $to, + 'Anerkennung nachgewiesener Kenntnisse: Ihr Antrag ist abgeschlossen' + ); + } + } + + /** + * Send Sancho mail to students, whose Anrechnungen were rejected 24 hours ago. + */ + public function sendMailRejected(){ + + $this->logInfo('Start AnrechnungJob to send emails to students, whose Anrechnungen were rejected.'); + + // Get all yesterdays rejections + $this->AnrechnungModel->addSelect('student.student_uid, vorname, nachname, geschlecht, lv.bezeichnung, notiz.text'); + $this->AnrechnungModel->addJoin('lehre.tbl_anrechnung_anrechnungstatus status', 'anrechnung_id'); + $this->AnrechnungModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id'); + $this->AnrechnungModel->addJoin('public.tbl_student student', 'prestudent_id'); + $this->AnrechnungModel->addJoin('public.tbl_benutzer benutzer', 'ON (benutzer.uid = student.student_uid)'); + $this->AnrechnungModel->addJoin('public.tbl_person person', 'person_id'); + $this->AnrechnungModel->addJoin('public.tbl_notizzuordnung', 'anrechnung_id'); + $this->AnrechnungModel->addJoin('public.tbl_notiz notiz', 'notiz_id'); + + $this->AnrechnungModel->addOrder('notiz.insertamum', 'DESC'); + $this->AnrechnungModel->addLimit(1); + + + $result = $this->AnrechnungModel->loadWhere( + '(status.insertamum)::date = (NOW() - INTERVAL \'24 HOURS\')::DATE AND + status.status_kurzbz = '. $this->db->escape(self::ANRECHNUNGSTATUS_REJECTED). ' AND + notiz.titel = '. $this->db->escape(self::ANRECHNUNG_NOTIZTITEL_NOTIZ_BY_STGL) + ); + + // Exit if there are no rejected Anrechnungen + if (!hasData($result)) + { + $this->logInfo('ABORTED sending emails to students, whose Anrechnungen were rejected. No new rejectments found.'); + exit; + } + + // Loop through students + foreach ($result->retval as $student) + { + $to = $student->student_uid. '@'. DOMAIN; + + $anrede = $student->geschlecht == 'w' ? 'Sehr geehrte Frau ' : 'Sehr geehrter Herr '; + + $text = <<bezeichnung" leider nicht anrechnen, weil die Gleichwertigkeit nicht festgestellt werden konnte.

+ Begründung: $student->text +html; + + // Prepare mail content + $body_fields = array( + 'anrede_name' => $anrede. $student->vorname. ' '. $student->nachname, + 'text' => $text + ); + + // Send mail + sendSanchoMail( + 'AnrechnungGenehmigen', + $body_fields, + $to, + 'Anerkennung nachgewiesener Kenntnisse: Ihr Antrag ist abgeschlossen' + ); + } + + } + + // Get STGL mail address + private function _getSTGLMailAddress($studiengang_kz) + { + $result = $this->StudiengangModel->getLeitung($studiengang_kz); + + // Get STGL mail address + if (hasData($result)) + { + return array( + $result->retval[0]->uid. '@'. DOMAIN, + $result->retval[0]->vorname + ); + } + // If not available, get assistance mail address + else + { + $result = $this->StudiengangModel->load($studiengang_kz); + + if (hasData($result)) + { + return array( + $result->retval[0]->email, + '' + ); + } + } + } + + // Build HTML table with yesterdays new Anrechnungen of the given STG + private function _getSTGLMailDataTable($studiengang_kz, $anrechnungen) + { + $html = ''; + $lv_bezeichnung = ''; + + // Filter Anrechnungen of given STG + $anrechnungen = array_filter( + $anrechnungen, + function ($anrechnung) use (&$studiengang_kz) { + return $anrechnung->studiengang_kz == $studiengang_kz; + }); + + // Amount of Anrechnungen + $amount = count($anrechnungen); + + // HTML table body + $html .= ' + + + '; + + foreach ($anrechnungen as $anrechnung) + { + // Head line for each LV bezeichnung + if ($anrechnung->bezeichnung != $lv_bezeichnung) + { + $html .= ''; + } + + $lv_bezeichnung = $anrechnung->bezeichnung; + + // Row for each Anrechnung / student + $html .= ''; + } + + $html .= ' + +
' . $anrechnung->bezeichnung . '
'. $anrechnung->vorname. ' '. $anrechnung->nachname. '
+ '; + + return array($amount, $html); + } } diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php index c5e4b94d8..d76c0d79b 100644 --- a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php @@ -1,6 +1,6 @@ 'lehre/anrechnung_genehmigen:rw', 'approve' => 'lehre/anrechnung_genehmigen:rw', 'reject' => 'lehre/anrechnung_genehmigen:rw', - 'requestRecommendation' => 'lehre/anrechnung_genehmigen:rw' + 'requestRecommendation' => 'lehre/anrechnung_genehmigen:rw', + 'withdraw' => 'lehre/anrechnung_genehmigen:rw', + 'withdrawRequestRecommendation' => 'lehre/anrechnung_genehmigen:rw', + 'saveEmpfehlungsNotiz' => 'lehre/anrechnung_genehmigen:rw' ) ); @@ -80,29 +84,23 @@ class approveAnrechnungDetail extends Auth_Controller self::_checkIfEntitledToReadAnrechnung($anrechnung_id); // Get Anrechung data - if (!$anrechnungData = getData($this->anrechnunglib->getAnrechnungData($anrechnung_id))) - { - show_error('Missing data for Anrechnung.'); - } + $anrechnungData = $this->anrechnunglib->getAnrechnungData($anrechnung_id); + + // Get Antrag data + $antragData = $this->anrechnunglib->getAntragData( + $anrechnungData->prestudent_id, + $anrechnungData->studiensemester_kurzbz, + $anrechnungData->lehrveranstaltung_id + ); // Get Empfehlung data - if(!$empfehlungData = getData($this->anrechnunglib->getEmpfehlungData($anrechnung_id))) - { - show_error('Missing data for recommendation'); - } + $empfehlungData = $this->anrechnunglib->getEmpfehlungData($anrechnung_id); // Get Genehmigung data - if(!$genehmigungData = getData($this->anrechnunglib->getGenehmigungData($anrechnung_id))) - { - show_error('Missing data for recommendation'); - } - + $genehmigungData = $this->anrechnunglib->getGenehmigungData($anrechnung_id); + $viewData = array( - 'antragData' => $this->anrechnunglib->getAntragData( - $student_uid = $this->StudentModel->getUID($anrechnungData->prestudent_id), - $anrechnungData->studiensemester_kurzbz, - $anrechnungData->lehrveranstaltung_id - ), + 'antragData' => $antragData, 'anrechnungData' => $anrechnungData, 'empfehlungData' => $empfehlungData, 'genehmigungData' => $genehmigungData @@ -118,40 +116,30 @@ class approveAnrechnungDetail extends Auth_Controller { $data = $this->input->post('data'); - if(isEmptyArray($data)) + // Validate data + if (isEmptyArray($data)) { return $this->outputJsonError('Fehler beim Übertragen der Daten.'); } - - // Get statusbezeichnung for 'approved' - $this->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig'); - $approved = getData($this->AnrechnungstatusModel->load('approved'))[0]; - $approved = getUserLanguage() == 'German' - ? $approved->bezeichnung_mehrsprachig[0] - : $approved->bezeichnung_mehrsprachig[1]; - + + // Get STGLs person data if (!$person = getData($this->PersonModel->getByUID($this->_uid))[0]) { show_error('Failed retrieving person data'); } - + + // Approve Anrechnung foreach ($data as $item) { - // Approve Anrechnung - if(getData($this->anrechnunglib->approveAnrechnung($item['anrechnung_id']))) + if ($this->anrechnunglib->approveAnrechnung($item['anrechnung_id'])) { $json[]= array( 'anrechnung_id' => $item['anrechnung_id'], 'status_kurzbz' => self::ANRECHNUNGSTATUS_APPROVED, - 'status_bezeichnung' => $approved, - 'abgeschlossen_am' => (new DateTime())->format('d.m.Y'), - 'abgeschlossen_von' => $person->vorname. ' '. $person->nachname + 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_APPROVED), + 'abgeschlossen_am' => (new DateTime())->format('d.m.Y'), + 'abgeschlossen_von' => $person->vorname. ' '. $person->nachname ); - - if(!$this->_sendSanchoMailToStudent($item['anrechnung_id'], self::ANRECHNUNGSTATUS_APPROVED)) - { - show_error('Failed sending mail'); - } } } @@ -173,40 +161,30 @@ class approveAnrechnungDetail extends Auth_Controller { $data = $this->input->post('data'); - if(isEmptyArray($data)) + // Validate data + if (isEmptyArray($data)) { return $this->outputJsonError('Fehler beim Übertragen der Daten.'); } - - // Get statusbezeichnung for 'rejected' - $this->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig'); - $rejected = getData($this->AnrechnungstatusModel->load('rejected'))[0]; - $rejected = getUserLanguage() == 'German' - ? $rejected->bezeichnung_mehrsprachig[0] - : $rejected->bezeichnung_mehrsprachig[1]; - + + // Get STGLs person data if (!$person = getData($this->PersonModel->getByUID($this->_uid))[0]) { show_error('Failed retrieving person data'); } - + + // Reject Anrechnung foreach ($data as $item) { - // Reject Anrechnung - if(getData($this->anrechnunglib->rejectAnrechnung($item['anrechnung_id'], $item['begruendung']))) + if ($this->anrechnunglib->rejectAnrechnung($item['anrechnung_id'], $item['begruendung'])) { $json[]= array( 'anrechnung_id' => $item['anrechnung_id'], 'status_kurzbz' => self::ANRECHNUNGSTATUS_REJECTED, - 'status_bezeichnung' => $rejected, + 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_REJECTED), 'abgeschlossen_am' => (new DateTime())->format('d.m.Y'), 'abgeschlossen_von' => $person->vorname. ' '. $person->nachname ); - - if(!$this->_sendSanchoMailToStudent($item['anrechnung_id'], self::ANRECHNUNGSTATUS_REJECTED)) - { - show_error('Failed sending mail'); - } } } @@ -217,7 +195,7 @@ class approveAnrechnungDetail extends Auth_Controller } else { - return $this->outputJsonError('Es wurden keine Anrechnungen genehmigt.'); + return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt')); } } @@ -232,48 +210,166 @@ class approveAnrechnungDetail extends Auth_Controller { return $this->outputJsonError('Fehler beim Übertragen der Daten.'); } - - // Get statusbezeichnung for 'inProgressLektor' - $this->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig'); - $inProgressLektor = getData($this->AnrechnungstatusModel->load('inProgressLektor'))[0]; - $inProgressLektor = getUserLanguage() == 'German' - ? $inProgressLektor->bezeichnung_mehrsprachig[0] - : $inProgressLektor->bezeichnung_mehrsprachig[1]; - + + $retval = array(); + $counter = 0; + foreach ($data as $item) { - // Approve Anrechnung - if(getData($this->anrechnunglib->requestRecommendation($item['anrechnung_id']))) + // Check if Anrechnungs-LV has lector + if (!$this->anrechnunglib->LVhasLector($item['anrechnung_id'])) { - $json[]= array( + // Count up LV with no lector + $counter++; + + // Break, if LV has no lector + break; + } + + // Get full name of LV Leitung. + // If LV Leitung is not present, get full name of LV lectors. + $lector_arr = $this->anrechnunglib->getLectors($item['anrechnung_id']); + $empfehlungsanfrage_an = !isEmptyArray($lector_arr) + ? implode(', ', array_column($lector_arr, 'fullname')) + : ''; + + // Request Recommendation + if($this->anrechnunglib->requestRecommendation($item['anrechnung_id'])) + { + $retval[]= array( 'anrechnung_id' => $item['anrechnung_id'], 'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR, - 'status_bezeichnung' => $inProgressLektor, + 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR), 'empfehlung_anrechnung' => null, - 'empfehlung_angefordert_am' => (new DateTime())->format('d.m.Y') + 'empfehlungsanfrageAm' => (new DateTime())->format('d.m.Y'), + 'empfehlungsanfrageAn' => $empfehlungsanfrage_an ); } } - + + /** + * Send mails to lectors + * NOTE: mails are sent at the end to ensure sending only ONE mail to each LV-Leitung or lector + * even if they are required for more recommendations + * */ + if (!isEmptyArray($retval)) + { + self::_sendSanchoMailToLectors($retval); + + // Output json to ajax + return $this->outputJsonSuccess($retval); + } + // Output json to ajax - if (isset($json) && !isEmptyArray($json)) + if (isEmptyArray($retval) && $counter > 0) { - /** - * Send mails to lectors - * NOTE: mails are sent at the end to ensure sending only ONE mail to each LV-Leitung or lector - * even if they are required for more recommendations - * */ - if (!$this->_sendSanchoMailToLectors($json)) - { - show_error('Failed sending emails'); - } + return $this->outputJsonError( + "Empfehlung wurde nicht angefordert,\nDer LV sind keine LektorInnen zugeteilt." + ); + } + + return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt')); + } + + /** + * Withdraw approved / rejected Anrechnung and reset to 'inProgressDP'. + */ + public function withdraw() + { + $anrechnung_id = $this->input->post('anrechnung_id'); + + if (!is_numeric($anrechnung_id)) + { + $this->terminateWithJsonError($this->p->t('ui', 'errorFelderFehlen')); + } + + // Delete last status approved / rejected. + // If last status is 'approved', Genehmigung is resetted. + $result = $this->AnrechnungModel->withdrawApprovement($anrechnung_id); - return $this->outputJsonSuccess($json); - } - else + if (isError($result)) { - return $this->outputJsonError('Es wurden keine Empfehlungen angefordert'); + $this->terminateWithJsonError(getError($result)); } + + // Success output to AJAX + $this->outputJsonSuccess(array( + 'status_bezeichnung' => $this->anrechnunglib->getLastAnrechnungstatus($anrechnung_id)) + ); + } + + /** + * Withdraw request for reommendation and reset to 'inProgressDP'. + * This is only possible if the lector has not provided a recommendation yet. + */ + public function withdrawRequestRecommendation() + { + $anrechnung_id = $this->input->post('anrechnung_id'); + + if (!is_numeric($anrechnung_id)) + { + show_error('Wrong parameter.'); + } + + // Get boolean empfehlung of given Anrechnung + if (!$result = getData($this->AnrechnungModel->load($anrechnung_id))[0]) + { + show_error('Failed loading Anrechnung'); + } + + $empfehlung = $result->empfehlung_anrechnung; + + // Get last Anrechnungstatus + if (!$result = getData($this->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0]) + { + show_error('Failed loading last Anrechnungstatus'); + } + + $last_status = $result->status_kurzbz; + $anrechnungstatus_id = $result->anrechnungstatus_id; + + // Return if Anrechnung was not waiting for recommendation or if Anrechnung has already been recommended + if ($last_status != self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR && !is_null($empfehlung)) + { + return $this->outputJsonError('No recommendation to withdraw.'); + } + + // Reset status to 'inProgressDP' + $result = $this->AnrechnungModel->deleteAnrechnungstatus($anrechnungstatus_id); + + if (isError($result)) + { + return $this->outputJsonError('Could not withdraw this application.'); + } + + // Success output to AJAX + return $this->outputJsonSuccess(array( + 'status_bezeichnung' => $this->anrechnunglib->getLastAnrechnungstatus($anrechnung_id)) + ); + } + + public function saveEmpfehlungsNotiz() + { + $anrechnung_id = $this->input->post('anrechnung_id'); + $notiz_id = $this->input->post('notiz_id'); + $empfehlungstext = $this->input->post('empfehlung_text'); + + // Validate data + if (isEmptyString($anrechnung_id)) + { + $this->terminateWithJsonError($this->p->t('ui', 'systemFehler')); + } + + // Save Empfehlungstext + $result = self::_saveEmpfehlungsNotiz($anrechnung_id, $empfehlungstext, $notiz_id); + + if (isError($result)) + { + $this->terminateWithJsonError($this->p->t('ui', 'fehlerBeimSpeichern')); + } + + // Output success message + $this->outputJsonSuccess($this->p->t('ui', 'gespeichert')); } /** @@ -290,8 +386,12 @@ class approveAnrechnungDetail extends Auth_Controller // Check if user is entitled to read dms doc self::_checkIfEntitledToReadDMSDoc($dms_id); - - $this->dmslib->download($dms_id); + + // Set filename to be used on downlaod + $filename = $this->anrechnunglib->setFilenameOnDownload($dms_id); + + // Download file + $this->dmslib->download($dms_id, $filename); } /** @@ -375,42 +475,7 @@ class approveAnrechnungDetail extends Auth_Controller show_error('You are not entitled to read this document'); } - - /** - * Send mail to student to inform if Anrechnung was approved or rejected - * @param $mail_params - */ - private function _sendSanchoMailToStudent($anrechnung_id, $status_kurzbz) - { - $result = getData($this->anrechnunglib->getStudentData($anrechnung_id))[0]; - - // Get student name and mail address - $to = $result->uid. '@'. DOMAIN; - - $anrede = $result->geschlecht == 'w' ? 'Sehr geehrte Frau ' : 'Sehr geehrter Herr '; - - $text = $status_kurzbz == self::ANRECHNUNGSTATUS_APPROVED - ? 'Ihrem Antrag auf Anerkennung nachgewiesener Kenntnisse der Lehrveranstaltung "'. - $result->lv_bezeichnung. '" wurde stattgegeben.' - : 'wir haben Ihren Antrag auf Anerkennung nachgewiesener Kenntnisse geprüft und können die Lehrveranstaltung "'. - $result->lv_bezeichnung. '" leider nicht anrechnen, weil die Gleichwertigkeit nicht festgestellt werden konnte.'; - - // Prepare mail content - $body_fields = array( - 'anrede_name' => $anrede. $result->vorname. ' '. $result->nachname, - 'text' => $text - ); - - sendSanchoMail( - 'AnrechnungGenehmigen', - $body_fields, - $to, - 'Anerkennung nachgewiesener Kenntnisse: Ihr Antrag ist abgeschlossen' - ); - - return true; - } - + /** * Send mail to lectors asking for recommendation. (first to LV-Leitung, if not present to all lectors of lv) * @param $mail_params @@ -438,6 +503,8 @@ class approveAnrechnungDetail extends Auth_Controller * Anyway this function will receive a unique array to avoid sending more mails to one and the same lector. * **/ $lector_arr = $this->_getLectors($anrechnung_arr); + + // Send mail to lectors foreach ($lector_arr as $lector) @@ -476,8 +543,8 @@ class approveAnrechnungDetail extends Auth_Controller } /** - * Get lectors (prio for LV-Leitung, if not present to all lectors of LV. - * Anyway this function will receive a unique array to avoid sending more mails to one and the same lector. + * Get unique array of LV lectors. + * Only get LV Leitung if present, otherwise all lectors of LV. * @param $anrechnung_arr * @return array */ @@ -521,11 +588,37 @@ class approveAnrechnungDetail extends Auth_Controller unset($lector->lvleiter); } - // Now make the lector array aka mail receivers unique + // Make the lector array unique $lector_arr = array_unique($lector_arr, SORT_REGULAR); return $lector_arr; } + + private function _saveEmpfehlungsNotiz($anrechnung_id, $empfehlungstext, $notiz_id) + { + $this->load->model('person/Notiz_model', 'NotizModel'); + + if (!isEmptyString($notiz_id)) + { + return $this->NotizModel->update( + $notiz_id, + array( + 'text' => $empfehlungstext, + 'updateamum' => (new DateTime())->format('Y-m-d H:i:s'), + 'updatevon' => $this->_uid + ) + ); + } + + return $this->NotizModel->addNotizForAnrechnung( + $anrechnung_id, + self::ANRECHNUNG_NOTIZTITEL_EMPFEHLUNGSNOTIZ_BY_STGL, + trim($empfehlungstext), + $this->_uid + ); + + + } } diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php index b2d09fbe1..d59d97514 100644 --- a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php @@ -62,27 +62,21 @@ class approveAnrechnungUebersicht extends Auth_Controller public function index() { + // Get study semester $studiensemester_kurzbz = $this->input->get('studiensemester'); - // Retrieve studiengaenge the user is entitled for + if (isEmptyString($studiensemester_kurzbz)) + { + $result = $this->StudiensemesterModel->getNearest(); + $studiensemester_kurzbz = getData($result)[0]->studiensemester_kurzbz; + } + + // Get studiengaenge the user is entitled for if (!$studiengang_kz_arr = $this->permissionlib->getSTG_isEntitledFor(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN)) { show_error(getError($studiengang_kz_arr)); } - if (!is_string($studiensemester_kurzbz)) - { - $studiensemester = $this->StudiensemesterModel->getNearest(); - if (hasData($studiensemester)) - { - $studiensemester_kurzbz = $studiensemester->retval[0]->studiensemester_kurzbz; - } - elseif (isError($studiensemester)) - { - show_error(getError($studiensemester)); - } - } - $viewData = array( 'studiensemester_selected' => $studiensemester_kurzbz, 'studiengaenge_entitled' => $studiengang_kz_arr @@ -98,33 +92,22 @@ class approveAnrechnungUebersicht extends Auth_Controller { $data = $this->input->post('data'); - if(isEmptyArray($data)) + // Validate data + if (isEmptyArray($data)) { return $this->outputJsonError('Fehler beim Übertragen der Daten.'); } - // Get statusbezeichnung for 'approved' - $this->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig'); - $approved = getData($this->AnrechnungstatusModel->load('approved'))[0]; - $approved = getUserLanguage() == 'German' - ? $approved->bezeichnung_mehrsprachig[0] - : $approved->bezeichnung_mehrsprachig[1]; - + // Approve Anrechnung foreach ($data as $item) { - // Approve Anrechnung - if(getData($this->anrechnunglib->approveAnrechnung($item['anrechnung_id']))) + if ($this->anrechnunglib->approveAnrechnung($item['anrechnung_id'])) { $json[]= array( 'anrechnung_id' => $item['anrechnung_id'], 'status_kurzbz' => self::ANRECHNUNGSTATUS_APPROVED, - 'status_bezeichnung' => $approved + 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_APPROVED) ); - - if(!$this->_sendSanchoMailToStudent($item['anrechnung_id'], self::ANRECHNUNGSTATUS_APPROVED)) - { - show_error('Failed sending mail'); - } } } @@ -146,33 +129,22 @@ class approveAnrechnungUebersicht extends Auth_Controller { $data = $this->input->post('data'); - if(isEmptyArray($data)) + // Validate data + if (isEmptyArray($data)) { return $this->outputJsonError('Fehler beim Übertragen der Daten.'); } - // Get statusbezeichnung for 'rejected' - $this->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig'); - $rejected = getData($this->AnrechnungstatusModel->load('rejected'))[0]; - $rejected = getUserLanguage() == 'German' - ? $rejected->bezeichnung_mehrsprachig[0] - : $rejected->bezeichnung_mehrsprachig[1]; - + // Reject Anrechnung foreach ($data as $item) { - // Reject Anrechnung - if(getData($this->anrechnunglib->rejectAnrechnung($item['anrechnung_id'], $item['begruendung']))) + if ($this->anrechnunglib->rejectAnrechnung($item['anrechnung_id'], $item['begruendung'])) { $json[]= array( 'anrechnung_id' => $item['anrechnung_id'], 'status_kurzbz' => self::ANRECHNUNGSTATUS_REJECTED, - 'status_bezeichnung' => $rejected + 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_REJECTED) ); - - if(!$this->_sendSanchoMailToStudent($item['anrechnung_id'], self::ANRECHNUNGSTATUS_REJECTED)) - { - show_error('Failed sending mail'); - } } } @@ -199,46 +171,59 @@ class approveAnrechnungUebersicht extends Auth_Controller return $this->outputJsonError('Fehler beim Übertragen der Daten.'); } - // Get statusbezeichnung for 'inProgressLektor' - $this->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig'); - $inProgressLektor = getData($this->AnrechnungstatusModel->load('inProgressLektor'))[0]; - $inProgressLektor = getUserLanguage() == 'German' - ? $inProgressLektor->bezeichnung_mehrsprachig[0] - : $inProgressLektor->bezeichnung_mehrsprachig[1]; + $retval = array(); + $counter = 0; foreach ($data as $item) { - // Approve Anrechnung - if(getData($this->anrechnunglib->requestRecommendation($item['anrechnung_id']))) + // Check if Anrechnungs-LV has lector + if (!$this->anrechnunglib->LVhasLector($item['anrechnung_id'])) { - $json[]= array( + // Count up LV with no lector + $counter++; + + // Continue loop, if LV has no lector + continue; + } + + // Request Recommendation + if($this->anrechnunglib->requestRecommendation($item['anrechnung_id'])) + { + // Get full name of LV Leitung. + // If LV Leitung is not present, get full name of LV lectors. + $lector_arr = $this->anrechnunglib->getLectors($item['anrechnung_id']); + $empfehlungsanfrage_an = !isEmptyArray($lector_arr) + ? implode(', ', array_column($lector_arr, 'fullname')) + : ''; + + $retval[]= array( 'anrechnung_id' => $item['anrechnung_id'], 'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR, - 'status_bezeichnung' => $inProgressLektor, - 'empfehlung_anrechnung' => null + 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR), + 'empfehlung_anrechnung' => null, + 'empfehlungsanfrageAm' => (new DateTime())->format('Y-m-d H:i:s'), + 'empfehlungsanfrageAn' => $empfehlungsanfrage_an ); } } - // Output json to ajax - if (isset($json) && !isEmptyArray($json)) + /** + * Send mails to lectors + * NOTE: mails are sent at the end to ensure sending only ONE mail to each LV-Leitung or lector + * even if they are required for more recommendations + * */ + if (!isEmptyArray($retval)) { - /** - * Send mails to lectors - * NOTE: mails are sent at the end to ensure sending only ONE mail to each LV-Leitung or lector - * even if they are required for more recommendations - * */ - if (!$this->_sendSanchoMailToLectors($json)) - { - show_error('Failed sending emails'); - } - - return $this->outputJsonSuccess($json); + self::_sendSanchoMailToLectors($retval); } - else + + // Output json to ajax + if (isEmptyArray($retval) && $counter == 0) { return $this->outputJsonError('Es wurden keine Empfehlungen angefordert'); } + + return $this->outputJsonSuccess($retval); } /** @@ -256,7 +241,11 @@ class approveAnrechnungUebersicht extends Auth_Controller // Check if user is entitled to read dms doc self::_checkIfEntitledToReadDMSDoc($dms_id); - $this->dmslib->download($dms_id); + // Set filename to be used on downlaod + $filename = $this->anrechnunglib->setFilenameOnDownload($dms_id); + + // Download file + $this->dmslib->download($dms_id, $filename); } @@ -307,41 +296,6 @@ class approveAnrechnungUebersicht extends Auth_Controller show_error('You are not entitled to read this document'); } - /** - * Send mail to student to inform if Anrechnung was approved or rejected - * @param $mail_params - */ - private function _sendSanchoMailToStudent($anrechnung_id, $status_kurzbz) - { - $result = getData($this->anrechnunglib->getStudentData($anrechnung_id))[0]; - - // Get student name and mail address - $to = $result->uid. '@'. DOMAIN; - - $anrede = $result->geschlecht == 'w' ? 'Sehr geehrte Frau ' : 'Sehr geehrter Herr '; - - $text = $status_kurzbz == self::ANRECHNUNGSTATUS_APPROVED - ? 'Ihrem Antrag auf Anerkennung nachgewiesener Kenntnisse der Lehrveranstaltung "'. - $result->lv_bezeichnung. '" wurde stattgegeben.' - : 'wir haben Ihren Antrag auf Anerkennung nachgewiesener Kenntnisse geprüft und können die Lehrveranstaltung "'. - $result->lv_bezeichnung. '" leider nicht anrechnen, weil die Gleichwertigkeit nicht festgestellt werden konnte.'; - - // Prepare mail content - $body_fields = array( - 'anrede_name' => $anrede. $result->vorname. ' '. $result->nachname, - 'text' => $text - ); - - sendSanchoMail( - 'AnrechnungGenehmigen', - $body_fields, - $to, - 'Anerkennung nachgewiesener Kenntnisse: Ihr Antrag ist abgeschlossen' - ); - - return true; - } - /** * Send mail to lectors asking for recommendation. (first to LV-Leitung, if not present to all lectors of lv) * @param $mail_params @@ -456,6 +410,5 @@ class approveAnrechnungUebersicht extends Auth_Controller $lector_arr = array_unique($lector_arr, SORT_REGULAR); return $lector_arr; - } } \ No newline at end of file diff --git a/application/controllers/lehre/anrechnung/CreateAnrechnung.php b/application/controllers/lehre/anrechnung/CreateAnrechnung.php new file mode 100644 index 000000000..bc594371d --- /dev/null +++ b/application/controllers/lehre/anrechnung/CreateAnrechnung.php @@ -0,0 +1,271 @@ + 'lehre/anrechnung_anlegen:r', + 'getLVsByStudent' => 'lehre/anrechnung_anlegen:r', + 'create' => 'lehre/anrechnung_anlegen:rw' + ) + ); + + // Load models + $this->load->model('education/Anrechnung_model', 'AnrechnungModel'); + $this->load->model('education/Anrechnungstatus_model', 'AnrechnungstatusModel'); + $this->load->model('content/DmsVersion_model', 'DmsVersionModel'); + $this->load->model('crm/Student_model', 'StudentModel'); + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + + // 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'); + + // Load language phrases + $this->loadPhrases( + array( + 'global', + 'ui', + 'anrechnung', + 'person', + 'lehre' + ) + ); + + // Load configs + $this->load->config('anrechnung'); + + $this->_setAuthUID(); + + $this->setControllerId(); + } + + public function index() + { + // Get Studiensemester + $studiensemester_kurzbz = $this->input->get('studiensemester'); + + // If no Studiensemester is given + if (isEmptyString($studiensemester_kurzbz)) + { + //...use the nearest Studiensemester + $result = $this->StudiensemesterModel->getNearest(); + $studiensemester_kurzbz = getData($result)[0]->studiensemester_kurzbz; + } + + // Get Studiengaenge the user is entitled for + if (!$studiengang_kz_arr = $this->permissionlib->getSTG_isEntitledFor(self::BERECHTIGUNG_ANRECHNUNG_ANLEGEN)) + { + show_error('Failed retrieving Studiengaenge'); + } + + // Get Anrechnungsbegruendungen + $this->load->model('education/Anrechnungbegruendung_model', 'AnrechnungbegruendungModel'); + $begruendung_arr = getData($this->AnrechnungbegruendungModel->load()); + + $viewData = array( + 'studiensemester_selected' => $studiensemester_kurzbz, + 'studiengaenge_entitled' => $studiengang_kz_arr, + 'begruendungen' => $begruendung_arr + ); + + $this->load->view('lehre/anrechnung/createAnrechnung.php', $viewData); + } + + /** + * Get Lehrveranstaltungen from Student. + */ + public function getLVsByStudent() + { + $prestudent_id = $this->input->post('prestudent_id'); + $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); + + // Get Student UID + $student_uid = $this->StudentModel->getUID($prestudent_id); + + // Retrieve Lehrveranstaltungen from student + $result = $this->LehrveranstaltungModel->getLvsByStudent($student_uid, $studiensemester_kurzbz); + + // Exit, if student has no Lehrveranstaltungen + if (!hasData($result)) + { + $this->terminateWithJsonError($this->p->t('ui', 'keineLVzugeteilt')); + } + + // Success response to AJAX + $this->outputJsonSuccess(getData($result)); + } + + /** + * Create Anrechnungsantrag. + * + * Saves Anrechnung and Anrechnungstatus. + * Also saves Nachweisdokument to DMS. + */ + public function create() + { + $prestudent_id = $this->input->post('prestudent_id'); + $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); + $lehrveranstaltung_id = $this->input->post('lehrveranstaltung_id'); + $begruendung_id = $this->input->post('begruendung_id'); + $herkunftKenntnisse = $this->input->post('herkunftKenntnisse'); + + // Validate upload file + if (empty($_FILES['uploadfile']['name'])) + { + $this->terminateWithJsonError($this->p->t('ui', 'errorUploadFehlt')); + } + + // Validate required data + if (isEmptyString($begruendung_id) || isEmptyString($lehrveranstaltung_id)) + { + $this->terminateWithJsonError($this->p->t('ui', 'errorFelderFehlen')); + } + + // Exit if application already exists + if (self::_applicationExists($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id)) + { + $this->terminateWithJsonError($this->p->t('global', 'antragBereitsGestellt')); + } + + // Exit if Lehrveranstaltung was already graded with application blocking grades + if (self::_LVhasBlockingGrades($studiensemester_kurzbz, $lehrveranstaltung_id, $prestudent_id)) + { + $this->terminateWithJsonError($this->p->t('anrechnung', 'antragBenotungBlockiert')); + } + + // Upload document + $result = self::_uploadFile(); + + if (isError($result)) + { + $this->terminateWithJsonError($result->retval); + } + + // Hold just inserted DMS ID + $lastInsert_dms_id = $result->retval['dms_id']; + + // Save Anrechnung and Anrechnungstatus + $result = $this->AnrechnungModel->createAnrechnungsantrag( + $prestudent_id, + $studiensemester_kurzbz, + $lehrveranstaltung_id, + $begruendung_id, + $lastInsert_dms_id, + $herkunftKenntnisse + ); + + if (isError($result)) + { + $this->terminateWithJsonError(getError($result)); + } + + $lastInsert_anrechnung_id = getData($result); + + // Success response to AJAX + $this->outputJsonSuccess(array( + 'anrechnung_id' => $lastInsert_anrechnung_id, + 'msg' => $this->p->t('global', 'antragWurdeAngelegt') + )); + } + + + /** + * 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'); + } + + /** + * Check if application already exists. + * + * @param $lehrveranstaltung_id + * @param $studiensemester_kurzbz + * @param $prestudent_id + * @return bool + */ + private function _applicationExists($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id) + { + $result = $this->AnrechnungModel->loadWhere(array( + 'lehrveranstaltung_id' => $lehrveranstaltung_id, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'prestudent_id' => $prestudent_id + )); + + if (isError($result)) + { + show_error(getError($result)); + } + + return hasData($result); + } + + /** + * Upload file via DMS library. + * + * @return mixed + * @throws Exception + */ + private function _uploadFile() + { + $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 + ); + + // Upload document + return $this->dmslib->upload($dms, 'uploadfile', array('pdf')); + } + + private function _LVhasBlockingGrades($studiensemester_kurzbz, $lehrveranstaltung_id, $prestudent_id) + { + // Get Student UID + $student_uid = $this->StudentModel->getUID($prestudent_id); + + // Get Note of Lehrveranstaltung + $this->load->model('education/Lvgesamtnote_model', 'LvgesamtnoteModel'); + $result = $this->LvgesamtnoteModel->load(array( + 'student_uid' => $student_uid, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'lehrveranstaltung_id' => $lehrveranstaltung_id + ) + ); + + // If Lehrveranstaltung has Note + if (hasData($result)) + { + $note = getData($result)[0]->note; + + // Check if Note is a blocking grade + if (in_array($note, $this->config->item('grades_blocking_application'))) + { + return true; + } + } + return false; + } + +} \ No newline at end of file diff --git a/application/controllers/lehre/anrechnung/RequestAnrechnung.php b/application/controllers/lehre/anrechnung/RequestAnrechnung.php index 4f589e5f5..45a770cf5 100644 --- a/application/controllers/lehre/anrechnung/RequestAnrechnung.php +++ b/application/controllers/lehre/anrechnung/RequestAnrechnung.php @@ -6,15 +6,13 @@ class requestAnrechnung extends Auth_Controller { const REQUEST_ANRECHNUNG_URI = '/lehre/anrechnung/RequestAnrechnung'; const APPROVE_ANRECHNUNG_URI = '/lehre/anrechnung/ApproveAnrechnungUebersicht'; - + const ANRECHNUNGSTATUS_PROGRESSED_BY_STGL = 'inProgressDP'; const ANRECHNUNGSTATUS_PROGRESSED_BY_KF = 'inProgressKF'; const ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR = 'inProgressLektor'; const ANRECHNUNGSTATUS_APPROVED = 'approved'; const ANRECHNUNGSTATUS_REJECTED = 'rejected'; - - const DEADLINE_INTERVAL_NACH_SEMESTERSTART = 'P1M'; // Deadline for application - + public function __construct() { // Set required permissions @@ -25,22 +23,25 @@ class requestAnrechnung extends Auth_Controller '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 configs + $this->load->config('anrechnung'); + // Load language phrases $this->loadPhrases( array( @@ -51,63 +52,59 @@ class requestAnrechnung extends Auth_Controller '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)) + + if (isEmptyString($lehrveranstaltung_id) || isEmptyString($studiensemester_kurzbz)) { show_error('Missing correct parameter'); } - + + // Exit if user is not a student + $result = $this->StudentModel->load(array('student_uid' => $this->_uid)); + + if (!hasData($result)) + { + show_error('Cant load user'); + } + + // Get Prestudent ID + $prestudent_id = getData($result)[0]->prestudent_id; + // Check if application deadline is expired - // $is_expired = $this->_checkAntragDeadline($studiensemester_kurzbz); - $is_expired = false; // Set to false until Deadline is defined - - $student = $this->StudentModel->load(array('student_uid' => $this->_uid)); - if (isSuccess($student) && hasData($student)) - { - $prestudent_id = getData($student)[0]->prestudent_id; - } - else - show_error('Cant load User'); - + $is_expired = self::_checkAntragDeadline( + $this->config->item('submit_application_start'), + $this->config->item('submit_application_end'), + $studiensemester_kurzbz + ); + + // Check if Lehrveranstaltung was already graded with application blocking grades + $is_blocked = self::_LVhasBlockingGrades($studiensemester_kurzbz, $lehrveranstaltung_id); + // Get Anrechung data - $result = $this->anrechnunglib->getAnrechnungDataByLv($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id); - if (!$anrechnungData = getData($result)) - { - show_error(getError($anrechnungData)); - } - - // Dont show who is progressing the application to the student - if ($anrechnungData->status_kurzbz == self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL || - $anrechnungData->status_kurzbz == self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR || - $anrechnungData->status_kurzbz == self::ANRECHNUNGSTATUS_PROGRESSED_BY_KF) - { - $anrechnungData->status = getUserLanguage() == 'German' ? 'in Bearbeitung' : 'in process'; - } - - $antragData = $this->anrechnunglib->getAntragData($this->_uid, $studiensemester_kurzbz, $lehrveranstaltung_id); + $anrechnungData = $this->anrechnunglib->getAnrechnungDataByLv($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id); + // Get Antrag data + $antragData = $this->anrechnunglib->getAntragData($prestudent_id, $studiensemester_kurzbz, $lehrveranstaltung_id); + $viewData = array( 'antragData' => $antragData, 'anrechnungData' => $anrechnungData, 'is_expired' => $is_expired, - 'disabled' => $is_expired && empty($anrechnungData->anrechnung_id) || !empty($anrechnungData->anrechnung_id) - ? 'disabled' - : '' + 'is_blocked' => $is_blocked ); - + $this->load->view('lehre/anrechnung/requestAnrechnung.php', $viewData); } - + /** * Apply Anrechnungsantrag and send to STGL */ @@ -117,104 +114,82 @@ class requestAnrechnung extends Auth_Controller $begruendung_id = $this->input->post('begruendung'); $lehrveranstaltung_id = $this->input->post('lv_id'); $studiensemester_kurzbz = $this->input->post('studiensemester'); + $bestaetigung = $this->input->post('bestaetigung'); + // Validate data if (empty($_FILES['uploadfile']['name'])) { - show_error('Missing upload file'); + return $this->outputJsonError($this->p->t('ui', 'errorUploadFehlt')); } - if (!is_numeric($begruendung_id) || !is_numeric($lehrveranstaltung_id) || !is_string($studiensemester_kurzbz)) + if (isEmptyString($begruendung_id) || + isEmptyString($anmerkung) || + isEmptyString($lehrveranstaltung_id) || + isEmptyString($studiensemester_kurzbz)) { - show_error('Missing correct parameter'); + return $this->outputJsonError($this->p->t('ui', 'errorFelderFehlen')); } - - $student = $this->StudentModel->load(array('student_uid' => $this->_uid)); - if (isSuccess($student) && hasData($student)) + + if (isEmptyString($bestaetigung)) { - $prestudent_id = getData($student)[0]->prestudent_id; + return $this->outputJsonError($this->p->t('ui', 'errorBestaetigungFehlt')); } - else - show_error('Cant load User'); - - $result = $this->_getAnrechnung($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id); - if (hasData($result)) + + // Exit if user is not a student + $result = $this->StudentModel->load(array('student_uid' => $this->_uid)); + + if (!hasData($result)) { - show_error('Der Antrag wurde bereits gestellt'); + return $this->outputJsonError('Cant load user'); } - - // Start DB transaction - $this->db->trans_start(false); - + + // Get Prestudent ID + $prestudent_id = getData($result)[0]->prestudent_id; + + // Exit if application already exists + if (self::_applicationExists($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id)) + { + return $this->outputJsonError($this->p->t('anrechnung', 'antragBereitsGestellt')); + } + + // Exit if application is not for actual studysemester + if (!self::_applicationIsForActualSS($studiensemester_kurzbz)) + { + return $this->outputJsonError($this->p->t('anrechnung', 'antragNurImAktSS')); + } + // 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 + $result = self::_uploadFile(); + + if (isError($result)) + { + return $this->outputJsonError($result->retval); + } + + // Hold just inserted DMS ID + $lastInsert_dms_id = $result->retval['dms_id']; + + // Save Anrechnung and Anrechnungstatus + $result = $this->AnrechnungModel->createAnrechnungsantrag( + $prestudent_id, + $studiensemester_kurzbz, + $lehrveranstaltung_id, + $begruendung_id, + $lastInsert_dms_id, + $anmerkung ); - - if(isError($uploaddata = $this->dmslib->upload($dms, array('pdf')))) + + if (isError($result)) { - show_error(getError($uploaddata)); + $this->terminateWithJsonError(getError($result)); } - - // Get PrestudentID - $result = $this->_loadPrestudent($this->_uid, $studiensemester_kurzbz); - - if (!$prestudent = getData($result)[0]) - { - show_error('Failed retrieving prestudent'); - } - - // Save Anrechnung - $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, - 'insertvon' => $this->_uid + + // Output to AJAX + $this->outputJsonSuccess(array( + 'antragdatum' => (new DateTime())->format('d.m.Y'), + 'dms_id' => $lastInsert_dms_id, + 'filename' => $_FILES['uploadfile']['name'] )); - - if (isError($result)) - { - show_error('Failed inserting Anrechnung'); - } - - // Save Anrechnungstatus 'inProgressSTGL' - $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 - $mail_params = array( - 'studiengang_kz' => $prestudent->studiengang_kz, - 'lehrveranstaltung_id' => $lehrveranstaltung_id - ); - - if(!$this->_sendSanchoMail($mail_params)) - { - show_error('Failed sending mail'); - } - else - { - redirect(site_url(). self::REQUEST_ANRECHNUNG_URI. '?studiensemester='. $studiensemester_kurzbz. '&lv_id='. $lehrveranstaltung_id); - } } /** @@ -241,53 +216,50 @@ class requestAnrechnung extends Auth_Controller 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 $start Start date for application submission. + * @param $ende End date for application submission. * @param $studiensemester_kurzbz - * @return bool True if semester start is more then 1 week ago + * @return bool True if today is not during the start- and ending deadlines (= if is expired) * @throws Exception */ - private function _checkAntragDeadline($studiensemester_kurzbz) + private function _checkAntragDeadline($start, $ende, $studiensemester_kurzbz) { $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); - $this->StudiensemesterModel->addSelect('start'); - if (!$start = getData($this->StudiensemesterModel->load($studiensemester_kurzbz))) + + // If start is not given, set to Semesterstart. + if (!isset($start) || isEmptyString($start)) { - show_error(getError($start)); + $this->StudiensemesterModel->addSelect('start'); + $result = $this->StudiensemesterModel->load($studiensemester_kurzbz); + $start = getData($result)[0]->start; } - - $start = new DateTime($start[0]->start); + + // If ende is not given, set to Semesterende. + if (!isset($ende) || isEmptyString($ende)) + { + $this->StudiensemesterModel->addSelect('ende'); + $result = $this->StudiensemesterModel->load($studiensemester_kurzbz); + $ende = getData($result)[0]->ende; + } + $today = new DateTime('today midnight'); - - // True if today > application deadline - return ($today > $start->add((new DateInterval(self::DEADLINE_INTERVAL_NACH_SEMESTERSTART)))); + $start = new DateTime($start); + $ende = new DateTime($ende); + + // True if today is not during the start- and ending deadlines (= if is expired) + return ($today <= $start || $today >= $ende); } - + /** - * Check if user is entitled to read dms doc + * Check if user is entitled to read dms doc. + * * @param $dms_id */ private function _checkIfEntitledToReadDMSDoc($dms_id) @@ -298,7 +270,7 @@ class requestAnrechnung extends Auth_Controller } $result = $this->AnrechnungModel->loadWhere(array('dms_id' => $dms_id)); - + if($result = getData($result)[0]) { if ($result->prestudent_id == $student->prestudent_id) @@ -306,104 +278,92 @@ class requestAnrechnung extends Auth_Controller return; } } - + show_error('You are not entitled to read this document'); } - + /** - * Get Anrechnung by Lehrveranstaltung + * Check if application already exists. + * * @param $lehrveranstaltung_id - * @return mixed + * @param $studiensemester_kurzbz + * @param $prestudent_id + * @return bool */ - private function _getAnrechnung($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id) + private function _applicationExists($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id) { $result = $this->AnrechnungModel->loadWhere(array( 'lehrveranstaltung_id' => $lehrveranstaltung_id, 'studiensemester_kurzbz' => $studiensemester_kurzbz, 'prestudent_id' => $prestudent_id )); - + if (isError($result)) { show_error(getError($result)); } - - return $result; + + return hasData($result); } - + /** - * Send mail to STGL (if not available, send to STGL assistance) - * @param $mail_params + * Check if applications' study semester is actual study semester. + * + * @param $studiensemester_kurzbz + * @return bool */ - private function _sendSanchoMail($mail_params) + private function _applicationIsForActualSS($studiensemester_kurzbz) { - // Get STGL mail address, if available, otherwise get assistance mail address - list ($to, $vorname) = $this->_getSTGLMailAddress($mail_params['studiengang_kz']); - - // Get full name of student - $this->load->model('person/Person_model', 'PersonModel'); - if (!$student_name = getData($this->PersonModel->getFullName($this->_uid))) - { - show_error ('Failed retrieving person'); - } - - // Get lehrveranstaltung bezeichnung - $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); - if (!$lehrveranstaltung = getData($this->LehrveranstaltungModel->load($mail_params['lehrveranstaltung_id']))[0]) - { - show_error ('Failed retrieving person'); - } - - // Link to Antrag genehmigen - $url = - CIS_ROOT. 'cis/index.php?menu='. - CIS_ROOT. 'cis/menu.php?content_id=&content='. - CIS_ROOT. index_page(). self::APPROVE_ANRECHNUNG_URI; - - // Prepare mail content - $body_fields = array( - 'vorname' => $vorname, - 'student_name' => $student_name, - 'lehrveranstaltung_bezeichnung' => $lehrveranstaltung->bezeichnung, - 'link' => anchor($url, 'Anrechnungsanträge Übersicht') - ); - - sendSanchoMail( - 'AnrechnungAntragStellen', - $body_fields, - $to, - 'Anerkennung nachgewiesener Kenntnisse: Neuer Antrag wurde gestellt' - ); - - return true; + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $result = $this->StudiensemesterModel->getNearest(); + $actual_ss = getData($result)[0]->studiensemester_kurzbz; + + return $studiensemester_kurzbz == $actual_ss; } - - // Get STGL mail address, if available, otherwise get assistance mail address - private function _getSTGLMailAddress($stg_kz) + + private function _LVhasBlockingGrades($studiensemester_kurzbz, $lehrveranstaltung_id) { - $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); - $result = $this->StudiengangModel->getLeitung($stg_kz); - - // Get STGL mail address, if available + // Get Note of Lehrveranstaltung + $this->load->model('education/Lvgesamtnote_model', 'LvgesamtnoteModel'); + $result = $this->LvgesamtnoteModel->load(array( + 'student_uid' => $this->_uid, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'lehrveranstaltung_id' => $lehrveranstaltung_id + ) + ); + + // If Lehrveranstaltung has Note if (hasData($result)) { - return array( - $result->retval[0]->uid. '@'. DOMAIN, - $result->retval[0]->vorname - ); - } - // ...otherwise get assistance mail address - else - { - $result = $this->StudiengangModel->load($stg_kz); - - if (hasData($result)) + $note = getData($result)[0]->note; + + // Check if Note is a blocking grade + if (in_array($note, $this->config->item('grades_blocking_application'))) { - return array( - $result->retval[0]->email, - '' - ); + return true; } } + return false; } -} + + /** + * Upload file via DMS library. + * + * @return mixed + * @throws Exception + */ + private function _uploadFile() + { + $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 + ); + + // Upload document + return $this->dmslib->upload($dms, 'uploadfile', array('pdf')); + } +} \ No newline at end of file diff --git a/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php index b9c723eee..78175f4e6 100644 --- a/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php +++ b/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php @@ -1,6 +1,6 @@ anrechnunglib->getAnrechnungData($anrechnung_id))) - { - show_error('Missing data for Anrechnung.'); - } + $anrechnungData = $this->anrechnunglib->getAnrechnungData($anrechnung_id); + + // Get Antrag data + $antragData = $this->anrechnunglib->getAntragData( + $anrechnungData->prestudent_id, + $anrechnungData->studiensemester_kurzbz, + $anrechnungData->lehrveranstaltung_id + ); // Get Empfehlung data - if(!$empfehlungData = getData($this->anrechnunglib->getEmpfehlungData($anrechnung_id))) - { - show_error('Missing data for recommendation'); - } + $empfehlungData = $this->anrechnunglib->getEmpfehlungData($anrechnung_id); $viewData = array( - 'antragData' => $this->anrechnunglib->getAntragData( - $student_uid = $this->StudentModel->getUID($anrechnungData->prestudent_id), - $anrechnungData->studiensemester_kurzbz, - $anrechnungData->lehrveranstaltung_id - ), + 'antragData' => $antragData, 'anrechnungData' => $anrechnungData, 'empfehlungData' => $empfehlungData ); @@ -113,29 +110,23 @@ class reviewAnrechnungDetail extends Auth_Controller { return $this->outputJsonError('Fehler beim Übertragen der Daten.'); } - - // Get statusbezeichnung for 'inProgressDP' - $this->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig'); - $inProgressDP = getData($this->AnrechnungstatusModel->load('inProgressDP'))[0]; - $inProgressDP = getUserLanguage() == 'German' - ? $inProgressDP->bezeichnung_mehrsprachig[0] - : $inProgressDP->bezeichnung_mehrsprachig[1]; - + + // Get lectors person data if (!$person = getData($this->PersonModel->getByUID($this->_uid))[0]) { - show_error('Failed retrieving person data'); + return $this->outputJsonError('Failed retrieving person data'); } foreach ($data as $item) { // Approve Anrechnung - if(getData($this->anrechnunglib->recommendAnrechnung($item['anrechnung_id']))) + if($this->anrechnunglib->recommendAnrechnung($item['anrechnung_id'])) { $json[]= array( 'anrechnung_id' => $item['anrechnung_id'], 'empfehlung_anrechnung' => 'true', 'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL, - 'status_bezeichnung' => $inProgressDP, + 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL), 'empfehlung_am' => (new DateTime())->format('d.m.Y'), 'empfehlung_von' => $person->vorname. ' '. $person->nachname ); @@ -151,14 +142,14 @@ class reviewAnrechnungDetail extends Auth_Controller * */ if (!$this->_sendSanchoMails($json, true)) { - show_error('Failed sending emails'); + return $this->outputJsonError('Failed sending emails'); } return $this->outputJsonSuccess($json); } else { - return $this->outputJsonError('Empfehlungen wurden nicht durchgeführt'); + return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt')); } } @@ -174,29 +165,23 @@ class reviewAnrechnungDetail extends Auth_Controller return $this->outputJsonError('Fehler beim Übertragen der Daten.'); } - // Get statusbezeichnung for 'inProgressDP' - $this->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig'); - $inProgressDP = getData($this->AnrechnungstatusModel->load('inProgressDP'))[0]; - $inProgressDP = getUserLanguage() == 'German' - ? $inProgressDP->bezeichnung_mehrsprachig[0] - : $inProgressDP->bezeichnung_mehrsprachig[1]; - + // Get lectors person data if (!$person = getData($this->PersonModel->getByUID($this->_uid))[0]) { - show_error('Failed retrieving person data'); + return $this->outputJsonError('Failed retrieving person data'); } foreach ($data as $item) { // Approve Anrechnung - if(getData($this->anrechnunglib->dontRecommendAnrechnung($item['anrechnung_id'], $item['begruendung']))) + if($this->anrechnunglib->dontRecommendAnrechnung($item['anrechnung_id'], $item['begruendung'])) { $json[]= array( 'anrechnung_id' => $item['anrechnung_id'], 'empfehlung_anrechnung' => 'false', 'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL, - 'status_bezeichnung' => $inProgressDP, - 'empfehlumg_am' => (new DateTime())->format('d.m.Y'), + 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL), + 'empfehlung_am' => (new DateTime())->format('d.m.Y'), 'empfehlung_von' => $person->vorname. ' '. $person->nachname ); } @@ -208,14 +193,14 @@ class reviewAnrechnungDetail extends Auth_Controller // Send mails to STGL (if not present STGL, send to STGL assistance) if (!$this->_sendSanchoMails($json, false)) { - show_error('Failed sending emails'); + return $this->outputJsonError('Failed sending emails'); } return $this->outputJsonSuccess($json); } else { - return $this->outputJsonError('Empfehlungen wurden nicht durchgeführt'); + return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt')); } } @@ -233,8 +218,12 @@ class reviewAnrechnungDetail extends Auth_Controller // Check if user is entitled to read dms doc self::_checkIfEntitledToReadDMSDoc($dms_id); - - $this->dmslib->download($dms_id); + + // Set filename to be used on downlaod + $filename = $this->anrechnunglib->setFilenameOnDownload($dms_id); + + // Download file + $this->dmslib->download($dms_id, $filename); } diff --git a/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php b/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php index 005cde97a..cd0b7afaf 100644 --- a/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php +++ b/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php @@ -62,19 +62,13 @@ class reviewAnrechnungUebersicht extends Auth_Controller public function index() { + // Get study semester $studiensemester_kurzbz = $this->input->get('studiensemester'); - if (!is_string($studiensemester_kurzbz)) + if (isEmptyString($studiensemester_kurzbz)) { - $studiensemester = $this->StudiensemesterModel->getNearest(); - if (hasData($studiensemester)) - { - $studiensemester_kurzbz = $studiensemester->retval[0]->studiensemester_kurzbz; - } - elseif (isError($studiensemester)) - { - show_error(getError($studiensemester)); - } + $result = $this->StudiensemesterModel->getNearest(); + $studiensemester_kurzbz = getData($result)[0]->studiensemester_kurzbz; } $viewData = array( @@ -95,24 +89,17 @@ class reviewAnrechnungUebersicht extends Auth_Controller { return $this->outputJsonError('Fehler beim Übertragen der Daten.'); } - - // Get statusbezeichnung for 'inProgressDP' - $this->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig'); - $inProgressDP = getData($this->AnrechnungstatusModel->load('inProgressDP'))[0]; - $inProgressDP = getUserLanguage() == 'German' - ? $inProgressDP->bezeichnung_mehrsprachig[0] - : $inProgressDP->bezeichnung_mehrsprachig[1]; foreach ($data as $item) { // Approve Anrechnung - if(getData($this->anrechnunglib->recommendAnrechnung($item['anrechnung_id']))) + if($this->anrechnunglib->recommendAnrechnung($item['anrechnung_id'])) { $json[]= array( 'anrechnung_id' => $item['anrechnung_id'], 'empfehlung_anrechnung' => 'true', 'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL, - 'status_bezeichnung' => $inProgressDP + 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL) ); } } @@ -133,7 +120,7 @@ class reviewAnrechnungUebersicht extends Auth_Controller } else { - return $this->outputJsonError('Empfehlungen wurden nicht durchgeführt'); + return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt')); } } @@ -149,24 +136,16 @@ class reviewAnrechnungUebersicht extends Auth_Controller return $this->outputJsonError('Fehler beim Übertragen der Daten.'); } - // Get statusbezeichnung for 'inProgressDP' - $this->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig'); - $inProgressDP = getData($this->AnrechnungstatusModel->load('inProgressDP'))[0]; - $inProgressDP = getUserLanguage() == 'German' - ? $inProgressDP->bezeichnung_mehrsprachig[0] - : $inProgressDP->bezeichnung_mehrsprachig[1]; - foreach ($data as $item) { // Approve Anrechnung - if(getData($this->anrechnunglib - ->dontRecommendAnrechnung($item['anrechnung_id'], $item['begruendung']))) + if($this->anrechnunglib->dontRecommendAnrechnung($item['anrechnung_id'], $item['begruendung'])) { $json[]= array( 'anrechnung_id' => $item['anrechnung_id'], 'empfehlung_anrechnung' => 'false', 'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL, - 'status_bezeichnung' => $inProgressDP + 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL) ); } } @@ -184,7 +163,7 @@ class reviewAnrechnungUebersicht extends Auth_Controller } else { - return $this->outputJsonError('Empfehlungen wurden nicht durchgeführt'); + return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt')); } } @@ -203,7 +182,11 @@ class reviewAnrechnungUebersicht extends Auth_Controller // Check if user is entitled to read dms doc self::_checkIfEntitledToReadDMSDoc($dms_id); - $this->dmslib->download($dms_id); + // Set filename to be used on downlaod + $filename = $this->anrechnunglib->setFilenameOnDownload($dms_id); + + // Download file + $this->dmslib->download($dms_id, $filename); } diff --git a/application/core/FHC_Controller.php b/application/core/FHC_Controller.php index 93c324b21..ce8748c5a 100644 --- a/application/core/FHC_Controller.php +++ b/application/core/FHC_Controller.php @@ -132,6 +132,32 @@ abstract class FHC_Controller extends CI_Controller { $this->output->set_content_type('application/json')->set_output(json_encode($mixed)); } + + protected function outputFile($fileObj) + { + if (file_exists($fileObj->file)) + { + $finfo = new finfo(FILEINFO_MIME); + + header('Content-Description: File Transfer'); + header('Content-Type: '. $finfo->file($fileObj->file)); + header('Expires: 0'); + header('Cache-Control: must-revalidate'); + header('Pragma: public'); + header('Content-Length: ' . filesize($fileObj->file)); + + if (isset($fileObj->disposition) && ($fileObj->disposition == 'inline' || $fileObj->disposition == 'attachment')) + { + header('Content-Disposition: '. $fileObj->disposition. '; filename="'. $fileObj->name. '"'); + } + + readfile($fileObj->file); + + exit; + } + + return false; + } //------------------------------------------------------------------------------------------------------------------ // Private methods diff --git a/application/libraries/AnrechnungLib.php b/application/libraries/AnrechnungLib.php index c32b8a91c..3bec62dce 100644 --- a/application/libraries/AnrechnungLib.php +++ b/application/libraries/AnrechnungLib.php @@ -12,6 +12,7 @@ class AnrechnungLib const ANRECHNUNG_NOTIZTITEL_NOTIZ_BY_LEKTOR = 'AnrechnungNotizLektor'; const ANRECHNUNG_NOTIZTITEL_NOTIZ_BY_STGL = 'AnrechnungNotizSTGL'; + const ANRECHNUNG_NOTIZTITEL_EMPFEHLUNGSNOTIZ_BY_STGL = 'AnrechnungEmpfehlungsnotizSTGL'; public function __construct() { @@ -23,6 +24,10 @@ class AnrechnungLib $this->ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); $this->ci->load->model('crm/Student_model', 'StudentModel'); $this->ci->load->model('content/DmsVersion_model', 'DmsVersionModel'); + $this->ci->load->model('crm/Prestudent_model', 'PrestudentModel'); + $this->ci->load->model('person/Notiz_model', 'NotizModel'); + + $this->ci->load->library('DmsLib'); } /** @@ -32,16 +37,19 @@ class AnrechnungLib * @param $lv_id * @return StdClass */ - public function getAntragData($uid, $studiensemester_kurzbz, $lv_id) + public function getAntragData($prestudent_id, $studiensemester_kurzbz, $lv_id) { $antrag_data = new StdClass(); - + + // Get students UID. + $uid = $this->ci->StudentModel->getUID($prestudent_id); + // 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]) { @@ -61,12 +69,18 @@ class AnrechnungLib } // Get lectors of lehrveranstaltung - $antrag_data->lektoren = array(); - if (!$lv_lektoren = getData($this->ci->LehrveranstaltungModel->getLecturersByLv($studiensemester_kurzbz, $lv_id))) + $result = $this->ci->LehrveranstaltungModel->getLecturersByLv($studiensemester_kurzbz, $lv_id); + if (isError($result)) { show_error('Failed loading course lectors.'); } - + + $lv_lektoren_arr = hasData($result) ? getData($result) : array(); + + // Get latest ZGV + $result = $this->ci->PrestudentModel->getLatestZGVBezeichnung($prestudent_id); + $latest_zgv_bezeichnung = hasData($result) ? getData($result)[0]->bezeichnung : ''; + // Set the given studiensemester $antrag_data->lv_id = $lv_id; $antrag_data->lv_bezeichnung = $lv->bezeichnung; @@ -76,7 +90,8 @@ class AnrechnungLib $antrag_data->nachname = $person->nachname; $antrag_data->matrikelnr = $student->matrikelnr; $antrag_data->stg_bezeichnung = $studiengang->bezeichnung; - $antrag_data->lektoren = $lv_lektoren; + $antrag_data->lektoren = $lv_lektoren_arr; + $antrag_data->zgv = $latest_zgv_bezeichnung; return $antrag_data; } @@ -107,8 +122,12 @@ class AnrechnungLib { $anrechnung_data = $this->_setAnrechnungDataObject($anrechnung); } + else + { + show_error('No Anrechnung with this anrechnung_id.'); + } - return success($anrechnung_data); + return $anrechnung_data; } @@ -153,7 +172,7 @@ class AnrechnungLib $anrechnung_data = $this->_setAnrechnungDataObject($anrechnung); } - return success($anrechnung_data); + return $anrechnung_data; } /** @@ -171,8 +190,8 @@ class AnrechnungLib $this->ci->AnrechnungModel->addSelect('tbl_benutzer.uid, tbl_prestudent.prestudent_id, tbl_person.person_id, tbl_anrechnung.studiensemester_kurzbz, vorname, nachname, geschlecht, tbl_lehrveranstaltung.bezeichnung AS "lv_bezeichnung"'); $this->ci->AnrechnungModel->addJoin('public.tbl_prestudent', 'prestudent_id'); $this->ci->AnrechnungModel->addJoin('public.tbl_student', 'prestudent_id'); - $this->ci->AnrechnungModel->addJoin('public.tbl_benutzer', 'uid=student_uid'); - $this->ci->AnrechnungModel->addJoin('public.tbl_person', 'tbl_benutzer.person_id=tbl_person.person_id'); + $this->ci->AnrechnungModel->addJoin('public.tbl_benutzer', 'uid = student_uid'); + $this->ci->AnrechnungModel->addJoin('public.tbl_person', 'tbl_benutzer.person_id = tbl_person.person_id'); $this->ci->AnrechnungModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id'); $result = $this->ci->AnrechnungModel->load($anrechnung_id); @@ -207,28 +226,53 @@ class AnrechnungLib $empfehlung_data->empfehlung = null; $empfehlung_data->empfehlung_von = '-'; $empfehlung_data->empfehlung_am = '-'; - $empfehlung_data->empfehlung_angefordert_am = '-'; - $empfehlung_data->notiz = ''; // Begruendung, if not recommended - + $empfehlung_data->empfehlungsanfrageAm = '-'; + $empfehlung_data->empfehlungsanfrageAn = '-'; + $empfehlung_data->begruendung = '-'; // Begruendung, if not recommended + $empfehlung_data->notiz_id = ''; // Empfehlungsnotiz from STGL + $empfehlung_data->notiz = ''; // Empfehlungsnotiz from STGL + if(!$anrechnung = getData($this->ci->AnrechnungModel->load($anrechnung_id))[0]) { show_error('Failed loading Anrechnung'); } + + // Get Empfehlungsnotiz + $result = $this->ci->NotizModel->getNotizByAnrechnung( + $anrechnung_id, + self::ANRECHNUNG_NOTIZTITEL_EMPFEHLUNGSNOTIZ_BY_STGL + ); + + if ($notiz = getData($result)[0]) + { + $empfehlung_data->notiz_id = $notiz->notiz_id; + $empfehlung_data->notiz = $notiz->text; + } // Get date, where recommendation was last requested $result = $this->ci->AnrechnungModel->getLastAnrechnungstatus( $anrechnung_id, self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR // when STLG asks for recommendation, status is set to in progress lektor ); - if ($result = getData($result)[0]) + + // If request for recommendation exists + if (hasData($result)) { - $empfehlung_data->empfehlung_angefordert_am = (new DateTime($result->insertamum))->format('d.m.Y'); + $empfehlung_data->empfehlungsanfrageAm = (new DateTime($result->retval[0]->insertamum))->format('d.m.Y'); + + // Get lectors who received request for recommendation + $lector_arr = self::getLectors($anrechnung_id); + + if (!isEmptyArray($lector_arr)) + { + $empfehlung_data->empfehlungsanfrageAn = implode(', ', array_column($lector_arr, 'fullname')); + } } if (is_null($anrechnung->empfehlung_anrechnung)) { - return success($empfehlung_data); + return $empfehlung_data; } // If Empfehlung is true or false @@ -260,15 +304,14 @@ class AnrechnungLib if (!$anrechnung->empfehlung_anrechnung) { // Get Ablehnungsbegruendung (only set, if Anrechnung was not recommended yet) - $this->ci->load->model('person/Notiz_model', 'NotizModel'); $result = $this->ci->NotizModel->getNotizByAnrechnung($anrechnung_id, self::ANRECHNUNG_NOTIZTITEL_NOTIZ_BY_LEKTOR); if ($notiz = getData($result)[0]) { - $empfehlung_data->notiz = $notiz->text; + $empfehlung_data->begruendung = $notiz->text; } } - return success($empfehlung_data); + return $empfehlung_data; } @@ -300,9 +343,10 @@ class AnrechnungLib // Get date of approvement or rejection $result = $this->ci->AnrechnungModel->getApprovedOrRejected($anrechnung_id); + // If no approved or rejected Anrechnung exist, return basic genehmigung data object if (!$result = getData($result)[0]) { - return success($genehmigung_data); + return $genehmigung_data; } @@ -331,9 +375,30 @@ class AnrechnungLib } } - return success($genehmigung_data); + return $genehmigung_data; } + + /** + * Get Anrechnungstatusbezeichnung of given status_kurzbz in users language. + * + * @param $status_kurzbz + * @return mixed + */ + public function getStatusbezeichnung ($status_kurzbz) + { + $this->ci->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig'); + $result = $this->ci->AnrechnungstatusModel->load($status_kurzbz); + + if (!hasData($result)) + { + show_error('Failed retrieving Anrechnungstatusbezeichung'); + } + + return getUserLanguage() == 'German' + ? $result->retval[0]->bezeichnung_mehrsprachig[0] + : $result->retval[0]->bezeichnung_mehrsprachig[1]; + } /** * Get last Anrechnungstatusbezeichnung in users language. @@ -370,7 +435,7 @@ class AnrechnungLib // Exit if already approved or rejected if ($status_kurzbz == self::ANRECHNUNGSTATUS_APPROVED || $status_kurzbz == self::ANRECHNUNGSTATUS_REJECTED) { - return success(false); // dont approve + return false; // dont approve } // Start DB transaction @@ -395,10 +460,10 @@ class AnrechnungLib if ($this->ci->db->trans_status() === false) { $this->ci->db->trans_rollback(); - return error($result->msg, EXIT_ERROR); + return false; } - return success(true); // approved + return true; // approved } /** @@ -419,16 +484,14 @@ class AnrechnungLib // Exit if already approved or rejected if ($status_kurzbz == self::ANRECHNUNGSTATUS_APPROVED || $status_kurzbz == self::ANRECHNUNGSTATUS_REJECTED) { - return success(false); // dont reject + return false; // dont reject } + + // Start DB transaction + $this->ci->db->trans_start(false); // Insert new status rejected - $result = $this->ci->AnrechnungModel->saveAnrechnungstatus($anrechnung_id, self::ANRECHNUNGSTATUS_REJECTED); - - if (isError($result)) - { - show_error(getError($result)); - } + $this->ci->AnrechnungModel->saveAnrechnungstatus($anrechnung_id, self::ANRECHNUNGSTATUS_REJECTED); // Add begruendung as notiz $this->ci->load->model('person/Notiz_model', 'NotizModel'); @@ -438,8 +501,17 @@ class AnrechnungLib $begruendung, getAuthUID() ); + + // Transaction complete + $this->ci->db->trans_complete(); + + if ($this->ci->db->trans_status() === false) + { + $this->ci->db->trans_rollback(); + return false; + } - return success(true); // rejected + return true; // rejected } /** @@ -462,7 +534,7 @@ class AnrechnungLib || $status_kurzbz == self::ANRECHNUNGSTATUS_REJECTED || $status_kurzbz == self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR) { - return success(false); // dont ask for recommendation + return false; // dont ask for recommendation } // Start DB transaction @@ -492,7 +564,7 @@ class AnrechnungLib return error($result->msg, EXIT_ERROR); } - return success(true); // recommended + return true; // recommended } /** @@ -537,10 +609,10 @@ class AnrechnungLib if ($this->ci->db->trans_status() === false) { $this->ci->db->trans_rollback(); - return error($result->msg, EXIT_ERROR); + return false; } - return success(true); // recommended + return true; // recommended } /** @@ -562,7 +634,7 @@ class AnrechnungLib // Exit if already approved or rejected if ($status_kurzbz == self::ANRECHNUNGSTATUS_APPROVED || $status_kurzbz == self::ANRECHNUNGSTATUS_REJECTED) { - return success(false); // dont approve + return false; // dont approve } // Start DB transaction @@ -596,10 +668,125 @@ class AnrechnungLib if ($this->ci->db->trans_status() === false) { $this->ci->db->trans_rollback(); - return error($result->msg, EXIT_ERROR); + return false; } - return success(true); // recommended + return true; // recommended + } + + /** + * Set Filename that should be used on download + * @param $dms_id + * @return string|null + */ + public function setFilenameOnDownload($dms_id) + { + // Load Anrechnung + $result = $this->ci->AnrechnungModel->loadWhere(array('dms_id' => $dms_id)); + + // Return null if no data found + if (!hasData($result)) + { + return null; + } + + $prestudent_id = $result->retval[0]->prestudent_id; + $lehrveranstaltung_id = $result->retval[0]->lehrveranstaltung_id; + + // Get LV OrgForm + $this->ci->LehrveranstaltungModel->addSelect('stg.orgform_kurzbz'); + $this->ci->LehrveranstaltungModel->addJoin('public.tbl_studiengang AS stg', 'studiengang_kz'); + $result = $this->ci->LehrveranstaltungModel->load($lehrveranstaltung_id); + $orgform_kurzbz = hasData($result) ? '_'. $result->retval[0]->orgform_kurzbz : ''; + + // Get full name of student + $this->ci->load->model('crm/Prestudent_model', 'PrestudentModel'); + $this->ci->PrestudentModel->addSelect('vorname, nachname'); + $this->ci->PrestudentModel->addJoin('public.tbl_person', 'person_id'); + $result = $this->ci->PrestudentModel->load($prestudent_id); + $fullname = hasData($result) ? $result->retval[0]->vorname. $result->retval[0]->nachname : ''; + + // Return filename + return 'Anrechnungsantrag'. $orgform_kurzbz .'_LV-'. $lehrveranstaltung_id. '_'. $fullname; + } + + public function LVhasLector($anrechnung_id) + { + $result = $this->ci->AnrechnungModel->load($anrechnung_id); + if (!hasData($result)) + { + showError('Anrechnung existiert nicht'); + } + + // Get lectors of lehrveranstaltung + $result = $this->ci->LehrveranstaltungModel->getLecturersByLv( + $result->retval[0]->studiensemester_kurzbz, + $result->retval[0]->lehrveranstaltung_id + ); + + // Continue, if LV has no lector (there is no one to ask for recommendation) + return hasData($result) ? true : false; + } + + /** + * Get LV Leitung. If not present, get all LV lectors. + * + * @param $anrechnung_id + * @return array|bool + */ + public function getLectors($anrechnung_id) + { + $this->ci->AnrechnungModel->addSelect('lehrveranstaltung_id, studiensemester_kurzbz'); + $result = $this->ci->AnrechnungModel->load($anrechnung_id); + + if (!hasData($result)) + { + return false; + } + + $lehrveranstaltung_id = getData($result)[0]->lehrveranstaltung_id; + $studiensemester_kurzbz = getData($result)[0]->studiensemester_kurzbz; + + // Get lectors + $lector_arr = array(); + + $this->ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $result = $this->ci->LehrveranstaltungModel->getLecturersByLv($studiensemester_kurzbz, $lehrveranstaltung_id); + + if (!$result = getData($result)) + { + return false; + } + + // Check if lv has LV-Leitung + $key = array_search(true, array_column($result, 'lvleiter')); + + // If lv has LV-Leitung, keep only the one + if ($key !== false) + { + $lector_arr[]= $result[$key]; + } + // ...otherwise keep all lectors + else + { + $lector_arr = array_merge($lector_arr, $result); + } + + /** + * NOTE: This step is only done to make the array unique by uid, vorname and nachname in the following step + * (e.g. if same lector is ones LV-Leitung and another time not, then array_unique would leave both. + * But we wish to send only one email by to that one person) + * **/ + foreach ($lector_arr as $lector) + { + unset($lector->lvleiter); + $lector->fullname = $lector->vorname. ' '. $lector->nachname; + } + + // Now make the lector array aka mail receivers unique + $lector_arr = array_unique($lector_arr, SORT_REGULAR); + + return $lector_arr; } // Return an object with Anrechnungdata @@ -631,12 +818,7 @@ class AnrechnungLib $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; + $anrechnung_data->dokumentname = hasData($result) ? getData($result)[0]->name : ''; return $anrechnung_data; } diff --git a/application/libraries/DmsLib.php b/application/libraries/DmsLib.php index da0dd84b6..eae1a9ac4 100644 --- a/application/libraries/DmsLib.php +++ b/application/libraries/DmsLib.php @@ -2,11 +2,10 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); -class DmsLib +class DmsLib extends FHC_Controller { 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 /** @@ -21,6 +20,34 @@ class DmsLib $this->ci->load->model('content/DmsVersion_model', 'DmsVersionModel'); $this->ci->load->model('content/DmsFS_model', 'DmsFSModel'); } + + /** + * Load a DMS Document. + * If no version is particularly given, the latest version is loaded. + * + * @param $dms_id + * @param integer $version + * @return array + */ + public function load($dms_id, $version = null) + { + if (is_numeric($dms_id)) + { + $this->ci->DmsModel->addJoin('campus.tbl_dms_version', 'dms_id'); + $this->ci->DmsModel->addOrder('version', 'DESC'); + $this->ci->DmsModel->addLimit(1); + + if (!is_numeric($version)) + { + return $this->ci->DmsModel->load($dms_id); + } + else + { + return $this->ci->DmsModel->loadWhere(array('dms_id' => $dms_id, 'version' => $version)); + } + } + return error('The parameter DMS ID must be a number'); + } /** * Read a DMS Document from the Filesystem @@ -95,19 +122,20 @@ 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) + * @param $field_name Name of the HTML uploadfile input name attribute + * @param array $allowed_types Default: all. Param example: array(jpg, pdf) * @return array */ - public function upload($dms, $allowed_types = array('*')) + public function upload($dms, $field_name, $allowed_types = array('*')) { // Init upload configs $this->_loadUploadLibrary($allowed_types); - if (!$this->ci->upload->do_upload(DmsLib::FILE_INPUT_NAME)) + if (!$this->ci->upload->do_upload($field_name)) { return error($this->ci->upload->display_errors()); } @@ -132,46 +160,80 @@ class DmsLib // return result of uploaded data return success($upload_data); // data about the uploaded file } - + /** - * Download a document + * Download a document. + * * @param $dms_id + * @param string $filename $filename If String is given, it will be used as filename on download + * @param string $disposition [inline | attachment] + * Inline opens doc in new tab. Attachment displays download dialog box. */ - public function download($dms_id) + public function download($dms_id, $filename = null, $disposition = 'inline') { - if (!is_numeric($dms_id)) - { - show_error('Wrong parameter'); - } - - $this->ci->DmsVersionModel->addSelect('filename'); - $result = $this->ci->DmsVersionModel->loadWhere(array('dms_id' => $dms_id)); - + $result = $this->getFileInfo($dms_id); + if (isError($result)) { - show_error(getError($result)); + return error(getError($result)); } - $filename = $result->retval[0]->filename; - $file = DMS_PATH. $filename; - - if (file_exists($file)) + $fileObj = getData($result); + + // Change filename, if filename is provided + if (is_string($filename)) { - $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; + $fileObj->name = $filename; + } + + // Add file disposition + if ($disposition == 'attachment') + { + $fileObj->disposition = 'attachment'; } else { - show_error('File does not exist'); + $fileObj->disposition = 'inline'; } + + // Output file + if(!$this->outputFile($fileObj)) + { + return error('Error on file output'); + } + } + + /** + * Get file information. + * + * @param $dms_id + * @param integer $version + * @return array with File Object. + */ + public function getFileInfo($dms_id, $version = null) + { + if (!is_numeric($dms_id)) + { + return error('Wrong parameter'); + } + + // Load file + $result = $this->load($dms_id, $version); + + if (isError($result)) + { + return error(getError($result)); + } + + // Store file information in fileObj + $fileObj = new StdClass(); + $fileObj->filename = getData($result)[0]->filename; + $fileObj->file = DMS_PATH. getData($result)[0]->filename; + $fileObj->name = DMS_PATH. getData($result)[0]->name; // original users filename + $fileObj->mimetype = DMS_PATH. getData($result)[0]->mimetype; + + return success($fileObj); + } /** diff --git a/application/models/crm/Prestudent_model.php b/application/models/crm/Prestudent_model.php index be0b6ba3f..fbc0f2981 100644 --- a/application/models/crm/Prestudent_model.php +++ b/application/models/crm/Prestudent_model.php @@ -580,6 +580,35 @@ class Prestudent_model extends DB_Model return $this->execQuery($query, array($person_id)); } + + /** + * Get latest ZGV Bezeichnung of Prestudent. + * + * @param $prestudent_id + */ + public function getLatestZGVBezeichnung($prestudent_id) + { + if (!is_numeric($prestudent_id)) + { + show_error('Prestudent_id is not numeric.'); + } + + $language_index = getUserLanguage() == 'German' ? 0 : 1; + + $this->addSelect(' + COALESCE( + array_to_json(zgvmaster.bezeichnung::varchar[])->>' . $language_index . ', + array_to_json(zgv.bezeichnung::varchar[])->>' . $language_index . ' + ) AS bezeichnung' + ); + + $this->addJoin('bis.tbl_zgv zgv', 'zgv_code', 'LEFT'); + $this->addJoin('bis.tbl_zgvmaster zgvmaster', 'zgvmas_code', 'LEFT'); + + return $this->loadWhere(array( + 'prestudent_id' => $prestudent_id + )); + } public function getPrestudentByStudiengangAndPerson($studiengang, $person, $studienSemester) { diff --git a/application/models/education/Anrechnung_model.php b/application/models/education/Anrechnung_model.php index b4c7de835..ebecf4118 100644 --- a/application/models/education/Anrechnung_model.php +++ b/application/models/education/Anrechnung_model.php @@ -1,7 +1,11 @@ pk = 'anrechnung_id'; } + /** + * Creates new Anrechnungsantrag. + * Saves new Anrechnung and sets Anrechnungstatus for the new Anrechnung. + * + * @param $prestudent_id + * @param $studiensemester_kurzbz + * @param $lehrveranstaltung_id + * @param $begruendung_id + * @param $dms_id DMS ID of uploaded Nachweisdokument + * @param null $anmerkung_student = Herkunft der Kenntnisse + * @return array + */ + public function createAnrechnungsantrag( + $prestudent_id, $studiensemester_kurzbz, $lehrveranstaltung_id, + $begruendung_id, $dms_id, $anmerkung_student = null + ) + { + // Start DB transaction + $this->db->trans_start(false); + + // Save Anrechnung + $result = $this->AnrechnungModel->insert(array( + 'prestudent_id' => $prestudent_id, + 'lehrveranstaltung_id' => $lehrveranstaltung_id, + 'begruendung_id' => $begruendung_id, + 'dms_id' => $dms_id, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'anmerkung_student' => $anmerkung_student, + 'insertvon' => $this->_uid + )); + + // Store just inserted Anrechnung ID + $lastInsert_anrechnung_id = $result->retval; + + // Save Anrechnungstatus + $this->AnrechnungModel->saveAnrechnungstatus($lastInsert_anrechnung_id, self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL); + + // Transaction complete + $this->db->trans_complete(); + + if ($this->db->trans_status() === false) + { + $this->db->trans_rollback(); + return error('Failed inserting Anrechnung', EXIT_ERROR); + } + + return success($lastInsert_anrechnung_id); + } + /** * Save Anrechnungstatus. * @param $anrechnung_id @@ -83,4 +136,68 @@ class Anrechnung_model extends DB_Model return $this->execQuery($qry, array($anrechnung_id)); } + + /** + * Delete Anrechnungstatus. + * + * @param $anrechnungstatus_id + */ + public function deleteAnrechnungstatus($anrechnungstatus_id){ + + $qry = ' + DELETE FROM lehre.tbl_anrechnung_anrechnungstatus + WHERE anrechnungstatus_id = ? + '; + + return $this->execQuery($qry, array($anrechnungstatus_id)); + } + + /** + * Delete last status approved / rejected. + * If last status is 'approved', Genehmigung is resetted. + * + * @param $anrechnung_id + * @return array + */ + public function withdrawApprovement($anrechnung_id) + { + // Get last Anrechnungstatus + if (!$result = getData($this->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0]) + { + return error('Failed loading Anrechnung'); + } + + $last_status = $result->status_kurzbz; + $anrechnungstatus_id = $result->anrechnungstatus_id; + + // Exit, if last status is not approved / rejected + if ($last_status != self::ANRECHNUNGSTATUS_APPROVED && $last_status != self::ANRECHNUNGSTATUS_REJECTED) + { + return error('Nothing to withdraw. Application is still in progress'); + } + + // Start DB transaction + $this->db->trans_start(false); + + // If Anrechnung was approved + if ($last_status == self::ANRECHNUNGSTATUS_APPROVED) + { + // Reset Genehmigung + $this->AnrechnungModel->update($anrechnung_id, array('genehmigt_von' => NULL)); + } + + // Delete last status approved / rejected + $this->AnrechnungModel->deleteAnrechnungstatus($anrechnungstatus_id); + + // Transaction complete + $this->db->trans_complete(); + + if ($this->db->trans_status() === false) + { + $this->db->trans_rollback(); + return error('Failed withdrawing Genehmigung', EXIT_ERROR); + } + return success(); + + } } diff --git a/application/models/education/Anrechnungbegruendung_model.php b/application/models/education/Anrechnungbegruendung_model.php new file mode 100644 index 000000000..81f1ef614 --- /dev/null +++ b/application/models/education/Anrechnungbegruendung_model.php @@ -0,0 +1,15 @@ +dbTable = 'lehre.tbl_anrechnung_begruendung'; + $this->pk = 'begruendung_id'; + } +} diff --git a/application/models/organisation/Geschaeftsjahr_model.php b/application/models/organisation/Geschaeftsjahr_model.php index 9c856f40e..4f0d03b73 100644 --- a/application/models/organisation/Geschaeftsjahr_model.php +++ b/application/models/organisation/Geschaeftsjahr_model.php @@ -20,8 +20,8 @@ class Geschaeftsjahr_model extends DB_Model { $query = 'SELECT * FROM public.tbl_geschaeftsjahr - WHERE start <= now() - AND ende >= now() + WHERE start <= CURRENT_DATE + AND ende >= CURRENT_DATE ORDER BY start DESC LIMIT 1'; diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php index 41bdabd11..6358ca81e 100644 --- a/application/models/organisation/Studiengang_model.php +++ b/application/models/organisation/Studiengang_model.php @@ -475,7 +475,7 @@ class Studiengang_model extends DB_Model funktion_kurzbz = \'Leitung\' AND ( datum_von <= NOW() OR datum_von IS NULL ) AND ( datum_bis >= NOW() OR datum_bis IS NULL ) - AND studiengang_kz = ' . $this->db->escape($studiengang_kz, FHC_INTEGER) + AND studiengang_kz = ' . $this->db->escape($studiengang_kz) ; } diff --git a/application/views/lehre/anrechnung/approveAnrechnungDetail.php b/application/views/lehre/anrechnung/approveAnrechnungDetail.php index 75059ec69..4603708f4 100644 --- a/application/views/lehre/anrechnung/approveAnrechnungDetail.php +++ b/application/views/lehre/anrechnung/approveAnrechnungDetail.php @@ -12,7 +12,8 @@ $this->load->view( 'phrases' => array( 'global' => array( 'anerkennungNachgewiesenerKenntnisse', - 'antragStellen' + 'antragStellen', + 'begruendung' ), 'ui' => array( 'hilfeZuDieserSeite', @@ -36,7 +37,14 @@ $this->load->view( 'lehrveranstaltung', 'ects', 'lektor', - ) + ), + 'anrechnung' => array( + 'genehmigungAblehnungWirklichZuruecknehmen', + 'empfehlungsanforderungWirklichZuruecknehmen', + 'erfolgreichZurueckgenommen', + 'empfehlungPositivConfirmed', + 'empfehlungNegativConfirmed' + ) ), 'customCSSs' => array( 'public/css/Tabulator.css' @@ -53,7 +61,7 @@ $this->load->view(
- +
- + +
-
-
- - -
-
-
-
- p->t('anrechnung', 'antrag'); ?>  - - - - p->t('anrechnung', 'antragdatum'); ?>: anrechnung_id) ? $anrechnungData->insertamum : '-' ?> -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
p->t('person', 'student')); ?>vorname . ' ' . $antragData->nachname; ?>
p->t('person', 'personenkennzeichen'); ?>matrikelnr ?>
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', 'lektorInnen'); ?> - lektoren) - 1 ?> - lektoren as $key => $lektor): ?> - vorname . ' ' . $lektor->nachname; - echo $key === $len ? '' : ', ' ?> - -
p->t('anrechnung', 'herkunftDerKenntnisse'); ?>anmerkung ?>
p->t('anrechnung', 'nachweisdokumente'); ?> - dokumentname) ?> -
-
-
-
- -
-
-
- -
- -
- p->t('anrechnung', 'empfehlung'); ?>  - - -p->t('anrechnung', 'empfehlungInfoTooltipText'); ?> - - -
- p->t('anrechnung', 'empfehlungVon'); ?>: - empfehlung_von ?> -  |  - p->t('anrechnung', 'empfehlungdatum'); ?>: - empfehlung_am ?> -
-
- -
- -
- p->t('anrechnung', 'keineEmpfehlungAngefordert'); ?> -
- -
- p->t('anrechnung', 'empfehlungAngefordertNochKeineEmpfehlung'); ?> - - empfehlung_angefordert_am ?> - . -
- -
- p->t('anrechnung', 'empfehlungPositivConfirmed'); ?> -
- -
-
- p->t('anrechnung', 'empfehlungNegativConfirmed'); ?> -
-
p->t('global', 'begruendung'); ?> - : - notiz) ?> -
-
-
-
-
-
- -
-
-
-

- -
-
- -
- -
- p->t('anrechnung', 'genehmigung'); ?>  - - -p->t('anrechnung', 'genehmigungInfoTooltipText'); ?> - - -
- p->t('anrechnung', 'abgeschlossenVon'); ?>: - abgeschlossen_von ?> -  |  - p->t('anrechnung', 'abschlussdatum'); ?>: - abgeschlossen_am ?> - -
-
- -
- -
- p->t('anrechnung', 'nochKeineGenehmigung'); ?> -
- -
- p->t('anrechnung', 'genehmigungPositiv'); ?> -
- -
-
- p->t('anrechnung', 'genehmigungNegativ'); ?> -
-
p->t('global', 'begruendung'); ?> - : - notiz) ?> -
-
-
-
-
- - - -
-
-
- -
-
- -
-
- -
- - -
- + +
+
+
+
+ p->t('anrechnung', 'antrag'); ?>  + + + + p->t('anrechnung', 'antragdatum'); ?>: anrechnung_id) ? $anrechnungData->insertamum : '-' ?> +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
p->t('person', 'studentIn')); ?>vorname . ' ' . $antragData->nachname; ?>
p->t('person', 'personenkennzeichen'); ?>matrikelnr ?>
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', 'lektorInnen'); ?> + lektoren) - 1 ?> + lektoren as $key => $lektor): ?> + vorname . ' ' . $lektor->nachname; + echo $key === $len ? '' : ', ' ?> + +
p->t('global', 'zgv')); ?>zgv ?>
p->t('anrechnung', 'herkunftDerKenntnisse'); ?>anmerkung ?>
p->t('anrechnung', 'nachweisdokumente'); ?> + dokumentname) ?> +
+
+
+
+
+
+
+ +
+
+
+
+ p->t('anrechnung', 'empfehlung'); ?>  +
+ p->t('anrechnung', 'empfehlungVon'); ?>: + empfehlung_von ?> +  |  + p->t('anrechnung', 'empfehlungdatum'); ?>: + empfehlung_am ?> +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
p->t('anrechnung', 'empfehlungsanfrageAm')); ?> + empfehlungsanfrageAm; ?> +
p->t('anrechnung', 'empfehlungsanfrageAn'); ?> + empfehlungsanfrageAn; ?> +
p->t('anrechnung', 'empfehlungAm')); ?>empfehlung_am ?>
p->t('anrechnung', 'empfehlungVon')); ?>empfehlung_von ?>
p->t('anrechnung', 'empfehlung'); ?>
p->t('global', 'begruendung'); ?> + begruendung) ?> +
+
+
+
+
+ + +
+ + +
+ +
+
+
+
+
+ +
+ + +
+
+
+

+ +
+
+
+
+ p->t('anrechnung', 'genehmigung'); ?>  +
+ p->t('anrechnung', 'abgeschlossenVon'); ?>: + abgeschlossen_von ?> +  |  + p->t('anrechnung', 'abschlussdatum'); ?>: + abgeschlossen_am ?> +
+
+
+ +
+ p->t('anrechnung', 'nochKeineGenehmigung'); ?> +
+ +
+ p->t('anrechnung', 'genehmigungPositiv'); ?> +
+ +
+
+ p->t('anrechnung', 'genehmigungNegativ'); ?> +
+
p->t('global', 'begruendung'); ?> + : + notiz) ?> +
+
+ +
+ + + + + +
+
+
+ +
+ + + +
+
+
+



+
- Status: - status; ?>

+ load->view('lehre/anrechnung/reviewAnrechnungInfo'); ?>
-
-
+ + load->view('templates/FHC-Footer'); ?> diff --git a/application/views/lehre/anrechnung/approveAnrechnungUebersicht.php b/application/views/lehre/anrechnung/approveAnrechnungUebersicht.php index 91d821fde..850affeea 100644 --- a/application/views/lehre/anrechnung/approveAnrechnungUebersicht.php +++ b/application/views/lehre/anrechnung/approveAnrechnungUebersicht.php @@ -13,11 +13,14 @@ $this->load->view( 'tablewidget' => true, 'phrases' => array( 'global' => array( - 'begruendung' + 'begruendung', + 'zgv' ), 'anrechnung' => array( 'nachweisdokumente', 'empfehlung', + 'empfehlungsanfrageAn', + 'empfehlungsanfrageAm', 'confirmTextAntragHatBereitsEmpfehlung', 'herkunft' ), @@ -43,6 +46,7 @@ $this->load->view( 'bitteMindEinenAntragWaehlen', 'bitteBegruendungAngeben', 'empfehlungWurdeAngefordert', + 'empfehlungWurdeAngefordertAusnahmeWoKeineLektoren', 'anrechnungenWurdenGenehmigt', 'anrechnungenWurdenAbgelehnt' ), @@ -155,11 +159,12 @@ $this->load->view(
-
@@ -173,11 +178,12 @@ $this->load->view(
-
@@ -186,7 +192,7 @@ $this->load->view(
-
+
+ ' target='_blank'> + p->t('global', 'antragAnlegen'); ?> + +
-
+
+ class="btn btn-default btn-w200 btn-mr50" type="button"> + p->t('anrechnung', 'empfehlungAnfordern')); ?> + class="btn btn-danger btn-w200" type="button"> + p->t('global', 'ablehnen')); ?> + class="btn btn-primary btn-w200" type="button"> + p->t('global', 'genehmigen')); ?>
diff --git a/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php b/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php index 0ee3fdc57..31e848481 100644 --- a/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php +++ b/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php @@ -1,4 +1,7 @@ >' . $LANGUAGE_INDEX . ', + array_to_json(zgv.bezeichnung::varchar[])->>' . $LANGUAGE_INDEX . ' + ) AS zgv + FROM public.tbl_prestudent + LEFT JOIN bis.tbl_zgv zgv USING (zgv_code) + LEFT JOIN bis.tbl_zgvmaster zgvmaster USING (zgvmas_code) + WHERE prestudent_id = anrechnung.prestudent_id + ) AS zgv, + anrechnung.insertamum::date AS "antragsdatum", empfehlung_anrechnung, (SELECT status_kurzbz FROM lehre.tbl_anrechnungstatus @@ -33,13 +52,47 @@ $query = ' JOIN public.tbl_person AS person USING (person_id) JOIN public.tbl_studiengang AS stg USING (studiengang_kz) JOIN lehre.tbl_lehrveranstaltung AS lv USING (lehrveranstaltung_id) - JOIN campus.tbl_dms_version AS dmsversion USING (dms_id) + LEFT JOIN campus.tbl_dms_version AS dmsversion USING (dms_id) JOIN lehre.tbl_anrechnung_anrechnungstatus USING (anrechnung_id) JOIN lehre.tbl_anrechnung_begruendung AS begruendung USING (begruendung_id) ) SELECT anrechnungen.*, - array_to_json(anrechnungstatus.bezeichnung_mehrsprachig::varchar[])->>' . $LANGUAGE_INDEX . ' AS "status_bezeichnung" + array_to_json(anrechnungstatus.bezeichnung_mehrsprachig::varchar[])->>' . $LANGUAGE_INDEX . ' AS "status_bezeichnung", + CASE + WHEN (anrechnungen.empfehlung_anrechnung IS NULL AND anrechnungen.status_kurzbz = \'' . ANRECHNUNGSTATUS_PROGRESSED_BY_STGL . '\') THEN NULL + ELSE + (SELECT insertamum::date + FROM lehre.tbl_anrechnungstatus + JOIN lehre.tbl_anrechnung_anrechnungstatus USING (status_kurzbz) + WHERE anrechnung_id = anrechnungen.anrechnung_id + AND status_kurzbz = \'' . ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR . '\' + ORDER BY insertamum DESC + LIMIT 1) + END "empfehlungsanfrageAm", + CASE + WHEN (anrechnungen.empfehlung_anrechnung IS NULL AND anrechnungen.status_kurzbz = \'' . ANRECHNUNGSTATUS_PROGRESSED_BY_STGL . '\') THEN NULL + ELSE + (SELECT COALESCE( + STRING_AGG(CONCAT_WS(\' \', vorname, nachname), \', \') FILTER (WHERE lvleiter = TRUE), + STRING_AGG(CONCAT_WS(\' \', vorname, nachname), \', \') FILTER (WHERE lvleiter = FALSE) + ) empfehlungsanfrageAn + FROM ( + SELECT DISTINCT ON (benutzer.uid) uid, vorname, nachname, + CASE WHEN lehrfunktion_kurzbz = \'LV-Leitung\' THEN TRUE ELSE FALSE END AS lvleiter + FROM lehre.tbl_lehreinheit + JOIN lehre.tbl_lehreinheitmitarbeiter lema USING (lehreinheit_id) + JOIN public.tbl_benutzer benutzer ON lema.mitarbeiter_uid = benutzer.uid + JOIN public.tbl_person USING (person_id) + WHERE studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' + AND lehrveranstaltung_id = anrechnungen.lehrveranstaltung_id + AND lema.mitarbeiter_uid NOT like \'_Dummy%\' + AND benutzer.aktiv = TRUE + AND tbl_person.aktiv = TRUE + ORDER BY benutzer.uid, lvleiter DESC, nachname, vorname + ) as tmp_lvlektoren + ) + END "empfehlungsanfrageAn" FROM anrechnungen JOIN lehre.tbl_anrechnungstatus as anrechnungstatus ON (anrechnungstatus.status_kurzbz = anrechnungen.status_kurzbz) WHERE studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' @@ -59,21 +112,28 @@ $filterWidgetArray = array( 'studiensemester_kurzbz', 'studiengang_kz', ucfirst($this->p->t('lehre', 'studiengang')), + ucfirst($this->p->t('lehre', 'organisationsform')), + 'Semester', ucfirst($this->p->t('lehre', 'lehrveranstaltung')), 'ECTS', ucfirst($this->p->t('person', 'studentIn')), ucfirst($this->p->t('global', 'begruendung')), ucfirst($this->p->t('anrechnung', 'nachweisdokumente')), ucfirst($this->p->t('anrechnung', 'herkunft')), + ucfirst($this->p->t('global', 'zgv')), + ucfirst($this->p->t('anrechnung', 'antragdatum')), ucfirst($this->p->t('anrechnung', 'empfehlung')), 'status_kurzbz', - 'Status' + 'Status', + ucfirst($this->p->t('anrechnung', 'empfehlungsanfrageAm')), + ucfirst($this->p->t('anrechnung', 'empfehlungsanfrageAn')) ), 'datasetRepOptions' => '{ height: func_height(this), layout: "fitColumns", // fit columns to width of table persistentLayout:true, persistentSort:true, + persistentFilter:true, autoResize: false, // prevent auto resizing of table (false to allow adapting table size when cols are (de-)activated headerFilterPlaceholder: " ", index: "anrechnung_id", // assign specific column as unique id (important for row indexing) @@ -100,26 +160,32 @@ $filterWidgetArray = array( } }', // tabulator properties 'datasetRepFieldsDefs' => '{ - anrechnung_id: {visible: false}, - lehrveranstaltung_id: {visible: false}, - begruendung_id: {visible: false}, - dms_id: {visible: false}, - studiensemester_kurzbz: {visible: false}, - studiengang_kz: {visible: false}, + anrechnung_id: {visible: false, headerFilter:"input"}, + lehrveranstaltung_id: {visible: false, headerFilter:"input"}, + begruendung_id: {visible: false, headerFilter:"input"}, + dms_id: {visible: false, headerFilter:"input"}, + studiensemester_kurzbz: {visible: false, headerFilter:"input"}, + studiengang_kz: {visible: false, headerFilter:"input"}, stg_bezeichnung: {headerFilter:"input"}, + orgform_kurzbz: {headerFilter:"input"}, + ausbildungssemester: {headerFilter:"input"}, lv_bezeichnung: {headerFilter:"input"}, ects: {headerFilter:"input", align:"center"}, student: {headerFilter:"input"}, begruendung: {headerFilter:"input"}, + zgv: {visible: false, headerFilter:"input"}, dokument_bezeichnung: {headerFilter:"input", formatter:"link", formatterParams:{ labelField:"dokument_bezeichnung", url:function(cell){return "'. current_url() .'/download?dms_id=" + cell.getData().dms_id}, target:"_blank" }}, anmerkung_student: {headerFilter:"input"}, + antragsdatum: {align:"center", headerFilter:"input", mutator: mut_formatStringDate}, empfehlung_anrechnung: {headerFilter:"input", align:"center", formatter: format_empfehlung_anrechnung, headerFilterFunc: hf_filterTrueFalse}, - status_kurzbz: {visible: false}, - status_bezeichnung: {headerFilter:"input"} + status_kurzbz: {visible: false, headerFilter:"input"}, + status_bezeichnung: {headerFilter:"input"}, + empfehlungsanfrageAm: {visible: false, align:"center", headerFilter:"input", mutator: mut_formatStringDate}, + empfehlungsanfrageAn: {visible: false, headerFilter:"input"} }', // col properties ); diff --git a/application/views/lehre/anrechnung/createAnrechnung.php b/application/views/lehre/anrechnung/createAnrechnung.php new file mode 100644 index 000000000..58b0757b9 --- /dev/null +++ b/application/views/lehre/anrechnung/createAnrechnung.php @@ -0,0 +1,173 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => $this->p->t('anrechnung', 'neueAnrechnung'), + 'jquery' => true, + 'jqueryui' => true, + 'bootstrap' => true, + 'fontawesome' => true, + 'ajaxlib' => true, + 'dialoglib' => true, + 'tabulator' => true, + 'tablewidget' => true, + 'phrases' => array( + 'global' => array( + 'anerkennungNachgewiesenerKenntnisse', + 'antragWurdeGestellt', + 'antragBereitsGestellt', + 'antragBearbeiten' + ), + 'ui' => array( + 'hochladen' + ), + 'lehre' => array( + 'studiensemester', + 'studiengang', + 'lehrveranstaltung' + ) + ), + 'customJSs' => array( + 'public/js/bootstrapper.js', + 'public/js/lehre/anrechnung/createAnrechnung.js' + ), + 'customCSSs' => array( + 'public/css/lehre/anrechnung.css' + ) + ) +); +?> + + +
+
+ + +
+ +
+ + +
+
+
+
+ widgetlib->widget( + 'Studiensemester_widget', + array( + DropdownWidget::SELECTED_ELEMENT => $studiensemester_selected + ), + array( + 'name' => 'studiensemester', + 'id' => 'studiensemester' + ) + ); + ?> +
+ +
+
+
+ + +
+
+ load->view('lehre/anrechnung/createAnrechnungData.php'); ?> +
+
+

+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
p->t('lehre', 'lehrveranstaltung'); ?> * + +
p->t('global', 'begruendung'); ?> * + +
p->t('anrechnung', 'herkunftDerKenntnisse'); ?> + 'herkunftKenntnisse', + 'rows' => 1 + )); ?> +
p->t('anrechnung', 'nachweisdokumente'); ?> * +
'uploadfile', + 'accept' => '.pdf', + 'size' => '50', + 'required' => 'required', + 'enctype' => "multipart/form-data" + )); ?> +
+ +
+
+
+ +
+
+ + + + +
+
+ +
+ + +
+
+ diff --git a/application/views/lehre/anrechnung/createAnrechnungData.php b/application/views/lehre/anrechnung/createAnrechnungData.php new file mode 100644 index 000000000..643c64626 --- /dev/null +++ b/application/views/lehre/anrechnung/createAnrechnungData.php @@ -0,0 +1,84 @@ +>' . $LANGUAGE_INDEX . ', + array_to_json(zgv.bezeichnung::varchar[])->>' . $LANGUAGE_INDEX . ' + ) AS zgv + FROM public.tbl_prestudent + LEFT JOIN bis.tbl_zgv zgv USING (zgv_code) + LEFT JOIN bis.tbl_zgvmaster zgvmaster USING (zgvmas_code) + WHERE prestudent_id = pst.prestudent_id + ) AS zgv + FROM public.tbl_prestudent pst + JOIN public.tbl_prestudentstatus pststatus USING (prestudent_id) + JOIN public.tbl_person person USING (person_id) + JOIN public.tbl_student student USING (prestudent_id) + JOIN public.tbl_benutzer benutzer ON benutzer.uid = student.student_uid + JOIN public.tbl_studiengang stg ON stg.studiengang_kz = pst.studiengang_kz + WHERE pststatus.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' + AND pst.studiengang_kz IN (' . $STUDIENGAENGE_ENTITLED . ') + AND benutzer.aktiv = true + AND pststatus.status_kurzbz = \'Student\' + ORDER BY "stg_bezeichnung", ausbildungssemester, nachname +'; + +$filterWidgetArray = array( + 'query' => $query, + 'tableUniqueId' => 'createAnrechnung', + 'requiredPermissions' => 'lehre/anrechnung_anlegen', + 'datasetRepresentation' => 'tabulator', + 'columnsAliases' => array( + 'prestudent_id', + 'person_id', + 'studienplan_id', + 'studiengang_kz', + ucfirst($this->p->t('lehre', 'studiengang')), + 'Semester', + ucfirst($this->p->t('person', 'nachname')), + ucfirst($this->p->t('person', 'vorname')), + ucfirst($this->p->t('global', 'zgv')) + ), + 'datasetRepOptions' => '{ + height: 300, + layout: "fitColumns", // fit columns to width of table + persistentLayout:true, + autoResize: false, // prevent auto resizing of table (false to allow adapting table size when cols are (de-)activated + headerFilterPlaceholder: " ", + index: "prestudent_id", // assign specific column as unique id (important for row indexing) + selectable: 1, // allow row selection + selectablePersistence:false, // deselect previously selected rows when table is filtered, sorted or paginated + rowSelected: function(row) { + func_rowSelected(row); + }, + rowSelectionChanged:function(data, rows){ + func_rowSelectionChanged(data, rows); + }, + tableWidgetHeader: false + }', + 'datasetRepFieldsDefs' => '{ + prestudent_id: {visible: false, headerFilter:"input"}, + person_id: {visible: false, headerFilter:"input"}, + studienplan_id: {visible: false, headerFilter:"input"}, + studiengang_kz: {visible: false, headerFilter:"input"}, + stg_bezeichnung: {headerFilter:"input"}, + ausbildungssemester: {headerFilter:"input"}, + nachname: {headerFilter:"input"}, + vorname: {headerFilter:"input"}, + zgv: {headerFilter:"input"} + }' +); + +echo $this->widgetlib->widget('TableWidget', $filterWidgetArray); \ No newline at end of file diff --git a/application/views/lehre/anrechnung/requestAnrechnung.php b/application/views/lehre/anrechnung/requestAnrechnung.php index 5d6fa9a16..e507d3846 100644 --- a/application/views/lehre/anrechnung/requestAnrechnung.php +++ b/application/views/lehre/anrechnung/requestAnrechnung.php @@ -1,9 +1,12 @@ load->view( 'templates/FHC-Header', array( 'title' => $this->p->t('anrechnung', 'antragStellen'), 'jquery' => true, + 'jqueryui' => true, 'bootstrap' => true, 'fontawesome' => true, 'ajaxlib' => true, @@ -11,11 +14,23 @@ $this->load->view( 'phrases' => array( 'global' => array( 'anerkennungNachgewiesenerKenntnisse', - 'antragStellen' + 'antragStellen', + 'antragWurdeGestellt', + 'antragBereitsGestellt', + 'bearbeitungGesperrt' ), 'ui' => array( 'hilfeZuDieserSeite', - 'hochladen' + 'hochladen', + 'inBearbeitung', + 'neu', + 'maxZeichen', + 'errorBestaetigungFehlt', + 'systemfehler' + ), + 'anrechnung' => array( + 'deadlineUeberschritten', + 'benotungDerLV' ), 'person' => array( 'student', @@ -47,7 +62,7 @@ $this->load->view(
- +
- - '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'); ?>matrikelnr ?>
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', 'herkunftDerKenntnisse'); ?>  - - - -
-
- -
-
-
-
-
-
- -
- > -
-
-
-
-
+ +
+
+
+ + + +
+
+
+
+ p->t('anrechnung', 'antrag'); ?>  + + + + p->t('anrechnung', 'antragdatum'); ?>: anrechnung_id) ? $anrechnungData->insertamum : '-' ?> +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
p->t('person', 'studentIn')); ?>vorname . ' ' . $antragData->nachname; ?>
p->t('person', 'personenkennzeichen'); ?>matrikelnr ?>
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', 'lektorInnen')); ?> + lektoren) - 1 ?> + lektoren as $key => $lektor): ?> + vorname . ' ' . $lektor->nachname; + echo $key === $len ? '' : ', ' ?> + +
+
+
+
+ +
+
+
+ p->t('anrechnung', 'antragStellenText'); ?>  +
+ +
+
+ +
+
+
+
+ +
+
+
+
+ p->t('anrechnung', 'nachweisdokumente'); ?>  + + + +
+
+
+ +
+ + + + dokumentname) ?> + +
+
+
+
+ +
+
+
+
+
+
+ p->t('anrechnung', 'herkunftDerKenntnisse'); ?>  + + + +
+
+ + p->t('ui', 'maxZeichen'); ?> : +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+
+
+
+



-
- Status: - +
Status: status; ?> -
- -
- p->t('global', 'bearbeitungGesperrt'); ?> - anrechnung_id) ? ': ' . $this->p->t('anrechnung', 'deadlineUeberschritten') : ''; ?> -
- +
+ +
load->view('lehre/anrechnung/requestAnrechnungImportant'); ?>
-
diff --git a/application/views/lehre/anrechnung/reviewAnrechnungDetail.php b/application/views/lehre/anrechnung/reviewAnrechnungDetail.php index 455c31e65..18c70e5af 100644 --- a/application/views/lehre/anrechnung/reviewAnrechnungDetail.php +++ b/application/views/lehre/anrechnung/reviewAnrechnungDetail.php @@ -34,7 +34,11 @@ $this->load->view( 'lehrveranstaltung', 'ects', 'lektor', - ) + ), + 'anrechnung' => array( + 'empfehlungPositivConfirmed', + 'empfehlungNegativConfirmed' + ) ), 'customCSSs' => array( 'public/css/Tabulator.css' @@ -63,199 +67,240 @@ $this->load->view(
-
-
+ +
+
+
+
+ p->t('anrechnung', 'antrag'); ?> +   + + + + p->t('anrechnung', 'antragdatum'); ?>: anrechnung_id) ? $anrechnungData->insertamum : '-' ?> +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
p->t('person', 'studentIn')); ?>vorname . ' ' . $antragData->nachname; ?>
p->t('person', 'personenkennzeichen'); ?>matrikelnr ?>
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', 'lektorInnen'); ?> + lektoren) - 1 ?> + lektoren as $key => $lektor): ?> + vorname . ' ' . $lektor->nachname; + echo $key === $len ? '' : ', ' ?> + +
p->t('global', 'zgv')); ?>zgv ?>
p->t('anrechnung', 'herkunftDerKenntnisse'); ?>anmerkung ?>
p->t('anrechnung', 'nachweisdokumente'); ?> + dokumentname) ?> +
- -
-
-
-
- p->t('anrechnung', 'antrag'); ?> -   - - - - p->t('anrechnung', 'antragdatum'); ?>: anrechnung_id) ? $anrechnungData->insertamum : '-' ?> -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
p->t('person', 'student')); ?>vorname . ' ' . $antragData->nachname; ?>
p->t('person', 'personenkennzeichen'); ?>matrikelnr ?>
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', 'lektorInnen'); ?> - lektoren) - 1 ?> - lektoren as $key => $lektor): ?> - vorname . ' ' . $lektor->nachname; - echo $key === $len ? '' : ', ' ?> - -
p->t('anrechnung', 'herkunftDerKenntnisse'); ?>anmerkung ?>
p->t('anrechnung', 'nachweisdokumente'); ?> - dokumentname) ?> -
-
-
-
- -
-
-
-
- p->t('anrechnung', 'empfehlung'); ?> -
- p->t('anrechnung', 'empfehlungVon'); ?>: - empfehlung_von ?> -  |  - p->t('anrechnung', 'empfehlungdatum'); ?>: - empfehlung_am ?> +
+
+
+
+
+
+ +
+
+
+
+ p->t('anrechnung', 'empfehlung'); ?> +
+ p->t('anrechnung', 'empfehlungVon'); ?>: + empfehlung_von ?> +  |  + p->t('anrechnung', 'empfehlungdatum'); ?>: + empfehlung_am ?> -
-
-
- -
- p->t('anrechnung', 'nochKeineEmpfehlung'); ?> -
- -
- p->t('anrechnung', 'empfehlungPositivConfirmed'); ?> -
- -
-
- p->t('anrechnung', 'empfehlungNegativConfirmed'); ?> -
-
p->t('global', 'begruendung'); ?> - : - notiz) ?> -
-
-
-
-
- - - -
-
-
-
-
-
-
- -
- - -
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
p->t('anrechnung', 'empfehlungsanfrageAm')); ?> + empfehlungsanfrageAm; ?> +
p->t('anrechnung', 'empfehlungsanfrageAn'); ?> + empfehlungsanfrageAn; ?> +
p->t('anrechnung', 'empfehlungAm')); ?> + empfehlung_am ?> +
p->t('anrechnung', 'empfehlungVon')); ?> + empfehlung_von ?> +
p->t('anrechnung', 'empfehlung'); ?>
p->t('global', 'begruendung'); ?> + begruendung) ?> +
+
+
+
+ + +
+
+
+
+
+ + + + + +
+
+ +
+ + +
+
+
diff --git a/application/views/lehre/anrechnung/reviewAnrechnungInfo.php b/application/views/lehre/anrechnung/reviewAnrechnungInfo.php index a89c9c987..4b899d4dc 100644 --- a/application/views/lehre/anrechnung/reviewAnrechnungInfo.php +++ b/application/views/lehre/anrechnung/reviewAnrechnungInfo.php @@ -25,7 +25,7 @@
-
+
p->t('anrechnung', 'reviewAnrechnungInfoAntragVoraussetungenBody'); ?>
diff --git a/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php b/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php index 55c82b4e3..54d0b49d1 100644 --- a/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php +++ b/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php @@ -13,7 +13,8 @@ $this->load->view( 'tablewidget' => true, 'phrases' => array( 'global' => array( - 'begruendung' + 'begruendung', + 'zgv' ), 'anrechnung' => array( 'nachweisdokumente', @@ -154,11 +155,12 @@ $this->load->view(
-
@@ -172,11 +174,12 @@ $this->load->view(
-
@@ -222,9 +225,11 @@ $this->load->view(
+ class="btn btn-danger btn-w200" type="button"> + p->t('anrechnung', 'nichtEmpfehlen')); ?> + class="btn btn-primary btn-w200" type="button"> + p->t('anrechnung', 'empfehlen')); ?>
diff --git a/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php b/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php index 7382df85b..89b3ba70f 100644 --- a/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php +++ b/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php @@ -20,6 +20,16 @@ $query = ' begruendung.bezeichnung AS "begruendung", dmsversion.name AS "dokument_bezeichnung", anrechnung.anmerkung_student, + (SELECT COALESCE( + array_to_json(zgvmaster.bezeichnung::varchar[])->>' . $LANGUAGE_INDEX . ', + array_to_json(zgv.bezeichnung::varchar[])->>' . $LANGUAGE_INDEX . ' + ) AS zgv + FROM public.tbl_prestudent + LEFT JOIN bis.tbl_zgv zgv USING (zgv_code) + LEFT JOIN bis.tbl_zgvmaster zgvmaster USING (zgvmas_code) + WHERE prestudent_id = anrechnung.prestudent_id + ) AS zgv, + anrechnung.insertamum::date AS "antragsdatum", empfehlung_anrechnung, (SELECT status_kurzbz FROM lehre.tbl_anrechnungstatus @@ -33,7 +43,7 @@ $query = ' JOIN public.tbl_person AS person USING (person_id) JOIN public.tbl_studiengang AS stg USING (studiengang_kz) JOIN lehre.tbl_lehrveranstaltung AS lv USING (lehrveranstaltung_id) - JOIN campus.tbl_dms_version AS dmsversion USING (dms_id) + LEFT JOIN campus.tbl_dms_version AS dmsversion USING (dms_id) JOIN lehre.tbl_anrechnung_anrechnungstatus USING (anrechnung_id) JOIN lehre.tbl_anrechnung_begruendung AS begruendung USING (begruendung_id) ) @@ -75,6 +85,8 @@ $filterWidgetArray = array( ucfirst($this->p->t('global', 'begruendung')), ucfirst($this->p->t('anrechnung', 'nachweisdokumente')), ucfirst($this->p->t('anrechnung', 'herkunft')), + ucfirst($this->p->t('global', 'zgv')), + ucfirst($this->p->t('anrechnung', 'antragdatum')), ucfirst($this->p->t('anrechnung', 'empfehlung')), 'status_kurzbz', 'Status' @@ -110,25 +122,27 @@ $filterWidgetArray = array( } }', // tabulator properties 'datasetRepFieldsDefs' => '{ - anrechnung_id: {visible: false}, - lehrveranstaltung_id: {visible: false}, - begruendung_id: {visible: false}, - dms_id: {visible: false}, - studiensemester_kurzbz: {visible: false}, - studiengang_kz: {visible: false}, + anrechnung_id: {visible: false, headerFilter:"input"}, + lehrveranstaltung_id: {visible: false, headerFilter:"input"}, + begruendung_id: {visible: false, headerFilter:"input"}, + dms_id: {visible: false, headerFilter:"input"}, + studiensemester_kurzbz: {visible: false, headerFilter:"input"}, + studiengang_kz: {visible: false, headerFilter:"input"}, stg_bezeichnung: {headerFilter:"input"}, lv_bezeichnung: {headerFilter:"input"}, ects: {headerFilter:"input", align:"center"}, student: {headerFilter:"input"}, begruendung: {headerFilter:"input"}, + zgv: {visible: false, headerFilter:"input"}, dokument_bezeichnung: {headerFilter:"input", formatter:"link", formatterParams:{ labelField:"dokument_bezeichnung", url:function(cell){return "'. current_url() .'/download?dms_id=" + cell.getData().dms_id}, target:"_blank" }}, anmerkung_student: {headerFilter:"input"}, + antragsdatum: {align:"center", headerFilter:"input", mutator: mut_formatStringDate}, empfehlung_anrechnung: {headerFilter:"input", align:"center", formatter: format_empfehlung_anrechnung, headerFilterFunc: hf_filterTrueFalse}, - status_kurzbz: {visible: false}, + status_kurzbz: {visible: false, headerFilter:"input"}, status_bezeichnung: {headerFilter:"input"} }', // col properties ); diff --git a/application/views/organisation/reihungstest/ReihungstestUebersichtData.php b/application/views/organisation/reihungstest/ReihungstestUebersichtData.php index 931a09d80..be41e06c7 100644 --- a/application/views/organisation/reihungstest/ReihungstestUebersichtData.php +++ b/application/views/organisation/reihungstest/ReihungstestUebersichtData.php @@ -106,7 +106,7 @@ public.tbl_reihungstest LEFT JOIN public.tbl_studiengang using(studiengang_kz) WHERE - datum>now()-'5 months'::interval + datum>now()-'12 months'::interval ORDER BY datum desc ) data ", diff --git a/cis/private/lehre/abgabe_student.php b/cis/private/lehre/abgabe_student.php index bec071fa8..2a328dd35 100644 --- a/cis/private/lehre/abgabe_student.php +++ b/cis/private/lehre/abgabe_student.php @@ -1,248 +1,248 @@ - - * Andreas Oesterreicher < andreas.oesterreicher@technikum-wien.at > - * Rudolf Hangl < rudolf.hangl@technikum-wien.at > - * Gerald Simane-Sequens < gerald.simane-sequens@technikum-wien.at > - */ - -require_once('../../../config/cis.config.inc.php'); -require_once('../../../include/functions.inc.php'); -require_once('../../../include/datum.class.php'); -require_once('../../../include/person.class.php'); -require_once('../../../include/benutzer.class.php'); -require_once('../../../include/student.class.php'); -require_once('../../../include/studiengang.class.php'); -require_once('../../../include/benutzerberechtigung.class.php'); -require_once('../../../include/phrasen.class.php'); - -$sprache = getSprache(); -$p = new phrasen($sprache); - -if (!$db = new basis_db()) - die($p->t('global/fehlerBeimOeffnenDerDatenbankverbindung')); - -$getuid=get_uid(); -$uid=$getuid; - -if(isset($_GET['uid'])) -{ - //Studentenansicht - $uid = $_GET['uid']; - //Rechte Pruefen - $allowed=false; - - $student = new student(); - if(!$student->load($uid)) - die($p->t('global/fehlerBeimErmittelnDerUID')); - - $stg_obj = new studiengang(); - if(!$stg_obj->load($student->studiengang_kz)) - die($p->t('global/fehlerBeimLesenAusDatenbank')); - - //Berechtigung ueber das Berechtigungssystem - $rechte = new benutzerberechtigung(); - $rechte->getBerechtigungen($getuid); - if($rechte->isBerechtigt('lehre/abgabetool',$stg_obj->oe_kurzbz,'s')) - $allowed=true; - - //oder Lektor mit Betreuung dieses Studenten - $qry = "SELECT 1 - FROM - lehre.tbl_projektarbeit - JOIN lehre.tbl_projektbetreuer USING(projektarbeit_id) - JOIN campus.vw_benutzer on(vw_benutzer.person_id=tbl_projektbetreuer.person_id) - WHERE - tbl_projektarbeit.student_uid=".$db->db_add_param($uid)." AND - vw_benutzer.uid=".$db->db_add_param($getuid).";"; - - if($result = $db->db_query($qry)) - { - if($db->db_num_rows($result)>0) - { - $allowed=true; - } - } - - if(!$allowed) - { - die($p->t('abgabetool/keineBerechtigungStudentenansicht')); - } -} -$htmlstr = ''; -$htmlstr1 = ''; -$vorname=''; -$nachname=''; -$zweitbetreuer = ''; - -$sql_query = "SELECT (SELECT nachname FROM public.tbl_person WHERE person_id=tbl_projektbetreuer.person_id) AS bnachname, - (SELECT vorname FROM public.tbl_person WHERE person_id=tbl_projektbetreuer.person_id) AS bvorname, - (SELECT titelpre FROM public.tbl_person WHERE person_id=tbl_projektbetreuer.person_id) AS btitelpre, - (SELECT titelpost FROM public.tbl_person WHERE person_id=tbl_projektbetreuer.person_id) AS btitelpost, - (SELECT person_id FROM lehre.tbl_projektbetreuer WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id - AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_person_id, - (SELECT betreuerart_kurzbz FROM lehre.tbl_projektbetreuer WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id - AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_betreuerart_kurzbz, - tbl_projektbetreuer.person_id AS betreuer_person_id, - tbl_projekttyp.bezeichnung AS prjbez, *, - lehre.tbl_projektbetreuer.note as note, - public.tbl_benutzer.aktiv as aktiv, - (SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuer_person_id = tbl_projektbetreuer.person_id) AS babgeschickt, - (SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_abgeschickt - FROM lehre.tbl_projektarbeit - LEFT JOIN lehre.tbl_projektbetreuer USING(projektarbeit_id) - LEFT JOIN public.tbl_benutzer ON(uid=student_uid) - LEFT JOIN public.tbl_person ON(tbl_benutzer.person_id=tbl_person.person_id) - LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) - LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) - LEFT JOIN public.tbl_studiengang USING(studiengang_kz) - LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz) - WHERE (projekttyp_kurzbz='Bachelor' OR projekttyp_kurzbz='Diplom') - AND (tbl_projektbetreuer.betreuerart_kurzbz='Betreuer' - OR tbl_projektbetreuer.betreuerart_kurzbz='Begutachter' - OR tbl_projektbetreuer.betreuerart_kurzbz='Erstbetreuer' - OR tbl_projektbetreuer.betreuerart_kurzbz='Erstbegutachter') - AND tbl_projektarbeit.student_uid=".$db->db_add_param($uid)." - ORDER BY studiensemester_kurzbz desc, tbl_lehrveranstaltung.kurzbz"; - -//AND tbl_projektarbeit.student_uid='$getuid' 'ie07m102'; -if(!$erg=$db->db_query($sql_query)) -{ - $errormsg=$p->t('global/fehlerBeimLesenAusDatenbank'); -} -else -{ - $htmlstr .= "
\n"; - $htmlstr .= "\n"; - $htmlstr .= " - - - - - - - - "; - $htmlstr .= "\n"; - $i = 0; - while($row=$db->db_fetch_object($erg)) - { - $htmlstr1 = ''; - $zweitbetreuer_obj = new person(); - if ($zweitbetreuer_obj->load($row->zweitbetreuer_person_id)) - { - $zweitbetreuer = ', '.$db->convert_html_chars($row->zweitbetreuer_betreuerart_kurzbz).': '.$zweitbetreuer_obj->titelpre.' '.$zweitbetreuer_obj->vorname.' '.$zweitbetreuer_obj->nachname.' '.$zweitbetreuer_obj->titelpost; - } - $htmlstr1 = ''.$db->convert_html_chars($row->betreuerart_kurzbz).': '; - $vorname=$row->vorname; - $nachname=$row->nachname; - $uid=$row->uid; - ($row->btitelpre!=''?$htmlstr1 .= $row->btitelpre.' ':$htmlstr1 .= ''); - $htmlstr1 .= $row->bvorname.' '.$row->bnachname; - ($row->btitelpost!=''?$htmlstr1 .= ' '.$row->btitelpost:$htmlstr1 .= ''); - $htmlstr1 .= $zweitbetreuer; - $htmlstr .= " \n"; //class='liste".($i%2)."' - - if (is_null($row->note) && $row->aktiv === 't') - $htmlstr .= " \n"; - elseif (!is_null($row->babgeschickt) || !is_null($row->zweitbetreuer_abgeschickt)) - { - $htmlstr .= ""; - } else - { - $htmlstr .= ""; - } - - - $htmlstr .= " \n"; - $htmlstr .= " \n"; - $htmlstr .= " "; - $htmlstr .= " \n"; - $htmlstr .= " \n"; - $htmlstr .= " \n"; -// $htmlstr .= " \n"; - $htmlstr .= " \n"; - $i++; - } - $htmlstr .= "
".$p->t('abgabetool/details')."".$p->t('lvplan/sem')."".$p->t('lvplan/stg')."".$p->t('global/mail')."".$p->t('abgabetool/betreuer')."".$p->t('abgabetool/typ')."".$p->t('abgabetool/titel')."
".$p->t('abgabetool/upload').""; - - if (!is_null($row->babgeschickt)) - $htmlstr .= "".$p->t('abgabetool/projektbeurteilungErstDownload').""; - - if (!is_null($row->babgeschickt) && !is_null($row->zweitbetreuer_abgeschickt)) - $htmlstr .= "/"; - - if (!is_null($row->zweitbetreuer_abgeschickt)) - $htmlstr .= "".$p->t('abgabetool/projektbeurteilungZweitDownload').""; - - $htmlstr .= "".$row->studiensemester_kurzbz."".strtoupper($row->typ.$row->kurzbz).""; - - $qry_betr="SELECT mitarbeiter_uid FROM public.tbl_person - JOIN public.tbl_benutzer USING(person_id) - JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid) - WHERE person_id=".$db->db_add_param($row->betreuer_person_id, FHC_INTEGER).";"; - if($result_betr=$db->db_query($qry_betr)) - { - if($row_betr=$db->db_fetch_object($result_betr)) - { - $htmlstr.="email"; - } - else - { - $htmlstr.="UID unknown!"; - } - } - $htmlstr .= " ".$htmlstr1." ".$db->convert_html_chars($row->prjbez)."".$db->convert_html_chars($row->titel)."".$db->convert_html_chars($row->betreuerart_kurzbz)."
\n"; -} -echo ' - - - - Abgabesystem_Studentensicht - - - - - - - - - - - - -'; - - echo '

'.$p->t('abgabetool/ueberschrift'); - if(trim($uid)!='') - echo " ($uid $vorname $nachname)
"; - echo '

'; - echo $htmlstr; - echo ' -'; -?> + + * Andreas Oesterreicher < andreas.oesterreicher@technikum-wien.at > + * Rudolf Hangl < rudolf.hangl@technikum-wien.at > + * Gerald Simane-Sequens < gerald.simane-sequens@technikum-wien.at > + */ + +require_once('../../../config/cis.config.inc.php'); +require_once('../../../include/functions.inc.php'); +require_once('../../../include/datum.class.php'); +require_once('../../../include/person.class.php'); +require_once('../../../include/benutzer.class.php'); +require_once('../../../include/student.class.php'); +require_once('../../../include/studiengang.class.php'); +require_once('../../../include/benutzerberechtigung.class.php'); +require_once('../../../include/phrasen.class.php'); + +$sprache = getSprache(); +$p = new phrasen($sprache); + +if (!$db = new basis_db()) + die($p->t('global/fehlerBeimOeffnenDerDatenbankverbindung')); + +$getuid=get_uid(); +$uid=$getuid; + +if(isset($_GET['uid'])) +{ + //Studentenansicht + $uid = $_GET['uid']; + //Rechte Pruefen + $allowed=false; + + $student = new student(); + if(!$student->load($uid)) + die($p->t('global/fehlerBeimErmittelnDerUID')); + + $stg_obj = new studiengang(); + if(!$stg_obj->load($student->studiengang_kz)) + die($p->t('global/fehlerBeimLesenAusDatenbank')); + + //Berechtigung ueber das Berechtigungssystem + $rechte = new benutzerberechtigung(); + $rechte->getBerechtigungen($getuid); + if($rechte->isBerechtigt('lehre/abgabetool',$stg_obj->oe_kurzbz,'s')) + $allowed=true; + + //oder Lektor mit Betreuung dieses Studenten + $qry = "SELECT 1 + FROM + lehre.tbl_projektarbeit + JOIN lehre.tbl_projektbetreuer USING(projektarbeit_id) + JOIN campus.vw_benutzer on(vw_benutzer.person_id=tbl_projektbetreuer.person_id) + WHERE + tbl_projektarbeit.student_uid=".$db->db_add_param($uid)." AND + vw_benutzer.uid=".$db->db_add_param($getuid).";"; + + if($result = $db->db_query($qry)) + { + if($db->db_num_rows($result)>0) + { + $allowed=true; + } + } + + if(!$allowed) + { + die($p->t('abgabetool/keineBerechtigungStudentenansicht')); + } +} +$htmlstr = ''; +$htmlstr1 = ''; +$vorname=''; +$nachname=''; +$zweitbetreuer = ''; + +$sql_query = "SELECT (SELECT nachname FROM public.tbl_person WHERE person_id=tbl_projektbetreuer.person_id) AS bnachname, + (SELECT vorname FROM public.tbl_person WHERE person_id=tbl_projektbetreuer.person_id) AS bvorname, + (SELECT titelpre FROM public.tbl_person WHERE person_id=tbl_projektbetreuer.person_id) AS btitelpre, + (SELECT titelpost FROM public.tbl_person WHERE person_id=tbl_projektbetreuer.person_id) AS btitelpost, + (SELECT person_id FROM lehre.tbl_projektbetreuer WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id + AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_person_id, + (SELECT betreuerart_kurzbz FROM lehre.tbl_projektbetreuer WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id + AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_betreuerart_kurzbz, + tbl_projektbetreuer.person_id AS betreuer_person_id, + tbl_projekttyp.bezeichnung AS prjbez, *, + lehre.tbl_projektbetreuer.note as note, + public.tbl_benutzer.aktiv as aktiv, + (SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuer_person_id = tbl_projektbetreuer.person_id) AS babgeschickt, + (SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_abgeschickt + FROM lehre.tbl_projektarbeit + LEFT JOIN lehre.tbl_projektbetreuer USING(projektarbeit_id) + LEFT JOIN public.tbl_benutzer ON(uid=student_uid) + LEFT JOIN public.tbl_person ON(tbl_benutzer.person_id=tbl_person.person_id) + LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) + LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) + LEFT JOIN public.tbl_studiengang USING(studiengang_kz) + LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz) + WHERE (projekttyp_kurzbz='Bachelor' OR projekttyp_kurzbz='Diplom') + AND (tbl_projektbetreuer.betreuerart_kurzbz='Betreuer' + OR tbl_projektbetreuer.betreuerart_kurzbz='Begutachter' + OR tbl_projektbetreuer.betreuerart_kurzbz='Erstbetreuer' + OR tbl_projektbetreuer.betreuerart_kurzbz='Erstbegutachter') + AND tbl_projektarbeit.student_uid=".$db->db_add_param($uid)." + ORDER BY studiensemester_kurzbz desc, tbl_lehrveranstaltung.kurzbz"; + +//AND tbl_projektarbeit.student_uid='$getuid' 'ie07m102'; +if(!$erg=$db->db_query($sql_query)) +{ + $errormsg=$p->t('global/fehlerBeimLesenAusDatenbank'); +} +else +{ + $htmlstr .= "
\n"; + $htmlstr .= "\n"; + $htmlstr .= " + + + + + + + + "; + $htmlstr .= "\n"; + $i = 0; + while($row=$db->db_fetch_object($erg)) + { + $htmlstr1 = ''; + $zweitbetreuer_obj = new person(); + if ($zweitbetreuer_obj->load($row->zweitbetreuer_person_id)) + { + $zweitbetreuer = ', '.$db->convert_html_chars($row->zweitbetreuer_betreuerart_kurzbz).': '.$zweitbetreuer_obj->titelpre.' '.$zweitbetreuer_obj->vorname.' '.$zweitbetreuer_obj->nachname.' '.$zweitbetreuer_obj->titelpost; + } + $htmlstr1 = ''.$db->convert_html_chars($row->betreuerart_kurzbz).': '; + $vorname=$row->vorname; + $nachname=$row->nachname; + $uid=$row->uid; + ($row->btitelpre!=''?$htmlstr1 .= $row->btitelpre.' ':$htmlstr1 .= ''); + $htmlstr1 .= $row->bvorname.' '.$row->bnachname; + ($row->btitelpost!=''?$htmlstr1 .= ' '.$row->btitelpost:$htmlstr1 .= ''); + $htmlstr1 .= $zweitbetreuer; + $htmlstr .= " \n"; //class='liste".($i%2)."' + + if (is_null($row->note) && $row->aktiv === 't') + $htmlstr .= " \n"; + elseif (!is_null($row->babgeschickt) || !is_null($row->zweitbetreuer_abgeschickt)) + { + $htmlstr .= ""; + } else + { + $htmlstr .= ""; + } + + + $htmlstr .= " \n"; + $htmlstr .= " \n"; + $htmlstr .= " "; + $htmlstr .= " \n"; + $htmlstr .= " \n"; + $htmlstr .= " \n"; +// $htmlstr .= " \n"; + $htmlstr .= " \n"; + $i++; + } + $htmlstr .= "
".$p->t('abgabetool/details')."".$p->t('lvplan/sem')."".$p->t('lvplan/stg')."".$p->t('global/mail')."".$p->t('abgabetool/betreuer')."".$p->t('abgabetool/typ')."".$p->t('abgabetool/titel')."
".$p->t('abgabetool/upload').""; + + if (!is_null($row->babgeschickt)) + $htmlstr .= "".$p->t('abgabetool/projektbeurteilungErstDownload').""; + + if (!is_null($row->babgeschickt) && !is_null($row->zweitbetreuer_abgeschickt)) + $htmlstr .= "/"; + + if (!is_null($row->zweitbetreuer_abgeschickt)) + $htmlstr .= "".$p->t('abgabetool/projektbeurteilungZweitDownload').""; + + $htmlstr .= "".$row->studiensemester_kurzbz."".strtoupper($row->typ.$row->kurzbz).""; + + $qry_betr="SELECT mitarbeiter_uid FROM public.tbl_person + JOIN public.tbl_benutzer USING(person_id) + JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid) + WHERE person_id=".$db->db_add_param($row->betreuer_person_id, FHC_INTEGER).";"; + if($result_betr=$db->db_query($qry_betr)) + { + if($row_betr=$db->db_fetch_object($result_betr)) + { + $htmlstr.="email"; + } + else + { + $htmlstr.="UID unknown!"; + } + } + $htmlstr .= " ".$htmlstr1." ".$db->convert_html_chars($row->prjbez)."".$db->convert_html_chars($row->titel)."".$db->convert_html_chars($row->betreuerart_kurzbz)."
\n"; +} +echo ' + + + + Abgabesystem_Studentensicht + + + + + + + + + + + + +'; + + echo '

'.$p->t('abgabetool/ueberschrift'); + if(trim($uid)!='') + echo " ($uid $vorname $nachname)
"; + echo '

'; + echo $htmlstr; + echo ' +'; +?> diff --git a/cms/tinymce_dms.php b/cms/tinymce_dms.php index c54fcc385..7aff94860 100644 --- a/cms/tinymce_dms.php +++ b/cms/tinymce_dms.php @@ -33,7 +33,7 @@ $rechte->getBerechtigungen($user); if (! $rechte->isberechtigt('basis/dms', null, 's', null)) die($rechte->errormsg); -?> +?> @@ -160,6 +160,17 @@ if (! $rechte->isberechtigt('basis/dms', null, 's', null)) beschreibungstext = beschreibungstext.replace(/Ze1l3numxbr/g, "\r\n"); document.getElementById("beschreibung-textarea").value = beschreibungstext; } + function updateSchlagworte(schlagworte) + { + document.getElementById("schlagworte-textarea").value = schlagworte; + } + function updateCisSuche(cisSuche) + { + if (cisSuche == true) + document.getElementById("cis_suche_checkbox").checked = true; + else + document.getElementById("cis_suche_checkbox").checked = false; + } var __js_page_array = new Array(); function js_toggle_container(conid) @@ -216,7 +227,7 @@ if (! $rechte->isberechtigt('basis/dms', null, 's', null)) } - +

Dokument Auswählen

-
- - + echo '

Dokument Auswählen

+ + +
'; - echo ' - + echo '
+ + echo ' - + echo ' + +
'; // Link zu Admin-Oberfläche @@ -564,31 +575,31 @@ else echo '
    '; drawKategorieMenue($dms->result); echo '
'; - echo ''; - echo '
'; // Dokumente der Ausgewaehlten Kategorie laden und Anzeigen $dms = new dms(); @@ -714,7 +725,7 @@ else echo '&dpp='.$_GET['dpp']; } echo '&searching=true&searchstring='.$searchstring.'" method="POST" style="float:left">'; - echo '
+ echo ' - - + echo '"> + + Elemente pro Seite  + echo ' + Elemente pro Seite 
'; } else @@ -898,7 +909,7 @@ else echo '&dpp='.$_GET['dpp']; } echo '" method="POST" style="float:left">'; - echo '
+ echo ' + echo '"> Elemente pro Seite  + echo ' + Elemente pro Seite 
'; } else @@ -965,21 +976,21 @@ else } // drawFilesThumb($dms->result); - echo ' -
'; if ($rechte->isberechtigt('basis/dms', $kategorie->kategorie_oe_kurzbz, 'sui')) { - echo ' -
- Neue Datei hochladen -
- -

-
-
+ echo ' +
+ Neue Datei hochladen +
+ +

+
+
'; if (isset($_REQUEST['searching']) && $_REQUEST['searching'] == 'true') { @@ -989,13 +1000,13 @@ else { echo '
'; } - echo ' - - - - - - + echo ' + + +
Beschreibung
+ + + @@ -1003,17 +1014,17 @@ else - - - - - - -
Beschreibung
Schlagworte
(Semikolon getrennt)
CIS-Suche
- - - -
+ + + + + + + + + + +
'; $files = scandir(IMPORT_PATH); $files_count = count($files) - 2; // Minus zwei wegen "." und ".." @@ -1023,9 +1034,9 @@ else } if ($openupload) { - echo ''; } } @@ -1057,56 +1068,56 @@ function drawAllVersions($id) $dms = new dms(); $dms->getAllVersions($id); - echo ' - - - - - + echo ' +
VersionName
+ + + + - + - - - - + + + + '; foreach ($dms->result as $dms_help) { - echo ' - - + echo ' + + - + - - - - + + + + echo ' + + + '; } echo '
VersionName Beschreibung SchlagworteCIS-SucheCIS-Suche KategorieFilename internDatumUser
Filename internDatumUser
'.$dms_help->version.''.$dms_help->name.'
'.$dms_help->version.''.$dms_help->name.' '.$dms_help->beschreibung.' '.$dms_help->schlagworte.''.($dms_help->cis_suche == 'true'?'Ja':'Nein').''.($dms_help->cis_suche == 'true'?'Ja':'Nein').' '.$dms_help->kategorie_kurzbz.''.$dms_help->filename.''.$dms_help->insertamum.''.$dms_help->insertvon.' - '.$dms_help->filename.''.$dms_help->insertamum.''.$dms_help->insertvon.' +
    +
  • Erweitert +
    • Herunterladen
    • '; if ($rechte->isberechtigt('basis/dms', $kategorie->kategorie_oe_kurzbz, 'su')) echo '
    • Datei umbenennen
    • '; if ($rechte->isberechtigt('basis/dms', $kategorie->kategorie_oe_kurzbz, 'suid')) echo '
    • Löschen
    • '; - echo '
    -
  • -
-
'; @@ -1121,41 +1132,41 @@ function drawFilesFromImport() if ($handle = opendir(IMPORT_PATH)) { - echo ''; - echo '

Files im Import Ordner

- + echo '

Files im Import Ordner

+
'; while (false !== ($file = readdir($handle))) { if ($file != '.' && $file != '..') { - echo ' - - - + echo ' + + + '; } } - echo ' - - - - - + echo ' + + + + +
File
- '.$file.' - - Upload -
+ '.$file.' + + Upload +
'; closedir($handle); } @@ -1247,44 +1258,44 @@ function drawFilesList($rows) if (count($rows) > 0) { - echo ' - + echo ' + widgets: ["zebra"] + }); + }); + '; } - echo ' - - - - + echo ' +
Titel
+ + + '; if ($suche == true) { echo ''; } - echo ' - - + echo ' + + - - - - + + + + '; $i = 0; foreach ($rows as $row) @@ -1295,8 +1306,8 @@ function drawFilesList($rows) else $i++; - echo ' - + echo ' + '; $datum = new datum(); @@ -1335,10 +1346,10 @@ function drawFilesList($rows) echo ''; echo ''; @@ -1540,15 +1554,15 @@ function drawRenameForm($dms_id, $version, $page = NULL, $dpp = NULL, $searching echo '&dpp='.$dpp; echo '" method="POST">'; } - echo ' -
Titel VKategorie ID ID Beschreibung SchlagworteCIS-Suche
CIS-Suche
'; if (array_key_exists($row->mimetype, $mimetypes)) echo ''; @@ -1312,9 +1323,9 @@ function drawFilesList($rows) $newerVersionAlert = 'alert(\'Achtung!! Es gibt eine neuere Version dieses Dokuments. Es wird die aktuellste eingefügt.\');'; } - echo ' - - '.$newVersion.' '.$row->name.' + echo ' + + '.$newVersion.' '.$row->name.' '; // Upload einer neuen Version - echo '
    -
  • Erweitert -
      -
    • Auswählen
    • + echo '
        +
      • Erweitert +
          +
        • Auswählen
        • Herunterladen
        • '; if ($rechte->isberechtigt('basis/dms', $kategorie->kategorie_oe_kurzbz, 'sui')) { @@ -1348,7 +1359,10 @@ function drawFilesList($rows) $beschreibungstext = str_replace('"', "D4n7ührung", $beschreibungstext); $beschreibungstext = str_replace("\\", "6Sl4sh", $beschreibungstext); $beschreibungstext = str_replace("\r\n", "Ze1l3numxbr", $beschreibungstext); - echo $beschreibungstext.'\'); return upload(\''.$row->dms_id.'\',\''.$row->name.'\');" style="font-size:small">Neue Version hochladen'; + echo $beschreibungstext.'\'); + updateSchlagworte(\''.$row->schlagworte.'\'); + updateCisSuche(\''.$row->cis_suche.'\'); + return upload(\''.$row->dms_id.'\',\''.$row->name.'\');" style="font-size:small">Neue Version hochladen'; } if (isset($_REQUEST['searching']) && $_REQUEST['searching'] == 'true') { @@ -1490,9 +1504,9 @@ function drawFilesList($rows) if ($rechte->isberechtigt('basis/dms', $kategorie->kategorie_oe_kurzbz, 'suid')) echo '
        • Löschen
        • '; } - echo ' -
        -
      • + echo ' +
      +
    '; echo '
'.$row->dms_id.'
- - - - - - - + echo ' +
Dateiname:
Beschreibung:
+ + + + + + + @@ -1557,12 +1571,12 @@ function drawRenameForm($dms_id, $version, $page = NULL, $dpp = NULL, $searching - -
Dateiname:
Beschreibung:
Schlagworte
(Semikolon getrennt):
CIS-Suche: cis_suche == 'true'?'checked="checked"':'').'>
- - + + + + '; - echo ' + echo ' '; } else @@ -1603,8 +1617,8 @@ function drawChangeKategorie($dms_id, $page = NULL, $dpp = NULL) echo '&dpp='.$dpp; echo '" method="POST">'; } - echo ' - '; foreach ($allKategorien->result as $kategorienResult) @@ -1619,8 +1633,8 @@ function drawChangeKategorie($dms_id, $page = NULL, $dpp = NULL) echo ''; } - echo ' - + echo ' + '; if (! is_null($page)) echo ''; @@ -1629,6 +1643,6 @@ function drawChangeKategorie($dms_id, $page = NULL, $dpp = NULL) echo ''; } -?> - - +?> + + diff --git a/content/student/studentanrechnungenoverlay.xul.php b/content/student/studentanrechnungenoverlay.xul.php index db62917cd..089f70aec 100644 --- a/content/student/studentanrechnungenoverlay.xul.php +++ b/content/student/studentanrechnungenoverlay.xul.php @@ -79,6 +79,10 @@ echo ''; class="sortDirectionIndicator" sort="rdf:http://www.technikum-wien.at/anrechnung/rdf#lehrveranstaltung_bez_kompatibel"/> +