diff --git a/README.md b/README.md index d5620010a..c5212a353 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # FH-Complete * [FH-Complete Homepage](https://www.fhcomplete.org) -* [Wiki](https://wiki.fhcomplete.org/) +* [Wiki](https://wiki.fhcomplete.info/) * [Changelog](CHANGELOG.md) diff --git a/application/controllers/jobs/AnrechnungJob.php b/application/controllers/jobs/AnrechnungJob.php new file mode 100644 index 000000000..2868a8052 --- /dev/null +++ b/application/controllers/jobs/AnrechnungJob.php @@ -0,0 +1,87 @@ +load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); + } + + /** + * Sets the Grades in FAS to angerechnet if the request was successfull + * @return void + */ + public function setAnrechnungGrades() + { + $this->logInfo('Start Anrechnung Grades Job'); + // get all accepted requests that are not in the grades table yet + + // get all placement tests with incorrect studyplan + $qry = " + SELECT + student_uid, lehrveranstaltung_id, studiensemester_kurzbz, genehmigt_von + FROM + lehre.tbl_anrechnung + JOIN public.tbl_student USING(prestudent_id) + WHERE + genehmigt_von is not null + AND EXISTS( + SELECT 1 FROM lehre.tbl_anrechnung_anrechnungstatus + WHERE anrechnung_id = tbl_anrechnung.anrechnung_id + AND status_kurzbz='approved' + AND datum>=now()-'5 days'::interval + ) + AND NOT EXISTS( + SELECT 1 FROM lehre.tbl_zeugnisnote + WHERE + lehrveranstaltung_id = tbl_anrechnung.lehrveranstaltung_id + AND studiensemester_kurzbz = tbl_anrechnung.studiensemester_kurzbz + AND student_uid = tbl_student.student_uid + ) + "; + + $db = new DB_Model(); + $result_grades = $db->execReadOnlyQuery($qry); + + $cnt = 0; + if (hasData($result_grades)) + { + $grades = getData($result_grades); + foreach ($grades as $anrechnung) + { + $cnt++; + // Set zeugnisnote to angerechnet (= note 6) + $ret = $this->ZeugnisnoteModel->insert(array( + 'lehrveranstaltung_id' => $anrechnung->lehrveranstaltung_id, + 'student_uid' => $anrechnung->student_uid, + 'studiensemester_kurzbz' => $anrechnung->studiensemester_kurzbz, + 'uebernahmedatum' => (new DateTime())->format('Y-m-d H:m:i'), + 'benotungsdatum' => (new DateTime())->format('Y-m-d H:m:i'), + 'note' => 6, + 'insertvon' => $anrechnung->genehmigt_von, + 'bemerkung' => 'Digitale Anrechnung' + ) + ); + } + } + $this->logInfo('End Anrechnung Grades Job', array('Number of Grades added'=>$cnt)); + } +} diff --git a/application/controllers/jobs/ReihungstestJob.php b/application/controllers/jobs/ReihungstestJob.php index 859b8f265..ab6c429a0 100644 --- a/application/controllers/jobs/ReihungstestJob.php +++ b/application/controllers/jobs/ReihungstestJob.php @@ -1,7 +1,7 @@ load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); $this->load->model('organisation/Studienplan_model', 'StudienplanModel'); + $this->load->model('crm/buchungstyp_model', 'BuchungstypModel'); // Load helpers $this->load->helper('hlp_sancho_helper'); @@ -799,24 +800,39 @@ class ReihungstestJob extends CLI_Controller * @param string $bcc. Optional. BCC-Mailadress to send the Mails to * @param string $from. Optional. Sender-Mailadress shown to recipient */ - public function prioritizationJob($bcc = null, $from = null) + public function prioritizationJob($studiensemester, $bcc = null, $from = null) { - $qry = " SELECT DISTINCT - get_rolle_prestudent (tbl_prestudent.prestudent_id, 'WS2020') AS laststatus, /* Todo: Studiensemester dynamisch ermitteln oder als Parameter */ - tbl_prestudentstatus.studiensemester_kurzbz, - tbl_prestudent.* + if (!isset($studiensemester) || isEmptyString($studiensemester)) + { + $this->logError("Studiensemster not passed as parameter"); + return; + } + + $qry = "WITH prst AS ( + SELECT DISTINCT + get_rolle_prestudent (tbl_prestudent.prestudent_id, ?) AS laststatus, + tbl_prestudentstatus.studiensemester_kurzbz, + tbl_prestudentstatus.datum AS prestudenstatus_datum, + tbl_prestudent.*, + tbl_studiengang.typ AS studiengang_typ FROM PUBLIC.tbl_person - JOIN PUBLIC.tbl_prestudent USING (person_id) - JOIN PUBLIC.tbl_prestudentstatus USING (prestudent_id) - JOIN lehre.tbl_studienplan USING (studienplan_id) - JOIN lehre.tbl_studienordnung USING (studienordnung_id) - JOIN PUBLIC.tbl_studiengang ON (tbl_studienordnung.studiengang_kz = tbl_studiengang.studiengang_kz) - WHERE tbl_prestudentstatus.datum >= (SELECT CURRENT_DATE -1) - AND get_rolle_prestudent (tbl_prestudent.prestudent_id, 'WS2020') IN ('Aufgenommener','Bewerber','Wartender') - AND studiensemester_kurzbz = 'WS2020' /* Todo: Studiensemester dynamisch ermitteln oder als Parameter */ - AND tbl_studiengang.typ = 'b' - ORDER BY studiengang_kz, laststatus - "; + JOIN PUBLIC.tbl_prestudent USING (person_id) + JOIN PUBLIC.tbl_prestudentstatus USING (prestudent_id) + JOIN lehre.tbl_studienplan USING (studienplan_id) + JOIN lehre.tbl_studienordnung USING (studienordnung_id) + JOIN PUBLIC.tbl_studiengang ON (tbl_studienordnung.studiengang_kz = tbl_studiengang.studiengang_kz) + WHERE get_rolle_prestudent (tbl_prestudent.prestudent_id, ?) IN ('Aufgenommener','Bewerber','Wartender','Abgewiesener') + AND studiensemester_kurzbz = ? + AND tbl_studiengang.typ IN ('b', 'm') + ) + SELECT * FROM prst + WHERE prestudenstatus_datum >= (SELECT CURRENT_DATE - 1) + AND (studiengang_typ = 'b' OR (studiengang_typ = 'm' AND EXISTS (SELECT 1 /* Master Studiengänge berücksichtigen wenn auch Bachelor im gleichen Semester */ + FROM prst prstb + WHERE studiengang_typ = 'b' + AND laststatus != 'Abgewiesener' + AND prstb.person_id = prst.person_id ))) + ORDER BY studiengang_kz, laststatus"; // Encode Params if ($bcc != '') @@ -837,26 +853,22 @@ class ReihungstestJob extends CLI_Controller } $db = new DB_Model(); - $result_prestudents = $db->execReadOnlyQuery($qry); + $result_prestudents = $db->execReadOnlyQuery($qry, array_pad(array(), 3, $studiensemester)); $mailArray = array(); if (hasdata($result_prestudents)) { foreach ($result_prestudents->retval as $row_ps) { - // Wenn der letzte Status "Aufgenommener" ist, alle niedrigeren Prios auf "Abgewiesen" setzen - // falls diese Bewerber oder Warteliste sind - // Danach Kaution einbuchen - if ($row_ps->laststatus == 'Aufgenommener') - { - // Alle niedrigeren Prios laden - $qryNiedrPrios = " + // Alle niedrigeren Prios laden + $qryNiedrPrios = " SELECT DISTINCT get_rolle_prestudent (tbl_prestudent.prestudent_id, '".$row_ps->studiensemester_kurzbz."') AS laststatus, tbl_studienplan.orgform_kurzbz, tbl_person.nachname, tbl_person.vorname, - tbl_prestudent.* + tbl_prestudent.*, + tbl_studiengang.typ AS studiengang_typ FROM PUBLIC.tbl_person JOIN PUBLIC.tbl_prestudent USING (person_id) JOIN PUBLIC.tbl_prestudentstatus USING (prestudent_id) @@ -866,18 +878,30 @@ class ReihungstestJob extends CLI_Controller AND tbl_prestudent.prestudent_id != ".$row_ps->prestudent_id." AND get_rolle_prestudent (tbl_prestudent.prestudent_id, '".$row_ps->studiensemester_kurzbz."') IN ('Aufgenommener','Bewerber','Wartender') AND studiensemester_kurzbz = '".$row_ps->studiensemester_kurzbz."' - AND tbl_studiengang.typ = 'b' + AND tbl_studiengang.typ IN ('b', 'm') AND priorisierung > ".$row_ps->priorisierung." ORDER BY studiengang_kz, laststatus "; + // Wenn der letzte Status "Aufgenommener" ist, alle niedrigeren Prios auf "Abgewiesen" setzen + // falls diese Bewerber oder Warteliste sind + // Danach Kaution einbuchen + if ($row_ps->laststatus == 'Aufgenommener') + { $resultNiedrPrios = $db->execReadOnlyQuery($qryNiedrPrios); if (hasdata($resultNiedrPrios)) { foreach ($resultNiedrPrios->retval as $rowNiedrPrios) { - if ($rowNiedrPrios->laststatus == 'Bewerber') + // nur Info wenn aufgenommen oder master + if ($rowNiedrPrios->laststatus == 'Aufgenommener' || $rowNiedrPrios->studiengang_typ == 'm') + { + // Mail zur Info an Assistenz schicken, dass in höherer Prio aufgenommen wurde + $mailArray[$rowNiedrPrios->studiengang_kz][$rowNiedrPrios->orgform_kurzbz]['AufnahmeHoeherePrio'][] + = $rowNiedrPrios->nachname.' '.$rowNiedrPrios->vorname.' ('.$rowNiedrPrios->prestudent_id.')'; + } + elseif ($rowNiedrPrios->laststatus == 'Bewerber') { // Abgewiesenen-Status mit Statusgrund "Aufnahme anderer Studiengang" (ID 5) setzen $lastStatus = $this->PrestudentstatusModel->getLastStatus($rowNiedrPrios->prestudent_id); @@ -929,43 +953,63 @@ class ReihungstestJob extends CLI_Controller = $rowNiedrPrios->nachname.' '.$rowNiedrPrios->vorname.' ('.$rowNiedrPrios->prestudent_id.')'; } } - elseif ($rowNiedrPrios->laststatus == 'Aufgenommener') - { - // Mail zur Info an Assistenz schicken, dass in höherer Prio aufgenommen wurde - $mailArray[$rowNiedrPrios->studiengang_kz][$rowNiedrPrios->orgform_kurzbz]['AufnahmeHoeherePrio'][] - = $rowNiedrPrios->nachname.' '.$rowNiedrPrios->vorname.' ('.$rowNiedrPrios->prestudent_id.')'; - } } } - // Kaution einbuchen für $row_ps->prestudent_id + // Kaution einbuchen für $row_ps->prestudent_id (für aufgenommenen Bachelor) // Vorher prüfen, ob schon eine Kaution gebucht ist - // Todo: Betrag automatisch aus tbl_buchungstyp laden - $qryKautionExists = " + if ($row_ps->studiengang_typ == 'b') + { + $qryKautionExists = " SELECT count(*) as anzahl FROM public.tbl_konto - WHERE person_id = ".$row_ps->person_id." - AND studiensemester_kurzbz = '".$row_ps->studiensemester_kurzbz."' - AND buchungstyp_kurzbz = 'Kaution'"; + WHERE person_id = " . $row_ps->person_id . " + AND studiensemester_kurzbz = '" . $row_ps->studiensemester_kurzbz . "' + AND buchungstyp_kurzbz = 'StudiengebuehrAnzahlung'"; - $resultKautionExists = $db->execReadOnlyQuery($qryKautionExists); - if (hasdata($resultKautionExists)) - { - if ($resultKautionExists->retval[0]->anzahl == '0') + $resultKautionExists = $db->execReadOnlyQuery($qryKautionExists); + if (hasdata($resultKautionExists)) { - // Todo: Zahlungsreferenz generieren (StudiengangsOE+Buchungsnummer) - $this->KontoModel->insert(array( - "person_id" => $row_ps->person_id, - "studiengang_kz" => $row_ps->studiengang_kz, - "studiensemester_kurzbz" => $row_ps->studiensemester_kurzbz, - "betrag" => -150, - "buchungsdatum" => date('Y-m-d'), - "buchungstext" => 'Kaution', - "buchungstyp_kurzbz" => 'Kaution', - "insertvon" => 'prioritizationJob', - "insertamum" => date('Y-m-d H:i:s') - )); + if ($resultKautionExists->retval[0]->anzahl == '0') + { + // Betrag automatisch aus tbl_buchungstyp laden + $this->BuchungstypModel->addSelect('buchungstyp_kurzbz, standardbetrag, standardtext'); + $buchungstypRes = $this->BuchungstypModel->loadWhere(array('buchungstyp_kurzbz' => 'StudiengebuehrAnzahlung')); + + if (hasData($buchungstypRes)) + { + $buchungstypData = getData($buchungstypRes)[0]; + + $this->KontoModel->insert(array( + "person_id" => $row_ps->person_id, + "studiengang_kz" => $row_ps->studiengang_kz, + "studiensemester_kurzbz" => $row_ps->studiensemester_kurzbz, + "betrag" => $buchungstypData->standardbetrag, + "buchungsdatum" => date('Y-m-d'), + "buchungstext" => $buchungstypData->standardtext, + "buchungstyp_kurzbz" => $buchungstypData->buchungstyp_kurzbz, + "insertvon" => 'prioritizationJob', + "insertamum" => date('Y-m-d H:i:s') + )); + } + else + $this->logError('No Buchungstyp found for Studiengebühr Anzahlung'); + } + } + } + } + elseif ($row_ps->laststatus == 'Abgewiesener') + { + $resultNiedrPrios = $db->execReadOnlyQuery($qryNiedrPrios); + + if (hasdata($resultNiedrPrios)) + { + foreach ($resultNiedrPrios->retval as $rowNiedrPrios) + { + // Mail zur Info an Assistenz schicken, dass in höherer Prio abgewiesen wurde + $mailArray[$rowNiedrPrios->studiengang_kz][$rowNiedrPrios->orgform_kurzbz]['AbgewiesenHoeherePrio'][] + = $rowNiedrPrios->nachname . ' ' . $rowNiedrPrios->vorname . ' (' . $rowNiedrPrios->prestudent_id . ')'; } } } @@ -1015,6 +1059,19 @@ class ReihungstestJob extends CLI_Controller } $mailcontent .= ''; } + if (isset($value['AbgewiesenHoeherePrio']) && !isEmptyArray($value['AbgewiesenHoeherePrio'])) + { + $mailcontent .= '

+ Folgende Bewerber wurden in einem höher priorisierten Studiengang abgewiesen:

'; + $mailcontent .= ''; + $mailcontent .= ' '; + sort($value['AbgewiesenHoeherePrio']); + foreach ($value['AbgewiesenHoeherePrio'] AS $key=>$bewerber) + { + $mailcontent .= ''; + } + $mailcontent .= '
'.$bewerber.'
'; + } if ($bcc != '' && isset($value['AbgewiesenWeilBewerber']) && !isEmptyArray($value['AbgewiesenWeilBewerber'])) { $mailcontent .= '

