Merge branch 'master' into Lehrverband_in_PreStudentstatus

This commit is contained in:
Manfred Kindl
2019-12-04 11:03:20 +01:00
116 changed files with 11124 additions and 2256 deletions
+55
View File
@@ -51,6 +51,16 @@ $config['navigation_header'] = array(
'sort' => 30,
'requiredPermissions' => 'infocenter:r'
),
'lehrauftrag' => array(
'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'),
'description' => 'Lehrauftrag',
'expand' => true,
'sort' => 40,
'requiredPermissions' => array(
'lehre/lehrauftrag_bestellen:r',
'lehre/lehrauftrag_erteilen:r'
)
)
)
),
'Personen' => array(
@@ -125,3 +135,48 @@ $config['navigation_menu']['organisation/Reihungstest/index'] = array(
'target' => '_blank'
)
);
$config['navigation_menu']['lehre/lehrauftrag/Lehrauftrag/*'] = array(
'lehrauftragDashboard' => array(
'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'),
'description' => 'Dashboard',
'icon' => 'dashboard',
'sort' => 1,
'requiredPermissions' => array('lehre/lehrauftrag_bestellen:r','lehre/lehrauftrag_erteilen:r')
),'lehrauftragBestellen' => array(
'link' => site_url('lehre/lehrauftrag/Lehrauftrag'),
'description' => 'Lehrauftrag bestellen',
'icon' => '',
'sort' => 1,
'requiredPermissions' => 'lehre/lehrauftrag_bestellen:r'
),
'lehrauftragErteilen' => array(
'link' => site_url('lehre/lehrauftrag/LehrauftragErteilen'),
'description' => 'Lehrauftrag erteilen',
'icon' => '',
'sort' => 1,
'requiredPermissions' => 'lehre/lehrauftrag_erteilen:r'
)
);
$config['navigation_menu']['lehre/lehrauftrag/LehrauftragErteilen/*'] = array(
'lehrauftragDashboard' => array(
'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'),
'description' => 'Dashboard',
'icon' => 'dashboard',
'sort' => 1,
'requiredPermissions' => array('lehre/lehrauftrag_bestellen:r','lehre/lehrauftrag_erteilen:r')
),'lehrauftragBestellen' => array(
'link' => site_url('lehre/lehrauftrag/Lehrauftrag'),
'description' => 'Lehrauftrag bestellen',
'icon' => '',
'sort' => 1,
'requiredPermissions' => 'lehre/lehrauftrag_bestellen:r'
),
'lehrauftragErteilen' => array(
'link' => site_url('lehre/lehrauftrag/LehrauftragErteilen'),
'description' => 'Lehrauftrag erteilen',
'icon' => '',
'sort' => 1,
'requiredPermissions' => 'lehre/lehrauftrag_erteilen:r'
)
);
@@ -0,0 +1,360 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* 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.
*/
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
/**
* Constructor
*/
public function __construct()
{
// Set required permissions
parent::__construct(
array(
'index' => 'lehre/lehrauftrag_bestellen:r',
'orderLehrauftrag' => 'lehre/lehrauftrag_bestellen:rw',
'Dashboard' => array('lehre/lehrauftrag_bestellen:r', 'lehre/lehrauftrag_erteilen:rw')
)
);
// Load models
$this->load->model('system/Benutzerrolle_model', 'BenutzerrolleModel');
$this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$this->load->model('accounting/Vertrag_model', 'VertragModel');
// Load libraries
$this->load->library('WidgetLib');
$this->load->library('PermissionLib');
// Load helpers
$this->load->helper('array');
$this->load->helper('url');
$this->load->helper('hlp_sancho_helper');
// Load language phrases
$this->loadPhrases(
array(
'global',
'ui',
'lehre'
)
);
$this->_setAuthUID(); // sets property uid
$this->setControllerId(); // sets the controller id
}
/**
* Display of Custom Dashboard for Lehraufträge App
* Charts are hooked from Reporting Addon
*/
public function Dashboard()
{
$this->load->view('lehre/lehrauftrag/Dashboard.php');
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Main page of Lehrauftrag
*/
public function index()
{
// 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);
// Retrieve studiengaenge the user is entitled for to populate studiengang dropdown
if (!$studiengang_kz_arr = $this->permissionlib->getSTG_isEntitledFor(self::BERECHTIGUNG_LEHRAUFTRAG_BESTELLEN)) {
show_error('Fehler bei Berechtigungsprüfung');
}
// If studiengang_kz get param was set, check against entitled stg
if (!is_null($studiengang_kz))
{
if (!in_array($studiengang_kz, $studiengang_kz_arr))
{
show_error('Keine Berechtigung für diesen Studiengang');
}
}
// 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))
{
$studiensemester_kurzbz = $studiensemester->retval[0]->studiensemester_kurzbz;
}
elseif (isError($studiensemester))
{
show_error($studiensemester->error);
}
}
// Set ausbildungssemester selected for ausbildungssemester dropdown
$ausbildungssemester = $this->input->get('ausbildungssemester'); // if provided by selected ausbildungssemester
$ausbildungssemester = ($ausbildungssemester == 'null' ? null : $ausbildungssemester);
$view_data = array(
'studiengang_selected' => $studiengang_kz,
'studiengang' => $studiengang_kz_arr,
'studiensemester_selected' => $studiensemester_kurzbz,
'ausbildungssemester_selected' => $ausbildungssemester,
);
$this->load->view('lehre/lehrauftrag/orderLehrauftrag.php', $view_data);
}
public function orderLehrauftrag()
{
$new_lehrvertrag_data_arr = array(); // information of new lehrvertraege to be used in mail
$lehrauftrag_arr = json_decode($this->input->post('selected_data'));
// Loop through lehraufträge
if(is_array($lehrauftrag_arr))
{
foreach($lehrauftrag_arr as $lehrauftrag)
{
$lehreinheit_id = (isset($lehrauftrag->lehreinheit_id)) ? $lehrauftrag->lehreinheit_id : null;
$lehrveranstaltung_id = (isset($lehrauftrag->lehrveranstaltung_id)) ? $lehrauftrag->lehrveranstaltung_id : null;
$person_id = (isset($lehrauftrag->person_id)) ? $lehrauftrag->person_id : null;
$mitarbeiter_uid = (isset($lehrauftrag->mitarbeiter_uid)) ? $lehrauftrag->mitarbeiter_uid : null;
$vertrag_id = (isset($lehrauftrag->vertrag_id)) ? $lehrauftrag->vertrag_id : null;
$projektarbeit_id = (isset($lehrauftrag->projektarbeit_id)) ? $lehrauftrag->projektarbeit_id : null;
$stunden = (isset($lehrauftrag->stunden)) ? $lehrauftrag->stunden : 0;
$betrag = (isset($lehrauftrag->betrag)) ? $lehrauftrag->betrag : 0;
$studiensemester_kurzbz = (isset($lehrauftrag->studiensemester_kurzbz)) ? $lehrauftrag->studiensemester_kurzbz : null;
$studiengang_kz = (isset($lehrauftrag->studiengang_kz)) ? $lehrauftrag->studiengang_kz : null;
// Check if user is entitled to order this Lehrauftrag
if (!$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_LEHRAUFTRAG_BESTELLEN, 'suid', $studiengang_kz)){
show_error('Keine Bestellberechtigung für diesen Studiengang: '. $studiengang_kz);
}
// update contract if contract exists and the betrag was changed
if (!is_null($vertrag_id))
{
$this->VertragModel->addSelect('vertragsstunden, betrag');
if($result = getData($this->VertragModel->load($vertrag_id)))
{
$vertrag_betrag = $result[0]->betrag;
$vertrag_stunden = $result[0]->vertragsstunden;
}
$hasChanged = ($betrag != floatval($vertrag_betrag) || $stunden != $vertrag_stunden) ? true : false;
if ($hasChanged)
{
$result = $this->VertragModel->updateVertrag(
$vertrag_id,
$stunden,
$betrag,
$mitarbeiter_uid
);
if (isSuccess($result))
{
$json []= array(
'row_index' => $lehrauftrag->row_index,
'bestellt' => date('Y-m-d'),
'vertrag_betrag' => $betrag,
'vertrag_stunden' => $stunden,
'erteilt' => null
);
}
}
}
// else save new contract
else
{
$result = $this->VertragModel->save(
$person_id,
$mitarbeiter_uid,
$lehrveranstaltung_id,
$lehreinheit_id,
$projektarbeit_id,
$stunden,
$betrag,
$studiensemester_kurzbz
);
if (isSuccess($result))
{
$json []= array(
'row_index' => $lehrauftrag->row_index,
'bestellt' => date('Y-m-d'),
'vertrag_betrag' => $betrag,
'vertrag_stunden' => $stunden
);
}
$new_lehrvertrag_data_arr[] = array(
'studiensemester_kurzbz' => $lehrauftrag->studiensemester_kurzbz,
'studiengang_kz' => $lehrauftrag->studiengang_kz,
'lv_oe_kurzbz' => $lehrauftrag->lv_oe_kurzbz
);
}
}
}
if (isset($json) && !isEmptyArray($json))
{
$this->outputJsonSuccess($json);
}
// Send email to Mitarbeiter
// if(!$this->_sendMail($new_lehrvertrag_data_arr)) // TODO: slows down Bestell-process -> better chronjob?
{
// return error information // TODO: implement after decision regarding communication process
}
}
// -----------------------------------------------------------------------------------------------------------------
// Private methods
/**
* Retrieve the UID of the logged user and checks if it is valid
*/
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid) show_error('User authentification failed');
}
private function _sendMail($lehrvertrag_data_arr)
{
// Cluster data of new lehrvertraege as needed to send mail
$lehrvertrag_data_arr = $this->_cluster_newVertragData($lehrvertrag_data_arr);
foreach ($lehrvertrag_data_arr as $lehrvertrag_data)
{
// Get mail recipients
$result = $this->BenutzerrolleModel->getBenutzerByBerechtigung('lehre/lehrauftrag_erteilen', $lehrvertrag_data['lv_oe_kurzbz']);
// If given lv organisational unit has no authorized user, check if is a Kompetenzfeld.
// If so, look up for authorized user on Department level.
if (!hasData($result)) {
$result = $this->OrganisationseinheitModel->getParent($lehrvertrag_data['lv_oe_kurzbz']);
if (hasData($result)) {
if ($result->retval[0]->organisationseinheittyp_kurzbz === 'Department') {
$result = $this->BenutzerrolleModel->getBenutzerByBerechtigung('lehre/lehrauftrag_erteilen', $result->retval[0]->oe_kurzbz);
}
}
}
// Set mail recipients (department assistance/leader)
$to = '';
$to_arr = array();
foreach ($result->retval as $berechtigung) {
$to_arr []= $berechtigung->uid . '@' . DOMAIN; // TODO: als array, dann splitten mit ;? oder als array lassen?
}
$to = implode(', ', $to_arr);
// Set link to lehrauftrag-site with preselected studiengang and studiensemester of new lehrauftraege
$url = site_url(self::LEHRAUFTRAG_URI).'?studiensemester='. $lehrvertrag_data['studiensemester_kurzbz']. '&studiengang='. $lehrvertrag_data['studiengang_kz'];
// Prepare mail content
$content_data_arr = array(
'anzahl' => $lehrvertrag_data['amount_new_lehrvertraege'],
'studiengang' => $lehrvertrag_data['studiengang_kz'],
'studiensemester' => $lehrvertrag_data['studiensemester_kurzbz'],
'link' => anchor($url, 'Lehrverträge Übersicht')
);
// Send mail
sendSanchoMail(
'LehrauftragBestellMail',
$content_data_arr,
$to,
'Bestellung neuer Lehraufträge',
'sancho_header_min_bw.jpg',
'sancho_footer_min_bw.jpg'
);
}
}
/**
* Clusters data as needed for _sendMail.
* Makes array of new lehrvertraege unique (by studiensemester, studiengang and lv_oe_kurzbz)
* Adds the amount of lehrvertraege of each unique array element.
* @param $new_lehrvertrag_data_arr
* @return array
*/
private function _cluster_newVertragData($new_lehrvertrag_data_arr)
{
$unique_new_lehrvertrag_data_arr = array_unique($new_lehrvertrag_data_arr, SORT_REGULAR);
foreach ($unique_new_lehrvertrag_data_arr as &$new_lehrvertrag)
{
$cnt = 1;
foreach ($new_lehrvertrag_data_arr as $item)
{
if ($new_lehrvertrag['studiensemester_kurzbz'] === $item['studiensemester_kurzbz'] &&
$new_lehrvertrag['studiengang_kz'] === $item['studiengang_kz'] &&
$new_lehrvertrag['lv_oe_kurzbz'] === $item['lv_oe_kurzbz'])
{
$new_lehrvertrag['amount_new_lehrvertraege'] = $cnt++;
}
}
}
return $unique_new_lehrvertrag_data_arr;
}
private function validateGetPost($lehrauftrag){
$lehreinheit_id = (isset($lehrauftrag['lehreinheit_id']) && is_numeric($lehrauftrag['lehreinheit_id'])) ? $lehrauftrag['lehreinheit_id'] : null;
$lehrveranstaltung_id = (isset($lehrauftrag['lehrveranstaltung_id']) && is_numeric($lehrauftrag['lehrveranstaltung_id'])) ? $lehrauftrag['lehrveranstaltung_id'] : null;
$person_id = (isset($lehrauftrag['person_id']) && is_numeric($lehrauftrag['person_id'])) ? $lehrauftrag['person_id'] : null;
$mitarbeiter_uid = (isset($lehrauftrag['mitarbeiter_uid']) && is_string($lehrauftrag['mitarbeiter_uid'])) ? $lehrauftrag['mitarbeiter_uid'] : null;
$vertrag_id = (isset($lehrauftrag['vertrag_id']) && is_numeric($lehrauftrag['vertrag_id'])) ? $lehrauftrag['vertrag_id'] : null;
$projektarbeit_id = (isset($lehrauftrag['projektarbeit_id']) && is_numeric($lehrauftrag['projektarbeit_id'])) ? $lehrauftrag['projektarbeit_id'] : null;
$stunden = (isset($lehrauftrag['stunden']) && is_numeric($lehrauftrag['stunden'])) ? $lehrauftrag['stunden'] : null;
$betrag = (isset($lehrauftrag['betrag']) && is_numeric($lehrauftrag['betrag'])) ? $lehrauftrag['betrag'] : null;
$studiensemester_kurzbz = (isset($lehrauftrag['studiensemester_kurzbz']) && is_string($lehrauftrag['studiensemester_kurzbz'])) ? $lehrauftrag['betrag'] : null;
return array(
$lehreinheit_id,
$lehrveranstaltung_id,
$person_id,
$mitarbeiter_uid,
$vertrag_id,
$projektarbeit_id,
$stunden,
$betrag,
$studiensemester_kurzbz
);
// LIST IS TO BE SET ABOVE!!!:
// list(
// $lehreinheit_id,
// $lehrveranstaltung_id,
// $person_id,
// $mitarbeiter_uid,
// $vertrag_id,
// $projektarbeit_id,
// $stunden,
// $betrag,
// $studiensemester_kurzbz
// ) = $this->_validateGetPost($lehrauftrag);
}
}
@@ -0,0 +1,202 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* The controller LehrauftragAkzeptieren displays all Lehrauftraege of the logged in lector.
* Lehrauftraege can be accepted by selecting them, entering the password and submitting them.
*/
class LehrauftragAkzeptieren extends Auth_Controller
{
const APP = 'lehrauftrag';
const LEHRAUFTRAG_URI = 'lehre/lehrauftrag/LehrauftragAkzeptieren'; // URL prefix for this controller
const BERECHTIGUNG_LEHRAUFTRAG_AKZEPTIEREN = 'lehre/lehrauftrag_akzeptieren';
private $_uid; // uid of the logged user
/**
* Constructor
*/
public function __construct()
{
// Set required permissions
parent::__construct(
array(
'index' => 'lehre/lehrauftrag_akzeptieren:r',
'acceptLehrauftrag' => 'lehre/lehrauftrag_akzeptieren:rw',
'checkInkludierteLehre' => 'lehre/lehrauftrag_akzeptieren:rw'
)
);
// Load models
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->load->model('accounting/Vertrag_model', 'VertragModel');
$this->load->model('accounting/Vertragvertragsstatus_model', 'VertragvertragsstatusModel');
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
$this->load->model('codex/Bisverwendung_model', 'BisverwendungModel');
$this->load->model('person/Benutzer_model', 'BenutzerModel');
// Load libraries
$this->load->library('WidgetLib');
$this->load->library('PermissionLib');
$this->load->library('AuthLib');
// Load helpers
$this->load->helper('array');
$this->load->helper('url');
// Load language phrases
$this->loadPhrases(
array(
'global',
'ui',
'lehre'
)
);
$this->_setAuthUID(); // sets property uid
$this->setControllerId(); // sets the controller id
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Main page of Lehrauftrag
*/
public function index()
{
// 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))
{
$studiensemester_kurzbz = $studiensemester->retval[0]->studiensemester_kurzbz;
}
elseif (isError($studiensemester))
{
show_error($studiensemester->error);
}
}
$view_data = array(
'studiensemester_selected' => $studiensemester_kurzbz
);
$this->load->view('lehre/lehrauftrag/acceptLehrauftrag.php', $view_data);
}
/**
* Set the contract status of Lehrauftrag to 'akzeptiert'.
* Performed on ajax call.
*/
public function acceptLehrauftrag()
{
// Verify password
$password = $this->input->post('password');
if (!isEmptyString($password))
{
$result = $this->authlib->checkUserAuthByUsernamePassword($this->_uid, $password);
if (isError($result))
{
return $this->outputJsonError('Passwort ist inkorrekt'); // exit if password is incorrect
}
}
else
{
show_error('Password is missing');
}
// Loop through lehraufträge
$lehrauftrag_arr = $this->input->post('selected_data');
if(is_array($lehrauftrag_arr))
{
foreach($lehrauftrag_arr as $lehrauftrag)
{
$vertrag_id = (!is_null($lehrauftrag['vertrag_id'])) ? $lehrauftrag['vertrag_id'] : null;
// Check if user is entitled to accept this Lehrauftrag
// * first retrieve person_id of the contract
$this->VertragModel->addSelect('person_id');
if ($result = getData($this->VertragModel->load($vertrag_id)))
{
// * then find the uid of that contracts person_id
$this->BenutzerModel->addSelect('uid');
if ($result = getData($this->BenutzerModel->getFromPersonId($result[0]->person_id)))
{
// * finally check uid of contract against the logged in user
if ($result[0]->uid != $this->_uid)
{
show_error('Keine Berechtigung für diesen Vertrag');
}
}
else
{
show_error($result->retval);
}
}
else
{
show_error($result->retval);
}
// Set status to accepted
$result = $this->VertragvertragsstatusModel->setStatus($vertrag_id, $this->_uid, 'akzeptiert');
if ($result->retval)
{
$json []= array(
'row_index' => $lehrauftrag['row_index'],
'akzeptiert' => date('Y-m-d')
);
}
}
// Output json to ajax
if (isset($json) && !isEmptyArray($json))
{
$this->outputJsonSuccess($json);
}
}
}
/**
* Check if lectors latest active Verwendung has inkludierte Lehre
* - inkludierte_lehre is null: freelancer lector -> has NO inkludierte Lehre
* - inkludierte_lehre -1: fix employed lector -> all inclusive Lehre
* - inkludierte_lehre > 0: fix employed lector -> given value is inclusive Lehre
*/
public function checkInkludierteLehre()
{
$result = $this->BisverwendungModel->getLast($this->_uid);
if (hasData($result))
{
$this->outputJsonSuccess(!is_null($result->retval[0]->inkludierte_lehre));
}
else
{
$this->outputJsonError($result->retval);
}
}
// -----------------------------------------------------------------------------------------------------------------
// Private methods
/**
* Retrieve the UID of the logged user and checks if it is valid
*/
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid) show_error('User authentification failed');
}
}
@@ -0,0 +1,193 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* 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.
*/
class LehrauftragErteilen extends Auth_Controller
{
const APP = 'lehrauftrag';
const LEHRAUFTRAG_URI = 'lehre/lehrauftrag/LehrauftragErteilen'; // URL prefix for this controller
const BERECHTIGUNG_LEHRAUFTRAG_ERTEILEN = 'lehre/lehrauftrag_erteilen';
private $_uid; // uid of the logged user
/**
* Constructor
*/
public function __construct()
{
// Set required permissions
parent::__construct(
array(
'index' => 'lehre/lehrauftrag_erteilen:r',
'approveLehrauftrag' => 'lehre/lehrauftrag_erteilen:rw'
)
);
// Load models
$this->load->model('system/Benutzerrolle_model', 'BenutzerrolleModel');
$this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$this->load->model('accounting/Vertrag_model', 'VertragModel');
$this->load->model('accounting/Vertragvertragsstatus_model', 'VertragvertragsstatusModel');
// Load libraries
$this->load->library('WidgetLib');
$this->load->library('PermissionLib');
// Load helpers
$this->load->helper('array');
$this->load->helper('url');
// Load language phrases
$this->loadPhrases(
array(
'global',
'ui',
'lehre'
)
);
$this->_setAuthUID(); // sets property uid
$this->setControllerId(); // sets the controller id
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Main page of Lehrauftrag
*/
public function index()
{
// Set studiengang to be selected in studiengang dropdown
$oe_kurzbz = $this->input->get('organisationseinheit'); // if provided by selected studiengang
$oe_kurzbz = ($oe_kurzbz == 'null' ? null : $oe_kurzbz);
// Retrieve studiengaenge the user is entitled for to populate studiengang dropdown
if (!$oe_kurzbz_arr = $this->permissionlib->getOE_isEntitledFor(self::BERECHTIGUNG_LEHRAUFTRAG_ERTEILEN))
{
show_error('Fehler bei Berechtigungsprüfung');
}
// If oe_kurzbz get param was set, check against entitled stg
if (!is_null($oe_kurzbz))
{
if (!in_array($oe_kurzbz, $oe_kurzbz_arr))
{
show_error('Keine Berechtigung für diese Organisationseinheit');
}
}
// 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))
{
$studiensemester_kurzbz = $studiensemester->retval[0]->studiensemester_kurzbz;
}
elseif (isError($studiensemester))
{
show_error($studiensemester->error);
}
}
// Set ausbildungssemester selected for ausbildungssemester dropdown
$ausbildungssemester = $this->input->get('ausbildungssemester'); // if provided by selected ausbildungssemester
$ausbildungssemester = ($ausbildungssemester == 'null' ? null : $ausbildungssemester);
$view_data = array(
'organisationseinheit_selected' => $oe_kurzbz,
'organisationseinheit' => $oe_kurzbz_arr,
'studiensemester_selected' => $studiensemester_kurzbz,
'ausbildungssemester_selected' => $ausbildungssemester,
);
$this->load->view('lehre/lehrauftrag/approveLehrauftrag.php', $view_data);
}
/**
* Set the contract status of Lehrauftrag to 'erteilt'.
* Performed on ajax call.
*/
public function approveLehrauftrag()
{
$lehrauftrag_arr = json_decode($this->input->post('selected_data'));
if (is_array($lehrauftrag_arr))
{
foreach ($lehrauftrag_arr as $lehrauftrag)
{
$mitarbeiter_uid = (isset($lehrauftrag->mitarbeiter_uid)) ? $lehrauftrag->mitarbeiter_uid : null;
$vertrag_id = (isset($lehrauftrag->vertrag_id)) ? $lehrauftrag->vertrag_id : null;
$lv_oe_kurzbz = null;
// Retrieve organisational unit to which the lehrveranstaltung of the contract belongs to
// * first get lehrveranstaltung
$result = $this->VertragModel->getLehreinheitData($vertrag_id, 'lehrveranstaltung_id');
if (hasData($result))
{
// * then get corresponding organisational unit
$this->load->model('education/Lehrveranstaltung_model', 'Lehrveranstaltung_model');
$result = $this->LehrveranstaltungModel->load($result->retval[0]->lehrveranstaltung_id);
if (hasData($result))
{
$lv_oe_kurzbz = $result->retval[0]->oe_kurzbz;
}
elseif (isError(($result)))
{
show_error($result->retval);
}
}
elseif (isError($result))
{
show_error($result->retval);
}
// Check if user is entitled to approve this lehrauftrag (by permission and organisational unit)
if (!$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_LEHRAUFTRAG_ERTEILEN, 'suid', $lv_oe_kurzbz)){
show_error('Keine Erteilberechtigung für diese Organisationseinheit: '. $lv_oe_kurzbz);
}
// Approve lehrauftrag by setting vertragsstatus to 'erteilt'
$result = $this->VertragvertragsstatusModel->setStatus($vertrag_id, $mitarbeiter_uid, 'erteilt');
if ($result->retval) {
$json [] = array(
'row_index' => $lehrauftrag->row_index,
'erteilt' => date('Y-m-d')
);
}
}
}
// output json to ajax
if (isset($json) && !isEmptyArray($json))
{
$this->outputJsonSuccess($json);
}
}
// -----------------------------------------------------------------------------------------------------------------
// Private methods
/**
* Retrieve the UID of the logged user and checks if it is valid
*/
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid) show_error('User authentification failed');
}
}
@@ -20,7 +20,7 @@ class Studienjahr extends Auth_Controller
'editStudienjahr' => 'basis/studiensemester:rw',
'newStudienjahr' => 'basis/studiensemester:rw',
'insStudienjahr' => 'basis/studiensemester:rw',
'saveStudienjahr' => 'basis/studiensemester:rw',
'updateStudienjahr' => 'basis/studiensemester:rw',
'deleteStudienjahr' => 'basis/studiensemester:rw'
)
);
@@ -117,6 +117,10 @@ class Studienjahr extends Auth_Controller
public function insStudienjahr()
{
$data = $this->__retrieveStudienjahrData();
$studienjahr_exists = $this->StudienjahrModel->load($data['studienjahr_kurzbz']);
if (hasData($studienjahr_exists))
show_error("Studienjahr existiert bereits");
$studienjahr = $this->StudienjahrModel->insert($data);
if ($studienjahr->error)
@@ -177,7 +181,7 @@ class Studienjahr extends Auth_Controller
* replaces slash in Kurzbezeichnung with underscore
* saved=true is a GET parameter passed for showing save message
*/
public function saveStudienjahr()
public function updateStudienjahr()
{
$data = $this->__retrieveStudienjahrData();
$studienjahr = $this->StudienjahrModel->update($data['studienjahr_kurzbz'], $data);
@@ -20,7 +20,7 @@ class Studiensemester extends Auth_Controller
'editStudiensemester' => 'basis/studiensemester:rw',
'newStudiensemester' => 'basis/studiensemester:rw',
'insStudiensemester' => 'basis/studiensemester:rw',
'saveStudiensemester' => 'basis/studiensemester:rw',
'updateStudiensemester' => 'basis/studiensemester:rw',
'deleteStudiensemester' => 'basis/studiensemester:rw'
)
);
@@ -108,6 +108,11 @@ class Studiensemester extends Auth_Controller
public function insStudiensemester()
{
$data = $this->__retrieveStudiensemesterData();
$studiensemester_exists = $this->StudiensemesterModel->load($data['studiensemester_kurzbz']);
if (hasData($studiensemester_exists))
show_error("Studiensemester existiert bereits");
$semester = $this->StudiensemesterModel->insert($data);
if ($semester->error)
@@ -185,7 +190,7 @@ class Studiensemester extends Auth_Controller
* redirects to edit page after inserting
* saved=true is a GET parameter passed for showing save message
*/
public function saveStudiensemester()
public function updateStudiensemester()
{
$data = $this->__retrieveStudiensemesterData();
$semester = $this->StudiensemesterModel->update($data['studiensemester_kurzbz'], $data);
@@ -214,5 +219,4 @@ class Studiensemester extends Auth_Controller
redirect("/organisation/studiensemester/listStudiensemester");
}
}
@@ -3,7 +3,7 @@
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* This controller operates between (interface) the JS (GUI) and the FiltersLib (back-end)
* This controller operates between (interface) the JS (GUI) and the FilterWidgetLib (back-end)
* Provides data to the ajax get calls about the filter
* Accepts ajax post calls to change the filter data
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
@@ -12,10 +12,10 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
*/
class Filters extends FHC_Controller
{
const FILTER_PAGE_PARAM = 'filter_page';
const FILTER_UNIQUE_ID = 'filterUniqueId';
/**
* Calls the parent's constructor and loads the FiltersLib
* Calls the parent's constructor and loads the FilterWidgetLib
*/
public function __construct()
{
@@ -24,8 +24,8 @@ class Filters extends FHC_Controller
// Loads authentication library and starts authentication
$this->load->library('AuthLib');
// Loads the FiltersLib with HTTP GET/POST parameters
$this->_loadFiltersLib();
// Loads the FilterWidgetLib with HTTP GET/POST parameters
$this->_loadFilterWidgetLib();
// Checks if the caller is allow to read this data
$this->_isAllowed();
@@ -39,7 +39,7 @@ class Filters extends FHC_Controller
*/
public function getFilter()
{
$this->outputJsonSuccess($this->filterslib->getSession());
$this->outputJsonSuccess($this->filterwidgetlib->getSession());
}
/**
@@ -48,7 +48,7 @@ class Filters extends FHC_Controller
public function rowNumber()
{
$rowNumber = 0;
$dataset = $this->filterslib->getSessionElement(FiltersLib::SESSION_DATASET);
$dataset = $this->filterwidgetlib->getSessionElement(FilterWidgetLib::SESSION_DATASET);
if (isset($dataset) && is_array($dataset))
{
@@ -66,7 +66,7 @@ class Filters extends FHC_Controller
{
$selectedFields = $this->input->post('selectedFields');
if ($this->filterslib->sortSelectedFields($selectedFields) == true)
if ($this->filterwidgetlib->sortSelectedFields($selectedFields) == true)
{
$this->getFilter();
}
@@ -84,7 +84,7 @@ class Filters extends FHC_Controller
{
$selectedField = $this->input->post('selectedField');
if ($this->filterslib->removeSelectedField($selectedField) == true)
if ($this->filterwidgetlib->removeSelectedField($selectedField) == true)
{
$this->getFilter();
}
@@ -101,7 +101,7 @@ class Filters extends FHC_Controller
{
$selectedField = $this->input->post('selectedField');
if ($this->filterslib->addSelectedField($selectedField) == true)
if ($this->filterwidgetlib->addSelectedField($selectedField) == true)
{
$this->getFilter();
}
@@ -118,7 +118,7 @@ class Filters extends FHC_Controller
{
$appliedFilter = $this->input->post('appliedFilter');
if ($this->filterslib->removeAppliedFilter($appliedFilter) == true)
if ($this->filterwidgetlib->removeAppliedFilter($appliedFilter) == true)
{
$this->outputJsonSuccess('Removed');
}
@@ -138,7 +138,7 @@ class Filters extends FHC_Controller
$appliedFiltersConditions = $this->input->post('appliedFiltersConditions');
$appliedFiltersOptions = $this->input->post('appliedFiltersOptions');
if ($this->filterslib->applyFilters(
if ($this->filterwidgetlib->applyFilters(
$appliedFilters,
$appliedFiltersOperations,
$appliedFiltersConditions,
@@ -160,7 +160,7 @@ class Filters extends FHC_Controller
{
$filter = $this->input->post('filter');
if ($this->filterslib->addFilter($filter) == true)
if ($this->filterwidgetlib->addFilter($filter) == true)
{
$this->getFilter();
}
@@ -177,7 +177,7 @@ class Filters extends FHC_Controller
{
$customFilterDescription = $this->input->post('customFilterDescription');
if ($this->filterslib->saveCustomFilter($customFilterDescription) == true)
if ($this->filterwidgetlib->saveCustomFilter($customFilterDescription) == true)
{
$this->outputJsonSuccess('Saved');
}
@@ -194,7 +194,7 @@ class Filters extends FHC_Controller
{
$filter_id = $this->input->post('filter_id');
if ($this->filterslib->removeCustomFilter($filter_id) == true)
if ($this->filterwidgetlib->removeCustomFilter($filter_id) == true)
{
$this->outputJsonSuccess('Removed');
}
@@ -211,7 +211,7 @@ class Filters extends FHC_Controller
public function setNavigationMenu()
{
// Generates the filters structure array
$filterMenu = $this->filterslib->generateFilterMenu($this->input->get(FiltersLib::NAVIGATION_PAGE));
$filterMenu = $this->filterwidgetlib->generateFilterMenu($this->input->get(FilterWidgetLib::NAVIGATION_PAGE));
$this->outputJsonSuccess('Success');
}
@@ -221,7 +221,7 @@ class Filters extends FHC_Controller
*/
public function reloadDataset()
{
$this->filterslib->reloadDataset();
$this->filterwidgetlib->reloadDataset();
$this->outputJsonSuccess('Success');
}
@@ -234,38 +234,40 @@ class Filters extends FHC_Controller
*/
private function _isAllowed()
{
if (!$this->filterslib->isAllowed())
if (!$this->filterwidgetlib->isAllowed())
{
$this->terminateWithJsonError('You are not allowed to access to this content');
}
}
/**
* Loads the FiltersLib with the FILTER_PAGE_PARAM parameter
* If the parameter FILTER_PAGE_PARAM is not given then the execution of the controller is terminated and
* Loads the FilterWidgetLib with the FILTER_UNIQUE_ID parameter
* If the parameter FILTER_UNIQUE_ID is not given then the execution of the controller is terminated and
* an error message is printed
*/
private function _loadFiltersLib()
private function _loadFilterWidgetLib()
{
// If the parameter FILTER_PAGE_PARAM is present in the HTTP GET or POST
if (isset($_GET[self::FILTER_PAGE_PARAM]) || isset($_POST[self::FILTER_PAGE_PARAM]))
// If the parameter FILTER_UNIQUE_ID is present in the HTTP GET or POST
if (isset($_GET[self::FILTER_UNIQUE_ID]) || isset($_POST[self::FILTER_UNIQUE_ID]))
{
// If it is present in the HTTP GET
if (isset($_GET[self::FILTER_PAGE_PARAM]))
if (isset($_GET[self::FILTER_UNIQUE_ID]))
{
$filterPage = $this->input->get(self::FILTER_PAGE_PARAM); // is retrieved from the HTTP GET
$filterUniqueId = $this->input->get(self::FILTER_UNIQUE_ID); // is retrieved from the HTTP GET
}
elseif (isset($_POST[self::FILTER_PAGE_PARAM])) // Else if it is present in the HTTP POST
elseif (isset($_POST[self::FILTER_UNIQUE_ID])) // Else if it is present in the HTTP POST
{
$filterPage = $this->input->post(self::FILTER_PAGE_PARAM); // is retrieved from the HTTP POST
$filterUniqueId = $this->input->post(self::FILTER_UNIQUE_ID); // is retrieved from the HTTP POST
}
// Loads the FiltersLib that contains all the used logic
$this->load->library('FiltersLib', array(self::FILTER_PAGE_PARAM => $filterPage));
// Loads the FilterWidgetLib that contains all the used logic
$this->load->library('FilterWidgetLib');
$this->filterwidgetlib->setFilterUniqueId($filterUniqueId);
}
else // Otherwise an error will be written in the output
{
$this->terminateWithJsonError('Parameter "'.self::FILTER_PAGE_PARAM.'" not provided!');
$this->terminateWithJsonError('Parameter "'.self::FILTER_UNIQUE_ID.'" not provided!');
}
}
}
+105
View File
@@ -0,0 +1,105 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* This controller operates between (interface) the JS (GUI) and the tablewidgetlib (back-end)
* Provides data to the ajax get calls about the filter
* Accepts ajax post calls to change the filter data
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
* NOTE: extends the FHC_Controller instead of the Auth_Controller because the TableWidget has its
* own permissions check
*/
class Tables extends FHC_Controller
{
const TABLE_UNIQUE_ID = 'tableUniqueId';
/**
* Calls the parent's constructor and loads the tablewidgetlib
*/
public function __construct()
{
parent::__construct();
// Loads authentication library and starts authentication
$this->load->library('AuthLib');
// Loads the tablewidgetlib with HTTP GET/POST parameters
$this->_loadTableWidgetLib();
// Checks if the caller is allow to read this data
$this->_isAllowed();
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Retrieves data about the current filter from the session and will be written on the output in JSON format
*/
public function getTable()
{
$this->outputJsonSuccess($this->tablewidgetlib->getSession());
}
/**
* Retrieves the number of records present in the current dataset and will be written on the output in JSON format
*/
public function rowNumber()
{
$rowNumber = 0;
$dataset = $this->tablewidgetlib->getSessionElement(TableWidgetLib::SESSION_DATASET);
if (isset($dataset) && is_array($dataset))
{
$rowNumber = count($dataset);
}
$this->outputJsonSuccess($rowNumber);
}
//------------------------------------------------------------------------------------------------------------------
// Private methods
/**
* Checks if the user is allowed to use this filter
*/
private function _isAllowed()
{
if (!$this->tablewidgetlib->isAllowed())
{
$this->terminateWithJsonError('You are not allowed to access to this content');
}
}
/**
* Loads the tablewidgetlib with the TABLE_UNIQUE_ID parameter
* If the parameter TABLE_UNIQUE_ID is not given then the execution of the controller is terminated and
* an error message is printed
*/
private function _loadTableWidgetLib()
{
// If the parameter TABLE_UNIQUE_ID is present in the HTTP GET or POST
if (isset($_GET[self::TABLE_UNIQUE_ID]) || isset($_POST[self::TABLE_UNIQUE_ID]))
{
// If it is present in the HTTP GET
if (isset($_GET[self::TABLE_UNIQUE_ID]))
{
$tableUniqueId = $this->input->get(self::TABLE_UNIQUE_ID); // is retrieved from the HTTP GET
}
elseif (isset($_POST[self::TABLE_UNIQUE_ID])) // Else if it is present in the HTTP POST
{
$tableUniqueId = $this->input->post(self::TABLE_UNIQUE_ID); // is retrieved from the HTTP POST
}
// Loads the tablewidgetlib that contains all the used logic
$this->load->library('TableWidgetLib');
$this->tablewidgetlib->setTableUniqueId($tableUniqueId);
}
else // Otherwise an error will be written in the output
{
$this->terminateWithJsonError('Parameter "'.self::TABLE_UNIQUE_ID.'" not provided!');
}
}
}
@@ -5,7 +5,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* FilterWidget logic
*/
class FiltersLib
class FilterWidgetLib
{
// Session parameters names
const SESSION_NAME = 'FHC_FILTER_WIDGET'; // Filter session name
@@ -22,6 +22,7 @@ class FiltersLib
const SESSION_RELOAD_DATASET = 'reloadDataset';
const SESSION_DATASET_REPRESENTATION = 'datasetRepresentation';
const SESSION_DATASET_REP_OPTIONS = 'datasetRepresentationOptions';
const SESSION_DATASET_REP_FIELDS_DEFS = 'datasetRepresentationFieldsDefinitions';
// Alias for the dynamic table used to retrieve the dataset
const DATASET_TABLE_ALIAS = 'datasetFilterTable';
@@ -53,18 +54,23 @@ class FiltersLib
const MARK_ROW = 'markRow';
// ...to hide the options for a filter
const HIDE_HEADER = 'hideHeader';
const HIDE_OPTIONS = 'hideOptions';
const HIDE_SELECT_FIELDS = 'hideSelectFields';
const HIDE_SELECT_FILTERS = 'hideSelectFilters';
const HIDE_SAVE = 'hideSave';
const CUSTOM_MENU = 'customMenu'; // ...to specify if the menu for this filter is custom (true) or not (false)
const HIDE_MENU = 'hideMenu'; // ...to specify if the menu should be shown or not
// ...to specify how to represent the dataset (ex: tablesorter, pivotUI, ...)
const DATASET_REPRESENTATION = 'datasetRepresentation';
const DATASET_REP_OPTIONS = 'datasetRepOptions';
const DATASET_REP_FIELDS_DEFS = 'datasetRepFieldsDefs';
// Different dataset representations
const DATASET_REP_TABLESORTER = 'tablesorter';
const DATASET_REP_PIVOTUI = 'pivotUI';
const DATASET_REP_TABULATOR = 'tabulator';
// Filter operations values
const OP_EQUAL = 'equal';
@@ -84,7 +90,7 @@ class FiltersLib
const FILTER_PHRASES_CATEGORY = 'FilterWidget'; // The category used to store phrases for the FilterWidget
const FILTER_PAGE_PARAM = 'filter_page'; // Filter page parameter name
const FILTER_UNIQUE_ID = 'filterUniqueId'; // Filter page parameter name
const PERMISSION_FILTER_METHOD = 'FilterWidget'; // Name for fake method to be checked by the PermissionLib
const PERMISSION_TYPE = 'rw';
@@ -107,8 +113,6 @@ class FiltersLib
public function __construct($params = null)
{
$this->_ci =& get_instance(); // get code igniter instance
$this->_filterUniqueId = $this->_getFilterUniqueId($params); // sets the id for the related filter widget
}
//------------------------------------------------------------------------------------------------------------------
@@ -689,7 +693,7 @@ class FiltersLib
public function generateFilterMenu($navigationPage)
{
// Loads the NavigationLib for the current page (given as parameter)
$this->_ci->load->library('NavigationLib', array(FiltersLib::NAVIGATION_PAGE => $navigationPage));
$this->_ci->load->library('NavigationLib', array(FilterWidgetLib::NAVIGATION_PAGE => $navigationPage));
$filterMenu = null;
$currentMenu = $this->_ci->navigationlib->getSessionMenu(); // The navigation menu currently stored in session
@@ -771,7 +775,7 @@ class FiltersLib
);
// Sets in the session only the element related to the filters menu
$this->_ci->navigationlib->setSessionElementMenu(FiltersLib::NAV_MENU_FILTER_KEY, $filterMenu);
$this->_ci->navigationlib->setSessionElementMenu(FilterWidgetLib::NAV_MENU_FILTER_KEY, $filterMenu);
}
}
}
@@ -784,14 +788,14 @@ class FiltersLib
* NOTE: The default value is the URI where the FilterWidget is called
* If the fhc_controller_id is present then is also used
*/
private function _getFilterUniqueId($params)
public function setFilterUniqueIdByParams($params)
{
if ($params != null
&& is_array($params)
&& isset($params[self::FILTER_PAGE_PARAM])
&& !isEmptyString($params[self::FILTER_PAGE_PARAM]))
&& isset($params[self::FILTER_UNIQUE_ID])
&& !isEmptyString($params[self::FILTER_UNIQUE_ID]))
{
$filterUniqueId = $params[self::FILTER_PAGE_PARAM];
$filterUniqueId = $params[self::FILTER_UNIQUE_ID];
}
else
{
@@ -799,6 +803,14 @@ class FiltersLib
$filterUniqueId = $this->_ci->router->directory.$this->_ci->router->class.'/'.$this->_ci->router->method;
}
$this->setFilterUniqueId($filterUniqueId);
}
/**
*
*/
public function setFilterUniqueId($filterUniqueId)
{
// If the FHC_CONTROLLER_ID parameter is present in the HTTP GET
if (isset($_GET[self::FHC_CONTROLLER_ID]))
{
@@ -809,7 +821,7 @@ class FiltersLib
$filterUniqueId .= '/'.$this->_ci->input->post(self::FHC_CONTROLLER_ID); // then use it
}
return $filterUniqueId;
$this->_filterUniqueId = $filterUniqueId;
}
/**
+39
View File
@@ -254,6 +254,45 @@ class PermissionLib
return !$this->_inLAPersonIdsBlacklist($person_id) && $this->_hasLAPermissions();
}
/**
* Returns the study programs the person is entitled for.
* @param null $berechtigung_kurzbz If given, only study programs are retrieved according to organisational units
* assigned to that permission.
* @return array|bool array of studiengang_kz the person is entitled for. False on error.
*/
public function getSTG_isEntitledFor($berechtigung_kurzbz = null)
{
$studiengang_kz_arr = array();
if (self::$bb->getStgKz($berechtigung_kurzbz))
{
return $studiengang_kz_arr = self::$bb->getStgKz($berechtigung_kurzbz);
}
else
{
return false;
}
}
/**
* Returns the organisational units the person is entitled for.
* @param null $berechtigung_kurzbz
* @return array|bool array of oe_kurzbz the person is entitled for. False on error.
*/
public function getOE_isEntitledFor($berechtigung_kurzbz = null)
{
$oe_kurzbz_arr = array();
if (self::$bb->getOEkurzbz($berechtigung_kurzbz))
{
return $oe_kurzbz_arr = self::$bb->getOEkurzbz($berechtigung_kurzbz);
}
else
{
return false;
}
}
//------------------------------------------------------------------------------------------------------------------
// Private methods
+206
View File
@@ -0,0 +1,206 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* TableWidget logic
*/
class TableWidgetLib
{
const TABLE_UNIQUE_ID = 'tableUniqueId'; // TableWidget unique id
// Session parameters names
const SESSION_NAME = 'FHC_TABLE_WIDGET'; // Table session name
const SESSION_FIELDS = 'fields';
const SESSION_COLUMNS_ALIASES = 'columnsAliases';
const SESSION_ADDITIONAL_COLUMNS = 'additionalColumns';
const SESSION_CHECKBOXES = 'checkboxes';
const SESSION_METADATA = 'datasetMetadata';
const SESSION_DATASET = 'dataset';
const SESSION_ROW_NUMBER = 'rowNumber';
const SESSION_RELOAD_DATASET = 'reloadDataset';
const SESSION_DATASET_REPRESENTATION = 'datasetRepresentation';
const SESSION_DATASET_REP_OPTIONS = 'datasetRepresentationOptions';
const SESSION_DATASET_REP_FIELDS_DEFS = 'datasetRepresentationFieldsDefinitions';
// Alias for the dynamic table used to retrieve the dataset
const DATASET_TABLE_ALIAS = 'datasetTableWidget';
// Parameters names...
// ...to reload the dataset
const DATASET_RELOAD_PARAMETER = 'reloadDataset';
// ...to specify permissions that are needed to use this TableWidget
const REQUIRED_PERMISSIONS_PARAMETER = 'requiredPermissions';
// ...stament to retrieve the dataset
const QUERY_PARAMETER = 'query';
// ...to specify more columns or aliases for them
const ADDITIONAL_COLUMNS = 'additionalColumns';
const CHECKBOXES = 'checkboxes';
const COLUMNS_ALIASES = 'columnsAliases';
// ...to format/mark records of a dataset
const FORMAT_ROW = 'formatRow';
const MARK_ROW = 'markRow';
// ...to specify how to represent the dataset (ex: tablesorter, pivotUI, ...)
const DATASET_REPRESENTATION = 'datasetRepresentation';
const DATASET_REP_OPTIONS = 'datasetRepOptions';
const DATASET_REP_FIELDS_DEFS = 'datasetRepFieldsDefs';
// Different dataset representations
const DATASET_REP_TABLESORTER = 'tablesorter';
const DATASET_REP_PIVOTUI = 'pivotUI';
const DATASET_REP_TABULATOR = 'tabulator';
const PERMISSION_TABLE_METHOD = 'TableWidget'; // Name for fake method to be checked by the PermissionLib
const PERMISSION_TYPE = 'rw';
private $_ci; // Code igniter instance
private $_tableUniqueId; // unique id for this table widget
/**
* Gets the CI instance and loads message helper
*/
public function __construct($params = null)
{
$this->_ci =& get_instance(); // get code igniter instance
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Checks if at least one of the permissions given as parameter (requiredPermissions) belongs
* to the authenticated user, if confirmed then is allowed to use this FilterWidget.
* If the parameter requiredPermissions is NOT given or is not present in the session,
* then NO one is allow to use this FilterWidget
* Wrapper method to permissionlib->hasAtLeastOne
*/
public function isAllowed($requiredPermissions = null)
{
$this->_ci->load->library('PermissionLib'); // Load permission library
// Gets the required permissions from the session if they are not provided as parameter
$rq = $requiredPermissions;
if ($rq == null) $rq = $this->getSessionElement(self::REQUIRED_PERMISSIONS_PARAMETER);
return $this->_ci->permissionlib->hasAtLeastOne($rq, self::PERMISSION_TABLE_METHOD, self::PERMISSION_TYPE);
}
/**
* Wrapper method to the session helper funtions to retrieve the whole session for this filter
*/
public function getSession()
{
return getSessionElement(self::SESSION_NAME, $this->_tableUniqueId);
}
/**
* Wrapper method to the session helper funtions to retrieve one element from the session of this filter
*/
public function getSessionElement($name)
{
$session = getSessionElement(self::SESSION_NAME, $this->_tableUniqueId);
if (isset($session[$name]))
{
return $session[$name];
}
return null;
}
/**
* Wrapper method to the session helper funtions to set the whole session for this filter
*/
public function setSession($data)
{
setSessionElement(self::SESSION_NAME, $this->_tableUniqueId, $data);
}
/**
* Wrapper method to the session helper funtions to set one element in the session for this filter
*/
public function setSessionElement($name, $value)
{
$session = getSessionElement(self::SESSION_NAME, $this->_tableUniqueId);
$session[$name] = $value;
setSessionElement(self::SESSION_NAME, $this->_tableUniqueId, $session); // stores the single value
}
/**
* Generate the query to retrieve the dataset for a filter
*/
public function generateDatasetQuery($query)
{
return 'SELECT * FROM ('.$query.') '.self::DATASET_TABLE_ALIAS;
}
/**
* Retrieves the dataset from the DB
*/
public function getDataset($datasetQuery)
{
$dataset = null;
if ($datasetQuery != null)
{
$this->_ci->load->model('system/Filters_model', 'FiltersModel');
// Execute the given SQL statement suppressing error messages
$dataset = @$this->_ci->FiltersModel->execReadOnlyQuery($datasetQuery);
}
return $dataset;
}
/**
* Retrieves metadata from the last executed query
*/
public function getExecutedQueryMetaData()
{
return $this->_ci->FiltersModel->getExecutedQueryMetaData();
}
/**
* Retrieves the list of fields from the last executed query
*/
public function getExecutedQueryListFields()
{
return $this->_ci->FiltersModel->getExecutedQueryListFields();
}
/**
* Return an unique string that identify this filter widget
* NOTE: The default value is the URI where the FilterWidget is called
* If the fhc_controller_id is present then is also used
*/
public function setTableUniqueIdByParams($params)
{
if ($params != null
&& is_array($params)
&& isset($params[self::TABLE_UNIQUE_ID])
&& !isEmptyString($params[self::TABLE_UNIQUE_ID]))
{
$tableUniqueId = $this->_ci->router->directory.$this->_ci->router->class.'/'.
$this->_ci->router->method.'/'.
$params[self::TABLE_UNIQUE_ID];
$this->setTableUniqueId($tableUniqueId);
}
}
/**
* Set the _tableUniqueId property
*/
public function setTableUniqueId($tableUniqueId)
{
$this->_tableUniqueId = $tableUniqueId;
}
}
@@ -10,5 +10,324 @@ class Vertrag_model extends DB_Model
parent::__construct();
$this->dbTable = 'lehre.tbl_vertrag';
$this->pk = 'vertrag_id';
$this->load->model('accounting/Vertragvertragsstatus_model', 'VertragvertragsstatusModel');
$this->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel');
$this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel');
}
/**
* Saves Vertrag for a Lehrauftrag and sets Vertragsstatus to 'bestellt'.
* Also updates vertrag_id in tbl_lehreinheitmitarbeiter or tbl_projektbetreuer.
* @param $person_id
* @param $lehrveranstaltung_id
* @param $lehreinheit_id
* @param $projektarbeit_id
* @param $betrag Monetary amount of that Lehreinheit / Projektbetreuung.
* @param $vertragsstunden Working hours of that Lehreinheit / Projektbetreuung.
* @param $studiensemester_kurzbz
* @param $vertragstyp_kurzbz
* @return array|null On success object. On failure null.
*/
public function save($person_id, $mitarbeiter_uid, $lehrveranstaltung_id, $lehreinheit_id, $projektarbeit_id = null, $vertragsstunden, $betrag, $studiensemester_kurzbz)
{
$person_id = (isset($person_id) && is_numeric($person_id))
? $person_id
: show_error('peron_id must be set and numeric.');
$lehreinheit_id = (isset($lehreinheit_id) && is_numeric($lehreinheit_id))
? $lehreinheit_id
: show_error('lehreinheit_id must be set and numeric.');
$lehrveranstaltung_id = (isset($lehrveranstaltung_id) && is_numeric($lehrveranstaltung_id))
? $lehrveranstaltung_id
: show_error('lehrveranstaltung_id must be set and numeric.');
$projektarbeit_id = (isset($projektarbeit_id) && is_numeric($projektarbeit_id))
? $projektarbeit_id
: null;
$vertragsstunden = (isset($vertragsstunden) && is_numeric($vertragsstunden))
? $vertragsstunden
: 0;
$betrag = (isset($betrag) && is_numeric($betrag))
? $betrag
: 0;
$mitarbeiter_uid = (isset($mitarbeiter_uid) && is_string($mitarbeiter_uid))
? $mitarbeiter_uid
: show_error('mitarbeiter_uid must be set and a string value.');;
$vertragstyp_kurzbz = (is_null($projektarbeit_id)) ? 'Lehrauftrag' : 'Betreuung';
// First check if Vertrag already exists for that Lehrauftrag or for that Projektbetreuerauftrag
if ($vertragstyp_kurzbz == 'Lehrauftrag')
{
if ($this->LehreinheitmitarbeiterModel->hasVertrag($mitarbeiter_uid, $lehreinheit_id))
{
return success(null); // Exit if Lehrauftrag already has Vertrag
}
}
elseif ($vertragstyp_kurzbz == 'Betreuung')
{
if ($this->ProjektbetreuerModel->hasVertrag($person_id, $projektarbeit_id))
{
return success(null); // Exit if Projektbetreuung already has Vertrag
}
}
// If Vertrag does not exist, create now
// Vertragsbezeichnung
$bezeichnung = $this->_writeVertragsbezeichung($lehrveranstaltung_id, $studiensemester_kurzbz);
// Start DB transaction
$this->db->trans_start(false);
// Insert Vertragsdata
$result = $this->insert(
array(
'person_id' => $person_id,
'lehrveranstaltung_id' => $lehrveranstaltung_id,
'vertragstyp_kurzbz' => $vertragstyp_kurzbz,
'bezeichnung' => $bezeichnung,
'betrag' => $betrag,
'insertamum' => 'NOW()',
'insertvon' => getAuthUID(),
'vertragsdatum' => 'NOW()',
'vertragsstunden' => $vertragsstunden,
'vertragsstunden_studiensemester_kurzbz' => $studiensemester_kurzbz
)
);
// Retrieve primary key
$vertrag_id = $result->retval;
// If Vertrag was created successfully, update vertrag_id
if (isSuccess($result))
{
// if Lehrtätigkeit, update vertrag_id in tbl_lehreinheitmitarbeiter
if ($vertragstyp_kurzbz == 'Lehrauftrag')
{
$this->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel');
$result = $this->LehreinheitmitarbeiterModel->update(
array(
'lehreinheit_id' => $lehreinheit_id,
'mitarbeiter_uid' =>$mitarbeiter_uid
),
array(
'vertrag_id' => $vertrag_id
)
);
}
// if (Projekt-)Betreuung, update vertrag_id in tbl_projektbetreuer
elseif ($vertragstyp_kurzbz == 'Betreuung')
{
$this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel');
$result = $this->ProjektbetreuerModel->update(
array(
'person_id' => $person_id,
'projektarbeit_id' => $projektarbeit_id
),
array(
'vertrag_id' => $vertrag_id
)
);
}
}
// If updating vertrag_id was successfully, set Status to 'bestellt'
if (isSuccess($result))
{
$result = $this->VertragvertragsstatusModel->setStatus($vertrag_id, $mitarbeiter_uid, 'bestellt');
}
// Transaction complete!
$this->db->trans_complete();
// Check if everything went ok during the transaction
if ($this->db->trans_status() === false || isError($result))
{
$this->db->trans_rollback();
return error($result->msg, EXIT_ERROR);
}
else
{
$this->db->trans_commit();
return success($vertrag_id);
}
}
/**
* Updates Vertrag and, if resets vertragsstatus as follows:
* - if vertragsstatus 'erteilt': delete status 'erteilt' and update date of status 'bestellt'
* - if vertragsstatus 'bestellt': update date of status 'bestellt'
* @param $vertrag_obj Object with vertrag properties vertrag_id, vertragsstunden, betrag.
* @param $mitarbeiter_uid
*/
public function updateVertrag($vertrag_id, $vertragsstunden, $betrag, $mitarbeiter_uid)
{
$vertrag_id = (isset($vertrag_id) && is_numeric($vertrag_id))
? $vertrag_id
: show_error('vertrag_id must be set and numeric.');
$vertragsstunden = (isset($vertragsstunden) && is_numeric($vertragsstunden))
? $vertragsstunden
: 0;
$betrag = (isset($betrag) && is_numeric($betrag))
? $betrag
: 0;
$mitarbeiter_uid = (isset($mitarbeiter_uid) && is_string($mitarbeiter_uid))
? $mitarbeiter_uid
: show_error('mitarbeiter_uid must be set and a string value.');
// Start DB transaction
$this->db->trans_start(false);
// Update contract
$result = $this->update(
$vertrag_id,
array(
'vertragsstunden' => $vertragsstunden,
'betrag' => $betrag,
'updateamum' => $this->escape('NOW()'),
'updatevon' => getAuthUID()
)
);
// If last vertragsstatus is 'erteilt', delete the status
if (isSuccess($result))
{
$result = $this->VertragvertragsstatusModel->getLastStatus($vertrag_id, $mitarbeiter_uid);
$lastStatus = getData($result)[0]->vertragsstatus_kurzbz;
if ($lastStatus == 'erteilt')
{
$result = $this->VertragvertragsstatusModel->deleteStatus($vertrag_id, 'erteilt');
}
}
// Update date of status 'bestellt'
if (isSuccess($result))
{
$result = $this->VertragvertragsstatusModel->updateStatus($vertrag_id, 'bestellt');
}
// Transaction complete!
$this->db->trans_complete();
// Check if everything went ok during the transaction
if ($this->db->trans_status() === false || isError($result))
{
$this->db->trans_rollback();
return error($result->msg, EXIT_ERROR);
}
else
{
$this->db->trans_commit();
return success('Contract successfully updated.');
}
}
/**
* Gets Lehreinheit ID corresponding to the contract.
* @param $vertrag_id
* @return array
*/
public function getLehreinheitID($vertrag_id)
{
$vertragstyp_kurzbz = null;
$this->addSelect('vertragstyp_kurzbz');
if ($result = getData($this->load($vertrag_id)))
{
$vertragstyp_kurzbz = $result[0]->vertragstyp_kurzbz;
}
else
{
return error('Fehler beim Laden des Vertrags.');
}
if ($vertragstyp_kurzbz == 'Lehrauftrag')
{
$this->LehreinheitmitarbeiterModel->addSelect('lehreinheit_id');
if ($result = $this->LehreinheitmitarbeiterModel->loadWhere(array('vertrag_id' => $vertrag_id)))
{
return success($result->retval);
}
else
{
return error('Fehler beim Ermitteln der Lehreinheit ID');
}
}
elseif ($vertragstyp_kurzbz == 'Betreuung')
{
$this->addSelect('lehreinheit_id');
$this->addJoin('lehre.tbl_projektbetreuer', 'vertrag_id');
$this->addJoin('lehre.tbl_projektarbeit', 'projektarbeit_id');
if ($result = $this->loadWhere(array('vertrag_id' => $vertrag_id)))
{
return success($result->retval);
}
else
{
return error('Fehler beim Ermitteln der Lehreinheit ID');
}
}
}
/**
* Gets (table) data of lehreinheit_id corresponding to the contract.
* @param integer $vertrag_id
* @param string $select To restrict fields, pass select string. e.g. 'lehrveranstaltung_id'.
* @return array
*/
public function getLehreinheitData($vertrag_id, $select = '*')
{
if ($result = getData($this->getLehreinheitID($vertrag_id)))
{
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
$this->LehreinheitModel->addSelect($select);
if($result = $this->LehreinheitModel->load($result[0]->lehreinheit_id))
{
return success($result->retval);
}
else
{
return error('Fehler beim Laden der Lehreinheit');
}
}
else
{
return error('Fehler beim Ermitteln der Lehreinheit ID');
}
}
// -----------------------------------------------------------------------------------------------------------------
// Private methods
/**
* Generate contract description.
* Example: WS2017-BEE3-LIA-LAB
* @param $lehrveranstaltung_id
* @param $studiensemester_kurzbz Studiensemester of Lehrauftrag (= when the lector will teach the lehrveranstaltung)
* @return string Returns e.g. WS2017-BBE5-GAP-LAB
*/
private function _writeVertragsbezeichung($lehrveranstaltung_id, $studiensemester_kurzbz)
{
$bezeichnung = '';
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$this->LehrveranstaltungModel->addSelect('tbl_lehrveranstaltung.semester, tbl_lehrveranstaltung.kurzbz AS "lv_kurzbz", lehrform_kurzbz, public.tbl_studiengang.typ, public.tbl_studiengang.kurzbz');
$this->LehrveranstaltungModel->addJoin('lehre.tbl_studienplan_lehrveranstaltung', 'lehrveranstaltung_id');
$this->LehrveranstaltungModel->addJoin('lehre.tbl_studienplan', 'studienplan_id');
$this->LehrveranstaltungModel->addJoin('lehre.tbl_studienordnung', 'studienordnung_id');
$this->LehrveranstaltungModel->addJoin('public.tbl_studiengang', 'public.tbl_studiengang.studiengang_kz = lehre.tbl_studienordnung.studiengang_kz');
$result = $this->LehrveranstaltungModel->load($lehrveranstaltung_id);
if (hasData($result))
{
$bezeichnung = $studiensemester_kurzbz. '-';
$bezeichnung.= strtoupper($result->retval[0]->typ. $result->retval[0]->kurzbz). $result->retval[0]->semester. '-';
$bezeichnung.= $result->retval[0]->lv_kurzbz. '-';
$bezeichnung.= $result->retval[0]->lehrform_kurzbz;
}
return $bezeichnung;
}
}
@@ -0,0 +1,134 @@
<?php
class Vertragvertragsstatus_model extends DB_Model
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->dbTable = 'lehre.tbl_vertrag_vertragsstatus';
$this->pk = array('vertragsstatus_kurzbz', 'vertrag_id');
$this->hasSequence = false;
}
/**
* Check if Vertrag has the given Vertragsstatus.
* @param integer $vertrag_id
* @param string $mitarbeiter_uid
* @param string $vertragsstatus_kurzbz
* @return array
*/
public function hasStatus($vertrag_id, $mitarbeiter_uid, $vertragsstatus_kurzbz)
{
$this->addSelect('1');
$this->addLimit(1);
return $this->loadWhere(array(
'vertrag_id' => $vertrag_id,
'uid' => $mitarbeiter_uid,
'vertragsstatus_kurzbz' => $vertragsstatus_kurzbz
));
}
/**
* Get the latest Vertragsstatus for the given Vertrag and Mitarbeiter
* @param integer $vertrag_id
* @param string $mitarbeiter_uid
* @return array
*/
public function getLastStatus($vertrag_id, $mitarbeiter_uid)
{
$this->addSelect('vertragsstatus_kurzbz');
$this->addOrder('datum', 'DESC');
$this->addLimit(1);
return $this->loadWhere(
array(
'vertrag_id' => $vertrag_id,
'uid' => $mitarbeiter_uid
)
);
}
/**
* Set Vertragsstatus for the given Vertrag and Mitarbeiter.
* @param $vertrag_id
* @param $vertragsstatus_kurzbz
* @param $mitarbeiter_uid
* @return array|null On success object, retval is true. Null if status already exist for this vertrag.
*/
public function setStatus($vertrag_id, $mitarbeiter_uid, $vertragsstatus_kurzbz){
// Check if vertrag has already this status
$result = $this->hasStatus($vertrag_id, $mitarbeiter_uid, $vertragsstatus_kurzbz);
if (hasData($result))
{
return success(null); // return null if status is already set
}
// If new status should be 'akzeptiert', the latest status has to be 'erteilt'
if ($vertragsstatus_kurzbz == 'akzeptiert')
{
$result = $this->getLastStatus($vertrag_id, $mitarbeiter_uid);
$last_status = getData($result)[0]->vertragsstatus_kurzbz;
if ($last_status != 'erteilt')
{
return success(null); // return null if latest status is not 'erteilt'
}
}
// Set new status if passed all checks
return $this->insert(
array(
'vertrag_id' => $vertrag_id,
'vertragsstatus_kurzbz' => $vertragsstatus_kurzbz,
'uid' => $mitarbeiter_uid,
'datum' => $this->escape('NOW()'),
'insertvon' => getAuthUID(),
'insertamum' => $this->escape('NOW()')
)
);
}
/**
* Updates the date of the given vertragsstatus.
* @param $vertrag_id
* @param $vertragsstatus_kurzbz
* @return array
*/
public function updateStatus($vertrag_id, $vertragsstatus_kurzbz)
{
$user = getAuthUID();
return $this->update(
array(
'vertrag_id' => $vertrag_id,
'vertragsstatus_kurzbz' => $vertragsstatus_kurzbz
),
array(
'datum' => $this->escape('NOW()'),
'updateamum' => $this->escape('NOW()'),
'updatevon' => $user,
)
);
}
/**
* Deletes the given vertragsstatus of the contract.
* @param $vertrag_id
* @param $vertragsstatus_kurbz
* @return array
*/
public function deleteStatus($vertrag_id, $vertragsstatus_kurzbz)
{
return $this->delete(
array(
'vertrag_id' => $vertrag_id,
'vertragsstatus_kurzbz' => $vertragsstatus_kurzbz
)
);
}
}
@@ -11,4 +11,34 @@ class Bisverwendung_model extends DB_Model
$this->dbTable = 'bis.tbl_bisverwendung';
$this->pk = 'bisverwendung_id';
}
/**
* Get latest (active) Verwendung of the user.
* @param string $uid
* @param bool $active If false, returns latest Verwendung no matter if actual or not (ignores ending/beginning date).
* @return array
*/
public function getLast($uid, $active = true)
{
$this->addLimit(1);
if ($active)
{
$condition = '
mitarbeiter_uid = '. $this->escape($uid). '
AND ( beginn <= NOW() OR beginn IS NULL )
AND ( ende >= NOW() OR ende IS NULL )
ORDER BY ende DESC NULLS LAST, beginn DESC NULLS LAST
';
}
else
{
$condition = '
mitarbeiter_uid = '. $this->escape($uid). '
ORDER BY ende DESC NULLS LAST, beginn DESC NULLS LAST
';
}
return $this->loadWhere($condition);
}
}
@@ -11,4 +11,34 @@ class Lehreinheitmitarbeiter_model extends DB_Model
$this->dbTable = 'lehre.tbl_lehreinheitmitarbeiter';
$this->pk = array('mitarbeiter_uid', 'lehreinheit_id');
}
/**
* Checks if Lehrauftrag has a contract.
* @param $mitarbeiter_uid
* @param $lehreinheit_id
* @return array|bool|int Returns vertrag_id if contract exists. False if doesnt exist. On error array.
*/
public function hasVertrag($mitarbeiter_uid, $lehreinheit_id)
{
if(is_string($mitarbeiter_uid) && is_numeric($lehreinheit_id))
{
$result = $this->load(array(
'mitarbeiter_uid' => $mitarbeiter_uid,
'lehreinheit_id' => $lehreinheit_id
));
if (hasData($result))
{
return (is_null($result->retval[0]->vertrag_id)) ? false : intval($result->retval[0]->vertrag_id);
}
else
{
return error($result->msg, EXIT_ERROR);
}
}
else
{
return error ('Incorrect parameter type');
}
}
}
@@ -11,4 +11,34 @@ class Projektbetreuer_model extends DB_Model
$this->dbTable = 'lehre.tbl_projektbetreuer';
$this->pk = array('betreuerart_kurzbz', 'projektarbeit_id', 'person_id');
}
/**
* Checks if Projektauftrag has a contract.
* @param $person_id
* @param $projektarbeit_id
* @return array|bool|int Returns vertrag_id if contract exists. False if doesnt exist. On error array.
*/
public function hasVertrag($person_id, $projektarbeit_id)
{
if (is_numeric($person_id) && is_numeric($projektarbeit_id))
{
$result = $this->load(array(
'person_id' => $person_id,
'projektarbeit_id' => $projektarbeit_id
));
if (hasData($result))
{
return (is_null($result->retval[0]->vertrag_id)) ? false : intval($result->retval[0]->vertrag_id);
}
else
{
return error($result->msg, EXIT_ERROR);
}
}
else
{
return error ('Incorrect parameter type');
}
}
}
@@ -165,4 +165,27 @@ class Organisationseinheit_model extends DB_Model
return $this->execQuery(sprintf($query, $aktivstring, $aktivstring), array($oe_kurzbz));
}
/**
* Get one parent only.
* Easily retrieve department of a studiengang or fakultät of department etc.
* @param $oe_kurzbz
* @return array|null
*/
public function getParent($oe_kurzbz)
{
if (is_string($oe_kurzbz))
{
$condition = '
oe_kurzbz = (
SELECT
oe_parent_kurzbz
FROM
public.tbl_organisationseinheit
WHERE
oe_kurzbz = \''. $oe_kurzbz. '\'
)
';
}
return $this->loadWhere($condition);
}
}
@@ -13,6 +13,22 @@ class Studiensemester_model extends DB_Model
$this->hasSequence = false;
}
// Get next study semester
public function getNext()
{
$query = '
SELECT *
FROM
public.tbl_studiensemester
WHERE
start > now()
ORDER BY start
LIMIT 1;
';
return $this->execQuery($query);
}
/**
* getLastOrAktSemester
*/
+1 -2
View File
@@ -15,8 +15,7 @@ class Benutzer_model extends DB_Model
public function getFromPersonId($person_id)
{
/*$this->addSelect('uid, aktiv, alias');*/
$this->loadWhere(array('person_id' => $person_id));
return $this->loadWhere(array('person_id' => $person_id, 'aktiv' => true));
}
}
@@ -104,4 +104,38 @@ class Benutzerfunktion_model extends DB_Model
return $this->execQuery($query, $parametersArray);
}
/**
* Get active Studiengangsleitung(en) of the user by UID.
* @param $uid
*/
public function getSTGLByUID($uid)
{
$query = '
SELECT
uid,
oe_kurzbz,
studiengang_kz,
typ,
tbl_studiengang.bezeichnung
FROM
public.tbl_benutzerfunktion
JOIN public.tbl_studiengang USING (oe_kurzbz)
WHERE
funktion_kurzbz = \'Leitung\'
AND (datum_von IS NULL OR datum_von <= now())
AND (datum_bis IS NULL OR datum_bis >= now())
AND uid = ?
ORDER BY
oe_kurzbz
';
$parameters_array = array();
if (is_string($uid))
{
$parameters_array[] = $uid;
}
return $this->execQuery($query, $parameters_array);
}
}
@@ -11,4 +11,33 @@ class Mitarbeiter_model extends DB_Model
$this->dbTable = 'public.tbl_mitarbeiter';
$this->pk = 'mitarbeiter_uid';
}
/**
* Checks if the user is a Mitarbeiter.
* @param string $uid
* @param boolean null $fixangestellt
* @return array
*/
public function isMitarbeiter($uid, $fixangestellt = null)
{
$this->addSelect('1');
if (is_bool($fixangestellt))
{
$result = $this->loadWhere(array('mitarbeiter_uid' => $uid, 'fixangestellt' => $fixangestellt));
}
else // default
{
$result = $this->loadWhere(array('mitarbeiter_uid' => $uid));
}
if(hasData($result))
{
return success(true);
}
else
{
return success(false);
}
}
}
@@ -36,4 +36,22 @@ class Benutzerrolle_model extends DB_Model
return $result;
}
/**
* Get user who are authorized with berechtigung and, if given, authorized for the specific organisational unit.
* @param $berechtigung_kurzbz
* @param null $oe_kurzbz
* @return array
*/
public function getBenutzerByBerechtigung($berechtigung_kurzbz, $oe_kurzbz = null){
$condition = array('berechtigung_kurzbz' => $berechtigung_kurzbz);
if (is_string($oe_kurzbz))
{
$condition['oe_kurzbz'] = $oe_kurzbz;
}
return $this->loadWhere($condition);
}
}
@@ -0,0 +1,38 @@
<?php
$this->load->view(
'templates/FHC-Header',
array(
'title' => 'Lehrauftrag bestellen',
'jquery' => true,
'jqueryui' => true,
'bootstrap' => true,
'fontawesome' => true,
'sbadmintemplate' => true,
'ajaxlib' => true,
'dialoglib' => true,
'navigationwidget' => true,
'addons' => true,
)
);
?>
<body>
<?php echo $this->widgetlib->widget('NavigationWidget'); ?>
<div id="page-wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h3 class="page-header">
Lehrauftrag
</h3>
</div>
</div>
<div id="dashboard"></div>
</div>
</div>
</body>
<?php $this->load->view('templates/FHC-Footer'); ?>
@@ -0,0 +1,130 @@
<?php
$this->load->view(
'templates/FHC-Header',
array(
'title' => 'Lehrauftrag annehmen',
'jquery' => true,
'jqueryui' => true,
'jquerycheckboxes' => true,
'bootstrap' => true,
'fontawesome' => true,
'sbadmintemplate' => false,
'tabulator' => true,
'momentjs' => true,
'ajaxlib' => true,
'dialoglib' => true,
'tablewidget' => true,
'navigationwidget' => true,
'phrases' => array(
'global' => array('lehrauftraegeAnnehmen'),
),
'customJSs' => array(
'public/js/bootstrapper.js',
'public/js/lehre/lehrauftrag/acceptLehrauftrag.js')
)
);
?>
<body>
<div id="page-wrapper">
<div class="container-fluid">
<!-- title & helper link -->
<div class="row">
<div class="col-lg-12 page-header">
<a class="pull-right" data-toggle="collapse" href="#collapseHelp" aria-expanded="false" aria-controls="collapseExample">
Hilfe zu dieser Seite
</a>
<h3>
<?php echo ucfirst($this->p->t('global', 'lehrauftraegeAnnehmen')); ?>
</h3>
</div>
</div>
<!-- helper collapse module -->
<div class="row">
<div class="col-lg-12 collapse" id="collapseHelp">
<div class="well">
<h4>Wie nehme ich Lehraufträge an?</h4>
<div class="panel panel-body">
<p>
Sobald Ihnen ein oder mehrere Lehraufträge erteilt wurden, können Sie diese annehmen.
<ol>
<li>Klicken Sie unten auf das Status-Icon 'Nur erteilte anzeigen' oder 'Alle anzeigen'</li>
<li>Wählen Sie einzelne Lehraufträge mit Klick auf die Zeilen oder alle über den Button 'Alle auswählen'.</li>
<li>Geben Sie Ihr CIS-Passwort ein und klicken auf Lehrauftrag annehmen.</li>
</ol>
</p>
</div>
<br>
<h4>Warum kann ich manche Lehraufträge nicht auswählen?</h4>
<div class="panel panel-body">
<p>
Nur Lehraufträge mit dem Status 'erteilt' können gewählt werden.<br>
Angenommene Lehraufträge oder Lehraufträge in Bearbeitung werden nur zu Ihrer Information angezeigt.
</p>
</div>
</div>
</div>
</div>
<!-- dropdown widgets -->
<div class="row">
<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>
<button type="submit" name="submit" value="anzeigen" class="btn btn-default form-group">Anzeigen</button>
</form>
</div>
</div>
<!-- tabulator data table -->
<div class="row">
<div class="col-lg-12">
<?php $this->load->view('lehre/lehrauftrag/acceptLehrauftragData.php'); ?>
</div>
</div>
<br>
<!-- filter buttons & password field & akzeptieren-button -->
<div class="row">
<div class="col-xs-6">
<div class="btn-toolbar" role="toolbar">
<div class="btn-group" role="group">
<button id="show-all" class="btn btn-default btn-lehrauftrag active focus" type="button" data-toggle="tooltip" data-placement="left" title="Alle anzeigen"><i class='fa fa-users'></i></button>
<button id="show-ordered" class="btn btn-default btn-lehrauftrag" type="button" data-toggle="tooltip" data-placement="left" title="Nur bestellte anzeigen"></button><!-- png img set in javascript -->
<button id="show-approved" class="btn btn-default btn-lehrauftrag" type="button" data-toggle="tooltip" data-placement="left" title="Nur erteilte anzeigen"></button><!-- png img set in javascript -->
<button id="show-accepted" class="btn btn-default btn-lehrauftrag" type="button" data-toggle="tooltip" data-placement="left" title="Nur angenommene anzeigen"><i class='fa fa-handshake-o'></i></button>
</div>
</div>
</div>
<div class="col-md-offset-2 col-md-4 col-xs-6">
<div class="input-group">
<input id="password" type="password" class="form-control" placeholder="CIS-Passwort">
<span class="input-group-btn">
<button id="accept-lehrauftraege" class="btn btn-primary pull-right">Lehrauftrag annehmen</button>
</span>
</div>
</div>
</div>
</div><!-- end container -->
</div><!-- end page-wrapper -->
<br>
</body>
<?php $this->load->view('templates/FHC-Footer'); ?>
@@ -0,0 +1,386 @@
<?php
$STUDIENSEMESTER = $studiensemester_selected;
$UID = getAuthUID();
$PERSON_ID = getAuthPersonId();
$query = '
SELECT
/* provide extra row index for tabulator, because no other column has unique ids */
ROW_NUMBER() OVER () AS "row_index",
lehreinheit_id,
lehrveranstaltung_id,
projektarbeit_id,
studiensemester_kurzbz,
studiengang_kz,
stg_typ_kurzbz,
orgform_kurzbz,
person_id,
typ,
auftrag,
semester,
lv_oe_kurzbz,
gruppe,
stunden,
betrag,
vertrag_id,
vertrag_stunden,
vertrag_betrag,
mitarbeiter_uid,
bestellt,
erteilt,
akzeptiert,
(SELECT
vorname || \' \' || nachname
FROM
public.tbl_person
JOIN public.tbl_benutzer benutzer USING (person_id)
WHERE
benutzer.uid = (
SELECT
insertvon
FROM
lehre.tbl_vertrag_vertragsstatus vvs
WHERE
vvs.vertragsstatus_kurzbz = \'bestellt\'
AND vvs.vertrag_id = auftraege.vertrag_id
)
) AS "bestellt_von",
(SELECT
vorname || \' \' || nachname
FROM
public.tbl_person
JOIN public.tbl_benutzer benutzer USING (person_id)
WHERE
benutzer.uid = (
SELECT
insertvon
FROM
lehre.tbl_vertrag_vertragsstatus vvs
WHERE
vvs.vertragsstatus_kurzbz = \'erteilt\'
AND vvs.vertrag_id = auftraege.vertrag_id
)
) AS "erteilt_von",
(SELECT
vorname || \' \' || nachname
FROM
public.tbl_person
JOIN public.tbl_benutzer benutzer USING (person_id)
WHERE
benutzer.uid = (
SELECT
insertvon
FROM
lehre.tbl_vertrag_vertragsstatus vvs
WHERE
vvs.vertragsstatus_kurzbz = \'akzeptiert\'
AND vvs.vertrag_id = auftraege.vertrag_id
)
) AS "akzeptiert_von"
FROM
(
/* Lehraufträge and -vertragsstati */
SELECT *,
/* concatinated and aggregated gruppen */
(SELECT
string_agg(concat(stg_typ_kurzbz, \'-\', semester, verband, gruppe
|| gruppe_kurzbz), \', \')
FROM
lehre.tbl_lehreinheitgruppe
WHERE
lehreinheit_id = tmp_lehrauftraege.lehreinheit_id
) AS "gruppe",
/* existing contracts with status bestellt */
(SELECT
datum
FROM
lehre.tbl_vertrag_vertragsstatus
WHERE
tbl_vertrag_vertragsstatus.vertragsstatus_kurzbz = \'bestellt\'
AND vertrag_id = tmp_lehrauftraege.vertrag_id) AS "bestellt",
/* existing contracts with status erteilt */
(SELECT
datum
FROM
lehre.tbl_vertrag_vertragsstatus
WHERE
tbl_vertrag_vertragsstatus.vertragsstatus_kurzbz = \'erteilt\'
AND vertrag_id = tmp_lehrauftraege.vertrag_id) AS "erteilt",
/* existing contracts with status akzeptiert */
(SELECT
datum
FROM
lehre.tbl_vertrag_vertragsstatus
WHERE
tbl_vertrag_vertragsstatus.vertragsstatus_kurzbz = \'akzeptiert\'
AND vertrag_id = tmp_lehrauftraege.vertrag_id) AS "akzeptiert"
FROM
(
SELECT
lema.lehreinheit_id,
lv.lehrveranstaltung_id,
NULL AS "projektarbeit_id",
le.studiensemester_kurzbz,
stg.studiengang_kz,
upper(stg.typ || stg.kurzbz) AS "stg_typ_kurzbz",
lv.orgform_kurzbz,
person.person_id,
upper(lv.lehrtyp_kurzbz) AS "typ",
(lv.bezeichnung || \' [\' || le.lehrform_kurzbz ||
\']\') AS "auftrag",
lv.semester,
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 "lv_oe_kurzbz",
TRUNC(lema.semesterstunden, 1) AS "stunden",
TRUNC((lema.semesterstunden * lema.stundensatz), 2) AS "betrag",
vertrag_id,
vertragsstunden AS "vertrag_stunden",
vertrag.betrag AS "vertrag_betrag",
mitarbeiter_uid
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 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 (vertrag_id)
LEFT JOIN lehre.tbl_vertrag_vertragsstatus vvs USING (vertrag_id)
JOIN PUBLIC.tbl_studiengang stg ON stg.studiengang_kz = lv.studiengang_kz
WHERE
/* filter lector */
mitarbeiter_uid = \'' . $UID . '\'
/* filter studiensemester */
AND le.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\'
/* filter active lehrveranstaltungen */
AND lv.aktiv = TRUE
/* filter active organisationseinheiten */
AND oe.aktiv = TRUE
/* filter vertragsstatus to avoid showing before status is bestellt */
AND vvs.vertragsstatus_kurzbz IN (\'bestellt\', \'erteilt\', \'akzeptiert\')
) tmp_lehrauftraege
UNION
/* Projektbetreuungsaufträge and -vertragsstati */
SELECT *,
/* mitarbeiter uid retrieved by person_id */
/* NOTE: mitarbeiter MUST come after Select * to ensure correct order with select for tmp_lehrauftraege*/
(SELECT
uid
FROM
public.tbl_benutzer
WHERE
person_id = tmp_projektbetreuung.person_id
ORDER BY aktiv DESC, updateaktivam DESC -- accept inactive as some person_ids have no active, but order them last
LIMIT 1) AS "mitarbeiter_uid",
/* concatinated and aggregated gruppen */
(SELECT
string_agg(concat(stg_typ_kurzbz, \'-\', semester, verband, gruppe
|| gruppe_kurzbz), \', \')
FROM
lehre.tbl_lehreinheitgruppe
WHERE
lehreinheit_id = tmp_projektbetreuung.lehreinheit_id
) AS "gruppe",
/* existing contracts with status bestellt */
(SELECT
datum
FROM
lehre.tbl_vertrag_vertragsstatus
WHERE
tbl_vertrag_vertragsstatus.vertragsstatus_kurzbz = \'bestellt\'
AND vertrag_id = tmp_projektbetreuung.vertrag_id) AS "bestellt",
/* existing contracts with status erteilt */
(SELECT
datum
FROM
lehre.tbl_vertrag_vertragsstatus
WHERE
tbl_vertrag_vertragsstatus.vertragsstatus_kurzbz = \'erteilt\'
AND vertrag_id = tmp_projektbetreuung.vertrag_id) AS "erteilt",
/* existing contracts with status akzeptiert */
(SELECT
datum
FROM
lehre.tbl_vertrag_vertragsstatus
WHERE
tbl_vertrag_vertragsstatus.vertragsstatus_kurzbz = \'akzeptiert\'
AND vertrag_id = tmp_projektbetreuung.vertrag_id) AS "akzeptiert"
FROM
(
SELECT
pa.lehreinheit_id,
lv.lehrveranstaltung_id,
pa.projektarbeit_id AS "projektarbeit_id",
le.studiensemester_kurzbz,
stg.studiengang_kz,
upper(stg.typ || stg.kurzbz) AS "stg_typ_kurzbz",
lv.orgform_kurzbz,
person.person_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]\') AS "auftrag",
lv.semester,
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 "lv_oe_kurzbz",
TRUNC(pb.stunden, 1) AS "stunden",
TRUNC((pb.stunden * pb.stundensatz), 2) AS "betrag",
vertrag_id,
vertragsstunden AS "vertrag_stunden",
vertrag.betrag AS "vertrag_betrag"
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 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)
JOIN PUBLIC.tbl_studiengang stg
ON stg.studiengang_kz = lv.studiengang_kz
WHERE
/* filter projektbetreuuer */
pb.person_id = \'' . $PERSON_ID . '\'
/* filter studiensemester */
AND le.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\'
/* filter active lehrveranstaltungen */
AND lv.aktiv = TRUE
/* filter active organisationseinheiten */
AND oe.aktiv = TRUE
/* filter vertragsstatus to avoid showing before status is bestellt */
AND vvs.vertragsstatus_kurzbz IN (\'bestellt\', \'erteilt\', \'akzeptiert\')
) tmp_projektbetreuung
) auftraege
ORDER BY "akzeptiert" NULLS FIRST, "erteilt" NULLS LAST, "bestellt"
';
$filterWidgetArray = array(
'query' => $query,
'tableUniqueId' => 'acceptLehrauftrag',
'requiredPermissions' => 'lehre/lehrauftrag_akzeptieren',
'datasetRepresentation' => 'tabulator',
'reloadDataset' => true, // reload query on page refresh
'columnsAliases' => array( // TODO: use phrasen
'Status', // alias for row_index, because row_index is formatted to display the status icons
'LV-Teil',
'LV-ID',
'PA-ID',
'Studiensemester',
'Studiengang-KZ',
'Studiengang',
'OrgForm',
'Person-ID',
'Typ',
'Auftrag',
'Semester',
'Organisationseinheit',
'Gruppe',
'Stunden',
'Betrag',
'Vertrag-ID',
'Vertrag-Stunden',
'Vertrag-Betrag',
'UID',
'Bestellt',
'Erteilt',
'Angenommen',
'Bestellt von',
'Erteilt von',
'Angenommen von'
),
'datasetRepOptions' => '{
height: 550,
layout: "fitColumns", // fit columns to width of table
responsiveLayout: "hide", // hide columns that dont fit on the table
movableColumns: true, // allows changing column
headerFilterPlaceholder: " ",
index: "row_index", // assign specific column as unique id (important for row indexing)
selectable: true, // allow row selection
selectableRangeMode: "click", // allow range selection using shift end click on end of range
selectablePersistence:false, // deselect previously selected rows when table is filtered, sorted or paginated
selectableCheck: function(row){
return func_selectableCheck(row);
},
footerElement: func_footerElement(),
rowUpdated:function(row){
func_rowUpdated(row);
},
rowSelectionChanged:function(data, rows){
func_rowSelectionChanged(data, rows);
},
rowFormatter:function(row){
func_rowFormatter(row);
},
tableBuilt: function(){
func_tableBuilt(this);
},
renderComplete:function(){
func_renderComplete(this);
},
renderStarted:function(){
func_renderStarted(this);
}
}', // tabulator properties
'datasetRepFieldsDefs' => '{
row_index: {visible:false}, // necessary for row indexing
lehreinheit_id: {headerFilter:"input", bottomCalc:"count", bottomCalcFormatter:function(cell){return "Anzahl: " + cell.getValue();}, width: "7%"},
lehrveranstaltung_id: {headerFilter:"input", width: "5%"},
projektarbeit_id: {visible: false},
studiensemester_kurzbz: {visible: false},
studiengang_kz: {visible: false},
stg_typ_kurzbz: {headerFilter:"input", width: "5%"},
orgform_kurzbz: {headerFilter:"input"},
person_id: {visible: false},
typ: {headerFilter:"input", width: "7%"},
auftrag: {headerFilter:"input", width: "23%"},
semester: {headerFilter:"input"},
lv_oe_kurzbz: {headerFilter:"input", width: "12%"},
gruppe: {headerFilter:"input", width: "5%"},
stunden: {align:"right", formatter: form_formatNulltoStringNumber, formatterParams:{precision:1},
headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator,
bottomCalc:"sum", bottomCalcParams:{precision:1}, width: "5%"},
betrag: {align:"right", formatter: form_formatNulltoStringNumber,
headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator,
bottomCalc:"sum", bottomCalcParams:{precision:2}, bottomCalcFormatter:"money", bottomCalcFormatterParams:{decimal: ",", thousand: ".", symbol:"€"},
width: "8%"},
vertrag_id: {visible: false},
vertrag_stunden: {visible: false},
vertrag_betrag: {visible: false},
mitarbeiter_uid: {visible: false},
bestellt: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: bestellt_tooltip},
erteilt: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: erteilt_tooltip},
akzeptiert: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: akzeptiert_tooltip},
bestellt_von: {visible: false},
erteilt_von: {visible: false},
akzeptiert_von: {visible: false}
}', // col properties
);
echo $this->widgetlib->widget('TableWidget', $filterWidgetArray);
?>
@@ -0,0 +1,228 @@
<?php
$this->load->view(
'templates/FHC-Header',
array(
'title' => 'Lehrauftrag erteilen',
'jquery' => true,
'jqueryui' => true,
'jquerycheckboxes' => true,
'bootstrap' => true,
'fontawesome' => true,
'sbadmintemplate' => true,
'tabulator' => true,
'momentjs' => true,
'ajaxlib' => true,
'dialoglib' => true,
'tablewidget' => true,
'navigationwidget' => true,
'phrases' => array(
'global' => array('lehrauftraegeErteilen'),
),
'customJSs' => array(
'public/js/bootstrapper.js',
'public/js/lehre/lehrauftrag/approveLehrauftrag.js'
)
)
);
?>
<body>
<?php echo $this->widgetlib->widget('NavigationWidget'); ?>
<div id="page-wrapper">
<div class="container-fluid">
<!-- title & helper link -->
<div class="row">
<div class="col-lg-12 page-header">
<a class="pull-right" data-toggle="collapse" href="#collapseHelp" aria-expanded="false" aria-controls="collapseExample">
Hilfe zu dieser Seite
</a>
<h3>
<?php echo ucfirst($this->p->t('global', 'lehrauftraegeErteilen')); ?>
</h3>
</div>
</div>
<!-- helper collapse module -->
<div class="row">
<div class="col-lg-12 collapse" id="collapseHelp">
<div class="well">
<h4>Lehrauftrag Standard-Bestellprozess</h4>
<div class="panel panel-body">
<table>
<tr class="text-center">
<td><img src="../../../public/images/icons/fa-user-tag.png" style="height: 60px; width: 60px;"></td>
<td><i class='fa fa-2x fa-long-arrow-right'></i></td>
<td><img src="../../../public/images/icons/fa-user-check.png" style="height: 60px; width: 60px;"></td>
<td><i class='fa fa-2x fa-long-arrow-right'></i></td>
<td><i class='fa fa-2x fa-handshake-o'></i></td>
</tr>
<tr class="text-center">
<td class="text-muted">BESTELLEN<br>(Studiengangsleitung)</td>
<td></td>
<td><b>ERTEILEN<br>(Department-/Kompetenzfeldleitung)</b></td>
<td></td>
<td class="text-muted">ANNEHMEN<br>(LektorIn)</td>
</tr>
</table>
</div>
<br>
<h4>Lehraufträge erteilen</h4>
<div class="panel panel-body">
Sobald Lehraufträge bestellt wurden, können Sie diese hier erteilen.<br>
Erteilte Lehraufträge können von den Lehrenden angenommen werden.<br>
<ol>
<li>Klicken Sie unten auf das Status-Icon 'Nur bestellte anzeigen' oder 'Alle anzeigen'</li>
<li>Wählen Sie die zu erteilenden Lehraufträge selbst oder alle über den Button 'Alle auswählen'.</li>
<li>Klicken Sie auf Lehrauftrag erteilen.</li>
</ol>
</div>
<br>
<h4>Geänderte Lehraufträge</h4>
<div class="panel panel-body">
Im FAS können Änderungen an Stunden/Stundensatz eines Lehrauftrags durchgeführt werden, solange dieser nicht vom Lehrenden angenommen wurde.<br>
Wenn Änderungen an bereits bestellten oder erteilten Lehraufträgen vorgenommen wurden, müssen diese vom Studiengang erneut bestellt werden.<br>
Bei bereits erteilten Lehraufträgen wird zusätzlich der Status 'erteilt' zurückgesetzt.
</div>
<br>
<h4>Warum kann ich manche Lehraufträge nicht auswählen?</h4>
<div class="panel panel-body">
Nur Lehraufträge mit dem Status 'bestellt' können gewählt werden.<br>
Neue, Bestellte, Akzeptierte oder geänderte Lehraufträge werden nur zu Ihrer Information angezeigt und sind daher NICHT wählbar.
</div>
<br>
<h4>Filter</h4>
<div class="panel panel-body">
<table class="table table-bordered">
<tr class="text-center">
<td class="col-xs-1"><i class='fa fa-users'></i></td>
<td class="col-xs-1"><i class='fa fa-user-plus'></i></td>
<td class="col-xs-1"><img src="../../../public/images/icons/fa-user-tag.png" style="height: 30px; width: 30px;"></td>
<td class="col-xs-1"><img src="../../../public/images/icons/fa-user-check.png" style="height: 30px; width: 30px;"></td>
<td class="col-xs-1"><i class='fa fa-handshake-o'></i></td>
<td class="col-xs-1"><img src="../../../public/images/icons/fa-user-edit.png" style="height: 30px; width: 30px;"></td>
<td class="col-xs-1"><i class='fa fa-user-secret'></i></td>
</tr>
<tr class="text-center">
<td><b>Alle</b><br>Alle Lehraufträge mit jedem Status, auch geänderte und Dummy-Aufträge</td>
<td><b>Neu</b><br>Nur Lehraufträge, die im FAS über die Zuteilung eines Lehrenden zu einer Lehreinheit/einem Projekt angelegt und noch nicht bestellt worden sind</td>
<td><b>Bestellt</b><br>Nur bestellte UND geänderte bestellte Lehraufträge</td>
<td><b>Erteilt</b><br>Nur erteilte UND geänderte erteilte Lehraufträge</td>
<td><b>Angenommen</b><br>Nur vom Lehrenden angenommene Lehraufträge</td>
<td><b>Geändert</b><br>Nur geänderte Lehraufträge, die den Status 'bestellt' oder 'erteilt' haben</td>
<td><b>Dummies</b><br>Nur Lehraufträge, die mit einem Dummylektor angelegt sind</td>
</tr>
</table>
</div>
<br>
<h4>Auswahl</h4>
<div class="panel panel-body">
<ul>
<li>Einzeln auswählen: <kbd>Strg</kbd> + Klick auf einzelne Zeile(n)</li>
<li>Bereich auswählen: <kbd>Shift</kbd> + Klick auf Anfangs- und Endzeile</li>
<li>Alle auswählen: Button 'Alle auswählen'</li>
</ul>
</div>
<br>
</div>
</div>
</div>
<!-- dropdown widgets -->
<div class="row">
<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(
'Organisationseinheit_widget',
array(
DropdownWidget::SELECTED_ELEMENT => $organisationseinheit_selected,
'organisationseinheit' => $organisationseinheit
),
array(
'name' => 'organisationseinheit',
'id' => 'organisationseinheit'
)
);
?>
</div>
<div class="form-group">
<?php
echo $this->widgetlib->widget(
'Ausbildungssemester_widget',
array(
DropdownWidget::SELECTED_ELEMENT => $ausbildungssemester_selected,
'number_semester' => 6
),
array(
'name' => 'ausbildungssemester',
'id' => 'ausbildungssemester'
)
);
?>
</div>
<button type="submit" name="submit" value="anzeigen" class="btn btn-default form-group">Anzeigen</button>
</form>
</div>
</div>
<!-- tabulator data table -->
<div class="row">
<div class="col-lg-12">
<?php $this->load->view('lehre/lehrauftrag/approveLehrauftragData.php'); ?>
</div>
</div>
<br>
<!-- filter buttons & erteil-button -->
<div class="row">
<div class="col-xs-12">
<button id="approve-lehrauftraege" class="btn btn-primary pull-right">Lehrauftrag erteilen</button>
<div class="btn-toolbar" role="toolbar">
<div class="btn-group" role="group">
<button id="show-all" class="btn btn-default btn-lehrauftrag" type="button" data-toggle="tooltip" data-placement="left" title="Alle anzeigen"><i class='fa fa-users'></i></button>
<button id="show-new" class="btn btn-default btn-lehrauftrag" type="button" data-toggle="tooltip" data-placement="left" title="Nur neue anzeigen"><i class='fa fa-user-plus'></i></button>
<button id="show-ordered" class="btn btn-default btn-lehrauftrag active focus" type="button" data-toggle="tooltip" data-placement="left" title="Nur bestellte anzeigen"></button><!-- png img set in javascript -->
<button id="show-approved" class="btn btn-default btn-lehrauftrag" type="button" data-toggle="tooltip" data-placement="left" title="Nur erteilte anzeigen"></button><!-- png img set in javascript -->
<button id="show-accepted" class="btn btn-default btn-lehrauftrag" type="button" data-toggle="tooltip" data-placement="left" title="Nur angenommene anzeigen"><i class='fa fa-handshake-o'></i></button>
</div>
<div class="btn-group" role="group" style="margin-left: 20px;">
<button id="show-changed" class="btn btn-default btn-lehrauftrag" type="button" data-toggle="tooltip" data-placement="left" title="Nur geänderte anzeigen"></button><!-- png img set in javascript -->
</div>
<div class="btn-group" role="group" style="margin-left: 20px;">
<button id="show-dummies" class="btn btn-default btn-lehrauftrag" type="button" data-toggle="tooltip" data-placement="left" title="Nur verplante ohne Lektor anzeigen (Dummies)"><i class='fa fa-user-secret'></i></button>
</div>
</div>
</div>
</div>
</div><!-- end container -->
</div><!-- end page-wrapper -->
<br>
</body>
<?php $this->load->view('templates/FHC-Footer'); ?>
@@ -0,0 +1,406 @@
<?php
$STUDIENSEMESTER = $studiensemester_selected;
$ORGANISATIONSEINHEIT = (isset($organisationseinheit_selected) && !is_null($organisationseinheit_selected)) ? array($organisationseinheit_selected) : $organisationseinheit;
$AUSBILDUNGSSEMESTER = (isset($ausbildungssemester_selected) && !is_null($ausbildungssemester_selected)) ? $ausbildungssemester_selected : '1,2,3,4,5,6,7,8';
$query = '
SELECT
/* provide extra row index for tabulator, because no other column has unique ids */
ROW_NUMBER() OVER () AS "row_index",
personalnummer,
lehreinheit_id,
lehrveranstaltung_id,
lv_bezeichnung,
projektarbeit_id,
studiensemester_kurzbz,
studiengang_kz,
stg_typ_kurzbz,
orgform_kurzbz,
person_id,
typ,
auftrag,
semester,
lv_oe_kurzbz,
gruppe,
lektor,
stunden,
betrag,
vertrag_id,
vertrag_stunden,
vertrag_betrag,
mitarbeiter_uid,
bestellt,
erteilt,
akzeptiert,
(SELECT
vorname || \' \' || nachname
FROM
public.tbl_person
JOIN public.tbl_benutzer benutzer USING (person_id)
WHERE
benutzer.uid = (
SELECT
insertvon
FROM
lehre.tbl_vertrag_vertragsstatus vvs
WHERE
vvs.vertragsstatus_kurzbz = \'bestellt\'
AND vvs.vertrag_id = auftraege.vertrag_id
)
) AS "bestellt_von",
(SELECT
vorname || \' \' || nachname
FROM
public.tbl_person
JOIN public.tbl_benutzer benutzer USING (person_id)
WHERE
benutzer.uid = (
SELECT
insertvon
FROM
lehre.tbl_vertrag_vertragsstatus vvs
WHERE
vvs.vertragsstatus_kurzbz = \'erteilt\'
AND vvs.vertrag_id = auftraege.vertrag_id
)
) AS "erteilt_von",
(SELECT
vorname || \' \' || nachname
FROM
public.tbl_person
JOIN public.tbl_benutzer benutzer USING (person_id)
WHERE
benutzer.uid = (
SELECT
insertvon
FROM
lehre.tbl_vertrag_vertragsstatus vvs
WHERE
vvs.vertragsstatus_kurzbz = \'akzeptiert\'
AND vvs.vertrag_id = auftraege.vertrag_id
)
) AS "akzeptiert_von"
FROM
(
/* Lehraufträge and -vertragsstati */
SELECT *,
/* concatinated and aggregated gruppen */
(SELECT
string_agg(concat(stg_typ_kurzbz, \'-\', semester, verband, gruppe
|| gruppe_kurzbz), \', \')
FROM
lehre.tbl_lehreinheitgruppe
WHERE
lehreinheit_id = tmp_lehrauftraege.lehreinheit_id
) AS "gruppe",
/* existing contracts with status bestellt */
(SELECT
datum
FROM
lehre.tbl_vertrag_vertragsstatus
WHERE
tbl_vertrag_vertragsstatus.vertragsstatus_kurzbz = \'bestellt\'
AND vertrag_id = tmp_lehrauftraege.vertrag_id) AS "bestellt",
/* existing contracts with status erteilt */
(SELECT
datum
FROM
lehre.tbl_vertrag_vertragsstatus
WHERE
tbl_vertrag_vertragsstatus.vertragsstatus_kurzbz = \'erteilt\'
AND vertrag_id = tmp_lehrauftraege.vertrag_id) AS "erteilt",
/* existing contracts with status akzeptiert */
(SELECT
datum
FROM
lehre.tbl_vertrag_vertragsstatus
WHERE
tbl_vertrag_vertragsstatus.vertragsstatus_kurzbz = \'akzeptiert\'
AND vertrag_id = tmp_lehrauftraege.vertrag_id) AS "akzeptiert"
FROM
(
SELECT
/* lehrauftraege also planned with dummies, therefore personalnummer is needed */
ma.personalnummer,
lema.lehreinheit_id,
lv.lehrveranstaltung_id,
lv.bezeichnung AS "lv_bezeichnung",
NULL AS "projektarbeit_id",
le.studiensemester_kurzbz,
stg.studiengang_kz,
upper(stg.typ || stg.kurzbz) AS "stg_typ_kurzbz",
lv.orgform_kurzbz,
person.person_id,
upper(lv.lehrtyp_kurzbz) AS "typ",
(lv.bezeichnung || \' [\' || le.lehrform_kurzbz ||
\']\') AS "auftrag",
lv.semester,
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 "lv_oe_kurzbz",
(person.vorname || \' \' || person.nachname) AS "lektor",
TRUNC(lema.semesterstunden, 1) AS "stunden",
TRUNC((lema.semesterstunden * lema.stundensatz), 2) AS "betrag",
vertrag_id,
vertragsstunden AS "vertrag_stunden",
vertrag.betrag AS "vertrag_betrag",
mitarbeiter_uid
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 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 (vertrag_id)
JOIN PUBLIC.tbl_studiengang stg ON stg.studiengang_kz = lv.studiengang_kz
WHERE
/* filter organisationseinheit */
lv.oe_kurzbz IN (\'' . implode('\',\'', $ORGANISATIONSEINHEIT) . '\')
/* filter studiensemester */
AND le.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\'
/* filter active lehrveranstaltungen */
AND lv.aktiv = TRUE
/* filter active organisationseinheiten */
AND oe.aktiv = TRUE
/* filter ausbildungssemester */
AND lv.semester IN ('. $AUSBILDUNGSSEMESTER . ')
) tmp_lehrauftraege
UNION
/* Projektbetreuungsaufträge and -vertragsstati */
SELECT *,
/* mitarbeiter uid retrieved by person_id */
/* NOTE: mitarbeiter MUST come after Select * to ensure correct order with select for tmp_lehrauftraege*/
(SELECT
uid
FROM
public.tbl_benutzer
WHERE
person_id = tmp_projektbetreuung.person_id
ORDER BY aktiv DESC, updateaktivam DESC -- accept inactive as some person_ids have no active, but order them last
LIMIT 1) AS "mitarbeiter_uid",
/* concatinated and aggregated gruppen */
(SELECT
string_agg(concat(stg_typ_kurzbz, \'-\', semester, verband, gruppe
|| gruppe_kurzbz), \', \')
FROM
lehre.tbl_lehreinheitgruppe
WHERE
lehreinheit_id = tmp_projektbetreuung.lehreinheit_id
) AS "gruppe",
/* existing contracts with status bestellt */
(SELECT
datum
FROM
lehre.tbl_vertrag_vertragsstatus
WHERE
tbl_vertrag_vertragsstatus.vertragsstatus_kurzbz = \'bestellt\'
AND vertrag_id = tmp_projektbetreuung.vertrag_id) AS "bestellt",
/* existing contracts with status erteilt */
(SELECT
datum
FROM
lehre.tbl_vertrag_vertragsstatus
WHERE
tbl_vertrag_vertragsstatus.vertragsstatus_kurzbz = \'erteilt\'
AND vertrag_id = tmp_projektbetreuung.vertrag_id) AS "erteilt",
/* existing contracts with status akzeptiert */
(SELECT
datum
FROM
lehre.tbl_vertrag_vertragsstatus
WHERE
tbl_vertrag_vertragsstatus.vertragsstatus_kurzbz = \'akzeptiert\'
AND vertrag_id = tmp_projektbetreuung.vertrag_id) AS "akzeptiert"
FROM
(
SELECT
/* projektbetreuung does not plan with dummies, therefore no need to retrieve personalnummer */
NULL AS personalnummer,
pa.lehreinheit_id,
lv.lehrveranstaltung_id,
lv.bezeichnung AS "lv_bezeichnung",
pa.projektarbeit_id AS "projektarbeit_id",
le.studiensemester_kurzbz,
stg.studiengang_kz,
upper(stg.typ || stg.kurzbz) AS "stg_typ_kurzbz",
lv.orgform_kurzbz,
person.person_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]\') AS "auftrag",
lv.semester,
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 "lv_oe_kurzbz",
(vorname || \' \' || nachname) AS "lektor",
TRUNC(pb.stunden, 1) AS "stunden",
TRUNC((pb.stunden * pb.stundensatz), 2) AS "betrag",
vertrag_id,
vertragsstunden AS "vertrag_stunden",
vertrag.betrag AS "vertrag_betrag"
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 PUBLIC.tbl_person person USING (person_id)
LEFT JOIN lehre.tbl_vertrag vertrag USING (vertrag_id)
JOIN PUBLIC.tbl_studiengang stg
ON stg.studiengang_kz = lv.studiengang_kz
WHERE
/* filter organisationseinheit */
lv.oe_kurzbz IN (\'' . implode('\',\'', $ORGANISATIONSEINHEIT) . '\')
/* filter studiensemester */
AND le.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\'
/* filter active lehrveranstaltungen */
AND lv.aktiv = TRUE
/* filter active organisationseinheiten */
AND oe.aktiv = TRUE
/* filter ausbildungssemester */
AND lv.semester IN ('. $AUSBILDUNGSSEMESTER . ')
) tmp_projektbetreuung
) auftraege
ORDER BY "typ" DESC, "auftrag", "personalnummer" DESC, "lektor", "bestellt", "erteilt"
';
$filterWidgetArray = array(
'query' => $query,
'tableUniqueId' => 'approveLehrauftrag',
'requiredPermissions' => 'lehre/lehrauftrag_erteilen',
'datasetRepresentation' => 'tabulator',
'reloadDataset' => true, // reload query on page refresh
'columnsAliases' => array( // TODO: use phrasen
'Status', // alias for row_index, because row_index is formatted to display the status icons
'Personalnummer',
'LV-Teil',
'LV-ID',
'LV',
'PA-ID',
'Studiensemester',
'Studiengang-KZ',
'Studiengang',
'OrgForm',
'Person-ID',
'Typ',
'Auftrag',
'Semester',
'Organisationseinheit',
'Gruppe',
'Lektor',
'Stunden',
'Betrag',
'Vertrag-ID',
'Vertrag-Stunden',
'Vertrag-Betrag',
'UID',
'Bestellt',
'Erteilt',
'Angenommen',
'Bestellt von',
'Erteilt von',
'Angenommen von'
),
'datasetRepOptions' => '{
height: 700,
layout: "fitColumns", // fit columns to width of table
responsiveLayout: "hide", // hide columns that dont fit on the table
movableColumns: true, // allows changing column
headerFilterPlaceholder: " ",
groupBy:"lehrveranstaltung_id",
groupToggleElement:"header", //toggle group on click anywhere in the group header
groupHeader: function(value, count, data, group){
return func_groupHeader(data);
},
columnCalcs:"both", // show column calculations at top and bottom of table and in groups
index: "row_index", // assign specific column as unique id (important for row indexing)
selectable: true, // allow row selection
selectableRangeMode: "click", // allow range selection using shift end click on end of range
selectablePersistence:false, // deselect previously selected rows when table is filtered, sorted or paginated
selectableCheck: function(row){
return func_selectableCheck(row);
},
initialFilter: func_initialFilter(),
footerElement: func_footerElement(),
rowUpdated:function(row){
func_rowUpdated(row);
},
rowSelectionChanged:function(data, rows){
func_rowSelectionChanged(data, rows);
},
rowFormatter:function(row)
{
func_rowFormatter(row);
},
renderStarted:function(){
func_renderStarted(this);
},
tableBuilt: function(){
func_tableBuilt(this);
}
}', // tabulator properties
'datasetRepFieldsDefs' => '{
// column status is built dynamically in funcTableBuilt(),
row_index: {visible:false}, // necessary for row indexing
personalnummer: {visible: false},
lehreinheit_id: {headerFilter:"input", bottomCalc:"count", width: "7%",
bottomCalcFormatter:function(cell){return "Anzahl: " + cell.getValue();},},
lehrveranstaltung_id: {headerFilter:"input"},
lv_bezeichnung: {visible: false},
projektarbeit_id: {visible: false},
studiensemester_kurzbz: {headerFilter:"input"},
studiengang_kz: {visible: false},
stg_typ_kurzbz: {visible: false},
orgform_kurzbz: {headerFilter:"input"},
person_id: {visible: false},
typ: {headerFilter:"input"},
auftrag: {headerFilter:"input", width:"20%"},
semester: {headerFilter:"input"},
lv_oe_kurzbz: {headerFilter:"input"},
gruppe: {headerFilter:"input"},
lektor: {headerFilter:"input"},
stunden: {align:"right", formatter: form_formatNulltoStringNumber, formatterParams:{precision:1},
headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator,
bottomCalc:"sum", bottomCalcParams:{precision:1}},
betrag: {align:"right", formatter: form_formatNulltoStringNumber,
headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator,
bottomCalc:"sum", bottomCalcParams:{precision:2}, bottomCalcFormatter:"money", bottomCalcFormatterParams:{decimal: ",", thousand: ".", symbol:"€"}},
vertrag_id: {visible: false},
vertrag_stunden: {visible: false},
vertrag_betrag: {visible: false},
mitarbeiter_uid: {visible: false},
bestellt: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: bestellt_tooltip},
erteilt: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: erteilt_tooltip},
akzeptiert: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: akzeptiert_tooltip},
bestellt_von: {visible: false},
erteilt_von: {visible: false},
akzeptiert_von: {visible: false},
}', // col properties
);
echo $this->widgetlib->widget('TableWidget', $filterWidgetArray);
?>
@@ -0,0 +1,229 @@
<?php
// TODO: phrasen anpassen
$this->load->view(
'templates/FHC-Header',
array(
'title' => 'Lehrauftrag bestellen',
'jquery' => true,
'jqueryui' => true,
'jquerycheckboxes' => true,
'bootstrap' => true,
'fontawesome' => true,
'sbadmintemplate' => true,
'tabulator' => true,
'momentjs' => true,
'ajaxlib' => true,
'dialoglib' => true,
'tablewidget' => true,
'navigationwidget' => true,
'phrases' => array(
'global' => array('lehrauftraegeBestellen'),
),
'customJSs' => array(
'public/js/bootstrapper.js',
'public/js/lehre/lehrauftrag/orderLehrauftrag.js'
)
)
);
?>
<body>
<?php echo $this->widgetlib->widget('NavigationWidget'); ?>
<div id="page-wrapper">
<div class="container-fluid">
<!-- title & helper link -->
<div class="row">
<div class="col-lg-12 page-header">
<a class="pull-right" data-toggle="collapse" href="#collapseHelp" aria-expanded="false" aria-controls="collapseExample">
Hilfe zu dieser Seite
</a>
<h3>
<?php echo ucfirst($this->p->t('global', 'lehrauftraegeBestellen')); ?>
</h3>
</div>
</div>
<!-- helper collapse module -->
<div class="row">
<div class="col-lg-12 collapse" id="collapseHelp">
<div class="well">
<h4>Lehrauftrag Standard-Bestellprozess</h4>
<div class="panel panel-body">
<table>
<tr class="text-center">
<td><img src="../../../public/images/icons/fa-user-tag.png" style="height: 60px; width: 60px;"></td>
<td><i class='fa fa-2x fa-long-arrow-right'></i></td>
<td><img src="../../../public/images/icons/fa-user-check.png" style="height: 60px; width: 60px;"></td>
<td><i class='fa fa-2x fa-long-arrow-right'></i></td>
<td><i class='fa fa-2x fa-handshake-o'></i></td>
</tr>
<tr class="text-center">
<td><b>BESTELLEN<br>(Studiengangsleitung)</b></td>
<td></td>
<td class="text-muted">ERTEILEN<br>(Department-/Kompetenzfeldleitung)</td>
<td></td>
<td class="text-muted">ANNEHMEN<br>(LektorIn)</td>
</tr>
</table>
</div>
<br>
<h4>Lehraufträge bestellen</h4>
<div class="panel panel-body">
Sobald im FAS ein Lehrauftrag/eine Projektbetreuung angelegt wurde, können Sie diese hier bestellen.<br>
Bestellte Lehraufträge sind zur Erteilung freigegeben.<br>
<ol>
<li>Klicken Sie unten auf das Status-Icon 'Nur neue anzeigen', 'Nur geänderte anzeigen' oder 'Alle anzeigen'</li>
<li>Wählen Sie die zu bestellenden Lehraufträge selbst oder über den Button 'Alle auswählen'.</li>
<li>Klicken Sie auf Lehrauftrag bestellen.</li>
</ol>
Für jeden bestellten Lehrauftrag legt das System einen Vertrag an.
</div>
<br>
<h4>Geänderte Lehraufträge</h4>
<div class="panel panel-body">
Im FAS können Änderungen an Stunden/Stundensatz eines Lehrauftrags durchgeführt werden, solange dieser nicht vom Lehrenden angenommen wurde.<br>
Wenn Änderungen an bereits bestellten oder erteilten Lehraufträgen vorgenommen wurden, werden diese in einem tooltip angezeigt.<br>
Fahren Sie dazu mit der Maus über dem Status-Icon am Beginn der Zeile.<br>
</div>
<br>
<h4>Warum kann ich manche Lehraufträge nicht auswählen?</h4>
<div class="panel panel-body">
Nur Lehraufträge mit dem Status 'neu' und 'geändert' können bestellt werden.<br>
Erteilte oder akzeptierte Lehraufträge werden nur zu Ihrer Information angezeigt und sind daher NICHT wählbar.
</div>
<br>
<h4>Filter</h4>
<div class="panel panel-body">
<table class="table table-bordered">
<tr class="text-center">
<td class="col-xs-1"><i class='fa fa-users'></i></td>
<td class="col-xs-1"><i class='fa fa-user-plus'></i></td>
<td class="col-xs-1"><img src="../../../public/images/icons/fa-user-tag.png" style="height: 30px; width: 30px;"></td>
<td class="col-xs-1"><img src="../../../public/images/icons/fa-user-check.png" style="height: 30px; width: 30px;"></td>
<td class="col-xs-1"><i class='fa fa-handshake-o'></i></td>
<td class="col-xs-1"><img src="../../../public/images/icons/fa-user-edit.png" style="height: 30px; width: 30px;"></td>
<td class="col-xs-1"><i class='fa fa-user-secret'></i></td>
</tr>
<tr class="text-center">
<td><b>Alle</b><br>Alle Lehraufträge mit jedem Status, auch geänderte und Dummy-Aufträge</td>
<td><b>Neu</b><br>Nur Lehraufträge, die im FAS über die Zuteilung eines Lehrenden zu einer Lehreinheit/einem Projekt angelegt und noch nicht bestellt worden sind</td>
<td><b>Bestellt</b><br>Nur bestellte UND geänderte bestellte Lehraufträge</td>
<td><b>Erteilt</b><br>Nur erteilte UND geänderte erteilte Lehraufträge</td>
<td><b>Angenommen</b><br>Nur vom Lehrenden angenommene Lehraufträge</td>
<td><b>Geändert</b><br>Nur geänderte Lehraufträge, die den Status 'bestellt' oder 'erteilt' haben</td>
<td><b>Dummies</b><br>Nur Lehraufträge, die mit einem Dummylektor angelegt sind</td>
</tr>
</table>
</div>
<br>
<h4>Auswahl</h4>
<div class="panel panel-body">
<ul>
<li>Einzeln auswählen: <kbd>Strg</kbd> + Klick auf einzelne Zeile(n)</li>
<li>Bereich auswählen: <kbd>Shift</kbd> + Klick auf Anfangs- und Endzeile</li>
<li>Alle auswählen: Button 'Alle auswählen'</li>
</ul>
</div>
<br>
</div>
</div>
</div>
<!-- dropdown widgets -->
<div class="row">
<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>
<div class="form-group">
<?php
echo $this->widgetlib->widget(
'Ausbildungssemester_widget',
array(
DropdownWidget::SELECTED_ELEMENT => $ausbildungssemester_selected,
'number_semester' => 6
),
array(
'name' => 'ausbildungssemester',
'id' => 'ausbildungssemester'
)
);
?>
</div>
<button type="submit" name="submit" value="anzeigen" class="btn btn-default form-group">Anzeigen</button>
</form>
</div>
</div>
<!-- tabulator data table -->
<div class="row">
<div class="col-lg-12">
<?php $this->load->view('lehre/lehrauftrag/orderLehrauftragData.php'); ?>
</div>
</div>
<br>
<!-- filter buttons & bestell-button -->
<div class="row">
<div class="col-xs-12">
<button id="order-lehrauftraege" class="btn btn-primary pull-right" data-toggle="tooltip" data-placement="left" title="">Lehrauftrag bestellen</button>
<div class="btn-toolbar" role="toolbar">
<div class="btn-group" role="group">
<button id="show-all" class="btn btn-default btn-lehrauftrag" type="button" data-toggle="tooltip" data-placement="left" title="Alle anzeigen"><i class='fa fa-users'></i></button>
<button id="show-new" class="btn btn-default btn-lehrauftrag active focus" type="button" data-toggle="tooltip" data-placement="left" title="Nur neue anzeigen"><i class='fa fa-user-plus'></i></button>
<button id="show-ordered" class="btn btn-default btn-lehrauftrag" type="button" data-toggle="tooltip" data-placement="left" title="Nur bestellte anzeigen"></button><!-- png img set in javascript -->
<button id="show-approved" class="btn btn-default btn-lehrauftrag" type="button" data-toggle="tooltip" data-placement="left" title="Nur erteilte anzeigen"></button><!-- png img set in javascript -->
<button id="show-accepted" class="btn btn-default btn-lehrauftrag" type="button" data-toggle="tooltip" data-placement="left" title="Nur angenommene anzeigen"><i class='fa fa-handshake-o'></i></button>
</div>
<div class="btn-group" role="group" style="margin-left: 20px;">
<button id="show-changed" class="btn btn-default btn-lehrauftrag active focus" type="button" data-toggle="tooltip" data-placement="left" title="Nur geänderte anzeigen"></button><!-- png img set in javascript -->
</div>
<div class="btn-group" role="group" style="margin-left: 20px;">
<button id="show-dummies" class="btn btn-default btn-lehrauftrag" type="button" data-toggle="tooltip" data-placement="left" title="Nur verplante ohne Lektor anzeigen (Dummies)"><i class='fa fa-user-secret'></i></button>
</div>
</div>
</div>
</div>
</div><!-- end container -->
</div><!-- end page-wrapper -->
<br>
</body>
<?php $this->load->view('templates/FHC-Footer'); ?>
@@ -0,0 +1,412 @@
<?php
$STUDIENSEMESTER = $studiensemester_selected;
$STUDIENGANG = (isset($studiengang_selected) && !is_null($studiengang_selected)) ? array($studiengang_selected) : $studiengang;
$AUSBILDUNGSSEMESTER = (isset($ausbildungssemester_selected) && !is_null($ausbildungssemester_selected)) ? $ausbildungssemester_selected : '1,2,3,4,5,6,7,8';
$query = '
SELECT
/* provide extra row index for tabulator, because no other column has unique ids */
ROW_NUMBER() OVER () AS "row_index",
personalnummer,
lehreinheit_id,
lehrveranstaltung_id,
lv_bezeichnung,
projektarbeit_id,
studiensemester_kurzbz,
studiengang_kz,
stg_typ_kurzbz,
orgform_kurzbz,
person_id,
typ,
auftrag,
semester,
lv_oe_kurzbz,
gruppe,
lektor,
stunden,
stundensatz,
betrag,
vertrag_id,
vertrag_stunden,
vertrag_betrag,
mitarbeiter_uid,
bestellt,
erteilt,
akzeptiert,
(SELECT
vorname || \' \' || nachname
FROM
public.tbl_person
JOIN public.tbl_benutzer benutzer USING (person_id)
WHERE
benutzer.uid = (
SELECT
insertvon
FROM
lehre.tbl_vertrag_vertragsstatus vvs
WHERE
vvs.vertragsstatus_kurzbz = \'bestellt\'
AND vvs.vertrag_id = auftraege.vertrag_id
)
) AS "bestellt_von",
(SELECT
vorname || \' \' || nachname
FROM
public.tbl_person
JOIN public.tbl_benutzer benutzer USING (person_id)
WHERE
benutzer.uid = (
SELECT
insertvon
FROM
lehre.tbl_vertrag_vertragsstatus vvs
WHERE
vvs.vertragsstatus_kurzbz = \'erteilt\'
AND vvs.vertrag_id = auftraege.vertrag_id
)
) AS "erteilt_von",
(SELECT
vorname || \' \' || nachname
FROM
public.tbl_person
JOIN public.tbl_benutzer benutzer USING (person_id)
WHERE
benutzer.uid = (
SELECT
insertvon
FROM
lehre.tbl_vertrag_vertragsstatus vvs
WHERE
vvs.vertragsstatus_kurzbz = \'akzeptiert\'
AND vvs.vertrag_id = auftraege.vertrag_id
)
) AS "akzeptiert_von"
FROM
(
/* Lehraufträge and -vertragsstati */
SELECT *,
/* concatinated and aggregated gruppen */
(SELECT
string_agg(concat(stg_typ_kurzbz, \'-\', semester, verband, gruppe
|| gruppe_kurzbz), \', \')
FROM
lehre.tbl_lehreinheitgruppe
WHERE
lehreinheit_id = tmp_lehrauftraege.lehreinheit_id
) AS "gruppe",
/* existing contracts with status bestellt */
(SELECT
datum
FROM
lehre.tbl_vertrag_vertragsstatus
WHERE
tbl_vertrag_vertragsstatus.vertragsstatus_kurzbz = \'bestellt\'
AND vertrag_id = tmp_lehrauftraege.vertrag_id) AS "bestellt",
/* existing contracts with status erteilt */
(SELECT
datum
FROM
lehre.tbl_vertrag_vertragsstatus
WHERE
tbl_vertrag_vertragsstatus.vertragsstatus_kurzbz = \'erteilt\'
AND vertrag_id = tmp_lehrauftraege.vertrag_id) AS "erteilt",
/* existing contracts with status akzeptiert */
(SELECT
datum
FROM
lehre.tbl_vertrag_vertragsstatus
WHERE
tbl_vertrag_vertragsstatus.vertragsstatus_kurzbz = \'akzeptiert\'
AND vertrag_id = tmp_lehrauftraege.vertrag_id) AS "akzeptiert"
FROM
(
SELECT
/* lehrauftraege also planned with dummies, therefore personalnummer is needed */
ma.personalnummer,
lema.lehreinheit_id,
lv.lehrveranstaltung_id,
lv.bezeichnung AS "lv_bezeichnung",
NULL AS "projektarbeit_id",
le.studiensemester_kurzbz,
stg.studiengang_kz,
upper(stg.typ || stg.kurzbz) AS "stg_typ_kurzbz",
lv.orgform_kurzbz,
person.person_id,
upper(lv.lehrtyp_kurzbz) AS "typ",
(lv.bezeichnung || \' [\' || le.lehrform_kurzbz ||
\']\') AS "auftrag",
lv.semester,
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 "lv_oe_kurzbz",
(person.vorname || \' \' || person.nachname) AS "lektor",
TRUNC(lema.semesterstunden, 1) AS "stunden",
lema.stundensatz,
TRUNC((lema.semesterstunden * lema.stundensatz), 2) AS "betrag",
vertrag_id,
vertragsstunden AS "vertrag_stunden",
vertrag.betrag AS "vertrag_betrag",
mitarbeiter_uid
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 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 (vertrag_id)
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
/* filter active organisationseinheiten */
AND oe.aktiv = TRUE
/* filter ausbildungssemester */
AND lv.semester IN ('. $AUSBILDUNGSSEMESTER . ')
) tmp_lehrauftraege
UNION
/* Projektbetreuungsaufträge and -vertragsstati */
SELECT *,
/* mitarbeiter uid retrieved by person_id */
/* NOTE: mitarbeiter MUST come after Select * to ensure correct order with select for tmp_lehrauftraege*/
(SELECT
uid
FROM
public.tbl_benutzer
WHERE
person_id = tmp_projektbetreuung.person_id
ORDER BY aktiv DESC, updateaktivam DESC -- accept inactive as some person_ids have no active, but order them last
LIMIT 1) AS "mitarbeiter_uid",
/* concatinated and aggregated gruppen */
(SELECT
string_agg(concat(stg_typ_kurzbz, \'-\', semester, verband, gruppe
|| gruppe_kurzbz), \', \')
FROM
lehre.tbl_lehreinheitgruppe
WHERE
lehreinheit_id = tmp_projektbetreuung.lehreinheit_id
) AS "gruppe",
/* existing contracts with status bestellt */
(SELECT
datum
FROM
lehre.tbl_vertrag_vertragsstatus
WHERE
tbl_vertrag_vertragsstatus.vertragsstatus_kurzbz = \'bestellt\'
AND vertrag_id = tmp_projektbetreuung.vertrag_id) AS "bestellt",
/* existing contracts with status erteilt */
(SELECT
datum
FROM
lehre.tbl_vertrag_vertragsstatus
WHERE
tbl_vertrag_vertragsstatus.vertragsstatus_kurzbz = \'erteilt\'
AND vertrag_id = tmp_projektbetreuung.vertrag_id) AS "erteilt",
/* existing contracts with status akzeptiert */
(SELECT
datum
FROM
lehre.tbl_vertrag_vertragsstatus
WHERE
tbl_vertrag_vertragsstatus.vertragsstatus_kurzbz = \'akzeptiert\'
AND vertrag_id = tmp_projektbetreuung.vertrag_id) AS "akzeptiert"
FROM
(
SELECT
/* projektbetreuung does not plan with dummies, therefore no need to retrieve personalnummer */
NULL AS personalnummer,
pa.lehreinheit_id,
lv.lehrveranstaltung_id,
lv.bezeichnung AS "lv_bezeichnung",
pa.projektarbeit_id AS "projektarbeit_id",
le.studiensemester_kurzbz,
stg.studiengang_kz,
upper(stg.typ || stg.kurzbz) AS "stg_typ_kurzbz",
lv.orgform_kurzbz,
person.person_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]\') AS "auftrag",
lv.semester,
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 "lv_oe_kurzbz",
(vorname || \' \' || nachname) AS "lektor",
TRUNC(pb.stunden, 1) AS "stunden",
pb.stundensatz,
TRUNC((pb.stunden * pb.stundensatz), 2) AS "betrag",
vertrag_id,
vertragsstunden AS "vertrag_stunden",
vertrag.betrag AS "vertrag_betrag"
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 PUBLIC.tbl_person person USING (person_id)
LEFT JOIN lehre.tbl_vertrag vertrag USING (vertrag_id)
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
/* filter ausbildungssemester */
AND lv.semester IN ('. $AUSBILDUNGSSEMESTER . ')
/* filter active organisationseinheiten */
AND oe.aktiv = TRUE
) tmp_projektbetreuung
) auftraege
ORDER BY "typ" DESC, "auftrag", "personalnummer" DESC, "lektor", "bestellt"
';
$filterWidgetArray = array(
'query' => $query,
'tableUniqueId' => 'orderLehrauftrag',
'requiredPermissions' => 'lehre/lehrauftrag_bestellen',
'datasetRepresentation' => 'tabulator',
'reloadDataset' => true, // reload query on page refresh
'columnsAliases' => array( // TODO: use phrasen
'Status', // alias for row_index, because row_index is formatted to display the status icons
'Personalnummer',
'LV-Teil',
'LV-ID',
'LV',
'PA-ID',
'Studiensemester',
'Studiengang-KZ',
'Studiengang',
'OrgForm',
'Person-ID',
'Typ',
'Auftrag',
'Semester',
'Organisationseinheit',
'Gruppe',
'Lektor',
'Stunden',
'Stundensatz',
'Betrag',
'Vertrag-ID',
'Vertrag-Stunden',
'Vertrag-Betrag',
'UID',
'Bestellt',
'Erteilt',
'Angenommen',
'Bestellt von',
'Erteilt von',
'Angenommen von'
),
'datasetRepOptions' => '{
height: 700,
layout:"fitColumns", // fit columns to width of table
responsiveLayout:"hide", // hide columns that dont fit on the table
movableColumns: true, // allows changing column
headerFilterPlaceholder: " ",
groupBy:"lehrveranstaltung_id",
groupToggleElement:"header", //toggle group on click anywhere in the group header
groupHeader: function(value, count, data, group){
return func_groupHeader(data);
},
footerElement: func_footerElement(),
columnCalcs:"both", // show column calculations at top and bottom of table and in groups
index: "row_index", // assign specific column as unique id (important for row indexing)
selectable: true, // allows row selection
selectableRangeMode: "click", // allows range selection using shift end click on end of range
selectablePersistence:false, // deselect previously selected rows when table is filtered, sorted or paginated
selectableCheck: function(row){
return func_selectableCheck(row);
},
rowUpdated:function(row){
func_rowUpdated(row);
},
rowSelectionChanged:function(data, rows){
func_rowSelectionChanged(data, rows);
},
rowFormatter:function(row){
func_rowFormatter(row);
},
renderStarted:function(){
func_renderStarted(this);
},
tableBuilt: function(){
func_tableBuilt(this);
},
dataLoaded: function(data){
func_dataLoaded(data, this);
},
}', // tabulator properties
'datasetRepFieldsDefs' => '{
// column status is built dynamically in funcTableBuilt()
row_index: {visible: false},
personalnummer: {visible: false},
lehreinheit_id: {headerFilter:"input", bottomCalc:"count", width: "7%",
bottomCalcFormatter:function(cell){return "Anzahl: " + cell.getValue();}},
lehrveranstaltung_id: {headerFilter:"input"},
lv_bezeichnung: {visible: false},
projektarbeit_id: {visible: false},
studiensemester_kurzbz: {headerFilter:"input"},
studiengang_kz: {visible: false},
stg_typ_kurzbz: {visible: false},
orgform_kurzbz: {headerFilter:"input"},
person_id: {visible: false},
typ: {headerFilter:"input"},
auftrag: {headerFilter:"input", width:"20%"},
semester: {headerFilter:"input"},
lv_oe_kurzbz: {headerFilter:"input"},
gruppe: {headerFilter:"input"},
lektor: {headerFilter:"input"},
stunden: {align:"right", formatter: form_formatNulltoStringNumber, formatterParams:{precision:1},
headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator,
bottomCalc:"sum", bottomCalcParams:{precision:1}},
stundensatz: {visible: false},
betrag: {align:"right", formatter: form_formatNulltoStringNumber,
headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator,
bottomCalc:"sum", bottomCalcParams:{precision:2}, bottomCalcFormatter:"money",
bottomCalcFormatterParams:{decimal: ",", thousand: ".", symbol:"€"}},
vertrag_id: {visible: false},
vertrag_stunden: {visible: false},
vertrag_betrag: {visible: false},
mitarbeiter_uid: {visible: false},
bestellt: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: bestellt_tooltip},
erteilt: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: erteilt_tooltip},
akzeptiert: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: akzeptiert_tooltip},
bestellt_von: {visible: false},
erteilt_von: {visible: false},
akzeptiert_von: {visible: false},
}', // col properties
);
echo $this->widgetlib->widget('TableWidget', $filterWidgetArray);
?>
@@ -7,7 +7,7 @@ $this->load->view('templates/header', array('title' => 'StudienjahrEdit', 'jquer
<div class="row">
<div class="span4">
<h2>Studienjahr bearbeiten: <?php echo $jahr->studienjahr_kurzbz; ?></h2>
<form method="post" action="<?php echo site_url("organisation/studienjahr/saveStudienjahr"); ?>">
<form method="post" action="<?php echo site_url("organisation/studienjahr/updateStudienjahr"); ?>">
<table>
<?php include('studienjahrForm.php'); ?>
@@ -8,7 +8,7 @@ $this->load->view('templates/header', array('title' => 'StudiensemesterEdit', 'd
<div class="span4">
<h2>Studiensemester bearbeiten: <?php echo $sem->studiensemester_kurzbz; ?></h2>
<form method="post"
action="<?php echo site_url("organisation/studiensemester/saveStudiensemester") ?>">
action="<?php echo site_url("organisation/studiensemester/updateStudiensemester") ?>">
<table>
<?php include('studiensemesterForm.php'); ?>
<input type="hidden" name="semkurzbz" value="<?php echo $sem->studiensemester_kurzbz; ?>"/>
@@ -101,7 +101,7 @@
FROM tbl_prestudentstatus spss
WHERE spss.prestudent_id = pss.prestudent_id
AND spss.status_kurzbz = '.$REJECTED_STATUS.'
AND spss.studiensemester_kurzbz IN (SELECT ss.studiensemester_kurzbz FROM public.tbl_studiensemester ss WHERE ss.ende >
AND spss.studiensemester_kurzbz IN (SELECT ss.studiensemester_kurzbz FROM public.tbl_studiensemester ss WHERE ss.ende >
(SELECT start FROM public.tbl_studiensemester sss WHERE studiensemester_kurzbz = '.$STUDIENSEMESTER.'))
)
ORDER BY pss.datum DESC, pss.insertamum DESC, pss.ext_id DESC
@@ -127,7 +127,7 @@
FROM tbl_prestudentstatus spss
WHERE spss.prestudent_id = pss.prestudent_id
AND spss.status_kurzbz = '.$REJECTED_STATUS.'
AND spss.studiensemester_kurzbz IN (SELECT ss.studiensemester_kurzbz FROM public.tbl_studiensemester ss WHERE ss.ende >
AND spss.studiensemester_kurzbz IN (SELECT ss.studiensemester_kurzbz FROM public.tbl_studiensemester ss WHERE ss.ende >
(SELECT start FROM public.tbl_studiensemester sss WHERE studiensemester_kurzbz = '.$STUDIENSEMESTER.'))
)
LIMIT 1
@@ -152,7 +152,7 @@
FROM tbl_prestudentstatus spss
WHERE spss.prestudent_id = pss.prestudent_id
AND spss.status_kurzbz = '.$REJECTED_STATUS.'
AND spss.studiensemester_kurzbz IN (SELECT ss.studiensemester_kurzbz FROM public.tbl_studiensemester ss WHERE ss.ende >
AND spss.studiensemester_kurzbz IN (SELECT ss.studiensemester_kurzbz FROM public.tbl_studiensemester ss WHERE ss.ende >
(SELECT start FROM public.tbl_studiensemester sss WHERE studiensemester_kurzbz = '.$STUDIENSEMESTER.'))
)
LIMIT 1
@@ -178,7 +178,7 @@
FROM tbl_prestudentstatus spss
WHERE spss.prestudent_id = pss.prestudent_id
AND spss.status_kurzbz = '.$REJECTED_STATUS.'
AND spss.studiensemester_kurzbz IN (SELECT ss.studiensemester_kurzbz FROM public.tbl_studiensemester ss WHERE ss.ende >
AND spss.studiensemester_kurzbz IN (SELECT ss.studiensemester_kurzbz FROM public.tbl_studiensemester ss WHERE ss.ende >
(SELECT start FROM public.tbl_studiensemester sss WHERE studiensemester_kurzbz = '.$STUDIENSEMESTER.'))
)
LIMIT 1
@@ -202,7 +202,7 @@
FROM tbl_prestudentstatus spss
WHERE spss.prestudent_id = pss.prestudent_id
AND spss.status_kurzbz = '.$REJECTED_STATUS.'
AND spss.studiensemester_kurzbz IN (SELECT ss.studiensemester_kurzbz FROM public.tbl_studiensemester ss WHERE ss.ende >
AND spss.studiensemester_kurzbz IN (SELECT ss.studiensemester_kurzbz FROM public.tbl_studiensemester ss WHERE ss.ende >
(SELECT start FROM public.tbl_studiensemester sss WHERE studiensemester_kurzbz = '.$STUDIENSEMESTER.'))
)
LIMIT 1
@@ -394,7 +394,7 @@
if ($datasetRaw->OnholdDate != null)
{
$mark = "text-success";
$mark = "onhold";
}
// Parking has priority over locking
@@ -206,6 +206,7 @@
FROM public.tbl_prestudent ps
JOIN public.tbl_studiengang sg USING(studiengang_kz)
WHERE ps.person_id = p.person_id
AND ps.reihungstestangetreten = FALSE
AND (sg.typ IN ('.$STUDIENGANG_TYP.')
OR
sg.studiengang_kz in('.$ADDITIONAL_STG.')
@@ -14,7 +14,7 @@
',
'requiredPermissions' => 'admin',
'datasetRepresentation' => 'tablesorter',
'reloadDataset' => ($this->input->get('reloadDataset') == 'true' ? true : false),
'reloadDataset' => true,
'columnsAliases' => array(
'Log id',
'Request id',
@@ -25,10 +25,13 @@
$jqueryui = isset($jqueryui) ? $jqueryui : false;
$jquerycheckboxes = isset($jquerycheckboxes) ? $jquerycheckboxes : false;
$jquerytreetable = isset($jquerytreetable) ? $jquerytreetable : false;
$momentjs = isset($momentjs) ? $momentjs : false;
$navigationwidget = isset($navigationwidget) ? $navigationwidget : false;
$pivotui = isset($pivotui) ? $pivotui : false;
$sbadmintemplate = isset($sbadmintemplate) ? $sbadmintemplate : false;
$tablesorter = isset($tablesorter) ? $tablesorter : false;
$tablewidget = isset($tablewidget) ? $tablewidget : false;
$tabulator = isset($tabulator) ? $tabulator : false;
$tinymce = isset($tinymce) ? $tinymce : false;
?>
@@ -79,6 +82,13 @@
generateCSSsInclude('vendor/mottie/tablesorter/dist/css/jquery.tablesorter.pager.min.css');
}
// Tabulator CSS
if ($tabulator === true)
{
generateCSSsInclude('vendor/olifolkerd/tabulator/dist/css/bootstrap/tabulator_bootstrap.min.css');
generateCSSsInclude('public/css/Tabulator.css');
}
// --------------------------------------------------------------------------------------------------------
// From public folder
@@ -134,6 +144,14 @@
// NOTE: keep it after jQuery includes
if ($jquerytreetable === true) generateJSsInclude('vendor/ludo/jquery-treetable/jquery.treetable.js');
// MomentJS
if ($momentjs === true)
{
generateJSsInclude('vendor/moment/momentjs/min/moment.min.js');
generateJSsInclude('vendor/moment/momentjs/locale/de-at.js');
generateJSsInclude('vendor/moment/momentjs/locale/en-ie.js');
}
// PivotUI CSS
if ($pivotui === true)
{
@@ -148,6 +166,13 @@
generateJSsInclude('vendor/mottie/tablesorter/dist/js/extras/jquery.tablesorter.pager.min.js');
}
// Tabulator JS
if ($tabulator === true)
{
generateJSsInclude('vendor/olifolkerd/tabulator/dist/js/tabulator.min.js');
generateJSsInclude('vendor/olifolkerd/tabulator/dist/js/jquery_wrapper.min.js');
}
// Tinymce JS
if ($tinymce === true) generateJSsInclude('vendor/tinymce/tinymce/tinymce.min.js');
@@ -179,6 +204,9 @@
// PhrasesLib JS
if ($phrases != null) generateJSsInclude('public/js/PhrasesLib.js');
// TableWidget JS
if ($tablewidget === true) generateJSsInclude('public/js/TableWidget.js');
// Load addon hooks JS
// NOTE: keep it as the latest but one
if ($addons === true) generateAddonsJSsInclude($calledPath.'/'.$calledMethod);
+3 -35
View File
@@ -1,4 +1,5 @@
<div class="row">
<div class="row" id="divFilterWidgetDataset">
<div class="col-lg-12">
<!-- Filter name -->
@@ -6,40 +7,7 @@
<br>
<!-- Filter options -->
<div class="panel-group">
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" href="#collapseFilterHeader"><?php echo ucfirst($this->p->t('filter', 'filterEinstellungen')) ?></a>
</h4>
</div>
<div id="collapseFilterHeader" class="panel-collapse collapse">
<div class="filters-hidden-panel">
<!-- Filter fields options -->
<div>
<?php FilterWidget::loadViewSelectFields(); ?>
</div>
<br>
<!-- Filter filters options -->
<div>
<?php FilterWidget::loadViewSelectFilters(); ?>
</div>
<br>
<!-- Filter save options -->
<div>
<?php FilterWidget::loadViewSaveFilter(); ?>
</div>
</div>
</div>
</div>
</div>
<br>
<?php FilterWidget::loadViewFilterOptions(); ?>
<!-- Filter info top -->
<div id="datasetActionsTop"></div>
@@ -0,0 +1,35 @@
<!-- Filter options -->
<div class="panel-group">
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" href="#collapseFilterHeader"><?php echo ucfirst($this->p->t('filter', 'filterEinstellungen')) ?></a>
</h4>
</div>
<div id="collapseFilterHeader" class="panel-collapse collapse">
<div class="filters-hidden-panel">
<!-- Filter fields options -->
<div>
<?php FilterWidget::loadViewSelectFields(); ?>
</div>
<br>
<!-- Filter filters options -->
<div>
<?php FilterWidget::loadViewSelectFilters(); ?>
</div>
<br>
<!-- Filter save options -->
<div>
<?php FilterWidget::loadViewSaveFilter(); ?>
</div>
</div>
</div>
</div>
</div>
<br>
@@ -1,8 +1,7 @@
<div>
<table class="tablesorter table-bordered table-responsive" id="filterTableDataset">
<thead>
<tr></tr>
</thead>
<tbody></tbody>
</table>
</div>
@@ -0,0 +1 @@
<div id="filterTabulator"></div>
@@ -0,0 +1 @@
<div id="tableWidgetPivotUI"></div>
+17
View File
@@ -0,0 +1,17 @@
<div class="row" id="divTableWidgetDataset" tableUniqueId="<?php echo $tableUniqueId; ?>">
<div class="col-lg-12">
<!-- Table info top -->
<div id="tableDatasetActionsTop"></div>
<!-- TableWidget table -->
<div>
<?php TableWidget::loadViewDataset(); ?>
</div>
<!-- Table info bottom -->
<div id="tableDatasetActionsBottom"></div>
</div>
</div>
@@ -0,0 +1,7 @@
<table class="tablesorter table-bordered table-responsive" id="tableWidgetTableDataset">
<thead>
<tr></tr>
</thead>
<tbody></tbody>
</table>
@@ -0,0 +1 @@
<div id="tableWidgetTabulator"></div>
@@ -0,0 +1,43 @@
<?php
class Ausbildungssemester_widget extends DropdownWidget
{
public function display($widgetData)
{
$ausbildungssemester_arr = array();
// Set max number of ausbildungssemester
if (isset($widgetData['studiengang']) && is_numeric($widgetData['studiengang'])) // max semester for given studiengang
{
// to be done
}
elseif (isset($widgetData['number_semester']) && is_numeric($widgetData['number_semester'])) // custom number of semester
{
$number_semester = $widgetData['number_semester']; // max semester for bachelor
}
else
{
$number_semester = 10; // default
}
// Generate number series
for ($i = 1; $i <= $number_semester; $i++)
{
$ausbildungssemester_obj = new StdClass();
$ausbildungssemester_obj->id = $i;
$ausbildungssemester_obj->description = $i;
$ausbildungssemester_arr []= $ausbildungssemester_obj;
}
$this->setElementsArray(
success($ausbildungssemester_arr),
true,
$this->p->t('lehre', 'ausbildungssemester'),
'No Ausbildungssemester found'
);
$this->loadDropDownView($widgetData);
}
}
+164 -105
View File
@@ -7,9 +7,11 @@ class FilterWidget extends Widget
{
// Paths of the views
const WIDGET_URL_FILTER = 'widgets/filter/filter';
const WIDGET_URL_FILTER_OPTIONS = 'widgets/filter/filterOptions';
const WIDGET_URL_SELECT_FIELDS = 'widgets/filter/selectFields';
const WIDGET_URL_DATASET_TABLESORTER = 'widgets/filter/tableDataset';
const WIDGET_URL_DATASET_PIVOTUI = 'widgets/filter/pivotUIDataset';
const WIDGET_URL_DATASET_TABULATOR = 'widgets/filter/tabulatorDataset';
const WIDGET_URL_SELECT_FILTERS = 'widgets/filter/selectFilters';
const WIDGET_URL_SAVE_FILTER = 'widgets/filter/saveFilter';
@@ -40,14 +42,19 @@ class FilterWidget extends Widget
// To have a column in the GUI with checkboxes to select rows in the table
private $_checkboxes;
// To hide the GUI to operate or save the filter widget
private $_hideHeader;
private $_hideSave;
// To hide the GUI to operate with the filter widget or to save a custom filter
private $_hideOptions; // if true hides all the options
private $_hideSelectFields; // if true hides the fields selection
private $_hideSelectFilters; // if true hides the filters selections
private $_hideSave; // if true hides the GUI to save a custom filter
private $_hideMenu; // if true then the menu is not shown
private $_customMenu; // if true then method _setFilterMenu is NOT called
private $_datasetRepresentation; // dataset representation (ex: tablesorter, pivotUI, ...)
private $_datasetRepresentationOptions; // dataset representation options for tablesorter, pivotUI, ...
private $_datasetRepFieldsDefs; // dataset representation attributes for each record field
private $_reloadDataset; // Force Reload of Dataset
private static $_FilterWidgetInstance; // static property that contains the instance of itself
@@ -61,18 +68,20 @@ class FilterWidget extends Widget
self::$_FilterWidgetInstance = $this; // set static property $_FilterWidgetInstance with this instance
$this->load->library('FiltersLib'); // Loads the FiltersLib that contains all the used logic
$this->load->library('FilterWidgetLib'); // Loads the FilterWidgetLib that contains all the used logic
$this->_initFilterWidget($args); // checks parameters and initialize properties
$this->filterwidgetlib->setFilterUniqueIdByParams($args);
// Let's start if it's allowed
// NOTE: If it is NOT allowed then no data are loaded
if ($this->filterslib->isAllowed($this->_requiredPermissions))
if ($this->filterwidgetlib->isAllowed($this->_requiredPermissions))
{
$this->_startFilterWidget();
// If a custom menu is not used, then default menu is used
if ($this->_customMenu != true) $this->_setFilterMenu();
if ($this->_hideMenu != true && $this->_customMenu != true) $this->_setFilterMenu();
}
}
@@ -84,18 +93,33 @@ class FilterWidget extends Widget
*/
public function display($widgetData)
{
$this->view(self::WIDGET_URL_FILTER); // GUI starts here
$this->view(self::WIDGET_URL_FILTER, array(
'app' => $this->_app,
'dataset' => $this->_datasetName,
'filterid' => $this->_filterId
)); // GUI starts here
}
//------------------------------------------------------------------------------------------------------------------
// Public static methods used to load views and to access statically to some properies of the FilterWidget
/**
* Loads the view related to the filter options
*/
public static function loadViewFilterOptions()
{
if (self::$_FilterWidgetInstance->_hideOptions != true)
{
self::_loadView(self::WIDGET_URL_FILTER_OPTIONS);
}
}
/**
* Loads the view related to the selected fields
*/
public static function loadViewSelectFields()
{
if (self::$_FilterWidgetInstance->_hideHeader != true)
if (self::$_FilterWidgetInstance->_hideSelectFields != true)
{
self::_loadView(self::WIDGET_URL_SELECT_FIELDS);
}
@@ -106,7 +130,7 @@ class FilterWidget extends Widget
*/
public static function loadViewSelectFilters()
{
if (self::$_FilterWidgetInstance->_hideHeader != true)
if (self::$_FilterWidgetInstance->_hideSelectFilters != true)
{
self::_loadView(self::WIDGET_URL_SELECT_FILTERS);
}
@@ -128,15 +152,20 @@ class FilterWidget extends Widget
*/
public static function loadViewDataset()
{
if (self::$_FilterWidgetInstance->_datasetRepresentation == FiltersLib::DATASET_REP_TABLESORTER)
if (self::$_FilterWidgetInstance->_datasetRepresentation == FilterWidgetLib::DATASET_REP_TABLESORTER)
{
self::_loadView(self::WIDGET_URL_DATASET_TABLESORTER);
}
if (self::$_FilterWidgetInstance->_datasetRepresentation == FiltersLib::DATASET_REP_PIVOTUI)
if (self::$_FilterWidgetInstance->_datasetRepresentation == FilterWidgetLib::DATASET_REP_PIVOTUI)
{
self::_loadView(self::WIDGET_URL_DATASET_PIVOTUI);
}
if (self::$_FilterWidgetInstance->_datasetRepresentation == FilterWidgetLib::DATASET_REP_TABULATOR)
{
self::_loadView(self::WIDGET_URL_DATASET_TABULATOR);
}
}
//------------------------------------------------------------------------------------------------------------------
@@ -164,115 +193,144 @@ class FilterWidget extends Widget
$this->_formatRow = null;
$this->_markRow = null;
$this->_checkboxes = null;
$this->_hideHeader = null;
$this->_hideOptions = null;
$this->_hideSelectFields = null;
$this->_hideSelectFilters = null;
$this->_hideSave = null;
$this->_hideMenu = null;
$this->_customMenu = null;
$this->_datasetRepresentation = null;
$this->_datasetRepresentationOptions = null;
$this->_datasetRepFieldsDefs = null;
// Retrieved the required permissions parameter if present
if (isset($args[FiltersLib::REQUIRED_PERMISSIONS_PARAMETER]))
if (isset($args[FilterWidgetLib::REQUIRED_PERMISSIONS_PARAMETER]))
{
$this->_requiredPermissions = $args[FiltersLib::REQUIRED_PERMISSIONS_PARAMETER];
$this->_requiredPermissions = $args[FilterWidgetLib::REQUIRED_PERMISSIONS_PARAMETER];
}
// Parameters needed to retrieve univocally a filter from DB
if (isset($args[FiltersLib::APP_PARAMETER]))
if (isset($args[FilterWidgetLib::APP_PARAMETER]))
{
$this->_app = $args[FiltersLib::APP_PARAMETER];
$this->_app = $args[FilterWidgetLib::APP_PARAMETER];
}
if (isset($args[FiltersLib::DATASET_NAME_PARAMETER]))
if (isset($args[FilterWidgetLib::DATASET_NAME_PARAMETER]))
{
$this->_datasetName = $args[FiltersLib::DATASET_NAME_PARAMETER];
$this->_datasetName = $args[FilterWidgetLib::DATASET_NAME_PARAMETER];
}
if (isset($args[FiltersLib::FILTER_KURZBZ_PARAMETER]))
if (isset($args[FilterWidgetLib::FILTER_KURZBZ_PARAMETER]))
{
$this->_filterKurzbz = $args[FiltersLib::FILTER_KURZBZ_PARAMETER];
$this->_filterKurzbz = $args[FilterWidgetLib::FILTER_KURZBZ_PARAMETER];
}
if (isset($args[FiltersLib::FILTER_ID]))
if (isset($args[FilterWidgetLib::FILTER_ID]))
{
$this->_filterId = $args[FiltersLib::FILTER_ID];
$this->_filterId = $args[FilterWidgetLib::FILTER_ID];
}
// How to retrieve data for the filter: SQL statement or a result from DB
if (isset($args[FiltersLib::QUERY_PARAMETER]))
if (isset($args[FilterWidgetLib::QUERY_PARAMETER]))
{
$this->_query = $args[FiltersLib::QUERY_PARAMETER];
$this->_query = $args[FilterWidgetLib::QUERY_PARAMETER];
}
if (isset($args[FiltersLib::DATASET_RELOAD_PARAMETER]))
if (isset($args[FilterWidgetLib::DATASET_RELOAD_PARAMETER]))
{
$this->_reloadDataset = $args[FiltersLib::DATASET_RELOAD_PARAMETER];
$this->_reloadDataset = $args[FilterWidgetLib::DATASET_RELOAD_PARAMETER];
}
// Parameter is used to add extra columns to the dataset
if (isset($args[FiltersLib::ADDITIONAL_COLUMNS])
&& is_array($args[FiltersLib::ADDITIONAL_COLUMNS])
&& count($args[FiltersLib::ADDITIONAL_COLUMNS]) > 0)
if (isset($args[FilterWidgetLib::ADDITIONAL_COLUMNS])
&& is_array($args[FilterWidgetLib::ADDITIONAL_COLUMNS])
&& count($args[FilterWidgetLib::ADDITIONAL_COLUMNS]) > 0)
{
$this->_additionalColumns = $args[FiltersLib::ADDITIONAL_COLUMNS];
$this->_additionalColumns = $args[FilterWidgetLib::ADDITIONAL_COLUMNS];
}
// Parameter is used to add use aliases for the columns fo the dataset
if (isset($args[FiltersLib::COLUMNS_ALIASES])
&& is_array($args[FiltersLib::COLUMNS_ALIASES])
&& count($args[FiltersLib::COLUMNS_ALIASES]) > 0)
if (isset($args[FilterWidgetLib::COLUMNS_ALIASES])
&& is_array($args[FilterWidgetLib::COLUMNS_ALIASES])
&& count($args[FilterWidgetLib::COLUMNS_ALIASES]) > 0)
{
$this->_columnsAliases = $args[FiltersLib::COLUMNS_ALIASES];
$this->_columnsAliases = $args[FilterWidgetLib::COLUMNS_ALIASES];
}
// Parameter that contains a function to format the rows of the dataset
if (isset($args[FiltersLib::FORMAT_ROW]) && is_callable($args[FiltersLib::FORMAT_ROW]))
if (isset($args[FilterWidgetLib::FORMAT_ROW]) && is_callable($args[FilterWidgetLib::FORMAT_ROW]))
{
$this->_formatRow = $args[FiltersLib::FORMAT_ROW];
$this->_formatRow = $args[FilterWidgetLib::FORMAT_ROW];
}
// Parameter that contains a function to mark in the GUI the rows of the dataset
if (isset($args[FiltersLib::MARK_ROW]) && is_callable($args[FiltersLib::MARK_ROW]))
if (isset($args[FilterWidgetLib::MARK_ROW]) && is_callable($args[FilterWidgetLib::MARK_ROW]))
{
$this->_markRow = $args[FiltersLib::MARK_ROW];
$this->_markRow = $args[FilterWidgetLib::MARK_ROW];
}
// Parameter used to specify the column of the dataset that will be used
// as id of the checkboxes column in the GUI
if (isset($args[FiltersLib::CHECKBOXES]))
if (isset($args[FilterWidgetLib::CHECKBOXES]))
{
$this->_checkboxes = $args[FiltersLib::CHECKBOXES];
$this->_checkboxes = $args[FilterWidgetLib::CHECKBOXES];
}
// To specify if the header to operate with the FilterWidget is shown or not
if (isset($args[FiltersLib::HIDE_HEADER]) && is_bool($args[FiltersLib::HIDE_HEADER]))
// To specify if the filter options are shown ot not
if (isset($args[FilterWidgetLib::HIDE_OPTIONS]) && is_bool($args[FilterWidgetLib::HIDE_OPTIONS]))
{
$this->_hideHeader = $args[FiltersLib::HIDE_HEADER];
$this->_hideOptions = $args[FilterWidgetLib::HIDE_OPTIONS];
}
// To specify if the form to select fields is shown or not
if (isset($args[FilterWidgetLib::HIDE_SELECT_FIELDS]) && is_bool($args[FilterWidgetLib::HIDE_SELECT_FIELDS]))
{
$this->_hideSelectFields = $args[FilterWidgetLib::HIDE_SELECT_FIELDS];
}
// To specify if the form to select filters is shown or not
if (isset($args[FilterWidgetLib::HIDE_SELECT_FILTERS]) && is_bool($args[FilterWidgetLib::HIDE_SELECT_FILTERS]))
{
$this->_hideSelectFilters = $args[FilterWidgetLib::HIDE_SELECT_FILTERS];
}
// To specify if the form to save a custom FilterWidget is shown or not
if (isset($args[FiltersLib::HIDE_SAVE]) && is_bool($args[FiltersLib::HIDE_SAVE]))
if (isset($args[FilterWidgetLib::HIDE_SAVE]) && is_bool($args[FilterWidgetLib::HIDE_SAVE]))
{
$this->_hideSave = $args[FiltersLib::HIDE_SAVE];
$this->_hideSave = $args[FilterWidgetLib::HIDE_SAVE];
}
// If the menu should be shown or not
if (isset($args[FilterWidgetLib::HIDE_MENU]) && is_bool($args[FilterWidgetLib::HIDE_MENU]))
{
$this->_hideMenu = $args[FilterWidgetLib::HIDE_MENU];
}
// If a custom menu is set
if (isset($args[FiltersLib::CUSTOM_MENU]) && is_bool($args[FiltersLib::CUSTOM_MENU]))
if (isset($args[FilterWidgetLib::CUSTOM_MENU]) && is_bool($args[FilterWidgetLib::CUSTOM_MENU]))
{
$this->_customMenu = $args[FiltersLib::CUSTOM_MENU];
$this->_customMenu = $args[FilterWidgetLib::CUSTOM_MENU];
}
// To specify how to represent the dataset (ex: tablesorter, pivotUI, ...)
if (isset($args[FiltersLib::DATASET_REPRESENTATION])
&& ($args[FiltersLib::DATASET_REPRESENTATION] == FiltersLib::DATASET_REP_TABLESORTER
|| $args[FiltersLib::DATASET_REPRESENTATION] == FiltersLib::DATASET_REP_PIVOTUI))
if (isset($args[FilterWidgetLib::DATASET_REPRESENTATION])
&& ($args[FilterWidgetLib::DATASET_REPRESENTATION] == FilterWidgetLib::DATASET_REP_TABLESORTER
|| $args[FilterWidgetLib::DATASET_REPRESENTATION] == FilterWidgetLib::DATASET_REP_PIVOTUI
|| $args[FilterWidgetLib::DATASET_REPRESENTATION] == FilterWidgetLib::DATASET_REP_TABULATOR))
{
$this->_datasetRepresentation = $args[FiltersLib::DATASET_REPRESENTATION];
$this->_datasetRepresentation = $args[FilterWidgetLib::DATASET_REPRESENTATION];
}
// To specify options for the dataset representation (ex: tablesorter, pivotUI, ...)
if (isset($args[FiltersLib::DATASET_REP_OPTIONS]) && !isEmptyString($args[FiltersLib::DATASET_REP_OPTIONS]))
if (isset($args[FilterWidgetLib::DATASET_REP_OPTIONS]) && !isEmptyString($args[FilterWidgetLib::DATASET_REP_OPTIONS]))
{
$this->_datasetRepresentationOptions = $args[FiltersLib::DATASET_REP_OPTIONS];
$this->_datasetRepresentationOptions = $args[FilterWidgetLib::DATASET_REP_OPTIONS];
}
// To specify how to represent each record field
if (isset($args[FilterWidgetLib::DATASET_REP_FIELDS_DEFS]) && !isEmptyString($args[FilterWidgetLib::DATASET_REP_FIELDS_DEFS]))
{
$this->_datasetRepFieldsDefs = $args[FilterWidgetLib::DATASET_REP_FIELDS_DEFS];
}
}
@@ -287,32 +345,36 @@ class FilterWidget extends Widget
}
else
{
if ((!isset($args[FiltersLib::APP_PARAMETER]) && !isset($args[FiltersLib::DATASET_NAME_PARAMETER]))
&& !isset($args[FiltersLib::FILTER_ID]))
if ((!isset($args[FilterWidgetLib::APP_PARAMETER]) && !isset($args[FilterWidgetLib::DATASET_NAME_PARAMETER]))
&& !isset($args[FilterWidgetLib::FILTER_ID]))
{
show_error(
'The parameters ("'.FiltersLib::APP_PARAMETER.'" and "'.FiltersLib::DATASET_NAME_PARAMETER.') OR "'.
FiltersLib::FILTER_ID.'" must be specified'
'The parameters ("'.FilterWidgetLib::APP_PARAMETER.'" AND "'.FilterWidgetLib::DATASET_NAME_PARAMETER.') OR "'.
FilterWidgetLib::FILTER_ID.'" must be specified'
);
}
if (!isset($args[FiltersLib::QUERY_PARAMETER]))
if (!isset($args[FilterWidgetLib::QUERY_PARAMETER]))
{
show_error('The parameters "'.FiltersLib::QUERY_PARAMETER.'" must be specified');
show_error('The parameters "'.FilterWidgetLib::QUERY_PARAMETER.'" must be specified');
}
if (!isset($args[FiltersLib::DATASET_REPRESENTATION]))
if (!isset($args[FilterWidgetLib::DATASET_REPRESENTATION]))
{
show_error('The parameter "'.FiltersLib::DATASET_REPRESENTATION.'" must be specified');
show_error('The parameter "'.FilterWidgetLib::DATASET_REPRESENTATION.'" must be specified');
}
if (isset($args[FiltersLib::DATASET_REPRESENTATION])
&& $args[FiltersLib::DATASET_REPRESENTATION] != FiltersLib::DATASET_REP_TABLESORTER
&& $args[FiltersLib::DATASET_REPRESENTATION] != FiltersLib::DATASET_REP_PIVOTUI)
if (isset($args[FilterWidgetLib::DATASET_REPRESENTATION])
&& $args[FilterWidgetLib::DATASET_REPRESENTATION] != FilterWidgetLib::DATASET_REP_TABLESORTER
&& $args[FilterWidgetLib::DATASET_REPRESENTATION] != FilterWidgetLib::DATASET_REP_PIVOTUI
&& $args[FilterWidgetLib::DATASET_REPRESENTATION] != FilterWidgetLib::DATASET_REP_TABULATOR)
{
show_error(
'The parameter "'.FiltersLib::DATASET_REPRESENTATION.
'" must be IN ("'.FiltersLib::DATASET_REP_TABLESORTER.'", "'.FiltersLib::DATASET_REP_PIVOTUI.'")'
'The parameter "'.FilterWidgetLib::DATASET_REPRESENTATION.
'" must be IN ("'
.FilterWidgetLib::DATASET_REP_TABLESORTER.'", "'
.FilterWidgetLib::DATASET_REP_PIVOTUI.'", "'
.FilterWidgetLib::DATASET_REP_TABULATOR.'")'
);
}
}
@@ -324,51 +386,49 @@ class FilterWidget extends Widget
private function _startFilterWidget()
{
// Read the all session for this filter widget
$session = $this->filterslib->getSession();
$session = $this->filterwidgetlib->getSession();
// If session is NOT empty -> a filter was already loaded
if ($session != null)
{
// Retrieve the filterId stored in the session
$sessionFilterId = $this->filterslib->getSessionElement(FiltersLib::FILTER_ID);
$sessionFilterId = $this->filterwidgetlib->getSessionElement(FilterWidgetLib::FILTER_ID);
// If the filter loaded in session is NOT the same that is being requested then empty the session
if ($this->_filterId != $sessionFilterId)
{
$this->filterslib->setSession(null);
$this->filterwidgetlib->setSession(null);
$session = null;
}
else // else if the filter loaded in session is the same that is being requested
{
// Get SESSION_RELOAD_DATASET from the session
$sessionReloadDataset = $this->filterslib->getSessionElement(FiltersLib::SESSION_RELOAD_DATASET);
$sessionReloadDataset = $this->filterwidgetlib->getSessionElement(FilterWidgetLib::SESSION_RELOAD_DATASET);
// if Filter changed or reload is forced by parameter then reload the Dataset
if ($this->_reloadDataset === true || $sessionReloadDataset === true)
{
// Set as false to stop changing the dataset
$this->filterslib->setSessionElement(FiltersLib::SESSION_RELOAD_DATASET, false);
$this->filterwidgetlib->setSessionElement(FilterWidgetLib::SESSION_RELOAD_DATASET, false);
// Generate dataset query using filters from the session
$datasetQuery = $this->filterslib->generateDatasetQuery(
$datasetQuery = $this->filterwidgetlib->generateDatasetQuery(
$this->_query,
$this->filterslib->getSessionElement(FiltersLib::SESSION_FILTERS)
$this->filterwidgetlib->getSessionElement(FilterWidgetLib::SESSION_FILTERS)
);
// Then retrieve dataset from DB
$dataset = $this->filterslib->getDataset($datasetQuery);
$dataset = $this->filterwidgetlib->getDataset($datasetQuery);
// Save changes into session if data are valid
if (!isError($dataset))
{
$this->_formatDataset($dataset); // marks rows using markRow and format rowns using formatRow
$this->load->model('system/Filters_model', 'FiltersModel');
// Set the new dataset and its attributes in the session
$this->filterslib->setSessionElement(FiltersLib::SESSION_METADATA, $this->FiltersModel->getExecutedQueryMetaData());
$this->filterslib->setSessionElement(FiltersLib::SESSION_ROW_NUMBER, count($dataset->retval));
$this->filterslib->setSessionElement(FiltersLib::SESSION_DATASET, $dataset->retval);
$this->filterwidgetlib->setSessionElement(FilterWidgetLib::SESSION_METADATA, $this->FiltersModel->getExecutedQueryMetaData());
$this->filterwidgetlib->setSessionElement(FilterWidgetLib::SESSION_ROW_NUMBER, count($dataset->retval));
$this->filterwidgetlib->setSessionElement(FilterWidgetLib::SESSION_DATASET, $dataset->retval);
}
}
}
@@ -378,7 +438,7 @@ class FilterWidget extends Widget
if ($session == null)
{
// Load filter definition data from DB
$definition = $this->filterslib->loadDefinition(
$definition = $this->filterwidgetlib->loadDefinition(
$this->_filterId,
$this->_app,
$this->_datasetName,
@@ -386,44 +446,43 @@ class FilterWidget extends Widget
);
// Checks and parse json present into the definition
$parsedFilterJson = $this->filterslib->parseFilterJson($definition);
$parsedFilterJson = $this->filterwidgetlib->parseFilterJson($definition);
if ($parsedFilterJson != null) // if the json is valid
{
// Generate dataset query
$datasetQuery = $this->filterslib->generateDatasetQuery($this->_query, $parsedFilterJson->filters);
$datasetQuery = $this->filterwidgetlib->generateDatasetQuery($this->_query, $parsedFilterJson->filters);
// Then retrieve dataset from DB
$dataset = $this->filterslib->getDataset($datasetQuery);
$dataset = $this->filterwidgetlib->getDataset($datasetQuery);
// Try to load the name of the filter using the PhrasesLib
$filterName = $this->filterslib->getFilterName($parsedFilterJson);
$filterName = $this->filterwidgetlib->getFilterName($parsedFilterJson);
// Save changes into session if data are valid
if (!isError($dataset))
{
$this->_formatDataset($dataset); // marks rows using markRow and format rowns using formatRow
$this->load->model('system/Filters_model', 'FiltersModel');
// Stores an array that contains all the data useful for
$this->filterslib->setSession(
$this->filterwidgetlib->setSession(
array(
FiltersLib::FILTER_ID => $this->_filterId, // the current filter id
FiltersLib::APP_PARAMETER => $this->_app, // the current app parameter
FiltersLib::DATASET_NAME_PARAMETER => $this->_datasetName, // the carrent dataset name
FiltersLib::SESSION_FILTER_NAME => $filterName, // the current filter name
FiltersLib::SESSION_FIELDS => $this->FiltersModel->getExecutedQueryListFields(), // all the fields of the dataset
FiltersLib::SESSION_SELECTED_FIELDS => $this->_getColumnsNames($parsedFilterJson->columns), // all the selected fields
FiltersLib::SESSION_COLUMNS_ALIASES => $this->_columnsAliases, // all the fields aliases
FiltersLib::SESSION_ADDITIONAL_COLUMNS => $this->_additionalColumns, // additional columns
FiltersLib::SESSION_CHECKBOXES => $this->_checkboxes, // the name of the field used to build the checkboxes column
FiltersLib::SESSION_FILTERS => $parsedFilterJson->filters, // all the filters used to filter the dataset
FiltersLib::SESSION_METADATA => $this->FiltersModel->getExecutedQueryMetaData(), // the metadata of the dataset
FiltersLib::SESSION_ROW_NUMBER => count($dataset->retval), // the number of loaded rows by this filter
FiltersLib::SESSION_DATASET => $dataset->retval, // the entire dataset
FiltersLib::SESSION_RELOAD_DATASET => false, // if the dataset must be reloaded, not needed the first time
FiltersLib::SESSION_DATASET_REPRESENTATION => $this->_datasetRepresentation, // the choosen dataset representation
FiltersLib::SESSION_DATASET_REP_OPTIONS => $this->_datasetRepresentationOptions // the choosen dataset representation options
FilterWidgetLib::FILTER_ID => $this->_filterId, // the current filter id
FilterWidgetLib::APP_PARAMETER => $this->_app, // the current app parameter
FilterWidgetLib::DATASET_NAME_PARAMETER => $this->_datasetName, // the carrent dataset name
FilterWidgetLib::SESSION_FILTER_NAME => $filterName, // the current filter name
FilterWidgetLib::SESSION_FIELDS => $this->FiltersModel->getExecutedQueryListFields(), // all the fields of the dataset
FilterWidgetLib::SESSION_SELECTED_FIELDS => $this->_getColumnsNames($parsedFilterJson->columns), // all the selected fields
FilterWidgetLib::SESSION_COLUMNS_ALIASES => $this->_columnsAliases, // all the fields aliases
FilterWidgetLib::SESSION_ADDITIONAL_COLUMNS => $this->_additionalColumns, // additional columns
FilterWidgetLib::SESSION_CHECKBOXES => $this->_checkboxes, // the name of the field used to build the checkboxes column
FilterWidgetLib::SESSION_FILTERS => $parsedFilterJson->filters, // all the filters used to filter the dataset
FilterWidgetLib::SESSION_METADATA => $this->FiltersModel->getExecutedQueryMetaData(), // the metadata of the dataset
FilterWidgetLib::SESSION_ROW_NUMBER => count($dataset->retval), // the number of loaded rows by this filter
FilterWidgetLib::SESSION_DATASET => $dataset->retval, // the entire dataset
FilterWidgetLib::SESSION_RELOAD_DATASET => false, // if the dataset must be reloaded, not needed the first time
FilterWidgetLib::SESSION_DATASET_REPRESENTATION => $this->_datasetRepresentation, // the choosen dataset representation
FilterWidgetLib::SESSION_DATASET_REP_OPTIONS => $this->_datasetRepresentationOptions, // the choosen dataset representation options
FilterWidgetLib::SESSION_DATASET_REP_FIELDS_DEFS => $this->_datasetRepFieldsDefs // the choosen dataset representation record fields definition
)
);
}
@@ -432,7 +491,7 @@ class FilterWidget extends Widget
// To be always stored in the session, otherwise is not possible to load data from Filters controller
// NOTE: must the latest operation to be performed in the session to be shure that is always present
$this->filterslib->setSessionElement(FiltersLib::REQUIRED_PERMISSIONS_PARAMETER, $this->_requiredPermissions);
$this->filterwidgetlib->setSessionElement(FilterWidgetLib::REQUIRED_PERMISSIONS_PARAMETER, $this->_requiredPermissions);
}
/**
@@ -441,7 +500,7 @@ class FilterWidget extends Widget
private function _setFilterMenu()
{
// Generates the filters structure array
$filterMenu = $this->filterslib->generateFilterMenu(
$filterMenu = $this->filterwidgetlib->generateFilterMenu(
$this->router->directory.$this->router->class.'/'.$this->router->method
);
}
@@ -5,16 +5,34 @@ class Organisationseinheit_widget extends DropdownWidget
public function display($widgetData)
{
$this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
if (isset($widgetData['typ']))
$typ = $widgetData['typ'];
{
$this->setElementsArray($this->OrganisationseinheitModel->getRecursiveList($widgetData['typ']));
}
// If 'organisationseinheit' (array of specific oe_kurzbz) is given, retrieve these organisational units only
elseif (isset($widgetData['organisationseinheit']) && !empty($widgetData['organisationseinheit']))
{
$condition = '
oe_kurzbz IN (\''. implode('\',\'', $widgetData['organisationseinheit']) . '\') AND
aktiv = TRUE
';
$this->addSelectToModel($this->OrganisationseinheitModel, 'oe_kurzbz', 'organisationseinheittyp_kurzbz || \' \' || bezeichnung');
$this->OrganisationseinheitModel->addOrder('organisationseinheittyp_kurzbz', 'ASC');
$this->setElementsArray(
$this->OrganisationseinheitModel->loadWhere($condition),
true,
$this->p->t('lehre', 'organisationseinheit'),
'No organisational units found'
);
}
// Default: retrieve tree of all organisational units
else
$typ = null;
// NOTE: no need to call addSelectToModel because getRecursiveList already returns
// the correct names of the fields
$this->setElementsArray($this->OrganisationseinheitModel->getRecursiveList($typ));
{
// NOTE: no need to call addSelectToModel because getRecursiveList already returns
// the correct names of the fields
$this->setElementsArray($this->OrganisationseinheitModel->getRecursiveList());
}
$this->loadDropDownView($widgetData);
}
+23 -9
View File
@@ -8,15 +8,29 @@ class Studiengang_widget extends DropdownWidget
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
$this->StudiengangModel->addOrder('kurzbzlang');
$this->addSelectToModel($this->StudiengangModel, 'studiengang_kz', '\'(\' || kurzbzlang || \') \' || bezeichnung');
$this->setElementsArray(
$this->StudiengangModel->loadWhere(array('aktiv' => true)),
true,
'Select a studiengang...',
'No studiengaenge found'
);
$this->addSelectToModel($this->StudiengangModel, 'studiengang_kz', '\'(\' || upper(typ||kurzbz) || \') \' || tbl_studiengang.bezeichnung');
// If 'studiengang' (array of specific studiengaenge) is given, retrieve these studiengaenge only
if (isset($widgetData['studiengang']) && !empty($widgetData['studiengang']))
{
$condition = '
studiengang_kz IN ('. implode(',', $widgetData['studiengang']) . ') AND
aktiv = true
';
}
// Default: retrieve all studiengaenge
else
{
$condition = array('aktiv' => true);
}
$this->setElementsArray(
$this->StudiengangModel->loadWhere($condition),
true,
$this->p->t('lehre', 'studiengang'),
'No studiengaenge found'
);
$this->loadDropDownView();
}
}
@@ -6,14 +6,14 @@ class Studiensemester_widget extends DropdownWidget
{
// Studiensemester
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->StudiensemesterModel->addOrder('studiensemester_kurzbz', 'DESC');
$this->StudiensemesterModel->addOrder('start', 'DESC');
$this->addSelectToModel($this->StudiensemesterModel, 'studiensemester_kurzbz', 'studiensemester_kurzbz');
$this->setElementsArray(
$this->StudiensemesterModel->load(),
true,
'Select a studiensemester...',
$this->p->t('lehre', 'studiensemester'),
'No studiensemester found'
);
+415
View File
@@ -0,0 +1,415 @@
<?php
/**
* To display a table that shows data retriev by a SQL statement
*/
class TableWidget extends Widget
{
// Paths of the views
const WIDGET_URL_TABLE = 'widgets/table/table';
const WIDGET_URL_DATASET_TABLESORTER = 'widgets/table/tableDataset';
const WIDGET_URL_DATASET_PIVOTUI = 'widgets/table/pivotUIDataset';
const WIDGET_URL_DATASET_TABULATOR = 'widgets/table/tabulatorDataset';
// Default formats
const DEFAULT_DATE_FORMAT = 'd.m.Y H:i:s';
const DEFAULT_MARK_ROW_CLASS = 'text-danger';
// Required permissions to use this TableWidget
private $_requiredPermissions;
// SQL statement
private $_query;
// Additional columns to add to the dataset or aliases to be used to rename columns of the dataset
private $_additionalColumns;
private $_columnsAliases;
// To format or mark rows of the dataset
private $_formatRow;
private $_markRow;
// To have a column in the GUI with checkboxes to select rows in the table
private $_checkboxes;
private $_datasetRepresentation; // dataset representation (ex: tablesorter, pivotUI, ...)
private $_datasetRepresentationOptions; // dataset representation options for tablesorter, pivotUI, ...
private $_datasetRepFieldsDefs; // dataset representation attributes for each record field
private $_reloadDataset; // Force Reload of Dataset
private static $_TableWidgetInstance; // static property that contains the instance of itself
/**
* Initialize the TableWidget and starts the execution of the logic
*/
public function __construct($name, $args = array())
{
parent::__construct($name, $args); // calls the parent's constructor
self::$_TableWidgetInstance = $this; // set static property $_TableWidgetInstance with this instance
$this->load->library('TableWidgetLib'); // Loads the TableWidgetLib that contains all the used logic
$this->_initTableWidget($args); // checks parameters and initialize properties
$this->tablewidgetlib->setTableUniqueIdByParams($args);
// Let's start if it's allowed
// NOTE: If it is NOT allowed then no data are loaded
if ($this->tablewidgetlib->isAllowed($this->_requiredPermissions))
{
$this->_startTableWidget($args[TableWidgetLib::TABLE_UNIQUE_ID]);
}
}
//------------------------------------------------------------------------------------------------------------------
// Public methods
/**
* Called when echoing the table widget call
*/
public function display($widgetData)
{
$this->view(self::WIDGET_URL_TABLE, array(
'tableUniqueId' => $widgetData[TableWidgetLib::TABLE_UNIQUE_ID]
)); // GUI starts here
}
//------------------------------------------------------------------------------------------------------------------
// Public static methods used to load views and to access statically to some properies of the TableWidget
/**
* Loads the view related to the dataset, here is decided how to represent the dataset (ex: tablesorter, pivotUI, ...)
*/
public static function loadViewDataset()
{
if (self::$_TableWidgetInstance->_datasetRepresentation == TableWidgetLib::DATASET_REP_TABLESORTER)
{
self::_loadView(self::WIDGET_URL_DATASET_TABLESORTER);
}
if (self::$_TableWidgetInstance->_datasetRepresentation == TableWidgetLib::DATASET_REP_PIVOTUI)
{
self::_loadView(self::WIDGET_URL_DATASET_PIVOTUI);
}
if (self::$_TableWidgetInstance->_datasetRepresentation == TableWidgetLib::DATASET_REP_TABULATOR)
{
self::_loadView(self::WIDGET_URL_DATASET_TABULATOR);
}
}
//------------------------------------------------------------------------------------------------------------------
// Private methods
/**
* Checks parameters and initialize all the properties of this TableWidget
*/
private function _initTableWidget($args)
{
$this->_checkParameters($args);
// If here then everything is ok
// Initialize class properties
$this->_requiredPermissions = null;
$this->_reloadDataset = null;
$this->_query = null;
$this->_additionalColumns = null;
$this->_columnsAliases = null;
$this->_formatRow = null;
$this->_markRow = null;
$this->_checkboxes = null;
$this->_datasetRepresentation = null;
$this->_datasetRepresentationOptions = null;
$this->_datasetRepFieldsDefs = null;
// Retrieved the required permissions parameter if present
if (isset($args[TableWidgetLib::REQUIRED_PERMISSIONS_PARAMETER]))
{
$this->_requiredPermissions = $args[TableWidgetLib::REQUIRED_PERMISSIONS_PARAMETER];
}
// How to retrieve data for the table: SQL statement or a result from DB
if (isset($args[TableWidgetLib::QUERY_PARAMETER]))
{
$this->_query = $args[TableWidgetLib::QUERY_PARAMETER];
}
if (isset($args[TableWidgetLib::DATASET_RELOAD_PARAMETER]))
{
$this->_reloadDataset = $args[TableWidgetLib::DATASET_RELOAD_PARAMETER];
}
// Parameter is used to add extra columns to the dataset
if (isset($args[TableWidgetLib::ADDITIONAL_COLUMNS])
&& is_array($args[TableWidgetLib::ADDITIONAL_COLUMNS])
&& count($args[TableWidgetLib::ADDITIONAL_COLUMNS]) > 0)
{
$this->_additionalColumns = $args[TableWidgetLib::ADDITIONAL_COLUMNS];
}
// Parameter is used to add use aliases for the columns fo the dataset
if (isset($args[TableWidgetLib::COLUMNS_ALIASES])
&& is_array($args[TableWidgetLib::COLUMNS_ALIASES])
&& count($args[TableWidgetLib::COLUMNS_ALIASES]) > 0)
{
$this->_columnsAliases = $args[TableWidgetLib::COLUMNS_ALIASES];
}
// Parameter that contains a function to format the rows of the dataset
if (isset($args[TableWidgetLib::FORMAT_ROW]) && is_callable($args[TableWidgetLib::FORMAT_ROW]))
{
$this->_formatRow = $args[TableWidgetLib::FORMAT_ROW];
}
// Parameter that contains a function to mark in the GUI the rows of the dataset
if (isset($args[TableWidgetLib::MARK_ROW]) && is_callable($args[TableWidgetLib::MARK_ROW]))
{
$this->_markRow = $args[TableWidgetLib::MARK_ROW];
}
// Parameter used to specify the column of the dataset that will be used
// as id of the checkboxes column in the GUI
if (isset($args[TableWidgetLib::CHECKBOXES]))
{
$this->_checkboxes = $args[TableWidgetLib::CHECKBOXES];
}
// To specify how to represent the dataset (ex: tablesorter, pivotUI, ...)
if (isset($args[TableWidgetLib::DATASET_REPRESENTATION])
&& ($args[TableWidgetLib::DATASET_REPRESENTATION] == TableWidgetLib::DATASET_REP_TABLESORTER
|| $args[TableWidgetLib::DATASET_REPRESENTATION] == TableWidgetLib::DATASET_REP_PIVOTUI
|| $args[TableWidgetLib::DATASET_REPRESENTATION] == TableWidgetLib::DATASET_REP_TABULATOR))
{
$this->_datasetRepresentation = $args[TableWidgetLib::DATASET_REPRESENTATION];
}
// To specify options for the dataset representation (ex: tablesorter, pivotUI, ...)
if (isset($args[TableWidgetLib::DATASET_REP_OPTIONS]) && !isEmptyString($args[TableWidgetLib::DATASET_REP_OPTIONS]))
{
$this->_datasetRepresentationOptions = $args[TableWidgetLib::DATASET_REP_OPTIONS];
}
// To specify how to represent each record field
if (isset($args[TableWidgetLib::DATASET_REP_FIELDS_DEFS]) && !isEmptyString($args[TableWidgetLib::DATASET_REP_FIELDS_DEFS]))
{
$this->_datasetRepFieldsDefs = $args[TableWidgetLib::DATASET_REP_FIELDS_DEFS];
}
}
/**
* Checks the required parameters used to call this TableWidget
*/
private function _checkParameters($args)
{
if (!is_array($args) || (is_array($args) && count($args) == 0))
{
show_error('Second parameter of the widget call must be a NOT empty associative array');
}
else
{
if (!isset($args[TableWidgetLib::TABLE_UNIQUE_ID]))
{
show_error('The parameter "'.TableWidgetLib::TABLE_UNIQUE_ID.'" must be specified');
}
if (!isset($args[TableWidgetLib::QUERY_PARAMETER]))
{
show_error('The parameters "'.TableWidgetLib::QUERY_PARAMETER.'" must be specified');
}
if (!isset($args[TableWidgetLib::DATASET_REPRESENTATION]))
{
show_error('The parameter "'.TableWidgetLib::DATASET_REPRESENTATION.'" must be specified');
}
if (isset($args[TableWidgetLib::DATASET_REPRESENTATION])
&& $args[TableWidgetLib::DATASET_REPRESENTATION] != TableWidgetLib::DATASET_REP_TABLESORTER
&& $args[TableWidgetLib::DATASET_REPRESENTATION] != TableWidgetLib::DATASET_REP_PIVOTUI
&& $args[TableWidgetLib::DATASET_REPRESENTATION] != TableWidgetLib::DATASET_REP_TABULATOR)
{
show_error(
'The parameter "'.TableWidgetLib::DATASET_REPRESENTATION.
'" must be IN ("'
.TableWidgetLib::DATASET_REP_TABLESORTER.'", "'
.TableWidgetLib::DATASET_REP_PIVOTUI.'", "'
.TableWidgetLib::DATASET_REP_TABULATOR.'")'
);
}
}
}
/**
* Contains all the logic used to load all the data needed to the TableWidget
*/
private function _startTableWidget($tableUniqueId)
{
// Read the all session for this table widget
$session = $this->tablewidgetlib->getSession();
// If session is NOT empty -> a table was already loaded
if ($session != null)
{
// Get SESSION_RELOAD_DATASET from the session
$sessionReloadDataset = $this->tablewidgetlib->getSessionElement(TableWidgetLib::SESSION_RELOAD_DATASET);
// if Filter changed or reload is forced by parameter then reload the Dataset
if ($this->_reloadDataset === true || $sessionReloadDataset === true)
{
// Set as false to stop changing the dataset
$this->tablewidgetlib->setSessionElement(TableWidgetLib::SESSION_RELOAD_DATASET, false);
// Generate dataset query using tables from the session
$datasetQuery = $this->tablewidgetlib->generateDatasetQuery($this->_query);
// Then retrieve dataset from DB
$dataset = $this->tablewidgetlib->getDataset($datasetQuery);
// Save changes into session if data are valid
if (!isError($dataset))
{
$this->_formatDataset($dataset); // marks rows using markRow and format rowns using formatRow
// Set the new dataset and its attributes in the session
$this->tablewidgetlib->setSessionElement(TableWidgetLib::SESSION_METADATA, $this->tablewidgetlib->getExecutedQueryMetaData());
$this->tablewidgetlib->setSessionElement(TableWidgetLib::SESSION_ROW_NUMBER, count($dataset->retval));
$this->tablewidgetlib->setSessionElement(TableWidgetLib::SESSION_DATASET, $dataset->retval);
}
}
}
// If the session is empty -> first time that this table is loaded
if ($session == null)
{
// Generate dataset query
$datasetQuery = $this->tablewidgetlib->generateDatasetQuery($this->_query);
// Then retrieve dataset from DB
$dataset = $this->tablewidgetlib->getDataset($datasetQuery);
// Save changes into session if data are valid
if (!isError($dataset))
{
$this->_formatDataset($dataset); // marks rows using markRow and format rowns using formatRow
// Stores an array that contains all the data useful for
$this->tablewidgetlib->setSession(
array(
TableWidgetLib::TABLE_UNIQUE_ID => $tableUniqueId, // table unique id
TableWidgetLib::SESSION_FIELDS => $this->tablewidgetlib->getExecutedQueryListFields(), // all the fields of the dataset
TableWidgetLib::SESSION_COLUMNS_ALIASES => $this->_columnsAliases, // all the fields aliases
TableWidgetLib::SESSION_ADDITIONAL_COLUMNS => $this->_additionalColumns, // additional columns
TableWidgetLib::SESSION_CHECKBOXES => $this->_checkboxes, // the name of the field used to build the checkboxes column
TableWidgetLib::SESSION_METADATA => $this->tablewidgetlib->getExecutedQueryMetaData(), // the metadata of the dataset
TableWidgetLib::SESSION_ROW_NUMBER => count($dataset->retval), // the number of loaded rows by this table
TableWidgetLib::SESSION_DATASET => $dataset->retval, // the entire dataset
TableWidgetLib::SESSION_RELOAD_DATASET => false, // if the dataset must be reloaded, not needed the first time
TableWidgetLib::SESSION_DATASET_REPRESENTATION => $this->_datasetRepresentation, // the choosen dataset representation
TableWidgetLib::SESSION_DATASET_REP_OPTIONS => $this->_datasetRepresentationOptions, // the choosen dataset representation options
TableWidgetLib::SESSION_DATASET_REP_FIELDS_DEFS => $this->_datasetRepFieldsDefs // the choosen dataset representation record fields definition
)
);
}
}
// To be always stored in the session, otherwise is not possible to load data from Filters controller
// NOTE: must the latest operation to be performed in the session to be shure that is always present
$this->tablewidgetlib->setSessionElement(TableWidgetLib::REQUIRED_PERMISSIONS_PARAMETER, $this->_requiredPermissions);
}
/**
* Calls the method _markRow and _formatRow to marks rows using markRow and format rowns using formatRow
* NOTE: this method operates directly on the retrieved dataset: parameter passed by reference
*/
private function _formatDataset(&$rawDataset)
{
if (hasData($rawDataset) && is_array($rawDataset->retval))
{
// For each row of the data set
for ($rowCounter = 0; $rowCounter < count($rawDataset->retval); $rowCounter++)
{
// Calls the methods to mark and to format a row
// NOTE: keep this order! the markRow function given as parameter is supposing to work
// on a raw dataset, NOT on a formatted one
$rawDataset->retval[$rowCounter]->MARK_ROW_CLASS = $this->_markRow($rawDataset->retval[$rowCounter]);
$this->_formatRow($rawDataset->retval[$rowCounter]);
}
}
}
/**
* Formats the columns of all the rows of the entire dataset
* - converts booleans into strings "true" and "false"
* - format dates using the format string defined in DEFAULT_DATE_FORMAT
* Calls the parameter formatRow if it was given and if it is a valid funtion
* NOTE: this method operates directly on the retrieved dataset: parameter passed by reference
*/
private function _formatRow(&$rawDatasetRow)
{
// For each column of the row
foreach ($rawDatasetRow as $columnName => $columnValue)
{
// Basic conversions
if (is_bool($columnValue))
{
$rawDatasetRow->{$columnName} = ($columnValue === true ? 'true' : 'false');
}
elseif (DateTime::createFromFormat('Y-m-d H:i:s', $columnValue) !== false)
{
$rawDatasetRow->{$columnName} = date(self::DEFAULT_DATE_FORMAT, strtotime($columnValue));
}
}
// If a valid function call the given formatRow
if ($this->_formatRow != null && is_callable($this->_formatRow))
{
$formatRowFunction = $this->_formatRow;
$rawDatasetRow = $formatRowFunction($rawDatasetRow);
}
}
/**
* Returns a string that contains a class name used to mark rows in the dataset table
* Calls the parameter markRow if it was given and if it is a valid funtion
*/
private function _markRow($rawDatasetRow)
{
// If a valid function call the given markRow
if ($this->_markRow != null && is_callable($this->_markRow))
{
$markRowFunction = $this->_markRow;
$class = $markRowFunction($rawDatasetRow);
}
return !isset($class) ? '' : $class;
}
/**
* Utility method that retrieves the name of the columns present in a table JSON definition
*/
private function _getColumnsNames($columns)
{
$columnsNames = array();
foreach ($columns as $key => $obj)
{
if (isset($obj->name))
{
$columnsNames[] = $obj->name;
}
}
return $columnsNames;
}
/**
* Loads a view using the given viewName and eventually other parameters
*/
private static function _loadView($viewName, $parameters = null)
{
$ci =& get_instance();
$ci->load->view($viewName, $parameters);
}
}
+310 -308
View File
@@ -1,308 +1,310 @@
<?php
/* Copyright (C) 2015 fhcomplete.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* Authors: Cristina Hainberger <hainberg@technikum-wien.at>
*
* Description: This file creates a studentlist with students' profile fotos
* by a given studiengangs- and lehrveranstaltungs ID (and eventually a given lehreinheit ID).
* If fotos are locked by student, a dummy picture is inserted instead of the students foto.
* EXCEPTION: if user has admins or assitents rights, ALL students' fotos are iserted (even locked ones)
*
*/
require_once('../../../config/cis.config.inc.php');
require_once('../../../include/dokument_export.class.php');
require_once('../../../include/lehrveranstaltung.class.php');
require_once('../../../include/lehreinheit.class.php');
require_once('../../../include/benutzerberechtigung.class.php');
require_once('../../../include/studiensemester.class.php');
require_once('../../../include/studiengang.class.php');
require_once('../../../include/functions.inc.php');
require_once('../../../include/erhalter.class.php');
require_once('../../../include/datum.class.php');
$doc = new dokument_export('fotoliste');
$output = 'pdf';
$show_all_fotos = false;
//check user access & $_GET vars
if (!$db = new basis_db())
die('Es konnte keine Verbindung zum Server aufgebaut werden.');
$user = get_uid();
if (isset($_GET['lvid']) && is_numeric($_GET['lvid']))
$lvid = $_GET['lvid'];
else
die('Eine gueltige LvID muss uebergeben werden');
isset($_GET['stsem']) ? $studiensemester = $_GET['stsem'] : die('Ein Studiensemester muss uebergeben werden');
$lv = new lehrveranstaltung();
$lv->load($lvid);
$stg = new studiengang();
$stg->load($lv->studiengang_kz);
$berechtigung = new benutzerberechtigung();
$berechtigung->getBerechtigungen($user);
if (!$berechtigung->isBerechtigt('admin') && !$berechtigung->isBerechtigt('assistenz') && !$berechtigung->isBerechtigt('lehre', $lv->oe_kurzbz, 's') && !check_lektor_lehrveranstaltung($user, $lvid, $studiensemester))
die('Sie muessen LektorIn der LV sein oder das Recht "ADMIN", "ASSISTENZ" oder "LEHRE" haben, um diese Seite aufrufen zu koennen');
if ($berechtigung->isBerechtigt('admin') || $berechtigung->isBerechtigt('assistenz'))
$show_all_fotos = true;
if (isset($_GET['output']) && ($output = 'odt' || $output = 'doc'))
$output = $_GET['output'];
isset($_GET['stg_kz']) ? $studiengang = $_GET['stg_kz'] : $studiengang = NULL;
isset($_GET['lehreinheit_id']) ? $lehreinheit = $_GET['lehreinheit_id'] : $lehreinheit = NULL;
//**************************** overall lehrveranstaltungs data *******************************
//load overall lehrveranstaltungs-data
$qry = "SELECT DISTINCT ON
(kuerzel, semester, verband, gruppe, gruppe_kurzbz)
UPPER(stg_typ || stg_kurzbz) as kuerzel,
lv_bezeichnung,
stg_bez,
semester,
verband,
gruppe,
gruppe_kurzbz,
stg_typ
FROM
campus.vw_lehreinheit
WHERE
lehrveranstaltung_id=" . $db->db_add_param($lvid, FHC_INTEGER) . "
AND
studiensemester_kurzbz=" . $db->db_add_param($studiensemester);
if ($lehreinheit != '')
$qry .= " AND lehreinheit_id=" . $db->db_add_param($lehreinheit, FHC_INTEGER);
$gruppen_string = '';
$gruppen_string_arr = array();
$stg_typ = $stg->typ;
$stg_bezeichnung = $stg->bezeichnung;
//structure overall lehrveranstaltungs data
if ($result = $db->db_query($qry)) {
while ($row = $db->db_fetch_object($result)) {
//lehrveranstaltung
$lv_bezeichnung = $row->lv_bezeichnung;
//collect all gruppenkürzel
if ($row->gruppe_kurzbz == '')
$gruppen_string = trim($row->kuerzel . '-' . $row->semester . $row->verband . $row->gruppe);
else
$gruppen_string = $row->gruppe_kurzbz;
$gruppen_string_arr[] = $gruppen_string;
}
}
//concatinate distinct gruppenkürzel
$studiengruppe = implode(", ", array_unique($gruppen_string_arr));
//get studiengangstyp-bezeichnung
$qry = "SELECT
bezeichnung
FROM
public.tbl_studiengangstyp
WHERE
typ =" . $db->db_add_param($stg_typ);
if ($result = $db->db_query($qry)) {
$row = $db->db_fetch_object($result);
$stg_typ_bezeichnung = $row->bezeichnung;
}
//add overall lehrveranstaltungs-data for XML
$data = array(
'lehrveranstaltung' => $lv_bezeichnung,
'studiengang' => $stg_bezeichnung,
'studiengangs_typ' => $stg_typ_bezeichnung,
'studiensemester' => $studiensemester,
'studiengruppe' => $studiengruppe
);
//**************************** students data *******************************
//load students-data
$qry = 'SELECT DISTINCT ON
(nachname, vorname, person_id)
vorname,
nachname,
matrikelnr,
tbl_studentlehrverband.semester,
tbl_studentlehrverband.verband,
tbl_studentlehrverband.gruppe,
(SELECT
status_kurzbz
FROM
public.tbl_prestudentstatus
WHERE
prestudent_id=tbl_student.prestudent_id
ORDER BY
datum DESC, insertamum DESC, ext_id DESC LIMIT 1) as status,
tbl_studiengang.kurzbz,
tbl_studiengang.typ,
tbl_bisio.bisio_id,
tbl_bisio.von,
tbl_bisio.bis,
tbl_student.studiengang_kz AS stg_kz_student,
tbl_zeugnisnote.note,
tbl_mitarbeiter.mitarbeiter_uid,
tbl_person.matr_nr,
tbl_person.geschlecht,
tbl_person.foto,
tbl_person.foto_sperre
FROM
campus.vw_student_lehrveranstaltung
JOIN public.tbl_benutzer USING(uid)
JOIN public.tbl_person USING(person_id)
LEFT JOIN public.tbl_student ON(uid=student_uid)
LEFT JOIN public.tbl_studiengang ON(tbl_studiengang.studiengang_kz=tbl_student.studiengang_kz)
LEFT JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid)
LEFT JOIN public.tbl_studentlehrverband USING(student_uid,studiensemester_kurzbz)
LEFT JOIN lehre.tbl_zeugnisnote ON(vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_zeugnisnote.lehrveranstaltung_id
AND tbl_zeugnisnote.student_uid=tbl_student.student_uid
AND tbl_zeugnisnote.studiensemester_kurzbz=tbl_studentlehrverband.studiensemester_kurzbz)
LEFT JOIN bis.tbl_bisio ON(uid=tbl_bisio.student_uid)
WHERE
vw_student_lehrveranstaltung.lehrveranstaltung_id=' . $db->db_add_param($lvid, FHC_INTEGER) . ' AND
vw_student_lehrveranstaltung.studiensemester_kurzbz=' . $db->db_add_param($studiensemester);
if ($lehreinheit != '')
$qry .= ' AND vw_student_lehrveranstaltung.lehreinheit_id=' . $db->db_add_param($lehreinheit, FHC_INTEGER);
$qry .= ' ORDER BY nachname, vorname, person_id, tbl_bisio.bis DESC';
$stsem_obj = new studiensemester();
$stsem_obj->load($studiensemester);
$stsemdatumvon = $stsem_obj->start;
$stsemdatumbis = $stsem_obj->ende;
$erhalter = new erhalter();
$erhalter->getAll();
$a_o_kz = '9' . sprintf("%03s", $erhalter->result[0]->erhalter_kz); //Stg_Kz AO-Studierende auslesen (9005 fuer FHTW)
$anzahl_studierende = 0;
$datum = new datum();
$zusatz = '';
//structure students data
if ($result = $db->db_query($qry)) {
while ($row = $db->db_fetch_object($result)) {
if ($row->status != 'Abbrecher' && $row->status != 'Unterbrecher') {
$anzahl_studierende++;
if ($row->status == 'Incoming') //Incoming
$zusatz = '(i)';
else
$zusatz = '';
if ($row->bisio_id != '' && $row->status != 'Incoming' && ($row->bis > $stsemdatumvon || $row->bis == '') && $row->von < $stsemdatumbis) //Outgoing
$zusatz .= '(o)(ab ' . $datum->formatDatum($row->von, 'd.m.Y') . ')';
if ($row->note == 6) //angerechnet
$zusatz .= '(ar)';
if ($row->mitarbeiter_uid != '') //mitarbeiter
$zusatz .= '(ma)';
if ($row->stg_kz_student == $a_o_kz) //Außerordentliche Studierende
$zusatz .= '(a.o.)';
//allow admin and assistenz to see ALL fotos (even if locked by user)
if ($show_all_fotos)
$row->foto_sperre = 'f';
//create foto (if not locked by student OR if fotolist is created by admin or assistenz)
$foto_url = '';
if ($row->foto_sperre == 'f' && $row->foto != '') {
$foto_src = $row->foto;
$foto_url = sys_get_temp_dir() . '/foto' . trim($row->matrikelnr) . '.jpg';
$foto_url_arr[] = $foto_url;
//create writeable file
if (!$foto = fopen($foto_url, 'w'))
die("Das Bild konnte nicht erstellt werden");
//add foto base64-code
if (!fwrite($foto, base64_decode($foto_src)))
{
die("Das Bild konnte nicht erstellt werden");
}
//add foto to document
$doc->addImage($foto_url, trim($row->matrikelnr) . '.jpg', 'image/jpg');
}
elseif ($row->foto_sperre == 't')
{
$foto_url = 'gesperrt';
}
//create studiengruppe
$student_studiengruppe = strtoupper($row->typ.$row->kurzbz.'-'.$row->semester);
//add studierenden data for XML
$data[] = array('studierende' => array(
'vorname' => $row->vorname,
'nachname' => mb_strtoupper($row->nachname, 'UTF-8'),
'personenkennzeichen' => trim($row->matrikelnr),
'geschlecht' => $row->geschlecht,
'foto_gesperrt' => $row->foto_sperre, // f/t
'foto_url' => $foto_url,
'studiengruppe' => $student_studiengruppe,
'verband' => trim($row->verband),
'gruppe' => trim($row->gruppe),
'zusatz' => $zusatz
));
}
}
//Anzahl Studierende in Array $data (an erster Stelle) einfuegen
$data = array_reverse($data, true);
$data['anzahl_studierende'] = $anzahl_studierende;
$data = array_reverse($data, true);
}
//add data to fotoliste.xsl
$doc->addDataArray($data, 'fotoliste');
//set doc name
$doc->setFilename('Fotoliste_'.$stg_bezeichnung.'_'.$studiensemester.'_'.$lv_bezeichnung);
//create doc in format required
if (!$doc->create($output))
die($doc->errormsg);
//download doc
$doc->output();
//unlink doc from tmp-folder
$doc->close();
//unlink fotos from tmp-folder
foreach ($foto_url_arr as $foto_url)
unlink($foto_url);
<?php
/* Copyright (C) 2015 fhcomplete.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* Authors: Cristina Hainberger <hainberg@technikum-wien.at>
*
* Description: This file creates a studentlist with students' profile fotos
* by a given studiengangs- and lehrveranstaltungs ID (and eventually a given lehreinheit ID).
* If fotos are locked by student, a dummy picture is inserted instead of the students foto.
* EXCEPTION: if user has admins or assitents rights, ALL students' fotos are iserted (even locked ones)
*
*/
require_once('../../../config/cis.config.inc.php');
require_once('../../../include/dokument_export.class.php');
require_once('../../../include/lehrveranstaltung.class.php');
require_once('../../../include/lehreinheit.class.php');
require_once('../../../include/benutzerberechtigung.class.php');
require_once('../../../include/studiensemester.class.php');
require_once('../../../include/studiengang.class.php');
require_once('../../../include/functions.inc.php');
require_once('../../../include/erhalter.class.php');
require_once('../../../include/datum.class.php');
$doc = new dokument_export('fotoliste');
$output = 'pdf';
$show_all_fotos = false;
//check user access & $_GET vars
if (!$db = new basis_db())
die('Es konnte keine Verbindung zum Server aufgebaut werden.');
$user = get_uid();
if (isset($_GET['lvid']) && is_numeric($_GET['lvid']))
$lvid = $_GET['lvid'];
else
die('Eine gueltige LvID muss uebergeben werden');
isset($_GET['stsem']) ? $studiensemester = $_GET['stsem'] : die('Ein Studiensemester muss uebergeben werden');
$lv = new lehrveranstaltung();
$lv->load($lvid);
$stg = new studiengang();
$stg->load($lv->studiengang_kz);
$berechtigung = new benutzerberechtigung();
$berechtigung->getBerechtigungen($user);
if (!$berechtigung->isBerechtigt('admin') && !$berechtigung->isBerechtigt('assistenz') && !$berechtigung->isBerechtigt('lehre', $lv->oe_kurzbz, 's') && !check_lektor_lehrveranstaltung($user, $lvid, $studiensemester))
die('Sie muessen LektorIn der LV sein oder das Recht "ADMIN", "ASSISTENZ" oder "LEHRE" haben, um diese Seite aufrufen zu koennen');
if ($berechtigung->isBerechtigt('admin') || $berechtigung->isBerechtigt('assistenz'))
$show_all_fotos = true;
if (isset($_GET['output']) && ($output = 'odt' || $output = 'doc'))
$output = $_GET['output'];
isset($_GET['stg_kz']) ? $studiengang = $_GET['stg_kz'] : $studiengang = NULL;
isset($_GET['lehreinheit_id']) ? $lehreinheit = $_GET['lehreinheit_id'] : $lehreinheit = NULL;
//**************************** overall lehrveranstaltungs data *******************************
//load overall lehrveranstaltungs-data
$qry = "SELECT DISTINCT ON
(kuerzel, semester, verband, gruppe, gruppe_kurzbz)
UPPER(stg_typ || stg_kurzbz) as kuerzel,
lv_bezeichnung,
stg_bez,
semester,
verband,
gruppe,
gruppe_kurzbz,
stg_typ
FROM
campus.vw_lehreinheit
WHERE
lehrveranstaltung_id=" . $db->db_add_param($lvid, FHC_INTEGER) . "
AND
studiensemester_kurzbz=" . $db->db_add_param($studiensemester);
if ($lehreinheit != '')
$qry .= " AND lehreinheit_id=" . $db->db_add_param($lehreinheit, FHC_INTEGER);
$gruppen_string = '';
$gruppen_string_arr = array();
$stg_typ = $stg->typ;
$stg_bezeichnung = $stg->bezeichnung;
//structure overall lehrveranstaltungs data
if ($result = $db->db_query($qry)) {
while ($row = $db->db_fetch_object($result)) {
//lehrveranstaltung
$lv_bezeichnung = $row->lv_bezeichnung;
//collect all gruppenkürzel
if ($row->gruppe_kurzbz == '')
$gruppen_string = trim($row->kuerzel . '-' . $row->semester . $row->verband . $row->gruppe);
else
$gruppen_string = $row->gruppe_kurzbz;
$gruppen_string_arr[] = $gruppen_string;
}
}
//concatinate distinct gruppenkürzel
$studiengruppe = implode(", ", array_unique($gruppen_string_arr));
//get studiengangstyp-bezeichnung
$qry = "SELECT
bezeichnung
FROM
public.tbl_studiengangstyp
WHERE
typ =" . $db->db_add_param($stg_typ);
if ($result = $db->db_query($qry)) {
$row = $db->db_fetch_object($result);
$stg_typ_bezeichnung = $row->bezeichnung;
}
//add overall lehrveranstaltungs-data for XML
$data = array(
'lehrveranstaltung' => $lv_bezeichnung,
'studiengang' => $stg_bezeichnung,
'studiengangs_typ' => $stg_typ_bezeichnung,
'studiensemester' => $studiensemester,
'studiengruppe' => $studiengruppe
);
//**************************** students data *******************************
//load students-data
$qry = 'SELECT DISTINCT ON
(nachname, vorname, person_id)
vorname,
nachname,
matrikelnr,
tbl_studentlehrverband.semester,
tbl_studentlehrverband.verband,
tbl_studentlehrverband.gruppe,
(SELECT
status_kurzbz
FROM
public.tbl_prestudentstatus
WHERE
prestudent_id=tbl_student.prestudent_id
ORDER BY
datum DESC, insertamum DESC, ext_id DESC LIMIT 1) as status,
tbl_studiengang.kurzbz,
tbl_studiengang.typ,
tbl_bisio.bisio_id,
tbl_bisio.von,
tbl_bisio.bis,
tbl_student.studiengang_kz AS stg_kz_student,
tbl_zeugnisnote.note,
tbl_mitarbeiter.mitarbeiter_uid,
tbl_person.person_id,
tbl_person.matr_nr,
tbl_person.geschlecht,
tbl_person.foto,
tbl_person.foto_sperre
FROM
campus.vw_student_lehrveranstaltung
JOIN public.tbl_benutzer USING(uid)
JOIN public.tbl_person USING(person_id)
LEFT JOIN public.tbl_student ON(uid=student_uid)
LEFT JOIN public.tbl_studiengang ON(tbl_studiengang.studiengang_kz=tbl_student.studiengang_kz)
LEFT JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid)
LEFT JOIN public.tbl_studentlehrverband USING(student_uid,studiensemester_kurzbz)
LEFT JOIN lehre.tbl_zeugnisnote ON(vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_zeugnisnote.lehrveranstaltung_id
AND tbl_zeugnisnote.student_uid=tbl_student.student_uid
AND tbl_zeugnisnote.studiensemester_kurzbz=tbl_studentlehrverband.studiensemester_kurzbz)
LEFT JOIN bis.tbl_bisio ON(uid=tbl_bisio.student_uid)
WHERE
vw_student_lehrveranstaltung.lehrveranstaltung_id=' . $db->db_add_param($lvid, FHC_INTEGER) . ' AND
vw_student_lehrveranstaltung.studiensemester_kurzbz=' . $db->db_add_param($studiensemester);
if ($lehreinheit != '')
$qry .= ' AND vw_student_lehrveranstaltung.lehreinheit_id=' . $db->db_add_param($lehreinheit, FHC_INTEGER);
$qry .= ' ORDER BY nachname, vorname, person_id, tbl_bisio.bis DESC';
$stsem_obj = new studiensemester();
$stsem_obj->load($studiensemester);
$stsemdatumvon = $stsem_obj->start;
$stsemdatumbis = $stsem_obj->ende;
$erhalter = new erhalter();
$erhalter->getAll();
$a_o_kz = '9' . sprintf("%03s", $erhalter->result[0]->erhalter_kz); //Stg_Kz AO-Studierende auslesen (9005 fuer FHTW)
$anzahl_studierende = 0;
$datum = new datum();
$zusatz = '';
$foto_url_arr = array();
//structure students data
if ($result = $db->db_query($qry)) {
while ($row = $db->db_fetch_object($result)) {
if ($row->status != 'Abbrecher' && $row->status != 'Unterbrecher') {
$anzahl_studierende++;
if ($row->status == 'Incoming') //Incoming
$zusatz = '(i)';
else
$zusatz = '';
if ($row->bisio_id != '' && $row->status != 'Incoming' && ($row->bis > $stsemdatumvon || $row->bis == '') && $row->von < $stsemdatumbis) //Outgoing
$zusatz .= '(o)(ab ' . $datum->formatDatum($row->von, 'd.m.Y') . ')';
if ($row->note == 6) //angerechnet
$zusatz .= '(ar)';
if ($row->mitarbeiter_uid != '') //mitarbeiter
$zusatz .= '(ma)';
if ($row->stg_kz_student == $a_o_kz) //Außerordentliche Studierende
$zusatz .= '(a.o.)';
//allow admin and assistenz to see ALL fotos (even if locked by user)
if ($show_all_fotos)
$row->foto_sperre = 'f';
//create foto (if not locked by student OR if fotolist is created by admin or assistenz)
$foto_url = '';
if ($row->foto_sperre == 'f' && $row->foto != '') {
$foto_src = $row->foto;
$foto_url = sys_get_temp_dir() . '/foto' . trim($row->person_id) . '.jpg';
$foto_url_arr[] = $foto_url;
//create writeable file
if (!$foto = fopen($foto_url, 'w'))
die("Das Bild konnte nicht erstellt werden");
//add foto base64-code
if (!fwrite($foto, base64_decode($foto_src)))
{
die("Das Bild konnte nicht erstellt werden");
}
//add foto to document
$doc->addImage($foto_url, trim($row->person_id) . '.jpg', 'image/jpg');
}
elseif ($row->foto_sperre == 't')
{
$foto_url = 'gesperrt';
}
//create studiengruppe
$student_studiengruppe = strtoupper($row->typ.$row->kurzbz.'-'.$row->semester);
//add studierenden data for XML
$data[] = array('studierende' => array(
'vorname' => $row->vorname,
'nachname' => mb_strtoupper($row->nachname, 'UTF-8'),
'personenkennzeichen' => trim($row->matrikelnr),
'geschlecht' => $row->geschlecht,
'foto_gesperrt' => $row->foto_sperre, // f/t
'foto_url' => $foto_url,
'studiengruppe' => $student_studiengruppe,
'verband' => trim($row->verband),
'gruppe' => trim($row->gruppe),
'zusatz' => $zusatz
));
}
}
//Anzahl Studierende in Array $data (an erster Stelle) einfuegen
$data = array_reverse($data, true);
$data['anzahl_studierende'] = $anzahl_studierende;
$data = array_reverse($data, true);
}
//add data to fotoliste.xsl
$doc->addDataArray($data, 'fotoliste');
//set doc name
$doc->setFilename('Fotoliste_'.$stg_bezeichnung.'_'.$studiensemester.'_'.$lv_bezeichnung);
//create doc in format required
if (!$doc->create($output))
die($doc->errormsg);
//download doc
$doc->output();
//unlink doc from tmp-folder
$doc->close();
//unlink fotos from tmp-folder
foreach ($foto_url_arr as $foto_url)
unlink($foto_url);
@@ -1177,7 +1177,12 @@ function getAllFreieRaeume($terminId)
$teilnehmer = $teilnehmer !== false ? $teilnehmer : 0;
$pruefungstermin->getAll($pruefungstermin->von, $pruefungstermin->bis, TRUE);
if($ort->search($datum_von[0], $datum_von[1], $datum_bis[1], null, $teilnehmer, true))
if(defined('CIS_PRUEFUNGSANMELDUNG_ERLAUBE_TERMINKOLLISION') && CIS_PRUEFUNGSANMELDUNG_ERLAUBE_TERMINKOLLISION)
$ortSuccess = $ort->getOrte(true, null, true);
else
$ortSuccess = $ort->search($datum_von[0], $datum_von[1], $datum_bis[1], null, $teilnehmer, true);
if($ortSuccess)
{
foreach($pruefungstermin->result as $termin)
{
+16 -7
View File
@@ -156,9 +156,12 @@ $num_rows_stpl = $db->db_num_rows($erg_stpl);
$sql_query="
SELECT
vw_reservierung.*, vw_mitarbeiter.titelpre, vw_mitarbeiter.titelpost,
vw_mitarbeiter.vorname,vw_mitarbeiter.nachname
vw_mitarbeiter.vorname, vw_mitarbeiter.nachname, reserviert_von.titelpre AS titelpre_reserviertvon, reserviert_von.titelpost AS titelpost_reserviertvon,
reserviert_von.vorname AS vorname_reserviertvon, reserviert_von.nachname AS nachname_reserviertvon
FROM
campus.vw_reservierung, campus.vw_mitarbeiter
campus.vw_reservierung
JOIN campus.vw_mitarbeiter ON vw_reservierung.uid=vw_mitarbeiter.uid
LEFT JOIN campus.vw_mitarbeiter reserviert_von ON vw_reservierung.insertvon=reserviert_von.uid
WHERE
datum=".$db->db_add_param($datum)."
AND stunde=".$db->db_add_param($stunde);
@@ -167,7 +170,6 @@ if (isset($ort_kurzbz) && $type=='ort')
$sql_query.=" AND vw_reservierung.ort_kurzbz=".$db->db_add_param($ort_kurzbz);
if ($type=='lektor')
$sql_query.=" AND vw_reservierung.uid=".$db->db_add_param($pers_uid);
$sql_query.=" AND vw_reservierung.uid=vw_mitarbeiter.uid";
if ($type=='verband' || $type=='student')
{
$sql_query.=" AND studiengang_kz=".$db->db_add_param($stg_kz)."
@@ -271,7 +273,7 @@ if ($num_rows_repl>0)
{
echo '<h2>'.$p->t('lvplan/reservierungen').'</h2>';
echo '<table class="stdplan">';
echo '<tr><th>'.$p->t('global/titel').'</th><th>'.$p->t('lvplan/ort').'</th><th>'.$p->t('global/person').'</th><th>'.$p->t('global/beschreibung').'</th></tr>';
echo '<tr><th>'.$p->t('global/titel').'</th><th>'.$p->t('lvplan/ort').'</th><th>'.$p->t('global/person').'</th><th>'.$p->t('global/beschreibung').'</th><th>'.$p->t('lvplan/reserviertVon').'</th></tr>';
$i=0;
$ort = new ort();
while($row = $db->db_fetch_object($erg_repl))
@@ -285,13 +287,20 @@ if ($num_rows_repl>0)
$pers_nachname=$row->nachname;
$pers_email=$row->uid.'@'.DOMAIN;
$beschreibung=$row->beschreibung;
$reserviertvon=$row->insertvon;
$titelpre_reserviertvon=$row->titelpre_reserviertvon;
$titelpost_reserviertvon=$row->titelpost_reserviertvon;
$pers_vorname_reserviertvon=$row->vorname_reserviertvon;
$pers_nachname_reserviertvon=$row->nachname_reserviertvon;
$ort->load($ortkurzbz);
echo '<tr class="liste'.($i%2).'">';
echo '<td >'.$db->convert_html_chars($titel).'</td>';
echo '<td>'.$db->convert_html_chars($titel).'</td>';
echo '<td>'.(!empty($ortkurzbz)?($ort->content_id!=''?'<a href="../../../cms/content.php?content_id='.$ort->content_id.'" target="_self" onClick="window.resizeTo(1200,880)">'.$db->convert_html_chars($ortkurzbz).'</a>':$db->convert_html_chars($ortkurzbz)):$db->convert_html_chars($ortkurzbz)).'</td>';
echo '<td ><A href="mailto:'.$pers_email.'">'.$db->convert_html_chars($titelpre.' '.$pers_vorname.' '.$pers_nachname.' '.$titelpost).'</A></td>';
echo '<td >'.$db->convert_html_chars($beschreibung).'</td></tr>';
echo '<td><A href="mailto:'.$pers_email.'">'.$db->convert_html_chars($titelpre.' '.$pers_vorname.' '.$pers_nachname.' '.$titelpost).'</A></td>';
echo '<td>'.$db->convert_html_chars($beschreibung).'</td>';
echo '<td>'.$db->convert_html_chars($titelpre_reserviertvon.' '.$pers_vorname_reserviertvon.' '.$pers_nachname_reserviertvon.' '.$titelpost_reserviertvon).'</td>';
}
echo '</table><br>';
}
+20 -4
View File
@@ -88,9 +88,15 @@ if(!$rechte->isBerechtigt('lehre/reservierung:begrenzt', null, 'suid'))
$datum = date("Y-m-d",$datum);
//EIGENE
$sql_query="SELECT * FROM campus.vw_reservierung
$sql_query="SELECT vw_reservierung.*, vw_mitarbeiter.titelpre, vw_mitarbeiter.titelpost,
vw_mitarbeiter.vorname, vw_mitarbeiter.nachname, reserviert_von.titelpre AS titelpre_reserviertvon,
reserviert_von.titelpost AS titelpost_reserviertvon, reserviert_von.vorname AS vorname_reserviertvon,
reserviert_von.nachname AS nachname_reserviertvon
FROM campus.vw_reservierung
JOIN campus.vw_mitarbeiter ON vw_reservierung.uid=vw_mitarbeiter.uid
LEFT JOIN campus.vw_mitarbeiter reserviert_von ON vw_reservierung.insertvon=reserviert_von.uid
WHERE datum>=".$db->db_add_param($datum)."
AND (uid=".$db->db_add_param($uid)." OR insertvon=".$db->db_add_param($uid).")
AND (vw_reservierung.uid=".$db->db_add_param($uid)." OR vw_reservierung.insertvon=".$db->db_add_param($uid).")
ORDER BY datum, titel, ort_kurzbz, stunde";
if (!$erg_res=$db->db_query($sql_query))
@@ -108,8 +114,9 @@ if(!$rechte->isBerechtigt('lehre/reservierung:begrenzt', null, 'suid'))
<th>'.$p->t('global/titel').'</th>
<th>'.$p->t('global/stunde').'</th>
<th>'.$p->t('lvplan/raum').'</th>
<th>'.$p->t('global/uid').'</th>
<th>'.$p->t('global/person').'</th>
<th>'.$p->t('global/beschreibung').'</th>
<th>'.$p->t('lvplan/reserviertVon').'</th>
<th>'.$p->t('global/aktion').'</th>
</tr>';
for ($i=0; $i<$num_rows_res; $i++)
@@ -124,6 +131,14 @@ if(!$rechte->isBerechtigt('lehre/reservierung:begrenzt', null, 'suid'))
$beschreibung=$db->db_result($erg_res,$i,"beschreibung");
$insertamum=$db->db_result($erg_res,$i,"insertamum");
$insertvon=$db->db_result($erg_res,$i,"insertvon");
$titelpre=$db->db_result($erg_res,$i,"titelpre");
$titelpost=$db->db_result($erg_res,$i,"titelpost");
$pers_vorname=$db->db_result($erg_res,$i,"vorname");
$pers_nachname=$db->db_result($erg_res,$i,"nachname");
$titelpre_reserviertvon=$db->db_result($erg_res,$i,"titelpre_reserviertvon");
$titelpost_reserviertvon=$db->db_result($erg_res,$i,"titelpost_reserviertvon");
$pers_vorname_reserviertvon=$db->db_result($erg_res,$i,"vorname_reserviertvon");
$pers_nachname_reserviertvon=$db->db_result($erg_res,$i,"nachname_reserviertvon");
$datum1 = $datum_obj->formatDatum($datum1, 'd.m.Y');
if($insertamum!='')
$insertamum = $datum_obj->formatDatum($insertamum, 'd.m.Y H:i:s');
@@ -132,8 +147,9 @@ if(!$rechte->isBerechtigt('lehre/reservierung:begrenzt', null, 'suid'))
echo '<td>'.$db->convert_html_chars($titel).'</td>';
echo '<td>'.$db->convert_html_chars($stunde).'</td>';
echo '<td>'.$db->convert_html_chars($ort_kurzbz).'</td>';
echo '<td>'.$db->convert_html_chars($pers_uid).'</td>';
echo '<td>'.$db->convert_html_chars($titelpre.' '.$pers_vorname.' '.$pers_nachname.' '.$titelpost).'</td>';
echo '<td>'.$db->convert_html_chars($beschreibung).'<a name="liste'.$i.'">&nbsp;</a></td>';
echo '<td>'.$db->convert_html_chars($titelpre_reserviertvon.' '.$pers_vorname_reserviertvon.' '.$pers_nachname_reserviertvon.' '.$titelpost_reserviertvon).'</td>';
$z=$i-1;
if (($pers_uid==$uid || $insertvon==$uid) && $rechte->isBerechtigt('lehre/reservierung:begrenzt', null, 'suid'))
echo '<td><A class="Item" href="stpl_reserve_list.php?id='.$id.'#liste'.$z.'">Delete</A></td>';
+65 -68
View File
@@ -37,8 +37,8 @@ $person = new person();
$person->getPersonFromBenutzer($user);
$show = (isset($_POST['show']) ? $_POST['show'] : 'aktuell'); //show: alle / aktuell
$is_popup = (isset($_GET['verpflichtend']) && $_GET['verpflichtend'] == true) ? true : false;
$show = (isset($_POST['show']) ? $_POST['show'] : 'aktuell'); //show: alle / aktuell
$is_popup = (isset($_GET['verpflichtend']) && $_GET['verpflichtend'] == true) ? true : false;
//Leiter OEs holen
$benutzerfunktion = new benutzerfunktion();
$benutzerfunktion->getBenutzerFunktionen('Leitung', '', '', $user);
@@ -80,7 +80,7 @@ if($type=='bestaetigen' && is_numeric($ampel_id))
$message='';
if($ampel->load($ampel_id))
{
if($ampel->isZugeteilt($user, $ampel->benutzer_select))
if($ampel->isZugeteilt($user, $ampel->benutzer_select))
{
if(!$ampel->isBestaetigt($user, $ampel_id))
{
@@ -88,7 +88,7 @@ if($type=='bestaetigen' && is_numeric($ampel_id))
{
echo '<script type="text/javascript">window.parent.loadampel();</script>';
header('Refresh:0');
exit;
exit;
}
else
$message = '<span class="error">'.$ampel->errormsg.'</span>';
@@ -99,7 +99,7 @@ if($type=='bestaetigen' && is_numeric($ampel_id))
}
else
$message = '<span class="error">'.$p->t('tools/ampelNichtGefunden').'</span>';
if ($message != '')
echo '<div class="alert alert-danger" role="alert">' . $message . '</div>';
}
@@ -107,7 +107,7 @@ if($type=='bestaetigen' && is_numeric($ampel_id))
//get all user ampeln
list(
$user_ampel_arr,
$user_ampel_arr,
$cnt_ueberfaellig) = //counts overdue ampeln (not expired)
getUserAmpelData($user);
@@ -118,7 +118,7 @@ if (!empty($user_ampel_arr))
}
//filter ampeln for popup (if at least one mandatory, which is neither expired nor before vorlaufzeit)
if ($is_popup)
if ($is_popup)
{
list(
$user_ampel_arr,
@@ -135,14 +135,14 @@ if (!$is_popup && $show == 'aktuell')
function getUserAmpelData($user)
{
$cnt_ueberfaellig = 0;
$ampel = new ampel();
$ampel->loadUserAmpel($user, true);
$user_ampel_arr = array();
$datum = new datum();
$now = $datum->mktime_fromdate(date('Y-m-d'));
foreach($ampel->result as $row)
{
$deadline = $datum->mktime_fromdate($row->deadline);
@@ -150,23 +150,23 @@ function getUserAmpelData($user)
$verfallszeit = $row->verfallszeit;
$bestaetigt = $ampel->isBestaetigt($user, $row->ampel_id);
$verpflichtend = $row->verpflichtend; // 't'/'f'
$datum_liegt_vor_vorlaufzeit = false;
$datum_liegt_nach_verfallszeit = false;
if (!is_null($vorlaufzeit))
$datum_liegt_vor_vorlaufzeit = $now < strtotime('-' . $vorlaufzeit . ' day', $deadline);
$datum_liegt_vor_vorlaufzeit = $now < strtotime('-' . $vorlaufzeit . ' day', $deadline);
if (!is_null($verfallszeit))
$datum_liegt_nach_verfallszeit = $now > strtotime('+' . $verfallszeit . ' day', $deadline);
//default
$show_ampel = true; //true while actual date is not before vorlaufzeit
$abgelaufen = false; //false while actual date is not after verfallszeit
$active = true; //true while not confirmed or expired
$active = true; //true while not confirmed or expired
$status = 'gelb'; //yellow while not overdue (red) or confirmed (green)
$status_ampel = ''; //ampel image
if ($bestaetigt)
$status = 'gruen';
@@ -174,21 +174,21 @@ function getUserAmpelData($user)
if ($datum_liegt_vor_vorlaufzeit)
$show_ampel = false;
if ($datum_liegt_nach_verfallszeit)
$abgelaufen = true;
if ($now >= $deadline && !$bestaetigt)
if ($now >= $deadline && !$bestaetigt)
{
if (!$abgelaufen)
$cnt_ueberfaellig++;
$status = 'rot';
}
if ($bestaetigt || $abgelaufen)
$active = false;
//assign png-image to ampelstatus
switch($status)
{
@@ -205,7 +205,7 @@ function getUserAmpelData($user)
$status_ampel= '<img name="A" src="../../../skin/images/ampel_gruen.png" >';
break;
}
$user_ampel_arr[] = array(
'ampel_id' => $row->ampel_id,
'kurzbz' => $row->kurzbz,
@@ -216,23 +216,23 @@ function getUserAmpelData($user)
'bestaetigt' => $bestaetigt,
'deadline' => $row->deadline,
'vorlaufzeit' => $row->vorlaufzeit,
'verfallszeit' => $row->verfallszeit,
'verfallszeit' => $row->verfallszeit,
'beschreibung' => $row->beschreibung,
'abgelaufen' => $abgelaufen,
'active' => $active);
}
return array($user_ampel_arr, $cnt_ueberfaellig);
}
function sortUserAmpelData($user_ampel_arr)
{
//first: sort deadline
$deadline_arr = array();
foreach ($user_ampel_arr as $key => $val)
foreach ($user_ampel_arr as $key => $val)
{
$deadline_arr[$key] = $val['deadline'];
}
array_multisort($deadline_arr, SORT_DESC, $user_ampel_arr);
//second: sort inactive after active
@@ -247,7 +247,7 @@ function sortUserAmpelData($user_ampel_arr)
else
{
$inactive_ampel_arr[] = $user_ampel;
}
}
}
return $user_ampel_arr = array_merge($active_ampel_arr, $inactive_ampel_arr);
}
@@ -292,7 +292,7 @@ function getActualUserAmpelData($user_ampel_arr, $semester_start)
<!--style for sancho typewriting effect-->
<style>
.cursor:after {
opacity: 0;
animation: cursor 1s infinite;
@@ -314,7 +314,7 @@ function getActualUserAmpelData($user_ampel_arr, $semester_start)
100% {
opacity: 0;
}
}
}
</style>
<!--script for sancho typewriting effect-->
<script>
@@ -344,39 +344,39 @@ function typeWrite(span){
<body style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;">
<div class="container-fluid" style="padding: 0px;">
<?php
<div class="container-fluid" style="padding: 0px;">
<?php
//title in CIS
if (!$is_popup)
echo '<h3>' . $p->t('tools/ampelsystem') . '</h3>';
//***************************************** AROUSE SANCHO for mandatory ampeln
if ($is_popup)
{
//sancho message if mandatory ampeln exist
if (count($user_ampel_arr) > 0)
{
echo '
echo '
<div>
<img src="../../../skin/images/sancho/sancho_header_du_hast_verpflichtende_ampeln.jpg" alt="sancho_verpflichtende_ampeln" style="width: 100%;">
</div>
</div>
<p><br><br></p>';
}
}
}
?>
<!--***************************************** PANEL-GROUP -->
<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true" style="padding-left: 15px; padding-right:15px;">
<!--***************************************** radiobuttons actual term / all -->
<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true" style="padding-left: 15px; padding-right:15px;">
<!--***************************************** radiobuttons actual term / all -->
<?php
if (!$is_popup)
{
?>
<form method="POST" action="">
<?php echo $p->t('tools/ampelAnzeigeFuer') ?>&nbsp;&nbsp;
<label class="radio-inline">
<label class="radio-inline">
<input type="radio" name="show" value="aktuell" <?php if ($show == 'aktuell') echo 'checked'; ?> onclick="submit()"> <?php echo $p->t('tools/ampelNurAktuellesStudiensemester') ?>
</label>
<label class="radio-inline">
@@ -386,21 +386,21 @@ function typeWrite(span){
<p><br><br></p>
<?php
} //end if
//***************************************** COLLAPSED PANELS WITH AMPELN
$cnt = 1; //counter to set iterative id's
$cnt_inactive = 1; //counter to set only one heading line for inactive ampeln
$cnt_active = 0;
//show panel "no actual ampeln" if there are no active ampeln
foreach ($user_ampel_arr as $user_ampel)
{
if ($user_ampel['active'] == true)
$cnt_active++;
}
if ($cnt_active == 0 && !$is_popup)
{
echo '
@@ -411,7 +411,7 @@ function typeWrite(span){
<small>' . $p->t('tools/ampelKeineAktuellenTxt'). '</small>
</div>
</div>
</div>';
</div>';
}
elseif ($cnt_active != 0 && !$is_popup)
{
@@ -422,16 +422,16 @@ function typeWrite(span){
<h4>' . $p->t('tools/ampelAktuelleAmpeln'). '</h4>
</div>
</div>
</div>';
</div>';
}
//fill panel with ampeln
foreach ($user_ampel_arr as $user_ampel)
{
//use only ampeln that are not overdue
if ($user_ampel['show_ampel'] == true)
{
{
//heading line for inactive ampeln
if ($user_ampel['active'] == false && $cnt_inactive == 1)
{
@@ -444,33 +444,33 @@ function typeWrite(span){
<small>' . $p->t('tools/ampelAbgelaufenTxt'). '</small>
</div>
</div>
</div>';
</div>';
$cnt_inactive++;
}
?>
<div class="panel">
<div class="row" style="margin-bottom: 15px">
<div class="panel-heading <?php if ($user_ampel['abgelaufen'] || $user_ampel['bestaetigt']) echo 'text-muted' ?>" style="background-color: transparent" role="tab" id="heading<?php echo $cnt ?>">
<div class="panel-heading <?php if ($user_ampel['abgelaufen'] || $user_ampel['bestaetigt']) echo 'text-muted' ?>" style="background-color: transparent" role="tab" id="heading<?php echo $cnt ?>">
<div class="col-xs-4">
<h5 class="panel-title" style="text-decoration: none; font-size: 14px;">
<a class="collapsed" style="text-decoration: none;" role="button" data-toggle="collapse" data-parent="#accordion"
<a class="collapsed" style="text-decoration: none;" role="button" data-toggle="collapse" data-parent="#accordion"
href="#collapse<?php echo $cnt ?>" aria-expanded="false" aria-controls="collapse<?php echo $cnt ?>">
<?php echo $user_ampel['kurzbz'] ?>
</a>
</h5>
<small <?php if ($user_ampel['status'] == 'rot' && !$user_ampel['abgelaufen']) echo 'style="color: red; font-weight : bold;"'?>><?php echo $p->t('global/faelligAm') . ' '; echo date('d.m.Y', strtotime($user_ampel['deadline'])) ?></small>
<small <?php if ($user_ampel['status'] == 'rot' && !$user_ampel['abgelaufen']) echo 'style="color: red; font-weight : bold;"'?>><?php echo $p->t('global/faelligAm') . ' '; echo date('d.m.Y', strtotime($user_ampel['deadline'])) ?></small>
</div>
<div class="col-xs-2">
<?php echo $user_ampel['status_ampel'] ?>
</div>
<div class="col-xs-2"><small>
<?php
<div class="col-xs-2"><small>
<?php
if ($user_ampel['bestaetigt']) echo 'bestätigt';
if ($user_ampel['abgelaufen'])
{
if ($user_ampel['bestaetigt'])
echo " &<br>";
else
else
echo "nicht bestätigt &<br>";
echo 'abgelaufen';
}
@@ -478,29 +478,27 @@ function typeWrite(span){
</div>
<div class="col-xs-4">
<form method="POST" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']) . '?ampel_id='. urlencode($user_ampel['ampel_id']) . '&type=bestaetigen'; ?>">
<button name="type" type="submit" class="btn btn-default pull-right"
<?php if ($user_ampel['abgelaufen'] || $user_ampel['bestaetigt']) echo 'disabled data-toggle="tooltip" data-placement="top" title="' . $p->t('tools/ampelBestaetigtAbgelaufen'). '"'?>><?php echo $p->t('global/bestaetigen') ?>
</button>
<button type="button" class="btn btn-default pull-right collapsed" style="margin-right: 10px;" data-toggle="collapse" data-parent="#accordion"
href="#collapse<?php echo $cnt ?>" aria-expanded="false" aria-controls="collapse<?php echo $cnt ?>"><?php echo $p->t('global/lesen') ?></button>
<button type="button" class="btn btn-default pull-right collapsed" style="margin-right: 0 px;" data-toggle="collapse" data-parent="#accordion"
href="#collapse<?php echo $cnt ?>" aria-expanded="false" aria-controls="collapse<?php echo $cnt ?>"><?php echo $p->t('global/anzeigen') ?></button>
</form>
</div>
</div>
</div>
</div>
<div id="collapse<?php echo $cnt ?>" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading<?php echo $cnt ?>">
<div class="panel-body" style="font-size: 12px;">
<?php echo $user_ampel['beschreibung'][$sprache] ?>
<?php echo $user_ampel['beschreibung'][$sprache] ?>
<p><br></p>
<form method="POST" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']) . '?ampel_id='. urlencode($user_ampel['ampel_id']) . '&type=bestaetigen'; ?>">
<button type="type" type="submit" class="btn btn-default pull-right"
<button type="type" type="submit" class="btn btn-default pull-right"
<?php if ($user_ampel['abgelaufen'] || $user_ampel['bestaetigt']) echo 'disabled data-toggle="tooltip" data-placement="top" title="' . $p->t('tools/ampelBestaetigtAbgelaufen'). '"'?>><?php echo $p->t('global/bestaetigen') ?>
</button>
</form>
</div>
</div>
</div>
</div>
<?php
$cnt++;
<?php
$cnt++;
} //end if
} //end foreach
?>
@@ -509,4 +507,3 @@ function typeWrite(span){
</div> <!--end container -->
</body>
</html>
+193 -12
View File
@@ -55,6 +55,7 @@ if (!$db = new basis_db())
$user = get_uid();
$passuid = false;
$rechte = new benutzerberechtigung();
$rechte->getBerechtigungen($user);
@@ -67,6 +68,7 @@ if(isset($_GET['uid']))
$user = $_GET['uid'];
$rechte = new benutzerberechtigung();
$rechte->getBerechtigungen($user);
$passuid = true;
}
else
{
@@ -126,6 +128,12 @@ $von = $von_datum.' '.$von_uhrzeit;
$bis_datum = (isset($_REQUEST['bis_datum'])?$_REQUEST['bis_datum']:date('d.m.Y'));
$bis_uhrzeit = (isset($_POST['bis_uhrzeit'])?$_POST['bis_uhrzeit']:date('H:i',mktime(date('H'), date('i')+10)));
$bis = $bis_datum.' '.$bis_uhrzeit;
$pause_von = (isset($_POST['pause_von'])?$_POST['pause_von']:date('H:i'));
$pause_bis = (isset($_POST['pause_bis'])?$_POST['pause_bis']:date('H:i'));
$von_pause = $von_datum.' '.$pause_von;
$bis_pause = $bis_datum.' '.$pause_bis;
$beschreibung = (isset($_POST['beschreibung'])?$_POST['beschreibung']:'');
$service_id = (isset($_POST['service_id'])?$_POST['service_id']:'');
$kunde_uid = (isset($_POST['kunde_uid'])?$_POST['kunde_uid']:'');
@@ -233,6 +241,8 @@ echo '
return row[0] + " " + row[1] + " " + row[2];
}
checkPausenblock();
$("#kunde_name").autocomplete({
source: "zeitaufzeichnung_autocomplete.php?autocomplete=kunde",
minLength:2,
@@ -539,6 +549,86 @@ echo '
}
);
}
// Pausenblock
function checkPausenblock()
{
var sel = $("#aktivitaet").val();
var activities = ["Admin", "Lehre", "FuE", "Operativ", "Betrieb", "Design"];
if (activities.includes(sel))
showPausenblock();
else
hidePausenblock();
}
function hidePausenblock()
{
$("#pause_von").val("");
$("#pause_bis").val("");
$("#genPause").attr("checked", false);
$("#pausenblock").hide();
}
function showPausenblock()
{
$("#pausenblock").show();
}
function checkPausenzeit()
{
if ($("#genPause").is(":checked"))
{
setPausenzeit();
}
else
{
clearPausenzeit();
}
}
function setPausenzeit()
{
var von_stunden, bis_stunden, von_minuten, bis_minuten, Uhrzeit2, Uhrzeit1, spanne;
Uhrzeit1 = $("#von_uhrzeit").val();
von_stunden = Uhrzeit1.substring(0,2);
von_minuten = Uhrzeit1.substring(3,5);
Uhrzeit2 = $("#bis_uhrzeit").val();
bis_stunden = Uhrzeit2.substring(0,2);
bis_minuten = Uhrzeit2.substring(3,5);
spanne = (bis_stunden*60+parseInt(bis_minuten))-(von_stunden*60+parseInt(von_minuten));
if (spanne <= 40)
{
alert("'.$p->t("zeitaufzeichnung/zeitraumZuKurz").'");
$("#genPause").attr("checked", false);
}
else
{
var pausenstart = Math.floor((spanne/2-15)+(von_stunden*60+parseInt(von_minuten)));
var pausenstart_stunde = Math.floor(pausenstart/60);
var pausenstart_minute = pausenstart - pausenstart_stunde*60;
pausenstart_stunde = (pausenstart_stunde < 10 ? "0"+pausenstart_stunde : pausenstart_stunde);
pausenstart_minute = (pausenstart_minute < 10 ? "0"+pausenstart_minute : pausenstart_minute);
var beginn_pause = pausenstart_stunde + ":" + pausenstart_minute;
var pausenende = pausenstart + parseInt(30);
var pausenende_stunde = Math.floor(pausenende/60);
var pausenende_minute = pausenende - pausenende_stunde*60;
pausenende_stunde = (pausenende_stunde < 10 ? "0"+pausenende_stunde : pausenende_stunde);
pausenende_minute = (pausenende_minute < 10 ? "0"+pausenende_minute : pausenende_minute);
var ende_pause = pausenende_stunde + ":" + pausenende_minute;
$("#pause_von").val(beginn_pause);
$("#pause_bis").val(ende_pause);
}
}
function clearPausenzeit()
{
$("#pause_von").val("");
$("#pause_bis").val("");
}
</script>
</head>
<body>
@@ -753,12 +843,78 @@ if(isset($_POST['save']) || isset($_POST['edit']) || isset($_POST['import']))
$zeit->projektphase_id = $projektphase_id;
$zeit->service_id = $service_id;
$zeit->kunde_uid = $kunde_uid;
if(!$zeit->save())
$saveerror = 0;
if (isset($_POST['genPause']) && (isset($_POST['save']) || isset($_POST['edit'])))
{
echo '<span style="color:red"><b>'.$p->t("global/fehlerBeimSpeichernDerDaten").': '.$zeit->errormsg.'</b></span>';
$p_start = $datum->formatDatum($von_pause, $format='Y-m-d H:i:s');
$p_end = $datum->formatDatum($bis_pause, $format='Y-m-d H:i:s');
// checken ob Pause innerhalb der Arbeitszeit ist
if ($zeit->start > $p_start || $zeit->ende < $p_end)
{
echo '<span style="color:red"><b>'.$p->t("global/fehlerBeimSpeichernDerDaten").': Pause außerhalb der Arbeitszeit</b></span><br>';
$saveerror = 1;
}
elseif ($p_start > $p_end)
{
echo '<span style="color:red"><b>'.$p->t("global/fehlerBeimSpeichernDerDaten").': Fehlerhafte Pausenzeiten</b></span><br>';
$saveerror = 1;
}
else
{
//Eintrag Arbeit bis zur Pause
$zeit->ende = $datum->formatDatum($von_pause, $format='Y-m-d H:i:s');
if(!$zeit->save())
{
echo '<span style="color:red"><b>'.$p->t("global/fehlerBeimSpeichernDerDaten").': '.$zeit->errormsg.'</b></span><br>';
$saveerror = 1;
}
//Eintrag für die Pause
$pause = new zeitaufzeichnung();
$pause->new = true;
$pause->insertamum = date('Y-m-d H:i:s');
$pause->updateamum = date('Y-m-d H:i:s');
$pause->updatevon = $user;
$pause->insertvon = $user;
$pause->uid = $user;
$pause->aktivitaet_kurzbz = 'Pause';
$pause->start = $datum->formatDatum($von_pause, $format='Y-m-d H:i:s');
$pause->ende = $datum->formatDatum($bis_pause, $format='Y-m-d H:i:s');
$pause->beschreibung = '';
if(!$pause->save())
{
echo '<span style="color:red"><b>'.$p->t("global/fehlerBeimSpeichernDerDaten").': '.$pause->errormsg.'</b></span><br>';
$saveerror = 1;
}
// Eintrag Arbeit ab der Pause
if ($zeit->new == false)
{
$zeit->new = true;
$zeit->insertamum = date('Y-m-d H:i:s');
$zeit->insertvon = $user;
}
$zeit->start = $datum->formatDatum($bis_pause, $format='Y-m-d H:i:s');
$zeit->ende = $datum->formatDatum($bis, $format='Y-m-d H:i:s');
if(!$zeit->save())
{
echo '<span style="color:red"><b>'.$p->t("global/fehlerBeimSpeichernDerDaten").': '.$zeit->errormsg.'</b></span><br>';
$saveerror = 1;
}
}
}
else
elseif (!isset($_POST['genPause']))
{
if(!$zeit->save())
{
echo '<span style="color:red"><b>'.$p->t("global/fehlerBeimSpeichernDerDaten").': '.$zeit->errormsg.'</b></span>';
$saveerror = 1;
}
}
if ($saveerror == 0)
{
echo '<span style="color:green"><b>'.$p->t("global/datenWurdenGespeichert").'</b></span>';
@@ -780,6 +936,7 @@ if(isset($_POST['save']) || isset($_POST['edit']) || isset($_POST['import']))
}
}
//Datensatz loeschen
if(isset($_GET['type']) && $_GET['type']=='delete')
{
@@ -866,7 +1023,7 @@ if($projekt->getProjekteMitarbeiter($user, true))
<a href='".$_SERVER['PHP_SELF']."?csvexport=1' style='font-size: larger;'>CSV Export</a>";
if($anzprojekte > 0)
echo "<a style='font-size: larger; text-decoration: none; cursor: default'> | </a><a href='".$_SERVER['PHP_SELF']."?projektexport=1' style='font-size: larger;'>".$p->t("zeitaufzeichnung/projektexport")."</a>";
echo "<a style='font-size: larger; text-decoration: none; cursor: default'> | </a><a href='".$_SERVER['PHP_SELF']."?projektexport=1".($passuid ? '&uid='.$user : '')."' style='font-size: larger;'>".$p->t("zeitaufzeichnung/projektexport")."</a>";
echo "</td>
<td class='menubox' height='10px'>";
if ($p->t("dms_link/handbuchZeitaufzeichnung")!='')
@@ -899,19 +1056,21 @@ if($projekt->getProjekteMitarbeiter($user, true))
echo '<tr><td colspan="4"><hr></td></tr>';
echo '<tr><td>'.$p->t('zeitaufzeichnung/projektexport').'</td>';
echo '<td align="center">'.$p->t('zeitaufzeichnung/monat').' <select id="projexpmonat" name="projexpmonat">';
for($i=1;$i<13;$i++)
for ($i=1;$i<13;$i++)
{
$selected = ($i == $aktmonat)?'selected = "selected"':'';
echo '<option value="'.$i.'" '.$selected.'>'.$monatsname[$sprache_index][$i - 1].'</option>';
}
echo '</select></td>';
echo '<td align="center">'.$p->t('zeitaufzeichnung/jahr').' <select id="projexpjahr" name="projexpjahr">';
for(;$jahreanz>0;$jahreanz--)
for (;$jahreanz>0;$jahreanz--)
{
echo '<option value="'.$aktjahr.'">'.$aktjahr.'</option>';
$aktjahr--;
}
echo '</select></td>';
if ($passuid)
echo '<input type="hidden" value="'.$user.'" name="uid">';
echo '<td align="right"><input type="submit" value="Export" name="projexport"></td></tr>';
echo '<tr><td colspan="4"><hr></td></tr>';
echo '</form>';
@@ -956,7 +1115,7 @@ if($projekt->getProjekteMitarbeiter($user, true))
// $qry = "SELECT * FROM fue.tbl_aktivitaet where sort != 5 or sort is null ORDER by sort,beschreibung";
if($result = $db->db_query($qry))
{
echo '<SELECT name="aktivitaet" id="aktivitaet">';
echo '<SELECT name="aktivitaet" id="aktivitaet" onChange="checkPausenblock()">';
if ($za_simple == 0)
echo '<OPTION value="">-- '.$p->t('zeitaufzeichnung/keineAuswahl').' --</OPTION>';
//else
@@ -1173,6 +1332,16 @@ if($projekt->getProjekteMitarbeiter($user, true))
<input onchange="checkZeiten()" type="text" class="timepicker" id="bis_uhrzeit" name="bis_uhrzeit" value="'.$db->convert_html_chars($datum->formatDatum($bis, $format='H:i')).'" size="4">
</td>
<tr>';
echo '
<tr>
<td>&nbsp;</td>
<td colspan="3">
<span id="pausenblock">
<input type="checkbox" name="genPause" id="genPause" onChange="checkPausenzeit()"> '.$p->t("zeitaufzeichnung/pauseEinfuegen").' <input type="text" name="pause_von" class="timepicker" size="4" id="pause_von"> - <input type="text" name="pause_bis" class="timepicker" size="4" id="pause_bis">
</span>
</td>
</tr>
';
//Beschreibung
echo '<tr><td>'.$p->t("global/beschreibung").'</td><td colspan="3"><textarea style="font-size: 13px" name="beschreibung" cols="60" maxlength="256">'.$db->convert_html_chars($beschreibung).'</textarea></td></tr>';
echo '<tr><td></td><td></td><td></td><td align="right">';
@@ -1325,7 +1494,11 @@ if($projekt->getProjekteMitarbeiter($user, true))
}
list($h2, $m2) = explode(':', $elsumme);
$elsumme = $h2*3600+$m2*60;
if ($tagessaldo > 18000 && $tagessaldo < 19800 && $pflichtpause==false && $elsumme == 0)
if ($datum->formatDatum($tag, 'Y-m-d') >= '2019-11-06')
{
$pausesumme = $pausesumme;
}
else if ($tagessaldo > 18000 && $tagessaldo < 19800 && $pflichtpause==false && $elsumme == 0)
{
$pausesumme = $tagessaldo-18000;
}
@@ -1333,12 +1506,20 @@ if($projekt->getProjekteMitarbeiter($user, true))
{
$pausesumme = $pausesumme+1800;
}
if ($elsumme > 0){
$pausesumme = $pausesumme + $elsumme;
$pflichtpause = true;
}
$tagessaldo = $tagessaldo-$pausesumme;
// fehlende Pausen berechnen
$pausefehlt_str = '';
if ($tagessaldo > 19800 && $pausesumme < 1800)
$pausefehlt_str = '<span style="color:red; font-weight:bold;">-- Pause fehlt oder zu kurz --</span>';
elseif ($tagessaldo > 18000 && $tagessaldo < 19800 && $pausesumme < $tagessaldo - 18000)
$pausefehlt_str = '<span style="color:red; font-weight:bold;">-- Pause fehlt oder zu kurz --</span>';
$tagessaldo = date('H:i', ($tagessaldo));
$colspan = ($za_simple)?6:8;
echo '<tr id="tag_row_'.$datum->formatDatum($tag,'d_m_Y').'"><td '.$style.' colspan="'.$colspan.'")>';
@@ -1350,7 +1531,7 @@ if($projekt->getProjekteMitarbeiter($user, true))
$langindex = 1;
else
$langindex = 2;
echo '<b>'.$tagbez[$langindex][$datum->formatDatum($tag,'N')].' '.$datum->formatDatum($tag,'d.m.Y').'</b> <span id="tag_'.$datum->formatDatum($tag,'d_m_Y').'">'.$zeitsperre_text.'</span>';
echo '<b>'.$tagbez[$langindex][$datum->formatDatum($tag,'N')].' '.$datum->formatDatum($tag,'d.m.Y').'</b> <span id="tag_'.$datum->formatDatum($tag,'d_m_Y').'">'.$zeitsperre_text.'</span>'.$pausefehlt_str;
if ($ersumme != '00:00')
$erstr = ' (+ '.$ersumme.' ER)';
else
@@ -1359,8 +1540,8 @@ if($projekt->getProjekteMitarbeiter($user, true))
}
echo '</td>
<td align="right" colspan="2" '.$style.'>
<b>'.$p->t("zeitaufzeichnung/arbeitszeit").': '.$datum->formatDatum($tagesbeginn, $format='H:i').'-'.$datum->formatDatum($tagesende, $format='H:i').' '.$p->t("eventkalender/uhr").'</b><br>LehreExtern /
'.$p->t("zeitaufzeichnung/pause").' '.($pflichtpause==false?$p->t("zeitaufzeichnung/inklusivePflichtpause"):'').':
<b>'.$p->t("zeitaufzeichnung/arbeitszeit").': '.$datum->formatDatum($tagesbeginn, $format='H:i').'-'.$datum->formatDatum($tagesende, $format='H:i').' '.$p->t("eventkalender/uhr").'</b><br>
'.$p->t("zeitaufzeichnung/pause").':
</td>
<td '.$style.' align="right"><b>'.$tagessaldo.$erstr.'</b><br>'.date('H:i', ($pausesumme-3600)).'</td>
<td '.$style.' colspan="3" align="right">';
@@ -29,6 +29,7 @@ require_once('../../../include/phrasen.class.php');
require_once('../../../include/datum.class.php');
require_once('../../../include/Excel/excel.php');
require_once('../../../include/benutzer.class.php');
require_once('../../../include/benutzerberechtigung.class.php');
require_once('../../../include/mitarbeiter.class.php');
require_once('../../../include/zeitaufzeichnung.class.php');
require_once('../../../include/projekt.class.php');
@@ -46,6 +47,24 @@ $sprache_obj->load($sprache);
$sprache_index = $sprache_obj->index;
$uid = get_uid();
//Wenn User Administrator ist und UID uebergeben wurde, dann die Zeitaufzeichnung
//des uebergebenen Users anzeigen
if (isset($_GET['uid']))
{
$rechte = new benutzerberechtigung();
$rechte->getBerechtigungen($uid);
if ($rechte->isBerechtigt('admin'))
{
$uid = $_GET['uid'];
}
else
{
die($p->t('global/FuerDieseAktionBenoetigenSieAdministrationsrechte'));
}
}
$benutzer = new benutzer();
if (!$benutzer->load($uid))
die($p->t("zeitaufzeichnung/benutzerWurdeNichtGefunden", array($uid)));
@@ -602,12 +621,12 @@ foreach ($projektnames as $projektname)
$lastspalte = 4 + $nrPhases;
//calculating spaces for centering global header texts
$usernamelength = strlen($username) * 1.77;
/* $usernamelength = strlen($username) * 1.77;
$numberspacesfirstrow = $totalwidth - $daywidth * 2 - $worktimewidth - $usernamelength;
$numberspacessecondrow = $numberspacesfirstrow + $usernamelength - strlen($p->t('zeitaufzeichnung/personalnr').$persnr) - 4;
$spacesstringfirstrow = str_repeat(' ', $numberspacesfirstrow);
$spacesstringsecondrow = str_repeat(' ', $numberspacessecondrow);
$spacesstringsecondrow = str_repeat(' ', $numberspacessecondrow);*/
$spalte = $zeile = 0;
@@ -626,14 +645,14 @@ foreach ($projektnames as $projektname)
}
$worksheet->setMerge($zeile, $spalte + 3, $zeile, $lastspalte);
$worksheet->setMerge($zeile + 1, $spalte + 3, $zeile + 1, $lastspalte);
$worksheet->write($zeile, $spalte + 3, $p->t('zeitaufzeichnung/projektlistegedruckt').$spacesstringfirstrow.$username, $format_heading_right);
$worksheet->write($zeile, $spalte + 3, /*$p->t('zeitaufzeichnung/projektlistegedruckt').$spacesstringfirstrow.*/$username, $format_heading_right);
for ($i = 4; $i < $lastspalte; $i++)
{
$worksheet->write($zeile, $i, '', $format_heading_topline);
$worksheet->write($zeile + 1, $i, '', $format_heading_bottomline);
}
$worksheet->write($zeile, $lastspalte, '', $format_heading_right);
$worksheet->write($zeile + 1, $spalte + 3, date('d.m.Y H:i').$spacesstringsecondrow.$p->t('zeitaufzeichnung/personalnr').$persnr, $format_heading_right_bottomline);
$worksheet->write($zeile + 1, $spalte + 3, /*date('d.m.Y H:i').$spacesstringsecondrow.*/$p->t('zeitaufzeichnung/personalnr').$persnr, $format_heading_right_bottomline);
$worksheet->write($zeile + 1, $lastspalte, '', $format_heading_right_bottomline);
$zeile += 3;
+328
View File
@@ -0,0 +1,328 @@
<?php
/* Copyright (C) 2009 Technikum-Wien
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* Authors: Christian Paminger <christian.paminger@technikum-wien.at>,
* Andreas Oesterreicher <andreas.oesterreicher@technikum-wien.at>,
* Rudolf Hangl <rudolf.hangl@technikum-wien.at> and
* Gerald Simane-Sequens <gerald.simane-sequens@technikum-wien.at>
*/
/**
* Kopiert ein Testtool-Gebiet mit allen Fragen und Antworten aber ohne Zuordnungen zu Studiengängen und dgl.
*/
require_once('../../../config/cis.config.inc.php');
require_once('../../../include/functions.inc.php');
require_once('../../../include/gebiet.class.php');
require_once('../../../include/benutzerberechtigung.class.php');
require_once('../../../include/studiengang.class.php');
require_once('../../../include/sprache.class.php');
require_once('../../../include/frage.class.php');
require_once('../../../include/antwort.class.php');
require_once('../../../include/vorschlag.class.php');
if (!$user = get_uid())
die('Sie sind nicht angemeldet. Es wurde keine Benutzer UID gefunden ! <a href="javascript:history.back()">Zur&uuml;ck</a>');
$rechte = new benutzerberechtigung();
$rechte->getBerechtigungen($user);
$sprache = new sprache();
$sprache->getAll(true, 'index');
$sprache_user = getSprache();
$db = new basis_db();
echo '
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../../../skin/style.css.php" rel="stylesheet" type="text/css">
<link href="../../../skin/tablesort.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="../../../vendor/jquery/jqueryV1/jquery-1.12.4.min.js"></script>
<script type="text/javascript" src="../../../vendor/christianbach/tablesorter/jquery.tablesorter.min.js"></script>
<script type="text/javascript" src="../../../vendor/components/jqueryui/jquery-ui.min.js"></script>
<script type="text/javascript" src="../../../include/js/jquery.ui.datepicker.translation.js"></script>
<script type="text/javascript">
$(document).ready(function()
{
$("#t1").tablesorter(
{
sortList: [[0,0]],
widgets: ["zebra"]
});
});
</script>
<style type="text/css">
.success
{
color: #3c763d;
font-weight: bold;
}
.error
{
color: #ff0000;
}
</style>
</head>
<body style="padding: 10px">
<div id="data"></div>
';
$stg_kz = (isset($_GET['stg_kz'])?$_GET['stg_kz']:'-1');
$gebietToCopy = (isset($_POST['gebietToCopy'])?$_POST['gebietToCopy']:(isset($_GET['gebietToCopy'])?$_GET['gebietToCopy']:''));
$gebiet = new gebiet();
echo '<a href="index.php?stg_kz='.$stg_kz.'" class="Item">Zurück zur Admin Seite</a><br /><br />';
echo '<h1>Gebiet kopieren</h1>';
echo '<p>Kopiert ein Gebiet mit allen Fragen und Antworten aber ohne Zuordnungen zu Studiengängen und dgl.</p>';
if(!$rechte->isBerechtigt('basis/testtool'))
die($rechte->errormsg);
$returnmsg = '';
//Speichern der Daten
if (isset($_POST['copyGebiet']) && $_POST['copyGebiet'] == 'copyGebiet')
{
if (!$rechte->isBerechtigt('basis/testtool', null, 'suid'))
die($rechte->errormsg);
if (isset($_POST['kurzbz']) && $_POST['kurzbz'] != '')
{
//Test, ob kurzbz schon vorhanden
if ($result = $db->db_query('SELECT kurzbz FROM testtool.tbl_gebiet WHERE kurzbz = '.$db->db_add_param($_POST['kurzbz']).' LIMIT 1;'))
{
if ($db->db_num_rows($result) == 0)
{
$gebietToCopy = $_POST['gebietToCopy'];
// Zu kopierendes Gebiet laden
$gebiet = new gebiet($gebietToCopy);
$bezeichnung_mehrsprachig = array();
foreach ($sprache->result as $row_sprache)
{
$bezeichnung_mehrsprachig[$row_sprache->sprache] = $_POST['bezeichnung_mehrsprachig_'.$row_sprache->sprache];
}
$gebiet->bezeichnung_mehrsprachig = $bezeichnung_mehrsprachig;
$gebiet->kurzbz = $_POST['kurzbz'];
$gebiet->bezeichnung = $_POST['bezeichnung_intern'];
$gebiet->beschreibung = $_POST['beschreibung'];
$gebiet->insertamum = date('Y-m-d H:i:s');
$gebiet->insertvon = $user;
// Neues Gebiet speichern
if ($gebiet->save(true))
{
$returnmsg .= '<p class="success">Gebiet erfolgreich kopiert</p>';
// Array mit allen Fragen und Antworten anlegen
$frageAntwortArray = array();
// Fragen laden
$fragenToCopy = new frage();
$fragenToCopy->getFragenGebiet($gebietToCopy);
// Sprachen laden und für jede Sprache die Fragen und Antworten laden
foreach ($sprache->result as $row_sprache)
{
$fragenSpracheToCopy = new frage();
$indexFrageSprache = 0;
foreach ($fragenToCopy->result AS $copyFrage)
{
if ($fragenSpracheToCopy->getFrageSprache($copyFrage->frage_id, $row_sprache->sprache, true))
{
$frageAntwortArray[$row_sprache->sprache][$indexFrageSprache]['nummer'] = $fragenSpracheToCopy->nummer;
$frageAntwortArray[$row_sprache->sprache][$indexFrageSprache]['demo'] = $fragenSpracheToCopy->demo;
$frageAntwortArray[$row_sprache->sprache][$indexFrageSprache]['kategorie_kurzbz'] = $fragenSpracheToCopy->kategorie_kurzbz;
$frageAntwortArray[$row_sprache->sprache][$indexFrageSprache]['level'] = $fragenSpracheToCopy->level;
$frageAntwortArray[$row_sprache->sprache][$indexFrageSprache]['aktiv'] = $fragenSpracheToCopy->aktiv;
$frageAntwortArray[$row_sprache->sprache][$indexFrageSprache]['text'] = $fragenSpracheToCopy->text;
$frageAntwortArray[$row_sprache->sprache][$indexFrageSprache]['bild'] = $fragenSpracheToCopy->bild;
$frageAntwortArray[$row_sprache->sprache][$indexFrageSprache]['audio'] = $fragenSpracheToCopy->audio;
// Vorschläge laden
$vorschlagSprachenToCopy = new vorschlag();
$vorschlagSprachenToCopy->getVorschlag($copyFrage->frage_id, $row_sprache->sprache, false);
$indexVorschlagSprache = 0;
foreach ($vorschlagSprachenToCopy->result AS $vorschlagSprache)
{
$frageAntwortArray[$row_sprache->sprache][$indexFrageSprache]['vorschlaege'][$indexVorschlagSprache]['nummer'] = $vorschlagSprache->nummer;
$frageAntwortArray[$row_sprache->sprache][$indexFrageSprache]['vorschlaege'][$indexVorschlagSprache]['punkte'] = $vorschlagSprache->punkte;
$frageAntwortArray[$row_sprache->sprache][$indexFrageSprache]['vorschlaege'][$indexVorschlagSprache]['text'] = $vorschlagSprache->text;
$frageAntwortArray[$row_sprache->sprache][$indexFrageSprache]['vorschlaege'][$indexVorschlagSprache]['bild'] = $vorschlagSprache->bild;
$frageAntwortArray[$row_sprache->sprache][$indexFrageSprache]['vorschlaege'][$indexVorschlagSprache]['audio'] = $vorschlagSprache->audio;
$frageAntwortArray[$row_sprache->sprache][$indexFrageSprache]['vorschlaege'][$indexVorschlagSprache]['aktiv'] = $vorschlagSprache->aktiv;
$indexVorschlagSprache++;
}
}
$indexFrageSprache++;
}
}
// Einfügen der Fragen und Antworten aus dem Array in das neue Gebiet
$anzahlFragenKopiert = 0;
foreach ($frageAntwortArray AS $fragesprache => $index)
{
foreach ($index AS $frage => $value)
{
$newfragen = new frage();
$newfragen->new = true;
$newfragen->kategorie_kurzbz = $value["kategorie_kurzbz"];
$newfragen->gebiet_id = $gebiet->gebiet_id;
$newfragen->level = $value["level"];
$newfragen->nummer = $value["nummer"];
$newfragen->demo = $value["demo"];
$newfragen->insertamum = date('Y-m-d H:i:s');
$newfragen->insertvon = $user;
$newfragen->aktiv = $value["aktiv"];
if ($newfragen->save())
{
$newfragen->sprache = $fragesprache;
$newfragen->text = $value["text"];
$newfragen->bild = $value["bild"];
$newfragen->audio = $value["audio"];
$newfragen->insertamum = date('Y-m-d H:i:s');
$newfragen->insertvon = $user;
if ($newfragen->save_fragesprache())
{
if (isset($value["vorschlaege"]))
{
foreach ($value["vorschlaege"] AS $vorschlag => $content)
{
// Vorschläge speichern
$newvorschlaege = new vorschlag();
$newvorschlaege->new = true;
$newvorschlaege->frage_id = $newfragen->frage_id;
$newvorschlaege->nummer = $content["nummer"];
$newvorschlaege->punkte = $content["punkte"];
$newvorschlaege->aktiv = $content["aktiv"];
$newvorschlaege->insertamum = date('Y-m-d H:i:s');
$newvorschlaege->insertvon = $user;
if ($newvorschlaege->save())
{
$newvorschlaege->sprache = $fragesprache;
$newvorschlaege->text = $content["text"];
$newvorschlaege->bild = $content["bild"];
$newvorschlaege->audio = $content["audio"];
$newvorschlaege->insertamum = date('Y-m-d H:i:s');
$newvorschlaege->insertvon = $user;
if ($newvorschlaege->save_vorschlagsprache())
{
$anzahlFragenKopiert++;
}
}
}
}
}
else
{
$returnmsg .= '<p class="error">Fehler beim Speichern der Fragesprache '.$fragesprache.' bei Frage: '.$newfragen->frage_id.'</p>';
}
}
else
{
$returnmsg .= '<p class="error">Fehler beim Speichern der Frage: '.$newfragen->frage_id.'</p>';
}
}
}
}
else
{
$returnmsg .= '<p class="error">Fehler beim Speichern: '.$gebiet->errormsg.'</p>';
}
}
else
$returnmsg .= '<p class="error">Kurzbezeichnung ist schon vorhanden</p>';
}
}
else
{
$returnmsg .= '<p class="error">Bitte f&uuml;llen Sie alle Pflichtfelder aus</p>';
}
}
$studiengang = new studiengang();
$studiengang->getAll('typ, kurzbz', false);
echo '<p>'.$returnmsg.'</p>';
echo '
<form action="'.$_SERVER['PHP_SELF'].'" method="POST">
<table cellspacing="4">
<tr>
<td>Zu kopierendes Gebiet: </td><td>';
//Dropdown bestehender Gebiete
$gebiete = new gebiet();
$gebiete->getAll();
echo '<SELECT name="gebietToCopy" id="gebieteSelect"><OPTION value="-1">-- Keine Auswahl --</OPTION>';
foreach ($gebiete->result AS $row)
{
if ($gebietToCopy == $row->gebiet_id)
{
$selected = 'selected';
}
echo '<option value="'.$row->gebiet_id.'" '.$selected.'>'.$row->bezeichnung.' - '.$row->kurzbz.' - '.$row->zeit.'</option>';
$selected = '';
}
echo '</select>';
echo '</td></tr>
<tr>
<td colspan="2"><b>Daten neues Gebiet</b></td>
</tr>
<tr>
<td>Kurzbezeichnung</td>
<td><input type="text" name="kurzbz" placeholder="Pflichtfeld" maxlength="10" value="'.(isset($_POST['kurzbz'])?$_POST['kurzbz']:'').'" required/></td>
</tr>
<tr>
<td>Bezeichnung (intern)</td>
<td><input type="text" name="bezeichnung_intern" maxlength="50" value="'.(isset($_POST['bezeichnung_intern'])?$_POST['bezeichnung_intern']:'').'"/></td>
</tr>';
foreach ($sprache->result as $row)
{
echo ' <tr>
<td>Bezeichnung '.$row->bezeichnung_arr[$sprache_user].'</td>
<td><input type="text" name="bezeichnung_mehrsprachig_'.$row->sprache.'" maxlength="255" value="'.(isset($_POST['bezeichnung_mehrsprachig_'.$row->sprache.''])?$_POST['bezeichnung_mehrsprachig_'.$row->sprache.'']:'').'"/></td>
</tr>';
}
echo '
<tr>
<td>Beschreibung (intern)</td>
<td><textarea rows="" cols="" name="beschreibung" style="font-size: 9pt">'.(isset($_POST['beschreibung'])?$_POST['beschreibung']:'').'</textarea></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Gebiet kopieren"/></td>
</tr>
</table>
<input type="hidden" name="copyGebiet" value="copyGebiet"/>
</form>
';
echo '</body></html>';
?>
+1
View File
@@ -690,6 +690,7 @@ if (($anzahl !== 0) || ($stg_kz == '-1') && ($stg_kz !== ''))
echo " <a href='$PHP_SELF?gebiet_id=$gebiet_id&amp;stg_kz=$stg_kz&amp;nummer=$nummer&amp;type=gebietpruefen' class='Item'>Prüfen</a> | ";
echo " <a href='edit_gebiet.php?gebiet_id=$gebiet_id&amp;stg_kz=$stg_kz' class='Item'>Bearbeiten</a> |";
echo " <a href='add_gebiet.php?stg_kz=".$stg_kz."'>Neues Gebiet</a> | ";
echo " <a href='copy_gebiet.php?stg_kz=".$stg_kz."&amp;gebietToCopy=".$gebiet_id."'>Gebiet kopieren</a>";
//echo " <a href='export.php?gebiet_id=$gebiet_id&amp;stg_kz=$stg_kz' target='_blank'>PDF exportieren</a>";
//echo " <br/>Gebiet_id=".$gebiet_id."";
echo '</td><td align="right">';
+25
View File
@@ -162,6 +162,17 @@
}
}
},
{
"type": "package",
"package": {
"name": "moment/momentjs",
"version": "2.24.0",
"dist": {
"url": "https://github.com/moment/moment/archive/2.24.0.zip",
"type": "zip"
}
}
},
{
"type": "package",
"package": {
@@ -173,6 +184,17 @@
}
}
},
{
"type": "package",
"package": {
"name": "olifolkerd/tabulator",
"version": "4.2.7",
"dist": {
"url": "https://github.com/olifolkerd/tabulator/archive/4.2.7.zip",
"type": "zip"
}
}
},
{
"type": "package",
"package": {
@@ -253,6 +275,7 @@
"ludo/jquery-treetable": "^3.2",
"moment/momentjs": "2.24.0",
"michelf/php-markdown": "1.5.0",
"ml/json-ld": "1.*",
"mottie/tablesorter": "^2.29",
@@ -261,6 +284,8 @@
"netcarver/textile": "^3.5",
"nicolaskruchten/pivottable": "^2.21.0",
"olifolkerd/tabulator": "4.2.7",
"phpseclib/phpseclib": "^2.0",
"rmariuzzo/jquery-checkboxes": "1.0.7",
Generated
+40 -18
View File
@@ -1134,6 +1134,17 @@
],
"time": "2018-11-18T20:26:18+00:00"
},
{
"name": "moment/momentjs",
"version": "2.24.0",
"dist": {
"type": "zip",
"url": "https://github.com/moment/moment/archive/2.24.0.zip",
"reference": null,
"shasum": null
},
"type": "library"
},
{
"name": "mottie/tablesorter",
"version": "v2.31.1",
@@ -1237,16 +1248,16 @@
},
{
"name": "netcarver/textile",
"version": "v3.7.1",
"version": "v3.7.2",
"source": {
"type": "git",
"url": "https://github.com/textile/php-textile.git",
"reference": "377933125dd30d708804c545bf33da87a3c1b0f4"
"reference": "c24d68d9f4d099f9c2434e71024f2a6140dc1594"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/textile/php-textile/zipball/377933125dd30d708804c545bf33da87a3c1b0f4",
"reference": "377933125dd30d708804c545bf33da87a3c1b0f4",
"url": "https://api.github.com/repos/textile/php-textile/zipball/c24d68d9f4d099f9c2434e71024f2a6140dc1594",
"reference": "c24d68d9f4d099f9c2434e71024f2a6140dc1594",
"shasum": ""
},
"require": {
@@ -1331,18 +1342,29 @@
],
"time": "2018-11-04T18:21:09+00:00"
},
{
"name": "olifolkerd/tabulator",
"version": "4.2.7",
"dist": {
"type": "zip",
"url": "https://github.com/olifolkerd/tabulator/archive/4.2.7.zip",
"reference": null,
"shasum": null
},
"type": "library"
},
{
"name": "phpseclib/phpseclib",
"version": "2.0.15",
"version": "2.0.20",
"source": {
"type": "git",
"url": "https://github.com/phpseclib/phpseclib.git",
"reference": "11cf67cf78dc4acb18dc9149a57be4aee5036ce0"
"reference": "d6819a55b05e123db1e881d8b230d57f912126be"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/11cf67cf78dc4acb18dc9149a57be4aee5036ce0",
"reference": "11cf67cf78dc4acb18dc9149a57be4aee5036ce0",
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/d6819a55b05e123db1e881d8b230d57f912126be",
"reference": "d6819a55b05e123db1e881d8b230d57f912126be",
"shasum": ""
},
"require": {
@@ -2138,16 +2160,16 @@
},
{
"name": "tinymce/tinymce",
"version": "4.9.4",
"version": "4.9.5",
"source": {
"type": "git",
"url": "https://github.com/tinymce/tinymce-dist.git",
"reference": "3a997f24eb54d890b1c88f22cff03092e0b73378"
"reference": "5c6d8f4a6dda33b379068bb12678a2b2b2271fb4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/tinymce/tinymce-dist/zipball/3a997f24eb54d890b1c88f22cff03092e0b73378",
"reference": "3a997f24eb54d890b1c88f22cff03092e0b73378",
"url": "https://api.github.com/repos/tinymce/tinymce-dist/zipball/5c6d8f4a6dda33b379068bb12678a2b2b2271fb4",
"reference": "5c6d8f4a6dda33b379068bb12678a2b2b2271fb4",
"shasum": ""
},
"type": "component",
@@ -2245,16 +2267,16 @@
},
{
"name": "twig/twig",
"version": "v1.41.0",
"version": "v1.42.2",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
"reference": "575cd5028362da591facde1ef5d7b94553c375c9"
"reference": "21707d6ebd05476854805e4f91b836531941bcd4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/575cd5028362da591facde1ef5d7b94553c375c9",
"reference": "575cd5028362da591facde1ef5d7b94553c375c9",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/21707d6ebd05476854805e4f91b836531941bcd4",
"reference": "21707d6ebd05476854805e4f91b836531941bcd4",
"shasum": ""
},
"require": {
@@ -2264,12 +2286,12 @@
"require-dev": {
"psr/container": "^1.0",
"symfony/debug": "^2.7",
"symfony/phpunit-bridge": "^3.4.19|^4.1.8"
"symfony/phpunit-bridge": "^3.4.19|^4.1.8|^5.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.41-dev"
"dev-master": "1.42-dev"
}
},
"autoload": {
+6
View File
@@ -126,6 +126,12 @@ define('FAS_UDF', true);
// Legt fest ob Aufnahmegruppen bei Reihungstests verwaltet werden true|false
define('FAS_REIHUNGSTEST_AUFNAHMEGRUPPEN',false);
// Legt fest, ob Vertragsdetails zum Lehrauftrag im Reiter LektorInnenzuteilung angezeigt werden
define('FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN', false);
// Legt fest, ob Vertragsdetails zum Projektauftrag im Reiter Projektarbeit angezeigt werden
define('FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN', false);
// Anzeigeoptionen für LV-Plan Menü
define('CIS_LVPLAN_EXPORT_ANZEIGEN',true);
define('CIS_LVPLAN_PERSONENAUSWAHL_ANZEIGEN',true);
+140 -34
View File
@@ -17,7 +17,8 @@
*
* Authors: Christian Paminger <christian.paminger@technikum-wien.at>,
* Andreas Oesterreicher <andreas.oesterreicher@technikum-wien.at> and
* Rudolf Hangl <rudolf.hangl@technikum-wien.at>.
* Rudolf Hangl <rudolf.hangl@technikum-wien.at>
* Cristina Hainberger <hainberg@technikum-wien.at>.
*/
// ****************************************
@@ -31,6 +32,7 @@
// * - Lehreinheitmitarbeiter Zuteilung hinzufuegen/bearbeiten/loeschen
// * - Lehreinheitgruppe Zutelung hinzufuegen/loeschen
// * - Lehreinheit anlegen/bearbeiten/loeschen
// * - Lehrauftrag (Vertrag) loeschen (stornieren)
// ****************************************
require_once('../../config/vilesci.config.inc.php');
@@ -691,50 +693,58 @@ if(!$error)
//Lehreinheitmitarbeiterzuteilung loeschen
if(isset($_POST['lehreinheit_id']) && is_numeric($_POST['lehreinheit_id']) && isset($_POST['mitarbeiter_uid']))
{
//Wenn der Mitarbeiter im Stundenplan verplant ist, dann wird das Loeschen verhindert
$qry = "SELECT stundenplandev_id as id FROM lehre.tbl_stundenplandev WHERE lehreinheit_id=".$db->db_add_param($_POST['lehreinheit_id'], FHC_INTEGER)." AND mitarbeiter_uid=".$db->db_add_param($_POST['mitarbeiter_uid'])."
UNION
SELECT stundenplan_id as id FROM lehre.tbl_stundenplan WHERE lehreinheit_id=".$db->db_add_param($_POST['lehreinheit_id'], FHC_INTEGER)." AND mitarbeiter_uid=".$db->db_add_param($_POST['mitarbeiter_uid']);
if($db->db_query($qry))
// Wenn der Mitarbeiter schon einen Vertrag hat, wird das Loeschen verhindert
if (isset($_POST['vertrag_id']) && is_numeric($_POST['vertrag_id']))
{
if($db->db_num_rows()>0)
$return = false;
$errormsg = 'Löschen nur nach Stornierung des Vertrags möglich.';
}
else
{
//Wenn der Mitarbeiter im Stundenplan verplant ist, dann wird das Loeschen verhindert
$qry = "SELECT stundenplandev_id as id FROM lehre.tbl_stundenplandev WHERE lehreinheit_id=".$db->db_add_param($_POST['lehreinheit_id'], FHC_INTEGER)." AND mitarbeiter_uid=".$db->db_add_param($_POST['mitarbeiter_uid'])."
UNION
SELECT stundenplan_id as id FROM lehre.tbl_stundenplan WHERE lehreinheit_id=".$db->db_add_param($_POST['lehreinheit_id'], FHC_INTEGER)." AND mitarbeiter_uid=".$db->db_add_param($_POST['mitarbeiter_uid']);
if($db->db_query($qry))
{
$return = false;
$errormsg = 'Diese/r LektorIn kann nicht gelöscht werden da er schon verplant ist';
}
else
{
$leg = new lehreinheitmitarbeiter();
if($leg->load($_POST['lehreinheit_id'], $_POST['mitarbeiter_uid']))
if($db->db_num_rows()>0)
{
// Wenn ein Vertrag dazu angelegt ist, dann diesen mitloeschen
if($leg->vertrag_id!='')
$return = false;
$errormsg = 'Diese/r LektorIn kann nicht gelöscht werden da er schon verplant ist';
}
else
{
$leg = new lehreinheitmitarbeiter();
if($leg->load($_POST['lehreinheit_id'], $_POST['mitarbeiter_uid']))
{
$vertrag = new vertrag();
$vertrag->delete($leg->vertrag_id);
}
if($leg->delete($_POST['lehreinheit_id'], $_POST['mitarbeiter_uid']))
{
$return = true;
// Wenn ein Vertrag dazu angelegt ist, dann diesen mitloeschen
if($leg->vertrag_id!='')
{
$vertrag = new vertrag();
$vertrag->delete($leg->vertrag_id);
}
if($leg->delete($_POST['lehreinheit_id'], $_POST['mitarbeiter_uid']))
{
$return = true;
}
else
{
$return = false;
$errormsg = $leg->errormsg;
}
}
else
{
$return = false;
$errormsg = $leg->errormsg;
$errormsg='Fehlgeschlagen:'.$leg->errormsg;
}
}
else
{
$return = false;
$errormsg='Fehlgeschlagen:'.$leg->errormsg;
}
}
}
else
{
$return = false;
$errormsg = 'Fehler:'.$qry;
else
{
$return = false;
$errormsg = 'Fehler:'.$qry;
}
}
}
else
@@ -1715,6 +1725,102 @@ if(!$error)
}
}
}
elseif(isset($_POST['type']) && $_POST['type']=='getLastVertragsstatus')
{
if(isset($_POST['vertrag_id']))
{
$vertrag = new vertrag();
if($vertrag->getAllStatus($_POST['vertrag_id']))
{
$vertraege = $vertrag->result;
foreach($vertraege as $vertrag)
{
$data = $vertrag->vertragsstatus_kurzbz;
$return = true;
break; // exit loop because only last (most actual) vertrag item is needed
}
}
else
{
$errormsg = 'Fehler beim Laden des Vertragsstatus';
$return = false;
}
}
else
{
$errormsg = 'VertragsID muss uebergeben werden';
$return = false;
}
}
elseif(isset($_POST['type']) && $_POST['type']=='cancelVertrag')
{
$error = false;
// Check if user is entitled to cancel this contract
if (isset($_POST['vertrag_id']) && is_numeric($_POST['vertrag_id']))
{
// * first find lehrveranstaltung_id of the contracts lehrveranstaltung
$vertrag = new vertrag();
$vertrag->load($_POST['vertrag_id']);
$lva = new lehrveranstaltung($vertrag->lehrveranstaltung_id);
// * then check if the user has permissions to cancel the corresponding lv-organisational units
if (!$rechte->isBerechtigtMultipleOe('admin', $lva->getAllOe(), 'suid') &&
!$rechte->isBerechtigtMultipleOe('lehre/lehrauftrag_bestellen', $lva->getAllOe(), 'suid'))
{
$error = true;
$return = false;
$errormsg = 'Keine Berechtigung';
}
}
if (!$error)
{
if(isset($_POST['mitarbeiter_uid']))
{
$vertrag = new vertrag();
if($vertrag->cancel($_POST['vertrag_id'], $_POST['mitarbeiter_uid']))
{
$return = true;
}
else
{
$errormsg = 'Fehler beim Ausführen des Vertragsstornos';
$return = false;
}
}
elseif(isset($_POST['person_id']))
{
$benutzer = new Benutzer();
if($benutzer->getBenutzerFromPerson($_POST['person_id']))
{
$mitarbeiter_uid = $benutzer->result[0]->uid;
$vertrag = new vertrag();
if($vertrag->cancel($_POST['vertrag_id'], $mitarbeiter_uid))
{
$return = true;
}
else
{
$errormsg = 'Fehler beim Ausführen des Vertragsstornos';
$return = false;
}
}
else
{
$errormsg = 'Benutzer konnte nicht von PersonID geladen werden';
$return = false;
}
}
}
else
{
$errormsg = 'VertragsID und MitarbeiterUID müssen uebergeben werden';
$return = false;
}
}
else
{
$return = false;
@@ -35,6 +35,9 @@ $rechte->getBerechtigungen($user);
echo '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
// Vertragsdetails: Anzeige wird über config Eintrag bestimmt
$is_hidden = (!defined('FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN') || FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN == true) ? 'false' : 'true';
?>
<overlay id="LehrveranstaltungDetailOverlay"
@@ -62,7 +65,7 @@ echo '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
</popupset>
<popupset>
<menupopup id="lehrveranstaltung-lektor-tree-popup">
<menuitem label="Entfernen" oncommand="LeMitarbeiterDel();" />
<menuitem id="lehrveranstaltung-lektor-tree-popup-label" label="Entfernen" oncommand="LeMitarbeiterDel();" />
<?php
if($rechte->isBerechtigt('lv-plan/lektorentfernen'))
{
@@ -429,10 +432,10 @@ echo '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
</vbox>
<vbox>
<hbox>
<vbox>
<groupbox>
<caption label="LektorInnendaten" />
<vbox flex="1">
<vbox flex="1" style="padding: 10px;">
<textbox id="lehrveranstaltung-lehreinheitmitarbeiter-textbox-lehreinheit_id" hidden="true"/>
<textbox id="lehrveranstaltung-lehreinheitmitarbeiter-textbox-mitarbeiter_uid" hidden="true"/>
<grid align="end" flex="1"
@@ -500,9 +503,43 @@ echo '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
</hbox>
</vbox>
</groupbox>
</hbox>
</vbox>
<spacer flex="1" />
<!-- Vertragsdetails: Anzeige wird ueber config Eintrag bestimmt -->
<vbox>
<groupbox id="lehrveranstaltung-lehreinheitmitarbeiter-groupbox-vertragsdetails" hidden="<?php echo $is_hidden ?>">
<caption label="Vertragsdetails" />
<grid style="overflow:auto; padding:10px;" flex="1">
<columns>
<column flex="1"/>
<column flex="1"/>
<column flex="1"/>
</columns>
<rows>
<label id="lehrveranstaltung-lehreinheitmitarbeiter-label-vertrag_id" hidden="true" value=""/>
<row>
<label value="Vertragsstatus:"/>
<label id="lehrveranstaltung-lehreinheitmitarbeiter-label-vertragsstatus" value="" readonly="true" maxlength="8" size="6"/>
<button label="Stornieren" disabled="true" id="lehrveranstaltung-lehreinheitmitarbeiter-button-vertrag-stornieren"
oncommand="VertragStornieren();" flex="1"/>
</row>
<row>
<label value="Vertragsdetails lt. Urfassung" style="margin-bottom: 10px;"/>
</row>
<row>
<label value="Semesterstunden:" class="indent"/>
<label id="lehrveranstaltung-lehreinheitmitarbeiter-label-vertragsstunden" value="" readonly="true"/>
</row>
<row>
<label value="Studiensemester:" class="indent"/>
<label id="lehrveranstaltung-lehreinheitmitarbeiter-label-vertragsstunden_studiensemester_kurzbz" value="" readonly="true"/>
</row>
</rows>
</grid>
</groupbox>
</vbox>
</vbox>
</hbox>
</vbox>
+195 -12
View File
@@ -1131,6 +1131,7 @@ function LeMitarbeiterDel()
req.add('type', 'lehreinheit_mitarbeiter_del');
req.add('lehreinheit_id', lehreinheit_id);
req.add('mitarbeiter_uid', uid);
req.add('vertrag_id', vertrag_id);
var response = req.executePOST();
var val = new ParseReturnValue(response)
@@ -1222,7 +1223,7 @@ function LeMitarbeiterDisableFields(val)
// ****
// * Bei Auswaehlen eines Mitarbeiters werden zu zugehoerigen
// * Details geladen und angezeigt
// * Details sowie ggf. die Vertragsdetails geladen und angezeigt
// ****
function LeMitarbeiterAuswahl()
{
@@ -1308,6 +1309,7 @@ function LeMitarbeiterAuswahl()
faktor = getTargetHelper(dsource, subject, rdfService.GetResource( predicateNS + "#faktor" ));
anmerkung = getTargetHelper(dsource, subject, rdfService.GetResource( predicateNS + "#anmerkung" ));
bismelden = getTargetHelper(dsource, subject, rdfService.GetResource( predicateNS + "#bismelden" ));
vertrag_id = getTargetHelper(dsource, subject, rdfService.GetResource( predicateNS + "#vertrag_id" ));
//Felder aktivieren
LeMitarbeiterDisableFields(false);
@@ -1328,7 +1330,186 @@ function LeMitarbeiterAuswahl()
else
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-checkbox-bismelden').checked=false;
LeMitarbeiterGesamtkosten();
var gesamtkosten = LeMitarbeiterGesamtkosten();
// Prüfe ob Vertragsdetails angezeigt werden
var vertragsdetails_anzeigen = new Boolean(<?php echo (defined('FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN') && FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN) ? 'true' : 'false' ?>);
// Wenn Vertragsdetails angezeigt werden
if (vertragsdetails_anzeigen) {
// Reset attributes
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-label-vertragsstatus').setAttribute("style", "font-weight: normal");
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-button-vertrag-stornieren').setAttribute("tooltiptext",
"Stornieren erst nötig, sobald Lektor einen Vertrag hat. (Ab Status 'Bestellt')");
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-button-vertrag-stornieren').disabled = true;
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-menulist-lektor').disabled = false;
document.getElementById('lehrveranstaltung-lektor-tree-popup-label').disabled = false;
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-textbox-semesterstunden').disabled= false;
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-textbox-stundensatz').disabled= false;
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-textbox-semesterstunden').setAttribute("tooltiptext", "");
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-textbox-stundensatz').setAttribute("tooltiptext", "");
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-menulist-lektor').setAttribute("tooltiptext", "");
document.getElementById('lehrveranstaltung-lektor-tree-popup-label').setAttribute("tooltiptext", "");
// Wenn es einen Vertrag zum Lehrauftrag gibt
if (vertrag_id != null && vertrag_id != '')
{
// Änderung und Entfernen des Lektors disablen
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-menulist-lektor').disabled = true;
document.getElementById('lehrveranstaltung-lektor-tree-popup-label').disabled = true;
// Tooltip für Blockierung von Aenderung und Entfernen des Lektors
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-menulist-lektor').setAttribute("tooltiptext",
"Änderung nur nach Stornierung des Vertrags möglich.");
document.getElementById('lehrveranstaltung-lektor-tree-popup-label').setAttribute("tooltiptext",
"Änderung nur nach Stornierung des Vertrags möglich.");
// Stornieren ermoeglichen und tooltip entfernen
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-button-vertrag-stornieren').disabled = false;
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-button-vertrag-stornieren').setAttribute("tooltiptext", "");
// Url zum RDF
var url = "<?php echo APP_ROOT; ?>rdf/vertrag.rdf.php?"+gettimestamp();
//
////RDF laden
var req = new phpRequest(url, '', '');
req.add('vertrag_id', vertrag_id);
var response = req.execute();
// Trick 17 (sonst gibt's ein Permission denied)
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
// XML in Datasource parsen
var dsource = parseRDFString(response, 'http://www.technikum-wien.at/vertrag/liste');
var rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"].
getService(Components.interfaces.nsIRDFService);
var subject = rdfService.GetResource("http://www.technikum-wien.at/vertrag/" + vertrag_id);
var predicateNS = "http://www.technikum-wien.at/vertrag/rdf";
//Daten holen
betrag = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#betrag" ));
vertragsdatum = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#vertragsdatum" ));
vertragsstunden = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#vertragsstunden" ));
vertragsstunden_studiensemester_kurzbz = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#vertragsstunden_studiensemester_kurzbz" ));
// Letzten (aktuellsten) Vertragsstatus laden
var url_letzterStatus = '<?php echo APP_ROOT ?>content/lvplanung/lehrveranstaltungDBDML.php';
var req_letzterStatus = new phpRequest(url_letzterStatus,'','');
req_letzterStatus.add('type', 'getLastVertragsstatus');
req_letzterStatus.add('vertrag_id', vertrag_id);
var response_letzterStatus = req_letzterStatus.executePOST();
var val_letzterStatus = new ParseReturnValue(response_letzterStatus);
if (!val_letzterStatus.dbdml_return)
{
if(val_letzterStatus.dbdml_errormsg=='')
alert(response_letzterStatus);
else
alert(val_letzterStatus.dbdml_errormsg);
}
else
{
var letzterStatus = val_letzterStatus.dbdml_data;
}
// Vertragsstatus setzen
// * wenn Gesamtkosten im Lehrauftrag nicht gleich Betrag im Vertrag ist ODER
// wenn Semesterstunden im Lehrauftrag nicht gleich Stunden im Vertrag:
// dann: Status 'geändert' hardcoden
if(gesamtkosten != parseFloat(betrag) || semesterstunden != vertragsstunden)
{
vertragsstatus = 'Geändert';
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-label-vertragsstatus').setAttribute("style", "font-weight: bold")
}
// * ansonsten Vertragsstatus zeigen
else
{
vertragsstatus = letzterStatus;
}
// Uppercase status
vertragsstatus = vertragsstatus.charAt(0).toUpperCase() + vertragsstatus.slice(1);
/**
* Stornierung
* Nur wenn Vertragsstatus 'akzeptiert' ist:
* - button Stornierung aktivieren
* - tooltip ausblenden
* - Felder zur Bearbeitung von LektorInnendaten deaktivieren
*/
if(letzterStatus == 'akzeptiert')
{
// Semesterstunden und Stundensatz disablen
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-textbox-semesterstunden').disabled= true;
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-textbox-stundensatz').disabled= true;
// Tooltip für Semesterstunden und Stundensatz
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-textbox-semesterstunden').setAttribute("tooltiptext",
"Änderung nur nach Stornierung des Vertrags möglich.");
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-textbox-stundensatz').setAttribute("tooltiptext",
"Änderung nur nach Stornierung des Vertrags möglich.");
}
}
// Wenn kein Vertrag vorhanden
else {
vertragsstatus = 'Noch kein Vertrag';
vertragsstunden = '-';
vertragsstunden_studiensemester_kurzbz = '-';
}
// Felder befüllen
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-label-vertragsstatus').value = vertragsstatus;
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-label-vertragsstunden').value = vertragsstunden;
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-label-vertragsstunden_studiensemester_kurzbz').value = vertragsstunden_studiensemester_kurzbz;
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-label-vertrag_id').value = vertrag_id;
}
}
// ****
// * Storniert einen Vertrag
// ****
function VertragStornieren(){
var result = confirm("Möchten Sie den Vertrag wirklich stornieren?");
if (result == true) {
var vertrag_id = document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-label-vertrag_id').value;
var mitarbeiter_uid = document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-menulist-lektor').value;
// Vertrag stornieren
var url_storniert = '<?php echo APP_ROOT ?>content/lvplanung/lehrveranstaltungDBDML.php';
var req_storniert = new phpRequest(url_storniert,'','');
req_storniert.add('type', 'cancelVertrag');
req_storniert.add('vertrag_id', vertrag_id);
req_storniert.add('mitarbeiter_uid', mitarbeiter_uid);
var response_storniert = req_storniert.executePOST();
var val_storniert = new ParseReturnValue(response_storniert);
if (!val_storniert.dbdml_return)
{
if(val_storniert.dbdml_errormsg=='')
alert(response_storniert);
else
alert(val_storniert.dbdml_errormsg);
}
else
{
// Reiter wieder aufbauen
LeMitarbeiterAuswahl();
}
}
}
// ****
@@ -2076,22 +2257,22 @@ function LehrveranstaltungNotenAuswahl()
var col = tree.columns ? tree.columns["lehrveranstaltung-noten-tree-studiensemester_kurzbz"] : "lehrveranstaltung-noten-tree-studiensemester_kurzbz";
var studiensemester_kurzbz=tree.view.getCellText(tree.currentIndex,col);
//Daten holen
var url = '<?php echo APP_ROOT ?>rdf/zeugnisnote.rdf.php?lehrveranstaltung_id='+lehrveranstaltung_id+'&uid='+student_uid+'&studiensemester_kurzbz='+studiensemester_kurzbz+'&'+gettimestamp();
var rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"].
getService(Components.interfaces.nsIRDFService);
var rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"].
getService(Components.interfaces.nsIRDFService);
var dsource = rdfService.GetDataSourceBlocking(url);
var subject = rdfService.GetResource("http://www.technikum-wien.at/zeugnisnote/" + lehrveranstaltung_id+'/'+student_uid+'/'+studiensemester_kurzbz);
var subject = rdfService.GetResource("http://www.technikum-wien.at/zeugnisnote/" + lehrveranstaltung_id+'/'+student_uid+'/'+studiensemester_kurzbz);
var predicateNS = "http://www.technikum-wien.at/zeugnisnote/rdf";
var predicateNS = "http://www.technikum-wien.at/zeugnisnote/rdf";
//Daten holen
note = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#note" ));
punkte = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#punkte" ));
//Daten holen
note = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#note" ));
punkte = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#punkte" ));
var url = '<?php echo APP_ROOT ?>rdf/zeugnisnote.rdf.php?lehrveranstaltung_id='+lehrveranstaltung_id+'&uid='+student_uid+'&studiensemester_kurzbz='+studiensemester_kurzbz+'&'+gettimestamp();
if(note=='')
note='9';
@@ -2375,6 +2556,8 @@ function LeMitarbeiterGesamtkosten()
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-label-gesamtkosten').setAttribute("style",'color: red');
else
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-label-gesamtkosten').setAttribute("style",'color: black');
return gesamtkosten;
}
/*
@@ -208,6 +208,8 @@ function MitarbeiterVertragGenerateVertrag(windowdocument)
mitarbeiter_uid = getTreeCellText(tree, "mitarbeiter-vertrag-tree-nichtzugeordnet-mitarbeiter_uid",v);
lehreinheit_id = getTreeCellText(tree, "mitarbeiter-vertrag-tree-nichtzugeordnet-lehreinheit_id",v);
betreuerart_kurzbz = getTreeCellText(tree, "mitarbeiter-vertrag-tree-nichtzugeordnet-betreuerart_kurzbz",v);
vertragsstunden = getTreeCellText(tree, "mitarbeiter-vertrag-tree-nichtzugeordnet-vertragsstunden",v);
vertragsstunden_studiensemester_kurzbz = getTreeCellText(tree, "mitarbeiter-vertrag-tree-nichtzugeordnet-vertragsstunden_studiensemester_kurzbz",v);
req.add('type_'+anzahl, type);
req.add('stsem_'+anzahl, stsem);
@@ -216,6 +218,8 @@ function MitarbeiterVertragGenerateVertrag(windowdocument)
req.add('mitarbeiter_uid_'+anzahl, mitarbeiter_uid);
req.add('lehreinheit_id_'+anzahl, lehreinheit_id);
req.add('betreuerart_kurzbz_'+anzahl, betreuerart_kurzbz);
req.add('vertragsstunden'+anzahl, vertragsstunden);
req.add('vertragsstunden_studiensemester_kurzbz'+anzahl, vertragsstunden_studiensemester_kurzbz);
anzahl++;
}
@@ -85,6 +85,8 @@ function MitarbeiterVertragNeuInit(person_id, vertrag_id)
bezeichnung = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#bezeichnung" ));
anmerkung = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#anmerkung" ));
vertragsdatum = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#vertragsdatum" ));
vertragsstunden = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#vertragsstunden" ));
vertragsstunden_studiensemester_kurzbz = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#vertragsstunden_studiensemester_kurzbz" ));
MitarbeiterVertragNeuBetragOld = betrag;
@@ -94,6 +96,8 @@ function MitarbeiterVertragNeuInit(person_id, vertrag_id)
document.getElementById('mitarbeiter-vertrag-neu-textbox-vertrag_id').value=vertrag_id;
document.getElementById('mitarbeiter-vertrag-neu-textbox-anmerkung').value=anmerkung;
document.getElementById('mitarbeiter-vertrag-neu-box-vertragsdatum').value=vertragsdatum;
document.getElementById('mitarbeiter-vertrag-neu-textbox-vertragsstunden').value = vertragsstunden;
document.getElementById('mitarbeiter-vertrag-neu-textbox-vertragsstunden_studiensemester_kurzbz').value = vertragsstunden_studiensemester_kurzbz;
}
for(i in addon)
@@ -110,8 +110,19 @@ foreach($addon_obj->result as $addon)
sort="rdf:http://www.technikum-wien.at/vertragdetails/rdf#lehreinheit_id" />
<splitter class="tree-splitter"/>
<treecol id="mitarbeiter-vertrag-tree-nichtzugeordnet-betreuerart_kurzbz" label="BetreuerartKurzbz" flex="2" hidden="true"
class="sortDirectionIndicator"
sort="rdf:http://www.technikum-wien.at/vertragdetails/rdf#betreuerart_kurzbz" />
class="sortDirectionIndicator"
sort="rdf:http://www.technikum-wien.at/vertragdetails/rdf#betreuerart_kurzbz"/>
<splitter class="tree-splitter"/>
<treecol id="mitarbeiter-vertrag-tree-nichtzugeordnet-vertragsstunden" label="Vertragsstunden" flex="2"
hidden="true"
class="sortDirectionIndicator"
sort="rdf:http://www.technikum-wien.at/vertragdetails/rdf#vertragsstunden"/>
<splitter class="tree-splitter"/>
<treecol id="mitarbeiter-vertrag-tree-nichtzugeordnet-vertragsstunden_studiensemester_kurzbz"
label="VertragsstundenStudiensemester" flex="2" hidden="true"
class="sortDirectionIndicator"
sort="rdf:http://www.technikum-wien.at/vertragdetails/rdf#vertragsstunden_studiensemester_kurzbz"/>
<splitter class="tree-splitter"/>
</treecols>
<template>
@@ -127,6 +138,8 @@ foreach($addon_obj->result as $addon)
<treecell label="rdf:http://www.technikum-wien.at/vertragdetails/rdf#projektarbeit_id"/>
<treecell label="rdf:http://www.technikum-wien.at/vertragdetails/rdf#lehreinheit_id"/>
<treecell label="rdf:http://www.technikum-wien.at/vertragdetails/rdf#betreuerart_kurzbz"/>
<treecell label="rdf:http://www.technikum-wien.at/vertragdetails/rdf#vertragsstunden"/>
<treecell label="rdf:http://www.technikum-wien.at/vertragdetails/rdf#vertragsstunden_studiensemester_kurzbz"/>
</treerow>
</treeitem>
</treechildren>
@@ -181,6 +194,28 @@ foreach($addon_obj->result as $addon)
<spacer />
</hbox>
</row>
<?php if (!empty($vertrag_id))
{
echo '
<row>
<label value="Stunden (Vertrags-Urfassung)" control="mitarbeiter-vertrag-neu-textbox-vertragsstunden"/>
<hbox>
<textbox id="mitarbeiter-vertrag-neu-textbox-vertragsstunden" value="" disabled = "true" size="10"/>
<spacer/>
</hbox>
</row>
<row>
<label value="Studiensemester (Vertrags-Urfassung)"
control="mitarbeiter-vertrag-neu-textbox-vertragsstunden_studiensemester_kurzbz"/>
<hbox>
<textbox id="mitarbeiter-vertrag-neu-textbox-vertragsstunden_studiensemester_kurzbz"
value="" disabled = "true" size="10" />
<spacer/>
</hbox>
</row>
';
}
?>
<row>
<label value="Anmerkung" control="mitarbeiter-vertrag-neu-textbox-anmerkung" />
<textbox id="mitarbeiter-vertrag-neu-textbox-anmerkung" value="" size="100" multiline="true"/>
@@ -117,6 +117,14 @@ echo '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
class="sortDirectionIndicator"
sort="rdf:http://www.technikum-wien.at/vertrag/rdf#vertragsdatum_iso" />
<splitter class="tree-splitter"/>
<treecol id="mitarbeiter-vertrag-tree-vertragsstunden" label="Vertragsstunden" flex="2" hidden="true"
class="sortDirectionIndicator"
sort="rdf:http://www.technikum-wien.at/vertrag/rdf#vertragsstunden" />
<splitter class="tree-splitter"/>
<treecol id="mitarbeiter-vertrag-tree-vertragsstunden_studiensemester_kurzbz" label="VertragsstundenStudiensemester" flex="2" hidden="true"
class="sortDirectionIndicator"
sort="rdf:http://www.technikum-wien.at/vertrag/rdf#vertragsstunden_studiensemester_kurzbz" />
<splitter class="tree-splitter"/>
</treecols>
<template>
@@ -131,6 +139,8 @@ echo '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
<treecell label="rdf:http://www.technikum-wien.at/vertrag/rdf#vertragstyp_kurzbz"/>
<treecell label="rdf:http://www.technikum-wien.at/vertrag/rdf#vertrag_id"/>
<treecell label="rdf:http://www.technikum-wien.at/vertrag/rdf#vertragsdatum_iso"/>
<treecell label="rdf:http://www.technikum-wien.at/vertrag/rdf#vertragsstunden"/>
<treecell label="rdf:http://www.technikum-wien.at/vertrag/rdf#vertragsstunden_studiensemester_kurzbz"/>
</treerow>
</treeitem>
</treechildren>
+2
View File
@@ -107,6 +107,7 @@ $qry = "SELECT
vw_student_lehrveranstaltung.studiensemester_kurzbz=tbl_studentlehrverband.studiensemester_kurzbz
)
AND studiengang_kz<>0
AND zeugnis
UNION
SELECT
lehrveranstaltung_id, bezeichnung, studiengang_kz, semester, ects
@@ -114,6 +115,7 @@ $qry = "SELECT
lehre.tbl_lehrveranstaltung JOIN lehre.tbl_zeugnisnote USING(lehrveranstaltung_id)
WHERE
tbl_lehrveranstaltung.studiengang_kz=".$db->db_add_param($studiengang_kz, FHC_INTEGER)." AND
zeugnis AND
tbl_zeugnisnote.student_uid in($uids) AND
tbl_zeugnisnote.studiensemester_kurzbz=".$db->db_add_param($semester_aktuell)."
ORDER BY bezeichnung";
+4 -2
View File
@@ -109,6 +109,7 @@ $qry = "SELECT
vw_student_lehrveranstaltung.studiensemester_kurzbz=tbl_studentlehrverband.studiensemester_kurzbz
)
AND studiengang_kz<>0
AND zeugnis
UNION
SELECT
lehrveranstaltung_id, bezeichnung, studiengang_kz, semester, ects
@@ -117,7 +118,8 @@ $qry = "SELECT
WHERE
tbl_lehrveranstaltung.studiengang_kz=".$db->db_add_param($studiengang_kz, FHC_INTEGER)." AND
tbl_zeugnisnote.student_uid in($uids) AND
tbl_zeugnisnote.studiensemester_kurzbz=".$db->db_add_param($semester_aktuell)."
tbl_zeugnisnote.studiensemester_kurzbz=".$db->db_add_param($semester_aktuell)." AND
zeugnis
ORDER BY bezeichnung";
if (!$result_lva = $db->db_query($qry))
@@ -152,7 +154,7 @@ $nulltermine = array_filter($termine, function ($termin)
});
//keine Werte in sort Spalte - es wird versucht, Reihenfolge aufgrund Strings zu bestimmen
//zuerst Termine 1 - n, dann kommissionelle und zusätzliche kommissionelle
//zuerst Termine 1 bis n, dann kommissionelle und zusätzliche kommissionelle
$max = 0;
foreach ($nulltermine as $termin)
{
+27 -16
View File
@@ -524,7 +524,16 @@ if(!$error)
$prestudent->studiengang_kz = $_POST['studiengang_kz'];
$prestudent->berufstaetigkeit_code = $_POST['berufstaetigkeit_code'];
$prestudent->ausbildungcode = $_POST['ausbildungcode'];
$prestudent->zgv_code = $_POST['zgv_code'];
// Die Bachelor-ZGV darf nur mit einem eigenen Recht geändert werden
if($rechte->isBerechtigt('student/editBakkZgv',$_POST['studiengang_kz'],'suid'))
{
$prestudent->zgv_code = $_POST['zgv_code'];
}
elseif ($prestudent->zgv_code != $_POST['zgv_code'])
{
$errormsg = 'Keine Berechtigung zum Ändern der ZGV';
$error = true;
}
$prestudent->zgvort = $_POST['zgvort'];
$prestudent->zgvdatum = $_POST['zgvdatum'];
$prestudent->zgvnation = $_POST['zgvnation'];
@@ -4031,25 +4040,27 @@ if(!$error)
}
else
{
//Loescht einen Projektbetreuer Eintrag
if(isset($_POST['person_id']) && is_numeric($_POST['person_id']))
// Wenn der Projektbetreuer schon einen Vertrag hat, wird das Loeschen verhindert
if (isset($_POST['vertrag_id']) && is_numeric($_POST['vertrag_id']))
{
$projektbetreuer = new projektbetreuer();
if($projektbetreuer->delete($_POST['person_id'], $_POST['projektarbeit_id'], $_POST['betreuerart_kurzbz']))
{
$return = true;
}
else
{
$errormsg = $projektbetreuer->errormsg;
$return = false;
}
$return = false;
$errormsg = 'Löschen nur nach Stornierung des Vertrags möglich.';
}
else
{
$return = false;
$errormsg = 'Fehlerhafte Parameteruebergabe';
//Loescht einen Projektbetreuer Eintrag
if (isset($_POST['person_id']) && is_numeric($_POST['person_id'])) {
$projektbetreuer = new projektbetreuer();
if ($projektbetreuer->delete($_POST['person_id'], $_POST['projektarbeit_id'], $_POST['betreuerart_kurzbz'])) {
$return = true;
} else {
$errormsg = $projektbetreuer->errormsg;
$return = false;
}
} else {
$return = false;
$errormsg = 'Fehlerhafte Parameteruebergabe';
}
}
}
}
+24 -1
View File
@@ -23,6 +23,7 @@
require_once('../../config/vilesci.config.inc.php');
require_once('../../include/functions.inc.php');
require_once('../../include/variable.class.php');
require_once('../../include/benutzerberechtigung.class.php');
$user = get_uid();
@@ -1647,7 +1648,6 @@ function StudentPrestudentDisableFields(val)
document.getElementById('student-prestudent-menulist-aufmerksamdurch').disabled=val;
document.getElementById('student-prestudent-menulist-berufstaetigkeit').disabled=val;
document.getElementById('student-prestudent-menulist-ausbildung').disabled=val;
document.getElementById('student-prestudent-menulist-zgvcode').disabled=val;
document.getElementById('student-prestudent-textbox-zgvort').disabled=val;
document.getElementById('student-prestudent-menulist-zgvnation').disabled=val;
document.getElementById('student-prestudent-textbox-zgvdatum').disabled=val;
@@ -1665,6 +1665,29 @@ function StudentPrestudentDisableFields(val)
document.getElementById('student-prestudent-textbox-mentor').disabled=val;
document.getElementById('student-detail-menulist-gsstudientyp').disabled=val;
// Studiengang des angeklickten Prestudenten ermitteln
var tree = document.getElementById('student-tree');
var col = tree.columns ? tree.columns["student-treecol-studiengang_kz"] : "student-treecol-studiengang_kz";
var studiengang_kz = parseInt(tree.view.getCellText(tree.currentIndex,col));
<?php
// Die Bachelor-ZGV darf nur mit einem eigenen Recht geändert werden
$rechte = new benutzerberechtigung();
$rechte->getBerechtigungen($user);
$studiengaenge = $rechte->getStgKz('student/editBakkZgv');
// Anlegen eines Arrays mit allen berechtigten Stg-Kz
echo ' var berechtigte_studiengaenge = ['.implode(',',$studiengaenge).'];';
?>
if (berechtigte_studiengaenge.indexOf(studiengang_kz) >= 0)
{
document.getElementById('student-prestudent-menulist-zgvcode').disabled=val;
}
else
{
document.getElementById('student-prestudent-menulist-zgvcode').disabled=true;
}
//Status Tree leeren
rollentree = document.getElementById('student-prestudent-tree-rolle');
File diff suppressed because it is too large Load Diff
@@ -26,8 +26,12 @@ header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Pragma: no-cache");
header("Content-type: application/vnd.mozilla.xul+xml");
require_once('../../config/vilesci.config.inc.php');
require_once('../../config/global.config.inc.php');
echo '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
// Vertragsdetails: Anzeige wird über config Eintrag bestimmt
$is_hidden = (!defined('FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN') || FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN == true) ? 'false' : 'true';
?>
<overlay id="StudentProjektarbeitOverlay"
@@ -383,6 +387,10 @@ echo '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
class="sortDirectionIndicator"
sort="rdf:http://www.technikum-wien.at/projektbetreuer/rdf#projektarbeit_id" />
<splitter class="tree-splitter"/>
<treecol id="student-projektbetreuer-tree-vertrag_id" label="VertragID" flex="2" hidden="true"
class="sortDirectionIndicator"
sort="rdf:http://www.technikum-wien.at/projektbetreuer/rdf#vertrag_id" />
<splitter class="tree-splitter"/>
</treecols>
<template>
@@ -400,6 +408,7 @@ echo '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
<treecell label="rdf:http://www.technikum-wien.at/projektbetreuer/rdf#betreuerart_kurzbz"/>
<treecell label="rdf:http://www.technikum-wien.at/projektbetreuer/rdf#person_id"/>
<treecell label="rdf:http://www.technikum-wien.at/projektbetreuer/rdf#projektarbeit_id"/>
<treecell label="rdf:http://www.technikum-wien.at/projektbetreuer/rdf#vertrag_id"/>
</treerow>
</treeitem>
</treechildren>
@@ -433,7 +442,7 @@ echo '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
oncommand="StudentProjektbetreuerLoadMitarbeiterDaten()">
<template>
<menupopup>
<menuitem value="rdf:http://www.technikum-wien.at/person/rdf#person_id"
<menuitem id="student-projektbetreuer-test" value="rdf:http://www.technikum-wien.at/person/rdf#person_id"
label="rdf:http://www.technikum-wien.at/person/rdf#anzeigename ( rdf:http://www.technikum-wien.at/person/rdf#status )"
uri="rdf:*"/>
</menupopup>
@@ -508,6 +517,40 @@ echo '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
</rows>
</grid>
</groupbox>
<!-- Vertragsdetails: Anzeige wird ueber config Eintrag bestimmt -->
<vbox>
<groupbox id="student-projektbetreuer-groupbox-vertragsdetails" hidden="<?php echo $is_hidden ?>">
<caption label="Vertragsdetails" />
<grid style="overflow:auto; padding:10px;" flex="1">
<columns>
<column flex="1"/>
<column flex="1"/>
<column flex="1"/>
</columns>
<rows>
<label id="student-projektbetreuer-label-vertrag_id" hidden="true" value=""/>
<row>
<label value="Vertragsstatus:"/>
<label id="student-projektbetreuer-label-vertragsstatus" value="" readonly="true" maxlength="8" size="6"/>
<button label="Stornieren" disabled="true" id="student-projektbetreuer-button-vertrag-stornieren"
oncommand="StudentProjektbetreuerVertragStornieren();" flex="1"/>
</row>
<row>
<label value="Vertragsdetails lt. Urfassung" style="margin-bottom: 10px;"/>
</row>
<row>
<label value="Semesterstunden:" class="indent"/>
<label id="student-projektbetreuer-label-vertragsstunden" value="" readonly="true"/>
</row>
<row>
<label value="Studiensemester:" class="indent"/>
<label id="student-projektbetreuer-label-vertragsstunden_studiensemester_kurzbz" value="" readonly="true"/>
</row>
</rows>
</grid>
</groupbox>
</vbox>
</hbox>
<spacer flex="1" />
+58
View File
@@ -349,6 +349,64 @@ class bisio extends basis_db
}
}
/**
* Liefert alle Incoming/Outgoing
* Eintraege eines Studenten, die
* innerhalb des gewuenschten
* Zeitraums beginnen
* @param $uid
* @param $von
* @param $bis
* @return true wenn ok, false wenn fehler
*/
public function getIOForPeriod($uid, $von, $bis)
{
$qry = "SELECT tbl_bisio.*,
tbl_mobilitaetsprogramm.kurzbz as mobilitaetsprogramm_kurzbz
FROM
bis.tbl_bisio,
bis.tbl_mobilitaetsprogramm
WHERE
student_uid=".$this->db_add_param($uid)." AND
tbl_mobilitaetsprogramm.mobilitaetsprogramm_code=tbl_bisio.mobilitaetsprogramm_code AND
tbl_bisio.von BETWEEN ".$this->db_add_param($von)." AND ".$this->db_add_param($bis)."
ORDER BY bis;";
if ($this->db_query($qry))
{
while ($row = $this->db_fetch_object())
{
$io = new bisio();
$io->bisio_id = $row->bisio_id;
$io->mobilitaetsprogramm_code = $row->mobilitaetsprogramm_code;
$io->mobilitaetsprogramm_kurzbz = $row->mobilitaetsprogramm_kurzbz;
$io->nation_code = $row->nation_code;
$io->von = $row->von;
$io->bis = $row->bis;
$io->student_uid = $row->student_uid;
$io->updateamum = $row->updateamum;
$io->updatevon = $row->updatevon;
$io->insertamum = $row->insertamum;
$io->insertvon = $row->insertvon;
$io->ext_id = $row->ext_id;
$io->ort = $row->ort;
$io->universitaet = $row->universitaet;
$io->lehreinheit_id = $row->lehreinheit_id;
$io->ects_angerechnet = $row->ects_angerechnet;
$io->ects_erworben = $row->ects_erworben;
$this->result[] = $io;
}
return true;
}
else
{
$this->errormsg = 'Fehler beim Laden der Daten';
return false;
}
}
/**
* Laedt alle Foerderungen
*/
+1 -1
View File
@@ -400,7 +400,7 @@ class frage extends basis_db
$this->text = $row->text;
$this->bild = $row->bild;
$this->audio = $row->audio;
$this->insertaum = $row->insertamum;
$this->insertamum = $row->insertamum;
$this->insertvon = $row->insertvon;
$this->updateamum = $row->updateamum;
$this->updatevon = $row->updatevon;
+1
View File
@@ -146,6 +146,7 @@ class lehreinheitmitarbeiter extends basis_db
$obj->insertamum = $row->insertamum;
$obj->insertvon = $row->insertvon;
$obj->ext_id = $row->ext_id;
$obj->vertrag_id = $row->vertrag_id;
$this->lehreinheitmitarbeiter[] = $obj;
}
+28 -30
View File
@@ -1118,17 +1118,17 @@ class mitarbeiter extends benutzer
$oe.=$this->db_add_param($row->oe_kurzbz);
}
}
// Kinder-Organisationseinheiten holen
if ($include_OE_childs == true)
{
if (!empty($oe))
{
$child_oe_arr = array(); // array of string child oes
$qry = '
WITH RECURSIVE
oes (oe_kurzbz, oe_parent_kurzbz) AS
WITH RECURSIVE
oes (oe_kurzbz, oe_parent_kurzbz) AS
(
SELECT
oe_kurzbz,
@@ -1140,11 +1140,11 @@ class mitarbeiter extends benutzer
UNION ALL
SELECT
SELECT
o.oe_kurzbz,
o.oe_parent_kurzbz
FROM
public.tbl_organisationseinheit o, oes
public.tbl_organisationseinheit o, oes
WHERE
o.oe_parent_kurzbz = oes.oe_kurzbz
)
@@ -1156,39 +1156,39 @@ class mitarbeiter extends benutzer
oe_kurzbz';
if($this->db_query($qry))
{
{
while($row = $this->db_fetch_object())
{
$child_oe_arr []= $this->db_add_param($row->oe_kurzbz);
}
}
// eliminate duplicates
$child_oe_arr = array_unique($child_oe_arr);
// check if leader has child oes by comparing the original
// string of oes with string of child oes.
if ($oe == implode(',', $child_oe_arr))
{
$this->result ['isIndirectSupervisor']= false;
}
}
else
{
$this->result ['isIndirectSupervisor']= true;
}
// overwrite $oe with child oes for further query
$oe = implode(',', $child_oe_arr);
}
}
}
//Alle Personen holen die dieser Organisationseinheit untergeordnet sind
$qry = "
SELECT distinct
uid
FROM
public.tbl_benutzerfunktion
SELECT distinct
uid
FROM
public.tbl_benutzerfunktion
JOIN
public.tbl_benutzer
USING (uid)
@@ -1199,12 +1199,9 @@ class mitarbeiter extends benutzer
$qry.=")) ";
if($oe!='')
$qry.=" OR (funktion_kurzbz='ass' AND oe_kurzbz in($oe))";
$qry.= ")
AND
(tbl_benutzerfunktion.datum_von is null OR tbl_benutzerfunktion.datum_von<=now())
$qry.= ")
AND
(tbl_benutzerfunktion.datum_von is null OR tbl_benutzerfunktion.datum_von<=now())
AND
(tbl_benutzerfunktion.datum_bis is null OR tbl_benutzerfunktion.datum_bis>=now())
AND
@@ -1326,6 +1323,7 @@ class mitarbeiter extends benutzer
$l->gebort=$row->gebort;
$l->gebzeit=$row->gebzeit;
$l->geschlecht=$row->geschlecht;
$l->staatsbuergerschaft=$row->staatsbuergerschaft;
//$l->foto=$row->foto;
$l->anmerkung=$row->anmerkung;
$l->aktiv= $this->db_parse_bool($row->aktiv);
@@ -1491,15 +1489,15 @@ class mitarbeiter extends benutzer
return false;
}
}
/** Check if uid is a supervisor
*
*
* @param string $uid
* @param string $employee_uid
* @return boolean True if $uid is direct leader of $employee_uid.
*/
function check_isVorgesetzter($uid, $employee_uid)
{
{
$this->getUntergebene($uid);
$untergebenen_arr = $this->untergebene;
@@ -1515,14 +1513,14 @@ class mitarbeiter extends benutzer
}
}
/** Check if uid is a supervisor on higher oe level
*
*
* @param string $uid
* @param string $employee_uid
* @return boolean True if $uid is indirect supervisor (leader on higher oe-level)
* of $employee_uid.
* :NOTE: as all children oes also include the direct oe, the return value is also true when
* of $employee_uid.
* :NOTE: as all children oes also include the direct oe, the return value is also true when
* uid is ONLY direct leader. To distinguish you might check in the calling script:
* isVorgesetzter_indirekt && isVorgesetzter --> direct leader
* isVorgesetzter_indirekt && isVorgesetzter --> direct leader
* isVorgesetzter_indirekt && !isVorgesetzter --> only super leader on higher level
*/
function check_isVorgesetzter_indirekt($uid, $employee_uid)
+15 -4
View File
@@ -514,6 +514,13 @@ class statistik extends basis_db
if($this->sql!='')
{
$sql = $this->sql;
// Wenn im SQL ein $user vorkommt wird das durch den eingeloggten User ersetzt
if(strpos($sql, '$user')!==false)
{
$uid = get_uid();
$sql = str_replace('$user',$this->db_add_param($uid),$sql);
}
foreach($_REQUEST as $name=>$value)
{
if (is_array($value))
@@ -615,11 +622,15 @@ class statistik extends basis_db
$check = '/\$[0-9A-z]+/';
preg_match_all($check, $value, $result);
$result = $result[0];
$vars = array();
for($i=0;$i<count($result);$i++)
{
$result[$i] = mb_str_replace('$','',$result[$i]);
// $user wird automatisch ersetzt und daher auch nicht geliefert
if($result[$i]!='$user')
{
$vars[$i] = mb_str_replace('$','',$result[$i]);
}
}
return array_unique($result);
return array_unique($vars);
}
}
}
+48 -3
View File
@@ -19,6 +19,7 @@
* Andreas Österreicher <andreas.oesterreicher@technikum-wien.at>
*/
require_once(dirname(__FILE__).'/basis_db.class.php');
require_once(dirname(__FILE__).'/functions.inc.php');
class vertrag extends basis_db
{
@@ -65,6 +66,8 @@ class vertrag extends basis_db
$this->anmerkung = $row->anmerkung;
$this->vertragsdatum = $row->vertragsdatum;
$this->lehrveranstaltung_id = $row->lehrveranstaltung_id;
$this->vertragsstunden = $row->vertragsstunden;
$this->vertragsstunden_studiensemester_kurzbz = $row->vertragsstunden_studiensemester_kurzbz;
$this->new=false;
@@ -142,6 +145,8 @@ class vertrag extends basis_db
$obj->anmerkung = $row->anmerkung;
$obj->vertragsdatum = $row->vertragsdatum;
$obj->lehrveranstaltung_id = $row->lehrveranstaltung_id;
$obj->vertragsstunden = $row->vertragsstunden;
$obj->vertragsstunden_studiensemester_kurzbz = $row->vertragsstunden_studiensemester_kurzbz;
$obj->vertragstyp_bezeichnung = $row->vertragstyp_bezeichnung;
@@ -375,7 +380,7 @@ class vertrag extends basis_db
JOIN lehre.tbl_projektarbeit USING(projektarbeit_id)
JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
WHERE
person_id=".$this->db_add_param($person_id, FHC_INTEGER)."
tbl_projektbetreuer.person_id=".$this->db_add_param($person_id, FHC_INTEGER)."
AND vertrag_id IS NULL";
/*
UNION
@@ -518,10 +523,13 @@ class vertrag extends basis_db
JOIN public.tbl_studiengang USING(studiengang_kz)
WHERE
lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id)
as bezeichnung
as bezeichnung,
vertragsstunden,
vertragsstunden_studiensemester_kurzbz
FROM
lehre.tbl_lehreinheitmitarbeiter
JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
JOIN lehre.tbl_vertrag USING (vertrag_id)
WHERE
vertrag_id=".$this->db_add_param($vertrag_id, FHC_INTEGER)."
UNION
@@ -535,11 +543,14 @@ class vertrag extends basis_db
tbl_lehreinheit.studiensemester_kurzbz,
tbl_projektbetreuer.betreuerart_kurzbz,
(SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid)
as bezeichnung
as bezeichnung,
vertragsstunden,
vertragsstunden_studiensemester_kurzbz
FROM
lehre.tbl_projektbetreuer
JOIN lehre.tbl_projektarbeit USING(projektarbeit_id)
JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
JOIN lehre.tbl_vertrag USING (vertrag_id)
WHERE
vertrag_id=".$this->db_add_param($vertrag_id, FHC_INTEGER).";";
/* UNION
@@ -580,6 +591,8 @@ class vertrag extends basis_db
$obj->studiensemester_kurzbz = $row->studiensemester_kurzbz;
$obj->betreuerart_kurzbz = $row->betreuerart_kurzbz;
$obj->bezeichnung = $row->bezeichnung;
$obj->vertragsstunden = $row->vertragsstunden;
$obj->vertragsstunden_studiensemester_kurzbz = $row->vertragsstunden_studiensemester_kurzbz;
$this->result[] = $obj;
}
return true;
@@ -1016,6 +1029,38 @@ class vertrag extends basis_db
}
}
/**
* Storniert einen Vertrag und seine Verbindungen
* @param $vertrag_id ID des Vertrags
* @param $mitarbeiter_uid
*/
public function cancel($vertrag_id, $mitarbeiter_uid)
{
$insertvon = get_uid();
$qry = "
UPDATE lehre.tbl_lehreinheitmitarbeiter SET vertrag_id=null WHERE vertrag_id=".$this->db_add_param($vertrag_id, FHC_INTEGER).";
UPDATE lehre.tbl_projektbetreuer SET vertrag_id=null WHERE vertrag_id=".$this->db_add_param($vertrag_id, FHC_INTEGER).";
INSERT INTO lehre.tbl_vertrag_vertragsstatus(vertragsstatus_kurzbz, vertrag_id, uid, datum, insertamum, insertvon)
VALUES(".
$this->db_qoute('storno'). ", ".
$this->db_add_param($vertrag_id, FHC_INTEGER). ", ".
$this->db_add_param($mitarbeiter_uid). ", ".
$this->db_qoute('NOW()'). ", ".
$this->db_qoute('NOW()'). ", ".
$this->db_qoute($insertvon). "
);
";
if($this->db_query($qry))
return true;
else
{
$this->errormsg = 'Fehler beim Stornieren des Vertrags';
return false;
}
}
/**
* Liefert alle Vertraege bei denen die Lehraufträge nicht zur Person passen.
* (zB Aufgrund Lektorenaenderung)
+1
View File
@@ -299,6 +299,7 @@ class vorschlag extends basis_db
$vs->frage_id = $row->frage_id;
$vs->nummer = $row->nummer;
$vs->punkte = $row->punkte;
$vs->aktiv = $this->db_parse_bool($row->aktiv);
$qry = "SELECT * FROM testtool.tbl_vorschlag_sprache
WHERE vorschlag_id=".$this->db_add_param($row->vorschlag_id, FHC_INTEGER)." AND sprache=".$this->db_add_param($sprache).";";
if($this->db_query($qry))
+16 -5
View File
@@ -172,17 +172,28 @@ class zeitaufzeichnung extends basis_db
}
}
}
if ($this->aktivitaet_kurzbz != 'Ersatzruhe')
if ($this->aktivitaet_kurzbz != 'Ersatzruhe' && $this->aktivitaet_kurzbz != 'DienstreiseMT')
{
$check_qry = "SELECT count(*) from campus.tbl_zeitaufzeichnung where uid=".$this->db_add_param($this->uid)." and aktivitaet_kurzbz = 'Ersatzruhe' and (start < ".$this->db_add_param($this->ende)." and ende > ".$this->db_add_param($this->start).")";
$check_qry = "SELECT count(*) from campus.tbl_zeitaufzeichnung where uid=".$this->db_add_param($this->uid)." and aktivitaet_kurzbz != 'DienstreiseMT' and (start < ".$this->db_add_param($this->ende)." and ende > ".$this->db_add_param($this->start).")";
if($this->db_query($check_qry))
{
if($row = $this->db_fetch_object())
{
if ($row->count)
if ($this->new)
{
$this->errormsg = 'Eintrag darf nicht mit Ersatzruhe Überlappen!';
return false;
if ($row->count)
{
$this->errormsg = 'Einträge dürfen nicht Überlappen!';
return false;
}
}
else
{
if ($row->count > 1)
{
$this->errormsg = 'Einträge dürfen nicht Überlappen!';
return false;
}
}
}
}
+102 -101
View File
@@ -1,102 +1,103 @@
<?php
$this->phrasen['lvplan/lehrveranstaltungsplan']='Lehrveranstaltungsplan';
$this->phrasen['lvplan/persoenlicherLvPlan']='Mein persönlicher Lehrveranstaltungsplan';
$this->phrasen['lvplan/stammdatenKontrollieren']='Hier können Sie Ihre Stammdaten kontrollieren';
$this->phrasen['lvplan/profil']='PROFIL';
$this->phrasen['lvplan/saalplan']='Saalplan';
$this->phrasen['lvplan/lektorenplan']='LektorInnenplan';
$this->phrasen['lvplan/saalreservierung']='Saalreservierung';
$this->phrasen['lvplan/saal']='Saal';
$this->phrasen['lvplan/lektor']='LektorIn';
$this->phrasen['lvplan/reservierungsliste']='Reservierungsliste';
$this->phrasen['lvplan/reservierungenLoeschen']='Reservierungen löschen';
$this->phrasen['lvplan/meineReservierungenAnzeigen']='Meine Reservierungen anzeigen';
$this->phrasen['lvplan/raumsuche']='Raumsuche';
$this->phrasen['lvplan/lehrverband']='Lehr-Verband';
$this->phrasen['lvplan/stg']='Stg';
$this->phrasen['lvplan/sem']='Sem';
$this->phrasen['lvplan/ver']='Ver';
$this->phrasen['lvplan/grp']='Grp';
$this->phrasen['lvplan/lehrverbaende']='Lehrverbände';
$this->phrasen['lvplan/uebersichtDerLehrverbaende']='Übersicht der Lehrverbände';
$this->phrasen['lvplan/fehlerUndFeedback']='Feedback geben';
$this->phrasen['lvplan/lvKoordinationsstelle']='LV-Koordinationsstelle';
$this->phrasen['lvplan/reservierungen']='Reservierungen';
$this->phrasen['lvplan/reservierungWurdeGeloescht']='Reservierung wurde geloescht';
$this->phrasen['lvplan/alleReservierungen']='Alle Reservierungen';
$this->phrasen['lvplan/zurReservierung']='Zur Reservierung';
$this->phrasen['lvplan/raum']='Raum';
$this->phrasen['lvplan/raeume']='Räume';
$this->phrasen['lvplan/raumtyp']='Raumtyp';
$this->phrasen['lvplan/anzahlPersonen']='Anzahl Personen';
$this->phrasen['lvplan/datumAngeben']='Es muss ein Datum angegeben werden';
$this->phrasen['lvplan/vonZeitEingeben']='VON-Zeit muss eingegeben werden';
$this->phrasen['lvplan/bisZeitEingeben']='BIS-Zeit muss eingegeben werden';
$this->phrasen['lvplan/datumUngueltig']='Das angegebene Datum ist ungueltig! Bitte geben Sie das Datum im Format dd.mm.YYYY (31.12.2011) ein';
$this->phrasen['lvplan/rauminfoAnzeigen']='Rauminfo anzeigen';
$this->phrasen['lvplan/vonZeitFormat']='VON-Zeit muss im Format hh:mm (12:30) angegeben werden';
$this->phrasen['lvplan/bisZeitFormat']='BIS-Zeit muss im Format hh:mm (12:30) angegeben werden';
$this->phrasen['lvplan/eigeneReservierungen']='Eigene Reservierungen';
$this->phrasen['lvplan/wochenplan']='Wochenplan';
$this->phrasen['lvplan/raumExistiertNicht']='Dieser Ort existiert nicht';
$this->phrasen['lvplan/titelUndBeschreibungFehlt']='Eingabe Titel und Beschreibung fehlt';
$this->phrasen['lvplan/titelFehlt']='Eingabe Titel fehlt';
$this->phrasen['lvplan/beschreibungFehlt']='Eingabe Beschreibung fehlt';
$this->phrasen['lvplan/bereitsReserviert']='bereits reserviert';
$this->phrasen['lvplan/spezialgruppe']='Spezialgruppe';
$this->phrasen['lvplan/datumsbereichZuGross'] = 'Datumsbereich ist zu groß';
$this->phrasen['lvplan/springeZuKw']='Springe zu KW';
$this->phrasen['lvplan/home']='HOME';
$this->phrasen['lvplan/nichtVorhanden']='nicht vorhanden.';
$this->phrasen['lvplan/bitteWendenSieSichAn']='Bitte wenden Sie sich an den';
$this->phrasen['lvplan/semesterIstUngueltig']='Semester ist ungültig';
$this->phrasen['lvplan/stundeIstUngueltig']='Stunde ist ungültig';
$this->phrasen['lvplan/datumIstUngueltig']='Datum ist ungueltig';
$this->phrasen['lvplan/einheit']='Einheit';
$this->phrasen['lvplan/info']='Info';
$this->phrasen['lvplan/unr']='UNr';
$this->phrasen['lvplan/ort']='Ort';
$this->phrasen['lvplan/lehrveranstaltungsplanDetails']='Lehrveranstaltungsplan Details';
$this->phrasen['lvplan/studierende']='Studierende';
$this->phrasen['lvplan/uebersicht']='Übersicht';
$this->phrasen['lvplan/vierWochenZurueck']='4 Wochen zurückblättern';
$this->phrasen['lvplan/eineWocheZurueck']='Eine Woche zurückblättern';
$this->phrasen['lvplan/eineWocheVor']='Eine Woche vorblättern';
$this->phrasen['lvplan/vierWochenVor']='4 Wochen vorblättern';
$this->phrasen['lvplan/lvPlan']='LV-Plan';
$this->phrasen['lvplan/lektorInStudentIn']='LektorIn / StudentIn';
$this->phrasen['lvplan/studiengangAuswaehlen']='...Studiengang auswählen...';
$this->phrasen['lvplan/raumAuswaehlen']='...Raum auswählen...';
$this->phrasen['lvplan/studiensemesterAuswaehlen']='...Studiensemester auswählen...';
$this->phrasen['lvplan/semesterplaenearchiv']='Semesterpläne Archiv';
$this->phrasen['lvplan/semesterplanLaden']='Semesterplan laden';
$this->phrasen['lvplan/bitteEinenStudiengangAuswaehlen']='Bitte einen Studiengang auswählen';
$this->phrasen['lvplan/bitteEinStudiensemesterAuswaehlen']='Bitte ein Studiensemester auswählen';
$this->phrasen['lvplan/bitteEinenLektorAuswaehlen']='Bitte eineN LektorIn/StudentIn auswählen';
$this->phrasen['lvplan/semesterplaene']='Semesterübersicht';
$this->phrasen['lvplan/hauptmenue']='Hauptmenü';
$this->phrasen['lvplan/nameEingeben']='Name eingeben';
$this->phrasen['lvplan/anleitungLVPlanSync']='Anleitung LV-Plan Synchronisation';
$this->phrasen['lvplan/caldavURL']='CalDAV URL (Android, Thunderbird, CalDAV-Synchronizer)';
$this->phrasen['lvplan/caldavURLMac']='CalDAV Principal URL (MacOS, iOS)';
$this->phrasen['lvplan/googleURL']='iCAL URL (Google)';
$this->phrasen['lvplan/persoenlichenAbonnieren']='Persönlichen LV-Plan abonnieren';
$this->phrasen['lvplan/aktuelleKW']='Aktuelle Kalenderwoche';
$this->phrasen['lvplan/rauminformationenAnzeigen']='Rauminformationen anzeigen';
$this->phrasen['lvplan/personen']='Personen';
$this->phrasen['lvplan/alleRaeume']='Alle Räume';
$this->phrasen['lvplan/raumreservierungAufZeitraumEingeschraenkt']='Die Raumreservierung ist auf den Zeitraum vom %s bis %s eingeschränkt';
$this->phrasen['lvplan/neueStunden']='Neue Stunden';
$this->phrasen['lvplan/stdBeginn']='Std (Beginnzeit)';
$this->phrasen['lvplan/lehrfach']='Lehrfach';
$this->phrasen['lvplan/info']='Info';
$this->phrasen['lvplan/geloeschteStunden']='Gelöschte Stunden';
$this->phrasen['lvplan/geaenderteStunden']='Geänderte Stunden';
$this->phrasen['lvplan/jetzt']='Jetzt';
$this->phrasen['lvplan/vorher']='Vorher';
$this->phrasen['lvplan/status']='Status';
$this->phrasen['lvplan/automatischeMail']='Dies ist eine automatische Mail!';
$this->phrasen['lvplan/folgendeAenderungen']='Es haben sich folgende Aenderungen in Ihrem LV-Plan ergeben:';
$this->phrasen['lvplan/reserviertInDev']='reserviert<br>für<br>lehre';
$this->phrasen['lvplan/raumNichtReservierbar']='Die Möglichkeit der Reservierung ist für diesen Raum deaktiviert.';
<?php
$this->phrasen['lvplan/lehrveranstaltungsplan']='Lehrveranstaltungsplan';
$this->phrasen['lvplan/persoenlicherLvPlan']='Mein persönlicher Lehrveranstaltungsplan';
$this->phrasen['lvplan/stammdatenKontrollieren']='Hier können Sie Ihre Stammdaten kontrollieren';
$this->phrasen['lvplan/profil']='PROFIL';
$this->phrasen['lvplan/saalplan']='Saalplan';
$this->phrasen['lvplan/lektorenplan']='LektorInnenplan';
$this->phrasen['lvplan/saalreservierung']='Saalreservierung';
$this->phrasen['lvplan/saal']='Saal';
$this->phrasen['lvplan/lektor']='LektorIn';
$this->phrasen['lvplan/reservierungsliste']='Reservierungsliste';
$this->phrasen['lvplan/reservierungenLoeschen']='Reservierungen löschen';
$this->phrasen['lvplan/meineReservierungenAnzeigen']='Meine Reservierungen anzeigen';
$this->phrasen['lvplan/raumsuche']='Raumsuche';
$this->phrasen['lvplan/lehrverband']='Lehr-Verband';
$this->phrasen['lvplan/stg']='Stg';
$this->phrasen['lvplan/sem']='Sem';
$this->phrasen['lvplan/ver']='Ver';
$this->phrasen['lvplan/grp']='Grp';
$this->phrasen['lvplan/lehrverbaende']='Lehrverbände';
$this->phrasen['lvplan/uebersichtDerLehrverbaende']='Übersicht der Lehrverbände';
$this->phrasen['lvplan/fehlerUndFeedback']='Feedback geben';
$this->phrasen['lvplan/lvKoordinationsstelle']='LV-Koordinationsstelle';
$this->phrasen['lvplan/reservierungen']='Reservierungen';
$this->phrasen['lvplan/reservierungWurdeGeloescht']='Reservierung wurde geloescht';
$this->phrasen['lvplan/alleReservierungen']='Alle Reservierungen';
$this->phrasen['lvplan/zurReservierung']='Zur Reservierung';
$this->phrasen['lvplan/raum']='Raum';
$this->phrasen['lvplan/raeume']='Räume';
$this->phrasen['lvplan/raumtyp']='Raumtyp';
$this->phrasen['lvplan/anzahlPersonen']='Anzahl Personen';
$this->phrasen['lvplan/datumAngeben']='Es muss ein Datum angegeben werden';
$this->phrasen['lvplan/vonZeitEingeben']='VON-Zeit muss eingegeben werden';
$this->phrasen['lvplan/bisZeitEingeben']='BIS-Zeit muss eingegeben werden';
$this->phrasen['lvplan/datumUngueltig']='Das angegebene Datum ist ungueltig! Bitte geben Sie das Datum im Format dd.mm.YYYY (31.12.2011) ein';
$this->phrasen['lvplan/rauminfoAnzeigen']='Rauminfo anzeigen';
$this->phrasen['lvplan/vonZeitFormat']='VON-Zeit muss im Format hh:mm (12:30) angegeben werden';
$this->phrasen['lvplan/bisZeitFormat']='BIS-Zeit muss im Format hh:mm (12:30) angegeben werden';
$this->phrasen['lvplan/eigeneReservierungen']='Eigene Reservierungen';
$this->phrasen['lvplan/wochenplan']='Wochenplan';
$this->phrasen['lvplan/raumExistiertNicht']='Dieser Ort existiert nicht';
$this->phrasen['lvplan/titelUndBeschreibungFehlt']='Eingabe Titel und Beschreibung fehlt';
$this->phrasen['lvplan/titelFehlt']='Eingabe Titel fehlt';
$this->phrasen['lvplan/beschreibungFehlt']='Eingabe Beschreibung fehlt';
$this->phrasen['lvplan/bereitsReserviert']='bereits reserviert';
$this->phrasen['lvplan/spezialgruppe']='Spezialgruppe';
$this->phrasen['lvplan/datumsbereichZuGross'] = 'Datumsbereich ist zu groß';
$this->phrasen['lvplan/springeZuKw']='Springe zu KW';
$this->phrasen['lvplan/home']='HOME';
$this->phrasen['lvplan/nichtVorhanden']='nicht vorhanden.';
$this->phrasen['lvplan/bitteWendenSieSichAn']='Bitte wenden Sie sich an den';
$this->phrasen['lvplan/semesterIstUngueltig']='Semester ist ungültig';
$this->phrasen['lvplan/stundeIstUngueltig']='Stunde ist ungültig';
$this->phrasen['lvplan/datumIstUngueltig']='Datum ist ungueltig';
$this->phrasen['lvplan/einheit']='Einheit';
$this->phrasen['lvplan/info']='Info';
$this->phrasen['lvplan/unr']='UNr';
$this->phrasen['lvplan/ort']='Ort';
$this->phrasen['lvplan/lehrveranstaltungsplanDetails']='Lehrveranstaltungsplan Details';
$this->phrasen['lvplan/studierende']='Studierende';
$this->phrasen['lvplan/uebersicht']='Übersicht';
$this->phrasen['lvplan/vierWochenZurueck']='4 Wochen zurückblättern';
$this->phrasen['lvplan/eineWocheZurueck']='Eine Woche zurückblättern';
$this->phrasen['lvplan/eineWocheVor']='Eine Woche vorblättern';
$this->phrasen['lvplan/vierWochenVor']='4 Wochen vorblättern';
$this->phrasen['lvplan/lvPlan']='LV-Plan';
$this->phrasen['lvplan/lektorInStudentIn']='LektorIn / StudentIn';
$this->phrasen['lvplan/studiengangAuswaehlen']='...Studiengang auswählen...';
$this->phrasen['lvplan/raumAuswaehlen']='...Raum auswählen...';
$this->phrasen['lvplan/studiensemesterAuswaehlen']='...Studiensemester auswählen...';
$this->phrasen['lvplan/semesterplaenearchiv']='Semesterpläne Archiv';
$this->phrasen['lvplan/semesterplanLaden']='Semesterplan laden';
$this->phrasen['lvplan/bitteEinenStudiengangAuswaehlen']='Bitte einen Studiengang auswählen';
$this->phrasen['lvplan/bitteEinStudiensemesterAuswaehlen']='Bitte ein Studiensemester auswählen';
$this->phrasen['lvplan/bitteEinenLektorAuswaehlen']='Bitte eineN LektorIn/StudentIn auswählen';
$this->phrasen['lvplan/semesterplaene']='Semesterübersicht';
$this->phrasen['lvplan/hauptmenue']='Hauptmenü';
$this->phrasen['lvplan/nameEingeben']='Name eingeben';
$this->phrasen['lvplan/anleitungLVPlanSync']='Anleitung LV-Plan Synchronisation';
$this->phrasen['lvplan/caldavURL']='CalDAV URL (Android, Thunderbird, CalDAV-Synchronizer)';
$this->phrasen['lvplan/caldavURLMac']='CalDAV Principal URL (MacOS, iOS)';
$this->phrasen['lvplan/googleURL']='iCAL URL (Google)';
$this->phrasen['lvplan/persoenlichenAbonnieren']='Persönlichen LV-Plan abonnieren';
$this->phrasen['lvplan/aktuelleKW']='Aktuelle Kalenderwoche';
$this->phrasen['lvplan/rauminformationenAnzeigen']='Rauminformationen anzeigen';
$this->phrasen['lvplan/personen']='Personen';
$this->phrasen['lvplan/alleRaeume']='Alle Räume';
$this->phrasen['lvplan/raumreservierungAufZeitraumEingeschraenkt']='Die Raumreservierung ist auf den Zeitraum vom %s bis %s eingeschränkt';
$this->phrasen['lvplan/neueStunden']='Neue Stunden';
$this->phrasen['lvplan/stdBeginn']='Std (Beginnzeit)';
$this->phrasen['lvplan/lehrfach']='Lehrfach';
$this->phrasen['lvplan/info']='Info';
$this->phrasen['lvplan/geloeschteStunden']='Gelöschte Stunden';
$this->phrasen['lvplan/geaenderteStunden']='Geänderte Stunden';
$this->phrasen['lvplan/jetzt']='Jetzt';
$this->phrasen['lvplan/vorher']='Vorher';
$this->phrasen['lvplan/status']='Status';
$this->phrasen['lvplan/automatischeMail']='Dies ist eine automatische Mail!';
$this->phrasen['lvplan/folgendeAenderungen']='Es haben sich folgende Aenderungen in Ihrem LV-Plan ergeben:';
$this->phrasen['lvplan/reserviertInDev']='reserviert<br>für<br>lehre';
$this->phrasen['lvplan/raumNichtReservierbar']='Die Möglichkeit der Reservierung ist für diesen Raum deaktiviert.';
$this->phrasen['lvplan/reserviertVon']='Reserviert von';
?>
+2
View File
@@ -60,3 +60,5 @@ $this->phrasen['zeitaufzeichnung/keineprojekte']='keine Projekte vorhanden';
$this->phrasen['zeitaufzeichnung/summe']='Summe:';
$this->phrasen['zeitaufzeichnung/dienstreise']='Dienstreise';
$this->phrasen['zeitaufzeichnung/projektphase']='AP';
$this->phrasen['zeitaufzeichnung/pauseEinfuegen']='Pause automatisch einfügen';
$this->phrasen['zeitaufzeichnung/zeitraumZuKurz']='Zeitraum zu kurz für automatische Pause';
+102 -101
View File
@@ -1,101 +1,102 @@
<?php
$this->phrasen['lvplan/lehrveranstaltungsplan']='Schedule';
$this->phrasen['lvplan/persoenlicherLvPlan']='My personal schedule';
$this->phrasen['lvplan/stammdatenKontrollieren']='Check your profile';
$this->phrasen['lvplan/profil']='PROFILE';
$this->phrasen['lvplan/saalplan']='Rooms';
$this->phrasen['lvplan/lektorenplan']='Lector';
$this->phrasen['lvplan/saalreservierung']='Room reservation';
$this->phrasen['lvplan/saal']='Room';
$this->phrasen['lvplan/lektor']='Lector';
$this->phrasen['lvplan/reservierungsliste']='Reservation list';
$this->phrasen['lvplan/reservierungenLoeschen']='Delete room reservations';
$this->phrasen['lvplan/meineReservierungenAnzeigen']='Show my room reservations';
$this->phrasen['lvplan/raumsuche']='Room search';
$this->phrasen['lvplan/lehrverband']='Teaching Group';
$this->phrasen['lvplan/stg']='Dp'; //Degree Program
$this->phrasen['lvplan/sem']='Sem';
$this->phrasen['lvplan/ver']='Div'; //Division
$this->phrasen['lvplan/grp']='Grp';
$this->phrasen['lvplan/lehrverbaende']='Teaching Groups';
$this->phrasen['lvplan/uebersichtDerLehrverbaende']='Overview of Teaching Groups';
$this->phrasen['lvplan/fehlerUndFeedback']='Send Feedback';
$this->phrasen['lvplan/lvKoordinationsstelle']='Course-Coordination Office';
$this->phrasen['lvplan/reservierungen']='Reservations';
$this->phrasen['lvplan/reservierungWurdeGeloescht'] = 'Reservation successfully deleted';
$this->phrasen['lvplan/alleReservierungen']='All reservations';
$this->phrasen['lvplan/zurReservierung']='Reservation';
$this->phrasen['lvplan/raum']='Room';
$this->phrasen['lvplan/raeume']='Rooms';
$this->phrasen['lvplan/raumtyp']='Roomtype';
$this->phrasen['lvplan/anzahlPersonen']='Number of persons';
$this->phrasen['lvplan/datumAngeben']='No valid date';
$this->phrasen['lvplan/vonZeitEingeben']='No valid FROM-Time';
$this->phrasen['lvplan/bisZeitEingeben']='No valid TO-Time';
$this->phrasen['lvplan/datumUngueltig']='Invalid date! Please insert dd.mm.YYYY (31.12.2011)';
$this->phrasen['lvplan/rauminfoAnzeigen']='Show roominformation';
$this->phrasen['lvplan/vonZeitFormat']='FROM-Time must have the format hh:mm (12:30)';
$this->phrasen['lvplan/bisZeitFormat']='TO-Time must have the format hh:mm (12:30)';
$this->phrasen['lvplan/eigeneReservierungen']='Own reservations';
$this->phrasen['lvplan/wochenplan']='Weekly Schedule';
$this->phrasen['lvplan/raumExistiertNicht']='This room does not exist';
$this->phrasen['lvplan/titelUndBeschreibungFehlt']='Title and description are missing';
$this->phrasen['lvplan/titelFehlt']='Title is missing';
$this->phrasen['lvplan/beschreibungFehlt']='Description is missing';
$this->phrasen['lvplan/bereitsReserviert']='already reserved';
$this->phrasen['lvplan/spezialgruppe']='Special group';
$this->phrasen['lvplan/datumsbereichZuGross'] = 'Invalid date';
$this->phrasen['lvplan/springeZuKw']='Jump to CW';
$this->phrasen['lvplan/home']='HOME';
$this->phrasen['lvplan/nichtVorhanden']='is not existing.';
$this->phrasen['lvplan/bitteWendenSieSichAn']='Please contact the';
$this->phrasen['lvplan/semesterIstUngueltig']='Invalid semester';
$this->phrasen['lvplan/stundeIstUngueltig']='Invalid unit';
$this->phrasen['lvplan/datumIstUngueltig']='Invalid date';
$this->phrasen['lvplan/einheit']='Unit';
$this->phrasen['lvplan/info']='Info';
$this->phrasen['lvplan/unr']='UNr';
$this->phrasen['lvplan/ort']='Room';
$this->phrasen['lvplan/lehrveranstaltungsplanDetails']='Schedule Details';
$this->phrasen['lvplan/studierende']='Students';
$this->phrasen['lvplan/uebersicht']='Overview';
$this->phrasen['lvplan/vierWochenZurueck']='Go back 4 weeks';
$this->phrasen['lvplan/eineWocheZurueck']='Go back 1 week';
$this->phrasen['lvplan/eineWocheVor']='Go forward 1 week';
$this->phrasen['lvplan/vierWochenVor']='Go forward 4 weeks';
$this->phrasen['lvplan/lvPlan']='Schedule';
$this->phrasen['lvplan/lektorInStudentIn']='Lecturer/Student';
$this->phrasen['lvplan/studiengangAuswaehlen']='...Select degree program...';
$this->phrasen['lvplan/raumAuswaehlen']='...Select room...';
$this->phrasen['lvplan/studiensemesterAuswaehlen']='...Select semester...';
$this->phrasen['lvplan/semesterplaenearchiv']='Semester Schedule Archive';
$this->phrasen['lvplan/semesterplanLaden']='Load semester schedule';
$this->phrasen['lvplan/bitteEinenStudiengangAuswaehlen']='Please select a degree program';
$this->phrasen['lvplan/bitteEinStudiensemesterAuswaehlen']='Please select a semester';
$this->phrasen['lvplan/bitteEinenLektorAuswaehlen']='Please select a lecturer/student';
$this->phrasen['lvplan/semesterplaene']='Overview';
$this->phrasen['lvplan/hauptmenue']='Main Menu';
$this->phrasen['lvplan/nameEingeben']='Enter name';
$this->phrasen['lvplan/anleitungLVPlanSync']='Instructions for synchronizing your schedule ';
$this->phrasen['lvplan/caldavURL']='CalDAV URL (Android, Thunderbird, CalDAV-Synchronizer)';
$this->phrasen['lvplan/caldavURLMac']='CalDAV Principal URL (MacOS, iOS)';
$this->phrasen['lvplan/googleURL']='iCAL URL (Google)';
$this->phrasen['lvplan/persoenlichenAbonnieren']='Subscribe to personal schedule';
$this->phrasen['lvplan/aktuelleKW']='Current calendar week';
$this->phrasen['lvplan/rauminformationenAnzeigen']='Show room information';
$this->phrasen['lvplan/personen']='persons';
$this->phrasen['lvplan/raumreservierungAufZeitraumEingeschraenkt']='Room reservation is limited to the period from %s to %s';
$this->phrasen['lvplan/neueStunden']='New Units';
$this->phrasen['lvplan/stdBeginn']='Unit (Begin)';
$this->phrasen['lvplan/lehrfach']='Course';
$this->phrasen['lvplan/info']='Info';
$this->phrasen['lvplan/geloeschteStunden']='Deleted Units';
$this->phrasen['lvplan/geaenderteStunden']='Changed Units';
$this->phrasen['lvplan/jetzt']='Now';
$this->phrasen['lvplan/vorher']='Previously';
$this->phrasen['lvplan/status']='Status';
$this->phrasen['lvplan/automatischeMail']='This is an automatic email!';
$this->phrasen['lvplan/folgendeAenderungen']='There have been the following changes in your Schedule:';
$this->phrasen['lvplan/reserviertInDev']='not<br>available';
$this->phrasen['lvplan/raumNichtReservierbar']='Reservation is disabled for this room.';
?>
<?php
$this->phrasen['lvplan/lehrveranstaltungsplan']='Schedule';
$this->phrasen['lvplan/persoenlicherLvPlan']='My personal schedule';
$this->phrasen['lvplan/stammdatenKontrollieren']='Check your profile';
$this->phrasen['lvplan/profil']='PROFILE';
$this->phrasen['lvplan/saalplan']='Rooms';
$this->phrasen['lvplan/lektorenplan']='Lector';
$this->phrasen['lvplan/saalreservierung']='Room reservation';
$this->phrasen['lvplan/saal']='Room';
$this->phrasen['lvplan/lektor']='Lector';
$this->phrasen['lvplan/reservierungsliste']='Reservation list';
$this->phrasen['lvplan/reservierungenLoeschen']='Delete room reservations';
$this->phrasen['lvplan/meineReservierungenAnzeigen']='Show my room reservations';
$this->phrasen['lvplan/raumsuche']='Room search';
$this->phrasen['lvplan/lehrverband']='Teaching Group';
$this->phrasen['lvplan/stg']='Dp'; //Degree Program
$this->phrasen['lvplan/sem']='Sem';
$this->phrasen['lvplan/ver']='Div'; //Division
$this->phrasen['lvplan/grp']='Grp';
$this->phrasen['lvplan/lehrverbaende']='Teaching Groups';
$this->phrasen['lvplan/uebersichtDerLehrverbaende']='Overview of Teaching Groups';
$this->phrasen['lvplan/fehlerUndFeedback']='Send Feedback';
$this->phrasen['lvplan/lvKoordinationsstelle']='Course-Coordination Office';
$this->phrasen['lvplan/reservierungen']='Reservations';
$this->phrasen['lvplan/reservierungWurdeGeloescht'] = 'Reservation successfully deleted';
$this->phrasen['lvplan/alleReservierungen']='All reservations';
$this->phrasen['lvplan/zurReservierung']='Reservation';
$this->phrasen['lvplan/raum']='Room';
$this->phrasen['lvplan/raeume']='Rooms';
$this->phrasen['lvplan/raumtyp']='Roomtype';
$this->phrasen['lvplan/anzahlPersonen']='Number of persons';
$this->phrasen['lvplan/datumAngeben']='No valid date';
$this->phrasen['lvplan/vonZeitEingeben']='No valid FROM-Time';
$this->phrasen['lvplan/bisZeitEingeben']='No valid TO-Time';
$this->phrasen['lvplan/datumUngueltig']='Invalid date! Please insert dd.mm.YYYY (31.12.2011)';
$this->phrasen['lvplan/rauminfoAnzeigen']='Show roominformation';
$this->phrasen['lvplan/vonZeitFormat']='FROM-Time must have the format hh:mm (12:30)';
$this->phrasen['lvplan/bisZeitFormat']='TO-Time must have the format hh:mm (12:30)';
$this->phrasen['lvplan/eigeneReservierungen']='Own reservations';
$this->phrasen['lvplan/wochenplan']='Weekly Schedule';
$this->phrasen['lvplan/raumExistiertNicht']='This room does not exist';
$this->phrasen['lvplan/titelUndBeschreibungFehlt']='Title and description are missing';
$this->phrasen['lvplan/titelFehlt']='Title is missing';
$this->phrasen['lvplan/beschreibungFehlt']='Description is missing';
$this->phrasen['lvplan/bereitsReserviert']='already reserved';
$this->phrasen['lvplan/spezialgruppe']='Special group';
$this->phrasen['lvplan/datumsbereichZuGross'] = 'Invalid date';
$this->phrasen['lvplan/springeZuKw']='Jump to CW';
$this->phrasen['lvplan/home']='HOME';
$this->phrasen['lvplan/nichtVorhanden']='is not existing.';
$this->phrasen['lvplan/bitteWendenSieSichAn']='Please contact the';
$this->phrasen['lvplan/semesterIstUngueltig']='Invalid semester';
$this->phrasen['lvplan/stundeIstUngueltig']='Invalid unit';
$this->phrasen['lvplan/datumIstUngueltig']='Invalid date';
$this->phrasen['lvplan/einheit']='Unit';
$this->phrasen['lvplan/info']='Info';
$this->phrasen['lvplan/unr']='UNr';
$this->phrasen['lvplan/ort']='Room';
$this->phrasen['lvplan/lehrveranstaltungsplanDetails']='Schedule Details';
$this->phrasen['lvplan/studierende']='Students';
$this->phrasen['lvplan/uebersicht']='Overview';
$this->phrasen['lvplan/vierWochenZurueck']='Go back 4 weeks';
$this->phrasen['lvplan/eineWocheZurueck']='Go back 1 week';
$this->phrasen['lvplan/eineWocheVor']='Go forward 1 week';
$this->phrasen['lvplan/vierWochenVor']='Go forward 4 weeks';
$this->phrasen['lvplan/lvPlan']='Schedule';
$this->phrasen['lvplan/lektorInStudentIn']='Lecturer/Student';
$this->phrasen['lvplan/studiengangAuswaehlen']='...Select degree program...';
$this->phrasen['lvplan/raumAuswaehlen']='...Select room...';
$this->phrasen['lvplan/studiensemesterAuswaehlen']='...Select semester...';
$this->phrasen['lvplan/semesterplaenearchiv']='Semester Schedule Archive';
$this->phrasen['lvplan/semesterplanLaden']='Load semester schedule';
$this->phrasen['lvplan/bitteEinenStudiengangAuswaehlen']='Please select a degree program';
$this->phrasen['lvplan/bitteEinStudiensemesterAuswaehlen']='Please select a semester';
$this->phrasen['lvplan/bitteEinenLektorAuswaehlen']='Please select a lecturer/student';
$this->phrasen['lvplan/semesterplaene']='Overview';
$this->phrasen['lvplan/hauptmenue']='Main Menu';
$this->phrasen['lvplan/nameEingeben']='Enter name';
$this->phrasen['lvplan/anleitungLVPlanSync']='Instructions for synchronizing your schedule ';
$this->phrasen['lvplan/caldavURL']='CalDAV URL (Android, Thunderbird, CalDAV-Synchronizer)';
$this->phrasen['lvplan/caldavURLMac']='CalDAV Principal URL (MacOS, iOS)';
$this->phrasen['lvplan/googleURL']='iCAL URL (Google)';
$this->phrasen['lvplan/persoenlichenAbonnieren']='Subscribe to personal schedule';
$this->phrasen['lvplan/aktuelleKW']='Current calendar week';
$this->phrasen['lvplan/rauminformationenAnzeigen']='Show room information';
$this->phrasen['lvplan/personen']='persons';
$this->phrasen['lvplan/raumreservierungAufZeitraumEingeschraenkt']='Room reservation is limited to the period from %s to %s';
$this->phrasen['lvplan/neueStunden']='New Units';
$this->phrasen['lvplan/stdBeginn']='Unit (Begin)';
$this->phrasen['lvplan/lehrfach']='Course';
$this->phrasen['lvplan/info']='Info';
$this->phrasen['lvplan/geloeschteStunden']='Deleted Units';
$this->phrasen['lvplan/geaenderteStunden']='Changed Units';
$this->phrasen['lvplan/jetzt']='Now';
$this->phrasen['lvplan/vorher']='Previously';
$this->phrasen['lvplan/status']='Status';
$this->phrasen['lvplan/automatischeMail']='This is an automatic email!';
$this->phrasen['lvplan/folgendeAenderungen']='There have been the following changes in your Schedule:';
$this->phrasen['lvplan/reserviertInDev']='not<br>available';
$this->phrasen['lvplan/raumNichtReservierbar']='Reservation is disabled for this room.';
$this->phrasen['lvplan/reserviertVon']='Reserved by';
?>
+2
View File
@@ -60,3 +60,5 @@ $this->phrasen['zeitaufzeichnung/keineprojekte']='no projects exist';
$this->phrasen['zeitaufzeichnung/summe']='Sum:';
$this->phrasen['zeitaufzeichnung/dienstreise']='Business Trip';
$this->phrasen['zeitaufzeichnung/projektphase']='WP';
$this->phrasen['zeitaufzeichnung/pauseEinfuegen']='insert break automatically';
$this->phrasen['zeitaufzeichnung/zeitraumZuKurz']='Timeslot too short for automatic break.';
+1 -1
View File
@@ -87,5 +87,5 @@ $this->phrasen['lvplan/vonZeitEingeben']='';
$this->phrasen['lvplan/vonZeitFormat']='';
$this->phrasen['lvplan/wochenplan']='';
$this->phrasen['lvplan/zurReservierung']='';
$this->phrasen['lvplan/reserviertVon']='';
?>
+14
View File
@@ -0,0 +1,14 @@
.tabulator-col {
font-size: 14px;
}
.tabulator-page {
color: black;
opacity: 1 !important;
padding: 2px 7px !important;
border: 0px !important;
}
.tabulator-page.active {
color: #337ab7 !important;
}
@@ -4,4 +4,9 @@
hr.studiensemesterline
{
margin: 6px 6px;
}
.onhold
{
color: #CDAD00
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Some files were not shown because too many files have changed in this diff Show More