diff --git a/application/config/constants.php b/application/config/constants.php
index ef4cdaf2c..f21b6c962 100644
--- a/application/config/constants.php
+++ b/application/config/constants.php
@@ -31,6 +31,13 @@ define('EXIT_VALIDATION_UDF_NOT_VALID_VAL', 17); // UDF validation has been fail
define('EXIT_AUTO_MIN', 1000); // lowest automatically-assigned error code
define('EXIT_AUTO_MAX', 2000); // highest automatically-assigned error code
+/*
+|--------------------------------------------------------------------------
+| General purpose
+|--------------------------------------------------------------------------
+*/
+define('BEGINNING_OF_TIME', '1970-01-01');
+
/*
|--------------------------------------------------------------------------
| Authentication constants
diff --git a/application/config/jqm.php b/application/config/jqm.php
new file mode 100644
index 000000000..43cc1c038
--- /dev/null
+++ b/application/config/jqm.php
@@ -0,0 +1,14 @@
+ array(
+ 'admin:rw',
+ 'developer:rw'
+ ),
+ 'OEHPayment' => 'developer:rw',
+ 'SAPPayment' => 'developer:rw'
+);
+
diff --git a/application/config/navigation.php b/application/config/navigation.php
index a89c259ee..84004b58e 100644
--- a/application/config/navigation.php
+++ b/application/config/navigation.php
@@ -109,6 +109,13 @@ $config['navigation_header'] = array(
'expand' => true,
'sort' => 20,
'requiredPermissions' => 'system/developer:r'
+ ),
+ 'jobsqueueviewer' => array(
+ 'link' => site_url('system/jq/JobsQueueViewer'),
+ 'description' => 'Jobs Queue Viewer',
+ 'expand' => true,
+ 'sort' => 20,
+ 'requiredPermissions' => 'system/developer:r'
)
)
)
diff --git a/application/controllers/jobs/LehrauftragJob.php b/application/controllers/jobs/LehrauftragJob.php
index 2f6b928c7..4ba327a2f 100644
--- a/application/controllers/jobs/LehrauftragJob.php
+++ b/application/controllers/jobs/LehrauftragJob.php
@@ -20,31 +20,31 @@ 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
@@ -62,7 +62,7 @@ class LehrauftragJob extends JOB_Controller
foreach ($vertrag_arr as $vertrag)
{
$result = $this->VertragModel->getLehreinheitData($vertrag->vertrag_id, 'lehrveranstaltung_id, studiensemester_kurzbz');
-
+
if (hasData($result))
{
$obj = new StdClass();
@@ -72,7 +72,7 @@ class LehrauftragJob extends JOB_Controller
}
}
}
-
+
/**
* Build the data array to be used in the email. Data array is clustered as follows:
* Array
@@ -90,7 +90,7 @@ class LehrauftragJob extends JOB_Controller
foreach ($lehreinheit_data_arr as $lehreinheit_data)
{
$result = $this->_getLVData($lehreinheit_data->lehrveranstaltung_id);
-
+
if (hasData($result))
{
// Search if studiensemester exists in data_arr
@@ -102,12 +102,12 @@ class LehrauftragJob extends JOB_Controller
$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,
@@ -115,7 +115,7 @@ class LehrauftragJob extends JOB_Controller
'stg_bezeichnung' => $result->retval[0]->lv_stg_bezeichnung,
'amount' => 1
);
-
+
// Push to final data_arr
$data_arr []= $data;
}
@@ -124,7 +124,7 @@ class LehrauftragJob extends JOB_Controller
{
// 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)
{
@@ -132,7 +132,7 @@ class LehrauftragJob extends JOB_Controller
$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,
@@ -147,7 +147,7 @@ class LehrauftragJob extends JOB_Controller
{
// 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)
{
@@ -168,7 +168,7 @@ class LehrauftragJob extends JOB_Controller
}
}
}
-
+
/**
* Cluster data by uid of entitled mail receivers.
* Returning array is clustered as follows:
@@ -186,7 +186,7 @@ class LehrauftragJob extends JOB_Controller
* [amount] // amount of new ordered lehrauftraege of that stg
*/
$data_arr = $this->_clusterData_byReceiver($data_arr);
-
+
// Send email
if(!$this->_sendMail_toApprove($data_arr))
{
@@ -197,7 +197,7 @@ class LehrauftragJob extends JOB_Controller
$this->logError('Error when sending emails in job MailLehrauftragToApprove');
}
}
-
+
/**
* This daily job sends information about all lehr-/projektauftraege approved the day bofore.
* Receivers: lectors
@@ -208,7 +208,7 @@ class LehrauftragJob extends JOB_Controller
$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
@@ -228,10 +228,10 @@ class LehrauftragJob extends JOB_Controller
{
$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)
{
@@ -249,7 +249,7 @@ class LehrauftragJob extends JOB_Controller
{
$data_arr[$uid_index]['studiensemester'] .= ' und '. $studiensemester;
}
-
+
// Increase amount +1
$data_arr[$uid_index]['amount']++;
}
@@ -266,11 +266,11 @@ class LehrauftragJob extends JOB_Controller
$this->logError('Error when sending emails in job MailLehrauftragToAccept');
}
}
-
+
//******************************************************************************************************************
// PRIVATE FUNCTIONS
//******************************************************************************************************************
-
+
/**
* Get data of given lehrveranstaltung.
* @param $lehrveranstaltung_id
@@ -286,7 +286,7 @@ class LehrauftragJob extends JOB_Controller
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');
@@ -294,10 +294,10 @@ class LehrauftragJob extends JOB_Controller
$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
@@ -310,12 +310,12 @@ class LehrauftragJob extends JOB_Controller
// 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,
@@ -326,7 +326,7 @@ class LehrauftragJob extends JOB_Controller
);
}
}
-
+
/**
* Cluster the data array by entitled mail receiver.
* Returning array is clustered as follows:
@@ -409,7 +409,7 @@ class LehrauftragJob extends JOB_Controller
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
@@ -425,11 +425,11 @@ class LehrauftragJob extends JOB_Controller
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 .= '
@@ -446,7 +446,7 @@ class LehrauftragJob extends JOB_Controller
'
;
-
+
// HTML table body
foreach ($studiensemester_container as $oe_container)
{
@@ -456,7 +456,7 @@ class LehrauftragJob extends JOB_Controller
{
$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]
@@ -473,7 +473,7 @@ class LehrauftragJob extends JOB_Controller
}
}
}
-
+
// HTML table body end and link
$html .= '
@@ -484,10 +484,10 @@ class LehrauftragJob extends JOB_Controller
';
}
}
-
+
return $html;
}
-
+
/**
* Send Sancho eMail about ordered Lehrauftraege.
* @param $data_arr
@@ -499,24 +499,24 @@ class LehrauftragJob extends JOB_Controller
{
// 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,
@@ -524,7 +524,7 @@ class LehrauftragJob extends JOB_Controller
'anzahl' => $data['amount'],
'link' => anchor($url, 'Lehraufträge Übersicht')
);
-
+
sendSanchoMail(
'LehrauftragNeueErteilte',
$content_data_arr,
@@ -532,5 +532,6 @@ class LehrauftragJob extends JOB_Controller
'Neu erteilte Lehraufträge zum Annehmen bereit'
);
}
+ return true;
}
}
diff --git a/application/controllers/jobs/OneTimeMessages.php b/application/controllers/jobs/OneTimeMessages.php
index 39e0a946c..58bc1fb7c 100644
--- a/application/controllers/jobs/OneTimeMessages.php
+++ b/application/controllers/jobs/OneTimeMessages.php
@@ -27,11 +27,11 @@ class OneTimeMessages extends JOB_Controller
* - Status set as "Wartender"
* - The given study course type (b = bachelor, m = master)
* - The given semester (ex WS2020)
- * - How long since applicant (months)
+ * - How long since applicant (days)
* - The given template id to be used as message subject and body (vorlage_kurzbz)
* The sender of all the messages is specified by the parameter senderId (sender person_id)
*/
- public function sendMessageToApplicantsStillWaiting($senderId, $studyCourseType, $semester, $months, $messageTemplate)
+ public function sendMessageToApplicantsStillWaiting($senderId, $studyCourseType, $semester, $days, $messageTemplate)
{
$this->logInfo('Send message to applicants still waiting start');
@@ -47,13 +47,13 @@ class OneTimeMessages extends JOB_Controller
$dbModel = new DB_Model();
$dbPrestudents = $dbModel->execReadOnlyQuery(
- 'SELECT p.prestudent_id
+ 'SELECT distinct on(person_id) p.prestudent_id
FROM public.tbl_prestudent p
JOIN public.tbl_prestudentstatus ps USING (prestudent_id)
JOIN public.tbl_studiengang s USING (studiengang_kz)
WHERE ps.status_kurzbz = \'Wartender\'
AND ps.studiensemester_kurzbz = ?
- AND ps.datum <= NOW() - \''.$months.' months\'::interval
+ AND ps.datum <= NOW() - \''.$days.' days\'::interval
AND s.typ = ?
AND NOT EXISTS (
SELECT pp.person_id
diff --git a/application/controllers/lehre/Pruefungsprotokoll.php b/application/controllers/lehre/Pruefungsprotokoll.php
new file mode 100644
index 000000000..467a7dc71
--- /dev/null
+++ b/application/controllers/lehre/Pruefungsprotokoll.php
@@ -0,0 +1,232 @@
+ 'lehre/pruefungsbeurteilung:r',
+ 'Protokoll' => 'lehre/pruefungsbeurteilung:r',
+ 'saveProtokoll' => 'lehre/pruefungsbeurteilung:rw',
+ )
+ );
+
+ // Load models
+ $this->load->model('education/Abschlusspruefung_model', 'AbschlusspruefungModel');
+ $this->load->model('education/Abschlussbeurteilung_model', 'AbschlussbeurteilungModel');
+
+ $this->load->library('PermissionLib');
+ $this->load->library('AuthLib');
+
+ // Load language phrases
+ $this->loadPhrases(
+ array(
+ 'ui',
+ 'global',
+ 'person',
+ 'abschlusspruefung',
+ 'password',
+ 'lehre'
+ )
+ );
+
+ $this->_setAuthUID(); // sets property uid
+
+ $this->setControllerId(); // sets the controller id
+ }
+
+ // -----------------------------------------------------------------------------------------------------------------
+ // Public methods
+ public function index()
+ {
+ $this->load->library('WidgetLib');
+
+ // Protokolle anzeigen seit heute / letzte Woche / alle
+ $period = $this->input->post('period');
+ $period = (!is_null($period)) ? $period : 'today';
+
+ $data = array('period' => $period);
+
+ $this->load->view('lehre/pruefungsprotokollUebersicht.php', $data);
+ }
+
+ /**
+ * Show Pruefungsprotokoll.
+ */
+ public function Protokoll()
+ {
+ $abschlusspruefung_id = $this->input->get('abschlusspruefung_id');
+
+ if (!is_numeric($abschlusspruefung_id))
+ show_error('invalid abschlusspruefung');
+
+ $abschlusspruefung_saved = false;
+ $abschlusspruefung = $this->_getAbschlusspruefungBerechtigt($abschlusspruefung_id);
+
+ if (isError($abschlusspruefung))
+ show_error(getError($abschlusspruefung));
+ else
+ {
+ $abschlusspruefung = getData($abschlusspruefung);
+ $abschlusspruefung_saved = isset($abschlusspruefung->protokoll) && isset($abschlusspruefung->abschlussbeurteilung_kurzbz);
+ }
+
+ $this->AbschlussbeurteilungModel->addOrder("sort", "ASC");
+ $this->AbschlussbeurteilungModel->addOrder("(CASE WHEN abschlussbeurteilung_kurzbz = 'ausgezeichnet' THEN 1
+ WHEN abschlussbeurteilung_kurzbz = 'gut' THEN 2
+ WHEN abschlussbeurteilung_kurzbz = 'bestanden' THEN 3
+ WHEN abschlussbeurteilung_kurzbz = 'angerechnet' THEN 4
+ ELSE 5
+ END
+ )");
+ $abschlussbeurteilung = $this->AbschlussbeurteilungModel->load();
+
+ if (isError($abschlussbeurteilung))
+ show_error(getError($abschlussbeurteilung));
+ else
+ $abschlussbeurteilung = getData($abschlussbeurteilung);
+
+ $language = getUserLanguage();
+
+ $data = array(
+ 'abschlusspruefung' => $abschlusspruefung,
+ 'abschlussbeurteilung' => $abschlussbeurteilung,
+ 'abschlusspruefung_saved' => $abschlusspruefung_saved,
+ 'language' => $language
+ );
+
+ $this->load->view('lehre/pruefungsprotokoll.php', $data);
+ }
+
+ /**
+ * Save Pruefungsprotokoll (including possible Freigabe)
+ */
+ public function saveProtokoll()
+ {
+ $abschlusspruefung_id = $this->input->post('abschlusspruefung_id');
+ $freigebendata = $this->input->post('freigebendata');
+ $protocoldata = $this->input->post('protocoldata');
+
+ if (isset($abschlusspruefung_id) && is_numeric($abschlusspruefung_id)
+ && isset($freigebendata['freigeben']) && isset($protocoldata))
+ {
+ // check permission
+ $berechtigt = $this->_getAbschlusspruefungBerechtigt($abschlusspruefung_id);
+ if (isError($berechtigt))
+ $this->outputJsonError(getError($berechtigt));
+ else
+ {
+ $freigabe = $freigebendata['freigeben'] === 'true';
+
+ if ($freigabe)
+ {
+ // Verify password
+ if (isset($freigebendata['password']) && !isEmptyString($freigebendata['password']))
+ {
+ $password = $freigebendata['password'];
+ $result = $this->authlib->checkUserAuthByUsernamePassword($this->_uid, $password);
+ if (isError($result))
+ {
+ return $this->outputJsonError($this->p->t('password', 'wrongPassword')); // exit if password is incorrect
+ }
+ }
+ else
+ {
+ return $this->outputJsonError($this->p->t('password', 'passwordMissing'));
+ }
+ }
+
+ $data = $this->_prepareAbschlusspruefungDataForSave($protocoldata, $freigabe);
+
+ $result = $this->AbschlusspruefungModel->update($abschlusspruefung_id, $data);
+
+ if (hasData($result))
+ {
+ $abschlusspruefung_id = getData($result);
+ $updateresult = array('abschlusspruefung_id' => $abschlusspruefung_id);
+ if ($freigabe)
+ $updateresult['freigabedatum'] = date_format(date_create($data['freigabedatum']), 'd.m.Y');
+
+ $this->outputJsonSuccess($updateresult);
+ }
+ else
+ $this->outputJsonError('Fehler beim Speichern des Prüfungsprotokolls');
+ }
+ }
+ else
+ $this->outputJsonError($this->p->t('ui', 'ungueltigeParameter'));
+ }
+
+ // -----------------------------------------------------------------------------------------------------------------
+ // Private methods
+
+ /**
+ * Retrieve the UID of the logged user and checks if it is valid
+ */
+ private function _setAuthUID()
+ {
+ $this->_uid = getAuthUID();
+
+ if (!$this->_uid) show_error('User authentification failed');
+ }
+
+ /**
+ * Retrieves an Abschlussprüfung, with permission check
+ * permission: admin, assistance of study programe or Vorsitz of the Prüfung
+ * @param $abschlusspruefung_id
+ * @return object success or error
+ */
+ private function _getAbschlusspruefungBerechtigt($abschlusspruefung_id)
+ {
+ $result = error('Error when getting Abschlusspruefung');
+
+ if (isset($this->_uid))
+ {
+ $abschlusspruefung = $this->AbschlusspruefungModel->getAbschlusspruefung($abschlusspruefung_id);
+
+ if (hasData($abschlusspruefung))
+ {
+ $abschlusspruefung_data = getData($abschlusspruefung);
+ if ($this->permissionlib->isBerechtigt('admin') ||
+ (isset($abschlusspruefung_data->studiengang_kz) && $this->permissionlib->isBerechtigt('assistenz', 'suid', $abschlusspruefung_data->studiengang_kz))
+ || $this->_uid === $abschlusspruefung_data->uid_vorsitz)
+ $result = $abschlusspruefung;
+ else
+ $result = error('Permission denied');
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * Prepares Abschlussprüfung for save in database, replaces '' with null, sets Freigabedatum
+ * @param $data
+ * @return array
+ */
+ private function _prepareAbschlusspruefungDataForSave($data, $freigabe)
+ {
+ $nullfields = array('uhrzeit', 'endezeit', 'abschlussbeurteilung_kurzbz', 'protokoll');
+ foreach ($data as $idx => $item)
+ {
+ if (in_array($idx, $nullfields) & $item === '')
+ $data[$idx] = null;
+ }
+
+ if ($freigabe === true)
+ $data['freigabedatum'] = date('Y-m-d');
+
+ return $data;
+ }
+}
diff --git a/application/controllers/lehre/lehrauftrag/Lehrauftrag.php b/application/controllers/lehre/lehrauftrag/Lehrauftrag.php
index b7140c7c3..8a096338e 100644
--- a/application/controllers/lehre/lehrauftrag/Lehrauftrag.php
+++ b/application/controllers/lehre/lehrauftrag/Lehrauftrag.php
@@ -92,7 +92,8 @@ class Lehrauftrag extends Auth_Controller
// Retrieve studiengaenge the user is entitled for to populate studiengang dropdown
if (!$studiengang_kz_arr = $this->permissionlib->getSTG_isEntitledFor(self::BERECHTIGUNG_LEHRAUFTRAG_BESTELLEN)) {
- show_error('Fehler bei Berechtigungsprüfung');
+ show_error('Keine Studiengänge gefunden.
+ Es muss eine passende Organisationseinheit hinterlegt werden. ');
}
// If studiengang_kz get param was set, check against entitled stg
diff --git a/application/controllers/system/LogsViewer.php b/application/controllers/system/LogsViewer.php
index 8caf9f3a7..4e39db5e3 100644
--- a/application/controllers/system/LogsViewer.php
+++ b/application/controllers/system/LogsViewer.php
@@ -35,7 +35,7 @@ class LogsViewer extends Auth_Controller
// Public methods
/**
- * Main page of the InfoCenter tool
+ * Everything has a beginning
*/
public function index()
{
diff --git a/application/controllers/system/jq/JobsQueueManager.php b/application/controllers/system/jq/JobsQueueManager.php
new file mode 100644
index 000000000..e72607675
--- /dev/null
+++ b/application/controllers/system/jq/JobsQueueManager.php
@@ -0,0 +1,130 @@
+ 'admin:r',
+ 'addNewJobsToQueue' => 'admin:rw',
+ 'updateJobsQueue' => 'admin:rw'
+ )
+ );
+
+ // Loading config file jqm
+ $this->config->load('jqm');
+
+ // Loads JobsQueueLib
+ $this->load->library('JobsQueueLib');
+ // Loads permission lib
+ $this->load->library('PermissionLib');
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * To get all the most recently added jobs using the given job type
+ */
+ public function getLastJobs()
+ {
+ $type = $this->input->get(JobsQueueLib::PROPERTY_TYPE);
+
+ $this->_checkPermissions($type);
+
+ $this->outputJson($this->jobsqueuelib->getLastJobs($type));
+ }
+
+ /**
+ * Add new jobs in the jobs queue with the given type
+ * jobs is an array of job objects
+ */
+ public function addNewJobsToQueue()
+ {
+ $type = $this->input->post(JobsQueueLib::PROPERTY_TYPE);
+ $jobs = $this->input->post(self::PARAM_JOBS);
+
+ $this->_checkPermissions($type);
+
+ // Otherwise convert jobs from json to php and call JobsQueueLib library
+ $this->outputJson($this->jobsqueuelib->addNewJobsToQueue($type, $this->_convertJobs($jobs)));
+ }
+
+ /**
+ * Add new jobs in the jobs queue with the given type
+ * jobs is an array of job objects
+ */
+ public function updateJobsQueue()
+ {
+ $type = $this->input->post(JobsQueueLib::PROPERTY_TYPE);
+ $jobs = $this->input->post(self::PARAM_JOBS);
+
+ $this->_checkPermissions($type);
+
+ // Otherwise convert jobs from json to php and call JobsQueueLib library
+ $this->outputJson($this->jobsqueuelib->updateJobsQueue($type, $this->_convertJobs($jobs)));
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Private methods
+
+ /**
+ *
+ */
+ private function _checkPermissions($type)
+ {
+ // Checks if the caller has the permissions to add new jobs with the given type in the queue
+ if (!$this->permissionlib->isEntitled($this->config->item(self::JOB_TYPE_PERMISSIONS_WHITE_LIST), $type))
+ {
+ // Permissions NOT valid
+ $this->terminateWithJsonError('You are not allowed to access to this content');
+ }
+ }
+
+ /**
+ *
+ */
+ private function _convertJobs($jobs)
+ {
+ if (isEmptyArray($jobs)) return null; // if not a valid array then return null
+
+ $convertedJobsArray = array(); // returned values
+
+ // Loops through all the provided jobs
+ foreach ($jobs as $job)
+ {
+ $tmpObj = json_decode($job); // Try to decode json to php
+
+ // If decode was a success
+ if ($tmpObj != null)
+ {
+ $convertedJobsArray[] = $tmpObj; // then store the decoded object in the result array
+ }
+ else // otherwise
+ {
+ // Create a new object and store the error message in it
+ $tmpObj = new stdClass();
+ $tmpObj->{JobsQueueLib::PROPERTY_ERROR} = 'A not valid json was provided';
+
+ $convertedJobsArray[] = $tmpObj; // store this object into the result array
+ }
+ }
+
+ return $convertedJobsArray;
+ }
+}
diff --git a/application/controllers/system/jq/JobsQueueViewer.php b/application/controllers/system/jq/JobsQueueViewer.php
new file mode 100644
index 000000000..2698d79d1
--- /dev/null
+++ b/application/controllers/system/jq/JobsQueueViewer.php
@@ -0,0 +1,51 @@
+ 'system/developer:r'
+ )
+ );
+
+ // Loads WidgetLib
+ $this->load->library('WidgetLib');
+
+ // Loads JobsQueueLib
+ $this->load->library('JobsQueueLib');
+
+ // Loads phrases system
+ $this->loadPhrases(
+ array(
+ 'global',
+ 'ui',
+ 'filter'
+ )
+ );
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * Everything has a beginning
+ */
+ public function index()
+ {
+ $this->load->view('system/jq/jobsQueueViewer.php');
+ }
+}
diff --git a/application/core/CLI_Controller.php b/application/core/CLI_Controller.php
index 79e2a1283..7e1e2a1ab 100644
--- a/application/core/CLI_Controller.php
+++ b/application/core/CLI_Controller.php
@@ -3,7 +3,8 @@
if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
- *
+ * This is the super class for all those controllers that can only be called from command line
+ * It provides also an helper to display the possible calls
*/
abstract class CLI_Controller extends FHC_Controller
{
@@ -15,9 +16,9 @@ abstract class CLI_Controller extends FHC_Controller
/**
* Constructor
*/
- public function __construct()
+ public function __construct()
{
- parent::__construct();
+ parent::__construct();
// Checks if the controller is called from command line
$this->_isAllowed();
@@ -103,3 +104,4 @@ abstract class CLI_Controller extends FHC_Controller
}
}
}
+
diff --git a/application/core/JOB_Controller.php b/application/core/JOB_Controller.php
index ea779b169..8b32ba0f5 100644
--- a/application/core/JOB_Controller.php
+++ b/application/core/JOB_Controller.php
@@ -3,26 +3,36 @@
if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
- *
+ * This is the super class for a job.
+ * All the controllers that extends this class can only be called from command line.
+ * Provides utility methods to log into database
*/
abstract class JOB_Controller extends CLI_Controller
{
/**
* Constructor
*/
- public function __construct()
+ public function __construct()
{
- parent::__construct();
+ parent::__construct();
// Loads LogLib with different debug trace levels to get data of the job that extends this class
// It also specify parameters to set database fields
- $this->load->library('LogLib', array(
- 'classIndex' => 5,
- 'functionIndex' => 5,
- 'lineIndex' => 4,
- 'dbLogType' => 'job', // required
- 'dbExecuteUser' => 'Cronjob system'
- ));
+ $this->load->library(
+ 'LogLib',
+ array(
+ 'classIndex' => 5,
+ 'functionIndex' => 5,
+ 'lineIndex' => 4,
+ 'dbLogType' => 'job', // required
+ 'dbExecuteUser' => 'Cronjob system',
+ 'requestId' => 'JOB',
+ 'requestDataFormatter' => function($data) {
+ return json_encode($data);
+ }
+ ),
+ 'LogLibJob' // library alias case sensitive
+ );
}
//------------------------------------------------------------------------------------------------------------------
@@ -33,7 +43,7 @@ abstract class JOB_Controller extends CLI_Controller
*/
protected function logInfo($response, $parameters = null)
{
- $this->_log(LogLib::INFO, 'Cronjob info', $response, $parameters);
+ $this->_log(LogLib::INFO, $response, $parameters);
}
/**
@@ -41,7 +51,7 @@ abstract class JOB_Controller extends CLI_Controller
*/
protected function logDebug($response, $parameters = null)
{
- $this->_log(LogLib::DEBUG, 'Cronjob debug', $response, $parameters);
+ $this->_log(LogLib::DEBUG, $response, $parameters);
}
/**
@@ -49,7 +59,7 @@ abstract class JOB_Controller extends CLI_Controller
*/
protected function logWarning($response, $parameters = null)
{
- $this->_log(LogLib::WARNING, 'Cronjob warning', $response, $parameters);
+ $this->_log(LogLib::WARNING, $response, $parameters);
}
/**
@@ -57,7 +67,7 @@ abstract class JOB_Controller extends CLI_Controller
*/
protected function logError($response, $parameters = null)
{
- $this->_log(LogLib::ERROR, 'Cronjob error', $response, $parameters);
+ $this->_log(LogLib::ERROR, $response, $parameters);
}
//------------------------------------------------------------------------------------------------------------------
@@ -66,7 +76,7 @@ abstract class JOB_Controller extends CLI_Controller
/**
* Writes a log to database
*/
- private function _log($level, $requestId, $response, $parameters)
+ private function _log($level, $response, $parameters)
{
$data = new stdClass();
@@ -76,17 +86,18 @@ abstract class JOB_Controller extends CLI_Controller
switch($level)
{
case LogLib::INFO:
- $this->loglib->logInfoDB($requestId, json_encode(success($data, LogLib::INFO)));
+ $this->LogLibJob->logInfoDB($data);
break;
case LogLib::DEBUG:
- $this->loglib->logDebugDB($requestId, json_encode(success($data, LogLib::DEBUG)));
+ $this->LogLibJob->logDebugDB($data);
break;
case LogLib::WARNING:
- $this->loglib->logWarningDB($requestId, json_encode(error($data, LogLib::WARNING)));
+ $this->LogLibJob->logWarningDB($data);
break;
case LogLib::ERROR:
- $this->loglib->logErrorDB($requestId, json_encode(error($data, LogLib::ERROR)));
+ $this->LogLibJob->logErrorDB($data);
break;
}
}
}
+
diff --git a/application/core/JQW_Controller.php b/application/core/JQW_Controller.php
new file mode 100644
index 000000000..72a2a972b
--- /dev/null
+++ b/application/core/JQW_Controller.php
@@ -0,0 +1,129 @@
+LogLibJob->setConfigs(
+ array(
+ 'dbExecuteUser' => 'Jobs queue system',
+ 'requestId' => 'JQW'
+ )
+ );
+
+ // Loads JobsQueueLib library
+ $this->load->library('JobsQueueLib');
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Protected methods
+
+ /**
+ * To get all the most recently added jobs using the given job type
+ */
+ protected function getLastJobs($type)
+ {
+ $jobs = $this->jobsqueuelib->getLastJobs($type);
+
+ // If an error occurred then log it in database
+ if (isError($jobs)) $this->logError(getError($jobs), $type);
+
+ return $jobs;
+ }
+
+ /**
+ * To get all the jobs specified by the given parameters
+ */
+ protected function getJobsByTypeStatusInput($type, $status, $input)
+ {
+ $jobs = $this->jobsqueuelib->getJobsByTypeStatusInput($type, $status, $input);
+
+ // If an error occurred then log it in database
+ if (isError($jobs)) $this->logError(getError($jobs), array($type, $status, $input));
+
+ return $jobs;
+ }
+
+ /**
+ * Add new jobs in the jobs queue with the given type
+ * jobs is an array of job objects
+ */
+ protected function addNewJobsToQueue($type, $jobs)
+ {
+ $result = $this->jobsqueuelib->addNewJobsToQueue($type, $jobs);
+
+ // If an error occurred then log it in database
+ if (isError($result)) $this->logError(getError($result), $type);
+
+ return $result;
+ }
+
+ /**
+ * Updates jobs already present in the jobs queue
+ * jobs is an array of job objects
+ */
+ protected function updateJobsQueue($type, $jobs)
+ {
+ $result = $this->jobsqueuelib->updateJobsQueue($type, $jobs);
+
+ // If an error occurred then log it in database
+ if (isError($result)) $this->logError(getError($result), $type);
+
+ return $result;
+ }
+
+ /**
+ * Utility method to update the specified properties of the given jobs with the given values
+ */
+ protected function updateJobs($jobs, $properties, $values)
+ {
+ // If not valid arrays of properties and values arrays are not of the same size then exit
+ if (isEmptyArray($jobs) || isEmptyArray($properties) || isEmptyArray($values)) return;
+ if (count($properties) != count($values)) return;
+
+ // For each job
+ foreach ($jobs as $job)
+ {
+ // For each propery of the job
+ for ($pI = 0; $pI < count($properties); $pI++)
+ {
+ // If this property is present in the job object
+ if (property_exists($job, $properties[$pI]))
+ {
+ $job->{$properties[$pI]} = $values[$pI]; // set a new value
+ }
+ }
+ }
+ }
+
+ /**
+ * Utility method to generate a job with the given parameters and return it inside an array
+ * ready to be used by addNewJobsToQueue and updateJobsQueue
+ */
+ protected function generateJobs($status, $input)
+ {
+ $job = new stdClass();
+
+ $job->{JobsQueueLib::PROPERTY_STATUS} = $status;
+ $job->{JobsQueueLib::PROPERTY_INPUT} = $input;
+
+ return array($job);
+ }
+}
+
diff --git a/application/helpers/hlp_common_helper.php b/application/helpers/hlp_common_helper.php
index 6a2675a04..a7eda8827 100644
--- a/application/helpers/hlp_common_helper.php
+++ b/application/helpers/hlp_common_helper.php
@@ -301,3 +301,45 @@ function isLogged()
return isset($ci->authlib) && $ci->authlib->getAuthObj() != null;
}
+
+/**
+ * Konvertiert Problematische Sonderzeichen in Strings fuer
+ * Accountnamen und EMail-Aliase
+ *
+ * @param $str
+ * @return bereinigter String
+ */
+function sanitizeProblemChars($str)
+{
+ $enc = 'UTF-8';
+
+ $acentos = array(
+ 'A' => '/À|Á|Â|Ã|Å/',
+ 'Ae' => '/Ä/',
+ 'a' => '/à|á|â|ã|å/',
+ 'ae'=> '/ä/',
+ 'C' => '/Ç/',
+ 'c' => '/ç/',
+ 'E' => '/È|É|Ê|Ë/',
+ 'e' => '/è|é|ê|ë/',
+ 'I' => '/Ì|Í|Î|Ï/',
+ 'i' => '/ì|í|î|ï/',
+ 'N' => '/Ñ/',
+ 'n' => '/ñ/',
+ 'O' => '/Ò|Ó|Ô|Õ/',
+ 'Oe' => '/Ö/',
+ 'o' => '/ò|ó|ô|õ/',
+ 'oe' => '/ö/',
+ 'U' => '/Ù|Ú|Û/',
+ 'Ue' => '/Ü/',
+ 'u' => '/ù|ú|û/',
+ 'ue' => '/ü/',
+ 'Y' => '/Ý/',
+ 'y' => '/ý|ÿ/',
+ 'a.' => '/ª/',
+ 'o.' => '/º/',
+ 'ss' => '/ß/'
+ );
+
+ return preg_replace($acentos, array_keys($acentos), htmlentities($str,ENT_NOQUOTES, $enc));
+}
diff --git a/application/libraries/FilterWidgetLib.php b/application/libraries/FilterWidgetLib.php
index 6e87833bd..0a4526680 100644
--- a/application/libraries/FilterWidgetLib.php
+++ b/application/libraries/FilterWidgetLib.php
@@ -93,6 +93,8 @@ class FilterWidgetLib
const OP_NOT_SET = 'nset';
// Filter options values
+ const OPT_MINUTES = 'minutes';
+ const OPT_HOURS = 'hours';
const OPT_DAYS = 'days';
const OPT_MONTHS = 'months';
@@ -884,8 +886,10 @@ class FilterWidgetLib
// It it's a date type
if (is_numeric($filterDefinition->condition)
&& isset($filterDefinition->option)
- && ($filterDefinition->option == self::OPT_DAYS
- || $filterDefinition->option == self::OPT_MONTHS))
+ && ($filterDefinition->option == self::OPT_HOURS
+ || $filterDefinition->option == self::OPT_DAYS
+ || $filterDefinition->option == self::OPT_MONTHS
+ || $filterDefinition->option == self::OPT_MINUTES))
{
$condition = '< (NOW() - \''.$filterDefinition->condition.' '.$filterDefinition->option.'\'::interval)';
}
@@ -899,8 +903,10 @@ class FilterWidgetLib
// It it's a date type
if (is_numeric($filterDefinition->condition)
&& isset($filterDefinition->option)
- && ($filterDefinition->option == self::OPT_DAYS
- || $filterDefinition->option == self::OPT_MONTHS))
+ && ($filterDefinition->option == self::OPT_HOURS
+ || $filterDefinition->option == self::OPT_DAYS
+ || $filterDefinition->option == self::OPT_MONTHS
+ || $filterDefinition->option == self::OPT_MINUTES))
{
$condition = '> (NOW() - \''.$filterDefinition->condition.' '.$filterDefinition->option.'\'::interval)';
}
diff --git a/application/libraries/JobsQueueLib.php b/application/libraries/JobsQueueLib.php
new file mode 100644
index 000000000..0eb7c9b72
--- /dev/null
+++ b/application/libraries/JobsQueueLib.php
@@ -0,0 +1,370 @@
+_ci =& get_instance();
+
+ // Loads all needed models
+ $this->_ci->load->model('system/JobsQueue_model', 'JobsQueueModel');
+ $this->_ci->load->model('system/JobTypes_model', 'JobTypesModel');
+ $this->_ci->load->model('system/JobStatuses_model', 'JobStatusesModel');
+ $this->_ci->load->model('system/JobTriggers_model', 'JobTriggersModel');
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * To get all the most recently added jobs using the given job type
+ */
+ public function getLastJobs($type)
+ {
+ $this->_ci->JobsQueueModel->resetQuery();
+
+ $this->_ci->JobsQueueModel->addOrder('creationtime', 'DESC');
+
+ return $this->_ci->JobsQueueModel->loadWhere(array('status' => self::STATUS_NEW, 'type' => $type));
+ }
+
+ /**
+ * To get all the jobs specified by the given parameters
+ */
+ public function getJobsByTypeStatusInput($type, $status, $input)
+ {
+ $this->_ci->JobsQueueModel->resetQuery();
+
+ $this->_ci->JobsQueueModel->addOrder('creationtime', 'DESC');
+
+ return $this->_ci->JobsQueueModel->loadWhere(array('status' => $status, 'type' => $type, 'input' => $input));
+ }
+
+ /**
+ * Add new jobs in the jobs queue with the given type
+ * jobs is an array of job objects
+ */
+ public function addNewJobsToQueue($type, $jobs)
+ {
+ // Checks parameters
+ if (isEmptyString($type)) return error('The provided type parameter is not a valid string');
+ if (isEmptyArray($jobs)) return error('The provided jobs parameter is not a valid array');
+
+ // Get all the job types
+ $dbResult = $this->_ci->JobTypesModel->load();
+ if (isError($dbResult)) return $dbResult;
+ $types = getData($dbResult);
+
+ // If the given type is not present in database
+ if (!$this->_checkJobType($type, $types)) return error('The provided type parameter is not valid');
+
+ $results = $jobs; // returned values
+ $errorOccurred = false; // very optimistic
+
+ // Get all the job statuses
+ $dbResult = $this->_ci->JobStatusesModel->load();
+ if (isError($dbResult)) return $dbResult;
+ $statuses = getData($dbResult);
+
+ // Loops through all the provided jobs
+ foreach ($results as $job)
+ {
+ // If the structure of the job object is valid AND the type is valid AND the status is valid
+ if ($this->_checkNewJobStructure($job) && $this->_checkJobStatus($job, $statuses))
+ {
+ $this->_dropNotAllowedPropertiesNewJob($job); // remove the black listed properties from this object
+
+ $job->{self::PROPERTY_TYPE} = $type; // What you asked is what you get!
+
+ // Try to insert the single job into database
+ $dbNewJobResult = $this->_ci->JobsQueueModel->insert($job);
+
+ // If an error occurred during while inserting in database
+ if (isError($dbNewJobResult))
+ {
+ $job->{self::PROPERTY_ERROR} = getError($dbNewJobResult); // retrieve the cause and store it in job object
+ $errorOccurred = true; // set error occurred flag
+ }
+ else // otherwise
+ {
+ $job->{self::PROPERTY_JOBID} = getData($dbNewJobResult); // get the jobid and store it in job object
+
+ $dbNewTriggeredJobResult = $this->_addNewTriggeredJobToQueue($type, $job, array(self::STATUS_NEW));
+ // If an error occurred during while inserting in database
+ if (isError($dbNewTriggeredJobResult)) return $dbNewTriggeredJobResult;
+ }
+ }
+ else // otherwise
+ {
+ $errorOccurred = true; // set error occurred flag
+ }
+ }
+
+ // If an error occurred then returns the results in an error object
+ if ($errorOccurred) return error($results);
+
+ return success($results); // otherwise return results in a success object
+ }
+
+ /**
+ * Updates jobs already present in the jobs queue
+ * jobs is an array of job objects
+ */
+ public function updateJobsQueue($type, $jobs)
+ {
+ // Checks parameters
+ if (isEmptyArray($jobs)) return error('The provided jobs parameter is not a valid array');
+
+ $results = $jobs; // returned values
+ $errorOccurred = false; // very optimistic
+
+ // Get all the job statuses
+ $dbResultStatuses = $this->_ci->JobStatusesModel->load();
+ if (isError($dbResultStatuses)) return $dbResultStatuses;
+ $statuses = getData($dbResultStatuses);
+
+ // Loops through all the provided jobs
+ foreach ($results as $job)
+ {
+ // Check if the required job is present in the database
+ $dbResultJobs = $this->_ci->JobsQueueModel->load($job->{self::PROPERTY_JOBID});
+ if (isError($dbResultJobs))
+ {
+ $job->{self::PROPERTY_ERROR} = getError($dbResultJobs); // retrieve the cause and store it in job object
+ $errorOccurred = true; // set error occurred flag
+ }
+ elseif (!hasData($dbResultJobs)) // if no jobs were found
+ {
+ $job->{self::PROPERTY_ERROR} = 'The required job is not present';
+ $errorOccurred = true; // set error occurred flag
+ }
+ else // if a job was found then it could be updated
+ {
+ // If the structure of the job object is valid
+ if ($this->_checkUpdateJobStructure($job) && $this->_checkJobStatus($job, $statuses))
+ {
+ $this->_dropNotAllowedPropertiesUpdateJob($job); // remove the black listed properties from this object
+
+ $job->{self::PROPERTY_TYPE} = $type; // What you asked is what you get!
+
+ // Try to update the single job into database
+ $dbResult = $this->_ci->JobsQueueModel->update($job->{self::PROPERTY_JOBID}, (array)$job);
+
+ // If an error occurred during while updating in database
+ if (isError($dbResult))
+ {
+ $job->{self::PROPERTY_ERROR} = getError($dbResult); // retrieve the cause and store it in job object
+ $errorOccurred = true; // set error occurred flag
+ }
+ else // otherwise
+ {
+ $dbNewTriggeredJobResult = $this->_addNewTriggeredJobToQueue(
+ $type,
+ $job,
+ array($job->status)
+ );
+ // If an error occurred during while inserting in database
+ if (isError($dbNewTriggeredJobResult)) return $dbNewTriggeredJobResult;
+ }
+ }
+ else // otherwise
+ {
+ $errorOccurred = true; // set error occurred flag
+ }
+ }
+ }
+
+ // If an error occurred then returns the results in an error object
+ if ($errorOccurred) return error($results);
+
+ return success($results); // otherwise return results in a success object
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Private methods
+
+ /**
+ * Checks the job object structure when needed for insert
+ */
+ private function _checkNewJobStructure(&$job)
+ {
+ // If job is a valid object and contains the required properties AND does NOT already contain the property error
+ if (is_object($job)
+ && property_exists($job, self::PROPERTY_STATUS)
+ && !property_exists($job, self::PROPERTY_ERROR))
+ {
+ return true; // it is valid!
+ }
+
+ // If not object then object it!
+ if (!is_object($job)) $job = new stdClass();
+
+ // If an error property was not already previously stored then store an error message in job object
+ if (!property_exists($job, self::PROPERTY_ERROR))
+ {
+ $job->{self::PROPERTY_ERROR} = 'The structure of the provided job is not valid';
+ }
+
+ return false; // better sorry than wrong
+ }
+
+ /**
+ * Checks the job object structure when needed for update
+ */
+ private function _checkUpdateJobStructure(&$job)
+ {
+ // If job is a valid object
+ if (is_object($job) && property_exists($job, self::PROPERTY_JOBID)) return true; // it is valid!
+
+ // If not object then object it!
+ if (!is_object($job)) $job = new stdClass();
+
+ // If an error property was not already previously stored then store an error message in job object
+ if (!property_exists($job, self::PROPERTY_ERROR))
+ {
+ $job->{self::PROPERTY_ERROR} = 'The structure of the provided job is not valid';
+ }
+
+ return false; // better sorry than wrong
+ }
+
+ /**
+ * Checks if the given job contains a valid type
+ */
+ private function _checkJobType($type, $types)
+ {
+ return $this->_inArray($type, $types, self::PROPERTY_TYPE);
+ }
+
+ /**
+ * Checks if the given job contains a valid status
+ */
+ private function _checkJobStatus(&$job, $statuses)
+ {
+ // If the given job doesn't have the property status then it is not valid
+ if (!isset($job->{self::PROPERTY_STATUS}))
+ {
+ $found = false;
+ }
+ else // otherwise test if it valid
+ {
+ $found = $this->_inArray($job->{self::PROPERTY_STATUS}, $statuses, self::PROPERTY_STATUS);
+ }
+
+ // No status was found and does NOT already contain the property error
+ if (!$found && !property_exists($job, self::PROPERTY_ERROR))
+ {
+ $job->{self::PROPERTY_ERROR} = 'The provided status of this job is not valid'; // store the error message in the object
+ }
+
+ return $found;
+ }
+
+ /**
+ * Search in an array the given value
+ * The elements of the given array are objects
+ * The given value is compared with the property specified by the $propertyName parameter of each object of the given array
+ */
+ private function _inArray($value, $array, $propertyName)
+ {
+ $found = false;
+
+ foreach ($array as $element)
+ {
+ if ($value == $element->{$propertyName})
+ {
+ $found = true;
+ break;
+ }
+ }
+
+ return $found;
+ }
+
+ /**
+ * Drop not allowed properties from the given job
+ */
+ private function _dropNotAllowedPropertiesNewJob(&$job)
+ {
+ unset($job->{self::PROPERTY_JOBID});
+ unset($job->{self::PROPERTY_CREATIONTIME});
+ unset($job->{self::PROPERTY_TYPE});
+ }
+
+ /**
+ * Drop not allowed properties from the given job
+ */
+ private function _dropNotAllowedPropertiesUpdateJob(&$job)
+ {
+ unset($job->{self::PROPERTY_CREATIONTIME});
+ unset($job->{self::PROPERTY_TYPE});
+ }
+
+ /**
+ * Add e new triggered job to the jobs queue
+ * NOTE:
+ * - In this method there are less checks compared to addNewJobsToQueue method because
+ * the new jobs that will be added are generate in this method
+ * - Job ids in this case are not returned, therefore the caller is not going to be informed about these new jobs
+ */
+ private function _addNewTriggeredJobToQueue($type, $job, $triggeredStatuses)
+ {
+ // Get all the job trigggers for the given type and for the given statuses
+ $dbTriggersResult = $this->_ci->JobTriggersModel->getJobtriggersByTypeStatuses($type, $triggeredStatuses);
+
+ // If an error occurred while getting job triggers from database then return it
+ if (isError($dbTriggersResult)) return $dbTriggersResult;
+ if (hasData($dbTriggersResult)) // If triggers were retrieved
+ {
+ // The output of the trigging job is the input of the trigged job
+ $triggeredJobInput = null;
+ if (isset($job->{self::PROPERTY_OUTPUT})) $triggeredJobInput = $job->{self::PROPERTY_OUTPUT};
+
+ // For each trigger
+ foreach (getData($dbTriggersResult) as $trigger)
+ {
+ $triggeredJob = array(
+ self::PROPERTY_TYPE => $trigger->following_type, // the new type is the one defined in tbl_jobtriggers
+ self::PROPERTY_STATUS => self::STATUS_NEW, // new job status is new
+ self::PROPERTY_INPUT => $triggeredJobInput // new job input
+ );
+
+ // Try to insert the single job into database
+ $dbNewJob = $this->_ci->JobsQueueModel->insert($triggeredJob);
+ // If an error occurred during while inserting in database
+ if (isError($dbNewJob)) return $dbNewJob;
+ }
+ }
+
+ return success(); // if here then it was a success!
+ }
+}
+
diff --git a/application/libraries/LogLib.php b/application/libraries/LogLib.php
index b98575150..ffdec5f03 100644
--- a/application/libraries/LogLib.php
+++ b/application/libraries/LogLib.php
@@ -42,6 +42,8 @@ class LogLib
const P_NAME_LINE_INDEX = 'lineIndex';
const P_NAME_DB_LOG_TYPE = 'dbLogType';
const P_NAME_DB_EXECUTE_USER = 'dbExecuteUser';
+ const P_NAME_REQUEST_ID = 'requestId';
+ const P_NAME_REQUEST_DATA_FORMATTER = 'requestDataFormatter';
// Properties used to retrieve caller data
private $_classIndex;
@@ -52,6 +54,9 @@ class LogLib
private $_dbLogType;
private $_dbExecuteUser;
+ private $_requestId; // is it possible to specify a request id when loading this library
+ private $_requestDataFormatter; // is possible to provide a function to format request data
+
/**
* Set properties to a default value or overwrites them with the given parameters
*/
@@ -63,7 +68,18 @@ class LogLib
$this->_lineIndex = self::LINE_INDEX;
$this->_dbLogType = null;
$this->_dbExecuteUser = self::DB_EXECUTE_USER;
+ $this->_requestId = null;
+ $this->_requestDataFormatter = null;
+ // If parameters are given then overwrite the default values
+ if (!isEmptyArray($params)) $this->setConfigs($params);
+ }
+
+ /**
+ * Store configuration parameters for this lib
+ */
+ public function setConfigs($params)
+ {
// If parameters are given then overwrite the default values
if (!isEmptyArray($params))
{
@@ -72,6 +88,8 @@ class LogLib
if (isset($params[self::P_NAME_LINE_INDEX])) $this->_lineIndex = $params[self::P_NAME_LINE_INDEX];
if (isset($params[self::P_NAME_DB_LOG_TYPE])) $this->_dbLogType = $params[self::P_NAME_DB_LOG_TYPE];
if (isset($params[self::P_NAME_DB_EXECUTE_USER])) $this->_dbExecuteUser = $params[self::P_NAME_DB_EXECUTE_USER];
+ if (isset($params[self::P_NAME_REQUEST_ID])) $this->_requestId = $params[self::P_NAME_REQUEST_ID];
+ if (isset($params[self::P_NAME_REQUEST_DATA_FORMATTER])) $this->_requestDataFormatter = $params[self::P_NAME_REQUEST_DATA_FORMATTER];
}
}
@@ -108,33 +126,33 @@ class LogLib
/**
* Writes an info log to database
*/
- public function logInfoDB($requestId, $data)
+ public function logInfoDB($data, $requestId = null)
{
- $this->_logDB(self::INFO, $requestId, $data);
+ $this->_logDB(self::INFO, $data, $requestId);
}
/**
* Writes a debug log to database
*/
- public function logDebugDB($requestId, $data)
+ public function logDebugDB($data, $requestId = null)
{
- $this->_logDB(self::DEBUG, $requestId, $data);
+ $this->_logDB(self::DEBUG, $data, $requestId);
}
/**
* Writes an warning log to database
*/
- public function logWarningDB($requestId, $data)
+ public function logWarningDB($data, $requestId = null)
{
- $this->_logDB(self::WARNING, $requestId, $data);
+ $this->_logDB(self::WARNING, $data, $requestId);
}
/**
* Writes an error log to database
*/
- public function logErrorDB($requestId, $data)
+ public function logErrorDB($data, $requestId = null)
{
- $this->_logDB(self::ERROR, $requestId, $data);
+ $this->_logDB(self::ERROR, $data, $requestId);
}
// --------------------------------------------------------------------------------------------------------------
@@ -151,8 +169,15 @@ class LogLib
/**
* Writes logs to database
*/
- private function _logDB($level, $requestId, $data)
+ private function _logDB($level, $data, $requestId, $executionTime = null)
{
+ // If there isn't a valid request id provided during the loading of this library or when any log to db method is called
+ // NOTE: this message will be displayed only to the developer AND stops the execution
+ if (isEmptyString($this->_requestId) && isEmptyString($requestId))
+ {
+ show_error('To log to database you need to specify or give the "'.self::P_NAME_REQUEST_ID.'" parameter when the LogLib is loaded or when log'.ucfirst($level).'DB is called');
+ }
+
// If the _dbLogType parameter was not given when this library was loaded
// NOTE: this message will be displayed only to the developer AND stops the execution
if ($this->_dbLogType == null)
@@ -175,14 +200,21 @@ class LogLib
// Get caller data
$callerData = $this->_getCaller();
+ // If a request data formatter was defined then use it
+ $request_data = $data;
+ if ($this->_requestDataFormatter != null && is_callable($this->_requestDataFormatter))
+ {
+ $request_data = call_user_func_array($this->_requestDataFormatter, array($data));
+ }
+
// Writes a log to database
$ci->WebservicelogModel->insert(array(
'webservicetyp_kurzbz' => $this->_dbLogType,
- 'request_id' => $requestId,
+ 'request_id' => (!isEmptyString($requestId) ? $requestId : $this->_requestId).' - '.$level,
'beschreibung' => $this->_getDatabaseDescription($callerData),
- 'request_data' => $data,
+ 'request_data' => $request_data,
'execute_user' => $this->_dbExecuteUser,
- 'execute_time' => 'NOW()' // current time
+ 'execute_time' => $executionTime == null ? 'NOW()' : $executionTime // default current time, if not otherwise specified
));
}
}
@@ -251,3 +283,4 @@ class LogLib
return $formatted;
}
}
+
diff --git a/application/libraries/MessageLib.php b/application/libraries/MessageLib.php
index e0622e664..be496fe4a 100644
--- a/application/libraries/MessageLib.php
+++ b/application/libraries/MessageLib.php
@@ -620,11 +620,24 @@ class MessageLib
$this->_ci->load->model('person/Benutzer_model', 'BenutzerModel');
// And the receiver has an active account for the given organisation unit
- $benutzerResult = $this->_ci->BenutzerModel->getActiveUserByPersonIdAndOrganisationUnit($message->receiver_id, $message->sender_ou);
+ $benutzerResult = $this->_ci->BenutzerModel->getActiveUserByPersonIdAndOrganisationUnit(
+ $message->receiver_id,
+ $message->sender_ou
+ );
+
if (isError($benutzerResult)) return $benutzerResult; // if an error occured then return it
- // Use the uid + domain email
- if (hasData($benutzerResult)) $message->receiverContact = getData($benutzerResult)[0]->uid .'@'.DOMAIN;
+ // If an active user for the given organization unit was found
+ if (hasData($benutzerResult))
+ {
+ // Checks if the user was NOT created in the last 24 hours
+ if (getData($benutzerResult)[0]->insertamum < date('Y-m-d H:i:s', strtotime('-1 day')))
+ {
+ // Use the uid + domain email
+ $message->receiverContact = getData($benutzerResult)[0]->uid .'@'.DOMAIN;
+ }
+ // otherwise do NOT use the internal email account
+ }
}
// Otherwise try with the private email
@@ -669,7 +682,7 @@ class MessageLib
// If there are presetudent
if (hasData($prestudentResults))
{
- $inArray = true;
+ $privateOnly = false;
$organisationUnits = getData($prestudentResults);
// Look if any of the organization units of this prestudent are in the list of the
@@ -677,16 +690,21 @@ class MessageLib
foreach ($organisationUnits as $organisationUnit)
{
// If the recipient organisation unit is NOT in the list of organisation units that sent only to private emails
+ // NOTE: done in this way because it is easyer to check the result of array_search
if (array_search($organisationUnit, $this->_ci->config->item(self::CFG_OU_RECEIVERS_PRIVATE)) === false)
{
- $inArray = false;
+ // NOP
+ }
+ else // otherwise If the recipient organisation unit is the list of organisation units that sent only to private emails
+ {
+ $privateOnly = true;
break;
}
}
// If the recipient prestudent organization unit is not in in the list of the
// organization units that will not send the notice email to the internal account
- if (!$inArray)
+ if ($privateOnly)
{
// Then use the private email
$privateEmailResult = $this->_getPrivateEmail($message->receiver_id);
@@ -701,10 +719,37 @@ class MessageLib
$this->_ci->BenutzerModel->addOrder('updateamum', 'DESC');
$this->_ci->BenutzerModel->addOrder('insertamum', 'DESC');
- $benutzerResult = $this->_ci->BenutzerModel->loadWhere(array('person_id' => $message->receiver_id));
+ $benutzerResult = $this->_ci->BenutzerModel->loadWhere(
+ array(
+ 'person_id' => $message->receiver_id
+ )
+ );
if (isError($benutzerResult)) return $benutzerResult; // if an error occured then return it
- $message->receiverContact = getData($benutzerResult)[0]->uid .'@'.DOMAIN; // Use the uid + domain email
+ // If an active user for the given organization unit was found
+ if (hasData($benutzerResult))
+ {
+ // For each benutzer found for this person
+ foreach (getData($benutzerResult) as $benutzer)
+ {
+ // Checks if the user was NOT created in the last 24 hours
+ if (getData($benutzerResult)[0]->insertamum < date('Y-m-d H:i:s', strtotime('-1 day')))
+ {
+ // Use the uid + domain as email address
+ $message->receiverContact = getData($benutzerResult)[0]->uid .'@'.DOMAIN;
+ }
+ }
+ }
+
+ // Otherwise try with the private email
+ if (isEmptyString($message->receiverContact))
+ {
+ // Then use the private email
+ $privateEmailResult = $this->_getPrivateEmail($message->receiver_id);
+ if (isError($privateEmailResult)) return $privateEmailResult; // if an error occured then return it
+
+ if (hasData($privateEmailResult)) $message->receiverContact = getData($privateEmailResult);
+ }
}
}
}
diff --git a/application/libraries/PermissionLib.php b/application/libraries/PermissionLib.php
index 348c8b87b..09f89abee 100644
--- a/application/libraries/PermissionLib.php
+++ b/application/libraries/PermissionLib.php
@@ -147,7 +147,7 @@ class PermissionLib
$accessType = '';
- // Checks if the required access type is compliant with the HTTP method (GET => r, POST => w)
+ // Set the access type
if (strpos($requiredAccessType, PermissionLib::READ_RIGHT) !== false)
{
$accessType = PermissionLib::SELECT_RIGHT; // S
@@ -184,12 +184,12 @@ class PermissionLib
}
else
{
- show_error('The given permission array does not contain the called method or is not correctly set');
+ show_error('The given permission array does not contain the given method or is not correctly set');
}
}
else
{
- show_error('You must give the permissions array as parameter to the constructor of the controller');
+ show_error('The given permissions is not a valid array or it is an empty one');
}
return $checkPermissions;
diff --git a/application/models/CL/Messages_model.php b/application/models/CL/Messages_model.php
index f24e16086..9ffd12cf6 100644
--- a/application/models/CL/Messages_model.php
+++ b/application/models/CL/Messages_model.php
@@ -287,9 +287,11 @@ class Messages_model extends CI_Model
$sender = getData($senderResult)[0]; // Found sender data
- // If the sender is not the system sender and are present configurations to reply
+ // If the sender is not the system sender and the receiver is not the system sender
+ // and are present configurations to reply
$hrefReply = '';
if ($message->sender_id != $this->config->item(MessageLib::CFG_SYSTEM_PERSON_ID)
+ && $message->receiver_id != $this->config->item(MessageLib::CFG_SYSTEM_PERSON_ID)
&& !isEmptyString($this->config->item(MessageLib::CFG_REDIRECT_VIEW_MESSAGE_URL)))
{
$hrefReply = $this->config->item(MessageLib::CFG_MESSAGE_SERVER).
@@ -297,6 +299,13 @@ class Messages_model extends CI_Model
$token;
}
+ // If the receiver is the system sender (the message was sent to an organization unit)
+ // redirect the reply to an authenticated controller to reply
+ if ($message->receiver_id == $this->config->item(MessageLib::CFG_SYSTEM_PERSON_ID))
+ {
+ $hrefReply = site_url('system/messages/MessageClient/writeReply?token='.$token);
+ }
+
return array (
'sender' => $sender,
'message' => $message,
@@ -417,23 +426,20 @@ class Messages_model extends CI_Model
$message = $this->messagelib->sendMessageUser(
$msgVarsDataArray['person_id'], // receiverPersonId
- $parsedSubject, // subject
- $parsedBody, // body
- $sender_id, // sender_id
- $senderOU, // senderOU
- $relationmessage_id, // relationmessage_id
- MSG_PRIORITY_NORMAL // priority
+ $parsedSubject, // subject
+ $parsedBody, // body
+ $sender_id, // sender_id
+ $senderOU, // senderOU
+ $relationmessage_id, // relationmessage_id
+ MSG_PRIORITY_NORMAL // priority
);
if (isError($message)) return $message;
if (!hasData($message)) return error('No messages were saved in database');
- // Write log entry only if persons were given
- if ($type == self::TYPE_PERSONS)
- {
- $personLog = $this->_personLog($sender_id, $msgVarsDataArray['person_id'], getData($message)[0]);
- if (isError($personLog)) return $personLog;
- }
+ // Write log entry only
+ $personLog = $this->_personLog($sender_id, $msgVarsDataArray['person_id'], getData($message)[0]);
+ if (isError($personLog)) return $personLog;
$receiversCounter++; // increment the counter
}
diff --git a/application/models/codex/Bisverwendung_model.php b/application/models/codex/Bisverwendung_model.php
index 707e8af36..7f101bd4c 100644
--- a/application/models/codex/Bisverwendung_model.php
+++ b/application/models/codex/Bisverwendung_model.php
@@ -41,4 +41,35 @@ class Bisverwendung_model extends DB_Model
return $this->loadWhere($condition);
}
+
+ /**
+ * Gets Verwendungen of the user, optionally in a time span.
+ * @param string $uid
+ * @param string $beginn
+ * @param string $ende
+ * @return array
+ */
+ public function getVerwendungen($uid, $beginn = null, $ende = null)
+ {
+ $params = array($uid);
+
+ $qry = 'SELECT * FROM bis.tbl_bisverwendung
+ WHERE mitarbeiter_uid = ?';
+
+ if (isset($beginn))
+ {
+ $qry .= ' AND ( ende >= ? OR ende IS NULL )';
+ $params[] = $beginn;
+ }
+
+ if (isset($ende))
+ {
+ $qry .= ' AND ( beginn <= ? OR beginn IS NULL )';
+ $params[] = $ende;
+ }
+
+ $qry .= ' ORDER BY beginn, ende';
+
+ return $this->execQuery($qry, $params);
+ }
}
diff --git a/application/models/crm/Konto_model.php b/application/models/crm/Konto_model.php
index 286d3189e..a3b5cdbb6 100644
--- a/application/models/crm/Konto_model.php
+++ b/application/models/crm/Konto_model.php
@@ -11,4 +11,61 @@ class Konto_model extends DB_Model
$this->dbTable = 'public.tbl_konto';
$this->pk = 'buchungsnr';
}
+
+ /**
+ * Sets a Payment as paid
+ */
+ public function setPaid($buchungsnr)
+ {
+ // get payment
+ $buchungResult = $this->loadWhere(array('buchungsnr' => $buchungsnr));
+
+ if(isSuccess($buchungResult) && hasData($buchungResult))
+ {
+ // get already paid amount
+ $this->addSelect('sum(betrag) as bezahlt');
+ $this->addGroupBy('buchungsnr_verweis');
+ $buchungVerweisResult = $this->loadWhere(array('buchungsnr_verweis' => $buchungsnr));
+
+ if(isSuccess($buchungVerweisResult))
+ {
+ if(hasData($buchungVerweisResult))
+ {
+ $betragBezahltResult = getData($buchungVerweisResult);
+ $betragBezahlt = $betragBezahltResult->bezahlt;
+ }
+ else
+ $betragBezahlt = 0;
+
+ $buchung = getData($buchungResult);
+ $buchung = $buchung[0];
+
+ // calculate open amount
+ $betragOffen = $betragBezahlt - $buchung->betrag*(-1);
+
+ $data = array(
+ 'person_id' => $buchung->person_id,
+ 'studiengang_kz' => $buchung->studiengang_kz,
+ 'studiensemester_kurzbz' => $buchung->studiensemester_kurzbz,
+ 'buchungsnr_verweis' => $buchungsnr,
+ 'betrag' => str_replace(',','.',$betragOffen*(-1)),
+ 'buchungsdatum' => date('Y-m-d'),
+ 'buchungstext' => $buchung->buchungstext,
+ 'insertamum' => date('Y-m-d H:i:s'),
+ 'insertvon' => '',
+ 'buchungstyp_kurzbz' => $buchung->buchungstyp_kurzbz,
+ );
+
+ return $this->insert($data);
+ }
+ else
+ {
+ return error('Failed to load Payment');
+ }
+ }
+ else
+ {
+ return error('Failed to load Payment');
+ }
+ }
}
diff --git a/application/models/crm/Prestudentstatus_model.php b/application/models/crm/Prestudentstatus_model.php
index d579037e1..3335de021 100644
--- a/application/models/crm/Prestudentstatus_model.php
+++ b/application/models/crm/Prestudentstatus_model.php
@@ -182,4 +182,30 @@ class Prestudentstatus_model extends DB_Model
return success(array());
}
}
+
+ /**
+ * getLastStatuses
+ */
+ public function getLastStatusPerson($person_id, $studiensemester_kurzbz = null)
+ {
+ $query = 'SELECT *
+ FROM public.tbl_prestudent p
+ JOIN (
+ SELECT DISTINCT ON(prestudent_id) *
+ FROM public.tbl_prestudentstatus
+ WHERE prestudent_id IN (SELECT prestudent_id FROM public.tbl_prestudent WHERE person_id = ?)
+ ORDER BY prestudent_id, datum desc, insertamum desc
+ ) ps USING(prestudent_id)
+ JOIN public.tbl_status USING(status_kurzbz)';
+
+ $parametersArray = array($person_id);
+
+ if ($studiensemester_kurzbz != '')
+ {
+ array_push($parametersArray, $studiensemester_kurzbz);
+ $query .= ' AND ps.studiensemester_kurzbz = ?';
+ }
+
+ return $this->execQuery($query, $parametersArray);
+ }
}
diff --git a/application/models/education/Abschlusspruefung_model.php b/application/models/education/Abschlusspruefung_model.php
index aef5f67c3..268e786cb 100644
--- a/application/models/education/Abschlusspruefung_model.php
+++ b/application/models/education/Abschlusspruefung_model.php
@@ -11,4 +11,106 @@ class Abschlusspruefung_model extends DB_Model
$this->dbTable = 'lehre.tbl_abschlusspruefung';
$this->pk = 'abschlusspruefung_id';
}
+
+ /**
+ * Gets data of an Abschlusspruefung, including Abschlussarbeit.
+ * @param $abschlusspruefung_id
+ * @return object
+ */
+ public function getAbschlusspruefung($abschlusspruefung_id)
+ {
+ $this->load->model('crm/Student_model', 'StudentModel');
+ $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+
+ $abschlusspruefungdata = array();
+
+ $this->addSelect('tbl_abschlusspruefung.abschlusspruefung_id, tbl_abschlusspruefung.datum, tbl_abschlusspruefung.pruefungstyp_kurzbz AS studiengangstyp, tbl_abschlusspruefung.abschlussbeurteilung_kurzbz, tbl_abschlusspruefung.uhrzeit AS pruefungsbeginn, tbl_abschlusspruefung.endezeit AS pruefungsende,
+ tbl_abschlusspruefung.freigabedatum, tbl_abschlusspruefung_antritt.bezeichnung AS pruefungsantritt_bezeichnung, tbl_abschlusspruefung_antritt.bezeichnung_english AS pruefungsantritt_bezeichnung_english, tbl_abschlusspruefung.protokoll,
+ studentpers.vorname AS vorname_student, studentpers.nachname AS nachname_student, studentpers.titelpre AS titelpre_student, studentpers.titelpost AS titelpost_student, studentben.uid AS uid_student, matrikelnr,
+ vorsitzenderben.uid AS uid_vorsitz, vorsitzenderpers.vorname AS vorname_vorsitz, vorsitzenderpers.nachname AS nachname_vorsitz, vorsitzenderpers.titelpre AS titelpre_vorsitz, vorsitzenderpers.titelpost AS titelpost_vorsitz,
+ erstprueferpers.vorname AS vorname_erstpruefer, erstprueferpers.nachname AS nachname_erstpruefer, erstprueferpers.titelpre AS titelpre_erstpruefer, erstprueferpers.titelpost AS titelpost_erstpruefer,
+ zweitprueferpers.vorname AS vorname_zweitpruefer, zweitprueferpers.nachname AS nachname_zweitpruefer, zweitprueferpers.titelpre AS titelpre_zweitpruefer, zweitprueferpers.titelpost AS titelpost_zweitpruefer
+ ');
+ $this->addJoin('lehre.tbl_abschlusspruefung_antritt', 'pruefungsantritt_kurzbz', 'LEFT');
+ $this->addJoin('public.tbl_benutzer studentben', 'tbl_abschlusspruefung.student_uid = studentben.uid');
+ $this->addJoin('public.tbl_person studentpers', 'studentben.person_id = studentpers.person_id');
+ $this->addJoin('public.tbl_student', 'studentben.uid = tbl_student.student_uid');
+ $this->addJoin('public.tbl_benutzer vorsitzenderben', 'vorsitz = vorsitzenderben.uid', 'LEFT');
+ $this->addJoin('public.tbl_person vorsitzenderpers', 'vorsitzenderben.person_id = vorsitzenderpers.person_id', 'LEFT');
+ $this->addJoin('public.tbl_person erstprueferpers', 'pruefer1 = erstprueferpers.person_id', 'LEFT');
+ $this->addJoin('public.tbl_person zweitprueferpers', 'pruefer2 = zweitprueferpers.person_id', 'LEFT');
+
+ $abschlusspruefung = $this->load($abschlusspruefung_id);
+
+ if (isError($abschlusspruefung))
+ return $abschlusspruefung;
+ elseif (hasData($abschlusspruefung))
+ {
+ $abschlusspruefungdata = getData($abschlusspruefung)[0];
+
+ // get Studiengang of Student
+ $student_uid = $abschlusspruefungdata->uid_student;
+ $this->StudentModel->addSelect('prestudent_id');
+ $prestudent_id = $this->StudentModel->load(array('student_uid' => $student_uid));
+
+ if (isError($prestudent_id))
+ return $prestudent_id;
+ elseif (hasData($prestudent_id))
+ {
+ //get Studiengangname from Studienplan and -ordnung
+ $studienordnung = $this->PrestudentstatusModel->getStudienordnungFromPrestudent(getData($prestudent_id)[0]->prestudent_id);
+
+ if (isError($studienordnung))
+ return $studienordnung;
+ elseif (hasData($studienordnung))
+ {
+ $studienordnungdata = getData($studienordnung)[0];
+
+ $abschlusspruefungdata->studiengang_kz = $studienordnungdata->studiengang_kz;
+ $abschlusspruefungdata->studiengangbezeichnung = $studienordnungdata->studiengangbezeichnung;
+ $abschlusspruefungdata->studiengangbezeichnung_englisch = $studienordnungdata->studiengangbezeichnung_englisch;
+ }
+ // if no Studienordnung available (e.g. Incomings), use Studiengangname provided by table student
+ elseif (!hasData($studienordnung))
+ {
+ $this->resetQuery();
+
+ $this->load->model('crm/Student_model', 'StudentModel');
+ $this->addSelect('studiengang_kz, bezeichnung, english');
+ $this->addJoin('public.tbl_studiengang', 'studiengang_kz');
+ $result = $this->StudentModel->load(array(
+ 'student_uid' => $student_uid)
+ );
+
+ if ($result = getData($result)[0])
+ {
+ $abschlusspruefungdata->studiengang_kz = $result->studiengang_kz;
+ $abschlusspruefungdata->studiengangbezeichnung = $result->bezeichnung;
+ $abschlusspruefungdata->studiengangbezeichnung_englisch = $result->english;
+ }
+ }
+
+ // get Abschlussarbeit
+ if (isset($abschlusspruefungdata->studiengang_kz) && !empty($abschlusspruefungdata->studiengang_kz))
+ {
+ $projekttyp = array('Bachelor','Diplom','Master','Dissertation','Lizenziat','Magister');
+ $abschlussarbeit = $this->ProjektarbeitModel->getProjektarbeit($student_uid, $abschlusspruefungdata->studiengang_kz, null, $projekttyp, true);
+
+ if (isError($abschlussarbeit))
+ return $abschlussarbeit;
+ if (hasData($abschlussarbeit))
+ {
+ $abschlussarbeit = getData($abschlussarbeit)[0];
+ $abschlusspruefungdata->projektarbeit_studiengangstyp_name = $abschlussarbeit->projekttyp_kurzbz;
+ $abschlusspruefungdata->abschlussarbeit_titel = $abschlussarbeit->titel;
+ $abschlusspruefungdata->abschlussarbeit_note = $abschlussarbeit->note;
+ }
+ }
+ }
+ }
+
+ return success($abschlusspruefungdata);
+ }
}
diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php
index 4941ba9bd..d80d02b41 100644
--- a/application/models/education/Lehrveranstaltung_model.php
+++ b/application/models/education/Lehrveranstaltung_model.php
@@ -119,9 +119,10 @@ class Lehrveranstaltung_model extends DB_Model
* Gets all students of a Lehrveranstaltung
* @param $studiensemester_kurzbz
* @param $lehrveranstaltung_id
+ * @param $active optional, if true, only active students retrieved, false - only inactive, all students otherwise
* @return array|null
*/
- public function getStudentsByLv($studiensemester_kurzbz, $lehrveranstaltung_id)
+ public function getStudentsByLv($studiensemester_kurzbz, $lehrveranstaltung_id, $active = null)
{
$query = "SELECT
distinct on(nachname, vorname, person_id) vorname, nachname, matrikelnr,
@@ -144,8 +145,18 @@ class Lehrveranstaltung_model extends DB_Model
WHERE
vw_student_lehrveranstaltung.studiensemester_kurzbz=?
AND
- vw_student_lehrveranstaltung.lehrveranstaltung_id=?
- ORDER BY nachname, vorname, person_id, tbl_bisio.bis DESC";
+ vw_student_lehrveranstaltung.lehrveranstaltung_id=?";
+
+ if (isset($active))
+ {
+ if ($active === true)
+ $query .= " AND tbl_benutzer.aktiv";
+ elseif ($active === false)
+ $query .= " AND tbl_benutzer.aktiv = false";
+ }
+
+ $query .=
+ " ORDER BY nachname, vorname, person_id, tbl_bisio.bis DESC";
return $this->execQuery($query, array($studiensemester_kurzbz, $lehrveranstaltung_id));
}
diff --git a/application/models/education/Projektarbeit_model.php b/application/models/education/Projektarbeit_model.php
index e5652d6ff..109e23373 100644
--- a/application/models/education/Projektarbeit_model.php
+++ b/application/models/education/Projektarbeit_model.php
@@ -11,4 +11,62 @@ class Projektarbeit_model extends DB_Model
$this->dbTable = 'lehre.tbl_projektarbeit';
$this->pk = 'projektarbeit_id';
}
+
+ /**
+ * Gets Projektarbeit(en) of a student for a Studiengang, Semester, Projekttyp, final.
+ * @param $student_uid
+ * @param $studiengang_kz
+ * @param $studiensemester_kurzbz
+ * @param $projekttyp
+ * @param $final
+ * @return object
+ */
+ public function getProjektarbeit($student_uid, $studiengang_kz = null, $studiensemester_kurzbz = null, $projekttyp = null, $final = null)
+ {
+ $qry = "SELECT
+ tbl_projektarbeit.* , tbl_projekttyp.bezeichnung
+ FROM
+ lehre.tbl_projektarbeit
+ JOIN
+ lehre.tbl_projekttyp USING (projekttyp_kurzbz), lehre.tbl_lehreinheit, lehre.tbl_lehrveranstaltung
+
+ WHERE
+ tbl_projektarbeit.lehreinheit_id=tbl_lehreinheit.lehreinheit_id AND
+ tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id AND
+ tbl_projektarbeit.student_uid = ?";
+
+ $params = array($student_uid);
+
+ if (isset($studiengang_kz))
+ {
+ $qry .= ' AND tbl_lehrveranstaltung.studiengang_kz=?';
+ $params[] = $studiengang_kz;
+ }
+
+ if (isset($studiensemester_kurzbz))
+ {
+ $qry .= ' AND tbl_lehreinheit.studiensemester_kurzbz=?';
+ $params[] = $studiensemester_kurzbz;
+ }
+
+ if (isset($projekttyp))
+ {
+ if (is_array($projekttyp))
+ $qry .= ' AND tbl_projektarbeit.projekttyp_kurzbz IN ?';
+ else
+ $qry .= ' AND tbl_projektarbeit.projekttyp_kurzbz=?';
+
+ $params[] = $projekttyp;
+ }
+
+ if (isset($final))
+ {
+ $qry .= ' AND tbl_projektarbeit.final=?';
+ $params[] = $final;
+ }
+
+ $qry .= ' ORDER BY beginn DESC, projektarbeit_id DESC';
+
+ return $this->execQuery($qry, $params);
+ }
}
diff --git a/application/models/organisation/Organisationseinheit_model.php b/application/models/organisation/Organisationseinheit_model.php
index 6439bc8d6..bec4aee47 100644
--- a/application/models/organisation/Organisationseinheit_model.php
+++ b/application/models/organisation/Organisationseinheit_model.php
@@ -33,7 +33,7 @@ class Organisationseinheit_model extends DB_Model
FROM tree JOIN tbl_organisationseinheit oe ON (tree.oe_kurzbz = oe.oe_parent_kurzbz)
)
SELECT oe_kurzbz AS id,
- SUBSTRING(REGEXP_REPLACE(path, '[A-z]+\|', '-', 'g') || bezeichnung, 2) AS description
+ SUBSTRING(REGEXP_REPLACE(path, '[A-z0-9]+\|', '-', 'g') || bezeichnung, 2) AS description
FROM tree";
$parametersArray = array();
diff --git a/application/models/organisation/Studiensemester_model.php b/application/models/organisation/Studiensemester_model.php
index 9cdde7a52..41baf2489 100644
--- a/application/models/organisation/Studiensemester_model.php
+++ b/application/models/organisation/Studiensemester_model.php
@@ -39,7 +39,7 @@ class Studiensemester_model extends DB_Model
$days = 60;
}
- $query = 'SELECT studiensemester_kurzbz
+ $query = 'SELECT studiensemester_kurzbz, start, ende
FROM public.tbl_studiensemester
WHERE start < NOW() - \'' . $days . ' DAYS\'::INTERVAL
ORDER BY start DESC
@@ -59,7 +59,7 @@ class Studiensemester_model extends DB_Model
$days = 62;
}
- $query = 'SELECT studiensemester_kurzbz
+ $query = 'SELECT studiensemester_kurzbz, start, ende
FROM public.tbl_studiensemester
WHERE start < NOW() + \'' . $days . ' DAYS\':: INTERVAL
ORDER BY start DESC
diff --git a/application/models/person/Adresse_model.php b/application/models/person/Adresse_model.php
index e049f5ad6..fb5112a8d 100644
--- a/application/models/person/Adresse_model.php
+++ b/application/models/person/Adresse_model.php
@@ -14,12 +14,14 @@ class Adresse_model extends DB_Model
/**
- * gets person data from uid
- * @param $uid
+ * Get Zustelladress of given person.
+ * @param string $person_id
+ * @param string $select
* @return array
*/
- public function getZustellAdresse($person_id)
+ public function getZustellAdresse($person_id, $select = '*')
{
+ $this->addSelect($select);
return $this->loadWhere(array('person_id' => $person_id, 'zustelladresse'=> true));
}
}
diff --git a/application/models/person/Benutzer_model.php b/application/models/person/Benutzer_model.php
index a21811bb4..c1e76ce38 100644
--- a/application/models/person/Benutzer_model.php
+++ b/application/models/person/Benutzer_model.php
@@ -23,14 +23,81 @@ class Benutzer_model extends DB_Model
*/
public function getActiveUserByPersonIdAndOrganisationUnit($person_id, $oe_kurzbz)
{
- $sql = 'SELECT b.uid
- FROM public.tbl_benutzer b
- JOIN public.tbl_prestudent ps USING (person_id)
- JOIN public.tbl_studiengang sg USING (studiengang_kz)
- WHERE ps.person_id = ?
- AND sg.oe_kurzbz = ?
- AND b.aktiv = TRUE';
+ $sql = 'SELECT
+ b.uid,
+ b.insertamum
+ FROM
+ public.tbl_prestudent ps
+ JOIN public.tbl_studiengang sg USING (studiengang_kz)
+ JOIN public.tbl_student USING(prestudent_id)
+ JOIN public.tbl_benutzer b ON(uid = student_uid)
+ WHERE ps.person_id = ?
+ AND sg.oe_kurzbz = ?
+ AND b.aktiv = TRUE';
return $this->execQuery($sql, array($person_id, $oe_kurzbz));
}
+
+ /**
+ * Checks if alias exists
+ * @param $alias
+ */
+ public function aliasExists($alias)
+ {
+ $this->addSelect('1');
+ $result = $this->loadWhere(array('alias' => $alias));
+
+ if (isSuccess($result))
+ {
+ if (hasData($result))
+ {
+ $result = success(array(true));
+ }
+ else
+ {
+ $result = success(array(false));
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * Generates alias for a uid.
+ * @param $uid
+ * @return array the alias if newly generated
+ */
+ public function generateAlias($uid)
+ {
+ $aliasres = '';
+ $this->addLimit(1);
+ $this->addSelect('vorname, nachname');
+ $this->addJoin('public.tbl_person', 'person_id');
+ $nameresult = $this->loadWhere(array('uid' => $uid));
+
+ if (hasData($nameresult))
+ {
+ $aliasdata = getData($nameresult);
+ $alias = $this->_sanitizeAliasName($aliasdata[0]->vorname).'.'.$this->_sanitizeAliasName($aliasdata[0]->nachname);
+ $aliasexists = $this->aliasExists($alias);
+
+ if (hasData($aliasexists) && !getData($aliasexists)[0])
+ $aliasres = $alias;
+ }
+ return success($aliasres);
+ }
+
+ // --------------------------------------------------------------------------------------------
+ // Private methods
+
+ /**
+ * Sanitizes a string used for alias. Replaces special characters, spaces, sets lower case.
+ * @param string $str
+ * @return string
+ */
+ private function _sanitizeAliasName($str)
+ {
+ $str = sanitizeProblemChars($str);
+ return mb_strtolower(str_replace(' ','_', $str));
+ }
}
diff --git a/application/models/person/Benutzerfunktion_model.php b/application/models/person/Benutzerfunktion_model.php
index fb9b51c1a..27f9b6184 100644
--- a/application/models/person/Benutzerfunktion_model.php
+++ b/application/models/person/Benutzerfunktion_model.php
@@ -12,6 +12,44 @@ class Benutzerfunktion_model extends DB_Model
$this->pk = 'benutzerfunktion_id';
}
+ /**
+ * Lädt alle Benutzerfunktionen zu einer UID
+ * @param type $uid UID des Mitarbeiters
+ * @param type $funktion_kurzbz OPTIONAL Kurzbezeichnung der Funktion
+ * @param type $startZeitraum OPTIONAL Start Zeitraum in dem die Funktion aktiv ist
+ * @param type $endeZeitraum OPTIONAL Ende Zeitraum in dem die Funktion aktiv ist
+ * @return boolean
+ */
+ public function getBenutzerFunktionByUid($uid, $funktion_kurzbz=null, $startZeitraum=null, $endeZeitraum=null)
+ {
+ $params = array($uid);
+
+ $qry = "SELECT tbl_benutzerfunktion.*, tbl_organisationseinheit.bezeichnung as organisationseinheit_bezeichnung,
+ tbl_organisationseinheit.organisationseinheittyp_kurzbz
+ FROM public.tbl_benutzerfunktion
+ LEFT JOIN public.tbl_organisationseinheit USING(oe_kurzbz)
+ WHERE uid=?";
+ if(!is_null($funktion_kurzbz))
+ {
+ $qry .= ' AND funktion_kurzbz = ?';
+ $params[] = $funktion_kurzbz;
+ }
+ if(!is_null($startZeitraum))
+ {
+ $qry .=' AND (datum_bis IS NULL OR datum_bis >= ?)';
+ $params[] = $startZeitraum;
+ }
+ if(!is_null($endeZeitraum))
+ {
+ $qry .=' AND (datum_von IS NULL OR datum_von <= ?)';
+ $params[] = $endeZeitraum;
+ }
+
+ $qry .= "ORDER BY datum_bis NULLS LAST, datum_von NULLS LAST;";
+
+ return $this->execQuery($qry, $params);
+ }
+
/**
* Get the Benutzerfunktion using the person_id
*/
diff --git a/application/models/person/Kontakt_model.php b/application/models/person/Kontakt_model.php
index 3f27604e8..c35794fc8 100644
--- a/application/models/person/Kontakt_model.php
+++ b/application/models/person/Kontakt_model.php
@@ -10,6 +10,7 @@ class Kontakt_model extends DB_Model
parent::__construct();
$this->dbTable = 'public.tbl_kontakt';
$this->pk = 'kontakt_id';
+ $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
}
public function getWholeKontakt($kontakt_id, $person_id = null, $kontakttyp = null)
@@ -59,4 +60,142 @@ class Kontakt_model extends DB_Model
return $this->execQuery($sql, array($person_id, $kontakttyp));
}
+
+ /**
+ * Laedt einen Kontakt eines Standortes
+ * Es wird nur der erste Eintrag zurueckgeliefert!
+ * @param $standort_id
+ * @param $kontakttyp
+ */
+ public function getFirmaKontakttyp($standort_id, $kontakttyp)
+ {
+ if (!is_numeric($standort_id))
+ {
+ return error('StandortID ist ungueltig');
+ }
+
+ $qry = "SELECT kontakt, kontakt_id FROM public.tbl_kontakt WHERE standort_id=? AND kontakttyp=? ORDER BY kontakt_id LIMIT 1;";
+
+ return $this->execQuery($qry, array('standort_id' => $standort_id, 'kontakttyp' => $kontakttyp));
+ }
+
+ /**
+ * Gets Firmentelefon for a uid, can be Vorwahl with Telefonklappe or Firmenhandy
+ * @param $uid
+ */
+ public function getFirmentelefon($uid)
+ {
+ $firmentelefon = success(array());
+
+ $this->MitarbeiterModel->addSelect('standort_id, telefonklappe, person_id');
+ $this->MitarbeiterModel->addJoin('public.tbl_benutzer', 'tbl_mitarbeiter.mitarbeiter_uid = tbl_benutzer.uid');
+ $mitarbeiter = $this->MitarbeiterModel->load(array('uid' => $uid));
+
+ if (hasData($mitarbeiter))
+ {
+ $mitarbeiter = getData($mitarbeiter);
+ if (isEmptyString($mitarbeiter[0]->telefonklappe))
+ {
+ $this->addSelect('kontakt');
+ $this->addOrder('updateamum, insertamum', 'DESC');
+ $this->addLimit(1);
+ $firmenhandy = $this->loadWhere(array('person_id' => $mitarbeiter[0]->person_id, 'kontakttyp' => 'firmenhandy'));
+ if (hasData($firmenhandy))
+ {
+ $firmenhandy = getData($firmenhandy);
+ $firmentelefon = success(array('kontakt' => $firmenhandy[0]->kontakt, 'telefonklappe' => ''));
+ }
+ }
+ else
+ {
+ $firmaKontakttyp = $this->getFirmaKontakttyp($mitarbeiter[0]->standort_id, 'telefon');
+ if (hasData($firmaKontakttyp))
+ {
+ $vorwahl = getData($firmaKontakttyp);
+ $vorwahl = $vorwahl[0]->kontakt;
+ $firmentelefon = success(array('kontakt' => $vorwahl, 'telefonklappe' => $mitarbeiter[0]->telefonklappe));
+ }
+ }
+ }
+ return $firmentelefon;
+ }
+
+ /**
+ * Get all latest contact data of person, where Zustellung is true
+ * @param $person_id
+ * @return array
+ */
+ public function getAll_byPersonID($person_id)
+ {
+ $this->addSelect('DISTINCT ON (kontakttyp) kontakttyp, kontakt');
+ $this->addJoin('public.tbl_standort', 'standort_id', 'LEFT');
+ $this->addJoin('public.tbl_firma', 'firma_id', 'LEFT');
+ $this->addOrder('kontakttyp, kontakt, tbl_kontakt.updateamum, tbl_kontakt.insertamum');
+
+ return $this->loadWhere(array(
+ 'zustellung' => TRUE,
+ 'person_id' => $person_id
+ ));
+ }
+
+ /**
+ * Get all latest phones of person where zustellung is true. Ordered by
+ * telefon > mobil > firmenhandy > else.
+ * @param string person_id
+ */
+ public function getPhones_byPerson($person_id)
+ {
+ $qry = '
+ WITH latest_phones AS(
+ SELECT DISTINCT ON (kontakttyp) kontakttyp, kontakt
+ FROM public.tbl_kontakt kontakt
+ LEFT JOIN public.tbl_standort USING (standort_id)
+ LEFT JOIN public.tbl_firma USING (firma_id)
+ WHERE person_id = ?
+ AND zustellung
+ AND kontakttyp IN (\'telefon\', \'mobil\', \'firmenhandy\')
+ ORDER BY kontakttyp, kontakt, kontakt.updateamum
+ )
+
+ SELECT * FROM latest_phones
+ ORDER BY
+ CASE
+ WHEN kontakttyp = \'telefon\' THEN 0
+ WHEN kontakttyp = \'mobil\' THEN 1
+ WHEN kontakttyp = \'firmenhandy\' THEN 2
+ ELSE 3
+ END
+ ';
+
+ return $this->execQuery($qry, array($person_id));
+ }
+
+ /**
+ * Loads main contact, i.e. most recent Zustellkontakt with the given kontakttypes.
+ * @param $person_id
+ * @param $kontakttypen array of kontakttypen, one chronologically last Zustellkontakt for all given types
+ * @return object
+ */
+ public function getZustellKontakt($person_id, $kontakttypen)
+ {
+ if (is_string($kontakttypen))
+ $kontakttypen = array($kontakttypen);
+
+ if (!isEmptyArray($kontakttypen))
+ {
+ $qry = "
+ SELECT
+ kontakt
+ FROM
+ public.tbl_kontakt
+ WHERE person_id = ?
+ AND kontakttyp IN ?
+ ORDER BY zustellung DESC NULLS LAST, updateamum DESC, insertamum DESC
+ LIMIT 1";
+
+ return $this->execQuery($qry, array($person_id, $kontakttypen));
+ }
+ else
+ return success(array());
+ }
}
diff --git a/application/models/ressource/Betriebsmittelperson_model.php b/application/models/ressource/Betriebsmittelperson_model.php
index 924f670e0..87915cfa8 100644
--- a/application/models/ressource/Betriebsmittelperson_model.php
+++ b/application/models/ressource/Betriebsmittelperson_model.php
@@ -1,7 +1,6 @@
dbTable = 'wawi.tbl_betriebsmittelperson';
$this->pk = 'betriebsmittelperson_id';
}
+
+ /**
+ * Get Betriebsmittel by person.
+ * @param string $person_id
+ * @param string $betriebsmitteltyp
+ * @param bool $isRetourniert False to retrieve only active Betriebsmittel.
+ * @return array|bool
+ */
+ public function getBetriebsmittel($person_id, $betriebsmitteltyp = null, $isRetourniert = null)
+ {
+ if (!is_numeric($person_id))
+ {
+ $this->errormsg = 'Person_id type is not valid.';
+ return false;
+ }
+
+ $this->addJoin('wawi.tbl_betriebsmittel', 'betriebsmittel_id');
+
+ $condition = '
+ person_id = '. $this->escape($person_id). '
+ ';
+
+ if (is_string($betriebsmitteltyp)) {
+ $condition .= '
+ AND betriebsmitteltyp = ' . $this->escape($betriebsmitteltyp);
+ }
+
+ if ($isRetourniert === true) {
+ $condition .= '
+ AND retouram IS NOT NULL'; // return date is given
+ }
+ elseif ($isRetourniert === false)
+ {
+ $condition .= '
+ AND retouram IS NULL'; // default
+ }
+
+ $this->addOrder('ausgegebenam', 'DESC'); // default
+
+ return $this->loadWhere($condition);
+ }
}
diff --git a/application/models/ressource/Mitarbeiter_model.php b/application/models/ressource/Mitarbeiter_model.php
index ccaeacd0d..90c30927f 100644
--- a/application/models/ressource/Mitarbeiter_model.php
+++ b/application/models/ressource/Mitarbeiter_model.php
@@ -40,4 +40,166 @@ class Mitarbeiter_model extends DB_Model
return success(false);
}
}
+
+ /**
+ * Laedt das Personal
+ *
+ * @param $aktiv wenn true werden nur aktive geladen, wenn false dann nur inaktve, wenn null dann alle
+ * @param $fix wenn true werden nur fixangestellte geladen
+ * @param $verwendung wenn true werden alle geladen die eine BIS-Verwendung eingetragen haben
+ * @param $personaccount wenn true werden alle geladen die personalnr >= 0 haben, also "echte" Personaccounts
+ * @return array
+ */
+ public function getPersonal($aktiv, $fix, $verwendung, $personaccount = null, $uids = null)
+ {
+ $qry = "SELECT DISTINCT ON(mitarbeiter_uid) staatsbuergerschaft, geburtsnation, sprache, anrede, titelpost, titelpre,
+ nachname, vorname, vornamen, gebdatum, gebort, gebzeit, tbl_person.anmerkung AS person_anmerkung, homepage, svnr, ersatzkennzeichen, familienstand,
+ geschlecht, anzahlkinder, tbl_person.insertamum AS person_insertamum, tbl_person.updateamum as person_updateamum,
+ tbl_person.updatevon AS person_updatevon, kompetenzen, kurzbeschreibung, zugangscode, zugangscode_timestamp, bpk,
+ tbl_benutzer.*, tbl_mitarbeiter.*, akt_funk.oe_kurzbz AS funktionale_zuordnung, akt_funk.wochenstunden
+ FROM ((public.tbl_mitarbeiter JOIN public.tbl_benutzer ON(mitarbeiter_uid=uid))
+ JOIN public.tbl_person USING(person_id))
+ LEFT JOIN public.tbl_benutzerfunktion USING(uid)
+ LEFT JOIN public.tbl_benutzerfunktion akt_funk ON tbl_mitarbeiter.mitarbeiter_uid = akt_funk.uid AND akt_funk.funktion_kurzbz = 'fachzuordnung'
+ AND (akt_funk.datum_von IS NULL OR akt_funk.datum_von <= now()) AND (akt_funk.datum_bis IS NULL OR akt_funk.datum_bis >= now())
+ WHERE true";
+
+ if ($fix === true)
+ $qry .= " AND fixangestellt=true";
+ elseif ($fix === false)
+ $qry .= " AND fixangestellt=false";
+
+ if ($aktiv === true)
+ $qry .= " AND tbl_benutzer.aktiv=true";
+ elseif ($aktiv === false)
+ $qry .= " AND tbl_benutzer.aktiv=false";
+
+ if ($verwendung === true)
+ {
+ $qry.=" AND EXISTS(SELECT * FROM bis.tbl_bisverwendung WHERE (ende>now() or ende is null) AND tbl_bisverwendung.mitarbeiter_uid=tbl_mitarbeiter.mitarbeiter_uid)";
+ }
+ elseif ($verwendung === false)
+ {
+ $qry.=" AND NOT EXISTS(SELECT * FROM bis.tbl_bisverwendung WHERE (ende>now() or ende is null) AND tbl_bisverwendung.mitarbeiter_uid=tbl_mitarbeiter.mitarbeiter_uid)";
+ }
+
+ if ($personaccount === true)
+ $qry .= " AND tbl_mitarbeiter.personalnummer >= 0";
+ elseif ($personaccount === false)
+ $qry .= " AND tbl_mitarbeiter.personalnummer < 0";
+
+ $params = array();
+ if (!isEmptyArray($uids))
+ {
+ $qry .= " AND tbl_mitarbeiter.mitarbeiter_uid IN ?";
+ $params[] = $uids;
+ }
+
+ return $this->execQuery($qry, $params);
+ }
+
+ /**
+ * Gibt ein Array mit den UIDs der Vorgesetzten zurück
+ * @return object
+ */
+ public function getVorgesetzte($uid, $datum_von = null, $datum_bis = null)
+ {
+ $datum_von_var = isset($datum_von) ? '?' : 'now()';
+ $datum_bis_var = isset($datum_bis) ? '?' : 'now()';
+ $qry = "SELECT
+ DISTINCT uid as vorgesetzter
+ FROM
+ public.tbl_benutzerfunktion
+ WHERE
+ funktion_kurzbz='Leitung' AND
+ (datum_von is null OR datum_von<=%s) AND
+ (datum_bis is null OR datum_bis>=%s) AND
+ oe_kurzbz in (SELECT oe_kurzbz
+ FROM public.tbl_benutzerfunktion
+ WHERE
+ funktion_kurzbz='oezuordnung' AND uid=? AND
+ (datum_von is null OR datum_von<=%s) AND
+ (datum_bis is null OR datum_bis>=%s)
+ );";
+
+ $qry = sprintf($qry, $datum_von_var, $datum_bis_var, $datum_von_var, $datum_bis_var);
+
+ $params = array();
+ if (isset($datum_von))
+ $params[] = $datum_von;
+ if (isset($datum_bis))
+ $params[] = $datum_bis;
+
+ $params[] = $uid;
+
+ if (isset($datum_von))
+ $params[] = $datum_von;
+ if (isset($datum_bis))
+ $params[] = $datum_bis;
+
+ return $this->execQuery($qry, $params);
+ }
+
+ /**
+ * Checks if alias exists
+ * @param $kurzbz
+ */
+ public function kurzbzExists($kurzbz)
+ {
+ $this->addSelect('1');
+ $result = $this->loadWhere(array('kurzbz' => $kurzbz));
+
+ if (isSuccess($result))
+ {
+ if (hasData($result))
+ {
+ $result = success(array(true));
+ }
+ else
+ {
+ $result = success(array(false));
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * Generates alias for a uid.
+ * @param $uid
+ * @return array the alias if newly generated
+ */
+ public function generateKurzbz($uid)
+ {
+ $kurzbz = '';
+ $this->addLimit(1);
+ $this->addSelect('vorname, nachname');
+ $this->addJoin('public.tbl_benutzer', 'tbl_mitarbeiter.mitarbeiter_uid = tbl_benutzer.uid');
+ $this->addJoin('public.tbl_person', 'person_id');
+ $nameresult = $this->loadWhere(array('uid' => $uid));
+
+ if (hasData($nameresult))
+ {
+ $kurzbzdata = getData($nameresult);
+ $nachname_clean = sanitizeProblemChars($kurzbzdata[0]->nachname);
+ $vorname_clean = sanitizeProblemChars($kurzbzdata[0]->vorname);
+
+ for ($nn = 6, $vn = 2; $nn != 0; $nn--, $vn++)
+ {
+ $kurzbz = mb_substr($nachname_clean, 0, $nn);
+ $kurzbz .= mb_substr($vorname_clean, 0, $vn);
+
+ $kurzbzexists = $this->kurzbzExists($kurzbz);
+
+ if (hasData($kurzbzexists) && !getData($kurzbzexists)[0])
+ break;
+ }
+
+ $kurzbzexists = $this->kurzbzExists($kurzbz);
+
+ if (hasData($kurzbzexists) && getData($kurzbzexists)[0])
+ return error('No Kurzbezeichnung could be generated');
+ }
+ return success($kurzbz);
+ }
}
diff --git a/application/models/ressource/Zeitaufzeichnung_model.php b/application/models/ressource/Zeitaufzeichnung_model.php
index f887a20a0..b44861d13 100644
--- a/application/models/ressource/Zeitaufzeichnung_model.php
+++ b/application/models/ressource/Zeitaufzeichnung_model.php
@@ -11,4 +11,14 @@ class Zeitaufzeichnung_model extends DB_Model
$this->dbTable = 'campus.tbl_zeitaufzeichnung';
$this->pk = 'zeitaufzeichnung_id';
}
+
+ public function deleteEntriesForCurrentDay()
+ {
+ $today = date('Y-m-d');
+ $qry = "DELETE FROM " . $this->dbTable . "
+ WHERE start >= '" . $today . " 00:00:00'
+ AND start <= '" . $today . " 23:59:59';";
+
+ return $this->execQuery($qry);
+ }
}
diff --git a/application/models/ressource/Zeitsperre_model.php b/application/models/ressource/Zeitsperre_model.php
index 07889e349..350a7be58 100644
--- a/application/models/ressource/Zeitsperre_model.php
+++ b/application/models/ressource/Zeitsperre_model.php
@@ -11,4 +11,13 @@ class Zeitsperre_model extends DB_Model
$this->dbTable = 'campus.tbl_zeitsperre';
$this->pk = 'zeitsperre_id';
}
+
+ public function deleteEntriesForCurrentDay()
+ {
+ $today = date('Y-m-d');
+ $qry = "DELETE FROM " . $this->dbTable . "
+ WHERE vondatum = '" . $today . "';";
+
+ return $this->execQuery($qry);
+ }
}
diff --git a/application/models/system/JobStatuses_model.php b/application/models/system/JobStatuses_model.php
new file mode 100644
index 000000000..82d1ee31b
--- /dev/null
+++ b/application/models/system/JobStatuses_model.php
@@ -0,0 +1,16 @@
+dbTable = 'system.tbl_jobstatuses';
+ $this->pk = 'status';
+ $this->hasSequence = false;
+ }
+}
diff --git a/application/models/system/JobTriggers_model.php b/application/models/system/JobTriggers_model.php
new file mode 100644
index 000000000..176b4f5b1
--- /dev/null
+++ b/application/models/system/JobTriggers_model.php
@@ -0,0 +1,32 @@
+dbTable = 'system.tbl_jobtriggers';
+ $this->pk = array('type', 'status', 'followingType');
+ $this->hasSequence = false;
+ }
+
+ /**
+ *
+ */
+ public function getJobtriggersByTypeStatuses($type, $triggeredStatuses)
+ {
+ $query = 'SELECT jt.type,
+ jt.status,
+ jt.following_type
+ FROM system.tbl_jobtriggers jt
+ WHERE jt.type = ?
+ AND jt.status IN ?
+ ORDER BY jt.type, jt.status';
+
+ return $this->execQuery($query, array($type, $triggeredStatuses));
+ }
+}
diff --git a/application/models/system/JobTypes_model.php b/application/models/system/JobTypes_model.php
new file mode 100644
index 000000000..1d578bcab
--- /dev/null
+++ b/application/models/system/JobTypes_model.php
@@ -0,0 +1,16 @@
+dbTable = 'system.tbl_jobtypes';
+ $this->pk = 'type';
+ $this->hasSequence = false;
+ }
+}
diff --git a/application/models/system/JobsQueue_model.php b/application/models/system/JobsQueue_model.php
new file mode 100644
index 000000000..e35b45cb3
--- /dev/null
+++ b/application/models/system/JobsQueue_model.php
@@ -0,0 +1,15 @@
+dbTable = 'system.tbl_jobsqueue';
+ $this->pk = 'jobid';
+ }
+}
diff --git a/application/views/lehre/lehrauftrag/acceptLehrauftrag.php b/application/views/lehre/lehrauftrag/acceptLehrauftrag.php
index 385845026..e87f0945c 100644
--- a/application/views/lehre/lehrauftrag/acceptLehrauftrag.php
+++ b/application/views/lehre/lehrauftrag/acceptLehrauftrag.php
@@ -189,7 +189,7 @@ $this->load->view(
';
+ }
+
+ // Wenn die Tabelle keine Eintraege hat, wird eine Tabellenzeile mit entsprechender Information angezeigt.
+ if ($count_studiengangszahlung == 0)
+ {
+ echo "
" .$p->t('tools/keineZahlungenVorhanden'). "
";
+ }
+
+ echo '
';
+ }
+ else
+ {
+ echo $p->t('tools/keineZahlungenVorhanden');
+ }
+ echo '';
+?>
diff --git a/cis/private/profile/zahlungen_details.php b/cis/private/profile/zahlungen_details.php
index 650ee81c0..5b56bea8c 100644
--- a/cis/private/profile/zahlungen_details.php
+++ b/cis/private/profile/zahlungen_details.php
@@ -15,9 +15,10 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
- * Authors: Martin Tatzber ,
+ * Authors: Martin Tatzber ,
*/
require_once('../../../config/cis.config.inc.php');
+require_once('../../../config/global.config.inc.php');
require_once('../../../include/functions.inc.php');
require_once('../../../include/konto.class.php');
require_once('../../../include/bankverbindung.class.php');
@@ -28,7 +29,7 @@ require_once('../../../include/benutzer.class.php');
require_once('../../../include/benutzerberechtigung.class.php');
require_once('../../../include/student.class.php');
require_once('../../../include/prestudent.class.php');
-
+
$uid = get_uid();
if(isset($_GET['uid']))
@@ -48,7 +49,7 @@ if(isset($_GET['uid']))
}
else
$getParam='';
-
+
$benutzer = new benutzer();
if(!$benutzer->load($uid))
die('Benutzer nicht gefunden');
@@ -88,7 +89,7 @@ $oe=new organisationseinheit();
$oe->load($studiengang->oe_kurzbz);
$konto->getBuchungstyp();
-$buchungstyp = array();
+$buchungstyp = array();
foreach ($konto->result as $row)
$buchungstyp[$row->buchungstyp_kurzbz]=$row->beschreibung;
@@ -153,7 +154,13 @@ if($bic!='')