diff --git a/application/config/navigation.php b/application/config/navigation.php index d123399b6..76f779467 100644 --- a/application/config/navigation.php +++ b/application/config/navigation.php @@ -24,6 +24,14 @@ $config['navigation_header'] = array( 'expand' => true, 'sort' => 1, 'requiredPermissions' => 'basis/vilesci:r' + ), + 'reihungstest' => array( + 'link' => site_url('organisation/Reihungstest'), + 'icon' => 'list-ol', + 'description' => 'Reihungstests', + 'expand' => true, + 'sort' => 1, + 'requiredPermissions' => 'infocenter:r' ) ) ), @@ -147,3 +155,20 @@ $config['navigation_menu']['system/infocenter/InfoCenter/freigegeben'] = array( 'sort' => 1 ) ); + +$config['navigation_menu']['organisation/Reihungstest/index'] = array( + 'reihungstestverwalung' => array( + 'link' => base_url('vilesci/stammdaten/reihungstestverwaltung.php'), + 'description' => 'Reihungstestverwaltung', + 'icon' => 'cogs', + 'sort' => 1, + 'target' => '_blank' + ), + 'auswertung' => array( + 'link' => CIS_ROOT.'/cis/testtool/admin/auswertung.php', + 'description' => 'Auswertung', + 'icon' => 'list-alt', + 'sort' => 1, + 'target' => '_blank' + ) +); diff --git a/application/controllers/organisation/Reihungstest.php b/application/controllers/organisation/Reihungstest.php new file mode 100644 index 000000000..6511cf052 --- /dev/null +++ b/application/controllers/organisation/Reihungstest.php @@ -0,0 +1,193 @@ + 'infocenter:r', + 'setNavigationMenuArrayJson' => 'infocenter:r' + ) + ); + + $this->load->library('WidgetLib'); + $this->loadPhrases( + array( + 'global', + 'ui', + 'filter' + ) + ); + + $this->_uid = getAuthUID(); + $this->load->model('system/filters_model', 'FiltersModel'); + $this->setControllerId(); // sets the controller id + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + + /** + * Main page of the InfoCenter tool + */ + public function index() + { + $this->_setNavigationMenuIndex(); // define the navigation menu for this page + + $this->load->view('organisation/reihungstest/reihungstest.php'); + } + + /** + * Define the navigation menu for the showDetails page + */ + private function _setNavigationMenuIndex() + { + $this->load->library('NavigationLib', array('navigation_page' => 'organisation/Reihungstest/index')); + + $link = site_url(); + + $listFilters = array(); + $listCustomFilters = array(); + + // LOAD FILTERS + $filters = $this->FiltersModel->getFilterList('reihungstest', 'overview','%'); + if (hasData($filters)) + { + for ($filtersCounter = 0; $filtersCounter < count($filters->retval); $filtersCounter++) + { + $filter = $filters->retval[$filtersCounter]; + $listFilters[$filter->filter_id] = $filter->description[0]; + } + } + + $filtersArray = array(); + + $filtersArray = $this->navigationlib->oneLevel( + ucfirst('Filter'), // description + '#', // link + array(), // children + '', // icon + true, // expand + null, // subscriptDescription + null, // subscriptLinkClass + null, // subscriptLinkValue + '', // target + 2 // sort + ); + + $this->_fillFilters($listFilters, $filtersArray); + + // LOAD CUSTOM FILTERS + $customFilters = $this->FiltersModel->getCustomFiltersList('reihungstest', 'overview', $this->_uid); + if (hasData($customFilters)) + { + for ($filtersCounter = 0; $filtersCounter < count($customFilters->retval); $filtersCounter++) + { + $filter = $customFilters->retval[$filtersCounter]; + + $listCustomFilters[$filter->filter_id] = $filter->description[0]; + } + } + + if (count($listCustomFilters) > 0) + { + $filtersArray['children']['personal'] = $this->navigationlib->oneLevel( + 'Personal filters', // description + '#', // link + array(), // children + '', // icon + true, // expand + null, // subscriptDescription + null, // subscriptLinkClass + null, // subscriptLinkValue + '', // target + 3 // sort + ); + + $this->_fillCustomFilters($listCustomFilters, $filtersArray['children']['personal']); + } + + $this->navigationlib->setSessionMenu( + array( + 'filters' => $this->navigationlib->oneLevel( + 'Filter', // description + '#', // link + $filtersArray['children'], // children + '', // icon + true, // expand + null, // subscriptDescription + null, // subscriptLinkClass + null, // subscriptLinkValue + '', // target + 10 // sort + ) + ) + ); + } + /** + * Utility method used to fill elements of the left menu of the main RT page + */ + private function _fillFilters($filters, &$tofill) + { + $toPrint = "%s?%s=%s&%s=%s"; + + foreach ($filters as $filterId => $description) + { + $tofill['children'][] = array( + 'link' => sprintf( + $toPrint, + site_url(self::REIHUNGSTEST_URI), 'filter_id', $filterId, + FHC_Controller::FHC_CONTROLLER_ID, + $this->getControllerId() + ), + 'description' => $description + ); + } + } + + /** + * Utility method used to fill elements of the InfoCenter left menu + * with the list of the custom filter of the authenticated user + */ + private function _fillCustomFilters($filters, &$tofill) + { + $toPrint = "%s?%s=%s&%s=%s"; + + foreach ($filters as $filterId => $description) + { + $tofill['children'][] = array( + 'link' => sprintf( + $toPrint, + site_url(self::REIHUNGSTEST_URI), 'filter_id', $filterId, + FHC_Controller::FHC_CONTROLLER_ID, + $this->getControllerId() + ), + 'description' => $description, + 'subscriptDescription' => 'Remove', + 'subscriptLinkClass' => 'remove-custom-filter', + 'subscriptLinkValue' => $filterId + ); + } + } + + /** + * Wrapper for setNavigationMenu, returns JSON message + */ + public function setNavigationMenuArrayJson() + { + $this->_setNavigationMenuIndex(); + $this->outputJsonSuccess('success'); + } +} diff --git a/application/views/organisation/reihungstest/ReihungstestUebersichtData.php b/application/views/organisation/reihungstest/ReihungstestUebersichtData.php new file mode 100644 index 000000000..ce16e4726 --- /dev/null +++ b/application/views/organisation/reihungstest/ReihungstestUebersichtData.php @@ -0,0 +1,169 @@ + " + SELECT + reihungstest_id, + datum, + uhrzeit, + freigeschaltet, + max_plaetze, + oeffentlich, + studiensemester_kurzbz, + anmeldefrist, + anzahl_angemeldet, + studiengaenge, + fakultaet, + max_plaetze - anzahl_angemeldet as freie_plaetze, + raeume + FROM + ( + SELECT + reihungstest_id, datum, uhrzeit, freigeschaltet, + + /* Plaetze aus Termin oder zugeteilten Raeumen minus Schwund */ + COALESCE( + max_teilnehmer, + (SELECT sum(arbeitsplaetze) - ceil(sum(arbeitsplaetze)/100.0*5) + FROM + public.tbl_rt_ort + JOIN public.tbl_ort ON(tbl_rt_ort.ort_kurzbz=tbl_ort.ort_kurzbz) + WHERE + tbl_rt_ort.rt_id=tbl_reihungstest.reihungstest_id + ) + ) as max_plaetze, + + oeffentlich, studiensemester_kurzbz, anmeldefrist, + + (SELECT count(*) + FROM public.tbl_rt_person + WHERE rt_id=tbl_reihungstest.reihungstest_id + ) as anzahl_angemeldet, + + /* Bezeichnung der Studiengaenge der zugeordneten Personen*/ + (SELECT ARRAY_TO_STRING(ARRAY_AGG(DISTINCT UPPER(sg.typ || sg.kurzbz) || ':' || sp.orgform_kurzbz), ', ') + FROM + public.tbl_rt_person + JOIN lehre.tbl_studienplan sp USING(studienplan_id) + JOIN lehre.tbl_studienordnung USING(studienordnung_id) + JOIN public.tbl_studiengang sg USING(studiengang_kz) + WHERE + tbl_rt_person.rt_id = tbl_reihungstest.reihungstest_id + ) as studiengaenge, + + /* Fakultaeten zu den zugeordneten Studienplaenen */ + ( + WITH RECURSIVE meine_oes(oe_kurzbz, oe_parent_kurzbz, organisationseinheittyp_kurzbz) as + ( + SELECT + oe_kurzbz, oe_parent_kurzbz, organisationseinheittyp_kurzbz + FROM + public.tbl_organisationseinheit + WHERE + oe_kurzbz in ( + SELECT + oe_kurzbz + FROM + public.tbl_rt_studienplan + JOIN lehre.tbl_studienplan sp USING(studienplan_id) + JOIN lehre.tbl_studienordnung USING(studienordnung_id) + JOIN public.tbl_studiengang sg USING(studiengang_kz) + WHERE + tbl_rt_studienplan.reihungstest_id = tbl_reihungstest.reihungstest_id + ) + AND aktiv = true + UNION ALL + SELECT + o.oe_kurzbz, o.oe_parent_kurzbz, o.organisationseinheittyp_kurzbz + FROM + public.tbl_organisationseinheit o, meine_oes + WHERE + o.oe_kurzbz=meine_oes.oe_parent_kurzbz + AND aktiv = true + ) + SELECT + ARRAY_TO_STRING(ARRAY_AGG(DISTINCT tbl_organisationseinheit.bezeichnung),', ') + FROM + meine_oes + JOIN public.tbl_organisationseinheit USING(oe_kurzbz) + WHERE + meine_oes.organisationseinheittyp_kurzbz='Fakultaet' + ) as fakultaet, + + /* Zugeteilte Raeume*/ + (SELECT ARRAY_TO_STRING(ARRAY_AGG(DISTINCT ort_kurzbz), ', ') + FROM + public.tbl_rt_ort + WHERE + tbl_rt_ort.rt_id = tbl_reihungstest.reihungstest_id + ) as raeume + FROM + public.tbl_reihungstest + WHERE + datum>now()-'2 weeks'::interval + ORDER BY datum desc + ) data + ", + 'requiredPermissions' => 'admin', + 'additionalColumns' => array('Details'), + 'columnsAliases' => array( + 'ReihungstestID', + 'Datum', + 'Uhrzeit', + 'Freigegschaltet', + 'Maximale Teilnehmer', + 'Öffentlich', + 'Studiensemester', + 'Anmeldefrist', + 'Anzahl Angemeldet', + 'Teilnehmer Stg', + 'Fakultät', + 'Freie Plätze', + 'Räume' + ), + 'formatRow' => function($datasetRaw) { + /* NOTE: Dont use $this here for PHP Version compatibility */ + $datasetRaw->{'Details'} = sprintf( + 'Details', + base_url('vilesci/stammdaten/reihungstestverwaltung.php'), + $datasetRaw->{'reihungstest_id'} + ); + if ($datasetRaw->{'anmeldefrist'} == null) + { + $datasetRaw->{'anmeldefrist'} = '-'; + } + if ($datasetRaw->{'max_plaetze'} == null) + { + $datasetRaw->{'max_plaetze'} = '-'; + } + if ($datasetRaw->{'studiengaenge'} == null) + { + $datasetRaw->{'studiengaenge'} = '-'; + } + if ($datasetRaw->{'raeume'} == null) + { + $datasetRaw->{'raeume'} = '-'; + } + if ($datasetRaw->{'freie_plaetze'} == null) + { + $datasetRaw->{'freie_plaetze'} = '-'; + } + if ($datasetRaw->{'oeffentlich'} == 'true') + { + $datasetRaw->{'oeffentlich'} = 'Ja'; + } + if ($datasetRaw->{'oeffentlich'} == 'false') + { + $datasetRaw->{'oeffentlich'} = 'Nein'; + } + + return $datasetRaw; + } + ); + + $filterWidgetArray['app'] = 'reihungstest'; + $filterWidgetArray['datasetName'] = 'overview'; + $filterWidgetArray['filterKurzbz'] = 'Reihungstest'; + $filterWidgetArray['filter_id'] = $this->input->get('filter_id'); + + echo $this->widgetlib->widget('FilterWidget', $filterWidgetArray); +?> diff --git a/application/views/organisation/reihungstest/reihungstest.php b/application/views/organisation/reihungstest/reihungstest.php new file mode 100644 index 000000000..d9ef5f349 --- /dev/null +++ b/application/views/organisation/reihungstest/reihungstest.php @@ -0,0 +1,48 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => 'Reihungstest', + 'jquery' => true, + 'jqueryui' => true, + 'bootstrap' => true, + 'fontawesome' => true, + 'sbadmintemplate' => true, + 'tablesorter' => true, + 'ajaxlib' => true, + 'filterwidget' => true, + 'navigationwidget' => true, + 'phrases' => array( + 'ui' => array('bitteEintragWaehlen') + ), + 'customCSSs' => 'public/css/sbadmin2/tablesort_bootstrap.css', + 'customJSs' => array( + 'public/js/bootstrapper.js', + 'public/js/reihungstest/reihungstest.js') + ) + ); +?> + + +
+ + widgetlib->widget('NavigationWidget'); ?> + +
+
+
+
+ +
+
+
+ load->view('organisation/reihungstest/ReihungstestUebersichtData.php'); ?> +
+
+
+
+ + +load->view('templates/FHC-Footer'); ?> diff --git a/application/widgets/FilterWidget.php b/application/widgets/FilterWidget.php index 219c5a103..68b92dc9a 100644 --- a/application/widgets/FilterWidget.php +++ b/application/widgets/FilterWidget.php @@ -399,11 +399,11 @@ class FilterWidget extends Widget // Basic conversions if (is_bool($columnValue)) { - $rawDatasetRow->{$columnValue} = $columnValue === true ? 'true' : 'false'; + $rawDatasetRow->{$columnName} = ($columnValue === true ? 'true' : 'false'); } - elseif (DateTime::createFromFormat('Y-m-d G:i:s', $columnValue) !== false) + elseif (DateTime::createFromFormat('Y-m-d H:i:s', $columnValue) !== false) { - $rawDatasetRow->{$columnValue} = date(self::DEFAULT_DATE_FORMAT, strtotime($columnValue)); + $rawDatasetRow->{$columnName} = date(self::DEFAULT_DATE_FORMAT, strtotime($columnValue)); } } diff --git a/public/js/FilterWidget.js b/public/js/FilterWidget.js index 59cf59da1..0015f6f75 100644 --- a/public/js/FilterWidget.js +++ b/public/js/FilterWidget.js @@ -495,7 +495,13 @@ var FHC_FilterWidget = { filter_page: FHC_FilterWidget.getFilterPage() }, { - successCallback: refreshSideMenuHook // NOTE: to be checked + successCallback: function(data, textStatus, jqXHR) { + // If a success and refreshSideMenuHook is a valid function then call it to refresh the side menu + if (typeof refreshSideMenuHook == "function") + { + refreshSideMenuHook(); + } + } } ); } diff --git a/public/js/reihungstest/reihungstest.js b/public/js/reihungstest/reihungstest.js new file mode 100644 index 000000000..e1f463738 --- /dev/null +++ b/public/js/reihungstest/reihungstest.js @@ -0,0 +1,12 @@ +/** + * Javascript file for Reihungstest overview page + */ + +/** +* Global function used by FilterWidget JS to refresh the side menu +* NOTE: it is called from the FilterWidget JS therefore must be a global function +*/ +function refreshSideMenuHook() +{ + FHC_NavigationWidget.refreshSideMenuHook('organisation/Reihungstest/setNavigationMenuArrayJson'); +} diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index 856a55922..1e43969e9 100755 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -2498,6 +2498,21 @@ if($result = @$db->db_query("SELECT * FROM information_schema.role_table_grants } } +// App 'reihungstest' hinzufügen +if($result = $db->db_query("SELECT 1 FROM system.tbl_app WHERE app='reihungstest'")) +{ + if($db->db_num_rows($result)==0) + { + + $qry = "INSERT INTO system.tbl_app(app) VALUES('reihungstest');"; + + if(!$db->db_query($qry)) + echo 'App: '.$db->db_last_error().'
'; + else + echo '
Neue App reihungstest in system.tbl_app hinzugefügt'; + } +} + // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; diff --git a/system/filtersupdate.php b/system/filtersupdate.php index 673cc9457..f8a1ebcc7 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -322,6 +322,28 @@ $filters = array( } ', 'oe_kurzbz' => null, + ), + array( + 'app' => 'reihungstest', + 'dataset_name' => 'overview', + 'filter_kurzbz' => 'Reihungstest', + 'description' => '{Reihungstest Übersicht}', + 'sort' => 1, + 'default_filter' => true, + 'filter' => ' + { + "name": "Reihungstest", + "columns": [ + {"name": "fakultaet"}, + {"name": "datum"}, + {"name": "oeffentlich"}, + {"name": "studiengaenge"}, + {"name": "freie_plaetze"} + ], + "filters": [] + } + ', + 'oe_kurzbz' => null, ) );