Amended Lehrauftrag Controller - GUI with Tabulator-table

Amended the Lehrauftrag Controller GUI:
. corrected DB query
. corrected processing of GET-params
. corrected filter of tabulator (LE-ID caused problems -> now LE_ID)
. now stg are retrieved by permission entitlement of user
. implemented Tabulator filter and other properties/functions
. minor GUI adaptations
. added phrase
This commit is contained in:
hainberg
2019-08-29 14:19:01 +02:00
parent b910f220ac
commit aad5f7bd5e
5 changed files with 230 additions and 124 deletions
@@ -1,10 +1,9 @@
<?php
// if (! defined('BASEPATH')) exit('No direct script access allowed');
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* This controller Lehrauftrag displays all Lehrauftraege within a study semester.
* The controller Lehrauftrag displays all Lehrauftraege within a study semester.
* Heads of degree programs can order Lehrauftraege, which subsequently will generate the corresponding contracts
* automatically.
* Department leaders can approve the ordered Lehrauftraege.
@@ -13,6 +12,7 @@ class Lehrauftrag extends Auth_Controller
{
const APP = 'lehrauftrag';
const LEHRAUFTRAG_URI = 'lehre/lehrauftrag/Lehrauftrag'; // URL prefix for this controller
const BERECHTIGUNG_LEHRAUFTRAG_BESTELLEN = 'lehre/lehrauftrag_bestellen';
private $_uid; // uid of the logged user
@@ -21,24 +21,19 @@ class Lehrauftrag extends Auth_Controller
*/
public function __construct()
{
// TODO: adapt permissions!
// Set required permissions
parent::__construct(
array(
'index' => 'infocenter:r'
'index' => 'lehre/lehrauftrag_bestellen:r'
)
);
// Load models
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
$this->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
// $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); // TODO: delete?
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
// TODO: check: WidgetLib notwendig?
// Load libraries
$this->load->library('WidgetLib');
$this->load->library('PermissionLib');
// Load language phrases
$this->loadPhrases(
@@ -50,9 +45,6 @@ class Lehrauftrag extends Auth_Controller
$this->_setAuthUID(); // sets property uid
//TODO: delete test user
//$this->_uid = 'testuser';
$this->setControllerId(); // sets the controller id
}
@@ -63,31 +55,21 @@ class Lehrauftrag extends Auth_Controller
*/
public function index()
{
echo '<pre>', print_r($_GET, 1), '</pre>';
$studiengang_kz = $this->input->get('studiengang');
$studiensemester_kurzbz = $this->input->get('studiensemester');
// Set studiengang selected for studiengang dropdown
$studiengang_kz = $this->input->get('studiengang'); // if provided by selected studiengang
$studiengang_kz = ($studiengang_kz == 'null' ? null : $studiengang_kz);
// Set studiengang variable
if (!isset($studiengang_kz) || !is_numeric($studiengang_kz))
// Retrieve studiengaenge the user is entitled for to populate studiengang dropdown
if (!$studiengang_kz_arr = $this->permissionlib->getSTG_isEntitledFor(self::BERECHTIGUNG_LEHRAUFTRAG_BESTELLEN))
{
$benutzerfunktion = $this->BenutzerfunktionModel->getSTGLByUID($this->_uid);
$studiengang_kz_arr = array();
if (hasData($benutzerfunktion))
{
foreach ($benutzerfunktion->retval as $benutzerfkt)
{
$studiengang_kz_arr[] = $benutzerfkt->studiengang_kz;
}
}
elseif (isError($benutzerfunktion))
{
show_error($benutzerfunktion->error);
}
show_error('Fehler bei Berechtigungsprüfung');
}
// Set studiensemester variable
if (!isset($studiensemester_kurzbz) || !is_string($studiensemester_kurzbz))
// Set studiensemester selected for studiengang dropdown
$studiensemester_kurzbz = $this->input->get('studiensemester'); // if provided by selected studiensemester
if (is_null($studiensemester_kurzbz)) // else set next studiensemester as default value
{
$studiensemester = $this->StudiensemesterModel->getNext();
if (hasData($studiensemester))
@@ -99,15 +81,17 @@ class Lehrauftrag extends Auth_Controller
show_error($studiensemester->error);
}
}
$view_data = array(
'studiengang_selected' => $studiengang_kz,
'studiengang' => $studiengang_kz_arr,
'studiensemester' => $studiensemester_kurzbz
'studiensemester_selected' => $studiensemester_kurzbz
);
$this->load->view('lehre/lehrauftrag/lehrauftrag.php', $view_data);
}
// -----------------------------------------------------------------------------------------------------------------
// Private methods
@@ -16,58 +16,74 @@ $this->load->view(
'filterwidget' => true,
'navigationwidget' => true,
'phrases' => array(
'person' => array('vorname', 'nachname'),
'global' => array('mailAnXversandt'),
'ui' => array('bitteEintragWaehlen')
'global' => array('lehrauftraege'),
),
'customCSSs' => 'public/css/sbadmin2/tablesort_bootstrap.css',
'customJSs' => array('public/js/bootstrapper.js', '')
'customJSs' => array('public/js/bootstrapper.js')
)
);
?>
<body>
<div id="page-wrapper">
<div class="container-fluid">
<form id="formLehrauftrag" class="form-inline" action="" method="get">
<div class="row">
<div class="col-lg-12">
<h3 class="page-header">
<?php echo ucfirst($this->p->t('global', 'lehrauftraege')); ?>
</h3>
</div>
<div class="col-lg-12">
<!-- <form id="formLehrauftrag" class="form-inline" action="" method="get">-->
<div class="form-group">
<?php
echo $this->widgetlib->widget(
'Studiensemester_widget',
array(
DropdownWidget::SELECTED_ELEMENT => $studiensemester_selected
),
array(
'name' => 'studiensemester',
'id' => 'studiensemester'
)
);
?>
</div>
<div class="form-group">
<?php
echo $this->widgetlib->widget(
'Studiengang_widget',
array(
DropdownWidget::SELECTED_ELEMENT => $studiengang_selected,
'studiengang' => $studiengang
),
array(
'name' => 'studiengang',
'id' => 'studiengang'
)
);
?>
</div>
<button type="submit" name="submit" value="anzeigen" class="btn btn-default form-group">Anzeigen</button>
<!--</form>-->
</div>
</div>
<div class="row">
<form id="formLehrauftragBestellen" class="form-inline" action="" method="get">
<div class="col-xs-3 form-group">
<label for="studiengang">Studiengang</label>
<?php
echo $this->widgetlib->widget(
'Studiengang_widget',
array(
DropdownWidget::SELECTED_ELEMENT => $studiengang[0],
'studiengang' => $studiengang
),
array(
'name' => 'studiengang',
'id' => 'studiengang',
'class' => 'form-control'
)
);
?>
</div>
<div class="col-xs-2 form-group">
<label for="studiensemester">Studiensemester</label>
<?php
echo $this->widgetlib->widget(
'Studiensemester_widget',
array(
DropdownWidget::SELECTED_ELEMENT => $studiensemester
),
array(
'name' => 'studiensemester',
'id' => 'studiensemester',
'class' => 'form-control'
)
);
?>
</div>
</form>
</div>
<div class="row">
<?php $this->load->view('lehre/lehrauftrag/lehrauftragData.php'); ?>
</div>
<div class="row">
<?php $this->load->view('lehre/lehrauftrag/lehrauftragData.php'); ?>
</div>
<div class="row">
<div class="col-lg-12">
<!-- <form id="formLehrauftragBestellen" class="form-inline" action="" method="get">-->
<button type="submit" name="submit" value="bestellen" class="btn btn-default form-group pull-right">Lehrauftrag bestellen</button>
<!-- </form>-->
</div>
</div>
</form>
</div>
</div>
</body>
<?php $this->load->view('templates/FHC-Footer'); ?>
@@ -1,53 +1,122 @@
<?php
$APP = '\'lehrauftrag\'';
$STUDIENSEMESTER = $studiensemester_selected;
$STUDIENGANG = (isset($studiengang_selected) && !is_null($studiengang_selected)) ? array($studiengang_selected) : $studiengang;
// TODO: projektbetreuer noch ergänzen; query result noch im detail testen
$query = '
SELECT
(lv.bezeichnung || \' [\' || upper(lv.lehrtyp_kurzbz) || \']\') AS "Lehrveranstaltung",
/* Lehraufträge and -vertragsstati */
SELECT
lema.lehreinheit_id AS "LE_ID",
upper(lv.lehrtyp_kurzbz) AS "Typ",
(lv.bezeichnung || \' [\' || le.lehrform_kurzbz || \' \' || lv.semester || \'.Semester\' || \']\') AS "Auftrag",
CASE
WHEN oe.organisationseinheittyp_kurzbz = \'Kompetenzfeld\' THEN (\'KF \' || oe.bezeichnung)
WHEN oe.organisationseinheittyp_kurzbz = \'Department\' THEN (\'DEP \' || oe.bezeichnung)
ELSE (oe.organisationseinheittyp_kurzbz || \' \' || oe.bezeichnung)
END AS "Organisationseinheit",
(person.vorname || \' \' || person.nachname) AS "Lektor",
lema.semesterstunden AS "Stunden",
(lema.semesterstunden * lema.stundensatz) AS "Betrag",
END AS "Organisationseinheit",
CONCAT(stg.kurzbzlang, \'-\', legr.semester, legr.verband, legr.gruppe, \'\n\' || legr.gruppe_kurzbz) AS "Gruppe",
(person.vorname || \' \' || person.nachname) AS "Lektor",
TRUNC(lema.semesterstunden, 1) AS "Stunden",
TRUNC((lema.semesterstunden * lema.stundensatz), 2) AS "Betrag",
CASE
/* existing contracts for given study semester with status bestellt */
WHEN lema.vertrag_id NOTNULL AND vertrag.vertragsstunden_studiensemester_kurzbz = \'WS2018\' AND
WHEN lema.vertrag_id NOTNULL AND vertrag.vertragsstunden_studiensemester_kurzbz = \''. $STUDIENSEMESTER. '\' AND
vvs.vertragsstatus_kurzbz = \'bestellt\' THEN vvs.datum
END AS "Bestellt",
END AS "Bestellt",
CASE
/* existing contracts for given study semester with status erteilt */
WHEN lema.vertrag_id NOTNULL AND vertrag.vertragsstunden_studiensemester_kurzbz = \'WS2018\' AND
WHEN lema.vertrag_id NOTNULL AND vertrag.vertragsstunden_studiensemester_kurzbz = \''. $STUDIENSEMESTER. '\' AND
vvs.vertragsstatus_kurzbz = \'erteilt\' THEN vvs.datum
END AS "Erteilt",
END AS "Erteilt",
CASE
/* existing contracts for given study semester with status akzeptiert */
WHEN lema.vertrag_id NOTNULL AND vertrag.vertragsstunden_studiensemester_kurzbz = \'WS2018\' AND
WHEN lema.vertrag_id NOTNULL AND vertrag.vertragsstunden_studiensemester_kurzbz = \''. $STUDIENSEMESTER. '\' AND
vvs.vertragsstatus_kurzbz = \'akzeptiert\' THEN vvs.datum
END AS "Akzeptiert"
END AS "Akzeptiert"
FROM
lehre.tbl_lehreinheitmitarbeiter lema
JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id)
JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
JOIN public.tbl_organisationseinheit oe USING (oe_kurzbz)
JOIN lehre.tbl_lehreinheitgruppe legr USING (lehreinheit_id)
JOIN public.tbl_mitarbeiter ma USING (mitarbeiter_uid)
JOIN public.tbl_benutzer benutzer ON ma.mitarbeiter_uid = benutzer.uid
JOIN public.tbl_person person USING (person_id)
LEFT JOIN lehre.tbl_vertrag vertrag USING (person_id)
LEFT JOIN lehre.tbl_vertrag_vertragsstatus vvs
USING (uid) -- richtig über uid? wenn über vertrags_id: Fehlermeldung, da viele verträge noch nicht existieren (NULL)
LEFT JOIN lehre.tbl_vertrag vertrag USING (vertrag_id)
LEFT JOIN lehre.tbl_vertrag_vertragsstatus vvs USING (vertrag_id)
LEFT JOIN lehre.tbl_vertragsstatus status USING (vertragsstatus_kurzbz)
JOIN public.tbl_studiengang stg ON stg.studiengang_kz = lv.studiengang_kz
WHERE
/* filter studiengang */
lv.studiengang_kz = 227
lv.studiengang_kz IN ('. implode(',', $STUDIENGANG) . ')
/* filter studiensemester */
AND le.studiensemester_kurzbz = \'WS2018\'
AND le.studiensemester_kurzbz = \''. $STUDIENSEMESTER. '\'
/* filter active lehrveranstaltungen */
AND lv.aktiv = TRUE
/* filter dummies and invalid mitarbeiter */
AND ma.personalnummer >= 0
UNION
/* Projektbetreuungsaufträge and -vertragsstati */
SELECT
pa.lehreinheit_id AS "LE_ID",
\'Betreuung\' AS "Typ",
(betreuerart_kurzbz || \' \' ||
(SELECT
vorname || \' \' || nachname
FROM
public.tbl_person
JOIN public.tbl_benutzer USING (person_id)
WHERE
uid = pa.student_uid)
|| \' [\' || projekttyp_kurzbz || \'arbeit\' || \' \' || lv.semester || \'.Semester]\') AS "Auftrag",
CASE
WHEN oe.organisationseinheittyp_kurzbz = \'Kompetenzfeld\' THEN (\'KF \' || oe.bezeichnung)
WHEN oe.organisationseinheittyp_kurzbz = \'Department\' THEN (\'DEP \' || oe.bezeichnung)
ELSE (oe.organisationseinheittyp_kurzbz || \' \' || oe.bezeichnung)
END AS "Organisationseinheit",
CONCAT(stg.kurzbzlang, \'-\', legr.semester, legr.verband, legr.gruppe, \'\n\' || legr.gruppe_kurzbz) AS "Gruppe",
(vorname || \' \' || nachname) AS "Lektor",
TRUNC(pb.stunden, 1) AS "Stunden",
TRUNC((pb.stunden * pb.stundensatz), 2) AS "Betrag",
CASE
/* existing contracts for given study semester with status bestellt */
WHEN pb.vertrag_id NOTNULL AND vertrag.vertragsstunden_studiensemester_kurzbz = \''. $STUDIENSEMESTER. '\' AND
vvs.vertragsstatus_kurzbz = \'bestellt\' THEN vvs.datum
END AS "Bestellt",
CASE
/* existing contracts for given study semester with status erteilt */
WHEN pb.vertrag_id NOTNULL AND vertrag.vertragsstunden_studiensemester_kurzbz = \''. $STUDIENSEMESTER. '\' AND
vvs.vertragsstatus_kurzbz = \'erteilt\' THEN vvs.datum
END AS "Erteilt",
CASE
/* existing contracts for given study semester with status akzeptiert */
WHEN pb.vertrag_id NOTNULL AND vertrag.vertragsstunden_studiensemester_kurzbz = \''. $STUDIENSEMESTER. '\' AND
vvs.vertragsstatus_kurzbz = \'akzeptiert\' THEN vvs.datum
END AS "Akzeptiert"
FROM
lehre.tbl_projektbetreuer pb
JOIN lehre.tbl_projektarbeit pa USING (projektarbeit_id)
JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id)
JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
JOIN public.tbl_organisationseinheit oe USING (oe_kurzbz)
JOIN lehre.tbl_lehreinheitgruppe legr USING (lehreinheit_id)
JOIN public.tbl_person person USING (person_id)
LEFT JOIN lehre.tbl_vertrag vertrag USING (vertrag_id)
LEFT JOIN lehre.tbl_vertrag_vertragsstatus vvs USING (vertrag_id)
LEFT JOIN lehre.tbl_vertragsstatus status USING (vertragsstatus_kurzbz)
JOIN public.tbl_studiengang stg ON stg.studiengang_kz = lv.studiengang_kz
WHERE
/* filter studiengang */
lv.studiengang_kz IN ('. implode(',', $STUDIENGANG) . ')
/* filter studiensemester */
AND le.studiensemester_kurzbz = \''. $STUDIENSEMESTER. '\'
/* filter active lehrveranstaltungen */
AND lv.aktiv = TRUE
ORDER BY "Typ" DESC, "Auftrag", "Lektor"
';
@@ -56,35 +125,52 @@ $filterWidgetArray = array(
'app' => Lehrauftrag::APP,
'datasetName' => 'lehrauftragOrder',
'filterKurzbz' => 'LehrauftragOrder',
//'filter_id' => $this->input->get('filter_id'),
'requiredPermissions' => 'infocenter', // TODO: change permission
'requiredPermissions' => 'lehre', // TODO: change permission
'datasetRepresentation' => 'tabulator',
'reloadDataset' => ($this->input->get('reloadDataset') == 'true' ? true : false), // TODO: needed?
//'customMenu' => true,
'customMenu' => false,
'hideOptions' => true,
'hideMenu' => true,
'columnsAliases' => array(
ucfirst($this->p->t('person', 'vorname'))
'columnsAliases' => array( // TODO: use phrasen
'LE-ID',
ucfirst($this->p->t('global', 'typ')),
'Auftrag',
'Organisationseinheit',
'Gruppe',
'Lektor',
'Stunden',
'Betrag',
'Bestellt',
'Erteilt',
'Akzeptiert'
),
'markRow' => function($datasetRaw) {
$mark = '';
if ($datasetRaw->LockDate != null)
'formatRow' => function($datasetRaw) {
if (is_null($datasetRaw->{'Betrag'}))
{
$mark = FilterWidget::DEFAULT_MARK_ROW_CLASS;
$datasetRaw->{'Betrag'} = 'Stundensatz fehlt';
}
// Parking has priority over locking
if ($datasetRaw->ParkDate != null)
{
$mark = "text-info";
}
return $mark;
return $datasetRaw;
},
'datasetRepOptions' => '{height: 300}', // tabulator properties
'datasetRepFieldsDefs' => '{Vorname: {width: 400}}' // col properties
'datasetRepOptions' => '{
height: 700,
selectable: true, // allows row selection
selectableRangeMode: "click", // allows range selection using shift end click on end of range
movableColumns: true, // allows changing column
pagination: "local", // paginates the data
paginationSize: 15 // rows allowed per page
}', // tabulator properties
'datasetRepFieldsDefs' => '{
LE_ID: {headerFilter:"input", headerFilterPlaceholder:" "},
Typ: {headerFilter:"input", headerFilterPlaceholder:" "},
Auftrag: {headerFilter:"input", headerFilterPlaceholder:" "},
Organisationseinheit: {headerFilter:"input", headerFilterPlaceholder:" "},
Gruppe: {headerFilter:"input", headerFilterPlaceholder:" "},
Lektor: {headerFilter:"input", headerFilterPlaceholder:" "},
Stunden: {align:"right", headerFilter:"input", headerFilterPlaceholder:" "},
Betrag: {align:"right", headerFilter:"input", headerFilterPlaceholder:">=", headerFilterFunc:">="},
Bestellt: {align:"center", headerFilter:"input", headerFilterPlaceholder:" "},
Erteilt: {align:"center", headerFilter:"input", headerFilterPlaceholder:" "},
Akzeptiert: {align:"center", headerFilter:"input", headerFilterPlaceholder:" "}
}', // col properties
);
echo $this->widgetlib->widget('FilterWidget', $filterWidgetArray);
+2 -2
View File
@@ -408,9 +408,9 @@ $filters = array(
'default_filter' => true,
'filter' => '
{
"name": "Lehrauftragsstatus",
"name": "",
"columns": [
{"name": "LE-ID"},
{"name": "LE_ID"},
{"name": "Typ"},
{"name": "Auftrag"},
{"name": "Organisationseinheit"},
+21 -1
View File
@@ -3450,7 +3450,27 @@ $phrases = array(
'insertvon' => 'system'
)
)
)
),
array(
'app' => 'core',
'category' => 'global',
'phrase' => 'lehrauftraege',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Lehraufträge',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Lectureships',
'description' => '',
'insertvon' => 'system'
)
)
)
);