diff --git a/application/config/issueList.php b/application/config/issueList.php
new file mode 100644
index 000000000..e4e4f278c
--- /dev/null
+++ b/application/config/issueList.php
@@ -0,0 +1,11 @@
+terminateWithJsonError("Bitte füllen Sie alle Felder aus");
- foreach($personen as $person)
+ if ($studiengang === 'all' && $abgeschickt === 'all')
{
- $prestudent = $this->PrestudentModel->getPrestudentByStudiengangAndPerson($studiengang, $person, $studienSemester, $abgeschickt);
+ foreach($personen as $person)
+ {
+ $prestudenten = $this->PrestudentModel->getByPersonWithoutLehrgang($person, $studienSemester);
- if (!hasData($prestudent))
- continue;
+ if (!hasData($prestudenten))
+ continue;
- $prestudentData = getData($prestudent);
+ $prestudentenData = getData($prestudenten);
+
+ foreach ($prestudentenData as $prestudent)
+ {
+ $this->saveAbsage($prestudent->prestudent_id, $statusgrund);
+ }
+ }
+ }
+ else
+ {
+ $this->load->model('organisation/Studienplan_model', 'StudienplanModel');
+
+ $this->StudienplanModel->addSelect('1');
+ $this->StudienplanModel->addJoin('lehre.tbl_studienordnung so', 'studienordnung_id');
+ $escaped = $this->StudienplanModel->db->escape(strtoupper($studiengang));
+ $this->StudienplanModel->db->where("UPPER(so.studiengangkurzbzlang || ':' || tbl_studienplan.orgform_kurzbz) = $escaped");
+ $this->StudienplanModel->addLimit(1);
+ $studiengangResult = $this->StudienplanModel->load();
+
+ if (hasData($studiengangResult))
+ {
+ foreach($personen as $person)
+ {
+ $prestudent = $this->PrestudentModel->getPrestudentByStudiengangAndPerson($studiengang, $person, $studienSemester, $abgeschickt, $abgeschickt === 'all');
+
+ if (!hasData($prestudent))
+ continue;
+
+ $prestudentData = getData($prestudent);
+ $this->saveAbsage($prestudentData[0]->prestudent_id, $statusgrund);
+ }
+ }
+ else
+ $this->terminateWithJsonError("Falschen Studiengang übergeben!");
- $this->saveAbsage($prestudentData[0]->prestudent_id, $statusgrund);
}
$this->outputJsonSuccess("Success");
diff --git a/application/controllers/system/infocenter/Rueckstellung.php b/application/controllers/system/infocenter/Rueckstellung.php
index 62af633ca..b1f2b60b7 100644
--- a/application/controllers/system/infocenter/Rueckstellung.php
+++ b/application/controllers/system/infocenter/Rueckstellung.php
@@ -14,7 +14,8 @@ class Rueckstellung extends Auth_Controller
'get' => array('infocenter:r', 'lehre/zgvpruefung:r'),
'set' => array('infocenter:r', 'lehre/zgvpruefung:r'),
'delete' => array('infocenter:r', 'lehre/zgvpruefung:r'),
- 'getStatus' => array('infocenter:rw', 'lehre/zgvpruefung:rw')
+ 'getStatus' => array('infocenter:rw', 'lehre/zgvpruefung:rw'),
+ 'setForPersonen' => array('infocenter:rw', 'lehre/zgvpruefung:rw'),
)
);
@@ -79,7 +80,34 @@ class Rueckstellung extends Auth_Controller
$this->outputJson($result);
}
-
+
+ public function setForPersonen()
+ {
+ $personen = $this->input->post('personen');
+ $datum_bis = $this->input->post('datum_bis');
+ $status_kurzbz = $this->input->post('status_kurzbz');
+
+ foreach ($personen as $person)
+ {
+ $rueckstellung = $this->_ci->RueckstellungModel->loadWhere(array('person_id' => $person));
+ if (hasData($rueckstellung))
+ continue;
+
+ $result = $this->_ci->RueckstellungModel->insert(
+ array('person_id' => $person,
+ 'status_kurzbz' => $status_kurzbz,
+ 'datum_bis' => date_format(date_create($datum_bis), 'Y-m-d'),
+ 'insertvon' => $this->_uid
+ )
+ );
+
+ if (isError($result))
+ $this->terminateWithJsonError(getError($result));
+ $this->_log($person, $status_kurzbz);
+ }
+ $this->outputJsonSuccess("Erfolgreich gespeichert!");
+ }
+
public function delete()
{
$person_id = $this->input->post('person_id');
diff --git a/application/controllers/system/issues/Issues.php b/application/controllers/system/issues/Issues.php
index 44c2ff5d3..27a928fb4 100644
--- a/application/controllers/system/issues/Issues.php
+++ b/application/controllers/system/issues/Issues.php
@@ -6,7 +6,6 @@ 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()
@@ -28,6 +27,9 @@ class Issues extends Auth_Controller
$this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
$this->load->model('system/Sprache_model', 'SpracheModel');
+ // load config
+ $this->load->config('issueList');
+
$this->loadPhrases(
array(
'global',
@@ -47,10 +49,12 @@ class Issues extends Auth_Controller
{
$oes_for_issues = $this->_getOesForIssues();
$language_index = $this->_getLanguageIndex();
+ $apps = $this->config->item('issues_list_apps');
+ $status = $this->config->item('issues_list_status');
$this->load->view(
'system/issues/issues',
- array_merge($oes_for_issues, array('language_index' => $language_index))
+ array_merge($oes_for_issues, array('language_index' => $language_index, 'apps' => $apps, 'status' => $status))
);
}
@@ -121,6 +125,8 @@ class Issues extends Auth_Controller
$oe_kurzbz_for_funktion = array();
$benutzerfunktionRes = $this->BenutzerfunktionModel->getBenutzerFunktionByUid($this->_uid, null, date('Y-m-d'), date('Y-m-d'));
+ $functions = $this->config->item('issues_list_functions');
+
if (isError($benutzerfunktionRes))
show_error(getError($benutzerfunktionRes));
@@ -130,8 +136,8 @@ class Issues extends Auth_Controller
{
$all_funktionen_oe_kurzbz[$benutzerfunktion->oe_kurzbz][] = $benutzerfunktion->funktion_kurzbz;
- // separate oes for the additional funktion which enables displaying issues
- if ($benutzerfunktion->funktion_kurzbz == self::FUNKTION_KURZBZ)
+ // separate oes for the additional functions which enables displaying issues
+ if (in_array($benutzerfunktion->funktion_kurzbz, $functions))
{
$oe_kurzbz_for_funktion[] = $benutzerfunktion->oe_kurzbz;
diff --git a/application/models/crm/Prestudent_model.php b/application/models/crm/Prestudent_model.php
index 242c26518..ff56c3268 100644
--- a/application/models/crm/Prestudent_model.php
+++ b/application/models/crm/Prestudent_model.php
@@ -677,7 +677,7 @@ class Prestudent_model extends DB_Model
));
}
- public function getPrestudentByStudiengangAndPerson($studiengang, $person, $studienSemester, $abgeschickt)
+ public function getPrestudentByStudiengangAndPerson($studiengang, $person, $studienSemester, $abgeschickt, $ignoreAbgeschickt = false)
{
$query = "SELECT ps.prestudent_id
FROM public.tbl_prestudentstatus pss
@@ -687,22 +687,42 @@ class Prestudent_model extends DB_Model
JOIN lehre.tbl_studienordnung so USING(studienordnung_id)
WHERE ps.person_id = ?
AND UPPER(so.studiengangkurzbzlang || ':' || sp.orgform_kurzbz) = ?
- AND pss.studiensemester_kurzbz = ?
- AND";
+ AND pss.studiensemester_kurzbz = ?";
- if ($abgeschickt === 'true')
- $query .= " EXISTS";
- else
- $query .= " NOT EXISTS";
+ if (!$ignoreAbgeschickt)
+ {
+ $query .= "AND";
- $query .= " (SELECT 1 FROM public.tbl_prestudentstatus spss
+ if ($abgeschickt === 'true')
+ $query .= " EXISTS";
+ else
+ $query .= " NOT EXISTS";
+
+ $query .= " (SELECT 1 FROM public.tbl_prestudentstatus spss
JOIN public.tbl_prestudent sps USING(prestudent_id)
WHERE sps.prestudent_id = ps.prestudent_id
AND spss.bewerbung_abgeschicktamum IS NOT NULL)";
+ }
return $this->execQuery($query, array($person, $studiengang, $studienSemester));
}
+ public function getByPersonWithoutLehrgang($person, $studienSemester)
+ {
+ $query = "SELECT DISTINCT(ps.prestudent_id)
+ FROM public.tbl_prestudentstatus pss
+ JOIN public.tbl_prestudent ps USING(prestudent_id)
+ JOIN public.tbl_studiengang sg USING(studiengang_kz)
+ JOIN lehre.tbl_studienplan sp USING(studienplan_id)
+ JOIN lehre.tbl_studienordnung so USING(studienordnung_id)
+ WHERE ps.person_id = ?
+ AND (sg.typ = 'b' OR sg.typ = 'm')
+ AND pss.studiensemester_kurzbz = ?";
+
+ return $this->execQuery($query, array($person, $studienSemester));
+ }
+
+
/**
* Gets förderrelevant flag for a prestudent, from prestudent, or, if not set on prestudent level, from studiengang
* @param int $prestudent_id
diff --git a/application/views/system/infocenter/infocenter.php b/application/views/system/infocenter/infocenter.php
index 0b7a20c2c..157f98bf1 100644
--- a/application/views/system/infocenter/infocenter.php
+++ b/application/views/system/infocenter/infocenter.php
@@ -14,12 +14,13 @@
'navigationwidget' => true,
'dialoglib' => true,
'phrases' => array(
+ 'infocenter' => array('statusAuswahl'),
'person' => array('vorname', 'nachname'),
'global' => array('mailAnXversandt'),
'ui' => array('bitteEintragWaehlen')
),
'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css', 'public/css/infocenter/infocenterPersonDataset.css'),
- 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/infocenterPersonDataset.js')
+ 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/rueckstellung.js', 'public/js/infocenter/infocenterPersonDataset.js')
);
$this->load->view('templates/FHC-Header', $includesArray);
diff --git a/application/views/system/infocenter/infocenterAbgewiesen.php b/application/views/system/infocenter/infocenterAbgewiesen.php
index 921d9f224..7129a3250 100644
--- a/application/views/system/infocenter/infocenterAbgewiesen.php
+++ b/application/views/system/infocenter/infocenterAbgewiesen.php
@@ -20,7 +20,7 @@
'ui' => array('bitteEintragWaehlen')
),
'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css', 'public/css/infocenter/infocenterPersonDataset.css'),
- 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/infocenterPersonDataset.js')
+ 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/rueckstellung.js', 'public/js/infocenter/infocenterPersonDataset.js')
)
);
?>
diff --git a/application/views/system/infocenter/infocenterAufgenommen.php b/application/views/system/infocenter/infocenterAufgenommen.php
index 680d66a8a..d57f31d6b 100644
--- a/application/views/system/infocenter/infocenterAufgenommen.php
+++ b/application/views/system/infocenter/infocenterAufgenommen.php
@@ -20,7 +20,7 @@
'ui' => array('bitteEintragWaehlen')
),
'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css', 'public/css/infocenter/infocenterPersonDataset.css'),
- 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/infocenterPersonDataset.js')
+ 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/rueckstellung.js', 'public/js/infocenter/infocenterPersonDataset.js')
)
);
?>
diff --git a/application/views/system/infocenter/infocenterFreigegeben.php b/application/views/system/infocenter/infocenterFreigegeben.php
index a240a0b5c..d843cc5c9 100644
--- a/application/views/system/infocenter/infocenterFreigegeben.php
+++ b/application/views/system/infocenter/infocenterFreigegeben.php
@@ -20,7 +20,7 @@
'ui' => array('bitteEintragWaehlen')
),
'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css', 'public/css/infocenter/infocenterPersonDataset.css'),
- 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/infocenterPersonDataset.js')
+ 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/rueckstellung.js', 'public/js/infocenter/infocenterPersonDataset.js')
)
);
?>
diff --git a/application/views/system/infocenter/infocenterReihungstestAbsolviert.php b/application/views/system/infocenter/infocenterReihungstestAbsolviert.php
index a86e0df97..eef2a214a 100644
--- a/application/views/system/infocenter/infocenterReihungstestAbsolviert.php
+++ b/application/views/system/infocenter/infocenterReihungstestAbsolviert.php
@@ -20,7 +20,7 @@
'ui' => array('bitteEintragWaehlen')
),
'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css', 'public/css/infocenter/infocenterPersonDataset.css'),
- 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/infocenterPersonDataset.js')
+ 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/rueckstellung.js', 'public/js/infocenter/infocenterPersonDataset.js')
)
);
?>
diff --git a/application/views/system/issues/issuesData.php b/application/views/system/issues/issuesData.php
index c60b03a74..edaee9058 100644
--- a/application/views/system/issues/issuesData.php
+++ b/application/views/system/issues/issuesData.php
@@ -1,11 +1,21 @@
db->escape($string); }, array_keys($all_funktionen_oe_kurzbz))) . ")";
+
// all oes for which logged user has issues permissions, including permissions for "special" issue funktion
-$ALL_OE_KURZBZ_BERECHTIGT = "('" . implode("','", $all_oe_kurzbz_berechtigt) . "')";
-$RELEVANT_PRESTUDENT_STATUS = "('Aufgenommener', 'Student', 'Incoming', 'Diplomand', 'Abbrecher', 'Unterbrecher', 'Absolvent')";
+$ALL_OE_KURZBZ_BERECHTIGT = isEmptyArray($all_oe_kurzbz_berechtigt) ? "(NULL)"
+ : "(" . implode(",", array_map(function($string) { return $this->db->escape($string); }, $all_oe_kurzbz_berechtigt)) . ")";
+
+// app apps for which issues should be displayed
+$APPS = isEmptyArray($apps) ? "" : "(" . implode(",", array_map(function($string) { return $this->db->escape($string); }, $apps)) . ")";
+
+// all prestudent status for which issues should be displayed
+$RELEVANT_PRESTUDENT_STATUS = isEmptyArray($status) ? ""
+ : "(" . implode(",", array_map(function($string) { return $this->db->escape($string); }, $status)) . ")";
// get issues for the oes of the logged user or for the persons (students, oe-zuordnung) of the oes
$query = "WITH zustaendigkeiten AS (
@@ -37,8 +47,8 @@ $query .= "
SELECT
issue_id, fehlercode AS \"Fehlercode\", fehler_kurzbz AS \"Fehler Kurzbezeichnung\", iss.fehlercode_extern AS \"Fehlercode extern\", datum AS \"Datum\",
inhalt AS \"Inhalt\", inhalt_extern AS \"Inhalt extern\", iss.person_id AS \"PersonId\", iss.oe_kurzbz AS \"OE\",
- ftyp.bezeichnung_mehrsprachig[".$language_index."] AS \"Fehlertyp\",
- stat.bezeichnung_mehrsprachig[".$language_index."] AS \"Fehlerstatus\",
+ ftyp.bezeichnung_mehrsprachig[".$this->db->escape($language_index)."] AS \"Fehlertyp\",
+ stat.bezeichnung_mehrsprachig[".$this->db->escape($language_index)."] AS \"Fehlerstatus\",
verarbeitetvon AS \"Verarbeitet von\",verarbeitetamum AS \"Verarbeitet am\", fr.app AS \"Applikation\",
fr.fehlertyp_kurzbz AS \"Fehlertypcode\", iss.status_kurzbz AS \"Statuscode\",
pers.vorname AS \"Vorname\", pers.nachname AS \"Nachname\",
@@ -118,44 +128,48 @@ $query .= "
JOIN system.tbl_issue_status stat USING (status_kurzbz)
LEFT JOIN public.tbl_person pers ON iss.person_id = pers.person_id
WHERE
- fr.app IN ('core', 'dvuh')
- AND (
+ (
EXISTS ( /* if oe or person is specified in fehler_zustaendigkeiten */
SELECT 1 FROM zustaendigkeiten
WHERE fehlercode = iss.fehlercode
AND zustaendig = TRUE)";
// show issue if it is assigend to oe of logged in user or to student of oe of logged in user
-if (!isEmptyArray($all_oe_kurzbz_berechtigt))
-{
- $query .= " OR iss.oe_kurzbz IN $ALL_OE_KURZBZ_BERECHTIGT /* if issue is for oe */";
+$query .= " OR iss.oe_kurzbz IN $ALL_OE_KURZBZ_BERECHTIGT /* if issue is for oe */";
+
+$query .= " OR (iss.oe_kurzbz IS NULL AND EXISTS ( /* if person_id of issue is a student of studiengang oe */
+ SELECT 1 FROM public.tbl_prestudent ps
+ JOIN public.tbl_prestudentstatus pss USING (prestudent_id)
+ JOIN public.tbl_studiengang stg USING (studiengang_kz)
+ WHERE person_id = iss.person_id
+ AND stg.oe_kurzbz IN ".$ALL_OE_KURZBZ_BERECHTIGT;
+
+if (!isEmptyString($RELEVANT_PRESTUDENT_STATUS)) $query .= " AND pss.status_kurzbz IN ".$RELEVANT_PRESTUDENT_STATUS;
+
+$query .= " AND NOT EXISTS (SELECT 1 /* irrelevant if already finished studies and studied a while ago */
+ FROM public.tbl_prestudentstatus ps_finished
+ JOIN public.tbl_studiensemester sem_finished USING (studiensemester_kurzbz)
+ WHERE prestudent_id = ps.prestudent_id
+ AND status_kurzbz IN ('Absolvent','Abbrecher','Abgewiesener')
+ AND datum::date + interval '2 months' < NOW()
+ AND EXISTS (SELECT 1 FROM public.tbl_prestudent /* if more recent prestudent exists, still display the issue */
+ JOIN public.tbl_prestudentstatus USING (prestudent_id)
+ JOIN public.tbl_studiensemester USING (studiensemester_kurzbz)
+ WHERE person_id = ps.person_id
+ AND prestudent_id <> ps_finished.prestudent_id
+ AND tbl_studiensemester.start::date > sem_finished.start::date";
+
+if (!isEmptyString($RELEVANT_PRESTUDENT_STATUS)) $query .= " AND tbl_prestudentstatus.status_kurzbz IN ".$RELEVANT_PRESTUDENT_STATUS;
+
+$query .= ")
+ )
+ )
+ )";
- $query .= " OR (iss.oe_kurzbz IS NULL AND EXISTS ( /* if person_id of issue is a student of studiengang oe */
- SELECT 1 FROM public.tbl_prestudent ps
- JOIN public.tbl_prestudentstatus pss USING (prestudent_id)
- JOIN public.tbl_studiengang stg USING (studiengang_kz)
- WHERE person_id = iss.person_id
- AND stg.oe_kurzbz IN $ALL_OE_KURZBZ_BERECHTIGT
- AND pss.status_kurzbz IN $RELEVANT_PRESTUDENT_STATUS
- AND NOT EXISTS (SELECT 1 /* irrelevant if already finished studies and studied a while ago */
- FROM public.tbl_prestudentstatus ps_finished
- JOIN public.tbl_studiensemester sem_finished USING (studiensemester_kurzbz)
- WHERE prestudent_id = ps.prestudent_id
- AND status_kurzbz IN ('Absolvent','Abbrecher','Abgewiesener')
- AND datum::date + interval '2 months' < NOW()
- AND EXISTS (SELECT 1 FROM public.tbl_prestudent /* if more recent prestudent exists, still display the issue */
- JOIN public.tbl_prestudentstatus USING (prestudent_id)
- JOIN public.tbl_studiensemester USING (studiensemester_kurzbz)
- WHERE tbl_prestudentstatus.status_kurzbz IN $RELEVANT_PRESTUDENT_STATUS
- AND person_id = ps.person_id
- AND prestudent_id <> ps_finished.prestudent_id
- AND tbl_studiensemester.start::date > sem_finished.start::date)
- )
- )
- )";
-}
$query .= ") ";
+if (!isEmptyString($APPS)) $query .= " AND fr.app IN ".$APPS;
+
$query .= " ORDER BY
CASE
WHEN fehlertyp_kurzbz = '".IssuesLib::ERRORTYPE_CODE."' THEN 0
diff --git a/public/js/infocenter/infocenterPersonDataset.js b/public/js/infocenter/infocenterPersonDataset.js
index b7334d265..14fba0779 100644
--- a/public/js/infocenter/infocenterPersonDataset.js
+++ b/public/js/infocenter/infocenterPersonDataset.js
@@ -50,12 +50,21 @@ var InfocenterPersonDataset = {
'' +
'' +
'';
+ let rueckstellung = '
' +
+ '' +
+ '' +
+ '';
+
InfocenterPersonDataset.getAbsageData();
+ Rueckstellung.getStatus()
var studienSemesterHtml = '