diff --git a/application/controllers/lehre/Pruefungsprotokoll.php b/application/controllers/lehre/Pruefungsprotokoll.php index 467a7dc71..21f50acca 100644 --- a/application/controllers/lehre/Pruefungsprotokoll.php +++ b/application/controllers/lehre/Pruefungsprotokoll.php @@ -220,7 +220,7 @@ class Pruefungsprotokoll extends Auth_Controller $nullfields = array('uhrzeit', 'endezeit', 'abschlussbeurteilung_kurzbz', 'protokoll'); foreach ($data as $idx => $item) { - if (in_array($idx, $nullfields) & $item === '') + if (in_array($idx, $nullfields) && $item === '') $data[$idx] = null; } diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php new file mode 100644 index 000000000..c5e4b94d8 --- /dev/null +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php @@ -0,0 +1,531 @@ + 'lehre/anrechnung_genehmigen:rw', + 'download' => 'lehre/anrechnung_genehmigen:rw', + 'approve' => 'lehre/anrechnung_genehmigen:rw', + 'reject' => 'lehre/anrechnung_genehmigen:rw', + 'requestRecommendation' => 'lehre/anrechnung_genehmigen: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('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $this->load->model('crm/Student_model', 'StudentModel'); + $this->load->model('person/Notiz_model', 'NotizModel'); + $this->load->model('person/Person_model', 'PersonModel'); + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + + // Load libraries + $this->load->library('WidgetLib'); + $this->load->library('PermissionLib'); + $this->load->library('AnrechnungLib'); + $this->load->library('DmsLib'); + + // Load helpers + $this->load->helper('form'); + $this->load->helper('url'); + $this->load->helper('hlp_sancho_helper'); + + // Load language phrases + $this->loadPhrases( + array( + 'global', + 'ui', + 'anrechnung', + 'person', + 'lehre', + 'table' + ) + ); + + $this->_setAuthUID(); + + $this->setControllerId(); + } + + public function index() + { + $anrechnung_id = $this->input->get('anrechnung_id'); + + if (!is_numeric($anrechnung_id)) + { + show_error('Missing correct parameter'); + } + + // Check if user is entitled to read the Anrechnung + self::_checkIfEntitledToReadAnrechnung($anrechnung_id); + + // Get Anrechung data + if (!$anrechnungData = getData($this->anrechnunglib->getAnrechnungData($anrechnung_id))) + { + show_error('Missing data for Anrechnung.'); + } + + // Get Empfehlung data + if(!$empfehlungData = getData($this->anrechnunglib->getEmpfehlungData($anrechnung_id))) + { + show_error('Missing data for recommendation'); + } + + // Get Genehmigung data + if(!$genehmigungData = getData($this->anrechnunglib->getGenehmigungData($anrechnung_id))) + { + show_error('Missing data for recommendation'); + } + + $viewData = array( + 'antragData' => $this->anrechnunglib->getAntragData( + $student_uid = $this->StudentModel->getUID($anrechnungData->prestudent_id), + $anrechnungData->studiensemester_kurzbz, + $anrechnungData->lehrveranstaltung_id + ), + 'anrechnungData' => $anrechnungData, + 'empfehlungData' => $empfehlungData, + 'genehmigungData' => $genehmigungData + ); + + $this->load->view('lehre/anrechnung/approveAnrechnungDetail.php', $viewData); + } + + /** + * Approve Anrechnungen. + */ + public function approve() + { + $data = $this->input->post('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]; + + if (!$person = getData($this->PersonModel->getByUID($this->_uid))[0]) + { + show_error('Failed retrieving person data'); + } + + foreach ($data as $item) + { + // Approve Anrechnung + if(getData($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 + ); + + if(!$this->_sendSanchoMailToStudent($item['anrechnung_id'], self::ANRECHNUNGSTATUS_APPROVED)) + { + show_error('Failed sending mail'); + } + } + } + + // Output json to ajax + if (isset($json) && !isEmptyArray($json)) + { + return $this->outputJsonSuccess($json); + } + else + { + return $this->outputJsonError('Es wurden keine Anrechnungen genehmigt.'); + } + } + + /** + * Reject Anrechnungen. + */ + public function reject() + { + $data = $this->input->post('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]; + + if (!$person = getData($this->PersonModel->getByUID($this->_uid))[0]) + { + show_error('Failed retrieving person data'); + } + + foreach ($data as $item) + { + // Reject Anrechnung + if(getData($this->anrechnunglib->rejectAnrechnung($item['anrechnung_id'], $item['begruendung']))) + { + $json[]= array( + 'anrechnung_id' => $item['anrechnung_id'], + 'status_kurzbz' => self::ANRECHNUNGSTATUS_REJECTED, + 'status_bezeichnung' => $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'); + } + } + } + + // Output json to ajax + if (isset($json) && !isEmptyArray($json)) + { + return $this->outputJsonSuccess($json); + } + else + { + return $this->outputJsonError('Es wurden keine Anrechnungen genehmigt.'); + } + } + + /** + * Request recommendation for Anrechnungen. + */ + public function requestRecommendation() + { + $data = $this->input->post('data'); + + if(isEmptyArray($data)) + { + 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]; + + foreach ($data as $item) + { + // Approve Anrechnung + if(getData($this->anrechnunglib->requestRecommendation($item['anrechnung_id']))) + { + $json[]= array( + 'anrechnung_id' => $item['anrechnung_id'], + 'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR, + 'status_bezeichnung' => $inProgressLektor, + 'empfehlung_anrechnung' => null, + 'empfehlung_angefordert_am' => (new DateTime())->format('d.m.Y') + ); + } + } + + // 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 (!$this->_sendSanchoMailToLectors($json)) + { + show_error('Failed sending emails'); + } + + return $this->outputJsonSuccess($json); + } + else + { + return $this->outputJsonError('Es wurden keine Empfehlungen angefordert'); + } + } + + /** + * Download and open uploaded document (Nachweisdokument). + */ + public function download() + { + $dms_id = $this->input->get('dms_id'); + + if (!is_numeric($dms_id)) + { + show_error('Wrong parameter'); + } + + // Check if user is entitled to read dms doc + self::_checkIfEntitledToReadDMSDoc($dms_id); + + $this->dmslib->download($dms_id); + } + + /** + * Retrieve the UID of the logged user and checks if it is valid + */ + private function _setAuthUID() + { + $this->_uid = getAuthUID(); + + if (!$this->_uid) show_error('User authentification failed'); + } + + /** + * Check if user is entitled to read this Anrechnung + * @param $anrechnung_id + */ + private function _checkIfEntitledToReadAnrechnung($anrechnung_id) + { + $result = $this->AnrechnungModel->load($anrechnung_id); + + if(!$result = getData($result)[0]) + { + show_error('Failed loading Anrechnung'); + } + + $result = $this->LehrveranstaltungModel->loadWhere(array( + 'lehrveranstaltung_id' => $result->lehrveranstaltung_id + )); + + if(!$result = getData($result)[0]) + { + show_error('Failed loading Lehrveranstaltung'); + } + + // Get STGL + $result = $this->StudiengangModel->getLeitung($result->studiengang_kz); + + if($result = getData($result)[0]) + { + if ($result->uid == $this->_uid) + { + return; + } + } + + show_error('You are not entitled to read this Anrechnung'); + } + + /** + * Check if user is entitled to read dms doc + * @param $dms_id + */ + private function _checkIfEntitledToReadDMSDoc($dms_id) + { + $result = $this->AnrechnungModel->loadWhere(array('dms_id' => $dms_id)); + + if(!$result = getData($result)[0]) + { + show_error('Failed retrieving Anrechnung'); + } + + $result = $this->LehrveranstaltungModel->loadWhere(array( + 'lehrveranstaltung_id' => $result->lehrveranstaltung_id + )); + + if(!$result = getData($result)[0]) + { + show_error('Failed loading Lehrveranstaltung'); + } + + // Get STGL + $result = $this->StudiengangModel->getLeitung($result->studiengang_kz); + + if($result = getData($result)[0]) + { + if ($result->uid == $this->_uid) + { + return; + } + } + + 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 + * @return bool + */ + private function _sendSanchoMailToLectors($mail_params) + { + // Get Lehrveranstaltungen + $anrechnung_arr = array(); + + foreach ($mail_params as $item) + { + $this->AnrechnungModel->addSelect('lehrveranstaltung_id, studiensemester_kurzbz'); + $anrechnung_arr[]= array( + 'lehrveranstaltung_id' => $this->AnrechnungModel->load($item['anrechnung_id'])->retval[0]->lehrveranstaltung_id, + 'studiensemester_kurzbz' => $this->AnrechnungModel->load($item['anrechnung_id'])->retval[0]->studiensemester_kurzbz + ); + } + + $anrechnung_arr = array_unique($anrechnung_arr, SORT_REGULAR); + + + /** + * 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. + * **/ + $lector_arr = $this->_getLectors($anrechnung_arr); + + // Send mail to lectors + foreach ($lector_arr as $lector) + { + $to = $lector->uid; + $vorname = $lector->vorname; + + // Get full name of stgl + $this->load->model('person/Person_model', 'PersonModel'); + if (!$stgl_name = getData($this->PersonModel->getFullName($this->_uid))) + { + 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::REVIEW_ANRECHNUNG_URI; + + // Prepare mail content + $body_fields = array( + 'vorname' => $vorname, + 'stgl_name' => $stgl_name, + 'link' => anchor($url, 'Anrechnungsanträge Übersicht') + ); + + sendSanchoMail( + 'AnrechnungEmpfehlungAnfordern', + $body_fields, + $to, + 'Anerkennung nachgewiesener Kenntnisse: Deine Empfehlung wird benötigt' + ); + } + return true; + } + + /** + * 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. + * @param $anrechnung_arr + * @return array + */ + private function _getLectors($anrechnung_arr) + { + $lector_arr = array(); + + // Get lectors + foreach($anrechnung_arr as $anrechnung) + { + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $result = $this->LehrveranstaltungModel->getLecturersByLv($anrechnung['studiensemester_kurzbz'], $anrechnung['lehrveranstaltung_id']); + + if (!$result = getData($result)) + { + show_error('Failed retrieving lectors of Lehrveranstaltung'); + } + + // 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); + } + + // Now make the lector array aka mail receivers unique + $lector_arr = array_unique($lector_arr, SORT_REGULAR); + + return $lector_arr; + + } + +} diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php new file mode 100644 index 000000000..b2d09fbe1 --- /dev/null +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php @@ -0,0 +1,461 @@ + 'lehre/anrechnung_genehmigen:rw', + 'download' => 'lehre/anrechnung_genehmigen:rw', + 'approve' => 'lehre/anrechnung_genehmigen:rw', + 'reject' => 'lehre/anrechnung_genehmigen:rw', + 'requestRecommendation' => 'lehre/anrechnung_genehmigen:rw' + ) + ); + + // Load models + $this->load->model('education/Anrechnung_model', 'AnrechnungModel'); + $this->load->model('education/Anrechnungstatus_model', 'AnrechnungstatusModel'); + $this->load->model('content/DmsVersion_model', 'DmsVersionModel'); + + // Load libraries + $this->load->library('WidgetLib'); + $this->load->library('PermissionLib'); + $this->load->library('AnrechnungLib'); + $this->load->library('DmsLib'); + + // Load helpers + $this->load->helper('form'); + $this->load->helper('url'); + $this->load->helper('hlp_sancho_helper'); + + // Load language phrases + $this->loadPhrases( + array( + 'global', + 'ui', + 'anrechnung', + 'person', + 'lehre', + 'table' + ) + ); + + $this->_setAuthUID(); + + $this->setControllerId(); + } + + public function index() + { + $studiensemester_kurzbz = $this->input->get('studiensemester'); + + // Retrieve 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 + ); + + $this->load->view('lehre/anrechnung/approveAnrechnungUebersicht.php', $viewData); + } + + /** + * Approve Anrechnungen. + */ + public function approve() + { + $data = $this->input->post('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]; + + foreach ($data as $item) + { + // Approve Anrechnung + if(getData($this->anrechnunglib->approveAnrechnung($item['anrechnung_id']))) + { + $json[]= array( + 'anrechnung_id' => $item['anrechnung_id'], + 'status_kurzbz' => self::ANRECHNUNGSTATUS_APPROVED, + 'status_bezeichnung' => $approved + ); + + if(!$this->_sendSanchoMailToStudent($item['anrechnung_id'], self::ANRECHNUNGSTATUS_APPROVED)) + { + show_error('Failed sending mail'); + } + } + } + + // Output json to ajax + if (isset($json) && !isEmptyArray($json)) + { + return $this->outputJsonSuccess($json); + } + else + { + return $this->outputJsonError('Es wurden keine Anrechnungen genehmigt.'); + } + } + + /** + * Reject Anrechnungen. + */ + public function reject() + { + $data = $this->input->post('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]; + + foreach ($data as $item) + { + // Reject Anrechnung + if(getData($this->anrechnunglib->rejectAnrechnung($item['anrechnung_id'], $item['begruendung']))) + { + $json[]= array( + 'anrechnung_id' => $item['anrechnung_id'], + 'status_kurzbz' => self::ANRECHNUNGSTATUS_REJECTED, + 'status_bezeichnung' => $rejected + ); + + if(!$this->_sendSanchoMailToStudent($item['anrechnung_id'], self::ANRECHNUNGSTATUS_REJECTED)) + { + show_error('Failed sending mail'); + } + } + } + + // Output json to ajax + if (isset($json) && !isEmptyArray($json)) + { + return $this->outputJsonSuccess($json); + } + else + { + return $this->outputJsonError('Es wurden keine Anrechnungen genehmigt.'); + } + } + + /** + * Request recommendation for Anrechnungen. + */ + public function requestRecommendation() + { + $data = $this->input->post('data'); + + if(isEmptyArray($data)) + { + 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]; + + foreach ($data as $item) + { + // Approve Anrechnung + if(getData($this->anrechnunglib->requestRecommendation($item['anrechnung_id']))) + { + $json[]= array( + 'anrechnung_id' => $item['anrechnung_id'], + 'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR, + 'status_bezeichnung' => $inProgressLektor, + 'empfehlung_anrechnung' => null + ); + } + } + + // 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 (!$this->_sendSanchoMailToLectors($json)) + { + show_error('Failed sending emails'); + } + + return $this->outputJsonSuccess($json); + } + else + { + return $this->outputJsonError('Es wurden keine Empfehlungen angefordert'); + } + } + + /** + * Download and open uploaded document (Nachweisdokument). + */ + public function download() + { + $dms_id = $this->input->get('dms_id'); + + if (!is_numeric($dms_id)) + { + show_error('Wrong parameter'); + } + + // Check if user is entitled to read dms doc + self::_checkIfEntitledToReadDMSDoc($dms_id); + + $this->dmslib->download($dms_id); + } + + + /** + * Retrieve the UID of the logged user and checks if it is valid + */ + private function _setAuthUID() + { + $this->_uid = getAuthUID(); + + if (!$this->_uid) show_error('User authentification failed'); + } + + /** + * Check if user is entitled to read dms doc + * @param $dms_id + */ + private function _checkIfEntitledToReadDMSDoc($dms_id) + { + $result = $this->AnrechnungModel->loadWhere(array('dms_id' => $dms_id)); + + if(!$result = getData($result)[0]) + { + show_error('Failed retrieving Anrechnung'); + } + + $result = $this->LehrveranstaltungModel->loadWhere(array( + 'lehrveranstaltung_id' => $result->lehrveranstaltung_id + )); + + + if(!$result = getData($result)[0]) + { + show_error('Failed loading Lehrveranstaltung'); + } + + // Get STGL + $result = $this->StudiengangModel->getLeitung($result->studiengang_kz); + + if($result = getData($result)[0]) + { + if ($result->uid == $this->_uid) + { + return; + } + } + + 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 + * @return bool + */ + private function _sendSanchoMailToLectors($mail_params) + { + // Get Lehrveranstaltungen + $anrechnung_arr = array(); + + foreach ($mail_params as $item) + { + $this->AnrechnungModel->addSelect('lehrveranstaltung_id, studiensemester_kurzbz'); + $anrechnung_arr[]= array( + 'lehrveranstaltung_id' => $this->AnrechnungModel->load($item['anrechnung_id'])->retval[0]->lehrveranstaltung_id, + 'studiensemester_kurzbz' => $this->AnrechnungModel->load($item['anrechnung_id'])->retval[0]->studiensemester_kurzbz + ); + } + + $anrechnung_arr = array_unique($anrechnung_arr, SORT_REGULAR); + + + /** + * 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. + * **/ + $lector_arr = $this->_getLectors($anrechnung_arr); + + // Send mail to lectors + foreach ($lector_arr as $lector) + { + $to = $lector->uid; + $vorname = $lector->vorname; + + // Get full name of stgl + $this->load->model('person/Person_model', 'PersonModel'); + if (!$stgl_name = getData($this->PersonModel->getFullName($this->_uid))) + { + 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::REVIEW_ANRECHNUNG_URI; + + // Prepare mail content + $body_fields = array( + 'vorname' => $vorname, + 'stgl_name' => $stgl_name, + 'link' => anchor($url, 'Anrechnungsanträge Übersicht') + ); + + sendSanchoMail( + 'AnrechnungEmpfehlungAnfordern', + $body_fields, + $to, + 'Anerkennung nachgewiesener Kenntnisse: Deine Empfehlung wird benötigt' + ); + } + return true; + } + + /** + * 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. + * @param $anrechnung_arr + * @return array + */ + private function _getLectors($anrechnung_arr) + { + $lector_arr = array(); + + // Get lectors + foreach($anrechnung_arr as $anrechnung) + { + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $result = $this->LehrveranstaltungModel->getLecturersByLv($anrechnung['studiensemester_kurzbz'], $anrechnung['lehrveranstaltung_id']); + + if (!$result = getData($result)) + { + show_error('Failed retrieving lectors of Lehrveranstaltung'); + } + + // 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); + } + + // Now make the lector array aka mail receivers unique + $lector_arr = array_unique($lector_arr, SORT_REGULAR); + + return $lector_arr; + + } +} \ No newline at end of file diff --git a/application/controllers/lehre/anrechnung/RequestAnrechnung.php b/application/controllers/lehre/anrechnung/RequestAnrechnung.php new file mode 100644 index 000000000..4f589e5f5 --- /dev/null +++ b/application/controllers/lehre/anrechnung/RequestAnrechnung.php @@ -0,0 +1,409 @@ + 'student/anrechnung_beantragen:rw', + 'apply' => 'student/anrechnung_beantragen:rw', + 'download' => 'student/anrechnung_beantragen:rw', + ) + ); + + // Load models + $this->load->model('education/Anrechnung_model', 'AnrechnungModel'); + $this->load->model('content/DmsVersion_model', 'DmsVersionModel'); + + // Load libraries + $this->load->library('WidgetLib'); + $this->load->library('PermissionLib'); + $this->load->library('AnrechnungLib'); + $this->load->library('DmsLib'); + + // Load helpers + $this->load->helper('form'); + $this->load->helper('url'); + $this->load->helper('hlp_sancho_helper'); + + // Load language phrases + $this->loadPhrases( + array( + 'global', + 'ui', + 'anrechnung', + 'person', + 'lehre' + ) + ); + + $this->_setAuthUID(); + + $this->setControllerId(); + } + + public function index() + { + $studiensemester_kurzbz = $this->input->get('studiensemester'); + $lehrveranstaltung_id = $this->input->get('lv_id'); + + if (!is_numeric($lehrveranstaltung_id) || !is_string($studiensemester_kurzbz)) + { + show_error('Missing correct parameter'); + } + + // Check if application deadline is expired + // $is_expired = $this->_checkAntragDeadline($studiensemester_kurzbz); + $is_expired = false; // Set to false until Deadline is defined + + $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'); + + // 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); + + $viewData = array( + 'antragData' => $antragData, + 'anrechnungData' => $anrechnungData, + 'is_expired' => $is_expired, + 'disabled' => $is_expired && empty($anrechnungData->anrechnung_id) || !empty($anrechnungData->anrechnung_id) + ? 'disabled' + : '' + ); + + $this->load->view('lehre/anrechnung/requestAnrechnung.php', $viewData); + } + + /** + * Apply Anrechnungsantrag and send to STGL + */ + public function apply() + { + $anmerkung = $this->input->post('anmerkung'); + $begruendung_id = $this->input->post('begruendung'); + $lehrveranstaltung_id = $this->input->post('lv_id'); + $studiensemester_kurzbz = $this->input->post('studiensemester'); + + if (empty($_FILES['uploadfile']['name'])) + { + show_error('Missing upload file'); + } + + if (!is_numeric($begruendung_id) || !is_numeric($lehrveranstaltung_id) || !is_string($studiensemester_kurzbz)) + { + show_error('Missing correct parameter'); + } + + $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'); + + $result = $this->_getAnrechnung($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id); + if (hasData($result)) + { + show_error('Der Antrag wurde bereits gestellt'); + } + + // Start DB transaction + $this->db->trans_start(false); + + // Upload document + $dms = array( + 'kategorie_kurzbz' => 'anrechnung', + 'version' => 0, + 'name' => $_FILES['uploadfile']['name'], + 'mimetype' => $_FILES['uploadfile']['type'], + 'insertamum' => (new DateTime())->format('Y-m-d H:i:s'), + 'insertvon' => $this->_uid + ); + + if(isError($uploaddata = $this->dmslib->upload($dms, array('pdf')))) + { + show_error(getError($uploaddata)); + } + + // Get PrestudentID + $result = $this->_loadPrestudent($this->_uid, $studiensemester_kurzbz); + + if (!$prestudent = getData($result)[0]) + { + show_error('Failed retrieving prestudent'); + } + + // Save Anrechnung + $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 + )); + + 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); + } + } + + /** + * Download and open uploaded document (Nachweisdokument). + */ + public function download() + { + $dms_id = $this->input->get('dms_id'); + + if (!is_numeric($dms_id)) + { + show_error('Wrong parameter'); + } + + // Check if user is entitled to read dms doc + self::_checkIfEntitledToReadDMSDoc($dms_id); + + $this->dmslib->download($dms_id); + } + + /** + * Retrieve the UID of the logged user and checks if it is valid + */ + private function _setAuthUID() + { + $this->_uid = getAuthUID(); + + if (!$this->_uid) show_error('User authentification failed'); + } + + /** + * Load Prestudent by uid and Studiensemester. + * @param $uid + * @param $studiensemester_kurzbz + * @return mixed + */ + private function _loadPrestudent($uid, $studiensemester_kurzbz) + { + $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + $this->load->model('crm/Student_model', 'StudentModel'); + + $this->PrestudentstatusModel->addJoin('public.tbl_student', 'prestudent_id'); + return $this->PrestudentstatusModel->loadWhere(array( + 'student_uid' => $uid, + 'studiensemester_kurzbz' => $studiensemester_kurzbz + ) + ); + } + + /** + * Check if application deadline is expired. + * @param $studiensemester_kurzbz + * @return bool True if semester start is more then 1 week ago + * @throws Exception + */ + private function _checkAntragDeadline($studiensemester_kurzbz) + { + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $this->StudiensemesterModel->addSelect('start'); + if (!$start = getData($this->StudiensemesterModel->load($studiensemester_kurzbz))) + { + show_error(getError($start)); + } + + $start = new DateTime($start[0]->start); + $today = new DateTime('today midnight'); + + // True if today > application deadline + return ($today > $start->add((new DateInterval(self::DEADLINE_INTERVAL_NACH_SEMESTERSTART)))); + } + + /** + * Check if user is entitled to read dms doc + * @param $dms_id + */ + private function _checkIfEntitledToReadDMSDoc($dms_id) + { + if (!$student = getData($this->StudentModel->load(array('student_uid' => $this->_uid)))[0]) + { + show_error('Failed loading Student'); + } + + $result = $this->AnrechnungModel->loadWhere(array('dms_id' => $dms_id)); + + if($result = getData($result)[0]) + { + if ($result->prestudent_id == $student->prestudent_id) + { + return; + } + } + + show_error('You are not entitled to read this document'); + } + + /** + * Get Anrechnung by Lehrveranstaltung + * @param $lehrveranstaltung_id + * @return mixed + */ + private function _getAnrechnung($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; + } + + /** + * Send mail to STGL (if not available, send to STGL assistance) + * @param $mail_params + */ + private function _sendSanchoMail($mail_params) + { + // 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; + } + + // Get STGL mail address, if available, otherwise get assistance mail address + private function _getSTGLMailAddress($stg_kz) + { + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $result = $this->StudiengangModel->getLeitung($stg_kz); + + // Get STGL mail address, if available + 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)) + { + return array( + $result->retval[0]->email, + '' + ); + } + } + } +} diff --git a/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php new file mode 100644 index 000000000..b9c723eee --- /dev/null +++ b/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php @@ -0,0 +1,397 @@ + 'lehre/anrechnung_empfehlen:rw', + 'download' => 'lehre/anrechnung_empfehlen:rw', + 'recommend' => 'lehre/anrechnung_empfehlen:rw', + 'dontRecommend' => 'lehre/anrechnung_empfehlen: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('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $this->load->model('crm/Student_model', 'StudentModel'); + $this->load->model('person/Notiz_model', 'NotizModel'); + $this->load->model('person/Person_model', 'PersonModel'); + + // Load libraries + $this->load->library('WidgetLib'); + $this->load->library('PermissionLib'); + $this->load->library('AnrechnungLib'); + $this->load->library('DmsLib'); + + // Load helpers + $this->load->helper('form'); + $this->load->helper('url'); + $this->load->helper('hlp_sancho_helper'); + + // Load language phrases + $this->loadPhrases( + array( + 'global', + 'ui', + 'anrechnung', + 'person', + 'lehre', + 'table' + ) + ); + + $this->_setAuthUID(); + + $this->setControllerId(); + } + + public function index() + { + $anrechnung_id = $this->input->get('anrechnung_id'); + + if (!is_numeric($anrechnung_id)) + { + show_error('Missing correct parameter'); + } + + // Check if user is entitled to read this Anrechnung + self::_checkIfEntitledToReadAnrechnung($anrechnung_id); + + // Get Anrechung data + if (!$anrechnungData = getData($this->anrechnunglib->getAnrechnungData($anrechnung_id))) + { + show_error('Missing data for Anrechnung.'); + } + + // Get Empfehlung data + if(!$empfehlungData = getData($this->anrechnunglib->getEmpfehlungData($anrechnung_id))) + { + show_error('Missing data for recommendation'); + } + + $viewData = array( + 'antragData' => $this->anrechnunglib->getAntragData( + $student_uid = $this->StudentModel->getUID($anrechnungData->prestudent_id), + $anrechnungData->studiensemester_kurzbz, + $anrechnungData->lehrveranstaltung_id + ), + 'anrechnungData' => $anrechnungData, + 'empfehlungData' => $empfehlungData + ); + + $this->load->view('lehre/anrechnung/reviewAnrechnungDetail.php', $viewData); + } + + /** + * Recommend Anrechnungen. + */ + public function recommend() + { + $data = $this->input->post('data'); + + if(isEmptyArray($data)) + { + 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]; + + if (!$person = getData($this->PersonModel->getByUID($this->_uid))[0]) + { + show_error('Failed retrieving person data'); + } + + foreach ($data as $item) + { + // Approve Anrechnung + if(getData($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, + 'empfehlung_am' => (new DateTime())->format('d.m.Y'), + 'empfehlung_von' => $person->vorname. ' '. $person->nachname + ); + } + } + + // Output json to ajax + if (isset($json) && !isEmptyArray($json)) + { + /** + * Send mails to STGL (if not present STGL, send to STGL assistance) + * NOTE: mails are sent at the end to ensure sending only one mail to each STGL + * */ + if (!$this->_sendSanchoMails($json, true)) + { + show_error('Failed sending emails'); + } + + return $this->outputJsonSuccess($json); + } + else + { + return $this->outputJsonError('Empfehlungen wurden nicht durchgeführt'); + } + } + + /** + * Dont recommend Anrechnungen. + */ + public function dontRecommend() + { + $data = $this->input->post('data'); + + if(isEmptyArray($data)) + { + 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]; + + if (!$person = getData($this->PersonModel->getByUID($this->_uid))[0]) + { + show_error('Failed retrieving person data'); + } + + foreach ($data as $item) + { + // Approve Anrechnung + if(getData($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'), + 'empfehlung_von' => $person->vorname. ' '. $person->nachname + ); + } + } + + // Output json to ajax + if (isset($json) && !isEmptyArray($json)) + { + // Send mails to STGL (if not present STGL, send to STGL assistance) + if (!$this->_sendSanchoMails($json, false)) + { + show_error('Failed sending emails'); + } + + return $this->outputJsonSuccess($json); + } + else + { + return $this->outputJsonError('Empfehlungen wurden nicht durchgeführt'); + } + } + + /** + * Download and open uploaded document (Nachweisdokument). + */ + public function download() + { + $dms_id = $this->input->get('dms_id'); + + if (!is_numeric($dms_id)) + { + show_error('Wrong parameter'); + } + + // Check if user is entitled to read dms doc + self::_checkIfEntitledToReadDMSDoc($dms_id); + + $this->dmslib->download($dms_id); + } + + + /** + * Retrieve the UID of the logged user and checks if it is valid + */ + private function _setAuthUID() + { + $this->_uid = getAuthUID(); + + if (!$this->_uid) show_error('User authentification failed'); + } + + /** + * Check if user is entitled to read dms doc + * @param $dms_id + */ + private function _checkIfEntitledToReadAnrechnung($anrechnung_id) + { + $result = $this->AnrechnungModel->load($anrechnung_id); + + if(!$result = getData($result)[0]) + { + show_error('Failed retrieving Anrechnung'); + } + + $result = $this->LehrveranstaltungModel + ->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id); + + if($result = getData($result)) + { + $entitled_lector_arr = array_column($result, 'uid'); + + if (in_array($this->_uid, $entitled_lector_arr)) + { + return; + } + } + + show_error('You are not entitled to read this document'); + } + + /** + * Check if user is entitled to read dms doc + * @param $dms_id + */ + private function _checkIfEntitledToReadDMSDoc($dms_id) + { + $result = $this->AnrechnungModel->loadWhere(array('dms_id' => $dms_id)); + + if(!$result = getData($result)[0]) + { + show_error('Failed retrieving Anrechnung'); + } + + $result = $this->LehrveranstaltungModel + ->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id); + + if($result = getData($result)) + { + $entitled_lector_arr = array_column($result, 'uid'); + + if (in_array($this->_uid, $entitled_lector_arr)) + { + return; + } + } + + show_error('You are not entitled to read this document'); + } + + /** + * Send mails to STGL (if not present then to STGL assistance) + * @param $mail_params + * @param $empfehlung + * @return bool + */ + private function _sendSanchoMails($mail_params, $empfehlung) + { + // Get studiengaenge + $studiengang_kz_arr = array(); + + foreach ($mail_params as $item) + { + $this->AnrechnungModel->addSelect('studiengang_kz'); + $this->AnrechnungModel->addJoin('public.tbl_prestudent', 'prestudent_id'); + + $studiengang_kz_arr[]= $this->AnrechnungModel->load($item['anrechnung_id'])->retval[0]->studiengang_kz; + } + + $studiengang_kz_arr = array_unique($studiengang_kz_arr); + + // Send mail to STGL of each studiengang + foreach ($studiengang_kz_arr as $studiengang_kz) + { + // Get STGL mail address, if available, otherwise get assistance mail address + list ($to, $vorname) = $this->_getSTGLMailAddress($studiengang_kz); + + // Get full name of lector + $this->load->model('person/Person_model', 'PersonModel'); + if (!$lector_name = getData($this->PersonModel->getFullName($this->_uid))) + { + 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, + 'lektor_name' => $lector_name, + 'empfehlung' => $empfehlung ? 'positive' : 'negative', + 'link' => anchor($url, 'Anrechnungsanträge Übersicht') + ); + + sendSanchoMail( + 'AnrechnungEmpfehlungAbgeben', + $body_fields, + $to, + 'Anerkennung nachgewiesener Kenntnisse: Empfehlung wurde abgegeben' + ); + } + + return true; + } + + // Get STGL mail address, if available, otherwise get assistance mail address + private function _getSTGLMailAddress($stg_kz) + { + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $result = $this->StudiengangModel->getLeitung($stg_kz); + + // Get STGL mail address, if available + 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)) + { + return array( + $result->retval[0]->email, + '' + ); + } + } + } + +} diff --git a/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php b/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php new file mode 100644 index 000000000..005cde97a --- /dev/null +++ b/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php @@ -0,0 +1,337 @@ + 'lehre/anrechnung_empfehlen:rw', + 'download' => 'lehre/anrechnung_empfehlen:rw', + 'recommend' => 'lehre/anrechnung_empfehlen:rw', + 'dontRecommend' => 'lehre/anrechnung_empfehlen: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('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'); + $this->load->helper('hlp_sancho_helper'); + + // Load language phrases + $this->loadPhrases( + array( + 'global', + 'ui', + 'anrechnung', + 'person', + 'lehre', + 'table' + ) + ); + + $this->_setAuthUID(); + + $this->setControllerId(); + } + + public function index() + { + $studiensemester_kurzbz = $this->input->get('studiensemester'); + + 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 + ); + + $this->load->view('lehre/anrechnung/reviewAnrechnungUebersicht.php', $viewData); + } + + /** + * Recommend Anrechnungen. + */ + public function recommend() + { + $data = $this->input->post('data'); + + if(isEmptyArray($data)) + { + 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']))) + { + $json[]= array( + 'anrechnung_id' => $item['anrechnung_id'], + 'empfehlung_anrechnung' => 'true', + 'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL, + 'status_bezeichnung' => $inProgressDP + ); + } + } + + // Output json to ajax + if (isset($json) && !isEmptyArray($json)) + { + /** + * Send mails to STGL (if not present STGL, send to STGL assistance) + * NOTE: mails are sent at the end to ensure sending only one mail to each STGL + * */ + if (!$this->_sendSanchoMails($json, true)) + { + show_error('Failed sending emails'); + } + + return $this->outputJsonSuccess($json); + } + else + { + return $this->outputJsonError('Empfehlungen wurden nicht durchgeführt'); + } + } + + /** + * Dont recommend Anrechnungen. + */ + public function dontRecommend() + { + $data = $this->input->post('data'); + + if(isEmptyArray($data)) + { + 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']))) + { + $json[]= array( + 'anrechnung_id' => $item['anrechnung_id'], + 'empfehlung_anrechnung' => 'false', + 'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL, + 'status_bezeichnung' => $inProgressDP + ); + } + } + + // Output json to ajax + if (isset($json) && !isEmptyArray($json)) + { + // Send mails to STGL (if not present STGL, send to STGL assistance) + if (!$this->_sendSanchoMails($json, false)) + { + show_error('Failed sending emails'); + } + + return $this->outputJsonSuccess($json); + } + else + { + return $this->outputJsonError('Empfehlungen wurden nicht durchgeführt'); + } + } + + /** + * Download and open uploaded document (Nachweisdokument). + */ + public function download() + { + $dms_id = $this->input->get('dms_id'); + + if (!is_numeric($dms_id)) + { + show_error('Wrong parameter'); + } + + // Check if user is entitled to read dms doc + self::_checkIfEntitledToReadDMSDoc($dms_id); + + $this->dmslib->download($dms_id); + } + + + /** + * Retrieve the UID of the logged user and checks if it is valid + */ + private function _setAuthUID() + { + $this->_uid = getAuthUID(); + + if (!$this->_uid) show_error('User authentification failed'); + } + + /** + * Check if user is entitled to read dms doc + * @param $dms_id + */ + private function _checkIfEntitledToReadDMSDoc($dms_id) + { + $result = $this->AnrechnungModel->loadWhere(array('dms_id' => $dms_id)); + + if(!$result = getData($result)[0]) + { + show_error('Failed retrieving Anrechnung'); + } + + $result = $this->LehrveranstaltungModel + ->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id); + + if($result = getData($result)) + { + $entitled_lector_arr = array_column($result, 'uid'); + + if (in_array($this->_uid, $entitled_lector_arr)) + { + return; + } + } + + show_error('You are not entitled to read this document'); + } + + /** + * Send mails to STGL (if not present then to STGL assistance) + * @param $mail_params + * @param $empfehlung + * @return bool + */ + private function _sendSanchoMails($mail_params, $empfehlung) + { + // Get studiengaenge + $studiengang_kz_arr = array(); + + foreach ($mail_params as $item) + { + $this->AnrechnungModel->addSelect('studiengang_kz'); + $this->AnrechnungModel->addJoin('public.tbl_prestudent', 'prestudent_id'); + + $studiengang_kz_arr[]= $this->AnrechnungModel->load($item['anrechnung_id'])->retval[0]->studiengang_kz; + } + + $studiengang_kz_arr = array_unique($studiengang_kz_arr); + + // Send mail to STGL of each studiengang + foreach ($studiengang_kz_arr as $studiengang_kz) + { + // Get STGL mail address, if available, otherwise get assistance mail address + list ($to, $vorname) = $this->_getSTGLMailAddress($studiengang_kz); + + // Get full name of lector + $this->load->model('person/Person_model', 'PersonModel'); + if (!$lector_name = getData($this->PersonModel->getFullName($this->_uid))) + { + 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, + 'lektor_name' => $lector_name, + 'empfehlung' => $empfehlung ? 'positive' : 'negative', + 'link' => anchor($url, 'Anrechnungsanträge Übersicht') + ); + + sendSanchoMail( + 'AnrechnungEmpfehlungAbgeben', + $body_fields, + $to, + 'Anerkennung nachgewiesener Kenntnisse: Empfehlung wurde abgegeben' + ); + } + + return true; + } + + // Get STGL mail address, if available, otherwise get assistance mail address + private function _getSTGLMailAddress($stg_kz) + { + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $result = $this->StudiengangModel->getLeitung($stg_kz); + + // Get STGL mail address, if available + 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)) + { + return array( + $result->retval[0]->email, + '' + ); + } + } + } + +} \ No newline at end of file diff --git a/application/core/JQW_Controller.php b/application/core/JQW_Controller.php index 72a2a972b..1b78a2a70 100644 --- a/application/core/JQW_Controller.php +++ b/application/core/JQW_Controller.php @@ -47,6 +47,19 @@ abstract class JQW_Controller extends JOB_Controller return $jobs; } + /** + * To get the oldest added job using the given job type + */ + protected function getOldestJob($type) + { + $jobs = $this->jobsqueuelib->getOldestJob($type); + + // If an error occurred then log it in database + if (isError($jobs)) $this->logError(getError($jobs), $type); + + return $jobs; + } + /** * To get all the jobs specified by the given parameters */ diff --git a/application/libraries/AnrechnungLib.php b/application/libraries/AnrechnungLib.php new file mode 100644 index 000000000..c32b8a91c --- /dev/null +++ b/application/libraries/AnrechnungLib.php @@ -0,0 +1,643 @@ +ci =& get_instance(); + + $this->ci->load->model('education/Anrechnung_model', 'AnrechnungModel'); + $this->ci->load->model('person/Person_model', 'PersonModel'); + $this->ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $this->ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $this->ci->load->model('crm/Student_model', 'StudentModel'); + $this->ci->load->model('content/DmsVersion_model', 'DmsVersionModel'); + } + + /** + * Get Antrag data + * @param $uid + * @param $studiensemester_kurzbz + * @param $lv_id + * @return StdClass + */ + public function getAntragData($uid, $studiensemester_kurzbz, $lv_id) + { + $antrag_data = new StdClass(); + + // Get lehrveranstaltung data. Break, if course is not assigned to student. + if(!$lv = getData($this->ci->LehrveranstaltungModel->getLvByStudent($uid, $studiensemester_kurzbz, $lv_id))[0]) + { + show_error('You are not assigned to this course yet.'); + } + + // Get the students personal data + if (!$person = getData($this->ci->PersonModel->getByUid($uid))[0]) + { + show_error('Failed loading person data.'); + } + + // Get the internal personenkennzeichen + if (!$student = getData($this->ci->StudentModel->load(array('student_uid' => $uid)))[0]) + { + show_error(getError($student)); + } + + // Get studiengang bezeichnung + if (!$studiengang = getData($this->ci->StudiengangModel->load($lv->studiengang_kz))[0]) + { + show_error('Failed loading studiengang data.'); + } + + // Get lectors of lehrveranstaltung + $antrag_data->lektoren = array(); + if (!$lv_lektoren = getData($this->ci->LehrveranstaltungModel->getLecturersByLv($studiensemester_kurzbz, $lv_id))) + { + show_error('Failed loading course lectors.'); + } + + // Set the given studiensemester + $antrag_data->lv_id = $lv_id; + $antrag_data->lv_bezeichnung = $lv->bezeichnung; + $antrag_data->ects = $lv->ects; + $antrag_data->studiensemester_kurzbz = $studiensemester_kurzbz; + $antrag_data->vorname = $person->vorname; + $antrag_data->nachname = $person->nachname; + $antrag_data->matrikelnr = $student->matrikelnr; + $antrag_data->stg_bezeichnung = $studiengang->bezeichnung; + $antrag_data->lektoren = $lv_lektoren; + + return $antrag_data; + } + + /** + * Get Anrechnung data, last status and Nachweisdokument dms data. + * @param $anrechnung_id + * @return array + * @throws Exception + */ + public function getAnrechnungData($anrechnung_id) + { + if (!is_numeric($anrechnung_id)) + { + show_error('Incorrect parameter'); + } + + $anrechnung_data = new StdClass(); + + $result = $this->ci->AnrechnungModel->load($anrechnung_id); + + if (isError($result)) + { + show_error(getError($result)); + } + + if ($anrechnung = getData($result)[0]) + { + $anrechnung_data = $this->_setAnrechnungDataObject($anrechnung); + } + + return success($anrechnung_data); + + } + + /** + * Get Anrechnung data by Lehrveranstaltung. Also retrieves last status and Nachweisdokument dms data. + * @param $lehrveranstaltung_id + * @return array + * @throws Exception + */ + public function getAnrechnungDataByLv($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id) + { + $anrechnung_data = new StdClass(); + $anrechnung_data->anrechnung_id = ''; + $anrechnung_data->prestudent_id = ''; + $anrechnung_data->lehrveranstaltung = ''; + $anrechnung_data->begruendung_id = ''; + $anrechnung_data->anmerkung = ''; + $anrechnung_data->dms_id = ''; + $anrechnung_data->insertamum = ''; + $anrechnung_data->insertvon = ''; + $anrechnung_data->studiensemester_kurzbz = ''; + $anrechnung_data->empfehlung = ''; + $anrechnung_data->status_kurzbz = ''; + $anrechnung_data->status = getUserLanguage() == 'German' ? 'neu' : 'new'; + $anrechnung_data->dokumentname = ''; + + $result = $this->ci->AnrechnungModel->loadWhere( + array( + 'lehrveranstaltung_id' => $lehrveranstaltung_id, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'prestudent_id' => $prestudent_id + ) + ); + + if (isError($result)) + { + show_error(getError($result)); + } + + if ($anrechnung = getData($result)[0]) + { + $anrechnung_data = $this->_setAnrechnungDataObject($anrechnung); + } + + return success($anrechnung_data); + } + + /** + * Get students data by Anrechnung + * @param $anrechnung_id + * @return mixed + */ + public function getStudentData($anrechnung_id) + { + if (!is_numeric($anrechnung_id)) + { + show_error('Incorrect parameter'); + } + + $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('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id'); + + $result = $this->ci->AnrechnungModel->load($anrechnung_id); + + if (isError($result)) + { + show_error(getError($result)); + } + + if (!hasData($result)) + { + show_error('Failed retrieving students data'); + } + + return $result; + } + + /** + * Get Empfehlung data object. + * @param $anrechnung_id + * @return array + * @throws Exception + */ + public function getEmpfehlungData($anrechnung_id) + { + if (!is_numeric($anrechnung_id)) + { + show_error('Incorrect parameter'); + } + + $empfehlung_data = new stdClass(); + $empfehlung_data->empfehlung = null; + $empfehlung_data->empfehlung_von = '-'; + $empfehlung_data->empfehlung_am = '-'; + $empfehlung_data->empfehlung_angefordert_am = '-'; + $empfehlung_data->notiz = ''; // Begruendung, if not recommended + + + if(!$anrechnung = getData($this->ci->AnrechnungModel->load($anrechnung_id))[0]) + { + show_error('Failed loading Anrechnung'); + } + + // 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]) + { + $empfehlung_data->empfehlung_angefordert_am = (new DateTime($result->insertamum))->format('d.m.Y'); + } + + if (is_null($anrechnung->empfehlung_anrechnung)) + { + return success($empfehlung_data); + } + + // If Empfehlung is true or false + if (!is_null($anrechnung->empfehlung_anrechnung)) + { + // Get last lector and date, where recommendation was given + $result = $this->ci->AnrechnungModel->getLastAnrechnungstatus( + $anrechnung_id, + self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL // when lector sends recommendation, status is set to in progress STGL again + ); + if ($result = getData($result)[0]) + { + $empfehlung_datum = (new DateTime($result->insertamum))->format('d.m.Y'); + } + + // Get full name of lector + $result = $this->ci->PersonModel->getByUID($result->insertvon); + if ($result = getData($result)[0]) + { + $empfehlung_von = $result->vorname. ' '. $result->nachname; + } + + $empfehlung_data->empfehlung = $anrechnung->empfehlung_anrechnung; + $empfehlung_data->empfehlung_von = $empfehlung_von; + $empfehlung_data->empfehlung_am = $empfehlung_datum; + } + + // If Empfehlung is false, retrieve also Notiz with Begruendung + 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; + } + } + + return success($empfehlung_data); + + } + + /** + * Get Genehmigung data object. + * @param $anrechnung_id + * @return array + * @throws Exception + */ + public function getGenehmigungData($anrechnung_id) + { + if (!is_numeric($anrechnung_id)) + { + show_error('Incorrect parameter'); + } + + $genehmigung_data = new stdClass(); + $genehmigung_data->genehmigung = null; + $genehmigung_data->abgeschlossen_von = '-'; + $genehmigung_data->abgeschlossen_am = '-'; + $genehmigung_data->notiz = ''; // Begruendung, if rejected + + + if(!$anrechnung = getData($this->ci->AnrechnungModel->load($anrechnung_id))[0]) + { + show_error('Failed loading Anrechnung'); + } + + // Get date of approvement or rejection + $result = $this->ci->AnrechnungModel->getApprovedOrRejected($anrechnung_id); + + if (!$result = getData($result)[0]) + { + return success($genehmigung_data); + } + + + $genehmigung_data->genehmigung = $result->status_kurzbz == self::ANRECHNUNGSTATUS_APPROVED + ? true + : false; + $genehmigung_data->abgeschlossen_am = (new DateTime($result->insertamum))->format('d.m.Y'); + + // Get full name of lector + $result = $this->ci->PersonModel->getByUID($result->insertvon); + if ($result = getData($result)[0]) + { + $genehmigung_data->abgeschlossen_von = $result->vorname. ' '. $result->nachname; + } + + + // If Anrechnung was rejected, retrieve also Notiz with Begruendung + if (!$genehmigung_data->genehmigung) + { + // 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_STGL); + if ($notiz = getData($result)[0]) + { + $genehmigung_data->notiz = $notiz->text; + } + } + + return success($genehmigung_data); + + } + + /** + * Get last Anrechnungstatusbezeichnung in users language. + * @param $anrechnung_id + * @return mixed + */ + public function getLastAnrechnungstatus($anrechnung_id) + { + $result = $this->ci->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id); + + $status_mehrsprachig = getData($result)[0]->bezeichnung_mehrsprachig; + $status = getUserLanguage() == 'German' ? $status_mehrsprachig[0] : $status_mehrsprachig[1]; + + return $status; + } + + /** + * Approve Anrechnung. + * Checks last status of Anrechnung and will only approve if last status is not approved or rejected. + * @param $anrechnung_id + * @return array + * @throws Exception + */ + public function approveAnrechnung($anrechnung_id) + { + // Check last Anrechnungstatus + if (!$result = getData($this->ci->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0]) + { + show_error(getError($result)); + } + + $status_kurzbz = $result->status_kurzbz; + + // Exit if already approved or rejected + if ($status_kurzbz == self::ANRECHNUNGSTATUS_APPROVED || $status_kurzbz == self::ANRECHNUNGSTATUS_REJECTED) + { + return success(false); // dont approve + } + + // Start DB transaction + $this->ci->db->trans_start(false); + + $stgl_uid = getAuthUID(); + + // Insert new status approved + $this->ci->AnrechnungModel->saveAnrechnungstatus($anrechnung_id, self::ANRECHNUNGSTATUS_APPROVED); + + // Update genehmigt von + $this->ci->AnrechnungModel->update( + $anrechnung_id, + array( + 'genehmigt_von' => $stgl_uid + ) + ); + + // Transaction complete + $this->ci->db->trans_complete(); + + if ($this->ci->db->trans_status() === false) + { + $this->ci->db->trans_rollback(); + return error($result->msg, EXIT_ERROR); + } + + return success(true); // approved + } + + /** + * Reject Anrechnung. + * @param $anrechnung_id + * @return array + */ + public function rejectAnrechnung($anrechnung_id, $begruendung) + { + // Check last Anrechnungstatus + if (!$result = getData($this->ci->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0]) + { + show_error(getError($result)); + } + + $status_kurzbz = $result->status_kurzbz; + + // Exit if already approved or rejected + if ($status_kurzbz == self::ANRECHNUNGSTATUS_APPROVED || $status_kurzbz == self::ANRECHNUNGSTATUS_REJECTED) + { + return success(false); // dont reject + } + + // Insert new status rejected + $result = $this->ci->AnrechnungModel->saveAnrechnungstatus($anrechnung_id, self::ANRECHNUNGSTATUS_REJECTED); + + if (isError($result)) + { + show_error(getError($result)); + } + + // Add begruendung as notiz + $this->ci->load->model('person/Notiz_model', 'NotizModel'); + $this->ci->NotizModel->addNotizForAnrechnung( + $anrechnung_id, + self::ANRECHNUNG_NOTIZTITEL_NOTIZ_BY_STGL, + $begruendung, + getAuthUID() + ); + + return success(true); // rejected + } + + /** + * Request recommendation. + * @param $anrechnung_id + * @return array + */ + public function requestRecommendation($anrechnung_id) + { + // Check last Anrechnungstatus + if (!$result = getData($this->ci->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0]) + { + show_error(getError($result)); + } + + $status_kurzbz = $result->status_kurzbz; + + // Exit if already approved or rejected or processed by lector + if ($status_kurzbz == self::ANRECHNUNGSTATUS_APPROVED + || $status_kurzbz == self::ANRECHNUNGSTATUS_REJECTED + || $status_kurzbz == self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR) + { + return success(false); // dont ask for recommendation + } + + // Start DB transaction + $this->ci->db->trans_start(false); + + // Insert new status inProgressLektor + $result = $this->ci->AnrechnungModel->saveAnrechnungstatus($anrechnung_id, self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR); + + /** + * Anyway update empfehlung_anrechnung to be null + * Regardless of what empfehlung_anrechnung was already set (true/false/null), it should be (reset to ) null by + * requesting a (new) recommendation. + * **/ + $this->ci->AnrechnungModel->update( + $anrechnung_id, + array( + 'empfehlung_anrechnung' => null + ) + ); + + // Transaction complete + $this->ci->db->trans_complete(); + + if ($this->ci->db->trans_status() === false) + { + $this->ci->db->trans_rollback(); + return error($result->msg, EXIT_ERROR); + } + + return success(true); // recommended + } + + /** + * Recommend Anrechnung. + * @param $anrechnung_id + * @return array + * @throws Exception + */ + public function recommendAnrechnung($anrechnung_id) + { + // Check last Anrechnungstatus + if (!$result = getData($this->ci->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0]) + { + show_error(getError($result)); + } + + $status_kurzbz = $result->status_kurzbz; + + // Exit if already approved or rejected + if ($status_kurzbz == self::ANRECHNUNGSTATUS_APPROVED || $status_kurzbz == self::ANRECHNUNGSTATUS_REJECTED) + { + return success(false); // dont approve + } + + // Start DB transaction + $this->ci->db->trans_start(false); + + // Insert new status progessed by stgl + $this->ci->AnrechnungModel->saveAnrechnungstatus($anrechnung_id, self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL); + + // Update empfehlung_anrechnung + $this->ci->AnrechnungModel->update( + $anrechnung_id, + array( + 'empfehlung_anrechnung' => true + ) + ); + + // Transaction complete + $this->ci->db->trans_complete(); + + if ($this->ci->db->trans_status() === false) + { + $this->ci->db->trans_rollback(); + return error($result->msg, EXIT_ERROR); + } + + return success(true); // recommended + } + + /** + * Do not recommend Anrechnung. + * @param $anrechnung_id + * @return array + * @throws Exception + */ + public function dontRecommendAnrechnung($anrechnung_id, $begruendung) + { + // Check last Anrechnungstatus + if (!$result = getData($this->ci->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0]) + { + show_error(getError($result)); + } + + $status_kurzbz = $result->status_kurzbz; + + // Exit if already approved or rejected + if ($status_kurzbz == self::ANRECHNUNGSTATUS_APPROVED || $status_kurzbz == self::ANRECHNUNGSTATUS_REJECTED) + { + return success(false); // dont approve + } + + // Start DB transaction + $this->ci->db->trans_start(false); + + // Insert new status progessed by stgl + $this->ci->AnrechnungModel->saveAnrechnungstatus($anrechnung_id, self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL); + + // Update empfehlung_anrechnung + $this->ci->AnrechnungModel->update( + $anrechnung_id, + array( + 'empfehlung_anrechnung' => false + ) + ); + + $lektor_uid = getAuthUID(); + + // Add begruendung as notiz + $this->ci->load->model('person/Notiz_model', 'NotizModel'); + $this->ci->NotizModel->addNotizForAnrechnung( + $anrechnung_id, + self::ANRECHNUNG_NOTIZTITEL_NOTIZ_BY_LEKTOR, + $begruendung, + $lektor_uid + ); + + // Transaction complete + $this->ci->db->trans_complete(); + + if ($this->ci->db->trans_status() === false) + { + $this->ci->db->trans_rollback(); + return error($result->msg, EXIT_ERROR); + } + + return success(true); // recommended + } + + // Return an object with Anrechnungdata + private function _setAnrechnungDataObject($anrechnung) + { + $anrechnung_data = new StdClass(); + + // Get Anrechnung data + $anrechnung_data->anrechnung_id = $anrechnung->anrechnung_id; + $anrechnung_data->prestudent_id = $anrechnung->prestudent_id; + $anrechnung_data->lehrveranstaltung_id = $anrechnung->lehrveranstaltung_id; + $anrechnung_data->begruendung_id = $anrechnung->begruendung_id; + $anrechnung_data->anmerkung = $anrechnung->anmerkung_student; + $anrechnung_data->dms_id = $anrechnung->dms_id; + $anrechnung_data->insertamum = (new DateTime($anrechnung->insertamum))->format('d.m.Y'); + $anrechnung_data->insertvon= $anrechnung->insertvon; + $anrechnung_data->studiensemester_kurzbz= $anrechnung->studiensemester_kurzbz; + $anrechnung_data->empfehlung= $anrechnung->empfehlung_anrechnung; + + // Get last status_kurzbz + $result = $this->ci->AnrechnungModel->getLastAnrechnungstatus($anrechnung->anrechnung_id); + $anrechnung_data->status_kurzbz = $result->retval[0]->status_kurzbz; + + // Get last status bezeichnung in the users language + $anrechnung_data->status = $this->getLastAnrechnungstatus($anrechnung->anrechnung_id); + + + // Get document name + $this->ci->DmsVersionModel->addSelect('name'); + $result = $this->ci->DmsVersionModel->loadWhere(array('dms_id' => $anrechnung->dms_id)); + + if (isError($result)) + { + show_error(getError($result)); + } + + $anrechnung_data->dokumentname = $result->retval[0]->name; + + return $anrechnung_data; + } +} diff --git a/application/libraries/DmsLib.php b/application/libraries/DmsLib.php index f32df5fd1..da0dd84b6 100644 --- a/application/libraries/DmsLib.php +++ b/application/libraries/DmsLib.php @@ -6,6 +6,9 @@ class DmsLib { const FILE_CONTENT_PROPERTY = 'file_content'; + const FILE_INPUT_NAME = 'uploadfile'; // name of the HTML input tag containing the uploaded file + private $UPLOAD_PATH = DMS_PATH; // temporary directory to store the upload file + /** * Object initialization */ @@ -93,6 +96,84 @@ class DmsLib return $result; } + /** + * Uploads a document and saves it to DMS + * @param $dms DMS assoc array + * @param array $allowed_types Default: all. Param example: array(jpg, pdf) + * @return array + */ + public function upload($dms, $allowed_types = array('*')) + { + // Init upload configs + $this->_loadUploadLibrary($allowed_types); + + if (!$this->ci->upload->do_upload(DmsLib::FILE_INPUT_NAME)) + { + return error($this->ci->upload->display_errors()); + } + + $upload_data = $this->ci->upload->data(); // data about the uploaded file + $filename = $upload_data['file_name']; + + // Insert to DMS table + if (!$result = $this->ci->DmsModel->insert($this->ci->DmsModel->filterFields($dms))) + { + return error('Failed inserting to DMS'); + } + $upload_data['dms_id'] = $result->retval; + + // Insert DMS version + if (!$result = $this->ci->DmsVersionModel->insert( + $this->ci->DmsVersionModel->filterFields($dms, $result->retval, $filename))) + { + return error('Failed inserting DMS version'); + } + + // return result of uploaded data + return success($upload_data); // data about the uploaded file + } + + /** + * Download a document + * @param $dms_id + */ + public function download($dms_id) + { + if (!is_numeric($dms_id)) + { + show_error('Wrong parameter'); + } + + $this->ci->DmsVersionModel->addSelect('filename'); + $result = $this->ci->DmsVersionModel->loadWhere(array('dms_id' => $dms_id)); + + if (isError($result)) + { + show_error(getError($result)); + } + + $filename = $result->retval[0]->filename; + $file = DMS_PATH. $filename; + + if (file_exists($file)) + { + $finfo = new finfo(FILEINFO_MIME); + + header('Content-Description: File Transfer'); + header('Content-Type: '.$finfo->file($file)); + header('Expires: 0'); + header('Cache-Control: must-revalidate'); + header('Pragma: public'); + header('Content-Length: ' . filesize($file)); + readfile($file); + exit; + } + else + { + show_error('File does not exist'); + } + } + /** * Saves a Document * @param object $dms DMS Object ot be saved. @@ -302,4 +383,18 @@ class DmsLib return $result; } + + /** + * Loads the upload library of CI + */ + private function _loadUploadLibrary($allowed_types) + { + $config['upload_path'] = $this->UPLOAD_PATH; + $config['allowed_types'] = implode('|', $allowed_types); + $config['overwrite'] = true; + $config['file_name'] = uniqid().'.pdf'; + + $this->ci->load->library('upload', $config); + $this->ci->upload->initialize($config); + } } diff --git a/application/libraries/JobsQueueLib.php b/application/libraries/JobsQueueLib.php index 0eb7c9b72..a65bb0d29 100644 --- a/application/libraries/JobsQueueLib.php +++ b/application/libraries/JobsQueueLib.php @@ -56,6 +56,19 @@ class JobsQueueLib return $this->_ci->JobsQueueModel->loadWhere(array('status' => self::STATUS_NEW, 'type' => $type)); } + /** + * To get the oldest added jobs using the given job type + */ + public function getOldestJob($type) + { + $this->_ci->JobsQueueModel->resetQuery(); + + $this->_ci->JobsQueueModel->addOrder('creationtime', 'ASC'); + $this->_ci->JobsQueueModel->addLimit('1'); + + return $this->_ci->JobsQueueModel->loadWhere(array('status' => self::STATUS_NEW, 'type' => $type)); + } + /** * To get all the jobs specified by the given parameters */ diff --git a/application/libraries/LDAPLib.php b/application/libraries/LDAPLib.php index 57c8902b5..a119af51e 100644 --- a/application/libraries/LDAPLib.php +++ b/application/libraries/LDAPLib.php @@ -167,7 +167,7 @@ class LDAPLib } // LDAP connection - $ldapConnection = @ldap_connect($ldapConfigs[self::SERVER], $ldapConfigs[self::PORT]); + $ldapConnection = @ldap_connect($ldapConfigs[self::SERVER].':'.$ldapConfigs[self::PORT]); if ($ldapConnection) // if success { // Sets the LDAP protocol version diff --git a/application/models/crm/Student_model.php b/application/models/crm/Student_model.php index 532658208..4d1c84521 100644 --- a/application/models/crm/Student_model.php +++ b/application/models/crm/Student_model.php @@ -45,4 +45,25 @@ class Student_model extends DB_Model $max += 1; return $matrikelnummer.sprintf("%03d", $max); } + + /** + * Get students UID by PrestudentID. + * @param $prestudent_id + * @return mixed + */ + public function getUID($prestudent_id) + { + $this->addSelect('student_uid'); + + $result = $this->loadWhere( + array('prestudent_id' => $prestudent_id) + ); + + if (!hasData($result)) + { + show_error('Failed getting UID by prestudent_id'); + } + + return $result->retval[0]->student_uid; + } } diff --git a/application/models/education/Anrechnung_model.php b/application/models/education/Anrechnung_model.php index f16310fe4..b4c7de835 100644 --- a/application/models/education/Anrechnung_model.php +++ b/application/models/education/Anrechnung_model.php @@ -11,4 +11,76 @@ class Anrechnung_model extends DB_Model $this->dbTable = 'lehre.tbl_anrechnung'; $this->pk = 'anrechnung_id'; } + + /** + * Save Anrechnungstatus. + * @param $anrechnung_id + * @param $status_kurzbz + * @return array|null + */ + public function saveAnrechnungstatus($anrechnung_id, $status_kurzbz) + { + $qry = ' + INSERT INTO lehre.tbl_anrechnung_anrechnungstatus ( + anrechnung_id, status_kurzbz, insertvon + ) VALUES ( ?, ?, ?); + '; + + return $this->execQuery($qry, array($anrechnung_id, $status_kurzbz, getAuthUID())); + } + + /** + * Get the last inserted Anrechnungstatus + * @param $anrechnung_id + * @return array|null + */ + public function getLastAnrechnungstatus($anrechnung_id, $status_kurzbz = null) + { + if (is_string($status_kurzbz)) + { + $qry = ' + SELECT * + FROM lehre.tbl_anrechnungstatus + JOIN lehre.tbl_anrechnung_anrechnungstatus USING (status_kurzbz) + WHERE anrechnung_id = ? + AND status_kurzbz = ? + ORDER BY insertamum DESC + LIMIT 1 + '; + + return $this->execQuery($qry, array($anrechnung_id, $status_kurzbz)); + } + + + $qry = ' + SELECT * + FROM lehre.tbl_anrechnungstatus + JOIN lehre.tbl_anrechnung_anrechnungstatus USING (status_kurzbz) + WHERE anrechnung_id = ? + ORDER BY insertamum DESC + LIMIT 1 + '; + + return $this->execQuery($qry, array($anrechnung_id)); + } + + /** + * Get status approved / rejected, if present. + * @param $anrechnung_id + * @return array|null + */ + public function getApprovedOrRejected($anrechnung_id) + { + $qry = ' + SELECT * + FROM lehre.tbl_anrechnungstatus + JOIN lehre.tbl_anrechnung_anrechnungstatus USING (status_kurzbz) + WHERE anrechnung_id = ? + AND (status_kurzbz = \'approved\' OR status_kurzbz = \'rejected\') + ORDER BY insertamum DESC + LIMIT 1 + '; + + return $this->execQuery($qry, array($anrechnung_id)); + } } diff --git a/application/models/education/Anrechnungstatus_model.php b/application/models/education/Anrechnungstatus_model.php new file mode 100644 index 000000000..6ae5ffd22 --- /dev/null +++ b/application/models/education/Anrechnungstatus_model.php @@ -0,0 +1,15 @@ +dbTable = 'lehre.tbl_anrechnungstatus'; + $this->pk = 'status_kurzbz'; + } +} diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php index d80d02b41..ef5373f5f 100644 --- a/application/models/education/Lehrveranstaltung_model.php +++ b/application/models/education/Lehrveranstaltung_model.php @@ -273,4 +273,24 @@ class Lehrveranstaltung_model extends DB_Model return $this->execQuery($query, $parametersarray); } + + /** + * Gets Lehrveranstaltung and its Lehreinheiten (multiple rows possible). + * Returns empty array if student has no Lehrveranstaltung. + * @param $uid + * @param $studiensemester_kurzbz + * @param $lehrveranstaltung_id + * @return array|null + */ + public function getLvByStudent($uid, $studiensemester_kurzbz, $lehrveranstaltung_id) + { + $query = ' + SELECT * FROM campus.vw_student_lehrveranstaltung + WHERE uid = ? + AND studiensemester_kurzbz = ? + AND lehrveranstaltung_id = ?; + '; + + return $this->execQuery($query, array($uid, $studiensemester_kurzbz, $lehrveranstaltung_id)); + } } diff --git a/application/models/education/Projektbetreuer_model.php b/application/models/education/Projektbetreuer_model.php index 746e4c052..4da88e344 100644 --- a/application/models/education/Projektbetreuer_model.php +++ b/application/models/education/Projektbetreuer_model.php @@ -41,4 +41,23 @@ class Projektbetreuer_model extends DB_Model return error ('Incorrect parameter type'); } } + + /** + * Get Projektbetreuer data by authentification token + * @param $zugangstoken + * @return object + */ + public function getBetreuerByToken($zugangstoken) + { + $qry = ' + SELECT tbl_projektbetreuer.person_id, tbl_projektbetreuer.projektarbeit_id, student_uid + FROM lehre.tbl_projektbetreuer + JOIN lehre.tbl_projektarbeit USING (projektarbeit_id) + WHERE zugangstoken = ? AND zugangstoken_gueltigbis >= NOW() + ORDER BY tbl_projektbetreuer.insertamum DESC, projektarbeit_id DESC + LIMIT 1 + '; + + return $this->execQuery($qry, array($zugangstoken)); + } } diff --git a/application/models/education/Zeugnisnote_model.php b/application/models/education/Zeugnisnote_model.php index 153a170e1..7ed0e6456 100644 --- a/application/models/education/Zeugnisnote_model.php +++ b/application/models/education/Zeugnisnote_model.php @@ -10,5 +10,6 @@ class Zeugnisnote_model extends DB_Model parent::__construct(); $this->dbTable = 'lehre.tbl_zeugnisnote'; $this->pk = array('studiensemester_kurzbz', 'student_uid', 'lehrveranstaltung_id'); + $this->hasSequence = false; } } diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php index 1c9c6e944..8b8be0366 100644 --- a/application/models/organisation/Studiengang_model.php +++ b/application/models/organisation/Studiengang_model.php @@ -448,4 +448,37 @@ class Studiengang_model extends DB_Model return $this->execQuery($query, array($typ)); } + + /** + * Get Studiengangsleitung + * @param null $studiengang_kz + * @return array + */ + public function getLeitung($studiengang_kz = null) + { + $this->addSelect('uid, studiengang_kz, oe_kurzbz, vorname, nachname, email'); + $this->addJoin('public.tbl_benutzerfunktion', 'oe_kurzbz'); + $this->addJoin('public.tbl_benutzer', 'uid'); + $this->addJoin('public.tbl_person', 'person_id'); + + if (is_null($studiengang_kz)) + { + $condition = ' + funktion_kurzbz = \'Leitung\' + AND ( datum_von <= NOW() OR datum_von IS NULL ) + AND ( datum_bis >= NOW() OR datum_bis IS NULL ) + '; + } + elseif (is_numeric($studiengang_kz)) + { + $condition = ' + 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) + ; + } + + return $this->loadWhere($condition); + } } diff --git a/application/models/person/Benutzer_model.php b/application/models/person/Benutzer_model.php index c1e76ce38..eff1329a6 100644 --- a/application/models/person/Benutzer_model.php +++ b/application/models/person/Benutzer_model.php @@ -13,6 +13,11 @@ class Benutzer_model extends DB_Model $this->hasSequence = false; } + /** + * Gets active Benutzer from person_id + * @param $person_id + * @return object + */ public function getFromPersonId($person_id) { return $this->loadWhere(array('person_id' => $person_id, 'aktiv' => true)); diff --git a/application/models/person/Notiz_model.php b/application/models/person/Notiz_model.php index a5453aaa1..2e09875d8 100644 --- a/application/models/person/Notiz_model.php +++ b/application/models/person/Notiz_model.php @@ -158,6 +158,76 @@ class Notiz_model extends DB_Model return $this->loadWhere(array('person_id' => $person_id, 'titel LIKE' => $titel)); } + + /** + * Add a Notiz for a given Anrechnung + * @param $anrechnung_id + * @param $titel + * @param $text + * @param $verfasser_uid + * @return array + */ + public function addNotizForAnrechnung($anrechnung_id, $titel, $text, $verfasser_uid) + { + // Loads model Notizzuordnung_model + $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel'); + + // Start DB transaction + $this->db->trans_start(false); + + $result = $this->insert(array( + 'titel' => $titel, + 'text' => $text, + 'erledigt' => true, + 'verfasser_uid' => $verfasser_uid, + "insertvon" => $verfasser_uid + )); + + if (isSuccess($result)) + { + $notiz_id = $result->retval; + $result = $this->NotizzuordnungModel->insert(array('notiz_id' => $notiz_id, 'anrechnung_id' => $anrechnung_id)); + } + + // Transaction complete! + $this->db->trans_complete(); + + // Check if everything went ok during the transaction + if ($this->db->trans_status() === false || isError($result)) + { + $this->db->trans_rollback(); + $result = error($result->msg, EXIT_ERROR); + } + else + { + $this->db->trans_commit(); + $result = success($notiz_id); + } + + return $result; + } + + /** + * Get Notizen by Anrechnung and title ordered last first + * + * @param $anrechnung_id + * @return array + */ + public function getNotizByAnrechnung($anrechnung_id, $titel = null) + { + $this->addJoin('public.tbl_notizzuordnung', 'notiz_id'); + $this->addOrder('insertamum', 'DESC'); + + if (is_string($titel)) + { + return $this->loadWhere(array( + 'anrechnung_id' => $anrechnung_id, + 'titel' => $titel + )); + } + + return $this->loadWhere(array('anrechnung_id' => $anrechnung_id)); + } // ------------------------------------------------------------------------------------------------------ } diff --git a/application/models/person/Person_model.php b/application/models/person/Person_model.php index d8ddb381c..e005e243c 100644 --- a/application/models/person/Person_model.php +++ b/application/models/person/Person_model.php @@ -191,7 +191,7 @@ class Person_model extends DB_Model */ public function getByUid($uid) { - $this->addSelect('vorname, nachname, gebdatum, person_id'); + $this->addSelect('vorname, nachname, gebdatum, person_id, bpk, matr_nr'); $this->addJoin('tbl_benutzer', 'person_id'); return $this->loadWhere(array('uid' => $uid)); @@ -248,4 +248,19 @@ class Person_model extends DB_Model return $this->execQuery($qry, $parametersArray); } + + /** + * Get full name of given uid. (Vorname Nachname) + * @param $uid + * @return array + */ + public function getFullName($uid) + { + if (!$result = getData($this->getByUid($uid))[0]) + { + show_error('Failed loading person'); + } + + return success($result->vorname. ' '. $result->nachname); + } } diff --git a/application/views/lehre/anrechnung/approveAnrechnungDetail.php b/application/views/lehre/anrechnung/approveAnrechnungDetail.php new file mode 100644 index 000000000..75059ec69 --- /dev/null +++ b/application/views/lehre/anrechnung/approveAnrechnungDetail.php @@ -0,0 +1,359 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => $this->p->t('anrechnung', 'anrechnungenGenehmigen'), + 'jquery' => true, + 'jqueryui' => true, + 'bootstrap' => true, + 'fontawesome' => true, + 'ajaxlib' => true, + 'dialoglib' => true, + 'phrases' => array( + 'global' => array( + 'anerkennungNachgewiesenerKenntnisse', + 'antragStellen' + ), + 'ui' => array( + 'hilfeZuDieserSeite', + 'hochladen', + 'nichtSelektierbarAufgrundVon', + 'nichtSelektierbarAufgrundVon', + 'systemfehler', + 'bitteMindEinenAntragWaehlen', + 'bitteBegruendungAngeben', + 'empfehlungWurdeAngefordert', + 'anrechnungenWurdenGenehmigt', + 'anrechnungenWurdenAbgelehnt' + ), + 'person' => array( + 'student', + 'personenkennzeichen' + ), + 'lehre' => array( + 'studiensemester', + 'studiengang', + 'lehrveranstaltung', + 'ects', + 'lektor', + ) + ), + 'customCSSs' => array( + 'public/css/Tabulator.css' + ), + 'customJSs' => array( + 'public/js/bootstrapper.js', + 'public/js/lehre/anrechnung/approveAnrechnungDetail.js' + + ) + ) +); +?> + + +

