';
-
+
return array($amount, $html);
}
}
diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php
index d76c0d79b..8982b9970 100644
--- a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php
+++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php
@@ -85,7 +85,7 @@ class approveAnrechnungDetail extends Auth_Controller
// Get Anrechung data
$anrechnungData = $this->anrechnunglib->getAnrechnungData($anrechnung_id);
-
+
// Get Antrag data
$antragData = $this->anrechnunglib->getAntragData(
$anrechnungData->prestudent_id,
@@ -98,7 +98,7 @@ class approveAnrechnungDetail extends Auth_Controller
// Get Genehmigung data
$genehmigungData = $this->anrechnunglib->getGenehmigungData($anrechnung_id);
-
+
$viewData = array(
'antragData' => $antragData,
'anrechnungData' => $anrechnungData,
@@ -121,13 +121,13 @@ class approveAnrechnungDetail extends Auth_Controller
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
-
+
// Get STGLs person data
if (!$person = getData($this->PersonModel->getByUID($this->_uid))[0])
{
show_error('Failed retrieving person data');
}
-
+
// Approve Anrechnung
foreach ($data as $item)
{
@@ -166,13 +166,13 @@ class approveAnrechnungDetail extends Auth_Controller
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
-
+
// Get STGLs person data
if (!$person = getData($this->PersonModel->getByUID($this->_uid))[0])
{
show_error('Failed retrieving person data');
}
-
+
// Reject Anrechnung
foreach ($data as $item)
{
@@ -210,10 +210,10 @@ class approveAnrechnungDetail extends Auth_Controller
{
return $this->outputJsonError('Fehler beim Übertragen der Daten.');
}
-
+
$retval = array();
$counter = 0;
-
+
foreach ($data as $item)
{
// Check if Anrechnungs-LV has lector
@@ -221,18 +221,18 @@ class approveAnrechnungDetail extends Auth_Controller
{
// Count up LV with no lector
$counter++;
-
+
// Break, if LV has no lector
break;
}
-
+
// Get full name of LV Leitung.
// If LV Leitung is not present, get full name of LV lectors.
$lector_arr = $this->anrechnunglib->getLectors($item['anrechnung_id']);
$empfehlungsanfrage_an = !isEmptyArray($lector_arr)
? implode(', ', array_column($lector_arr, 'fullname'))
: '';
-
+
// Request Recommendation
if($this->anrechnunglib->requestRecommendation($item['anrechnung_id']))
{
@@ -246,7 +246,7 @@ class approveAnrechnungDetail extends Auth_Controller
);
}
}
-
+
/**
* Send mails to lectors
* NOTE: mails are sent at the end to ensure sending only ONE mail to each LV-Leitung or lector
@@ -255,11 +255,11 @@ class approveAnrechnungDetail extends Auth_Controller
if (!isEmptyArray($retval))
{
self::_sendSanchoMailToLectors($retval);
-
+
// Output json to ajax
return $this->outputJsonSuccess($retval);
}
-
+
// Output json to ajax
if (isEmptyArray($retval) && $counter > 0)
{
@@ -267,22 +267,22 @@ class approveAnrechnungDetail extends Auth_Controller
"Empfehlung wurde nicht angefordert,\nDer LV sind keine LektorInnen zugeteilt."
);
}
-
+
return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt'));
}
-
+
/**
* Withdraw approved / rejected Anrechnung and reset to 'inProgressDP'.
*/
public function withdraw()
{
$anrechnung_id = $this->input->post('anrechnung_id');
-
+
if (!is_numeric($anrechnung_id))
{
$this->terminateWithJsonError($this->p->t('ui', 'errorFelderFehlen'));
}
-
+
// Delete last status approved / rejected.
// If last status is 'approved', Genehmigung is resetted.
$result = $this->AnrechnungModel->withdrawApprovement($anrechnung_id);
@@ -291,13 +291,13 @@ class approveAnrechnungDetail extends Auth_Controller
{
$this->terminateWithJsonError(getError($result));
}
-
+
// Success output to AJAX
$this->outputJsonSuccess(array(
'status_bezeichnung' => $this->anrechnunglib->getLastAnrechnungstatus($anrechnung_id))
);
}
-
+
/**
* Withdraw request for reommendation and reset to 'inProgressDP'.
* This is only possible if the lector has not provided a recommendation yet.
@@ -305,69 +305,69 @@ class approveAnrechnungDetail extends Auth_Controller
public function withdrawRequestRecommendation()
{
$anrechnung_id = $this->input->post('anrechnung_id');
-
+
if (!is_numeric($anrechnung_id))
{
show_error('Wrong parameter.');
}
-
+
// Get boolean empfehlung of given Anrechnung
if (!$result = getData($this->AnrechnungModel->load($anrechnung_id))[0])
{
show_error('Failed loading Anrechnung');
}
-
+
$empfehlung = $result->empfehlung_anrechnung;
-
+
// Get last Anrechnungstatus
if (!$result = getData($this->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0])
{
show_error('Failed loading last Anrechnungstatus');
}
-
+
$last_status = $result->status_kurzbz;
$anrechnungstatus_id = $result->anrechnungstatus_id;
-
+
// Return if Anrechnung was not waiting for recommendation or if Anrechnung has already been recommended
- if ($last_status != self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR && !is_null($empfehlung))
+ if ($last_status != self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR || !is_null($empfehlung))
{
return $this->outputJsonError('No recommendation to withdraw.');
}
-
+
// Reset status to 'inProgressDP'
$result = $this->AnrechnungModel->deleteAnrechnungstatus($anrechnungstatus_id);
-
+
if (isError($result))
{
return $this->outputJsonError('Could not withdraw this application.');
}
-
+
// Success output to AJAX
return $this->outputJsonSuccess(array(
'status_bezeichnung' => $this->anrechnunglib->getLastAnrechnungstatus($anrechnung_id))
);
}
-
+
public function saveEmpfehlungsNotiz()
{
$anrechnung_id = $this->input->post('anrechnung_id');
$notiz_id = $this->input->post('notiz_id');
$empfehlungstext = $this->input->post('empfehlung_text');
-
+
// Validate data
if (isEmptyString($anrechnung_id))
{
$this->terminateWithJsonError($this->p->t('ui', 'systemFehler'));
}
-
+
// Save Empfehlungstext
$result = self::_saveEmpfehlungsNotiz($anrechnung_id, $empfehlungstext, $notiz_id);
-
+
if (isError($result))
{
$this->terminateWithJsonError($this->p->t('ui', 'fehlerBeimSpeichern'));
}
-
+
// Output success message
$this->outputJsonSuccess($this->p->t('ui', 'gespeichert'));
}
@@ -386,10 +386,10 @@ class approveAnrechnungDetail extends Auth_Controller
// Check if user is entitled to read dms doc
self::_checkIfEntitledToReadDMSDoc($dms_id);
-
+
// Set filename to be used on downlaod
$filename = $this->anrechnunglib->setFilenameOnDownload($dms_id);
-
+
// Download file
$this->dmslib->download($dms_id, $filename);
}
@@ -475,7 +475,7 @@ class approveAnrechnungDetail extends Auth_Controller
show_error('You are not entitled to read this document');
}
-
+
/**
* Send mail to lectors asking for recommendation. (first to LV-Leitung, if not present to all lectors of lv)
* @param $mail_params
@@ -503,8 +503,8 @@ class approveAnrechnungDetail extends Auth_Controller
* Anyway this function will receive a unique array to avoid sending more mails to one and the same lector.
* **/
$lector_arr = $this->_getLectors($anrechnung_arr);
-
-
+
+
// Send mail to lectors
foreach ($lector_arr as $lector)
@@ -594,11 +594,11 @@ class approveAnrechnungDetail extends Auth_Controller
return $lector_arr;
}
-
+
private function _saveEmpfehlungsNotiz($anrechnung_id, $empfehlungstext, $notiz_id)
{
$this->load->model('person/Notiz_model', 'NotizModel');
-
+
if (!isEmptyString($notiz_id))
{
return $this->NotizModel->update(
@@ -610,15 +610,15 @@ class approveAnrechnungDetail extends Auth_Controller
)
);
}
-
+
return $this->NotizModel->addNotizForAnrechnung(
$anrechnung_id,
self::ANRECHNUNG_NOTIZTITEL_EMPFEHLUNGSNOTIZ_BY_STGL,
trim($empfehlungstext),
$this->_uid
);
-
-
+
+
}
}
diff --git a/application/controllers/system/FAS_UDF.php b/application/controllers/system/FAS_UDF.php
index febe266c7..ecaa44393 100644
--- a/application/controllers/system/FAS_UDF.php
+++ b/application/controllers/system/FAS_UDF.php
@@ -31,7 +31,7 @@ class FAS_UDF extends Auth_Controller
if (isset($person_id) && is_numeric($person_id))
{
- if ($this->PersonModel->hasUDF())
+ if ($this->PersonModel->udfsExistAndDefined())
{
$personUdfs = $this->PersonModel->getUDFs($person_id);
$data['person_id'] = $person_id;
@@ -41,7 +41,7 @@ class FAS_UDF extends Auth_Controller
if (isset($prestudent_id) && is_numeric($prestudent_id))
{
- if ($this->PrestudentModel->hasUDF())
+ if ($this->PrestudentModel->udfsExistAndDefined())
{
$prestudentUdfs = $this->PrestudentModel->getUDFs($prestudent_id);
$data['prestudent_id'] = $prestudent_id;
diff --git a/application/controllers/system/infocenter/InfoCenter.php b/application/controllers/system/infocenter/InfoCenter.php
index 44a1cf327..cd88f814a 100644
--- a/application/controllers/system/infocenter/InfoCenter.php
+++ b/application/controllers/system/infocenter/InfoCenter.php
@@ -124,20 +124,20 @@ class InfoCenter extends Auth_Controller
'saveAbsage' => 'infocenter:rw',
'saveFreigabe' => 'infocenter:rw',
'getNotiz' => 'infocenter:r',
- 'saveNotiz' => 'infocenter:rw',
+ 'saveNotiz' => array('infocenter:rw', 'lehre/zgvpruefung:rw'),
'updateNotiz' => 'infocenter:rw',
'reloadZgvPruefungen' => 'infocenter:r',
'reloadMessages' => 'infocenter:r',
'reloadDoks' => 'infocenter:r',
- 'reloadNotizen' => 'infocenter:r',
+ 'reloadNotizen' => array('infocenter:r', 'lehre/zgvpruefung:r'),
'reloadLogs' => 'infocenter:r',
- 'outputAkteContent' => 'infocenter:r',
- 'getPostponeDate' => 'infocenter:r',
+ 'outputAkteContent' => array('infocenter:r', 'lehre/zgvpruefung:r'),
+ 'getPostponeDate' => array('infocenter:r', 'lehre/zgvpruefung:r'),
'park' => 'infocenter:rw',
'unpark' => 'infocenter:rw',
'setOnHold' => 'infocenter:rw',
- 'removeOnHold' => 'infocenter:rw',
- 'getStudienjahrEnd' => 'infocenter:r',
+ 'removeOnHold' => array('infocenter:rw', 'lehre/zgvpruefung:rw'),
+ 'getStudienjahrEnd' => array('infocenter:r', 'lehre/zgvpruefung:r'),
'setNavigationMenuArrayJson' => 'infocenter:r',
'getAbsageData' => 'infocenter:r',
'saveAbsageForAll' => 'infocenter:rw'
diff --git a/application/controllers/system/issues/Issues.php b/application/controllers/system/issues/Issues.php
new file mode 100644
index 000000000..f942b50d9
--- /dev/null
+++ b/application/controllers/system/issues/Issues.php
@@ -0,0 +1,142 @@
+ array(self::BERECHTIGUNG_KURZBZ.':r'),
+ 'changeIssueStatus' => array(self::BERECHTIGUNG_KURZBZ.':rw')
+ )
+ );
+
+ // Load libraries
+ $this->load->library('IssuesLib');
+ $this->load->library('PermissionLib');
+ $this->load->library('WidgetLib');
+
+ $this->loadPhrases(
+ array(
+ 'global',
+ 'ui',
+ 'filter'
+ )
+ );
+
+ // Load models
+ $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
+ $this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
+
+ $this->_setAuthUID(); // sets property uid
+ }
+
+ public function index()
+ {
+ $oes_for_issues = $this->_getOesForIssues();
+
+ $this->load->view(
+ 'system/issues/issues',
+ $oes_for_issues
+ );
+ }
+
+ /**
+ * Initializes issues status change
+ */
+ public function changeIssueStatus()
+ {
+ $issue_ids = $this->input->post('issue_ids');
+ $status_kurzbz = $this->input->post('status_kurzbz');
+ $verarbeitetvon = $this->_uid;
+
+ $errors = array();
+ foreach ($issue_ids as $issue_id)
+ {
+ $issueRes = $this->issueslib->changeIssueStatus($issue_id, $status_kurzbz, $verarbeitetvon);
+
+ if (isError($issueRes))
+ $errors[] = getError($issueRes);
+ }
+
+ if (!isEmptyArray($errors))
+ $this->outputJsonError(implode(", ", $errors));
+ else
+ $this->outputJsonSuccess("Status erfolgreich aktualisiert");
+ }
+
+ /**
+ * 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');
+ }
+
+ /**
+ * Gets oes of logged in user, which are needed to display issues of the user.
+ * This includes oes assigned by a funktio and as the issue permission.
+ * @return array
+ */
+ private function _getOesForIssues()
+ {
+ // get oes of uid for which there is a current funktion
+ $all_funktionen_oe_kurzbz = array();
+ $oe_kurzbz_for_funktion = array();
+ $benutzerfunktionRes = $this->BenutzerfunktionModel->getBenutzerFunktionByUid($this->_uid, null, date('Y-m-d'), date('Y-m-d'));
+
+ if (isError($benutzerfunktionRes))
+ show_error(getError($benutzerfunktionRes));
+
+ if (hasData($benutzerfunktionRes))
+ {
+ foreach (getData($benutzerfunktionRes) as $benutzerfunktion)
+ {
+ $all_funktionen_oe_kurzbz[$benutzerfunktion->oe_kurzbz][] = $benutzerfunktion->funktion_kurzbz;
+
+ // separate oes for the funktion needed for displaying issues
+ if ($benutzerfunktion->funktion_kurzbz == self::FUNKTION_KURZBZ)
+ {
+ $oe_kurzbz_for_funktion[] = $benutzerfunktion->oe_kurzbz;
+
+ // permission also for all oes under the oe for which funktion is assigend
+ $childOesFunktionRes = $this->OrganisationseinheitModel->getChilds($benutzerfunktion->oe_kurzbz);
+
+ if (isError($childOesFunktionRes))
+ show_error(getError($childOesFunktionRes));
+
+ if (hasData($childOesFunktionRes))
+ {
+ $childOesFunktion = getData($childOesFunktionRes);
+
+ foreach ($childOesFunktion as $childOeFunktion)
+ {
+ if (!in_array($childOeFunktion->oe_kurzbz, $oe_kurzbz_for_funktion))
+ $oe_kurzbz_for_funktion[] = $childOeFunktion->oe_kurzbz;
+ }
+ }
+ }
+ }
+ }
+
+ // add oes for which there is the "manage issues" Berechtigung
+ if (!$oe_kurzbz_berechtigt = $this->permissionlib->getOE_isEntitledFor(self::BERECHTIGUNG_KURZBZ))
+ show_error('Keine Berechtigung oder Fehler bei Berechtigungsprüfung');
+
+ $all_oe_kurzbz_berechtigt = array_unique(array_merge($oe_kurzbz_for_funktion, $oe_kurzbz_berechtigt));
+
+ return array(
+ 'all_funktionen_oe_kurzbz' => $all_funktionen_oe_kurzbz,
+ 'all_oe_kurzbz_berechtigt' => $all_oe_kurzbz_berechtigt
+ );
+ }
+}
diff --git a/application/controllers/widgets/Filters.php b/application/controllers/widgets/Filters.php
index 748272f09..e87b2d331 100644
--- a/application/controllers/widgets/Filters.php
+++ b/application/controllers/widgets/Filters.php
@@ -211,7 +211,7 @@ class Filters extends FHC_Controller
public function setNavigationMenu()
{
// Generates the filters structure array
- $filterMenu = $this->filterwidgetlib->generateFilterMenu($this->input->get(FilterWidgetLib::NAVIGATION_PAGE));
+ $this->filterwidgetlib->generateFilterMenu($this->input->get(FilterWidgetLib::NAVIGATION_PAGE));
$this->outputJsonSuccess('Success');
}
@@ -271,3 +271,4 @@ class Filters extends FHC_Controller
}
}
}
+
diff --git a/application/controllers/widgets/UDF.php b/application/controllers/widgets/UDF.php
index 5b4c45776..26c30293c 100644
--- a/application/controllers/widgets/UDF.php
+++ b/application/controllers/widgets/UDF.php
@@ -26,9 +26,6 @@ class UDF extends FHC_Controller
// Loads the UDFLib with HTTP GET/POST parameters
$this->_loadUDFLib();
-
- // Checks if the caller is allow to use this UDF widget
- $this->_isAllowed();
}
//------------------------------------------------------------------------------------------------------------------
@@ -39,7 +36,6 @@ class UDF extends FHC_Controller
*/
public function saveUDFs()
{
- $udfUniqueId = $this->input->post(self::UDF_UNIQUE_ID);
$udfs = $this->input->post(UDFLib::UDFS_ARG_NAME);
if (!isEmptyString($udfs))
@@ -47,7 +43,7 @@ class UDF extends FHC_Controller
$jsonDecodedUDF = json_decode($udfs);
if ($jsonDecodedUDF != null)
{
- $this->outputJson($this->udflib->saveUDFs($udfUniqueId, $jsonDecodedUDF));
+ $this->outputJson($this->udflib->saveUDFs($jsonDecodedUDF));
}
else
{
@@ -63,17 +59,6 @@ class UDF extends FHC_Controller
//------------------------------------------------------------------------------------------------------------------
// Private methods
- /**
- * Checks if the user is allowed to use this UDFWidget
- */
- private function _isAllowed()
- {
- if (!$this->udflib->isAllowed())
- {
- $this->terminateWithJsonError('You are not allowed to access to this content');
- }
- }
-
/**
* Loads the UDFLib with the UDF_UNIQUE_ID parameter
* If the parameter UDF_UNIQUE_ID is not given then the execution of the controller is terminated and
@@ -105,3 +90,4 @@ class UDF extends FHC_Controller
}
}
}
+
diff --git a/application/core/DB_Model.php b/application/core/DB_Model.php
index 4b89ae5bf..4e555be6c 100644
--- a/application/core/DB_Model.php
+++ b/application/core/DB_Model.php
@@ -86,7 +86,7 @@ class DB_Model extends CI_Model
if (is_null($this->dbTable)) return error('The given database table name is not valid', EXIT_MODEL);
// If this table has UDF and the validation of them is ok
- if (isError($validate = $this->_manageUDFs($data, $this->dbTable))) return $validate;
+ if (isError($validate = $this->_prepareUDFsWrite($data, $this->dbTable))) return $validate;
// DB-INSERT
$insert = $this->db->insert($this->dbTable, $data);
@@ -137,7 +137,7 @@ class DB_Model extends CI_Model
if (is_null($this->dbTable)) return error('The given database table name is not valid', EXIT_MODEL);
// If this table has UDF and the validation of them is ok
- if (isError($validate = $this->_manageUDFs($data, $this->dbTable, $id))) return $validate;
+ if (isError($validate = $this->_prepareUDFsWrite($data, $this->dbTable, $id))) return $validate;
$tmpId = $id;
@@ -670,6 +670,7 @@ class DB_Model extends CI_Model
/**
* Returns all the UDF contained in this table ($dbTable)
* If no UDF are present, an empty array will be returned
+ * NOTE: only the UDFs that the logged user is allowed to read are loaded by this method
*/
public function getUDFs($id, $udfName = null)
{
@@ -700,9 +701,9 @@ class DB_Model extends CI_Model
}
/**
- * Checks if this table has the field udf_values
+ * Checks if this table has the field udf_values and if there is a UDF definition for this table
*/
- public function hasUDF()
+ public function udfsExistAndDefined()
{
if ($this->fieldExists(UDFLib::COLUMN_NAME))
{
@@ -844,25 +845,25 @@ class DB_Model extends CI_Model
}
/**
- * Wrapper method for UDFLib->manageUDFs
+ * Wrapper method for UDFLib->prepareUDFsWrite
*/
- private function _manageUDFs(&$data, $schemaAndTable, $id = null)
+ private function _prepareUDFsWrite(&$data, $schemaAndTable, $id = null)
{
- $manageUDFs = success();
+ $prepareUDFsWrite = success();
- if ($this->hasUDF())
+ if ($this->udfsExistAndDefined())
{
if ($id != null)
{
- $manageUDFs = $this->udflib->manageUDFs($data, $this->dbTable, $this->getUDFs($id));
+ $prepareUDFsWrite = $this->udflib->prepareUDFsWrite($data, $this->dbTable, $this->_getUDFsNoPerms($id));
}
else
{
- $manageUDFs = $this->udflib->manageUDFs($data, $this->dbTable);
+ $prepareUDFsWrite = $this->udflib->prepareUDFsWrite($data, $this->dbTable);
}
}
- return $manageUDFs;
+ return $prepareUDFsWrite;
}
/**
@@ -874,9 +875,10 @@ class DB_Model extends CI_Model
*/
private function _toPhp($result)
{
+ $udfs = false; // if UDFs are inside the given result set
$toPhp = $result; // if there is nothing to convert then return the result from DB
- // If it's an object its fields will be parsed to find booleans and arrays types
+ // If it's an object its fields will be parsed to find booleans, arrays and UDFs types
if (is_object($result))
{
$toBeConverterdArray = array(); // Fields to be converted
@@ -884,40 +886,48 @@ class DB_Model extends CI_Model
$this->executedQueryMetaData = $result->field_data(); // Fields information
$this->executedQueryListFields = $result->list_fields(); // List of the retrieved fields
- for ($i = 0; $i < count($this->executedQueryMetaData); $i++) // Looking for booleans and arrays
+ // Looking for booleans, arrays and UDFs
+ foreach ($this->executedQueryMetaData as $eqmd)
{
// If array type, boolean type OR a UDF
- if (strpos($this->executedQueryMetaData[$i]->type, DB_Model::PGSQL_ARRAY_TYPE) !== false
- || $this->executedQueryMetaData[$i]->type == DB_Model::PGSQL_BOOLEAN_TYPE
- || $this->udflib->isUDFColumn($this->executedQueryMetaData[$i]->name, $this->executedQueryMetaData[$i]->type))
+ if (strpos($eqmd->type, DB_Model::PGSQL_ARRAY_TYPE) !== false
+ || $eqmd->type == DB_Model::PGSQL_BOOLEAN_TYPE
+ || $this->udflib->isUDFColumn($eqmd->name, $eqmd->type))
{
- // Name and type of the field to be converted
- $toBeConverted = new stdClass();
- // Set the type of the field to be converted
- $toBeConverted->type = $this->executedQueryMetaData[$i]->type;
- // Set the name of the field to be converted
- $toBeConverted->name = $this->executedQueryMetaData[$i]->name;
- // Add the field to be converted to $toBeConverterdArray
- array_push($toBeConverterdArray, $toBeConverted);
+ // If UDFs are inside this result set
+ if ($this->udflib->isUDFColumn($eqmd->name, $eqmd->type))
+ {
+ $udfs = true;
+ }
+ else // all the other cases
+ {
+ // Name and type of the field to be converted
+ $toBeConverted = new stdClass();
+ // Set the type of the field to be converted
+ $toBeConverted->type = $eqmd->type;
+ // Set the name of the field to be converted
+ $toBeConverted->name = $eqmd->name;
+ // Add the field to be converted to $toBeConverterdArray
+ array_push($toBeConverterdArray, $toBeConverted);
+ }
}
}
- // If there is something to convert, otherwhise don't lose time
- if (count($toBeConverterdArray) > 0)
- {
- // Returns the array of objects, each of them represents a DB record
- $resultsArray = $result->result();
- // Looping on results
- for ($i = 0; $i < count($resultsArray); $i++)
- {
- // Single element
- $resultElement = $resultsArray[$i];
- // Looping on fields to be converted
- for ($j = 0; $j < count($toBeConverterdArray); $j++)
- {
- // Single element
- $toBeConverted = $toBeConverterdArray[$j];
+ // Returns the array of objects, each of them represents a DB record
+ $resultsArray = $result->result();
+ // If in this result set there are UDFs then prepare them
+ if ($udfs) $this->udflib->prepareUDFsRead($resultsArray, $this->dbTable);
+
+ // If there is something to convert, otherwhise don't waste time
+ if (!isEmptyArray($toBeConverterdArray))
+ {
+ // Looping on results
+ foreach ($resultsArray as $resultElement)
+ {
+ // Looping on fields to be converted
+ foreach ($toBeConverterdArray as $toBeConverted)
+ {
// Array type
if (strpos($toBeConverted->type, DB_Model::PGSQL_ARRAY_TYPE) !== false)
{
@@ -931,30 +941,12 @@ class DB_Model extends CI_Model
{
$resultElement->{$toBeConverted->name} = $this->pgBoolPhp($resultElement->{$toBeConverted->name});
}
- // UDF
- elseif ($this->udflib->isUDFColumn($toBeConverted->name, $toBeConverted->type))
- {
- $jsonValues = json_decode($resultElement->{$toBeConverted->name}); // decode UDFs values
- if ($jsonValues != null) // if decode is ok
- {
- // For every UDF
- foreach ($jsonValues as $key => $value)
- {
- $resultElement->{$key} = $value; // create a new element called like the UDF
- }
- }
- unset($resultElement->{UDFLib::COLUMN_NAME}); // remove udf_values from the response
- }
}
}
- // Returns DB data as an array
- $toPhp = $resultsArray;
- }
- // And returns DB data as an array
- else
- {
- $toPhp = $result->result();
}
+
+ // Returns DB data as an array
+ $toPhp = $resultsArray;
}
return $toPhp;
@@ -998,4 +990,48 @@ class DB_Model extends CI_Model
{
if ($this->debugMode) $this->loglib->logDebug($this->db->last_query());
}
+
+ /**
+ * Returns all the UDF contained in this table ($dbTable)
+ * If no UDF are present, an empty array will be returned
+ * NOTE: it returns all the UDFs, does _not_ check the permissions
+ */
+ private function _getUDFsNoPerms($id)
+ {
+ $udfs = array();
+
+ $this->db->select(UDFLib::COLUMN_NAME, true); // get only the UDF column
+
+ // Primary key management
+ $tmpId = $id;
+
+ // Check for composite Primary Key
+ if (is_array($id))
+ {
+ if (isset($id[0]))
+ {
+ $tmpId = $this->_arrayCombine($this->pk, $id);
+ }
+ }
+ elseif ($id != null)
+ {
+ $tmpId = array($this->pk => $id);
+ }
+
+ // Read the record from the table
+ $result = $this->db->get_where($this->dbTable, $tmpId);
+
+ // If was a success and there are data
+ if ($result && count($result->result()) == 1)
+ {
+ // Get the UDF column and decode it from JSON
+ $jsonValues = json_decode($result->result()[0]->{UDFLib::COLUMN_NAME});
+
+ // If the JSON convertion was fine convert the object to an array
+ if ($jsonValues != null) $udfs = get_object_vars($jsonValues);
+ }
+
+ return $udfs;
+ }
}
+
diff --git a/application/core/JQW_Controller.php b/application/core/JQW_Controller.php
index 361efd998..1bc4cd346 100644
--- a/application/core/JQW_Controller.php
+++ b/application/core/JQW_Controller.php
@@ -70,6 +70,19 @@ abstract class JQW_Controller extends JOB_Controller
return $jobs;
}
+ /**
+ * To get all the jobs specified by the given parameters
+ */
+ protected function getJobsByTypeStatus($type, $status)
+ {
+ $jobs = $this->jobsqueuelib->getJobsByTypeStatus($type, $status);
+
+ // If an error occurred then log it in database
+ if (isError($jobs)) $this->logError(getError($jobs), array($type, $status));
+
+ return $jobs;
+ }
+
/**
* To get all the jobs specified by the given parameters
*/
diff --git a/application/libraries/FilterWidgetLib.php b/application/libraries/FilterWidgetLib.php
index 0a4526680..cdf0cac3c 100644
--- a/application/libraries/FilterWidgetLib.php
+++ b/application/libraries/FilterWidgetLib.php
@@ -266,6 +266,7 @@ class FilterWidgetLib
$whereParameters = array(
'app' => $app,
'dataset_name' => $datasetName,
+ 'person_id' => null,
'default_filter' => true
);
@@ -738,8 +739,10 @@ class FilterWidgetLib
$this->_ci->load->model('system/Filters_model', 'FiltersModel');
// Loads all the filters related to this page (same dataset_name and same app name)
- $filters = $this->_ci->FiltersModel->getFiltersByAppDatasetName(
- $session[self::APP], $session[self::DATASET_NAME]
+ $filters = $this->_ci->FiltersModel->getFiltersByAppDatasetNamePersonId(
+ $session[self::APP],
+ $session[self::DATASET_NAME],
+ getAuthPersonId()
);
// If filters were loaded
@@ -813,9 +816,6 @@ class FilterWidgetLib
}
}
- //------------------------------------------------------------------------------------------------------------------
- // Private methods
-
/**
* Return an unique string that identify this filter widget
* NOTE: The default value is the URI where the FilterWidget is called
@@ -857,6 +857,9 @@ class FilterWidgetLib
$this->_filterUniqueId = $filterUniqueId;
}
+ //------------------------------------------------------------------------------------------------------------------
+ // Private methods
+
/**
* Generates a condition for a SQL where clause using the given applied filter definition.
* By default an empty string is returned.
@@ -972,3 +975,4 @@ class FilterWidgetLib
return $pos;
}
}
+
diff --git a/application/libraries/IssuesLib.php b/application/libraries/IssuesLib.php
new file mode 100644
index 000000000..1b06db333
--- /dev/null
+++ b/application/libraries/IssuesLib.php
@@ -0,0 +1,244 @@
+_ci =& get_instance();
+
+ // Properties default values
+ $this->_app = 'core';
+ $this->_insertvon = 'system';
+ $this->_fallbackFehlercode = 'UNKNOWN_ERROR';
+
+ // If parameters are given then overwrite the default values
+ if (!isEmptyArray($params)) $this->setConfigs($params);
+
+ // load models
+ $this->_ci->load->model('system/Issue_model', 'IssueModel');
+ $this->_ci->load->model('system/Fehler_model', 'FehlerModel');
+ }
+
+ // --------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * Store configuration parameters for this lib
+ */
+ public function setConfigs($params)
+ {
+ // If parameters are given then overwrite the default values
+ if (!isEmptyArray($params))
+ {
+ if (isset($params[self::APP_INDEX])) $this->_app = $params[self::APP_INDEX];
+ if (isset($params[self::INSERTVON_INDEX])) $this->_insertvon = $params[self::INSERTVON_INDEX];
+ if (isset($params[self::FALLBACK_FEHLERCODE_INDEX])) $this->_fallbackFehlercode = $params[self::FALLBACK_FEHLERCODE_INDEX];
+ }
+ }
+
+ /**
+ * Adds an Fhc issue, i.e. an internal, self-defined issue.
+ * @param string $fehler_kurzbz short unique text name of the issue
+ * @param int $person_id
+ * @param string $oe_kurzbz
+ * @param array $fehlertext_params params for sprint replace of error text in system.tbl_fehler
+ * @return object success or error
+ */
+ public function addFhcIssue($fehler_kurzbz, $person_id = null, $oe_kurzbz = null, $fehlertext_params = null)
+ {
+ $fehlerRes = $this->_ci->FehlerModel->loadWhere(array('fehler_kurzbz' => $fehler_kurzbz));
+
+ if (hasData($fehlerRes))
+ {
+ $fehlercode = getData($fehlerRes)[0]->fehlercode;
+ return $this->_addIssue($fehlercode, $person_id, $oe_kurzbz, $fehlertext_params);
+ }
+ else
+ return error("Fehler $fehler_kurzbz nicht gefunden");
+ }
+
+ /**
+ * Adds an external issue, already defined externally by another system.
+ * @param string $fehlercode_extern the error code in the external system
+ * @param string $inhalt_extern error text in external system
+ * @param int $person_id
+ * @param int $oe_kurzbz
+ * @param array $fehlertext_params params for replacement of parts of error text
+ * @param bool $force_predefined if true, only predefined external issues are added
+ * @return object success or error
+ */
+ public function addExternalIssue($fehlercode_extern, $inhalt_extern, $person_id = null, $oe_kurzbz = null, $fehlertext_params = null, $force_predefined = false)
+ {
+ if (isEmptyString($fehlercode_extern))
+ return error("fehlercode_extern fehlt");
+
+ // get external fehlercode (unique for each app)
+ $this->_ci->FehlerModel->addSelect('fehlercode');
+ $fehlerRes = $this->_ci->FehlerModel->loadWhere(
+ array(
+ 'fehlercode_extern' => $fehlercode_extern,
+ 'app' => $this->_app
+ )
+ );
+
+ if (isError($fehlerRes))
+ return $fehlerRes;
+
+ $fehlerData = getData($fehlerRes)[0];
+
+ // check if there is a predefined custom error for the external issue
+ if (hasData($fehlerRes))
+ {
+ // if found, use the code
+ $fehlercode = $fehlerData->fehlercode;
+ }
+ elseif ($force_predefined === true)
+ {
+ // only added if predefined
+ return success("No definition found - not added");
+ }
+ else
+ {
+ // if predefined error is not found, insert with fallback code
+ $fehlercode = $this->_fallbackFehlercode;
+ }
+
+ // add external issue
+ return $this->_addIssue($fehlercode, $person_id, $oe_kurzbz, $fehlertext_params, $fehlercode_extern, $inhalt_extern);
+ }
+
+ /**
+ * Changes status of an issue.
+ * @param int $issue_id
+ * @param string $status_kurzbz the new status
+ * @param string $verarbeitetvon uid of person changing the status (needed for in Bearbeitung and behoben)
+ * @return success or error
+ */
+ public function changeIssueStatus($issue_id, $status_kurzbz, $verarbeitetvon = null)
+ {
+ if (!isset($issue_id) || !is_numeric($issue_id))
+ return error("Issue Id muss korrekt gesetzt sein.");
+
+ // check if given status is same as existing
+ $this->_ci->IssueModel->addSelect('status_kurzbz');
+ $currStatus = $this->_ci->IssueModel->load($issue_id);
+
+ if (hasData($currStatus))
+ {
+ if (getData($currStatus)[0]->status_kurzbz == $status_kurzbz)
+ return success("Gleicher Status bereits gesetzt");
+ }
+ else
+ return error("Fehler beim Holen des Status");
+
+ $data = array(
+ 'status_kurzbz' => $status_kurzbz,
+ 'updatevon' => $verarbeitetvon,
+ 'updateamum' => date('Y-m-d H:i:s')
+ );
+
+ if ($status_kurzbz == self::STATUS_NEU)
+ {
+
+ $data['verarbeitetvon'] = null;
+ }
+
+ if ($status_kurzbz == self::STATUS_NEU || $status_kurzbz == self::STATUS_IN_BEARBEITUNG)
+ {
+ $data['verarbeitetamum'] = null;
+ }
+
+ if ($status_kurzbz == self::STATUS_IN_BEARBEITUNG || $status_kurzbz == self::STATUS_BEHOBEN)
+ {
+ if (isset($verarbeitetvon))
+ $data['verarbeitetvon'] = $verarbeitetvon;
+ else
+ return error("Verarbeitetvon nicht gesetzt");
+ }
+
+ if ($status_kurzbz == self::STATUS_BEHOBEN)
+ $data['verarbeitetamum'] = date('Y-m-d H:i:s');
+
+ return $this->_ci->IssueModel->update(
+ array(
+ 'issue_id' => $issue_id
+ ),
+ $data
+ );
+ }
+
+ /**
+ * Adds an issue.
+ * @param $fehlercode
+ * @param int $person_id
+ * @param string $oe_kurzbz
+ * @param array $fehlertext_params
+ * @param string $fehlercode_extern
+ * @param string $inhalt_extern
+ * @return object success or error
+ */
+ private function _addIssue($fehlercode, $person_id = null, $oe_kurzbz = null, $fehlertext_params = null, $fehlercode_extern = null, $inhalt_extern = null)
+ {
+ if (isEmptyString($person_id) && isEmptyString($oe_kurzbz))
+ return error("Person_id oder oe_kurzbz muss gesetzt sein.");
+
+ // get fehlertextVorlage and replace it with params
+ $fehlerRes = $this->_ci->FehlerModel->load($fehlercode);
+
+ if (hasData($fehlerRes))
+ {
+ $fehlertextVorlage = getData($fehlerRes)[0]->fehlertext;
+ $fehlertext = isEmptyArray($fehlertext_params) ? $fehlertextVorlage : vsprintf($fehlertextVorlage, $fehlertext_params);
+
+ $openIssuesCountRes = $this->_ci->IssueModel->getOpenIssueCount($fehlercode, $person_id, $oe_kurzbz, $fehlercode_extern);
+
+ if (hasData($openIssuesCountRes))
+ {
+ // don't insert if issue is already open
+ // already open - status new with same fehlercode or same fehlercode-extern (if set)
+ $openIssueCount = getData($openIssuesCountRes)[0]->anzahl_open_issues;
+
+ if ($openIssueCount == 0)
+ {
+ return $this->_ci->IssueModel->insert(
+ array(
+ 'fehlercode' => $fehlercode,
+ 'fehlercode_extern' => $fehlercode_extern,
+ 'inhalt' => $fehlertext,
+ 'inhalt_extern' => $inhalt_extern,
+ 'person_id' => $person_id,
+ 'oe_kurzbz' => $oe_kurzbz,
+ 'datum' => date('Y-m-d H:i:s'),
+ 'status_kurzbz' => self::STATUS_NEU,
+ 'insertvon' => $this->_insertvon
+ )
+ );
+ }
+ else
+ return success($openIssueCount);
+ }
+ else
+ return error("Anzahl offener Issues konnte nicht ermittelt werden.");
+ }
+ else
+ return error("Fehler $fehlercode nicht gefunden");
+ }
+}
diff --git a/application/libraries/JobsQueueLib.php b/application/libraries/JobsQueueLib.php
index d264f7119..5871a3767 100644
--- a/application/libraries/JobsQueueLib.php
+++ b/application/libraries/JobsQueueLib.php
@@ -72,6 +72,18 @@ class JobsQueueLib
return $this->_ci->JobsQueueModel->loadWhere(array('status' => self::STATUS_NEW, 'type' => $type));
}
+ /**
+ * To get all the jobs specified by the given parameters
+ */
+ public function getJobsByTypeStatus($type, $status)
+ {
+ $this->_ci->JobsQueueModel->resetQuery();
+
+ $this->_ci->JobsQueueModel->addOrder('creationtime', 'DESC');
+
+ return $this->_ci->JobsQueueModel->loadWhere(array('status' => $status, 'type' => $type));
+ }
+
/**
* To get all the jobs specified by the given parameters
*/
diff --git a/application/libraries/UDFLib.php b/application/libraries/UDFLib.php
index f9ad7d20d..827bdc989 100644
--- a/application/libraries/UDFLib.php
+++ b/application/libraries/UDFLib.php
@@ -30,13 +30,14 @@ class UDFLib
// ...to specify permissions that are needed to use this TableWidget
const REQUIRED_PERMISSIONS_PARAMETER = 'requiredPermissions';
+ const PERMISSION_TABLE_METHOD = 'UDFWidget'; // Name for fake method to be checked by the PermissionLib
+ const PERMISSION_TYPE_READ = 'r';
+ const PERMISSION_TYPE_WRITE = 'w';
+
// ...to specify the primary key name and value
const PRIMARY_KEY_NAME = 'primaryKeyName';
const PRIMARY_KEY_VALUE = 'primaryKeyValue';
- const PERMISSION_TABLE_METHOD = 'UDFWidget'; // Name for fake method to be checked by the PermissionLib
- const PERMISSION_TYPE = 'rw';
-
// HTML components
const LABEL = 'title';
const TITLE = 'description';
@@ -76,10 +77,10 @@ class UDFLib
// Public methods
/**
- * UDFWidget
- */
- public function UDFWidget($args, $htmlArgs = array())
- {
+ * UDFWidget
+ */
+ public function UDFWidget($args, $htmlArgs = array())
+ {
if ((isset($args[self::SCHEMA_ARG_NAME]) && !isEmptyString($args[self::SCHEMA_ARG_NAME]))
&& (isset($args[self::TABLE_ARG_NAME]) && !isEmptyString($args[self::TABLE_ARG_NAME])))
{
@@ -112,16 +113,17 @@ class UDFLib
show_error(self::TABLE_ARG_NAME.' parameter is missing!');
}
}
- }
+ }
- /**
+ /**
* It renders the HTML of the UDF
*
* NOTE: When this method is called $widgetData contains different data from
* parameter $args in the constructor
*/
- public function displayUDFWidget(&$widgetData)
+ public function displayUDFWidget(&$widgetData)
{
+ $field = null;
$schema = $widgetData[self::SCHEMA_ARG_NAME]; // schema attribute
$table = $widgetData[self::TABLE_ARG_NAME]; // table attribute
@@ -133,7 +135,7 @@ class UDFLib
$udfResults = $this->_loadUDF($schema, $table); // loads UDF definition
if (hasData($udfResults))
{
- $udf = $udfResults->retval[0]; // only one record is loaded
+ $udf = getData($udfResults)[0]; // only one record is loaded
if (isset($udf->jsons))
{
$jsonSchemas = json_decode($udf->jsons); // decode the json schema
@@ -155,7 +157,7 @@ class UDFLib
$found = false; // used to check if the field is found or not in the json schema
$this->_sortJsonSchemas($jsonSchemasArray); // Sort the list of UDF by sort property
-
+
// Loops through json schemas
foreach ($jsonSchemasArray as $jsonSchema)
{
@@ -169,21 +171,37 @@ class UDFLib
{
show_error(sprintf('%s.%s: Attribute "name" not present in the json schema', $schema, $table));
}
+ // If the requiredPermissions property is not present then show an error
+ if (!isset($jsonSchema->{self::REQUIRED_PERMISSIONS_PARAMETER}))
+ {
+ show_error(sprintf('%s.%s: Attribute "requiredPermissions" not present in the json schema', $schema, $table));
+ }
+
+ // Set the required permissions for this UDF
+ $this->_setRequiredPermissions($jsonSchema->{self::NAME}, $jsonSchema->{self::REQUIRED_PERMISSIONS_PARAMETER});
// If a UDF is specified and is present in the json schemas list or no UDF is specified
if ((isset($field) && $field == $jsonSchema->{self::NAME}) || !isset($field))
{
- // Set attributes using phrases
- $this->_setAttributesWithPhrases($jsonSchema, $widgetData[HTMLWidget::HTML_ARG_NAME]);
+ // If the user has the permissions to read this field
+ if ($this->_readAllowed($jsonSchema->{self::REQUIRED_PERMISSIONS_PARAMETER}))
+ {
+ // Set attributes using phrases
+ $this->_setAttributesWithPhrases($jsonSchema, $widgetData[HTMLWidget::HTML_ARG_NAME]);
- // Set validation attributes
- $this->_setValidationAttributes($jsonSchema, $widgetData[HTMLWidget::HTML_ARG_NAME]);
+ // Set validation attributes
+ $this->_setValidationAttributes($jsonSchema, $widgetData[HTMLWidget::HTML_ARG_NAME]);
- // Set name and id attributes
- $this->_setNameAndId($jsonSchema, $widgetData[HTMLWidget::HTML_ARG_NAME]);
+ // Set name and id attributes
+ $this->_setNameAndId($jsonSchema, $widgetData[HTMLWidget::HTML_ARG_NAME]);
- // Render the HTML for this UDF
- $this->_render($jsonSchema, $widgetData);
+ // Set if the field is in read only mode
+ $this->_setReadOnly($jsonSchema, $widgetData[HTMLWidget::HTML_ARG_NAME]);
+
+ // Render the HTML for this UDF
+ $this->_render($jsonSchema, $widgetData);
+ }
+ // otherwise the UDF is not displayed
// If a UDf is specified and it was found then stop looking through this list
if (isset($field) && $field == $jsonSchema->{self::NAME})
@@ -213,12 +231,97 @@ class UDFLib
show_error(sprintf('%s.%s: Does not contain "jsons" field', $schema, $table));
}
}
- }
+ }
/**
- * Manage UDFs
+ * UDFs permissions check and convertion to read them from database
*/
- public function manageUDFs(&$data, $schemaAndTable, $udfValues = null)
+ public function prepareUDFsRead(&$data, $schemaAndTable, $udfValues = null)
+ {
+ $this->_ci->load->model('system/UDF_model', 'UDFModel');
+
+ // Retrieves UDFs definitions for this table
+ $resultUDFsDefinitions = $this->_ci->UDFModel->getUDFsDefinitions($schemaAndTable);
+
+ // If an error occurred while reading from database
+ if (isError($resultUDFsDefinitions))
+ {
+ $data = array(); // then set data as an empty array
+ return; // and exit from this method
+ }
+
+ // If there are no UDFs defined for this table the return
+ if (!hasData($resultUDFsDefinitions)) return;
+
+ // If not an error and has data, decodes json that define the UDFs for this table
+ $decodedUDFDefinitions = json_decode(
+ getData($resultUDFsDefinitions)[0]->{self::COLUMN_JSON_DESCRIPTION}
+ );
+
+ // Looping on results, resultElement is an object that represent a database record
+ foreach ($data as $resultElement)
+ {
+ // Decode the JSON column udf_values
+ $udfColumn = json_decode($resultElement->{self::COLUMN_NAME});
+
+ // If this is not a valid JSON then skip to the next database record
+ if ($udfColumn == null) continue;
+
+ // For each UDF column of this database record
+ foreach (get_object_vars($udfColumn) as $columnName => $columnValue)
+ {
+ $udfColumnToBeRemoved = $columnName; // let's try to remove it
+
+ // Loops through the UDFs definitions
+ foreach ($decodedUDFDefinitions as $decodedUDFDefinition)
+ {
+ // If the column exists in the UDF definition
+ if ($columnName == $decodedUDFDefinition->{self::NAME})
+ {
+ $udfColumnToBeRemoved = null; // then keep it
+ }
+ }
+
+ // If in this record have been found a _not_ defined UDF then remove it
+ if (!isEmptyString($udfColumnToBeRemoved)) unset($udfColumn->{$udfColumnToBeRemoved});
+ }
+
+ // Loops through the UDFs definitions
+ foreach ($decodedUDFDefinitions as $decodedUDFDefinition)
+ {
+ // Checks if the requiredPermissions is available and it is a valid array or a valid string
+ if (isset($decodedUDFDefinition->{self::REQUIRED_PERMISSIONS_PARAMETER})
+ && (!isEmptyArray($decodedUDFDefinition->{self::REQUIRED_PERMISSIONS_PARAMETER})
+ || !isEmptyString($decodedUDFDefinition->{self::REQUIRED_PERMISSIONS_PARAMETER})))
+ {
+ // Then check if the user has the permissions to read such UDF
+ if (!$this->_readAllowed($decodedUDFDefinition->{self::REQUIRED_PERMISSIONS_PARAMETER}))
+ {
+ // If not then remove the UDF from the result set
+ unset($udfColumn->{$decodedUDFDefinition->{self::NAME}});
+ }
+ }
+ else // If not then remove the UDF from the result set
+ {
+ unset($udfColumn->{$decodedUDFDefinition->{self::NAME}});
+ }
+ }
+
+ // Add the defined and permitted UDF columns to the record set
+ foreach (get_object_vars($udfColumn) as $columnName => $columnValue)
+ {
+ $resultElement->{$columnName} = $columnValue;
+ }
+ }
+
+ // And finally remove the UDFs column
+ unset($resultElement->{self::COLUMN_NAME});
+ }
+
+ /**
+ * UDFs validation and permissions check to write them into database
+ */
+ public function prepareUDFsWrite(&$data, $schemaAndTable, $udfValues = null)
{
$validate = success(true); // returned value
// Contains a list of validation errors for the UDFs that have not passed the validation
@@ -241,18 +344,34 @@ class UDFLib
// Decodes json that define the UDFs for this table
$decodedUDFDefinitions = json_decode(
- $resultUDFsDefinitions->retval[0]->{self::COLUMN_JSON_DESCRIPTION}
+ getData($resultUDFsDefinitions)[0]->{self::COLUMN_JSON_DESCRIPTION}
);
// Loops through the UDFs definitions
- for ($i = 0; $i < count($decodedUDFDefinitions); $i++)
+ foreach ($decodedUDFDefinitions as $decodedUDFDefinition)
{
- $decodedUDFDefinition = $decodedUDFDefinitions[$i]; // Definition of a single UDF
+ // Checks if the requiredPermissions is available and it is a valid array or a valid string
+ if (isset($decodedUDFDefinition->{self::REQUIRED_PERMISSIONS_PARAMETER})
+ && (!isEmptyArray($decodedUDFDefinition->{self::REQUIRED_PERMISSIONS_PARAMETER})
+ || !isEmptyString($decodedUDFDefinition->{self::REQUIRED_PERMISSIONS_PARAMETER})))
+ {
+ // Then check if the user has the permissions to write such UDF
+ if (!$this->_writeAllowed($decodedUDFDefinition->{self::REQUIRED_PERMISSIONS_PARAMETER}))
+ {
+ // If the logged user has no permissions then remove the UDF
+ unset($udfsParameters[$decodedUDFDefinition->{self::NAME}]);
+ }
+ }
+ else
+ {
+ // If no permissions have been defined for this UDF then remove it
+ unset($udfsParameters[$decodedUDFDefinition->{self::NAME}]);
+ }
// Loops through the UDFs values that should be stored
foreach ($udfsParameters as $key => $val)
{
- $tmpValidate = success(true); // temporary variable used to store the returned value from _validateUDFs
+ $tmpValidateArray = array(); // temporary variable used to store the returned value from _validateUDFs
// If this is the definition of this UDF
if ($decodedUDFDefinition->{self::NAME} == $key)
@@ -314,7 +433,7 @@ class UDFLib
if ($toBeValidated === true) // Checks if validation should be performed
{
- $tmpValidate = $this->_validateUDFs(
+ $tmpValidateArray = $this->_validateUDFs(
$decodedUDFDefinition->{self::VALIDATION},
$decodedUDFDefinition->{self::NAME},
$val
@@ -324,13 +443,13 @@ class UDFLib
}
// If validation is ok copy the value that is to be stored into $toBeStoredUDFsArray
- if (isSuccess($tmpValidate))
+ if (isEmptyArray($tmpValidateArray))
{
$toBeStoredUDFsArray[$key] = $val;
}
- else // otherwise store the validation error in $notValidUDFsArray
+ else // otherwise store the validation errors in $notValidUDFsArray
{
- $notValidUDFsArray[] = $tmpValidate;
+ $notValidUDFsArray = array_merge($notValidUDFsArray, $tmpValidateArray);
}
}
}
@@ -344,11 +463,11 @@ class UDFLib
}
// If the validation of all the supplied UDFs is ok
- if (count($notValidUDFsArray) == 0)
+ if (isEmptyArray($notValidUDFsArray))
{
// An update is performed, then in this case it preserves the values
// of the UDF that are not updated
- if (is_array($udfValues) && count($udfValues) > 0)
+ if (!isEmptyArray($udfValues))
{
foreach ($udfValues as $fieldName => $fieldValue)
{
@@ -379,7 +498,7 @@ class UDFLib
/**
* isUDFColumn
*/
- public function isUDFColumn($columnName, $columnType)
+ public function isUDFColumn($columnName, $columnType = self::COLUMN_TYPE)
{
$isUDFColumn = false;
@@ -466,7 +585,7 @@ class UDFLib
/**
* Save UDFs
*/
- public function saveUDFs($udfUniqueId, $udfs)
+ public function saveUDFs($udfs)
{
// Read the all session for this udf widget
$session = $this->getSession();
@@ -490,30 +609,80 @@ class UDFLib
// Returns the result of the database update operation to save UDFs
return $dbModel->update(
array($session[self::PRIMARY_KEY_NAME] => $session[self::PRIMARY_KEY_VALUE]),
- (array)$udfs
+ get_object_vars($udfs)
);
}
- /**
- * 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 UDFWidget.
- * If the parameter requiredPermissions is NOT given or is not present in the session,
- * then NO one is allow to use this UDFWidget
- * 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);
- }
-
// -------------------------------------------------------------------------------------------------
// Private methods
+ //
+
+ /**
+ * Checks if at least one of the permissions given as parameter belongs to the authenticated user in read mode
+ * Wrapper method to permissionlib->hasAtLeastOne
+ */
+ private function _readAllowed($requiredPermissions)
+ {
+ $readAllowed = false;
+
+ // If the user is logged then it is possible to check the permissions
+ if (isLogged())
+ {
+ $this->_ci->load->library('PermissionLib'); // Load permission library
+
+ $readAllowed = $this->_ci->permissionlib->hasAtLeastOne(
+ $requiredPermissions,
+ self::PERMISSION_TABLE_METHOD,
+ self::PERMISSION_TYPE_READ
+ );
+ } // otherwise it is not possible to check the permissions
+
+ return $readAllowed;
+ }
+
+ /**
+ * Checks if at least one of the permissions given as parameter belongs to the authenticated user in write mode
+ * Wrapper method to permissionlib->hasAtLeastOne
+ */
+ private function _writeAllowed($requiredPermissions)
+ {
+ $writeAllowed = false;
+
+ // If the user is logged then it is possible to check the permissions
+ if (isLogged())
+ {
+ $this->_ci->load->library('PermissionLib'); // Load permission library
+
+ $writeAllowed = $this->_ci->permissionlib->hasAtLeastOne(
+ $requiredPermissions,
+ self::PERMISSION_TABLE_METHOD,
+ self::PERMISSION_TYPE_WRITE
+ );
+ } // otherwise it is not possible to check the permissions
+
+ return $writeAllowed;
+ }
+
+ /**
+ * Set an array of required permissions for a UDF into the session
+ */
+ private function _setRequiredPermissions($udfName, $permissions)
+ {
+ // Get the session for this UDFWidget
+ $session = $this->getSession();
+
+ // If does _not_ exist yet in the session
+ if (!isset($session[self::REQUIRED_PERMISSIONS_PARAMETER]))
+ {
+ $session[self::REQUIRED_PERMISSIONS_PARAMETER] = array();
+ }
+
+ // Set the required permission in the session for this UDFWidget
+ $session[self::REQUIRED_PERMISSIONS_PARAMETER][$udfName] = $permissions;
+
+ // Write into the session
+ $this->setSession($session);
+ }
/**
* Print the block for UDFs
@@ -544,12 +713,12 @@ class UDFLib
{
$udfsParameters = array();
- foreach ($data as $key => $val)
+ foreach ($data as $columnName => $columnValue)
{
- if (substr($key, 0, 4) == self::COLUMN_PREFIX)
+ if ($this->isUDFColumn($columnName))
{
- $udfsParameters[$key] = $val; // stores UDF value into property UDFs
- unset($data[$key]); // remove from data
+ $udfsParameters[$columnName] = $columnValue; // stores UDF value into property UDFs
+ unset($data[$columnName]); // remove from data
}
}
@@ -645,29 +814,39 @@ class UDFLib
}
}
- // If no UDF validation errors were raised, it's a success!!
- if (count($returnArrayValidation) == 0)
- {
- $returnArrayValidation = success(true);
- }
-
return $returnArrayValidation;
}
- /**
- * Set the name and id attribute of the HTML element
- */
- private function _setNameAndId($jsonSchema, &$htmlParameters)
- {
+ /**
+ * Disable the HTML element if in read only mode
+ */
+ private function _setReadOnly($jsonSchema, &$htmlParameters)
+ {
+ // If write permissions _not_ exist then set the field as disabled
+ if (!$this->_writeAllowed($jsonSchema->{self::REQUIRED_PERMISSIONS_PARAMETER}))
+ {
+ $htmlParameters[HTMLWidget::DISABLED] = HTMLWidget::DISABLED; // any values is fine
+ }
+ else // otherwise restore to default
+ {
+ if (isset($htmlParameters[HTMLWidget::DISABLED])) unset($htmlParameters[HTMLWidget::DISABLED]);
+ }
+ }
+
+ /**
+ * Set the name and id attribute of the HTML element
+ */
+ private function _setNameAndId($jsonSchema, &$htmlParameters)
+ {
$htmlParameters[HTMLWidget::HTML_ID] = $jsonSchema->{self::NAME};
$htmlParameters[HTMLWidget::HTML_NAME] = $jsonSchema->{self::NAME};
- }
-
- /**
- * Sort the list of UDF by sort property
- */
- private function _sortJsonSchemas(&$jsonSchemasArray)
- {
+ }
+
+ /**
+ * Sort the list of UDF by sort property
+ */
+ private function _sortJsonSchemas(&$jsonSchemasArray)
+ {
usort($jsonSchemasArray, function ($a, $b) {
if (!isset($a->{self::SORT}))
{
@@ -684,13 +863,13 @@ class UDFLib
return ($a->{self::SORT} < $b->{self::SORT}) ? -1 : 1;
});
- }
-
- /**
- * Loads the UDF description by the given schema and table
- */
- private function _loadUDF($schema, $table)
- {
+ }
+
+ /**
+ * Loads the UDF description by the given schema and table
+ */
+ private function _loadUDF($schema, $table)
+ {
// Loads UDF model
$this->_ci->load->model('system/UDF_model', 'UDFModel');
@@ -703,18 +882,7 @@ class UDFLib
if (isError($udfResults))
{
- if (is_object($udfResults) && isset($udfResults->retval))
- {
- show_error(getError($udfResults));
- }
- elseif (is_string($udfResults))
- {
- show_error($udfResults);
- }
- else
- {
- show_error('UDFWidget: generic error occurred');
- }
+ show_error(getError($udfResults));
}
elseif (!hasData($udfResults))
{
@@ -722,13 +890,13 @@ class UDFLib
}
return $udfResults;
- }
+ }
- /**
- * Render the HTML for the UDF
- */
- private function _render($jsonSchema, &$widgetData)
- {
+ /**
+ * Render the HTML for the UDF
+ */
+ private function _render($jsonSchema, &$widgetData)
+ {
// Checkbox
if ($jsonSchema->{self::TYPE} == 'checkbox')
{
@@ -759,11 +927,11 @@ class UDFLib
{
$this->_renderDropdown($jsonSchema, $widgetData, true);
}
- }
+ }
- /**
- * Renders a dropdown element
- */
+ /**
+ * Renders a dropdown element
+ */
private function _renderDropdown($jsonSchema, &$widgetData, $multiple = false)
{
// Selected element/s
@@ -792,7 +960,7 @@ class UDFLib
$queryResult = $this->_ci->UDFModel->execReadOnlyQuery($jsonSchema->{self::LIST_VALUES}->sql);
if (hasData($queryResult))
{
- $parameters = $queryResult->retval;
+ $parameters = getData($queryResult);
}
}
@@ -805,8 +973,8 @@ class UDFLib
}
/**
- * Renders a textarea element
- */
+ * Renders a textarea element
+ */
private function _renderTextarea($jsonSchema, &$widgetData)
{
$text = null; // text value
@@ -823,8 +991,8 @@ class UDFLib
}
/**
- * Renders an input text element
- */
+ * Renders an input text element
+ */
private function _renderTextfield($jsonSchema, &$widgetData)
{
$text = null; // text value
@@ -841,8 +1009,8 @@ class UDFLib
}
/**
- * Renders a checkbox element
- */
+ * Renders a checkbox element
+ */
private function _renderCheckbox($jsonSchema, &$widgetData)
{
// Set checkbox value if present in the DB
@@ -861,11 +1029,11 @@ class UDFLib
$checkboxWidgetUDF->render();
}
- /**
- * Sets the attributes of the HTML element using the phrases system
- */
- private function _setAttributesWithPhrases($jsonSchema, &$htmlParameters)
- {
+ /**
+ * Sets the attributes of the HTML element using the phrases system
+ */
+ private function _setAttributesWithPhrases($jsonSchema, &$htmlParameters)
+ {
// By default set to null all the attributes
$htmlParameters[HTMLWidget::LABEL] = null;
$htmlParameters[HTMLWidget::TITLE] = null;
@@ -893,7 +1061,7 @@ class UDFLib
);
if (hasData($tmpResult))
{
- $htmlParameters[HTMLWidget::LABEL] = $tmpResult->retval[0]->text;
+ $htmlParameters[HTMLWidget::LABEL] = getData($tmpResult)[0]->text;
}
}
@@ -911,7 +1079,7 @@ class UDFLib
);
if (hasData($tmpResult))
{
- $htmlParameters[HTMLWidget::TITLE] = $tmpResult->retval[0]->text;
+ $htmlParameters[HTMLWidget::TITLE] = getData($tmpResult)[0]->text;
}
}
@@ -929,17 +1097,17 @@ class UDFLib
);
if (hasData($tmpResult))
{
- $htmlParameters[HTMLWidget::PLACEHOLDER] = $tmpResult->retval[0]->text;
+ $htmlParameters[HTMLWidget::PLACEHOLDER] = getData($tmpResult)[0]->text;
}
}
}
- }
+ }
- /**
- * Sets the validation attributes of the HTML element using the configuration inside the json schema
- */
- private function _setValidationAttributes($jsonSchema, &$htmlParameters)
- {
+ /**
+ * Sets the validation attributes of the HTML element using the configuration inside the json schema
+ */
+ private function _setValidationAttributes($jsonSchema, &$htmlParameters)
+ {
// Validation attributes set by default to null
$htmlParameters[HTMLWidget::REGEX] = null;
$htmlParameters[HTMLWidget::REQUIRED] = null;
@@ -998,3 +1166,4 @@ class UDFLib
}
}
}
+
diff --git a/application/models/codex/Aufenthaltfoerderung_model.php b/application/models/codex/Aufenthaltfoerderung_model.php
new file mode 100644
index 000000000..b650b3a05
--- /dev/null
+++ b/application/models/codex/Aufenthaltfoerderung_model.php
@@ -0,0 +1,14 @@
+dbTable = 'bis.tbl_aufenthaltfoerderung';
+ $this->pk = 'aufenthaltfoerderung_code';
+ }
+}
diff --git a/application/models/codex/Oehbeitrag_model.php b/application/models/codex/Oehbeitrag_model.php
new file mode 100644
index 000000000..0df016ba8
--- /dev/null
+++ b/application/models/codex/Oehbeitrag_model.php
@@ -0,0 +1,107 @@
+dbTable = 'bis.tbl_oehbeitrag';
+ $this->pk = 'oehbeitrag_id';
+ }
+
+ /**
+ * Gets oehbeitrag data valid for a certain Studiensemester.
+ * @param string $studiensemester_kurzbz
+ * @return object
+ */
+ public function getByStudiensemester($studiensemester_kurzbz)
+ {
+ $qry = "WITH semstart AS (
+ SELECT start FROM public.tbl_studiensemester
+ WHERE studiensemester_kurzbz = ?
+ )
+ SELECT * FROM bis.tbl_oehbeitrag oehb
+ JOIN public.tbl_studiensemester semvon ON oehb.von_studiensemester_kurzbz = semvon.studiensemester_kurzbz
+ LEFT JOIN public.tbl_studiensemester sembis ON oehb.bis_studiensemester_kurzbz = sembis.studiensemester_kurzbz
+ JOIN semstart ON semstart.start::date >= semvon.start::date AND (sembis.studiensemester_kurzbz IS NULL OR semstart.start::date <= sembis.start::date)
+ ORDER BY semvon.start
+ LIMIT 1";
+
+ return $this->execQuery($qry, array($studiensemester_kurzbz));
+ }
+
+ /**
+ * Gets all Studiensemester for which no Oehbeitrag value assignment exists.
+ * @param string $start_studiensemester_kurzbz semester before the given semester are ignored
+ * @param array $excluded_oehbeitrag_id oehbeitraege to be ignored, i.e. which are assigned
+ * @return object
+ */
+ public function getUnassignedStudiensemester($start_studiensemester_kurzbz, $excluded_oehbeitrag_id = array())
+ {
+ $params = array($start_studiensemester_kurzbz);
+
+ $qry = "SELECT * FROM public.tbl_studiensemester sem
+ WHERE sem.start >= (SELECT start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz = ?)
+ AND NOT EXISTS (SELECT 1 FROM bis.tbl_oehbeitrag oeh
+ JOIN public.tbl_studiensemester oeh_von ON oeh.von_studiensemester_kurzbz = oeh_von.studiensemester_kurzbz
+ LEFT JOIN public.tbl_studiensemester oeh_bis ON oeh.bis_studiensemester_kurzbz = oeh_bis.studiensemester_kurzbz
+ WHERE sem.start::date >= oeh_von.start::date AND (sem.start::date <= oeh_bis.start::date OR oeh_bis.studiensemester_kurzbz IS NULL)";
+
+ if (!isEmptyArray($excluded_oehbeitrag_id))
+ {
+ $qry .= " AND oehbeitrag_id NOT IN ?";
+ $params[] = $excluded_oehbeitrag_id;
+ }
+
+ $qry .= ") ORDER BY sem.start";
+
+ return $this->execQuery($qry, $params);
+ }
+
+ /**
+ * Checks if a Öhbeitrag can be assigned for a Studiensemester range.
+ * @param string $von_studiensemester_kurzbz
+ * @param string $bis_studiensemester_kurzbz
+ * @param array $excluded_oehbeitrag_id oehbeitraege to ignore, i.e. which are assignable
+ * @return object array with true if assignable, with false if not
+ */
+ public function checkIfStudiensemesterAssignable($von_studiensemester_kurzbz, $bis_studiensemester_kurzbz = null, $excluded_oehbeitrag_id = array())
+ {
+ $params = array($von_studiensemester_kurzbz);
+
+ $allStdSemSpanQry = "SELECT count(studiensemester_kurzbz) as number_assigned FROM public.tbl_studiensemester sem
+ WHERE start >= (SELECT start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz = ?)";
+
+ if ($bis_studiensemester_kurzbz != null)
+ {
+ $allStdSemSpanQry .= " AND (start <= (SELECT start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz = ?))";
+ $params[] = $bis_studiensemester_kurzbz;
+ }
+
+ $allStdSemSpanQry .= " AND EXISTS (SELECT 1 FROM bis.tbl_oehbeitrag
+ JOIN public.tbl_studiensemester sem_von ON tbl_oehbeitrag.von_studiensemester_kurzbz = sem_von.studiensemester_kurzbz
+ LEFT JOIN public.tbl_studiensemester sem_bis ON tbl_oehbeitrag.bis_studiensemester_kurzbz = sem_bis.studiensemester_kurzbz
+ WHERE sem.start >= sem_von.start AND (sem.start <= sem_bis.start OR sem_bis.studiensemester_kurzbz IS NULL)";
+
+ if (!isEmptyArray($excluded_oehbeitrag_id))
+ {
+ $allStdSemSpanQry .= " AND oehbeitrag_id NOT IN ?";
+ $params[] = $excluded_oehbeitrag_id;
+ }
+
+ $allStdSemSpanQry .= ")";
+
+ $nrAssigned = $this->execQuery($allStdSemSpanQry, $params);
+
+ if (isError($nrAssigned))
+ return $nrAssigned;
+
+ if (!hasData($nrAssigned))
+ return error("Fehler bei Überprüfung der Möglichkeit der Semesterzuweisung");
+
+ return success(array(getData($nrAssigned)[0]->number_assigned == 0));
+ }
+}
diff --git a/application/models/crm/Prestudent_model.php b/application/models/crm/Prestudent_model.php
index 2553fd5fa..4111e5f19 100644
--- a/application/models/crm/Prestudent_model.php
+++ b/application/models/crm/Prestudent_model.php
@@ -291,7 +291,7 @@ class Prestudent_model extends DB_Model
$prestudentdata->prestudentstatus = $lastStatusData;
- if ($this->hasUDF())
+ if ($this->udfsExistAndDefined())
{
$prestudentdata->prestudentUdfs = $this->getUDFs($prestudent_id);
}
@@ -625,4 +625,34 @@ class Prestudent_model extends DB_Model
return $this->execQuery($query, array($person, $studiengang, $studienSemester));
}
+
+ /**
+ * Gets förderrelevant flag for a prestudent, from prestudent, or, if not set on prestudent level, from studiengang
+ * @param int $prestudent_id
+ * @return object
+ */
+ public function getFoerderrelevant($prestudent_id)
+ {
+ $query = 'SELECT COALESCE (ps.foerderrelevant, stg.foerderrelevant) AS foerderrelevant
+ FROM public.tbl_prestudent ps
+ LEFT JOIN public.tbl_studiengang stg USING (studiengang_kz)
+ WHERE prestudent_id = ?';
+
+ return $this->execQuery($query, array($prestudent_id));
+ }
+
+ /**
+ * Gets bis standort_code for a prestudent, from prestudent, or, if not set on prestudent level, from studiengang
+ * @param int $prestudent_id
+ * @return object
+ */
+ public function getStandortCode($prestudent_id)
+ {
+ $query = 'SELECT COALESCE (ps.standort_code, stg.standort_code) AS standort_code
+ FROM public.tbl_prestudent ps
+ LEFT JOIN public.tbl_studiengang stg USING (studiengang_kz)
+ WHERE prestudent_id = ?';
+
+ return $this->execQuery($query, array($prestudent_id));
+ }
}
diff --git a/application/models/crm/Statusgrund_model.php b/application/models/crm/Statusgrund_model.php
index 7ab17a45b..d488e12d1 100644
--- a/application/models/crm/Statusgrund_model.php
+++ b/application/models/crm/Statusgrund_model.php
@@ -12,7 +12,7 @@ class Statusgrund_model extends DB_Model
$this->pk = "statusgrund_id";
}
- public function getStatus($status_kurzbz = null, $aktiv = null)
+ public function getStatus($status_kurzbz = null, $aktiv = null, $statusgrund_kurzbz = null)
{
$this->addOrder('bezeichnung_mehrsprachig');
$where = array();
@@ -20,6 +20,8 @@ class Statusgrund_model extends DB_Model
$where['status_kurzbz'] = $status_kurzbz;
if (!is_null($aktiv))
$where['aktiv'] = $aktiv;
+ if (!is_null($statusgrund_kurzbz))
+ $where['statusgrund_kurzbz'] = $statusgrund_kurzbz;
$status = $this->loadWhere($where);
diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php
index ef5373f5f..8517d7f9d 100644
--- a/application/models/education/Lehrveranstaltung_model.php
+++ b/application/models/education/Lehrveranstaltung_model.php
@@ -169,18 +169,34 @@ class Lehrveranstaltung_model extends DB_Model
*/
public function getLecturersByLv($studiensemester_kurzbz, $lehrveranstaltung_id)
{
- $query = "SELECT * FROM (SELECT distinct on(uid) vorname, nachname, tbl_benutzer.uid as uid,
- CASE WHEN lehrfunktion_kurzbz='LV-Leitung' THEN true ELSE false END as lvleiter
- FROM lehre.tbl_lehreinheit, lehre.tbl_lehreinheitmitarbeiter, public.tbl_benutzer, public.tbl_person
- WHERE
- tbl_lehreinheit.lehreinheit_id=tbl_lehreinheitmitarbeiter.lehreinheit_id AND
- tbl_lehreinheitmitarbeiter.mitarbeiter_uid=tbl_benutzer.uid AND
- tbl_person.person_id=tbl_benutzer.person_id AND
- lehrveranstaltung_id=? AND
- tbl_lehreinheitmitarbeiter.mitarbeiter_uid NOT like '_Dummy%' AND
- tbl_benutzer.aktiv=true AND tbl_person.aktiv=true AND
- studiensemester_kurzbz=?) AS a
- ORDER BY lvleiter DESC, nachname, vorname";
+ $query = "SELECT
+ *
+ FROM
+ (SELECT distinct on(uid) vorname, nachname, tbl_benutzer.uid as uid,
+ CASE WHEN
+ EXISTS(
+ SELECT
+ 1
+ FROM
+ lehre.tbl_lehreinheitmitarbeiter lvllem
+ JOIN lehre.tbl_lehreinheit lvlle USING(lehreinheit_id)
+ WHERE
+ lehrfunktion_kurzbz='LV-Leitung'
+ AND lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id
+ AND studiensemester_kurzbz=tbl_lehreinheit.studiensemester_kurzbz
+ AND mitarbeiter_uid=tbl_benutzer.uid
+ ) THEN true ELSE false END as lvleiter
+ FROM lehre.tbl_lehreinheit, lehre.tbl_lehreinheitmitarbeiter, public.tbl_benutzer, public.tbl_person
+ WHERE
+ tbl_lehreinheit.lehreinheit_id=tbl_lehreinheitmitarbeiter.lehreinheit_id AND
+ tbl_lehreinheitmitarbeiter.mitarbeiter_uid=tbl_benutzer.uid AND
+ tbl_person.person_id=tbl_benutzer.person_id AND
+ lehrveranstaltung_id=? AND
+ tbl_lehreinheitmitarbeiter.mitarbeiter_uid NOT like '_Dummy%' AND
+ tbl_benutzer.aktiv=true AND tbl_person.aktiv=true AND
+ studiensemester_kurzbz=?
+ ) AS a
+ ORDER BY lvleiter DESC, nachname, vorname";
return $this->execQuery($query, array($lehrveranstaltung_id, $studiensemester_kurzbz));
}
@@ -273,7 +289,7 @@ class Lehrveranstaltung_model extends DB_Model
return $this->execQuery($query, $parametersarray);
}
-
+
/**
* Gets Lehrveranstaltung and its Lehreinheiten (multiple rows possible).
* Returns empty array if student has no Lehrveranstaltung.
@@ -290,7 +306,7 @@ class Lehrveranstaltung_model extends DB_Model
AND studiensemester_kurzbz = ?
AND lehrveranstaltung_id = ?;
';
-
+
return $this->execQuery($query, array($uid, $studiensemester_kurzbz, $lehrveranstaltung_id));
}
}
diff --git a/application/models/education/Pruefung_model.php b/application/models/education/Pruefung_model.php
index d10364979..e3776c4ad 100644
--- a/application/models/education/Pruefung_model.php
+++ b/application/models/education/Pruefung_model.php
@@ -11,4 +11,29 @@ class Pruefung_model extends DB_Model
$this->dbTable = 'campus.tbl_pruefung';
$this->pk = 'pruefung_id';
}
+
+ /**
+ * Gets Pruefungen of a person for a Studiensemester.
+ * @param int $person_id
+ * @param string $studiensemester_kurzbz
+ * @return object
+ */
+ public function getByPerson($person_id, $studiensemester_kurzbz)
+ {
+ $qry = '
+ SELECT prfg.*, pers.matr_nr, lv.ects, stg.studiengang_kz, prst.prestudent_id,
+ UPPER(stg.typ||stg.kurzbz) AS studiengang, stg.bezeichnung AS studiengang_bezeichnung
+ FROM public.tbl_person pers
+ JOIN public.tbl_prestudent prst USING (person_id)
+ JOIN public.tbl_student USING (prestudent_id)
+ JOIN lehre.tbl_pruefung prfg USING (student_uid)
+ JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id)
+ JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
+ JOIN public.tbl_studiengang stg ON prst.studiengang_kz = stg.studiengang_kz
+ WHERE pers.person_id = ?
+ AND le.studiensemester_kurzbz = ?
+ ORDER BY prfg.datum, pruefung_id';
+
+ return $this->execQuery($qry, array($person_id, $studiensemester_kurzbz));
+ }
}
diff --git a/application/models/education/Zeugnisnote_model.php b/application/models/education/Zeugnisnote_model.php
index 7ed0e6456..65607e252 100644
--- a/application/models/education/Zeugnisnote_model.php
+++ b/application/models/education/Zeugnisnote_model.php
@@ -12,4 +12,125 @@ class Zeugnisnote_model extends DB_Model
$this->pk = array('studiensemester_kurzbz', 'student_uid', 'lehrveranstaltung_id');
$this->hasSequence = false;
}
+
+ /**
+ * Gets ECTS sums of completed courses (Zeugnisnoten) of a person for a Studiensemester.
+ * If no valid Noten for the course were entered, 0 ects is returned.
+ * @param int $person_id
+ * @param string $studiensemester_kurzbz
+ * @param bool $aktiv
+ * @param bool $lehre
+ * @param bool $offiziell
+ * @param bool $positiv
+ * @return object
+ */
+ public function getEctsSumsByPerson($person_id, $studiensemester_kurzbz, $aktiv = true, $lehre = null, $offiziell = null, $positiv = null)
+ {
+ $params = array();
+
+ $qry = "SELECT DISTINCT ON (prst.prestudent_id) pers.matr_nr, stg.studiengang_kz, prst.prestudent_id, stg.erhalter_kz,
+ UPPER(stg.typ||stg.kurzbz) AS studiengang, stg.bezeichnung AS studiengang_bezeichnung, COALESCE(summen.summe_ects, 0) AS summe_ects
+ FROM public.tbl_person pers
+ JOIN public.tbl_prestudent prst USING (person_id)
+ JOIN public.tbl_prestudentstatus prstst USING (prestudent_id)
+ JOIN public.tbl_studiengang stg ON prst.studiengang_kz = stg.studiengang_kz
+ LEFT JOIN (
+ SELECT zgnisnote.student_uid, prestudent_id, zgnisnote.studiensemester_kurzbz, sum(ects) AS summe_ects
+ FROM public.tbl_student
+ LEFT JOIN lehre.tbl_zeugnisnote zgnisnote USING(student_uid)
+ LEFT JOIN lehre.tbl_note note ON zgnisnote.note = note.note
+ LEFT JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
+ WHERE TRUE";
+
+ if (isset($aktiv))
+ {
+ $qry .= ' AND (note.aktiv = ?)';
+ $params[] = $aktiv;
+ }
+
+ if (isset($lehre))
+ {
+ $qry .= ' AND (note.lehre = ?)';
+ $params[] = $lehre;
+ }
+
+ if (isset($offiziell))
+ {
+ $qry .= ' AND (note.offiziell = ?)';
+ $params[] = $offiziell;
+ }
+
+ if (isset($positiv))
+ {
+ $qry .= ' AND (note.positiv = ?)';
+ $params[] = $positiv;
+ }
+
+ $qry .= " GROUP BY zgnisnote.studiensemester_kurzbz, zgnisnote.student_uid, prestudent_id
+ ) summen ON prst.prestudent_id = summen.prestudent_id AND prstst.studiensemester_kurzbz = summen.studiensemester_kurzbz
+ WHERE pers.person_id = ?
+ AND prstst.studiensemester_kurzbz = ?
+ ORDER BY prst.prestudent_id";
+
+ $params[] = $person_id;
+ $params[] = $studiensemester_kurzbz;
+
+ return $this->execQuery($qry, $params);
+ }
+
+ /**
+ * Gets courses (Zeugnisnoten) of a person for a Studiensemester.
+ * @param int $person_id
+ * @param string $studiensemester_kurzbz
+ * @param bool $aktiv
+ * @param bool $lehre
+ * @param bool $offiziell
+ * @param bool $positiv
+ * @return object
+ */
+ public function getByPerson($person_id, $studiensemester_kurzbz, $aktiv = true, $lehre = null, $offiziell = null, $positiv = null)
+ {
+ $params = array($person_id, $studiensemester_kurzbz);
+
+ $qry = "SELECT zgnisnote.*, pers.matr_nr, lv.ects, stg.studiengang_kz, prst.prestudent_id, stg.erhalter_kz,
+ UPPER(stg.typ||stg.kurzbz) AS studiengang, stg.bezeichnung AS studiengang_bezeichnung, note.note,
+ note.bezeichnung AS note_bezeichnung
+ FROM public.tbl_person pers
+ JOIN public.tbl_prestudent prst USING (person_id)
+ JOIN public.tbl_student USING (prestudent_id)
+ JOIN lehre.tbl_zeugnisnote zgnisnote USING (student_uid)
+ JOIN lehre.tbl_note note ON zgnisnote.note = note.note
+ JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
+ JOIN public.tbl_studiengang stg ON prst.studiengang_kz = stg.studiengang_kz
+ WHERE pers.person_id = ?
+ AND zgnisnote.studiensemester_kurzbz = ?";
+
+ if (isset($aktiv))
+ {
+ $qry .= ' AND note.aktiv = ?';
+ $params[] = $aktiv;
+ }
+
+ if (isset($lehre))
+ {
+ $qry .= ' AND note.lehre = ?';
+ $params[] = $lehre;
+ }
+
+ if (isset($offiziell))
+ {
+ $qry .= ' AND note.offiziell = ?';
+ $params[] = $offiziell;
+ }
+
+ if (isset($positiv))
+ {
+ $qry .= ' AND note.positiv = ?';
+ $params[] = $positiv;
+ }
+
+ $qry .= ' ORDER BY zgnisnote.benotungsdatum';
+
+ return $this->execQuery($qry, $params);
+ }
}
diff --git a/application/models/person/Notiz_model.php b/application/models/person/Notiz_model.php
index fd08cc384..bfd8aa258 100644
--- a/application/models/person/Notiz_model.php
+++ b/application/models/person/Notiz_model.php
@@ -152,6 +152,7 @@ class Notiz_model extends DB_Model
*/
public function getNotizByTitel($person_id, $titel)
{
+ $this->addSelect('public.tbl_notiz.insertamum as insertnotiz, *');
// Join with the table public.tbl_notizzuordnung using notiz_id
$this->addJoin('public.tbl_notizzuordnung', 'notiz_id');
$this->addJoin('public.tbl_prestudent', 'prestudent_id', 'LEFT');
diff --git a/application/models/person/Person_model.php b/application/models/person/Person_model.php
index e005e243c..085c3f826 100644
--- a/application/models/person/Person_model.php
+++ b/application/models/person/Person_model.php
@@ -152,34 +152,36 @@ class Person_model extends DB_Model
*/
public function getPersonStammdaten($person_id, $zustellung_only = false)
{
- $this->addSelect('public.tbl_person.*, s.kurztext as staatsbuergerschaft, g.kurztext as geburtsnation');
+ $this->addSelect('public.tbl_person.*, tbl_person.staatsbuergerschaft AS staatsbuergerschaft_code, tbl_person.geburtsnation AS geburtsnation_code,
+ s.kurztext as staatsbuergerschaft, g.kurztext as geburtsnation');
$this->addJoin('bis.tbl_nation s', 'public.tbl_person.staatsbuergerschaft = s.nation_code', 'LEFT');
$this->addJoin('bis.tbl_nation g', 'public.tbl_person.geburtsnation = g.nation_code', 'LEFT');
$person = $this->load($person_id);
- if($person->error) return $person;
+ if (isError($person)) return $person;
//return null if not found
- if(count($person->retval) < 1)
+ if (!hasData($person))
return success(null);
- $this->KontaktModel->addDistinct();
$this->KontaktModel->addSelect('kontakttyp, anmerkung, kontakt, zustellung');
$this->KontaktModel->addOrder('kontakttyp');
+ $this->KontaktModel->addOrder('insertamum', 'DESC');
$where = $zustellung_only === true ? array('person_id' => $person_id, 'zustellung' => true) : array('person_id' => $person_id);
$kontakte = $this->KontaktModel->loadWhere($where);
- if($kontakte->error) return $kontakte;
+ if (isError($kontakte)) return $kontakte;
$where = $zustellung_only === true ? array('person_id' => $person_id, 'zustelladresse' => true) : array('person_id' => $person_id);
$this->AdresseModel->addSelect('public.tbl_adresse.*, bis.tbl_nation.kurztext AS nationkurztext');
$this->AdresseModel->addJoin('bis.tbl_nation', 'tbl_adresse.nation = tbl_nation.nation_code', 'LEFT');
+ $this->AdresseModel->addOrder('insertamum', 'DESC');
$adressen = $this->AdresseModel->loadWhere($where);
- if($adressen->error) return $adressen;
+ if (isError($adressen)) return $adressen;
- $stammdaten = $person->retval[0];
- $stammdaten->kontakte = $kontakte->retval;
- $stammdaten->adressen = $adressen->retval;
+ $stammdaten = getData($person)[0];
+ $stammdaten->kontakte = hasData($kontakte) ? getData($kontakte) : array();
+ $stammdaten->adressen = hasData($adressen) ? getData($adressen) : array();
return success($stammdaten);
}
diff --git a/application/models/system/Fehler_model.php b/application/models/system/Fehler_model.php
new file mode 100644
index 000000000..28618f6d9
--- /dev/null
+++ b/application/models/system/Fehler_model.php
@@ -0,0 +1,14 @@
+dbTable = 'system.tbl_fehler';
+ $this->pk = 'fehlercode';
+ }
+}
diff --git a/application/models/system/Filters_model.php b/application/models/system/Filters_model.php
index 20394b36d..581be65e1 100644
--- a/application/models/system/Filters_model.php
+++ b/application/models/system/Filters_model.php
@@ -57,19 +57,34 @@ class Filters_model extends DB_Model
/**
* Loads all filters by their app and dataset_name
*/
- public function getFiltersByAppDatasetName($app, $dataset_name)
+ public function getFiltersByAppDatasetNamePersonId($app, $dataset_name, $person_id)
{
- $this->resetQuery(); // reset any previous built query
+ $query = '
+ (
+ -- Global filters
+ SELECT gs.filter_id,
+ gs.person_id,
+ gs.description
+ FROM system.tbl_filters gs
+ WHERE gs.app = ?
+ AND gs.dataset_name = ?
+ AND gs.person_id IS NULL
+ ORDER BY gs.person_id DESC, gs.sort ASC
+ )
+ UNION ALL
+ (
+ -- Personal filters
+ SELECT ps.filter_id,
+ ps.person_id,
+ ps.description
+ FROM system.tbl_filters ps
+ WHERE ps.app = ?
+ AND ps.dataset_name = ?
+ AND ps.person_id = ?
+ ORDER BY ps.person_id DESC, ps.sort ASC
+ )';
- $this->addSelect('filter_id, person_id, description');
- $this->addOrder('person_id', 'DESC'); // sort descending on column person_id
- $this->addOrder('sort', 'ASC'); // sort on column sort
-
- $filterParametersArray = array(
- 'app' => $app,
- 'dataset_name' => $dataset_name
- );
-
- return $this->loadWhere($filterParametersArray);
+ return $this->execQuery($query, array($app, $dataset_name, $app, $dataset_name, $person_id));
}
}
+
diff --git a/application/models/system/Issue_model.php b/application/models/system/Issue_model.php
new file mode 100644
index 000000000..5dac85066
--- /dev/null
+++ b/application/models/system/Issue_model.php
@@ -0,0 +1,51 @@
+dbTable = 'system.tbl_issue';
+ $this->pk = 'issue_id';
+ }
+
+ /**
+ * Gets number of open (non-resolved) issues.
+ * @param string $fehlercode unique error code
+ * @param int $person_id if provided, only issues with this person_id are counted.
+ * @param string $oe_kurzbz if provided, only issues with this oe_kurzbz are counted.
+ * @param string $fehlercode_extern if provided, only issues with this external fehlercode are counted (for identifying issues from external systems).
+ * @return Object success with number of issues or error
+ */
+ public function getOpenIssueCount($fehlercode, $person_id = null, $oe_kurzbz = null, $fehlercode_extern = null)
+ {
+ $params = array($fehlercode);
+ // issue exists for a fehlercode (or fehlercode_extern), person_id, oe_kurzbz, if not verarbeitet yet
+ $qry = 'SELECT count(*) as anzahl_open_issues FROM system.tbl_issue
+ WHERE fehlercode = ?
+ AND verarbeitetamum IS NULL';
+
+ if (!isEmptyString($fehlercode_extern))
+ {
+ $qry .= ' AND fehlercode_extern = ?';
+ $params[] = $fehlercode_extern;
+ }
+
+ if (isset($person_id))
+ {
+ $qry .= ' AND person_id = ?';
+ $params[] = $person_id;
+ }
+
+ if (isset($oe_kurzbz))
+ {
+ $qry .= ' AND oe_kurzbz = ?';
+ $params[] = $oe_kurzbz;
+ }
+
+ return $this->execQuery($qry, $params);
+ }
+}
diff --git a/application/views/codex/oehbeitrag.php b/application/views/codex/oehbeitrag.php
new file mode 100644
index 000000000..7cfb18fe8
--- /dev/null
+++ b/application/views/codex/oehbeitrag.php
@@ -0,0 +1,60 @@
+load->view(
+ 'templates/FHC-Header',
+ array(
+ 'title' => 'ÖH-Beitragsverwaltung',
+ 'jquery' => true,
+ 'jqueryui' => true,
+ 'bootstrap' => true,
+ 'fontawesome' => true,
+ 'sbadmintemplate' => true,
+ 'tablesorter' => true,
+ 'dialoglib' => true,
+ 'ajaxlib' => true,
+ 'navigationwidget' => true,
+ 'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css', 'public/css/codex/oehbeitrag.css'),
+ 'customJSs' => array('public/js/tablesort/tablesort.js', 'public/js/codex/oehbeitrag.js')
+ )
+);
+?>
+
+
+