diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php
index 717561589..0bac8794f 100644
--- a/application/controllers/jobs/AntragJob.php
+++ b/application/controllers/jobs/AntragJob.php
@@ -412,6 +412,8 @@ class AntragJob extends JOB_Controller
$this->StudierendenantragModel->addSelect('studiensemester_kurzbz');
$this->StudierendenantragModel->addSelect('s.insertamum');
$this->StudierendenantragModel->addSelect('s.insertvon');
+ $this->StudierendenantragModel->addJoin('public.tbl_student pts', 'prestudent_id');
+ $this->StudierendenantragModel->addSelect('pts.student_uid');
$this->StudierendenantragModel->db->where_in(
'public.get_rolle_prestudent(prestudent_id, studiensemester_kurzbz)',
@@ -484,7 +486,7 @@ class AntragJob extends JOB_Controller
$person = current(getData($result));
$email = $studiengang->email;
$dataMail = array(
- 'prestudent' => $antrag->prestudent_id,
+ 'prestudent' => 'UID: ' . $antrag->student_uid . ', PreStudentId: ' . $antrag->prestudent_id,
'studiensemester' => $antrag->studiensemester_kurzbz,
'name' => trim($person->vorname . ' '. $person->nachname),
);
diff --git a/application/controllers/jobs/IssueResolver.php b/application/controllers/jobs/IssueResolver.php
index be66a6b23..f0f13694e 100755
--- a/application/controllers/jobs/IssueResolver.php
+++ b/application/controllers/jobs/IssueResolver.php
@@ -9,7 +9,7 @@ class IssueResolver extends IssueResolver_Controller
{
parent::__construct();
- // set fehler codes which can be resolved by the job
+ // set fehler codes which can be resolved by the job, with own resolver defined
// structure: fehlercode => class (library) name for resolving
$this->_codeLibMappings = array(
'CORE_ZGV_0001' => 'CORE_ZGV_0001',
@@ -30,7 +30,6 @@ class IssueResolver extends IssueResolver_Controller
'CORE_STG_0002' => 'CORE_STG_0002',
'CORE_STG_0003' => 'CORE_STG_0003',
'CORE_STG_0004' => 'CORE_STG_0004',
- 'CORE_STUDENTSTATUS_0001' => 'CORE_STUDENTSTATUS_0001',
'CORE_STUDENTSTATUS_0002' => 'CORE_STUDENTSTATUS_0002',
'CORE_STUDENTSTATUS_0003' => 'CORE_STUDENTSTATUS_0003',
'CORE_STUDENTSTATUS_0004' => 'CORE_STUDENTSTATUS_0004',
@@ -51,5 +50,11 @@ class IssueResolver extends IssueResolver_Controller
'CORE_PERSON_0003' => 'CORE_PERSON_0003',
'CORE_PERSON_0004' => 'CORE_PERSON_0004'
);
+
+ // fehler which are resolved the same way as they are produced
+ // structure: fehlercode => class (library) name for resolving
+ $this->_codeProducerLibMappings = array(
+ 'CORE_STUDENTSTATUS_0001' => 'AbbrecherAktiv',
+ );
}
}
diff --git a/application/controllers/system/MigrateHourlyRate.php b/application/controllers/system/MigrateHourlyRate.php
index 734934ad0..dbc8f1416 100644
--- a/application/controllers/system/MigrateHourlyRate.php
+++ b/application/controllers/system/MigrateHourlyRate.php
@@ -4,14 +4,15 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
class MigrateHourlyRate extends CLI_Controller
{
-
- CONST DEFAULT_OE = 'gst';
CONST DEFAULT_DATE = '1970-01-01';
CONST STUNDENSTAZTYP_LEHRE = 'lehre';
CONST STUNDENSTAZTYP_KALKULATORISCH = 'kalkulatorisch';
+ private $OE_DEFAULT;
private $_ci;
+ protected $configerrors;
+
public function __construct()
{
parent::__construct();
@@ -21,10 +22,37 @@ class MigrateHourlyRate extends CLI_Controller
$this->load->model('codex/Bisverwendung_model', 'BisVerwendungModel');
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
$this->load->model('ressource/Stundensatz_model', 'StundensatzModel');
+
+ $this->load->config('migratecontract');
+
+ $this->OE_DEFAULT = $this->config->item('migratecontract_oe_default');
+ $this->configerrors = array();
+ }
+
+ public function checkConfig()
+ {
+ echo "OE_DEFAULT: " . $this->OE_DEFAULT . "\n";
+
+ $this->checkOE_DEFAULT();
+
+ if( count($this->configerrors) > 0 )
+ {
+ foreach($this->configerrors AS $configerror)
+ {
+ echo $configerror . "\n";
+ }
+ die("Fehler in der Konfiguration. Abbruch!\n");
+ }
+ else
+ {
+ echo "Konfiguration OK.\n";
+ }
}
public function index($user = null)
{
+ $this->checkConfig();
+
echo "Lehre Stundensaetze werden migriert.\n";
$mitarbeiterResult = $this->_getMitarbeiterStunden($user);
if (isError($mitarbeiterResult)) return $mitarbeiterResult;
@@ -61,6 +89,18 @@ class MigrateHourlyRate extends CLI_Controller
}
}
+ protected function checkOE_DEFAULT()
+ {
+ $db = new DB_Model();
+ $oesql = 'SELECT * FROM public.tbl_organisationseinheit WHERE oe_kurzbz = ?';
+ $oeres = $db->execReadOnlyQuery($oesql, array($this->OE_DEFAULT));
+ if( !hasData($oeres) )
+ {
+ $this->configerrors[] = 'Default Organisationseinheit: "'
+ . $this->OE_DEFAULT . '" nicht gefunden.';
+ }
+ }
+
protected function checkIfSAPSyncTableExists()
{
$dbModel = new DB_Model();
@@ -167,7 +207,7 @@ class MigrateHourlyRate extends CLI_Controller
$unternehmenResult = $this->_findUnternehmen($mitarbeiter->uid, "'kstzuordnung', 'oezuordnung'");
}
- $unternehmen = self::DEFAULT_OE;
+ $unternehmen = $this->OE_DEFAULT;
if (hasData($unternehmenResult))
$unternehmen = getData($unternehmenResult)[0]->oe_kurzbz;
diff --git a/application/core/IssueResolver_Controller.php b/application/core/IssueResolver_Controller.php
index 758064ed8..ea278ddb0 100755
--- a/application/core/IssueResolver_Controller.php
+++ b/application/core/IssueResolver_Controller.php
@@ -5,21 +5,18 @@
*/
abstract class IssueResolver_Controller extends JOB_Controller
{
- const CI_PATH = 'application';
- const CI_LIBRARY_FOLDER = 'libraries';
- const EXTENSIONS_FOLDER = 'extensions';
- const ISSUE_RESOLVERS_FOLDER = 'issues/resolvers';
- const CHECK_ISSUE_RESOLVED_METHOD_NAME = 'checkIfIssueIsResolved';
+ // mappings in form fehlercode -> resolverlibrary name, fehler which have explicit resolver class defined
+ protected $_codeLibMappings = [];
- protected $_codeLibMappings;
+ // mappings in form fehlercode -> producer library name, fehler which are resolved the same way they are produced
+ protected $_codeProducerLibMappings = [];
public function __construct()
{
parent::__construct();
+ // pass extension name if calling from extension
$this->load->model('system/Issue_model', 'IssueModel');
-
- $this->load->library('IssuesLib');
}
/**
@@ -27,97 +24,29 @@ abstract class IssueResolver_Controller extends JOB_Controller
*/
public function run()
{
+ $this->load->library(
+ 'issues/PlausicheckResolverLib',
+ [
+ 'extensionName' => $this->_extensionName ?? null,
+ 'codeLibMappings' => $this->_codeLibMappings,
+ 'codeProducerLibMappings' => $this->_codeProducerLibMappings
+ ]
+ );
+
$this->logInfo("Issue resolve job started");
// load open issues with given errorcodes
- $openIssuesRes = $this->IssueModel->getOpenIssues(array_keys($this->_codeLibMappings));
+ $openIssuesRes = $this->IssueModel->getOpenIssues(
+ array_merge(array_keys($this->_codeLibMappings), array_keys($this->_codeProducerLibMappings))
+ );
- // log error if occured
- if (isError($openIssuesRes))
- {
- $this->logError(getError($openIssuesRes));
- }
- else
- {
- // log info if no data found
- if (!hasData($openIssuesRes))
- {
- $this->logInfo("No open issues found");
- }
- else
- {
- $openIssues = getData($openIssuesRes);
+ $openIssues = hasData($openIssuesRes) ? getData($openIssuesRes) : [];
- foreach ($openIssues as $issue)
- {
- // ignore if Fehlercode is not in libmappings (shouldn't be checked)
- if (!isset($this->_codeLibMappings[$issue->fehlercode])) continue;
+ $result = $this->plausicheckresolverlib->resolvePlausicheckIssues($openIssues);
- $libName = $this->_codeLibMappings[$issue->fehlercode];
-
- // add person id and oe kurzbz automatically as params, merge it with additional params
- // decode bewerbung_parameter into assoc array
- $params = array_merge(
- array('issue_id' => $issue->issue_id, 'issue_person_id' => $issue->person_id, 'issue_oe_kurzbz' => $issue->oe_kurzbz),
- isset($issue->behebung_parameter) ? json_decode($issue->behebung_parameter, true) : array()
- );
-
- // if called from extension (extension name set), path includes extension names
- $libRootPath = isset($this->_extensionName) ? self::EXTENSIONS_FOLDER . '/' . $this->_extensionName . '/' : '';
-
- // path for loading issue library
- $issuesLibPath = $libRootPath . self::ISSUE_RESOLVERS_FOLDER . '/';
-
- // file path of library for check if file exists
- $issuesLibFilePath = DOC_ROOT . self::CI_PATH
- . '/' . $libRootPath . self::CI_LIBRARY_FOLDER . '/' . self::ISSUE_RESOLVERS_FOLDER . '/' . $libName . '.php';
-
- // check if library file exists
- if (!file_exists($issuesLibFilePath))
- {
- // log error and continue with next issue if not
- $this->logError("Issue library file " . $issuesLibFilePath . " does not exist");
- continue;
- }
-
- // load library connected to fehlercode
- $this->load->library($issuesLibPath . $libName);
-
- $lowercaseLibName = mb_strtolower($libName);
-
- // check if method is defined in library class
- if (!is_callable(array($this->{$lowercaseLibName}, self::CHECK_ISSUE_RESOLVED_METHOD_NAME)))
- {
- // log error and continue with next issue if not
- $this->logError("Method " . self::CHECK_ISSUE_RESOLVED_METHOD_NAME . " is not defined in library $lowercaseLibName");
- continue;
- }
-
- // call the function for checking for issue resolution
- $issueResolvedRes = $this->{$lowercaseLibName}->{self::CHECK_ISSUE_RESOLVED_METHOD_NAME}($params);
-
- if (isError($issueResolvedRes))
- {
- $this->logError(getError($issueResolvedRes));
- }
- else
- {
- $issueResolvedData = getData($issueResolvedRes);
-
- if ($issueResolvedData === true)
- {
- // set issue to resolved if needed
- $behobenRes = $this->issueslib->setBehoben($issue->issue_id, null);
-
- if (isError($behobenRes))
- $this->logError(getError($behobenRes));
- else
- $this->logInfo("Issue " . $issue->issue_id . " successfully resolved");
- }
- }
- }
- }
- }
+ // log if error, or log info if inserted new issue
+ foreach ($result->errors as $error) $this->logError($error);
+ foreach ($result->infos as $info) $this->logInfo($info);
$this->logInfo("Issue resolve job ended");
}
diff --git a/application/core/PlausiIssueProducer_Controller.php b/application/core/PlausiIssueProducer_Controller.php
index 0dce7a487..5216d284c 100644
--- a/application/core/PlausiIssueProducer_Controller.php
+++ b/application/core/PlausiIssueProducer_Controller.php
@@ -5,61 +5,23 @@
*/
abstract class PlausiIssueProducer_Controller extends JOB_Controller
{
- protected $_fehlerLibMappings;
+ protected $_fehlerLibMappings = [];
protected $_app;
- public function __construct($app = null)
- {
- parent::__construct();
-
- // pass extension name if calling from extension
- $extensionName = isset($this->_extensionName) ? $this->_extensionName : null;
-
- // load libraries
- $this->load->library('issues/PlausicheckProducerLib', array('extensionName' => $extensionName, 'app' => $this->_app));
- $this->load->library('IssuesLib');
- }
-
protected function producePlausicheckIssues($params)
{
+ $this->load->library(
+ 'issues/PlausicheckProducerLib',
+ ['extensionName' => $this->_extensionName ?? null, 'app' => $this->_app, 'fehlerLibMappings' => $this->_fehlerLibMappings]
+ );
+
$this->logInfo("Plausicheck issue producer job started");
- // get the data returned by Plausicheck
- foreach ($this->_fehlerLibMappings as $fehler_kurzbz => $libName)
- {
- // execute the check
- $this->logInfo("Checking " . $fehler_kurzbz . "...");
- $plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue(
- $libName,
- $fehler_kurzbz,
- $params
- );
+ $result = $this->plausicheckproducerlib->producePlausicheckIssues($params);
- if (isError($plausicheckRes)) $this->logError(getError($plausicheckRes));
-
- if (hasData($plausicheckRes))
- {
- $plausicheckData = getData($plausicheckRes);
-
- foreach ($plausicheckData as $plausiData)
- {
- // get the data needed for issue production
- $person_id = isset($plausiData['person_id']) ? $plausiData['person_id'] : null;
- $oe_kurzbz = isset($plausiData['oe_kurzbz']) ? $plausiData['oe_kurzbz'] : null;
- $fehlertext_params = isset($plausiData['fehlertext_params']) ? $plausiData['fehlertext_params'] : null;
- $resolution_params = isset($plausiData['resolution_params']) ? $plausiData['resolution_params'] : null;
-
- // write the issue
- $addIssueRes = $this->issueslib->addFhcIssue($fehler_kurzbz, $person_id, $oe_kurzbz, $fehlertext_params, $resolution_params);
-
- // log if error, or log info if inserted new issue
- if (isError($addIssueRes))
- $this->logError(getError($addIssueRes));
- elseif (hasData($addIssueRes) && is_integer(getData($addIssueRes)))
- $this->logInfo("Plausicheck issue " . $fehler_kurzbz . " successfully produced, person_id: " . $person_id);
- }
- }
- }
+ // log if error, or log info if inserted new issue
+ foreach ($result->errors as $error) $this->logError($error);
+ foreach ($result->infos as $info) $this->logInfo($info);
$this->logInfo("Plausicheck issue producer job stopped");
}
diff --git a/application/libraries/IssuesLib.php b/application/libraries/IssuesLib.php
index 9b3a9de6e..f38303b3c 100644
--- a/application/libraries/IssuesLib.php
+++ b/application/libraries/IssuesLib.php
@@ -246,7 +246,27 @@ class IssuesLib
$fehlertext = vsprintf($fehlertextVorlage, $fehlertext_params);
}
- $openIssuesCountRes = $this->_ci->IssueModel->getOpenIssueCount($fehlercode, $person_id, $oe_kurzbz, $fehlercode_extern);
+ if (isset($resolution_params))
+ {
+ if (is_array($resolution_params))
+ {
+ foreach ($resolution_params as $resolution_key => $resolution_param)
+ {
+ if (!is_string($resolution_key))
+ return error("Invalid parameter for resolution, must be an associative array");
+ }
+ }
+ else
+ return error("Invalid parameters for resolution");
+ }
+
+ $openIssuesCountRes = $this->_ci->IssueModel->getOpenIssueCount(
+ $fehlercode,
+ $person_id,
+ $oe_kurzbz,
+ $fehlercode_extern,
+ $resolution_params
+ );
if (hasData($openIssuesCountRes))
{
@@ -256,20 +276,6 @@ class IssuesLib
if ($openIssueCount == 0)
{
- if (isset($resolution_params))
- {
- if (is_array($resolution_params))
- {
- foreach ($resolution_params as $resolution_key => $resolution_param)
- {
- if (!is_string($resolution_key))
- return error("Invalid parameter for resolution, must be an associative array");
- }
- }
- else
- return error("Invalid parameters for resolution");
- }
-
// insert new issue
return $this->_ci->IssueModel->insert(
array(
diff --git a/application/libraries/issues/PlausicheckProducerLib.php b/application/libraries/issues/PlausicheckProducerLib.php
index 3a51e2b1e..cea9967fb 100644
--- a/application/libraries/issues/PlausicheckProducerLib.php
+++ b/application/libraries/issues/PlausicheckProducerLib.php
@@ -12,18 +12,25 @@ class PlausicheckProducerLib
private $_ci; // ci instance
private $_extensionName; // name of extension
- private $_konfiguration = array(); // configuration parameters
+ private $_konfiguration = []; // configuration parameters
+ private $_fehlerLibMappings = []; // mappings of fehler and libraries for producing them
+ private $_isForResolutionCheck = false; // mappings of fehler and libraries for producing them
public function __construct($params = null)
{
// set extension name if called from extension
if (isset($params['extensionName'])) $this->_extensionName = $params['extensionName'];
+ if (isset($params['fehlerLibMappings'])) $this->_fehlerLibMappings = $params['fehlerLibMappings'];
+ if (isset($params['isForResolutionCheck'])) $this->_isForResolutionCheck = $params['isForResolutionCheck'];
// set application
$app = isset($params['app']) ? $params['app'] : null;
$this->_ci =& get_instance(); // get ci instance
+ // load libraries
+ $this->_ci->load->library('IssuesLib');
+
// load models
$this->_ci->load->model('system/Fehlerkonfiguration_model', 'FehlerkonfigurationModel');
@@ -41,6 +48,52 @@ class PlausicheckProducerLib
}
}
+ /**
+ * Produces multiple plausicheck issues at once and saved them to db.
+ * @param array $params passed to each plausicheck
+ * @return result object with occured error and info
+ */
+ public function producePlausicheckIssues($params)
+ {
+ $result = new StdClass();
+ $result->errors = [];
+ $result->infos = [];
+
+ foreach ($this->_fehlerLibMappings as $fehler_kurzbz => $libName)
+ {
+ $plausicheckRes = $this->producePlausicheckIssue(
+ $libName,
+ $fehler_kurzbz,
+ $params
+ );
+
+ if (hasData($plausicheckRes))
+ {
+ $plausicheckData = getData($plausicheckRes);
+
+ foreach ($plausicheckData as $plausiData)
+ {
+ // get the data needed for issue production
+ $person_id = isset($plausiData['person_id']) ? $plausiData['person_id'] : null;
+ $oe_kurzbz = isset($plausiData['oe_kurzbz']) ? $plausiData['oe_kurzbz'] : null;
+ $fehlertext_params = isset($plausiData['fehlertext_params']) ? $plausiData['fehlertext_params'] : null;
+ $resolution_params = isset($plausiData['resolution_params']) ? $plausiData['resolution_params'] : null;
+
+ // write the issue
+ $addIssueRes = $this->_ci->issueslib->addFhcIssue($fehler_kurzbz, $person_id, $oe_kurzbz, $fehlertext_params, $resolution_params);
+
+ // log if error, or log info if inserted new issue
+ if (isError($addIssueRes))
+ $result->errors[] = getError($addIssueRes);
+ elseif (hasData($addIssueRes) && is_integer(getData($addIssueRes)))
+ $result->infos[] = "Plausicheck issue " . $fehler_kurzbz . " successfully produced, person_id: " . $person_id;
+ }
+ }
+ }
+
+ return $result;
+ }
+
/**
* Executes plausicheck using a given library, returns the result.
* @param $libName string name of library producing the issue
@@ -66,7 +119,10 @@ class PlausicheckProducerLib
$config = isset($this->_konfiguration[$fehler_kurzbz]) ? $this->_konfiguration[$fehler_kurzbz] : null;
// load library connected to fehlercode
- $this->_ci->load->library($issuesLibPath . $libName, $config);
+ $this->_ci->load->library(
+ $issuesLibPath . $libName,
+ ['configurationParams' => $config, 'isForResolutionCheck' => $this->_isForResolutionCheck]
+ );
$lowercaseLibName = mb_strtolower($libName);
diff --git a/application/libraries/issues/PlausicheckResolverLib.php b/application/libraries/issues/PlausicheckResolverLib.php
new file mode 100644
index 000000000..618611cee
--- /dev/null
+++ b/application/libraries/issues/PlausicheckResolverLib.php
@@ -0,0 +1,136 @@
+_extensionName = $params['extensionName'];
+ if (isset($params['codeLibMappings'])) $this->_codeLibMappings = $params['codeLibMappings'];
+ if (isset($params['codeProducerLibMappings'])) $this->_codeProducerLibMappings = $params['codeProducerLibMappings'];
+
+ $this->_ci =& get_instance(); // get ci instance
+
+ $this->_ci->load->library('IssuesLib');
+ $this->_ci->load->library('issues/PlausicheckProducerLib', ['isForResolutionCheck' => true]);
+ }
+
+ /**
+ * Reseolves multiple plausicheck issues at once.
+ * @param array $codeLibMappings contains fehler type to check and library responsible for check (fehlercode => libName)
+ * @param array $openIssues passed issues to resolve
+ * @return result object with occured error and info
+ */
+ public function resolvePlausicheckIssues($openIssues)
+ {
+ $result = new StdClass();
+ $result->errors = [];
+ $result->infos = [];
+
+ foreach ($openIssues as $issue)
+ {
+ // add person id and oe kurzbz automatically as params, merge it with additional params
+ // decode bewerbung_parameter into assoc array
+ $params = array_merge(
+ array('issue_id' => $issue->issue_id, 'issue_person_id' => $issue->person_id, 'issue_oe_kurzbz' => $issue->oe_kurzbz),
+ isset($issue->behebung_parameter) ? json_decode($issue->behebung_parameter, true) : array()
+ );
+
+ $issueResolved = false;
+
+ // ignore if Fehlercode is not in libmappings (shouldn't be checked)
+ if (isset($this->_codeLibMappings[$issue->fehlercode]))
+ {
+ $libName = $this->_codeLibMappings[$issue->fehlercode];
+
+ // if called from extension (extension name set), path includes extension names
+ $libRootPath = isset($this->_extensionName) ? self::EXTENSIONS_FOLDER . '/' . $this->_extensionName . '/' : '';
+
+ // path for loading issue library
+ $issuesLibPath = $libRootPath . self::ISSUE_RESOLVERS_FOLDER . '/';
+
+ // file path of library for check if file exists
+ $issuesLibFilePath = DOC_ROOT . self::CI_PATH
+ . '/' . $libRootPath . self::CI_LIBRARY_FOLDER . '/' . self::ISSUE_RESOLVERS_FOLDER . '/' . $libName . '.php';
+
+ // check if library file exists
+ if (!file_exists($issuesLibFilePath))
+ {
+ // log error and continue with next issue if not
+ $result->errors[] = "Issue library file " . $issuesLibFilePath . " does not exist";
+ continue;
+ }
+
+ // load library connected to fehlercode
+ $this->_ci->load->library($issuesLibPath . $libName);
+
+ $lowercaseLibName = mb_strtolower($libName);
+
+ // check if method is defined in library class
+ if (!is_callable(array($this->_ci->{$lowercaseLibName}, self::CHECK_ISSUE_RESOLVED_METHOD_NAME)))
+ {
+ // log error and continue with next issue if not
+ $result->errors[] = "Method " . self::CHECK_ISSUE_RESOLVED_METHOD_NAME . " is not defined in library $lowercaseLibName";
+ continue;
+ }
+
+ // call the function for checking for issue resolution
+ $issueResolvedRes = $this->_ci->{$lowercaseLibName}->{self::CHECK_ISSUE_RESOLVED_METHOD_NAME}($params);
+
+ if (isError($issueResolvedRes))
+ {
+ $result->errors[] = getError($issueResolvedRes);
+ }
+ else
+ {
+ $issueResolved = getData($issueResolvedRes) === true;
+ }
+ }
+ elseif (isset($this->_codeProducerLibMappings[$issue->fehlercode]))
+ {
+ $libName = $this->_codeProducerLibMappings[$issue->fehlercode];
+
+ $issueResolvedRes = $this->_ci->plausicheckproducerlib->producePlausicheckIssue(
+ $libName,
+ $issue->fehler_kurzbz,
+ $params
+ );
+
+ if (isError($issueResolvedRes))
+ {
+ $result->errors[] = getError($issueResolvedRes);
+ }
+ else
+ {
+ $issueResolved = !hasData($issueResolvedRes);
+ }
+ }
+
+ // set issue to resolved if needed
+ if ($issueResolved)
+ {
+ $behobenRes = $this->_ci->issueslib->setBehoben($issue->issue_id, null);
+
+ if (isError($behobenRes))
+ $result->errors[] = getError($behobenRes);
+ else
+ $result->infos[] = "Issue " . $issue->issue_id . " successfully resolved";
+ }
+ }
+
+ return $result;
+ }
+}
diff --git a/application/libraries/issues/plausichecks/AbbrecherAktiv.php b/application/libraries/issues/plausichecks/AbbrecherAktiv.php
index 9eae389b5..464b77a30 100644
--- a/application/libraries/issues/plausichecks/AbbrecherAktiv.php
+++ b/application/libraries/issues/plausichecks/AbbrecherAktiv.php
@@ -9,83 +9,21 @@ require_once('PlausiChecker.php');
*/
class AbbrecherAktiv extends PlausiChecker
{
- public function executePlausiCheck($params)
- {
- $results = array();
+ protected $_base_sql = "
+ SELECT
+ pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz
+ FROM
+ public.tbl_prestudentstatus pre_status
+ JOIN public.tbl_prestudent pre USING(prestudent_id)
+ JOIN public.tbl_student student USING(prestudent_id)
+ JOIN public.tbl_benutzer benutzer on(benutzer.uid=student.student_uid)
+ JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz
+ WHERE
+ pre_status.status_kurzbz ='Abbrecher'
+ AND benutzer.aktiv=true";
- // get parameters from config
- $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
-
- // pass parameters needed for plausicheck
- $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
-
- // get all students failing the plausicheck
- $prestudentRes = $this->getAbbrecherAktiv($studiengang_kz, null, $exkludierte_studiengang_kz);
-
- if (isError($prestudentRes)) return $prestudentRes;
-
- if (hasData($prestudentRes))
- {
- $prestudents = getData($prestudentRes);
-
- // populate results with data necessary for writing issues
- foreach ($prestudents as $prestudent)
- {
- $results[] = array(
- 'person_id' => $prestudent->person_id,
- 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz,
- 'fehlertext_params' => array('prestudent_id' => $prestudent->prestudent_id),
- 'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id)
- );
- }
- }
-
- // return the results
- return success($results);
- }
-
- /**
- * Abbrecher cannot be active.
- * @param studiengang_kz int if check is to be executed for certain Studiengang
- * @param prestudent_id int if check is to be executed only for one prestudent
- * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check
- * @return success with prestudents or error
- */
- public function getAbbrecherAktiv($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null)
- {
- $params = array();
-
- $qry = "
- SELECT
- pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz
- FROM
- public.tbl_prestudentstatus pre_status
- JOIN public.tbl_prestudent pre USING(prestudent_id)
- JOIN public.tbl_student student USING(prestudent_id)
- JOIN public.tbl_benutzer benutzer on(benutzer.uid=student.student_uid)
- JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz
- WHERE
- pre_status.status_kurzbz ='Abbrecher'
- AND benutzer.aktiv=true";
-
- if (isset($studiengang_kz))
- {
- $qry .= " AND stg.studiengang_kz = ?";
- $params[] = $studiengang_kz;
- }
-
- if (isset($prestudent_id))
- {
- $qry .= " AND pre.prestudent_id = ?";
- $params[] = $prestudent_id;
- }
-
- if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz))
- {
- $qry .= " AND stg.studiengang_kz NOT IN ?";
- $params[] = $exkludierte_studiengang_kz;
- }
-
- return $this->_db->execReadOnlyQuery($qry, $params);
- }
+ protected $_config_params = ['exkludierteStudiengaenge' => " AND stg.studiengang_kz NOT IN ?"];
+ protected $_params_for_checking = ['studiengang_kz' => " AND stg.studiengang_kz = ?", 'prestudent_id' => " AND pre.prestudent_id = ?"];
+ protected $_fehlertext_params = ['prestudent_id'];
+ protected $_resolution_params = ['prestudent_id'];
}
diff --git a/application/libraries/issues/plausichecks/PlausiChecker.php b/application/libraries/issues/plausichecks/PlausiChecker.php
index 086a44cc4..5e9c2469f 100644
--- a/application/libraries/issues/plausichecks/PlausiChecker.php
+++ b/application/libraries/issues/plausichecks/PlausiChecker.php
@@ -6,15 +6,25 @@
abstract class PlausiChecker
{
protected $_ci; // code igniter instance
- protected $_config; // configuration parameters for this plausicheck
+ protected $_config; // all applicable configuration parameters for this plausicheck
protected $_db; // database for queries
- public function __construct($configurationParams = null)
+ protected $_isForResolutionCheck;
+
+ protected $_config_params = []; // name of all config params which should be applied for this plausicheck, with sql [name] => [sql]
+ protected $_params_for_checking = []; // name of all passed params for checking, with sql [name] => [sql]
+
+ protected $_fehlertext_params = []; // parameter names for fehlertext params used for this plausicheck
+ protected $_resolution_params = []; // parameter names for resolution params used for this plausicheck
+
+ public function __construct($params = null)
{
$this->_ci =& get_instance(); // get code igniter instance
// set configuration
- $this->_config = $configurationParams;
+ $this->_config = $params['configurationParams'] ?? [];
+
+ $this->_isForResolutionCheck = $params['isForResolutionCheck'] ?? false;
// get database for queries
$this->_db = new DB_Model();
@@ -25,5 +35,83 @@ abstract class PlausiChecker
* @param $paramsForChecking array parameters needed for executing the check
* @return array with objects which failed the plausi check
*/
- abstract public function executePlausiCheck($paramsForChecking);
+ public function executePlausiCheck($paramsForChecking)
+ {
+ $results = [];
+ $params = [];
+ $qry = $this->_base_sql;
+
+ if ($this->_isForResolutionCheck == true)
+ {
+ foreach ($this->_resolution_params as $resParam)
+ {
+ if (!isset($paramsForChecking[$resParam]))
+ return error("$resParam missing".(isset($paramsForChecking['issue_id']) ? ", issue ID: ".$paramsForChecking['issue_id'] : ""));
+ }
+ }
+
+ // add config params to query
+ if (isset($this->_config_params) && !isEmptyArray($this->_config_params))
+ {
+ foreach ($this->_config_params as $param_name => $param_sql)
+ {
+ if (isset($this->_config[$param_name]))
+ {
+ $qry .= $param_sql;
+ $params[] = $this->_config[$param_name];
+ }
+ }
+ }
+
+ // add check params to query
+ if (isset($this->_params_for_checking) && !isEmptyArray($this->_params_for_checking))
+ {
+ foreach ($this->_params_for_checking as $param_name => $param_sql)
+ {
+ if (isset($paramsForChecking[$param_name]))
+ {
+ $qry .= $param_sql;
+ $params[] = $paramsForChecking[$param_name];
+ }
+ }
+ }
+
+ $result = $this->_db->execReadOnlyQuery($qry, $params);
+
+ if (isError($result)) return $result;
+
+ if (hasData($result))
+ {
+ $data = getData($result);
+
+ // populate results with data necessary for writing issues
+ foreach ($data as $d)
+ {
+ $fehlertext_params = [];
+ $resolution_params = [];
+
+ // add params for error texts
+ foreach ($this->_fehlertext_params as $param)
+ {
+ if (isset($d->{$param})) $fehlertext_params[$param] = $d->{$param};
+ }
+
+ // add params for resolution of issue
+ foreach ($this->_resolution_params as $param)
+ {
+ if (isset($d->{$param})) $resolution_params[$param] = $d->{$param};
+ }
+
+ $results[] = array(
+ 'person_id' => $d->person_id,
+ 'oe_kurzbz' => $d->prestudent_stg_oe_kurzbz,
+ 'fehlertext_params' => $fehlertext_params,
+ 'resolution_params' => $resolution_params
+ );
+ }
+ }
+
+ // return the results
+ return success($results);
+ }
}
diff --git a/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php b/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php
index 309d3dfdc..07c417077 100644
--- a/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php
+++ b/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php
@@ -29,6 +29,9 @@ class Dienstverhaeltnis extends AbstractBestandteil {
protected $updateamum;
protected $updatevon;
+ protected $dvendegrund_kurzbz;
+ protected $dvendegrund_anmerkung;
+
public function __construct()
{
parent::__construct();
@@ -49,6 +52,8 @@ class Dienstverhaeltnis extends AbstractBestandteil {
isset($data->insertvon) && $this->setInsertvon($data->insertvon);
isset($data->updateamum) && $this->setUpdateamum($data->updateamum);
isset($data->updatevon) && $this->setUpdatevon($data->updatevon);
+ isset($data->dvendegrund_kurzbz) && $this->setDvendegrund_kurzbz($data->dvendegrund_kurzbz);
+ isset($data->dvendegrund_anmerkung) && $this->setDvendegrund_anmerkung($data->dvendegrund_anmerkung);
$this->fromdb = false;
}
@@ -64,7 +69,9 @@ class Dienstverhaeltnis extends AbstractBestandteil {
'insertamum' => $this->getInsertamum(),
'insertvon' => $this->getInsertvon(),
'updateamum' => $this->getUpdateamum(),
- 'updatevon' => $this->getUpdatevon()
+ 'updatevon' => $this->getUpdatevon(),
+ 'dvendegrund_kurzbz' => $this->getDvendegrund_kurzbz(),
+ 'dvendegrund_anmerkung' => $this->getDvendegrund_anmerkung()
);
$tmp = array_filter($tmp, function($k) {
@@ -139,6 +146,16 @@ EOTXT;
return $this->updatevon;
}
+ public function getDvendegrund_kurzbz()
+ {
+ return $this->dvendegrund_kurzbz;
+ }
+
+ public function getDvendegrund_anmerkung()
+ {
+ return $this->dvendegrund_anmerkung;
+ }
+
public function setDienstverhaeltnis_id($dienstverhaeltnis_id)
{
$this->markDirty('dienstverhaeltnis_id', $this->dienstverhaeltnis_id, $dienstverhaeltnis_id);
@@ -214,6 +231,20 @@ EOTXT;
return $this;
}
+ public function setDvendegrund_kurzbz($dvendegrund_kurzbz)
+ {
+ $this->markDirty('dvendegrund_kurzbz', $this->dvendegrund_kurzbz, $dvendegrund_kurzbz);
+ $this->dvendegrund_kurzbz = $dvendegrund_kurzbz;
+ return $this;
+ }
+
+ public function setDvendegrund_anmerkung($dvendegrund_anmerkung)
+ {
+ $this->markDirty('dvendegrund_anmerkung', $this->dvendegrund_anmerkung, $dvendegrund_anmerkung);
+ $this->dvendegrund_anmerkung = $dvendegrund_anmerkung;
+ return $this;
+ }
+
public function validate() {
//do Validation here
$ci = get_instance();
diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php b/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php
index 297896a02..b58c514e1 100644
--- a/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php
+++ b/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php
@@ -435,7 +435,7 @@ class VertragsbestandteilLib
return $result;
}
- public function endDienstverhaeltnis(Dienstverhaeltnis $dv, $enddate)
+ public function endDienstverhaeltnis(Dienstverhaeltnis $dv, $enddate, $dvendegrund_kurzbz=null, $dvendegrund_anmerkung=null)
{
if( $dv->getBis() !== null && $dv->getBis() < $enddate )
{
@@ -460,6 +460,14 @@ class VertragsbestandteilLib
$this->endVertragsbestandteil($vb, $enddate);
}
+ if( $dvendegrund_kurzbz !== null )
+ {
+ $dv->setDvendegrund_kurzbz($dvendegrund_kurzbz);
+ }
+ if( $dvendegrund_anmerkung !== null )
+ {
+ $dv->setDvendegrund_anmerkung($dvendegrund_anmerkung);
+ }
$dv->setBis($enddate);
$this->updateDienstverhaeltnis($dv);
diff --git a/application/models/organisation/Organisationseinheit_model.php b/application/models/organisation/Organisationseinheit_model.php
index bec4aee47..4a64ee055 100644
--- a/application/models/organisation/Organisationseinheit_model.php
+++ b/application/models/organisation/Organisationseinheit_model.php
@@ -188,4 +188,20 @@ class Organisationseinheit_model extends DB_Model
}
return $this->loadWhere($condition);
}
+
+ /**
+ * Get OEs by eventQuery string. Use with autocomplete event queries.
+ * @param $eventQuery String
+ * @return array
+ */
+ public function getAutocompleteSuggestions($eventQuery)
+ {
+ $this->addSelect('oe_kurzbz');
+ $this->addSelect('organisationseinheittyp_kurzbz, oe_kurzbz, bezeichnung, aktiv, lehre');
+ $this->addOrder('organisationseinheittyp_kurzbz, bezeichnung');
+
+ return $this->loadWhere("
+ oe_kurzbz ILIKE '%". $this->escapeLike($eventQuery). "%'
+ ");
+ }
}
diff --git a/application/models/system/Issue_model.php b/application/models/system/Issue_model.php
index ab1f9ba6e..331b0f050 100644
--- a/application/models/system/Issue_model.php
+++ b/application/models/system/Issue_model.php
@@ -22,13 +22,23 @@ class Issue_model extends DB_Model
*/
public function getOpenIssues($fehlercodes, $person_id = null, $oe_kurzbz = null, $fehlercode_extern = null)
{
- $params = array($fehlercodes);
+ $params = array();
// issue exists for a fehlercode (or fehlercode_extern), person_id, oe_kurzbz, if not verarbeitet yet
- $qry = 'SELECT issue_id, fehlercode, inhalt, fehlercode_extern, inhalt_extern, person_id, oe_kurzbz,
- behebung_parameter, datum, verarbeitetvon, verarbeitetamum
- FROM system.tbl_issue
- WHERE fehlercode IN ?
- AND verarbeitetamum IS NULL';
+ $qry = 'SELECT
+ iss.issue_id, iss.fehlercode, fe.fehler_kurzbz, iss.inhalt, iss.fehlercode_extern,
+ iss.inhalt_extern, iss.person_id, iss.oe_kurzbz, iss.behebung_parameter,
+ iss.datum, iss.verarbeitetvon, iss.verarbeitetamum
+ FROM
+ system.tbl_issue iss
+ JOIN system.tbl_fehler fe USING (fehlercode)
+ WHERE
+ verarbeitetamum IS NULL';
+
+ if (!isEmptyArray($fehlercodes))
+ {
+ $qry .= ' AND fehlercode IN ?';
+ $params[] = $fehlercodes;
+ }
if (!isEmptyString($fehlercode_extern))
{
@@ -59,7 +69,7 @@ class Issue_model extends DB_Model
* @param string $fehlercode_extern if provided, only issues with this external fehlercode are counted (for identifying issues from external systems).
* @return Object success with number of issues or error
*/
- public function getOpenIssueCount($fehlercode, $person_id = null, $oe_kurzbz = null, $fehlercode_extern = null)
+ public function getOpenIssueCount($fehlercode, $person_id = null, $oe_kurzbz = null, $fehlercode_extern = null, $behebung_parameter = null)
{
$params = array($fehlercode);
// issue exists for a fehlercode (or fehlercode_extern), person_id, oe_kurzbz, if not verarbeitet yet
@@ -85,6 +95,19 @@ class Issue_model extends DB_Model
$params[] = $oe_kurzbz;
}
+ if (isset($behebung_parameter) && !isEmptyArray($behebung_parameter))
+ {
+ // convert array to JSON string for postgres
+ $behebung_parameter_string = json_encode($behebung_parameter);
+
+ if ($behebung_parameter_string)
+ {
+ // check if jsonb value is equal to the passed parameters array (if value contains array and array contains value)
+ $qry .= ' AND behebung_parameter @> ? AND behebung_parameter <@ ?';
+ $params = array_merge($params, array($behebung_parameter_string, $behebung_parameter_string));
+ }
+ }
+
return $this->execQuery($qry, $params);
}
}
diff --git a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php
index 2fdfcffe2..6827beaa4 100644
--- a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php
+++ b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php
@@ -31,9 +31,13 @@ class Dienstverhaeltnis_model extends DB_Model
org.bezeichnung oe_bezeichnung,
dv.von,
dv.bis,
+ dv.dvendegrund_kurzbz,
+ dv.dvendegrund_anmerkung,
dv.vertragsart_kurzbz,
dv.updateamum,
- dv.updatevon
+ dv.updatevon,
+ dv.dvendegrund_kurzbz,
+ dv.dvendegrund_anmerkung
FROM tbl_mitarbeiter
JOIN tbl_benutzer ON tbl_mitarbeiter.mitarbeiter_uid::text = tbl_benutzer.uid::text
JOIN tbl_person USING (person_id)
diff --git a/application/views/templates/FHC-Footer.php b/application/views/templates/FHC-Footer.php
index 3daac26cd..31e610289 100644
--- a/application/views/templates/FHC-Footer.php
+++ b/application/views/templates/FHC-Footer.php
@@ -127,6 +127,11 @@
generateJSsInclude('vendor/npm-asset/primevue/autocomplete/autocomplete.min.js');
generateJSsInclude('vendor/npm-asset/primevue/overlaypanel/overlaypanel.min.js');
generateJSsInclude('vendor/npm-asset/primevue/datatable/datatable.min.js');
+ // TODO check ob notwendig
+ generateJSsInclude('vendor/npm-asset/primevue/toast/toast.min.js');
+ generateJSsInclude('vendor/npm-asset/primevue/toastservice/toastservice.min.js');
+ generateJSsInclude('vendor/npm-asset/primevue/confirmdialog/confirmdialog.min.js');
+ generateJSsInclude('vendor/npm-asset/primevue/confirmationservice/confirmationservice.min.js');
}
// --------------------------------------------------------------------------------------------------------
diff --git a/cis/private/lvplan/stpl_week.php b/cis/private/lvplan/stpl_week.php
index e58ce03ed..f600c6db5 100644
--- a/cis/private/lvplan/stpl_week.php
+++ b/cis/private/lvplan/stpl_week.php
@@ -270,7 +270,7 @@ if (isset($_POST['titel']))
foreach($addon_obj->result as $addon)
{
if(file_exists('../../../addons/'.$addon->kurzbz.'/cis/init.js.php'))
- echo '';
+ echo '';
}
// Wenn Seite fertig geladen ist Addons aufrufen
diff --git a/content/lvplanung/lehrveranstaltungnotenoverlay.xul.php b/content/lvplanung/lehrveranstaltungnotenoverlay.xul.php
index 925f744fb..033bd7344 100644
--- a/content/lvplanung/lehrveranstaltungnotenoverlay.xul.php
+++ b/content/lvplanung/lehrveranstaltungnotenoverlay.xul.php
@@ -122,7 +122,7 @@ echo "
+ sort="rdf:http://www.technikum-wien.at/zeugnisnote/rdf#verband" />