+
+ +
+ +
+ +
+
+
+
+ + +
+
+
+
+ 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) ?> +
+
+
+
+
+ + + +
+
+
+ +
+
+ +
+
+ +
+ + +
+ +
+ +
+
+ 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 new file mode 100644 index 000000000..91d821fde --- /dev/null +++ b/application/views/lehre/anrechnung/approveAnrechnungUebersicht.php @@ -0,0 +1,236 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => $this->p->t('anrechnung', 'anrechnungenGenehmigen'), + 'jquery' => true, + 'jqueryui' => true, + 'bootstrap' => true, + 'fontawesome' => true, + 'tabulator' => true, + 'ajaxlib' => true, + 'dialoglib' => true, + 'tablewidget' => true, + 'phrases' => array( + 'global' => array( + 'begruendung' + ), + 'anrechnung' => array( + 'nachweisdokumente', + 'empfehlung', + 'confirmTextAntragHatBereitsEmpfehlung', + 'herkunft' + ), + 'ui' => array( + 'anzeigen', + 'alleAnzeigen', + 'hilfeZuDieserSeite', + 'hochladen', + 'spaltenEinstellen', + 'hilfeZuDieserSeite', + 'alleAuswaehlen', + 'alleAbwaehlen', + 'ausgewaehlteZeilen', + 'hilfe', + 'tabelleneinstellungen', + 'keineDatenVorhanden', + 'spaltenEinstellen', + 'ja', + 'nein', + 'nichtSelektierbarAufgrundVon', + 'nichtSelektierbarAufgrundVon', + 'systemfehler', + 'bitteMindEinenAntragWaehlen', + 'bitteBegruendungAngeben', + 'empfehlungWurdeAngefordert', + 'anrechnungenWurdenGenehmigt', + 'anrechnungenWurdenAbgelehnt' + ), + 'person' => array( + 'student', + 'personenkennzeichen', + 'vorname', + 'nachname' + ), + 'lehre' => array( + 'studiensemester', + 'studiengang', + 'lehrveranstaltung', + 'ects', + 'lektor', + ), + 'table' => array( + 'spaltenEinAusblenden', + 'spaltenEinAusblendenMitKlickOeffnen', + 'spaltenEinAusblendenAufEinstellungenKlicken', + 'spaltenEinAusblendenMitKlickAktivieren', + 'spaltenEinAusblendenMitKlickSchliessen', + 'spaltenbreiteVeraendern', + 'spaltenbreiteVeraendernText', + 'spaltenbreiteVeraendernInfotext', + 'zeilenAuswaehlen', + 'zeilenAuswaehlenEinzeln', + 'zeilenAuswaehlenBereich', + 'zeilenAuswaehlenAlle' + ) + ), + 'customJSs' => array( + 'public/js/bootstrapper.js', + 'public/js/lehre/anrechnung/approveAnrechnungUebersicht.js' + ) + ) +); +?> + + +
+
+ +
+ +
+ +
+
+
+
+ widgetlib->widget( + 'Studiensemester_widget', + array( + DropdownWidget::SELECTED_ELEMENT => $studiensemester_selected + ), + array( + 'name' => 'studiensemester', + 'id' => 'studiensemester' + ) + ); + ?> +
+ +
+
+
+ +
+
+ load->view('lehre/anrechnung/approveAnrechnungUebersichtData.php'); ?> +
+
+ +
+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+
+
+
+
+ + +load->view('templates/FHC-Footer'); ?> diff --git a/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php b/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php new file mode 100644 index 000000000..0ee3fdc57 --- /dev/null +++ b/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php @@ -0,0 +1,128 @@ +>' . $LANGUAGE_INDEX . ' AS "status_bezeichnung" + FROM anrechnungen + JOIN lehre.tbl_anrechnungstatus as anrechnungstatus ON (anrechnungstatus.status_kurzbz = anrechnungen.status_kurzbz) + WHERE studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' + AND studiengang_kz IN (' . $STUDIENGAENGE_ENTITLED . ') +'; + +$filterWidgetArray = array( + 'query' => $query, + 'tableUniqueId' => 'approveAnrechnungUebersicht', + 'requiredPermissions' => 'lehre/anrechnung_genehmigen', + 'datasetRepresentation' => 'tabulator', + 'columnsAliases' => array( + 'anrechnung_id', + 'lehrveranstaltung_id', + 'begruendung_id', + 'dms_id', + 'studiensemester_kurzbz', + 'studiengang_kz', + ucfirst($this->p->t('lehre', 'studiengang')), + 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('anrechnung', 'empfehlung')), + 'status_kurzbz', + 'Status' + ), + 'datasetRepOptions' => '{ + height: func_height(this), + layout: "fitColumns", // fit columns to width of table + persistentLayout:true, + persistentSort: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) + selectable: true, // allow row selection + selectableRangeMode: "click", // allow range selection using shift end click on end of range + selectablePersistence:false, // deselect previously selected rows when table is filtered, sorted or paginated + tableBuilt: function(){ + func_tableBuilt(this); + }, + tableWidgetFooter: { + selectButtons: true + }, + selectableCheck: function(row){ + return func_selectableCheck(row); + }, + rowFormatter:function(row){ + func_rowFormatter(row); + }, + rowUpdated:function(row){ + func_rowUpdated(row); + }, + tooltips: function(cell){ + return func_tooltips(cell); + } + }', // 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}, + stg_bezeichnung: {headerFilter:"input"}, + lv_bezeichnung: {headerFilter:"input"}, + ects: {headerFilter:"input", align:"center"}, + student: {headerFilter:"input"}, + begruendung: {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"}, + empfehlung_anrechnung: {headerFilter:"input", align:"center", formatter: format_empfehlung_anrechnung, headerFilterFunc: hf_filterTrueFalse}, + status_kurzbz: {visible: false}, + status_bezeichnung: {headerFilter:"input"} + }', // col properties +); + +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 new file mode 100644 index 000000000..5d6fa9a16 --- /dev/null +++ b/application/views/lehre/anrechnung/requestAnrechnung.php @@ -0,0 +1,242 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => $this->p->t('anrechnung', 'antragStellen'), + 'jquery' => true, + 'bootstrap' => true, + 'fontawesome' => true, + 'ajaxlib' => true, + 'dialoglib' => true, + 'phrases' => array( + 'global' => array( + 'anerkennungNachgewiesenerKenntnisse', + 'antragStellen' + ), + 'ui' => array( + 'hilfeZuDieserSeite', + 'hochladen' + ), + 'person' => array( + 'student', + 'personenkennzeichen' + ), + 'lehre' => array( + 'studiensemester', + 'studiengang', + 'lehrveranstaltung', + 'ects', + 'lektor', + ) + ), + 'customJSs' => array( + 'public/js/bootstrapper.js', + 'public/js/lehre/anrechnung/requestAnrechnung.js' + + ) + ) +); +?> + + + + +
+
+ +
+ +
+ + 'requestAnrechnung-form'], + ['lv_id' => $antragData->lv_id, 'studiensemester' => $antragData->studiensemester_kurzbz] + ); ?> +
+
+
+
+ +
+
+ +
+
+
+
+ p->t('anrechnung', 'antrag'); ?>  + + + + p->t('anrechnung', 'antragdatum'); ?>: anrechnung_id) ? $anrechnungData->insertamum : '-' ?> +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
p->t('person', 'student')); ?>vorname . ' ' . $antragData->nachname; ?>
p->t('person', 'personenkennzeichen'); ?>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'); ?>  + + + +
+
+ +
+
+
+
+
+
+ +
+ > +
+
+
+
+
+
+
+
+ Status: + + status; ?> + +
+ +
+ p->t('global', 'bearbeitungGesperrt'); ?> + anrechnung_id) ? ': ' . $this->p->t('anrechnung', 'deadlineUeberschritten') : ''; ?> +
+ +
+ load->view('lehre/anrechnung/requestAnrechnungImportant'); ?> +
+
+ +
+
+ + +load->view('templates/FHC-Footer'); ?> diff --git a/application/views/lehre/anrechnung/requestAnrechnungImportant.php b/application/views/lehre/anrechnung/requestAnrechnungImportant.php new file mode 100644 index 000000000..d157b22c2 --- /dev/null +++ b/application/views/lehre/anrechnung/requestAnrechnungImportant.php @@ -0,0 +1,53 @@ +
+ +
+ +
+
+ p->t('anrechnung', 'requestAnrechnungInfoFristenBody'); ?> +
+
+
+ +
+ +
+
+ p->t('anrechnung', 'requestAnrechnungInfoNachweisdokumenteBody'); ?> +
+
+
+ +
+ +
+
+ p->t('anrechnung', 'requestAnrechnungInfoHerkunftKenntnisseBody'); ?> +
+
+
+
\ No newline at end of file diff --git a/application/views/lehre/anrechnung/reviewAnrechnungDetail.php b/application/views/lehre/anrechnung/reviewAnrechnungDetail.php new file mode 100644 index 000000000..455c31e65 --- /dev/null +++ b/application/views/lehre/anrechnung/reviewAnrechnungDetail.php @@ -0,0 +1,278 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => $this->p->t('anrechnung', 'anrechnungenPruefen'), + 'jquery' => true, + 'jqueryui' => true, + 'bootstrap' => true, + 'fontawesome' => true, + 'ajaxlib' => true, + 'dialoglib' => true, + 'phrases' => array( + 'global' => array( + 'anerkennungNachgewiesenerKenntnisse', + 'antragStellen' + ), + 'ui' => array( + 'hilfeZuDieserSeite', + 'hochladen', + 'nichtSelektierbarAufgrundVon', + 'systemfehler', + 'bitteMindEinenAntragWaehlen', + 'bitteBegruendungAngeben', + 'anrechnungenWurdenEmpfohlen', + 'anrechnungenWurdenNichtEmpfohlen' + ), + 'person' => array( + 'student', + 'personenkennzeichen' + ), + 'lehre' => array( + 'studiensemester', + 'studiengang', + 'lehrveranstaltung', + 'ects', + 'lektor', + ) + ), + 'customCSSs' => array( + 'public/css/Tabulator.css' + ), + 'customJSs' => array( + 'public/js/bootstrapper.js', + 'public/js/lehre/anrechnung/reviewAnrechnungDetail.js' + + ) + ) +); +?> + + +
+
+ +
+ +
+ +
+
+
+
+ + +
+
+
+
+ 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', 'nochKeineEmpfehlung'); ?> +
+ +
+ p->t('anrechnung', 'empfehlungPositivConfirmed'); ?> +
+ +
+
+ p->t('anrechnung', 'empfehlungNegativConfirmed'); ?> +
+
p->t('global', 'begruendung'); ?> + : + notiz) ?> +
+
+
+
+
+ + + +
+
+
+
+
+
+
+ +
+ + +
+
+ +
+
+ Status: + + status; ?> + +
+
+ load->view('lehre/anrechnung/reviewAnrechnungInfo'); ?> +
+
+ +
+
+ + +load->view('templates/FHC-Footer'); ?> diff --git a/application/views/lehre/anrechnung/reviewAnrechnungInfo.php b/application/views/lehre/anrechnung/reviewAnrechnungInfo.php new file mode 100644 index 000000000..a89c9c987 --- /dev/null +++ b/application/views/lehre/anrechnung/reviewAnrechnungInfo.php @@ -0,0 +1,66 @@ +
+
+ +
+
+ p->t('anrechnung', 'reviewAnrechnungInfoFristenBody'); ?> +
+
+
+
+ +
+
+ p->t('anrechnung', 'reviewAnrechnungInfoAntragVoraussetungenBody'); ?> +
+
+
+
+ +
+
+ p->t('anrechnung', 'reviewAnrechnungInfoNachweisdokumenteBody'); ?> +
+
+
+
+ +
+
+ p->t('anrechnung', 'reviewAnrechnungInfoHerkunftKenntnisseBody'); ?> +
+
+
+
\ No newline at end of file diff --git a/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php b/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php new file mode 100644 index 000000000..55c82b4e3 --- /dev/null +++ b/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php @@ -0,0 +1,236 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => $this->p->t('anrechnung', 'anrechnungenPruefen'), + 'jquery' => true, + 'jqueryui' => true, + 'bootstrap' => true, + 'fontawesome' => true, + 'tabulator' => true, + 'ajaxlib' => true, + 'dialoglib' => true, + 'tablewidget' => true, + 'phrases' => array( + 'global' => array( + 'begruendung' + ), + 'anrechnung' => array( + 'nachweisdokumente', + 'empfehlung', + 'herkunft' + ), + 'ui' => array( + 'anzeigen', + 'alleAnzeigen', + 'hilfeZuDieserSeite', + 'hochladen', + 'spaltenEinstellen', + 'hilfeZuDieserSeite', + 'alleAuswaehlen', + 'alleAbwaehlen', + 'ausgewaehlteZeilen', + 'hilfe', + 'tabelleneinstellungen', + 'keineDatenVorhanden', + 'spaltenEinstellen', + 'ja', + 'nein', + 'nichtSelektierbarAufgrundVon', + 'systemfehler', + 'bitteMindEinenAntragWaehlen', + 'bitteBegruendungAngeben', + 'anrechnungenWurdenEmpfohlen', + 'anrechnungenWurdenNichtEmpfohlen' + ), + 'person' => array( + 'student', + 'personenkennzeichen', + 'vorname', + 'nachname' + ), + 'lehre' => array( + 'studiensemester', + 'studiengang', + 'lehrveranstaltung', + 'ects', + 'lektor', + ), + 'table' => array( + 'spaltenEinAusblenden', + 'spaltenEinAusblendenMitKlickOeffnen', + 'spaltenEinAusblendenAufEinstellungenKlicken', + 'spaltenEinAusblendenMitKlickAktivieren', + 'spaltenEinAusblendenMitKlickSchliessen', + 'spaltenbreiteVeraendern', + 'spaltenbreiteVeraendernText', + 'spaltenbreiteVeraendernInfotext', + 'zeilenAuswaehlen', + 'zeilenAuswaehlenEinzeln', + 'zeilenAuswaehlenBereich', + 'zeilenAuswaehlenAlle' + ) + ), + 'customJSs' => array( + 'public/js/bootstrapper.js', + 'public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js' + ) + ) +); +?> + + +
+
+ +
+ +
+ +
+
+
+
+ widgetlib->widget( + 'Studiensemester_widget', + array( + DropdownWidget::SELECTED_ELEMENT => $studiensemester_selected + ), + array( + 'name' => 'studiensemester', + 'id' => 'studiensemester' + ) + ); + ?> +
+ +
+
+
+ +
+
+ load->view('lehre/anrechnung/reviewAnrechnungUebersichtData.php'); ?> +
+
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ + +
+
+
+
+
+ + +load->view('templates/FHC-Footer'); ?> + diff --git a/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php b/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php new file mode 100644 index 000000000..7382df85b --- /dev/null +++ b/application/views/lehre/anrechnung/reviewAnrechnungUebersichtData.php @@ -0,0 +1,138 @@ +>' . $LANGUAGE_INDEX . ' AS "status_bezeichnung" + FROM anrechnungen + JOIN lehre.tbl_anrechnungstatus as anrechnungstatus ON (anrechnungstatus.status_kurzbz = anrechnungen.status_kurzbz) + JOIN lehre.tbl_lehreinheit le USING (lehrveranstaltung_id) + JOIN lehre.tbl_lehreinheitmitarbeiter lema USING (lehreinheit_id) + WHERE anrechnungen.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' + AND le.studiensemester_kurzbz = anrechnungen.studiensemester_kurzbz + AND lema.mitarbeiter_uid = \'' . $LEKTOR_UID . '\' + AND le.lehre = TRUE + AND EXISTS ( + SELECT 1 + FROM lehre.tbl_anrechnung_anrechnungstatus + WHERE anrechnung_id = anrechnungen.anrechnung_id + AND status_kurzbz=\'inProgressLektor\' + ) +'; + +$filterWidgetArray = array( + 'query' => $query, + 'tableUniqueId' => 'approveAnrechnungUebersicht', + 'requiredPermissions' => 'lehre/anrechnung_empfehlen', + 'datasetRepresentation' => 'tabulator', + 'columnsAliases' => array( + 'anrechnung_id', + 'lehrveranstaltung_id', + 'begruendung_id', + 'dms_id', + 'studiensemester_kurzbz', + 'studiengang_kz', + ucfirst($this->p->t('lehre', 'studiengang')), + 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('anrechnung', 'empfehlung')), + 'status_kurzbz', + 'Status' + ), + 'datasetRepOptions' => '{ + height: func_height(this), + layout: "fitColumns", // fit columns to width of table + persistentLayout:true, + persistentSort: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) + selectable: true, // allow row selection + selectableRangeMode: "click", // allow range selection using shift end click on end of range + selectablePersistence:false, // deselect previously selected rows when table is filtered, sorted or paginated + tableBuilt: function(){ + func_tableBuilt(this); + }, + tableWidgetFooter: { + selectButtons: true + }, + selectableCheck: function(row){ + return func_selectableCheck(row); + }, + rowFormatter:function(row){ + func_rowFormatter(row); + }, + rowUpdated:function(row){ + func_rowUpdated(row); + }, + tooltips: function(cell){ + return func_tooltips(cell); + } + }', // 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}, + stg_bezeichnung: {headerFilter:"input"}, + lv_bezeichnung: {headerFilter:"input"}, + ects: {headerFilter:"input", align:"center"}, + student: {headerFilter:"input"}, + begruendung: {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"}, + empfehlung_anrechnung: {headerFilter:"input", align:"center", formatter: format_empfehlung_anrechnung, headerFilterFunc: hf_filterTrueFalse}, + status_kurzbz: {visible: false}, + status_bezeichnung: {headerFilter:"input"} + }', // col properties +); + +echo $this->widgetlib->widget('TableWidget', $filterWidgetArray); + +?> \ No newline at end of file diff --git a/application/widgets/Nation_widget.php b/application/widgets/Nation_widget.php index 94a028ba7..7e0c9d47b 100644 --- a/application/widgets/Nation_widget.php +++ b/application/widgets/Nation_widget.php @@ -6,7 +6,7 @@ class Nation_widget extends DropdownWidget { // Nation $this->load->model('codex/Nation_model', 'NationModel'); - $this->NationModel->addOrder('nation_code'); + $this->NationModel->addOrder('kurztext'); $this->addSelectToModel($this->NationModel, 'nation_code', 'kurztext'); diff --git a/application/widgets/Studiengang_widget.php b/application/widgets/Studiengang_widget.php index 250f2a9bc..78444975a 100644 --- a/application/widgets/Studiengang_widget.php +++ b/application/widgets/Studiengang_widget.php @@ -8,7 +8,7 @@ class Studiengang_widget extends DropdownWidget $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); $this->StudiengangModel->addOrder('kurzbzlang'); - $this->addSelectToModel($this->StudiengangModel, 'studiengang_kz', '\'(\' || upper(typ||kurzbz) || \') \' || tbl_studiengang.bezeichnung'); + $this->addSelectToModel($this->StudiengangModel, 'studiengang_kz', 'upper(typ||kurzbz) || \' - \' || tbl_studiengang.bezeichnung'); // If 'studiengang' (array of specific studiengaenge) is given, retrieve these studiengaenge only if (isset($widgetData['studiengang']) && !empty($widgetData['studiengang'])) diff --git a/cis/private/lehre/abgabe_lektor_details.php b/cis/private/lehre/abgabe_lektor_details.php index 7022ead1f..6b6b5633b 100644 --- a/cis/private/lehre/abgabe_lektor_details.php +++ b/cis/private/lehre/abgabe_lektor_details.php @@ -35,6 +35,8 @@ require_once('../../../include/datum.class.php'); require_once('../../../include/mail.class.php'); require_once('../../../include/phrasen.class.php'); require_once('../../../include/projektarbeit.class.php'); +require_once('../../../include/projektbetreuer.class.php'); +require_once('../../../include/sancho.inc.php'); if (!$db = new basis_db()) $db=false; @@ -116,6 +118,68 @@ if($projektarbeit_id==-1) if(!$projektarbeit_obj->load($projektarbeit_id)) die('Fehler beim Laden der Projektarbeit'); $titel = $projektarbeit_obj->titel; +$student_uid = $projektarbeit_obj->student_uid; + +// paarbeit sollte nur ab SS2021 online bewertet werden +$qry_sem="SELECT 1 + FROM lehre.tbl_projektarbeit + JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) + JOIN public.tbl_studiensemester USING(studiensemester_kurzbz) + WHERE projektarbeit_id=".$db->db_add_param($projektarbeit_id, FHC_INTEGER)." + AND tbl_studiensemester.start::date >= (SELECT start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz = 'SS2021')::date + LIMIT 1"; +$result_sem=$db->db_query($qry_sem); +$num_rows_sem = $db->db_num_rows($result_sem); +if($num_rows_sem < 0) +{ + echo "".$p->t('abgabetool/fehlerAktualitaetProjektarbeit')."
 "; +} + +// Zweitbegutachter holen +if($betreuerart=="Erstbegutachter") +{ + $projektbetreuer = new projektbetreuer(); + $alleBegutachter = $projektbetreuer->getProjektbetreuer($projektarbeit_id); + + if ($alleBegutachter) + { + $alleBegutachterResults = $projektbetreuer->result; + + foreach ($alleBegutachterResults as $begutachter) + { + if ($begutachter->betreuerart_kurzbz == "Erstbegutachter") + { + $erstbetreuer_id = $begutachter->person_id; + $zweitbegutachter = $projektbetreuer->getZweitbegutachterWithToken($erstbetreuer_id, $projektarbeit_id, $student_uid); + break; + } + } + + // Mail mit Token an Zweitbegutachter senden + if ($zweitbegutachter && $num_rows_sem >= 1 && isset($_GET['zweitbegutachtertoken'])) + { + $qry_std="SELECT * FROM campus.vw_benutzer where uid=".$db->db_add_param($uid); + if(!$result_std=$db->db_query($qry_std)) + { + echo "Student konnte nicht gefunden werden!
 "; + } + else + { + $row_std=@$db->db_fetch_object($result_std); + $mailres = sendZweitbegutachterMail($zweitbegutachter, $erstbetreuer_id, $row_std); + + if ($mailres) + { + echo "
