mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-09 16:19:28 +00:00
Compare commits
24 Commits
master
...
d25d181d04
| Author | SHA1 | Date | |
|---|---|---|---|
| d25d181d04 | |||
| 40c3a13a0c | |||
| ab99806335 | |||
| 2cbc169484 | |||
| 0acf604213 | |||
| 8ab96fd1c4 | |||
| 2db4e596cf | |||
| d58d386993 | |||
| 342afe9e82 | |||
| 2e0a4ef7a0 | |||
| 6369202f99 | |||
| 13a27d7e6f | |||
| c9db3bbc1f | |||
| 65f4fbd775 | |||
| a9653f79cf | |||
| de9bb454e4 | |||
| b2d2c3e2c3 | |||
| 98e3872b6b | |||
| 0fab316927 | |||
| 21170abd53 | |||
| dfc5a38d2e | |||
| 4152a7d969 | |||
| 6bf22cfef6 | |||
| 458db654c2 |
@@ -81,7 +81,7 @@ class Bismeldestichtag extends Auth_Controller
|
||||
tbl_bismeldestichtag.insertamum, tbl_bismeldestichtag.insertvon, tbl_bismeldestichtag.updateamum, tbl_bismeldestichtag.updatevon'
|
||||
);
|
||||
$this->BismeldestichtagModel->addJoin('public.tbl_studiensemester sem', 'studiensemester_kurzbz', 'LEFT');
|
||||
$this->BismeldestichtagModel->addOrder('semester_start');
|
||||
$this->BismeldestichtagModel->addOrder('semester_start', 'DESC');
|
||||
$this->BismeldestichtagModel->addOrder('meldestichtag', 'DESC');
|
||||
$this->BismeldestichtagModel->addOrder('meldestichtag_id', 'DESC');
|
||||
$this->outputJson($this->BismeldestichtagModel->load());
|
||||
|
||||
@@ -57,6 +57,12 @@ class IssueResolver extends IssueResolver_Controller
|
||||
// structure: fehlercode => class (library) name for resolving in "plausichecks" folder
|
||||
$this->_codeProducerLibMappings = array(
|
||||
'CORE_STUDENTSTATUS_0001' => 'AbbrecherAktiv',
|
||||
'CORE_STUDENTSTATUS_0017' => 'BeginndatumVorBismeldung',
|
||||
'CORE_STUDENTSTATUS_0018' => 'StudentstatusNachDiplomand',
|
||||
'CORE_STUDENTSTATUS_0019' => 'OrgformBewerberUngleichOrgformStudent',
|
||||
'CORE_STUDENTSTATUS_0020' => 'StartsemesterUngleichPersonenkennzeichen',
|
||||
'CORE_STUDENTSTATUS_0021' => 'AbschlusspruefungOderAbsolventFehlt',
|
||||
'CORE_STUDENTSTATUS_0022' => 'FalscheStatusabfolgeVorStudentstatus'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,6 +184,8 @@ class Plausichecks extends Auth_Controller
|
||||
}
|
||||
}
|
||||
|
||||
ksort($fehlerKurzbzCodeMappings);
|
||||
|
||||
return array(
|
||||
'semester' => hasData($studiensemesterRes) ? getData($studiensemesterRes) : array(),
|
||||
'currsemester' => hasData($currSemRes) ? getData($currSemRes) : array(),
|
||||
|
||||
@@ -12,15 +12,18 @@ class PlausicheckDefinitionLib
|
||||
private $_fehlerLibMappings = array(
|
||||
'AbbrecherAktiv' => 'AbbrecherAktiv',
|
||||
'AbschlussstatusFehlt' => 'AbschlussstatusFehlt',
|
||||
'AbschlusspruefungOderAbsolventFehlt' => 'AbschlusspruefungOderAbsolventFehlt',
|
||||
'AktSemesterNull' => 'AktSemesterNull',
|
||||
'AktiverStudentOhneStatus' => 'AktiverStudentOhneStatus',
|
||||
'AusbildungssemPrestudentUngleichAusbildungssemStatus' => 'AusbildungssemPrestudentUngleichAusbildungssemStatus',
|
||||
'DatumAbschlusspruefungFehlt' => 'DatumAbschlusspruefungFehlt',
|
||||
'DatumSponsionFehlt' => 'DatumSponsionFehlt',
|
||||
'DatumStudiensemesterFalscheReihenfolge' => 'DatumStudiensemesterFalscheReihenfolge',
|
||||
'DualesStudiumOhneMarkierung' => 'DualesStudiumOhneMarkierung',
|
||||
'FalscheAnzahlAbschlusspruefungen' => 'FalscheAnzahlAbschlusspruefungen',
|
||||
'FalscheAnzahlHeimatadressen' => 'FalscheAnzahlHeimatadressen',
|
||||
'FalscheAnzahlZustelladressen' => 'FalscheAnzahlZustelladressen',
|
||||
'FalscheStatusabfolgeVorStudentstatus' => 'FalscheStatusabfolgeVorStudentstatus',
|
||||
'GbDatumWeitZurueck' => 'GbDatumWeitZurueck',
|
||||
'InaktiverStudentAktiverStatus' => 'InaktiverStudentAktiverStatus',
|
||||
'IncomingHeimatNationOesterreich' => 'IncomingHeimatNationOesterreich',
|
||||
@@ -28,12 +31,14 @@ class PlausicheckDefinitionLib
|
||||
'IncomingOrGsFoerderrelevant' => 'IncomingOrGsFoerderrelevant',
|
||||
'InskriptionVorLetzerBismeldung' => 'InskriptionVorLetzerBismeldung',
|
||||
'NationNichtOesterreichAberGemeinde' => 'NationNichtOesterreichAberGemeinde',
|
||||
'OrgformBewerberUngleichOrgformStudent' => 'OrgformBewerberUngleichOrgformStudent',
|
||||
'OrgformStgUngleichOrgformPrestudent' => 'OrgformStgUngleichOrgformPrestudent',
|
||||
'PrestudentMischformOhneOrgform' => 'PrestudentMischformOhneOrgform',
|
||||
'StartsemesterUngleichPersonenkennzeichen' => 'StartsemesterUngleichPersonenkennzeichen',
|
||||
'StgPrestudentUngleichStgStudienplan' => 'StgPrestudentUngleichStgStudienplan',
|
||||
'StgPrestudentUngleichStgStudent' => 'StgPrestudentUngleichStgStudent',
|
||||
'StudentstatusNachAbbrecher' => 'StudentstatusNachAbbrecher',
|
||||
'DualesStudiumOhneMarkierung' => 'DualesStudiumOhneMarkierung'
|
||||
'StudentstatusNachDiplomand' => 'StudentstatusNachDiplomand',
|
||||
'StudentstatusNachAbbrecher' => 'StudentstatusNachAbbrecher'
|
||||
//'StudienplanUngueltig' => 'StudienplanUngueltig'
|
||||
//'BewerberNichtZumRtAngetreten' => 'BewerberNichtZumRtAngetreten'
|
||||
);
|
||||
|
||||
@@ -0,0 +1,156 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
require_once('PlausiChecker.php');
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class AbschlusspruefungOderAbsolventFehlt extends PlausiChecker
|
||||
{
|
||||
public function executePlausiCheck($params)
|
||||
{
|
||||
$results = array();
|
||||
|
||||
// get parameters from config
|
||||
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
|
||||
|
||||
// pass parameters needed for plausicheck
|
||||
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
|
||||
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
|
||||
$prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null;
|
||||
|
||||
// get all students failing the plausicheck
|
||||
$prestudentRes = $this->getAbschlusspruefungOderAbsolventFehlt(
|
||||
$studiensemester_kurzbz,
|
||||
$studiengang_kz,
|
||||
$prestudent_id,
|
||||
$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);
|
||||
}
|
||||
|
||||
/**
|
||||
* If there is a final exam, there should be an absolvent status (and vice versa).
|
||||
* @param studiensemester_kurzbz Status from this and previous semester is checked
|
||||
* @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 getAbschlusspruefungOderAbsolventFehlt($studiensemester_kurzbz = null, $studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null)
|
||||
{
|
||||
$params = array();
|
||||
|
||||
|
||||
$qry = "
|
||||
SELECT person_id, prestudent_id, studiengang_kz, prestudent_stg_oe_kurzbz FROM (
|
||||
WITH meldestichtag AS (
|
||||
SELECT
|
||||
meldestichtag, studiensemester_kurzbz
|
||||
FROM
|
||||
bis.tbl_bismeldestichtag";
|
||||
|
||||
if (isset($studiensemester_kurzbz))
|
||||
{
|
||||
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
$prevStudiensemesterRes = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz);
|
||||
|
||||
if (isError($prevStudiensemesterRes)) return $prevStudiensemesterRes;
|
||||
|
||||
$semesterArr = array($studiensemester_kurzbz);
|
||||
|
||||
if (hasData($prevStudiensemesterRes))
|
||||
{
|
||||
// if Studiensemester given, check only if has status in current or previous semester
|
||||
$semesterArr[] = getData($prevStudiensemesterRes)[0]->studiensemester_kurzbz;
|
||||
}
|
||||
|
||||
$qry .= " WHERE studiensemester_kurzbz IN ?";
|
||||
|
||||
$params[] = $semesterArr;
|
||||
}
|
||||
|
||||
$qry .= "
|
||||
)
|
||||
SELECT
|
||||
DISTINCT ON (prestudent_id) prestudent.person_id, prestudent.prestudent_id,
|
||||
stg.studiengang_kz, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz,
|
||||
EXISTS (
|
||||
SELECT 1
|
||||
FROM
|
||||
lehre.tbl_abschlusspruefung pr
|
||||
WHERE
|
||||
student_uid = benutzer.uid
|
||||
AND abschlussbeurteilung_kurzbz <> 'nicht'
|
||||
AND pr.datum < meldestichtag.meldestichtag
|
||||
) AS hat_pruefung,
|
||||
(status.status_kurzbz IS NOT NULL) AS hat_absolvent,
|
||||
(status.ausbildungssemester = stg.max_semester) AS absolvent_in_letztem_semester
|
||||
FROM
|
||||
meldestichtag
|
||||
CROSS JOIN public.tbl_student student
|
||||
JOIN public.tbl_prestudent prestudent USING (prestudent_id)
|
||||
JOIN public.tbl_benutzer benutzer ON (benutzer.uid = student.student_uid)
|
||||
JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz
|
||||
LEFT JOIN public.tbl_prestudentstatus status
|
||||
ON status.prestudent_id = prestudent.prestudent_id
|
||||
AND status.status_kurzbz = 'Absolvent'
|
||||
AND status.datum < meldestichtag.meldestichtag
|
||||
WHERE EXISTS (
|
||||
SELECT 1
|
||||
FROM
|
||||
public.tbl_prestudentstatus
|
||||
WHERE
|
||||
prestudent_id = prestudent.prestudent_id
|
||||
AND studiensemester_kurzbz = meldestichtag.studiensemester_kurzbz
|
||||
)";
|
||||
|
||||
if (isset($studiengang_kz))
|
||||
{
|
||||
$qry .= " AND stg.studiengang_kz = ?";
|
||||
$params[] = $studiengang_kz;
|
||||
}
|
||||
|
||||
if (isset($prestudent_id))
|
||||
{
|
||||
$qry .= " AND prestudent.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;
|
||||
}
|
||||
|
||||
$qry .= "
|
||||
) prestudenten
|
||||
WHERE
|
||||
(hat_absolvent AND absolvent_in_letztem_semester AND hat_pruefung = FALSE)
|
||||
OR (hat_pruefung AND hat_absolvent = FALSE)";
|
||||
|
||||
return $this->_db->execReadOnlyQuery($qry, $params);
|
||||
}
|
||||
}
|
||||
@@ -101,23 +101,26 @@ class AbschlussstatusFehlt extends PlausiChecker
|
||||
|
||||
if (isset($studiensemester_kurzbz))
|
||||
{
|
||||
$this->_ci->load->model('organisation/studiensemester_model', 'StudiensemesterModel');
|
||||
$prevStudiensemesterRes = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz);
|
||||
|
||||
if (isError($prevStudiensemesterRes)) return $prevStudiensemesterRes;
|
||||
|
||||
$semesterArr = array($studiensemester_kurzbz);
|
||||
|
||||
if (hasData($prevStudiensemesterRes))
|
||||
{
|
||||
// if Studiensemester given, check only if has status in current or previous semester
|
||||
$prevStudiensemester = getData($prevStudiensemesterRes)[0]->studiensemester_kurzbz;
|
||||
$qry .= " AND EXISTS (
|
||||
SELECT 1
|
||||
FROM public.tbl_prestudentstatus ps
|
||||
WHERE studiensemester_kurzbz IN (?, ?)
|
||||
AND ps.prestudent_id = pre.prestudent_id
|
||||
)";
|
||||
$params[] = $prevStudiensemester;
|
||||
$params[] = $studiensemester_kurzbz;
|
||||
$semesterArr[] = getData($prevStudiensemesterRes)[0]->studiensemester_kurzbz;
|
||||
}
|
||||
|
||||
$qry .= " AND EXISTS (
|
||||
SELECT 1
|
||||
FROM public.tbl_prestudentstatus ps
|
||||
WHERE studiensemester_kurzbz IN ?
|
||||
AND ps.prestudent_id = pre.prestudent_id
|
||||
)";
|
||||
$params[] = $semesterArr;
|
||||
}
|
||||
|
||||
if (isset($studiengang_kz))
|
||||
|
||||
@@ -0,0 +1,122 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
require_once('PlausiChecker.php');
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class BeginndatumVorBismeldung extends PlausiChecker
|
||||
{
|
||||
public function executePlausiCheck($params)
|
||||
{
|
||||
$results = array();
|
||||
|
||||
// get parameters from config
|
||||
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
|
||||
|
||||
// pass parameters needed for plausicheck
|
||||
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
|
||||
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
|
||||
$prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null;
|
||||
|
||||
// get all students failing the plausicheck
|
||||
$prestudentRes = $this->getBeginndatumVorBismeldung(
|
||||
$studiensemester_kurzbz,
|
||||
$studiengang_kz,
|
||||
$prestudent_id,
|
||||
$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,
|
||||
'studiensemester_kurzbz' => $prestudent->studiensemester_kurzbz,
|
||||
),
|
||||
'resolution_params' => array(
|
||||
'prestudent_id' => $prestudent->prestudent_id,
|
||||
'studiensemester_kurzbz' => $prestudent->studiensemester_kurzbz
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// return the results
|
||||
return success($results);
|
||||
}
|
||||
|
||||
/**
|
||||
* Beginndatum shouldn't be before Bismeldedatum if the Bismeldedatum has already been reached.
|
||||
* @param studiensemester_kurzbz string check is to be executed for certain Studiensemester
|
||||
* @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 getBeginndatumVorBismeldung(
|
||||
$studiensemester_kurzbz,
|
||||
$studiengang_kz = null,
|
||||
$prestudent_id = null,
|
||||
$exkludierte_studiengang_kz = null
|
||||
) {
|
||||
$this->_ci->load->model('codex/Bismeldestichtag_model', 'BismeldestichtagModel');
|
||||
|
||||
$bismeldestichtagRes = $this->_ci->BismeldestichtagModel->getByStudiensemester($studiensemester_kurzbz);
|
||||
|
||||
if (isError($bismeldestichtagRes)) return $bismeldestichtagRes;
|
||||
|
||||
if (!hasData($bismeldestichtagRes)) return success(array());
|
||||
|
||||
$bismeldestichtag = getData($bismeldestichtagRes)[0]->meldestichtag;
|
||||
|
||||
$params = array($bismeldestichtag, $studiensemester_kurzbz, $bismeldestichtag);
|
||||
|
||||
$qry = "
|
||||
SELECT
|
||||
prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz
|
||||
FROM
|
||||
public.tbl_prestudent prestudent
|
||||
JOIN public.tbl_prestudentstatus status ON(prestudent.prestudent_id=status.prestudent_id)
|
||||
JOIN public.tbl_person USING(person_id)
|
||||
LEFT JOIN bis.tbl_orgform USING(orgform_kurzbz)
|
||||
JOIN public.tbl_studiengang stg USING(studiengang_kz)
|
||||
WHERE
|
||||
status.datum < ?::date
|
||||
AND status.studiensemester_kurzbz = ?
|
||||
AND status.insertamum > ?::date + interval '1' day
|
||||
AND stg.melderelevant
|
||||
AND prestudent.bismelden";
|
||||
|
||||
if (isset($studiengang_kz))
|
||||
{
|
||||
$qry .= " AND stg.studiengang_kz = ?";
|
||||
$params[] = $studiengang_kz;
|
||||
}
|
||||
|
||||
if (isset($prestudent_id))
|
||||
{
|
||||
$qry .= " AND prestudent.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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,186 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
require_once('PlausiChecker.php');
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class FalscheStatusabfolgeVorStudentstatus extends PlausiChecker
|
||||
{
|
||||
private $_statusAbfolge = array('Interessent', 'Bewerber', 'Aufgenommener', 'Student');
|
||||
|
||||
public function executePlausiCheck($params)
|
||||
{
|
||||
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
|
||||
|
||||
$results = array();
|
||||
|
||||
// get parameters from config
|
||||
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
|
||||
|
||||
// pass parameters needed for plausicheck
|
||||
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
|
||||
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
|
||||
$prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null;
|
||||
|
||||
// get all students failing the plausicheck
|
||||
$prestudentRes = $this->getFalscheStatusabfolgeVorStudentstatus(
|
||||
$studiensemester_kurzbz,
|
||||
$studiengang_kz,
|
||||
$prestudent_id,
|
||||
$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,
|
||||
'studiensemester_kurzbz' => $prestudent->studiensemester_kurzbz,
|
||||
'status_abfolge' => implode(', ', $this->_statusAbfolge)
|
||||
),
|
||||
'resolution_params' => array(
|
||||
'prestudent_id' => $prestudent->prestudent_id
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// return the results
|
||||
return success($results);
|
||||
}
|
||||
|
||||
/**
|
||||
* There should be certain order of status before the student status.
|
||||
* @param studiensemester_kurzbz string check is to be executed for certain Studiensemester
|
||||
* @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 getFalscheStatusabfolgeVorStudentstatus(
|
||||
$studiensemester_kurzbz = null,
|
||||
$studiengang_kz = null,
|
||||
$prestudent_id = null,
|
||||
$exkludierte_studiengang_kz = null
|
||||
) {
|
||||
$params = array($this->_statusAbfolge);
|
||||
|
||||
$qry = "
|
||||
SELECT
|
||||
DISTINCT person_id, prestudent_id, prestudent_stg_oe_kurzbz, studiensemester_kurzbz
|
||||
FROM
|
||||
(
|
||||
SELECT
|
||||
prestudent.person_id, prestudent.prestudent_id,
|
||||
stg.studiengang_kz, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz,
|
||||
status.status_kurzbz, status.datum, status.insertamum, status.ext_id,
|
||||
LAG(status.status_kurzbz, 1)
|
||||
OVER (
|
||||
PARTITION BY prestudent.prestudent_id
|
||||
ORDER BY status.datum, status.insertamum, status.ext_id
|
||||
) AS prev_status_kurzbz
|
||||
FROM
|
||||
public.tbl_prestudent prestudent
|
||||
JOIN public.tbl_prestudentstatus status ON (prestudent.prestudent_id=status.prestudent_id)
|
||||
JOIN public.tbl_person USING(person_id)
|
||||
LEFT JOIN bis.tbl_orgform USING(orgform_kurzbz)
|
||||
JOIN public.tbl_studiengang stg USING(studiengang_kz)
|
||||
WHERE
|
||||
status.status_kurzbz IN ?
|
||||
AND stg.melderelevant
|
||||
AND prestudent.bismelden
|
||||
-- there should be a student already
|
||||
AND EXISTS (
|
||||
SELECT 1
|
||||
FROM
|
||||
public.tbl_prestudentstatus
|
||||
WHERE
|
||||
prestudent_id = prestudent.prestudent_id
|
||||
AND status_kurzbz = 'Student'
|
||||
AND datum >= status.datum
|
||||
)
|
||||
) prestudents
|
||||
WHERE
|
||||
(";
|
||||
|
||||
foreach ($this->_statusAbfolge as $idx => $status_kurzbz)
|
||||
{
|
||||
// previous status should be either same status, or previous status, or null in case of first status
|
||||
if ($idx != 0)$qry .= " OR ";
|
||||
$qry .= " (status_kurzbz = ? AND prev_status_kurzbz NOT IN ?";
|
||||
$prev_status_kurzbz = array($status_kurzbz);
|
||||
|
||||
if ($idx == 0)
|
||||
$qry .= " AND prev_status_kurzbz IS NOT NULL";
|
||||
else
|
||||
$prev_status_kurzbz[] = $this->_statusAbfolge[$idx - 1];
|
||||
|
||||
$qry .= ')';
|
||||
|
||||
$params[] = $status_kurzbz;
|
||||
$params[] = $prev_status_kurzbz;
|
||||
}
|
||||
|
||||
$qry .= "
|
||||
)";
|
||||
|
||||
if (isset($studiensemester_kurzbz))
|
||||
{
|
||||
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
$prevStudiensemesterRes = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz);
|
||||
|
||||
if (isError($prevStudiensemesterRes)) return $prevStudiensemesterRes;
|
||||
|
||||
$semesterArr = array($studiensemester_kurzbz);
|
||||
|
||||
if (hasData($prevStudiensemesterRes))
|
||||
{
|
||||
// if Studiensemester given, check only if has status in current or previous semester
|
||||
$semesterArr[] = getData($prevStudiensemesterRes)[0]->studiensemester_kurzbz;
|
||||
}
|
||||
|
||||
$qry .= " AND EXISTS (
|
||||
SELECT 1
|
||||
FROM public.tbl_prestudentstatus ps
|
||||
WHERE studiensemester_kurzbz IN ?
|
||||
AND ps.prestudent_id = prestudents.prestudent_id
|
||||
)";
|
||||
|
||||
$params[] = $semesterArr;
|
||||
}
|
||||
|
||||
if (isset($studiengang_kz))
|
||||
{
|
||||
$qry .= " AND studiengang_kz = ?";
|
||||
$params[] = $studiengang_kz;
|
||||
}
|
||||
|
||||
if (isset($prestudent_id))
|
||||
{
|
||||
$qry .= " AND 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;
|
||||
}
|
||||
|
||||
$qry .= " ORDER BY person_id DESC, prestudent_id DESC, prestudent_stg_oe_kurzbz, studiensemester_kurzbz";
|
||||
|
||||
return $this->_db->execReadOnlyQuery($qry, $params);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,149 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
require_once('PlausiChecker.php');
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class OrgformBewerberUngleichOrgformStudent extends PlausiChecker
|
||||
{
|
||||
public function executePlausiCheck($params)
|
||||
{
|
||||
$results = array();
|
||||
|
||||
// get parameters from config
|
||||
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
|
||||
|
||||
// pass parameters needed for plausicheck
|
||||
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
|
||||
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
|
||||
$prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null;
|
||||
|
||||
// get all students failing the plausicheck
|
||||
$prestudentRes = $this->getOrgformBewerberUngleichOrgformStudent(
|
||||
$studiensemester_kurzbz,
|
||||
$studiengang_kz,
|
||||
$prestudent_id,
|
||||
$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,
|
||||
'studiensemester_kurzbz' => $prestudent->studiensemester_kurzbz,
|
||||
'bewerber_studiensemester_kurzbz' => $prestudent->bewerber_studiensemester_kurzbz
|
||||
),
|
||||
'resolution_params' => array(
|
||||
'prestudent_id' => $prestudent->prestudent_id,
|
||||
'studiensemester_kurzbz' => $prestudent->studiensemester_kurzbz
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// return the results
|
||||
return success($results);
|
||||
}
|
||||
|
||||
/**
|
||||
* Orgform of Bewerber should be same as of student (Orgform of Status AND Studienplan)
|
||||
* @param studiensemester_kurzbz string check is to be executed for certain Studiensemester
|
||||
* @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 getOrgformBewerberUngleichOrgformStudent(
|
||||
$studiensemester_kurzbz,
|
||||
$studiengang_kz = null,
|
||||
$prestudent_id = null,
|
||||
$exkludierte_studiengang_kz = null
|
||||
) {
|
||||
$params = array();
|
||||
|
||||
$qry = "
|
||||
SELECT
|
||||
DISTINCT ON (prestudent.prestudent_id) prestudent.person_id, prestudent.prestudent_id, students.studiensemester_kurzbz,
|
||||
bewerber_status.studiensemester_kurzbz AS bewerber_studiensemester_kurzbz, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz
|
||||
FROM
|
||||
public.tbl_prestudent prestudent
|
||||
JOIN public.tbl_prestudentstatus bewerber_status
|
||||
ON prestudent.prestudent_id = bewerber_status.prestudent_id AND bewerber_status.status_kurzbz = 'Bewerber'
|
||||
JOIN lehre.tbl_studienplan bewerber_studienplan ON bewerber_status.studienplan_id = bewerber_studienplan.studienplan_id
|
||||
JOIN (
|
||||
SELECT
|
||||
DISTINCT ON (prestudent_id) prestudent_id, st.studiensemester_kurzbz,
|
||||
pl.orgform_kurzbz AS studienplan_orgform_kurzbz
|
||||
FROM
|
||||
public.tbl_prestudentstatus st
|
||||
JOIN lehre.tbl_studienplan pl USING (studienplan_id)
|
||||
WHERE
|
||||
status_kurzbz = 'Student'
|
||||
ORDER BY
|
||||
st.prestudent_id, st.datum, st.insertamum, st.ext_id
|
||||
) students ON prestudent.prestudent_id = students.prestudent_id
|
||||
JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz
|
||||
WHERE
|
||||
prestudent.bismelden
|
||||
AND stg.melderelevant
|
||||
AND bewerber_studienplan.orgform_kurzbz <> students.studienplan_orgform_kurzbz";
|
||||
|
||||
if (isset($studiensemester_kurzbz))
|
||||
{
|
||||
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
$prevStudiensemesterRes = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz);
|
||||
|
||||
if (isError($prevStudiensemesterRes)) return $prevStudiensemesterRes;
|
||||
|
||||
$semesterArr = array($studiensemester_kurzbz);
|
||||
|
||||
if (hasData($prevStudiensemesterRes))
|
||||
{
|
||||
// if Studiensemester given, check only if has status in current or previous semester
|
||||
$semesterArr[] = getData($prevStudiensemesterRes)[0]->studiensemester_kurzbz;
|
||||
}
|
||||
|
||||
$qry .= " AND EXISTS (
|
||||
SELECT 1
|
||||
FROM public.tbl_prestudentstatus ps
|
||||
WHERE studiensemester_kurzbz IN ?
|
||||
AND ps.prestudent_id = prestudent.prestudent_id
|
||||
)";
|
||||
|
||||
$params[] = $semesterArr;
|
||||
}
|
||||
|
||||
if (isset($studiengang_kz))
|
||||
{
|
||||
$qry .= " AND studiengang.studiengang_kz = ?";
|
||||
$params[] = $studiengang_kz;
|
||||
}
|
||||
|
||||
if (isset($prestudent_id))
|
||||
{
|
||||
$qry .= " AND prestudent.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);
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,8 @@ abstract class PlausiChecker
|
||||
|
||||
protected $_isForResolutionCheck; // if true, additional parameters only needed for resolution are checked
|
||||
|
||||
protected $_base_sql = ''; // base sql string
|
||||
|
||||
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]
|
||||
|
||||
|
||||
+152
@@ -0,0 +1,152 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
require_once('PlausiChecker.php');
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class StartsemesterUngleichPersonenkennzeichen extends PlausiChecker
|
||||
{
|
||||
public function executePlausiCheck($params)
|
||||
{
|
||||
$results = array();
|
||||
|
||||
// get parameters from config
|
||||
$exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null;
|
||||
|
||||
// pass parameters needed for plausicheck
|
||||
$studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null;
|
||||
$studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null;
|
||||
$prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null;
|
||||
|
||||
// get all students failing the plausicheck
|
||||
$prestudentRes = $this->getStartsemesterUngleichPersonenkennzeichen(
|
||||
$studiensemester_kurzbz,
|
||||
$studiengang_kz,
|
||||
$prestudent_id,
|
||||
$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);
|
||||
}
|
||||
|
||||
/**
|
||||
* Bewerber should have participated in Reihungstest.
|
||||
* @param studiensemester_kurzbz string check is to be executed for certain Studiensemester
|
||||
* @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 getStartsemesterUngleichPersonenkennzeichen(
|
||||
$studiensemester_kurzbz = null,
|
||||
$studiengang_kz = null,
|
||||
$prestudent_id = null,
|
||||
$exkludierte_studiengang_kz = null
|
||||
) {
|
||||
$params = array();
|
||||
|
||||
$qry = "
|
||||
SELECT
|
||||
prestudent.person_id, prestudent.prestudent_id,
|
||||
stg.studiengang_kz, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz
|
||||
FROM
|
||||
public.tbl_prestudent prestudent
|
||||
JOIN public.tbl_studiengang stg USING (studiengang_kz)
|
||||
JOIN public.tbl_student stud USING (prestudent_id)
|
||||
WHERE
|
||||
stg.melderelevant
|
||||
AND prestudent.bismelden
|
||||
AND
|
||||
(
|
||||
SELECT
|
||||
substring(studiensemester_kurzbz, 5, 2)::integer -
|
||||
(CASE
|
||||
WHEN
|
||||
substring(studiensemester_kurzbz, 1, 2) = 'SS'
|
||||
THEN
|
||||
1
|
||||
ELSE
|
||||
0
|
||||
END)::integer
|
||||
FROM
|
||||
public.tbl_prestudentstatus
|
||||
WHERE
|
||||
prestudent_id = prestudent.prestudent_id
|
||||
AND status_kurzbz = 'Student'
|
||||
ORDER BY
|
||||
datum, insertamum, ext_id
|
||||
LIMIT 1
|
||||
) <> substring(stud.matrikelnr, 1, 2)::integer";
|
||||
|
||||
if (isset($studiensemester_kurzbz))
|
||||
{
|
||||
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
$prevStudiensemesterRes = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz);
|
||||
|
||||
if (isError($prevStudiensemesterRes)) return $prevStudiensemesterRes;
|
||||
|
||||
$semesterArr = array($studiensemester_kurzbz);
|
||||
|
||||
if (hasData($prevStudiensemesterRes))
|
||||
{
|
||||
// if Studiensemester given, check only if has status in current or previous semester
|
||||
$semesterArr[] = getData($prevStudiensemesterRes)[0]->studiensemester_kurzbz;
|
||||
}
|
||||
|
||||
$qry .= " AND EXISTS (
|
||||
SELECT 1
|
||||
FROM public.tbl_prestudentstatus ps
|
||||
WHERE studiensemester_kurzbz IN ?
|
||||
AND ps.prestudent_id = prestudent.prestudent_id
|
||||
)";
|
||||
|
||||
$params[] = $semesterArr;
|
||||
}
|
||||
|
||||
if (isset($studiengang_kz))
|
||||
{
|
||||
$qry .= " AND studiengang_kz = ?";
|
||||
$params[] = $studiengang_kz;
|
||||
}
|
||||
|
||||
if (isset($prestudent_id))
|
||||
{
|
||||
$qry .= " AND 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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
require_once('PlausiChecker.php');
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class StudentstatusNachDiplomand extends PlausiChecker
|
||||
{
|
||||
public function executePlausiCheck($params)
|
||||
{
|
||||
$results = array();
|
||||
|
||||
// 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;
|
||||
$prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null;
|
||||
|
||||
// get all students failing the plausicheck
|
||||
$prestudentRes = $this->getStudentstatusNachDiplomand($studiengang_kz, $prestudent_id, $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);
|
||||
}
|
||||
|
||||
/**
|
||||
* There shouldn't be any student status after Diplomand status.
|
||||
* @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 getStudentstatusNachDiplomand($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null)
|
||||
{
|
||||
$params = array();
|
||||
|
||||
$qry = "
|
||||
SELECT
|
||||
DISTINCT prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz
|
||||
FROM
|
||||
public.tbl_student student
|
||||
JOIN public.tbl_prestudent prestudent USING(prestudent_id)
|
||||
JOIN public.tbl_prestudentstatus status USING(prestudent_id)
|
||||
JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz
|
||||
WHERE
|
||||
status.status_kurzbz = 'Diplomand'
|
||||
AND EXISTS (
|
||||
SELECT 1
|
||||
FROM
|
||||
public.tbl_prestudentstatus
|
||||
WHERE
|
||||
prestudent_id = prestudent.prestudent_id
|
||||
AND status_kurzbz = 'Student'
|
||||
AND datum::date > status.datum::date
|
||||
)";
|
||||
|
||||
if (isset($studiengang_kz))
|
||||
{
|
||||
$qry .= " AND stg.studiengang_kz = ?";
|
||||
$params[] = $studiengang_kz;
|
||||
}
|
||||
|
||||
if (isset($prestudent_id))
|
||||
{
|
||||
$qry .= " AND prestudent.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);
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
/**
|
||||
* More than one Zweck for incoming
|
||||
*/
|
||||
|
||||
@@ -390,15 +390,23 @@ function isBuchungAllowedToChange($buchung_obj)
|
||||
* @return array mit error = true und Fehlerbeschreibung wenn ungültig, andernfalls error = false
|
||||
*/
|
||||
function checkStatusaenderung(
|
||||
$prestudent_id, $status_kurzbz, $new_status_studiensemester, $new_status_datum, $new_status_ausbildungssemester,
|
||||
$prestudent_id, $status_kurzbz,
|
||||
$new_status_studiensemester, $new_status_datum, $new_status_ausbildungssemester, $new_studienplan_id,
|
||||
$old_status_studiensemester = '', $old_status_ausbildungssemester = ''
|
||||
)
|
||||
{
|
||||
global $db;
|
||||
|
||||
// load stuidenplan orgform
|
||||
$new_studienplan_orgform_kurzbz = '';
|
||||
$studienplan = new studienplan();
|
||||
if ($studienplan->loadStudienplan($new_studienplan_id))
|
||||
{
|
||||
$new_studienplan_orgform_kurzbz = $studienplan->orgform_kurzbz;
|
||||
}
|
||||
|
||||
// Es ist ein neuer Status wenn es kein altes Semester gibt
|
||||
$isNewStatus = $old_status_studiensemester == '' && $old_status_ausbildungssemester == '';
|
||||
// status_kurzbz für Endstatus
|
||||
$endstatusArr = array('Absolvent', 'Abbrecher');
|
||||
// Datum des neuen Status setzen
|
||||
$new_status_datum = new DateTime($new_status_datum);
|
||||
|
||||
@@ -422,10 +430,16 @@ function checkStatusaenderung(
|
||||
$new_status_semesterstart = new DateTime($studiensemester->start);
|
||||
|
||||
// Alle prestudentstatus nach Datum sortiert
|
||||
$qry = "SELECT status_kurzbz, studiensemester_kurzbz, ausbildungssemester, datum, sem.start AS studiensemester_start
|
||||
FROM public.tbl_prestudentstatus pss
|
||||
JOIN public.tbl_studiensemester sem USING (studiensemester_kurzbz)
|
||||
WHERE prestudent_id=".$db->db_add_param($prestudent_id, FHC_INTEGER);
|
||||
$qry = "SELECT
|
||||
pss.status_kurzbz, sem.studiensemester_kurzbz, pss.ausbildungssemester, pss.datum, sem.start AS studiensemester_start,
|
||||
pl.orgform_kurzbz AS studienplan_orgform_kurzbz, stud.matrikelnr
|
||||
FROM
|
||||
public.tbl_prestudentstatus pss
|
||||
JOIN public.tbl_studiensemester sem USING (studiensemester_kurzbz)
|
||||
LEFT JOIN public.tbl_student stud USING (prestudent_id)
|
||||
LEFT JOIN lehre.tbl_studienplan pl USING (studienplan_id)
|
||||
WHERE
|
||||
prestudent_id=".$db->db_add_param($prestudent_id, FHC_INTEGER);
|
||||
|
||||
// zu ändernden Status rausfiltern wenn Status bearbeitet wird
|
||||
if (!$isNewStatus)
|
||||
@@ -461,6 +475,8 @@ function checkStatusaenderung(
|
||||
$new_status->studiensemester_kurzbz = $new_status_studiensemester;
|
||||
$new_status->datum = $new_status_datum;
|
||||
$new_status->ausbildungssemester = $new_status_ausbildungssemester;
|
||||
$new_status->studienplan_orgform_kurzbz = $new_studienplan_orgform_kurzbz;
|
||||
$new_status->matrikelnr = $row->matrikelnr;
|
||||
$statusArr[] = $new_status;
|
||||
$newStatusInserted = true;
|
||||
}
|
||||
@@ -484,16 +500,28 @@ function checkStatusaenderung(
|
||||
}
|
||||
}
|
||||
|
||||
// status_kurzbz für Endstatus
|
||||
$endstatusArr = array('Absolvent', 'Abbrecher');
|
||||
|
||||
// status_kurzbz Abfolge vor dem Studentstatus
|
||||
$statusAbfolge = array('Interessent', 'Bewerber', 'Aufgenommener');
|
||||
|
||||
// erster Studentstatus
|
||||
$ersterStudent = null;
|
||||
|
||||
// Prüfungen den Prestudentstatus betreffend
|
||||
// Über alle gespeicherten Status gehen und Statusabfolge prüfen
|
||||
for ($i = 0; $i < count($statusArr); $i++)
|
||||
{
|
||||
$next_idx = $i - 1; //absteigend sortiert, nächster Status ist vorheriger Eintrag
|
||||
|
||||
$curr_status = $statusArr[$i];
|
||||
$curr_status_kurzbz = $curr_status->status_kurzbz;
|
||||
$curr_status_ausbildungssemester = $curr_status->ausbildungssemester;
|
||||
$next_idx = $i - 1; //absteigend sortiert, nächster Status ist vorheriger Eintrag
|
||||
$next_status = isset($statusArr[$next_idx]) ? $statusArr[$next_idx] : null;
|
||||
|
||||
if ($curr_status_kurzbz == 'Student') $ersterStudent = $curr_status;
|
||||
|
||||
// Abbrecher- oder Absolventenstatus muss Endstatus sein
|
||||
if (isset($next_status) && in_array($curr_status_kurzbz, $endstatusArr))
|
||||
{
|
||||
@@ -511,7 +539,7 @@ function checkStatusaenderung(
|
||||
{
|
||||
return array(
|
||||
'error' => true,
|
||||
'errormsg' => 'Aufeinanderfolgende Unterbrecher müssen gleiches Ausbildungssemester haben'
|
||||
'errormsg' => 'Aufeinanderfolgende Unterbrecherstatus müssen gleiches Ausbildungssemester haben'
|
||||
);
|
||||
}
|
||||
|
||||
@@ -523,18 +551,68 @@ function checkStatusaenderung(
|
||||
{
|
||||
return array(
|
||||
'error' => true,
|
||||
'errormsg' => 'Unterbrecher und folgender Abbrecher müssen gleiches Ausbildungssemester haben'
|
||||
'errormsg' => 'Unterbrecherstatus und folgender Abbrecherstatus müssen gleiches Ausbildungssemester haben'
|
||||
);
|
||||
}
|
||||
|
||||
// keine Studenten nach Diplomand Status
|
||||
if (
|
||||
isset($next_status) && $curr_status_kurzbz == 'Diplomand' && $next_status->status_kurzbz == 'Student'
|
||||
)
|
||||
if (isset($next_status) && $next_status->status_kurzbz == 'Student')
|
||||
{
|
||||
$restliche_status_obj = array_slice($statusArr, $i);
|
||||
$restliche_status = array_unique(array_column($restliche_status_obj, 'status_kurzbz'));
|
||||
$status_intersected = array_intersect($restliche_status, $statusAbfolge);
|
||||
|
||||
// Vor Studentstatus darf kein Diplomand Status vorhanden sein
|
||||
if (in_array('Diplomand', $restliche_status))
|
||||
{
|
||||
return array(
|
||||
'error' => true,
|
||||
'errormsg' => 'Nach Diplomantenstatus darf kein Studentenstatus mehr eingetragen werden'
|
||||
);
|
||||
}
|
||||
|
||||
// Vor Studentstatus müssen bestimmte Status vorhanden sein
|
||||
if (array_values($status_intersected) != array_values(array_reverse($statusAbfolge)))
|
||||
{
|
||||
return array(
|
||||
'error' => true,
|
||||
'errormsg' => 'Vor dem Studentenstatus müssen folgende Status eingetragen werden: '.implode(', ', $statusAbfolge)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// wenn erster Studentstatus, checken ob Personenkennzeichen passt
|
||||
if (isset($ersterStudent))
|
||||
{
|
||||
$studiensemester = new studiensemester();
|
||||
$studienjahrNumber = $studiensemester->getStudienjahrNumberFromStudiensemester($ersterStudent->studiensemester_kurzbz);
|
||||
|
||||
if ($studienjahrNumber != mb_substr($ersterStudent->matrikelnr, 0, 2))
|
||||
{
|
||||
return array(
|
||||
'error' => true,
|
||||
'errormsg' => 'Nach Diplomantenstatus darf kein Studentenstatus mehr eingetragen werden'
|
||||
'errormsg' => 'Personenkennzeichen passt nicht zu Studiensemester des ersten Studentstatus'
|
||||
);
|
||||
}
|
||||
|
||||
if (!empty(
|
||||
array_filter(
|
||||
$restliche_status_obj,
|
||||
function($s) use($ersterStudent)
|
||||
{
|
||||
return
|
||||
$s->status_kurzbz == 'Bewerber'
|
||||
&& (
|
||||
$s->studienplan_orgform_kurzbz != $ersterStudent->studienplan_orgform_kurzbz
|
||||
);
|
||||
}
|
||||
)
|
||||
)
|
||||
) {
|
||||
return array(
|
||||
'error' => true,
|
||||
'errormsg' => 'Erster Studentstatus muss gleiche Organisationsform haben wie Bewerberstatus (Studienplan Orgform)'
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1003,7 +1081,7 @@ if(!$error)
|
||||
{
|
||||
$return = false;
|
||||
$error = true;
|
||||
$errormsg .= 'Studentstatus mit Datum oder Semesterende vor erreichtem Meldestichtag können nicht hinzugefügt werden.';
|
||||
$errormsg .= 'Studentstatus mit Datum vor erreichtem Meldestichtag können nicht hinzugefügt werden.';
|
||||
$anzahl_fehler++;
|
||||
}
|
||||
|
||||
@@ -1012,7 +1090,8 @@ if(!$error)
|
||||
$_POST['status_kurzbz'],
|
||||
$studiensemester,
|
||||
$new_status_datum,
|
||||
$sem
|
||||
$sem,
|
||||
$_POST['studienplan_id'] ?? ''
|
||||
);
|
||||
|
||||
if (isset($check_statusaenderung_result['error']) && $check_statusaenderung_result['error'] === true)
|
||||
@@ -1225,15 +1304,20 @@ if(!$error)
|
||||
$bismeldestichtag = new bismeldestichtag();
|
||||
$meldestichtag_erreicht = $bismeldestichtag->checkMeldestichtagErreicht($_POST['datum']);
|
||||
|
||||
//erweitertes Löschrecht für RT-Aufsicht bei Status abgewiesen
|
||||
$rtaufsichtUndStatusAbgewiesen = $rechte->isBerechtigt('lehre/reihungstestAufsicht') && $_POST['status_kurzbz']=='Abgewiesener'
|
||||
? true
|
||||
: false;
|
||||
|
||||
if($_POST['status_kurzbz']=='Student' && !$erweiterteBerechtigungen)
|
||||
{
|
||||
$return = false;
|
||||
$errormsg = 'Studentenrolle kann nur durch den Administrator geloescht werden';
|
||||
}
|
||||
elseif ($meldestichtag_erreicht && !$erweiterteBerechtigungen)
|
||||
elseif ($meldestichtag_erreicht && !$erweiterteBerechtigungen && !$rtaufsichtUndStatusAbgewiesen)
|
||||
{
|
||||
$return = false;
|
||||
$errormsg = 'Studentstatus mit Datum oder Semesterende vor erreichtem Meldestichtag können nicht gelöscht werden.';
|
||||
$errormsg = 'Rollen mit Datum vor erreichtem Meldestichtag können nicht gelöscht werden.';
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1273,7 +1357,7 @@ if(!$error)
|
||||
$rolle = new prestudent();
|
||||
if($rolle->load_rolle($_POST['prestudent_id'],$_POST['status_kurzbz'],$_POST['studiensemester_kurzbz'], $_POST['ausbildungssemester']))
|
||||
{
|
||||
if($rechte->isBerechtigt('admin', $_POST['studiengang_kz'], 'suid') || $rechte->isBerechtigt('assistenz', $_POST['studiengang_kz'], 'suid'))
|
||||
if($rechte->isBerechtigt('admin', $_POST['studiengang_kz'], 'suid') || $rechte->isBerechtigt('assistenz', $_POST['studiengang_kz'], 'suid') || $rtaufsichtUndStatusAbgewiesen)
|
||||
{
|
||||
if($rolle->delete_rolle($_POST['prestudent_id'],$_POST['status_kurzbz'],$_POST['studiensemester_kurzbz'], $_POST['ausbildungssemester']))
|
||||
{
|
||||
@@ -1544,6 +1628,7 @@ if(!$error)
|
||||
$_POST['studiensemester_kurzbz'],
|
||||
$_POST['datum'],
|
||||
$_POST['ausbildungssemester'],
|
||||
$_POST['studienplan_id'],
|
||||
$_POST['studiensemester_old'],
|
||||
$_POST['ausbildungssemester_old']
|
||||
);
|
||||
@@ -1559,11 +1644,11 @@ if(!$error)
|
||||
$bismeldestichtag = new bismeldestichtag();
|
||||
$meldestichtag_erreicht = $bismeldestichtag->checkMeldestichtagErreicht($_POST['datum']);
|
||||
|
||||
if ($meldestichtag_erreicht === true)
|
||||
if ($meldestichtag_erreicht === true && !($_POST['exceptionValidationBismeldung'] == 'true'))
|
||||
{
|
||||
$return = false;
|
||||
$error = true;
|
||||
$errormsg = 'Studentstatus mit Datum oder Semesterende vor erreichtem Meldestichtag können nicht hinzugefügt werden.';
|
||||
$errormsg = 'Studentstatus mit Datum vor erreichtem Meldestichtag können nicht bearbeitet werden.';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2267,6 +2267,7 @@ function StudentRolleSpeichern(dialog, studiensemester_old, ausbildungssemester_
|
||||
rt_stufe = dialog.getElementById('student-rolle-menulist-stufe').value;
|
||||
statusgrund_id = dialog.getElementById('student-rolle-menulist-statusgrund').value;
|
||||
bewerbung_abgeschicktamum = dialog.getElementById('student-rolle-datum-bewerbung_abgeschicktamum').value;
|
||||
exceptionValidationBismeldung = dialog.getElementById('student-rolle-bis-exception').checked;
|
||||
|
||||
if(!CheckDatum(datum))
|
||||
{
|
||||
@@ -2333,6 +2334,7 @@ function StudentRolleSpeichern(dialog, studiensemester_old, ausbildungssemester_
|
||||
req.add('rt_stufe', rt_stufe);
|
||||
req.add('statusgrund_id', statusgrund_id);
|
||||
req.add('bewerbung_abgeschicktamum', bewerbung_abgeschicktamum);
|
||||
req.add('exceptionValidationBismeldung', exceptionValidationBismeldung);
|
||||
|
||||
var response = req.executePOST();
|
||||
|
||||
|
||||
@@ -86,13 +86,19 @@ if($prestudent_id!='')
|
||||
$disabled = $bismeldestichtag->checkMeldestichtagErreicht($datum) && !$rechte->isBerechtigt('student/keine_studstatuspruefung', null, 'suid')
|
||||
? ' disabled="true"'
|
||||
: '';
|
||||
$isStatusBeforeStudent = in_array($status_kurzbz, array('Student','Diplomand','Absovlent','Incoming','Abbrecher','Unterbrecher'))
|
||||
? false
|
||||
: true;
|
||||
$disabledStudent = $isStatusBeforeStudent
|
||||
? ' '
|
||||
: ' disabled="true"';
|
||||
}
|
||||
?>
|
||||
|
||||
<window id="student-rolle-dialog" title="Status"
|
||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||
onload="StudentRolleInit(<?php echo "'$prestudent_id','$status_kurzbz','$studiensemester_kurzbz','$ausbildungssemester'";?>)"
|
||||
>
|
||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||
onload="StudentRolleInit(<?php echo "'$prestudent_id','$status_kurzbz','$studiensemester_kurzbz','$ausbildungssemester'";?>)"
|
||||
>
|
||||
|
||||
<script type="application/x-javascript" src="<?php echo APP_ROOT; ?>content/student/studentrolledialog.js.php" />
|
||||
<script type="application/x-javascript" src="<?php echo APP_ROOT; ?>content/functions.js.php" />
|
||||
@@ -100,8 +106,11 @@ if($prestudent_id!='')
|
||||
<vbox>
|
||||
<textbox id="student-rolle-textbox-prestudent_id" value="" hidden="true" />
|
||||
<groupbox id="student-rolle-groupbox" flex="1">
|
||||
<?php if ($disabled): ?>
|
||||
<label class="warning">Meldestichtag erreicht - Bearbeiten nicht mehr möglich</label>
|
||||
<?php if ($disabled && !$isStatusBeforeStudent): ?>
|
||||
<label class="warning">Meldestichtag erreicht - ausschließlich Bearbeiten Statusgrund möglich</label>
|
||||
<?php endif; ?>
|
||||
<?php if ($disabled && $isStatusBeforeStudent): ?>
|
||||
<label class="warning">Meldestichtag erreicht - Bearbeiten Ausbildungssemester und Statusgrund möglich</label>
|
||||
<?php endif; ?>
|
||||
<caption label="Details<?php echo ($nachname!=''?" $nachname $vorname":'');?>"/>
|
||||
<grid id="student-rolle-grid-detail" style="margin:4px;" flex="1">
|
||||
@@ -131,20 +140,20 @@ if($prestudent_id!='')
|
||||
<row>
|
||||
<label value="Studiensemester" control="student-rolle-menulist-studiensemester"/>
|
||||
<menulist id="student-rolle-menulist-studiensemester"
|
||||
datasources="<?php echo APP_ROOT ?>rdf/studiensemester.rdf.php?order=desc" flex="1"
|
||||
ref="http://www.technikum-wien.at/studiensemester/liste"<?php echo $disabled ?> >
|
||||
datasources="<?php echo APP_ROOT ?>rdf/studiensemester.rdf.php?order=desc" flex="1"
|
||||
ref="http://www.technikum-wien.at/studiensemester/liste"<?php echo $disabled ?> >
|
||||
<template>
|
||||
<menupopup>
|
||||
<menuitem value="rdf:http://www.technikum-wien.at/studiensemester/rdf#kurzbz"
|
||||
label="rdf:http://www.technikum-wien.at/studiensemester/rdf#kurzbz"
|
||||
uri="rdf:*"/>
|
||||
label="rdf:http://www.technikum-wien.at/studiensemester/rdf#kurzbz"
|
||||
uri="rdf:*"/>
|
||||
</menupopup>
|
||||
</template>
|
||||
</menulist>
|
||||
</row>
|
||||
<row>
|
||||
<label value="Ausbildungssemester" control="student-rolle-menulist-ausbildungssemester"/>
|
||||
<menulist id="student-rolle-menulist-ausbildungssemester"<?php echo $disabled ?> >
|
||||
<menulist id="student-rolle-menulist-ausbildungssemester"<?php echo $disabledStudent ?> >
|
||||
<menupopup>
|
||||
<?php
|
||||
|
||||
@@ -253,23 +262,28 @@ if($prestudent_id!='')
|
||||
<row>
|
||||
<label value="Grund"/>
|
||||
<menulist id="student-rolle-menulist-statusgrund"
|
||||
datasources="rdf:null" flex="1"
|
||||
ref="http://www.technikum-wien.at/statusgrund"<?php echo $disabled ?> >
|
||||
datasources="rdf:null" flex="1"
|
||||
ref="http://www.technikum-wien.at/statusgrund">
|
||||
<template>
|
||||
<menupopup>
|
||||
<menuitem value="rdf:http://www.technikum-wien.at/statusgrund/rdf#statusgrund_id"
|
||||
label="rdf:http://www.technikum-wien.at/statusgrund/rdf#bezeichnung_mehrsprachig"
|
||||
uri="rdf:*"/>
|
||||
label="rdf:http://www.technikum-wien.at/statusgrund/rdf#bezeichnung_mehrsprachig"
|
||||
uri="rdf:*"/>
|
||||
</menupopup>
|
||||
</template>
|
||||
</menulist>
|
||||
</row>
|
||||
<row hidden="true">
|
||||
<label value="exceptionBisValidation" control="student-rolle-bis-exception"/>
|
||||
<checkbox id="student-rolle-bis-exception" checked="<?php echo ($disabled) ? 'true' : 'false' ?>"/>
|
||||
</row>
|
||||
</rows>
|
||||
</grid>
|
||||
<hbox>
|
||||
<spacer flex="1" />
|
||||
<button id="student-rolle-button-speichern" oncommand="StudentRolleSpeichern()" label="Speichern"<?php echo $disabled ?> />
|
||||
<button id="student-rolle-button-speichern" oncommand="StudentRolleSpeichern()" label="Speichern"/>
|
||||
</hbox>
|
||||
|
||||
</groupbox>
|
||||
</vbox>
|
||||
</window>
|
||||
|
||||
@@ -1157,5 +1157,17 @@ class studiensemester extends basis_db
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Holt Studienjahr von Studiensemester (letzte zwei Ziffern), z.B. 24 für WS2024 und SS2025
|
||||
* @param studiensemester_kurzbz
|
||||
* @return string Studienjahr Nummer
|
||||
*/
|
||||
public function getStudienjahrNumberFromStudiensemester($studiensemester_kurzbz)
|
||||
{
|
||||
$studienjahrNumber = mb_substr($studiensemester_kurzbz,4,2);
|
||||
if (is_numeric($studienjahrNumber) && mb_substr($studiensemester_kurzbz,0,2)=='SS') $studienjahrNumber -= 1;
|
||||
return $studienjahrNumber;
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -293,6 +293,54 @@ $fehlerArr = array(
|
||||
'fehlertyp_kurzbz' => 'error',
|
||||
'app' => 'core'
|
||||
),
|
||||
array(
|
||||
'fehlercode' => 'CORE_STUDENTSTATUS_0017',
|
||||
'fehler_kurzbz' => 'BeginndatumVorBismeldung',
|
||||
'fehlercode_extern' => null,
|
||||
'fehlertext' => 'Statusdatum vor Bismeldedatum eingetragen, nachdem das Bismeldedatum erreicht wurde (prestudent_id %s, Studiensemester %s)',
|
||||
'fehlertyp_kurzbz' => 'error',
|
||||
'app' => 'core'
|
||||
),
|
||||
array(
|
||||
'fehlercode' => 'CORE_STUDENTSTATUS_0018',
|
||||
'fehler_kurzbz' => 'StudentstatusNachDiplomand',
|
||||
'fehlercode_extern' => null,
|
||||
'fehlertext' => 'Studentstatus nach Diplomandenstatus (prestudent_id %s)',
|
||||
'fehlertyp_kurzbz' => 'error',
|
||||
'app' => 'core'
|
||||
),
|
||||
array(
|
||||
'fehlercode' => 'CORE_STUDENTSTATUS_0019',
|
||||
'fehler_kurzbz' => 'OrgformBewerberUngleichOrgformStudent',
|
||||
'fehlercode_extern' => null,
|
||||
'fehlertext' => 'Orgform des Bewerbers (Studienplan) stimmt nicht mit Orgform des ersten Studenten überein (prestudent_id %s, Student Studiensemester %s, Bewerber Studiensemester %s)',
|
||||
'fehlertyp_kurzbz' => 'error',
|
||||
'app' => 'core'
|
||||
),
|
||||
array(
|
||||
'fehlercode' => 'CORE_STUDENTSTATUS_0020',
|
||||
'fehler_kurzbz' => 'StartsemesterUngleichPersonenkennzeichen',
|
||||
'fehlercode_extern' => null,
|
||||
'fehlertext' => 'Semester des ersten Studentstatus stimmt nicht mit Personenkennzeichen überein (prestudent_id %s)',
|
||||
'fehlertyp_kurzbz' => 'error',
|
||||
'app' => 'core'
|
||||
),
|
||||
array(
|
||||
'fehlercode' => 'CORE_STUDENTSTATUS_0021',
|
||||
'fehler_kurzbz' => 'AbschlusspruefungOderAbsolventFehlt',
|
||||
'fehlercode_extern' => null,
|
||||
'fehlertext' => 'Keine Abschlussprüfung vor der Bismeldung oder kein Absolventenstatus vor der Bismeldung (prestudent_id %s)',
|
||||
'fehlertyp_kurzbz' => 'error',
|
||||
'app' => 'core'
|
||||
),
|
||||
array(
|
||||
'fehlercode' => 'CORE_STUDENTSTATUS_0022',
|
||||
'fehler_kurzbz' => 'FalscheStatusabfolgeVorStudentstatus',
|
||||
'fehlercode_extern' => null,
|
||||
'fehlertext' => 'Falsche Statusabfolge vor Studentstatus (prestudent_id %s, Studiensemester%s, richtige Abfolge: %s)',
|
||||
'fehlertyp_kurzbz' => 'error',
|
||||
'app' => 'core'
|
||||
),
|
||||
array(
|
||||
'fehlercode' => 'CORE_PERSON_0001',
|
||||
'fehler_kurzbz' => 'GbDatumWeitZurueck',
|
||||
|
||||
Reference in New Issue
Block a user