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 = ' + + + + + + + '; + + foreach($uid_arr as $uid) + { + $person = $this->PersonModel->getByUid($uid); + $lektorenTabelle.= ' + + + + + '; + } + + $lektorenTabelle.= '
NameUID
'. getData($person)[0]->vorname. ' '. getData($person)[0]->nachname. '['. $uid. ']
'; + + $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 = ' + + + + + + + '; + + foreach($uid_arr as $uid) + { + $person = $this->PersonModel->getByUid($uid); + $lektorenTabelle.= ' + + + + + '; + } + + $lektorenTabelle.= '
NameUID
'. getData($person)[0]->vorname. ' '. getData($person)[0]->nachname. '['. $uid. ']
'; + + $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 = ' + + + + + + + '; + + foreach($data_arr as $lector) + { + $person = $this->PersonModel->getByUid($lector); + $lektorenTabelle.= ' + + + + + '; + } + + $lektorenTabelle.= '
NameUID
'. getData($person)[0]->vorname. ' '. getData($person)[0]->nachname. '['. $lector. ']
'; + + $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.= ""; 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; +} + ?> <?php echo $p->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 'Zustimmung für '.$akt_ss->studiensemester_kurzbz.': '; + echo ''; + 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 'Zustimmung für '.$next_ss->studiensemester_kurzbz.': '; + echo ''; + 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 ''; - 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 ""; - } + // 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 ''; - 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 '


'; - echo ' -
'.$p->t('global/stunde').'
'.$p->t('global/beginn').'
'.$p->t('global/ende').'
$stunde
$beginn
$ende
'.$tagbez[$lang->index][$j].'

- - - '; + // Tabelle Zeitwunsch-Semesterplan + echo ''; + // Tabelle Kopfzeile + echo ''; + echo ''; + 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 ""; + } + echo ''; + // Tabelle Zellen + for ($j=1; $j<7; $j++) + { + echo ''; + 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 '
'.$p->t('global/stunde').'
'.$p->t('global/beginn').'
'.$p->t('global/ende').'
$stunde
$beginn
$ende
'.$tagbez[$lang->index][$j].'
'; -
+ // 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');?>:

-
    -
  1. t('zeitwunsch/verwendenSieDenWertNur');?>
  2. -
  3. t('zeitwunsch/sperrenSieNurTermine');?>
  4. -
  5. t('zeitwunsch/esSolltenFuerJedeStunde');?>
  6. -
-

t('lvplan/fehlerUndFeedback');?> t('lvplan/lvKoordinationsstelle');?>.

