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/lehre/Pruefungsprotokoll.php b/application/controllers/lehre/Pruefungsprotokoll.php index 594d3a9e1..d9793ef06 100644 --- a/application/controllers/lehre/Pruefungsprotokoll.php +++ b/application/controllers/lehre/Pruefungsprotokoll.php @@ -51,7 +51,14 @@ class Pruefungsprotokoll extends Auth_Controller public function index() { $this->load->library('WidgetLib'); - $this->load->view('lehre/pruefungsprotokollUebersicht.php'); + + // 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); } /** 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/JQW_Controller.php b/application/core/JQW_Controller.php new file mode 100644 index 000000000..ab63e7ffd --- /dev/null +++ b/application/core/JQW_Controller.php @@ -0,0 +1,129 @@ +load->library('LogLib', array( + 'classIndex' => 5, + 'functionIndex' => 5, + 'lineIndex' => 4, + 'dbLogType' => 'job', // required + 'dbExecuteUser' => 'Jobs queue system' + )); + + // 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..f909c7083 100644 --- a/application/libraries/FilterWidgetLib.php +++ b/application/libraries/FilterWidgetLib.php @@ -93,6 +93,7 @@ class FilterWidgetLib const OP_NOT_SET = 'nset'; // Filter options values + const OPT_HOURS = 'hours'; const OPT_DAYS = 'days'; const OPT_MONTHS = 'months'; @@ -884,7 +885,8 @@ 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_HOURS + || $filterDefinition->option == self::OPT_DAYS || $filterDefinition->option == self::OPT_MONTHS)) { $condition = '< (NOW() - \''.$filterDefinition->condition.' '.$filterDefinition->option.'\'::interval)'; @@ -899,7 +901,8 @@ 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_HOURS + || $filterDefinition->option == self::OPT_DAYS || $filterDefinition->option == self::OPT_MONTHS)) { $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/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 f023c9150..17824bbb8 100644 --- a/application/models/CL/Messages_model.php +++ b/application/models/CL/Messages_model.php @@ -284,9 +284,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). @@ -294,6 +296,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, 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..eae38a49e 100644 --- a/application/models/crm/Konto_model.php +++ b/application/models/crm/Konto_model.php @@ -11,4 +11,58 @@ 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' => $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 2762496f9..268e786cb 100644 --- a/application/models/education/Abschlusspruefung_model.php +++ b/application/models/education/Abschlusspruefung_model.php @@ -26,7 +26,7 @@ class Abschlusspruefung_model extends DB_Model $abschlusspruefungdata = array(); - $this->addSelect('tbl_abschlusspruefung.abschlusspruefung_id, tbl_abschlusspruefung.datum, tbl_abschlusspruefung.abschlussbeurteilung_kurzbz, tbl_abschlusspruefung.uhrzeit AS pruefungsbeginn, tbl_abschlusspruefung.endezeit AS pruefungsende, + $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, @@ -71,29 +71,42 @@ class Abschlusspruefung_model extends DB_Model $abschlusspruefungdata->studiengang_kz = $studienordnungdata->studiengang_kz; $abschlusspruefungdata->studiengangbezeichnung = $studienordnungdata->studiengangbezeichnung; $abschlusspruefungdata->studiengangbezeichnung_englisch = $studienordnungdata->studiengangbezeichnung_englisch; - - $this->StudiengangModel->addSelect('typ'); - $typ = $this->StudiengangModel->load($studienordnungdata->studiengang_kz); - if (isError($typ)) - return $typ; - elseif (hasData($typ)) + } + // 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->studiengangstyp = getData($typ)[0]->typ; + $abschlusspruefungdata->studiengang_kz = $result->studiengang_kz; + $abschlusspruefungdata->studiengangbezeichnung = $result->bezeichnung; + $abschlusspruefungdata->studiengangbezeichnung_englisch = $result->english; } - - // get Abschlussarbeit + } + + // 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, $studienordnungdata->studiengang_kz, null, $projekttyp, true); + $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; - } + $abschlussarbeit = getData($abschlussarbeit)[0]; + $abschlusspruefungdata->projektarbeit_studiengangstyp_name = $abschlussarbeit->projekttyp_kurzbz; + $abschlusspruefungdata->abschlussarbeit_titel = $abschlussarbeit->titel; + $abschlusspruefungdata->abschlussarbeit_note = $abschlussarbeit->note; + } } } } 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..45edf5122 100644 --- a/application/models/person/Benutzer_model.php +++ b/application/models/person/Benutzer_model.php @@ -33,4 +33,67 @@ class Benutzer_model extends DB_Model 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..50ef18e15 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,113 @@ 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)); + } } 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..abf71e1b9 100644 --- a/application/models/ressource/Mitarbeiter_model.php +++ b/application/models/ressource/Mitarbeiter_model.php @@ -40,4 +40,159 @@ 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) + { + $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"; + + return $this->execQuery($qry); + } + + /** + * 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(
- studiengangstyp == 'b' ? $this->p->t('abschlusspruefung', 'abgehaltenAmBachelor') : $this->p->t('abschlusspruefung', 'abgehaltenAmMaster'); ?> + studiengangstyp == 'Bachelor' ? $this->p->t('abschlusspruefung', 'abgehaltenAmBachelor') : $this->p->t('abschlusspruefung', 'abgehaltenAmMaster'); ?> studiengangbezeichnung : $abschlusspruefung->studiengangbezeichnung_englisch ?>, p->t('abschlusspruefung', 'studiengangskennzahl') ?> studiengang_kz ?>
@@ -156,7 +156,7 @@ $this->load->view( p->t('abschlusspruefung', 'pruefungsgegenstand') ?>'.$p->t("zeitaufzeichnung/fiktiveNormalarbeitszeit").'
'; } echo ''.$p->t("urlaubstool/meineZeitsperren").'
'; - echo " + echo $p->t("zeitaufzeichnung/supportAnfragen"); + echo ' - "; + '; echo '| ';
diff --git a/config/global.config-default.inc.php b/config/global.config-default.inc.php
index e377f0424..95bfd98e1 100644
--- a/config/global.config-default.inc.php
+++ b/config/global.config-default.inc.php
@@ -294,4 +294,10 @@ define('STUDIENGANG_KZ_QUALIFIKATIONKURSE', null);
// Gibt an ob der Login ins Testtool ueber das Bewerbungstool stattfindet oder nicht
define('TESTTOOL_LOGIN_BEWERBUNGSTOOL', false);
+
+// Prueft ob Buchungen bereits ins SAP uebertragen wurden und sperrt ggf die Bearbeitung
+define('BUCHUNGEN_CHECK_SAP', true);
+
+// Gibt an, ob im FAS die Zahlungsbestaetigungen zum Download / im CIS generell die Zahlungen angezeigt werden
+define ('ZAHLUNGSBESTAETIGUNG_ANZEIGEN', true);
?>
diff --git a/config/vilesci.config-default.inc.php b/config/vilesci.config-default.inc.php
index 1647cb59a..9654ce79a 100644
--- a/config/vilesci.config-default.inc.php
+++ b/config/vilesci.config-default.inc.php
@@ -249,4 +249,7 @@ define('BIS_FUNKTIONSCODE_6_ARR', array(
'Team'
));
+// bPk Abfrage
+define('BPK_FUER_ALLE_BENUTZER_ABFRAGEN', false);
+
?>
diff --git a/content/student/studentDBDML.php b/content/student/studentDBDML.php
index 3c0a72875..097bc5134 100644
--- a/content/student/studentDBDML.php
+++ b/content/student/studentDBDML.php
@@ -280,6 +280,35 @@ function NotePruefungAnlegen($studiensemester_kurzbz, $student_uid, $lehrveranst
}
}
+/**
+ * Prueft ob die Kontobuchung bereits ins SAP Ubertragen wurde oder noch geändert werden darf
+ */
+function isBuchungAllowedToChange($buchung_obj)
+{
+ global $db;
+
+ if(defined('BUCHUNGEN_CHECK_SAP') && BUCHUNGEN_CHECK_SAP == true)
+ {
+ $qry = "SELECT * FROM sync.tbl_sap_salesorder WHERE buchungsnr=".$db->db_add_param($buchung_obj->buchungsnr);
+ if ($buchung_obj->buchungsnr_verweis != '')
+ $qry .= " OR buchungsnr=".$db->db_add_param($buchung_obj->buchungsnr_verweis);
+
+ if ($result = $db->db_query($qry))
+ {
+ if($db->db_num_rows($result) > 0)
+ {
+ return false;
+ }
+ else
+ return true;
+ }
+ else
+ return false;
+ }
+ else
+ return true;
+}
+
if(!$error)
{
@@ -1952,27 +1981,35 @@ if(!$error)
}
else
{
- $buchung->betrag = $_POST['betrag'];
- $buchung->buchungsdatum = $_POST['buchungsdatum'];
- $buchung->buchungstext = $_POST['buchungstext'];
- $buchung->mahnspanne = $_POST['mahnspanne'];
- $buchung->buchungstyp_kurzbz = $_POST['buchungstyp_kurzbz'];
- $buchung->studiensemester_kurzbz = $_POST['studiensemester_kurzbz'];
- $buchung->studiengang_kz = $_POST['studiengang_kz'];
- $buchung->credit_points = $_POST['credit_points'];
- $buchung->new = false;
- $buchung->updateamum = date('Y-m-d H:i:s');
- $buchung->updatevon = $user;
- $buchung->anmerkung = $_POST['anmerkung'];
-
- if($buchung->save())
+ if(isBuchungAllowedToChange($buchung))
{
- $return = true;
+ $buchung->betrag = $_POST['betrag'];
+ $buchung->buchungsdatum = $_POST['buchungsdatum'];
+ $buchung->buchungstext = $_POST['buchungstext'];
+ $buchung->mahnspanne = $_POST['mahnspanne'];
+ $buchung->buchungstyp_kurzbz = $_POST['buchungstyp_kurzbz'];
+ $buchung->studiensemester_kurzbz = $_POST['studiensemester_kurzbz'];
+ $buchung->studiengang_kz = $_POST['studiengang_kz'];
+ $buchung->credit_points = $_POST['credit_points'];
+ $buchung->new = false;
+ $buchung->updateamum = date('Y-m-d H:i:s');
+ $buchung->updatevon = $user;
+ $buchung->anmerkung = $_POST['anmerkung'];
+
+ if($buchung->save())
+ {
+ $return = true;
+ }
+ else
+ {
+ $return = false;
+ $errormsg = 'Fehler beim Speichern:'.$buchung->errormsg;
+ }
}
else
{
$return = false;
- $errormsg = 'Fehler beim Speichern:'.$buchung->errormsg;
+ $errormsg = 'Buchung wurde bereits übertragen und darf nicht geändert werden';
}
}
}
@@ -2025,26 +2062,34 @@ if(!$error)
{
if($buchung->buchungsnr_verweis=='')
{
- $kto = new konto();
- //$buchung->betrag*(-1);
- $buchung->betrag = $kto->getDifferenz($buchungsnr);
- $buchung->buchungsdatum = $gegenbuchungsdatum;
- $buchung->mahnspanne = '0';
- $buchung->buchungsnr_verweis = $buchung->buchungsnr;
- $buchung->new = true;
- $buchung->insertamum = date('Y-m-d H:i:s');
- $buchung->insertvon = $user;
- $buchung->anmerkung = '';
-
- if($buchung->save())
+ if(isBuchungAllowedToChange($buchung))
{
- //$data = $buchung->buchungsnr;
- $return = true;
+ $kto = new konto();
+ //$buchung->betrag*(-1);
+ $buchung->betrag = $kto->getDifferenz($buchungsnr);
+ $buchung->buchungsdatum = $gegenbuchungsdatum;
+ $buchung->mahnspanne = '0';
+ $buchung->buchungsnr_verweis = $buchung->buchungsnr;
+ $buchung->new = true;
+ $buchung->insertamum = date('Y-m-d H:i:s');
+ $buchung->insertvon = $user;
+ $buchung->anmerkung = '';
+
+ if($buchung->save())
+ {
+ //$data = $buchung->buchungsnr;
+ $return = true;
+ }
+ else
+ {
+ $return = false;
+ $errormsg .= "\n".'Fehler beim Speichern:'.$buchung->errormsg;
+ }
}
else
{
$return = false;
- $errormsg .= "\n".'Fehler beim Speichern:'.$buchung->errormsg;
+ $errormsg .= "\n".'Buchung wurde bereits Übertragen und darf nicht geändert werden';
}
}
else
@@ -2094,14 +2139,23 @@ if(!$error)
}
else
{
- if($buchung->delete($_POST['buchungsnr']))
+ if(isBuchungAllowedToChange($buchung))
{
- $return = true;
+ if($buchung->delete($_POST['buchungsnr']))
+ {
+ $return = true;
+ }
+ else
+ {
+ $errormsg = $buchung->errormsg;
+ $return = false;
+ }
}
else
{
- $errormsg = $buchung->errormsg;
+ $error = true;
$return = false;
+ $errormsg = 'Diese Buchung darf nicht gelöscht werden da diese bereits übertragen wurde';
}
}
}
diff --git a/content/student/studentkontooverlay.xul.php b/content/student/studentkontooverlay.xul.php
index 2cb5f2aae..4682907d2 100644
--- a/content/student/studentkontooverlay.xul.php
+++ b/content/student/studentkontooverlay.xul.php
@@ -195,13 +195,16 @@ echo '';
Supportanfragen unter zeiterfassung@technikum-wien.at'; diff --git a/locale/en-US/zeitaufzeichnung.php b/locale/en-US/zeitaufzeichnung.php index 8d2c217fa..a67a35e4b 100644 --- a/locale/en-US/zeitaufzeichnung.php +++ b/locale/en-US/zeitaufzeichnung.php @@ -62,3 +62,4 @@ $this->phrasen['zeitaufzeichnung/dienstreise']='Business Trip'; $this->phrasen['zeitaufzeichnung/projektphase']='WP'; $this->phrasen['zeitaufzeichnung/pauseEinfuegen']='insert break automatically'; $this->phrasen['zeitaufzeichnung/zeitraumZuKurz']='Timeslot too short for automatic break.'; +$this->phrasen['zeitaufzeichnung/supportAnfragen']=' Contact for support zeiterfassung@technikum-wien.at'; diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index f9d7197aa..33499621d 100644 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -3840,6 +3840,195 @@ if ($result = $db->db_query("SELECT 1 FROM pg_class WHERE relname = 'unq_idx_abl } } +// Creates table system.tbl_jobstatuses if it doesn't exist and grants privileges +if (!$result = @$db->db_query('SELECT 1 FROM system.tbl_jobstatuses LIMIT 1')) +{ + $qry = 'CREATE TABLE system.tbl_jobstatuses ( + status character varying(64) NOT NULL + ); + + COMMENT ON TABLE system.tbl_jobstatuses IS \'All possible job statuses\'; + COMMENT ON COLUMN system.tbl_jobstatuses.status IS \'Job status value and primary key\'; + + ALTER TABLE ONLY system.tbl_jobstatuses ADD CONSTRAINT pk_jobstatuses PRIMARY KEY (status); + + INSERT INTO system.tbl_jobstatuses(status) VALUES(\'new\'); + INSERT INTO system.tbl_jobstatuses(status) VALUES(\'running\'); + INSERT INTO system.tbl_jobstatuses(status) VALUES(\'done\'); + INSERT INTO system.tbl_jobstatuses(status) VALUES(\'failed\'); + '; + + if (!$db->db_query($qry)) + echo 'system.tbl_jobstatuses: '.$db->db_last_error().' '; + else + echo ' system.tbl_jobstatuses table created'; + + $qry = 'GRANT SELECT ON TABLE system.tbl_jobstatuses TO web;'; + if (!$db->db_query($qry)) + echo 'system.tbl_jobstatuses: '.$db->db_last_error().' '; + else + echo ' Granted privileges to web on system.tbl_jobstatuses'; + + $qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE system.tbl_jobstatuses TO vilesci;'; + if (!$db->db_query($qry)) + echo 'system.tbl_jobstatuses: '.$db->db_last_error().' '; + else + echo ' Granted privileges to vilesci on system.tbl_jobstatuses'; +} + +// Creates table system.tbl_jobtypes if it doesn't exist and grants privileges +if (!$result = @$db->db_query('SELECT 1 FROM system.tbl_jobtypes LIMIT 1')) +{ + $qry = 'CREATE TABLE system.tbl_jobtypes ( + type character varying(128) NOT NULL, + description text NOT NULL + ); + + COMMENT ON TABLE system.tbl_jobtypes IS \'All possible job types\'; + COMMENT ON COLUMN system.tbl_jobtypes.type IS \'Job type value and primary key\'; + COMMENT ON COLUMN system.tbl_jobtypes.description IS \'Job type description\'; + + ALTER TABLE ONLY system.tbl_jobtypes ADD CONSTRAINT pk_jobtypes PRIMARY KEY (type); + '; + + if (!$db->db_query($qry)) + echo 'system.tbl_jobtypes: '.$db->db_last_error().' '; + else + echo ' system.tbl_jobtypes table created'; + + $qry = 'GRANT SELECT ON TABLE system.tbl_jobtypes TO web;'; + if (!$db->db_query($qry)) + echo 'system.tbl_jobtypes: '.$db->db_last_error().' '; + else + echo ' Granted privileges to web on system.tbl_jobtypes'; + + $qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE system.tbl_jobtypes TO vilesci;'; + if (!$db->db_query($qry)) + echo 'system.tbl_jobtypes: '.$db->db_last_error().' '; + else + echo ' Granted privileges to vilesci on system.tbl_jobtypes'; +} + +// Creates table system.tbl_jobsqueue if it doesn't exist and grants privileges +if (!$result = @$db->db_query('SELECT 1 FROM system.tbl_jobsqueue LIMIT 1')) +{ + $qry = 'CREATE TABLE system.tbl_jobsqueue ( + jobid integer NOT NULL, + type character varying(128) NOT NULL, + creationtime timestamp without time zone DEFAULT now(), + status character varying(64) NOT NULL, + input jsonb, + output jsonb, + starttime timestamp without time zone, + endtime timestamp without time zone, + insertvon character varying(32), + insertamum timestamp without time zone DEFAULT now() + ); + + COMMENT ON TABLE system.tbl_jobsqueue IS \'Table to schedule/manage the jobs queue\'; + COMMENT ON COLUMN system.tbl_jobsqueue.jobid IS \'Primary key\'; + COMMENT ON COLUMN system.tbl_jobsqueue.type IS \'Job type\'; + COMMENT ON COLUMN system.tbl_jobsqueue.creationtime IS \'Job creation timestamp\'; + COMMENT ON COLUMN system.tbl_jobsqueue.status IS \'Job current status\'; + COMMENT ON COLUMN system.tbl_jobsqueue.input IS \'Job input in JSON format\'; + COMMENT ON COLUMN system.tbl_jobsqueue.output IS \'Job output in JSON format\'; + COMMENT ON COLUMN system.tbl_jobsqueue.starttime IS \'Job start timestamp\'; + COMMENT ON COLUMN system.tbl_jobsqueue.endtime IS \'Job end timestamp\'; + COMMENT ON COLUMN system.tbl_jobsqueue.insertvon IS \'User/Service who/that inserted this record\'; + COMMENT ON COLUMN system.tbl_jobsqueue.insertamum IS \'Record insert time stamp\'; + + CREATE SEQUENCE system.seq_jobsqueue_jobid + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + ALTER SEQUENCE system.seq_jobsqueue_jobid OWNED BY system.tbl_jobsqueue.jobid; + + ALTER TABLE ONLY system.tbl_jobsqueue ALTER COLUMN jobid SET DEFAULT nextval(\'system.seq_jobsqueue_jobid\'::regclass); + + GRANT SELECT, UPDATE ON SEQUENCE system.seq_jobsqueue_jobid TO vilesci; + GRANT SELECT, UPDATE ON SEQUENCE system.seq_jobsqueue_jobid TO fhcomplete; + + ALTER TABLE ONLY system.tbl_jobsqueue ADD CONSTRAINT pk_jobsqueue PRIMARY KEY (jobid); + + ALTER TABLE ONLY system.tbl_jobsqueue ADD CONSTRAINT fk_jobsqueue_status FOREIGN KEY (status) REFERENCES system.tbl_jobstatuses(status) ON UPDATE CASCADE ON DELETE RESTRICT; + + ALTER TABLE ONLY system.tbl_jobsqueue ADD CONSTRAINT fk_jobsqueue_type FOREIGN KEY (type) REFERENCES system.tbl_jobtypes(type) ON UPDATE CASCADE ON DELETE RESTRICT; + '; + + if (!$db->db_query($qry)) + echo 'system.tbl_jobsqueue: '.$db->db_last_error().' '; + else + echo ' system.tbl_jobsqueue table created'; + + $qry = 'GRANT SELECT ON TABLE system.tbl_jobsqueue TO web;'; + if (!$db->db_query($qry)) + echo 'system.tbl_jobsqueue: '.$db->db_last_error().' '; + else + echo ' Granted privileges to web on system.tbl_jobsqueue'; + + $qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE system.tbl_jobsqueue TO vilesci;'; + if (!$db->db_query($qry)) + echo 'system.tbl_jobsqueue: '.$db->db_last_error().' '; + else + echo ' Granted privileges to vilesci on system.tbl_jobsqueue'; +} + +// Creates table system.tbl_jobtriggers if it doesn't exist and grants privileges +if (!$result = @$db->db_query('SELECT 1 FROM system.tbl_jobtriggers LIMIT 1')) +{ + $qry = 'CREATE TABLE system.tbl_jobtriggers ( + type character varying(128) NOT NULL, + status character varying(64) NOT NULL, + following_type character varying(128) NOT NULL + ); + + COMMENT ON TABLE system.tbl_jobtriggers IS \'Table to manage the job triggers\'; + COMMENT ON COLUMN system.tbl_jobtriggers.type IS \'Job type\'; + COMMENT ON COLUMN system.tbl_jobtriggers.status IS \'Job status\'; + COMMENT ON COLUMN system.tbl_jobtriggers.following_type IS \'New job type\'; + + ALTER TABLE ONLY system.tbl_jobtriggers ADD CONSTRAINT pk_jobtriggers PRIMARY KEY (type, status, following_type); + + ALTER TABLE ONLY system.tbl_jobtriggers ADD CONSTRAINT fk_jobtriggers_status FOREIGN KEY (status) REFERENCES system.tbl_jobstatuses(status) ON UPDATE CASCADE ON DELETE RESTRICT; + + ALTER TABLE ONLY system.tbl_jobtriggers ADD CONSTRAINT fk_jobtriggers_type FOREIGN KEY (type) REFERENCES system.tbl_jobtypes(type) ON UPDATE CASCADE ON DELETE RESTRICT; + + ALTER TABLE ONLY system.tbl_jobtriggers ADD CONSTRAINT fk_jobtriggers_following_type FOREIGN KEY (following_type) REFERENCES system.tbl_jobtypes(type) ON UPDATE CASCADE ON DELETE RESTRICT; + '; + + if (!$db->db_query($qry)) + echo 'system.tbl_jobtriggers: '.$db->db_last_error().' '; + else + echo ' system.tbl_jobtriggers table created'; + + $qry = 'GRANT SELECT ON TABLE system.tbl_jobtriggers TO web;'; + if (!$db->db_query($qry)) + echo 'system.tbl_jobtriggers: '.$db->db_last_error().' '; + else + echo ' Granted privileges to web on system.tbl_jobtriggers'; + + $qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE system.tbl_jobtriggers TO vilesci;'; + if (!$db->db_query($qry)) + echo 'system.tbl_jobtriggers: '.$db->db_last_error().' '; + else + echo ' Granted privileges to vilesci on system.tbl_jobtriggers'; +} + +// Add column iso3166_1_a2 to bis.tbl_nation +if (!$result = @$db->db_query("SELECT iso3166_1_a2 FROM bis.tbl_nation LIMIT 1")) +{ + $qry = "ALTER TABLE bis.tbl_nation ADD COLUMN iso3166_1_a2 character varying(2);"; + $qry .= "COMMENT ON COLUMN bis.tbl_nation.iso3166_1_a2 IS 'ISO 3166-1 alpha-2 country code';"; + + if(!$db->db_query($qry)) + echo 'bis.tbl_nation.iso3166_1_a2: '.$db->db_last_error().' '; + else + echo ' bis.tbl_nation.iso3166_1_a2: Spalte iso3166_1_a2 hinzugefuegt'; +} + // Spalte bezeichnung_mehrsprachig in public.tbl_studiengangstyp if(!$result = @$db->db_query("SELECT bezeichnung_mehrsprachig FROM public.tbl_studiengangstyp LIMIT 1")) { @@ -4200,6 +4389,18 @@ if(!$result = @$db->db_query("SELECT sort FROM lehre.tbl_abschlussbeurteilung LI echo ' lehre.tbl_abschlussbeurteilung: Spalte sort hinzugefuegt! '; } +// Add column iso3166_1_a3 to tbl_nation +if(!$result = @$db->db_query("SELECT iso3166_1_a3 FROM bis.tbl_nation LIMIT 1")) +{ + $qry = "ALTER table bis.tbl_nation ADD COLUMN iso3166_1_a3 VARCHAR(3); + COMMENT ON COLUMN bis.tbl_nation.iso3166_1_a3 IS 'ISO 3166-1 alpha-3 country code';"; + + if(!$db->db_query($qry)) + echo 'bis.tbl_nation: '.$db->db_last_error().' '; + else + echo ' bis.tbl_nation: Spalte iso3166_1_a3 hinzugefuegt'; +} + // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo ' Pruefe Tabellen und Attribute!'; @@ -4229,7 +4430,7 @@ $tabellen=array( "bis.tbl_mobilitaet" => array("mobilitaet_id","prestudent_id","mobilitaetstyp_kurzbz","studiensemester_kurzbz","mobilitaetsprogramm_code","gsprogramm_id","firma_id","status_kurzbz","ausbildungssemester","insertvon","insertamum","updatevon","updateamum"), "bis.tbl_mobilitaetstyp" => array("mobilitaetstyp_kurzbz","bezeichnung","aktiv"), "bis.tbl_mobilitaetsprogramm" => array("mobilitaetsprogramm_code","kurzbz","beschreibung","sichtbar","sichtbar_outgoing"), - "bis.tbl_nation" => array("nation_code","entwicklungsstand","eu","ewr","kontinent","kurztext","langtext","engltext","sperre","nationengruppe_kurzbz"), + "bis.tbl_nation" => array("nation_code","entwicklungsstand","eu","ewr","kontinent","kurztext","langtext","engltext","sperre","nationengruppe_kurzbz", "iso3166_1_a2","iso3166_1_a3"), "bis.tbl_nationengruppe" => array("nationengruppe_kurzbz","nationengruppe_bezeichnung","aktiv"), "bis.tbl_orgform" => array("orgform_kurzbz","code","bezeichnung","rolle","bisorgform_kurzbz","bezeichnung_mehrsprachig"), "bis.tbl_verwendung" => array("verwendung_code","verwendungbez"), @@ -4459,6 +4660,10 @@ $tabellen=array( "system.tbl_log" => array("log_id","person_id","zeitpunkt","app","oe_kurzbz","logtype_kurzbz","logdata","insertvon","taetigkeit_kurzbz"), "system.tbl_logtype" => array("logtype_kurzbz", "data_schema"), "system.tbl_filters" => array("filter_id","app","dataset_name","filter_kurzbz","person_id","description","sort","default_filter","filter","oe_kurzbz","statistik_kurzbz"), + "system.tbl_jobsqueue" => array("jobid", "type", "creationtime", "status", "input", "output", "starttime", "endtime", "insertvon", "insertamum"), + "system.tbl_jobstatuses" => array("status"), + "system.tbl_jobtriggers" => array("type", "status", "following_type"), + "system.tbl_jobtypes" => array("type", "description"), "system.tbl_phrase" => array("phrase_id","app","phrase","insertamum","insertvon","category"), "system.tbl_phrasentext" => array("phrasentext_id","phrase_id","sprache","orgeinheit_kurzbz","orgform_kurzbz","text","description","insertamum","insertvon"), "system.tbl_rolle" => array("rolle_kurzbz","beschreibung"), diff --git a/system/filtersupdate.php b/system/filtersupdate.php index 12265eddf..d6bb88976 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -633,6 +633,37 @@ $filters = array( } ', 'oe_kurzbz' => null, + ), + array( + 'app' => 'core', + 'dataset_name' => 'jq', + 'filter_kurzbz' => 'lastHour', + 'description' => '{Last hour queued jobs}', + 'sort' => 1, + 'default_filter' => true, + 'filter' => ' + { + "name": "All jobs queued in the last hour", + "columns": [ + {"name": "JobId"}, + {"name": "CreationTime"}, + {"name": "Type"}, + {"name": "Status"}, + {"name": "StartTime"}, + {"name": "EndTime"}, + {"name": "UserService"} + ], + "filters": [ + { + "name": "CreationTime", + "operation": "lt", + "condition": "1", + "option": "hours" + } + ] + } + ', + 'oe_kurzbz' => null, ) ); diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index c2afb39c8..14d9f4f31 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -7868,6 +7868,106 @@ Any unusual occurrences 'insertvon' => 'system' ) ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'alle', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Alle', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'All', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'heute', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Heute', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Today', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'letzteWoche', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Letzte Woche', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Last week', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'gestern', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Gestern', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Yesterday', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'zeitraum', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Zeitraum', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Period', + 'description' => '', + 'insertvon' => 'system' + ) + ) ) ); diff --git a/vilesci/cronjobs/bpk.php b/vilesci/cronjobs/bpk.php index 2d26634e3..3a7ac4395 100644 --- a/vilesci/cronjobs/bpk.php +++ b/vilesci/cronjobs/bpk.php @@ -75,7 +75,22 @@ else $webservice = new dvb(DVB_USERNAME, DVB_PASSWORD, $debug); -$qry = " +if (defined('BPK_FUER_ALLE_BENUTZER_ABFRAGEN') && BPK_FUER_ALLE_BENUTZER_ABFRAGEN) +{ + $qry = " + SELECT + distinct person_id, vorname, nachname + FROM + public.tbl_person + JOIN public.tbl_benutzer USING(person_id) + WHERE + public.tbl_benutzer.aktiv = true + AND tbl_person.bpk is null + AND gebdatum is not null"; +} +else +{ + $qry = " SELECT distinct person_id, vorname, nachname FROM @@ -89,6 +104,7 @@ $qry = " AND studiengang_kz<10000 AND EXISTS(SELECT 1 FROM public.tbl_prestudent WHERE person_id=tbl_person.person_id AND bismelden=true) AND gebdatum is not null"; +} if ($limit != '') $qry .= " LIMIT ".$limit; |