diff --git a/application/controllers/api/frontend/v1/messages/Messages.php b/application/controllers/api/frontend/v1/messages/Messages.php index 3035e532d..77b46f97b 100644 --- a/application/controllers/api/frontend/v1/messages/Messages.php +++ b/application/controllers/api/frontend/v1/messages/Messages.php @@ -42,14 +42,22 @@ class Messages extends FHCAPI_Controller ]); } - public function getMessages($id, $type_id, $size, $page) + public function getMessages($id, $type_id, $size=null, $page=null) { if($type_id != 'person_id'){ $id = $this->_getPersonId($id, $type_id); } - $offset = $size * ($page - 1); - $limit = $size; + if(!(is_null($size) && is_null($page))) + { + $offset = $size * ($page - 1); + $limit = $size; + } + else + { + $offset = null; + $limit = null; + } $result = $this->MessageModel->getMessagesForTable($id, $offset, $limit); diff --git a/application/controllers/api/frontend/v1/stv/Dokumente.php b/application/controllers/api/frontend/v1/stv/Dokumente.php index b8c7830bd..913a57dc4 100644 --- a/application/controllers/api/frontend/v1/stv/Dokumente.php +++ b/application/controllers/api/frontend/v1/stv/Dokumente.php @@ -78,52 +78,32 @@ class Dokumente extends FHCAPI_Controller $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiengang_kz']), self::ERROR_TYPE_GENERAL); $resultPreDoc = $this->_getPrestudentDokumente($prestudent_id); - - $arrayAccepted = []; $person_id = $this->_getPersonId($prestudent_id); - $docNames = array_map(function ($item) { - return $item->dokument_kurzbz; - }, $resultPreDoc); + $mergedArray = []; - foreach($docNames as $doc) + foreach ($resultPreDoc as $pre) { - $result = $this->AkteModel->getAktenFAS($person_id, $doc, $studiengang_kz, $prestudent_id, true); + $result = $this->AkteModel->getAktenFAS($person_id, $pre->dokument_kurzbz, $studiengang_kz, $prestudent_id, true); if (isError($result)) - { return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); - } + if (hasData($result)) { - $data = getData($result); - foreach ($data as $value) + foreach (getData($result) as $doc) { - array_push($arrayAccepted, $value); + $merged = clone $doc; + $merged->docdatum = $pre->docdatum; + $merged->insertvonma = $pre->insertvonma; + $merged->bezeichnung = $pre->bezeichnung; + $mergedArray[] = $merged; } } - } - - //Mapping with document_kurzbz - $preDocMap = []; - foreach ($resultPreDoc as $pre) { - $preDocMap[$pre->dokument_kurzbz] = $pre; - } - - $mergedArray = []; - foreach ($arrayAccepted as $doc) { - $merged = clone $doc; - - if (isset($preDocMap[$doc->dokument_kurzbz])) { - $merged->docdatum = $preDocMap[$doc->dokument_kurzbz]->docdatum; - $merged->insertvonma = $preDocMap[$doc->dokument_kurzbz]->insertvonma; - $merged->bezeichnung = $preDocMap[$doc->dokument_kurzbz]->bezeichnung; - } else { - $merged->akzeptiertdatum = null; - $merged->akzeptiertvon = null; + else + { + $mergedArray[] = $pre; } - - $mergedArray[] = $merged; } $this->terminateWithSuccess($mergedArray); diff --git a/application/controllers/api/frontend/v1/stv/Konto.php b/application/controllers/api/frontend/v1/stv/Konto.php index ecd58671a..d59bc76b0 100644 --- a/application/controllers/api/frontend/v1/stv/Konto.php +++ b/application/controllers/api/frontend/v1/stv/Konto.php @@ -48,7 +48,8 @@ class Konto extends FHCAPI_Controller // Load language phrases $this->loadPhrases([ - 'konto' + 'konto', + 'lehre' ]); } @@ -112,7 +113,7 @@ class Konto extends FHCAPI_Controller * * @return void */ - public function getBuchungstypen() + public function getBuchungstypen($studiensemester_kurzbz = null) { $this->load->model('crm/Buchungstyp_model', 'BuchungstypModel'); @@ -122,6 +123,7 @@ class Konto extends FHCAPI_Controller $data = $this->getDataOrTerminateWithError($result); + $this->_getOEHBeitrag($data, $studiensemester_kurzbz); $this->terminateWithSuccess($data); } @@ -494,4 +496,43 @@ class Konto extends FHCAPI_Controller $this->terminateWithSuccess(); } + + private function _getOEHBeitrag(&$data, $studiensemester_kurzbz = null) + { + if (is_null($studiensemester_kurzbz)) + { + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + $studiensemester_akt = $this->variablelib->getVar('semester_aktuell'); + } + else + { + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + if ($this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz)) + $studiensemester_akt = $studiensemester_kurzbz; + else + $this->terminateWithError($this->p->t('lehre', 'error_noStudiensemester')); + } + + $this->load->model('codex/Oehbeitrag_model', 'OehbeitragModel'); + $oehBeitrag = $this->OehbeitragModel->getByStudiensemester($studiensemester_akt); + + $oehStandardbetrag = null; + if (hasData($oehBeitrag)) + { + $oeh = getData($oehBeitrag)[0]; + $summe = ($oeh->studierendenbeitrag + $oeh->versicherung) * -1; + $oehStandardbetrag = number_format((float)$summe, 2, '.', ''); + } + + if ($oehStandardbetrag !== null) + { + $data = array_map(function ($buchungstyp) use ($oehStandardbetrag) { + if (isset($buchungstyp->buchungstyp_kurzbz) && (strtolower($buchungstyp->buchungstyp_kurzbz) === 'oeh')) + { + $buchungstyp->standardbetrag = $oehStandardbetrag; + } + return $buchungstyp; + }, $data); + } + } } diff --git a/application/core/Notiz_Controller.php b/application/core/Notiz_Controller.php index 923970923..7269c3b09 100644 --- a/application/core/Notiz_Controller.php +++ b/application/core/Notiz_Controller.php @@ -417,6 +417,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller $notiz_id = $this->input->post('notiz_id'); $this->NotizModel->addSelect('campus.tbl_dms_version.*'); + $this->NotizModel->addSelect($this->NotizModel->escape(base_url('content/notizdokdownload.php?id=')) . ' || public.tbl_notiz_dokument.dms_id AS preview'); $this->NotizModel->addJoin('public.tbl_notiz_dokument', 'ON (public.tbl_notiz_dokument.notiz_id = public.tbl_notiz.notiz_id)'); $this->NotizModel->addJoin('campus.tbl_dms_version', 'ON (public.tbl_notiz_dokument.dms_id = campus.tbl_dms_version.dms_id)'); diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php index d90a98241..3d8a2ea26 100644 --- a/application/libraries/AntragLib.php +++ b/application/libraries/AntragLib.php @@ -128,7 +128,7 @@ class AntragLib return $this->_ci->StudierendenantragstatusModel->resumeAntraegeForAbmeldungStgl($antrag_id); } // NOTE(chris): get last status that is not pause - $this->_ci->StudierendenantragstatusModel->addOrder('insertamum'); + $this->_ci->StudierendenantragstatusModel->addOrder('insertamum', 'DESC'); $this->_ci->StudierendenantragstatusModel->addLimit(1); $result = $this->_ci->StudierendenantragstatusModel->loadWhere([ 'studierendenantrag_id' => $antrag_id, diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilFactory.php b/application/libraries/vertragsbestandteil/VertragsbestandteilFactory.php index 6e7b0af06..50504099a 100644 --- a/application/libraries/vertragsbestandteil/VertragsbestandteilFactory.php +++ b/application/libraries/vertragsbestandteil/VertragsbestandteilFactory.php @@ -3,6 +3,7 @@ namespace vertragsbestandteil; use Exception; use vertragsbestandteil\VertragsbestandteilStunden; +use vertragsbestandteil\VertragsbestandteilLohnguide; /** * Description of VertragsbestandteilFactory @@ -22,6 +23,7 @@ class VertragsbestandteilFactory const VERTRAGSBESTANDTEIL_URLAUBSANSPRUCH = 'urlaubsanspruch'; const VERTRAGSBESTANDTEIL_ZEITAUFZEICHNUNG = 'zeitaufzeichnung'; const VERTRAGSBESTANDTEIL_LEHRE = 'lehre'; + const VERTRAGSBESTANDTEIL_LOHNGUIDE = 'lohnguide'; public static function getVertragsbestandteil($data, $fromdb=false) { @@ -69,6 +71,11 @@ class VertragsbestandteilFactory $vertragsbestandteil = new VertragsbestandteilZeitaufzeichnung(); $vertragsbestandteil->hydrateByStdClass($data, $fromdb); break; + + case self::VERTRAGSBESTANDTEIL_LOHNGUIDE: + $vertragsbestandteil = new VertragsbestandteilLohnguide(); + $vertragsbestandteil->hydrateByStdClass($data, $fromdb); + break; default: throw new Exception('Unknown vertragsbestandteiltyp_kurzbz ' @@ -127,6 +134,12 @@ class VertragsbestandteilFactory $vertragsbestandteildbmodel = $CI->VertragsbestandteilZeitaufzeichnung_model; break; + case self::VERTRAGSBESTANDTEIL_LOHNGUIDE: + $CI->load->model('vertragsbestandteil/VertragsbestandteilLohnguide_model', + 'VertragsbestandteilLohnguide_model'); + $vertragsbestandteildbmodel = $CI->VertragsbestandteilLohnguide_model; + break; + default: throw new Exception('Unknown vertragsbestandteil_kurzbz ' . $vertragsbestandteil_kurzbz); diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php b/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php index 1ecb9ac60..61208eda0 100644 --- a/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php +++ b/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php @@ -10,6 +10,7 @@ require_once __DIR__ . '/VertragsbestandteilKuendigungsfrist.php'; require_once __DIR__ . '/VertragsbestandteilUrlaubsanspruch.php'; require_once __DIR__ . '/VertragsbestandteilFreitext.php'; require_once __DIR__ . '/VertragsbestandteilKarenz.php'; +require_once __DIR__ . '/VertragsbestandteilLohnguide.php'; require_once __DIR__ . '/VertragsbestandteilFactory.php'; require_once __DIR__ . '/OverlapChecker.php'; diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilLohnguide.php b/application/libraries/vertragsbestandteil/VertragsbestandteilLohnguide.php new file mode 100644 index 000000000..0e071f36b --- /dev/null +++ b/application/libraries/vertragsbestandteil/VertragsbestandteilLohnguide.php @@ -0,0 +1,155 @@ +setVertragsbestandteiltyp_kurzbz( + VertragsbestandteilFactory::VERTRAGSBESTANDTEIL_LOHNGUIDE); + } + + public function getStellenbezeichnung() + { + return $this->stellenbezeichnung; + } + + public function setStellenbezeichnung($stellenbezeichnung): self + { + $this->markDirty('stellenbezeichnung', $this->stellenbezeichnung, $stellenbezeichnung); + $this->stellenbezeichnung = $stellenbezeichnung; + return $this; + } + + public function getVordienstzeit() + { + return $this->vordienstzeit; + } + + public function setVordienstzeit($vordienstzeit): self + { + $this->markDirty('vordienstzeit', $this->vordienstzeit, $vordienstzeit); + $this->vordienstzeit = $vordienstzeit; + return $this; + } + + public function getFachrichtung_kurzbz() + { + return $this->fachrichtung_kurzbz; + } + + public function setFachrichtung_kurzbz($fachrichtung_kurzbz): self + { + $this->markDirty('fachrichtung_kurzbz', $this->fachrichtung_kurzbz, $fachrichtung_kurzbz); + $this->fachrichtung_kurzbz = $fachrichtung_kurzbz; + return $this; + } + + public function getModellstelle_kurzbz() + { + return $this->modellstelle_kurzbz; + } + + public function setModellstelle_kurzbz($modellstelle_kurzbz): self + { + $this->markDirty('modellstelle_kurzbz', $this->modellstelle_kurzbz, $modellstelle_kurzbz); + $this->modellstelle_kurzbz = $modellstelle_kurzbz; + return $this; + } + + public function getKommentar_person() + { + return $this->kommentar_person; + } + + public function setKommentar_person($kommentar_person): self + { + $this->markDirty('kommentar_person', $this->kommentar_person, $kommentar_person); + $this->kommentar_person = $kommentar_person; + return $this; + } + + public function getKommentar_modellstelle() + { + return $this->kommentar_modellstelle; + } + + public function setKommentar_modellstelle($kommentar_modellstelle): self + { + $this->markDirty('kommentar_modellstelle', $this->kommentar_modellstelle, $kommentar_modellstelle); + $this->kommentar_modellstelle = $kommentar_modellstelle; + return $this; + } + + + + + public function hydrateByStdClass($data, $fromdb=false) + { + parent::hydrateByStdClass($data, $fromdb); + $this->fromdb = $fromdb; + isset($data->fachrichtung_kurzbz) && $this->setFachrichtung_kurzbz($data->fachrichtung_kurzbz); + isset($data->stellenbezeichnung) && $this->setStellenbezeichnung($data->stellenbezeichnung); + isset($data->vordienstzeit) && $this->setVordienstzeit($data->vordienstzeit); + isset($data->modellstelle_kurzbz) && $this->setModellstelle_kurzbz($data->modellstelle_kurzbz); + isset($data->kommentar_person) && $this->setKommentar_person($data->kommentar_person); + isset($data->kommentar_modellstelle) && $this->setKommentar_modellstelle($data->kommentar_modellstelle); + $this->fromdb = false; + } + + public function toStdClass(): \stdClass + { + $tmp = array( + 'vertragsbestandteil_id' => $this->getVertragsbestandteil_id(), + 'stellenbezeichnung' => $this->getStellenbezeichnung(), + 'vordienstzeit' => $this->getVordienstzeit(), + 'fachrichtung_kurzbz' => $this->getFachrichtung_kurzbz(), + 'modellstelle_kurzbz' => $this->getModellstelle_kurzbz(), + 'kommentar_person' => $this->getKommentar_person(), + 'kommentar_modellstelle' => $this->getKommentar_modellstelle(), + ); + + $tmp = array_filter($tmp, function($k) { + return in_array($k, $this->modifiedcolumns); + }, ARRAY_FILTER_USE_KEY); + + return (object) $tmp; + } + + public function __toString() + { + $txt = <<getModellstelle_kurzbz()} + +EOTXT; + return parent::__toString() . $txt; + } + + /* public function validate() + { + if( !(filter_var($this->tage, FILTER_VALIDATE_INT, + array( + 'options' => array( + 'min_range' => 1, + 'max_range' => 50 + ) + ) + )) ) { + $this->validationerrors[] = 'Urlaubsanspruch muss eine Tagesanzahl im Bereich 1 bis 50 sein.'; + } + + return parent::validate(); + } */ +} diff --git a/application/models/education/Paabgabe_model.php b/application/models/education/Paabgabe_model.php index be42b7660..99b9b75f1 100644 --- a/application/models/education/Paabgabe_model.php +++ b/application/models/education/Paabgabe_model.php @@ -79,10 +79,10 @@ class Paabgabe_model extends DB_Model JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid) JOIN public.tbl_person USING (person_id) - WHERE (campus.tbl_paabgabe.insertamum >= NOW() - INTERVAL ? - OR campus.tbl_paabgabe.updateamum >= NOW() - INTERVAL ?) - AND campus.tbl_paabgabe.paabgabetyp_kurzbz IN ?"; - + WHERE (campus.tbl_paabgabe.insertamum::date = CURRENT_DATE - INTERVAL ? + OR campus.tbl_paabgabe.updateamum::date = CURRENT_DATE - INTERVAL ?) + AND campus.tbl_paabgabe.paabgabetyp_kurzbz IN ?"; + return $this->execQuery($query, [$interval, $interval, $relevantTypes]); } @@ -108,7 +108,7 @@ class Paabgabe_model extends DB_Model JOIN public.tbl_person ON (public.tbl_benutzer.person_id = public.tbl_person.person_id) WHERE campus.tbl_paabgabe.abgabedatum IS NOT NULL - AND campus.tbl_paabgabe.abgabedatum >= NOW() - INTERVAL ?"; + AND campus.tbl_paabgabe.abgabedatum = CURRENT_DATE - INTERVAL ?"; if($relevantTypes !== null) { $query .= " AND campus.tbl_paabgabe.paabgabetyp_kurzbz IN ?"; diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php index 131e1deb5..1db658596 100644 --- a/application/models/organisation/Studiengang_model.php +++ b/application/models/organisation/Studiengang_model.php @@ -594,7 +594,10 @@ class Studiengang_model extends DB_Model $this->addSelect('p.prestudent_id'); $this->addSelect('pers.vorname'); $this->addSelect('pers.nachname'); - $this->addSelect("CONCAT(UPPER(pers.nachname), ' ', pers.vorname, ' (', " . $this->dbTable . ".bezeichnung, ')') AS name"); + $this->addSelect("CONCAT(UPPER(pers.nachname), ' ', pers.vorname, ' (', " + . $this->dbTable . ".bezeichnung, ', ', " + . "UPPER(" . $this->dbTable . ".typ), " + . "UPPER(" . $this->dbTable . ".kurzbz),')') AS name"); $this->addJoin('public.tbl_prestudent p', 'studiengang_kz'); $this->addJoin( diff --git a/application/models/system/Message_model.php b/application/models/system/Message_model.php index 3e59d7250..ba51e514e 100644 --- a/application/models/system/Message_model.php +++ b/application/models/system/Message_model.php @@ -242,6 +242,7 @@ class Message_model extends DB_Model */ public function getMessagesForTable($person_id, $offset, $limit) { + $limitoffset = (!is_null($offset) && !is_null($limit)) ? 'limit ? offset ?' : ''; $sql = <<execQuery($sql, $parametersArray); @@ -325,7 +327,7 @@ EOSQL; $data = getData($data); if($data) { - $count = ceil($data[0]->total_msgs / $limit); + $count = is_null($limit) ? 1 : ceil($data[0]->total_msgs / $limit); } return success(['data' => $data, 'count' => $count]); diff --git a/application/models/vertragsbestandteil/VertragsbestandteilLohnguide_model.php b/application/models/vertragsbestandteil/VertragsbestandteilLohnguide_model.php new file mode 100644 index 000000000..6f3f8e47a --- /dev/null +++ b/application/models/vertragsbestandteil/VertragsbestandteilLohnguide_model.php @@ -0,0 +1,11 @@ +dbTable = 'hr.tbl_vertragsbestandteil_lohnguide'; + $this->pk = 'vertragsbestandteil_id'; + } +} diff --git a/application/models/vertragsbestandteil/Vertragsbestandteil_model.php b/application/models/vertragsbestandteil/Vertragsbestandteil_model.php index ce741268d..334a29dfd 100644 --- a/application/models/vertragsbestandteil/Vertragsbestandteil_model.php +++ b/application/models/vertragsbestandteil/Vertragsbestandteil_model.php @@ -37,7 +37,8 @@ class Vertragsbestandteil_model extends DB_Model kf.arbeitgeber_frist, kf.arbeitnehmer_frist, s.wochenstunden, s.teilzeittyp_kurzbz, u.tage, - z.zeitaufzeichnung, z.azgrelevant, z.homeoffice + z.zeitaufzeichnung, z.azgrelevant, z.homeoffice, + lg.stellenbezeichnung, lg.vordienstzeit, lg.fachrichtung_kurzbz, lg.modellstelle_kurzbz, lg.kommentar_person, lg.kommentar_modellstelle FROM hr.tbl_vertragsbestandteil v LEFT JOIN @@ -63,6 +64,8 @@ class Vertragsbestandteil_model extends DB_Model hr.tbl_vertragsbestandteil_urlaubsanspruch u USING(vertragsbestandteil_id) LEFT JOIN hr.tbl_vertragsbestandteil_zeitaufzeichnung z USING(vertragsbestandteil_id) + LEFT JOIN + hr.tbl_vertragsbestandteil_lohnguide lg USING(vertragsbestandteil_id) EOSQL; return $sql; } diff --git a/cis/private/info/service_uebersicht.php b/cis/private/info/service_uebersicht.php index 348a82b0d..ef2516bf7 100644 --- a/cis/private/info/service_uebersicht.php +++ b/cis/private/info/service_uebersicht.php @@ -46,12 +46,13 @@ echo ' - - '; + include('../../../include/meta/jquery.php'); + include('../../../include/meta/jquery-tablesorter.php'); + const MOODLE_ADDON_KURZBZ = 'moodle'; // Load Addons to get Moodle_Path @@ -71,7 +72,7 @@ echo ' $("#myTable").tablesorter( { sortList: [[0,0],[1,0]], - widgets: [\'zebra\'] + widgets: [\'zebra\',\'filter\'] }); } ); @@ -151,8 +152,9 @@ foreach($service->result as $row) $person = new person(); $person->getPersonFromBenutzer($row->operativ_uid); $operativ = $person->nachname.' '.$person->vorname; + $oeBez = new organisationseinheit($row->oe_kurzbz); echo ''; - echo '',$row->oe_kurzbz,''; + echo '',$oeBez->bezeichnung,''; echo ''.$row->bezeichnung.''; echo '',$row->beschreibung,''; echo '',$design,''; diff --git a/cis/testtool/menu.php b/cis/testtool/menu.php index 11e032f0b..494f05567 100644 --- a/cis/testtool/menu.php +++ b/cis/testtool/menu.php @@ -293,7 +293,7 @@ else if (isset($_SESSION['pruefling_id'])) } $lastsemester = $row->semester; - echo ''; + echo '
'; echo ''; } diff --git a/content/mitarbeiter/mitarbeiterfunktionoverlay.xul.php b/content/mitarbeiter/mitarbeiterfunktionoverlay.xul.php index dd685c5da..81eac4d87 100644 --- a/content/mitarbeiter/mitarbeiterfunktionoverlay.xul.php +++ b/content/mitarbeiter/mitarbeiterfunktionoverlay.xul.php @@ -342,6 +342,8 @@ echo '';
'. ($row->semester == '1' ? $p->t('testtool/basisgebiete') : $p->t('testtool/quereinstiegsgebiete')).'
diff --git a/content/mitarbeiter/mitarbeiteroverlay.js.php b/content/mitarbeiter/mitarbeiteroverlay.js.php index 40ed457c3..3391e0013 100644 --- a/content/mitarbeiter/mitarbeiteroverlay.js.php +++ b/content/mitarbeiter/mitarbeiteroverlay.js.php @@ -1708,6 +1708,7 @@ function MitarbeiterEntwicklungsteamSelect() document.getElementById('mitarbeiter-entwicklungsteam-detail-textbox-studiengang').value=studiengang_kz; document.getElementById('mitarbeiter-entwicklungsteam-detail-datum-beginn').value=beginn; document.getElementById('mitarbeiter-entwicklungsteam-detail-datum-ende').value=ende; + document.getElementById('mitarbeiter-entwicklungsteam-detail-entwicklungsteam_id').value=entwicklungsteam_id; MitarbeiterEntwicklungsteamDetailDisableFields(false); } @@ -1725,6 +1726,7 @@ function MitarbeiterEntwicklungsteamSpeichern() studiengang_kz_old = document.getElementById('mitarbeiter-entwicklungsteam-detail-textbox-studiengang').value; beginn = document.getElementById('mitarbeiter-entwicklungsteam-detail-datum-beginn').value; ende = document.getElementById('mitarbeiter-entwicklungsteam-detail-datum-ende').value; + entwicklungsteam_id = document.getElementById('mitarbeiter-entwicklungsteam-detail-entwicklungsteam_id').value; if(studiengang_kz=='') { diff --git a/content/student/studentoverlay.js.php b/content/student/studentoverlay.js.php index 9ebe73cfe..1e40960ca 100644 --- a/content/student/studentoverlay.js.php +++ b/content/student/studentoverlay.js.php @@ -3555,6 +3555,14 @@ function StudentZeugnisDokumentArchivieren() case 'microcredential_2': case 'microcredential_3': case 'microcredential_4': + case 'microdegree_1': + case 'microdegree_2': + case 'microdegree_3': + case 'microdegree_4': + case 'microdegreeabschluss_1': + case 'microdegreeabschluss_2': + case 'microdegreeabschluss_3': + case 'microdegreeabschluss_4': xml = 'microcredential.xml.php'; break; diff --git a/include/entwicklungsteam.class.php b/include/entwicklungsteam.class.php index 70b30d325..b88c3971e 100644 --- a/include/entwicklungsteam.class.php +++ b/include/entwicklungsteam.class.php @@ -364,9 +364,10 @@ class entwicklungsteam extends basis_db $bismeldung_jahr = $datetime->format('Y'); //laden des Datensatzes - $qry = "SELECT * + $qry = "SELECT tbl_entwicklungsteam.*, tbl_besqual.*, tbl_studiengang.studiengang_kz, tbl_studiengang.melderelevant FROM bis.tbl_entwicklungsteam JOIN bis.tbl_besqual USING(besqualcode) + JOIN public.tbl_studiengang USING(studiengang_kz) WHERE mitarbeiter_uid=".$this->db_add_param($mitarbeiter_uid)." AND (beginn is NULL OR beginn <= make_date(". $this->db_add_param($bismeldung_jahr). "::INTEGER, 12, 31)) AND (ende is NULL OR ende >= make_date(". $this->db_add_param($bismeldung_jahr). "::INTEGER, 1, 1))"; @@ -394,6 +395,7 @@ class entwicklungsteam extends basis_db $obj->insertvon = $row->insertvon; $obj->ext_id = $row->ext_id; $obj->besqual = $row->besqualbez; + $obj->melderelevant = $this->db_parse_bool($row->melderelevant); $this->result[] = $obj; } diff --git a/include/konto.class.php b/include/konto.class.php index 51f79200b..d3167d5f5 100644 --- a/include/konto.class.php +++ b/include/konto.class.php @@ -25,6 +25,7 @@ */ require_once(dirname(__FILE__).'/basis_db.class.php'); require_once(dirname(__FILE__).'/'.EXT_FKT_PATH.'/generateZahlungsreferenz.inc.php'); +require_once(dirname(__FILE__).'/variable.class.php'); class konto extends basis_db { @@ -432,6 +433,8 @@ class konto extends basis_db $qry.=" ORDER BY beschreibung"; + $oehBeitrag = $this->_getOEHBeitrag(); + if($this->db_query($qry)) { while($row = $this->db_fetch_object()) @@ -440,7 +443,15 @@ class konto extends basis_db $typ->buchungstyp_kurzbz = $row->buchungstyp_kurzbz; $typ->beschreibung = $row->beschreibung; - $typ->standardbetrag = $row->standardbetrag; + if (strtolower($typ->buchungstyp_kurzbz) === 'oeh' && $oehBeitrag) + { + $typ->standardbetrag = $oehBeitrag; + } + else + { + $typ->standardbetrag = $row->standardbetrag; + } + $typ->standardtext = $row->standardtext; $typ->credit_points = $row->credit_points; $typ->aktiv = $this->db_parse_bool($row->aktiv); @@ -990,6 +1001,43 @@ class konto extends basis_db return false; } } + + private function _getOEHBeitrag() + { + if(!is_user_logged_in()) + { + return false; + } + + $variablen_obj = new variable(); + $variablen_obj->loadVariables(get_uid()); + + $qry = "WITH semstart AS ( + SELECT start FROM public.tbl_studiensemester + WHERE studiensemester_kurzbz = '". $this->db_escape($variablen_obj->variable->semester_aktuell) . "' + ) + SELECT * FROM bis.tbl_oehbeitrag oehb + JOIN public.tbl_studiensemester semvon ON oehb.von_studiensemester_kurzbz = semvon.studiensemester_kurzbz + LEFT JOIN public.tbl_studiensemester sembis ON oehb.bis_studiensemester_kurzbz = sembis.studiensemester_kurzbz + JOIN semstart ON semstart.start::date >= semvon.start::date AND (sembis.studiensemester_kurzbz IS NULL OR semstart.start::date <= sembis.start::date) + ORDER BY semvon.start + LIMIT 1"; + + if ($this->db_query($qry)) + { + if($row = $this->db_fetch_object()) + { + $summe = ($row->studierendenbeitrag + $row->versicherung) * -1; + return number_format((float)$summe, 2, '.', ''); + } + return false; + } + else + { + $this->errormsg = 'Fehler bei der Abfrage aufgetreten'; + return false; + } + } } ?> diff --git a/include/lehreinheitmitarbeiter.class.php b/include/lehreinheitmitarbeiter.class.php index b892863e8..38000a2a5 100644 --- a/include/lehreinheitmitarbeiter.class.php +++ b/include/lehreinheitmitarbeiter.class.php @@ -584,8 +584,9 @@ class lehreinheitmitarbeiter extends basis_db $qry = ' WITH semester_sws_tbl AS ( - SELECT DISTINCT lehreinheit_id, studiensemester_kurzbz, lema.semesterstunden, - stg.studiengang_kz, stg.melde_studiengang_kz, stg.lgartcode + SELECT + DISTINCT lehreinheit_id, studiensemester_kurzbz, lema.semesterstunden, + stg.studiengang_kz, stg.melde_studiengang_kz, stg.lgartcode, stg.melderelevant FROM lehre.tbl_lehreinheitmitarbeiter lema JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id) @@ -598,6 +599,7 @@ class lehreinheitmitarbeiter extends basis_db AND ss.studiensemester_kurzbz IN ('.$this->implode4SQL($studiensemester_kurzbz_arr).') -- nur lehre, die bisgemeldet wird AND lema.bismelden + AND stg.melderelevant -- keine lehreinheiten ohne semesterstunden AND lema.semesterstunden != 0 ) diff --git a/public/css/Studentenverwaltung.css b/public/css/Studentenverwaltung.css index cb4b8f2e9..fb56ec75c 100644 --- a/public/css/Studentenverwaltung.css +++ b/public/css/Studentenverwaltung.css @@ -197,10 +197,6 @@ html.fs_huge { margin-bottom: -1px; } -.tiny-90 div.tox.tox-tinymce { - height: 90% !important; -} - /* slim begin */ .stv .form-label { margin-bottom: .15rem; diff --git a/public/js/api/factory/messages/messages.js b/public/js/api/factory/messages/messages.js index b7b21dd8a..fb752cfb4 100644 --- a/public/js/api/factory/messages/messages.js +++ b/public/js/api/factory/messages/messages.js @@ -17,13 +17,16 @@ export default { getMessages(params) { + let url = 'api/frontend/v1/messages/messages/getMessages' + + '/' + params.id + + '/' + params.type; + if(params.size && params.page) { + url += '/' + params.size + + '/' + params.page; + } return { method: 'get', - url: 'api/frontend/v1/messages/messages/getMessages/' - + params.id + '/' - + params.type + '/' - + params.size + '/' - + params.page + url: url }; }, getVorlagen(){ diff --git a/public/js/api/factory/stv/konto.js b/public/js/api/factory/stv/konto.js index 6c17d460d..c6c167f6a 100644 --- a/public/js/api/factory/stv/konto.js +++ b/public/js/api/factory/stv/konto.js @@ -38,6 +38,10 @@ export default { }; }, insert(params) { + if(params.betrag) + { + params.betrag = params.betrag.replace(',', '.'); + } return { method: 'post', url: 'api/frontend/v1/stv/konto/insert', @@ -52,6 +56,10 @@ export default { }; }, edit(params) { + if(params.betrag) + { + params.betrag = params.betrag.replace(',', '.'); + } return { method: 'post', url: 'api/frontend/v1/stv/konto/update', @@ -65,10 +73,14 @@ export default { params: { buchungsnr } }; }, - getBuchungstypen() { + getBuchungstypen(studiensemester_kurzbz) { + let url = 'api/frontend/v1/stv/konto/getBuchungstypen' + if (!!studiensemester_kurzbz) + url = url + '/' + encodeURIComponent(studiensemester_kurzbz); + return { method: 'get', - url: 'api/frontend/v1/stv/konto/getBuchungstypen' + url: url }; - } + }, }; \ No newline at end of file diff --git a/public/js/components/Messages/Details/NewMessage/Modal.js b/public/js/components/Messages/Details/NewMessage/Modal.js index 47187de89..b23eebbcd 100644 --- a/public/js/components/Messages/Details/NewMessage/Modal.js +++ b/public/js/components/Messages/Details/NewMessage/Modal.js @@ -63,7 +63,7 @@ export default { const vm = this; tinymce.init({ target: this.$refs.editor.$refs.input, //Important: not selector: to enable multiple import of component - //height: 800, + min_height: 300, //plugins: ['lists'], toolbar: 'styleselect | bold italic underline | alignleft aligncenter alignright alignjustify | link', plugins: 'link', @@ -133,6 +133,7 @@ export default { return this.$api .call(ApiMessages.getDataVorlage(vorlage_kurzbz)) .then(response => { + this.editor.setContent(response.data.text); this.formData.body = response.data.text; this.formData.subject = response.data.subject; }).catch(this.$fhcAlert.handleSystemError); @@ -203,24 +204,6 @@ export default { }, }, watch: { - 'formData.body': { - handler(newVal) { - const tinymcsVal = this.editor.getContent(); - - if (newVal && tinymcsVal != newVal) { - //Inhalt des Editors aktualisieren - this.editor.setContent(newVal); - } - } - }, - 'formData.vorlage_kurzbz': { - handler(newVal){ - if (newVal && newVal != null) { - this.formData.subject = newVal; - return this.getDataVorlage(newVal); - } - } - }, messageId: { immediate: true, handler: async function (newMessageId) { @@ -231,6 +214,7 @@ export default { this.replyData = result.data; if (this.replyData.length > 0) { + this.editor.setContent(this.replyData[0].replyBody); this.formData.subject = this.replyData[0].replySubject; this.formData.body = this.replyData[0].replyBody; this.formData.relationmessage_id = newMessageId; @@ -290,19 +274,6 @@ export default { }) .catch(this.$fhcAlert.handleSystemError); - - //case of reply - if(this.messageId) { - this.$api - .call(ApiMessages.getReplyData(this.messageId)) - .then(result => { - this.replyData = result.data; - this.formData.subject = this.replyData[0].replySubject; - this.formData.body = this.replyData[0].replyBody; - this.formData.relationmessage_id = this.messageId; - }) - .catch(this.$fhcAlert.handleSystemError); - } }, async mounted() { this.initTinyMCE(); @@ -342,7 +313,7 @@ export default {
- +
@@ -367,7 +338,7 @@ export default {
-
+
{ - this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSent')); + if(this.openMode == "inSamePage") + this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSent')); this.hideTemplate(); this.resetForm(); this.messageSent = true; @@ -114,19 +124,17 @@ export default { return this.$api .call(ApiMessages.getDataVorlage(vorlage_kurzbz)) .then(response => { + this.editor.setContent(response.data.text); this.formData.body = response.data.text; this.formData.subject = response.data.subject; }).catch(this.$fhcAlert.handleSystemError); }, getPreviewText(){ - console.log("subj" + this.formData.subject); const data = new FormData(); data.append('data', JSON.stringify(this.formData.body)); data.append('ids', JSON.stringify(this.id)); - console.log("subj" + this.formData.subject); - return this.$api .call(ApiMessages.getPreviewText( this.typeId, data)) @@ -195,6 +203,7 @@ export default { .call(ApiMessages.getReplyData(messageId)) .then(result => { this.replyData = result.data; + this.editor.setContent(this.replyData[0].replyBody); this.formData.subject = this.replyData[0].replySubject; this.formData.body = this.replyData[0].replyBody; this.formData.relationmessage_id = messageId; @@ -202,27 +211,6 @@ export default { .catch(this.$fhcAlert.handleSystemError); } }, - watch: { - 'formData.body': { - handler(newVal) { - const tinymcsVal = this.editor.getContent(); - - if (newVal && tinymcsVal != newVal) { - //Inhalt des Editors aktualisieren - this.editor.setContent(newVal); - } - } - }, - 'formData.vorlage_kurzbz': { - handler(newVal){ - - if (newVal && newVal != null) { - this.formData.subject = newVal; - return this.getDataVorlage(newVal); - } - } - }, - }, created(){ const missingparamsmsgs = []; if(!this.typeId) @@ -291,17 +279,8 @@ export default { .catch(this.$fhcAlert.handleSystemError); //case of reply - if(this.messageId != null) { + if(this.messageId) { this.loadReplyData(this.messageId); -/* this.$api - .call(ApiMessages.getReplyData(this.messageId)) - .then(result => { - this.replyData = result.data; - this.formData.subject = this.replyData[0].replySubject; - this.formData.body = this.replyData[0].replyBody; - this.formData.relationmessage_id = this.messageId; - }) - .catch(this.$fhcAlert.handleSystemError);*/ } }, @@ -499,10 +478,10 @@ export default {
- You can safely close this window. + You can safely close this window/tab.
- Sie können dieses Fenster schließen. + Fenster/Reiter kann geschlossen werden!
diff --git a/public/js/components/Messages/Details/TableMessages.js b/public/js/components/Messages/Details/TableMessages.js index d2101e2cb..d523d5362 100644 --- a/public/js/components/Messages/Details/TableMessages.js +++ b/public/js/components/Messages/Details/TableMessages.js @@ -30,6 +30,7 @@ export default { personId: null, layoutColumnsOnNewData: false, height: '400', + arePhrasesLoaded: false } }, methods: { @@ -65,7 +66,14 @@ export default { buildTreemap(messages) { if (!messages || !messages.data || messages.data.length === 0) { - return {data: [], last_page: 0}; + if(this.tabulatorOptions.pagination) + { + return {data: [], last_page: 0}; + } + else + { + return []; + } } const last_page = messages.meta.count; @@ -106,7 +114,15 @@ export default { // to avoid endless loop if (iteration > messages.length) break; } - return {data: messageNested, last_page: last_page}; + + if(this.tabulatorOptions.pagination) + { + return {data: messageNested, last_page: last_page}; + } + else + { + return messageNested; + } }, loadAjaxCall(url, config, params){ return this.$api.call( @@ -180,7 +196,7 @@ export default { ], formatter: (cell, formatterParams) => { const key = formatterParams[cell.getValue()]; - return this.$p.t('messages', key); + return this.$p?.t?.('messages', key) || key; }, }, { @@ -252,7 +268,7 @@ export default { frozen: true } ], - pagination: true, + pagination: false, paginationMode: "remote", paginationSize: 15, paginationInitialPage: 1, @@ -290,8 +306,6 @@ export default { { event: 'tableBuilt', handler: async() => { - await this.$p.loadCategory(['global', 'person', 'stv', 'messages', 'ui', 'notiz']); - const setHeader = (field, text) => { const col = this.$refs.table.tabulator.getColumn(field); if (!col) return; @@ -342,6 +356,12 @@ export default { });*/ }, created(){ + this.$p + .loadCategory(['global', 'person', 'stv', 'messages', 'ui', 'notiz']) + .then(() => { + this.arePhrasesLoaded = true; + }); + if(this.typeId != 'person_id' && Array.isArray(this.id) && this.id.length === 1) { const params = { id: this.id, @@ -366,6 +386,7 @@ export default {
{ + if(messageId) + this.$refs.templateNewDivMessage.loadReplyData(messageId); + else + this.$refs.templateNewDivMessage.resetForm(); + + this.$refs.templateNewDivMessage.showTemplate(); + }); } else console.log("no valid openMode"); diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Archiv.js b/public/js/components/Stv/Studentenverwaltung/Details/Archiv.js index 9d8104ba5..ca5a5a0ca 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Archiv.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Archiv.js @@ -84,6 +84,14 @@ export default { 'microcredential_2', 'microcredential_3', 'microcredential_4', + 'microdegree_1', + 'microdegree_2', + 'microdegree_3', + 'microdegree_4', + 'microdegreeabschluss_1', + 'microdegreeabschluss_2', + 'microdegreeabschluss_3', + 'microdegreeabschluss_4', ] }, documentDropdownObject: {} diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Konto/New.js b/public/js/components/Stv/Studentenverwaltung/Details/Konto/New.js index cdb32de99..4060b5961 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Konto/New.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Konto/New.js @@ -83,6 +83,8 @@ export default { }); }, open() { + + this.getBuchungstypen(this.currentSemester); this.data = { buchungstyp_kurzbz: '', betrag: '-0.00', @@ -105,7 +107,7 @@ export default { const text = typ.standardtext || ''; const creditpoints = typ.credit_points || ''; - if (!this.data.betrag || this.data.betrag == '-0.00') + if (!this.data.betrag || this.data.betrag == '-0.00' || this.data.betrag !== amount) this.data.betrag = amount; if (!this.data.buchungstext) @@ -113,7 +115,18 @@ export default { if (this.config.showCreditpoints && (this.data.credit_points == '0.00' || this.data.credit_points === null)) this.data.credit_points = creditpoints; - } + }, + getBuchungstypen(studiensemester_kurzbz) + { + this.$api + .call(ApiKonto.getBuchungstypen(studiensemester_kurzbz)) + .then(result => { + this.lists.buchungstypen = result.data; + if (this.data.buchungstyp_kurzbz) + this.checkDefaultBetrag(this.data.buchungstyp_kurzbz); + }) + .catch(this.$fhcAlert.handleSystemError); + }, }, template: ` @@ -166,6 +179,7 @@ export default { diff --git a/public/js/components/Vertraege/List/Details.js b/public/js/components/Vertraege/List/Details.js index 8df6a6985..c43f8c893 100644 --- a/public/js/components/Vertraege/List/Details.js +++ b/public/js/components/Vertraege/List/Details.js @@ -41,8 +41,8 @@ export default { ), ajaxResponse: (url, params, response) => response.data, columns: [ - {title: "Typ", field: "type"}, - {title: "Betrag", field: "betrag", + {title: "Typ", field: "type", headerFilter: "list", headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"}}, + {title: "Betrag", field: "betrag", headerFilter: true, formatter: function(cell) { let value = cell.getValue(); if (value == null) { @@ -51,14 +51,14 @@ export default { return parseFloat(value).toFixed(2); } }, - {title: "Bezeichnung", field: "bezeichnung"}, - {title: "Studiensemester", field: "studiensemester_kurzbz"}, - {title: "Pruefung_id", field: "pruefung_id", visible: false}, - {title: "mitarbeiter_uid", field: "mitarbeiter_uid", visible: false}, - {title: "projektarbeit_id", field: "projektarbeit_id", visible: false}, - {title: "lehreinheit_id", field: "lehreinheit_id", visible: true}, - {title: "betreuerart_kurzbz", field: "betreuerart_kurzbz", visible: false}, - {title: "vertrag_id", field: "vertrag_id", visible: false}, //just for testing + {title: "Bezeichnung", field: "bezeichnung", headerFilter: true}, + {title: "Studiensemester", field: "studiensemester_kurzbz", headerFilter: "list", headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"}}, + {title: "Pruefung_id", field: "pruefung_id", visible: false, headerFilter: true}, + {title: "mitarbeiter_uid", field: "mitarbeiter_uid", visible: false, headerFilter: true}, + {title: "projektarbeit_id", field: "projektarbeit_id", visible: false, headerFilter: true}, + {title: "lehreinheit_id", field: "lehreinheit_id", visible: true, headerFilter: true}, + {title: "betreuerart_kurzbz", field: "betreuerart_kurzbz", visible: false, headerFilter: true}, + {title: "vertrag_id", field: "vertrag_id", visible: false, headerFilter: true}, //just for testing { title: 'Aktionen', field: 'actions', minWidth: 50, @@ -110,10 +110,10 @@ export default { ], layout: 'fitColumns', layoutColumnsOnNewData: false, - height: '200', + height: '250', selectableRowsRangeMode: 'click', selectableRows: true, - persistenceID: 'core-contracts-details-2026021701' + persistenceID: 'core-contracts-details-2026050501' }, tabulatorEvents: [ { @@ -137,7 +137,7 @@ export default { setHeader('type', this.$p.t('global', 'typ')); setHeader('bezeichnung', this.$p.t('ui', 'bezeichnung')); - setHeader('lehreinheit_id', this.$p.t('ui', 'lehreinheit_id')); + setHeader('lehreinheit_id', this.$p.t('lehre', 'lehreinheit_id')); setHeader('betrag', this.$p.t('ui', 'betrag')); setHeader('studiensemester_kurzbz', this.$p.t('lehre', 'studiensemester')); setHeader('mitarbeiter_uid', this.$p.t('ui', 'mitarbeiter_uid')); diff --git a/public/js/components/Vertraege/List/Status.js b/public/js/components/Vertraege/List/Status.js index 531b2f553..53af7bc40 100644 --- a/public/js/components/Vertraege/List/Status.js +++ b/public/js/components/Vertraege/List/Status.js @@ -47,12 +47,13 @@ export default { this.endpoint.getStatiOfContract(this.person_id, this.vertrag_id) ), ajaxResponse: (url, params, response) => response.data, - persistenceID: 'core-contracts-status-2026021701', + persistenceID: 'core-contracts-status-2026050501', columns: [ - {title: "Status", field: "bezeichnung"}, + {title: "Status", field: "bezeichnung", headerFilter: "list", headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"}}, { title: "Datum", field: "datum", + headerFilter: true, formatter: function (cell) { const dateStr = cell.getValue(); const date = new Date(dateStr); // Convert to Date object @@ -66,14 +67,15 @@ export default { }); } }, - {title: "vertrag_id", field: "vertrag_id", visible: false}, - {title: "Vertragsstatus", field: "vertragsstatus_kurzbz", visible: false}, - {title: "User", field: "mitarbeiter_uid", visible: false}, - {title: "insertvon", field: "insertvon", visible: false}, + {title: "vertrag_id", field: "vertrag_id", visible: false, headerFilter: true}, + {title: "Vertragsstatus", field: "vertragsstatus_kurzbz", visible: false, headerFilter: true}, + {title: "User", field: "mitarbeiter_uid", visible: false, headerFilter: true}, + {title: "insertvon", field: "insertvon", visible: false, headerFilter: true}, { title: "insertamum", field: "insertamum", visible: false, + headerFilter: true, formatter: function (cell) { const dateStr = cell.getValue(); const date = new Date(dateStr); @@ -87,11 +89,12 @@ export default { }); } }, - {title: "updatevon", field: "updatevon", visible: false}, + {title: "updatevon", field: "updatevon", visible: false, headerFilter: true}, { title: "updateamum", field: "updateamum", visible: false, + headerFilter: true, formatter: function (cell) { const dateStr = cell.getValue(); const date = new Date(dateStr); @@ -148,7 +151,7 @@ export default { ], layout: 'fitColumns', layoutColumnsOnNewData: false, - height: '200', + height: '250', selectableRowsRangeMode: 'click', selectableRows: true, }, diff --git a/public/js/components/Vertraege/List/Unassigned.js b/public/js/components/Vertraege/List/Unassigned.js index 655a2b078..1b4b728e7 100644 --- a/public/js/components/Vertraege/List/Unassigned.js +++ b/public/js/components/Vertraege/List/Unassigned.js @@ -30,10 +30,11 @@ export default { ), ajaxResponse: (url, params, response) => response.data, columns: [ - {title: "Typ", field: "type", width: 100}, + {title: "Typ", field: "type", width: 100, headerFilter: "list", headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"}}, { title: "Betrag", field: "betrag1", + headerFilter: true, formatter: function(cell) { let value = cell.getValue(); if (value == null) { @@ -41,28 +42,29 @@ export default { } return parseFloat(value).toFixed(2); }}, - {title: "Bezeichnung", field: "bezeichnung", width: 150}, - {title: "Studiensemester", field: "studiensemester_kurzbz", width: 160}, - {title: "mitarbeiter_uid", field: "mitarbeiter_uid", visible: false}, - {title: "projektarbeit_id", field: "projektarbeit_id", visible: false}, - {title: "lehreinheit_id", field: "lehreinheit_id", visible: true}, - {title: "betreuerart_kurzbz", field: "betreuerart_kurzbz", visible: false}, - {title: "Vertragsstunden", field: "vertragsstunden", visible: false}, - {title: "vertrag_id", field: "vertrag_id", visible: false}, //just for testing + {title: "Bezeichnung", field: "bezeichnung", width: 150, headerFilter: true}, + {title: "Studiensemester", field: "studiensemester_kurzbz", width: 160, headerFilter: "list", headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"}}, + {title: "mitarbeiter_uid", field: "mitarbeiter_uid", visible: false, headerFilter: true}, + {title: "projektarbeit_id", field: "projektarbeit_id", visible: false, headerFilter: true}, + {title: "lehreinheit_id", field: "lehreinheit_id", visible: true, headerFilter: true}, + {title: "betreuerart_kurzbz", field: "betreuerart_kurzbz", visible: false, headerFilter: true}, + {title: "Vertragsstunden", field: "vertragsstunden", visible: false, headerFilter: true}, + {title: "vertrag_id", field: "vertrag_id", visible: false, headerFilter: true}, //just for testing { title: "VertragsstundenStudiensemester", field: "vertragsstunden_studiensemester_kurzbz", - visible: false + visible: false, + headerFilter: true }, ], layout: 'fitColumns', layoutColumnsOnNewData: false, - height: 150, + height: 250, selectableRowsRangeMode: 'click', selectableRows: true, selectableRowsRollingSelection: false, //only allow multiselect with STRG index: "lehreinheit_id", - persistenceID: 'core-contracts-unassigned-2026021701' + persistenceID: 'core-contracts-unassigned-2026050501' }, tabulatorEvents: [ { @@ -100,7 +102,7 @@ export default { setHeader('type', this.$p.t('global', 'typ')); setHeader('bezeichnung', this.$p.t('ui', 'bezeichnung')); - setHeader('lehreinheit_id', this.$p.t('ui', 'lehreinheit_id')); + setHeader('lehreinheit_id', this.$p.t('lehre', 'lehreinheit_id')); setHeader('betrag1', this.$p.t('ui', 'betrag')); setHeader('studiensemester_kurzbz', this.$p.t('lehre', 'studiensemester')); setHeader('mitarbeiter_uid', this.$p.t('ui', 'mitarbeiter_uid')); diff --git a/public/js/components/Vertraege/Vertraege.js b/public/js/components/Vertraege/Vertraege.js index d4d65e428..b166e71ba 100644 --- a/public/js/components/Vertraege/Vertraege.js +++ b/public/js/components/Vertraege/Vertraege.js @@ -20,9 +20,6 @@ export default { ContractStati }, inject: { -/* cisRoot: { - from: 'cisRoot' - },*/ hasSchreibrechte: { from: 'hasSchreibrechte', default: false @@ -54,9 +51,9 @@ export default { ), ajaxResponse: (url, params, response) => response.data, columns: [ - {title: "Bezeichnung", field: "bezeichnung", width: 300}, + {title: "Bezeichnung", field: "bezeichnung", width: 300, headerFilter: true}, { - title: "Betrag", field: "betrag", width: 100, + title: "Betrag", field: "betrag", width: 100, headerFilter: true, formatter: function (cell) { let value = cell.getValue(); @@ -66,12 +63,13 @@ export default { return parseFloat(value).toFixed(2); } }, - {title: "Vertragstyp", field: "vertragstyp_bezeichnung", width: 125}, - {title: "Status", field: "status", width: 100}, + {title: "Vertragstyp", field: "vertragstyp_bezeichnung", width: 125, headerFilter: "list", headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"}}, + {title: "Status", field: "status", width: 100, headerFilter: "list", headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"}}, { title: "Vertragsdatum", field: "vertragsdatum", width: 128, + headerFilter: true, formatter: function (cell) { const dateStr = cell.getValue(); const date = new Date(dateStr); @@ -82,11 +80,11 @@ export default { }); } }, - {title: "VertragId", field: "vertrag_id", visible: false}, - {title: "Vertragsstunden", field: "vertragsstunden", visible: false}, - {title: "VertragsstundenStudiensemester", field: "vertragsstunden_studiensemester_kurzbz", visible: false}, - {title: "Anmerkung", field: "anmerkung", visible: false}, - {title: "isAbgerechnet", field: "isabgerechnet", visible: false}, + {title: "VertragId", field: "vertrag_id", visible: false, headerFilter: true}, + {title: "Vertragsstunden", field: "vertragsstunden", visible: false, headerFilter: true}, + {title: "VertragsstundenStudiensemester", field: "vertragsstunden_studiensemester_kurzbz", visible: false, headerFilter: true}, + {title: "Anmerkung", field: "anmerkung", visible: false, headerFilter: true}, + {title: "isAbgerechnet", field: "isabgerechnet", visible: false, headerFilter: true}, { title: 'Aktionen', field: 'actions', minWidth: 150, @@ -140,11 +138,13 @@ export default { columns: true, filter: false //to avoids js errors }, - persistenceID: 'core-contracts-2026021701', + persistenceID: 'core-contracts-2026050501', }; return options; }, tabulatorEvents() { + const vm = this; + const events = [ { event: 'tableBuilt', @@ -177,28 +177,11 @@ export default { setHeader('actions', this.$p.t('global', 'aktionen')); } }, -/* { - //is just enabled for ADDON Injection KU: MultiprintHonorarvertrag - //(maybe enable also for ADDON FH Burgenland: MultiAccept later) - event: 'rowClick', - handler: (e, row) => { - if (this.dataPrintHonorar != null && this.dataPrintHonorar.multiselect != null) { - const selectedContract = row.getData().vertrag_id; - const status = row.getData().status; - const bezeichnung = row.getData().bezeichnung; - - this.toggleRowClick(selectedContract, status, bezeichnung); - } - } - },*/ { event: 'rowClick', - handler: (e, row) => { - if (!this.dataPrintHonorar?.multiselect) return; - + handler: function (e, row) { const { vertrag_id, status, bezeichnung, vertragstyp_bezeichnung } = row.getData(); - - this.toggleRowClick(e, vertrag_id, status, bezeichnung, vertragstyp_bezeichnung); + vm.toggleRowClick(e, vertrag_id, status, bezeichnung, vertragstyp_bezeichnung); } }, { @@ -242,8 +225,6 @@ export default { person_id() { this.$refs.table.reloadTable(); this.arraySelectedContracts = []; -/* if(this.dataPrintHonorar?.multiselect) - this.dataPrintHonorar.multiselect = [];*/ }, }, methods: { @@ -270,7 +251,6 @@ export default { ) .then(result => { this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successDelete')); - //window.scrollTo(0, 0); this.reload(); this.contractSelected.vertrag_id = null; }) @@ -518,19 +498,9 @@ export default { 'content/pdfExport.php?xml=' + this.dataPrintHonorar.xml + '&xsl=' + this.dataPrintHonorar.xsl + '&mitarbeiter_uid=' + this.mitarbeiter_uid + vertragString + '&output=pdf&uid=' + this.mitarbeiter_uid; window.open(linkToPdf, '_blank'); }, -/* toggleRowClick(contractId, status, bezeichnung) { - const index = this.arraySelectedContracts.findIndex( - ([id]) => id === contractId - ); - if (index !== -1) { - this.arraySelectedContracts.splice(index, 1); - } else { - this.arraySelectedContracts.push([contractId, status, bezeichnung]); - } - },*/ toggleRowClick(event, vertrag_id, status, bezeichnung, vertragstyp_bezeichnung) { - if (!this.dataPrintHonorar?.multiselect) return; + const isMulti = this.dataPrintHonorar?.multiselect === true; const isCtrl = event.ctrlKey || event.metaKey; const entry = { @@ -540,28 +510,29 @@ export default { vertragstyp_bezeichnung }; - // Single click - if (!isCtrl) { + // allow MultiSelect just in case event multiActionPrintHonorarvertrag + const allowMultiClick = isMulti && isCtrl; + + if (!allowMultiClick) { this.arraySelectedContracts = [entry]; + + //just mark last selected row as selected + this.$refs.table.tabulator.deselectRow(); + this.$refs.table.tabulator.selectRow(vertrag_id); return; } - // CTRL / CMD → toggle const index = this.arraySelectedContracts.findIndex( e => e.vertrag_id === vertrag_id ); if (index === -1) { this.arraySelectedContracts.push(entry); - //this.arraySelectedContracts.push([entry.vertrag_id, entry.status, entry.bezeichnung, entry.vertragstyp_bezeichnung]); } else { this.arraySelectedContracts.splice(index, 1); } - }, -/* clearSelection(){ - this.arraySelectedContracts = []; - this.$refs.table.tabulator.deselectRow(); - }*/ + + } }, created() { Promise.all([ @@ -587,88 +558,6 @@ export default { }); this.getFormattedDate(); }, - /* - TODO(Manu) delete after check - -
- - -
- -
- - -
-
- - - - -
-
- - -
-
- - -
-
- - -
-
- - -
- */ template: `
diff --git a/skin/styles/tw.css b/skin/styles/tw.css index 1caf01132..034764068 100644 --- a/skin/styles/tw.css +++ b/skin/styles/tw.css @@ -450,18 +450,18 @@ td.MarkLine td.HeaderTesttool /*fuer die Button-Optik beim Testtool*/ { color: #FFFFFF; - background-color: #00639C; + background-color: #71787D; white-space:nowrap; line-height: 25px; box-shadow: inset 0 0 2px #FFFFFF; - padding: 10px; + padding: 0 10px; width: 170px; } td.HeaderTesttoolSTG /*fuer die Button-Optik der Quereinstiegs-Studiengänge beim Testtool*/ { color: white; border: 2px solid #73a9d6; - padding: 10px; + padding: 0 10px; max-width: 100px; overflow: hidden; text-overflow: ellipsis; diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index ac8695de2..8b6af9f2d 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -93,6 +93,7 @@ require_once('dbupdate_3.4/62889_reihungstest_ueberwachung_mit_constructor.php') require_once('dbupdate_3.4/71399_dashboard_update_widget_paths.php'); require_once('dbupdate_3.4/71645_studvw_messagetab_ladezeit.php'); require_once('dbupdate_3.4/71566_studienordnungsdokument_neuer_organisationseinheitstyp_programm.php'); +require_once('dbupdate_3.4/70376_lohnguide.php'); // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; @@ -240,6 +241,11 @@ $tabellen=array( "hr.tbl_valorisierung_instanz" => array("updateamum", "oe_kurzbz", "valorisierungsdatum", "valorisierung_kurzbz", "beschreibung", "ausgewaehlt", "updatevon", "valorisierung_instanz_id"), "hr.tbl_valorisierung_instanz_methode" => array("valorisierung_instanz_id", "valorisierung_methode_kurzbz", "beschreibung", "valorisierung_methode_parameter"), "hr.tbl_valorisierung_methode" => array("beschreibung", "valorisierung_methode_kurzbz"), + "hr.tbl_lohnguide_jobfamilie" => array("jobfamilie_kurzbz", "bezeichnung", "aktiv", "sort", "insertvon", "insertamum", "updatevon", "updateamum"), + "hr.tbl_lohnguide_modellfunktion" => array("modellfunktion_kurzbz", "bezeichnung", "jobfamilie_kurzbz", "aktiv", "sort", "insertvon", "insertamum", "updatevon", "updateamum"), + "hr.tbl_lohnguide_modellstelle" => array("modellstelle_kurzbz", "bezeichnung", "grade", "modellfunktion_kurzbz", "aktiv", "sort", "insertvon", "insertamum", "updatevon", "updateamum"), + "hr.tbl_lohnguide_fachrichtung" => array("fachrichtung_kurzbz", "bezeichnung", "aktiv", "insertvon", "insertamum", "updatevon", "updateamum"), + "hr.tbl_vertragsbestandteil_lohnguide" => array("vertragsbestandteil_id", "stellenbezeichnung", "vordienstzeit", "fachrichtung_kurzbz", "modellstelle_kurzbz", "kommentar_person", "kommentar_modellstelle"), "lehre.tbl_abschlussbeurteilung" => array("abschlussbeurteilung_kurzbz","bezeichnung","bezeichnung_english","sort"), "lehre.tbl_abschlusspruefung" => array("abschlusspruefung_id","student_uid","vorsitz","pruefer1","pruefer2","pruefer3","abschlussbeurteilung_kurzbz","akadgrad_id","pruefungstyp_kurzbz","datum","uhrzeit","sponsion","anmerkung","updateamum","updatevon","insertamum","insertvon","ext_id","note","protokoll","endezeit","pruefungsantritt_kurzbz","freigabedatum"), "lehre.tbl_abschlusspruefung_antritt" => array("pruefungsantritt_kurzbz","bezeichnung","bezeichnung_english","sort"), diff --git a/system/dbupdate_3.4/70376_lohnguide.php b/system/dbupdate_3.4/70376_lohnguide.php new file mode 100644 index 000000000..6cf2be38e --- /dev/null +++ b/system/dbupdate_3.4/70376_lohnguide.php @@ -0,0 +1,357 @@ +db_query("SELECT * FROM information_schema.tables WHERE table_name='tbl_lohnguide_jobfamilie' AND table_schema='hr'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = " +CREATE TABLE IF NOT EXISTS hr.tbl_lohnguide_jobfamilie ( + jobfamilie_kurzbz character varying(32) NOT NULL, + bezeichnung varchar(64) NOT NULL, + aktiv boolean DEFAULT FALSE, + sort smallint, + insertvon character varying(32) NOT NULL, + insertamum timestamp without time zone DEFAULT now() NOT NULL, + updatevon character varying(32), + updateamum timestamp without time zone, + CONSTRAINT tbl_lohnguide_jobfamilie_pkey PRIMARY KEY (jobfamilie_kurzbz) +); + +GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE hr.tbl_lohnguide_jobfamilie TO vilesci; + +INSERT INTO hr.tbl_lohnguide_jobfamilie(jobfamilie_kurzbz, bezeichnung,aktiv, sort, insertvon, insertamum) VALUES +('FÜHRUNG','Führung',true,1,'system',NOW()), +('AKADEMIA','Akademia',true,2,'system',NOW()), +('VERWALTUNG','Verwaltung',true,3,'system',NOW()), +('TECHNIK','Technik',true,4,'system',NOW()), +('IT_SOFTWARE','IT & Software',true,5,'system',NOW()), +('TECHN_DIENSTE','Technische Dienste',true,6,'system',NOW()) +ON CONFLICT (jobfamilie_kurzbz) DO NOTHING; + "; + + if (! $db->db_query($qry)) + echo 'Lohnguide Jobfamilie: ' . $db->db_last_error() . '
'; + else + echo 'hr.tbl_lohnguide_jobfamilie wurde neu erstellt
'; + } +} + +if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table_name='tbl_lohnguide_modellfunktion' AND table_schema='hr'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = " +CREATE TABLE IF NOT EXISTS hr.tbl_lohnguide_modellfunktion ( + modellfunktion_kurzbz character varying(32) NOT NULL, + bezeichnung varchar(64) NOT NULL, + jobfamilie_kurzbz character varying(32) NOT NULL, + aktiv boolean DEFAULT FALSE, + sort smallint, + insertvon character varying(32) NOT NULL, + insertamum timestamp without time zone DEFAULT now() NOT NULL, + updatevon character varying(32), + updateamum timestamp without time zone, + CONSTRAINT tbl_lohnguide_modellfunktion_pkey PRIMARY KEY (modellfunktion_kurzbz), + CONSTRAINT tbl_lohnguide_modellfunktion_jobfamilie_fk FOREIGN KEY (jobfamilie_kurzbz) REFERENCES hr.tbl_lohnguide_jobfamilie (jobfamilie_kurzbz) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE +); + +GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE hr.tbl_lohnguide_modellfunktion TO vilesci; + +INSERT INTO hr.tbl_lohnguide_modellfunktion(modellfunktion_kurzbz, bezeichnung, jobfamilie_kurzbz, aktiv, sort, insertvon, insertamum) VALUES +('ABTEILUNGSLEITUNG','Abteilungsleitung','FÜHRUNG',true,1,'system',NOW()), +('GF','Geschäftsführung','FÜHRUNG',true,2,'system',NOW()), +('KOMPETENZFELDLEITER','Kompetenzfeldleiter*in','FÜHRUNG',true,3,'system',NOW()), +('DEPARTMENTSLEITER','Departmentsleiter*in','FÜHRUNG',true,4,'system',NOW()), +('FAKULTÄTSLEITER','Fakultätsleiter*in','FÜHRUNG',true,5,'system',NOW()), +/* Akademia */ +('STUDENTISCHE_MA','Studentische MA','AKADEMIA',true,6,'system',NOW()), +('JUNIOR_LEC_RES','Junior Lecturer/Researcher','AKADEMIA',true,7,'system',NOW()), +('LEC_RES','Lecturer/Researcher','AKADEMIA',true,8,'system',NOW()), +('SEN_LEC_RES','Senior Lecturer/Researcher','AKADEMIA',true,9,'system',NOW()), +('STUDIENGANGSLEITUNG','Studiengangsleitung','AKADEMIA',true,10,'system',NOW()), +/* Verwaltung */ +('FK_VERWALTUNG','Fachkraft Verwaltung','VERWALTUNG',true,11,'system',NOW()), +('SFK_VERWALTUNG','Spezial-Fachkraft Verwaltung','VERWALTUNG',true,12,'system',NOW()), +('SP_VERWALTUNG','Spezialist:in Verwaltung','VERWALTUNG',true,13,'system',NOW()), +('EXP_VERWALTUNG','Expert:in Verwaltung','VERWALTUNG',true,14,'system',NOW()), +/* Technik */ +('FK_TECHNIK','Fachkraft Technik','TECHNIK',true,15,'system',NOW()), +/* IT & Software */ +('FK_IT','Fachkraft IT & Software','IT_SOFTWARE',true,16,'system',NOW()), +('SFK_IT','Spezial-Fachkraft IT & Software','IT_SOFTWARE',true,17,'system',NOW()), +('SP_IT','Spezialist:in IT & Software','IT_SOFTWARE',true,18,'system',NOW()), +('EXP_IT','Expert:in IT & Software','IT_SOFTWARE',true,19,'system',NOW()), +/* Technische Dienste */ +('HK_TECHN_DIENSTE','Hilfskraft Technische Dienste','TECHN_DIENSTE',true,20,'system',NOW()), +('FK_TECHN_DIENSTE','Fachkraft Technische Dienste','TECHN_DIENSTE',true,21,'system',NOW()), +('SFK_TECHN_DIENSTE','Spezial-Fachkraft Technische Dienste','TECHN_DIENSTE',true,22,'system',NOW()) +ON CONFLICT (modellfunktion_kurzbz) DO NOTHING; + + + "; + + if (! $db->db_query($qry)) + echo 'Lohnguide Modellfunktion: ' . $db->db_last_error() . '
'; + else + echo 'hr.tbl_lohnguide_modellfunktion wurde neu erstellt
'; + } +} + +if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table_name='tbl_lohnguide_modellstelle' AND table_schema='hr'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = " +CREATE TABLE IF NOT EXISTS hr.tbl_lohnguide_modellstelle ( + modellstelle_kurzbz character varying(32) NOT NULL, + bezeichnung varchar(128) NOT NULL, + code character varying(32) NOT NULL, + grade int NOT NULL, + modellfunktion_kurzbz character varying(32) NOT NULL, + aktiv boolean DEFAULT FALSE, + sort smallint, + insertvon character varying(32) NOT NULL, + insertamum timestamp without time zone DEFAULT now() NOT NULL, + updatevon character varying(32), + updateamum timestamp without time zone, + CONSTRAINT tbl_lohnguide_modellstelle_pkey PRIMARY KEY (modellstelle_kurzbz), + CONSTRAINT tbl_lohnguide_modellstelle_modellfunktion_fk FOREIGN KEY (modellfunktion_kurzbz) REFERENCES hr.tbl_lohnguide_modellfunktion (modellfunktion_kurzbz) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE +); + +GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE hr.tbl_lohnguide_modellstelle TO vilesci; + + +-- FÜHRUNG +INSERT INTO hr.tbl_lohnguide_modellstelle(modellstelle_kurzbz,bezeichnung, code, grade, modellfunktion_kurzbz, aktiv, sort, insertvon, insertamum) VALUES +('ABTL_1_4', 'Abteilungsleitung 1/4', '111', 16, 'ABTEILUNGSLEITUNG', true, 1, 'system', NOW()), +('ABTL_2A_4', 'Abteilungsleitung 2a/4', '112a', 17, 'ABTEILUNGSLEITUNG', true, 2, 'system', NOW()), +('ABTL_2B_4', 'Abteilungsleitung 2b/4', '112b', 17, 'ABTEILUNGSLEITUNG', true, 3, 'system', NOW()), +('ABTL_3A_4', 'Abteilungsleitung 3a/4', '113a', 18, 'ABTEILUNGSLEITUNG', true, 4, 'system', NOW()), +('ABTL_3B_4', 'Abteilungsleitung 3b/4', '113b', 18, 'ABTEILUNGSLEITUNG', true, 5, 'system', NOW()), +('ABTL_4_4', 'Abteilungsleitung 4/4', '114', 19, 'ABTEILUNGSLEITUNG', true, 6, 'system', NOW()), +('GF_1_2', 'Geschäftsführung 1/2', '121', 22, 'GF', true, 7, 'system', NOW()), +('GF_2_2', 'Geschäftsführung 2/2', '122', 23, 'GF', true, 8, 'system', NOW()), +('KOMFL_1_1', 'Kompetenzfeldleiter*in 1/1', '131', 15, 'KOMPETENZFELDLEITER', true, 9, 'system', NOW()), +('DEPL_1_1', 'Departmentleiter*in 1/1', '141', 18, 'DEPARTMENTSLEITER', true, 10, 'system', NOW()), +('FAKL_1_1', 'Fakultätsleiter*in 1/1', '151', 20, 'FAKULTÄTSLEITER', true, 11, 'system', NOW()) +ON CONFLICT (modellstelle_kurzbz) DO NOTHING; + +-- AKADEMIA +INSERT INTO hr.tbl_lohnguide_modellstelle(modellstelle_kurzbz, bezeichnung, code, grade, modellfunktion_kurzbz, aktiv, sort, insertvon, insertamum) VALUES +('STUDENTISCHE_MA_1_1', 'Studentische MA 1/1', '211', 5, 'STUDENTISCHE_MA', true, 12, 'system', NOW()), +('JUNIOR_LEC_RES_1_2', 'Junior Lecturer/Researcher 1/2', '221', 8, 'JUNIOR_LEC_RES', true, 13, 'system', NOW()), +('JUNIOR_LEC_RES_2_2', 'Junior Lecturer/Researcher 2/2', '222', 9, 'JUNIOR_LEC_RES', true, 14, 'system', NOW()), +('LEC_RES_1_2', 'Lecturer/Researcher 1/2', '231', 11, 'LEC_RES', true, 15, 'system', NOW()), +('LEC_RES_2_2', 'Lecturer/Researcher 2/2', '232', 12, 'LEC_RES', true, 16, 'system', NOW()), +('SEN_LEC_RES_1_2', 'Senior Lecturer/Researcher 1/2', '241', 13, 'SEN_LEC_RES', true, 17, 'system', NOW()), +('SEN_LEC_RES_2_2', 'Senior Lecturer/Researcher 2/2', '242', 14, 'SEN_LEC_RES', true, 18, 'system', NOW()), +('STGL_1_2', 'Studiengangsleitung 1/2', '251', 15, 'STUDIENGANGSLEITUNG', true, 19, 'system', NOW()), +('STGL_2_2', 'Studiengangsleitung 2/2', '252', 16, 'STUDIENGANGSLEITUNG', true, 20, 'system', NOW()) +ON CONFLICT (modellstelle_kurzbz) DO NOTHING; + +-- VERWALTUNG +INSERT INTO hr.tbl_lohnguide_modellstelle(modellstelle_kurzbz, bezeichnung, code, grade, modellfunktion_kurzbz, aktiv, sort, insertvon, insertamum) VALUES +('FK_VERWALTUNG_1_3', 'Fachkraft Verwaltung 1/3', '311', 4, 'FK_VERWALTUNG', true, 21, 'system', NOW()), +('FK_VERWALTUNG_2A_3', 'Fachkraft Verwaltung 2a/3', '312a', 5, 'FK_VERWALTUNG', true, 22, 'system', NOW()), +('FK_VERWALTUNG_2B_3', 'Fachkraft Verwaltung 2b/3', '312b', 5, 'FK_VERWALTUNG', true, 23, 'system', NOW()), +('FK_VERWALTUNG_3_3', 'Fachkraft Verwaltung 3/3', '313', 6, 'FK_VERWALTUNG', true, 24, 'system', NOW()), +('SFK_VERWALTUNG_1_4', 'Spezial-Fachkraft Verwaltung 1/4', '321', 7, 'SFK_VERWALTUNG', true, 25, 'system', NOW()), +('SFK_VERWALTUNG_2A_4', 'Spezial-Fachkraft Verwaltung 2a/4', '322a', 8, 'SFK_VERWALTUNG', true, 26, 'system', NOW()), +('SFK_VERWALTUNG_2B_4', 'Spezial-Fachkraft Verwaltung 2b/4', '322b', 8, 'SFK_VERWALTUNG', true, 27, 'system', NOW()), +('SFK_VERWALTUNG_3A_4', 'Spezial-Fachkraft Verwaltung 3a/4', '323a', 9, 'SFK_VERWALTUNG', true, 28, 'system', NOW()), +('SFK_VERWALTUNG_3B_4', 'Spezial-Fachkraft Verwaltung 3b/4', '323b', 9, 'SFK_VERWALTUNG', true, 29, 'system', NOW()), +('SFK_VERWALTUNG_4_4', 'Spezial-Fachkraft Verwaltung 4/4', '324', 10, 'SFK_VERWALTUNG', true, 30, 'system', NOW()), +('SP_VERWATLTUNG_1_4', 'Spezialist:in Verwaltung 1/4', '331', 11, 'SP_VERWALTUNG', true, 31, 'system', NOW()), +('SP_VERWATLTUNG_2A_4', 'Spezialist:in Verwaltung 2a/4', '332a', 12, 'SP_VERWALTUNG', true, 32, 'system', NOW()), +('SP_VERWATLTUNG_2B_4', 'Spezialist:in Verwaltung 2b/4', '332b', 12, 'SP_VERWALTUNG', true, 33, 'system', NOW()), +('SP_VERWATLTUNG_3A_4', 'Spezialist:in Verwaltung 3a/4', '333a', 13, 'SP_VERWALTUNG', true, 34, 'system', NOW()), +('SP_VERWATLTUNG_3B_4', 'Spezialist:in Verwaltung 3b/4', '333b', 13, 'SP_VERWALTUNG', true, 35, 'system', NOW()), +('SP_VERWATLTUNG_4_4', 'Spezialist:in Verwaltung 4/4', '334', 14, 'SP_VERWALTUNG', true, 36, 'system', NOW()), +('EXP_VERWALTUNG_1_1', 'Expert:in Verwaltung 1/1', '341', 15, 'EXP_VERWALTUNG', true, 37, 'system', NOW()) +ON CONFLICT (modellstelle_kurzbz) DO NOTHING; + +-- TECHNIK +INSERT INTO hr.tbl_lohnguide_modellstelle(modellstelle_kurzbz, bezeichnung, code, grade, modellfunktion_kurzbz, aktiv, sort, insertvon, insertamum) VALUES +('FK_TECHNIK_1_3', 'Fachkraft Technik 1/3', '311', 4, 'FK_TECHNIK', true, 38, 'system', NOW()), +('FK_TECHNIK_2a_3', 'Fachkraft Technik 2a/3', '312a', 5, 'FK_TECHNIK', true, 39, 'system', NOW()), +('FK_TECHNIK_2b_3','Fachkraft Technik 2b/3', '312b', 5, 'FK_TECHNIK', true, 40, 'system', NOW()), +('FK_TECHNIK_3_3', 'Fachkraft Technik 3/3', '313', 6, 'FK_TECHNIK', true, 41, 'system', NOW()) +ON CONFLICT (modellstelle_kurzbz) DO NOTHING; + +-- IT & Software +INSERT INTO hr.tbl_lohnguide_modellstelle(modellstelle_kurzbz, bezeichnung, code, grade, modellfunktion_kurzbz, aktiv, sort, insertvon, insertamum) VALUES +('FK_IT_1_2', 'Fachkraft IT & Software 1/2', '411', 5, 'FK_IT', true, 42, 'system', NOW()), +('FK_IT_2_2', 'Fachkraft IT & Software 2/2', '412', 6, 'FK_IT', true, 43, 'system', NOW()), +('SFK_IT_1_4', 'Spezial-Fachkraft IT & Software 1/4', '421', 7, 'SFK_IT', true, 44, 'system', NOW()), +('SFK_IT_2_4', 'Spezial-Fachkraft IT & Software 2/4', '422', 8, 'SFK_IT', true, 45, 'system', NOW()), +('SFK_IT_3_4', 'Spezial-Fachkraft IT & Software 3/4', '423', 9, 'SFK_IT', true, 46, 'system', NOW()), +('SFK_IT_4_4', 'Spezial-Fachkraft IT & Software 4/4', '424', 10, 'SFK_IT', true, 47, 'system', NOW()), +('SP_IT_1_4', 'Spezialist:in IT & Software 1/4', '431', 11, 'SP_IT', true, 48, 'system', NOW()), +('SP_IT_2A_4', 'Spezialist:in IT & Software 2a/4', '432a', 12, 'SP_IT', true, 49, 'system', NOW()), +('SP_IT_2B_4', 'Spezialist:in IT & Software 2b/4', '432b', 12, 'SP_IT', true, 50, 'system', NOW()), +('SP_IT_3A_4', 'Spezialist:in IT & Software 3a/4', '433a', 13, 'SP_IT', true, 51, 'system', NOW()), +('SP_IT_3B_4', 'Spezialist:in IT & Software 3b/4', '433b', 13, 'SP_IT', true, 52, 'system', NOW()), +('SP_IT_4_4', 'Spezialist:in IT & Software 4/4', '434', 14, 'SP_IT', true, 53, 'system', NOW()), +('EXP_IT_1_1', 'Expert:in IT & Software 1/1', '441', 15, 'EXP_IT', true, 54, 'system', NOW()) +ON CONFLICT (modellstelle_kurzbz) DO NOTHING; + +-- TECHNISCHE DIENSTE +INSERT INTO hr.tbl_lohnguide_modellstelle(modellstelle_kurzbz, bezeichnung, code, grade, modellfunktion_kurzbz, aktiv, sort, insertvon, insertamum) VALUES +('HK_TECHN_DIENSTE_1_4', 'Hilfskraft Technische Dienste 1/4', '511', 1, 'HK_TECHN_DIENSTE', true, 55, 'system', NOW()), +('HK_TECHN_DIENSTE_2_4', 'Hilfskraft Technische Dienste 2/4', '512', 2, 'HK_TECHN_DIENSTE', true, 56, 'system', NOW()), +('HK_TECHN_DIENSTE_3_4', 'Hilfskraft Technische Dienste 3/4', '513', 3, 'HK_TECHN_DIENSTE', true, 57, 'system', NOW()), +('HK_TECHN_DIENSTE_4_4', 'Hilfskraft Technische Dienste 4/4', '514', 4, 'HK_TECHN_DIENSTE', true, 58, 'system', NOW()), +('FK_TECHN_DIENSTE_1_2', 'Fachkraft Technische Dienste 1/2', '521', 5, 'FK_TECHN_DIENSTE', true, 59, 'system', NOW()), +('FK_TECHN_DIENSTE_2_2', 'Fachkraft Technische Dienste 2/2', '522', 6, 'FK_TECHN_DIENSTE', true, 60, 'system', NOW()), +('SFK_TECHN_DIENSTE_1_4', 'Spezial-Fachkraft Technische Dienste 1/4', '531', 7, 'SFK_TECHN_DIENSTE', true, 61, 'system', NOW()), +('SFK_TECHN_DIENSTE_2_4', 'Spezial-Fachkraft Technische Dienste 2/4', '532', 8, 'SFK_TECHN_DIENSTE', true, 62, 'system', NOW()), +('SFK_TECHN_DIENSTE_3_4', 'Spezial-Fachkraft Technische Dienste 3/4', '533', 9, 'SFK_TECHN_DIENSTE', true, 63, 'system', NOW()), +('SFK_TECHN_DIENSTE_4_4', 'Spezial-Fachkraft Technische Dienste 4/4', '534', 10, 'SFK_TECHN_DIENSTE', true, 64, 'system', NOW()) +ON CONFLICT (modellstelle_kurzbz) DO NOTHING; + + "; + + if (! $db->db_query($qry)) + echo 'Lohnguide Modellstelle: ' . $db->db_last_error() . '
'; + else + echo 'hr.tbl_lohnguide_modellstelle wurde neu erstellt
'; + } +} + +if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table_name='tbl_lohnguide_fachrichtung' AND table_schema='hr'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = " +CREATE TABLE IF NOT EXISTS hr.tbl_lohnguide_fachrichtung ( + fachrichtung_kurzbz character varying(32) NOT NULL, + bezeichnung varchar(32) NOT NULL, + aktiv boolean DEFAULT FALSE, + insertvon character varying(32) NOT NULL, + insertamum timestamp without time zone DEFAULT now() NOT NULL, + updatevon character varying(32), + updateamum timestamp without time zone, + CONSTRAINT tbl_lohnguide_fachrichtung_pkey PRIMARY KEY (fachrichtung_kurzbz) +); + +GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE hr.tbl_lohnguide_fachrichtung TO vilesci; + +INSERT INTO hr.tbl_lohnguide_fachrichtung(fachrichtung_kurzbz,bezeichnung,aktiv,insertvon,insertamum) VALUES +('FA00','Keine Berücksichtigung',true,'system',NOW()) +ON CONFLICT (fachrichtung_kurzbz) DO NOTHING; + + "; + + if (! $db->db_query($qry)) + echo 'Lohnguide Fachrichtung: ' . $db->db_last_error() . '
'; + else + echo 'hr.tbl_lohnguide_fachrichtung wurde neu erstellt
'; + + } +} + + + +if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table_name='tbl_vertragsbestandteil_lohnguide' AND table_schema='hr'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = " +CREATE TABLE IF NOT EXISTS hr.tbl_vertragsbestandteil_lohnguide ( + vertragsbestandteil_id integer NOT NULL, + vordienstzeit int, + stellenbezeichnung varchar(255), + fachrichtung_kurzbz character varying(32) NOT NULL, + modellstelle_kurzbz character varying(32) NOT NULL, + kommentar_person varchar(255), + kommentar_modellstelle varchar(255), + CONSTRAINT tbl_vertragsbestandteil_lohnguide_pk PRIMARY KEY (vertragsbestandteil_id), + CONSTRAINT tbl_vertragsbestandteil_fk FOREIGN KEY (vertragsbestandteil_id) REFERENCES hr.tbl_vertragsbestandteil (vertragsbestandteil_id) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT tbl_vertragsbestandteil_lohnguide_fachrichtung_fk FOREIGN KEY (fachrichtung_kurzbz) REFERENCES hr.tbl_lohnguide_fachrichtung (fachrichtung_kurzbz) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT tbl_vertragsbestandteil_modellstelle_fachrichtung_fk FOREIGN KEY (modellstelle_kurzbz) REFERENCES hr.tbl_lohnguide_modellstelle (modellstelle_kurzbz) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE +); + +COMMENT ON TABLE hr.tbl_vertragsbestandteil_lohnguide IS E'Zuordnung für EU-Entgelttransparenzrichtlinie'; + +GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE hr.tbl_vertragsbestandteil_lohnguide TO vilesci; + + + "; + + if (! $db->db_query($qry)) + echo 'Vertragsbestandteil Lohnguide: ' . $db->db_last_error() . '
'; + else + echo 'hr.tbl_vertragsbestandteil_lohnguide wurde neu erstellt
'; + } +} + +if($result = $db->db_query("SELECT 1 FROM hr.tbl_vertragsbestandteiltyp WHERE vertragsbestandteiltyp_kurzbz = 'lohnguide'")) +{ + if($db->db_num_rows($result) === 0) + { + $qry = "insert into hr.tbl_vertragsbestandteiltyp (vertragsbestandteiltyp_kurzbz,bezeichnung,ueberlappend) values('lohnguide','Lohnguide',false)"; + + if(!$db->db_query($qry)) + echo 'Public Tabelle person: '.$db->db_last_error().'
'; + else + echo "
Vertragsbestandteiltyp 'lohnguide' hinzugefuegt"; + } +} + + +if ($result = $db->db_query("SELECT * FROM information_schema.columns WHERE column_name='vordienstzeit' AND table_name='tbl_vertragsbestandteil_lohnguide' AND table_schema='hr'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = " + ALTER TABLE + hr.tbl_vertragsbestandteil_lohnguide + ADD COLUMN + vordienstzeit int; + "; + if (! $db->db_query($qry)) + echo 'Lohnguide: ' . $db->db_last_error() . '
'; + else + echo 'Spalte vordienstzeit wurde in hr.tbl_vertragsbestandteil_lohnguide neu erstellt
'; + + } +} + + +if ($result = $db->db_query("SELECT * FROM hr.tbl_gehaltstyp WHERE gehaltstyp_kurzbz='ueberstundenpauschale'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = " + INSERT INTO hr.tbl_gehaltstyp + (gehaltstyp_kurzbz, bezeichnung, valorisierung, sort, aktiv, lvexport) + VALUES + ('ueberstundenpauschale','Überstundenpauschale', true, 8, true, true); + "; + + if (! $db->db_query($qry)) + echo 'Gehaltstyp: ' . $db->db_last_error() . '
'; + else + echo 'Gehaltstyp "Überstundenpauschale" erstellt.
'; + } +} + +if ($result = $db->db_query("SELECT * FROM hr.tbl_gehaltstyp WHERE gehaltstyp_kurzbz='sachbezug_pkw'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = " + INSERT INTO hr.tbl_gehaltstyp + (gehaltstyp_kurzbz, bezeichnung, valorisierung, sort, aktiv, lvexport) + VALUES + ('sachbezug_pkw','Sachbezug PKW', true, 9, true, true); + "; + + if (! $db->db_query($qry)) + echo 'Gehaltstyp: ' . $db->db_last_error() . '
'; + else + echo 'Gehaltstyp "Sachbezug PKW" erstellt.
'; + } +} + \ No newline at end of file diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index cc97b6eb3..5f6269365 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -41761,7 +41761,7 @@ array( array( 'app' => 'core', 'category' => 'abgabetool', - 'phrase' => 'c4fehlerAktualitaetProjektarbeit ', + 'phrase' => 'c4fehlerAktualitaetProjektarbeit', 'insertvon' => 'system', 'phrases' => array( array( @@ -57889,6 +57889,26 @@ I have been informed that I am under no obligation to consent to the transmissio ) ) ), + array( + 'app' => 'lvevaluierung', + 'category' => 'global', + 'phrase' => 'endedatumMussInZukunftLiegen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Das Endedatum muss mindestens {minutes} Minuten in der Zukunft liegen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The end date must be at least {minutes} minutes in the future', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), // ### DOKUMENTE ERSTELLEN PHRASEN END ### // ### Personen zusammenlegen Phrasen BEGIN array( diff --git a/vilesci/bis/personalmeldung.php b/vilesci/bis/personalmeldung.php index 1def6774d..49d8a09c2 100644 --- a/vilesci/bis/personalmeldung.php +++ b/vilesci/bis/personalmeldung.php @@ -742,7 +742,7 @@ function _getFunktionscontainer_Funktionscode123456($bisfunktion_arr) $has_oe_lehrgang = !($studiengang->studiengang_kz > 0 && $studiengang->studiengang_kz < 10000); // STG, die nicht BIS-bemeldet werden, ueberspringen - if (in_array($studiengang->studiengang_kz, BIS_EXCLUDE_STG)) + if (in_array($studiengang->studiengang_kz, BIS_EXCLUDE_STG) || !$studiengang->melderelevant) { continue; } @@ -825,6 +825,7 @@ function _addFunktionscontainer_Funktionscode7($uid, $funktion_arr, $stichtag) $entwicklungsteam_arr = array_filter($entwicklungsteam_arr, function ($obj) { return !in_array($obj->studiengang_kz, BIS_EXCLUDE_STG) && + $obj->melderelevant && $obj->studiengang_kz > 0 && $obj->studiengang_kz < 10000; }); @@ -889,7 +890,7 @@ function _getLehrecontainer($sws_proStg_arr) $kennzeichen_name = $is_lehrgang ? 'LehrgangNr' : 'StgKz'; // Lehreobjekt generieren - if (empty($lehre_arr) || !lehre_stg_exists($sws_proStg->studiengang_kz, $lehre_arr)) + if (empty($lehre_arr) || !lehre_stg_exists($sws_proStg->melde_studiengang_kz, $lehre_arr)) { $lehre_obj = new StdClass(); @@ -904,8 +905,8 @@ function _getLehrecontainer($sws_proStg_arr) } else // Lehrecontainer mit STG schon vorhanden { - $lehre_obj_arr = array_filter($lehre_arr, function (&$obj) use ($sws_proStg) { - return $obj->StgKz == $sws_proStg->studiengang_kz; + $lehre_obj_arr = array_filter($lehre_arr, function (&$obj) use ($sws_proStg, $kennzeichen_name) { + return isset($obj->{$kennzeichen_name}) && $obj->{$kennzeichen_name} == $sws_proStg->melde_studiengang_kz; }); // SWS ergaenzen @@ -1359,15 +1360,15 @@ function verwendung_exists($bisverwendung, $verwendung_arr) /** * Prueft ob ein Studiengang bereits im Lehre Container vorhanden ist - * @param $studiengang_kz Studiengangskennzahl + * @param $melde_studiengang_kz Studiengangskennzahl * @param $lehre_arr Array mit Lehre Objekten * @return true wenn der Studiengang bereits existiert */ -function lehre_stg_exists($studiengang_kz, $lehre_arr) +function lehre_stg_exists($melde_studiengang_kz, $lehre_arr) { foreach($lehre_arr as $row) { - $kennzeichenName = $row->LehrgangNr ?? $row->StgKz; + $kennzeichenName = isset($row->LehrgangNr) ? 'LehrgangNr' : 'StgKz'; if(isset($row->{$kennzeichenName}) && $row->{$kennzeichenName} == $melde_studiengang_kz) return true; } diff --git a/vilesci/stammdaten/raum_uebersicht.php b/vilesci/stammdaten/raum_uebersicht.php index 6ee8ca8df..755e43427 100644 --- a/vilesci/stammdaten/raum_uebersicht.php +++ b/vilesci/stammdaten/raum_uebersicht.php @@ -227,7 +227,8 @@ if (isset($_GET['sendform'])) - @@ -364,9 +365,10 @@ if (isset($_GET['sendform'])) $("#t1").tablesorter( { sortList: [[3,0]], - widgets: ["zebra", "filter", "stickyHeaders"], + widgets: ["saveSort", "zebra", "filter", "stickyHeaders"], headers: { 0: { filter: false, sorter: false }}, - widgetOptions : { filter_functions : { + widgetOptions : { filter_saveFilters : true, + filter_functions : { // Add select menu to this column 8 : { "True" : function(e, n, f, i, $r, c, data) { return /t/.test(e); }, @@ -381,6 +383,13 @@ if (isset($_GET['sendform'])) "False" : function(e, n, f, i, $r, c, data) { return /f/.test(e); } } }} + }); + + $('.resetsaved').click(function() + { + $("#t1").trigger("filterReset"); + location.reload(forceGet); + return false; }); }); diff --git a/vilesci/stammdaten/reihungstest_administration.php b/vilesci/stammdaten/reihungstest_administration.php index 3b59e1961..6fbf3e5c0 100644 --- a/vilesci/stammdaten/reihungstest_administration.php +++ b/vilesci/stammdaten/reihungstest_administration.php @@ -588,7 +588,9 @@ if(isset($_POST['testergebnisanzeigen']) && isset($_POST['prestudent_id'])) { if(is_numeric($_POST['prestudent_id']) && $_POST['prestudent_id']!='') { - $qry="SELECT nachname,vorname,person_id,prestudent_id,tbl_pruefling.pruefling_id,tbl_pruefling_frage.begintime,bezeichnung,kurzbz,tbl_frage.nummer,level, tbl_vorschlag.nummer as antwortnummer, tbl_vorschlag.punkte + $qry="SELECT nachname,vorname,person_id,prestudent_id,tbl_pruefling.pruefling_id, + tbl_pruefling_frage.begintime,bezeichnung,kurzbz,tbl_frage.nummer,level, + tbl_vorschlag.nummer as antwortnummer, tbl_vorschlag.punkte, tbl_frage.frage_id FROM testtool.tbl_antwort JOIN testtool.tbl_vorschlag USING(vorschlag_id) JOIN testtool.tbl_frage USING (frage_id) @@ -615,6 +617,7 @@ if(isset($_POST['testergebnisanzeigen']) && isset($_POST['prestudent_id'])) + '; @@ -632,6 +635,7 @@ if(isset($_POST['testergebnisanzeigen']) && isset($_POST['prestudent_id'])) echo ""; echo ""; echo ""; + echo ""; echo ''; } echo '
+ + '.$tooltiptext.' Level Antwort # PunkteFrageID
$row->level$row->antwortnummer$row->punkte$row->frage_id
'; diff --git a/vilesci/stammdaten/reihungstestverwaltung.php b/vilesci/stammdaten/reihungstestverwaltung.php index 990b3e129..f415f33cd 100644 --- a/vilesci/stammdaten/reihungstestverwaltung.php +++ b/vilesci/stammdaten/reihungstestverwaltung.php @@ -837,6 +837,25 @@ if(isset($_GET['excel']))