-
-
+ echo '
'; + echo ''.$p->t('zeitwunsch/fuer', array($selected_ss)). ''; + echo ''; + 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 '
'; // 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 ' + + diff --git a/include/globals.inc.php b/include/globals.inc.php index bbe9cf738..da2fda055 100644 --- a/include/globals.inc.php +++ b/include/globals.inc.php @@ -2,13 +2,14 @@ // Hintergrundfarben fuer Tabellen beim Zeitwunsch global $cfgStdBgcolor; $cfgStdBgcolor=array(); - $cfgStdBgcolor[0]="#CC0000"; - $cfgStdBgcolor[1]="#FF2200"; - $cfgStdBgcolor[2]="#FF9922"; - $cfgStdBgcolor[3]="#FFFF55"; - $cfgStdBgcolor[4]="#C0ECC3"; - $cfgStdBgcolor[5]="#48FA66"; - $cfgStdBgcolor[6]="#CCFFCC"; + $cfgStdBgcolor[0]="#CC0000"; // rot + $cfgStdBgcolor[1]="#FF2200"; // hellrot + $cfgStdBgcolor[2]="#FF9922"; // orange + $cfgStdBgcolor[3]="#FFFF55"; // gelb + $cfgStdBgcolor[4]="#C0ECC3"; // hellgrün mittel + $cfgStdBgcolor[5]="#48FA66"; // dunkelgrün mittel + $cfgStdBgcolor[6]="#CCFFCC"; // hellgrün heller + $cfgStdBgcolor[7]="#59b359 "; // dunkelgrün dunkler // Mehrsprachige Wochentage global $tagbez; diff --git a/include/lehreinheit.class.php b/include/lehreinheit.class.php index 23677a6e3..7d407cee4 100644 --- a/include/lehreinheit.class.php +++ b/include/lehreinheit.class.php @@ -681,8 +681,11 @@ class lehreinheit extends basis_db else { $row=$this->db_fetch_object($erg_zs); - $this->errormsg="Kollision (Zeitsperre): $row->zeitsperre_id|$row->mitarbeiter_uid|$row->zeitsperretyp_kurzbz|$row->bezeichnung|$row->vondatum/$row->vonstunde-$row->bisdatum/$row->bisstunde - $row->vertretung_uid"; - return false; + if ($row->zeitsperretyp_kurzbz != 'ZVerfueg') + { + $this->errormsg = "Kollision (Zeitsperre): $row->zeitsperre_id|$row->mitarbeiter_uid|$row->zeitsperretyp_kurzbz|$row->bezeichnung|$row->vondatum/$row->vonstunde-$row->bisdatum/$row->bisstunde - $row->vertretung_uid"; + return false; + } } } return true; diff --git a/include/lehrstunde.class.php b/include/lehrstunde.class.php index 71dbf3319..e2bba04e6 100644 --- a/include/lehrstunde.class.php +++ b/include/lehrstunde.class.php @@ -34,6 +34,8 @@ require_once(dirname(__FILE__).'/variable.class.php'); class lehrstunde extends basis_db { + public $result = array(); + public $stundenplan_id; /// @brief ID in der Datenbank public $lehreinheit_id; /// @brief id der Lehreinheit in der DB public $unr; // @brief Unterrichtsnummer @@ -876,8 +878,12 @@ class lehrstunde extends basis_db if ($anz_zs!=0) { $row = $this->db_fetch_object($erg_zs); - $this->errormsg="Kollision (Zeitsperre): $row->zeitsperre_id|$row->lektor|$row->zeitsperretyp_kurzbz - $row->vondatum/$row->vonstunde|$row->bisdatum/$row->bisstunde"; - return true; + + if ($row->zeitsperretyp_kurzbz != 'ZVerfueg') + { + $this->errormsg="Kollision (Zeitsperre): $row->zeitsperre_id|$row->lektor|$row->zeitsperretyp_kurzbz - $row->vondatum/$row->vonstunde|$row->bisdatum/$row->bisstunde"; + return true; + } } return false; } @@ -1060,7 +1066,19 @@ class lehrstunde extends basis_db return $result; } - public function getStundenplanData($db_stpl_table, $lehrveranstaltung_id=null, $studiensemester_kurzbz=null, $lehreinheit_id=null, $mitarbeiter_uid=null, $student_uid=null) + /** + * Holt Studenplandaten. + * + * @param $db_stpl_table + * @param null $lehrveranstaltung_id + * @param null $studiensemester_kurzbz + * @param null $lehreinheit_id + * @param null $mitarbeiter_uid + * @param null $student_uid + * @param false $nurBevorstehende Wenn true, dann werden nur bevorstehende LVs abgefragt. + * @return bool + */ + public function getStundenplanData($db_stpl_table, $lehrveranstaltung_id=null, $studiensemester_kurzbz=null, $lehreinheit_id=null, $mitarbeiter_uid=null, $student_uid=null, $nurBevorstehende = false) { $qry = "SELECT @@ -1112,6 +1130,11 @@ class lehrstunde extends basis_db else return false; + if($nurBevorstehende) + { + $qry.= " AND 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"; @@ -1136,7 +1159,10 @@ class lehrstunde extends basis_db return true; } else + { + $this->errormsg = 'Fehler beim Einholen der Stundenplandaten'; return false; + } } } diff --git a/include/wochenplan.class.php b/include/wochenplan.class.php index 29b4db23f..0ac59a9ff 100644 --- a/include/wochenplan.class.php +++ b/include/wochenplan.class.php @@ -1235,7 +1235,9 @@ class wochenplan extends basis_db if (isset($wunsch[$i][$j])) { $index=$wunsch[$i][$j]; - if ($index==-3) + + // Negative und positive Zeitsperren beruecksichtigen + if ($index==-3 || $index == 4) { //Wenn eine Zeitsperre eingetragen ist, dann diese im Tooltiptext anzeigen $zeitsperre = new zeitsperre(); diff --git a/include/zeitsperre.class.php b/include/zeitsperre.class.php index 57d2ba09a..0e737eaf0 100644 --- a/include/zeitsperre.class.php +++ b/include/zeitsperre.class.php @@ -537,5 +537,60 @@ class zeitsperre extends basis_db return $this->bisdatum; } + + /** + * Liefert die Zeitsperren eines Users innerhalb einer bestimmten Zeitspanne. + * Einschränkung nach Zeitsperrentyp möglich. + * + * @param $uid + * @param $von string Datum im Format YYYY-MM-DD + * @param $bis string Datum im Format YYYY-MM-DD + * @param null $zeitsperretyp_kurzbz + * @return bool + */ + public function getVonBis($uid, $von, $bis, $zeitsperretyp_kurzbz = null) + { + $qry = ' + SELECT + zeitsperre_id, zeitsperretyp_kurzbz, vondatum, vonstunde, bisdatum, bisstunde + FROM + campus.tbl_zeitsperre + LEFT JOIN campus.tbl_zeitsperretyp USING (zeitsperretyp_kurzbz) + WHERE + mitarbeiter_uid = '. $this->db_add_param($uid). ' + AND ( + (vondatum BETWEEN '.$this->db_add_param($von).' AND '.$this->db_add_param($bis).') + OR + (bisdatum BETWEEN '.$this->db_add_param($von).' AND '.$this->db_add_param($bis).') + )'; + + if (!is_null($zeitsperretyp_kurzbz)) + { + $qry.= ' + AND zeitsperretyp_kurzbz = '. $this->db_add_param($zeitsperretyp_kurzbz); + } + + if (!$this->db_query($qry)) + { + $this->errormsg=$this->db_last_error(); + return false; + } + else + { + while($row = $this->db_fetch_object()) + { + $obj = new stdClass(); + $obj->zeitsperre_id = $row->zeitsperre_id; + $obj->zeitsperretyp_kurzbz = $row->zeitsperretyp_kurzbz; + $obj->vondatum = $row->vondatum; + $obj->vonstunde = $row->vonstunde; + $obj->bisdatum = $row->bisdatum; + $obj->bisstunde = $row->bisstunde; + + $this->result[]= $obj; + } + return true; + } + } } ?> diff --git a/include/zeitwunsch.class.php b/include/zeitwunsch.class.php index ca15fdb4d..a8c90f09c 100644 --- a/include/zeitwunsch.class.php +++ b/include/zeitwunsch.class.php @@ -1,374 +1,454 @@ -, - * Andreas Oesterreicher and - * Rudolf Hangl . - */ -require_once(dirname(__FILE__).'/basis_db.class.php'); - -class zeitwunsch extends basis_db -{ - public $new; // boolean - public $zeitwunsch; - - //Tabellenspalten - public $stunde; // smalint - public $mitarbeiter_uid; // varchar(32) - public $tag; // smalint - public $gewicht; // smalint - public $min_stunde; - public $max_stunde; - public $insertamum; - public $insertvon; - public $updateamum; - public $updatevon; - - /** - * Konstruktor - */ - public function __construct() - { - parent::__construct(); - - $this->init(); - } - - /** - * Initialisierung - * - */ - private function init() - { - // Stundenraster abfragen - $sql='SELECT min(stunde) AS min_stunde,max(stunde) AS max_stunde FROM lehre.tbl_stunde;'; - if(!$this->db_query($sql)) - { - $this->errormsg=$this->db_last_error(); - return false; - } - else - { - $row=$this->db_fetch_object(); - $this->min_stunde=$row->min_stunde; - $this->max_stunde=$row->max_stunde; - } - return true; - } - - /** - * Prueft die Variablen vor dem Speichern - * auf Gueltigkeit. - * @return true wenn ok, false im Fehlerfall - */ - protected function validate() - { - if(mb_strlen($this->mitarbeiter_uid)>32) - { - $this->errormsg = 'UID darf nicht laenger als 32 Zeichen sein.'; - return false; - } - if($this->mitarbeiter_uid == '') - { - $this->errormsg = 'UID muss angegeben werden'; - return false; - } - if(!is_numeric($this->stunde)) - { - $this->errormsg = 'Stunde muss eine gueltige Zahl sein'; - return false; - } - if(!is_numeric($this->gewicht)) - { - $this->errormsg = 'Gewicht muss eine gueltige Zahl sein'; - return false; - } - if(!is_numeric($this->tag)) - { - $this->errormsg = 'Tag muss eine gueltige Zahl sein'; - return false; - } - - return true; - } - - /** - * Speichert einen Zeitwunsch in die Datenbank - * Wenn $new auf true gesetzt ist wird ein neuer Datensatz - * angelegt, ansonsten der Datensatz upgedated - * @return true wenn erfolgreich, false im Fehlerfall - */ - public function save() - { - //Variablen auf Gueltigkeit pruefen - if(!$this->validate()) - return false; - - if($this->new) - { - $qry = 'INSERT INTO campus.tbl_zeitwunsch (mitarbeiter_uid, tag, stunde, gewicht, - insertamum, insertvon, updateamum, updatevon) VALUES('. - $this->db_add_param($this->mitarbeiter_uid).','. - $this->db_add_param($this->tag, FHC_INTEGER).','. - $this->db_add_param($this->stunde, FHC_INTEGER).','. - $this->db_add_param($this->gewicht, FHC_INTEGER).','. - $this->db_add_param($this->insertamum).','. - $this->db_add_param($this->insertvon).','. - $this->db_add_param($this->updateamum).','. - $this->db_add_param($this->updatevon).');'; - } - else - { - $qry = 'UPDATE campus.tbl_zeitwunsch SET'. - ' gewicht='.$this->db_add_param($this->gewicht, FHC_INTEGER).', '. - ' updateamum='.$this->db_add_param($this->updateamum).', '. - ' updatevon='.$this->db_add_param($this->updatevon). - " WHERE - mitarbeiter_uid=".$this->db_add_param($this->mitarbeiter_uid, FHC_STRING, false)." - AND tag=".$this->db_add_param($this->tag, FHC_INTEGER)." - AND stunde=".$this->db_add_param($this->stunde, FHC_INTEGER); - } - - if($this->db_query($qry)) - { - return true; - } - else - { - $this->errormsg = 'Fehler beim Speichern des Zeitwunsches'; - return false; - } - } - - /** - * Zeitwunsch einer Person laden - * @param uid - * @param datum - * @return boolean Ergebnis steht in Array $zeitwunsch wenn true - */ - public function loadPerson($uid,$datum=null) - { - // Zeitwuensche abfragen - if(!$this->db_query("SELECT * FROM campus.tbl_zeitwunsch WHERE mitarbeiter_uid=".$this->db_add_param($uid))) - { - $this->errormsg = $this->db_last_error(); - return false; - } - else - { - while ($row = $this->db_fetch_object()) - { - $this->zeitwunsch[$row->tag][$row->stunde]=$row->gewicht; - $this->insertamum = $row->insertamum; - $this->insertvon = $row->insertvon; - $this->updateamum = $row->updateamum; - $this->updatevon = $row->updatevon; - } - } - - if (!is_null($datum)) - { - $beginn=montag($datum); - $start=date('Y-m-d',$beginn); - $ende=date('Y-m-d',jump_day($beginn,7)); - - // Zeitsperren abfragen - $sql=" - SELECT - vondatum,vonstunde,bisdatum,bisstunde - FROM - campus.tbl_zeitsperre - WHERE - mitarbeiter_uid=".$this->db_add_param($uid)." - AND vondatum<=".$this->db_add_param($ende)." - AND bisdatum>=".$this->db_add_param($start); - - if(!$this->db_query($sql)) - { - $this->errormsg=$this->db_last_error(); - return false; - } - else - { - while($row = $this->db_fetch_object()) - { - $beginn=montag($datum); - for ($i=1;$i<=7;$i++) - { - $date_iso=date('Y-m-d',$beginn); - //echo "\n".$date_iso."\n".$row->vondatum."\n"; - if ($date_iso>$row->vondatum && $date_iso<$row->bisdatum) - for ($j=$this->min_stunde;$j<=$this->max_stunde;$j++) - $this->zeitwunsch[$i][$j]=-3; - if ($date_iso==$row->vondatum && $date_iso<$row->bisdatum) - { - if (is_null($row->vonstunde)) - $row->vonstunde=$this->min_stunde; - for ($j=$row->vonstunde;$j<=$this->max_stunde;$j++) - $this->zeitwunsch[$i][$j]=-3; - } - if ($date_iso>$row->vondatum && $date_iso==$row->bisdatum) - { - if (is_null($row->bisstunde)) - $row->bisstunde=$this->max_stunde; - for ($j=$this->min_stunde;$j<=$row->bisstunde;$j++) - $this->zeitwunsch[$i][$j]=-3; - } - if ($date_iso==$row->vondatum && $date_iso==$row->bisdatum) - { - if (is_null($row->vonstunde)) - $row->vonstunde=$this->min_stunde; - if (is_null($row->bisstunde)) - $row->bisstunde=$this->max_stunde; - for ($j=$row->vonstunde;$j<=$row->bisstunde;$j++) - $this->zeitwunsch[$i][$j]=-3; - } - $beginn=jump_day($beginn,1); - } - } - } - } - return true; - } - - - /** - * Zeitwunsch der Personen in Lehreinheiten laden - * @param $le_id LehreinheitID Array - * @param $datum - * @return true oder false - */ - public function loadZwLE($le_id,$datum=null) - { - //$this->init(); - // SUB-Select fuer LVAs - $sql_query_leid=''; - $sql_query_le='SELECT DISTINCT mitarbeiter_uid FROM campus.vw_lehreinheit WHERE '; - for ($i=0;$idb_add_param($le_id[$i], FHC_INTEGER); - $sql_query_leid=mb_substr($sql_query_leid,3); - $sql_query_le.=$sql_query_leid; - - // Schlechteste Zeitwuensche holen - $sql_query='SELECT tag,stunde,min(gewicht) AS gewicht - FROM campus.tbl_zeitwunsch WHERE mitarbeiter_uid IN ('.$sql_query_le.') GROUP BY tag,stunde'; - - // Zeitwuensche abfragen - if(!$this->db_query($sql_query)) - { - $this->errormsg = $this->db_last_error(); - return false; - } - else - while($row = $this->db_fetch_object()) - $this->zeitwunsch[$row->tag][$row->stunde]=$row->gewicht; - - // *********************************************************** - // Zeitsperren fuer die aktuelle Woche holen - - if (!is_null($datum)) - { - $beginn=montag($datum); - $start=date('Y-m-d',$beginn); - $ende=date('Y-m-d',jump_day($beginn,7)); - - // Zeitsperren abfragen - $sql=" - SELECT - vondatum,vonstunde,bisdatum,bisstunde - FROM - campus.tbl_zeitsperre - WHERE - mitarbeiter_uid IN ($sql_query_le) - AND vondatum<=".$this->db_add_param($ende)." - AND bisdatum>=".$this->db_add_param($start); - - if(!$this->db_query($sql)) - { - $this->errormsg = $this->db_last_error(); - return false; - } - while($row = $this->db_fetch_object()) - { - $beginn=montag($datum); - for ($i=1;$i<=7;$i++) - { - $date_iso=date('Y-m-d',$beginn); - //echo "\n".$date_iso."\n".$row->vondatum."\n"; - if ($date_iso>$row->vondatum && $date_iso<$row->bisdatum) - for ($j=$this->min_stunde;$j<=$this->max_stunde;$j++) - $this->zeitwunsch[$i][$j]=-3; - if ($date_iso==$row->vondatum && $date_iso<$row->bisdatum) - { - if (is_null($row->vonstunde)) - $row->vonstunde=$this->min_stunde; - for ($j=$row->vonstunde;$j<=$this->max_stunde;$j++) - $this->zeitwunsch[$i][$j]=-3; - } - if ($date_iso>$row->vondatum && $date_iso==$row->bisdatum) - { - if (is_null($row->bisstunde)) - $row->bisstunde=$this->max_stunde; - for ($j=$this->min_stunde;$j<=$row->bisstunde;$j++) - $this->zeitwunsch[$i][$j]=-3; - } - if ($date_iso==$row->vondatum && $date_iso==$row->bisdatum) - { - if (is_null($row->vonstunde)) - $row->vonstunde=$this->min_stunde; - if (is_null($row->bisstunde)) - $row->bisstunde=$this->max_stunde; - for ($j=$row->vonstunde;$j<=$row->bisstunde;$j++) - $this->zeitwunsch[$i][$j]=-3; - } - $beginn=jump_day($beginn,1); - } - } - } - return true; - } - - /** - * Prueft ob bereits ein Zeitwunsch eingetragen ist - * - * @param $uid - * @param $stunde - * @param $tag - * @return true wenn vorhanden sonst false - */ - function exists($uid, $stunde, $tag) - { - $qry = "SELECT 1 FROM campus.tbl_zeitwunsch - WHERE - mitarbeiter_uid=".$this->db_add_param($uid)." - AND stunde=".$this->db_add_param($stunde, FHC_INTEGER)." - AND tag=".$this->db_add_param($tag, FHC_INTEGER); - if($this->db_query($qry)) - { - if($this->db_num_rows()>0) - return true; - else - return false; - } - else - { - $this->errormsg='Fehler beim Abfragen des Zeitwunsches'; - return false; - } - } -} -?> \ No newline at end of file +, + * Andreas Oesterreicher and + * Rudolf Hangl . + */ +require_once(dirname(__FILE__).'/basis_db.class.php'); + +class zeitwunsch extends basis_db +{ + public $new; // boolean + public $zeitwunsch; + + //Tabellenspalten + public $stunde; // smalint + public $mitarbeiter_uid; // varchar(32) + public $tag; // smalint + public $gewicht; // smalint + public $min_stunde; + public $max_stunde; + public $insertamum; + public $insertvon; + public $updateamum; + public $updatevon; + public $zeitwunsch_id; + public $zeitwunsch_gueltigkeit_id; + + /** + * Konstruktor + */ + public function __construct() + { + parent::__construct(); + + $this->init(); + } + + /** + * Initialisierung + * + */ + private function init() + { + // Stundenraster abfragen + $sql='SELECT min(stunde) AS min_stunde,max(stunde) AS max_stunde FROM lehre.tbl_stunde;'; + if(!$this->db_query($sql)) + { + $this->errormsg=$this->db_last_error(); + return false; + } + else + { + $row=$this->db_fetch_object(); + $this->min_stunde=$row->min_stunde; + $this->max_stunde=$row->max_stunde; + } + return true; + } + + /** + * Prueft die Variablen vor dem Speichern + * auf Gueltigkeit. + * @return true wenn ok, false im Fehlerfall + */ + protected function validate() + { + if(mb_strlen($this->mitarbeiter_uid)>32) + { + $this->errormsg = 'UID darf nicht laenger als 32 Zeichen sein.'; + return false; + } + if($this->mitarbeiter_uid == '') + { + $this->errormsg = 'UID muss angegeben werden'; + return false; + } + if(!is_numeric($this->stunde)) + { + $this->errormsg = 'Stunde muss eine gueltige Zahl sein'; + return false; + } + if(!is_numeric($this->gewicht)) + { + $this->errormsg = 'Gewicht muss eine gueltige Zahl sein'; + return false; + } + if(!is_numeric($this->tag)) + { + $this->errormsg = 'Tag muss eine gueltige Zahl sein'; + return false; + } + + return true; + } + + /** + * Speichert einen Zeitwunsch in die Datenbank + * Wenn $new auf true gesetzt ist wird ein neuer Datensatz + * angelegt, ansonsten der Datensatz upgedated + * @return true wenn erfolgreich, false im Fehlerfall + */ + public function save() + { + //Variablen auf Gueltigkeit pruefen + if(!$this->validate()) + return false; + + if($this->new) + { + $qry = 'INSERT INTO campus.tbl_zeitwunsch (mitarbeiter_uid, tag, stunde, gewicht, + insertamum, insertvon, updateamum, updatevon, zeitwunsch_gueltigkeit_id) VALUES('. + $this->db_add_param($this->mitarbeiter_uid).','. + $this->db_add_param($this->tag, FHC_INTEGER).','. + $this->db_add_param($this->stunde, FHC_INTEGER).','. + $this->db_add_param($this->gewicht, FHC_INTEGER).','. + $this->db_add_param($this->insertamum).','. + $this->db_add_param($this->insertvon).','. + $this->db_add_param($this->updateamum).','. + $this->db_add_param($this->updatevon).','. + $this->db_add_param($this->zeitwunsch_gueltigkeit_id).');'; + } + else + { + $qry = 'UPDATE campus.tbl_zeitwunsch SET'. + ' gewicht='.$this->db_add_param($this->gewicht, FHC_INTEGER).', '. + ' updateamum='.$this->db_add_param($this->updateamum).', '. + ' updatevon='.$this->db_add_param($this->updatevon). + " WHERE + mitarbeiter_uid=".$this->db_add_param($this->mitarbeiter_uid, FHC_STRING, false)." + AND tag=".$this->db_add_param($this->tag, FHC_INTEGER)." + AND stunde=".$this->db_add_param($this->stunde, FHC_INTEGER). " + AND zeitwunsch_gueltigkeit_id=".$this->db_add_param($this->zeitwunsch_gueltigkeit_id, FHC_INTEGER); + } + + if($this->db_query($qry)) + { + return true; + } + else + { + $this->errormsg = 'Fehler beim Speichern des Zeitwunsches'; + return false; + } + } + + /** + * Zeitwunsch einer Person zu bestimmter Zeitwunschgueltigkeit laden + * @param $uid + * @param $zeitwunsch_gueltigkeit_id + * @return boolean + */ + public function loadByZWG($uid, $zeitwunsch_gueltigkeit_id) + { + $qry = ' + SELECT * + FROM campus.tbl_zeitwunsch + JOIN campus.tbl_zeitwunsch_gueltigkeit zwg USING (zeitwunsch_gueltigkeit_id) + WHERE zwg.mitarbeiter_uid = ' . $this->db_add_param($uid) . ' + AND zeitwunsch_gueltigkeit_id = ' . $this->db_add_param($zeitwunsch_gueltigkeit_id) . ' + ORDER BY tag, stunde + '; + + if ($this->db_query($qry)) + { + while ($row = $this->db_fetch_object()) + { + $this->zeitwunsch[$row->tag][$row->stunde] = $row->gewicht; + $this->insertamum = $row->insertamum; + $this->insertvon = $row->insertvon; + $this->updateamum = $row->updateamum; + $this->updatevon = $row->updatevon; + $this->zeitwunsch_id = $row->zeitwunsch_id; + $this->zeitwunsch_gueltigkeit_id = $row->zeitwunsch_gueltigkeit_id; + } + return true; + } + else + { + $this->errormsg = $this->db_last_error(); + return false; + } + } + + /** + * Alle Zeitwuensche einer Person laden. + * Um auf einen Zeitwunsch einer bestimmten Zeit, also innerhalb einer bestimmten Zeitwunschgueltigkeit + * zu beschraenken, kann ein Datum mitgegeben werden. + * @param uid + * @param datum UNIX timestamp, um Zeitwunsch mit richtiger Zeitwunschgueltigkeit zu ermitteln + * @return boolean Ergebnis steht in Array $zeitwunsch wenn true + */ + public function loadPerson($uid,$datum=null) + { + // Default datum: jetzt + if (is_null($datum)) + { + $datum = time(); + } + + $qry = " + SELECT * + FROM campus.tbl_zeitwunsch + JOIN campus.tbl_zeitwunsch_gueltigkeit zwg USING (zeitwunsch_gueltigkeit_id) + WHERE zwg.mitarbeiter_uid=". $this->db_add_param($uid). " + AND ". $this->db_add_param(date('Y-m-d', $datum)). " BETWEEN von AND COALESCE(bis,'2999-01-01'); + "; + + + // Zeitwuensche abfragen + if(!$this->db_query($qry)) + { + $this->errormsg = $this->db_last_error(); + return false; + } + else + { + while ($row = $this->db_fetch_object()) + { + $this->zeitwunsch[$row->tag][$row->stunde]=$row->gewicht; + $this->insertamum = $row->insertamum; + $this->insertvon = $row->insertvon; + $this->updateamum = $row->updateamum; + $this->updatevon = $row->updatevon; + $this->zeitwunsch_id = $row->zeitwunsch_id; + $this->zeitwunsch_gueltigkeit_id = $row->zeitwunsch_gueltigkeit_id; + } + } + + if (!is_null($datum)) + { + $beginn=montag($datum); + $start=date('Y-m-d',$beginn); + $ende=date('Y-m-d',jump_day($beginn,7)); + + // Zeitsperren abfragen + $sql=" + SELECT + zeitsperretyp_kurzbz, vondatum,vonstunde,bisdatum,bisstunde + FROM + campus.tbl_zeitsperre + WHERE + mitarbeiter_uid=".$this->db_add_param($uid)." + AND vondatum<=".$this->db_add_param($ende)." + AND bisdatum>=".$this->db_add_param($start). " + -- Negative Zeitsperren sollen im Plan eine positive Zeitsperre 'ZVerfueg' overrulen + ORDER BY + CASE + WHEN zeitsperretyp_kurzbz = 'ZVerfueg' THEN 1 + ELSE 2 + END;"; + + if(!$this->db_query($sql)) + { + $this->errormsg=$this->db_last_error(); + return false; + } + else + { + // Zeitsperren negativ (-3) gewichten. + // Ausnahme: positive Zeitsperren: diese positiv (4) gewichten. + while($row = $this->db_fetch_object()) + { + $beginn=montag($datum); + for ($i=1;$i<=7;$i++) + { + $date_iso=date('Y-m-d',$beginn); + //echo "\n".$date_iso."\n".$row->vondatum."\n"; + if ($date_iso>$row->vondatum && $date_iso<$row->bisdatum) + for ($j=$this->min_stunde;$j<=$this->max_stunde;$j++) + $this->zeitwunsch[$i][$j] = $row->zeitsperretyp_kurzbz == 'ZVerfueg' ? 4 : -3; + + if ($date_iso==$row->vondatum && $date_iso<$row->bisdatum) + { + if (is_null($row->vonstunde)) + $row->vonstunde=$this->min_stunde; + for ($j=$row->vonstunde;$j<=$this->max_stunde;$j++) + $this->zeitwunsch[$i][$j] = $row->zeitsperretyp_kurzbz == 'ZVerfueg' ? 4 : -3; + } + if ($date_iso>$row->vondatum && $date_iso==$row->bisdatum) + { + if (is_null($row->bisstunde)) + $row->bisstunde=$this->max_stunde; + for ($j=$this->min_stunde;$j<=$row->bisstunde;$j++) + $this->zeitwunsch[$i][$j] = $row->zeitsperretyp_kurzbz == 'ZVerfueg' ? 4 : -3; + } + if ($date_iso==$row->vondatum && $date_iso==$row->bisdatum) + { + if (is_null($row->vonstunde)) + $row->vonstunde=$this->min_stunde; + if (is_null($row->bisstunde)) + $row->bisstunde=$this->max_stunde; + for ($j=$row->vonstunde;$j<=$row->bisstunde;$j++) + $this->zeitwunsch[$i][$j] = $row->zeitsperretyp_kurzbz == 'ZVerfueg' ? 4 : -3; + } + $beginn=jump_day($beginn,1); + } + } + } + } + return true; + } + + /** + * Zeitwunsch der Personen in Lehreinheiten laden + * @param $le_id LehreinheitID Array + * @param $datum UNIX timestamp Datum, um Zeitwunsch mit richtiger Zeitwunschgueltigkeit zu ermitteln + * @return true oder false + */ + public function loadZwLE($le_id, $datum = null) + { + // Default datum: jetzt + if (is_null($datum)) + { + $datum = time(); + } + // SUB-Select fuer LVAs + $sql_query_leid=''; + $sql_query_le='SELECT DISTINCT mitarbeiter_uid FROM campus.vw_lehreinheit WHERE '; + for ($i=0;$idb_add_param($le_id[$i], FHC_INTEGER); + $sql_query_leid=mb_substr($sql_query_leid,3); + $sql_query_le.=$sql_query_leid; + + // Schlechteste Zeitwuensche holen + $sql_query='SELECT tag,stunde,min(gewicht) AS gewicht + FROM campus.tbl_zeitwunsch + JOIN campus.tbl_zeitwunsch_gueltigkeit zwg USING (zeitwunsch_gueltigkeit_id) + WHERE zwg.mitarbeiter_uid IN ('.$sql_query_le.') + AND '. $this->db_add_param(date('Y-m-d', $datum)). ' BETWEEN von AND COALESCE(bis,\'2999-01-01\') + GROUP BY tag,stunde;'; + + // Zeitwuensche abfragen + if(!$this->db_query($sql_query)) + { + $this->errormsg = $this->db_last_error(); + return false; + } + else + while($row = $this->db_fetch_object()) + $this->zeitwunsch[$row->tag][$row->stunde]=$row->gewicht; + + // *********************************************************** + // Zeitsperren fuer die aktuelle Woche holen + + if (!is_null($datum)) + { + $beginn=montag($datum); + $start=date('Y-m-d',$beginn); + $ende=date('Y-m-d',jump_day($beginn,7)); + + // Zeitsperren abfragen + $sql=" + SELECT + zeitsperretyp_kurzbz, vondatum,vonstunde,bisdatum,bisstunde + FROM + campus.tbl_zeitsperre + WHERE + mitarbeiter_uid IN ($sql_query_le) + AND vondatum<=".$this->db_add_param($ende)." + AND bisdatum>=".$this->db_add_param($start); + + if(!$this->db_query($sql)) + { + $this->errormsg = $this->db_last_error(); + return false; + } + while($row = $this->db_fetch_object()) + { + $beginn=montag($datum); + for ($i=1;$i<=7;$i++) + { + $date_iso=date('Y-m-d',$beginn); + //echo "\n".$date_iso."\n".$row->vondatum."\n"; + if ($date_iso>$row->vondatum && $date_iso<$row->bisdatum) + for ($j=$this->min_stunde;$j<=$this->max_stunde;$j++) + $this->zeitwunsch[$i][$j]= $row->zeitsperretyp_kurzbz == 'ZVerfueg' ? 4 : -3; + if ($date_iso==$row->vondatum && $date_iso<$row->bisdatum) + { + if (is_null($row->vonstunde)) + $row->vonstunde=$this->min_stunde; + for ($j=$row->vonstunde;$j<=$this->max_stunde;$j++) + $this->zeitwunsch[$i][$j]= $row->zeitsperretyp_kurzbz == 'ZVerfueg' ? 4 : -3; + } + if ($date_iso>$row->vondatum && $date_iso==$row->bisdatum) + { + if (is_null($row->bisstunde)) + $row->bisstunde=$this->max_stunde; + for ($j=$this->min_stunde;$j<=$row->bisstunde;$j++) + $this->zeitwunsch[$i][$j]= $row->zeitsperretyp_kurzbz == 'ZVerfueg' ? 4 : -3; + } + if ($date_iso==$row->vondatum && $date_iso==$row->bisdatum) + { + if (is_null($row->vonstunde)) + $row->vonstunde=$this->min_stunde; + if (is_null($row->bisstunde)) + $row->bisstunde=$this->max_stunde; + for ($j=$row->vonstunde;$j<=$row->bisstunde;$j++) + $this->zeitwunsch[$i][$j]= $row->zeitsperretyp_kurzbz == 'ZVerfueg' ? 4 : -3; + } + $beginn=jump_day($beginn,1); + } + } + } + return true; + } + + /** + * Prueft ob bereits ein Zeitwunsch eingetragen ist + * + * @param $uid + * @param $zwg_id + * @param $stunde + * @param $tag + * @return true wenn vorhanden sonst false + */ + function exists($uid, $zwg_id, $stunde, $tag) + { + $qry = "SELECT 1 FROM campus.tbl_zeitwunsch + WHERE + mitarbeiter_uid=".$this->db_add_param($uid)." + AND stunde=".$this->db_add_param($stunde, FHC_INTEGER)." + AND tag=".$this->db_add_param($tag, FHC_INTEGER). " + AND zeitwunsch_gueltigkeit_id = ".$this->db_add_param($zwg_id, FHC_INTEGER); + if($this->db_query($qry)) + { + if($this->db_num_rows()>0) + return true; + else + return false; + } + else + { + $this->errormsg='Fehler beim Abfragen des Zeitwunsches'; + return false; + } + } +} + +?> diff --git a/include/zeitwunsch_gueltigkeit.class.php b/include/zeitwunsch_gueltigkeit.class.php new file mode 100644 index 000000000..b39027987 --- /dev/null +++ b/include/zeitwunsch_gueltigkeit.class.php @@ -0,0 +1,271 @@ +load($zeitwunsch_gueltigkeit_id); + } + } + + /** + * Ladet eine Zeitwunschgueltigkeit. + * @param $zeitwunsch_gueltigkeit_id + * @return bool + */ + public function load($zeitwunsch_gueltigkeit_id) + { + if (!is_numeric($zeitwunsch_gueltigkeit_id)) + { + $this->errormsg = 'Wrong parameter zeitwunsch_gueltigkeit_id.'; + return false; + } + + $qry = ' + SELECT *, studiensemester_kurzbz, start, ende + FROM campus.tbl_zeitwunsch_gueltigkeit, public.tbl_studiensemester + WHERE zeitwunsch_gueltigkeit_id = '.$this->db_add_param($zeitwunsch_gueltigkeit_id). ' + AND (von < ende AND COALESCE(bis, \'2999-12-31\'::date ) > start) + ORDER BY start ASC + LIMIT 1 + '; + + if ($result = $this->db_query($qry)) + { + while ($row = $this->db_fetch_object($result)) + { + $this->zeitwunsch_gueltigkeit_id = $row->zeitwunsch_gueltigkeit_id; + $this->von = $row->von; + $this->bis = $row->bis; + $this->insertamum = $row->insertamum; + $this->insertvon = $row->insertvon; + $this->updateamum = $row->updateamum; + $this->updatevon = $row->updatevon; + $this->studiensemester_kurzbz = $row->studiensemester_kurzbz; + $this->start = $row->start; + $this->ende = $row->ende; + } + return true; + } + else + { + $this->errormsg = 'Fehler bei der Datenbankabfrage'; + return false; + } + + } + + /** + * Speichert eine Zeitwunschgueltigkeit + */ + public function save() + { + if($this->new) + { + $qry = ' + INSERT INTO campus.tbl_zeitwunsch_gueltigkeit (mitarbeiter_uid, von, bis, insertvon) + VALUES ('. + $this->db_add_param($this->mitarbeiter_uid).', '. + $this->db_add_param($this->von).', '. + $this->db_add_param($this->bis).', '. + $this->db_add_param($this->insertvon). ') + RETURNING zeitwunsch_gueltigkeit_id; + '; + } + else + { + $qry = ' + UPDATE campus.tbl_zeitwunsch_gueltigkeit SET'. + ' bis = '. $this->db_add_param($this->bis). ', '. + ' updateamum = NOW(), '. + ' updatevon = '.$this->db_add_param($this->updatevon). + ' WHERE zeitwunsch_gueltigkeit_id = ' .$this->db_add_param($this->zeitwunsch_gueltigkeit_id, FHC_INTEGER); + + } + + if($result = $this->db_query($qry)) + { + // Wenn neuer Eintrag + if ($this->new) + { + if($row = $this->db_fetch_object($result)) + { + // ZWG ID des neuen ZWG Eintrags zurueckgeben + $this->zeitwunsch_gueltigkeit_id = $row->zeitwunsch_gueltigkeit_id; + } + } + return true; + } + else + { + $this->errormsg = 'Fehler beim Speichern der Zeitwunschgueltigkeit'; + return false; + } + } + + /** + * Ladet Zeitwunschgueltigkeiten einer UID mitsamt den zugehoerigen Studiensemestern. + * @param $uid + * @param numeric $limit limit = null liefert alle ZWG; limit = 1 liefert die letztgueltige Zeitwunsch-Gueltigkeit. + * @param bool $activeOnly Wenn während des laufenden Semesters der Zeitwunsch geaendert werden, werden mehrere ZWG im Semester hinterlegt. + * true liefert pro Studiensemester nur die letztgueltigen ZWG; + * false liefert alle ZWG pro Studiensemester + * @param string $bis string date, z.B. 2022-01-31 + * @return bool + */ + public function getByUID($uid, $limit = null, $activeOnly = true, $bis = null) + { + $qry = ' + WITH basic_select AS ( + SELECT *, + row_number() over (PARTITION BY studiensemester_kurzbz ORDER BY von DESC) r + FROM campus.tbl_zeitwunsch_gueltigkeit, public.tbl_studiensemester + WHERE mitarbeiter_uid = ' . $this->db_add_param($uid); + + // Wenn Bis-Datum angegeben + if (!is_null($bis)) + { + // Zeitwuensche nur bis zum angegebenen Bis-Datum + $qry.= ' + AND (von < ende AND '. $this->db_add_param($bis). '::date > start)) + '; + } + // Wenn kein Bis-Datum angegeben ist + else + { + // Zeitwuensche bis zum Semesterende des chronologisch letzten Zeitwunsches (also der ZWG, wo bis NULL ist) + $qry.= ' + AND (von < ende AND COALESCE(bis, (SELECT ende FROM public.tbl_studiensemester WHERE von BETWEEN start AND ende)) > start))'; + } + + $qry.= ' + SELECT * + FROM basic_select + '; + + // Wenn nur aktive Zeitwunschgueltigkeiten angezeigt werden sollen + if ($activeOnly) + { + $qry.= ' WHERE r = 1'; + } + + $qry.= ' ORDER BY von DESC, start DESC'; + + // Wenn Limit angegeben + if (!is_null($limit)) + { + $qry.= ' LIMIT '.$this->db_add_param($limit); + } + + if ($result = $this->db_query($qry)) + { + $this->result = array(); + + while ($row = $this->db_fetch_object($result)) + { + $obj = new StdClass(); + $obj->zeitwunsch_gueltigkeit_id = $row->zeitwunsch_gueltigkeit_id; + $obj->von = $row->von; + $obj->bis = $row->bis; + $obj->studiensemester_kurzbz = $row->studiensemester_kurzbz; + $obj->start = $row->start; + $obj->ende = $row->ende; + $obj->insertamum = $row->insertamum; + $obj->insertvon = $row->insertvon; + $obj->updateamum = $row->updateamum; + $obj->updatevon = $row->updatevon; + + $this->result[]= $obj; + } + return true; + } + else + { + $this->errormsg = 'Fehler bei der Datenbankabfrage'; + return false; + } + } + + /** + * Ladet Zeitwunschgueltigkeiten einer UID und eines bestimmten Semesters (defaultmaeßig nur die letztgueltige) + * @param $uid + * @param $studiensemester_kurzbz + * @param null $limit limit = null liefert alle ZWG des Studiensemesters; limit = 1 liefert die letztgueltige ZWG. + * @return bool + */ + public function getByStudiensemester($uid, $studiensemester_kurzbz, $limit = 1) + { + $qry = ' + WITH studiensemester AS + ( + SELECT studiensemester_kurzbz, start, ende + FROM public.tbl_studiensemester + WHERE studiensemester_kurzbz = '.$this->db_add_param($studiensemester_kurzbz). ' + ) + + SELECT zwg.*, studiensemester_kurzbz, start, ende + FROM campus.tbl_zeitwunsch_gueltigkeit zwg, studiensemester ss + WHERE zwg.mitarbeiter_uid = '.$this->db_add_param($uid). ' + AND (zwg.von < ss.ende AND COALESCE(zwg.bis, ss.ende) >= ss.start) + ORDER BY von DESC, bis DESC + '; + + // Wenn Limit angegeben + if (!is_null($limit)) + { + // Ausgabe limitieren + $qry.= 'LIMIT '.$this->db_add_param($limit); + } + + if ($result = $this->db_query($qry)) + { + $this->result = array(); + + while ($row = $this->db_fetch_object($result)) + { + $obj = new StdClass(); + $obj->zeitwunsch_gueltigkeit_id = $row->zeitwunsch_gueltigkeit_id; + $obj->von = $row->von; + $obj->bis = $row->bis; + $obj->studiensemester_kurzbz = $row->studiensemester_kurzbz; + $obj->start = $row->start; + $obj->ende = $row->ende; + $obj->insertamum = $row->insertamum; + $obj->insertvon = $row->insertvon; + $obj->updateamum = $row->updateamum; + $obj->updatevon = $row->updatevon; + + $this->result[]= $obj; + } + return true; + } + else + { + $this->errormsg = 'Fehler bei der Datenbankabfrage'; + return false; + } + } +} + diff --git a/locale/de-AT/global.php b/locale/de-AT/global.php index 586614ece..7104a83a5 100644 --- a/locale/de-AT/global.php +++ b/locale/de-AT/global.php @@ -66,6 +66,7 @@ $this->phrasen['global/pdfExport']='PDF Export'; $this->phrasen['global/und']='und'; $this->phrasen['global/oder']='oder'; $this->phrasen['global/faelligAm']='Fällig am'; +$this->phrasen['global/aenderungenZuruecksetzen']= "Änderungen zurücksetzen"; $this->phrasen['global/username']='Username'; $this->phrasen['global/vorname']='Vorname'; diff --git a/locale/de-AT/lvplan.php b/locale/de-AT/lvplan.php index f0e802896..59fd5169a 100644 --- a/locale/de-AT/lvplan.php +++ b/locale/de-AT/lvplan.php @@ -21,6 +21,7 @@ $this->phrasen['lvplan/lehrverbaende']='Lehrverbände'; $this->phrasen['lvplan/uebersichtDerLehrverbaende']='Übersicht der Lehrverbände'; $this->phrasen['lvplan/fehlerUndFeedback']='Feedback geben'; $this->phrasen['lvplan/lvKoordinationsstelle']='LV-Koordinationsstelle'; +$this->phrasen['lvplan/lvPlanung']='LV-Planung'; $this->phrasen['lvplan/reservierungen']='Reservierungen'; $this->phrasen['lvplan/reservierungWurdeGeloescht']='Reservierung wurde geloescht'; $this->phrasen['lvplan/alleReservierungen']='Alle Reservierungen'; diff --git a/locale/de-AT/zeitwunsch.php b/locale/de-AT/zeitwunsch.php index a84da2b0e..e9d13a558 100644 --- a/locale/de-AT/zeitwunsch.php +++ b/locale/de-AT/zeitwunsch.php @@ -3,12 +3,13 @@ $this->phrasen['zeitwunsch/falscheWerteEingetragen']='Es duerfen nur die Werte - $this->phrasen['zeitwunsch/zeitwunsch']='Zeitwunsch'; $this->phrasen['zeitwunsch/help']='HELP'; $this->phrasen['zeitwunsch/zeitwunschVon']='Zeitwünsche von'; -$this->phrasen['zeitwunsch/tragenSieInDiesesNormwochenraster']='Tragen Sie in dieses Normwochenraster Ihre Verfügbarkeit in einer durchschnittlichen Arbeitswoche ein.'; +$this->phrasen['zeitwunsch/tragenSieInDiesesNormwochenraster']="Tragen Sie in dieses Normwochenraster Ihre Verfügbarkeit in einer durchschnittlichen Arbeitswoche ein. Klicken Sie danach auf 'Speichern'"; $this->phrasen['zeitwunsch/letzteAenderung']='Letzte Änderung'; $this->phrasen['zeitwunsch/von']='von'; $this->phrasen['zeitwunsch/formularZumEintragenDerZeitsperren']='Das Formular zum Eintragen der Zeitsperren finden Sie %s hier'; $this->phrasen['zeitwunsch/erklärung']='Erklärung'; $this->phrasen['zeitwunsch/kontrollierenSieIhreZeitwuensche']='Bitte kontrollieren/ändern Sie Ihre Zeitwünsche und klicken Sie anschließend auf "Speichern"'; +$this->phrasen['zeitwunsch/erstellenSieIhreZeitwuensche']='Bitte erstellen / ändern Sie Ihre Zeitwünsche und klicken Sie anschließend auf "Speichern"'; $this->phrasen['zeitwunsch/wert']='Wert'; $this->phrasen['zeitwunsch/bedeutung']='Bedeutung'; $this->phrasen['zeitwunsch/hierMoechteIchUnterrichten']='Hier möchte ich unterrichten'; @@ -23,4 +24,21 @@ $this->phrasen['zeitwunsch/erklaerung']='Erklärung'; $this->phrasen['zeitwunsch/beiProblemenWendenSieSichAn']='Bei Problemen wenden Sie sich bitte an die'; $this->phrasen['zeitwunsch/profil']='Profil'; $this->phrasen['zeitwunsch/geteilteArbeitszeit']='Ich bin mit der Verplanung meiner Lehre in getrennten Blöcken am Tagesrand einverstanden.'; +$this->phrasen['zeitwunsch/gueltigIm']="Mein Zeitwunsch gültig im: "; +$this->phrasen['zeitwunsch/erklaerungstext']="Sie können Ihren Zeitwunsch direkt in der Tabelle bearbeiten oder einen Zeitwunsch eines vergangenen Studiensemester kopieren.
+
Solange Sie keine Änderungen vornehmen, wird Ihr Zeitwunsch immer ins nächste Studiensemester übernommen."; +$this->phrasen['zeitwunsch/werteAuf1setzen']="Alle Werte auf 1 setzen"; +$this->phrasen['zeitwunsch/kopierenText']="Wählen Sie rechts das gewünschte Studiensemester aus. + Der Zeitwunsch wird dann automatisch in die Tabelle übernommen.
+ Nehmen Sie gegebenenfalls Änderungen vor und klicken danach auf 'Speichern'."; +$this->phrasen['zeitwunsch/kopieren']= "ändern"; +$this->phrasen['zeitwunsch/aendern']= "kopieren von früherem Studiensemester "; +$this->phrasen['zeitwunsch/stundenBereitsVerplant']='Stunden für %s bereits verplant'; +$this->phrasen['zeitwunsch/fuer']='Zeitwunsch für %s  '; +$this->phrasen['zeitwunsch/bearbeitungDeaktiviert']='Bearbeitung deaktiviert'; +$this->phrasen['zeitwunsch/bearbeitungDeaktiviertText']='Ihnen wurden im %s bereits Lehrveranstaltung(en) zugeteilt.
+ Bitte stimmen Sie sich vor einer Änderung per Mail mit den betroffenen Studiengängen ab.
+ Möchten Sie trotzdem ohne Abstimmung bzw. nach bereits erfolgter Abstimmung fortsetzen?'; +$this->phrasen['zeitwunsch/bearbeitungAktivieren']='Bearbeitung aktivieren'; +$this->phrasen['zeitwunsch/kompetenzfeldWirdInformiert']= 'INFO: Kompetenzfeld wird über die Änderung per Mail informiert'; ?> diff --git a/locale/en-US/global.php b/locale/en-US/global.php index 5fa89acbb..97f5cfe26 100644 --- a/locale/en-US/global.php +++ b/locale/en-US/global.php @@ -65,6 +65,7 @@ $this->phrasen['global/drucken']='Print'; $this->phrasen['global/und']='and'; $this->phrasen['global/oder']='or'; $this->phrasen['global/faelligAm']='Due on'; +$this->phrasen['global/aenderungenZuruecksetzen']= "Reset changes"; $this->phrasen['global/username']='Username'; $this->phrasen['global/vorname']='First Name'; diff --git a/locale/en-US/lvplan.php b/locale/en-US/lvplan.php index bd2b4b1eb..1a8c865bf 100644 --- a/locale/en-US/lvplan.php +++ b/locale/en-US/lvplan.php @@ -21,6 +21,7 @@ $this->phrasen['lvplan/lehrverbaende']='Teaching Groups'; $this->phrasen['lvplan/uebersichtDerLehrverbaende']='Overview of Teaching Groups'; $this->phrasen['lvplan/fehlerUndFeedback']='Send Feedback'; $this->phrasen['lvplan/lvKoordinationsstelle']='Course-Coordination Office'; +$this->phrasen['lvplan/lvPlanung']='Course-Planning Office'; $this->phrasen['lvplan/reservierungen']='Reservations'; $this->phrasen['lvplan/reservierungWurdeGeloescht'] = 'Reservation successfully deleted'; $this->phrasen['lvplan/alleReservierungen']='All reservations'; diff --git a/locale/en-US/zeitwunsch.php b/locale/en-US/zeitwunsch.php index dd9abdc3e..7aa8a6932 100644 --- a/locale/en-US/zeitwunsch.php +++ b/locale/en-US/zeitwunsch.php @@ -3,12 +3,13 @@ $this->phrasen['zeitwunsch/falscheWerteEingetragen']='Invalid input. Only the va $this->phrasen['zeitwunsch/zeitwunsch']='Preferred teaching time'; $this->phrasen['zeitwunsch/help']='HELP'; $this->phrasen['zeitwunsch/zeitwunschVon']='Preferred teaching times for'; -$this->phrasen['zeitwunsch/tragenSieInDiesesNormwochenraster']='Enter your availability for an average week in this standard week grid.'; +$this->phrasen['zeitwunsch/tragenSieInDiesesNormwochenraster']='Enter your availability for an average week in this standard week grid and click "Save"'; $this->phrasen['zeitwunsch/letzteAenderung']='Last Update'; $this->phrasen['zeitwunsch/von']='from'; $this->phrasen['zeitwunsch/formularZumEintragenDerZeitsperren']='The form for entering times when you are unavailable to teach can be found %s here'; $this->phrasen['zeitwunsch/erklärung']='Explanation'; $this->phrasen['zeitwunsch/kontrollierenSieIhreZeitwuensche']='Please check/change your preferred teaching times and click "Save"'; +$this->phrasen['zeitwunsch/erstellenSieIhreZeitwuensche']='Please enter / change your preferred teaching times and click "Save"'; $this->phrasen['zeitwunsch/wert']='Value'; $this->phrasen['zeitwunsch/bedeutung']='Meaning'; $this->phrasen['zeitwunsch/hierMoechteIchUnterrichten']='I would like to teach at this time'; @@ -23,4 +24,21 @@ $this->phrasen['zeitwunsch/erklaerung']='Explanation'; $this->phrasen['zeitwunsch/beiProblemenWendenSieSichAn']='If you are having problems, please contact the '; $this->phrasen['zeitwunsch/profil']='Profile'; $this->phrasen['zeitwunsch/geteilteArbeitszeit']='Ich bin mit der Verplanung meiner Lehre in getrennten Blöcken am Tagesrand einverstanden.'; +$this->phrasen['zeitwunsch/gueltigIm']="My preferred times valid in: "; +$this->phrasen['zeitwunsch/erklaerungstext']="You can edit your preferred times directly in the table or copy a your preferred times from a previous semester.
+ As long as you do not make any changes, your preferred times will be carried over to the next study semester."; +$this->phrasen['zeitwunsch/werteAuf1setzen']="Set all values to 1"; +$this->phrasen['zeitwunsch/kopierenText']="Select the desired semester on the right. + Your preferred time of that semester is then automatically transferred to the table.
+ Make changes if necessary and then click on 'Save'."; +$this->phrasen['zeitwunsch/kopieren']= "change"; +$this->phrasen['zeitwunsch/aendern']= "copy from a previous semester"; +$this->phrasen['zeitwunsch/stundenBereitsVerplant']='Hours already scheduled for %s'; +$this->phrasen['zeitwunsch/fuer']='Preferred time for %s  '; +$this->phrasen['zeitwunsch/bearbeitungDeaktiviert']='Editing disabled'; +$this->phrasen['zeitwunsch/bearbeitungDeaktiviertText']='You have already been assigned to course(s) in %s.
+ Please agree per Mail with the degree programs concerned, before making a change.
+ Would you still like to continue without agreement or after having agreed?'; +$this->phrasen['zeitwunsch/bearbeitungAktivieren']='Enable editing'; +$this->phrasen['zeitwunsch/kompetenzfeldWirdInformiert']= 'INFO: The field of competence will be informed of your changes by email'; ?> diff --git a/public/js/lehre/lvplanung/zverfueg.js b/public/js/lehre/lvplanung/zverfueg.js new file mode 100644 index 000000000..6bb5419ce --- /dev/null +++ b/public/js/lehre/lvplanung/zverfueg.js @@ -0,0 +1,176 @@ +$(function(){ + var studiensemesterStart = $("#studsemStart").val(); + + Zverfueg.initDatepicker(studiensemesterStart); + + $('#form-zeitverfuegbarkeit').submit(function(e){ + + e.preventDefault(); + + let zeitsperre_id = this.zeitsperre_id.value; + let mitarbeiter_uid = this.mitarbeiter_uid.value; + let lektor = this.mitarbeiter_uid.options[this.mitarbeiter_uid.selectedIndex].text; + let bezeichnung = this.bezeichnung.value; + let vondatum = this.vondatum.value; + let vonstunde = this.vonstunde.value; + let bisdatum = this.bisdatum.value; + let bisstunde = this.bisstunde.value; + + FHC_AjaxClient.ajaxCallPost( + FHC_JS_DATA_STORAGE_OBJECT.called_path + "/saveZeitverfuegbarkeit", + { + zeitsperre_id: zeitsperre_id, + mitarbeiter_uid: mitarbeiter_uid, + bezeichnung: bezeichnung, + zeitsperretyp_kurzbz: 'ZVerfueg', + vondatum: vondatum, + vonstunde: vonstunde, + bisdatum: bisdatum, + bisstunde: bisstunde + }, + { + successCallback: function (data, textStatus, jqXHR) + { + if (FHC_AjaxClient.isError(data)) + { + FHC_DialogLib.alertWarning(FHC_AjaxClient.getError(data)); + } + + if (FHC_AjaxClient.hasData(data)) + { + if (zeitsperre_id == '') + { + // Add row + $('#tableWidgetTabulator').tabulator('addRow', { + zeitsperre_id: FHC_AjaxClient.getData(data).zeitsperre_id, + mitarbeiter_uid: mitarbeiter_uid, + lektor: lektor, + vondatum: vondatum, + vonstunde: $.isNumeric(vonstunde) ? vonstunde : '', + bisdatum: bisdatum, + bisstunde: $.isNumeric(bisstunde) ? bisstunde : '', + bezeichnung: bezeichnung + }, true); // true adds new row on top + } + else { + $('#tableWidgetTabulator').tabulator('updateData', [{ + zeitsperre_id: zeitsperre_id, + vondatum: vondatum, + vonstunde: $.isNumeric(vonstunde) ? vonstunde : '', + bisdatum: bisdatum, + bisstunde: $.isNumeric(bisstunde) ? bisstunde : '', + bezeichnung: bezeichnung + }]); + } + + // Reset form + Zverfueg.resetFormFields(); + + // Disable form elements + Zverfueg.disableFormElements(); + + // Display success message + FHC_DialogLib.alertSuccess(FHC_AjaxClient.getData(data).msg); + } + }, + errorCallback: function (jqXHR, textStatus, errorThrown) + { + FHC_DialogLib.alertError(FHC_PhrasesLib.t("ui", "systemfehler")); + } + } + ); + }) + + $('#btn-delete').click(function() { + let zeitsperre_id = $('#zeitsperre_id').val(); + + FHC_AjaxClient.ajaxCallPost( + FHC_JS_DATA_STORAGE_OBJECT.called_path + "/deleteZeitverfuegbarkeit", + { + zeitsperre_id: zeitsperre_id, + }, + { + successCallback: function (data, textStatus, jqXHR) { + if (FHC_AjaxClient.isError(data)) { + FHC_DialogLib.alertWarning(FHC_AjaxClient.getError(data)); + } + + if (FHC_AjaxClient.hasData(data)) { + + // Delete row + let row = $('#tableWidgetTabulator').tabulator('getRow', zeitsperre_id); + row.delete(zeitsperre_id); + + // Reset form + Zverfueg.resetFormFields(); + + // Disable form elements + Zverfueg.disableFormElements(); + + // Display delete message + FHC_DialogLib.alertSuccess(FHC_AjaxClient.getData(data).msg); + } + }, + errorCallback: function (jqXHR, textStatus, errorThrown) + { + FHC_DialogLib.alertError(FHC_PhrasesLib.t("ui", "systemfehler")); + } + }); + }); + + $('#btn-break').click(function () { + Zverfueg.disableFormElements(); + }) + +}) + +var Zverfueg = { + initDatepicker: function (studiensemesterStart) { + + // Prevent opening HTMl date picker + $('input[type=date]').on('click', function(event) { + event.preventDefault(); + }); + + $.datepicker.setDefaults($.datepicker.regional['de']); + $( ".zverfueg-datepicker" ).datepicker({ + "dateFormat": "yy-mm-dd", + "minDate": $.datepicker.formatDate('yy-mm-dd', new Date(studiensemesterStart)) + }); + }, + resetFormFields: function(){ + $('#form-zeitverfuegbarkeit') + .trigger('reset') + .find('input:hidden[name=zeitsperre_id]').val('') + .find('textarea[name=bezeichnung]').val(''); + }, + disableFormElements: function (){ + $('#btn-delete').prop('disabled', true).tooltip('enable'); + $('#mitarbeiter_uid').prop('disabled', false); + }, + enableFormElements: function (){ + $('#btn-delete').prop('disabled', false).tooltip('disable'); + $('#mitarbeiter_uid').prop('disabled', true); + } +} + +// TABULATOR FUNCTIONS +// --------------------------------------------------------------------------------------------------------------------- +function func_rowSelected(row){ + Zverfueg.enableFormElements(); + + // Set form fields + $('#zeitsperre_id').val(row.getData().zeitsperre_id); + $('#mitarbeiter_uid').val(row.getData().mitarbeiter_uid); + $('#bezeichnung').val(row.getData().bezeichnung); + $('#vondatum').datepicker('setDate', row.getData().vondatum); + $('#bisdatum').datepicker('setDate', row.getData().bisdatum); + $('#vonstunde').val(row.getData().vonstunde); + $('#bisstunde').val(row.getData().bisstunde); +} + +function func_rowDeselected(row){ + Zverfueg.resetFormFields(); + Zverfueg.disableFormElements(); + Zverfueg.resetFormFields(); +} \ No newline at end of file diff --git a/rdf/lehreinheit-lvplan.rdf.php b/rdf/lehreinheit-lvplan.rdf.php index a7c89ac98..c3c53a7b6 100644 --- a/rdf/lehreinheit-lvplan.rdf.php +++ b/rdf/lehreinheit-lvplan.rdf.php @@ -40,6 +40,8 @@ require_once('../include/mitarbeiter.class.php'); require_once('../include/zeitaufzeichnung_gd.class.php'); require_once('../include/lehreinheitmitarbeiter.class.php'); require_once('../include/vertrag.class.php'); +require_once('../include/studiensemester.class.php'); +require_once('../include/zeitsperre.class.php'); $uid=get_uid(); $error_msg=''; @@ -63,7 +65,7 @@ if (isset($_GET['sem'])) else $sem=0; if (isset($_GET['lektor'])) - $lektor=$_GET['lektor']; + $lektor=$_GET['lektor']; else $lektor=$uid; if (isset($_GET['ver'])) @@ -136,6 +138,14 @@ if (!$error_msg) die ('Fehler bei Methode getLehreinheitLVPL(): '.$lehreinheit->errormsg); $lva=$lehreinheit->lehreinheiten; $rdf_url='http://www.technikum-wien.at/lehreinheit-lvplan/'; + +// Positive Zeitsperre 'Zeitverfuegbarkeit' holen +$ss = new Studiensemester($studiensemester); + +$zeitsperre = new Zeitsperre(); +$zeitsperre->getVonBis($lektor, $ss->start, $ss->ende, 'ZVerfueg'); + +$zeitverfuegbarkeit = count($zeitsperre->result) > 0 ? 'Zeit verfügbar' : ''; ?> 0) '.$anzahl_notizen.' '.$l->lehreinheit_id[0].' '.$vertragsstatus.' + '. $zeitverfuegbarkeit. ' '; } diff --git a/skin/tempus.css b/skin/tempus.css index de025ef27..7684fddb1 100644 --- a/skin/tempus.css +++ b/skin/tempus.css @@ -20,6 +20,12 @@ label.tempus_vertrag_info font-size: x-small } +label.tempus_lektor_verfuegbarezeit +{ + font-weight: bold; + color: green; +} + label.kalenderwoche { font-size: medium; diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index fa073bcba..5ea1bd4a0 100644 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -5940,7 +5940,6 @@ if ($result = $db->db_query("SELECT * FROM pg_class WHERE relname='idx_tbl_zeita echo 'Index fuer campus.tbl_zeitaufzeichnung.uid hinzugefuegt
'; } } - // Change size of wawi.tbl_kostenstelle.kostenstelle_nr from character varying(4) to character varying(6) if ($result = $db->db_query("SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='wawi' AND TABLE_NAME='tbl_kostenstelle' AND COLUMN_NAME = 'kostenstelle_nr' AND character_maximum_length < 6")) { @@ -5965,6 +5964,126 @@ if(!$result = @$db->db_query("SELECT behebung_parameter FROM system.tbl_issue LI echo '
Added column behebung_parameter to table system.tbl_issue'; } +// Add table campus.tbl_zeitwunsch_gueltigkeit and migrate initial data +if($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table_schema LIKE 'campus' AND table_name = 'tbl_zeitwunsch_gueltigkeit'")) +{ + if ($db->db_fetch_object($result) == false) + { + $qry = " + CREATE TABLE campus.tbl_zeitwunsch_gueltigkeit + ( + zeitwunsch_gueltigkeit_id INTEGER NOT NULL, + mitarbeiter_uid CHARACTER VARYING(32) NOT NULL, + von DATE, + bis DATE, + insertamum TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(), + insertvon CHARACTER VARYING(32), + updateamum TIMESTAMP WITHOUT TIME ZONE, + updatevon CHARACTER VARYING(32) + ); + + CREATE SEQUENCE campus.seq_zeitwunsch_gueltigkeit_zeitwunsch_gueltigkeit_id + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + -- Add Primary Key + ALTER TABLE campus.tbl_zeitwunsch_gueltigkeit ADD CONSTRAINT pk_zeitwunsch_gueltigkeit_zeitwunsch_gueltigkeit_id PRIMARY KEY (zeitwunsch_gueltigkeit_id); + ALTER TABLE campus.tbl_zeitwunsch_gueltigkeit ALTER COLUMN zeitwunsch_gueltigkeit_id SET DEFAULT nextval('campus.seq_zeitwunsch_gueltigkeit_zeitwunsch_gueltigkeit_id'); + + -- Add Permissions + GRANT SELECT, UPDATE ON SEQUENCE campus.seq_zeitwunsch_gueltigkeit_zeitwunsch_gueltigkeit_id TO vilesci; + GRANT SELECT, UPDATE ON SEQUENCE campus.seq_zeitwunsch_gueltigkeit_zeitwunsch_gueltigkeit_id TO web; + + GRANT SELECT, INSERT, UPDATE, DELETE ON campus.tbl_zeitwunsch_gueltigkeit TO vilesci; + GRANT SELECT, INSERT, UPDATE ON campus.tbl_zeitwunsch_gueltigkeit TO web; + + -- Initial data migration + INSERT INTO campus.tbl_zeitwunsch_gueltigkeit + ( + mitarbeiter_uid, + von, + bis, + insertamum, + insertvon, + updateamum, + updatevon + ) + SELECT * FROM + ( + -- Unique Mitarbeiter from Zeitwunsch Tabelle, Start of actual Studiensemester and open end + SELECT DISTINCT mitarbeiter_uid, + (SELECT start FROM public.tbl_studiensemester WHERE start <= NOW() AND ende >= NOW()), + NULL::DATE AS \"ende\", + NOW(), + 'system', + NOW(), + 'system' + FROM campus.tbl_zeitwunsch + ORDER BY mitarbeiter_uid + ) AS init_data + "; + + if(!$db->db_query($qry)) + echo 'campus.tbl_zeitwunsch_gueltigkeit: '.$db->db_last_error().'
'; + else + echo 'campus.tbl_zeitwunsch_gueltigkeit: Tabelle hinzugefuegt
'; + } +} + +// Add column zeitwunsch_id (as new primary key) and zeitwunsch_gueltigkeit_id to campus.tbl_zeitwunsch +if ($result = $db->db_query("SELECT 1 FROM information_schema.columns WHERE table_schema = 'campus' AND table_name = 'tbl_zeitwunsch' AND column_name IN ('zeitwunsch_id', 'zeitwunsch_gueltigkeit_id')")) +{ + if ($db->db_num_rows($result) <> 2) + { + $qry = " + ALTER TABLE campus.tbl_zeitwunsch DROP CONSTRAINT IF EXISTS pk_tbl_zeitwunsch; -- Drop combined pk stunde/mitarbeiter_uid/tag + + -- Add primary key and foreign key + ALTER TABLE campus.tbl_zeitwunsch ADD COLUMN IF NOT EXISTS zeitwunsch_id INTEGER; + ALTER TABLE campus.tbl_zeitwunsch ADD COLUMN IF NOT EXISTS zeitwunsch_gueltigkeit_id INTEGER; + + -- Add comments + COMMENT ON COLUMN campus.tbl_zeitwunsch.zeitwunsch_gueltigkeit_id IS 'Ordnet die Zeitwuensche einer Gueltigkeitsdauer von-bis zu'; + COMMENT ON COLUMN campus.tbl_zeitwunsch.mitarbeiter_uid IS 'DEPRECATED'; + + CREATE SEQUENCE campus.seq_zeitwunsch_zeitwunsch_id + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + ALTER TABLE campus.tbl_zeitwunsch ALTER COLUMN zeitwunsch_id SET DEFAULT nextval('campus.seq_zeitwunsch_zeitwunsch_id'); + UPDATE campus.tbl_zeitwunsch SET zeitwunsch_id = nextval('campus.seq_zeitwunsch_zeitwunsch_id'); + + ALTER TABLE campus.tbl_zeitwunsch ADD CONSTRAINT pk_zeitwunsch_zeitwunsch_id PRIMARY KEY (zeitwunsch_id); + ALTER TABLE campus.tbl_zeitwunsch ADD CONSTRAINT fk_zeitwunsch_zeitwunsch_gueltigkeit_id FOREIGN KEY (zeitwunsch_gueltigkeit_id) REFERENCES campus.tbl_zeitwunsch_gueltigkeit(zeitwunsch_gueltigkeit_id) ON DELETE RESTRICT ON UPDATE CASCADE; + + -- Set initial zeitwunsch_gueltigkeit_id values to Gueltigkeitszeitraum of actual Studiensemester + UPDATE campus.tbl_zeitwunsch + SET zeitwunsch_gueltigkeit_id = ( + SELECT zeitwunsch_gueltigkeit_id + FROM campus.tbl_zeitwunsch_gueltigkeit zwg + WHERE tbl_zeitwunsch.mitarbeiter_uid = zwg.mitarbeiter_uid + ); + + -- Set primary key and foreign key NOT NULL + ALTER TABLE campus.tbl_zeitwunsch ALTER COLUMN zeitwunsch_id SET NOT NULL; + ALTER TABLE campus.tbl_zeitwunsch ALTER COLUMN zeitwunsch_gueltigkeit_id SET NOT NULL; + + -- Set permissions + GRANT SELECT, UPDATE ON SEQUENCE campus.seq_zeitwunsch_zeitwunsch_id TO vilesci; + GRANT SELECT, UPDATE ON SEQUENCE campus.seq_zeitwunsch_zeitwunsch_id TO web; + "; + + if (!$db->db_query($qry)) + echo 'campus.tbl_zeitwunsch: ' . $db->db_last_error() . '
'; + else + echo '
campus.tbl_zeitwunsch: Neue Spalte zeitwunsch_id hinzugefuegt.'; + } +} + // Add index beschreibung to system.tbl_webservicelog if ($result = $db->db_query("SELECT * FROM pg_class WHERE relname='idx_webservicelog_beschreibung'")) { @@ -5979,6 +6098,34 @@ if ($result = $db->db_query("SELECT * FROM pg_class WHERE relname='idx_webservic } } +// Insert postive Zeitsperre 'Zeitverfuegbarkeit' to tbl_zeitsperretyp +if($result = @$db->db_query("SELECT 1 FROM campus.tbl_zeitsperretyp WHERE zeitsperretyp_kurzbz = 'ZVerfueg';")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO campus.tbl_zeitsperretyp(zeitsperretyp_kurzbz, beschreibung) VALUES('ZVerfueg', 'Zeitverfügbarkeit');"; + + if(!$db->db_query($qry)) + echo 'campus.tbl_zeitsperretyp '.$db->db_last_error().'
'; + else + echo 'campus.tbl_zeitsperretyp: Added value \'ZVerfueg\'
'; + } +} + +// Add permission to administrate zeitverfuegbarkeiten +if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'lehre/zeitverfuegbarkeit';")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('lehre/zeitverfuegbarkeit', 'Zeitverfuegbarkeit verwalten');"; + + if(!$db->db_query($qry)) + echo 'system.tbl_berechtigung '.$db->db_last_error().'
'; + else + echo ' system.tbl_berechtigung: Added permission for lehre/zeitverfuegbarkeit
'; + } +} + // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; @@ -6071,7 +6218,8 @@ $tabellen=array( "campus.tbl_zeitaufzeichnung_gd" => array("zeitaufzeichnung_gd_id","uid","studiensemester_kurzbz","selbstverwaltete_pause","insertamum","insertvon","updateamum","updatevon"), "campus.tbl_zeitsperre" => array("zeitsperre_id","zeitsperretyp_kurzbz","mitarbeiter_uid","bezeichnung","vondatum","vonstunde","bisdatum","bisstunde","vertretung_uid","updateamum","updatevon","insertamum","insertvon","erreichbarkeit_kurzbz","freigabeamum","freigabevon"), "campus.tbl_zeitsperretyp" => array("zeitsperretyp_kurzbz","beschreibung","farbe"), - "campus.tbl_zeitwunsch" => array("stunde","mitarbeiter_uid","tag","gewicht","updateamum","updatevon","insertamum","insertvon"), + "campus.tbl_zeitwunsch" => array("stunde","mitarbeiter_uid","tag","gewicht","updateamum","updatevon","insertamum","insertvon", "zeitwunsch_id", "zeitwunsch_gueltigkeit_id"), + "campus.tbl_zeitwunsch_gueltigkeit" => array("zeitwunsch_gueltigkeit_id","mitarbeiter_uid","von","bis","insertamum","insertvon", "updateamum","updatevon"), "fue.tbl_aktivitaet" => array("aktivitaet_kurzbz","beschreibung","sort"), "fue.tbl_aufwandstyp" => array("aufwandstyp_kurzbz","bezeichnung"), "fue.tbl_projekt" => array("projekt_kurzbz","nummer","titel","beschreibung","beginn","ende","oe_kurzbz","budget","farbe","aufwandstyp_kurzbz","ressource_id","anzahl_ma","aufwand_pt","projekt_id","projekttyp_kurzbz","zeitaufzeichnung"), diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 4b1c12bbd..ed9d02710 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -1554,6 +1554,26 @@ $phrases = array( ) ) ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'geloescht', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Gelöscht', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Deleted', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'anrechnung', diff --git a/vilesci/personen/zeitwunsch.php b/vilesci/personen/zeitwunsch.php index 416c6387d..726218302 100644 --- a/vilesci/personen/zeitwunsch.php +++ b/vilesci/personen/zeitwunsch.php @@ -32,6 +32,9 @@ require_once('../../include/functions.inc.php'); require_once('../../include/globals.inc.php'); require_once('../../include/datum.class.php'); require_once('../../include/benutzerberechtigung.class.php'); +require_once('../../include/zeitwunsch.class.php'); +require_once('../../include/zeitwunsch_gueltigkeit.class.php'); +require_once('../../include/studiensemester.class.php'); if (!$db = new basis_db()) die('Es konnte keine Verbindung zum Server aufgebaut werden.'); @@ -48,6 +51,7 @@ if (!isset($uid)) { die( "uid nicht gesetzt"); } + $uid_benutzer = get_uid(); $rechte = new benutzerberechtigung(); @@ -58,46 +62,240 @@ if(!$rechte->isBerechtigt('mitarbeiter', null, 's')) $datum_obj = new datum(); $updatevon = 0; - //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); +// Nächstes Studiensemester +$next_ss = new Studiensemester(); +$next_ss->getNextStudiensemester(); - // Zeitwuensche speichern - if (isset($_POST['save'])) - { - if(!$rechte->isBerechtigt('mitarbeiter/zeitwuensche', null, 'suid')) - die($rechte->errormsg); +// Aktuelles Studiensemester +$akt_ss = new Studiensemester(); +$akt_ss->load($akt_ss->getAkt()); - for ($t=1;$t<7;$t++) - for ($i=0;$i<$num_rows_stunde;$i++) - { - $var='wunsch'.$t.'_'.$i; - //echo $$var; - $gewicht=$_POST[$var]; - $stunde=$i+1; - $query="SELECT * FROM campus.tbl_zeitwunsch WHERE mitarbeiter_uid=".$db->db_add_param($uid)." AND stunde=".$db->db_add_param($stunde, FHC_INTEGER)." AND tag=".$db->db_add_param($t, FHC_INTEGER); - if(! $erg_wunsch=$db->db_query($query)) - die($db->db_last_error()); - $num_rows_wunsch=$db->db_num_rows($erg_wunsch); - if ($num_rows_wunsch==0) - { - $query="INSERT INTO campus.tbl_zeitwunsch (mitarbeiter_uid, stunde, tag, gewicht, updateamum, updatevon) VALUES (".$db->db_add_param($uid).", ".$db->db_add_param($stunde).", ".$db->db_add_param($t).", ".$db->db_add_param($gewicht).", now(), ".$db->db_add_param($uid_benutzer).")"; - if(!($erg=$db->db_query($query))) - die($db->db_last_error()); - } - elseif ($num_rows_wunsch==1) - { - $query="UPDATE campus.tbl_zeitwunsch SET gewicht=".$db->db_add_param($gewicht).", updateamum=now(), updatevon=".$db->db_add_param($uid_benutzer)." WHERE mitarbeiter_uid=".$db->db_add_param($uid)." AND stunde=".$db->db_add_param($stunde)." AND tag=".$db->db_add_param($t); - if(!($erg=$db->db_query($query))) - die($db->db_last_error()); - } - else - die("Zuviele Eintraege!"); - } - } +// Zeitwunschgueltigkeiten nach Semester selektierbar +$selected_ss = (isset($_GET['stsem']) && !empty($_GET['stsem'])) ? $_GET['stsem'] : $next_ss->studiensemester_kurzbz; // Default: Nächstes Studiensemester - if(!($erg=$db->db_query("SELECT * FROM campus.tbl_zeitwunsch WHERE mitarbeiter_uid=".$db->db_add_param($uid)))) +// Default: Letzte Zeitwunschgueltigkeit (ZWG) holen +$zwg = new Zeitwunsch_gueltigkeit(); +$zwg->getByUID($uid, 1); +$selected_zwg = !empty($zwg->result) ? $zwg->result[0] : null; // NULL, wenn Lektor noch gar keinen ZW hinterlegt hat + +// Zeitwunschgueltigkeit ueber Dropdown ZWG gewaehlt +if (isset($_GET['zwg_id'])) +{ + $selected_zwg = !empty($_GET['zwg_id']) ? new Zeitwunsch_gueltigkeit($_GET['zwg_id']) : 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($_POST['save'])) +{ + if(!$rechte->isBerechtigt('mitarbeiter/zeitwuensche', null, 'suid')) + die($rechte->errormsg); + + $selected_ss = isset($_POST['stsem']) ? $_POST['stsem'] : die('Studiensemester fehlt'); + + // 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, $uid_benutzer); + } + + // 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, $uid_benutzer); + } + } + + // 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, $uid_benutzer); + + // Neue ZWG setzen: von = Start nächstes Studiensemester, bis offen lassen + $zw_zwg_id = insertZWG($uid, $next_ss->start, null, $uid_benutzer); + } + } + + // 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, + $uid_benutzer + ); + } + + // 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->insertamum))->format('Y-m-d') == (new Datetime())->format('Y-m-d')) + { + updateZWG($uid, $akt_ss_zwg->zeitwunsch_gueltigkeit_id, $akt_ss_zwg->bis, $uid_benutzer); + + $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, + $uid_benutzer + ); + + // 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'), + $uid_benutzer + ); + } + } + } + } + + // Insert Zeitwunsch mit Zeitwunsch ZWG ID + if (is_numeric($zw_zwg_id)) + { + for ($t = 1; $t < 7; $t++) + { + for ($i = 0; $i < $num_rows_stunde; $i++) + { + $var = 'wunsch' . $t . '_' . $i; + //echo $$var; + $gewicht = $_POST[$var]; + $stunde = $i + 1; + $query = "SELECT * FROM campus.tbl_zeitwunsch WHERE mitarbeiter_uid=" . $db->db_add_param($uid) . " AND zeitwunsch_gueltigkeit_id =" . $db->db_add_param($zw_zwg_id) . " AND stunde=" . $db->db_add_param($stunde, FHC_INTEGER) . " AND tag=" . $db->db_add_param($t, FHC_INTEGER); + if (!$erg_wunsch = $db->db_query($query)) + die($db->db_last_error()); + $num_rows_wunsch = $db->db_num_rows($erg_wunsch); + if ($num_rows_wunsch == 0) { + $query = "INSERT INTO campus.tbl_zeitwunsch (mitarbeiter_uid, stunde, tag, gewicht, updateamum, updatevon, zeitwunsch_gueltigkeit_id) VALUES (" . $db->db_add_param($uid) . ", " . $db->db_add_param($stunde) . ", " . $db->db_add_param($t) . ", " . $db->db_add_param($gewicht) . ", now(), " . $db->db_add_param($uid_benutzer) . ", " . $db->db_add_param($zw_zwg_id) . ")"; + if (!($erg = $db->db_query($query))) + die($db->db_last_error()); + } elseif ($num_rows_wunsch == 1) { + $query = "UPDATE campus.tbl_zeitwunsch SET gewicht=" . $db->db_add_param($gewicht) . ", updateamum=now(), updatevon=" . $db->db_add_param($uid_benutzer) . " WHERE mitarbeiter_uid=" . $db->db_add_param($uid) . " AND zeitwunsch_gueltigkeit_id=" . $db->db_add_param($zw_zwg_id) . " AND stunde=" . $db->db_add_param($stunde) . " AND tag=" . $db->db_add_param($t); + if (!($erg = $db->db_query($query))) + die($db->db_last_error()); + } + else + die("Zuviele Eintraege!"); + } + } + $selected_zwg = new Zeitwunsch_gueltigkeit($zw_zwg_id); + } +} + +/** + * Init ZWG Objekt zum Erstellen einer neuen ZWG + */ +function insertZWG($uid, $von, $bis, $admin_uid) +{ + $zwg = new Zeitwunsch_gueltigkeit(); + $zwg->new = true; + $zwg->mitarbeiter_uid = $uid; + $zwg->von = $von; + $zwg->bis = $bis; + $zwg->insertvon = $admin_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, $admin_uid) +{ + $zwg = new Zeitwunsch_gueltigkeit(); + $zwg->new = false; + $zwg->zeitwunsch_gueltigkeit_id = $zwg_id; + $zwg->mitarbeiter_uid = $uid; + $zwg->bis = $bis; + $zwg->updatevon = $admin_uid; + + if (!$zwg->save()) + { + die($zwg->errormsg); + } + + return; +} + +// Tabellendaten +/** + * Zeitwunschgueltigkeit + * Wurde ueber Dropdown gewaehlt (kann auch null sein, wenn noch kein Zeitwunsch vorliegt) + * ODER ueber Speichernbutton neu erstellt / upgedatet + */ +$selected_zwg_id = !is_null($selected_zwg) ? $selected_zwg->zeitwunsch_gueltigkeit_id : ''; + + if(!($erg=$db->db_query(" + SELECT * + FROM campus.tbl_zeitwunsch + WHERE mitarbeiter_uid = ". $db->db_add_param($uid). " + AND zeitwunsch_gueltigkeit_id = ". $db->db_add_param(($selected_zwg_id)) + ))) die($db->db_last_error()); $num_rows=$db->db_num_rows($erg); for ($i=0;$i<$num_rows;$i++) @@ -135,12 +333,77 @@ $updatevon = 0; Profil + + + -

