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/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/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/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/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/cis/private/profile/zeitsperre_resturlaub.php b/cis/private/profile/zeitsperre_resturlaub.php
index f6c9ec2cf..8e449b12d 100644
--- a/cis/private/profile/zeitsperre_resturlaub.php
+++ b/cis/private/profile/zeitsperre_resturlaub.php
@@ -690,7 +690,7 @@ if(count($zeit->result)>0)
".(isset($row_vertretung->kurzbz)?$row_vertretung->kurzbz:'')."
".(isset($erreichbarkeit_arr[$row->erreichbarkeit])?$erreichbarkeit_arr[$row->erreichbarkeit]:'')."
".($row->freigabeamum!=''?'Ja':'')." ";
- if ($row->zeitsperretyp_kurzbz == 'DienstV')
+ if ($row->zeitsperretyp_kurzbz == 'DienstV' || $row->zeitsperretyp_kurzbz == 'ZVerfueg')
$content_table .= ' ';
else if ($row->vondatum < $gesperrt_bis AND in_array($row->zeitsperretyp_kurzbz,$typen_arr))
$content_table .= ' ';
@@ -702,7 +702,7 @@ if(count($zeit->result)>0)
{
$content_table.="\n".$p->t('zeitsperre/loeschen')." ";
}
- elseif($row->zeitsperretyp_kurzbz!='Urlaub')
+ elseif($row->zeitsperretyp_kurzbz!='Urlaub' && $row->zeitsperretyp_kurzbz != 'ZVerfueg')
{
$content_table.="\n".$p->t('zeitsperre/loeschen')." ";
}
@@ -762,6 +762,11 @@ if($result = $db->db_query($qry))
{
while($row=$db->db_fetch_object($result))
{
+ if ($row->zeitsperretyp_kurzbz === 'ZVerfueg')
+ {
+ continue;
+ }
+
if($zeitsperre->zeitsperretyp_kurzbz == $row->zeitsperretyp_kurzbz)
$content_form.= "$row->beschreibung ";
else
diff --git a/cis/private/profile/zeitwunsch.php b/cis/private/profile/zeitwunsch.php
index ff4c35ebd..a448125f6 100644
--- a/cis/private/profile/zeitwunsch.php
+++ b/cis/private/profile/zeitwunsch.php
@@ -18,6 +18,7 @@
* Authors: Christian Paminger ,
* Andreas Oesterreicher and
* Rudolf Hangl .
+ * Cristina Hainberger
*/
/**
* @brief bietet die Moeglichkeit zur Anzeige und
@@ -29,10 +30,15 @@ require_once('../../../include/globals.inc.php');
require_once('../../../include/functions.inc.php');
require_once('../../../include/datum.class.php');
require_once('../../../include/zeitwunsch.class.php');
+require_once('../../../include/zeitwunsch_gueltigkeit.class.php');
require_once('../../../include/studiensemester.class.php');
+require_once('../../../include/studiengang.class.php');
require_once('../../../include/zeitaufzeichnung_gd.class.php');
require_once('../../../include/benutzer.class.php');
require_once('../../../include/mitarbeiter.class.php');
+require_once('../../../include/lehrveranstaltung.class.php');
+require_once('../../../include/lehreinheit.class.php');
+require_once('../../../include/lehrstunde.class.php');
require_once('../../../include/phrasen.class.php');
require_once('../../../include/sprache.class.php');
@@ -49,63 +55,27 @@ $uid = get_uid();
if(!check_lektor($uid))
die($p->t('global/keineBerechtigungFuerDieseSeite'));
-
-$PHP_SELF = $_SERVER['PHP_SELF'];
-
-if(isset($_GET['type']))
- $type=$_GET['type'];
-
$datum_obj = new datum();
+// Nächstes Studiensemester
+$next_ss = new Studiensemester();
+$next_ss->getNextStudiensemester();
+
+// Aktuelles Studiensemester
+$akt_ss = new Studiensemester();
+$akt_ss->load($akt_ss->getAkt());
+
+// Dropdown: Aktuelles/naechstes Studiensemester zum Bearbeiten
+$selected_ss = (isset($_GET['stsem']) && is_string($_GET['stsem'])) ? $_GET['stsem'] : $next_ss->studiensemester_kurzbz; // Default: Nächstes Studiensemester
+
+// Dropdown: Vergangene Studiensemester zum Kopieren
+$selected_past_ss = (isset($_GET['pastStsem']) && is_string($_GET['pastStsem'])) ? $_GET['pastStsem'] : null; // Default: null
+
//Stundentabelleholen
if(! $result_stunde=$db->db_query('SELECT * FROM lehre.tbl_stunde ORDER BY stunde'))
die($db->db_last_error());
$num_rows_stunde=$db->db_num_rows($result_stunde);
-// Zeitwuensche speichern
-if (isset($type) && $type=='save')
-{
- $zw = new zeitwunsch();
-
- for ($t=1;$t<7;$t++)
- {
- for ($i=0;$i<$num_rows_stunde;$i++)
- {
- $var='wunsch'.$t.'_'.$i;
- if(!isset($_POST[$var]))
- continue;
- $gewicht=$_POST[$var];
- $stunde=$i+1;
-
- $zw->mitarbeiter_uid = $uid;
- $zw->stunde = $stunde;
- $zw->tag = $t;
- $zw->gewicht = $gewicht;
- $zw->updateamum = date('Y-m-d H:i:s');
- $zw->updatevon = $uid;
-
- if (!$zw->exists($uid, $stunde, $t))
- {
- $zw->new = true;
- $zw->insertamum = date('Y-m-d H:i:s');
- $zw->insertvon = $uid;
- }
- else
- $zw->new = false;
-
- if(!$zw->save())
- echo $zw->errormsg;
- }
- }
-}
-
-$zw = new zeitwunsch();
-if(!$zw->loadPerson($uid))
- die($zw->errormsg);
-
-$wunsch = $zw->zeitwunsch;
-
-
// Personendaten
$person = new benutzer();
if(!$person->load($uid))
@@ -114,11 +84,10 @@ if(!$person->load($uid))
$ma = new mitarbeiter($uid);
$fixangestellt = $ma->fixangestellt;
-// Nächstes Studiensemester
-$ss = new Studiensemester();
-$ss->getNextStudiensemester();
-$next_ss = $ss->studiensemester_kurzbz;
-$current_ss = $ss->getakt();
+// Check, ob Bearbeitung des ZW gesperrt ist.
+// Gesperrt, wenn Lektor bereits zugewiesene LVs hat.
+// Sperre in jeden Fall aufgehoben, wenn ein ZW kopiert wird. (denn ist eine eventuelle Sperre bereits manuell aufgehoben worden)
+$isGesperrt = checkIsVerplant($uid, $selected_ss) && is_null($selected_past_ss); // boolean
// Erklärung zu Pausen bei geteilten Arbeitszeiten speichern
if (isset($_GET['selbstverwaltete-pause-akt']) && !empty($_GET['submit-akt']))
@@ -127,10 +96,10 @@ if (isset($_GET['selbstverwaltete-pause-akt']) && !empty($_GET['submit-akt']))
$zeitaufzeichnung_gd = new Zeitaufzeichnung_gd();
$zeitaufzeichnung_gd->uid = $uid;
- $zeitaufzeichnung_gd->studiensemester_kurzbz = $current_ss;
+ $zeitaufzeichnung_gd->studiensemester_kurzbz = $akt_ss->studiensemester_kurzbz;
$zeitaufzeichnung_gd->selbstverwaltete_pause = $selbstverwaltete_pause;
$za_gd = new Zeitaufzeichnung_gd();
- $za_gd->load($uid, $current_ss);
+ $za_gd->load($uid, $akt_ss->studiensemester_kurzbz);
if ($za_gd->uid)
{
echo 'Bereits eingetragen';
@@ -147,10 +116,10 @@ if (isset($_GET['selbstverwaltete-pause']) && !empty($_GET['submit']))
$zeitaufzeichnung_gd = new Zeitaufzeichnung_gd();
$zeitaufzeichnung_gd->uid = $uid;
- $zeitaufzeichnung_gd->studiensemester_kurzbz = $next_ss;
+ $zeitaufzeichnung_gd->studiensemester_kurzbz = $next_ss->studiensemester_kurzbz;
$zeitaufzeichnung_gd->selbstverwaltete_pause = $selbstverwaltete_pause;
$za_gd = new Zeitaufzeichnung_gd();
- $za_gd->load($uid, $next_ss);
+ $za_gd->load($uid, $next_ss->studiensemester_kurzbz);
if ($za_gd->uid)
{
echo 'Bereits eingetragen';
@@ -162,14 +131,302 @@ if (isset($_GET['selbstverwaltete-pause']) && !empty($_GET['submit']))
}
+// Zeitwuensche speichern
+if (isset($_GET['type']) && $_GET['type'] == 'save')
+{
+ // Letzte Zeitwunschgueltigkeit (ZWG) holen
+ $zwg = new Zeitwunsch_gueltigkeit();
+ $zwg->getByUID($uid, 1);
+ $lastZwg = !empty($zwg->result) ? $zwg->result[0] : null;
+
+ // Check, ob letzte ZWG im nächsten Studiensemester startet. D.h. es existiert ein neuer Zeitwunsch in der Zukunft
+ $lastZwgStartsNextSemester = (!is_null($lastZwg) && $lastZwg->von >= $next_ss->start) ? true : false;
+ $zw_zwg_id = null; // ZWG ID, die zum Speichern / Updaten des Zeitwunsches uebergeben wird
+
+ // Wenn allererster Zeitwunsch, also noch keine ZWG vorhanden
+ if (is_null($lastZwg))
+ {
+ // Wenn ZW fuer naechstes Studiensemester ist
+ if ($selected_ss == $next_ss->studiensemester_kurzbz)
+ {
+ // Neue ZWG setzen: von = Start nächstes Studiensemester, bis offen lassen
+ $zw_zwg_id = insertZWG($uid, $next_ss->start, null);
+ }
+
+ // Wenn Zeitwunsch fuer aktuelles Studiensemester ist
+ if ($selected_ss == $akt_ss->studiensemester_kurzbz)
+ {
+ // Neue ZWG setzen: von = now(), bis offen lassen
+ $zw_zwg_id = insertZWG($uid, (new DateTime())->format('Y-m-d H:i:s'), null);
+ }
+ }
+
+ // Wenn mindestens eine ZWG vorhanden
+ if (!is_null($lastZwg))
+ {
+ // Wenn Zeitwunsch fuer naechstes Studiensemester ist
+ if ($selected_ss == $next_ss->studiensemester_kurzbz)
+ {
+ // Wenn naechstes Studiensemester schon eine eigene ZWG hat
+ if ($lastZwgStartsNextSemester)
+ {
+ // Nur Zeitwunsch dieser ZWG updaten
+ $zw_zwg_id = $lastZwg->zeitwunsch_gueltigkeit_id;
+ }
+
+ // Wenn naechstes Studiensemester keine eigene ZWG hat
+ if (!$lastZwgStartsNextSemester)
+ {
+ // Fuer bisher letzte ZWG ein Endedatum setzen: bis = Ende aktuelles Studiensemester
+ updateZWG($uid, $lastZwg->zeitwunsch_gueltigkeit_id, $akt_ss->ende);
+
+ // Neue ZWG setzen: von = Start nächstes Studiensemester, bis offen lassen
+ $zw_zwg_id = insertZWG($uid, $next_ss->start, null);
+ }
+ }
+
+ // Wenn Zeitwunsch fuer aktuelles Studiensemester ist
+ if ($selected_ss == $akt_ss->studiensemester_kurzbz)
+ {
+ /**
+ * Check, ob aktuelles Studiensemester eine ZWG hat.
+ * Wenn die allererste ZWG fuer das naechste Studiensemester erstellt wurde, dann hat das
+ * aktuelle Studiensemester noch keine ZWG.
+ * */
+ $zwg = new Zeitwunsch_gueltigkeit();
+ $zwg->getByStudiensemester($uid, $akt_ss->studiensemester_kurzbz);
+ $akt_ss_zwg = !empty($zwg->result) ? $zwg->result[0] : null;
+
+ // Keine ZWG fuer aktuelles Studiensemester vorhanden.
+ // Da eine ZWG ID aber schon vorhanden: USER HAT ERSTMALIG MIT NAECHSTEM STUDIENSEMESTER EINTRAG BEGONNEN
+ if (is_null($akt_ss_zwg))
+ {
+ // Neue ZWG setzen: von = now(), ende = Ende aktuelles Studiensemester
+ $zw_zwg_id = insertZWG($uid, (new DateTime())->format('Y-m-d H:i:s'), $akt_ss->ende);
+ }
+
+ // ZWG für aktuelles Studiensemester ist vorhanden --> SPLIT AKTUELLE STUDIENSEMESTER
+ if ((!is_null($akt_ss_zwg)))
+ {
+ // Wenn am selben Tag schon neue ZWG gespeichert wurde, keine neue ZWG anlegen, sondern diese nur updaten
+ // Verhindert mehrfache Eintraege, wenn oefters zwischengespeichert wird.
+ if ((new DateTime($akt_ss_zwg->von))->format('Y-m-d') == (new Datetime())->format('Y-m-d'))
+ {
+ updateZWG($uid, $akt_ss_zwg->zeitwunsch_gueltigkeit_id, $akt_ss_zwg->bis);
+
+ $zw_zwg_id = $akt_ss_zwg->zeitwunsch_gueltigkeit_id;
+ }
+ else
+ {
+ // Neue ZWG setzen: von = now(), bis = Bis von ZWG des aktuellen Studiensemesters uebernehmen:
+ // -> bis ist entweder Ende aktuelles Studiensemester (wenn ZWG für nächstes Studiensemester vorhanden ist)
+ // -> sonst ist bis null
+ $zw_zwg_id = insertZWG($uid, (new DateTime())->format('Y-m-d H:i:s'), $akt_ss_zwg->bis);
+
+ // Fuer bisher letzte ZWG das Endedatum auf gestern setzen: bis = gestern
+ // NOTE: MUSS nach dem insert sein
+ updateZWG($uid, $akt_ss_zwg->zeitwunsch_gueltigkeit_id, (new DateTime('yesterday'))->format('Y-m-d H:i:s'));
+ }
+ }
+ }
+ }
+
+ // Insert Zeitwunsch mit Zeitwunsch ZWG ID
+ if (is_numeric($zw_zwg_id))
+ {
+ $zw = new zeitwunsch();
+
+ for ($t=1;$t<7;$t++)
+ {
+ for ($i=0;$i<$num_rows_stunde;$i++)
+ {
+ $var='wunsch'.$t.'_'.$i;
+ if(!isset($_POST[$var]))
+ continue;
+ $gewicht=$_POST[$var];
+ $stunde=$i+1;
+
+ $zw->mitarbeiter_uid = $uid;
+ $zw->stunde = $stunde;
+ $zw->tag = $t;
+ $zw->gewicht = $gewicht;
+ $zw->updateamum = date('Y-m-d H:i:s');
+ $zw->updatevon = $uid;
+ $zw->zeitwunsch_gueltigkeit_id = $zw_zwg_id;
+
+ if (!$zw->exists($uid, $zw_zwg_id, $stunde, $t))
+ {
+ $zw->new = true;
+ $zw->insertamum = date('Y-m-d H:i:s');
+ $zw->insertvon = $uid;
+ }
+ else
+ {
+ $zw->new = false;
+ }
+
+ if(!$zw->save())
+ echo $zw->errormsg;
+ }
+ }
+ }
+
+ // Wenn speichern möglich ist, dann hat der Lektor entweder keine LVs zugeteilt oder hat aktiv die Bearbeitungssperre
+ // deaktiviert. Bearbeitungssperre wird gesetzt, wenn isGesperrt true ist. Deshalb hier mit false überschreiben.
+ $isGesperrt = false;
+}
+
+/**
+ * Zeitwunschgueltigkeit fuer Tabelle holen.
+ * Der Zeitwunsch wird anhand der Zeitwunschgueltigkeit (ZWG) des gewaehlten Studiensemesters ermittelt.
+ * Das Studiensemester wird, je nach Vorhandensein, in dieser Reihenfolge herangezogen:
+ * 1. Wenn in Dropdown ausgewaehlt: Vergangenes Studiensemester (zum Kopieren von Zeitwunsch)
+ * 2. Wenn in Dropdown ausgewaehlt: Aktuelles Studiensemester
+ * 3: Default: Nächstes Studiensemesters
+ */
+$zwg = new zeitwunsch_gueltigkeit();
+$tmp_ss = is_null($selected_past_ss) ? $selected_ss : $selected_past_ss;
+$zwg->getByStudiensemester($uid, $tmp_ss);
+$zwg_id = !empty($zwg->result[0]) ? $zwg->result[0]->zeitwunsch_gueltigkeit_id : null; //null, wenn noch kein ZW
+
+/**
+ * Zeitwunsch fuer Tabelle holen
+ * Wenn noch kein Zeitwunsch vorhanden, bleibt die Zeitwunsch Instanz leer
+ * */
+$zw = new zeitwunsch();
+if (!$zw->loadByZWG($uid, $zwg_id))
+{
+ die($zw->errormsg);
+}
+$wunsch = $zw->zeitwunsch;
+
+/**
+ * Init ZWG Objekt zum Erstellen einer neuen ZWG
+ */
+function insertZWG($uid, $von, $bis)
+{
+ $zwg = new Zeitwunsch_gueltigkeit();
+ $zwg->new = true;
+ $zwg->mitarbeiter_uid = $uid;
+ $zwg->von = $von;
+ $zwg->bis = $bis;
+ $zwg->insertvon = $uid;
+ if ($zwg->save())
+ {
+ return $zwg->zeitwunsch_gueltigkeit_id;
+ }
+ else
+ {
+ die($zwg->errormsg);
+ }
+}
+
+/**
+ * Init ZWG Objekt zum Updaten einer bestehenden ZWG
+ */
+function updateZWG($uid, $zwg_id, $bis)
+{
+ $zwg = new Zeitwunsch_gueltigkeit();
+ $zwg->new = false;
+ $zwg->zeitwunsch_gueltigkeit_id = $zwg_id;
+ $zwg->mitarbeiter_uid = $uid;
+ $zwg->bis = $bis;
+ $zwg->updatevon = $uid;
+
+ if (!$zwg->save())
+ {
+ die($zwg->errormsg);
+ }
+
+ return;
+}
+
+/**
+ * Check, ob Lektor bereits zugewiesene LVs hat
+ * @param $uid
+ * @param $studiensemester_kurzbz
+ * @return bool|void
+ */
+function checkIsVerplant($uid, $studiensemester_kurzbz)
+{
+ $lstd = new Lehrstunde();
+ if (!$lstd->getStundenplanData('stundenplandev', null, $studiensemester_kurzbz, null, $uid, null, true))
+ {
+ die($lstd->errormsg);
+ }
+
+ return empty($lstd->result) ? false : true;
+}
+
+/**
+ * Get Studiengaenge of STG assigend to LVs, to which lector is alredy assigend in
+ * the given Studiensemester.
+ *
+ * @param $uid
+ * @param $studiensemester_kurzbz
+ * @return array|void
+ */
+function getStgOfVerplant($uid, $studiensemester_kurzbz)
+{
+ $stg_arr = array(); // Mail data for Studiengang
+
+ // Get Stundenplan entries of lector of Studiensemester concerned by Zeitwunschgueltigkeit
+ $lstd = new Lehrstunde();
+ if (!$lstd->getStundenplanData(
+ 'stundenplandev',
+ null,
+ $studiensemester_kurzbz,
+ null,
+ $uid,
+ null,
+ true)) //...but only from now on
+ {
+ die($lstd->errormsg);
+ }
+
+ // Loop through Stundenplan entries
+ foreach ($lstd->result as $row)
+ {
+ // Get LE of Stundenplan entry
+ $le = new Lehreinheit($row->lehreinheit_id);
+
+ // GET LV by LE of Stundenplan entry
+ $lv = new Lehrveranstaltung($le->lehrveranstaltung_id);
+
+ // Build Studiengang array
+ $stg_arr[] = $lv->studiengang_kz;
+ }
+
+ // Make Studiengang array unique
+ return array_unique($stg_arr);
+}
+
+/**
+ * Get Studiengang eMail Addresses.
+ * @param $stgKz_arr // Studiengang Kennzeichen Array
+ * @return array
+ */
+function getStgMail($stgKz_arr)
+{
+ $stgMail_arr = array();
+ foreach($stgKz_arr as $stgKz)
+ {
+ $stg = new Studiengang($stgKz);
+ $stgMail_arr[]= $stg->email;
+ }
+ return $stgMail_arr;
+}
+
?>
t('zeitwunsch/zeitwunsch');?>
-
+
+
+
-
+
- Zustimmung zur Verplanung in geteilter Arbeitszeit
+ Zustimmung zur Verplanung in geteilter Arbeitszeit
t('zeitwunsch/geteilteArbeitszeit');
+ echo ' ';
$gd = new zeitaufzeichnung_gd();
- $gd->load($uid, $current_ss);
+ $gd->load($uid, $akt_ss->studiensemester_kurzbz);
if ( ! $gd->uid )
{
- echo '
Zustimmung für '.$current_ss.': ';
- echo ' ja';
- echo ' nein';
- echo ' ';
+ echo '';
+ echo '
';
+
+ echo '
';
+ echo ' ';
+ echo '
';
+
+ echo '
';
+ echo '
';
+ echo '
';
}
else
{
$zustimmung = ($gd->selbstverwaltete_pause) ? ' erteilt' : 'abgelehnt';
- echo 'Zustimmung für '.$current_ss.': '.$zustimmung.' am '.$datum_obj->formatDatum($gd->insertamum,'d.m.Y H:i:s').' ';
+ echo 'Zustimmung für '.$akt_ss->studiensemester_kurzbz.': '.$zustimmung.' am '.$datum_obj->formatDatum($gd->insertamum,'d.m.Y H:i:s').' ';
}
$gd = new zeitaufzeichnung_gd();
- $gd->load($uid, $next_ss);
+ $gd->load($uid, $next_ss->studiensemester_kurzbz);
if ( ! $gd->uid )
{
- echo 'Zustimmung für '.$next_ss.': ';
- echo ' ja';
- echo ' nein';
- echo ' ';
+ echo '';
+ echo '
';
+
+ echo '
';
+ echo ' ';
+ echo '
';
+
+ echo '
';
+ echo '
';
+ echo '
';
}
else
{
$zustimmung = ($gd->selbstverwaltete_pause) ? ' erteilt' : 'abgelehnt';
- echo 'Zustimmung für '.$next_ss.': '.$zustimmung.' am '.$datum_obj->formatDatum($gd->insertamum,'d.m.Y H:i:s').' ';
+ echo 'Zustimmung für '.$next_ss->studiensemester_kurzbz.': '.$zustimmung.' am '.$datum_obj->formatDatum($gd->insertamum,'d.m.Y H:i:s').' ';
}
- //var_dump($gd);
?>
-
- t('zeitwunsch/zeitwunsch');?>
-
".$p->t('zeitwunsch/zeitwunschVon')." $person->titelpre $person->vorname $person->nachname $person->titelpost ";
- echo $p->t('zeitwunsch/tragenSieInDiesesNormwochenraster')." ";
- echo '
-
- ';
- echo ''.$p->t('global/stunde').' '.$p->t('global/beginn').' '.$p->t('global/ende').' ';
- for ($i=0;$i<$num_rows_stunde; $i++)
- {
- $beginn=$db->db_result($result_stunde,$i,'"beginn"');
- $beginn=substr($beginn,0,5);
- $ende=$db->db_result($result_stunde,$i,'"ende"');
- $ende=substr($ende,0,5);
- $stunde=$db->db_result($result_stunde,$i,'"stunde"');
- echo "$stunde $beginn $ende
";
- }
+ // FORM Begin
+ echo '';
+ echo ' ';
+ echo ' ';
- echo ' ';
+ // Mein Zeitwunsch-Semesterplan Dropdown, Default = naechstes Studiensemester
+ $next_ss_selected = $next_ss->studiensemester_kurzbz == $selected_ss ? 'selected' : '';
+ $akt_ss_selected = $akt_ss->studiensemester_kurzbz == $selected_ss ? 'selected' : '';
- for ($j=1; $j<7; $j++)
- {
- echo ''.$tagbez[$lang->index][$j].' ';
- for ($i=0;$i<$num_rows_stunde;$i++)
- {
- if (isset($wunsch[$j][$i+1]))
- $index=$wunsch[$j][$i+1];
- else
- $index=1;
- //$id='bgcolor';
- //$id.=$index+3;
- $bgcolor=$cfgStdBgcolor[$index+3];
- echo ' ';
- }
- echo ' ';
- }
+ echo ''. $p->t('zeitwunsch/gueltigIm');
+ echo '';
+ echo ''. $next_ss->studiensemester_kurzbz.' ';
+ echo ''. $akt_ss->studiensemester_kurzbz.' ';
+ echo ' ';
+ echo ' ';
- echo '
-
-
-
- ';
+ // Tabelle Zeitwunsch-Semesterplan
+ echo '';
+ // Tabelle Kopfzeile
+ echo '';
+ echo ''.$p->t('global/stunde').' '.$p->t('global/beginn').' '.$p->t('global/ende').' ';
+ for ($i=0;$i<$num_rows_stunde; $i++)
+ {
+ $beginn=$db->db_result($result_stunde,$i,'"beginn"');
+ $beginn=substr($beginn,0,5);
+ $ende=$db->db_result($result_stunde,$i,'"ende"');
+ $ende=substr($ende,0,5);
+ $stunde=$db->db_result($result_stunde,$i,'"stunde"');
+ echo "$stunde $beginn $ende
";
+ }
+ echo ' ';
+ // Tabelle Zellen
+ for ($j=1; $j<7; $j++)
+ {
+ echo ''.$tagbez[$lang->index][$j].' ';
+ for ($i=0;$i<$num_rows_stunde;$i++)
+ {
+ if (isset($wunsch[$j][$i+1]))
+ $index=$wunsch[$j][$i+1];
+ else
+ $index=1; // Defaultwert, wenn kein Zeitwunsch vorhanden
- if($zw->updateamum!='')
- {
- echo ''.$p->t('zeitwunsch/letzteAenderung').': '.$datum_obj->formatDatum($zw->updateamum,'d.m.Y H:i:s').' '.$p->t('zeitwunsch/von').' '.$zw->updatevon.' ';
- }
- ?>
+ $bgcolor=$cfgStdBgcolor[$index+3];
+ echo ' ';
+ }
+ echo ' ';
+ }
+ echo '
';
-
+ // Zeitwunsch aendern / kopieren
+ echo '';
+ echo '
';
+ echo ''. $p->t('zeitwunsch/erklaerungstext'). ' ';
+ echo '
';
+ echo ''; // end col-xs-12
+ echo '
'; // end row
-
+ echo '';
-
t('zeitwunsch/erklärung');?>:
+ echo '
';
+ // Radiobuttons aendern / kopieren
+ $radioChangeChecked = is_null($selected_past_ss) ? 'checked' : '';
+ $radioCopyChecked = !is_null($selected_past_ss) ? 'checked' : '';
- ";
- echo $p->t('zeitwunsch/formularZumEintragenDerZeitsperren', array($href));
- ?>
-
-
t('zeitwunsch/kontrollierenSieIhreZeitwuensche');?>!
-
-
-
- t('zeitwunsch/wert');?>
-
- t('zeitwunsch/bedeutung');?>
-
-
-
-
- 2
-
- t('zeitwunsch/hierMoechteIchUnterrichten');?>
-
-
-
- 1
-
- t('zeitwunsch/hierKannIchUnterrichten');?>
-
-
-
-
- -1
-
- t('zeitwunsch/nurInNotfaellen');?>
-
-
-
- -2
-
- t('zeitwunsch/hierAufGarKeinenFall');?>
-
-
-
t('zeitwunsch/folgendePunkteSindZuBeachten');?>:
-
- t('zeitwunsch/verwendenSieDenWertNur');?>
- t('zeitwunsch/sperrenSieNurTermine');?>
- t('zeitwunsch/esSolltenFuerJedeStunde');?>
-
-
t('lvplan/fehlerUndFeedback');?> t('lvplan/lvKoordinationsstelle');?> .
-
-
-
-
+ echo '';
+ echo ''.$p->t('zeitwunsch/fuer', array($selected_ss)). ' ';
+ echo '';
+ echo ' '. $p->t('zeitwunsch/kopieren'). ' ';
+ echo ' ';
+ echo '';
+ echo ' '. $p->t('zeitwunsch/aendern'). ' ';
+ echo ' ';
+ if ($isGesperrt)
+ {
+ echo ''.$p->t('zeitwunsch/stundenBereitsVerplant', array($selected_ss)). ' ';
+ }
+ echo '
';
+ echo ''; // end col-xs-9
+
+ echo ''; // end col-xs-3
+
+ $divChangeHidden = !is_null($selected_past_ss) || $isGesperrt ? 'hidden' : '';
+ $divCopyHidden = is_null($selected_past_ss) || $isGesperrt ? 'hidden' : '';
+ $divisGesperrtHidden = $isGesperrt ? '' : 'hidden';
+
+ echo '';
+ echo '
';
+ echo '' . $p->t('zeitwunsch/tragenSieInDiesesNormwochenraster') .' ';
+ echo '
'; // end col
+ echo '
';
+ // BLANK
+ echo '
'; // end col
+ echo '
'; // end divChangeZWG
+
+ echo '';
+ echo '
';
+ echo '' . $p->t('zeitwunsch/kopierenText') .' ';
+ echo '
'; // end col
+
+ $studiensemester = new Studiensemester();
+ $tmp_ss = $selected_ss == $akt_ss->studiensemester_kurzbz ? $studiensemester->getPrevious() : $akt_ss->studiensemester_kurzbz;
+ $studiensemester->load($tmp_ss);
+
+ $zwg = new Zeitwunsch_gueltigkeit();
+ $zwg->getByUID($uid, 4, true, $studiensemester->ende);
+ $past_zwg_arr = $zwg->result;
+ echo '
';
+ echo '';
+ echo '-- '. $p->t("global/bitteWaehlen").' -- ';
+ foreach($past_zwg_arr as $row)
+ {
+ $selected = $row->studiensemester_kurzbz == $selected_past_ss ? 'selected' : '';
+ echo ''. $row->studiensemester_kurzbz. ' ';
+ }
+ echo ' ';
+ echo '
'; // end col
+ echo '
'; // end divCopyZWG
+
+ echo '';
+
+ // Mail Adressen der Studiengaenge, wo Lektor ueber eine LV bereits verplant ist
+ $stgKzOfVerplant_arr = getStgOfVerplant($uid, $selected_ss);
+ $stgMail_arr = getStgMail($stgKzOfVerplant_arr);
+
+ echo '
';
+ echo '
';
+ echo '
';
+ echo '
'. $p->t("zeitwunsch/bearbeitungDeaktiviert"). ': ';
+ echo $p->t("zeitwunsch/bearbeitungDeaktiviertText", array($selected_ss, implode($stgMail_arr, '; '))). '
+
'. $p->t("zeitwunsch/bearbeitungAktivieren"). '
+
'. $p->t("zeitwunsch/kompetenzfeldWirdInformiert") . '
+ ';
+ echo '
'; // end panel heading
+ echo '
'; // end panel
+ echo '
'; // end col
+ echo '
'; // end divisGesperrt
+
+ // Speichern - Button
+ echo '';
+ echo ' ';
+ echo '
';
+
+ echo ''; // end row
+ echo ' ';
+ ?>
+
+
+
+
+
+
t('zeitwunsch/folgendePunkteSindZuBeachten');?>:
+
+ t('zeitwunsch/verwendenSieDenWertNur');?>
+ t('zeitwunsch/sperrenSieNurTermine');?>
+ t('zeitwunsch/esSolltenFuerJedeStunde');?>
+
+
+
+
+
+
+ t('zeitwunsch/wert');?>
+
+ t('zeitwunsch/bedeutung');?>
+
+
+
+
+ 2
+
+ t('zeitwunsch/hierMoechteIchUnterrichten');?>
+
+
+
+ 1
+
+ t('zeitwunsch/hierKannIchUnterrichten');?>
+
+
+
+
+ -1
+
+ t('zeitwunsch/nurInNotfaellen');?>
+
+
+
+ -2
+
+ t('zeitwunsch/hierAufGarKeinenFall');?>
+
+
+
+
+
+
+
+
+
t('zeitsperre/zeitsperren');?>:
+ ";
+ echo $p->t('zeitwunsch/formularZumEintragenDerZeitsperren', array($href));
+ ?>
+
+
+
+
+
+
+
diff --git a/content/lvplanung/stpl-week-overlay.xul.php b/content/lvplanung/stpl-week-overlay.xul.php
index 58d73d47d..0e6c083ce 100644
--- a/content/lvplanung/stpl-week-overlay.xul.php
+++ b/content/lvplanung/stpl-week-overlay.xul.php
@@ -247,6 +247,10 @@ echo '
+
+
+
diff --git a/content/lvplanung/timetable-week.xul.php b/content/lvplanung/timetable-week.xul.php
index 7e3a144dd..fd55b5393 100644
--- a/content/lvplanung/timetable-week.xul.php
+++ b/content/lvplanung/timetable-week.xul.php
@@ -681,12 +681,12 @@ while ($begin<=$ende)
{
$wunsch=new zeitwunsch();
if ($type=='lektor')
- if ($wunsch->loadPerson($pers_uid,$datum))
+ if ($wunsch->loadPerson($pers_uid,montag($datum)))
$zeitwunsch=$wunsch->zeitwunsch;
else
$error_msg.=$wunsch->errormsg;
if ($aktion=='lva_single_search' || $aktion=='lva_multi_search')
- if ($wunsch->loadZwLE($lva_id,$datum))
+ if ($wunsch->loadZwLE($lva_id,montag($datum)))
$zeitwunsch=$wunsch->zeitwunsch;
else
$error_msg.=$wunsch->errormsg;
diff --git a/content/tempusoverlay.js.php b/content/tempusoverlay.js.php
index c8bc787e8..ca37a397c 100644
--- a/content/tempusoverlay.js.php
+++ b/content/tempusoverlay.js.php
@@ -334,6 +334,29 @@ function onLektorSelect(event)
}
}
+function LektorFunktionLoadZeitwunschAdminUrl(){
+
+ var treeLektor = document.getElementById('tree-lektor');
+ var col = treeLektor.columns ? treeLektor.columns["uid"] : "uid";
+ try
+ {
+ var uid = treeLektor.view.getCellText(treeLektor.currentIndex,col);
+ }
+ catch(e)
+ {
+ }
+
+ if (uid == '' || uid == undefined)
+ {
+ alert('LektorIn auswählen, um Zeitwünsche einsehen zu können.');
+ return;
+ }
+ else
+ {
+ window.open('vilesci/personen/zeitwunsch.php?uid=' + uid);
+ }
+}
+
function loadURL(event)
{
var contentFrame = document.getElementById('contentFrame');
diff --git a/content/tempusoverlay.xul.php b/content/tempusoverlay.xul.php
index 0e35d71f0..2e1da8b8b 100644
--- a/content/tempusoverlay.xul.php
+++ b/content/tempusoverlay.xul.php
@@ -186,6 +186,8 @@ echo '