diff --git a/application/config/navigation.php b/application/config/navigation.php
index d76b8a7f2..d415e9332 100644
--- a/application/config/navigation.php
+++ b/application/config/navigation.php
@@ -71,6 +71,16 @@ $config['navigation_header'] = array(
'lehre/lehrauftrag_erteilen:r'
)
),
+ 'zverfueg' => array(
+ 'link' => site_url('lehre/lvplanung/AdminZeitverfuegbarkeit'),
+ 'description' => 'Zeitverfügbarkeit',
+ 'expand' => true,
+ 'sort' => 45,
+ 'requiredPermissions' => array(
+ 'lehre/zeitverfuegbarkeit:rw',
+ 'lehre/zeitverfuegbarkeit:rw'
+ )
+ ),
'zgvueberpruefung' => array(
'link' => site_url('system/infocenter/ZGVUeberpruefung'),
'description' => 'ZGV Überprüfung',
diff --git a/application/controllers/jobs/LVPlanJob.php b/application/controllers/jobs/LVPlanJob.php
index 2688e5cc9..2acbe5512 100644
--- a/application/controllers/jobs/LVPlanJob.php
+++ b/application/controllers/jobs/LVPlanJob.php
@@ -19,7 +19,7 @@
*/
if (!defined('BASEPATH')) exit('No direct script access allowed');
-class LVPlanJob extends CLI_Controller
+class LVPlanJob extends JOB_Controller
{
/**
* Initialize LVPlanJob Class
@@ -149,4 +149,313 @@ class LVPlanJob extends CLI_Controller
echo "Failed ".$fail."\n";
}
}
+
+ /**
+ * Send Mail to STGL, Kompetenzfeld and LV Planung about todays updated Zeitwuensche.
+ * STGL gets list only of lectors who updated future assigend courses concerning their STG.
+ * Kompetenzleitung gets list only of lectors who updated future assigend courses concerning their KF.
+ * LVPlanung gets list of lectors who updated future assigend courses.
+ */
+ public function mailUpdatedZeitwuensche()
+ {
+ // Load models
+ $this->load->model('ressource/Stundenplandev_model', 'StundenplandevModel');
+ $this->load->model('organisation/Studiensemester_model', 'StundiensemesterModel');
+ $this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
+ $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
+ $this->load->model('person/Person_model', 'PersonModel');
+
+ // Load libs
+ $this->load->library('MailLib');
+
+ // Load helpers
+ $this->load->helper('hlp_sancho_helper');
+
+ // Start Log Message
+ $this->logInfo('Mail updated Zeitwuensche started.');
+
+ // Get all lectors, who updated their Zeitwunsch today
+ $db = new DB_Model();
+ $result = $db->execReadOnlyQuery('
+ SELECT
+ zwg.mitarbeiter_uid, tbl_lehrveranstaltung.studiengang_kz, tbl_lehrveranstaltung.oe_kurzbz
+ FROM
+ campus.tbl_zeitwunsch_gueltigkeit zwg
+ JOIN lehre.tbl_stundenplandev stpl
+ ON(
+ stpl.mitarbeiter_uid=zwg.mitarbeiter_uid
+ AND stpl.datum BETWEEN zwg.von AND COALESCE(zwg.bis, \'2999-12-31\')
+ AND (zwg.insertamum::date = (NOW()-\'1 days\'::interval)::date
+ OR
+ zwg.updateamum::date = (NOW()-\'1 days\'::interval)::date)
+ AND stpl.datum > now()
+ )
+ JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
+ JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
+ GROUP BY
+ zwg.mitarbeiter_uid, tbl_lehrveranstaltung.studiengang_kz, tbl_lehrveranstaltung.oe_kurzbz
+ ');
+
+ if (!hasData($result))
+ {
+ return; // No updated Zeitwuensche today
+ }
+
+ $uidByStg_arr = array(); // Mail data for Studiengang
+ $uidByOe_arr = array(); // Mail data for Kompetenzfeld
+ $uid_arr = array(); // Mail data for Kompetenzfeld
+
+ // Loop through lectors, who updated their Zeitwunsch today
+ $changed_arr = getData($result);
+ foreach ($changed_arr as $row)
+ {
+
+ // Add unique lector array
+ if (!in_array($row->mitarbeiter_uid, $uid_arr))
+ {
+ $uid_arr[]= $row->mitarbeiter_uid;
+ }
+
+ // Build unique Studiengang array
+ if (!array_key_exists($row->studiengang_kz, $uidByStg_arr))
+ {
+ $uidByStg_arr[$row->studiengang_kz] = array($row->mitarbeiter_uid);
+
+ }
+ elseif (!in_array($row->mitarbeiter_uid, $uidByStg_arr[$row->studiengang_kz]))
+ {
+ $uidByStg_arr[$row->studiengang_kz][]= $row->mitarbeiter_uid;
+ }
+
+ // Build unique Kompetenzfeld array
+ if (!array_key_exists($row->oe_kurzbz, $uidByOe_arr))
+ {
+ $uidByOe_arr[$row->oe_kurzbz] = array($row->mitarbeiter_uid);
+
+ }
+ elseif (!in_array($row->mitarbeiter_uid, $uidByOe_arr[$row->oe_kurzbz]))
+ {
+ $uidByOe_arr[$row->oe_kurzbz][]= $row->mitarbeiter_uid;
+ }
+ }
+
+ // Send mail to STG Assistenz
+ $result = $this->_sendMailToStg($uidByStg_arr);
+ if (isError($result))
+ {
+ $this->logError(getError($result));
+ }
+
+ // Send mail to Kompetenzfeld Leitung
+ $result = $this->_sendMailToKF($uidByOe_arr);
+ if (isError($result))
+ {
+ $this->logError(getError($result));
+ }
+
+ // Send mail to LV Planung
+ $result = $this->_sendMailToLvPlanung($uid_arr);
+ if (isError($result))
+ {
+ $this->logError(getError($result));
+ }
+
+ // End Log Message
+ $this->logInfo('Mail updated Zeitwuensche ended.');
+ }
+
+ /**
+ * Send Mail to STGL Assistance about lectors, who teach LV assigend to the STG, and who updated Zeitwuensche.
+ *
+ * @param $data_arr
+ * @param $stg_bezeichnung
+ */
+ private function _sendMailToStg($data_arr)
+ {
+ foreach ($data_arr as $stg_kurzbz => $uid_arr)
+ {
+ // Get STG eMail
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+ $result = $this->StudiengangModel->load($stg_kurzbz);
+ $stgMail = $result->retval[0]->email;
+
+ $lektorenTabelle = '
+
+
+ | Name |
+ UID |
+
+
+ ';
+
+ foreach($uid_arr as $uid)
+ {
+ $person = $this->PersonModel->getByUid($uid);
+ $lektorenTabelle.= '
+
+ | '. getData($person)[0]->vorname. ' '. getData($person)[0]->nachname. ' |
+ ['. $uid. '] |
+
+ ';
+ }
+
+ $lektorenTabelle.= '
';
+
+ $contentData_arr = array(
+ 'datentabelle' => $lektorenTabelle
+ );
+
+ // Send mail
+ if (!sendSanchoMail(
+ 'ZeitwunschUpdateMail',
+ $contentData_arr,
+ $stgMail,
+ 'Änderung von Zeitwünschen',
+ 'sancho_header_min_bw.jpg',
+ 'sancho_footer_min_bw.jpg'
+ ))
+ {
+ $errorReceiverUid_arr[]= $stgMail;
+ }
+ }
+
+ if (isset($errorReceiverUid_arr))
+ {
+ return error('Mail updated Zeitwuensche could not be sent to :'. implode($errorReceiverUid_arr, ','));
+ }
+
+ return success();
+ }
+
+ /**
+ * Send Mail to Kompetenzfeld about lectors, who teach LV assigend to the Kompetenzfeld, and who updated Zeitwuensche.
+ *
+ * @param $data_arr
+ * @param $stg_bezeichnung
+ */
+ private function _sendMailToKF($data_arr)
+ {
+ // Send mail to Komepetenzfeld Leitung
+ foreach ($data_arr as $oe_kurzbz => $uid_arr)
+ {
+ // Get KF Leitung eMail
+ $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
+ $result = $this->BenutzerfunktionModel->getBenutzerFunktionen(
+ 'Leitung',
+ $oe_kurzbz,
+ $activeoeonly = true,
+ $activebenonly = true
+ );
+
+ if(isSuccess($result) && hasData($result))
+ {
+ $empfaenger = array();
+
+ foreach(getData($result) as $row)
+ $empfaenger[] = $row->uid. '@'. DOMAIN;
+ $kfMail = implode(',',$empfaenger);
+
+ $lektorenTabelle = '
+
+
+ | Name |
+ UID |
+
+
+ ';
+
+ foreach($uid_arr as $uid)
+ {
+ $person = $this->PersonModel->getByUid($uid);
+ $lektorenTabelle.= '
+
+ | '. getData($person)[0]->vorname. ' '. getData($person)[0]->nachname. ' |
+ ['. $uid. '] |
+
+ ';
+ }
+
+ $lektorenTabelle.= '
';
+
+ $contentData_arr = array(
+ 'datentabelle' => $lektorenTabelle
+ );
+
+ // Send mail
+ if (!sendSanchoMail(
+ 'ZeitwunschUpdateMail',
+ $contentData_arr,
+ $kfMail,
+ 'Änderung von Zeitwünschen',
+ 'sancho_header_min_bw.jpg',
+ 'sancho_footer_min_bw.jpg'
+ ))
+ {
+ $errorReceiverUid_arr[]= $kfMail;
+ }
+ }
+ }
+
+ if (isset($errorReceiverUid_arr))
+ {
+ return error('Mail updated Zeitwuensche could not be sent to :'. implode($errorReceiverUid_arr, ','));
+ }
+
+ return success();
+ }
+
+ /**
+ * Send Mail to LV Planung about all lectors who updated Zeitwuensche.
+ *
+ * @param $data_arr
+ * @param $stg_bezeichnung
+ */
+ private function _sendMailToLvPlanung($data_arr)
+ {
+ $lektorenTabelle = '
+
+
+ | Name |
+ UID |
+
+
+ ';
+
+ foreach($data_arr as $lector)
+ {
+ $person = $this->PersonModel->getByUid($lector);
+ $lektorenTabelle.= '
+
+ | '. getData($person)[0]->vorname. ' '. getData($person)[0]->nachname. ' |
+ ['. $lector. '] |
+
+ ';
+ }
+
+ $lektorenTabelle.= '
';
+
+ $contentData_arr = array(
+ 'datentabelle' => $lektorenTabelle
+ );
+
+ // Send mail
+ if (!sendSanchoMail(
+ 'ZeitwunschUpdateMail',
+ $contentData_arr,
+ MAIL_LVPLAN,
+ 'Änderung von Zeitwünschen',
+ 'sancho_header_min_bw.jpg',
+ 'sancho_footer_min_bw.jpg'
+ ))
+ {
+ $errorReceiver = MAIL_LVPLAN;
+ }
+
+ if (isset($errorReceiver))
+ {
+ return error('Mail updated Zeitwuensche could not be sent to :'. $errorReceiver);
+ }
+
+ return success();
+ }
}
diff --git a/application/controllers/lehre/lvplanung/AdminZeitverfuegbarkeit.php b/application/controllers/lehre/lvplanung/AdminZeitverfuegbarkeit.php
new file mode 100644
index 000000000..007b6974d
--- /dev/null
+++ b/application/controllers/lehre/lvplanung/AdminZeitverfuegbarkeit.php
@@ -0,0 +1,310 @@
+ 'lehre/zeitverfuegbarkeit:rw',
+ 'saveZeitverfuegbarkeit' => 'lehre/zeitverfuegbarkeit:rw',
+ 'deleteZeitverfuegbarkeit' => 'lehre/zeitverfuegbarkeit:rw'
+ )
+ );
+
+ // Load models
+ $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+ $this->load->model('person/Benutzer_model', 'BenutzerModel');
+ $this->load->model('person/Person_model', 'PersonModel');
+ $this->load->model('ressource/Zeitsperre_model', 'ZeitsperreModel');
+
+ // Load libraries
+ $this->load->library('PermissionLib');
+ $this->load->library('AuthLib');
+ $this->load->library('WidgetLib');
+
+ // Load helpers
+ $this->load->helper('array');
+
+ // Load language phrases
+ $this->loadPhrases(
+ array(
+ 'global',
+ 'ui',
+ 'lehre'
+ )
+ );
+
+ $this->_setAuthUID(); // sets property uid
+
+ $this->setControllerId(); // sets the controller id
+ }
+
+ // -----------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ public function index()
+ {
+ // Get Studiengaenge the user is entitled for
+ $result = $this->permissionlib->getSTG_isEntitledFor(self::BERECHTIGUNG_ZEITVERFUEGBARKEIT);
+ $studiengang_kz_arr = !isEmptyArray($result) ? $result : array();
+
+ // Get lectors of that Studiengaenge
+ $result = $this->_getLehreinheitmitarbeiterByStg($studiengang_kz_arr);
+ $lektor_arr = hasData($result) ? getData($result) : array();
+
+ // Get available Stundenplan Stunden
+ $result = $this->_getStunden();
+ $stunde_arr = hasData($result) ? getData($result) : array();
+
+ // Get actual Studiensemester to set min-limit Datepicker
+ $result = $this->StudiensemesterModel->getAkt();
+ $studsemStart = hasData($result) ? getData($result)[0]->start : '';
+
+ $view_data = array(
+ 'studiengang_kz_arr' => $studiengang_kz_arr,
+ 'lektor_arr' => $lektor_arr,
+ 'stunde_arr' => $stunde_arr,
+ 'studsemStart' => $studsemStart
+ );
+
+ $this->load->view('lehre/lvplanung/adminZeitverfuegbarkeit.php', $view_data);
+ }
+
+ /**
+ * Save or update Zeitverfuegbarkeit.
+ */
+ public function saveZeitverfuegbarkeit()
+ {
+ $zeitsperre_id = $this->input->post('zeitsperre_id');
+ $mitarbeiter_uid = $this->input->post('mitarbeiter_uid');
+ $zeitsperretyp_kurzbz = $this->input->post('zeitsperretyp_kurzbz');
+ $bezeichnung = $this->input->post('bezeichnung');
+ $vonDatum = $this->input->post('vondatum');
+ $vonStunde = isEmptyString($this->input->post('vonstunde')) ? null : $this->input->post('vonstunde');
+ $bisDatum = $this->input->post('bisdatum');
+ $bisStunde = isEmptyString($this->input->post('bisstunde')) ? null : $this->input->post('bisstunde');
+
+ $result = $this->_validate($this->input->post());
+ if (isSuccess($result))
+ {
+ if (is_numeric($zeitsperre_id))
+ {
+ $result = $this->ZeitsperreModel->update(
+ $zeitsperre_id,
+ array(
+ 'vondatum' => $vonDatum,
+ 'vonstunde' => $vonStunde,
+ 'bisdatum' => $bisDatum,
+ 'bisstunde' => $bisStunde,
+ 'bezeichnung' => $bezeichnung
+ )
+ );
+ }
+ else
+ {
+ $result = $this->ZeitsperreModel->save(
+ $zeitsperretyp_kurzbz,
+ $mitarbeiter_uid,
+ $vonDatum,
+ $bisDatum,
+ $vonStunde,
+ $bisStunde,
+ $bezeichnung
+ );
+ }
+ }
+
+ if (isError($result))
+ {
+ $this->terminateWithJsonError(getError($result));
+ }
+
+ $zeitsperre_id = getData($result);
+
+ // Success response to AJAX
+ $this->outputJsonSuccess(array(
+ 'zeitsperre_id' => $zeitsperre_id,
+ 'msg' => $this->p->t('ui', 'gespeichert')
+ ));
+ }
+
+ /**
+ * Delete Zeitverfuegbarkeit.
+ */
+ public function deleteZeitverfuegbarkeit()
+ {
+ $zeitsperre_id = $this->input->post('zeitsperre_id');
+
+ if (!is_numeric($zeitsperre_id))
+ {
+ $this->terminateWithJsonError('Wählen Sie einen Lehrenden aus der Zeitverfügbarkeit-Tabelle aus.');
+ }
+
+ // Load Zeitsperre
+ $result = $this->ZeitsperreModel->load($zeitsperre_id);
+ $delZsp = getData($result)[0];
+
+ // Delete
+ $result = $this->ZeitsperreModel->delete($zeitsperre_id);
+
+ if (isError($result))
+ {
+ $this->terminateWithJsonError(getError($result));
+ }
+
+ // Store Deletion query
+ $delQry = $this->db->last_query();
+
+ // Log deletion
+ $this->_logDeletion($delZsp, $delQry);
+
+ $this->outputJsonSuccess(array('msg' => $this->p->t('ui', 'geloescht')));
+ }
+
+ // -----------------------------------------------------------------------------------------------------------------
+ // Private methods
+
+ /**
+ * 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');
+ }
+
+ /**
+ * Get all lectors that are assigend to Lehreinheiten in actual or future semester.
+ *
+ * @param $studiengang_kz_arr Restrict only to given stg-
+ * @return mixed
+ */
+ private function _getLehreinheitmitarbeiterByStg($studiengang_kz_arr)
+ {
+ $this->MitarbeiterModel->addSelect('lema.mitarbeiter_uid, nachname, vorname');
+ $this->MitarbeiterModel->addDistinct('lema.mitarbeiter_uid');
+ $this->MitarbeiterModel->addJoin('lehre.tbl_lehreinheitmitarbeiter lema', 'tbl_mitarbeiter.mitarbeiter_uid = lema.mitarbeiter_uid');
+ $this->MitarbeiterModel->addJoin('public.tbl_benutzer b', 'lema.mitarbeiter_uid = b.uid');
+ $this->MitarbeiterModel->addJoin('public.tbl_person p', 'person_id');
+ $this->MitarbeiterModel->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id');
+ $this->MitarbeiterModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
+ $this->MitarbeiterModel->addJoin('public.tbl_studiensemester ss', 'studiensemester_kurzbz');
+ $this->MitarbeiterModel->addOrder('lema.mitarbeiter_uid');
+
+ // Return lektoren assigned to actual or future lehreinheiten
+ return $this->MitarbeiterModel->loadWhere('
+ lv.studiengang_kz IN (' . implode(', ', $studiengang_kz_arr) . ')
+ AND b.aktiv
+ AND personalnummer > 0
+ AND NOW() <= ss.ende'
+ );
+ }
+
+ /**
+ * Get all available Stunden of Stundentabelle.
+ *
+ * @return mixed
+ */
+ private function _getStunden()
+ {
+ $this->load->model('ressource/Stunde_model', 'StundeModel');
+ $this->StundeModel->addOrder('stunde');
+
+ return $this->StundeModel->load();
+ }
+
+ /**
+ * Validaton checks performed on post data.
+ *
+ * @param $post
+ * @return array|stdClass
+ * @throws Exception
+ */
+ private function _validate($post)
+ {
+ if (isEmptyString($post['mitarbeiter_uid']))
+ {
+ return (error('LektorIn fehlt'));
+ }
+
+ if (isEmptyString($post['bezeichnung']))
+ {
+ return (error('Notiz fehlt'));
+ }
+
+ if (isEmptyString($post['vondatum']))
+ {
+ return error('Startdatum fehlt');
+ }
+
+ if (isEmptyString($post['bisdatum']))
+ {
+ return error('Endedatum fehlt');
+ }
+
+ if (new DateTime($post['bisdatum']) < new DateTime($post['vondatum']))
+ {
+ return error('Endedatum darf nicht VOR dem Startdatum liegen');
+ }
+
+ // Check bisstunde not after vonstunde within same day
+ if (new DateTime($post['bisdatum']) == new DateTime($post['vondatum']))
+ {
+ if (is_numeric($post['vonstunde']) && is_numeric($post['bisstunde'])
+ && $post['bisstunde'] < $post['vonstunde'])
+ {
+ return error('Am gleichen Tag darf Endstunde nicht VOR der Startstunde liegen');
+ }
+ }
+
+ // Check dates are > then start of actual Studiensemester
+ $result = $this->StudiensemesterModel->getAkt();
+ $studsemStart = hasData($result) ? getData($result)[0]->start : '';
+
+ if (new DateTime($post['vondatum']) < new DateTime($studsemStart) ||
+ new DateTime($post['bisdatum']) < new DateTime($studsemStart))
+ {
+ return error('Start- und Endedatum können nur für das aktuelle oder künftige Studiensemester geplant werden');
+ }
+
+ return success();
+ }
+
+ /**
+ * Log information of deleted Zeitsperre into log table.
+ *
+ * @param $delZsp object of deleted Zeitsperre
+ * @param $delQry string of performed delete query
+ * @return mixed
+ * @throws Exception
+ */
+ private function _logDeletion($delZsp, $delQry)
+ {
+ $beschreibung = 'Zeitverfügbarkeitlöschung '
+ . $delZsp->mitarbeiter_uid. ' '
+ . (new DateTime($delZsp->vondatum))->format('d.m.Y')
+ . (is_null($delZsp->vonstunde) ? '(*)' : '('. $delZsp->vonstunde. ')')
+ . '-'
+ . (new DateTime($delZsp->bisdatum))->format('d.m.Y')
+ . (is_null($delZsp->bisstunde) ? '(*)' : '('. $delZsp->bisstunde. ')')
+ . '';
+
+ $this->load->model('system/Log_model', 'LogModel');
+ return $this->LogModel->insert(array(
+ 'mitarbeiter_uid' => $this->_uid,
+ 'beschreibung' => substr($beschreibung, 0, 64),
+ 'sql' => $delQry
+ ));
+ }
+}
diff --git a/application/controllers/system/Variables.php b/application/controllers/system/Variables.php
index c56407416..3cc246301 100644
--- a/application/controllers/system/Variables.php
+++ b/application/controllers/system/Variables.php
@@ -18,10 +18,10 @@ class Variables extends Auth_Controller
{
parent::__construct(
array(
- 'setVar' => 'basis/variable:rw',
- 'getVar' => 'basis/variable:rw',
- 'changeStudiensemesterVar' => 'basis/variable:rw',
- 'changeStudengangsTypVar' => 'basis/variable:rw'
+ 'setVar' => array('basis/variable:rw','basis/variable_persoenlich:rw'),
+ 'getVar' => array('basis/variable:rw','basis/variable_persoenlich:rw'),
+ 'changeStudiensemesterVar' => array('basis/variable:rw','basis/variable_persoenlich:rw'),
+ 'changeStudengangsTypVar' => array('basis/variable:rw','basis/variable_persoenlich:rw')
)
);
diff --git a/application/controllers/system/infocenter/InfoCenter.php b/application/controllers/system/infocenter/InfoCenter.php
index 25ee96b60..76011dc04 100644
--- a/application/controllers/system/infocenter/InfoCenter.php
+++ b/application/controllers/system/infocenter/InfoCenter.php
@@ -125,9 +125,9 @@ class InfoCenter extends Auth_Controller
'zgvStatusUpdate' => 'lehre/zgvpruefung:rw',
'saveAbsage' => 'infocenter:rw',
'saveFreigabe' => 'infocenter:rw',
- 'getNotiz' => 'infocenter:r',
+ 'getNotiz' => array('infocenter:r', 'lehre/zgvpruefung:r'),
'saveNotiz' => array('infocenter:rw', 'lehre/zgvpruefung:rw'),
- 'updateNotiz' => 'infocenter:rw',
+ 'updateNotiz' => array('infocenter:rw', 'lehre/zgvpruefung:rw'),
'reloadZgvPruefungen' => 'infocenter:r',
'reloadMessages' => 'infocenter:r',
'reloadDoks' => 'infocenter:r',
diff --git a/application/controllers/system/infocenter/ZGVUeberpruefung.php b/application/controllers/system/infocenter/ZGVUeberpruefung.php
index bb0c36b66..7d178a529 100644
--- a/application/controllers/system/infocenter/ZGVUeberpruefung.php
+++ b/application/controllers/system/infocenter/ZGVUeberpruefung.php
@@ -4,6 +4,8 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
class ZGVUeberpruefung extends Auth_Controller
{
+ const BERECHTIGUNG_KURZBZ = 'lehre/zgvpruefung';
+
/**
* Constructor
*/
@@ -12,14 +14,15 @@ class ZGVUeberpruefung extends Auth_Controller
// Set required permissions
parent::__construct(
array(
- 'index' => 'lehre/zgvpruefung:r',
- 'getZgvStatusByPrestudent' => 'lehre/zgvpruefung:r'
+ 'index' => self::BERECHTIGUNG_KURZBZ.':r',
+ 'getZgvStatusByPrestudent' => self::BERECHTIGUNG_KURZBZ.':r'
)
);
$this->load->model('crm/ZGVPruefungStatus_model', 'ZGVPruefungStatusModel');
$this->load->model('crm/ZGVPruefung_model', 'ZGVPruefungModel');
$this->load->library('WidgetLib');
+ $this->load->library('PermissionLib');
$this->setControllerId();
$this->loadPhrases(
@@ -31,7 +34,14 @@ class ZGVUeberpruefung extends Auth_Controller
public function index()
{
- $this->load->view('system/infocenter/infocenterZgvUeberpruefung.php');
+ $oeKurzbz = $this->permissionlib->getOE_isEntitledFor(self::BERECHTIGUNG_KURZBZ);
+
+ if (!$oeKurzbz)
+ show_error('Keine Berechtigung.');
+
+ $data['oeKurz'] = $oeKurzbz;
+
+ $this->load->view('system/infocenter/infocenterZgvUeberpruefung.php', $data);
}
public function getZgvStatusByPrestudent()
diff --git a/application/helpers/hlp_sancho_helper.php b/application/helpers/hlp_sancho_helper.php
index 1653c44e7..d599e40bc 100644
--- a/application/helpers/hlp_sancho_helper.php
+++ b/application/helpers/hlp_sancho_helper.php
@@ -74,7 +74,7 @@ function sendSanchoMail($vorlage_kurzbz, $vorlage_data, $to, $subject, $headerIm
$body = _parseMailContent('Sancho_Mail_Template', $layout);
// Send mail
- $ci->maillib->send($from, $to, $subject, $body, $alias = '', $cc, $bcc, $altMessage = '', $bulk = true, $autogenerated = true);
+ return $ci->maillib->send($from, $to, $subject, $body, $alias = '', $cc, $bcc, $altMessage = '', $bulk = true, $autogenerated = true);
}
/**
diff --git a/application/models/crm/Konto_model.php b/application/models/crm/Konto_model.php
index 840bb290c..32fdd97c9 100644
--- a/application/models/crm/Konto_model.php
+++ b/application/models/crm/Konto_model.php
@@ -73,4 +73,53 @@ class Konto_model extends DB_Model
return error('Failed to load Payment');
}
}
+
+ public function getLastStudienbeitrag($uid, $buchungstypen)
+ {
+ $query = 'SELECT konto.studiensemester_kurzbz
+ FROM public.tbl_konto konto,
+ public.tbl_benutzer,
+ public.tbl_student
+ WHERE tbl_benutzer.uid = \'' . $uid . '\'
+ AND tbl_benutzer.uid = tbl_student.student_uid
+ AND tbl_benutzer.person_id = konto.person_id
+ AND konto.studiengang_kz = tbl_student.studiengang_kz
+ AND konto.buchungstyp_kurzbz IN (\'' . $buchungstypen . '\')
+ AND 0 = (
+ SELECT sum(betrag)
+ FROM public.tbl_konto skonto
+ WHERE skonto.buchungsnr = konto.buchungsnr_verweis
+ OR skonto.buchungsnr_verweis = konto.buchungsnr_verweis
+ )
+ ORDER BY buchungsnr DESC LIMIT 1;
+ ';
+
+ return $this->execQuery($query);
+ }
+
+ public function checkStudienbeitrag($uid, $stsem, $buchungstypen)
+ {
+ $query = 'SELECT tbl_konto.buchungsnr,
+ tbl_konto.buchungsdatum
+ FROM public.tbl_konto,
+ public.tbl_benutzer,
+ public.tbl_student
+ WHERE
+ tbl_konto.studiensemester_kurzbz = \'' . $stsem . '\'
+ AND tbl_benutzer.uid = \'' . $uid . '\'
+ AND tbl_benutzer.uid = tbl_student.student_uid
+ AND tbl_benutzer.person_id = tbl_konto.person_id
+ AND tbl_konto.studiengang_kz=tbl_student.studiengang_kz
+ AND tbl_konto.buchungstyp_kurzbz IN (\'' . $buchungstypen . '\')
+ AND 0 >= (
+ SELECT sum(betrag)
+ FROM public.tbl_konto skonto
+ WHERE skonto.buchungsnr = tbl_konto.buchungsnr_verweis
+ OR skonto.buchungsnr_verweis = tbl_konto.buchungsnr_verweis
+ )
+ ORDER BY buchungsnr DESC LIMIT 1
+ ';
+
+ return $this->execQuery($query);
+ }
}
diff --git a/application/models/crm/Prestudent_model.php b/application/models/crm/Prestudent_model.php
index 5db9a98f1..b7804952e 100644
--- a/application/models/crm/Prestudent_model.php
+++ b/application/models/crm/Prestudent_model.php
@@ -560,7 +560,7 @@ class Prestudent_model extends DB_Model
o.bezeichnung,
(CASE
WHEN sg.typ = \'b\' THEN ps.prestudent_id
- WHEN sg.typ = \'m\' THEN p.prestudent_id
+ WHEN sg.typ = \'m\' THEN ps.prestudent_id
ELSE NULL
END) AS prestudent_id
FROM public.tbl_prestudent p
@@ -581,7 +581,7 @@ class Prestudent_model extends DB_Model
return $this->execQuery($query, array($person_id));
}
-
+
/**
* Get latest ZGV Bezeichnung of Prestudent.
*
@@ -593,19 +593,19 @@ class Prestudent_model extends DB_Model
{
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
));
@@ -618,8 +618,9 @@ class Prestudent_model extends DB_Model
JOIN public.tbl_prestudent ps USING(prestudent_id)
JOIN public.tbl_studiengang sg USING(studiengang_kz)
JOIN lehre.tbl_studienplan sp USING(studienplan_id)
+ JOIN lehre.tbl_studienordnung so USING(studienordnung_id)
WHERE ps.person_id = ?
- AND UPPER((sg.typ || sg.kurzbz) || ':' || sp.orgform_kurzbz) = ?
+ AND UPPER(so.studiengangkurzbzlang || ':' || sp.orgform_kurzbz) = ?
AND pss.studiensemester_kurzbz = ?
AND";
@@ -629,7 +630,7 @@ class Prestudent_model extends DB_Model
$query .= " NOT EXISTS";
$query .= " (SELECT 1 FROM public.tbl_prestudentstatus spss
- JOIN public.tbl_prestudent sps USING(prestudent_id)
+ JOIN public.tbl_prestudent sps USING(prestudent_id)
WHERE sps.prestudent_id = ps.prestudent_id
AND spss.bewerbung_abgeschicktamum IS NOT NULL)";
diff --git a/application/models/education/Projektbetreuer_model.php b/application/models/education/Projektbetreuer_model.php
index 4da88e344..0200f6468 100644
--- a/application/models/education/Projektbetreuer_model.php
+++ b/application/models/education/Projektbetreuer_model.php
@@ -42,6 +42,34 @@ class Projektbetreuer_model extends DB_Model
}
}
+ /**
+ * Gets Betreuer of a certain Type of a Projektarbeit.
+ * Returns one row for each person.
+ * @param int $projektarbeit_id
+ * @param string $betreuerart_kurzbz
+ * @return array success with number of Betreuer or error
+ */
+ public function getBetreuerOfProjektarbeit($projektarbeit_id, $betreuerart_kurzbz)
+ {
+ $qry = "SELECT DISTINCT ON (pers.person_id) pers.person_id, betreuerart_kurzbz, vorname, nachname,
+ trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as voller_name,
+ anrede, titelpre, titelpost, gebdatum, geschlecht, pa.projekttyp_kurzbz,
+ ben.uid, ben.alias, ma.personalnummer, mitarbeiter_uid, student_uid
+ FROM lehre.tbl_projektarbeit pa
+ JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
+ JOIN public.tbl_person pers USING (person_id)
+ LEFT JOIN public.tbl_benutzer ben USING (person_id)
+ LEFT JOIN public.tbl_mitarbeiter ma ON ben.uid = ma.mitarbeiter_uid
+ WHERE ben.aktiv
+ AND projektarbeit_id = ?
+ AND betreuerart_kurzbz = ?
+ ORDER BY pers.person_id, CASE WHEN ma.mitarbeiter_uid IS NULL THEN 1 ELSE 0 END, /*Mitarbeiter account first*/
+ CASE WHEN ben.uid IS NULL THEN 1 ELSE 0 END, /*user with account first*/
+ ben.insertamum";
+
+ return $this->execQuery($qry, array($projektarbeit_id, $betreuerart_kurzbz));
+ }
+
/**
* Get Projektbetreuer data by authentification token
* @param $zugangstoken
@@ -60,4 +88,83 @@ class Projektbetreuer_model extends DB_Model
return $this->execQuery($qry, array($zugangstoken));
}
+
+ /**
+ * Holt Zweitbegutachter einer Projektarbeit mit Mail.
+ * @param $erstbegutachter_person_id int person_id des Erstbegutachters
+ * @param $projektarbeit_id int
+ * @param $student_uid string uid des Studenten der Arbeit abgibt
+ * @return object | bool
+ */
+ public function getZweitbegutachterWithToken($erstbegutachter_person_id, $projektarbeit_id, $student_uid)
+ {
+ $qry_betr = "SELECT betr.person_id, betr.projektarbeit_id, pers.anrede, betr.zugangstoken, betr.zugangstoken_gueltigbis, tbl_benutzer.uid, kontakt,
+ trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as voller_name,
+ CASE WHEN tbl_benutzer.uid IS NULL THEN kontakt ELSE tbl_benutzer.uid || '@".DOMAIN."' END AS email, abg.abgabedatum
+ FROM lehre.tbl_projektbetreuer betr
+ JOIN lehre.tbl_projektarbeit parb ON betr.projektarbeit_id = parb.projektarbeit_id
+ JOIN public.tbl_person pers ON betr.person_id = pers.person_id
+ LEFT JOIN public.tbl_kontakt ON pers.person_id = tbl_kontakt.person_id AND kontakttyp = 'email' AND zustellung = true
+ LEFT JOIN public.tbl_benutzer ON pers.person_id = tbl_benutzer.person_id
+ LEFT JOIN campus.tbl_paabgabe abg ON betr.projektarbeit_id = abg.projektarbeit_id AND abg.paabgabetyp_kurzbz = 'end'
+ WHERE betr.betreuerart_kurzbz = 'Zweitbegutachter'
+ AND betr.projektarbeit_id = ?
+ AND parb.student_uid = ?
+ AND EXISTS (
+ SELECT 1 FROM lehre.tbl_projektbetreuer
+ WHERE person_id = ?
+ AND betreuerart_kurzbz = 'Erstbegutachter'
+ AND projektarbeit_id = betr.projektarbeit_id
+ )
+ AND (tbl_benutzer.aktiv OR tbl_benutzer.aktiv IS NULL)
+ ORDER BY betr.insertamum DESC
+ LIMIT 1";
+
+ return $this->execQuery($qry_betr, array($projektarbeit_id, $student_uid, $erstbegutachter_person_id));
+ }
+
+ /**
+ * Generiert neuen Token für externen Zweitbetreuer.
+ * @param int $zweitbegutachter_person_id
+ * @param int $projektarbeit_id
+ * @return array
+ */
+ public function generateZweitbegutachterToken($zweitbegutachter_person_id, $projektarbeit_id)
+ {
+ $betreuerUidQry = "SELECT uid, zugangstoken, zugangstoken_gueltigbis, tbl_projektbetreuer.person_id
+ FROM lehre.tbl_projektbetreuer
+ JOIN public.tbl_person USING(person_id)
+ LEFT JOIN public.tbl_benutzer USING(person_id)
+ WHERE projektarbeit_id = ?
+ AND tbl_projektbetreuer.person_id = ?
+ AND betreuerart_kurzbz = 'Zweitbegutachter'
+ LIMIT 1";
+
+ $betreueruidres = $this->execQuery($betreuerUidQry, array($projektarbeit_id, $zweitbegutachter_person_id));
+
+ if (!hasData($betreueruidres))
+ return error('Zweitbegutachter nicht gefunden');
+
+ $row_betr = getData($betreueruidres)[0];
+
+ if (!isset($row_betr->uid))
+ {
+ do {
+ $token = generateToken(16);
+ $qry_tokencheck = $this->load(array('zugangstoken' => $token));
+ } while(hasData($qry_tokencheck));
+
+ $result = $this->update(
+ array('projektarbeit_id' => $projektarbeit_id,
+ 'person_id' => $row_betr->person_id,
+ 'betreuerart_kurzbz' => 'Zweitbegutachter'),
+ array('zugangstoken' => $token,
+ 'zugangstoken_gueltigbis' => date('Y-m-d', strtotime('+1 year')))
+ );
+
+ return $result;
+ }
+ else
+ return success("Account vorhanden, kein Token benötigt");
+ }
}
diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php
index e2b3bdfb7..0d0c248a6 100644
--- a/application/models/organisation/Studiengang_model.php
+++ b/application/models/organisation/Studiengang_model.php
@@ -495,11 +495,12 @@ class Studiengang_model extends DB_Model
public function getStudiengaengeWithOrgForm($typ, $semester)
{
- $query = "SELECT DISTINCT (UPPER(sg.typ || sg.kurzbz || ':' || sp.orgform_kurzbz)) AS Studiengang
+ $query = "SELECT DISTINCT (UPPER(so.studiengangkurzbzlang || ':' || sp.orgform_kurzbz)) AS Studiengang
FROM public.tbl_studiengang sg
JOIN lehre.tbl_studienordnung USING (studiengang_kz)
JOIN lehre.tbl_studienplan sp USING (studienordnung_id)
JOIN lehre.tbl_studienplan_semester spsem USING (studienplan_id)
+ JOIN lehre.tbl_studienordnung so USING(studienordnung_id)
WHERE sp.aktiv = TRUE AND sg.aktiv = TRUE AND sg.typ IN ?
AND spsem.studiensemester_kurzbz = ?
ORDER BY Studiengang";
diff --git a/application/models/organisation/Studiensemester_model.php b/application/models/organisation/Studiensemester_model.php
index 07783cf0d..e7a3d77b1 100644
--- a/application/models/organisation/Studiensemester_model.php
+++ b/application/models/organisation/Studiensemester_model.php
@@ -13,6 +13,20 @@ class Studiensemester_model extends DB_Model
$this->hasSequence = false;
}
+ /**
+ * Get actual Studiensemester.
+ *
+ * @return array
+ */
+ public function getAkt()
+ {
+ return $this->loadWhere(array(
+ 'start <= ' => 'NOW()',
+ 'ende >= ' => 'NOW()'
+ )
+ );
+ }
+
// Get next study semester
public function getNext()
{
@@ -167,15 +181,13 @@ class Studiensemester_model extends DB_Model
if (date_format(date_create($from), 'Y-m-d') > (date_format(date_create($to), 'Y-m-d')))
return success(array());
- $query = "SELECT *
- FROM public.tbl_studiensemester
- WHERE
- (ende > ?::date AND start < ?::date)
- OR start = ?::date
- OR ende = ?::date
- ORDER BY start DESC";
+ $query = "
+ SELECT *
+ FROM public.tbl_studiensemester
+ WHERE ( ?::date < ende AND ?::date > start )
+ ORDER BY start DESC";
- return $this->execQuery($query, array($from, $to, $from, $to));
+ return $this->execQuery($query, array($from, $to));
}
/**
diff --git a/application/models/person/Fotostatusperson_model.php b/application/models/person/Fotostatusperson_model.php
new file mode 100644
index 000000000..7f701063d
--- /dev/null
+++ b/application/models/person/Fotostatusperson_model.php
@@ -0,0 +1,22 @@
+dbTable = 'public.tbl_person_fotostatus';
+ $this->pk = 'person_fotostatus_id';
+ }
+
+ public function getLastFotoStatus($person_id)
+ {
+ $this->addOrder('datum', 'DESC');
+ $this->addOrder('person_fotostatus_id', 'DESC');
+ $this->addLimit(1);
+
+ return $this->loadWhere(array('person_id' => $person_id));
+ }
+
+}
\ No newline at end of file
diff --git a/application/models/person/Person_model.php b/application/models/person/Person_model.php
index 559700390..6bf9fc2c0 100644
--- a/application/models/person/Person_model.php
+++ b/application/models/person/Person_model.php
@@ -193,7 +193,7 @@ class Person_model extends DB_Model
*/
public function getByUid($uid)
{
- $this->addSelect('vorname, nachname, gebdatum, person_id, bpk, matr_nr');
+ $this->addSelect('vorname, nachname, gebdatum, person_id, bpk, matr_nr, foto');
$this->addJoin('tbl_benutzer', 'person_id');
return $this->loadWhere(array('uid' => $uid));
diff --git a/application/models/ressource/Betriebsmittelperson_model.php b/application/models/ressource/Betriebsmittelperson_model.php
index 1a97d9e38..7d9689753 100644
--- a/application/models/ressource/Betriebsmittelperson_model.php
+++ b/application/models/ressource/Betriebsmittelperson_model.php
@@ -55,4 +55,21 @@ class Betriebsmittelperson_model extends DB_Model
return $this->loadWhere($condition);
}
+
+ public function getBetriebsmittelZuordnung($cardIdentifier, $typ = 'Zutrittskarte', $ausgegeben = true)
+ {
+ $this->addJoin('wawi.tbl_betriebsmittel', 'betriebsmittel_id');
+
+ $where = 'wawi.tbl_betriebsmittel.nummer2 = \'' . $cardIdentifier . '\'
+ AND wawi.tbl_betriebsmittel.betriebsmitteltyp = \''. $typ .'\'
+ AND (retouram >= now() OR retouram IS NULL)
+ ';
+
+ if ($ausgegeben)
+ $where .= 'AND ausgegebenam <= now()';
+ else
+ $where .= 'AND (ausgegebenam <= now() OR ausgegebenam IS NULL)';
+
+ return $this->loadWhere($where);
+ }
}
diff --git a/application/models/ressource/Stundenplandev_model.php b/application/models/ressource/Stundenplandev_model.php
index 9fa92ae5e..a498e209b 100644
--- a/application/models/ressource/Stundenplandev_model.php
+++ b/application/models/ressource/Stundenplandev_model.php
@@ -61,4 +61,98 @@ class Stundenplandev_model extends DB_Model
return $this->execQuery($qry, $parametersArray);
}
+
+ /**
+ * Get Stundenplan data.
+ *
+ * @param null $lehrveranstaltung_id
+ * @param null $studiensemester_kurzbz
+ * @param null $lehreinheit_id
+ * @param null $mitarbeiter_uid
+ * @param null $student_uid
+ * @param false $nurBevorstehende If true, only future data is retrieved.
+ * @return array|false|stdClass|null
+ */
+ public function getStundenplanData($lehrveranstaltung_id=null, $studiensemester_kurzbz=null, $lehreinheit_id=null, $mitarbeiter_uid=null, $student_uid=null, $nurBevorstehende = false)
+ {
+ $params = array();
+
+ $qry = "SELECT
+ stpl.datum, min(stpl.stunde) as stundevon, max(stpl.stunde) as stundebis,
+ stpl.lehreinheit_id, lehrfach.bezeichnung as lehrfach_bezeichnung,
+ array_agg(
+ CASE WHEN gruppe_kurzbz is not null THEN gruppe_kurzbz
+ ELSE (SELECT UPPER(typ || kurzbz) FROM public.tbl_studiengang WHERE studiengang_kz=stpl.studiengang_kz) || COALESCE(stpl.semester,'0') || COALESCE(stpl.verband,'') || COALESCE(stpl.gruppe,'')
+ END) as gruppen, array_agg(mitarbeiter_uid) as lektoren,
+ array_agg(ort_kurzbz) as orte,
+ array_agg(titel) as titel
+ FROM
+ lehre.tbl_stundenplandev as stpl
+ JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
+ JOIN lehre.tbl_lehrveranstaltung as lehrfach ON(tbl_lehreinheit.lehrfach_id=lehrfach.lehrveranstaltung_id)
+ WHERE ";
+
+ if ($lehrveranstaltung_id != '')
+ {
+ $qry.="
+ lehreinheit_id IN (
+ SELECT lehreinheit_id FROM lehre.tbl_lehreinheit
+ WHERE lehrveranstaltung_id = ?
+ AND studiensemester_kurzbz = ?
+ )";
+
+ $params[]= $lehrveranstaltung_id;
+ $params[]= $studiensemester_kurzbz;
+
+ }
+ elseif ($lehreinheit_id!='')
+ {
+ $qry.=" lehreinheit_id = ?";
+
+ $params[]= $lehreinheit_id;
+ }
+ elseif ($mitarbeiter_uid != '')
+ {
+ $qry.= "
+ mitarbeiter_uid = ?
+ AND lehreinheit_id IN (
+ SELECT lehreinheit_id
+ FROM lehre.tbl_lehreinheitmitarbeiter
+ JOIN lehre.tbl_lehreinheit USING (lehreinheit_id)
+ WHERE mitarbeiter_uid = ?
+ AND studiensemester_kurzbz IN ( ? )
+ )";
+ $params[] = $mitarbeiter_uid;
+ $params[] = $mitarbeiter_uid;
+ $params[] = $studiensemester_kurzbz;
+ }
+ elseif ($student_uid != '')
+ {
+ $qry.="
+ lehreinheit_id IN (
+ SELECT lehreinheit_id
+ FROM campus.vw_student_lehrveranstaltung
+ WHERE uid = ?
+ AND studiensemester_kurzbz = ?
+ )";
+
+ $params[] = $student_uid;
+ $params[] = $studiensemester_kurzbz;
+ }
+ else
+ return false;
+
+ if($nurBevorstehende)
+ {
+ $qry.= " AND stpl.datum >= NOW()::date ";
+ }
+
+ $qry.= "
+ GROUP BY stpl.datum, stpl.unr, stpl.lehreinheit_id, lehrfach.bezeichnung
+ ORDER BY stpl.datum, min(stpl.stunde), stpl.unr, stpl.lehreinheit_id
+ ";
+
+ return $this->execQuery($qry, $params);
+ }
+
}
diff --git a/application/models/ressource/Zeitsperre_model.php b/application/models/ressource/Zeitsperre_model.php
index 350a7be58..078d29d8b 100644
--- a/application/models/ressource/Zeitsperre_model.php
+++ b/application/models/ressource/Zeitsperre_model.php
@@ -12,6 +12,47 @@ class Zeitsperre_model extends DB_Model
$this->pk = 'zeitsperre_id';
}
+ /**
+ * Save or update Zeitsperre.
+ *
+ * @param $zeitsperretyp_kurzbz
+ * @param $mitarbeiter_uid
+ * @param $vonDatum
+ * @param $bisDatum
+ * @param null $vonStunde
+ * @param null $bisStunde
+ * @param null $bezeichnung
+ * @param null $vertretung_uid
+ * @param null $erreichbarkeit_kurzbz
+ * @param null $freigabeamum
+ * @param null $freigabevon
+ * @return array
+ */
+ public function save($zeitsperretyp_kurzbz, $mitarbeiter_uid, $vonDatum, $bisDatum,
+ $vonStunde = null, $bisStunde = null, $bezeichnung = null, $vertretung_uid = null,
+ $erreichbarkeit_kurzbz = null, $freigabeamum = null, $freigabevon = null)
+ {
+ return $this->insert(array(
+ 'zeitsperretyp_kurzbz' => $zeitsperretyp_kurzbz,
+ 'mitarbeiter_uid' => $mitarbeiter_uid,
+ 'vondatum' => $vonDatum,
+ 'bisdatum' => $bisDatum,
+ 'vonstunde' => $vonStunde,
+ 'bisstunde' => $bisStunde,
+ 'bezeichnung' => $bezeichnung,
+ 'vertretung_uid' => $vertretung_uid,
+ 'insertvon' => getAuthUID(),
+ 'insertamum' => (new DateTime())->format('Y-m-d H:i:s'),
+ 'erreichbarkeit_kurzbz' => $erreichbarkeit_kurzbz,
+ 'freigabeamum' => $freigabeamum,
+ 'freigabevon' => $freigabevon
+ ));
+ }
+
+ /**
+ * Delete Zeitsperre.
+ * @return array|stdClass|null
+ */
public function deleteEntriesForCurrentDay()
{
$today = date('Y-m-d');
diff --git a/application/models/ressource/Zeitwunsch_gueltigkeit_model.php b/application/models/ressource/Zeitwunsch_gueltigkeit_model.php
new file mode 100644
index 000000000..f26e06d3c
--- /dev/null
+++ b/application/models/ressource/Zeitwunsch_gueltigkeit_model.php
@@ -0,0 +1,14 @@
+dbTable = 'campus.tbl_zeitwunsch_gueltigkeit';
+ $this->pk = 'zeitwunsch_gueltigkeit_id';
+ }
+}
\ No newline at end of file
diff --git a/application/models/system/Variablenname_model.php b/application/models/system/Variablenname_model.php
index 869a03275..33ace3c8d 100644
--- a/application/models/system/Variablenname_model.php
+++ b/application/models/system/Variablenname_model.php
@@ -12,7 +12,14 @@ class Variablenname_model extends DB_Model
) sem
WHERE start > now()
LIMIT 1;',
- 'infocenter_studiensgangtyp' => 'SELECT infocenter_studiensgangtyp FROM public.tbl_variablenname LIMIT 1'
+ 'infocenter_studiensgangtyp' => 'SELECT infocenter_studiensgangtyp FROM public.tbl_variablenname LIMIT 1;',
+ 'projektuebersicht_studiensemester' => 'SELECT studiensemester_kurzbz FROM (
+ SELECT DISTINCT ON (studienjahr_kurzbz) start, studiensemester_kurzbz
+ FROM public.tbl_studiensemester
+ ORDER BY studienjahr_kurzbz, start
+ ) sem
+ WHERE start > now()
+ LIMIT 1;'
);
/**
diff --git a/application/views/lehre/lvplanung/adminZeitverfuegbarkeit.php b/application/views/lehre/lvplanung/adminZeitverfuegbarkeit.php
new file mode 100644
index 000000000..893a9c760
--- /dev/null
+++ b/application/views/lehre/lvplanung/adminZeitverfuegbarkeit.php
@@ -0,0 +1,166 @@
+load->view(
+ 'templates/FHC-Header',
+ array(
+ 'title' => 'Zeitverfuegbarkeit verwalten',
+ 'jquery' => true,
+ 'jqueryui' => true,
+ 'bootstrap' => true,
+ 'fontawesome' => true,
+ 'momentjs' => true,
+ 'ajaxlib' => true,
+ 'tabulator' => true,
+ 'tablewidget' => true,
+ 'navigationwidget' => true,
+ 'sbadmintemplate' => true,
+ 'phrases' => array(
+ 'global' => array(
+ 'bis',
+ 'notiz'
+ ),
+ 'ui' => array(
+ 'systemfehler',
+ 'keineDatenVorhanden',
+ 'von',
+ 'bitteWaehlen',
+ 'speichern',
+ 'loeschen',
+ 'abbrechen'
+ ),
+ 'lehre' => array(
+ 'lektor'
+ )
+ ),
+ 'widgets' => true,
+ 'dialoglib' => true,
+ 'customJSs' => array(
+ 'public/js/bootstrapper.js',
+ 'public/js/lehre/lvplanung/zverfueg.js'
+ )
+ )
+);
+?>
+
+
+widgetlib->widget('NavigationWidget'); ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ load->view('lehre/lvplanung/adminZeitverfuegbarkeitData.php'); ?>
+
+
+
+
+
+
+
+
+load->view('templates/FHC-Footer'); ?>
diff --git a/application/views/lehre/lvplanung/adminZeitverfuegbarkeitData.php b/application/views/lehre/lvplanung/adminZeitverfuegbarkeitData.php
new file mode 100644
index 000000000..81a683cff
--- /dev/null
+++ b/application/views/lehre/lvplanung/adminZeitverfuegbarkeitData.php
@@ -0,0 +1,70 @@
+= ss.start
+ AND zeitsperretyp_kurzbz = \'ZVerfueg\'
+ ORDER BY zeitsperre_id, zsp.mitarbeiter_uid
+ ) as tmp
+ ORDER BY vondatum DESC
+';
+
+$filterWidgetArray = array(
+ 'query' => $qry,
+ 'tableUniqueId' => 'adminZeitverfuegbarkeit',
+ 'requiredPermissions' => 'lehre/zeitverfuegbarkeit',
+ 'datasetRepresentation' => 'tabulator',
+ 'columnsAliases' => array(
+ 'ZeitsperreID',
+ 'UID',
+ ucfirst($this->p->t('lehre', 'lektor')),
+ ucfirst($this->p->t('ui', 'von')),
+ 'VonStunde',
+ ucfirst($this->p->t('global', 'bis')),
+ 'BisStunde',
+ ucfirst($this->p->t('global', 'notiz'))
+ ),
+ 'datasetRepOptions' => '{
+ layout: "fitColumns", // fit columns to width of table
+ autoResize: false, // prevent auto resizing of table (false to allow adapting table size when cols are (de-)activated
+ headerFilterPlaceholder: " ",
+ index: "zeitsperre_id", // assign specific column as unique id (important for row indexing)
+ selectable: 1, // allow row selection
+ tableWidgetHeader: false,
+ rowSelected: function(row) {
+ func_rowSelected(row);
+ },
+ rowDeselected: function(row) {
+ func_rowDeselected(row);
+ }
+ }', // tabulator properties
+ 'datasetRepFieldsDefs' => '{
+ zeitsperre_id: {visible:false},
+ mitarbeiter_uid: {visible: true, headerFilter:"input"},
+ lektor: {visible: true, headerFilter:"input"},
+ vondatum: {visible: true, headerFilter:"input"},
+ vonstunde: {visible: true, headerFilter:"input"},
+ bisdatum: {visible: true, headerFilter:"input"},
+ bisstunde: {visible: true, headerFilter:"input"},
+ bezeichnung: {visible: true, headerFilter:"input"}
+ }', // col properties
+);
+
+echo $this->widgetlib->widget('TableWidget', $filterWidgetArray);
+
+?>
diff --git a/application/views/system/infocenter/infocenterAbgewiesenData.php b/application/views/system/infocenter/infocenterAbgewiesenData.php
index dbe0540be..40582a668 100644
--- a/application/views/system/infocenter/infocenterAbgewiesenData.php
+++ b/application/views/system/infocenter/infocenterAbgewiesenData.php
@@ -14,7 +14,7 @@ $query = '
ps.prestudent_id AS "PreStudentID",
p.vorname AS "Vorname",
p.nachname AS "Nachname",
- sg.kurzbzlang as "Studiengang",
+ so.studiengangkurzbzlang as "Studiengang",
pss.insertamum AS "AbgewiesenAm",
(
SELECT l.zeitpunkt
@@ -43,6 +43,8 @@ $query = '
JOIN public.tbl_prestudent ps USING(prestudent_id)
JOIN public.tbl_person p USING(person_id)
JOIN public.tbl_studiengang sg USING(studiengang_kz)
+ JOIN lehre.tbl_studienplan sp USING(studienplan_id)
+ JOIN lehre.tbl_studienordnung so USING(studienordnung_id)
WHERE pss.status_kurzbz = '. $ABGEWIESENEN_STATUS .'
AND pss.studiensemester_kurzbz = '. $STUDIENSEMESTER .'
AND (sg.typ IN ('. $STUDIENGANG_TYP .')
diff --git a/application/views/system/infocenter/infocenterData.php b/application/views/system/infocenter/infocenterData.php
index f3849d622..9748a6b30 100644
--- a/application/views/system/infocenter/infocenterData.php
+++ b/application/views/system/infocenter/infocenterData.php
@@ -6,7 +6,7 @@
$INTERESSENT_STATUS = '\'Interessent\'';
$STUDIENGANG_TYP = '\''.$this->variablelib->getVar('infocenter_studiensgangtyp').'\'';
$TAETIGKEIT_KURZBZ = '\'bewerbung\', \'kommunikation\'';
- $LOGDATA_NAME = '\'Login with code\', \'Login with user\', \'Interessent rejected\', \'Attempt to register with existing mailadress\'';
+ $LOGDATA_NAME = '\'Login with code\', \'Login with user\', \'Interessent rejected\', \'Attempt to register with existing mailadress\', \'Access code sent\', \'Personal data saved\'';
$LOGDATA_NAME_PARKED = '\'Parked\'';
$LOGDATA_NAME_ONHOLD = '\'Onhold\'';
$LOGTYPE_KURZBZ = '\'Processstate\'';
@@ -137,11 +137,12 @@
LIMIT 1
) AS "AnzahlAbgeschickt",
(
- SELECT ARRAY_TO_STRING(ARRAY_AGG(DISTINCT UPPER(sg.typ || sg.kurzbz) || \':\' || sp.orgform_kurzbz), \', \')
+ SELECT ARRAY_TO_STRING(ARRAY_AGG(DISTINCT UPPER(so.studiengangkurzbzlang) || \':\' || sp.orgform_kurzbz), \', \')
FROM public.tbl_prestudentstatus pss
JOIN public.tbl_prestudent ps USING(prestudent_id)
JOIN public.tbl_studiengang sg USING(studiengang_kz)
JOIN lehre.tbl_studienplan sp USING(studienplan_id)
+ JOIN lehre.tbl_studienordnung so USING(studienordnung_id)
WHERE pss.status_kurzbz = '.$INTERESSENT_STATUS.'
AND pss.bewerbung_abgeschicktamum IS NOT NULL
-- AND pss.bestaetigtam IS NULL
@@ -162,11 +163,12 @@
LIMIT 1
) AS "StgAbgeschickt",
(
- SELECT ARRAY_TO_STRING(ARRAY_AGG(DISTINCT UPPER(sg.typ || sg.kurzbz) || \':\' || sp.orgform_kurzbz), \', \')
+ SELECT ARRAY_TO_STRING(ARRAY_AGG(DISTINCT UPPER(so.studiengangkurzbzlang) || \':\' || sp.orgform_kurzbz), \', \')
FROM public.tbl_prestudentstatus pss
JOIN public.tbl_prestudent ps USING(prestudent_id)
JOIN public.tbl_studiengang sg USING(studiengang_kz)
JOIN lehre.tbl_studienplan sp USING(studienplan_id)
+ JOIN lehre.tbl_studienordnung so USING(studienordnung_id)
WHERE pss.status_kurzbz = '.$INTERESSENT_STATUS.'
AND pss.bewerbung_abgeschicktamum IS NULL
AND pss.bestaetigtam IS NULL
@@ -214,11 +216,12 @@
LIMIT 1
) AS "AnzahlStgNichtAbgeschickt",
(
- SELECT ARRAY_TO_STRING(ARRAY_AGG(DISTINCT UPPER(sg.typ || sg.kurzbz) || \':\' || sp.orgform_kurzbz), \', \')
+ SELECT ARRAY_TO_STRING(ARRAY_AGG(DISTINCT UPPER(so.studiengangkurzbzlang) || \':\' || sp.orgform_kurzbz), \', \')
FROM public.tbl_prestudentstatus pss
JOIN public.tbl_prestudent ps USING(prestudent_id)
JOIN public.tbl_studiengang sg USING(studiengang_kz)
JOIN lehre.tbl_studienplan sp USING(studienplan_id)
+ JOIN lehre.tbl_studienordnung so USING(studienordnung_id)
WHERE pss.status_kurzbz IN ('.$STATUS_KURZBZ.')
AND pss.bewerbung_abgeschicktamum IS NULL
AND ps.person_id = p.person_id
diff --git a/application/views/system/infocenter/infocenterFreigegebenData.php b/application/views/system/infocenter/infocenterFreigegebenData.php
index 92f062b62..8bfa169e1 100644
--- a/application/views/system/infocenter/infocenterFreigegebenData.php
+++ b/application/views/system/infocenter/infocenterFreigegebenData.php
@@ -5,7 +5,7 @@
$INTERESSENT_STATUS = '\'Interessent\'';
$STUDIENGANG_TYP = '\''.$this->variablelib->getVar('infocenter_studiensgangtyp').'\'';
$TAETIGKEIT_KURZBZ = '\'bewerbung\', \'kommunikation\'';
- $LOGDATA_NAME = '\'Login with code\', \'Login with user\', \'Attempt to register with existing mailadress\'';
+ $LOGDATA_NAME = '\'Login with code\', \'Login with user\', \'Attempt to register with existing mailadress\', \'Access code sent\', \'Personal data saved\'';
$REJECTED_STATUS = '\'Abgewiesener\'';
$ADDITIONAL_STG = $this->config->item('infocenter_studiengang_kz');
$STATUS_KURZBZ = '\'Wartender\', \'Bewerber\', \'Aufgenommener\', \'Student\'';
@@ -106,11 +106,12 @@ $query = '
LIMIT 1
) AS "AnzahlAbgeschickt",
(
- SELECT ARRAY_TO_STRING(ARRAY_AGG(DISTINCT UPPER(sg.typ || sg.kurzbz || \':\' || sp.orgform_kurzbz)), \', \')
+ SELECT ARRAY_TO_STRING(ARRAY_AGG(DISTINCT UPPER(so.studiengangkurzbzlang) || \':\' || sp.orgform_kurzbz), \', \')
FROM public.tbl_prestudentstatus pss
JOIN public.tbl_prestudent ps USING(prestudent_id)
JOIN public.tbl_studiengang sg USING(studiengang_kz)
JOIN lehre.tbl_studienplan sp USING(studienplan_id)
+ JOIN lehre.tbl_studienordnung so USING(studienordnung_id)
WHERE pss.status_kurzbz = '.$INTERESSENT_STATUS.'
AND pss.bewerbung_abgeschicktamum IS NOT NULL
AND ps.person_id = p.person_id
@@ -128,11 +129,12 @@ $query = '
LIMIT 1
) AS "StgAbgeschickt",
(
- SELECT ARRAY_TO_STRING(ARRAY_AGG(DISTINCT UPPER(sg.typ || sg.kurzbz) || \':\' || sp.orgform_kurzbz), \', \')
+ SELECT ARRAY_TO_STRING(ARRAY_AGG(DISTINCT UPPER(so.studiengangkurzbzlang) || \':\' || sp.orgform_kurzbz), \', \')
FROM public.tbl_prestudentstatus pss
JOIN public.tbl_prestudent ps USING(prestudent_id)
JOIN public.tbl_studiengang sg USING(studiengang_kz)
JOIN lehre.tbl_studienplan sp USING(studienplan_id)
+ JOIN lehre.tbl_studienordnung so USING(studienordnung_id)
WHERE pss.status_kurzbz IN ('.$STATUS_KURZBZ.')
AND ps.person_id = p.person_id
diff --git a/application/views/system/infocenter/infocenterReihungstestAbsolviertData.php b/application/views/system/infocenter/infocenterReihungstestAbsolviertData.php
index dbc0124bc..ea1fab83c 100644
--- a/application/views/system/infocenter/infocenterReihungstestAbsolviertData.php
+++ b/application/views/system/infocenter/infocenterReihungstestAbsolviertData.php
@@ -5,7 +5,7 @@
$INTERESSENT_STATUS = '\'Interessent\'';
$STUDIENGANG_TYP = '\''.$this->variablelib->getVar('infocenter_studiensgangtyp').'\'';
$TAETIGKEIT_KURZBZ = '\'bewerbung\', \'kommunikation\'';
- $LOGDATA_NAME = '\'Login with code\', \'Login with user\', \'Attempt to register with existing mailadress\'';
+ $LOGDATA_NAME = '\'Login with code\', \'Login with user\', \'Attempt to register with existing mailadress\', \'Access code sent\', \'Personal data saved\'';
$ADDITIONAL_STG = $this->config->item('infocenter_studiengang_kz');
$STUDIENSEMESTER = '\''.$this->variablelib->getVar('infocenter_studiensemester').'\'';
$ORG_NAME = '\'InfoCenter\'';
@@ -85,11 +85,12 @@ $query = '
LIMIT 1
) AS "AnzahlAbgeschickt",
(
- SELECT ARRAY_TO_STRING(ARRAY_AGG(DISTINCT UPPER(sg.typ || sg.kurzbz || \':\' || sp.orgform_kurzbz)), \', \')
+ SELECT ARRAY_TO_STRING(ARRAY_AGG(DISTINCT UPPER(so.studiengangkurzbzlang) || \':\' || sp.orgform_kurzbz), \', \')
FROM public.tbl_prestudentstatus pss
JOIN public.tbl_prestudent ps USING(prestudent_id)
JOIN public.tbl_studiengang sg USING(studiengang_kz)
JOIN lehre.tbl_studienplan sp USING(studienplan_id)
+ JOIN lehre.tbl_studienordnung so USING(studienordnung_id)
WHERE pss.status_kurzbz = '.$INTERESSENT_STATUS.'
AND pss.bewerbung_abgeschicktamum IS NOT NULL
AND ps.person_id = p.person_id
diff --git a/application/views/system/infocenter/infocenterZgvUeberpruefungData.php b/application/views/system/infocenter/infocenterZgvUeberpruefungData.php
index 6614e6b2a..5bfa5b078 100644
--- a/application/views/system/infocenter/infocenterZgvUeberpruefungData.php
+++ b/application/views/system/infocenter/infocenterZgvUeberpruefungData.php
@@ -4,11 +4,6 @@ $APP = '\'infocenter\'';
$INTERESSENT_STATUS = '\'Interessent\'';
$TAETIGKEIT_KURZBZ = '\'bewerbung\', \'kommunikation\'';
$LOGDATA_NAME = '\'Login with code\', \'Login with user\', \'New application\'';
-
-$uid = get_uid();
-$rechte = new benutzerberechtigung();
-$rechte->getBerechtigungen($uid);
-$oeKurz = $rechte->getOEkurzbz('lehre/zgvpruefung');
$oeKurz = '\''. implode('\',\'', $oeKurz) . '\'';
$query = '
diff --git a/cis/private/lehre/abgabe_lektor_details.php b/cis/private/lehre/abgabe_lektor_details.php
index 9f74d5cf8..a508de098 100644
--- a/cis/private/lehre/abgabe_lektor_details.php
+++ b/cis/private/lehre/abgabe_lektor_details.php
@@ -120,21 +120,28 @@ if(!$projektarbeit_obj->load($projektarbeit_id))
$titel = $projektarbeit_obj->titel;
$student_uid = $projektarbeit_obj->student_uid;
-// paarbeit sollte nur ab SS2021 online bewertet werden
-$qry_sem="SELECT 1
- FROM lehre.tbl_projektarbeit
- JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
- JOIN public.tbl_studiensemester USING(studiensemester_kurzbz)
- WHERE projektarbeit_id=".$db->db_add_param($projektarbeit_id, FHC_INTEGER)."
- AND tbl_studiensemester.start::date >= (SELECT start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz = 'SS2021')::date
- LIMIT 1";
-$result_sem=$db->db_query($qry_sem);
-$num_rows_sem = $db->db_num_rows($result_sem);
-if($num_rows_sem < 0)
+// paarbeit sollte nur ab bestimmten Zeitpunkt online bewertet werden
+$num_rows_sem = $projektarbeit_obj->projektarbeitIsCurrent($projektarbeit_id);
+
+if(!is_numeric($num_rows_sem) || $num_rows_sem < 0)
{
echo "".$p->t('abgabetool/fehlerAktualitaetProjektarbeit')."
";
}
+// Endupload sollte vor Benotung durchgeführt worden sein
+$qry_endupload="SELECT 1
+ FROM campus.tbl_paabgabe
+ WHERE projektarbeit_id=".$db->db_add_param($projektarbeit_id, FHC_INTEGER)."
+ AND paabgabetyp_kurzbz='end'
+ AND abgabedatum IS NOT NULL
+ LIMIT 1";
+$result_endupload=$db->db_query($qry_endupload);
+$num_rows_endupload = $db->db_num_rows($result_endupload);
+if($num_rows_endupload < 0)
+{
+ echo "".$p->t('abgabetool/fehlerErmittelnEnduploadProjektarbeit')."
";
+}
+
// Zweitbegutachter holen
if($betreuerart=="Erstbegutachter")
{
@@ -457,7 +464,11 @@ while ($result_nam && $row_nam=$db->db_fetch_object($result_nam))
$htmlstr .= "