Zeitwünsche von titelpre.' '.$person->vornamen.' '.$person->nachname. ' '.$person->titelpost; ?>

+

Zeitwünsche von titelpre.' '.$person->vorname.' '.$person->nachname. ' '.$person->titelpost; ?>

+Zeitwunschgueltigkeit: +getByUID($uid, null, false); +$zwg_arr = $zwg->result; + +// Dropdown +echo ''; +?> +

+ + +

- isBerechtigt('mitarbeiter/zeitwuensche', null, 'suid')) - echo '' + { + /** + * Disablen des Speicherbuttons und Textanzeige, wenn die gewaehlte Zeitwunschgueltigkeit nicht + *die letztgueltige fuer das aktuelle / naechste Studiensemester ist. + **/ + $disabled = getDisabledString($uid, $selected_zwg, $akt_ss, $next_ss); // return 'disabled' oder '' + + // Speichern Button + echo ''; + + if (!empty($disabled)) + { + echo ' Es können nur Zeitwünsche im aktuellen oder im nächsten Studiensemester bearbeitet werden.
+       Falls mehrere Zeitwünsche im aktuellen Semester gespeichert sind, kann nur der letztgültige geändert werden.
'; + } + } ?>
@@ -248,4 +525,75 @@ $updatevon = 0;

 

+ + +getByStudiensemester($uid, $akt_ss->studiensemester_kurzbz); + $lastZwg_id_aktStudsem = empty($zwg->result) ? '' : $zwg->result[0]->zeitwunsch_gueltigkeit_id; + + $zwg = new Zeitwunsch_gueltigkeit(); + $zwg->getByStudiensemester($uid, $next_ss->studiensemester_kurzbz); + $lastZwg_id_nextStudsem = empty($zwg->result) ? '' : $zwg->result[0]->zeitwunsch_gueltigkeit_id; + + return ( + is_null($selected_zwg) + || !is_null($selected_zwg) + && ( + $selected_zwg->zeitwunsch_gueltigkeit_id == $lastZwg_id_aktStudsem + || $selected_zwg->zeitwunsch_gueltigkeit_id == $lastZwg_id_nextStudsem + ) + ) + ? '' + : 'disabled'; + +} + + +