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 .= '| '.$bewerber.' |
';
+ }
+ $mailcontent .= '
';
+ }
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', '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'
+ )
+ )
+);
+?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ load->view('lehre/anrechnung/approveAnrechnungUebersichtData.php'); ?>
+
+
+
+
+
+
+
p->t('anrechnung', 'genehmigungenNegativQuestion'); ?>
+
p->t('anrechnung', 'bitteBegruendungAngeben'); ?>
+
+ - p->t('anrechnung', 'genehmigungNegativPruefungNichtMoeglich'); ?>
+
+
+
+
+ - p->t('anrechnung', 'genehmigungNegativKenntnisseNichtGleichwertig'); ?>
+
+
+
+
+ - p->t('anrechnung', 'andereBegruendung'); ?>
+
+
+
+ p->t('anrechnung', 'begruendungWirdFuerAlleUebernommen'); ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
p->t('anrechnung', 'genehmigungenPositivQuestion'); ?>
+ p->t('anrechnung', 'genehmigungenPositiv'); ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+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'); ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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'
+ )
+ )
+);
+?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ load->view('lehre/anrechnung/reviewAnrechnungUebersichtData.php'); ?>
+
+
+
+
+
+
+
p->t('anrechnung', 'empfehlungenNegativQuestion'); ?>
+
p->t('anrechnung', 'bitteBegruendungAngeben'); ?>
+
+ -
+ p->t('anrechnung', 'empfehlungNegativPruefungNichtMoeglich'); ?>
+
+
+
+
+ -
+ p->t('anrechnung', 'empfehlungNegativKenntnisseNichtGleichwertig'); ?>
+
+
+
+
+ - p->t('anrechnung', 'andereBegruendung'); ?>
+
+
+
+ p->t('anrechnung', 'begruendungWirdFuerAlleUebernommen'); ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
p->t('anrechnung', 'empfehlungenPositivQuestion'); ?>
+ p->t('anrechnung', 'empfehlungenPositiv'); ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+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").' |
|