Merge branch 'master' into Sonstiges-Sprint-176/Anrechnungen_Bugfixes

This commit is contained in:
Andreas Österreicher
2022-01-17 10:32:37 +01:00
137 changed files with 63422 additions and 54628 deletions
@@ -0,0 +1,269 @@
<?php
if (! defined("BASEPATH")) exit("No direct script access allowed");
class Oehbeitrag extends Auth_Controller
{
const STUDIENSEMESTER_START = 'WS2020'; // Öhbeitrage can be assigned beginning with this Studiensemester
public function __construct()
{
parent::__construct(
array(
'index' => 'admin:r',// TODO which Berechtigung?
'getOehbeitraege' => 'admin:r',
'getValidStudiensemester' => 'admin:r',
'addOehbeitrag' => 'admin:rw',
'updateOehbeitrag' => 'admin:rw',
'deleteOehbeitrag' => 'admin:rw'
)
);
$this->load->model('codex/Oehbeitrag_model', 'OehbeitragModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->load->library('WidgetLib');
$this->loadPhrases(
array(
'global',
'ui',
'oehbeitrag'
)
);
}
public function index()
{
$oehbeitraege = array();
$oehbeitragRes = $this->_loadOehbeitraege();
if (isError($oehbeitragRes))
show_error(getError($oehbeitragRes));
if (hasData($oehbeitragRes))
$oehbeitraege = getData($oehbeitragRes);
$this->load->view("codex/oehbeitrag.php", array('oehbeitraege' => $oehbeitraege));
}
/**
* Gets all valid, i.e. unassigned, Studiensemester.
*/
public function getValidStudiensemester()
{
$oehbeitrag_id = $this->input->get('oehbeitrag_id');
$oehbeitrag_id_arr = isset($oehbeitrag_id) ? array($oehbeitrag_id) : null;
$studiensemester = array();
$studiensemesterres = $this->OehbeitragModel->getUnassignedStudiensemester(self::STUDIENSEMESTER_START, $oehbeitrag_id_arr);
if (isError($studiensemesterres))
{
$this->outputJsonError(getError($studiensemesterres));
return;
}
if (hasData($studiensemesterres))
$studiensemester = getData($studiensemesterres);
$this->outputJsonSuccess($studiensemester);
}
/**
* Gets all Öhbeiträge. Wrapper function for output as JSON.
*/
public function getOehbeitraege()
{
$this->outputJson($this->_loadOehbeitraege());
}
/**
* Adds an Öhbeitrag. Checks for errors beforehand.
*/
public function addOehbeitrag()
{
$studierendenbeitrag = $this->input->post('studierendenbeitrag');
$versicherung = $this->input->post('versicherung');
$von_studiensemester_kurzbz = $this->input->post('von_studiensemester_kurzbz');
$bis_studiensemester_kurzbz = $this->input->post('bis_studiensemester_kurzbz');
if ($bis_studiensemester_kurzbz == 'null')
$bis_studiensemester_kurzbz = null;
if (!$this->_checkAmount($studierendenbeitrag))
$this->outputJsonError('Ungültiger Studierendenbeitrag');
elseif (!$this->_checkAmount($versicherung))
$this->outputJsonError('Ungültige Versicherung');
else
{
$vonBisCheck = $this->_checkVonBisStudiensemester($von_studiensemester_kurzbz, $bis_studiensemester_kurzbz);
if (isError($vonBisCheck))
$this->outputJsonError(getError($vonBisCheck));
else
{
$data = array(
'studierendenbeitrag' => $studierendenbeitrag,
'versicherung' => $versicherung,
'von_studiensemester_kurzbz' => $von_studiensemester_kurzbz,
'bis_studiensemester_kurzbz' => $bis_studiensemester_kurzbz
);
$this->outputJson($this->OehbeitragModel->insert($data));
}
}
}
/**
* Updates an Öhbeitrag. Checks for errors beforehand.
*/
public function updateOehbeitrag()
{
$oehbeitrag_id = $this->input->post("oehbeitrag_id");
$data = $this->input->post("data");
if (!is_numeric($oehbeitrag_id) || isEmptyArray($data))
{
$this->outputJsonError("Ungültige Parameter");
return;
}
foreach ($data as $idx => $value)
{
if ($idx == 'studierendenbeitrag' || $idx == 'versicherung')
{
if (!$this->_checkAmount($value))
{
$this->outputJsonError("Ungültige(r) $idx");
return;
}
}
elseif ($idx == 'von_studiensemester_kurzbz' || $idx == 'bis_studiensemester_kurzbz')
{
$this->OehbeitragModel->addSelect('von_studiensemester_kurzbz, bis_studiensemester_kurzbz');
$vonBisStudiensemesterRes = $this->OehbeitragModel->load($oehbeitrag_id);
if (!hasData($vonBisStudiensemesterRes))
{
$this->outputJsonError("Fehler beim Holen des Öhbeitrags");
return;
}
$vonBisStudiensemester = getData($vonBisStudiensemesterRes);
$von_studiensemester_kurzbz = isset($data['von_studiensemester_kurzbz'])
? $data['von_studiensemester_kurzbz']
: $vonBisStudiensemester[0]->von_studiensemester_kurzbz;
if (isset($data['bis_studiensemester_kurzbz']))
{
$bis_studiensemester_kurzbz = $data['bis_studiensemester_kurzbz'] = $data['bis_studiensemester_kurzbz'] == 'null' ? null : $data['bis_studiensemester_kurzbz'];
}
else
$bis_studiensemester_kurzbz = $vonBisStudiensemester[0]->bis_studiensemester_kurzbz;
$checkStudiensemester = $this->_checkVonBisStudiensemester($von_studiensemester_kurzbz, $bis_studiensemester_kurzbz, $oehbeitrag_id);
if (isError($checkStudiensemester))
{
$this->outputJsonError(getError($checkStudiensemester));
return;
}
}
}
$this->outputJson($this->OehbeitragModel->update($oehbeitrag_id, $data));
}
/**
* Deletes an Öhbeitrag.
*/
public function deleteOehbeitrag()
{
$oehbeitrag_id = $this->input->post("oehbeitrag_id");
$this->outputJson($this->OehbeitragModel->delete($oehbeitrag_id));
}
/**
* Loads all Öhbeiträge sorted by date descending.
* @return object
*/
private function _loadOehbeitraege()
{
$this->OehbeitragModel->addSelect('oehbeitrag_id, von_studiensemester_kurzbz, bis_studiensemester_kurzbz, studierendenbeitrag, versicherung, sem_von.start as von_datum, sem_bis.ende as bis_datum');
$this->OehbeitragModel->addJoin('public.tbl_studiensemester sem_von', 'tbl_oehbeitrag.von_studiensemester_kurzbz = sem_von.studiensemester_kurzbz');
$this->OehbeitragModel->addJoin('public.tbl_studiensemester sem_bis', 'tbl_oehbeitrag.bis_studiensemester_kurzbz = sem_bis.studiensemester_kurzbz', 'LEFT');
$this->OehbeitragModel->addOrder('sem_von.start', 'DESC');
return $this->OehbeitragModel->load();
}
/**
* Checks if an amount is numeric and not too big.
* @param $amount
* @return bool true if valid amount, false otherwise
*/
private function _checkAmount($amount)
{
return is_numeric($amount) && (float) $amount <= 99999.99;
}
/**
* Checks if a certain Von-Studiensemester is valid together with a Bis-Studiensemester.
* Checks for correct format, Von-Studiensemester cannot be after the Bis-Studiensemester,
* checks that semester are not overlapping with semester for existent Öhbeiträge.
* @param string $von_studiensemester_kurzbz
* @param string $bis_studiensemester_kurzbz
* @param int $oehbeitrag_id öhbeitrag to ignore, i.e. which is assignable (id of Öhbeitrag of the passed semesters)
* @return object array with true if assignable, with false if not
*/
private function _checkVonBisStudiensemester($von_studiensemester_kurzbz, $bis_studiensemester_kurzbz, $oehbeitrag_id = null)
{
$regex = "/^(WS|SS)\d{4}$/";
if (!preg_match($regex, $von_studiensemester_kurzbz))
return error("Ungültiges Von-Studiensemester");
if (!preg_match($regex, $bis_studiensemester_kurzbz) && $bis_studiensemester_kurzbz != null)
return error("Ungültiges Bis-Studiensemester");
$this->StudiensemesterModel->addSelect("start");
$vonStudiensemesterRes = $this->StudiensemesterModel->load($von_studiensemester_kurzbz);
if (!hasData($vonStudiensemesterRes))
return error("Fehler beim Holen von Von-Studiensemester");
$this->StudiensemesterModel->addSelect("start");
$bisStudiensemesterRes = $this->StudiensemesterModel->load($bis_studiensemester_kurzbz);
if (!hasData($bisStudiensemesterRes))
return error("Fehler beim Holen von Bis-Studiensemester");
$vonStudiensemester = getData($vonStudiensemesterRes)[0]->start;
$bisStudiensemester = getData($bisStudiensemesterRes)[0]->start;
if ($bis_studiensemester_kurzbz != null && new DateTime($vonStudiensemester) > new DateTime($bisStudiensemester))
return error("Von-Studiensemester größer als Bis-Studiensemester");
$oehbeitrag_id_arr = isset($oehbeitrag_id) ? array($oehbeitrag_id) : null;
$assignableRes = $this->OehbeitragModel->checkIfStudiensemesterAssignable(
$von_studiensemester_kurzbz,
$bis_studiensemester_kurzbz,
$oehbeitrag_id_arr
);
if (isError($assignableRes))
return $assignableRes;
if (hasData($assignableRes))
{
$assignable = getData($assignableRes)[0];
if (!$assignable)
return error("Keine Zuweisung möglich, Semesterüberschneidung");
}
return success("Studiensemester gültig");
}
}
@@ -20,6 +20,7 @@ class InfoCenter extends Auth_Controller
const INDEX_PAGE = 'index';
const FREIGEGEBEN_PAGE = 'freigegeben';
const REIHUNGSTESTABSOLVIERT_PAGE = 'reihungstestAbsolviert';
const ABGEWIESEN_PAGE = 'abgewiesen';
const SHOW_DETAILS_PAGE = 'showDetails';
const SHOW_ZGV_DETAILS_PAGE = 'showZGVDetails';
const ZGV_UBERPRUEFUNG_PAGE = 'ZGVUeberpruefung';
@@ -107,6 +108,7 @@ class InfoCenter extends Auth_Controller
array(
'index' => 'infocenter:r',
'freigegeben' => 'infocenter:r',
'abgewiesen' => 'infocenter:r',
'reihungstestAbsolviert' => 'infocenter:r',
'showDetails' => 'infocenter:r',
'showZGVDetails' => 'lehre/zgvpruefung:r',
@@ -203,6 +205,16 @@ class InfoCenter extends Auth_Controller
$this->load->view('system/infocenter/infocenterFreigegeben.php');
}
/**
* Abgewiesen page of the InfoCenter tool
*/
public function abgewiesen()
{
$this->_setNavigationMenu(self::ABGEWIESEN_PAGE); // define the navigation menu for this page
$this->load->view('system/infocenter/infocenterAbgewiesen.php');
}
/**
*
*/
@@ -297,6 +309,13 @@ class InfoCenter extends Auth_Controller
}
$persondata = $this->_loadPersonData($person_id);
$checkPerson = $this->PersonModel->checkDuplicate($person_id);
if (isError($checkPerson)) show_error(getError($checkPerson));
$duplicate = array('duplicated' => getData($checkPerson));
$prestudentdata = $this->_loadPrestudentData($person_id);
$this->DokumentModel->addOrder('bezeichnung');
@@ -305,7 +324,8 @@ class InfoCenter extends Auth_Controller
$data = array_merge(
$persondata,
$prestudentdata,
$dokumentdata
$dokumentdata,
$duplicate
);
$data[self::FHC_CONTROLLER_ID] = $this->getControllerId();
@@ -734,7 +754,7 @@ class InfoCenter extends Auth_Controller
if (hasData($lastStatus) && hasData($statusgrresult))
{
//check if still Interessent
//check if still Interessent, Bewerber or Wartender
if ($lastStatus->retval[0]->status_kurzbz === self::INTERESSENTSTATUS
|| $lastStatus->retval[0]->status_kurzbz === self::BEWERBERSTATUS
|| $lastStatus->retval[0]->status_kurzbz === self::WARTENDER)
@@ -913,7 +933,8 @@ class InfoCenter extends Auth_Controller
$this->_log($person_id, 'freigegeben', $logparams);
$this->_sendFreigabeMail($prestudent_id);
if (is_numeric($statusgrund_id) || $logdata['studiengang_typ'] === 'm')
$this->_sendFreigabeMail($prestudent_id);
}
}
}
@@ -1191,6 +1212,10 @@ class InfoCenter extends Auth_Controller
{
$this->_setNavigationMenu(self::REIHUNGSTESTABSOLVIERT_PAGE);
}
elseif (strpos($navigation_page, self::ABGEWIESEN_PAGE) !== false)
{
$this->_setNavigationMenu(self::ABGEWIESEN_PAGE);
}
$this->outputJsonSuccess('success');
}
@@ -1414,12 +1439,14 @@ class InfoCenter extends Auth_Controller
$freigegebenLink = site_url(self::INFOCENTER_URI.'/'.self::FREIGEGEBEN_PAGE);
$reihungstestAbsolviertLink = site_url(self::INFOCENTER_URI.'/'.self::REIHUNGSTESTABSOLVIERT_PAGE);
$abgewiesenLink = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE);
$currentFilterId = $this->input->get(self::FILTER_ID);
if (isset($currentFilterId))
{
$freigegebenLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId;
$reihungstestAbsolviertLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId;
$abgewiesenLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId;
}
$this->navigationlib->setSessionMenu(
@@ -1458,6 +1485,18 @@ class InfoCenter extends Auth_Controller
null, // subscriptLinkValue
'', // target
20 // sort
),
'abgewiesen' => $this->navigationlib->oneLevel(
'Abgewiesene', // description
$abgewiesenLink, // link
null, // children
'close', // icon
null, // subscriptDescription
false, // expand
null, // subscriptLinkClass
null, // subscriptLinkValue
'', // target
30 // sort
)
)
);
@@ -1483,6 +1522,8 @@ class InfoCenter extends Auth_Controller
}
if ($origin_page === self::ZGV_UBERPRUEFUNG_PAGE)
$link = site_url(self::ZGV_UEBERPRUEFUNG_URI);
if ($origin_page === self::ABGEWIESEN_PAGE)
$link = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE);
$prevFilterId = $this->input->get(self::PREV_FILTER_ID);
if (isset($prevFilterId))
@@ -1520,6 +1561,7 @@ class InfoCenter extends Auth_Controller
$homeLink = site_url(self::INFOCENTER_URI.'/'.self::INDEX_PAGE);
$freigegebenLink = site_url(self::INFOCENTER_URI.'/'.self::FREIGEGEBEN_PAGE);
$absolviertLink = site_url(self::INFOCENTER_URI.'/'.self::REIHUNGSTESTABSOLVIERT_PAGE);
$abgewiesenLink = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE);
$prevFilterId = $this->input->get(self::PREV_FILTER_ID);
if (isset($prevFilterId))
{
@@ -1578,6 +1620,24 @@ class InfoCenter extends Auth_Controller
)
);
}
if($page == self::ABGEWIESEN_PAGE)
{
$this->navigationlib->setSessionElementMenu(
'abgewiesen',
$this->navigationlib->oneLevel(
'Abgewiesene', // description
$abgewiesenLink, // link
null, // children
'close', // icon
null, // subscriptDescription
false, // expand
null, // subscriptLinkClass
null, // subscriptLinkValue
'', // target
40 // sort
)
);
}
}
/**
@@ -2134,17 +2194,18 @@ class InfoCenter extends Auth_Controller
{
$statusgrund = $this->input->post('statusgrund');
$studiengang = $this->input->post('studiengang');
$abgeschickt = $this->input->post('abgeschickt');
$personen = $this->input->post('personen');
$studienSemester = $this->variablelib->getVar('infocenter_studiensemester');
if ($statusgrund === 'null' || $studiengang === 'null' || empty($personen))
$this->terminateWithJsonError("Bitte Statusgrund, Studiengang und Personen auswählen.");
if ($statusgrund === 'null' || $studiengang === 'null' || $abgeschickt === 'null' || empty($personen))
$this->terminateWithJsonError("Bitte füllen Sie alle Felder aus");
foreach($personen as $person)
{
$prestudent = $this->PrestudentModel->getPrestudentByStudiengangAndPerson($studiengang, $person, $studienSemester);
$prestudent = $this->PrestudentModel->getPrestudentByStudiengangAndPerson($studiengang, $person, $studienSemester, $abgeschickt);
if(!hasData($prestudent))
if (!hasData($prestudent))
continue;
$prestudentData = getData($prestudent);
@@ -0,0 +1,145 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
class Issues extends Auth_Controller
{
private $_uid;
const FUNKTION_KURZBZ = 'ass'; // // user having this funktion can see issues for oes assigned with this funktion
const BERECHTIGUNG_KURZBZ = 'system/issues_verwalten'; // user having this permission can see issues for oes assigned with this permission
public function __construct()
{
parent::__construct(
array(
'index' => array(self::BERECHTIGUNG_KURZBZ.':r'),
'changeIssueStatus' => array(self::BERECHTIGUNG_KURZBZ.':rw')
)
);
// Load libraries
$this->load->library('IssuesLib');
$this->load->library('PermissionLib');
$this->load->library('WidgetLib');
// Load models
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
$this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
$this->loadPhrases(
array(
'global',
'ui',
'filter',
'lehre',
'person',
'fehlermonitoring'
)
);
$this->_setAuthUID(); // sets property uid
}
public function index()
{
$oes_for_issues = $this->_getOesForIssues();
$this->load->view(
'system/issues/issues',
$oes_for_issues
);
}
/**
* Initializes issues status change
*/
public function changeIssueStatus()
{
$issue_ids = $this->input->post('issue_ids');
$status_kurzbz = $this->input->post('status_kurzbz');
$verarbeitetvon = $this->_uid;
$errors = array();
foreach ($issue_ids as $issue_id)
{
$issueRes = $this->issueslib->changeIssueStatus($issue_id, $status_kurzbz, $verarbeitetvon);
if (isError($issueRes))
$errors[] = getError($issueRes);
}
if (!isEmptyArray($errors))
$this->outputJsonError(implode(", ", $errors));
else
$this->outputJsonSuccess("Status erfolgreich aktualisiert");
}
/**
* Retrieve the UID of the logged user and checks if it is valid
*/
private function _setAuthUID()
{
$this->_uid = getAuthUID();
if (!$this->_uid) show_error('User authentification failed');
}
/**
* Gets oes of logged in user, which are needed to display issues of the user.
* This includes oes assigned by a funktio and as the issue permission.
* @return array
*/
private function _getOesForIssues()
{
// get oes of uid for which there is a current funktion
$all_funktionen_oe_kurzbz = array();
$oe_kurzbz_for_funktion = array();
$benutzerfunktionRes = $this->BenutzerfunktionModel->getBenutzerFunktionByUid($this->_uid, null, date('Y-m-d'), date('Y-m-d'));
if (isError($benutzerfunktionRes))
show_error(getError($benutzerfunktionRes));
if (hasData($benutzerfunktionRes))
{
foreach (getData($benutzerfunktionRes) as $benutzerfunktion)
{
$all_funktionen_oe_kurzbz[$benutzerfunktion->oe_kurzbz][] = $benutzerfunktion->funktion_kurzbz;
// separate oes for the funktion needed for displaying issues
if ($benutzerfunktion->funktion_kurzbz == self::FUNKTION_KURZBZ)
{
$oe_kurzbz_for_funktion[] = $benutzerfunktion->oe_kurzbz;
// permission also for all oes under the oe for which funktion is assigend
$childOesFunktionRes = $this->OrganisationseinheitModel->getChilds($benutzerfunktion->oe_kurzbz);
if (isError($childOesFunktionRes))
show_error(getError($childOesFunktionRes));
if (hasData($childOesFunktionRes))
{
$childOesFunktion = getData($childOesFunktionRes);
foreach ($childOesFunktion as $childOeFunktion)
{
if (!in_array($childOeFunktion->oe_kurzbz, $oe_kurzbz_for_funktion))
$oe_kurzbz_for_funktion[] = $childOeFunktion->oe_kurzbz;
}
}
}
}
}
// add oes for which there is the "manage issues" Berechtigung
if (!$oe_kurzbz_berechtigt = $this->permissionlib->getOE_isEntitledFor(self::BERECHTIGUNG_KURZBZ))
show_error('Keine Berechtigung oder Fehler bei Berechtigungsprüfung');
$all_oe_kurzbz_berechtigt = array_unique(array_merge($oe_kurzbz_for_funktion, $oe_kurzbz_berechtigt));
return array(
'all_funktionen_oe_kurzbz' => $all_funktionen_oe_kurzbz,
'all_oe_kurzbz_berechtigt' => $all_oe_kurzbz_berechtigt
);
}
}