Merge branch 'master' into feature-40896/kennzeichnung_unruly_person

This commit is contained in:
Harald Bamberger
2024-09-26 16:16:24 +02:00
17 changed files with 584 additions and 324 deletions
+21 -5
View File
@@ -5,8 +5,12 @@ if (! defined("BASEPATH")) exit("No direct script access allowed");
class UHSTAT1 extends FHC_Controller
{
const BERECHTIGUNG_UHSTAT_VERWALTEN = 'student/uhstat1daten_verwalten';
const LOGIN_SESSION_INDEX = 'bewerbung/user';
const PERSON_ID_SESSION_INDEX = 'bewerbung/personId';
const CODEX_OESTERREICH = 'A';
const CODEX_UNKNOWN_YEAR = 9999;
const CODEX_UNKNOWN_NATION = 'XXX';
const CODEX_UNKNOWN_BILDUNGMAX = 999;
const LOWER_BOUNDARY_YEARS = 160;
const UPPER_BOUNDARY_YEARS = 20;
@@ -210,7 +214,9 @@ class UHSTAT1 extends FHC_Controller
else
return true;
if (!isset($bildungsstaat)) return true;
// if no Bildungsstaat or Bildungmax unknown - valid
if (!isset($bildungsstaat) || $bildungmax == self::CODEX_UNKNOWN_BILDUNGMAX) return true;
// find out if abschluss is in Austria
$this->AbschlussModel->addSelect("in_oesterreich");
@@ -219,8 +225,11 @@ class UHSTAT1 extends FHC_Controller
if (hasData($abschlussRes))
{
$in_oesterreich = getData($abschlussRes)[0]->in_oesterreich;
// invalid if abschluss in Austria, but not Bildungsstaat, or abschluss not in Austria, but Bildungsstaat in Austria
return ($in_oesterreich && $bildungsstaat == self::CODEX_OESTERREICH) || (!$in_oesterreich && $bildungsstaat != self::CODEX_OESTERREICH);
// valid if Bildungsstaat and Abschluss in Austria, or Bildungsstaat and Abschluss not in Austria
// (or Abschluss not in Austria and Bildungsstaat unknown)
return ($in_oesterreich && $bildungsstaat == self::CODEX_OESTERREICH)
|| (!$in_oesterreich && ($bildungsstaat != self::CODEX_OESTERREICH || $bildungsstaat == self::CODEX_UNKNOWN_NATION));
}
return false;
@@ -363,7 +372,11 @@ class UHSTAT1 extends FHC_Controller
// get realistic birth years, dated back from current year
$currYear = date("Y");
$formMetaData['jahre'] = range($currYear - self::UPPER_BOUNDARY_YEARS, $currYear - self::LOWER_BOUNDARY_YEARS);
$yearRange = range($currYear - self::UPPER_BOUNDARY_YEARS, $currYear - self::LOWER_BOUNDARY_YEARS);
$formMetaData['jahre'] = array_combine($yearRange, $yearRange);
// add "unknown" option
$formMetaData['jahre'][self::CODEX_UNKNOWN_YEAR] = 'unbekannt';
return success($formMetaData);
}
@@ -411,7 +424,10 @@ class UHSTAT1 extends FHC_Controller
private function _getValidPersonId($berechtigungsArt)
{
// if coming from bewerbungstool - person id is in session (person must be logged in bewerbungstool)
if (isset($_SESSION[self::PERSON_ID_SESSION_INDEX]) && is_numeric($_SESSION[self::PERSON_ID_SESSION_INDEX]))
if (isset($_SESSION[self::PERSON_ID_SESSION_INDEX])
&& is_numeric($_SESSION[self::PERSON_ID_SESSION_INDEX])
&& isset($_SESSION[self::LOGIN_SESSION_INDEX])
)
return $_SESSION[self::PERSON_ID_SESSION_INDEX];
// if person id passed directly...
@@ -9,8 +9,8 @@ class IssueResolver extends IssueResolver_Controller
{
parent::__construct();
// set fehler codes which can be resolved by the job
// structure: fehlercode => class (library) name for resolving
// set fehler codes which can be resolved by the job, with own resolver defined
// structure: fehlercode => class (library) name for resolving in "resolvers" folder
$this->_codeLibMappings = array(
'CORE_ZGV_0001' => 'CORE_ZGV_0001',
'CORE_ZGV_0002' => 'CORE_ZGV_0002',
@@ -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 by the job the same way as they are produced
// structure: fehlercode => class (library) name for resolving in "plausichecks" folder
$this->_codeProducerLibMappings = array(
'CORE_STUDENTSTATUS_0001' => 'AbbrecherAktiv',
);
}
}
@@ -51,7 +51,7 @@ class OneTimeMessages extends JOB_Controller
FROM public.tbl_prestudent p
JOIN public.tbl_prestudentstatus ps USING (prestudent_id)
JOIN public.tbl_studiengang s USING (studiengang_kz)
WHERE ps.status_kurzbz = \'Wartender\'
WHERE get_rolle_prestudent(ps.prestudent_id, NULL) = \'Wartender\'
AND ps.studiensemester_kurzbz = ?
AND ps.datum <= NOW() - \''.$days.' days\'::interval
AND s.typ = ?
+22 -93
View File
@@ -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");
}
@@ -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");
}
+21 -15
View File
@@ -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(
@@ -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);
@@ -0,0 +1,136 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class PlausicheckResolverLib
{
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';
private $_ci; // ci instance
private $_extensionName; // name of extension
private $_codeLibMappings = []; // mappings for issues which explicitly defined resolver
private $_codeProducerLibMappings = []; // mappings for issues which are resolved as produced
public function __construct($params = null)
{
// set extension name if called from extension
if (isset($params['extensionName'])) $this->_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', ['extensionName' => $this->_extensionName, '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;
}
}
@@ -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'];
}
@@ -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; // if true, additional parameters only needed for resolution are checked
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);
}
}
@@ -25,7 +25,7 @@ class Paabgabe_model extends DB_Model
WHERE projektarbeit_id = ?
AND paabgabetyp_kurzbz = 'end'
AND paabg.abgabedatum IS NOT NULL
ORDER BY paabg.abgabedatum, paabg.datum DESC
ORDER BY paabg.abgabedatum DESC, paabg.datum DESC
LIMIT 1";
return $this->execQuery($qry, array($projektarbeit_id));
@@ -32,11 +32,20 @@ class Geschaeftsjahr_model extends DB_Model
* Gets next Geschaeftsjahr, as determined by its start date
* @return array|null
*/
public function getNextGeschaeftsjahr()
public function getNextGeschaeftsjahr($offsetDays=null)
{
$query = 'SELECT *
FROM public.tbl_geschaeftsjahr
WHERE start > now()
FROM public.tbl_geschaeftsjahr WHERE ';
if(!is_null($offsetDays))
{
$query .= "start > now() - '".$offsetDays." days'::interval";
}
else
{
$query .= 'start > now()';
}
$query .= '
ORDER BY start
LIMIT 1';
+30 -7
View File
@@ -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);
}
}
@@ -0,0 +1,28 @@
<?php
class GehaltsTyp_model extends DB_Model
{
public function __construct()
{
parent::__construct();
$this->dbTable = 'hr.tbl_gehaltstyp';
$this->pk = 'gehaltstyp_kurzbz';
}
/**
* Gets Gehaltstyp for a Gehaltsbestandteil.
* @param int gehaltsbestandteil_id
* @return object the typ
*/
public function getGehaltstypByGehaltsbestandteil($gehaltsbestandteil_id)
{
$gehaltsTyp = null;
$this->addJoin('hr.tbl_gehaltsbestandteil', 'gehaltstyp_kurzbz');
$result = $this->loadWhere(['gehaltsbestandteil_id' => $gehaltsbestandteil_id]);
if (hasData($result)) $gehaltsTyp = getData($result)[0];
return $gehaltsTyp;
}
}
+102 -60
View File
@@ -74,16 +74,23 @@ $saved = isset($saved) && $saved === true;
<div class="form-group">
<label for="mutter_geburtsjahr" class="col-sm-3 control-label"><?php echo ucfirst($this->p->t('uhstat', 'geburtsjahr')) ?></label>
<div class="col-sm-9">
<select type="text" name="mutter_geburtsjahr" id="mutter_geburtsjahr" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['jahre'] as $jahr): ?>
<option
value="<?php echo $jahr ?>"
<?php echo $jahr == $mutter_geburtsjahr ? " selected" : "" ?>>
<?php echo $jahr ?>
</option>
<?php endforeach; ?>
</select>
<div class="input-group">
<select type="text" name="mutter_geburtsjahr" id="mutter_geburtsjahr" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['jahre'] as $jahrKey => $jahr): ?>
<option
value="<?php echo $jahrKey ?>"
<?php echo $jahrKey == $mutter_geburtsjahr ? " selected" : "" ?>>
<?php echo $jahr ?>
</option>
<?php endforeach; ?>
</select>
<span class="input-group-btn">
<button type="button" class="btn btn-default" onclick="document.getElementById('mutter_geburtsjahr').value = 9999; return false;" <?php echo $disabled ?>>
<?php echo $this->p->t('uhstat', 'unbekannt') ?>
</button>
</span>
</div>
<?php echo form_error('mutter_geburtsjahr'); ?>
</div>
</div>
@@ -94,16 +101,23 @@ $saved = isset($saved) && $saved === true;
<?php echo '('.ucfirst($this->p->t('uhstat', 'inDenHeutigenGrenzen')).')' ?>
</label>
<div class="col-sm-9">
<select type="text" name="mutter_geburtsstaat" id="mutter_geburtsstaat" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['nation'] as $nation): ?>
<option
value="<?php echo $nation->nation_code ?>"
<?php echo $mutter_geburtsstaat == $nation->nation_code ? " selected" : "" ?>>
<?php echo $nation->nation_text ?>
</option>
<?php endforeach; ?>
</select>
<div class="input-group">
<select type="text" name="mutter_geburtsstaat" id="mutter_geburtsstaat" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['nation'] as $nation): ?>
<option
value="<?php echo $nation->nation_code ?>"
<?php echo $mutter_geburtsstaat == $nation->nation_code ? " selected" : "" ?>>
<?php echo $nation->nation_text ?>
</option>
<?php endforeach; ?>
</select>
<span class="input-group-btn">
<button type="button" class="btn btn-default" onclick="document.getElementById('mutter_geburtsstaat').value = 'XXX'; return false;" <?php echo $disabled ?>>
<?php echo $this->p->t('uhstat', 'unbekannt') ?>
</button>
</span>
</div>
<?php echo form_error('mutter_geburtsstaat'); ?>
</div>
</div>
@@ -114,16 +128,23 @@ $saved = isset($saved) && $saved === true;
<?php echo '('.ucfirst($this->p->t('uhstat', 'inDenHeutigenGrenzen')).')' ?>
</label>
<div class="col-sm-9">
<select type="text" name="mutter_bildungsstaat" id="mutter_bildungsstaat" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['nation'] as $nation): ?>
<option
value="<?php echo $nation->nation_code ?>"
<?php echo $mutter_bildungsstaat == $nation->nation_code ? " selected" : "" ?>>
<?php echo $nation->nation_text ?>
</option>
<?php endforeach; ?>
</select>
<div class="input-group">
<select type="text" name="mutter_bildungsstaat" id="mutter_bildungsstaat" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['nation'] as $nation): ?>
<option
value="<?php echo $nation->nation_code ?>"
<?php echo $mutter_bildungsstaat == $nation->nation_code ? " selected" : "" ?>>
<?php echo $nation->nation_text ?>
</option>
<?php endforeach; ?>
</select>
<span class="input-group-btn">
<button type="button" class="btn btn-default" onclick="document.getElementById('mutter_bildungsstaat').value = 'XXX'; return false;" <?php echo $disabled ?>>
<?php echo $this->p->t('uhstat', 'unbekannt') ?>
</button>
</span>
</div>
<?php echo form_error('mutter_bildungsstaat'); ?>
</div>
</div>
@@ -161,16 +182,23 @@ $saved = isset($saved) && $saved === true;
<div class="form-group">
<label for="vater_geburtsjahr" class="col-sm-3 control-label"><?php echo ucfirst($this->p->t('uhstat', 'geburtsjahr')) ?></label>
<div class="col-sm-9">
<select type="text" name="vater_geburtsjahr" id="vater_geburtsjahr" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['jahre'] as $jahr): ?>
<option
value="<?php echo $jahr ?>"
<?php echo $vater_geburtsjahr == $jahr ? " selected" : "" ?>>
<div class="input-group">
<select type="text" name="vater_geburtsjahr" id="vater_geburtsjahr" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['jahre'] as $jahrKey => $jahr): ?>
<option
value="<?php echo $jahrKey ?>"
<?php echo $vater_geburtsjahr == $jahrKey ? " selected" : "" ?>>
<?php echo $jahr ?>
</option>
<?php endforeach; ?>
</select>
<?php endforeach; ?>
</select>
<span class="input-group-btn">
<button type="button" class="btn btn-default" onclick="document.getElementById('vater_geburtsjahr').value = 9999; return false;" <?php echo $disabled ?>>
<?php echo $this->p->t('uhstat', 'unbekannt') ?>
</button>
</span>
</div>
<?php echo form_error('vater_geburtsjahr'); ?>
</div>
</div>
@@ -181,16 +209,23 @@ $saved = isset($saved) && $saved === true;
<?php echo '('.ucfirst($this->p->t('uhstat', 'inDenHeutigenGrenzen')).')' ?>
</label>
<div class="col-sm-9">
<select type="text" name="vater_geburtsstaat" id="vater_geburtsstaat" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['nation'] as $nation): ?>
<option
value="<?php echo $nation->nation_code ?>"
<?php echo $vater_geburtsstaat == $nation->nation_code ? " selected" : "" ?>>
<?php echo $nation->nation_text ?>
</option>
<?php endforeach; ?>
</select>
<div class="input-group">
<select type="text" name="vater_geburtsstaat" id="vater_geburtsstaat" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['nation'] as $nation): ?>
<option
value="<?php echo $nation->nation_code ?>"
<?php echo $vater_geburtsstaat == $nation->nation_code ? " selected" : "" ?>>
<?php echo $nation->nation_text ?>
</option>
<?php endforeach; ?>
</select>
<span class="input-group-btn">
<button type="button" class="btn btn-default" onclick="document.getElementById('vater_geburtsstaat').value = 'XXX'; return false;" <?php echo $disabled ?>>
<?php echo $this->p->t('uhstat', 'unbekannt') ?>
</button>
</span>
</div>
<?php echo form_error('vater_geburtsstaat'); ?>
</div>
</div>
@@ -201,16 +236,23 @@ $saved = isset($saved) && $saved === true;
<?php echo '('.ucfirst($this->p->t('uhstat', 'inDenHeutigenGrenzen')).')' ?>
</label>
<div class="col-sm-9">
<select type="text" name="vater_bildungsstaat" id="vater_bildungsstaat" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['nation'] as $nation): ?>
<option
value="<?php echo $nation->nation_code ?>"
<?php echo $vater_bildungsstaat == $nation->nation_code ? " selected" : "" ?>>
<?php echo $nation->nation_text ?>
</option>
<?php endforeach; ?>
</select>
<div class="input-group">
<select type="text" name="vater_bildungsstaat" id="vater_bildungsstaat" class="form-control" <?php echo $disabled ?>>
<option disabled selected value=""><?php echo $this->p->t('uhstat', 'bitteAuswaehlen') ?></option>
<?php foreach ($formMetaData['nation'] as $nation): ?>
<option
value="<?php echo $nation->nation_code ?>"
<?php echo $vater_bildungsstaat == $nation->nation_code ? " selected" : "" ?>>
<?php echo $nation->nation_text ?>
</option>
<?php endforeach; ?>
</select>
<span class="input-group-btn">
<button type="button" class="btn btn-default" onclick="document.getElementById('vater_bildungsstaat').value = 'XXX'; return false;" <?php echo $disabled ?>>
<?php echo $this->p->t('uhstat', 'unbekannt') ?>
</button>
</span>
</div>
<?php echo form_error('vater_bildungsstaat'); ?>
</div>
</div>
@@ -271,7 +313,7 @@ $saved = isset($saved) && $saved === true;
</div>
</form>
<?php endif; ?>
</div>
</div>
</div> <!-- subcontainer -->
</div> <!-- container -->
<?php $this->load->view('templates/FHC-Footer'); ?>
+3 -3
View File
@@ -1014,9 +1014,9 @@ if ($projekt->getProjekteMitarbeiter($user, true))
}
echo " <a href='".$_SERVER['PHP_SELF']."?projektübersichtexport=1".($passuid ? '&uid='.$user : '')."' style='font-size: larger;'>Projektübersichtexport</a>";
if($anzprojekte > 0)
echo "<a style='font-size: larger; text-decoration: none; cursor: default'> | </a><a href='".$_SERVER['PHP_SELF']."?projektexport=1".($passuid ? '&uid='.$user : '')."' style='font-size: larger;'>".$p->t("zeitaufzeichnung/projektexport")."</a>";
echo "</td>
//if($anzprojekte > 0)
echo "<a style='font-size: larger; text-decoration: none; cursor: default'> | </a><a href='".$_SERVER['PHP_SELF']."?projektexport=1".($passuid ? '&uid='.$user : '')."' style='font-size: larger;'>".$p->t("zeitaufzeichnung/projektexport")."</a>";
echo "</td>
<td class='menubox' height='10px'>";
if ($p->t("dms_link/handbuchZeitaufzeichnung")!='')
{
+23 -1
View File
@@ -25373,7 +25373,7 @@ array(
'insertvon' => 'system'
)
)
),
),
array(
'app' => 'personalverwaltung',
'category' => 'gehaltsband',
@@ -30285,6 +30285,28 @@ array(
)
)
),
// Betriebsmittel end
array(
'app' => 'core',
'category' => 'uhstat',
'phrase' => 'unbekannt',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'unbekannt',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'unknown',
'description' => '',
'insertvon' => 'system'
)
)
)
);