Merge branch 'feature-3994/Digitaler_Lehrauftrag'
@@ -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');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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');
|
||||
}
|
||||
@@ -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!');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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);
|
||||
|
||||
?>
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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'
|
||||
);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -4031,25 +4031,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';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 18 KiB |
@@ -13,14 +13,14 @@
|
||||
* Global function used by FilterWidget JS to refresh the side menu
|
||||
* NOTE: it is called from the FilterWidget JS therefore must be a global function
|
||||
* It may be overwritten by a custom refreshSideMenuHook included in a javascript which will be loaded after this one
|
||||
* The given parameters, filter_page and navigation_page, are required
|
||||
* The given parameters, filterUniqueId and navigation_page, are required
|
||||
*/
|
||||
function refreshSideMenuHook()
|
||||
{
|
||||
FHC_NavigationWidget.refreshSideMenuHook(
|
||||
'system/Filters/setNavigationMenu',
|
||||
'widgets/Filters/setNavigationMenu',
|
||||
{
|
||||
filter_page: FHC_FilterWidget.getFilterPage(),
|
||||
filterUniqueId: FHC_FilterWidget.getFilterUniqueIdPrefix(),
|
||||
navigation_page: FHC_NavigationWidget.getNavigationPage()
|
||||
}
|
||||
);
|
||||
@@ -33,34 +33,37 @@ function refreshSideMenuHook()
|
||||
*/
|
||||
function sideMenuHook()
|
||||
{
|
||||
$(".remove-custom-filter").click(function() {
|
||||
// If menu is present
|
||||
if (FHC_FilterWidget._hideMenu != true)
|
||||
{
|
||||
$(".remove-custom-filter").click(function() {
|
||||
|
||||
// Ajax call to remove a custom filter
|
||||
FHC_AjaxClient.ajaxCallPost(
|
||||
"system/Filters/removeCustomFilter",
|
||||
{
|
||||
filter_id: $(this).attr("value"), // filter_id of the filter to be removed
|
||||
filter_page: FHC_FilterWidget.getFilterPage()
|
||||
},
|
||||
{
|
||||
successCallback: function(data, textStatus, jqXHR) {
|
||||
// Ajax call to remove a custom filter
|
||||
FHC_AjaxClient.ajaxCallPost(
|
||||
"widgets/Filters/removeCustomFilter",
|
||||
{
|
||||
filter_id: $(this).attr("value"), // filter_id of the filter to be removed
|
||||
filterUniqueId: FHC_FilterWidget.getFilterUniqueIdPrefix()
|
||||
},
|
||||
{
|
||||
successCallback: function(data, textStatus, jqXHR) {
|
||||
|
||||
if (FHC_AjaxClient.isError(data))
|
||||
{
|
||||
console.log(FHC_AjaxClient.getError(data));
|
||||
}
|
||||
else
|
||||
{
|
||||
// If a success and refreshSideMenuHook is a valid function then call it to refresh the side menu
|
||||
if (typeof refreshSideMenuHook == "function")
|
||||
if (FHC_AjaxClient.isError(data))
|
||||
{
|
||||
refreshSideMenuHook();
|
||||
console.log(FHC_AjaxClient.getError(data));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (typeof refreshSideMenuHook == "function")
|
||||
{
|
||||
refreshSideMenuHook();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
});
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------
|
||||
@@ -69,6 +72,7 @@ function sideMenuHook()
|
||||
// Success
|
||||
const DATASET_REP_TABLESORTER = "tablesorter";
|
||||
const DATASET_REP_PIVOTUI = "pivotUI";
|
||||
const DATASET_REP_TABULATOR = "tabulator";
|
||||
|
||||
/**
|
||||
* FHC_FilterWidget this object is used to render the GUI of a filter widget and to operate with it
|
||||
@@ -78,7 +82,9 @@ var FHC_FilterWidget = {
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
// Properties
|
||||
|
||||
_datasetRepresentation: null, //
|
||||
_datasetRepresentation: null, // contains the current data representation
|
||||
_hideMenu: false, //
|
||||
_hideOptions: false, //
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
@@ -102,7 +108,7 @@ var FHC_FilterWidget = {
|
||||
/**
|
||||
* To retrieve the page where the FilterWidget is used, using the FHC_JS_DATA_STORAGE_OBJECT
|
||||
*/
|
||||
getFilterPage: function() {
|
||||
getFilterUniqueIdPrefix: function() {
|
||||
|
||||
return FHC_JS_DATA_STORAGE_OBJECT.called_path + "/" + FHC_JS_DATA_STORAGE_OBJECT.called_method;
|
||||
},
|
||||
@@ -181,6 +187,12 @@ var FHC_FilterWidget = {
|
||||
{
|
||||
$("#filterPivotUI").html("");
|
||||
}
|
||||
|
||||
// If the choosen dataset representation is tabulator
|
||||
if (FHC_FilterWidget._datasetRepresentation == DATASET_REP_TABULATOR)
|
||||
{
|
||||
$("#filterTabulator").html("");
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -190,9 +202,9 @@ var FHC_FilterWidget = {
|
||||
_getFilter: function(renderFunction) {
|
||||
|
||||
FHC_AjaxClient.ajaxCallGet(
|
||||
"system/Filters/getFilter",
|
||||
"widgets/Filters/getFilter",
|
||||
{
|
||||
filter_page: FHC_FilterWidget.getFilterPage()
|
||||
filterUniqueId: FHC_FilterWidget.getFilterUniqueIdPrefix()
|
||||
},
|
||||
{
|
||||
successCallback: function(data, textStatus, jqXHR) {
|
||||
@@ -224,16 +236,23 @@ var FHC_FilterWidget = {
|
||||
FHC_FilterWidget._initSessionStorage(); // initialize the session storage
|
||||
|
||||
FHC_FilterWidget._setDatasetRepresentation(data); // set what type of dataset representation was choosen
|
||||
FHC_FilterWidget._setHideMenu(data); // sets the _hideMenu property
|
||||
FHC_FilterWidget._setHideOptions(data);
|
||||
|
||||
FHC_FilterWidget._turnOffEvents(); // turns all the events off
|
||||
FHC_FilterWidget._resetGUI(); // Reset the entire GUI
|
||||
|
||||
// Render the GUI for this FilterWidget
|
||||
FHC_FilterWidget._setFilterName(data); // set the name in the GUI
|
||||
FHC_FilterWidget._renderDragAndDropFields(data); // render the fields drag and drop GUI
|
||||
FHC_FilterWidget._renderDropDownFields(data); // render the fields drop-down
|
||||
FHC_FilterWidget._renderAppliedFilters(data); // render the GUI for the applied filters
|
||||
FHC_FilterWidget._renderDropDownFilters(data); // render the filters drop-down
|
||||
|
||||
if (FHC_FilterWidget._hideOptions != true)
|
||||
{
|
||||
FHC_FilterWidget._renderDragAndDropFields(data); // render the fields drag and drop GUI
|
||||
FHC_FilterWidget._renderDropDownFields(data); // render the fields drop-down
|
||||
FHC_FilterWidget._renderAppliedFilters(data); // render the GUI for the applied filters
|
||||
FHC_FilterWidget._renderDropDownFilters(data); // render the filters drop-down
|
||||
}
|
||||
|
||||
FHC_FilterWidget._renderDataset(data);
|
||||
|
||||
FHC_FilterWidget._turnOnEvents(); // turns all the events off
|
||||
@@ -265,7 +284,7 @@ var FHC_FilterWidget = {
|
||||
*/
|
||||
_turnOffEvents: function() {
|
||||
|
||||
$("[data-toggle='collapse']").off("click");
|
||||
$('[data-toggle="collapse"]').off("click");
|
||||
$(".drag-and-drop-fields-span").off("draggable");
|
||||
$(".drag-and-drop-fields-span").off("droppable");
|
||||
$(".remove-selected-field").off("click");
|
||||
@@ -279,7 +298,7 @@ var FHC_FilterWidget = {
|
||||
// If the choosen dataset representation is tablesorter
|
||||
if (FHC_FilterWidget._datasetRepresentation == DATASET_REP_TABLESORTER)
|
||||
{
|
||||
FHC_FilterWidget._disableTableSorter(); // disable the tablesorter
|
||||
FHC_FilterWidget._disableTablesorter(); // disable the tablesorter
|
||||
}
|
||||
},
|
||||
|
||||
@@ -289,7 +308,7 @@ var FHC_FilterWidget = {
|
||||
*/
|
||||
_turnOnEvents: function() {
|
||||
|
||||
$("[data-toggle='collapse']").click(FHC_FilterWidget._dataToggleCollapseEvent); // Click event to collapse or to open the filter options panel
|
||||
$('[data-toggle="collapse"]').click(FHC_FilterWidget._dataToggleCollapseEvent); // Click event to collapse or to open the filter options panel
|
||||
$(".drag-and-drop-fields-span").draggable(FHC_FilterWidget._draggableConf); // draggable event on selected fields
|
||||
$(".drag-and-drop-fields-span").droppable(FHC_FilterWidget._droppableConf); // droppable event on selected fields
|
||||
$(".remove-selected-field").click(FHC_FilterWidget._revomeSelectedFieldsEvent); // Click event on the "X" link
|
||||
@@ -385,10 +404,10 @@ var FHC_FilterWidget = {
|
||||
});
|
||||
|
||||
FHC_AjaxClient.ajaxCallPost(
|
||||
"system/Filters/sortSelectedFields",
|
||||
"widgets/Filters/sortSelectedFields",
|
||||
{
|
||||
selectedFields: arrayDndId,
|
||||
filter_page: FHC_FilterWidget.getFilterPage()
|
||||
filterUniqueId: FHC_FilterWidget.getFilterUniqueIdPrefix()
|
||||
},
|
||||
{
|
||||
successCallback: function(data, textStatus, jqXHR) {
|
||||
@@ -405,10 +424,10 @@ var FHC_FilterWidget = {
|
||||
_revomeSelectedFieldsEvent: function(event) {
|
||||
|
||||
FHC_AjaxClient.ajaxCallPost(
|
||||
"system/Filters/removeSelectedField",
|
||||
"widgets/Filters/removeSelectedField",
|
||||
{
|
||||
selectedField: $(this).attr("fieldToRemove"),
|
||||
filter_page: FHC_FilterWidget.getFilterPage()
|
||||
filterUniqueId: FHC_FilterWidget.getFilterUniqueIdPrefix()
|
||||
},
|
||||
{
|
||||
successCallback: function(data, textStatus, jqXHR) {
|
||||
@@ -445,10 +464,10 @@ var FHC_FilterWidget = {
|
||||
_addFieldEvent: function(event) {
|
||||
|
||||
FHC_AjaxClient.ajaxCallPost(
|
||||
"system/Filters/addSelectedField",
|
||||
"widgets/Filters/addSelectedField",
|
||||
{
|
||||
selectedField: $(this).val(),
|
||||
filter_page: FHC_FilterWidget.getFilterPage()
|
||||
filterUniqueId: FHC_FilterWidget.getFilterUniqueIdPrefix()
|
||||
},
|
||||
{
|
||||
successCallback: function(data, textStatus, jqXHR) {
|
||||
@@ -476,13 +495,13 @@ var FHC_FilterWidget = {
|
||||
});
|
||||
|
||||
FHC_AjaxClient.ajaxCallPost(
|
||||
"system/Filters/applyFilters",
|
||||
"widgets/Filters/applyFilters",
|
||||
{
|
||||
appliedFilters: appliedFilters,
|
||||
appliedFiltersOperations: appliedFiltersOperations,
|
||||
appliedFiltersConditions: appliedFiltersConditions,
|
||||
appliedFiltersOptions: appliedFiltersOptions,
|
||||
filter_page: FHC_FilterWidget.getFilterPage()
|
||||
filterUniqueId: FHC_FilterWidget.getFilterUniqueIdPrefix()
|
||||
},
|
||||
{
|
||||
successCallback: function(data, textStatus, jqXHR) {
|
||||
@@ -498,10 +517,10 @@ var FHC_FilterWidget = {
|
||||
_removeAppliedFiltersEvent: function(event) {
|
||||
|
||||
FHC_AjaxClient.ajaxCallPost(
|
||||
"system/Filters/removeAppliedFilter",
|
||||
"widgets/Filters/removeAppliedFilter",
|
||||
{
|
||||
appliedFilter: $(this).attr("filterToRemove"),
|
||||
filter_page: FHC_FilterWidget.getFilterPage()
|
||||
filterUniqueId: FHC_FilterWidget.getFilterUniqueIdPrefix()
|
||||
},
|
||||
{
|
||||
successCallback: function(data, textStatus, jqXHR) {
|
||||
@@ -517,10 +536,10 @@ var FHC_FilterWidget = {
|
||||
_addFilterEvent: function(event) {
|
||||
|
||||
FHC_AjaxClient.ajaxCallPost(
|
||||
"system/Filters/addFilter",
|
||||
"widgets/Filters/addFilter",
|
||||
{
|
||||
filter: $(this).val(),
|
||||
filter_page: FHC_FilterWidget.getFilterPage()
|
||||
filterUniqueId: FHC_FilterWidget.getFilterUniqueIdPrefix()
|
||||
},
|
||||
{
|
||||
successCallback: function(data, textStatus, jqXHR) {
|
||||
@@ -559,17 +578,22 @@ var FHC_FilterWidget = {
|
||||
if ($("#customFilterDescription").val() != "")
|
||||
{
|
||||
FHC_AjaxClient.ajaxCallPost(
|
||||
"system/Filters/saveCustomFilter",
|
||||
"widgets/Filters/saveCustomFilter",
|
||||
{
|
||||
customFilterDescription: $("#customFilterDescription").val(),
|
||||
filter_page: FHC_FilterWidget.getFilterPage()
|
||||
filterUniqueId: FHC_FilterWidget.getFilterUniqueIdPrefix()
|
||||
},
|
||||
{
|
||||
successCallback: function(data, textStatus, jqXHR) {
|
||||
// If a success and refreshSideMenuHook is a valid function then call it to refresh the side menu
|
||||
if (typeof refreshSideMenuHook == "function")
|
||||
|
||||
// If menu is present
|
||||
if (FHC_FilterWidget._hideMenu != true)
|
||||
{
|
||||
refreshSideMenuHook();
|
||||
// If a success and refreshSideMenuHook is a valid function then call it to refresh the side menu
|
||||
if (typeof refreshSideMenuHook == "function")
|
||||
{
|
||||
refreshSideMenuHook();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -827,6 +851,12 @@ var FHC_FilterWidget = {
|
||||
{
|
||||
FHC_FilterWidget._renderDatasetPivotUI(data); // ...render the pivotUI GUI
|
||||
}
|
||||
|
||||
// If the choosen dataset representation is tabulator then...
|
||||
if (FHC_FilterWidget._datasetRepresentation == DATASET_REP_TABULATOR)
|
||||
{
|
||||
FHC_FilterWidget._renderDatasetTabulator(data); // ...render the tabulator GUI
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -843,7 +873,7 @@ var FHC_FilterWidget = {
|
||||
FHC_FilterWidget._clearTablesorterLocalStorage();
|
||||
}
|
||||
|
||||
if (data.hasOwnProperty("checkboxes") && data.checkboxes!=null && data.checkboxes.trim() != "")
|
||||
if (data.hasOwnProperty("checkboxes") && data.checkboxes != null && data.checkboxes.trim() != "")
|
||||
{
|
||||
$("#filterTableDataset > thead > tr").append("<th data-filter='false' title='Select'>Select</th>");
|
||||
}
|
||||
@@ -928,12 +958,14 @@ var FHC_FilterWidget = {
|
||||
*/
|
||||
_enableTableSorter: function() {
|
||||
|
||||
var filterWidgetTablesorter = $("#filterTableDataset");
|
||||
|
||||
// Checks if the table contains data (rows)
|
||||
if ($("#filterTableDataset").find("tbody:empty").length == 0
|
||||
&& $("#filterTableDataset").find("tr:empty").length == 0
|
||||
&& $("#filterTableDataset").hasClass("table-condensed"))
|
||||
if (filterWidgetTablesorter.find("tbody:empty").length == 0
|
||||
&& filterWidgetTablesorter.find("tr:empty").length == 0
|
||||
&& filterWidgetTablesorter.hasClass("table-condensed"))
|
||||
{
|
||||
$("#filterTableDataset").tablesorter({
|
||||
filterWidgetTablesorter.tablesorter({
|
||||
dateFormat: "ddmmyyyy",
|
||||
widgets: ["zebra", "filter"],
|
||||
widgetOptions: {
|
||||
@@ -941,37 +973,34 @@ var FHC_FilterWidget = {
|
||||
}
|
||||
});
|
||||
|
||||
$.tablesorter.updateAll($("#filterTableDataset")[0].config, true, null);
|
||||
$.tablesorter.updateAll(filterWidgetTablesorter[0].config, true, null);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Disable the tablesorter
|
||||
*/
|
||||
_disableTableSorter: function() {
|
||||
_disableTablesorter: function() {
|
||||
|
||||
$("#filterTableDataset").trigger("disable");
|
||||
},
|
||||
|
||||
/**
|
||||
* Tablesorter filter local storage clean
|
||||
*/
|
||||
_cleanTablesorterLocalStorage: function() {
|
||||
|
||||
$("#filterTableDataset").trigger("filterResetSaved");
|
||||
},
|
||||
|
||||
/**
|
||||
* Renders the pivotUI for the FilterWidget
|
||||
* The data to be displayed are retrived from the parameter data
|
||||
*/
|
||||
_renderDatasetPivotUI: function(data) {
|
||||
|
||||
var options = {}; // eventually contains options fot the pivotUI
|
||||
|
||||
// Checks if options were given
|
||||
if (data.hasOwnProperty("datasetRepresentationOptions") && data.datasetRepresentationOptions != "")
|
||||
{
|
||||
var tmpOptions = eval("(" + data.datasetRepresentationOptions + ")"); // and converts them from string to javascript code
|
||||
|
||||
// If it is an object then can be used
|
||||
if (typeof tmpOptions == "object")
|
||||
{
|
||||
options = tmpOptions;
|
||||
}
|
||||
}
|
||||
// Checks if options were given and returns them
|
||||
var options = FHC_FilterWidget._getRepresentationOptions(data);
|
||||
|
||||
// Manipulation for the representation!
|
||||
var arrayFieldsToDisplay = FHC_FilterWidget._getFieldsToDisplay(data);
|
||||
@@ -1057,8 +1086,145 @@ var FHC_FilterWidget = {
|
||||
},
|
||||
|
||||
/**
|
||||
* Tablesorter filter local storage clean
|
||||
* Renders the tabulator for the FilterWidget
|
||||
* The data to be displayed are retrived from the parameter data
|
||||
*/
|
||||
_renderDatasetTabulator: function(data) {
|
||||
|
||||
// Checks if options were given and returns them
|
||||
var options = FHC_FilterWidget._getRepresentationOptions(data);
|
||||
// Checks if record fields definitions were given and returns them
|
||||
var recordFieldsDefinitions = FHC_FilterWidget._getRepresentationFieldsDefinitions(data);
|
||||
|
||||
// Manipulation for the representation!
|
||||
var arrayTabulatorColumns = FHC_FilterWidget._getTabulatorColumns(data, recordFieldsDefinitions);
|
||||
|
||||
if (arrayTabulatorColumns.length > 0)
|
||||
{
|
||||
// ...if there are data to be displayed...
|
||||
if (data.hasOwnProperty("dataset") && $.isArray(data.dataset))
|
||||
{
|
||||
if (options == null) options = {};
|
||||
|
||||
options.columns = arrayTabulatorColumns;
|
||||
options.data = data.dataset;
|
||||
|
||||
// Renders the tabulator
|
||||
$("#filterTabulator").tabulator(options);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Retrives the fields to be displayed from the data parameter, if aliases are present then they are used
|
||||
*/
|
||||
_getTabulatorColumns: function(data, recordFieldsDefinitions) {
|
||||
|
||||
var fieldsToDisplayTabulator = [];
|
||||
|
||||
if (data.hasOwnProperty("selectedFields") && $.isArray(data.selectedFields))
|
||||
{
|
||||
for (var sfc = 0; sfc < data.selectedFields.length; sfc++)
|
||||
{
|
||||
for (var fc = 0; fc < data.fields.length; fc++)
|
||||
{
|
||||
if (data.selectedFields[sfc] == data.fields[fc])
|
||||
{
|
||||
// Build the array of objects (columns) used by tabulator and store it in tabulatorColumns
|
||||
var tmpColumnObj = {}; // New object that represents a column
|
||||
|
||||
// If was given a definition for this field then use it!
|
||||
if (recordFieldsDefinitions != null && recordFieldsDefinitions.hasOwnProperty(data.selectedFields[sfc]))
|
||||
{
|
||||
tmpColumnObj = recordFieldsDefinitions[data.selectedFields[sfc]];
|
||||
}
|
||||
|
||||
tmpColumnObj.field = data.selectedFields[sfc]; // Field name to be linked with dataset field name
|
||||
|
||||
// If there is an alias for this field use it to give a title to this field (header)
|
||||
if (data.hasOwnProperty("columnsAliases") && $.isArray(data.columnsAliases))
|
||||
{
|
||||
tmpColumnObj.title = data.columnsAliases[fc];
|
||||
}
|
||||
else // otherwise use the field name itself
|
||||
{
|
||||
tmpColumnObj.title = data.selectedFields[sfc];
|
||||
}
|
||||
|
||||
fieldsToDisplayTabulator.push(tmpColumnObj); // Add tmpColumnObj to tabulatorColumns
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If additional columns are present...
|
||||
if (data.hasOwnProperty("additionalColumns") && data.additionalColumns != null && $.isArray(data.additionalColumns))
|
||||
{
|
||||
// ...loops through them
|
||||
$.each(data.additionalColumns, function(i, additionalColumn) {
|
||||
|
||||
var tmpColumnObj = {}; // New object that represents a column
|
||||
|
||||
// If was given a definition for this field then use it!
|
||||
if (recordFieldsDefinitions != null && recordFieldsDefinitions.hasOwnProperty(additionalColumn))
|
||||
{
|
||||
tmpColumnObj = recordFieldsDefinitions[additionalColumn];
|
||||
}
|
||||
|
||||
tmpColumnObj.title = additionalColumn; // Give a title to this field (header)
|
||||
tmpColumnObj.field = additionalColumn; // Field name to be linked with dataset field name
|
||||
|
||||
fieldsToDisplayTabulator.push(tmpColumnObj); // Add tmpColumnObj to tabulatorColumns
|
||||
});
|
||||
}
|
||||
|
||||
return fieldsToDisplayTabulator;
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets options for the representation
|
||||
*/
|
||||
_getRepresentationOptions: function(data) {
|
||||
|
||||
var options = {}; // eventually contains options fot the representation
|
||||
|
||||
// Checks if options were given
|
||||
if (data.hasOwnProperty("datasetRepresentationOptions") && data.datasetRepresentationOptions != "")
|
||||
{
|
||||
var tmpOptions = eval("(" + data.datasetRepresentationOptions + ")"); // and converts them from string to javascript code
|
||||
|
||||
// If it is an object then can be used
|
||||
if (typeof tmpOptions == "object")
|
||||
{
|
||||
options = tmpOptions;
|
||||
}
|
||||
}
|
||||
|
||||
return options;
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets record fields definitions to represent the dataset
|
||||
*/
|
||||
_getRepresentationFieldsDefinitions: function(data) {
|
||||
|
||||
var fieldsDefinitions = {}; // eventually contains record fields definitions
|
||||
|
||||
// Checks if record fields definitions was given as parameter
|
||||
if (data.hasOwnProperty("datasetRepresentationFieldsDefinitions") && data.datasetRepresentationFieldsDefinitions != "")
|
||||
{
|
||||
var tmpFDefs = eval("(" + data.datasetRepresentationFieldsDefinitions + ")"); // and converts them from string to javascript code
|
||||
|
||||
// If it is an object then can be used
|
||||
if (typeof tmpFDefs == "object")
|
||||
{
|
||||
fieldsDefinitions = tmpFDefs;
|
||||
}
|
||||
}
|
||||
|
||||
return fieldsDefinitions;
|
||||
},
|
||||
|
||||
_clearTablesorterLocalStorage: function() {
|
||||
localStorage.removeItem("tablesorter-filters");
|
||||
},
|
||||
@@ -1072,8 +1238,29 @@ var FHC_FilterWidget = {
|
||||
{
|
||||
FHC_FilterWidget._datasetRepresentation = data.datasetRepresentation;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Set what type of dataset representation was choosen
|
||||
*/
|
||||
_setHideMenu: function(data) {
|
||||
|
||||
if (data.hasOwnProperty("hideMenu"))
|
||||
{
|
||||
FHC_FilterWidget._hideMenu = data.hideMenu;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Set what type of dataset representation was choosen
|
||||
*/
|
||||
_setHideOptions: function(data) {
|
||||
|
||||
if (data.hasOwnProperty("hideOptions"))
|
||||
{
|
||||
FHC_FilterWidget._hideOptions = data.hideOptions;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,594 @@
|
||||
/**
|
||||
* TableWidget JS magic
|
||||
*/
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------
|
||||
// Constants
|
||||
|
||||
//
|
||||
const DATASET_REP_TABLESORTER = "tablesorter";
|
||||
const DATASET_REP_PIVOTUI = "pivotUI";
|
||||
const DATASET_REP_TABULATOR = "tabulator";
|
||||
|
||||
/**
|
||||
* FHC_TableWidget this object is used to render the GUI of a table widget and to operate with it
|
||||
*/
|
||||
var FHC_TableWidget = {
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
// Properties
|
||||
|
||||
_datasetRepresentation: null, // contains the current data representation
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
|
||||
/**
|
||||
* To display the TableWidget using the loaded data prenset in the session
|
||||
*/
|
||||
display: function() {
|
||||
|
||||
FHC_TableWidget._getTables(FHC_TableWidget._renderTableWidget);
|
||||
},
|
||||
|
||||
/**
|
||||
* Alias call to method display only to inprove the readability of the code
|
||||
*/
|
||||
refresh: function() {
|
||||
|
||||
FHC_TableWidget.display();
|
||||
},
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
// Private methods
|
||||
|
||||
/**
|
||||
* To retrive the page where the TableWidget is used, using the FHC_JS_DATA_STORAGE_OBJECT
|
||||
*/
|
||||
_getTableUniqueIdPrefix: function() {
|
||||
|
||||
return FHC_JS_DATA_STORAGE_OBJECT.called_path + "/" + FHC_JS_DATA_STORAGE_OBJECT.called_method;
|
||||
},
|
||||
|
||||
/**
|
||||
* Utility method that checks if data contains an error and print that to the console
|
||||
* otherwise the TableWidget GUI is refreshed
|
||||
*/
|
||||
_failOrRefresh: function(data, textStatus, jqXHR) {
|
||||
|
||||
if (FHC_AjaxClient.isError(data))
|
||||
{
|
||||
console.log(FHC_AjaxClient.getError(data));
|
||||
}
|
||||
else
|
||||
{
|
||||
FHC_TableWidget.refresh();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Utility method that checks if data contains an error and print that to the console
|
||||
* otherwise the page is reloaded
|
||||
*/
|
||||
_failOrReload: function(data, textStatus, jqXHR) {
|
||||
|
||||
if (FHC_AjaxClient.isError(data))
|
||||
{
|
||||
console.log(FHC_AjaxClient.getError(data));
|
||||
}
|
||||
else
|
||||
{
|
||||
location.reload();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* To reset the Table Widget GUI
|
||||
*/
|
||||
_resetGUI: function(tableWidgetDiv) {
|
||||
|
||||
// If the choosen dataset representation is tablesorter
|
||||
if (FHC_TableWidget._datasetRepresentation == DATASET_REP_TABLESORTER)
|
||||
{
|
||||
tableWidgetDiv.find("#tableWidgetTableDataset > thead > tr").html("");
|
||||
tableWidgetDiv.find("#tableWidgetTableDataset > tbody").html("");
|
||||
}
|
||||
|
||||
// If the choosen dataset representation is pivotUI
|
||||
if (FHC_TableWidget._datasetRepresentation == DATASET_REP_PIVOTUI)
|
||||
{
|
||||
tableWidgetDiv.find("#tableWidgetPivotUI").html("");
|
||||
}
|
||||
|
||||
// If the choosen dataset representation is tabulator
|
||||
if (FHC_TableWidget._datasetRepresentation == DATASET_REP_TABULATOR)
|
||||
{
|
||||
tableWidgetDiv.find("#tableWidgetTabulator").html("");
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* To get via Ajax all the data related to the TableWidget present in the given page
|
||||
* If the parameter renderFunction is a valid function, is called on success
|
||||
*/
|
||||
_getTables: function(renderFunction) {
|
||||
|
||||
var tableWidgetUniqueIdArray = FHC_TableWidget._getTableWidgetUniqueIdArray();
|
||||
|
||||
for (var tableWidgetsCounter = 0; tableWidgetsCounter < tableWidgetUniqueIdArray.length; tableWidgetsCounter++)
|
||||
{
|
||||
FHC_AjaxClient.ajaxCallGet(
|
||||
"widgets/Tables/getTable",
|
||||
{
|
||||
tableUniqueId: FHC_TableWidget._getTableUniqueIdPrefix() + "/" + tableWidgetUniqueIdArray[tableWidgetsCounter]
|
||||
},
|
||||
{
|
||||
successCallback: function(data, textStatus, jqXHR) {
|
||||
|
||||
if (FHC_AjaxClient.hasData(data))
|
||||
{
|
||||
if (typeof renderFunction == "function")
|
||||
{
|
||||
renderFunction(FHC_AjaxClient.getData(data));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
console.log(FHC_AjaxClient.getError(data));
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* This method calls all the other methods needed to rendere the GUI for a TableWidget
|
||||
* The parameter data contains all the data about the TableWidget and it is given as parameter
|
||||
* to all the methods that here are called
|
||||
* NOTE: think very carefully before changing the order of the calls
|
||||
*/
|
||||
_renderTableWidget: function(data) {
|
||||
|
||||
FHC_TableWidget._setDatasetRepresentation(data); // set what type of dataset representation was choosen
|
||||
|
||||
var tableWidgetDiv = $('div[tableUniqueId="' + data.tableUniqueId + '"]');
|
||||
|
||||
FHC_TableWidget._turnOffEvents(tableWidgetDiv); // turns all the events off
|
||||
|
||||
FHC_TableWidget._resetGUI(tableWidgetDiv); // Reset the entire GUI
|
||||
|
||||
FHC_TableWidget._renderDataset(tableWidgetDiv, data);
|
||||
|
||||
FHC_TableWidget._turnOnEvents(tableWidgetDiv); // turns all the events off
|
||||
},
|
||||
|
||||
/**
|
||||
* Turns all the events off
|
||||
* NOTE: must be aligned to _turnOnEvents
|
||||
*/
|
||||
_turnOffEvents: function(tableWidgetDiv) {
|
||||
|
||||
// If the choosen dataset representation is tablesorter
|
||||
if (FHC_TableWidget._datasetRepresentation == DATASET_REP_TABLESORTER)
|
||||
{
|
||||
FHC_TableWidget._disableTablesorter(tableWidgetDiv); // disable the tablesorter
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Turns all the events on
|
||||
* NOTE: must be aligned to _turnOffEvents
|
||||
*/
|
||||
_turnOnEvents: function(tableWidgetDiv) {
|
||||
|
||||
// If the choosen dataset representation is tablesorter
|
||||
if (FHC_TableWidget._datasetRepresentation == DATASET_REP_TABLESORTER)
|
||||
{
|
||||
FHC_TableWidget._enableTableSorter(tableWidgetDiv); // enable the tablesorter
|
||||
}
|
||||
},
|
||||
|
||||
_renderDataset: function(tableWidgetDiv, data) {
|
||||
|
||||
// If the choosen dataset representation is tablesorter then...
|
||||
if (FHC_TableWidget._datasetRepresentation == DATASET_REP_TABLESORTER)
|
||||
{
|
||||
FHC_TableWidget._renderDatasetTablesorter(tableWidgetDiv, data); // ...render the tablesorter GUI
|
||||
}
|
||||
|
||||
// If the choosen dataset representation is pivotUI then...
|
||||
if (FHC_TableWidget._datasetRepresentation == DATASET_REP_PIVOTUI)
|
||||
{
|
||||
FHC_TableWidget._renderDatasetPivotUI(tableWidgetDiv, data); // ...render the pivotUI GUI
|
||||
}
|
||||
|
||||
// If the choosen dataset representation is tabulator then...
|
||||
if (FHC_TableWidget._datasetRepresentation == DATASET_REP_TABULATOR)
|
||||
{
|
||||
FHC_TableWidget._renderDatasetTabulator(tableWidgetDiv, data); // ...render the tabulator GUI
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Renders the tablesorter for the TableWidget
|
||||
* The data to be displayed are retrived from the parameter data
|
||||
*/
|
||||
_renderDatasetTablesorter: function(tableWidgetDiv, data) {
|
||||
|
||||
if (data.hasOwnProperty("checkboxes") && data.checkboxes != null && data.checkboxes.trim() != "")
|
||||
{
|
||||
tableWidgetDiv.find("#tableWidgetTableDataset > thead > tr").append("<th data-filter='false' title='Select'>Select</th>");
|
||||
}
|
||||
|
||||
var arrayFieldsToDisplay = FHC_TableWidget._getFieldsToDisplay(data);
|
||||
|
||||
for (var i = 0; i < arrayFieldsToDisplay.length; i++)
|
||||
{
|
||||
var columnName = arrayFieldsToDisplay[i];
|
||||
|
||||
tableWidgetDiv.find("#tableWidgetTableDataset > thead > tr").append("<th title='" + columnName + "'>" + columnName + "</th>");
|
||||
}
|
||||
|
||||
if (data.hasOwnProperty("additionalColumns") && $.isArray(data.additionalColumns))
|
||||
{
|
||||
for (var i = 0; i < data.additionalColumns.length; i++)
|
||||
{
|
||||
var columnName = data.additionalColumns[i];
|
||||
|
||||
tableWidgetDiv.find("#tableWidgetTableDataset > thead > tr").append("<th title='" + columnName + "'>" + columnName + "</th>");
|
||||
}
|
||||
}
|
||||
|
||||
if (arrayFieldsToDisplay.length > 0)
|
||||
{
|
||||
if (data.hasOwnProperty("dataset") && $.isArray(data.dataset))
|
||||
{
|
||||
if (data.checkboxes != null && data.checkboxes != "")
|
||||
{
|
||||
// select checkbox range with shift key
|
||||
if (typeof tableWidgetDiv.find("#tableWidgetTableDataset").checkboxes === 'function')
|
||||
tableWidgetDiv.find("#tableWidgetTableDataset").checkboxes("range", true);
|
||||
}
|
||||
|
||||
for (var i = 0; i < data.dataset.length; i++)
|
||||
{
|
||||
var record = data.dataset[i];
|
||||
|
||||
if ($.isEmptyObject(record))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var strHtml = "<tr class='" + record.MARK_ROW_CLASS + "'>";
|
||||
|
||||
if (data.checkboxes != null && data.checkboxes != "")
|
||||
{
|
||||
strHtml += "<td>";
|
||||
strHtml += "<input type='checkbox' name='" + data.checkboxes + "[]' value='" + record[data.checkboxes] + "'>";
|
||||
strHtml += "</td>";
|
||||
}
|
||||
|
||||
$.each(arrayFieldsToDisplay, function(i, fieldToDisplay) {
|
||||
|
||||
if (record.hasOwnProperty(data.fields[i]))
|
||||
{
|
||||
strHtml += "<td>" + record[data.fields[i]] + "</td>";
|
||||
}
|
||||
});
|
||||
|
||||
if (data.additionalColumns != null && $.isArray(data.additionalColumns))
|
||||
{
|
||||
$.each(data.additionalColumns, function(i, additionalColumn) {
|
||||
|
||||
if (record.hasOwnProperty(additionalColumn))
|
||||
{
|
||||
strHtml += "<td>" + record[additionalColumn] + "</td>";
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
strHtml += "</tr>";
|
||||
|
||||
tableWidgetDiv.find("#tableWidgetTableDataset > tbody").append(strHtml);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Enable the tablesorter libs to render the dataset table with sorting features
|
||||
*/
|
||||
_enableTableSorter: function(tableWidgetDiv) {
|
||||
|
||||
var tableWidgetTablesorter = tableWidgetDiv.find("#tableWidgetTableDataset");
|
||||
|
||||
// Checks if the table contains data (rows)
|
||||
if (tableWidgetTablesorter.find("tbody:empty").length == 0
|
||||
&& tableWidgetTablesorter.find("tr:empty").length == 0
|
||||
&& tableWidgetTablesorter.hasClass("table-condensed"))
|
||||
{
|
||||
tableWidgetTablesorter.tablesorter({
|
||||
dateFormat: "ddmmyyyy",
|
||||
widgets: ["zebra", "filter"],
|
||||
widgetOptions: {
|
||||
filter_saveFilters : true
|
||||
}
|
||||
});
|
||||
|
||||
$.tablesorter.updateAll(tableWidgetTablesorter[0].config, true, null);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Disable the tablesorter
|
||||
*/
|
||||
_disableTablesorter: function(tableWidgetDiv) {
|
||||
|
||||
tableWidgetDiv.find("#tableWidgetTableDataset").trigger("disable");
|
||||
},
|
||||
|
||||
/**
|
||||
* Renders the pivotUI for the TableWidget
|
||||
* The data to be displayed are retrived from the parameter data
|
||||
*/
|
||||
_renderDatasetPivotUI: function(tableWidgetDiv, data) {
|
||||
|
||||
// Checks if options were given and returns them
|
||||
var options = FHC_TableWidget._getRepresentationOptions(data);
|
||||
|
||||
// Manipulation for the representation!
|
||||
var arrayFieldsToDisplay = FHC_TableWidget._getFieldsToDisplay(data);
|
||||
|
||||
// If there are fields to be displayed...
|
||||
if (arrayFieldsToDisplay.length > 0)
|
||||
{
|
||||
// ...if there are data to be displayed...
|
||||
if (data.hasOwnProperty("dataset") && $.isArray(data.dataset))
|
||||
{
|
||||
// Build the array of objects used by pivotUI and store it in pivotUIData
|
||||
var pivotUIData = [];
|
||||
|
||||
// Loops through data
|
||||
for (var i = 0; i < data.dataset.length; i++)
|
||||
{
|
||||
var record = data.dataset[i]; // Single record
|
||||
var tmpObj = {}; // New object that represents a record
|
||||
|
||||
// Loops through columns of a record
|
||||
$.each(arrayFieldsToDisplay, function(i, fieldToDisplay) {
|
||||
|
||||
if (record.hasOwnProperty(data.fields[i]))
|
||||
{
|
||||
tmpObj[fieldToDisplay] = record[data.fields[i]]; // Add data with the column alias
|
||||
}
|
||||
});
|
||||
|
||||
// If additional columns are present...
|
||||
if (data.additionalColumns != null && $.isArray(data.additionalColumns))
|
||||
{
|
||||
// ...loops through them
|
||||
$.each(data.additionalColumns, function(i, additionalColumn) {
|
||||
|
||||
if (record.hasOwnProperty(additionalColumn))
|
||||
{
|
||||
tmpObj[additionalColumn] = record[additionalColumn]; // Add the additional column
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
pivotUIData.push(tmpObj); // Add tmpObj to pivotUIData
|
||||
}
|
||||
|
||||
// Renders the pivotUI
|
||||
tableWidgetDiv.find("#tableWidgetPivotUI").pivotUI(
|
||||
pivotUIData,
|
||||
options
|
||||
);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Retrives the fields to be displayed from the data parameter, if aliases are present then they are used
|
||||
*/
|
||||
_getFieldsToDisplay: function(data) {
|
||||
|
||||
var arrayFieldsToDisplay = [];
|
||||
|
||||
if (data.hasOwnProperty("fields") && $.isArray(data.fields))
|
||||
{
|
||||
if (data.hasOwnProperty("columnsAliases") && $.isArray(data.columnsAliases))
|
||||
{
|
||||
for (var sfc = 0; sfc < data.fields.length; sfc++)
|
||||
{
|
||||
for (var fc = 0; fc < data.fields.length; fc++)
|
||||
{
|
||||
if (data.fields[sfc] == data.fields[fc])
|
||||
{
|
||||
arrayFieldsToDisplay[sfc] = data.columnsAliases[fc];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
arrayFieldsToDisplay = data.fields;
|
||||
}
|
||||
}
|
||||
|
||||
return arrayFieldsToDisplay;
|
||||
},
|
||||
|
||||
/**
|
||||
* Renders the tabulator for the TableWidget
|
||||
* The data to be displayed are retrived from the parameter data
|
||||
*/
|
||||
_renderDatasetTabulator: function(tableWidgetDiv, data) {
|
||||
|
||||
// Checks if options were given and returns them
|
||||
var options = FHC_TableWidget._getRepresentationOptions(data);
|
||||
// Checks if record fields definitions were given and returns them
|
||||
var recordFieldsDefinitions = FHC_TableWidget._getRepresentationFieldsDefinitions(data);
|
||||
|
||||
// Manipulation for the representation!
|
||||
var arrayTabulatorColumns = FHC_TableWidget._getTabulatorColumns(data, recordFieldsDefinitions);
|
||||
|
||||
if (arrayTabulatorColumns.length > 0)
|
||||
{
|
||||
// ...if there are data to be displayed...
|
||||
if (data.hasOwnProperty("dataset") && $.isArray(data.dataset))
|
||||
{
|
||||
if (options == null) options = {};
|
||||
|
||||
options.columns = arrayTabulatorColumns;
|
||||
options.data = data.dataset;
|
||||
|
||||
// Renders the tabulator
|
||||
tableWidgetDiv.find("#tableWidgetTabulator").tabulator(options);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Retrives the fields to be displayed from the data parameter, if aliases are present then they are used
|
||||
*/
|
||||
_getTabulatorColumns: function(data, recordFieldsDefinitions) {
|
||||
|
||||
var fieldsToDisplayTabulator = [];
|
||||
|
||||
if (data.hasOwnProperty("fields") && $.isArray(data.fields))
|
||||
{
|
||||
for (var sfc = 0; sfc < data.fields.length; sfc++)
|
||||
{
|
||||
for (var fc = 0; fc < data.fields.length; fc++)
|
||||
{
|
||||
if (data.fields[sfc] == data.fields[fc])
|
||||
{
|
||||
// Build the array of objects (columns) used by tabulator and store it in tabulatorColumns
|
||||
var tmpColumnObj = {}; // New object that represents a column
|
||||
|
||||
// If was given a definition for this field then use it!
|
||||
if (recordFieldsDefinitions != null && recordFieldsDefinitions.hasOwnProperty(data.fields[sfc]))
|
||||
{
|
||||
tmpColumnObj = recordFieldsDefinitions[data.fields[sfc]];
|
||||
}
|
||||
|
||||
tmpColumnObj.field = data.fields[sfc]; // Field name to be linked with dataset field name
|
||||
|
||||
// If there is an alias for this field use it to give a title to this field (header)
|
||||
if (data.hasOwnProperty("columnsAliases") && $.isArray(data.columnsAliases))
|
||||
{
|
||||
tmpColumnObj.title = data.columnsAliases[fc];
|
||||
}
|
||||
else // otherwise use the field name itself
|
||||
{
|
||||
tmpColumnObj.title = data.fields[sfc];
|
||||
}
|
||||
|
||||
fieldsToDisplayTabulator.push(tmpColumnObj); // Add tmpColumnObj to tabulatorColumns
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If additional columns are present...
|
||||
if (data.hasOwnProperty("additionalColumns") && data.additionalColumns != null && $.isArray(data.additionalColumns))
|
||||
{
|
||||
// ...loops through them
|
||||
$.each(data.additionalColumns, function(i, additionalColumn) {
|
||||
|
||||
var tmpColumnObj = {}; // New object that represents a column
|
||||
|
||||
// If was given a definition for this field then use it!
|
||||
if (recordFieldsDefinitions != null && recordFieldsDefinitions.hasOwnProperty(additionalColumn))
|
||||
{
|
||||
tmpColumnObj = recordFieldsDefinitions[additionalColumn];
|
||||
}
|
||||
|
||||
tmpColumnObj.title = additionalColumn; // Give a title to this field (header)
|
||||
tmpColumnObj.field = additionalColumn; // Field name to be linked with dataset field name
|
||||
|
||||
fieldsToDisplayTabulator.push(tmpColumnObj); // Add tmpColumnObj to tabulatorColumns
|
||||
});
|
||||
}
|
||||
|
||||
return fieldsToDisplayTabulator;
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets options for the representation
|
||||
*/
|
||||
_getRepresentationOptions: function(data) {
|
||||
|
||||
var options = {}; // eventually contains options fot the representation
|
||||
|
||||
// Checks if options were given
|
||||
if (data.hasOwnProperty("datasetRepresentationOptions") && data.datasetRepresentationOptions != "")
|
||||
{
|
||||
var tmpOptions = eval("(" + data.datasetRepresentationOptions + ")"); // and converts them from string to javascript code
|
||||
|
||||
// If it is an object then can be used
|
||||
if (typeof tmpOptions == "object")
|
||||
{
|
||||
options = tmpOptions;
|
||||
}
|
||||
}
|
||||
|
||||
return options;
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets record fields definitions to represent the dataset
|
||||
*/
|
||||
_getRepresentationFieldsDefinitions: function(data) {
|
||||
|
||||
var fieldsDefinitions = {}; // eventually contains record fields definitions
|
||||
|
||||
// Checks if record fields definitions was given as parameter
|
||||
if (data.hasOwnProperty("datasetRepresentationFieldsDefinitions") && data.datasetRepresentationFieldsDefinitions != "")
|
||||
{
|
||||
var tmpFDefs = eval("(" + data.datasetRepresentationFieldsDefinitions + ")"); // and converts them from string to javascript code
|
||||
|
||||
// If it is an object then can be used
|
||||
if (typeof tmpFDefs == "object")
|
||||
{
|
||||
fieldsDefinitions = tmpFDefs;
|
||||
}
|
||||
}
|
||||
|
||||
return fieldsDefinitions;
|
||||
},
|
||||
|
||||
/**
|
||||
* Set what type of dataset representation was choosen
|
||||
*/
|
||||
_setDatasetRepresentation: function(data) {
|
||||
|
||||
if (data.hasOwnProperty("datasetRepresentation"))
|
||||
{
|
||||
FHC_TableWidget._datasetRepresentation = data.datasetRepresentation;
|
||||
}
|
||||
},
|
||||
|
||||
_getTableWidgetUniqueIdArray: function() {
|
||||
|
||||
var tableWidgetUniqueIdArray = [];
|
||||
|
||||
$("div[id*='divTableWidgetDataset']").each(function(i, e) {
|
||||
|
||||
tableWidgetUniqueIdArray.push(e.attributes["tableUniqueId"].nodeValue);
|
||||
});
|
||||
|
||||
return tableWidgetUniqueIdArray;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* When JQuery is up
|
||||
*/
|
||||
$(document).ready(function() {
|
||||
|
||||
FHC_TableWidget.display();
|
||||
|
||||
});
|
||||
@@ -71,9 +71,9 @@ var InfocenterPersonDataset = {
|
||||
var personcount = 0;
|
||||
|
||||
FHC_AjaxClient.ajaxCallGet(
|
||||
'system/Filters/rowNumber',
|
||||
'widgets/Filters/rowNumber',
|
||||
{
|
||||
filter_page: FHC_FilterWidget.getFilterPage()
|
||||
filterUniqueId: FHC_FilterWidget.getFilterUniqueIdPrefix()
|
||||
},
|
||||
{
|
||||
successCallback: function(data, textStatus, jqXHR) {
|
||||
|
||||
@@ -0,0 +1,563 @@
|
||||
/**
|
||||
* Javascript file for Lehrauftraege annehmen view and tabulator
|
||||
* Lehrauftraege annehmen: acceptLehrauftrag.php
|
||||
* Lehrauftraege annehmen - Tabulator: acceptLehrauftragData.php
|
||||
*/
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Global vars
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
const COLOR_LIGHTGREY = "#f5f5f5";
|
||||
|
||||
/**
|
||||
* PNG icons used in status- and filter buttons
|
||||
* Setting png icons is a workaround to use font-awsome 5.9.0 icons until system can be updated to newer font awsome version.
|
||||
* */
|
||||
const ICON_LEHRAUFTRAG_ORDERED = '<img src="../../../public/images/icons/fa-user-tag.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
const ICON_LEHRAUFTRAG_APPROVED = '<img src="../../../public/images/icons/fa-user-check.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
const ICON_LEHRAUFTRAG_CHANGED = '<img src="../../../public/images/icons/fa-user-edit.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Mutators - setter methods to manipulate table data when entering the tabulator
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Converts string date postgre style to string DD.MM.YYYY.
|
||||
// This will allow correct filtering.
|
||||
var mut_formatStringDate = function(value, data, type, params, component) {
|
||||
if (value != null)
|
||||
{
|
||||
var d = new Date(value);
|
||||
return ("0" + (d.getDate())).slice(-2) + "." + ("0"+(d.getMonth()+1)).slice(-2) + "." + d.getFullYear();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Formatters - changes display information, not the data itself
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Formats null values to a string number '0.00'
|
||||
var form_formatNulltoStringNumber = function(cell, formatterParams){
|
||||
if (cell.getValue() == null){
|
||||
if (formatterParams.precision == 1)
|
||||
{
|
||||
return '0.0';
|
||||
}
|
||||
return '0.00';
|
||||
}
|
||||
else {
|
||||
return cell.getValue();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Header filter
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Filters values using comparison operator or just by string comparison
|
||||
function hf_filterStringnumberWithOperator(headerValue, rowValue, rowData){
|
||||
|
||||
// If string starts with <, <=, >, >=, !=, ==, compare values with that operator
|
||||
var operator = '';
|
||||
if (headerValue.match(/([<=>!]{1,2})/g)) {
|
||||
var operator_arr = headerValue.match(/([<=>!]{1,2})/g);
|
||||
operator = operator_arr[0];
|
||||
|
||||
headerValue = headerValue
|
||||
.replace(operator, '')
|
||||
.trim()
|
||||
;
|
||||
|
||||
// return if value comparison is true
|
||||
return eval(rowValue + operator + headerValue);
|
||||
}
|
||||
|
||||
// If just a stringnumber, return if exact match found
|
||||
return parseFloat(rowValue) == headerValue;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Tabulator table format functions
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Formats the rows
|
||||
function func_rowFormatter(row){
|
||||
var bestellt = row.getData().bestellt;
|
||||
var erteilt = row.getData().erteilt;
|
||||
var akzeptiert = row.getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Formats the color of the rows depending on their status
|
||||
- orange: geaendert
|
||||
- default: bestellte und erteilte (= zu akzeptierende)
|
||||
- green: akzeptierte
|
||||
- grey: all other (marks unselectable)
|
||||
*/
|
||||
row.getCells().forEach(function(cell){
|
||||
if (bestellt != null && (betrag != vertrag_betrag) ||
|
||||
bestellt != null && stunden != vertrag_stunden)
|
||||
{
|
||||
cell.getElement().classList.add('bg-warning'); // geaenderte
|
||||
}
|
||||
else if(bestellt != null && erteilt != null && akzeptiert == null)
|
||||
{
|
||||
return; // bestellte + erteilte
|
||||
}
|
||||
else if(bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
cell.getElement().classList.add('bg-success') // akzeptierte
|
||||
}
|
||||
else
|
||||
{
|
||||
row.getElement().style["background-color"] = COLOR_LIGHTGREY; // default
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Formats row selectable/unselectable
|
||||
function func_selectableCheck(row){
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
// only allow to select bestellte && erteilte && nicht geaenderte Lehraufträge
|
||||
return row.getData().bestellt != null && // bestellt
|
||||
row.getData().erteilt != null && // AND erteilt
|
||||
row.getData().akzeptiert == null && // AND nicht akzeptiert
|
||||
betrag == vertrag_betrag &&
|
||||
stunden == vertrag_stunden; // OR nicht geaenderte
|
||||
}
|
||||
|
||||
// Adds column status
|
||||
function func_tableBuilt(table) {
|
||||
// Add status column to table
|
||||
table.addColumn(
|
||||
{
|
||||
title: "<i class='fa fa-user-o'></i>",
|
||||
field: "status",
|
||||
width:40,
|
||||
align:"center",
|
||||
downloadTitle: 'Status',
|
||||
formatter: status_formatter,
|
||||
tooltip: status_tooltip
|
||||
}, true
|
||||
);
|
||||
}
|
||||
|
||||
// Sets status values into column status
|
||||
function func_renderStarted(table){
|
||||
// Set literally status to each row - this enables sorting by status despite using icons
|
||||
table.getRows().forEach(function(row){
|
||||
var bestellt = row.getData().bestellt;
|
||||
var erteilt = row.getData().erteilt;
|
||||
var akzeptiert = row.getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
if ((bestellt != null && betrag != vertrag_betrag) ||
|
||||
(bestellt != null && stunden != vertrag_stunden))
|
||||
{
|
||||
row.getData().status = 'Geändert'; // geaendert
|
||||
}
|
||||
else if (bestellt == null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Neu'; // neu
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Bestellt'; // bestellt
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Erteilt'; // erteilt
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
row.getData().status = 'Akzeptiert'; // akzeptiert
|
||||
}
|
||||
else
|
||||
{
|
||||
row.getData().status = null; // default
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Performes after row was updated
|
||||
function func_rowUpdated(row){
|
||||
|
||||
// Refresh status icon and row color
|
||||
row.reformat(); // retriggers cell formatters and rowFormatter callback
|
||||
|
||||
// Deselect and disable new selection of updated rows
|
||||
row.deselect();
|
||||
row.getElement().style["pointerEvents"] = "none";
|
||||
}
|
||||
|
||||
// Hide betrag, if lector has inkludierte Lehre
|
||||
function func_renderComplete(table){
|
||||
|
||||
// Check if the lectors actual Verwendung has inkludierte Lehre
|
||||
FHC_AjaxClient.ajaxCallGet(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.called_path + "/checkInkludierteLehre",
|
||||
null,
|
||||
{
|
||||
successCallback: function (data, textStatus, jqXHR)
|
||||
{
|
||||
// If lector has inkludierte Lehre, hide the column betrag
|
||||
if (data.retval)
|
||||
{
|
||||
table.hideColumn("betrag");
|
||||
}
|
||||
},
|
||||
errorCallback: function (jqXHR, textStatus, errorThrown)
|
||||
{
|
||||
FHC_DialogLib.alertError("Systemfehler<br>Bitte kontaktieren Sie Ihren Administrator.");
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
// Tabulator footer element
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Adds a footer with buttons select all / deselect all / download
|
||||
function func_footerElement(){
|
||||
|
||||
var footer_html = '<div class="row">';
|
||||
footer_html += '<div class="col-lg-12" style="padding: 5px;">';
|
||||
|
||||
footer_html += '<div class="btn-toolbar pull-right" role="toolbar">';
|
||||
footer_html += '<div class="btn-group" role="group">';
|
||||
footer_html += '<button id="download-csv" class="btn btn-default" type="button" data-toggle="tooltip" data-placement="left" title="Download CSV" onclick="footer_downloadCSV()"><small>CSV </small><i class="fa fa-arrow-down"></i></button>';
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
footer_html += '<div class="btn-toolbar" role="toolbar">';
|
||||
footer_html += '<div class="btn-group" role="group">';
|
||||
footer_html += '<button id="select-all" class="btn btn-default pull-left" type="button" onclick="footer_selectAll()">Alle auswählen</button>';
|
||||
footer_html += '<button id="deselect-all" class="btn btn-default pull-left" type="button" onclick="footer_deselectAll()">Alle abwählen</button>';
|
||||
footer_html += '<span id="number-selected" style="margin-left: 20px; line-height: 2; font-weight: normal"></span>';
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
return footer_html;
|
||||
}
|
||||
|
||||
// Performs download CSV
|
||||
function footer_downloadCSV(){
|
||||
$('#tableWidgetTabulator').tabulator("download", "csv", "data.csv", {bom:true}); // BOM for correct UTF-8 char output
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs select all
|
||||
* Select all (filtered) rows and ignore rows that are bestellt and erteilt
|
||||
*/
|
||||
function footer_selectAll(){
|
||||
$('#tableWidgetTabulator').tabulator('getRows', true)
|
||||
.filter(row => row.getData().bestellt != null && // bestellt
|
||||
row.getData().erteilt != null && // AND erteilt
|
||||
row.getData().akzeptiert == null && // AND NOT akzeptiert
|
||||
row.getData().status != 'Geändert') // AND NOT geändert
|
||||
.forEach((row => row.select()));
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs deselect all
|
||||
* Deselect all (filtered) rows
|
||||
*/
|
||||
function footer_deselectAll(){
|
||||
$('#tableWidgetTabulator').tabulator('deselectRow');
|
||||
}
|
||||
|
||||
// Displays number of selected rows on row selection change
|
||||
function func_rowSelectionChanged(data, rows){
|
||||
$('#number-selected').html("Für Annehmen ausgewählt: <strong>" + rows.length + "</strong>");
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Tabulator columns format functions
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Generates status icons
|
||||
status_formatter = function(cell, formatterParams, onRendered){
|
||||
|
||||
var bestellt = cell.getRow().getData().bestellt;
|
||||
var erteilt = cell.getRow().getData().erteilt;
|
||||
var akzeptiert = cell.getRow().getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(cell.getRow().getData().stunden);
|
||||
var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(cell.getRow().getData().betrag);
|
||||
var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
// commented icons would be so nice to have with fontawsome 5.11...
|
||||
if (bestellt != null && isNaN(vertrag_betrag))
|
||||
{
|
||||
return "<i class='fas fa-user-minus'></i>"; // kein Vertrag
|
||||
}
|
||||
else if (bestellt != null && (betrag != vertrag_betrag) ||
|
||||
bestellt != null && stunden != vertrag_stunden)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_CHANGED; // geaendert
|
||||
// return "<i class='fas fa-user-edit'></i>";
|
||||
}
|
||||
else if (bestellt == null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
return "<i class='fa fa-user-plus'></i>"; // neu
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_ORDERED; // bestellt
|
||||
// return "<i class='fa fa-user-tag'></i>";
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_APPROVED; // erteilt
|
||||
// return "<i class='fas fa-user-check'></i>";
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
return "<i class='fa fa-handshake-o'></i>"; // akzeptiert
|
||||
// return "<i class='fas fa-user-graduate'></i>";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "<i class='fa fa-user'></i>"; // default
|
||||
}
|
||||
};
|
||||
|
||||
// Generates status tooltip
|
||||
status_tooltip = function(cell){
|
||||
var bestellt = cell.getRow().getData().bestellt;
|
||||
var erteilt = cell.getRow().getData().erteilt;
|
||||
var akzeptiert = cell.getRow().getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(cell.getRow().getData().stunden);
|
||||
var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(cell.getRow().getData().betrag);
|
||||
var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
var text = 'Lehrauftrag in Bearbeitung. ';
|
||||
|
||||
if (bestellt != null && erteilt == null && akzeptiert == null
|
||||
&& (betrag != vertrag_betrag || stunden != vertrag_stunden)) // geaendert (when never erteilt before)
|
||||
{
|
||||
text += 'Wartet auf Erteilung.';
|
||||
return text;
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null
|
||||
&& (betrag != vertrag_betrag || stunden != vertrag_stunden)) // geaendert (when has been erteilt once)
|
||||
{
|
||||
text += 'Wartet auf erneute Erteilung.';
|
||||
return text;
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null) // bestellt
|
||||
{
|
||||
return 'Letzter Status: Bestellt. Wartet auf Erteilung.';
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null) // erteilt
|
||||
{
|
||||
return 'Letzter Status: Erteilt. Wartet auf Annahme durch Lektor.';
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null) // akzeptiert
|
||||
{
|
||||
return 'Letzter Status: Angenommen. Vertrag wurde beidseitig abgeschlossen.';
|
||||
}
|
||||
}
|
||||
|
||||
// Generates bestellt tooltip
|
||||
bestellt_tooltip = function(cell){
|
||||
if (cell.getRow().getData().bestellt_von != null)
|
||||
{
|
||||
return 'Bestellt von: ' + cell.getRow().getData().bestellt_von;
|
||||
}
|
||||
}
|
||||
|
||||
// Generates erteilt tooltip
|
||||
erteilt_tooltip = function(cell){
|
||||
if (cell.getRow().getData().erteilt_von != null) {
|
||||
return 'Erteilt von: ' + cell.getRow().getData().erteilt_von;
|
||||
}
|
||||
}
|
||||
|
||||
// Generates akzeptiert tooltip
|
||||
akzeptiert_tooltip = function(cell){
|
||||
if (cell.getRow().getData().akzeptiert_von != null) {
|
||||
return 'Angenommen von: ' + cell.getRow().getData().akzeptiert_von;
|
||||
}
|
||||
}
|
||||
|
||||
$(function() {
|
||||
|
||||
// Show all rows
|
||||
$("#show-all").click(function(){
|
||||
$('#tableWidgetTabulator').tabulator('clearFilter');
|
||||
});
|
||||
|
||||
// Show only rows with ordered lehrauftraege
|
||||
$("#show-ordered").click(function(){
|
||||
$('#tableWidgetTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '=', value: null},
|
||||
{field: 'akzeptiert', type: '=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with erteilte lehrauftraege
|
||||
$("#show-approved").click(function(){
|
||||
$('#tableWidgetTabulator').tabulator('setFilter', [
|
||||
{field: 'bestellt', type: '!=', value: null}, // filter when is bestellt
|
||||
{field: 'erteilt', type: '!=', value: null}, // and is erteilt
|
||||
{field: 'akzeptiert', type: '=', value: null} // and is not akzeptiert
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with akzeptierte lehrauftraege
|
||||
$("#show-accepted").click(function(){
|
||||
$('#tableWidgetTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '!=', value: null},
|
||||
{field: 'akzeptiert', type: '!=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Set png-icons into filter-buttons
|
||||
$(".btn-lehrauftrag").each(function(){
|
||||
switch(this.id) {
|
||||
case 'show-ordered':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_ORDERED;
|
||||
break;
|
||||
case 'show-approved':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_APPROVED;
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
// De/activate and un/focus on clicked button
|
||||
$(".btn-lehrauftrag").click(function() {
|
||||
|
||||
// De/activate and un/focus on clicked button
|
||||
$(".btn-lehrauftrag").removeClass('focus').removeClass('active');
|
||||
$(this).addClass('focus').addClass('active');
|
||||
});
|
||||
|
||||
// Approve Lehrauftraege
|
||||
$("#accept-lehrauftraege").click(function(){
|
||||
|
||||
// Get selected rows data
|
||||
var selected_data = $('#tableWidgetTabulator').tabulator('getSelectedData')
|
||||
.map(function(data){
|
||||
// reduce to necessary fields
|
||||
return {
|
||||
'row_index' : data.row_index,
|
||||
'vertrag_id' : data.vertrag_id
|
||||
}
|
||||
});
|
||||
|
||||
// Alert and exit if no lehraufgang is selected
|
||||
if (selected_data.length == 0)
|
||||
{
|
||||
FHC_DialogLib.alertInfo('Bitte wählen Sie erst zumindest einen Lehrauftrag');
|
||||
|
||||
// Emtpy password field
|
||||
$("#password").val('');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Get password for verification
|
||||
var password = $("#password").val();
|
||||
if (password == '')
|
||||
{
|
||||
FHC_DialogLib.alertInfo('Bitte verifizieren Sie sich mit Ihrem Login Passwort.');
|
||||
|
||||
// Focus on password field
|
||||
$("#password").focus();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Prepare data object for ajax call
|
||||
var data = {
|
||||
'password': password,
|
||||
'selected_data': selected_data
|
||||
};
|
||||
|
||||
FHC_AjaxClient.ajaxCallPost(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.called_path + "/acceptLehrauftrag",
|
||||
data,
|
||||
{
|
||||
successCallback: function (data, textStatus, jqXHR)
|
||||
{
|
||||
if (data.error)
|
||||
{
|
||||
// Password not verified
|
||||
FHC_DialogLib.alertWarning(data.retval);
|
||||
}
|
||||
if (!data.error && data.retval != null)
|
||||
{
|
||||
// Update status 'Erteilt'
|
||||
$('#tableWidgetTabulator').tabulator('updateData', data.retval);
|
||||
FHC_DialogLib.alertSuccess(data.retval.length + " Lehraufträge wurden akzeptiert.");
|
||||
}
|
||||
},
|
||||
errorCallback: function (jqXHR, textStatus, errorThrown)
|
||||
{
|
||||
FHC_DialogLib.alertError("Systemfehler<br>Bitte kontaktieren Sie Ihren Administrator.");
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// Empty password field
|
||||
$("#password").val('');
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
@@ -0,0 +1,682 @@
|
||||
/**
|
||||
* Javascript file for Lehrauftraege erteilen view and tabulator
|
||||
* Lehrauftraege erteilen: approveLehrauftrag.php
|
||||
* Lehrauftraege erteilen - Tabulator: approveLehrauftragData.php
|
||||
*/
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Global vars
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
const COLOR_LIGHTGREY = "#f5f5f5";
|
||||
|
||||
/**
|
||||
* PNG icons used in status- and filter buttons
|
||||
* Setting png icons is a workaround to use font-awsome 5.9.0 icons until system can be updated to newer font awsome version.
|
||||
* */
|
||||
const ICON_LEHRAUFTRAG_ORDERED = '<img src="../../../public/images/icons/fa-user-tag.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
const ICON_LEHRAUFTRAG_APPROVED = '<img src="../../../public/images/icons/fa-user-check.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
const ICON_LEHRAUFTRAG_CHANGED = '<img src="../../../public/images/icons/fa-user-edit.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Mutators - setter methods to manipulate table data when entering the tabulator
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Converts string date postgre style to string DD.MM.YYYY.
|
||||
// This will allow correct filtering.
|
||||
var mut_formatStringDate = function(value, data, type, params, component) {
|
||||
if (value != null)
|
||||
{
|
||||
var d = new Date(value);
|
||||
return ("0" + (d.getDate())).slice(-2) + "." + ("0" + (d.getMonth() + 1)).slice(-2) + "." + d.getFullYear();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Formatters - changes display information, not the data itself
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Formats null values to a string number '0.00'
|
||||
var form_formatNulltoStringNumber = function(cell, formatterParams){
|
||||
if (cell.getValue() == null){
|
||||
if (formatterParams.precision == 1)
|
||||
{
|
||||
return '0.0';
|
||||
}
|
||||
return '0.00';
|
||||
}
|
||||
else {
|
||||
return cell.getValue();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Header filter
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Filters values using comparison operator or just by string comparison
|
||||
function hf_filterStringnumberWithOperator(headerValue, rowValue, rowData){
|
||||
|
||||
// If string starts with <, <=, >, >=, !=, ==, compare values with that operator
|
||||
var operator = '';
|
||||
if (headerValue.match(/([<=>!]{1,2})/g)) {
|
||||
var operator_arr = headerValue.match(/([<=>!]{1,2})/g);
|
||||
operator = operator_arr[0];
|
||||
|
||||
headerValue = headerValue
|
||||
.replace(operator, '')
|
||||
.trim()
|
||||
;
|
||||
|
||||
// return if value comparison is true
|
||||
return eval(rowValue + operator + headerValue);
|
||||
}
|
||||
|
||||
// If just a stringnumber, return if exact match found
|
||||
return parseFloat(rowValue) == headerValue;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Custom filters
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Filters bestellte initially
|
||||
function func_initialFilter(){
|
||||
return [
|
||||
{field: 'personalnummer', type: '>=', value: 0}, // NOT dummy lector
|
||||
{field: 'bestellt', type: '!=', value: null}, // AND bestellt
|
||||
{field: 'erteilt', type: '=', value: null}, // AND NOT erteilt
|
||||
{field: 'akzeptiert', type: '=', value: null} // AND NOT akzeptiert
|
||||
]
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Tabulator table format functions
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Formats the group header
|
||||
function func_groupHeader(data){
|
||||
return data[0].lv_bezeichnung; // change name to lehrveranstaltung
|
||||
};
|
||||
|
||||
// Formats the rows
|
||||
function func_rowFormatter(row){
|
||||
var is_dummy = (row.getData().personalnummer <= 0 && row.getData().personalnummer != null);
|
||||
|
||||
var bestellt = row.getData().bestellt;
|
||||
var erteilt = row.getData().erteilt;
|
||||
var akzeptiert = row.getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
if (isNaN(stunden))
|
||||
{
|
||||
stunden = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_stunden))
|
||||
{
|
||||
vertrag_stunden = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_betrag))
|
||||
{
|
||||
vertrag_betrag = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Formats the color of the rows depending on their status
|
||||
- blue: dummy lectors
|
||||
- orange: geaendert
|
||||
- default (white) : bestellte
|
||||
- green: akzeptiert
|
||||
- grey: all other (marks unselectable)
|
||||
*/
|
||||
row.getCells().forEach(function(cell){
|
||||
if(is_dummy)
|
||||
{
|
||||
cell.getElement().classList.add('bg-info'); // dummy lectors
|
||||
}
|
||||
else if (bestellt != null && (betrag != vertrag_betrag) ||
|
||||
bestellt != null && stunden != vertrag_stunden &&
|
||||
!row._row.element.classList.contains('tabulator-calcs')) // exclude calculation rows
|
||||
{
|
||||
cell.getElement().classList.add('bg-warning'); // geaenderte
|
||||
}
|
||||
else if(bestellt != null && erteilt == null)
|
||||
{
|
||||
return; // bestellt
|
||||
}
|
||||
else if(bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
cell.getElement().classList.add('bg-success') // akzeptiert
|
||||
}
|
||||
else
|
||||
{
|
||||
row.getElement().style["background-color"] = COLOR_LIGHTGREY; // default
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Formats row selectable/unselectable
|
||||
function func_selectableCheck(row){
|
||||
var is_dummy = (row.getData().personalnummer <= 0 && row.getData().personalnummer != null);
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
if (isNaN(stunden))
|
||||
{
|
||||
stunden = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_stunden))
|
||||
{
|
||||
vertrag_stunden = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_betrag))
|
||||
{
|
||||
vertrag_betrag = 0;
|
||||
}
|
||||
|
||||
// only allow to select bestellte Lehraufträge
|
||||
return !is_dummy && // NOT dummy lector
|
||||
row.getData().bestellt != null && // AND NOT neue
|
||||
row.getData().erteilt == null && // AND bestellt
|
||||
betrag == vertrag_betrag &&
|
||||
stunden == vertrag_stunden; // AND nicht geändert
|
||||
}
|
||||
|
||||
// Adds column status
|
||||
function func_tableBuilt(table) {
|
||||
// Add status column to table
|
||||
table.addColumn(
|
||||
{
|
||||
title: "<i class='fa fa-user-o'></i>",
|
||||
field: "status",
|
||||
width:40,
|
||||
align:"center",
|
||||
downloadTitle: 'Status',
|
||||
formatter: status_formatter,
|
||||
tooltip: status_tooltip
|
||||
}, true
|
||||
);
|
||||
}
|
||||
|
||||
// Sets status values into column status
|
||||
function func_renderStarted(table){
|
||||
// set literally status to each row - this enables sorting by status despite using icons
|
||||
table.getRows().forEach(function(row){
|
||||
var bestellt = row.getData().bestellt;
|
||||
var erteilt = row.getData().erteilt;
|
||||
var akzeptiert = row.getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
if (isNaN(stunden))
|
||||
{
|
||||
stunden = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_stunden))
|
||||
{
|
||||
vertrag_stunden = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_betrag))
|
||||
{
|
||||
vertrag_betrag = 0;
|
||||
}
|
||||
|
||||
if ((bestellt != null && betrag != vertrag_betrag) ||
|
||||
(bestellt != null && stunden != vertrag_stunden))
|
||||
{
|
||||
row.getData().status = 'Geändert'; // geaendert
|
||||
}
|
||||
else if (bestellt == null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Neu'; // neu
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Bestellt'; // bestellt
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Erteilt'; // erteilt
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
row.getData().status = 'Akzeptiert'; // akzeptiert
|
||||
}
|
||||
else
|
||||
{
|
||||
row.getData().status = null; // default
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Performes after row was updated
|
||||
function func_rowUpdated(row){
|
||||
|
||||
// Refresh status icon and row color
|
||||
row.reformat(); // retriggers cell formatters and rowFormatter callback
|
||||
|
||||
// Deselect and disable new selection of updated rows
|
||||
row.deselect();
|
||||
row.getElement().style["pointerEvents"] = "none";
|
||||
}
|
||||
|
||||
|
||||
// Tabulator footer element
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Adds a footer with buttons select all / deselect all / download
|
||||
function func_footerElement(){
|
||||
|
||||
var footer_html = '<div class="row">';
|
||||
footer_html += '<div class="col-lg-12" style="padding: 5px;">';
|
||||
|
||||
footer_html += '<div class="btn-toolbar pull-right" role="toolbar">';
|
||||
footer_html += '<div class="btn-group" role="group">';
|
||||
footer_html += '<button id="download-csv" class="btn btn-default" type="button" data-toggle="tooltip" data-placement="left" title="Download CSV" onclick="footer_downloadCSV()"><small>CSV </small><i class="fa fa-arrow-down"></i></button>';
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
footer_html += '<div class="btn-toolbar" role="toolbar">';
|
||||
footer_html += '<div class="btn-group" role="group">';
|
||||
footer_html += '<button id="select-all" class="btn btn-default pull-left" type="button" onclick="footer_selectAll()">Alle auswählen</button>';
|
||||
footer_html += '<button id="deselect-all" class="btn btn-default pull-left" type="button" onclick="footer_deselectAll()">Alle abwählen</button>';
|
||||
footer_html += '<span id="number-selected" style="margin-left: 20px; line-height: 2; font-weight: normal"></span>';
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
return footer_html;
|
||||
}
|
||||
|
||||
// Performs download CSV
|
||||
function footer_downloadCSV(){
|
||||
$('#tableWidgetTabulator').tabulator("download", "csv", "data.csv", {bom:true}); // BOM for correct UTF-8 char output
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs select all
|
||||
* Select all (filtered) rows that are bestellt
|
||||
*/
|
||||
function footer_selectAll(){
|
||||
$('#tableWidgetTabulator').tabulator('getRows', true)
|
||||
.filter(row => row.getData().personalnummer >= 0 && // NOT dummies
|
||||
row.getData().bestellt != null && // AND bestellt
|
||||
row.getData().erteilt == null && // AND NOT erteilt
|
||||
row.getData().status != 'Geändert') // AND NOT geaendert
|
||||
.forEach((row => row.select()));
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs deselect all
|
||||
* Deselect all (filtered) rows
|
||||
*/
|
||||
function footer_deselectAll(){
|
||||
$('#tableWidgetTabulator').tabulator('deselectRow');
|
||||
}
|
||||
|
||||
// Displays number of selected rows on row selection change
|
||||
function func_rowSelectionChanged(data, rows){
|
||||
$('#number-selected').html("Für Erteilung ausgewählt: <strong>" + rows.length + "</strong>");
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Tabulator columns format functions
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Generates status icons
|
||||
status_formatter = function(cell, formatterParams, onRendered){
|
||||
var is_dummy = (cell.getRow().getData().personalnummer <= 0 && cell.getRow().getData().personalnummer != null);
|
||||
|
||||
var bestellt = cell.getRow().getData().bestellt;
|
||||
var erteilt = cell.getRow().getData().erteilt;
|
||||
var akzeptiert = cell.getRow().getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(cell.getRow().getData().stunden);
|
||||
var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(cell.getRow().getData().betrag);
|
||||
var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
if (isNaN(stunden))
|
||||
{
|
||||
stunden = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_stunden))
|
||||
{
|
||||
vertrag_stunden = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_betrag))
|
||||
{
|
||||
vertrag_betrag = 0;
|
||||
}
|
||||
|
||||
// commented icons would be so nice to have with fontawsome 5.11...
|
||||
if (is_dummy)
|
||||
{
|
||||
return "<i class='fa fa-user-secret'></i>"; // dummy lector
|
||||
}
|
||||
else if (bestellt != null && (betrag != vertrag_betrag) || // geaendert
|
||||
bestellt != null && stunden != vertrag_stunden) // geaendert ((if betrag is 0 or null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_CHANGED; // geaendert
|
||||
// return "<i class='fas fa-user-edit'></i>";
|
||||
}
|
||||
else if (bestellt == null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
return "<i class='fa fa-user-plus'></i>"; // neu
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_ORDERED; // bestellt
|
||||
// return "<i class='fa fa-user-tag'></i>";
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_APPROVED; // erteilt
|
||||
// return "<i class='fas fa-user-check'></i>";
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
return "<i class='fa fa-handshake-o'></i>"; // akzeptiert
|
||||
// return "<i class='fas fa-user-graduate'></i>";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "<i class='fa fa-user'></i>"; // default
|
||||
}
|
||||
};
|
||||
|
||||
// Generates status tooltip
|
||||
status_tooltip = function(cell){
|
||||
var is_dummy = (cell.getRow().getData().personalnummer <= 0 && cell.getRow().getData().personalnummer != null);
|
||||
|
||||
var bestellt = cell.getRow().getData().bestellt;
|
||||
var erteilt = cell.getRow().getData().erteilt;
|
||||
var akzeptiert = cell.getRow().getData().akzeptiert;
|
||||
|
||||
var betrag = parseFloat(cell.getRow().getData().betrag);
|
||||
var stunden = parseFloat(cell.getRow().getData().stunden);
|
||||
|
||||
var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag);
|
||||
var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
if (isNaN(stunden))
|
||||
{
|
||||
stunden = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_betrag))
|
||||
{
|
||||
vertrag_betrag = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_stunden)){
|
||||
vertrag_stunden = 0;
|
||||
}
|
||||
|
||||
var text = 'Lehrauftragstunden/-stundensatz geändert.';
|
||||
text += "\n";
|
||||
|
||||
if (is_dummy) // dummy (no lector)
|
||||
{
|
||||
return 'Neuer Lehrauftrag. Ohne Lektor verplant.'
|
||||
}
|
||||
else if ((bestellt != null && erteilt == null && betrag != vertrag_betrag) ||
|
||||
(bestellt != null && erteilt == null && stunden != vertrag_stunden)) // geaendert (when never erteilt before)
|
||||
{
|
||||
return text += 'Wartet auf Bestellung, danach Erteilen möglich.';
|
||||
}
|
||||
else if ((bestellt != null && erteilt != null && betrag != vertrag_betrag) ||
|
||||
(bestellt != null && erteilt != null && stunden != vertrag_stunden)) // geaendert (when has been erteilt once)
|
||||
{
|
||||
return text += 'Wartet auf neuerliche Bestellung, danach erneut Erteilen möglich.';
|
||||
}
|
||||
else if (bestellt == null) // neu
|
||||
{
|
||||
return 'Neuer Lehrauftrag. Wartet auf Bestellung.';
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null) // bestellt
|
||||
{
|
||||
return 'Letzter Status: Bestellt. Wartet auf Erteilung.';
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null) // erteilt
|
||||
{
|
||||
return 'Letzter Status: Erteilt. Wartet auf Annahme durch Lektor.';
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null) // akzeptiert
|
||||
{
|
||||
return 'Letzter Status: Angenommen. Vertrag wurde beidseitig abgeschlossen.';
|
||||
}
|
||||
}
|
||||
|
||||
// Generates bestellt tooltip
|
||||
bestellt_tooltip = function(cell){
|
||||
if (cell.getRow().getData().bestellt_von != null)
|
||||
{
|
||||
return 'Bestellt von: ' + cell.getRow().getData().bestellt_von;
|
||||
}
|
||||
}
|
||||
|
||||
// Generates erteilt tooltip
|
||||
erteilt_tooltip = function(cell){
|
||||
if (cell.getRow().getData().erteilt_von != null) {
|
||||
return 'Erteilt von: ' + cell.getRow().getData().erteilt_von;
|
||||
}
|
||||
}
|
||||
|
||||
// Generates akzeptiert tooltip
|
||||
akzeptiert_tooltip = function(cell){
|
||||
if (cell.getRow().getData().akzeptiert_von != null) {
|
||||
return 'Angenommen von: ' + cell.getRow().getData().akzeptiert_von;
|
||||
}
|
||||
}
|
||||
$(function() {
|
||||
|
||||
// Show all rows
|
||||
$("#show-all").click(function(){
|
||||
$('#tableWidgetTabulator').tabulator('clearFilter');
|
||||
});
|
||||
|
||||
// Show only rows with new lehrauftraege (not dummy lectors)
|
||||
$("#show-new").click(function(){
|
||||
$('#tableWidgetTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '>=', value: 0},
|
||||
{field: 'bestellt', type: '=', value: null},
|
||||
{field: 'erteilt', type: '=', value: null},
|
||||
{field: 'akzeptiert', type: '=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with ordered lehrauftraege
|
||||
$("#show-ordered").click(function(){
|
||||
$('#tableWidgetTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '>=', value: 0},
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '=', value: null},
|
||||
{field: 'akzeptiert', type: '=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with erteilte lehrauftraege
|
||||
$("#show-approved").click(function(){
|
||||
$('#tableWidgetTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '!=', value: null},
|
||||
{field: 'akzeptiert', type: '=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with accepted lehrauftraege
|
||||
$("#show-accepted").click(function(){
|
||||
$('#tableWidgetTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '!=', value: null},
|
||||
{field: 'akzeptiert', type: '!=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with dummy lectors
|
||||
$("#show-dummies").click(function(){
|
||||
$('#tableWidgetTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '!=', value: null},
|
||||
{field: 'personalnummer', type: '<=', value: 0},
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with dummy lectors
|
||||
$("#show-changed").click(function(){
|
||||
// needs custom filter to compare fields betrag and vertrag_betrag
|
||||
$('#tableWidgetTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '>=', value: 0}, // NOT dummy lector AND
|
||||
{field: 'bestellt', type: '!=', value: null}, // bestellt AND
|
||||
{field: 'status', type: '=', value: 'Geändert'} // geaendert
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Set png-icons into filter-buttons
|
||||
$(".btn-lehrauftrag").each(function(){
|
||||
switch(this.id) {
|
||||
case 'show-ordered':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_ORDERED;
|
||||
break;
|
||||
case 'show-approved':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_APPROVED;
|
||||
break;
|
||||
case 'show-changed':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_CHANGED;
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
// De/activate and un/focus on clicked button, En-/Disable 'Lehrauftrag erteilen'
|
||||
$(".btn-lehrauftrag").click(function() {
|
||||
|
||||
// De/activate and un/focus on clicked button
|
||||
$(".btn-lehrauftrag").removeClass('focus').removeClass('active');
|
||||
$(this).addClass('focus').addClass('active');
|
||||
|
||||
// Enable button 'Lehrauftrag bestellen' by default
|
||||
$('#approve-lehrauftraege').attr('disabled', false).attr('title', '');
|
||||
|
||||
// Disable button Lehrauftrag bestellen for dummies
|
||||
if (this.id == 'show-dummies')
|
||||
{
|
||||
$('#approve-lehrauftraege').attr('disabled', true).attr('title', 'Lehraufträge ohne Lektorzuteilung können nicht bestellt werden.');
|
||||
}
|
||||
});
|
||||
|
||||
// Approve Lehrauftraege
|
||||
$("#approve-lehrauftraege").click(function(){
|
||||
|
||||
var selected_data = $('#tableWidgetTabulator').tabulator('getSelectedData')
|
||||
.filter(function(val){
|
||||
// filter pseudo lines of groupBy (e.g. the bottom calculations lines)
|
||||
return val.row_index != null || typeof(val.row_index) !== 'undefined';
|
||||
})
|
||||
.map(function(data){
|
||||
// reduce to necessary fields
|
||||
return {
|
||||
'row_index': data.row_index,
|
||||
'mitarbeiter_uid' : data.mitarbeiter_uid,
|
||||
'vertrag_id' : data.vertrag_id
|
||||
}
|
||||
});
|
||||
|
||||
// Alert and exit if no lehraufgang is selected
|
||||
if (selected_data.length == 0)
|
||||
{
|
||||
FHC_DialogLib.alertInfo('Bitte wählen Sie erst zumindest einen Lehrauftrag');
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Prepare data object for ajax call
|
||||
* NOTE: Stringify to send only ONE post param (json string) instead of many single post params.
|
||||
* This avoids issues with POST param limitation.
|
||||
*/
|
||||
var data = {
|
||||
'selected_data': JSON.stringify(selected_data)
|
||||
};
|
||||
|
||||
FHC_AjaxClient.ajaxCallPost(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.called_path + "/approveLehrauftrag",
|
||||
data,
|
||||
{
|
||||
successCallback: function (data, textStatus, jqXHR)
|
||||
{
|
||||
if (!data.error && data.retval != null)
|
||||
{
|
||||
// Update status 'Erteilt'
|
||||
$('#tableWidgetTabulator').tabulator('updateData', data.retval);
|
||||
}
|
||||
|
||||
FHC_DialogLib.alertSuccess(data.retval.length + " Lehraufträge wurden erteilt.");
|
||||
},
|
||||
errorCallback: function (jqXHR, textStatus, errorThrown)
|
||||
{
|
||||
FHC_DialogLib.alertError("Systemfehler<br>Bitte kontaktieren Sie Ihren Administrator.");
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,706 @@
|
||||
/**
|
||||
* Javascript file for Lehrauftraege bestellen view and tabulator
|
||||
* Lehrauftraege bestellen: orderLehrauftrag.php
|
||||
* Lehrauftraege bestellen - Tabulator: orderLehrauftragData.php
|
||||
*/
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Global vars
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
const COLOR_LIGHTGREY = "#f5f5f5";
|
||||
|
||||
/**
|
||||
* PNG icons used in status- and filter buttons
|
||||
* Setting png icons is a workaround to use font-awsome 5.9.0 icons until system can be updated to newer font awsome version.
|
||||
* */
|
||||
const ICON_LEHRAUFTRAG_ORDERED = '<img src="../../../public/images/icons/fa-user-tag.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
const ICON_LEHRAUFTRAG_APPROVED = '<img src="../../../public/images/icons/fa-user-check.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
const ICON_LEHRAUFTRAG_CHANGED = '<img src="../../../public/images/icons/fa-user-edit.png" style="height: 30px; width: 30px; margin: -6px;">';
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Mutators - setter methods to manipulate table data when entering the tabulator
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Converts string date postgre style to string DD.MM.YYYY.
|
||||
// This will allow correct filtering.
|
||||
var mut_formatStringDate = function(value, data, type, params, component) {
|
||||
if (value != null)
|
||||
{
|
||||
var d = new Date(value);
|
||||
return ("0" + (d.getDate())).slice(-2) + "." + ("0" + (d.getMonth() + 1)).slice(-2) + "." + d.getFullYear();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Formatters - changes display information, not the data itself
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Formats null values to a string number '0.00'
|
||||
var form_formatNulltoStringNumber = function(cell, formatterParams){
|
||||
if (cell.getValue() == null){
|
||||
if (formatterParams.precision == 1)
|
||||
{
|
||||
return '0.0';
|
||||
}
|
||||
return '0.00';
|
||||
}
|
||||
else {
|
||||
return cell.getValue();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Header filter
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Filters values using comparison operator or just by string comparison
|
||||
function hf_filterStringnumberWithOperator(headerValue, rowValue, rowData){
|
||||
|
||||
// If string starts with <, <=, >, >=, !=, ==, compare values with that operator
|
||||
var operator = '';
|
||||
if (headerValue.match(/([<=>!]{1,2})/g)) {
|
||||
var operator_arr = headerValue.match(/([<=>!]{1,2})/g);
|
||||
operator = operator_arr[0];
|
||||
|
||||
headerValue = headerValue
|
||||
.replace(operator, '')
|
||||
.trim()
|
||||
;
|
||||
|
||||
// return if value comparison is true
|
||||
return eval(rowValue + operator + headerValue);
|
||||
}
|
||||
|
||||
// If just a stringnumber, return if exact match found
|
||||
return parseFloat(rowValue) == headerValue;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Custom filters
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
/*
|
||||
* Filters neue AND geaenderte initially
|
||||
* NOTE: This is a workaround. The tabulators callback initialFilter is not used here because
|
||||
* it is processed before the callback tableBuilt, where the status is going to be built.
|
||||
* The callback dataLoaded is processed after tableBuild and provides the status.
|
||||
*/
|
||||
function func_dataLoaded(data, table){
|
||||
table.setFilter([
|
||||
{field: 'personalnummer', type: '>=', value: 0}, // not dummy lector AND
|
||||
[
|
||||
{field: 'status', type: '=', value: 'Neu'}, // neu OR
|
||||
{field: 'status', type: '=', value: 'Geändert'} // geaendert
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Tabulator table format functions
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Formats the group header
|
||||
function func_groupHeader(data){
|
||||
return data[0].lv_bezeichnung; // change name to lehrveranstaltung
|
||||
};
|
||||
|
||||
// Formats the rows
|
||||
function func_rowFormatter(row){
|
||||
var is_dummy = (row.getData().personalnummer <= 0 && row.getData().personalnummer != null);
|
||||
|
||||
var bestellt = row.getData().bestellt;
|
||||
var erteilt = row.getData().erteilt;
|
||||
var akzeptiert = row.getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
if (isNaN(stunden))
|
||||
{
|
||||
stunden = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_stunden))
|
||||
{
|
||||
vertrag_stunden = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_betrag))
|
||||
{
|
||||
vertrag_betrag = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Formats the color of the rows depending on their status
|
||||
- blue: dummy lectors
|
||||
- bold: geaendert
|
||||
- default (white): neu und erteilt
|
||||
- green: akzeptiert
|
||||
- grey: all other (marks unselectable)
|
||||
*/
|
||||
row.getCells().forEach(function(cell){
|
||||
if(is_dummy)
|
||||
{
|
||||
cell.getElement().classList.add('bg-info'); // dummy lectors
|
||||
}
|
||||
else if (bestellt != null && (betrag != vertrag_betrag) ||
|
||||
bestellt != null && stunden != vertrag_stunden &&
|
||||
!row._row.element.classList.contains('tabulator-calcs')) // exclude calculation rows
|
||||
{
|
||||
row.getElement().style['font-weight'] = 'bold'; // geaendert
|
||||
}
|
||||
else if(bestellt == null)
|
||||
{
|
||||
return; // neu und erteilt
|
||||
}
|
||||
else if(bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
cell.getElement().classList.add('bg-success') // akzeptiert
|
||||
}
|
||||
else
|
||||
{
|
||||
row.getElement().style["background-color"] = COLOR_LIGHTGREY; // default
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Formats row selectable/unselectable
|
||||
function func_selectableCheck(row){
|
||||
var is_dummy = (row.getData().personalnummer <= 0 && row.getData().personalnummer != null);
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
if (isNaN(stunden))
|
||||
{
|
||||
stunden = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_stunden))
|
||||
{
|
||||
vertrag_stunden = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_betrag))
|
||||
{
|
||||
vertrag_betrag = 0;
|
||||
}
|
||||
|
||||
|
||||
// Only allow to select neue and geaenderte
|
||||
return !is_dummy && // NOT dummy lector
|
||||
row.getData().bestellt == null || // AND neue
|
||||
row.getData().bestellt != null && betrag != vertrag_betrag || // OR geaenderte
|
||||
row.getData().bestellt != null && stunden != vertrag_stunden // OR geanderte (if betrag is 0 or null)
|
||||
}
|
||||
|
||||
// Adds column status
|
||||
function func_tableBuilt(table) {
|
||||
// Add status column to table
|
||||
table.addColumn(
|
||||
{
|
||||
title: "<i class='fa fa-user-o'></i>",
|
||||
field: "status",
|
||||
width:40,
|
||||
align:"center",
|
||||
downloadTitle: 'Status',
|
||||
formatter: status_formatter,
|
||||
tooltip: status_tooltip
|
||||
}, true
|
||||
);
|
||||
}
|
||||
|
||||
// Sets status values into column status
|
||||
function func_renderStarted(table){
|
||||
// set literally status to each row - this enables sorting by status despite using icons
|
||||
table.getRows().forEach(function(row){
|
||||
var bestellt = row.getData().bestellt;
|
||||
var erteilt = row.getData().erteilt;
|
||||
var akzeptiert = row.getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(row.getData().stunden);
|
||||
var vertrag_stunden = parseFloat(row.getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(row.getData().betrag);
|
||||
var vertrag_betrag = parseFloat(row.getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
if (isNaN(stunden))
|
||||
{
|
||||
stunden = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_stunden))
|
||||
{
|
||||
vertrag_stunden = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_betrag))
|
||||
{
|
||||
vertrag_betrag = 0;
|
||||
}
|
||||
|
||||
if ((bestellt != null && betrag != vertrag_betrag) ||
|
||||
(bestellt != null && stunden != vertrag_stunden))
|
||||
{
|
||||
row.getData().status = 'Geändert'; // geaendert
|
||||
}
|
||||
else if (bestellt == null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Neu'; // neu
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Bestellt'; // bestellt
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null)
|
||||
{
|
||||
row.getData().status = 'Erteilt'; // erteilt
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
row.getData().status = 'Akzeptiert'; // akzeptiert
|
||||
}
|
||||
else
|
||||
{
|
||||
row.getData().status = null; // default
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Performes after row was updated
|
||||
function func_rowUpdated(row){
|
||||
|
||||
// Refresh status icon and row color
|
||||
row.reformat(); // retriggers cell formatters and rowFormatter callback
|
||||
|
||||
// Format font-weight normal (needed after geaenderte were bestellt)
|
||||
row.getElement().style['font-weight'] = 'normal';
|
||||
|
||||
// Deselect and disable new selection of updated rows (ordering done)
|
||||
row.deselect();
|
||||
row.getElement().style["pointerEvents"] = "none";
|
||||
}
|
||||
|
||||
// Tabulator footer element
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// Adds a footer with buttons select all / deselect all / download
|
||||
function func_footerElement(){
|
||||
|
||||
var footer_html = '<div class="row">';
|
||||
footer_html += '<div class="col-lg-12" style="padding: 5px;">';
|
||||
|
||||
footer_html += '<div class="btn-toolbar pull-right" role="toolbar">';
|
||||
footer_html += '<div class="btn-group" role="group">';
|
||||
footer_html += '<button id="download-csv" class="btn btn-default" type="button" data-toggle="tooltip" data-placement="left" title="Download CSV" onclick="footer_downloadCSV()"><small>CSV </small><i class="fa fa-arrow-down"></i></button>';
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
footer_html += '<div class="btn-toolbar" role="toolbar">';
|
||||
footer_html += '<div class="btn-group" role="group">';
|
||||
footer_html += '<button id="select-all" class="btn btn-default pull-left" type="button" onclick="footer_selectAll()">Alle auswählen</button>';
|
||||
footer_html += '<button id="deselect-all" class="btn btn-default pull-left" type="button" onclick="footer_deselectAll()">Alle abwählen</button>';
|
||||
footer_html += '<span id="number-selected" style="margin-left: 20px; line-height: 2; font-weight: normal"></span>';
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
footer_html += '</div>';
|
||||
footer_html += '</div>';
|
||||
|
||||
return footer_html;
|
||||
}
|
||||
|
||||
// Performs download CSV
|
||||
function footer_downloadCSV(){
|
||||
$('#tableWidgetTabulator').tabulator("download", "csv", "data.csv", {bom:true}); // BOM for correct UTF-8 char output
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs select all
|
||||
* Select all (filtered) rows and ignore rows which have status bestellt
|
||||
*/
|
||||
function footer_selectAll(){
|
||||
$('#tableWidgetTabulator').tabulator('getRows', true)
|
||||
.filter(row => row.getData().personalnummer >= 0 && // NOT dummies
|
||||
row.getData().bestellt == null || // AND neu
|
||||
row.getData().bestellt != null && // OR (bestellt
|
||||
row.getData().status == 'Geändert') // AND geaendert)
|
||||
.forEach((row => row.select()));
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs deselect all
|
||||
* Deselect all (filtered) rows
|
||||
*/
|
||||
function footer_deselectAll(){
|
||||
$('#tableWidgetTabulator').tabulator('deselectRow');
|
||||
}
|
||||
|
||||
// Displays number of selected rows on row selection change
|
||||
function func_rowSelectionChanged(data, rows){
|
||||
$('#number-selected').html("Für Bestellung ausgewählt: <strong>" + rows.length + "</strong>");
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Tabulator columns format functions
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Generates status icons
|
||||
status_formatter = function(cell, formatterParams, onRendered){
|
||||
var is_dummy = (cell.getRow().getData().personalnummer <= 0 && cell.getRow().getData().personalnummer != null);
|
||||
|
||||
var bestellt = cell.getRow().getData().bestellt;
|
||||
var erteilt = cell.getRow().getData().erteilt;
|
||||
var akzeptiert = cell.getRow().getData().akzeptiert;
|
||||
|
||||
var stunden = parseFloat(cell.getRow().getData().stunden);
|
||||
var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden);
|
||||
|
||||
var betrag = parseFloat(cell.getRow().getData().betrag);
|
||||
var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag);
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
if (isNaN(stunden))
|
||||
{
|
||||
stunden = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_stunden))
|
||||
{
|
||||
vertrag_stunden = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_betrag))
|
||||
{
|
||||
vertrag_betrag = 0;
|
||||
}
|
||||
|
||||
// commented icons would be so nice to have with fontawsome 5.11...
|
||||
if (is_dummy)
|
||||
{
|
||||
return "<i class='fa fa-user-secret'></i>"; // dummy lector
|
||||
}
|
||||
else if (bestellt != null && isNaN(vertrag_betrag))
|
||||
{
|
||||
return "<i class='fa fa-user-minus'></i>"; // kein Vertrag
|
||||
}
|
||||
else if (bestellt != null && (betrag != vertrag_betrag) || // geaendert
|
||||
bestellt != null && stunden != vertrag_stunden) // geaendert ((if betrag is 0 or null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_CHANGED; // geaendert
|
||||
// return "<i class='fas fa-user-edit'></i>";
|
||||
}
|
||||
else if (bestellt == null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
return "<i class='fa fa-user-plus'></i>"; // neu
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_ORDERED; // bestellt
|
||||
// return "<i class='fa fa-user-tag'></i>";
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null)
|
||||
{
|
||||
return ICON_LEHRAUFTRAG_APPROVED; // erteilt
|
||||
// return "<i class='fas fa-user-check'></i>";
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null)
|
||||
{
|
||||
return "<i class='fa fa-handshake-o'></i>"; // akzeptiert
|
||||
}
|
||||
else
|
||||
{
|
||||
return "<i class='fa fa-user'></i>"; // default
|
||||
}
|
||||
};
|
||||
|
||||
// Generates status tooltip
|
||||
status_tooltip = function(cell){
|
||||
var is_dummy = (cell.getRow().getData().personalnummer <= 0 && cell.getRow().getData().personalnummer != null);
|
||||
|
||||
var bestellt = cell.getRow().getData().bestellt;
|
||||
var erteilt = cell.getRow().getData().erteilt;
|
||||
var akzeptiert = cell.getRow().getData().akzeptiert;
|
||||
|
||||
var betrag = parseFloat(cell.getRow().getData().betrag);
|
||||
var stunden = parseFloat(cell.getRow().getData().stunden);
|
||||
var stundensatz = parseFloat(cell.getRow().getData().stundensatz);
|
||||
|
||||
var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag);
|
||||
var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden);
|
||||
var vertrag_stundensatz = 0;
|
||||
|
||||
if (isNaN(betrag))
|
||||
{
|
||||
betrag = 0;
|
||||
}
|
||||
|
||||
if (isNaN(stunden))
|
||||
{
|
||||
stunden = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_stunden))
|
||||
{
|
||||
vertrag_stunden = 0;
|
||||
}
|
||||
|
||||
if (isNaN(vertrag_betrag))
|
||||
{
|
||||
vertrag_betrag = 0;
|
||||
}
|
||||
|
||||
// Calculate vertrag stundensatz
|
||||
if (vertrag_stunden != 0)
|
||||
{
|
||||
vertrag_stundensatz = vertrag_betrag/vertrag_stunden;
|
||||
}
|
||||
|
||||
// Return tooltip message
|
||||
if (is_dummy) // dummy (no lector)
|
||||
{
|
||||
return 'Neuer Lehrauftrag. Ohne Lektor verplant.'
|
||||
}
|
||||
else if (isNaN(vertrag_betrag)) // neu
|
||||
{
|
||||
return 'Neuer Lehrauftrag. Wartet auf Bestellung.'
|
||||
}
|
||||
else if (betrag != vertrag_betrag || // geaendert
|
||||
bestellt != null && stunden != vertrag_stunden) // geaendert (if betrag is 0 or null)
|
||||
{
|
||||
var text = 'NACH Änderung: Stundensatz: ' + stundensatz + ' Stunden: ' + stunden;
|
||||
text += "\n";
|
||||
text += 'VOR Änderung:' + '\xa0\xa0\xa0' + 'Stundensatz: ' + vertrag_stundensatz + ' Stunden: ' + vertrag_stunden;
|
||||
return text;
|
||||
}
|
||||
else if (bestellt != null && erteilt == null && akzeptiert == null) // bestellt
|
||||
{
|
||||
return 'Letzter Status: Bestellt. Wartet auf Erteilung.';
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert == null) // erteilt
|
||||
{
|
||||
return 'Letzter Status: Erteilt. Wartet auf Annahme durch Lektor.';
|
||||
}
|
||||
else if (bestellt != null && erteilt != null && akzeptiert != null) // akzeptiert
|
||||
{
|
||||
return 'Letzter Status: Angenommen. Vertrag wurde beidseitig abgeschlossen.';
|
||||
}
|
||||
}
|
||||
|
||||
// Generates bestellt tooltip
|
||||
bestellt_tooltip = function(cell){
|
||||
if (cell.getRow().getData().bestellt_von != null)
|
||||
{
|
||||
return 'Bestellt von: ' + cell.getRow().getData().bestellt_von;
|
||||
}
|
||||
}
|
||||
|
||||
// Generates erteilt tooltip
|
||||
erteilt_tooltip = function(cell){
|
||||
if (cell.getRow().getData().erteilt_von != null) {
|
||||
return 'Erteilt von: ' + cell.getRow().getData().erteilt_von;
|
||||
}
|
||||
}
|
||||
|
||||
// Generates akzeptiert tooltip
|
||||
akzeptiert_tooltip = function(cell){
|
||||
if (cell.getRow().getData().akzeptiert_von != null) {
|
||||
return 'Angenommen von: ' + cell.getRow().getData().akzeptiert_von;
|
||||
}
|
||||
}
|
||||
|
||||
$(function() {
|
||||
|
||||
// Show all rows
|
||||
$("#show-all").click(function(){
|
||||
$('#tableWidgetTabulator').tabulator('clearFilter');
|
||||
});
|
||||
|
||||
// Show only rows with new lehrauftraege (not dummy lectors)
|
||||
$("#show-new").click(function(){
|
||||
$('#tableWidgetTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '>=', value: 0},
|
||||
{field: 'bestellt', type: '=', value: null},
|
||||
{field: 'erteilt', type: '=', value: null},
|
||||
{field: 'akzeptiert', type: '=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with ordered lehrauftraege
|
||||
$("#show-ordered").click(function(){
|
||||
$('#tableWidgetTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '>=', value: 0},
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '=', value: null},
|
||||
{field: 'akzeptiert', type: '=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with erteilte lehrauftraege
|
||||
$("#show-approved").click(function(){
|
||||
$('#tableWidgetTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '!=', value: null},
|
||||
{field: 'akzeptiert', type: '=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with akzeptierte lehrauftraege
|
||||
$("#show-accepted").click(function(){
|
||||
$('#tableWidgetTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'bestellt', type: '!=', value: null},
|
||||
{field: 'erteilt', type: '!=', value: null},
|
||||
{field: 'akzeptiert', type: '!=', value: null}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with geaenderte lectors
|
||||
$("#show-changed").click(function(){
|
||||
// needs custom filter to compare fields betrag and vertrag_betrag
|
||||
$('#tableWidgetTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '>=', value: 0}, // NOT dummy lector AND
|
||||
{field: 'bestellt', type: '!=', value: null}, // bestellt AND
|
||||
{field: 'status', type: '=', value: 'Geändert'} // geaendert
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Show only rows with dummy lectors
|
||||
$("#show-dummies").click(function(){
|
||||
$('#tableWidgetTabulator').tabulator('setFilter',
|
||||
[
|
||||
{field: 'personalnummer', type: '!=', value: null},
|
||||
{field: 'personalnummer', type: '<=', value: 0},
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Set png-icons into filter-buttons
|
||||
$(".btn-lehrauftrag").each(function(){
|
||||
switch(this.id) {
|
||||
case 'show-ordered':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_ORDERED;
|
||||
break;
|
||||
case 'show-approved':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_APPROVED;
|
||||
break;
|
||||
case 'show-changed':
|
||||
this.innerHTML = ICON_LEHRAUFTRAG_CHANGED;
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
// De/activate and un/focus on clicked button, En-/Disable 'Lehrauftrag bestellen'
|
||||
$(".btn-lehrauftrag").click(function() {
|
||||
|
||||
// De/activate and un/focus on clicked button
|
||||
$(".btn-lehrauftrag").removeClass('focus').removeClass('active');
|
||||
$(this).addClass('focus').addClass('active');
|
||||
|
||||
//Enable button 'Lehrauftrag bestellen' by default
|
||||
$('#order-lehrauftraege').attr('disabled', false).attr('title', '');
|
||||
|
||||
// Disable button Lehrauftrag bestellen for dummies
|
||||
if (this.id == 'show-dummies')
|
||||
{
|
||||
$('#order-lehrauftraege').attr('disabled', true).attr('title', 'Lehraufträge ohne Lektorzuteilung können nicht bestellt werden.');
|
||||
}
|
||||
});
|
||||
|
||||
// Order Lehrauftraege
|
||||
$("#order-lehrauftraege").click(function(){
|
||||
|
||||
var selected_data = $('#tableWidgetTabulator').tabulator('getSelectedData')
|
||||
.filter(function(val){
|
||||
// filter pseudo lines of groupBy (e.g. the bottom calculations lines)
|
||||
return val.row_index != null || typeof(val.row_index) !== 'undefined';
|
||||
})
|
||||
.map(function(data){
|
||||
// reduce to necessary fields
|
||||
return {
|
||||
'row_index' : data.row_index,
|
||||
'lehreinheit_id' : data.lehreinheit_id,
|
||||
'lehrveranstaltung_id' : data.lehrveranstaltung_id,
|
||||
'person_id' : data.person_id,
|
||||
'mitarbeiter_uid' : data.mitarbeiter_uid,
|
||||
'vertrag_id' : data.vertrag_id,
|
||||
'projektarbeit_id' : data.projektarbeit_id,
|
||||
'stunden' : data.stunden,
|
||||
'betrag' : data.betrag,
|
||||
'studiensemester_kurzbz' : data.studiensemester_kurzbz,
|
||||
'studiengang_kz' : data.studiengang_kz,
|
||||
'lv_oe_kurzbz' : data.lv_oe_kurzbz
|
||||
}
|
||||
});
|
||||
|
||||
// Alert and exit if no lehraufgang is selected
|
||||
if (selected_data.length == 0)
|
||||
{
|
||||
FHC_DialogLib.alertInfo('Bitte wählen Sie erst zumindest einen Lehrauftrag');
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Prepare data object for ajax call
|
||||
* NOTE: Stringify to send only ONE post param (json string) instead of many single post params.
|
||||
* This avoids issues with POST param limitation.
|
||||
*/
|
||||
var data = {
|
||||
'selected_data': JSON.stringify(selected_data)
|
||||
};
|
||||
|
||||
FHC_AjaxClient.ajaxCallPost(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.called_path + "/orderLehrauftrag",
|
||||
data,
|
||||
{
|
||||
successCallback: function (data, textStatus, jqXHR)
|
||||
{
|
||||
if (!data.error && data.retval != null)
|
||||
{
|
||||
// Update status 'Bestellt'
|
||||
$('#tableWidgetTabulator').tabulator('updateData', data.retval);
|
||||
}
|
||||
|
||||
FHC_DialogLib.alertSuccess("Alle " + data.retval.length + " Lehraufträge wurden bestellt.")
|
||||
},
|
||||
errorCallback: function (jqXHR, textStatus, errorThrown)
|
||||
{
|
||||
FHC_DialogLib.alertError("Sytemfehler<br>Bitte kontaktieren Sie Ihren Administrator.");
|
||||
}
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -100,6 +100,7 @@ foreach ($DAO_obj->lehreinheitmitarbeiter as $row)
|
||||
<LEHREINHEITMITARBEITER:bismelden><![CDATA[<?php echo ($row->bismelden?'Ja':'Nein') ?>]]></LEHREINHEITMITARBEITER:bismelden>
|
||||
<LEHREINHEITMITARBEITER:verplant><![CDATA[<?php echo ($verplant?'true':'false'); ?>]]></LEHREINHEITMITARBEITER:verplant>
|
||||
<LEHREINHEITMITARBEITER:aktiv><![CDATA[<?php echo ($aktiv?'aktiv':'inaktiv'); ?>]]></LEHREINHEITMITARBEITER:aktiv>
|
||||
<LEHREINHEITMITARBEITER:vertrag_id><![CDATA[<?php echo $row->vertrag_id; ?>]]></LEHREINHEITMITARBEITER:vertrag_id>
|
||||
</RDF:Description>
|
||||
</RDF:li>
|
||||
<?php
|
||||
|
||||
@@ -83,6 +83,7 @@ function draw_content($row)
|
||||
<PROJEKTBETREUER:stunden><![CDATA['.number_format($row->stunden,1).']]></PROJEKTBETREUER:stunden>
|
||||
<PROJEKTBETREUER:stundensatz><![CDATA['.$row->stundensatz.']]></PROJEKTBETREUER:stundensatz>
|
||||
<PROJEKTBETREUER:betreuerart_kurzbz><![CDATA['.$row->betreuerart_kurzbz.']]></PROJEKTBETREUER:betreuerart_kurzbz>
|
||||
<PROJEKTBETREUER:vertrag_id><![CDATA['.$row->vertrag_id.']]></PROJEKTBETREUER:vertrag_id>
|
||||
</RDF:Description>
|
||||
</RDF:li>
|
||||
';
|
||||
|
||||
@@ -68,7 +68,7 @@ $oRdf = new rdf('VER','http://www.technikum-wien.at/vertrag');
|
||||
$oRdf->sendHeader();
|
||||
|
||||
foreach($vertrag->result as $row)
|
||||
{
|
||||
{
|
||||
$i=$oRdf->newObjekt($row->vertrag_id);
|
||||
$oRdf->obj[$i]->setAttribut('vertrag_id',$row->vertrag_id,true);
|
||||
$oRdf->obj[$i]->setAttribut('person_id',$row->person_id,true);
|
||||
@@ -81,7 +81,8 @@ foreach($vertrag->result as $row)
|
||||
$oRdf->obj[$i]->setAttribut('anmerkung',$row->anmerkung,true);
|
||||
$oRdf->obj[$i]->setAttribut('vertragsdatum_iso',$row->vertragsdatum,true);
|
||||
$oRdf->obj[$i]->setAttribut('vertragsdatum',$datum_obj->formatDatum($row->vertragsdatum,'d.m.Y'),true);
|
||||
|
||||
$oRdf->obj[$i]->setAttribut('vertragsstunden',$row->vertragsstunden, true);
|
||||
$oRdf->obj[$i]->setAttribut('vertragsstunden_studiensemester_kurzbz',$row->vertragsstunden_studiensemester_kurzbz, true);
|
||||
$oRdf->addSequence($row->vertrag_id);
|
||||
}
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@ $oRdf = new rdf('VER','http://www.technikum-wien.at/vertragdetails');
|
||||
$oRdf->sendHeader();
|
||||
|
||||
foreach($vertrag->result as $row)
|
||||
{
|
||||
{
|
||||
switch($row->type)
|
||||
{
|
||||
case 'Lehrauftrag':
|
||||
@@ -81,7 +81,11 @@ foreach($vertrag->result as $row)
|
||||
$oRdf->obj[$i]->setAttribut('projektarbeit_id',$row->projektarbeit_id,true);
|
||||
$oRdf->obj[$i]->setAttribut('betreuerart_kurzbz',$row->betreuerart_kurzbz,true);
|
||||
$oRdf->obj[$i]->setAttribut('bezeichnung',$row->bezeichnung,true);
|
||||
|
||||
if(isset($row->vertragsstunden) && !empty($row->vertragsstunden))
|
||||
$oRdf->obj[$i]->setAttribut('vertragsstunden', $row->vertragsstunden, true);
|
||||
if(isset($row->vertragsstunden_studiensemester_kurzbz) && !empty($row->vertragsstunden_studiensemester_kurzbz))
|
||||
$oRdf->obj[$i]->setAttribut('vertragsstunden_studiensemester_kurzbz', $row->vertragsstunden_studiensemester_kurzbz, true);
|
||||
|
||||
$oRdf->addSequence($key);
|
||||
}
|
||||
|
||||
|
||||
@@ -1366,6 +1366,21 @@ if($result = $db->db_query("SELECT 1 FROM system.tbl_app WHERE app='bewerbung'")
|
||||
}
|
||||
}
|
||||
|
||||
// App 'lehrauftrag' hinzufügen
|
||||
if($result = $db->db_query("SELECT 1 FROM system.tbl_app WHERE app='lehrauftrag'"))
|
||||
{
|
||||
if($db->db_num_rows($result)==0)
|
||||
{
|
||||
|
||||
$qry = "INSERT INTO system.tbl_app(app) VALUES('lehrauftrag');";
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong>App: '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>Neue App lehrauftrag in system.tbl_app hinzugefügt';
|
||||
}
|
||||
}
|
||||
|
||||
// Archiv boolean fuer public.tbl_akte
|
||||
if(!@$db->db_query("SELECT archiv FROM public.tbl_akte LIMIT 1"))
|
||||
{
|
||||
@@ -2938,6 +2953,37 @@ if(!$result = @$db->db_query("SELECT bezeichnung_mehrsprachig FROM bis.tbl_orgfo
|
||||
}
|
||||
}
|
||||
|
||||
// Spalte vertragsstunden für tbl_vertrag
|
||||
if(!$result = @$db->db_query("SELECT vertragsstunden FROM lehre.tbl_vertrag LIMIT 1"))
|
||||
{
|
||||
$qry = "ALTER TABLE lehre.tbl_vertrag ADD COLUMN vertragsstunden NUMERIC(5,2);";
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong>lehre.tbl_vertrag: '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>lehre.tbl_vertrag: Spalte vertragsstunden hinzugefuegt';
|
||||
}
|
||||
|
||||
// Spalte vertragsstunden_studiensemester_kurzbz für tbl_vertrag
|
||||
if(!$result = @$db->db_query("SELECT vertragsstunden_studiensemester_kurzbz FROM lehre.tbl_vertrag LIMIT 1"))
|
||||
{
|
||||
$qry = "
|
||||
ALTER TABLE lehre.tbl_vertrag
|
||||
ADD COLUMN vertragsstunden_studiensemester_kurzbz VARCHAR(16);
|
||||
|
||||
ALTER TABLE lehre.tbl_vertrag
|
||||
ADD CONSTRAINT fk_vertrag_vertragsstunden_studiensemester_kurzbz
|
||||
FOREIGN KEY (vertragsstunden_studiensemester_kurzbz)
|
||||
REFERENCES public.tbl_studiensemester (studiensemester_kurzbz)
|
||||
ON UPDATE CASCADE ON DELETE RESTRICT;
|
||||
";
|
||||
|
||||
if (!$db->db_query($qry))
|
||||
echo '<strong>lehre.tbl_vertrag: ' . $db->db_last_error() . '</strong><br>';
|
||||
else
|
||||
echo '<br>lehre.tbl_vertrag: Spalte vertragsstunden_studiensemester_kurzbz hinzugefuegt';
|
||||
}
|
||||
|
||||
// Create SEQUENCE tbl_zeitaufzeichnung_gd_id
|
||||
if ($result = $db->db_query("SELECT 0 FROM pg_class WHERE relname = 'tbl_zeitaufzeichnung_gd_id_seq'"))
|
||||
{
|
||||
@@ -3016,7 +3062,105 @@ if(!@$db->db_query("SELECT 0 FROM campus.tbl_zeitaufzeichnung_gd WHERE 0 = 1"))
|
||||
echo '<strong>campus.tbl_zeitaufzeichnung_gd ' . $db->db_last_error() . '</strong><br>';
|
||||
else
|
||||
echo '<br>Granted privileges to <strong>vilesci</strong> on campus.tbl_zeitaufzeichnung_gd';
|
||||
}
|
||||
|
||||
|
||||
// Insert 'bestellt' to tbl_vertragsstatus
|
||||
if($result = @$db->db_query("SELECT 1 FROM lehre.tbl_vertragsstatus WHERE vertragsstatus_kurzbz = 'bestellt';"))
|
||||
{
|
||||
if($db->db_num_rows($result) == 0)
|
||||
{
|
||||
$qry = "INSERT INTO lehre.tbl_vertragsstatus(vertragsstatus_kurzbz, bezeichnung) VALUES('bestellt', 'Bestellt');";
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong>lehre.tbl_vertragsstatus '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo 'lehre.tbl_vertragsstatus: Added value \'bestellt\'<br>';
|
||||
}
|
||||
}
|
||||
|
||||
// Insert 'erteilt' to tbl_vertragsstatus
|
||||
if($result = @$db->db_query("SELECT 1 FROM lehre.tbl_vertragsstatus WHERE vertragsstatus_kurzbz = 'erteilt';"))
|
||||
{
|
||||
if($db->db_num_rows($result) == 0)
|
||||
{
|
||||
$qry = "INSERT INTO lehre.tbl_vertragsstatus(vertragsstatus_kurzbz, bezeichnung) VALUES('erteilt', 'Erteilt');";
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong>lehre.tbl_vertragsstatus '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo 'lehre.tbl_vertragsstatus: Added value \'erteilt\'<br>';
|
||||
}
|
||||
}
|
||||
|
||||
// Insert 'akzeptiert' to tbl_vertragsstatus
|
||||
if($result = @$db->db_query("SELECT 1 FROM lehre.tbl_vertragsstatus WHERE vertragsstatus_kurzbz = 'akzeptiert';"))
|
||||
{
|
||||
if($db->db_num_rows($result) == 0)
|
||||
{
|
||||
$qry = "INSERT INTO lehre.tbl_vertragsstatus(vertragsstatus_kurzbz, bezeichnung) VALUES('akzeptiert', 'Akzeptiert');";
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong>lehre.tbl_vertragsstatus '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo 'lehre.tbl_vertragsstatus: Added value \'akzeptiert\'<br>';
|
||||
}
|
||||
}
|
||||
|
||||
// Insert 'Betreuung' to tbl_vertragstyp
|
||||
if($result = @$db->db_query("SELECT 1 FROM lehre.tbl_vertragstyp WHERE vertragstyp_kurzbz = 'Betreuung';"))
|
||||
{
|
||||
if($db->db_num_rows($result) == 0)
|
||||
{
|
||||
$qry = "INSERT INTO lehre.tbl_vertragstyp(vertragstyp_kurzbz, bezeichnung) VALUES('Betreuung', 'Betreuung');";
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong>lehre.tbl_vertragstyp '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo 'lehre.tbl_vertragstyp: Added value \'Betreuung\'<br>';
|
||||
}
|
||||
}
|
||||
|
||||
// Add permission to order lehrauftrag (lehrauftrag_bestellen)
|
||||
if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'lehre/lehrauftrag_bestellen';"))
|
||||
{
|
||||
if($db->db_num_rows($result) == 0)
|
||||
{
|
||||
$qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('lehre/lehrauftrag_bestellen', 'Lehrauftrag bestellen');";
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong>system.tbl_berechtigung '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo ' system.tbl_berechtigung: Added permission for lehre/lehrauftrag_bestellen<br>';
|
||||
}
|
||||
}
|
||||
|
||||
// Add permission to approve lehrauftrag (lehrauftrag_erteilen)
|
||||
if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'lehre/lehrauftrag_erteilen';"))
|
||||
{
|
||||
if($db->db_num_rows($result) == 0)
|
||||
{
|
||||
$qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('lehre/lehrauftrag_erteilen', 'Lehrauftrag erteilen');";
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong>system.tbl_berechtigung '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo ' system.tbl_berechtigung: Added permission for lehre/lehrauftrag_erteilen<br>';
|
||||
}
|
||||
}
|
||||
|
||||
// Add permission to accept lehrauftrag (lehrauftrag_akzeptieren)
|
||||
if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'lehre/lehrauftrag_akzeptieren';"))
|
||||
{
|
||||
if($db->db_num_rows($result) == 0)
|
||||
{
|
||||
$qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('lehre/lehrauftrag_akzeptieren', 'Lehrauftrag akzeptieren');";
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong>system.tbl_berechtigung '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo ' system.tbl_berechtigung: Added permission for lehre/lehrauftrag_akzeptieren<br>';
|
||||
}
|
||||
}
|
||||
|
||||
// Add column Stufe to tbl_dokumentstudiengang
|
||||
@@ -3391,7 +3535,7 @@ $tabellen=array(
|
||||
"lehre.tbl_stundenplan" => array("stundenplan_id","unr","mitarbeiter_uid","datum","stunde","ort_kurzbz","gruppe_kurzbz","titel","anmerkung","lehreinheit_id","studiengang_kz","semester","verband","gruppe","fix","updateamum","updatevon","insertamum","insertvon"),
|
||||
"lehre.tbl_stundenplandev" => array("stundenplandev_id","lehreinheit_id","unr","studiengang_kz","semester","verband","gruppe","gruppe_kurzbz","mitarbeiter_uid","ort_kurzbz","datum","stunde","titel","anmerkung","fix","updateamum","updatevon","insertamum","insertvon","ext_id"),
|
||||
"lehre.tbl_stundenplan_betriebsmittel" => array("stundenplan_betriebsmittel_id","betriebsmittel_id","stundenplandev_id","anmerkung","insertamum","insertvon"),
|
||||
"lehre.tbl_vertrag" => array("vertrag_id","person_id","vertragstyp_kurzbz","bezeichnung","betrag","insertamum","insertvon","updateamum","updatevon","ext_id","anmerkung","vertragsdatum","lehrveranstaltung_id"),
|
||||
"lehre.tbl_vertrag" => array("vertrag_id","person_id","vertragstyp_kurzbz","bezeichnung","betrag","insertamum","insertvon","updateamum","updatevon","ext_id","anmerkung","vertragsdatum","lehrveranstaltung_id", "vertragsstunden", "vertragsstunden_studiensemester_kurzbz"),
|
||||
"lehre.tbl_vertrag_vertragsstatus" => array("vertragsstatus_kurzbz","vertrag_id","uid","datum","ext_id","insertamum","insertvon","updateamum","updatevon"),
|
||||
"lehre.tbl_vertragstyp" => array("vertragstyp_kurzbz","bezeichnung"),
|
||||
"lehre.tbl_vertragsstatus" => array("vertragsstatus_kurzbz","bezeichnung"),
|
||||
@@ -3547,7 +3691,7 @@ $i=0;
|
||||
$errors = 0;
|
||||
foreach ($tabellen AS $attribute)
|
||||
{
|
||||
$sql_attr='';
|
||||
$sql_attr = '';
|
||||
foreach($attribute AS $attr)
|
||||
$sql_attr.='"'.$attr.'",';
|
||||
$sql_attr=substr($sql_attr, 0, -1);
|
||||
|
||||
@@ -399,34 +399,6 @@ $filters = array(
|
||||
',
|
||||
'oe_kurzbz' => null,
|
||||
),
|
||||
array(
|
||||
'app' => 'infocenter',
|
||||
'dataset_name' => 'reihungstestAbsolviert',
|
||||
'filter_kurzbz' => 'InfoCenterReihungstestAbsolviertAlle',
|
||||
'description' => '{Alle}',
|
||||
'sort' => 1,
|
||||
'default_filter' => true,
|
||||
'filter' => '
|
||||
{
|
||||
"name": "Reihungstest absolviert - Alle",
|
||||
"columns": [
|
||||
{"name": "Vorname"},
|
||||
{"name": "Nachname"},
|
||||
{"name": "StgAbgeschickt"},
|
||||
{"name": "LastAction"},
|
||||
{"name": "User/Operator"},
|
||||
{"name": "LockUser"}
|
||||
],
|
||||
"filters": [
|
||||
{
|
||||
"name": "ReihungstestAngetreten",
|
||||
"operation": "true"
|
||||
}
|
||||
]
|
||||
}
|
||||
',
|
||||
'oe_kurzbz' => null,
|
||||
),
|
||||
array(
|
||||
'app' => 'budget',
|
||||
'dataset_name' => 'budgetoverview',
|
||||
@@ -625,6 +597,40 @@ $filters = array(
|
||||
}
|
||||
',
|
||||
'oe_kurzbz' => null,
|
||||
),
|
||||
array(
|
||||
'app' => 'budget',
|
||||
'dataset_name' => 'budgetoverview',
|
||||
'filter_kurzbz' => 'BudgetUebersicht',
|
||||
'description' => '{Budgetanträge Übersicht}',
|
||||
'sort' => 1,
|
||||
'default_filter' => true,
|
||||
'filter' => '
|
||||
{
|
||||
"name": "Budgetanträge",
|
||||
"columns": [
|
||||
{"name": "Budgetantrag"},
|
||||
{"name": "Kostenstelle"},
|
||||
{"name": "Organisationseinheit"},
|
||||
{"name": "Geschäftsjahr"},
|
||||
{"name": "Budgetstatus"},
|
||||
{"name": "Betrag"}
|
||||
],
|
||||
"filters": [
|
||||
{
|
||||
"name": "Budgetstatus",
|
||||
"condition": "Freigegeben",
|
||||
"operation": "ncontains"
|
||||
},
|
||||
{
|
||||
"name": "Geschäftsjahr",
|
||||
"condition": "GJ2019-2020",
|
||||
"operation": "contains"
|
||||
}
|
||||
]
|
||||
}
|
||||
',
|
||||
'oe_kurzbz' => null,
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
@@ -4014,8 +4014,67 @@ When on hold, the date is only a reminder.',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'global',
|
||||
'phrase' => 'lehrauftraegeBestellen',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Lehraufträge bestellen',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Order lectureships',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'global',
|
||||
'phrase' => 'lehrauftraegeErteilen',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Lehraufträge erteilen',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Approve lectureships',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'global',
|
||||
'phrase' => 'lehrauftraegeAnnehmen',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Lehraufträge annehmen',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Accept lectureships',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
|
||||