".$p->t('abgabetool/zweitbegutachterMailGesendet', $zweitbegutachter->email)."
 "; + } + else + { + echo "".$p->t('abgabetool/fehlerMailZweitBegutachter')." Mail: ".$zweitbegutachter->email."
 "; + } + } + } + } +} echo ' @@ -124,6 +188,39 @@ echo ' '.$p->t('abgabetool/abgabetool').' + - - - + + + + + '; -?> - - - - - - + + + + diff --git a/cis/private/tools/zeitaufzeichnung.php b/cis/private/tools/zeitaufzeichnung.php index 054cf32e2..70874950d 100644 --- a/cis/private/tools/zeitaufzeichnung.php +++ b/cis/private/tools/zeitaufzeichnung.php @@ -1145,7 +1145,7 @@ if($projekt->getProjekteMitarbeiter($user, true)) echo ''.$p->t("zeitaufzeichnung/organisationseinheiten").' Studiengang_kz: Gebiet: Reihung: @@ -254,10 +255,7 @@ if (isset($_GET['action']) && $_GET['action'] == 'editsave') { if (isset($_POST['reihung']) && $_POST['reihung'] != '' && isset($_POST['gewicht']) && $_POST['gewicht'] != '' && isset($_POST['semester']) && $_POST['semester'] != '') { - $ablauf = new ablauf(); - $ablauf->getAblaufId($stg_kz, $_POST['gebiet_id']); - $ablauf_id = $ablauf->result[0]; - $ablauf = new ablauf($ablauf_id); + $ablauf = new ablauf($_POST['ablauf_id']); $ablauf = $ablauf->result[0]; $ablauf->reihung = $_POST['reihung']; $ablauf->gewicht = $_POST['gewicht']; diff --git a/cis/testtool/login.php b/cis/testtool/login.php index f20d93911..b7cbc02b5 100644 --- a/cis/testtool/login.php +++ b/cis/testtool/login.php @@ -219,6 +219,11 @@ if (isset($_REQUEST['prestudent'])) $ablauf->getAblaufGebiete($firstPrio_studiengang_kz, $firstPrio_studienplan_id); $rt_sprache = ''; + if (empty($ablauf->result[0])) + { + $ablauf->getAblaufGebiete($firstPrio_studiengang_kz); + } + if (!empty($ablauf->result[0])) { $rt_sprache = $ablauf->result[0]->sprache; @@ -441,6 +446,7 @@ if (isset($prestudent_id)) if (isset($row_prio->studiengang_kz)) { $firstPrio_studiengang_kz = $row_prio->studiengang_kz; + $firstPrio_studienplan_id = $row_prio->studienplan_id; break; } } @@ -449,9 +455,16 @@ if (isset($prestudent_id)) // Sprachwahl zu STG mit höchster Prio ermitteln $ablauf = new Ablauf(); $sprachwahl = false; - if (isset($ablauf->result[0]) - && $ablauf->getAblaufVorgabeStudiengang($firstPrio_studiengang_kz) - && is_bool($ablauf->result[0]->sprachwahl)) + + $ablauf->getAblaufGebiete($firstPrio_studiengang_kz, $firstPrio_studienplan_id); + + if (empty($ablauf->result[0])) + { + $ablauf->getAblaufGebiete($firstPrio_studiengang_kz); + } + + if (isset($ablauf->result[0]) + && is_bool($ablauf->result[0]->sprachwahl)) { $sprachwahl = $ablauf->result[0]->sprachwahl; } diff --git a/config/global.config-default.inc.php b/config/global.config-default.inc.php index 496eb73cb..b31447994 100644 --- a/config/global.config-default.inc.php +++ b/config/global.config-default.inc.php @@ -26,6 +26,7 @@ define('CIS_LEHRVERANSTALTUNG_LEISTUNGSUEBERSICHT_ANZEIGEN',true); define('CIS_LEHRVERANSTALTUNG_SEMESTERINFO_ANZEIGEN',true); define('CIS_LEHRVERANSTALTUNG_LEHRFACH_ANZEIGEN',false); define('CIS_LEHRVERANSTALTUNG_GESAMTNOTE_ANZEIGEN', true); +define('CIS_LEHRVERANSTALTUNG_ANRECHNUNG_ANZEIGEN', true); // Im CIS Menue Links bei Modulen anzeigen wenn Lehrauftrag define('CIS_LEHRVERANSTALTUNG_MODULE_LINK',true); diff --git a/content/lvplanung/lehrveranstaltungDBDML.php b/content/lvplanung/lehrveranstaltungDBDML.php index f5568ced4..9d9461c70 100644 --- a/content/lvplanung/lehrveranstaltungDBDML.php +++ b/content/lvplanung/lehrveranstaltungDBDML.php @@ -322,66 +322,77 @@ if(!$error) else $alte_stunden_eingerechnet=true; - //Stundenreduzierung immer moeglich - if(($lem->semesterstunden>$semesterstunden_alt) || $neue_stunden_eingerechnet) + if ($semesterstunden_alt != '' && $lem->semesterstunden != '') { - $oe_obj = new organisationseinheit(); - $oe_arr = $oe_obj->getChilds($stunden_oe_kurzbz); - $qry = "SELECT "; - if($alte_stunden_eingerechnet && $neue_stunden_eingerechnet) - $qry.=" (sum(tbl_lehreinheitmitarbeiter.semesterstunden)-($semesterstunden_alt)+($lem->semesterstunden)) as summe"; - elseif($alte_stunden_eingerechnet && !$neue_stunden_eingerechnet) - $qry.=" (sum(tbl_lehreinheitmitarbeiter.semesterstunden)-($semesterstunden_alt)) as summe"; - elseif(!$alte_stunden_eingerechnet && $neue_stunden_eingerechnet) - $qry.=" (sum(tbl_lehreinheitmitarbeiter.semesterstunden)+($lem->semesterstunden)) as summe"; - elseif(!$alte_stunden_eingerechnet && !$neue_stunden_eingerechnet) - $qry.=" (sum(tbl_lehreinheitmitarbeiter.semesterstunden)) as summe"; - $qry.=" FROM - lehre.tbl_lehreinheitmitarbeiter - JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) - JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) - JOIN public.tbl_studiengang USING(studiengang_kz) - WHERE - mitarbeiter_uid=".$db->db_add_param($lem->mitarbeiter_uid)." AND - studiensemester_kurzbz=".$db->db_add_param($le->studiensemester_kurzbz)." AND - bismelden"; - if(count($oe_arr)>0) - $qry.=" AND tbl_studiengang.oe_kurzbz in(".$db->db_implode4SQL($oe_arr).")"; - - if(defined('FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE') - && is_array(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE) - && count(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE)>0) + //Stundenreduzierung immer moeglich + if(($lem->semesterstunden>$semesterstunden_alt) || $neue_stunden_eingerechnet) { - $qry.=" AND tbl_studiengang.oe_kurzbz not in(".$db->db_implode4SQL(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE).")"; - } + $oe_obj = new organisationseinheit(); + $oe_arr = $oe_obj->getChilds($stunden_oe_kurzbz); + $qry = "SELECT "; + if($alte_stunden_eingerechnet && $neue_stunden_eingerechnet) + $qry.=" (sum(tbl_lehreinheitmitarbeiter.semesterstunden)-($semesterstunden_alt)+($lem->semesterstunden)) as summe"; + elseif($alte_stunden_eingerechnet && !$neue_stunden_eingerechnet) + $qry.=" (sum(tbl_lehreinheitmitarbeiter.semesterstunden)-($semesterstunden_alt)) as summe"; + elseif(!$alte_stunden_eingerechnet && $neue_stunden_eingerechnet) + $qry.=" (sum(tbl_lehreinheitmitarbeiter.semesterstunden)+($lem->semesterstunden)) as summe"; + elseif(!$alte_stunden_eingerechnet && !$neue_stunden_eingerechnet) + $qry.=" (sum(tbl_lehreinheitmitarbeiter.semesterstunden)) as summe"; + $qry.=" FROM + lehre.tbl_lehreinheitmitarbeiter + JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) + JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) + JOIN public.tbl_studiengang USING(studiengang_kz) + WHERE + mitarbeiter_uid=".$db->db_add_param($lem->mitarbeiter_uid)." AND + studiensemester_kurzbz=".$db->db_add_param($le->studiensemester_kurzbz)." AND + bismelden"; - if($db->db_query($qry)) - { - if($row = $db->db_fetch_object()) + if(count($oe_arr)>0) + $qry.=" AND tbl_studiengang.oe_kurzbz in(".$db->db_implode4SQL($oe_arr).")"; + + if(defined('FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE') + && is_array(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE) + && count(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE)>0) { - if($row->summe>$max_stunden) - { - if(!$fixangestellt) - { - if(!LehrauftragAufFirma($lem->mitarbeiter_uid)) - { - //Warnung wenn die Stundenzahl ueberschritten wurde - $return = false; - $error = true; - $errormsg = "ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $max_stunden Stunden ($stunden_oe_kurzbz) wurde ueberschritten!\n Daten wurden NICHT gespeichert!\n\n"; - } - } - else - { - $return = true; - $error = false; - $warnung = true; - $errormsg = "Hinweis: Die maximal erlaubte Semesterstundenanzahl des Lektors von $max_stunden Stunden ($stunden_oe_kurzbz) wurde ueberschritten!\n Daten wurden gespeichert!\n\n"; - } + $qry.=" AND tbl_studiengang.oe_kurzbz not in(".$db->db_implode4SQL(FAS_LV_LEKTORINNENZUTEILUNG_STUNDEN_IGNORE_OE).")"; + } - $errormsg.=getStundenproInstitut($lem->mitarbeiter_uid, $le->studiensemester_kurzbz, $oe_arr); + if($db->db_query($qry)) + { + if($row = $db->db_fetch_object()) + { + if($row->summe>$max_stunden) + { + if(!$fixangestellt) + { + if(!LehrauftragAufFirma($lem->mitarbeiter_uid)) + { + //Warnung wenn die Stundenzahl ueberschritten wurde + $return = false; + $error = true; + $errormsg = "ACHTUNG: Die maximal erlaubte Semesterstundenanzahl des Lektors von $max_stunden Stunden ($stunden_oe_kurzbz) wurde ueberschritten!\n Daten wurden NICHT gespeichert!\n\n"; + } + } + else + { + $return = true; + $error = false; + $warnung = true; + $errormsg = "Hinweis: Die maximal erlaubte Semesterstundenanzahl des Lektors von $max_stunden Stunden ($stunden_oe_kurzbz) wurde ueberschritten!\n Daten wurden gespeichert!\n\n"; + } + + $errormsg.=getStundenproInstitut($lem->mitarbeiter_uid, $le->studiensemester_kurzbz, $oe_arr); + } } + else + { + $return = false; + $error=true; + $errormsg='Fehler beim Ermitteln der Gesamtstunden'; + } + } else { @@ -389,13 +400,6 @@ if(!$error) $error=true; $errormsg='Fehler beim Ermitteln der Gesamtstunden'; } - - } - else - { - $return = false; - $error=true; - $errormsg='Fehler beim Ermitteln der Gesamtstunden'; } } } diff --git a/content/lvplanung/lehrveranstaltungdetailoverlay.xul.php b/content/lvplanung/lehrveranstaltungdetailoverlay.xul.php index 57338add2..0efbfae2c 100644 --- a/content/lvplanung/lehrveranstaltungdetailoverlay.xul.php +++ b/content/lvplanung/lehrveranstaltungdetailoverlay.xul.php @@ -28,6 +28,7 @@ header("Content-type: application/vnd.mozilla.xul+xml"); require_once('../../config/vilesci.config.inc.php'); require_once('../../config/global.config.inc.php'); require_once('../../include/benutzerberechtigung.class.php'); +require_once('../../include/phrasen.class.php'); $user = get_uid(); $rechte = new benutzerberechtigung(); @@ -38,6 +39,8 @@ echo ''; // Vertragsdetails: Anzeige wird über config Eintrag bestimmt $is_hidden = (!defined('FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN') || FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN == true) ? 'false' : 'true'; +$sprache = getSprache(); +$p = new phrasen($sprache); ?> -