Merge branch 'feature-3994/Digitaler_Lehrauftrag'

This commit is contained in:
Andreas Österreicher
2019-12-12 13:54:20 +01:00
21 changed files with 799 additions and 77 deletions
+7
View File
@@ -156,6 +156,13 @@ $config['navigation_menu']['lehre/lehrauftrag/Lehrauftrag/*'] = array(
'icon' => '',
'sort' => 1,
'requiredPermissions' => 'lehre/lehrauftrag_erteilen:r'
),
'lehrauftragLehrendeÜbersicht' => array(
'link' => site_url('lehre/lehrauftrag/Lehrauftrag/LehrendeUebersicht'),
'description' => 'Lehrendenübersicht',
'icon' => '',
'sort' => 1,
'requiredPermissions' => array('lehre/lehrauftrag_bestellen:r')
)
);
$config['navigation_menu']['lehre/lehrauftrag/LehrauftragErteilen/*'] = array(
@@ -0,0 +1,536 @@
<?php
/**
* FH-Complete
*
* @package FHC-API
* @author FHC-Team
* @copyright Copyright (c) 2016, fhcomplete.org
* @license GPLv3
* @link http://fhcomplete.org
* @since Version 1.0
* @filesource
*
* Cronjobs to be run for sending emails informing about status of Lehrauftraege.
*/
// ------------------------------------------------------------------------
if (!defined('BASEPATH')) exit('No direct script access allowed');
class LehrauftragJob extends JOB_Controller
{
const BERECHTIGUNG_LEHRAUFTRAG_ERTEILEN = 'lehre/lehrauftrag_erteilen';
const BERECHTIGUNG_LEHRAUFTRAG_AKZEPTIEREN = 'lehre/lehrauftrag_akzeptieren';
const LEHRAUFTRAG_ERTEILEN_URI = 'lehre/lehrauftrag/LehrauftragErteilen';
const LEHRAUFTRAG_AKZEPTIEREN_URI = '/lehre/lehrauftrag/LehrauftragAkzeptieren';
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
// Load models
$this->load->model('accounting/Vertrag_model', 'VertragModel');
$this->load->model('accounting/Vertragvertragsstatus_model', 'VertragvertragsstatusModel');
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
$this->load->model('system/Benutzerrolle_model', 'BenutzerrolleModel');
// Load libraries
$this->load->library('PermissionLib');
// Load helpers
$this->load->helper('hlp_sancho_helper');
}
/**
* This daily job sends information about all lehr-/projektauftraege ordered (and not approved) the day bofore.
* Receivers: Department-/Kompetenzfeldleiter
**/
public function mailLehrauftraegeToApprove()
{
// Get vertrag_ids of lehrauftraege that had been ordered and had NOT been approved or cancelled YESTERDAY
$this->VertragvertragsstatusModel->addSelect('vertrag_id');
$result = $this->VertragvertragsstatusModel->getOrdered_fromDate('YESTERDAY');
// Get lehrveranstaltung_ids and studiensemester of the lehr-/or projektauftrag contracts
$lehreinheit_data_arr = array();
if ($vertrag_arr = getData($result))
{
foreach ($vertrag_arr as $vertrag)
{
$result = $this->VertragModel->getLehreinheitData($vertrag->vertrag_id, 'lehrveranstaltung_id, studiensemester_kurzbz');
if (hasData($result))
{
$obj = new StdClass();
$obj->lehrveranstaltung_id = $result->retval[0]->lehrveranstaltung_id;
$obj->studiensemester_kurzbz = $result->retval[0]->studiensemester_kurzbz;
$lehreinheit_data_arr []= $obj;
}
}
}
/**
* Build the data array to be used in the email. Data array is clustered as follows:
* Array
* [studiensemester_kurzbz] // studiensemester of lehreinheit
* Array
* [oe_kurzbz] // oe of lehreinheits lehrveranstaltung
* [oe_bezeichnung]
* Array
* [stg_kz] // stg of lehreinheits lehrveranstaltung
* [stg_kurzbz]
* [stg_bezeichnung]
* [amount] // amount of new ordered lehrauftraege of that stg
*/
$data_arr = array();
foreach ($lehreinheit_data_arr as $lehreinheit_data)
{
$result = $this->_getLVData($lehreinheit_data->lehrveranstaltung_id);
if (hasData($result))
{
// Search if studiensemester exists in data_arr
$ss_index = array_search($lehreinheit_data->studiensemester_kurzbz, array_column($data_arr, 'studiensemester_kurzbz'));
// If studiensemester is new, add studienesemester, oe and stg
if ($ss_index === false)
{
$data = array(
'studiensemester_kurzbz' => $lehreinheit_data->studiensemester_kurzbz
);
$data []= array(
'oe_kurzbz' => $result->retval[0]->oe_kurzbz,
'oe_bezeichnung' => $result->retval[0]->lv_oe_bezeichnung
);
// Add stg data to oe, start amount with 1
$data[0][] = array(
'stg_kz' => $result->retval[0]->studiengang_kz,
'stg_kurzbz' => strtoupper($result->retval[0]->stg_typ. $result->retval[0]->stg_kurzbz),
'stg_bezeichnung' => $result->retval[0]->lv_stg_bezeichnung,
'amount' => 1
);
// Push to final data_arr
$data_arr []= $data;
}
// Else if studiensemester exists
else
{
// Search if oe exists inside existing studiensemester of data_arr
$oe_index = array_search($result->retval[0]->oe_kurzbz, array_column($data_arr[$ss_index], 'oe_kurzbz'));
// If oe is new, add oe and stg to studiensemester
if ($oe_index === false)
{
// Add oe data
$data_arr[$ss_index][] = array(
'oe_kurzbz' => $result->retval[0]->oe_kurzbz,
'oe_bezeichnung' => $result->retval[0]->lv_oe_bezeichnung,
// Add stg data to oe, start amount with 1
array(
'stg_kz' => $result->retval[0]->studiengang_kz,
'stg_kurzbz' => strtoupper($result->retval[0]->stg_typ. $result->retval[0]->stg_kurzbz),
'stg_bezeichnung' => $result->retval[0]->lv_stg_bezeichnung,
'amount' => 1
)
);
}
// Else if oe exists
else
{
// Search if stg exists inside existing oe of data_arr
$stg_index = array_search($result->retval[0]->studiengang_kz, array_column($data_arr[$ss_index][$oe_index], 'stg_kz'));
// If stg is new, add stg to oe, start amount with 1
if ($stg_index === false)
{
$data_arr[$ss_index][$oe_index][] = array(
'stg_kz' => $result->retval[0]->studiengang_kz,
'stg_kurzbz' => strtoupper($result->retval[0]->stg_typ. $result->retval[0]->stg_kurzbz),
'stg_bezeichnung' => $result->retval[0]->lv_stg_bezeichnung,
'amount' => 1
);
}
// Else if stg exists
else
{
// Increase amount +1
$data_arr[$ss_index][$oe_index][$stg_index]['amount']++;
}
}
}
}
}
/**
* Cluster data by uid of entitled mail receivers.
* Returning array is clustered as follows:
* Array
* [uid]
* Array
* [studiensemester_kurzbz] // studiensemester of lehreinheit
* Array
* [oe_kurzbz] // oe of lehreinheits lehrveranstaltung
* [oe_bezeichnung]
* Array
* [stg_kz] // stg of lehreinheits lehrveranstaltung
* [stg_kurzbz]
* [stg_bezeichnung]
* [amount] // amount of new ordered lehrauftraege of that stg
*/
$data_arr = $this->_clusterData_byReceiver($data_arr);
// Send email
if(!$this->_sendMail_toApprove($data_arr))
{
$this->logInfo('SUCCEDED: Sending emails about yesterdays ordered lehrauftraege succeded.');
}
else
{
$this->logError('Error when sending emails in job MailLehrauftragToApprove');
}
}
/**
* This daily job sends information about all lehr-/projektauftraege approved the day bofore.
* Receivers: lectors
**/
public function mailLehrauftraegeToAccept()
{
// Get vertrag_id and uid of lehrauftraege that had been approved and had NOT been accepted or cancelled YESTERDAY
$this->VertragvertragsstatusModel->addSelect('vertrag_id, uid');
$this->VertragvertragsstatusModel->addOrder('uid');
$result = $this->VertragvertragsstatusModel->getApproved_fromDate('YESTERDAY');
/**
* Build the data array to be used in the email. Data array is clustered as follows:
* Array
* [uid] // lectors uid (mail receiver)
* [studiensemester] // studiensemester of the lehrauftraege (can be more, e.g. 'WS2019 and SS2020')
* [amount] // amount of new approved lehrauftraege
**/
$data_arr = array();
if ($vertrag_arr = getData($result))
{
foreach ($vertrag_arr as $vertrag)
{
// Get studiensemester of the lehrauftrag
$this->VertragModel->addSelect('vertragsstunden_studiensemester_kurzbz');
$result = $this->VertragModel->load($vertrag->vertrag_id);
if ($studiensemester = getData($result))
{
$studiensemester = $studiensemester[0]->vertragsstunden_studiensemester_kurzbz;
}
// Search if uid exists in data_arr
$uid_index = array_search($vertrag->uid, array_column($data_arr, 'uid'));
// If uid is new, add uid, studiensemester and start amount with 1
if ($uid_index === false)
{
$data = array();
$data['uid'] = $vertrag->uid;
$data['studiensemester'] = $studiensemester;
$data['amount']= 1;
$data_arr []= $data;
}
// Else if uid exists
else
{
// If studiensemester is new, add to studiensemester-string
if (strpos($data_arr[$uid_index]['studiensemester'], $studiensemester) === false)
{
$data_arr[$uid_index]['studiensemester'] .= ' und '. $studiensemester;
}
// Increase amount +1
$data_arr[$uid_index]['amount']++;
}
}
}
// Send email
if ($this->_sendMail_toAccept($data_arr))
{
$this->logInfo('SUCCEDED: Sending emails about yesterdays approved lehrauftraege succeded.');
}
else
{
$this->logError('Error when sending emails in job MailLehrauftragToAccept');
}
}
//******************************************************************************************************************
// PRIVATE FUNCTIONS
//******************************************************************************************************************
/**
* Get data of given lehrveranstaltung.
* @param $lehrveranstaltung_id
* @return mixed
*/
private function _getLVData($lehrveranstaltung_id)
{
$this->LehrveranstaltungModel->addSelect('
tbl_lehrveranstaltung.oe_kurzbz,
oe.bezeichnung AS "lv_oe_bezeichnung",
tbl_lehrveranstaltung.studiengang_kz,
stg.bezeichnung AS "lv_stg_bezeichnung",
stg.typ AS "stg_typ",
stg.kurzbz AS "stg_kurzbz"
');
$this->LehrveranstaltungModel->addJoin('lehre.tbl_studienplan_lehrveranstaltung stpllv', 'lehrveranstaltung_id');
$this->LehrveranstaltungModel->addJoin('lehre.tbl_studienplan stpl', 'studienplan_id');
$this->LehrveranstaltungModel->addJoin('lehre.tbl_studienordnung sto', 'studienordnung_id');
$this->LehrveranstaltungModel->addJoin('public.tbl_studiengang stg', 'ON stg.studiengang_kz = tbl_lehrveranstaltung.studiengang_kz');
$this->LehrveranstaltungModel->addJoin('public.tbl_organisationseinheit oe', 'ON oe.oe_kurzbz = tbl_lehrveranstaltung.oe_kurzbz');
$this->LehrveranstaltungModel->addOrder('stpllv.insertamum', 'DESC');
$this->LehrveranstaltungModel->addLimit(1);
return $this->LehrveranstaltungModel->load($lehrveranstaltung_id);
}
/**
* Send Sancho eMail about ordered Lehrauftraege.
* @param $data_arr
*/
private function _sendMail_toApprove($data_arr)
{
// Loop through 'container' of mail recipients
foreach($data_arr as $data)
{
// Set mail recipients (department assistance/leader)
$to = $data['uid']. '@'. DOMAIN;
$html_table = $this->_renderData_LehrauftraegeToApprove($data);
// Prepare mail content
$content_data_arr = array(
'table' => $html_table
);
sendSanchoMail(
'LehrauftragNeueBestellungen',
$content_data_arr,
$to,
'Bestellung neuer Lehraufträge',
'sancho_header_min_bw.jpg',
'sancho_footer_min_bw.jpg'
);
}
}
/**
* Cluster the data array by entitled mail receiver.
* Returning array is clustered as follows:
* Array
* [uid]
* Array
* [studiensemester_kurzbz] // studiensemester of lehreinheit
* Array
* [oe_kurzbz] // oe of lehreinheits lehrveranstaltung
* [oe_bezeichnung]
* Array
* [stg_kz] // stg of lehreinheits lehrveranstaltung
* [stg_kurzbz]
* [stg_bezeichnung]
* [amount] // amount of new ordered lehrauftraege of that stg
* @param $data_arr
* @return array
*
*/
private function _clusterData_byReceiver($data_arr)
{
$mail_data_arr = array(); // final array with all data clustered by mail receiver
// Loop through 'container' of studiensemester
foreach ($data_arr as $data)
{
$data_len = count($data) - 1;
// Loop through 'container' of organisational units
for ($i = 0; $i < $data_len; $i++)
{
// Get all users entitled by organisational unit
$result = $this->BenutzerrolleModel->getBenutzerByBerechtigung(self::BERECHTIGUNG_LEHRAUFTRAG_ERTEILEN, $data[$i]['oe_kurzbz']);
if ($berechtigung_arr = getData($result))
{
// Loop through entitled users
foreach ($berechtigung_arr as $berechtigung)
{
// Search if UID exists inside mail_data_arr
$uid_index = array_search($berechtigung->uid, array_column($mail_data_arr, 'uid'));
// If UID is new, add UID to final array
if ($uid_index === false)
{
// add UID with corresponding data
$mail_data_arr [] = array(
'uid' => $berechtigung->uid,
array(
'studiensemester_kurzbz' => $data['studiensemester_kurzbz'],
$data[$i]
)
);
} // Else if UID exists
else
{
// Search if studiensemester exists
$ss_index = array_search($data['studiensemester_kurzbz'], array_column($mail_data_arr, 'studiensemester_kurzbz'));
// If studiensemester is new, add studiensemester to existing UID
if ($ss_index === false)
{
$mail_data_arr[$uid_index] []= array(
'studiensemester_kurzbz' => $data['studiensemester_kurzbz'],
$data[$i]
);
}
// Else if studiensemester exists
else
{
// Add corresponding data to existing studiensemester of UID
$mail_data_arr[$uid_index]['studiensemester_kurbz'][] = $data[$i];
}
}
}
}
}
}
return $mail_data_arr;
}
/**
* Render the data array for the mail template returing a HTML table.
* @param $data_arr Data to be used in HTML table
* @return string HTML table to be embedded in eMail
*/
private function _renderData_LehrauftraegeToApprove($data_arr)
{
$html = '';
foreach ($data_arr as $studiensemester_container)
{
if (is_array($studiensemester_container)) // is_array 'trims' the outer associative key [uid]
{
if (isset($studiensemester_container['studiensemester_kurzbz']))
{
$studiensemester = $studiensemester_container['studiensemester_kurzbz'];
// Link to LehrauftragErteilen
$url = site_url(self::LEHRAUFTRAG_ERTEILEN_URI).'?studiensemester='. $studiensemester;
}
// HTML table header
$html .= '
<br>
<span style="font-size: small;"><b>Studiensemester: '. $studiensemester. '</b></span>
<br><br>
<table style="width: 100%; border-collapse: collapse;" border="1" cellpadding="5">
<thead>
<tr>
<th style="width: 30%; font-size: 12px;"><span>LV-Organisationseinheit</span></th>
<th style="width: 40%; font-size: 12px;"><span>Studiengang</span></th>
<th style="width: 15%; font-size: 12px;"><span>STG-Kurzbezeichnung</span></th>
<th style="width: 15%; font-size: 12px;"><span><strong>Anzahl neu bestellter Lehrauftr&auml;ge</strong></span></th>
</tr>
</thead>
<tbody>'
;
// HTML table body
foreach ($studiensemester_container as $oe_container)
{
if (is_array($oe_container)) // is_array 'trims' the outer associative key [studiensemester_kurzbz]
{
if (isset($oe_container['oe_bezeichnung']))
{
$oe_bezeichnung = $oe_container['oe_bezeichnung'];
}
foreach ($oe_container as $stg_data)
{
if (is_array($stg_data)) // is_array 'trims' the outer associative keys [oe_kurzbz] and [oe_bezeichnung]
{
$html .= '
<tr>
<td><span style="font-size: small;">'. $oe_bezeichnung. '</span></td>
<td><span style="font-size: small;">'. $stg_data['stg_bezeichnung']. '</span></td>
<td align="center"><span style="font-size: small;">'. $stg_data['stg_kurzbz']. '</span></td>
<td align="center"><span style="font-size: small;"><strong>'. $stg_data['amount']. '</strong></span></td>
</tr>
';
}
}
}
}
// HTML table body end and link
$html .= '
</tbody>
</table>
<br>
<span style="font-size: small;">'. anchor($url, 'Lehraufträge Übersicht '. $studiensemester). '</span>
<br><br>
';
}
}
return $html;
}
/**
* Send Sancho eMail about ordered Lehrauftraege.
* @param $data_arr
*/
private function _sendMail_toAccept($data_arr)
{
// Loop through 'container' of mail recipients
foreach($data_arr as $data)
{
// Set mail recipient (lector)
$to = $data['uid']. '@'. DOMAIN;
// Link to LehrauftragAkzeptieren
$url = CIS_ROOT. 'cis/index.php?menu='.
CIS_ROOT. 'cis/menu.php?content_id=&content='.
CIS_ROOT. index_page(). self::LEHRAUFTRAG_AKZEPTIEREN_URI;
// Get first name
$first_name = '';
$this->load->model('person/Benutzer_model', 'BenutzerModel');
$this->BenutzerModel->addSelect('vorname');
$this->BenutzerModel->addJoin('public.tbl_person', 'person_id');
$result = $this->BenutzerModel->loadWhere(array('uid' => $data['uid']));
if (hasData($result))
{
$first_name = $result->retval[0]->vorname;
}
// Prepare mail content
$content_data_arr = array(
'vorname' => $first_name,
'studiensemester' => $data['studiensemester'],
'anzahl' => $data['amount'],
'link' => anchor($url, 'Lehraufträge Übersicht')
);
sendSanchoMail(
'LehrauftragNeueErteilte',
$content_data_arr,
$to,
'Neu erteilte Lehraufträge zum Annehmen bereit'
);
}
}
}
@@ -26,7 +26,8 @@ class Lehrauftrag extends Auth_Controller
array(
'index' => 'lehre/lehrauftrag_bestellen:r',
'orderLehrauftrag' => 'lehre/lehrauftrag_bestellen:rw',
'Dashboard' => array('lehre/lehrauftrag_bestellen:r', 'lehre/lehrauftrag_erteilen:rw')
'Dashboard' => array('lehre/lehrauftrag_bestellen:r', 'lehre/lehrauftrag_erteilen:rw'),
'LehrendeUebersicht' => array('lehre/lehrauftrag_bestellen:r')
)
);
@@ -69,6 +70,14 @@ class Lehrauftrag extends Auth_Controller
$this->load->view('lehre/lehrauftrag/Dashboard.php');
}
/**
* Display of Lehrauftragsübersicht report
*/
public function LehrendeUebersicht()
{
$this->load->view('lehre/lehrauftrag/LehrendeUebersicht.php');
}
// -----------------------------------------------------------------------------------------------------------------
// Public methods
/**
@@ -168,9 +168,9 @@ class LehrauftragAkzeptieren extends Auth_Controller
/**
* 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
* - inkludierte_lehre is null OR 0: freelancer lector -> has NO inkludierte Lehre
* - inkludierte_lehre -1: fix employed lector -> has inkludierte Lehre (all inclusive)
* - inkludierte_lehre > 0: fix employed lector -> has inkludierte Lehre (value is amount of hours included)
*/
public function checkInkludierteLehre()
{
@@ -178,7 +178,7 @@ class LehrauftragAkzeptieren extends Auth_Controller
if (hasData($result))
{
$this->outputJsonSuccess(!is_null($result->retval[0]->inkludierte_lehre));
$this->outputJsonSuccess(!is_null($result->retval[0]->inkludierte_lehre) && $result->retval[0]->inkludierte_lehre != 0);
}
else
{
@@ -130,5 +130,61 @@ class Vertragvertragsstatus_model extends DB_Model
);
}
/**
* Get all contracts, where the status had been set to 'bestellt' on given date
* @param string $string_date e.g. '01.11.2019' or special Date/Time inputs like 'YESTERDAY', 'TODAY', 'NOW'
* @param bool $further_processed If true, ALL ordered contracts of that day are retrieved, even if they were
* were ALSO approved/accepted/cancelled (further processed) on that same day.
* @return array
*/
public function getOrdered_fromDate($string_date = 'TODAY', $further_processed = false)
{
$condition = '
vertragsstatus_kurzbz = \'bestellt\' AND
(datum)::date = date \''. $string_date .'\'
';
if (!$further_processed)
{
$condition .= '
AND
vertrag_id NOT IN (
SELECT vertrag_id
FROM lehre.tbl_vertrag_vertragsstatus
WHERE vertragsstatus_kurzbz IN (\'erteilt\', \'akzeptiert\', \'storno\')
)
';
}
return $this->loadWhere($condition);
}
/**
* Get all contracts, where the status had been set to 'erteilt' on given date
* @param string $string_date e.g. '01.11.2019' or special Date/Time inputs like 'YESTERDAY', 'TODAY', 'NOW'
* @param bool $further_processed If true, ALL contracts approved on that day are retrieved, even if they were
* were ALSO accepted/cancelled (further processed) on that same day.
* @return array
*/
public function getApproved_fromDate($string_date = 'TODAY', $further_processed = false)
{
$condition = '
vertragsstatus_kurzbz = \'erteilt\' AND
(datum)::date = date \''. $string_date .'\'
';
if (!$further_processed)
{
$condition .= '
AND
vertrag_id NOT IN (
SELECT vertrag_id
FROM lehre.tbl_vertrag_vertragsstatus
WHERE vertragsstatus_kurzbz IN (\'akzeptiert\', \'storno\')
)
';
}
return $this->loadWhere($condition);
}
}
@@ -48,7 +48,7 @@ class Benutzerfunktion_model extends DB_Model
if (is_string($funktion_kurzbz))
{
$query .= " AND funktion_kurzbz = ".$funktion_kurzbz.")";
$query .= " AND funktion_kurzbz = '".$funktion_kurzbz."'";
}
elseif (is_array($funktion_kurzbz) && count($funktion_kurzbz) > 0)
{
@@ -11,7 +11,7 @@ class Benutzerrolle_model extends DB_Model
$this->dbTable = 'system.tbl_benutzerrolle';
$this->pk = 'benutzerberechtigung_id';
}
/**
* Checks if the given user is an admin
*/
@@ -19,9 +19,9 @@ class Benutzerrolle_model extends DB_Model
{
// Join with the table tbl_benutzer
$this->addJoin('public.tbl_benutzer', 'uid');
$result = $this->loadWhere(array('person_id' => $person_id, 'rolle_kurzbz' => 'admin'));
if (!isError($result))
{
if (hasData($result))
@@ -33,25 +33,35 @@ class Benutzerrolle_model extends DB_Model
$result = success(false);
}
}
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){
/**
* 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)
{
$params = array();
$query = '
SELECT
*
FROM
system.vw_berechtigung_nichtrekursiv
WHERE
berechtigung_kurzbz = ?';
$condition = array('berechtigung_kurzbz' => $berechtigung_kurzbz);
$params[] = $berechtigung_kurzbz;
if (is_string($oe_kurzbz))
{
$condition['oe_kurzbz'] = $oe_kurzbz;
}
if (!is_null($oe_kurzbz))
{
$query .= ' AND oe_kurzbz = ?';
$params[] = $oe_kurzbz;
}
return $this->loadWhere($condition);
}
}
return $this->execQuery($query, $params);
}
}
@@ -0,0 +1,39 @@
<?php
$this->load->view(
'templates/FHC-Header',
array(
'title' => 'Lehrauftrag bestellen',
'jquery' => true,
'bootstrap' => true,
'fontawesome' => true,
'sbadmintemplate' => true,
'ajaxlib' => true,
'navigationwidget' => 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">
Lehraufträge - Lehrendenübersicht
</h3>
</div>
</div>
<div>
<iframe src="<?php echo base_url() . '/addons/reports/cis/vorschau.php?statistik_kurzbz=LehrauftraegeOeUebersicht'; ?>"
style="height: 950px; width: 100%; border: none">
</iframe>
</div>
</div>
</div>
</body>
<?php $this->load->view('templates/FHC-Footer'); ?>
@@ -48,23 +48,52 @@ $this->load->view(
<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>Wählen Sie die Lehraufträge, die Sie annehmen möchten, selbst 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>
<br>
<h4>Filter</h4>
<div class="panel panel-body">
<div class="col-xs-12 col-md-8 col-lg-6">
<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"><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>
</tr>
<tr class="text-center">
<td><b>Alle</b><br>Alle Lehraufträge mit jedem Status</td>
<td><b>Bestellt</b><br>Nur bestellte UND bestellte Lehraufträge, die in Bearbeitung sind</td>
<td><b>Erteilt</b><br>Nur erteilte UND geänderte Lehraufträge, die in Bearbeitung sind</td>
<td><b>Angenommen</b><br>Nur von Ihnen angenommene Lehraufträge</td>
</tr>
</table>
</div>
</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>
@@ -308,7 +308,7 @@ $filterWidgetArray = array(
'OrgForm',
'Person-ID',
'Typ',
'Auftrag',
'LV- / Projektbezeichnung',
'Semester',
'Organisationseinheit',
'Gruppe',
@@ -369,14 +369,14 @@ $filterWidgetArray = array(
orgform_kurzbz: {headerFilter:"input"},
person_id: {visible: false},
typ: {headerFilter:"input", width: "7%"},
auftrag: {headerFilter:"input", width: "23%"},
auftrag: {headerFilter:"input", width: "15%"},
semester: {headerFilter:"input"},
lv_oe_kurzbz: {headerFilter:"input", width: "12%"},
lv_oe_kurzbz: {headerFilter:"input", width: "8%"},
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,
betrag: {align:"right", width: "6%", formatter: form_formatNulltoStringNumber,
headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator,
bottomCalc:"sum", bottomCalcParams:{precision:2}, bottomCalcFormatter:"money", bottomCalcFormatterParams:{decimal: ",", thousand: ".", symbol:"€"},
width: "8%"},
@@ -384,9 +384,9 @@ $filterWidgetArray = array(
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: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: bestellt_tooltip, width: "8%"},
erteilt: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: erteilt_tooltip, width: "8%"},
akzeptiert: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: akzeptiert_tooltip, width: "8%"},
bestellt_von: {visible: false},
erteilt_von: {visible: false},
akzeptiert_von: {visible: false}
@@ -116,7 +116,7 @@ $this->load->view(
<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>Geändert</b><br>Nur Lehraufträge, die geändert wurden, nachdem sie bereits bestellt oder erteilt worden sind</td>
<td><b>Dummies</b><br>Nur Lehraufträge, die mit einem Dummylektor angelegt sind</td>
</tr>
</table>
@@ -318,7 +318,7 @@ $filterWidgetArray = array(
'OrgForm',
'Person-ID',
'Typ',
'Auftrag',
'LV- / Projektbezeichnung',
'Semester',
'Organisationseinheit',
'Gruppe',
@@ -385,7 +385,7 @@ $filterWidgetArray = array(
projektarbeit_id: {visible: false},
studiensemester_kurzbz: {headerFilter:"input"},
studiengang_kz: {visible: false},
stg_typ_kurzbz: {visible: false},
stg_typ_kurzbz: {headerFilter:"input", width: "5%"},
orgform_kurzbz: {headerFilter:"input"},
person_id: {visible: false},
typ: {headerFilter:"input"},
@@ -397,16 +397,16 @@ $filterWidgetArray = array(
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,
betrag: {align:"right", width: "8%", 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: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: bestellt_tooltip, width: "8%"},
erteilt: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: erteilt_tooltip, width: "8%"},
akzeptiert: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: akzeptiert_tooltip, width: "8%"},
bestellt_von: {visible: false},
erteilt_von: {visible: false},
akzeptiert_von: {visible: false},
@@ -86,6 +86,7 @@ $this->load->view(
<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>
Diese müssen dann erneut bestellt werden.<br><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>
@@ -117,7 +118,7 @@ $this->load->view(
<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>Geändert</b><br>Nur Lehraufträge, die geändert wurden, nachdem sie bereits bestellt oder erteilt worden sind</td>
<td><b>Dummies</b><br>Nur Lehraufträge, die mit einem Dummylektor angelegt sind</td>
</tr>
</table>
@@ -16,6 +16,36 @@ SELECT
studiensemester_kurzbz,
studiengang_kz,
stg_typ_kurzbz,
/* get valid STPL(s), to which the lehrveranstaltung is assigned to (can be more) */
/* therefore join over lv, studiensemester and semester */
(
SELECT
string_agg(bezeichnung, \', \')
FROM (
SELECT stpl.bezeichnung
FROM lehre.tbl_studienplan stpl
JOIN lehre.tbl_studienplan_semester stplsem USING (studienplan_id)
JOIN lehre.tbl_studienplan_lehrveranstaltung stpllv USING (studienplan_id)
JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
JOIN lehre.tbl_lehreinheit le USING (lehrveranstaltung_id)
WHERE
/* join over lv of the le */
le.lehreinheit_id = auftraege.lehreinheit_id
AND stpl.aktiv
/* then restrict on stpl of les studiensemester */
AND stplsem.studiensemester_kurzbz = le.studiensemester_kurzbz
/* then restrict on stpl of lvs semester*/
AND stplsem.semester = stpllv.semester
/* then restrict on most recent inserted studienplan of the lv */
AND studienplan_id = (
SELECT stpllv.studienplan_id
FROM lehre.tbl_studienplan_lehrveranstaltung
WHERE lehrveranstaltung_id = lv.lehrveranstaltung_id
ORDER BY insertamum DESC
LIMIT 1
)
) AS tmp_stpl
) AS "studienplan_bezeichnung",
orgform_kurzbz,
person_id,
typ,
@@ -317,10 +347,11 @@ $filterWidgetArray = array(
'Studiensemester',
'Studiengang-KZ',
'Studiengang',
'Studienplan',
'OrgForm',
'Person-ID',
'Typ',
'Auftrag',
'LV- / Projektbezeichnung',
'Semester',
'Organisationseinheit',
'Gruppe',
@@ -389,11 +420,12 @@ $filterWidgetArray = array(
projektarbeit_id: {visible: false},
studiensemester_kurzbz: {headerFilter:"input"},
studiengang_kz: {visible: false},
stg_typ_kurzbz: {visible: false},
stg_typ_kurzbz: {headerFilter:"input", width: "5%"},
studienplan_bezeichnung: {headerFilter:"input", width: "7%"},
orgform_kurzbz: {headerFilter:"input"},
person_id: {visible: false},
typ: {headerFilter:"input"},
auftrag: {headerFilter:"input", width:"20%"},
auftrag: {headerFilter:"input", width:"15%"},
semester: {headerFilter:"input"},
lv_oe_kurzbz: {headerFilter:"input"},
gruppe: {headerFilter:"input"},
@@ -402,7 +434,7 @@ $filterWidgetArray = array(
headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator,
bottomCalc:"sum", bottomCalcParams:{precision:1}},
stundensatz: {visible: false},
betrag: {align:"right", formatter: form_formatNulltoStringNumber,
betrag: {align:"right", width: "8%", formatter: form_formatNulltoStringNumber,
headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator,
bottomCalc:"sum", bottomCalcParams:{precision:2}, bottomCalcFormatter:"money",
bottomCalcFormatterParams:{decimal: ",", thousand: ".", symbol:"€"}},
@@ -410,12 +442,12 @@ $filterWidgetArray = array(
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: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: bestellt_tooltip, width: "8%"},
erteilt: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: erteilt_tooltip, width: "8%"},
akzeptiert: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: akzeptiert_tooltip, width: "8%"},
bestellt_von: {visible: false},
erteilt_von: {visible: false},
akzeptiert_von: {visible: false},
akzeptiert_von: {visible: false}
}', // col properties
);
+5 -2
View File
@@ -693,8 +693,11 @@ if(!$error)
//Lehreinheitmitarbeiterzuteilung loeschen
if(isset($_POST['lehreinheit_id']) && is_numeric($_POST['lehreinheit_id']) && isset($_POST['mitarbeiter_uid']))
{
// Wenn der Mitarbeiter schon einen Vertrag hat, wird das Loeschen verhindert
if (isset($_POST['vertrag_id']) && is_numeric($_POST['vertrag_id']))
// Wenn der Mitarbeiter schon einen Vertrag hat UND
// der config Eintrag zum Anzeigen der Vertragsdetails true ist,
// wird das Loeschen verhindert
if (isset($_POST['vertrag_id']) && is_numeric($_POST['vertrag_id']) &&
(defined('FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN') && FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN))
{
$return = false;
$errormsg = 'Löschen nur nach Stornierung des Vertrags möglich.';
@@ -43,6 +43,10 @@ var lehrveranstaltungLvGesamtNotenSelectUID=null; //LehreinheitID des Noten Eint
var lehrveranstaltungNotenTreeloaded=false;
var lehrveranstaltungGesamtNotenTreeloaded=false;
var LehrveranstaltungAusbildungssemesterFilter='';
// Config-Eintrag, ob Vertragsdetails angezeigt werden sollen
var lehrveranstaltung_vertragsdetails_anzeigen = Boolean(<?php echo (defined('FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN') && FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN) ? true : false ?>);
// ********** Observer und Listener ************* //
// ****
@@ -1331,12 +1335,9 @@ function LeMitarbeiterAuswahl()
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-checkbox-bismelden').checked=false;
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) {
if (lehrveranstaltung_vertragsdetails_anzeigen) {
// Reset attributes
document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-label-vertragsstatus').setAttribute("style", "font-weight: normal");
+2 -1
View File
@@ -4041,7 +4041,8 @@ if(!$error)
else
{
// Wenn der Projektbetreuer schon einen Vertrag hat, wird das Loeschen verhindert
if (isset($_POST['vertrag_id']) && is_numeric($_POST['vertrag_id']))
if (isset($_POST['vertrag_id']) && is_numeric($_POST['vertrag_id']) &&
(defined('FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN') && FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN))
{
$return = false;
$errormsg = 'Löschen nur nach Stornierung des Vertrags möglich.';
+8 -10
View File
@@ -31,7 +31,9 @@ var StudentProjektbetreuerTreeDatasource=null; //Datasource des Projektbetreuer
var StudentProjektbetreuerSelectPersonID=null;
var StudentProjektbetreuerSelectProjektarbeitID=null;
var StudentProjektbetreuerSelectBetreuerartKurzbz=null;
vertragsdetails_anzeigen = new Boolean(<?php echo (defined('FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN') && FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN) ? 'true' : 'false' ?>);
// Config-Eintrag, ob Vertragsdetails angezeigt werden sollen
var projektarbeit_vertragsdetails_anzeigen = Boolean(<?php echo (defined('FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN') && FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN) ? true : false ?>);
// ********** Observer und Listener ************* //
@@ -117,7 +119,7 @@ var StudentProjektbetreuerTreeListener =
//ohne dem setTimeout
window.setTimeout(StudentProjektbetreuerTreeSelectID,10);
if(vertragsdetails_anzeigen)
if(projektarbeit_vertragsdetails_anzeigen)
{
var mindEinVertragExistiert = StudentProjektbetreuer_VertragExistiert();
@@ -181,10 +183,9 @@ function StudentProjektarbeitTreeLoad(uid)
tree.builder.addListener(StudentProjektarbeitTreeListener);
StudentProjektarbeitDisableFields(false);
var vertragsdetails_anzeigen = new Boolean(<?php echo (defined('FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN') && FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN) ? 'true' : 'false' ?>);
// Wenn Vertragsdetails angezeigt werden
if (vertragsdetails_anzeigen) {
if (projektarbeit_vertragsdetails_anzeigen) {
//Reset attributes
document.getElementById('student-projektbetreuer-label-vertragsstatus').value = '';
document.getElementById('student-projektbetreuer-label-vertragsstunden').value = '';
@@ -891,12 +892,9 @@ function StudentProjektbetreuerAuswahl()
document.getElementById('student-projektbetreuer-checkbox-neu').checked=false;
var gesamtkosten = StudentProjektbetreuerGesamtkosten();
// Prüfe ob Vertragsdetails angezeigt werden
var vertragsdetails_anzeigen = new Boolean(<?php echo (defined('FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN') && FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN) ? 'true' : 'false' ?>);
// Wenn Vertragsdetails angezeigt werden
if (vertragsdetails_anzeigen) {
if (projektarbeit_vertragsdetails_anzeigen) {
//Reset attributes
document.getElementById('student-projektbetreuer-label-vertragsstatus').setAttribute("style", "font-weight: normal");
document.getElementById('student-projektbetreuer-button-vertrag-stornieren').setAttribute("tooltiptext",
@@ -96,7 +96,7 @@ function func_initialFilter(){
// -----------------------------------------------------------------------------------------------------------------
// Formats the group header
function func_groupHeader(data){
return data[0].lv_bezeichnung; // change name to lehrveranstaltung
return data[0].lv_bezeichnung + "&nbsp;&nbsp;" + ' ( LV-ID: ' + data[0].lehrveranstaltung_id + ' )'; // change name to lehrveranstaltung;
};
// Formats the rows
@@ -100,9 +100,9 @@ function func_dataLoaded(data, table){
// Tabulator table format functions
// -----------------------------------------------------------------------------------------------------------------
// Formats the group header
function func_groupHeader(data){
return data[0].lv_bezeichnung; // change name to lehrveranstaltung
};
function func_groupHeader(data) {
return data[0].lv_bezeichnung + "&nbsp;&nbsp;" + ' ( LV-ID: ' + data[0].lehrveranstaltung_id + ' )'; // change name to lehrveranstaltung;
}
// Formats the rows
function func_rowFormatter(row){
+1 -1
View File
@@ -31,7 +31,7 @@ $uid = get_uid();
$rechte = new benutzerberechtigung();
$rechte->getBerechtigungen($uid);
if(!$rechte->isBerechtigt('vertrag/mitarbeiter'))
if(!$rechte->isBerechtigt('vertrag/mitarbeiter') && !$rechte->isBerechtigt('lehre/lehrauftrag_bestellen'))
die('Sie haben keine Berechtigung für diese Seite');
$datum_obj = new datum();