diff --git a/application/config/anrechnung.php b/application/config/anrechnung.php
new file mode 100644
index 000000000..d1f4f0958
--- /dev/null
+++ b/application/config/anrechnung.php
@@ -0,0 +1,22 @@
+input->post("aktiv") != null && $this->input->post("aktiv") == "on" ? true : false;
$bezeichnung_mehrsprachig = $this->input->post("bezeichnung_mehrsprachig");
$beschreibung = $this->input->post("beschreibung");
+ $statusgrund_kurzbz = $this->input->post("statusgrund_kurzbz");
for ($i = 0; $i < count($bezeichnung_mehrsprachig); $i++)
{
@@ -177,7 +178,8 @@ class Statusgrund extends Auth_Controller
$data = array(
"aktiv" => $aktiv,
"bezeichnung_mehrsprachig" => $bezeichnung_mehrsprachig,
- "beschreibung" => $beschreibung
+ "beschreibung" => $beschreibung,
+ "statusgrund_kurzbz" => $statusgrund_kurzbz
);
$statusgrund = $this->StatusgrundModel->update($statusgrund_id, $data);
@@ -196,6 +198,7 @@ class Statusgrund extends Auth_Controller
$bezeichnung_mehrsprachig = $this->input->post("bezeichnung_mehrsprachig");
$beschreibung = $this->input->post("beschreibung");
$status_kurzbz = $this->input->post("status_kurzbz");
+ $statusgrund_kurzbz = $this->input->post("statusgrund_kurzbz");
for ($i = 0; $i < count($bezeichnung_mehrsprachig); $i++)
{
@@ -245,7 +248,8 @@ class Statusgrund extends Auth_Controller
"status_kurzbz" => $status_kurzbz,
"aktiv" => $aktiv,
"bezeichnung_mehrsprachig" => $bezeichnung_mehrsprachig,
- "beschreibung" => $beschreibung
+ "beschreibung" => $beschreibung,
+ "statusgrund_kurzbz" => $statusgrund_kurzbz
);
$statusgrund = $this->StatusgrundModel->insert($data);
diff --git a/application/controllers/jobs/AnrechnungJob.php b/application/controllers/jobs/AnrechnungJob.php
index 2868a8052..f92410dbc 100644
--- a/application/controllers/jobs/AnrechnungJob.php
+++ b/application/controllers/jobs/AnrechnungJob.php
@@ -15,6 +15,11 @@ if (!defined('BASEPATH')) exit('No direct script access allowed');
class AnrechnungJob extends JOB_Controller
{
+ const APPROVE_ANRECHNUNG_URI = '/lehre/anrechnung/ApproveAnrechnungUebersicht';
+
+ const ANRECHNUNGSTATUS_APPROVED = 'approved';
+ const ANRECHNUNGSTATUS_REJECTED = 'rejected';
+ const ANRECHNUNG_NOTIZTITEL_NOTIZ_BY_STGL = 'AnrechnungNotizSTGL';
/**
* Constructor
@@ -23,6 +28,11 @@ class AnrechnungJob extends JOB_Controller
{
parent::__construct();
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
+ $this->load->model('education/Anrechnung_model', 'AnrechnungModel');
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+
+ $this->load->helper('url');
+ $this->load->helper('hlp_sancho_helper');
}
/**
@@ -84,4 +94,320 @@ class AnrechnungJob extends JOB_Controller
}
$this->logInfo('End Anrechnung Grades Job', array('Number of Grades added'=>$cnt));
}
+
+ /**
+ * Deletes Zeugnisnoten 'angerechnet', when Anrechnung is rejected afterwards.
+ * E.g., when STGL first accepts, then withdraws and finally rejects the approvement.
+ */
+ public function deleteAnrechnungGrades()
+ {
+ $this->logInfo('Start AnrechnungJob to delete Grades');
+
+ // Get all Zeungisnoten,
+ // WHERE note is angerechnet
+ // AND Anrechnung was rejected AFTER the Zeugnisnote was created
+ $qry = '
+ SELECT DISTINCT ON (status.anrechnung_id) anrechnung_id,
+ status.status_kurzbz AS "last_anrechnungstatus",
+ status.insertamum AS "last_anrechnungstatus_insertamum",
+ zeugnisnote.insertamum AS "zeugnisdatum_insertamum",
+ student.student_uid,
+ zeugnisnote.lehrveranstaltung_id,
+ zeugnisnote.studiensemester_kurzbz,
+ note
+ FROM lehre.tbl_zeugnisnote zeugnisnote
+ JOIN public.tbl_student student USING (student_uid)
+ JOIN lehre.tbl_anrechnung anrechnung
+ ON (zeugnisnote.lehrveranstaltung_id = anrechnung.lehrveranstaltung_id)
+ AND (student.prestudent_id = anrechnung.prestudent_id)
+ AND (zeugnisnote.studiensemester_kurzbz = anrechnung.studiensemester_kurzbz)
+ JOIN lehre.tbl_anrechnung_anrechnungstatus status USING (anrechnung_id)
+ WHERE note = 6
+ AND status.insertamum > zeugnisnote.insertamum
+ AND status.status_kurzbz = '. $this->db->escape(self::ANRECHNUNGSTATUS_REJECTED). '
+ ORDER BY status.anrechnung_id, status.insertamum DESC
+ ';
+
+ $db = new DB_Model();
+ $result = $db->execReadOnlyQuery($qry);
+ $cnt = 0;
+
+ if (hasData($result))
+ {
+ $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
+
+ foreach (getData($result) as $row)
+ {
+ // Delete Zeugnisnote
+ $this->ZeugnisnoteModel->delete(array(
+ 'lehrveranstaltung_id' => $row->lehrveranstaltung_id,
+ 'student_uid' => $row->student_uid,
+ 'studiensemester_kurzbz' => $row->studiensemester_kurzbz
+ ));
+
+ // Count up
+ $cnt++;
+ }
+ }
+
+ $this->logInfo('End AnrechnungJob to delete Grades', array('Number of Grades deleted: ' => $cnt));
+ }
+
+ // Send Sancho mail to STGL with yesterdays new Anrechnungen
+ public function sendMailToSTGL()
+ {
+ $this->logInfo('Start AnrechnungJob to send emails to STGL about yesterdays new Anrechnungen.');
+
+ // Get all yesterdays Anrechnungen, that did not process further than first status
+ // (If Anrechnung is new, but STGL already started the process yesterday,
+ // he does not need to be informed about this new Anrechnung anymore)
+ $this->AnrechnungModel->addSelect('anrechnung_id, studiensemester_kurzbz, lv.studiengang_kz, lv.bezeichnung, vorname, nachname');
+ $this->AnrechnungModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
+ $this->AnrechnungModel->addJoin('public.tbl_student student', 'prestudent_id');
+ $this->AnrechnungModel->addJoin('public.tbl_benutzer benutzer', 'ON (benutzer.uid = student.student_uid)');
+ $this->AnrechnungModel->addJoin('public.tbl_person person', 'person_id');
+ $this->AnrechnungModel->addOrder('lv.studiengang_kz, lv.bezeichnung');
+
+ $result = $this->AnrechnungModel->loadWhere(
+ '(lehre.tbl_anrechnung.insertamum)::date = (NOW() - INTERVAL \'24 HOURS\')::DATE
+ AND 1 = (SELECT COUNT(*) FROM lehre.tbl_anrechnung_anrechnungstatus status WHERE status.anrechnung_id = tbl_anrechnung.anrechnung_id)'
+ );
+
+ // Exit if there are no Anrechnungen
+ if (!$anrechnungen = getData($result)) {
+ $this->logInfo('ABORTED: Sending emails to STGL about yesterdays new Anrechnungen aborted - No new Anrechnungen found.');
+ exit;
+ }
+
+ $unique_studiengang_kz_arr = array_unique(array_column($anrechnungen, 'studiengang_kz'));
+
+ foreach ($unique_studiengang_kz_arr as $studiengang_kz)
+ {
+ // Get STG bezeichnung
+ $this->StudiengangModel->addSelect('UPPER( typ || kurzbz ) AS "stg_bezeichnung"');
+ $studiengang_bezeichnung = $this->StudiengangModel->load($studiengang_kz)->retval[0]->stg_bezeichnung;
+
+ // Get STGL mail address
+ list ($to, $vorname) = self::_getSTGLMailAddress($studiengang_kz);
+
+ // Get HTML table with new Anrechnungen of that STG plus amount of them
+ list ($anrechnungen_amount, $anrechnungen_table) = self::_getSTGLMailDataTable($studiengang_kz, $anrechnungen);
+
+ // Link to Antrag genehmigen dashboard
+ $url =
+ CIS_ROOT. 'cis/index.php?menu='.
+ CIS_ROOT. 'cis/menu.php?content_id=&content='.
+ CIS_ROOT. index_page(). self::APPROVE_ANRECHNUNG_URI;
+
+ // Prepare mail content
+ $body_fields = array(
+ 'vorname' => $vorname,
+ 'studiengang' => $studiengang_bezeichnung,
+ 'anzahl' => $anrechnungen_amount,
+ 'datentabelle' => $anrechnungen_table,
+ 'link' => anchor($url, 'Anrechnungsanträge Übersicht')
+ );
+
+ // Send mail
+ sendSanchoMail(
+ 'AnrechnungAntragStellen',
+ $body_fields,
+ $to,
+ 'Anerkennung nachgewiesener Kenntnisse: Neuer Antrag wurde gestellt'
+ );
+ }
+
+ $this->logInfo('SUCCEDED: Sending emails to STGL about yesterdays new Anrechnungen succeded.');
+ }
+
+ /**
+ * Send Sancho mail to students, whose Anrechnungen were approved 24 hours ago.
+ */
+ public function sendMailApproved(){
+
+ $this->logInfo('Start AnrechnungJob to send emails to students, whose Anrechnungen were approved.');
+
+ // Get all yesterdays approvements
+ $this->AnrechnungModel->addSelect('student.student_uid, vorname, nachname, geschlecht, lv.bezeichnung');
+ $this->AnrechnungModel->addJoin('lehre.tbl_anrechnung_anrechnungstatus status', 'anrechnung_id');
+ $this->AnrechnungModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
+ $this->AnrechnungModel->addJoin('public.tbl_student student', 'prestudent_id');
+ $this->AnrechnungModel->addJoin('public.tbl_benutzer benutzer', 'ON (benutzer.uid = student.student_uid)');
+ $this->AnrechnungModel->addJoin('public.tbl_person person', 'person_id');
+
+ $result = $this->AnrechnungModel->loadWhere(
+ '(status.insertamum)::date = (NOW() - INTERVAL \'24 HOURS\')::DATE AND
+ status.status_kurzbz = '. $this->db->escape(self::ANRECHNUNGSTATUS_APPROVED)
+ );
+
+ // Exit if there are no approved Anrechnungen
+ if (!hasData($result))
+ {
+ $this->logInfo('ABORTED sending emails to students, whose Anrechnungen were approved. No new approvements found.');
+ exit;
+ }
+
+ // Loop through students
+ foreach ($result->retval as $student)
+ {
+ $to = $student->student_uid. '@'. DOMAIN;
+
+ $anrede = $student->geschlecht == 'w' ? 'Sehr geehrte Frau ' : 'Sehr geehrter Herr ';
+
+ $text = 'Ihrem Antrag auf Anerkennung nachgewiesener Kenntnisse der Lehrveranstaltung "'.
+ $student->bezeichnung. '" wurde stattgegeben.';
+
+ // Prepare mail content
+ $body_fields = array(
+ 'anrede_name' => $anrede. $student->vorname. ' '. $student->nachname,
+ 'text' => $text
+ );
+
+ // Send mail
+ sendSanchoMail(
+ 'AnrechnungGenehmigen',
+ $body_fields,
+ $to,
+ 'Anerkennung nachgewiesener Kenntnisse: Ihr Antrag ist abgeschlossen'
+ );
+ }
+ }
+
+ /**
+ * Send Sancho mail to students, whose Anrechnungen were rejected 24 hours ago.
+ */
+ public function sendMailRejected(){
+
+ $this->logInfo('Start AnrechnungJob to send emails to students, whose Anrechnungen were rejected.');
+
+ $qry = '
+ SELECT
+ student.student_uid, vorname, nachname, geschlecht, lv.bezeichnung,
+ (SELECT text FROM public.tbl_notizzuordnung JOIN public.tbl_notiz USING(notiz_id)
+ WHERE tbl_notizzuordnung.anrechnung_id=tbl_anrechnung.anrechnung_id
+ AND tbl_notiz.titel='. $this->db->escape(self::ANRECHNUNG_NOTIZTITEL_NOTIZ_BY_STGL).'
+ ORDER BY tbl_notiz.insertamum DESC LIMIT 1) as text
+ FROM lehre.tbl_anrechnung
+ JOIN lehre.tbl_lehrveranstaltung lv USING(lehrveranstaltung_id)
+ JOIN public.tbl_student student USING(prestudent_id)
+ JOIN public.tbl_benutzer benutzer ON (benutzer.uid = student.student_uid)
+ JOIN public.tbl_person person USING(person_id)
+
+ WHERE EXISTS(SELECT 1 FROM lehre.tbl_anrechnung_anrechnungstatus status WHERE
+ anrechnung_id=tbl_anrechnung.anrechnung_id AND
+ (status.insertamum)::date = (NOW() - INTERVAL \'24 HOURS\')::DATE AND
+ status_kurzbz = '. $this->db->escape(self::ANRECHNUNGSTATUS_REJECTED). ')
+ ';
+
+ $db = new DB_Model();
+ $result = $db->execReadOnlyQuery($qry);
+
+ // Exit if there are no rejected Anrechnungen
+ if (!hasData($result))
+ {
+ $this->logInfo('ABORTED sending emails to students, whose Anrechnungen were rejected. No new rejectments found.');
+ exit;
+ }
+
+ // Loop through students
+ foreach ($result->retval as $student)
+ {
+ $to = $student->student_uid. '@'. DOMAIN;
+
+ $anrede = $student->geschlecht == 'w' ? 'Sehr geehrte Frau ' : 'Sehr geehrter Herr ';
+
+ $text = <<bezeichnung" leider nicht anrechnen, weil die Gleichwertigkeit nicht festgestellt werden konnte.
+ Begründung: $student->text
+html;
+
+ // Prepare mail content
+ $body_fields = array(
+ 'anrede_name' => $anrede. $student->vorname. ' '. $student->nachname,
+ 'text' => $text
+ );
+
+ // Send mail
+ sendSanchoMail(
+ 'AnrechnungGenehmigen',
+ $body_fields,
+ $to,
+ 'Anerkennung nachgewiesener Kenntnisse: Ihr Antrag ist abgeschlossen'
+ );
+ }
+
+ }
+
+ // Get STGL mail address
+ private function _getSTGLMailAddress($studiengang_kz)
+ {
+ $result = $this->StudiengangModel->getLeitung($studiengang_kz);
+
+ // Get STGL mail address
+ if (hasData($result))
+ {
+ return array(
+ $result->retval[0]->uid. '@'. DOMAIN,
+ $result->retval[0]->vorname
+ );
+ }
+ // If not available, get assistance mail address
+ else
+ {
+ $result = $this->StudiengangModel->load($studiengang_kz);
+
+ if (hasData($result))
+ {
+ return array(
+ $result->retval[0]->email,
+ ''
+ );
+ }
+ }
+ }
+
+ // Build HTML table with yesterdays new Anrechnungen of the given STG
+ private function _getSTGLMailDataTable($studiengang_kz, $anrechnungen)
+ {
+ $html = '';
+ $lv_bezeichnung = '';
+
+ // Filter Anrechnungen of given STG
+ $anrechnungen = array_filter(
+ $anrechnungen,
+ function ($anrechnung) use (&$studiengang_kz) {
+ return $anrechnung->studiengang_kz == $studiengang_kz;
+ });
+
+ // Amount of Anrechnungen
+ $amount = count($anrechnungen);
+
+ // HTML table body
+ $html .= '
+
+
+ ';
+
+ foreach ($anrechnungen as $anrechnung)
+ {
+ // Head line for each LV bezeichnung
+ if ($anrechnung->bezeichnung != $lv_bezeichnung)
+ {
+ $html .= '| ' . $anrechnung->bezeichnung . ' |
';
+ }
+
+ $lv_bezeichnung = $anrechnung->bezeichnung;
+
+ // Row for each Anrechnung / student
+ $html .= '| '. $anrechnung->vorname. ' '. $anrechnung->nachname. ' |
';
+ }
+
+ $html .= '
+
+
+ ';
+
+ return array($amount, $html);
+ }
}
diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php
index c5e4b94d8..d76c0d79b 100644
--- a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php
+++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php
@@ -1,6 +1,6 @@
'lehre/anrechnung_genehmigen:rw',
'approve' => 'lehre/anrechnung_genehmigen:rw',
'reject' => 'lehre/anrechnung_genehmigen:rw',
- 'requestRecommendation' => 'lehre/anrechnung_genehmigen:rw'
+ 'requestRecommendation' => 'lehre/anrechnung_genehmigen:rw',
+ 'withdraw' => 'lehre/anrechnung_genehmigen:rw',
+ 'withdrawRequestRecommendation' => 'lehre/anrechnung_genehmigen:rw',
+ 'saveEmpfehlungsNotiz' => 'lehre/anrechnung_genehmigen:rw'
)
);
@@ -80,29 +84,23 @@ class approveAnrechnungDetail extends Auth_Controller
self::_checkIfEntitledToReadAnrechnung($anrechnung_id);
// Get Anrechung data
- if (!$anrechnungData = getData($this->anrechnunglib->getAnrechnungData($anrechnung_id)))
- {
- show_error('Missing data for Anrechnung.');
- }
+ $anrechnungData = $this->anrechnunglib->getAnrechnungData($anrechnung_id);
+
+ // Get Antrag data
+ $antragData = $this->anrechnunglib->getAntragData(
+ $anrechnungData->prestudent_id,
+ $anrechnungData->studiensemester_kurzbz,
+ $anrechnungData->lehrveranstaltung_id
+ );
// Get Empfehlung data
- if(!$empfehlungData = getData($this->anrechnunglib->getEmpfehlungData($anrechnung_id)))
- {
- show_error('Missing data for recommendation');
- }
+ $empfehlungData = $this->anrechnunglib->getEmpfehlungData($anrechnung_id);
// Get Genehmigung data
- if(!$genehmigungData = getData($this->anrechnunglib->getGenehmigungData($anrechnung_id)))
- {
- show_error('Missing data for recommendation');
- }
-
+ $genehmigungData = $this->anrechnunglib->getGenehmigungData($anrechnung_id);
+
$viewData = array(
- 'antragData' => $this->anrechnunglib->getAntragData(
- $student_uid = $this->StudentModel->getUID($anrechnungData->prestudent_id),
- $anrechnungData->studiensemester_kurzbz,
- $anrechnungData->lehrveranstaltung_id
- ),
+ 'antragData' => $antragData,
'anrechnungData' => $anrechnungData,
'empfehlungData' => $empfehlungData,
'genehmigungData' => $genehmigungData
@@ -118,40 +116,30 @@ class approveAnrechnungDetail extends Auth_Controller
{
$data = $this->input->post('data');
- if(isEmptyArray($data))
+ // Validate data
+ if (isEmptyArray($data))
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
-
- // Get statusbezeichnung for 'approved'
- $this->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig');
- $approved = getData($this->AnrechnungstatusModel->load('approved'))[0];
- $approved = getUserLanguage() == 'German'
- ? $approved->bezeichnung_mehrsprachig[0]
- : $approved->bezeichnung_mehrsprachig[1];
-
+
+ // Get STGLs person data
if (!$person = getData($this->PersonModel->getByUID($this->_uid))[0])
{
show_error('Failed retrieving person data');
}
-
+
+ // Approve Anrechnung
foreach ($data as $item)
{
- // Approve Anrechnung
- if(getData($this->anrechnunglib->approveAnrechnung($item['anrechnung_id'])))
+ if ($this->anrechnunglib->approveAnrechnung($item['anrechnung_id']))
{
$json[]= array(
'anrechnung_id' => $item['anrechnung_id'],
'status_kurzbz' => self::ANRECHNUNGSTATUS_APPROVED,
- 'status_bezeichnung' => $approved,
- 'abgeschlossen_am' => (new DateTime())->format('d.m.Y'),
- 'abgeschlossen_von' => $person->vorname. ' '. $person->nachname
+ 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_APPROVED),
+ 'abgeschlossen_am' => (new DateTime())->format('d.m.Y'),
+ 'abgeschlossen_von' => $person->vorname. ' '. $person->nachname
);
-
- if(!$this->_sendSanchoMailToStudent($item['anrechnung_id'], self::ANRECHNUNGSTATUS_APPROVED))
- {
- show_error('Failed sending mail');
- }
}
}
@@ -173,40 +161,30 @@ class approveAnrechnungDetail extends Auth_Controller
{
$data = $this->input->post('data');
- if(isEmptyArray($data))
+ // Validate data
+ if (isEmptyArray($data))
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
-
- // Get statusbezeichnung for 'rejected'
- $this->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig');
- $rejected = getData($this->AnrechnungstatusModel->load('rejected'))[0];
- $rejected = getUserLanguage() == 'German'
- ? $rejected->bezeichnung_mehrsprachig[0]
- : $rejected->bezeichnung_mehrsprachig[1];
-
+
+ // Get STGLs person data
if (!$person = getData($this->PersonModel->getByUID($this->_uid))[0])
{
show_error('Failed retrieving person data');
}
-
+
+ // Reject Anrechnung
foreach ($data as $item)
{
- // Reject Anrechnung
- if(getData($this->anrechnunglib->rejectAnrechnung($item['anrechnung_id'], $item['begruendung'])))
+ if ($this->anrechnunglib->rejectAnrechnung($item['anrechnung_id'], $item['begruendung']))
{
$json[]= array(
'anrechnung_id' => $item['anrechnung_id'],
'status_kurzbz' => self::ANRECHNUNGSTATUS_REJECTED,
- 'status_bezeichnung' => $rejected,
+ 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_REJECTED),
'abgeschlossen_am' => (new DateTime())->format('d.m.Y'),
'abgeschlossen_von' => $person->vorname. ' '. $person->nachname
);
-
- if(!$this->_sendSanchoMailToStudent($item['anrechnung_id'], self::ANRECHNUNGSTATUS_REJECTED))
- {
- show_error('Failed sending mail');
- }
}
}
@@ -217,7 +195,7 @@ class approveAnrechnungDetail extends Auth_Controller
}
else
{
- return $this->outputJsonError('Es wurden keine Anrechnungen genehmigt.');
+ return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt'));
}
}
@@ -232,48 +210,166 @@ class approveAnrechnungDetail extends Auth_Controller
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
-
- // Get statusbezeichnung for 'inProgressLektor'
- $this->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig');
- $inProgressLektor = getData($this->AnrechnungstatusModel->load('inProgressLektor'))[0];
- $inProgressLektor = getUserLanguage() == 'German'
- ? $inProgressLektor->bezeichnung_mehrsprachig[0]
- : $inProgressLektor->bezeichnung_mehrsprachig[1];
-
+
+ $retval = array();
+ $counter = 0;
+
foreach ($data as $item)
{
- // Approve Anrechnung
- if(getData($this->anrechnunglib->requestRecommendation($item['anrechnung_id'])))
+ // Check if Anrechnungs-LV has lector
+ if (!$this->anrechnunglib->LVhasLector($item['anrechnung_id']))
{
- $json[]= array(
+ // Count up LV with no lector
+ $counter++;
+
+ // Break, if LV has no lector
+ break;
+ }
+
+ // Get full name of LV Leitung.
+ // If LV Leitung is not present, get full name of LV lectors.
+ $lector_arr = $this->anrechnunglib->getLectors($item['anrechnung_id']);
+ $empfehlungsanfrage_an = !isEmptyArray($lector_arr)
+ ? implode(', ', array_column($lector_arr, 'fullname'))
+ : '';
+
+ // Request Recommendation
+ if($this->anrechnunglib->requestRecommendation($item['anrechnung_id']))
+ {
+ $retval[]= array(
'anrechnung_id' => $item['anrechnung_id'],
'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR,
- 'status_bezeichnung' => $inProgressLektor,
+ 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR),
'empfehlung_anrechnung' => null,
- 'empfehlung_angefordert_am' => (new DateTime())->format('d.m.Y')
+ 'empfehlungsanfrageAm' => (new DateTime())->format('d.m.Y'),
+ 'empfehlungsanfrageAn' => $empfehlungsanfrage_an
);
}
}
-
+
+ /**
+ * Send mails to lectors
+ * NOTE: mails are sent at the end to ensure sending only ONE mail to each LV-Leitung or lector
+ * even if they are required for more recommendations
+ * */
+ if (!isEmptyArray($retval))
+ {
+ self::_sendSanchoMailToLectors($retval);
+
+ // Output json to ajax
+ return $this->outputJsonSuccess($retval);
+ }
+
// Output json to ajax
- if (isset($json) && !isEmptyArray($json))
+ if (isEmptyArray($retval) && $counter > 0)
{
- /**
- * Send mails to lectors
- * NOTE: mails are sent at the end to ensure sending only ONE mail to each LV-Leitung or lector
- * even if they are required for more recommendations
- * */
- if (!$this->_sendSanchoMailToLectors($json))
- {
- show_error('Failed sending emails');
- }
+ return $this->outputJsonError(
+ "Empfehlung wurde nicht angefordert,\nDer LV sind keine LektorInnen zugeteilt."
+ );
+ }
+
+ return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt'));
+ }
+
+ /**
+ * Withdraw approved / rejected Anrechnung and reset to 'inProgressDP'.
+ */
+ public function withdraw()
+ {
+ $anrechnung_id = $this->input->post('anrechnung_id');
+
+ if (!is_numeric($anrechnung_id))
+ {
+ $this->terminateWithJsonError($this->p->t('ui', 'errorFelderFehlen'));
+ }
+
+ // Delete last status approved / rejected.
+ // If last status is 'approved', Genehmigung is resetted.
+ $result = $this->AnrechnungModel->withdrawApprovement($anrechnung_id);
- return $this->outputJsonSuccess($json);
- }
- else
+ if (isError($result))
{
- return $this->outputJsonError('Es wurden keine Empfehlungen angefordert');
+ $this->terminateWithJsonError(getError($result));
}
+
+ // Success output to AJAX
+ $this->outputJsonSuccess(array(
+ 'status_bezeichnung' => $this->anrechnunglib->getLastAnrechnungstatus($anrechnung_id))
+ );
+ }
+
+ /**
+ * Withdraw request for reommendation and reset to 'inProgressDP'.
+ * This is only possible if the lector has not provided a recommendation yet.
+ */
+ public function withdrawRequestRecommendation()
+ {
+ $anrechnung_id = $this->input->post('anrechnung_id');
+
+ if (!is_numeric($anrechnung_id))
+ {
+ show_error('Wrong parameter.');
+ }
+
+ // Get boolean empfehlung of given Anrechnung
+ if (!$result = getData($this->AnrechnungModel->load($anrechnung_id))[0])
+ {
+ show_error('Failed loading Anrechnung');
+ }
+
+ $empfehlung = $result->empfehlung_anrechnung;
+
+ // Get last Anrechnungstatus
+ if (!$result = getData($this->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0])
+ {
+ show_error('Failed loading last Anrechnungstatus');
+ }
+
+ $last_status = $result->status_kurzbz;
+ $anrechnungstatus_id = $result->anrechnungstatus_id;
+
+ // Return if Anrechnung was not waiting for recommendation or if Anrechnung has already been recommended
+ if ($last_status != self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR && !is_null($empfehlung))
+ {
+ return $this->outputJsonError('No recommendation to withdraw.');
+ }
+
+ // Reset status to 'inProgressDP'
+ $result = $this->AnrechnungModel->deleteAnrechnungstatus($anrechnungstatus_id);
+
+ if (isError($result))
+ {
+ return $this->outputJsonError('Could not withdraw this application.');
+ }
+
+ // Success output to AJAX
+ return $this->outputJsonSuccess(array(
+ 'status_bezeichnung' => $this->anrechnunglib->getLastAnrechnungstatus($anrechnung_id))
+ );
+ }
+
+ public function saveEmpfehlungsNotiz()
+ {
+ $anrechnung_id = $this->input->post('anrechnung_id');
+ $notiz_id = $this->input->post('notiz_id');
+ $empfehlungstext = $this->input->post('empfehlung_text');
+
+ // Validate data
+ if (isEmptyString($anrechnung_id))
+ {
+ $this->terminateWithJsonError($this->p->t('ui', 'systemFehler'));
+ }
+
+ // Save Empfehlungstext
+ $result = self::_saveEmpfehlungsNotiz($anrechnung_id, $empfehlungstext, $notiz_id);
+
+ if (isError($result))
+ {
+ $this->terminateWithJsonError($this->p->t('ui', 'fehlerBeimSpeichern'));
+ }
+
+ // Output success message
+ $this->outputJsonSuccess($this->p->t('ui', 'gespeichert'));
}
/**
@@ -290,8 +386,12 @@ class approveAnrechnungDetail extends Auth_Controller
// Check if user is entitled to read dms doc
self::_checkIfEntitledToReadDMSDoc($dms_id);
-
- $this->dmslib->download($dms_id);
+
+ // Set filename to be used on downlaod
+ $filename = $this->anrechnunglib->setFilenameOnDownload($dms_id);
+
+ // Download file
+ $this->dmslib->download($dms_id, $filename);
}
/**
@@ -375,42 +475,7 @@ class approveAnrechnungDetail extends Auth_Controller
show_error('You are not entitled to read this document');
}
-
- /**
- * Send mail to student to inform if Anrechnung was approved or rejected
- * @param $mail_params
- */
- private function _sendSanchoMailToStudent($anrechnung_id, $status_kurzbz)
- {
- $result = getData($this->anrechnunglib->getStudentData($anrechnung_id))[0];
-
- // Get student name and mail address
- $to = $result->uid. '@'. DOMAIN;
-
- $anrede = $result->geschlecht == 'w' ? 'Sehr geehrte Frau ' : 'Sehr geehrter Herr ';
-
- $text = $status_kurzbz == self::ANRECHNUNGSTATUS_APPROVED
- ? 'Ihrem Antrag auf Anerkennung nachgewiesener Kenntnisse der Lehrveranstaltung "'.
- $result->lv_bezeichnung. '" wurde stattgegeben.'
- : 'wir haben Ihren Antrag auf Anerkennung nachgewiesener Kenntnisse geprüft und können die Lehrveranstaltung "'.
- $result->lv_bezeichnung. '" leider nicht anrechnen, weil die Gleichwertigkeit nicht festgestellt werden konnte.';
-
- // Prepare mail content
- $body_fields = array(
- 'anrede_name' => $anrede. $result->vorname. ' '. $result->nachname,
- 'text' => $text
- );
-
- sendSanchoMail(
- 'AnrechnungGenehmigen',
- $body_fields,
- $to,
- 'Anerkennung nachgewiesener Kenntnisse: Ihr Antrag ist abgeschlossen'
- );
-
- return true;
- }
-
+
/**
* Send mail to lectors asking for recommendation. (first to LV-Leitung, if not present to all lectors of lv)
* @param $mail_params
@@ -438,6 +503,8 @@ class approveAnrechnungDetail extends Auth_Controller
* Anyway this function will receive a unique array to avoid sending more mails to one and the same lector.
* **/
$lector_arr = $this->_getLectors($anrechnung_arr);
+
+
// Send mail to lectors
foreach ($lector_arr as $lector)
@@ -476,8 +543,8 @@ class approveAnrechnungDetail extends Auth_Controller
}
/**
- * Get lectors (prio for LV-Leitung, if not present to all lectors of LV.
- * Anyway this function will receive a unique array to avoid sending more mails to one and the same lector.
+ * Get unique array of LV lectors.
+ * Only get LV Leitung if present, otherwise all lectors of LV.
* @param $anrechnung_arr
* @return array
*/
@@ -521,11 +588,37 @@ class approveAnrechnungDetail extends Auth_Controller
unset($lector->lvleiter);
}
- // Now make the lector array aka mail receivers unique
+ // Make the lector array unique
$lector_arr = array_unique($lector_arr, SORT_REGULAR);
return $lector_arr;
}
+
+ private function _saveEmpfehlungsNotiz($anrechnung_id, $empfehlungstext, $notiz_id)
+ {
+ $this->load->model('person/Notiz_model', 'NotizModel');
+
+ if (!isEmptyString($notiz_id))
+ {
+ return $this->NotizModel->update(
+ $notiz_id,
+ array(
+ 'text' => $empfehlungstext,
+ 'updateamum' => (new DateTime())->format('Y-m-d H:i:s'),
+ 'updatevon' => $this->_uid
+ )
+ );
+ }
+
+ return $this->NotizModel->addNotizForAnrechnung(
+ $anrechnung_id,
+ self::ANRECHNUNG_NOTIZTITEL_EMPFEHLUNGSNOTIZ_BY_STGL,
+ trim($empfehlungstext),
+ $this->_uid
+ );
+
+
+ }
}
diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php
index b2d09fbe1..d59d97514 100644
--- a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php
+++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php
@@ -62,27 +62,21 @@ class approveAnrechnungUebersicht extends Auth_Controller
public function index()
{
+ // Get study semester
$studiensemester_kurzbz = $this->input->get('studiensemester');
- // Retrieve studiengaenge the user is entitled for
+ if (isEmptyString($studiensemester_kurzbz))
+ {
+ $result = $this->StudiensemesterModel->getNearest();
+ $studiensemester_kurzbz = getData($result)[0]->studiensemester_kurzbz;
+ }
+
+ // Get studiengaenge the user is entitled for
if (!$studiengang_kz_arr = $this->permissionlib->getSTG_isEntitledFor(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN))
{
show_error(getError($studiengang_kz_arr));
}
- if (!is_string($studiensemester_kurzbz))
- {
- $studiensemester = $this->StudiensemesterModel->getNearest();
- if (hasData($studiensemester))
- {
- $studiensemester_kurzbz = $studiensemester->retval[0]->studiensemester_kurzbz;
- }
- elseif (isError($studiensemester))
- {
- show_error(getError($studiensemester));
- }
- }
-
$viewData = array(
'studiensemester_selected' => $studiensemester_kurzbz,
'studiengaenge_entitled' => $studiengang_kz_arr
@@ -98,33 +92,22 @@ class approveAnrechnungUebersicht extends Auth_Controller
{
$data = $this->input->post('data');
- if(isEmptyArray($data))
+ // Validate data
+ if (isEmptyArray($data))
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
- // Get statusbezeichnung for 'approved'
- $this->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig');
- $approved = getData($this->AnrechnungstatusModel->load('approved'))[0];
- $approved = getUserLanguage() == 'German'
- ? $approved->bezeichnung_mehrsprachig[0]
- : $approved->bezeichnung_mehrsprachig[1];
-
+ // Approve Anrechnung
foreach ($data as $item)
{
- // Approve Anrechnung
- if(getData($this->anrechnunglib->approveAnrechnung($item['anrechnung_id'])))
+ if ($this->anrechnunglib->approveAnrechnung($item['anrechnung_id']))
{
$json[]= array(
'anrechnung_id' => $item['anrechnung_id'],
'status_kurzbz' => self::ANRECHNUNGSTATUS_APPROVED,
- 'status_bezeichnung' => $approved
+ 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_APPROVED)
);
-
- if(!$this->_sendSanchoMailToStudent($item['anrechnung_id'], self::ANRECHNUNGSTATUS_APPROVED))
- {
- show_error('Failed sending mail');
- }
}
}
@@ -146,33 +129,22 @@ class approveAnrechnungUebersicht extends Auth_Controller
{
$data = $this->input->post('data');
- if(isEmptyArray($data))
+ // Validate data
+ if (isEmptyArray($data))
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
- // Get statusbezeichnung for 'rejected'
- $this->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig');
- $rejected = getData($this->AnrechnungstatusModel->load('rejected'))[0];
- $rejected = getUserLanguage() == 'German'
- ? $rejected->bezeichnung_mehrsprachig[0]
- : $rejected->bezeichnung_mehrsprachig[1];
-
+ // Reject Anrechnung
foreach ($data as $item)
{
- // Reject Anrechnung
- if(getData($this->anrechnunglib->rejectAnrechnung($item['anrechnung_id'], $item['begruendung'])))
+ if ($this->anrechnunglib->rejectAnrechnung($item['anrechnung_id'], $item['begruendung']))
{
$json[]= array(
'anrechnung_id' => $item['anrechnung_id'],
'status_kurzbz' => self::ANRECHNUNGSTATUS_REJECTED,
- 'status_bezeichnung' => $rejected
+ 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_REJECTED)
);
-
- if(!$this->_sendSanchoMailToStudent($item['anrechnung_id'], self::ANRECHNUNGSTATUS_REJECTED))
- {
- show_error('Failed sending mail');
- }
}
}
@@ -199,46 +171,59 @@ class approveAnrechnungUebersicht extends Auth_Controller
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
- // Get statusbezeichnung for 'inProgressLektor'
- $this->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig');
- $inProgressLektor = getData($this->AnrechnungstatusModel->load('inProgressLektor'))[0];
- $inProgressLektor = getUserLanguage() == 'German'
- ? $inProgressLektor->bezeichnung_mehrsprachig[0]
- : $inProgressLektor->bezeichnung_mehrsprachig[1];
+ $retval = array();
+ $counter = 0;
foreach ($data as $item)
{
- // Approve Anrechnung
- if(getData($this->anrechnunglib->requestRecommendation($item['anrechnung_id'])))
+ // Check if Anrechnungs-LV has lector
+ if (!$this->anrechnunglib->LVhasLector($item['anrechnung_id']))
{
- $json[]= array(
+ // Count up LV with no lector
+ $counter++;
+
+ // Continue loop, if LV has no lector
+ continue;
+ }
+
+ // Request Recommendation
+ if($this->anrechnunglib->requestRecommendation($item['anrechnung_id']))
+ {
+ // Get full name of LV Leitung.
+ // If LV Leitung is not present, get full name of LV lectors.
+ $lector_arr = $this->anrechnunglib->getLectors($item['anrechnung_id']);
+ $empfehlungsanfrage_an = !isEmptyArray($lector_arr)
+ ? implode(', ', array_column($lector_arr, 'fullname'))
+ : '';
+
+ $retval[]= array(
'anrechnung_id' => $item['anrechnung_id'],
'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR,
- 'status_bezeichnung' => $inProgressLektor,
- 'empfehlung_anrechnung' => null
+ 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR),
+ 'empfehlung_anrechnung' => null,
+ 'empfehlungsanfrageAm' => (new DateTime())->format('Y-m-d H:i:s'),
+ 'empfehlungsanfrageAn' => $empfehlungsanfrage_an
);
}
}
- // Output json to ajax
- if (isset($json) && !isEmptyArray($json))
+ /**
+ * Send mails to lectors
+ * NOTE: mails are sent at the end to ensure sending only ONE mail to each LV-Leitung or lector
+ * even if they are required for more recommendations
+ * */
+ if (!isEmptyArray($retval))
{
- /**
- * Send mails to lectors
- * NOTE: mails are sent at the end to ensure sending only ONE mail to each LV-Leitung or lector
- * even if they are required for more recommendations
- * */
- if (!$this->_sendSanchoMailToLectors($json))
- {
- show_error('Failed sending emails');
- }
-
- return $this->outputJsonSuccess($json);
+ self::_sendSanchoMailToLectors($retval);
}
- else
+
+ // Output json to ajax
+ if (isEmptyArray($retval) && $counter == 0)
{
return $this->outputJsonError('Es wurden keine Empfehlungen angefordert');
}
+
+ return $this->outputJsonSuccess($retval);
}
/**
@@ -256,7 +241,11 @@ class approveAnrechnungUebersicht extends Auth_Controller
// Check if user is entitled to read dms doc
self::_checkIfEntitledToReadDMSDoc($dms_id);
- $this->dmslib->download($dms_id);
+ // Set filename to be used on downlaod
+ $filename = $this->anrechnunglib->setFilenameOnDownload($dms_id);
+
+ // Download file
+ $this->dmslib->download($dms_id, $filename);
}
@@ -307,41 +296,6 @@ class approveAnrechnungUebersicht extends Auth_Controller
show_error('You are not entitled to read this document');
}
- /**
- * Send mail to student to inform if Anrechnung was approved or rejected
- * @param $mail_params
- */
- private function _sendSanchoMailToStudent($anrechnung_id, $status_kurzbz)
- {
- $result = getData($this->anrechnunglib->getStudentData($anrechnung_id))[0];
-
- // Get student name and mail address
- $to = $result->uid. '@'. DOMAIN;
-
- $anrede = $result->geschlecht == 'w' ? 'Sehr geehrte Frau ' : 'Sehr geehrter Herr ';
-
- $text = $status_kurzbz == self::ANRECHNUNGSTATUS_APPROVED
- ? 'Ihrem Antrag auf Anerkennung nachgewiesener Kenntnisse der Lehrveranstaltung "'.
- $result->lv_bezeichnung. '" wurde stattgegeben.'
- : 'wir haben Ihren Antrag auf Anerkennung nachgewiesener Kenntnisse geprüft und können die Lehrveranstaltung "'.
- $result->lv_bezeichnung. '" leider nicht anrechnen, weil die Gleichwertigkeit nicht festgestellt werden konnte.';
-
- // Prepare mail content
- $body_fields = array(
- 'anrede_name' => $anrede. $result->vorname. ' '. $result->nachname,
- 'text' => $text
- );
-
- sendSanchoMail(
- 'AnrechnungGenehmigen',
- $body_fields,
- $to,
- 'Anerkennung nachgewiesener Kenntnisse: Ihr Antrag ist abgeschlossen'
- );
-
- return true;
- }
-
/**
* Send mail to lectors asking for recommendation. (first to LV-Leitung, if not present to all lectors of lv)
* @param $mail_params
@@ -456,6 +410,5 @@ class approveAnrechnungUebersicht extends Auth_Controller
$lector_arr = array_unique($lector_arr, SORT_REGULAR);
return $lector_arr;
-
}
}
\ No newline at end of file
diff --git a/application/controllers/lehre/anrechnung/CreateAnrechnung.php b/application/controllers/lehre/anrechnung/CreateAnrechnung.php
new file mode 100644
index 000000000..bc594371d
--- /dev/null
+++ b/application/controllers/lehre/anrechnung/CreateAnrechnung.php
@@ -0,0 +1,271 @@
+ 'lehre/anrechnung_anlegen:r',
+ 'getLVsByStudent' => 'lehre/anrechnung_anlegen:r',
+ 'create' => 'lehre/anrechnung_anlegen:rw'
+ )
+ );
+
+ // Load models
+ $this->load->model('education/Anrechnung_model', 'AnrechnungModel');
+ $this->load->model('education/Anrechnungstatus_model', 'AnrechnungstatusModel');
+ $this->load->model('content/DmsVersion_model', 'DmsVersionModel');
+ $this->load->model('crm/Student_model', 'StudentModel');
+ $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
+
+ // Load libraries
+ $this->load->library('WidgetLib');
+ $this->load->library('PermissionLib');
+ $this->load->library('AnrechnungLib');
+ $this->load->library('DmsLib');
+
+ // Load helpers
+ $this->load->helper('form');
+ $this->load->helper('url');
+
+ // Load language phrases
+ $this->loadPhrases(
+ array(
+ 'global',
+ 'ui',
+ 'anrechnung',
+ 'person',
+ 'lehre'
+ )
+ );
+
+ // Load configs
+ $this->load->config('anrechnung');
+
+ $this->_setAuthUID();
+
+ $this->setControllerId();
+ }
+
+ public function index()
+ {
+ // Get Studiensemester
+ $studiensemester_kurzbz = $this->input->get('studiensemester');
+
+ // If no Studiensemester is given
+ if (isEmptyString($studiensemester_kurzbz))
+ {
+ //...use the nearest Studiensemester
+ $result = $this->StudiensemesterModel->getNearest();
+ $studiensemester_kurzbz = getData($result)[0]->studiensemester_kurzbz;
+ }
+
+ // Get Studiengaenge the user is entitled for
+ if (!$studiengang_kz_arr = $this->permissionlib->getSTG_isEntitledFor(self::BERECHTIGUNG_ANRECHNUNG_ANLEGEN))
+ {
+ show_error('Failed retrieving Studiengaenge');
+ }
+
+ // Get Anrechnungsbegruendungen
+ $this->load->model('education/Anrechnungbegruendung_model', 'AnrechnungbegruendungModel');
+ $begruendung_arr = getData($this->AnrechnungbegruendungModel->load());
+
+ $viewData = array(
+ 'studiensemester_selected' => $studiensemester_kurzbz,
+ 'studiengaenge_entitled' => $studiengang_kz_arr,
+ 'begruendungen' => $begruendung_arr
+ );
+
+ $this->load->view('lehre/anrechnung/createAnrechnung.php', $viewData);
+ }
+
+ /**
+ * Get Lehrveranstaltungen from Student.
+ */
+ public function getLVsByStudent()
+ {
+ $prestudent_id = $this->input->post('prestudent_id');
+ $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
+
+ // Get Student UID
+ $student_uid = $this->StudentModel->getUID($prestudent_id);
+
+ // Retrieve Lehrveranstaltungen from student
+ $result = $this->LehrveranstaltungModel->getLvsByStudent($student_uid, $studiensemester_kurzbz);
+
+ // Exit, if student has no Lehrveranstaltungen
+ if (!hasData($result))
+ {
+ $this->terminateWithJsonError($this->p->t('ui', 'keineLVzugeteilt'));
+ }
+
+ // Success response to AJAX
+ $this->outputJsonSuccess(getData($result));
+ }
+
+ /**
+ * Create Anrechnungsantrag.
+ *
+ * Saves Anrechnung and Anrechnungstatus.
+ * Also saves Nachweisdokument to DMS.
+ */
+ public function create()
+ {
+ $prestudent_id = $this->input->post('prestudent_id');
+ $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
+ $lehrveranstaltung_id = $this->input->post('lehrveranstaltung_id');
+ $begruendung_id = $this->input->post('begruendung_id');
+ $herkunftKenntnisse = $this->input->post('herkunftKenntnisse');
+
+ // Validate upload file
+ if (empty($_FILES['uploadfile']['name']))
+ {
+ $this->terminateWithJsonError($this->p->t('ui', 'errorUploadFehlt'));
+ }
+
+ // Validate required data
+ if (isEmptyString($begruendung_id) || isEmptyString($lehrveranstaltung_id))
+ {
+ $this->terminateWithJsonError($this->p->t('ui', 'errorFelderFehlen'));
+ }
+
+ // Exit if application already exists
+ if (self::_applicationExists($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id))
+ {
+ $this->terminateWithJsonError($this->p->t('global', 'antragBereitsGestellt'));
+ }
+
+ // Exit if Lehrveranstaltung was already graded with application blocking grades
+ if (self::_LVhasBlockingGrades($studiensemester_kurzbz, $lehrveranstaltung_id, $prestudent_id))
+ {
+ $this->terminateWithJsonError($this->p->t('anrechnung', 'antragBenotungBlockiert'));
+ }
+
+ // Upload document
+ $result = self::_uploadFile();
+
+ if (isError($result))
+ {
+ $this->terminateWithJsonError($result->retval);
+ }
+
+ // Hold just inserted DMS ID
+ $lastInsert_dms_id = $result->retval['dms_id'];
+
+ // Save Anrechnung and Anrechnungstatus
+ $result = $this->AnrechnungModel->createAnrechnungsantrag(
+ $prestudent_id,
+ $studiensemester_kurzbz,
+ $lehrveranstaltung_id,
+ $begruendung_id,
+ $lastInsert_dms_id,
+ $herkunftKenntnisse
+ );
+
+ if (isError($result))
+ {
+ $this->terminateWithJsonError(getError($result));
+ }
+
+ $lastInsert_anrechnung_id = getData($result);
+
+ // Success response to AJAX
+ $this->outputJsonSuccess(array(
+ 'anrechnung_id' => $lastInsert_anrechnung_id,
+ 'msg' => $this->p->t('global', 'antragWurdeAngelegt')
+ ));
+ }
+
+
+ /**
+ * Retrieve the UID of the logged user and checks if it is valid
+ */
+ private function _setAuthUID()
+ {
+ $this->_uid = getAuthUID();
+
+ if (!$this->_uid) show_error('User authentification failed');
+ }
+
+ /**
+ * Check if application already exists.
+ *
+ * @param $lehrveranstaltung_id
+ * @param $studiensemester_kurzbz
+ * @param $prestudent_id
+ * @return bool
+ */
+ private function _applicationExists($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id)
+ {
+ $result = $this->AnrechnungModel->loadWhere(array(
+ 'lehrveranstaltung_id' => $lehrveranstaltung_id,
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz,
+ 'prestudent_id' => $prestudent_id
+ ));
+
+ if (isError($result))
+ {
+ show_error(getError($result));
+ }
+
+ return hasData($result);
+ }
+
+ /**
+ * Upload file via DMS library.
+ *
+ * @return mixed
+ * @throws Exception
+ */
+ private function _uploadFile()
+ {
+ $dms = array(
+ 'kategorie_kurzbz' => 'anrechnung',
+ 'version' => 0,
+ 'name' => $_FILES['uploadfile']['name'],
+ 'mimetype' => $_FILES['uploadfile']['type'],
+ 'insertamum' => (new DateTime())->format('Y-m-d H:i:s'),
+ 'insertvon' => $this->_uid
+ );
+
+ // Upload document
+ return $this->dmslib->upload($dms, 'uploadfile', array('pdf'));
+ }
+
+ private function _LVhasBlockingGrades($studiensemester_kurzbz, $lehrveranstaltung_id, $prestudent_id)
+ {
+ // Get Student UID
+ $student_uid = $this->StudentModel->getUID($prestudent_id);
+
+ // Get Note of Lehrveranstaltung
+ $this->load->model('education/Lvgesamtnote_model', 'LvgesamtnoteModel');
+ $result = $this->LvgesamtnoteModel->load(array(
+ 'student_uid' => $student_uid,
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz,
+ 'lehrveranstaltung_id' => $lehrveranstaltung_id
+ )
+ );
+
+ // If Lehrveranstaltung has Note
+ if (hasData($result))
+ {
+ $note = getData($result)[0]->note;
+
+ // Check if Note is a blocking grade
+ if (in_array($note, $this->config->item('grades_blocking_application')))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
\ No newline at end of file
diff --git a/application/controllers/lehre/anrechnung/RequestAnrechnung.php b/application/controllers/lehre/anrechnung/RequestAnrechnung.php
index 4f589e5f5..45a770cf5 100644
--- a/application/controllers/lehre/anrechnung/RequestAnrechnung.php
+++ b/application/controllers/lehre/anrechnung/RequestAnrechnung.php
@@ -6,15 +6,13 @@ class requestAnrechnung extends Auth_Controller
{
const REQUEST_ANRECHNUNG_URI = '/lehre/anrechnung/RequestAnrechnung';
const APPROVE_ANRECHNUNG_URI = '/lehre/anrechnung/ApproveAnrechnungUebersicht';
-
+
const ANRECHNUNGSTATUS_PROGRESSED_BY_STGL = 'inProgressDP';
const ANRECHNUNGSTATUS_PROGRESSED_BY_KF = 'inProgressKF';
const ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR = 'inProgressLektor';
const ANRECHNUNGSTATUS_APPROVED = 'approved';
const ANRECHNUNGSTATUS_REJECTED = 'rejected';
-
- const DEADLINE_INTERVAL_NACH_SEMESTERSTART = 'P1M'; // Deadline for application
-
+
public function __construct()
{
// Set required permissions
@@ -25,22 +23,25 @@ class requestAnrechnung extends Auth_Controller
'download' => 'student/anrechnung_beantragen:rw',
)
);
-
+
// Load models
$this->load->model('education/Anrechnung_model', 'AnrechnungModel');
$this->load->model('content/DmsVersion_model', 'DmsVersionModel');
-
+
// Load libraries
$this->load->library('WidgetLib');
$this->load->library('PermissionLib');
$this->load->library('AnrechnungLib');
$this->load->library('DmsLib');
-
+
// Load helpers
$this->load->helper('form');
$this->load->helper('url');
$this->load->helper('hlp_sancho_helper');
-
+
+ // Load configs
+ $this->load->config('anrechnung');
+
// Load language phrases
$this->loadPhrases(
array(
@@ -51,63 +52,59 @@ class requestAnrechnung extends Auth_Controller
'lehre'
)
);
-
+
$this->_setAuthUID();
-
+
$this->setControllerId();
}
-
+
public function index()
{
$studiensemester_kurzbz = $this->input->get('studiensemester');
$lehrveranstaltung_id = $this->input->get('lv_id');
-
- if (!is_numeric($lehrveranstaltung_id) || !is_string($studiensemester_kurzbz))
+
+ if (isEmptyString($lehrveranstaltung_id) || isEmptyString($studiensemester_kurzbz))
{
show_error('Missing correct parameter');
}
-
+
+ // Exit if user is not a student
+ $result = $this->StudentModel->load(array('student_uid' => $this->_uid));
+
+ if (!hasData($result))
+ {
+ show_error('Cant load user');
+ }
+
+ // Get Prestudent ID
+ $prestudent_id = getData($result)[0]->prestudent_id;
+
// Check if application deadline is expired
- // $is_expired = $this->_checkAntragDeadline($studiensemester_kurzbz);
- $is_expired = false; // Set to false until Deadline is defined
-
- $student = $this->StudentModel->load(array('student_uid' => $this->_uid));
- if (isSuccess($student) && hasData($student))
- {
- $prestudent_id = getData($student)[0]->prestudent_id;
- }
- else
- show_error('Cant load User');
-
+ $is_expired = self::_checkAntragDeadline(
+ $this->config->item('submit_application_start'),
+ $this->config->item('submit_application_end'),
+ $studiensemester_kurzbz
+ );
+
+ // Check if Lehrveranstaltung was already graded with application blocking grades
+ $is_blocked = self::_LVhasBlockingGrades($studiensemester_kurzbz, $lehrveranstaltung_id);
+
// Get Anrechung data
- $result = $this->anrechnunglib->getAnrechnungDataByLv($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id);
- if (!$anrechnungData = getData($result))
- {
- show_error(getError($anrechnungData));
- }
-
- // Dont show who is progressing the application to the student
- if ($anrechnungData->status_kurzbz == self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL ||
- $anrechnungData->status_kurzbz == self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR ||
- $anrechnungData->status_kurzbz == self::ANRECHNUNGSTATUS_PROGRESSED_BY_KF)
- {
- $anrechnungData->status = getUserLanguage() == 'German' ? 'in Bearbeitung' : 'in process';
- }
-
- $antragData = $this->anrechnunglib->getAntragData($this->_uid, $studiensemester_kurzbz, $lehrveranstaltung_id);
+ $anrechnungData = $this->anrechnunglib->getAnrechnungDataByLv($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id);
+ // Get Antrag data
+ $antragData = $this->anrechnunglib->getAntragData($prestudent_id, $studiensemester_kurzbz, $lehrveranstaltung_id);
+
$viewData = array(
'antragData' => $antragData,
'anrechnungData' => $anrechnungData,
'is_expired' => $is_expired,
- 'disabled' => $is_expired && empty($anrechnungData->anrechnung_id) || !empty($anrechnungData->anrechnung_id)
- ? 'disabled'
- : ''
+ 'is_blocked' => $is_blocked
);
-
+
$this->load->view('lehre/anrechnung/requestAnrechnung.php', $viewData);
}
-
+
/**
* Apply Anrechnungsantrag and send to STGL
*/
@@ -117,104 +114,82 @@ class requestAnrechnung extends Auth_Controller
$begruendung_id = $this->input->post('begruendung');
$lehrveranstaltung_id = $this->input->post('lv_id');
$studiensemester_kurzbz = $this->input->post('studiensemester');
+ $bestaetigung = $this->input->post('bestaetigung');
+ // Validate data
if (empty($_FILES['uploadfile']['name']))
{
- show_error('Missing upload file');
+ return $this->outputJsonError($this->p->t('ui', 'errorUploadFehlt'));
}
- if (!is_numeric($begruendung_id) || !is_numeric($lehrveranstaltung_id) || !is_string($studiensemester_kurzbz))
+ if (isEmptyString($begruendung_id) ||
+ isEmptyString($anmerkung) ||
+ isEmptyString($lehrveranstaltung_id) ||
+ isEmptyString($studiensemester_kurzbz))
{
- show_error('Missing correct parameter');
+ return $this->outputJsonError($this->p->t('ui', 'errorFelderFehlen'));
}
-
- $student = $this->StudentModel->load(array('student_uid' => $this->_uid));
- if (isSuccess($student) && hasData($student))
+
+ if (isEmptyString($bestaetigung))
{
- $prestudent_id = getData($student)[0]->prestudent_id;
+ return $this->outputJsonError($this->p->t('ui', 'errorBestaetigungFehlt'));
}
- else
- show_error('Cant load User');
-
- $result = $this->_getAnrechnung($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id);
- if (hasData($result))
+
+ // Exit if user is not a student
+ $result = $this->StudentModel->load(array('student_uid' => $this->_uid));
+
+ if (!hasData($result))
{
- show_error('Der Antrag wurde bereits gestellt');
+ return $this->outputJsonError('Cant load user');
}
-
- // Start DB transaction
- $this->db->trans_start(false);
-
+
+ // Get Prestudent ID
+ $prestudent_id = getData($result)[0]->prestudent_id;
+
+ // Exit if application already exists
+ if (self::_applicationExists($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id))
+ {
+ return $this->outputJsonError($this->p->t('anrechnung', 'antragBereitsGestellt'));
+ }
+
+ // Exit if application is not for actual studysemester
+ if (!self::_applicationIsForActualSS($studiensemester_kurzbz))
+ {
+ return $this->outputJsonError($this->p->t('anrechnung', 'antragNurImAktSS'));
+ }
+
// Upload document
- $dms = array(
- 'kategorie_kurzbz' => 'anrechnung',
- 'version' => 0,
- 'name' => $_FILES['uploadfile']['name'],
- 'mimetype' => $_FILES['uploadfile']['type'],
- 'insertamum' => (new DateTime())->format('Y-m-d H:i:s'),
- 'insertvon' => $this->_uid
+ $result = self::_uploadFile();
+
+ if (isError($result))
+ {
+ return $this->outputJsonError($result->retval);
+ }
+
+ // Hold just inserted DMS ID
+ $lastInsert_dms_id = $result->retval['dms_id'];
+
+ // Save Anrechnung and Anrechnungstatus
+ $result = $this->AnrechnungModel->createAnrechnungsantrag(
+ $prestudent_id,
+ $studiensemester_kurzbz,
+ $lehrveranstaltung_id,
+ $begruendung_id,
+ $lastInsert_dms_id,
+ $anmerkung
);
-
- if(isError($uploaddata = $this->dmslib->upload($dms, array('pdf'))))
+
+ if (isError($result))
{
- show_error(getError($uploaddata));
+ $this->terminateWithJsonError(getError($result));
}
-
- // Get PrestudentID
- $result = $this->_loadPrestudent($this->_uid, $studiensemester_kurzbz);
-
- if (!$prestudent = getData($result)[0])
- {
- show_error('Failed retrieving prestudent');
- }
-
- // Save Anrechnung
- $result = $this->AnrechnungModel->insert(array(
- 'prestudent_id' => $prestudent->prestudent_id,
- 'lehrveranstaltung_id' => $lehrveranstaltung_id,
- 'begruendung_id' => $begruendung_id,
- 'dms_id' => $uploaddata->retval['dms_id'],
- 'studiensemester_kurzbz' => $studiensemester_kurzbz,
- 'anmerkung_student' => $anmerkung,
- 'insertvon' => $this->_uid
+
+ // Output to AJAX
+ $this->outputJsonSuccess(array(
+ 'antragdatum' => (new DateTime())->format('d.m.Y'),
+ 'dms_id' => $lastInsert_dms_id,
+ 'filename' => $_FILES['uploadfile']['name']
));
-
- if (isError($result))
- {
- show_error('Failed inserting Anrechnung');
- }
-
- // Save Anrechnungstatus 'inProgressSTGL'
- $result = $this->AnrechnungModel->saveAnrechnungstatus($result->retval, self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL);
-
- if (isError($result))
- {
- show_error('Failed saving Anrechnungstatus');
- }
-
- // Transaction complete!
- $this->db->trans_complete();
-
- if ($this->db->trans_status() === false || isError($result))
- {
- $this->db->trans_rollback();
- show_error($result->msg, EXIT_ERROR);
- }
-
- // Send mail to STGL
- $mail_params = array(
- 'studiengang_kz' => $prestudent->studiengang_kz,
- 'lehrveranstaltung_id' => $lehrveranstaltung_id
- );
-
- if(!$this->_sendSanchoMail($mail_params))
- {
- show_error('Failed sending mail');
- }
- else
- {
- redirect(site_url(). self::REQUEST_ANRECHNUNG_URI. '?studiensemester='. $studiensemester_kurzbz. '&lv_id='. $lehrveranstaltung_id);
- }
}
/**
@@ -241,53 +216,50 @@ class requestAnrechnung extends Auth_Controller
private function _setAuthUID()
{
$this->_uid = getAuthUID();
-
+
if (!$this->_uid) show_error('User authentification failed');
}
-
- /**
- * Load Prestudent by uid and Studiensemester.
- * @param $uid
- * @param $studiensemester_kurzbz
- * @return mixed
- */
- private function _loadPrestudent($uid, $studiensemester_kurzbz)
- {
- $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
- $this->load->model('crm/Student_model', 'StudentModel');
-
- $this->PrestudentstatusModel->addJoin('public.tbl_student', 'prestudent_id');
- return $this->PrestudentstatusModel->loadWhere(array(
- 'student_uid' => $uid,
- 'studiensemester_kurzbz' => $studiensemester_kurzbz
- )
- );
- }
-
+
/**
* Check if application deadline is expired.
+ *
+ * @param $start Start date for application submission.
+ * @param $ende End date for application submission.
* @param $studiensemester_kurzbz
- * @return bool True if semester start is more then 1 week ago
+ * @return bool True if today is not during the start- and ending deadlines (= if is expired)
* @throws Exception
*/
- private function _checkAntragDeadline($studiensemester_kurzbz)
+ private function _checkAntragDeadline($start, $ende, $studiensemester_kurzbz)
{
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
- $this->StudiensemesterModel->addSelect('start');
- if (!$start = getData($this->StudiensemesterModel->load($studiensemester_kurzbz)))
+
+ // If start is not given, set to Semesterstart.
+ if (!isset($start) || isEmptyString($start))
{
- show_error(getError($start));
+ $this->StudiensemesterModel->addSelect('start');
+ $result = $this->StudiensemesterModel->load($studiensemester_kurzbz);
+ $start = getData($result)[0]->start;
}
-
- $start = new DateTime($start[0]->start);
+
+ // If ende is not given, set to Semesterende.
+ if (!isset($ende) || isEmptyString($ende))
+ {
+ $this->StudiensemesterModel->addSelect('ende');
+ $result = $this->StudiensemesterModel->load($studiensemester_kurzbz);
+ $ende = getData($result)[0]->ende;
+ }
+
$today = new DateTime('today midnight');
-
- // True if today > application deadline
- return ($today > $start->add((new DateInterval(self::DEADLINE_INTERVAL_NACH_SEMESTERSTART))));
+ $start = new DateTime($start);
+ $ende = new DateTime($ende);
+
+ // True if today is not during the start- and ending deadlines (= if is expired)
+ return ($today <= $start || $today >= $ende);
}
-
+
/**
- * Check if user is entitled to read dms doc
+ * Check if user is entitled to read dms doc.
+ *
* @param $dms_id
*/
private function _checkIfEntitledToReadDMSDoc($dms_id)
@@ -298,7 +270,7 @@ class requestAnrechnung extends Auth_Controller
}
$result = $this->AnrechnungModel->loadWhere(array('dms_id' => $dms_id));
-
+
if($result = getData($result)[0])
{
if ($result->prestudent_id == $student->prestudent_id)
@@ -306,104 +278,92 @@ class requestAnrechnung extends Auth_Controller
return;
}
}
-
+
show_error('You are not entitled to read this document');
}
-
+
/**
- * Get Anrechnung by Lehrveranstaltung
+ * Check if application already exists.
+ *
* @param $lehrveranstaltung_id
- * @return mixed
+ * @param $studiensemester_kurzbz
+ * @param $prestudent_id
+ * @return bool
*/
- private function _getAnrechnung($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id)
+ private function _applicationExists($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id)
{
$result = $this->AnrechnungModel->loadWhere(array(
'lehrveranstaltung_id' => $lehrveranstaltung_id,
'studiensemester_kurzbz' => $studiensemester_kurzbz,
'prestudent_id' => $prestudent_id
));
-
+
if (isError($result))
{
show_error(getError($result));
}
-
- return $result;
+
+ return hasData($result);
}
-
+
/**
- * Send mail to STGL (if not available, send to STGL assistance)
- * @param $mail_params
+ * Check if applications' study semester is actual study semester.
+ *
+ * @param $studiensemester_kurzbz
+ * @return bool
*/
- private function _sendSanchoMail($mail_params)
+ private function _applicationIsForActualSS($studiensemester_kurzbz)
{
- // Get STGL mail address, if available, otherwise get assistance mail address
- list ($to, $vorname) = $this->_getSTGLMailAddress($mail_params['studiengang_kz']);
-
- // Get full name of student
- $this->load->model('person/Person_model', 'PersonModel');
- if (!$student_name = getData($this->PersonModel->getFullName($this->_uid)))
- {
- show_error ('Failed retrieving person');
- }
-
- // Get lehrveranstaltung bezeichnung
- $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
- if (!$lehrveranstaltung = getData($this->LehrveranstaltungModel->load($mail_params['lehrveranstaltung_id']))[0])
- {
- show_error ('Failed retrieving person');
- }
-
- // Link to Antrag genehmigen
- $url =
- CIS_ROOT. 'cis/index.php?menu='.
- CIS_ROOT. 'cis/menu.php?content_id=&content='.
- CIS_ROOT. index_page(). self::APPROVE_ANRECHNUNG_URI;
-
- // Prepare mail content
- $body_fields = array(
- 'vorname' => $vorname,
- 'student_name' => $student_name,
- 'lehrveranstaltung_bezeichnung' => $lehrveranstaltung->bezeichnung,
- 'link' => anchor($url, 'Anrechnungsanträge Übersicht')
- );
-
- sendSanchoMail(
- 'AnrechnungAntragStellen',
- $body_fields,
- $to,
- 'Anerkennung nachgewiesener Kenntnisse: Neuer Antrag wurde gestellt'
- );
-
- return true;
+ $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+ $result = $this->StudiensemesterModel->getNearest();
+ $actual_ss = getData($result)[0]->studiensemester_kurzbz;
+
+ return $studiensemester_kurzbz == $actual_ss;
}
-
- // Get STGL mail address, if available, otherwise get assistance mail address
- private function _getSTGLMailAddress($stg_kz)
+
+ private function _LVhasBlockingGrades($studiensemester_kurzbz, $lehrveranstaltung_id)
{
- $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
- $result = $this->StudiengangModel->getLeitung($stg_kz);
-
- // Get STGL mail address, if available
+ // Get Note of Lehrveranstaltung
+ $this->load->model('education/Lvgesamtnote_model', 'LvgesamtnoteModel');
+ $result = $this->LvgesamtnoteModel->load(array(
+ 'student_uid' => $this->_uid,
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz,
+ 'lehrveranstaltung_id' => $lehrveranstaltung_id
+ )
+ );
+
+ // If Lehrveranstaltung has Note
if (hasData($result))
{
- return array(
- $result->retval[0]->uid. '@'. DOMAIN,
- $result->retval[0]->vorname
- );
- }
- // ...otherwise get assistance mail address
- else
- {
- $result = $this->StudiengangModel->load($stg_kz);
-
- if (hasData($result))
+ $note = getData($result)[0]->note;
+
+ // Check if Note is a blocking grade
+ if (in_array($note, $this->config->item('grades_blocking_application')))
{
- return array(
- $result->retval[0]->email,
- ''
- );
+ return true;
}
}
+ return false;
}
-}
+
+ /**
+ * Upload file via DMS library.
+ *
+ * @return mixed
+ * @throws Exception
+ */
+ private function _uploadFile()
+ {
+ $dms = array(
+ 'kategorie_kurzbz' => 'anrechnung',
+ 'version' => 0,
+ 'name' => $_FILES['uploadfile']['name'],
+ 'mimetype' => $_FILES['uploadfile']['type'],
+ 'insertamum' => (new DateTime())->format('Y-m-d H:i:s'),
+ 'insertvon' => $this->_uid
+ );
+
+ // Upload document
+ return $this->dmslib->upload($dms, 'uploadfile', array('pdf'));
+ }
+}
\ No newline at end of file
diff --git a/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php
index b9c723eee..78175f4e6 100644
--- a/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php
+++ b/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php
@@ -1,6 +1,6 @@
anrechnunglib->getAnrechnungData($anrechnung_id)))
- {
- show_error('Missing data for Anrechnung.');
- }
+ $anrechnungData = $this->anrechnunglib->getAnrechnungData($anrechnung_id);
+
+ // Get Antrag data
+ $antragData = $this->anrechnunglib->getAntragData(
+ $anrechnungData->prestudent_id,
+ $anrechnungData->studiensemester_kurzbz,
+ $anrechnungData->lehrveranstaltung_id
+ );
// Get Empfehlung data
- if(!$empfehlungData = getData($this->anrechnunglib->getEmpfehlungData($anrechnung_id)))
- {
- show_error('Missing data for recommendation');
- }
+ $empfehlungData = $this->anrechnunglib->getEmpfehlungData($anrechnung_id);
$viewData = array(
- 'antragData' => $this->anrechnunglib->getAntragData(
- $student_uid = $this->StudentModel->getUID($anrechnungData->prestudent_id),
- $anrechnungData->studiensemester_kurzbz,
- $anrechnungData->lehrveranstaltung_id
- ),
+ 'antragData' => $antragData,
'anrechnungData' => $anrechnungData,
'empfehlungData' => $empfehlungData
);
@@ -113,29 +110,23 @@ class reviewAnrechnungDetail extends Auth_Controller
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
-
- // Get statusbezeichnung for 'inProgressDP'
- $this->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig');
- $inProgressDP = getData($this->AnrechnungstatusModel->load('inProgressDP'))[0];
- $inProgressDP = getUserLanguage() == 'German'
- ? $inProgressDP->bezeichnung_mehrsprachig[0]
- : $inProgressDP->bezeichnung_mehrsprachig[1];
-
+
+ // Get lectors person data
if (!$person = getData($this->PersonModel->getByUID($this->_uid))[0])
{
- show_error('Failed retrieving person data');
+ return $this->outputJsonError('Failed retrieving person data');
}
foreach ($data as $item)
{
// Approve Anrechnung
- if(getData($this->anrechnunglib->recommendAnrechnung($item['anrechnung_id'])))
+ if($this->anrechnunglib->recommendAnrechnung($item['anrechnung_id']))
{
$json[]= array(
'anrechnung_id' => $item['anrechnung_id'],
'empfehlung_anrechnung' => 'true',
'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL,
- 'status_bezeichnung' => $inProgressDP,
+ 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL),
'empfehlung_am' => (new DateTime())->format('d.m.Y'),
'empfehlung_von' => $person->vorname. ' '. $person->nachname
);
@@ -151,14 +142,14 @@ class reviewAnrechnungDetail extends Auth_Controller
* */
if (!$this->_sendSanchoMails($json, true))
{
- show_error('Failed sending emails');
+ return $this->outputJsonError('Failed sending emails');
}
return $this->outputJsonSuccess($json);
}
else
{
- return $this->outputJsonError('Empfehlungen wurden nicht durchgeführt');
+ return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt'));
}
}
@@ -174,29 +165,23 @@ class reviewAnrechnungDetail extends Auth_Controller
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
- // Get statusbezeichnung for 'inProgressDP'
- $this->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig');
- $inProgressDP = getData($this->AnrechnungstatusModel->load('inProgressDP'))[0];
- $inProgressDP = getUserLanguage() == 'German'
- ? $inProgressDP->bezeichnung_mehrsprachig[0]
- : $inProgressDP->bezeichnung_mehrsprachig[1];
-
+ // Get lectors person data
if (!$person = getData($this->PersonModel->getByUID($this->_uid))[0])
{
- show_error('Failed retrieving person data');
+ return $this->outputJsonError('Failed retrieving person data');
}
foreach ($data as $item)
{
// Approve Anrechnung
- if(getData($this->anrechnunglib->dontRecommendAnrechnung($item['anrechnung_id'], $item['begruendung'])))
+ if($this->anrechnunglib->dontRecommendAnrechnung($item['anrechnung_id'], $item['begruendung']))
{
$json[]= array(
'anrechnung_id' => $item['anrechnung_id'],
'empfehlung_anrechnung' => 'false',
'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL,
- 'status_bezeichnung' => $inProgressDP,
- 'empfehlumg_am' => (new DateTime())->format('d.m.Y'),
+ 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL),
+ 'empfehlung_am' => (new DateTime())->format('d.m.Y'),
'empfehlung_von' => $person->vorname. ' '. $person->nachname
);
}
@@ -208,14 +193,14 @@ class reviewAnrechnungDetail extends Auth_Controller
// Send mails to STGL (if not present STGL, send to STGL assistance)
if (!$this->_sendSanchoMails($json, false))
{
- show_error('Failed sending emails');
+ return $this->outputJsonError('Failed sending emails');
}
return $this->outputJsonSuccess($json);
}
else
{
- return $this->outputJsonError('Empfehlungen wurden nicht durchgeführt');
+ return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt'));
}
}
@@ -233,8 +218,12 @@ class reviewAnrechnungDetail extends Auth_Controller
// Check if user is entitled to read dms doc
self::_checkIfEntitledToReadDMSDoc($dms_id);
-
- $this->dmslib->download($dms_id);
+
+ // Set filename to be used on downlaod
+ $filename = $this->anrechnunglib->setFilenameOnDownload($dms_id);
+
+ // Download file
+ $this->dmslib->download($dms_id, $filename);
}
diff --git a/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php b/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php
index 005cde97a..cd0b7afaf 100644
--- a/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php
+++ b/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php
@@ -62,19 +62,13 @@ class reviewAnrechnungUebersicht extends Auth_Controller
public function index()
{
+ // Get study semester
$studiensemester_kurzbz = $this->input->get('studiensemester');
- if (!is_string($studiensemester_kurzbz))
+ if (isEmptyString($studiensemester_kurzbz))
{
- $studiensemester = $this->StudiensemesterModel->getNearest();
- if (hasData($studiensemester))
- {
- $studiensemester_kurzbz = $studiensemester->retval[0]->studiensemester_kurzbz;
- }
- elseif (isError($studiensemester))
- {
- show_error(getError($studiensemester));
- }
+ $result = $this->StudiensemesterModel->getNearest();
+ $studiensemester_kurzbz = getData($result)[0]->studiensemester_kurzbz;
}
$viewData = array(
@@ -95,24 +89,17 @@ class reviewAnrechnungUebersicht extends Auth_Controller
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
-
- // Get statusbezeichnung for 'inProgressDP'
- $this->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig');
- $inProgressDP = getData($this->AnrechnungstatusModel->load('inProgressDP'))[0];
- $inProgressDP = getUserLanguage() == 'German'
- ? $inProgressDP->bezeichnung_mehrsprachig[0]
- : $inProgressDP->bezeichnung_mehrsprachig[1];
foreach ($data as $item)
{
// Approve Anrechnung
- if(getData($this->anrechnunglib->recommendAnrechnung($item['anrechnung_id'])))
+ if($this->anrechnunglib->recommendAnrechnung($item['anrechnung_id']))
{
$json[]= array(
'anrechnung_id' => $item['anrechnung_id'],
'empfehlung_anrechnung' => 'true',
'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL,
- 'status_bezeichnung' => $inProgressDP
+ 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL)
);
}
}
@@ -133,7 +120,7 @@ class reviewAnrechnungUebersicht extends Auth_Controller
}
else
{
- return $this->outputJsonError('Empfehlungen wurden nicht durchgeführt');
+ return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt'));
}
}
@@ -149,24 +136,16 @@ class reviewAnrechnungUebersicht extends Auth_Controller
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
- // Get statusbezeichnung for 'inProgressDP'
- $this->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig');
- $inProgressDP = getData($this->AnrechnungstatusModel->load('inProgressDP'))[0];
- $inProgressDP = getUserLanguage() == 'German'
- ? $inProgressDP->bezeichnung_mehrsprachig[0]
- : $inProgressDP->bezeichnung_mehrsprachig[1];
-
foreach ($data as $item)
{
// Approve Anrechnung
- if(getData($this->anrechnunglib
- ->dontRecommendAnrechnung($item['anrechnung_id'], $item['begruendung'])))
+ if($this->anrechnunglib->dontRecommendAnrechnung($item['anrechnung_id'], $item['begruendung']))
{
$json[]= array(
'anrechnung_id' => $item['anrechnung_id'],
'empfehlung_anrechnung' => 'false',
'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL,
- 'status_bezeichnung' => $inProgressDP
+ 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL)
);
}
}
@@ -184,7 +163,7 @@ class reviewAnrechnungUebersicht extends Auth_Controller
}
else
{
- return $this->outputJsonError('Empfehlungen wurden nicht durchgeführt');
+ return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt'));
}
}
@@ -203,7 +182,11 @@ class reviewAnrechnungUebersicht extends Auth_Controller
// Check if user is entitled to read dms doc
self::_checkIfEntitledToReadDMSDoc($dms_id);
- $this->dmslib->download($dms_id);
+ // Set filename to be used on downlaod
+ $filename = $this->anrechnunglib->setFilenameOnDownload($dms_id);
+
+ // Download file
+ $this->dmslib->download($dms_id, $filename);
}
diff --git a/application/controllers/widgets/Filters.php b/application/controllers/widgets/Filters.php
index 748272f09..e87b2d331 100644
--- a/application/controllers/widgets/Filters.php
+++ b/application/controllers/widgets/Filters.php
@@ -211,7 +211,7 @@ class Filters extends FHC_Controller
public function setNavigationMenu()
{
// Generates the filters structure array
- $filterMenu = $this->filterwidgetlib->generateFilterMenu($this->input->get(FilterWidgetLib::NAVIGATION_PAGE));
+ $this->filterwidgetlib->generateFilterMenu($this->input->get(FilterWidgetLib::NAVIGATION_PAGE));
$this->outputJsonSuccess('Success');
}
@@ -271,3 +271,4 @@ class Filters extends FHC_Controller
}
}
}
+
diff --git a/application/core/FHC_Controller.php b/application/core/FHC_Controller.php
index 93c324b21..ce8748c5a 100644
--- a/application/core/FHC_Controller.php
+++ b/application/core/FHC_Controller.php
@@ -132,6 +132,32 @@ abstract class FHC_Controller extends CI_Controller
{
$this->output->set_content_type('application/json')->set_output(json_encode($mixed));
}
+
+ protected function outputFile($fileObj)
+ {
+ if (file_exists($fileObj->file))
+ {
+ $finfo = new finfo(FILEINFO_MIME);
+
+ header('Content-Description: File Transfer');
+ header('Content-Type: '. $finfo->file($fileObj->file));
+ header('Expires: 0');
+ header('Cache-Control: must-revalidate');
+ header('Pragma: public');
+ header('Content-Length: ' . filesize($fileObj->file));
+
+ if (isset($fileObj->disposition) && ($fileObj->disposition == 'inline' || $fileObj->disposition == 'attachment'))
+ {
+ header('Content-Disposition: '. $fileObj->disposition. '; filename="'. $fileObj->name. '"');
+ }
+
+ readfile($fileObj->file);
+
+ exit;
+ }
+
+ return false;
+ }
//------------------------------------------------------------------------------------------------------------------
// Private methods
diff --git a/application/libraries/AnrechnungLib.php b/application/libraries/AnrechnungLib.php
index c32b8a91c..3bec62dce 100644
--- a/application/libraries/AnrechnungLib.php
+++ b/application/libraries/AnrechnungLib.php
@@ -12,6 +12,7 @@ class AnrechnungLib
const ANRECHNUNG_NOTIZTITEL_NOTIZ_BY_LEKTOR = 'AnrechnungNotizLektor';
const ANRECHNUNG_NOTIZTITEL_NOTIZ_BY_STGL = 'AnrechnungNotizSTGL';
+ const ANRECHNUNG_NOTIZTITEL_EMPFEHLUNGSNOTIZ_BY_STGL = 'AnrechnungEmpfehlungsnotizSTGL';
public function __construct()
{
@@ -23,6 +24,10 @@ class AnrechnungLib
$this->ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
$this->ci->load->model('crm/Student_model', 'StudentModel');
$this->ci->load->model('content/DmsVersion_model', 'DmsVersionModel');
+ $this->ci->load->model('crm/Prestudent_model', 'PrestudentModel');
+ $this->ci->load->model('person/Notiz_model', 'NotizModel');
+
+ $this->ci->load->library('DmsLib');
}
/**
@@ -32,16 +37,19 @@ class AnrechnungLib
* @param $lv_id
* @return StdClass
*/
- public function getAntragData($uid, $studiensemester_kurzbz, $lv_id)
+ public function getAntragData($prestudent_id, $studiensemester_kurzbz, $lv_id)
{
$antrag_data = new StdClass();
-
+
+ // Get students UID.
+ $uid = $this->ci->StudentModel->getUID($prestudent_id);
+
// Get lehrveranstaltung data. Break, if course is not assigned to student.
if(!$lv = getData($this->ci->LehrveranstaltungModel->getLvByStudent($uid, $studiensemester_kurzbz, $lv_id))[0])
{
show_error('You are not assigned to this course yet.');
}
-
+
// Get the students personal data
if (!$person = getData($this->ci->PersonModel->getByUid($uid))[0])
{
@@ -61,12 +69,18 @@ class AnrechnungLib
}
// Get lectors of lehrveranstaltung
- $antrag_data->lektoren = array();
- if (!$lv_lektoren = getData($this->ci->LehrveranstaltungModel->getLecturersByLv($studiensemester_kurzbz, $lv_id)))
+ $result = $this->ci->LehrveranstaltungModel->getLecturersByLv($studiensemester_kurzbz, $lv_id);
+ if (isError($result))
{
show_error('Failed loading course lectors.');
}
-
+
+ $lv_lektoren_arr = hasData($result) ? getData($result) : array();
+
+ // Get latest ZGV
+ $result = $this->ci->PrestudentModel->getLatestZGVBezeichnung($prestudent_id);
+ $latest_zgv_bezeichnung = hasData($result) ? getData($result)[0]->bezeichnung : '';
+
// Set the given studiensemester
$antrag_data->lv_id = $lv_id;
$antrag_data->lv_bezeichnung = $lv->bezeichnung;
@@ -76,7 +90,8 @@ class AnrechnungLib
$antrag_data->nachname = $person->nachname;
$antrag_data->matrikelnr = $student->matrikelnr;
$antrag_data->stg_bezeichnung = $studiengang->bezeichnung;
- $antrag_data->lektoren = $lv_lektoren;
+ $antrag_data->lektoren = $lv_lektoren_arr;
+ $antrag_data->zgv = $latest_zgv_bezeichnung;
return $antrag_data;
}
@@ -107,8 +122,12 @@ class AnrechnungLib
{
$anrechnung_data = $this->_setAnrechnungDataObject($anrechnung);
}
+ else
+ {
+ show_error('No Anrechnung with this anrechnung_id.');
+ }
- return success($anrechnung_data);
+ return $anrechnung_data;
}
@@ -153,7 +172,7 @@ class AnrechnungLib
$anrechnung_data = $this->_setAnrechnungDataObject($anrechnung);
}
- return success($anrechnung_data);
+ return $anrechnung_data;
}
/**
@@ -171,8 +190,8 @@ class AnrechnungLib
$this->ci->AnrechnungModel->addSelect('tbl_benutzer.uid, tbl_prestudent.prestudent_id, tbl_person.person_id, tbl_anrechnung.studiensemester_kurzbz, vorname, nachname, geschlecht, tbl_lehrveranstaltung.bezeichnung AS "lv_bezeichnung"');
$this->ci->AnrechnungModel->addJoin('public.tbl_prestudent', 'prestudent_id');
$this->ci->AnrechnungModel->addJoin('public.tbl_student', 'prestudent_id');
- $this->ci->AnrechnungModel->addJoin('public.tbl_benutzer', 'uid=student_uid');
- $this->ci->AnrechnungModel->addJoin('public.tbl_person', 'tbl_benutzer.person_id=tbl_person.person_id');
+ $this->ci->AnrechnungModel->addJoin('public.tbl_benutzer', 'uid = student_uid');
+ $this->ci->AnrechnungModel->addJoin('public.tbl_person', 'tbl_benutzer.person_id = tbl_person.person_id');
$this->ci->AnrechnungModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
$result = $this->ci->AnrechnungModel->load($anrechnung_id);
@@ -207,28 +226,53 @@ class AnrechnungLib
$empfehlung_data->empfehlung = null;
$empfehlung_data->empfehlung_von = '-';
$empfehlung_data->empfehlung_am = '-';
- $empfehlung_data->empfehlung_angefordert_am = '-';
- $empfehlung_data->notiz = ''; // Begruendung, if not recommended
-
+ $empfehlung_data->empfehlungsanfrageAm = '-';
+ $empfehlung_data->empfehlungsanfrageAn = '-';
+ $empfehlung_data->begruendung = '-'; // Begruendung, if not recommended
+ $empfehlung_data->notiz_id = ''; // Empfehlungsnotiz from STGL
+ $empfehlung_data->notiz = ''; // Empfehlungsnotiz from STGL
+
if(!$anrechnung = getData($this->ci->AnrechnungModel->load($anrechnung_id))[0])
{
show_error('Failed loading Anrechnung');
}
+
+ // Get Empfehlungsnotiz
+ $result = $this->ci->NotizModel->getNotizByAnrechnung(
+ $anrechnung_id,
+ self::ANRECHNUNG_NOTIZTITEL_EMPFEHLUNGSNOTIZ_BY_STGL
+ );
+
+ if ($notiz = getData($result)[0])
+ {
+ $empfehlung_data->notiz_id = $notiz->notiz_id;
+ $empfehlung_data->notiz = $notiz->text;
+ }
// Get date, where recommendation was last requested
$result = $this->ci->AnrechnungModel->getLastAnrechnungstatus(
$anrechnung_id,
self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR // when STLG asks for recommendation, status is set to in progress lektor
);
- if ($result = getData($result)[0])
+
+ // If request for recommendation exists
+ if (hasData($result))
{
- $empfehlung_data->empfehlung_angefordert_am = (new DateTime($result->insertamum))->format('d.m.Y');
+ $empfehlung_data->empfehlungsanfrageAm = (new DateTime($result->retval[0]->insertamum))->format('d.m.Y');
+
+ // Get lectors who received request for recommendation
+ $lector_arr = self::getLectors($anrechnung_id);
+
+ if (!isEmptyArray($lector_arr))
+ {
+ $empfehlung_data->empfehlungsanfrageAn = implode(', ', array_column($lector_arr, 'fullname'));
+ }
}
if (is_null($anrechnung->empfehlung_anrechnung))
{
- return success($empfehlung_data);
+ return $empfehlung_data;
}
// If Empfehlung is true or false
@@ -260,15 +304,14 @@ class AnrechnungLib
if (!$anrechnung->empfehlung_anrechnung)
{
// Get Ablehnungsbegruendung (only set, if Anrechnung was not recommended yet)
- $this->ci->load->model('person/Notiz_model', 'NotizModel');
$result = $this->ci->NotizModel->getNotizByAnrechnung($anrechnung_id, self::ANRECHNUNG_NOTIZTITEL_NOTIZ_BY_LEKTOR);
if ($notiz = getData($result)[0])
{
- $empfehlung_data->notiz = $notiz->text;
+ $empfehlung_data->begruendung = $notiz->text;
}
}
- return success($empfehlung_data);
+ return $empfehlung_data;
}
@@ -300,9 +343,10 @@ class AnrechnungLib
// Get date of approvement or rejection
$result = $this->ci->AnrechnungModel->getApprovedOrRejected($anrechnung_id);
+ // If no approved or rejected Anrechnung exist, return basic genehmigung data object
if (!$result = getData($result)[0])
{
- return success($genehmigung_data);
+ return $genehmigung_data;
}
@@ -331,9 +375,30 @@ class AnrechnungLib
}
}
- return success($genehmigung_data);
+ return $genehmigung_data;
}
+
+ /**
+ * Get Anrechnungstatusbezeichnung of given status_kurzbz in users language.
+ *
+ * @param $status_kurzbz
+ * @return mixed
+ */
+ public function getStatusbezeichnung ($status_kurzbz)
+ {
+ $this->ci->AnrechnungstatusModel->addSelect('bezeichnung_mehrsprachig');
+ $result = $this->ci->AnrechnungstatusModel->load($status_kurzbz);
+
+ if (!hasData($result))
+ {
+ show_error('Failed retrieving Anrechnungstatusbezeichung');
+ }
+
+ return getUserLanguage() == 'German'
+ ? $result->retval[0]->bezeichnung_mehrsprachig[0]
+ : $result->retval[0]->bezeichnung_mehrsprachig[1];
+ }
/**
* Get last Anrechnungstatusbezeichnung in users language.
@@ -370,7 +435,7 @@ class AnrechnungLib
// Exit if already approved or rejected
if ($status_kurzbz == self::ANRECHNUNGSTATUS_APPROVED || $status_kurzbz == self::ANRECHNUNGSTATUS_REJECTED)
{
- return success(false); // dont approve
+ return false; // dont approve
}
// Start DB transaction
@@ -395,10 +460,10 @@ class AnrechnungLib
if ($this->ci->db->trans_status() === false)
{
$this->ci->db->trans_rollback();
- return error($result->msg, EXIT_ERROR);
+ return false;
}
- return success(true); // approved
+ return true; // approved
}
/**
@@ -419,16 +484,14 @@ class AnrechnungLib
// Exit if already approved or rejected
if ($status_kurzbz == self::ANRECHNUNGSTATUS_APPROVED || $status_kurzbz == self::ANRECHNUNGSTATUS_REJECTED)
{
- return success(false); // dont reject
+ return false; // dont reject
}
+
+ // Start DB transaction
+ $this->ci->db->trans_start(false);
// Insert new status rejected
- $result = $this->ci->AnrechnungModel->saveAnrechnungstatus($anrechnung_id, self::ANRECHNUNGSTATUS_REJECTED);
-
- if (isError($result))
- {
- show_error(getError($result));
- }
+ $this->ci->AnrechnungModel->saveAnrechnungstatus($anrechnung_id, self::ANRECHNUNGSTATUS_REJECTED);
// Add begruendung as notiz
$this->ci->load->model('person/Notiz_model', 'NotizModel');
@@ -438,8 +501,17 @@ class AnrechnungLib
$begruendung,
getAuthUID()
);
+
+ // Transaction complete
+ $this->ci->db->trans_complete();
+
+ if ($this->ci->db->trans_status() === false)
+ {
+ $this->ci->db->trans_rollback();
+ return false;
+ }
- return success(true); // rejected
+ return true; // rejected
}
/**
@@ -462,7 +534,7 @@ class AnrechnungLib
|| $status_kurzbz == self::ANRECHNUNGSTATUS_REJECTED
|| $status_kurzbz == self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR)
{
- return success(false); // dont ask for recommendation
+ return false; // dont ask for recommendation
}
// Start DB transaction
@@ -492,7 +564,7 @@ class AnrechnungLib
return error($result->msg, EXIT_ERROR);
}
- return success(true); // recommended
+ return true; // recommended
}
/**
@@ -537,10 +609,10 @@ class AnrechnungLib
if ($this->ci->db->trans_status() === false)
{
$this->ci->db->trans_rollback();
- return error($result->msg, EXIT_ERROR);
+ return false;
}
- return success(true); // recommended
+ return true; // recommended
}
/**
@@ -562,7 +634,7 @@ class AnrechnungLib
// Exit if already approved or rejected
if ($status_kurzbz == self::ANRECHNUNGSTATUS_APPROVED || $status_kurzbz == self::ANRECHNUNGSTATUS_REJECTED)
{
- return success(false); // dont approve
+ return false; // dont approve
}
// Start DB transaction
@@ -596,10 +668,125 @@ class AnrechnungLib
if ($this->ci->db->trans_status() === false)
{
$this->ci->db->trans_rollback();
- return error($result->msg, EXIT_ERROR);
+ return false;
}
- return success(true); // recommended
+ return true; // recommended
+ }
+
+ /**
+ * Set Filename that should be used on download
+ * @param $dms_id
+ * @return string|null
+ */
+ public function setFilenameOnDownload($dms_id)
+ {
+ // Load Anrechnung
+ $result = $this->ci->AnrechnungModel->loadWhere(array('dms_id' => $dms_id));
+
+ // Return null if no data found
+ if (!hasData($result))
+ {
+ return null;
+ }
+
+ $prestudent_id = $result->retval[0]->prestudent_id;
+ $lehrveranstaltung_id = $result->retval[0]->lehrveranstaltung_id;
+
+ // Get LV OrgForm
+ $this->ci->LehrveranstaltungModel->addSelect('stg.orgform_kurzbz');
+ $this->ci->LehrveranstaltungModel->addJoin('public.tbl_studiengang AS stg', 'studiengang_kz');
+ $result = $this->ci->LehrveranstaltungModel->load($lehrveranstaltung_id);
+ $orgform_kurzbz = hasData($result) ? '_'. $result->retval[0]->orgform_kurzbz : '';
+
+ // Get full name of student
+ $this->ci->load->model('crm/Prestudent_model', 'PrestudentModel');
+ $this->ci->PrestudentModel->addSelect('vorname, nachname');
+ $this->ci->PrestudentModel->addJoin('public.tbl_person', 'person_id');
+ $result = $this->ci->PrestudentModel->load($prestudent_id);
+ $fullname = hasData($result) ? $result->retval[0]->vorname. $result->retval[0]->nachname : '';
+
+ // Return filename
+ return 'Anrechnungsantrag'. $orgform_kurzbz .'_LV-'. $lehrveranstaltung_id. '_'. $fullname;
+ }
+
+ public function LVhasLector($anrechnung_id)
+ {
+ $result = $this->ci->AnrechnungModel->load($anrechnung_id);
+ if (!hasData($result))
+ {
+ showError('Anrechnung existiert nicht');
+ }
+
+ // Get lectors of lehrveranstaltung
+ $result = $this->ci->LehrveranstaltungModel->getLecturersByLv(
+ $result->retval[0]->studiensemester_kurzbz,
+ $result->retval[0]->lehrveranstaltung_id
+ );
+
+ // Continue, if LV has no lector (there is no one to ask for recommendation)
+ return hasData($result) ? true : false;
+ }
+
+ /**
+ * Get LV Leitung. If not present, get all LV lectors.
+ *
+ * @param $anrechnung_id
+ * @return array|bool
+ */
+ public function getLectors($anrechnung_id)
+ {
+ $this->ci->AnrechnungModel->addSelect('lehrveranstaltung_id, studiensemester_kurzbz');
+ $result = $this->ci->AnrechnungModel->load($anrechnung_id);
+
+ if (!hasData($result))
+ {
+ return false;
+ }
+
+ $lehrveranstaltung_id = getData($result)[0]->lehrveranstaltung_id;
+ $studiensemester_kurzbz = getData($result)[0]->studiensemester_kurzbz;
+
+ // Get lectors
+ $lector_arr = array();
+
+ $this->ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
+ $result = $this->ci->LehrveranstaltungModel->getLecturersByLv($studiensemester_kurzbz, $lehrveranstaltung_id);
+
+ if (!$result = getData($result))
+ {
+ return false;
+ }
+
+ // Check if lv has LV-Leitung
+ $key = array_search(true, array_column($result, 'lvleiter'));
+
+ // If lv has LV-Leitung, keep only the one
+ if ($key !== false)
+ {
+ $lector_arr[]= $result[$key];
+ }
+ // ...otherwise keep all lectors
+ else
+ {
+ $lector_arr = array_merge($lector_arr, $result);
+ }
+
+ /**
+ * NOTE: This step is only done to make the array unique by uid, vorname and nachname in the following step
+ * (e.g. if same lector is ones LV-Leitung and another time not, then array_unique would leave both.
+ * But we wish to send only one email by to that one person)
+ * **/
+ foreach ($lector_arr as $lector)
+ {
+ unset($lector->lvleiter);
+ $lector->fullname = $lector->vorname. ' '. $lector->nachname;
+ }
+
+ // Now make the lector array aka mail receivers unique
+ $lector_arr = array_unique($lector_arr, SORT_REGULAR);
+
+ return $lector_arr;
}
// Return an object with Anrechnungdata
@@ -631,12 +818,7 @@ class AnrechnungLib
$this->ci->DmsVersionModel->addSelect('name');
$result = $this->ci->DmsVersionModel->loadWhere(array('dms_id' => $anrechnung->dms_id));
- if (isError($result))
- {
- show_error(getError($result));
- }
-
- $anrechnung_data->dokumentname = $result->retval[0]->name;
+ $anrechnung_data->dokumentname = hasData($result) ? getData($result)[0]->name : '';
return $anrechnung_data;
}
diff --git a/application/libraries/DmsLib.php b/application/libraries/DmsLib.php
index da0dd84b6..eae1a9ac4 100644
--- a/application/libraries/DmsLib.php
+++ b/application/libraries/DmsLib.php
@@ -2,11 +2,10 @@
if (! defined('BASEPATH')) exit('No direct script access allowed');
-class DmsLib
+class DmsLib extends FHC_Controller
{
const FILE_CONTENT_PROPERTY = 'file_content';
-
- const FILE_INPUT_NAME = 'uploadfile'; // name of the HTML input tag containing the uploaded file
+
private $UPLOAD_PATH = DMS_PATH; // temporary directory to store the upload file
/**
@@ -21,6 +20,34 @@ class DmsLib
$this->ci->load->model('content/DmsVersion_model', 'DmsVersionModel');
$this->ci->load->model('content/DmsFS_model', 'DmsFSModel');
}
+
+ /**
+ * Load a DMS Document.
+ * If no version is particularly given, the latest version is loaded.
+ *
+ * @param $dms_id
+ * @param integer $version
+ * @return array
+ */
+ public function load($dms_id, $version = null)
+ {
+ if (is_numeric($dms_id))
+ {
+ $this->ci->DmsModel->addJoin('campus.tbl_dms_version', 'dms_id');
+ $this->ci->DmsModel->addOrder('version', 'DESC');
+ $this->ci->DmsModel->addLimit(1);
+
+ if (!is_numeric($version))
+ {
+ return $this->ci->DmsModel->load($dms_id);
+ }
+ else
+ {
+ return $this->ci->DmsModel->loadWhere(array('dms_id' => $dms_id, 'version' => $version));
+ }
+ }
+ return error('The parameter DMS ID must be a number');
+ }
/**
* Read a DMS Document from the Filesystem
@@ -95,19 +122,20 @@ class DmsLib
return $result;
}
-
+
/**
* Uploads a document and saves it to DMS
* @param $dms DMS assoc array
- * @param array $allowed_types Default: all. Param example: array(jpg, pdf)
+ * @param $field_name Name of the HTML uploadfile input name attribute
+ * @param array $allowed_types Default: all. Param example: array(jpg, pdf)
* @return array
*/
- public function upload($dms, $allowed_types = array('*'))
+ public function upload($dms, $field_name, $allowed_types = array('*'))
{
// Init upload configs
$this->_loadUploadLibrary($allowed_types);
- if (!$this->ci->upload->do_upload(DmsLib::FILE_INPUT_NAME))
+ if (!$this->ci->upload->do_upload($field_name))
{
return error($this->ci->upload->display_errors());
}
@@ -132,46 +160,80 @@ class DmsLib
// return result of uploaded data
return success($upload_data); // data about the uploaded file
}
-
+
/**
- * Download a document
+ * Download a document.
+ *
* @param $dms_id
+ * @param string $filename $filename If String is given, it will be used as filename on download
+ * @param string $disposition [inline | attachment]
+ * Inline opens doc in new tab. Attachment displays download dialog box.
*/
- public function download($dms_id)
+ public function download($dms_id, $filename = null, $disposition = 'inline')
{
- if (!is_numeric($dms_id))
- {
- show_error('Wrong parameter');
- }
-
- $this->ci->DmsVersionModel->addSelect('filename');
- $result = $this->ci->DmsVersionModel->loadWhere(array('dms_id' => $dms_id));
-
+ $result = $this->getFileInfo($dms_id);
+
if (isError($result))
{
- show_error(getError($result));
+ return error(getError($result));
}
- $filename = $result->retval[0]->filename;
- $file = DMS_PATH. $filename;
-
- if (file_exists($file))
+ $fileObj = getData($result);
+
+ // Change filename, if filename is provided
+ if (is_string($filename))
{
- $finfo = new finfo(FILEINFO_MIME);
-
- header('Content-Description: File Transfer');
- header('Content-Type: '.$finfo->file($file));
- header('Expires: 0');
- header('Cache-Control: must-revalidate');
- header('Pragma: public');
- header('Content-Length: ' . filesize($file));
- readfile($file);
- exit;
+ $fileObj->name = $filename;
+ }
+
+ // Add file disposition
+ if ($disposition == 'attachment')
+ {
+ $fileObj->disposition = 'attachment';
}
else
{
- show_error('File does not exist');
+ $fileObj->disposition = 'inline';
}
+
+ // Output file
+ if(!$this->outputFile($fileObj))
+ {
+ return error('Error on file output');
+ }
+ }
+
+ /**
+ * Get file information.
+ *
+ * @param $dms_id
+ * @param integer $version
+ * @return array with File Object.
+ */
+ public function getFileInfo($dms_id, $version = null)
+ {
+ if (!is_numeric($dms_id))
+ {
+ return error('Wrong parameter');
+ }
+
+ // Load file
+ $result = $this->load($dms_id, $version);
+
+ if (isError($result))
+ {
+ return error(getError($result));
+ }
+
+ // Store file information in fileObj
+ $fileObj = new StdClass();
+ $fileObj->filename = getData($result)[0]->filename;
+ $fileObj->file = DMS_PATH. getData($result)[0]->filename;
+ $fileObj->name = DMS_PATH. getData($result)[0]->name; // original users filename
+ $fileObj->mimetype = DMS_PATH. getData($result)[0]->mimetype;
+
+ return success($fileObj);
+
}
/**
diff --git a/application/libraries/FilterWidgetLib.php b/application/libraries/FilterWidgetLib.php
index 0a4526680..cdf0cac3c 100644
--- a/application/libraries/FilterWidgetLib.php
+++ b/application/libraries/FilterWidgetLib.php
@@ -266,6 +266,7 @@ class FilterWidgetLib
$whereParameters = array(
'app' => $app,
'dataset_name' => $datasetName,
+ 'person_id' => null,
'default_filter' => true
);
@@ -738,8 +739,10 @@ class FilterWidgetLib
$this->_ci->load->model('system/Filters_model', 'FiltersModel');
// Loads all the filters related to this page (same dataset_name and same app name)
- $filters = $this->_ci->FiltersModel->getFiltersByAppDatasetName(
- $session[self::APP], $session[self::DATASET_NAME]
+ $filters = $this->_ci->FiltersModel->getFiltersByAppDatasetNamePersonId(
+ $session[self::APP],
+ $session[self::DATASET_NAME],
+ getAuthPersonId()
);
// If filters were loaded
@@ -813,9 +816,6 @@ class FilterWidgetLib
}
}
- //------------------------------------------------------------------------------------------------------------------
- // Private methods
-
/**
* Return an unique string that identify this filter widget
* NOTE: The default value is the URI where the FilterWidget is called
@@ -857,6 +857,9 @@ class FilterWidgetLib
$this->_filterUniqueId = $filterUniqueId;
}
+ //------------------------------------------------------------------------------------------------------------------
+ // Private methods
+
/**
* Generates a condition for a SQL where clause using the given applied filter definition.
* By default an empty string is returned.
@@ -972,3 +975,4 @@ class FilterWidgetLib
return $pos;
}
}
+
diff --git a/application/models/crm/Prestudent_model.php b/application/models/crm/Prestudent_model.php
index 52ba4d9f3..2553fd5fa 100644
--- a/application/models/crm/Prestudent_model.php
+++ b/application/models/crm/Prestudent_model.php
@@ -581,6 +581,35 @@ class Prestudent_model extends DB_Model
return $this->execQuery($query, array($person_id));
}
+
+ /**
+ * Get latest ZGV Bezeichnung of Prestudent.
+ *
+ * @param $prestudent_id
+ */
+ public function getLatestZGVBezeichnung($prestudent_id)
+ {
+ if (!is_numeric($prestudent_id))
+ {
+ show_error('Prestudent_id is not numeric.');
+ }
+
+ $language_index = getUserLanguage() == 'German' ? 0 : 1;
+
+ $this->addSelect('
+ COALESCE(
+ array_to_json(zgvmaster.bezeichnung::varchar[])->>' . $language_index . ',
+ array_to_json(zgv.bezeichnung::varchar[])->>' . $language_index . '
+ ) AS bezeichnung'
+ );
+
+ $this->addJoin('bis.tbl_zgv zgv', 'zgv_code', 'LEFT');
+ $this->addJoin('bis.tbl_zgvmaster zgvmaster', 'zgvmas_code', 'LEFT');
+
+ return $this->loadWhere(array(
+ 'prestudent_id' => $prestudent_id
+ ));
+ }
public function getPrestudentByStudiengangAndPerson($studiengang, $person, $studienSemester)
{
diff --git a/application/models/crm/Statusgrund_model.php b/application/models/crm/Statusgrund_model.php
index 7ab17a45b..d488e12d1 100644
--- a/application/models/crm/Statusgrund_model.php
+++ b/application/models/crm/Statusgrund_model.php
@@ -12,7 +12,7 @@ class Statusgrund_model extends DB_Model
$this->pk = "statusgrund_id";
}
- public function getStatus($status_kurzbz = null, $aktiv = null)
+ public function getStatus($status_kurzbz = null, $aktiv = null, $statusgrund_kurzbz = null)
{
$this->addOrder('bezeichnung_mehrsprachig');
$where = array();
@@ -20,6 +20,8 @@ class Statusgrund_model extends DB_Model
$where['status_kurzbz'] = $status_kurzbz;
if (!is_null($aktiv))
$where['aktiv'] = $aktiv;
+ if (!is_null($statusgrund_kurzbz))
+ $where['statusgrund_kurzbz'] = $statusgrund_kurzbz;
$status = $this->loadWhere($where);
diff --git a/application/models/education/Anrechnung_model.php b/application/models/education/Anrechnung_model.php
index b4c7de835..ebecf4118 100644
--- a/application/models/education/Anrechnung_model.php
+++ b/application/models/education/Anrechnung_model.php
@@ -1,7 +1,11 @@
pk = 'anrechnung_id';
}
+ /**
+ * Creates new Anrechnungsantrag.
+ * Saves new Anrechnung and sets Anrechnungstatus for the new Anrechnung.
+ *
+ * @param $prestudent_id
+ * @param $studiensemester_kurzbz
+ * @param $lehrveranstaltung_id
+ * @param $begruendung_id
+ * @param $dms_id DMS ID of uploaded Nachweisdokument
+ * @param null $anmerkung_student = Herkunft der Kenntnisse
+ * @return array
+ */
+ public function createAnrechnungsantrag(
+ $prestudent_id, $studiensemester_kurzbz, $lehrveranstaltung_id,
+ $begruendung_id, $dms_id, $anmerkung_student = null
+ )
+ {
+ // Start DB transaction
+ $this->db->trans_start(false);
+
+ // Save Anrechnung
+ $result = $this->AnrechnungModel->insert(array(
+ 'prestudent_id' => $prestudent_id,
+ 'lehrveranstaltung_id' => $lehrveranstaltung_id,
+ 'begruendung_id' => $begruendung_id,
+ 'dms_id' => $dms_id,
+ 'studiensemester_kurzbz' => $studiensemester_kurzbz,
+ 'anmerkung_student' => $anmerkung_student,
+ 'insertvon' => $this->_uid
+ ));
+
+ // Store just inserted Anrechnung ID
+ $lastInsert_anrechnung_id = $result->retval;
+
+ // Save Anrechnungstatus
+ $this->AnrechnungModel->saveAnrechnungstatus($lastInsert_anrechnung_id, self::ANRECHNUNGSTATUS_PROGRESSED_BY_STGL);
+
+ // Transaction complete
+ $this->db->trans_complete();
+
+ if ($this->db->trans_status() === false)
+ {
+ $this->db->trans_rollback();
+ return error('Failed inserting Anrechnung', EXIT_ERROR);
+ }
+
+ return success($lastInsert_anrechnung_id);
+ }
+
/**
* Save Anrechnungstatus.
* @param $anrechnung_id
@@ -83,4 +136,68 @@ class Anrechnung_model extends DB_Model
return $this->execQuery($qry, array($anrechnung_id));
}
+
+ /**
+ * Delete Anrechnungstatus.
+ *
+ * @param $anrechnungstatus_id
+ */
+ public function deleteAnrechnungstatus($anrechnungstatus_id){
+
+ $qry = '
+ DELETE FROM lehre.tbl_anrechnung_anrechnungstatus
+ WHERE anrechnungstatus_id = ?
+ ';
+
+ return $this->execQuery($qry, array($anrechnungstatus_id));
+ }
+
+ /**
+ * Delete last status approved / rejected.
+ * If last status is 'approved', Genehmigung is resetted.
+ *
+ * @param $anrechnung_id
+ * @return array
+ */
+ public function withdrawApprovement($anrechnung_id)
+ {
+ // Get last Anrechnungstatus
+ if (!$result = getData($this->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0])
+ {
+ return error('Failed loading Anrechnung');
+ }
+
+ $last_status = $result->status_kurzbz;
+ $anrechnungstatus_id = $result->anrechnungstatus_id;
+
+ // Exit, if last status is not approved / rejected
+ if ($last_status != self::ANRECHNUNGSTATUS_APPROVED && $last_status != self::ANRECHNUNGSTATUS_REJECTED)
+ {
+ return error('Nothing to withdraw. Application is still in progress');
+ }
+
+ // Start DB transaction
+ $this->db->trans_start(false);
+
+ // If Anrechnung was approved
+ if ($last_status == self::ANRECHNUNGSTATUS_APPROVED)
+ {
+ // Reset Genehmigung
+ $this->AnrechnungModel->update($anrechnung_id, array('genehmigt_von' => NULL));
+ }
+
+ // Delete last status approved / rejected
+ $this->AnrechnungModel->deleteAnrechnungstatus($anrechnungstatus_id);
+
+ // Transaction complete
+ $this->db->trans_complete();
+
+ if ($this->db->trans_status() === false)
+ {
+ $this->db->trans_rollback();
+ return error('Failed withdrawing Genehmigung', EXIT_ERROR);
+ }
+ return success();
+
+ }
}
diff --git a/application/models/education/Anrechnungbegruendung_model.php b/application/models/education/Anrechnungbegruendung_model.php
new file mode 100644
index 000000000..81f1ef614
--- /dev/null
+++ b/application/models/education/Anrechnungbegruendung_model.php
@@ -0,0 +1,15 @@
+dbTable = 'lehre.tbl_anrechnung_begruendung';
+ $this->pk = 'begruendung_id';
+ }
+}
diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php
index 41bdabd11..6358ca81e 100644
--- a/application/models/organisation/Studiengang_model.php
+++ b/application/models/organisation/Studiengang_model.php
@@ -475,7 +475,7 @@ class Studiengang_model extends DB_Model
funktion_kurzbz = \'Leitung\'
AND ( datum_von <= NOW() OR datum_von IS NULL )
AND ( datum_bis >= NOW() OR datum_bis IS NULL )
- AND studiengang_kz = ' . $this->db->escape($studiengang_kz, FHC_INTEGER)
+ AND studiengang_kz = ' . $this->db->escape($studiengang_kz)
;
}
diff --git a/application/models/system/Filters_model.php b/application/models/system/Filters_model.php
index 20394b36d..581be65e1 100644
--- a/application/models/system/Filters_model.php
+++ b/application/models/system/Filters_model.php
@@ -57,19 +57,34 @@ class Filters_model extends DB_Model
/**
* Loads all filters by their app and dataset_name
*/
- public function getFiltersByAppDatasetName($app, $dataset_name)
+ public function getFiltersByAppDatasetNamePersonId($app, $dataset_name, $person_id)
{
- $this->resetQuery(); // reset any previous built query
+ $query = '
+ (
+ -- Global filters
+ SELECT gs.filter_id,
+ gs.person_id,
+ gs.description
+ FROM system.tbl_filters gs
+ WHERE gs.app = ?
+ AND gs.dataset_name = ?
+ AND gs.person_id IS NULL
+ ORDER BY gs.person_id DESC, gs.sort ASC
+ )
+ UNION ALL
+ (
+ -- Personal filters
+ SELECT ps.filter_id,
+ ps.person_id,
+ ps.description
+ FROM system.tbl_filters ps
+ WHERE ps.app = ?
+ AND ps.dataset_name = ?
+ AND ps.person_id = ?
+ ORDER BY ps.person_id DESC, ps.sort ASC
+ )';
- $this->addSelect('filter_id, person_id, description');
- $this->addOrder('person_id', 'DESC'); // sort descending on column person_id
- $this->addOrder('sort', 'ASC'); // sort on column sort
-
- $filterParametersArray = array(
- 'app' => $app,
- 'dataset_name' => $dataset_name
- );
-
- return $this->loadWhere($filterParametersArray);
+ return $this->execQuery($query, array($app, $dataset_name, $app, $dataset_name, $person_id));
}
}
+
diff --git a/application/views/crm/statusGrundList.php b/application/views/crm/statusGrundList.php
index e128856d3..ab8f096bb 100644
--- a/application/views/crm/statusGrundList.php
+++ b/application/views/crm/statusGrundList.php
@@ -15,6 +15,7 @@
Aktiv |
Bezeichnung mehrsprachig |
Beschreibung |
+ Statusgrund |
|
@@ -25,6 +26,7 @@
aktiv); ?> |
bezeichnung_mehrsprachig); ?> |
beschreibung); ?> |
+ statusgrund_kurzbz); ?> |
Edit |
@@ -33,4 +35,4 @@
-