Compare commits

...
14 changed files with 662 additions and 15 deletions
@@ -53,6 +53,12 @@ class InfoCenter extends Auth_Controller
'message' => 'ZGV saved for degree program %s, prestudentid %s',
'success' => null
),
'savekarrierepfad' => array(
'logtype' => 'Action',
'name' => 'Karrierepfad changed',
'message' => 'Karrierepfad of prestudentid %s changed from %s to %s',
'success' => null
),
'abgewiesen' => array(
'logtype' => 'Processstate',
'name' => 'Interessent rejected',
@@ -162,6 +168,7 @@ class InfoCenter extends Auth_Controller
$this->load->model('crm/Dokument_model', 'DokumentModel');
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
$this->load->model('crm/Karrierepfad_model', 'KarrierepfadModel');
$this->load->model('crm/Statusgrund_model', 'StatusgrundModel');
$this->load->model('crm/ZGVPruefung_model', 'ZGVPruefungModel');
$this->load->model('crm/ZGVPruefungStatus_model', 'ZGVPruefungStatusModel');
@@ -545,7 +552,8 @@ class InfoCenter extends Auth_Controller
}
/**
* Saves a ZGV for a prestudent, includes Ort, Datum, Nation for bachelor and master
* Saves a ZGV for a prestudent, includes Ort, Datum, Nation for bachelor and master.
* Also saves the Karrierepfad, if the panel has the select.
*/
public function saveZgvPruefung()
{
@@ -570,6 +578,21 @@ class InfoCenter extends Auth_Controller
$prestudent = $this->PrestudentModel->getPrestudentWithZgv($prestudent_id);
$prestudentdata = getData($prestudent);
// Only the select of an editable panel posts karrierepfad_id
// Rule: empty, or aktiv and linked to the Studienplan of the last status
$karrierepfad_id = $this->input->post('karrierepfad_id') === '' ? null : $this->input->post('karrierepfad_id');
$karrierepfadChanged = $this->input->post('karrierepfad_id') !== null && $karrierepfad_id != $prestudentdata->karrierepfad_id;
$karrierepfadSelectable = true;
if ($karrierepfadChanged && $karrierepfad_id !== null)
{
$karrierepfade = isset($prestudentdata->prestudentstatus->studienplan_id) ?
$this->KarrierepfadModel->getByStudienplan($prestudentdata->prestudentstatus->studienplan_id) :
null;
$karrierepfadSelectable = hasData($karrierepfade)
&& in_array($karrierepfad_id, array_column(getData($karrierepfade), 'karrierepfad_id'));
}
if ($prestudentdata->studiengangtyp === 'm')
{
// zgvmasterdata
@@ -614,6 +637,9 @@ class InfoCenter extends Auth_Controller
$updateArray = array_merge($updateArray, $updateMasterArray);
}
if ($karrierepfadChanged && $karrierepfadSelectable)
$updateArray['karrierepfad_id'] = $karrierepfad_id;
$prestresult = $this->PrestudentModel->update(
$prestudent_id,
$updateArray
@@ -623,6 +649,8 @@ class InfoCenter extends Auth_Controller
$json = error('Error when updating Prestudent!');
elseif (isError($semresult))
$json = error('Error when updating Ausbildungssemester!');
elseif (!$karrierepfadSelectable)
$json = error('Karrierepfad is not selectable for the Studienplan');
else
$json = success('Zgv saved successfully!');
@@ -632,6 +660,19 @@ class InfoCenter extends Auth_Controller
$logdata = $this->_getPersonAndStudiengangFromPrestudent($prestudent_id);
$this->_log($logdata['person_id'], 'savezgv', array($logdata['studiengang_kurzbz'], $prestudent_id));
if ($karrierepfadChanged && $karrierepfadSelectable && isSuccess($prestresult))
{
$this->_log(
$logdata['person_id'],
'savekarrierepfad',
array(
$prestudent_id,
$this->_getKarrierepfadBezeichnung($prestudentdata->karrierepfad_id),
$this->_getKarrierepfadBezeichnung($karrierepfad_id)
)
);
}
}
}
@@ -2099,6 +2140,14 @@ class InfoCenter extends Auth_Controller
$zgvpruefung = getData($prestudentWithZgv);
// Karrierepfad: the stored one, and the selectable ones of the Studienplan of the last status
$karrierepfad = isset($zgvpruefung->karrierepfad_id) ? getData($this->KarrierepfadModel->load($zgvpruefung->karrierepfad_id)) : null;
$zgvpruefung->karrierepfad = isset($karrierepfad[0]) ? $karrierepfad[0] : null;
$karrierepfade = isset($zgvpruefung->prestudentstatus->studienplan_id) ?
$this->KarrierepfadModel->getByStudienplan($zgvpruefung->prestudentstatus->studienplan_id) :
null;
$zgvpruefung->karrierepfade = hasData($karrierepfade) ? getData($karrierepfade) : array();
if (isset($zgvpruefung->prestudentstatus))
{
//get orgform for german and english
@@ -2348,6 +2397,21 @@ class InfoCenter extends Auth_Controller
return array('person_id' => $person_id, 'studiengang_kurzbz' => $studiengang_kurzbz, 'studiengang_bezeichnung' => $studiengang_bezeichnung, 'studiengang_mail' => $studiengang_mail, 'studiengang_typ' => $studiengang_typ);
}
/**
* Helper function retrieves the German Bezeichnung of a Karrierepfad for the log
* @param $karrierepfad_id
* @return string 'none' if no Karrierepfad
*/
private function _getKarrierepfadBezeichnung($karrierepfad_id)
{
if ($karrierepfad_id === null)
return 'none';
$karrierepfad = getData($this->KarrierepfadModel->load($karrierepfad_id));
return isset($karrierepfad[0]->bezeichnung_mehrsprachig[0]) ? $karrierepfad[0]->bezeichnung_mehrsprachig[0] : $karrierepfad_id;
}
/**
* Helper function for logging
* @param $person_id
@@ -0,0 +1,15 @@
<?php
class KarrierepfadStudienplan_model extends DB_Model
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->dbTable = 'public.tbl_karrierepfad_studienplan';
$this->pk = array('karrierepfad_id', 'studienplan_id');
$this->hasSequence = false;
}
}
@@ -0,0 +1,44 @@
<?php
/**
* Karrierepfad: marketing specialisation of a Studiengang, linked to Studienpläne.
* Not official: never print it on a Zeugnis or report it to BIS.
*/
class Karrierepfad_model extends DB_Model
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->dbTable = 'public.tbl_karrierepfad';
$this->pk = 'karrierepfad_id';
}
/**
* Gets the Karrierepfade linked to a Studienplan, with the Bezeichnung in the user language.
* A Karrierepfad is selectable for a prestudent if it is aktiv and linked to the
* Studienplan of the last status. A value stored earlier stays valid without this check.
*
* @param integer $studienplan_id
* @param boolean $aktiv true: only active Karrierepfade
*
* @return stdClass
*/
public function getByStudienplan($studienplan_id, $aktiv = true)
{
$query = "
SELECT
kp.*,
kp.bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache = ? LIMIT 1)] AS bezeichnung
FROM public.tbl_karrierepfad kp
JOIN public.tbl_karrierepfad_studienplan USING (karrierepfad_id)
WHERE studienplan_id = ?";
if ($aktiv)
$query .= " AND kp.aktiv";
$query .= " ORDER BY kp.sort NULLS LAST, kp.karrierepfad_kurzbz";
return $this->execQuery($query, array(getUserLanguage(), $studienplan_id));
}
}
@@ -303,7 +303,20 @@
WHERE konto.person_id = p.person_id
AND konto.studiensemester_kurzbz = '. $STUDIENSEMESTER .'
AND konto.buchungstyp_kurzbz = '. $KAUTION_DRITT_STAAT .'
) AS "Kaution"
) AS "Kaution",
(
SELECT ARRAY_TO_STRING(ARRAY_AGG(DISTINCT UPPER(sg.typ || sg.kurzbz) || \':\' || kp.bezeichnung_mehrsprachig[1]), \', \')
FROM public.tbl_prestudent ps
JOIN public.tbl_studiengang sg USING(studiengang_kz)
JOIN public.tbl_karrierepfad kp USING(karrierepfad_id)
WHERE ps.person_id = p.person_id
AND EXISTS (
SELECT 1
FROM public.tbl_prestudentstatus pss
WHERE pss.prestudent_id = ps.prestudent_id
AND pss.studiensemester_kurzbz = '.$STUDIENSEMESTER.'
)
) AS "Karrierepfad"
FROM public.tbl_person p
LEFT JOIN (
SELECT tpl.person_id,
@@ -396,7 +409,8 @@
'InfoCenter Mitarbeiter',
ucfirst($this->p->t('infocenter', 'rueckstelldatum')),
ucfirst($this->p->t('infocenter', 'rueckstellgrund')),
ucfirst($this->p->t('infocenter', 'kaution'))
ucfirst($this->p->t('infocenter', 'kaution')),
ucfirst($this->p->t('infocenter', 'karrierepfad'))
),
'formatRow' => function($datasetRaw) {
@@ -519,6 +533,11 @@
$datasetRaw->{'Kaution'} = 'Offen';
}
if ($datasetRaw->{'Karrierepfad'} === null)
{
$datasetRaw->{'Karrierepfad'} = '-';
}
return $datasetRaw;
},
'markRow' => function($datasetRaw) {
@@ -66,7 +66,8 @@
<h4 class="panel-title">
<a data-toggle="collapse"
href="#collapse<?php echo $zgvpruefung->prestudent_id ?>">
<?php echo $studiengangkurzbz.' - '.$studiengangbezeichnung.' | '.(isset($zgvpruefung->prestudentstatus->status_kurzbz) ? $zgvpruefung->prestudentstatus->status_kurzbz : '');
<?php echo $studiengangkurzbz.' - '.$studiengangbezeichnung ?><span id="karrierepfadHeading_<?php echo $zgvpruefung->prestudent_id ?>"<?php echo isset($zgvpruefung->karrierepfad) ? '' : ' class="hidden"' ?>>, <?php echo ucfirst($this->p->t('infocenter', 'karrierepfad')) ?>: <span class="karrierepfadName"><?php echo isset($zgvpruefung->karrierepfad) ? html_escape($zgvpruefung->karrierepfad->bezeichnung_mehrsprachig[0]) : '' ?></span></span><?php
echo ' | '.(isset($zgvpruefung->prestudentstatus->status_kurzbz) ? $zgvpruefung->prestudentstatus->status_kurzbz : '');
?></a>
</h4>
</div>
@@ -202,6 +203,38 @@
</div>
</div>
</div>
<!-- Karrierepfad only if the Studienplan offers some or one is stored -->
<?php if (!empty($zgvpruefung->karrierepfade) || isset($zgvpruefung->karrierepfad)): ?>
<div class="row">
<div class="col-lg-<?php echo $columns[0] ?>">
<div class="form-group">
<label><?php echo ucfirst($this->p->t('infocenter', 'karrierepfad')) . ':' ?></label>
<?php if ($infoonly):
echo isset($zgvpruefung->karrierepfad) ? html_escape($zgvpruefung->karrierepfad->bezeichnung_mehrsprachig[0]) : $this->p->t('infocenter', 'karrierepfadOhne');
else:
// The stored one stays selectable, also if the Studienplan no longer offers it
$karrierepfadOptionen = $zgvpruefung->karrierepfade;
if (isset($zgvpruefung->karrierepfad)
&& !in_array($zgvpruefung->karrierepfad->karrierepfad_id, array_column($karrierepfadOptionen, 'karrierepfad_id')))
$karrierepfadOptionen[] = $zgvpruefung->karrierepfad;
echo "<select id='karrierepfad_" . $zgvpruefung->prestudent_id . "' name='karrierepfad_id' class='form-control'>";
echo "<option value=''>" . $this->p->t('infocenter', 'karrierepfadOhne') . "</option>";
foreach ($karrierepfadOptionen as $karrierepfad)
{
$selected = (isset($zgvpruefung->karrierepfad) && $karrierepfad->karrierepfad_id == $zgvpruefung->karrierepfad->karrierepfad_id) ? 'selected' : '';
$aktiv = $karrierepfad->aktiv ? '' : '(inaktiv)';
$class = $karrierepfad->aktiv ? '' : 'gesperrtoption';
$bezeichnung = html_escape($karrierepfad->bezeichnung_mehrsprachig[0]);
echo "<option " . $selected . " value='" . $karrierepfad->karrierepfad_id . "' class='" . $class . "' data-bezeichnung='" . $bezeichnung . "'>" . $bezeichnung . " " . $aktiv . "</option>";
}
echo "</select>";
endif; ?>
</div>
</div>
</div>
<?php endif; ?>
<div class="row">
<div class="col-lg-<?php echo $columns[0] ?>">
<div class="form-group">
+160
View File
@@ -0,0 +1,160 @@
<?php
/* Copyright (C) 2026 fhcomplete.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
require_once(dirname(__FILE__). '/basis_db.class.php');
require_once(dirname(__FILE__). '/sprache.class.php');
/**
* Karrierepfad: marketing specialisation of a Studiengang, linked to Studienpläne.
* Not official: no printing it on a Zeugnis or report to BIS.
*/
class karrierepfad extends basis_db
{
public $result = array();
//Tabellenspalten
public $karrierepfad_id;
public $karrierepfad_kurzbz;
public $karrierepfad_typ_kurzbz;
public $studiengang_kz;
public $bezeichnung_mehrsprachig; // array, key = sprache
public $sort;
public $aktiv;
public $insertamum;
public $insertvon;
public $updateamum;
public $updatevon;
/**
* @param integer $karrierepfad_id Karrierepfad to load (optional)
*/
public function __construct($karrierepfad_id = null)
{
parent::__construct();
if ($karrierepfad_id != null)
$this->load($karrierepfad_id);
}
/**
* Loads a Karrierepfad
* @param integer $karrierepfad_id
* @return boolean
*/
public function load($karrierepfad_id)
{
if (!is_numeric($karrierepfad_id))
{
$this->errormsg = 'Karrierepfad ID ist ungueltig';
return false;
}
$sprache = new sprache();
$qry = "SELECT *, ".$sprache->getSprachQuery('bezeichnung_mehrsprachig')."
FROM public.tbl_karrierepfad
WHERE karrierepfad_id=".$this->db_add_param($karrierepfad_id, FHC_INTEGER);
if (!$this->db_query($qry))
{
$this->errormsg = 'Fehler beim Laden des Karrierepfads';
return false;
}
if (!$row = $this->db_fetch_object())
{
$this->errormsg = 'Karrierepfad wurde nicht gefunden';
return false;
}
$this->setFromRow($this, $row, $sprache);
return true;
}
/**
* Loads a Karrierepfad by its kurzbz, the value of the URL parameter karrierepfad_kurzbz
* @param string $karrierepfad_kurzbz
* @return boolean
*/
public function loadKurzbz($karrierepfad_kurzbz)
{
$qry = "SELECT karrierepfad_id FROM public.tbl_karrierepfad
WHERE karrierepfad_kurzbz=".$this->db_add_param($karrierepfad_kurzbz);
if (!$this->db_query($qry) || !($row = $this->db_fetch_object()))
{
$this->errormsg = 'Karrierepfad wurde nicht gefunden';
return false;
}
return $this->load($row->karrierepfad_id);
}
/**
* Loads the Karrierepfade linked to a Studienplan into $this->result.
* A Karrierepfad is selectable for a prestudent if it is aktiv and linked to the
* Studienplan of the last status. A value stored earlier stays valid without this check.
* @param integer $studienplan_id
* @param boolean $aktiv true: only active Karrierepfade
* @return boolean
*/
public function getByStudienplan($studienplan_id, $aktiv = true)
{
if (!is_numeric($studienplan_id))
{
$this->errormsg = 'Studienplan ID ist ungueltig';
return false;
}
$sprache = new sprache();
$qry = "SELECT kp.*, ".$sprache->getSprachQuery('bezeichnung_mehrsprachig')."
FROM public.tbl_karrierepfad kp
JOIN public.tbl_karrierepfad_studienplan USING(karrierepfad_id)
WHERE studienplan_id=".$this->db_add_param($studienplan_id, FHC_INTEGER);
if ($aktiv)
$qry .= " AND kp.aktiv";
$qry .= " ORDER BY kp.sort NULLS LAST, kp.karrierepfad_kurzbz";
if (!$this->db_query($qry))
{
$this->errormsg = 'Fehler beim Laden der Karrierepfade';
return false;
}
while ($row = $this->db_fetch_object())
{
$obj = new karrierepfad();
$this->setFromRow($obj, $row, $sprache);
$this->result[] = $obj;
}
return true;
}
private function setFromRow($obj, $row, $sprache)
{
$obj->karrierepfad_id = $row->karrierepfad_id;
$obj->karrierepfad_kurzbz = $row->karrierepfad_kurzbz;
$obj->karrierepfad_typ_kurzbz = $row->karrierepfad_typ_kurzbz;
$obj->studiengang_kz = $row->studiengang_kz;
$obj->bezeichnung_mehrsprachig = $sprache->parseSprachResult('bezeichnung_mehrsprachig', $row);
$obj->sort = $row->sort;
$obj->aktiv = $this->db_parse_bool($row->aktiv);
$obj->insertamum = $row->insertamum;
$obj->insertvon = $row->insertvon;
$obj->updateamum = $row->updateamum;
$obj->updatevon = $row->updatevon;
}
}
+12 -5
View File
@@ -77,6 +77,7 @@ class prestudent extends person
public $priorisierung = null;
public $foerderrelevant = null;
public $standort_code = null;
public $karrierepfad_id = null;
public $udf_values = null;
public $status_kurzbz;
@@ -176,6 +177,7 @@ class prestudent extends person
$this->priorisierung = $row->priorisierung;
$this->foerderrelevant = $this->db_parse_bool($row->foerderrelevant);
$this->standort_code = $row->standort_code;
$this->karrierepfad_id = $row->karrierepfad_id;
if(!person::load($row->person_id))
return false;
@@ -268,7 +270,7 @@ class prestudent extends person
reihungstest_id, anmeldungreihungstest, reihungstestangetreten, rt_gesamtpunkte,
rt_punkte1, rt_punkte2, rt_punkte3, bismelden, insertamum, insertvon,
updateamum, updatevon, anmerkung, dual, ausstellungsstaat, mentor,
gsstudientyp_kurzbz, aufnahmegruppe_kurzbz, priorisierung, zgvdoktor_erfuellt, foerderrelevant, standort_code) VALUES('.
gsstudientyp_kurzbz, aufnahmegruppe_kurzbz, priorisierung, zgvdoktor_erfuellt, foerderrelevant, standort_code, karrierepfad_id) VALUES('.
$this->db_add_param($this->aufmerksamdurch_kurzbz).",".
$this->db_add_param($this->person_id).",".
@@ -312,7 +314,8 @@ class prestudent extends person
$this->db_add_param($this->priorisierung).",".
$this->db_add_param($this->zgvdoktor_erfuellt).",".
$this->db_add_param($this->foerderrelevant, FHC_BOOLEAN).",".
$this->db_add_param($this->standort_code).");";
$this->db_add_param($this->standort_code).",".
$this->db_add_param($this->karrierepfad_id, FHC_INTEGER).");";
}
else
{
@@ -357,7 +360,8 @@ class prestudent extends person
' priorisierung='.$this->db_add_param($this->priorisierung).",".
' zgvdoktor_erfuellt='.$this->db_add_param($this->zgvdoktor_erfuellt).', '.
' foerderrelevant='.$this->db_add_param($this->foerderrelevant, FHC_BOOLEAN).",".
' standort_code='.$this->db_add_param($this->standort_code)." ".
' standort_code='.$this->db_add_param($this->standort_code).",".
' karrierepfad_id='.$this->db_add_param($this->karrierepfad_id, FHC_INTEGER)." ".
" WHERE prestudent_id=".$this->db_add_param($this->prestudent_id).";";
}
@@ -1097,6 +1101,7 @@ class prestudent extends person
$ps->priorisierung = $row->priorisierung;
$ps->foerderrelevant = $row->foerderrelevant;
$ps->standort_code = $row->standort_code;
$ps->karrierepfad_id = $row->karrierepfad_id;
$ps->status_kurzbz = $row->status_kurzbz;
$ps->studiensemester_kurzbz = $row->studiensemester_kurzbz;
@@ -1632,6 +1637,7 @@ class prestudent extends person
$obj->aufnahmegruppe_kurzbz = $row->aufnahmegruppe_kurzbz;
$obj->priorisierung = $row->priorisierung;
$obj->zgvdoktor_erfuellt = $row->zgvdoktor_erfuellt;
$obj->karrierepfad_id = $row->karrierepfad_id;
if ($hasUDF)
{
@@ -2262,7 +2268,7 @@ class prestudent extends person
aufnahmeschluessel, facheinschlberuf, anmeldungreihungstest, reihungstestangetreten, reihungstest_id,
punkte, rt_punkte1, rt_punkte2, rt_punkte3, bismelden, person_id, anmerkung, mentor, ext_id_prestudent,
dual, ausstellungsstaat, zgvdoktor_code, zgvdoktorort, zgvdoktordatum, zgvdoktornation,
gsstudientyp_kurzbz, aufnahmegruppe_kurzbz, priorisierung,zgvdoktor_erfuellt) VALUES('.
gsstudientyp_kurzbz, aufnahmegruppe_kurzbz, priorisierung,zgvdoktor_erfuellt, karrierepfad_id) VALUES('.
$this->db_add_param($this->prestudent_id).','.
$this->db_add_param($this->aufmerksamdurch_kurzbz).','.
$this->db_add_param($this->studiengang_kz).','.
@@ -2301,7 +2307,8 @@ class prestudent extends person
$this->db_add_param($this->gsstudientyp_kurzbz).','.
$this->db_add_param($this->aufnahmegruppe_kurzbz).','.
$this->db_add_param($this->priorisierung).','.
$this->db_add_param($this->zgvdoktor_erfuellt).');';
$this->db_add_param($this->zgvdoktor_erfuellt).','.
$this->db_add_param($this->karrierepfad_id, FHC_INTEGER).');';
if($log->save(true))
{
+5 -1
View File
@@ -17,7 +17,11 @@ var FHC_UDFWidget = {
$("div[type*='UDFWidget']").each(function(i, udfWidgetDiv) {
var saveButton = $('<input type="button" value="Speichern">');
// No button without an editable UDF: fields without write permission are disabled
if ($(udfWidgetDiv).find("[name^='udf_']:enabled").length === 0) return;
// The label names what it saves, the page can have another save button
var saveButton = $('<input type="button" value="Zusatzfelder speichern">');
saveButton.on('click', function() {
@@ -239,7 +239,7 @@ export default {
const person = this.fieldsPerson[0];
this.itemsPerson = Object.entries(person).map(([key, value]) => ({
label: key.toLowerCase(),
value: '{' + key.toLowerCase() + '}'
value: '{' + key.toLowerCase().replace(/ /g, '_') + '}'
}));
})
.catch(this.$fhcAlert.handleSystemError);
@@ -253,7 +253,7 @@ export default {
const prestudent = this.fieldsPrestudent[0];
this.itemsPrestudent = Object.entries(prestudent).map(([key, value]) => ({
label: key.toLowerCase(),
value: '{' + key.toLowerCase() + '}'
value: '{' + key.toLowerCase().replace(/ /g, '_') + '}'
}));
})
.catch(this.$fhcAlert.handleSystemError);
@@ -243,7 +243,7 @@ export default {
const person = this.fieldsPerson[0];
this.itemsPerson = Object.entries(person).map(([key, value]) => ({
label: key.toLowerCase(),
value: '{' + key.toLowerCase() + '}'
value: '{' + key.toLowerCase().replace(/ /g, '_') + '}'
}));
})
.catch(this.$fhcAlert.handleSystemError);
@@ -257,7 +257,7 @@ export default {
const prestudent = this.fieldsPrestudent[0];
this.itemsPrestudent = Object.entries(prestudent).map(([key, value]) => ({
label: key.toLowerCase(),
value: '{' + key.toLowerCase() + '}'
value: '{' + key.toLowerCase().replace(/ /g, '_') + '}'
}));
})
.catch(this.$fhcAlert.handleSystemError);
@@ -215,6 +215,15 @@ var InfocenterDetails = {
if (FHC_AjaxClient.hasData(data))
{
$("#zgvSpeichern_" + prestudentid).before("<span id='zgvSpeichernNotice' class='text-success'>" + FHC_PhrasesLib.t('ui', 'gespeichert') + "</span>&nbsp;&nbsp;");
// The panel heading shows the saved Karrierepfad
var karrierepfad = $("#karrierepfad_" + prestudentid + " option:selected");
if (karrierepfad.length)
{
$("#karrierepfadHeading_" + prestudentid + " .karrierepfadName").text(karrierepfad.attr('data-bezeichnung') || '');
$("#karrierepfadHeading_" + prestudentid).toggleClass('hidden', karrierepfad.val() === '');
}
InfocenterDetails._refreshLog();
}
else
+5 -1
View File
@@ -106,6 +106,7 @@ require_once('dbupdate_3.4/54225_reihungstest_ablauf_fuer_quereinsteiger.php');
require_once('dbupdate_3.4/77757_widgets_berechtigungen.php');
require_once('dbupdate_3.4/77048_cis4_mitarbeiter_studstatus_widget.php');
require_once('dbupdate_3.4/83538_cis4_employees.php');
require_once('dbupdate_3.4/84049_karrierepfade.php');
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
echo '<H2>Pruefe Tabellen und Attribute!</H2>';
@@ -344,6 +345,9 @@ $tabellen=array(
"public.tbl_geschaeftsjahr" => array("geschaeftsjahr_kurzbz","start","ende","bezeichnung"),
"public.tbl_gruppe" => array("gruppe_kurzbz","studiengang_kz","semester","bezeichnung","beschreibung","sichtbar","lehre","aktiv","sort","mailgrp","generiert","updateamum","updatevon","insertamum","insertvon","ext_id","orgform_kurzbz","gid","content_visible","gesperrt","zutrittssystem","aufnahmegruppe","direktinskription"),
"public.tbl_gruppe_manager" => array("gruppe_manager_id","gruppe_kurzbz","uid","insertamum","insertvon"),
"public.tbl_karrierepfad" => array("karrierepfad_id","karrierepfad_kurzbz","karrierepfad_typ_kurzbz","studiengang_kz","bezeichnung_mehrsprachig","sort","aktiv","insertamum","insertvon","updateamum","updatevon"),
"public.tbl_karrierepfad_studienplan" => array("karrierepfad_id","studienplan_id"),
"public.tbl_karrierepfad_typ" => array("karrierepfad_typ_kurzbz","bezeichnung_mehrsprachig"),
"public.tbl_kennzeichen" => array("kennzeichen_id", "person_id", "kennzeichentyp_kurzbz", "inhalt", "aktiv", "insertamum", "insertvon", "updateamum", "updatevon"),
"public.tbl_kennzeichentyp" => array("kennzeichentyp_kurzbz", "bezeichnung", "aktiv"),
"public.tbl_kontakt" => array("kontakt_id","person_id","kontakttyp","anmerkung","kontakt","zustellung","updateamum","updatevon","insertamum","insertvon","ext_id","standort_id"),
@@ -377,7 +381,7 @@ $tabellen=array(
"public.tbl_preoutgoing_lehrveranstaltung" => array("preoutgoing_lehrveranstaltung_id","preoutgoing_id","bezeichnung","ects","endversion","insertamum","insertvon","updateamum","updatevon","wochenstunden","unitcode"),
"public.tbl_preoutgoing_preoutgoing_status" => array("status_id","preoutgoing_status_kurzbz","preoutgoing_id","datum","insertamum","insertvon","updateamum","updatevon"),
"public.tbl_preoutgoing_status" => array("preoutgoing_status_kurzbz","bezeichnung"),
"public.tbl_prestudent" => array("prestudent_id","aufmerksamdurch_kurzbz","person_id","studiengang_kz","berufstaetigkeit_code","ausbildungcode","zgv_code","zgvort","zgvdatum","zgvmas_code","zgvmaort","zgvmadatum","aufnahmeschluessel","facheinschlberuf","reihungstest_id","anmeldungreihungstest","reihungstestangetreten","rt_gesamtpunkte","rt_punkte1","rt_punkte2","bismelden","anmerkung","dual","insertamum","insertvon","updateamum","updatevon","ext_id","ausstellungsstaat","rt_punkte3", "zgvdoktor_code", "zgvdoktorort", "zgvdoktordatum","mentor","zgvnation","zgvmanation","zgvdoktornation","gsstudientyp_kurzbz","aufnahmegruppe_kurzbz","udf_values","priorisierung","foerderrelevant","standort_code","zgv_erfuellt","zgvmas_erfuellt","zgvdoktor_erfuellt"),
"public.tbl_prestudent" => array("prestudent_id","aufmerksamdurch_kurzbz","person_id","studiengang_kz","berufstaetigkeit_code","ausbildungcode","zgv_code","zgvort","zgvdatum","zgvmas_code","zgvmaort","zgvmadatum","aufnahmeschluessel","facheinschlberuf","reihungstest_id","anmeldungreihungstest","reihungstestangetreten","rt_gesamtpunkte","rt_punkte1","rt_punkte2","bismelden","anmerkung","dual","insertamum","insertvon","updateamum","updatevon","ext_id","ausstellungsstaat","rt_punkte3", "zgvdoktor_code", "zgvdoktorort", "zgvdoktordatum","mentor","zgvnation","zgvmanation","zgvdoktornation","gsstudientyp_kurzbz","aufnahmegruppe_kurzbz","udf_values","priorisierung","foerderrelevant","standort_code","zgv_erfuellt","zgvmas_erfuellt","zgvdoktor_erfuellt","karrierepfad_id"),
"public.tbl_prestudentstatus" => array("prestudent_id","status_kurzbz","studiensemester_kurzbz","ausbildungssemester","datum","orgform_kurzbz","insertamum","insertvon","updateamum","updatevon","ext_id","studienplan_id","bestaetigtam","bestaetigtvon","fgm","faktiv", "anmerkung","bewerbung_abgeschicktamum","rt_stufe","statusgrund_id"),
"public.tbl_profil_update" => array("profil_update_id","uid","topic","requested_change","updateamum","updatevon","insertamum","insertvon","status","status_timestamp","status_message","attachment_id"),
"public.tbl_profil_update_status" => array("status_kurzbz","beschreibung","bezeichnung_mehrsprachig"),
+269
View File
@@ -0,0 +1,269 @@
<?php
if (! defined('DB_NAME')) exit('No direct script access allowed');
// Karrierepfade: marketing specialisations of a Studiengang, chosen by applicants in the Bewerbungstool
// Add table public.tbl_karrierepfad_typ
if (!$result = @$db->db_query("SELECT 1 FROM public.tbl_karrierepfad_typ LIMIT 1"))
{
$qry = "
CREATE TABLE public.tbl_karrierepfad_typ
(
karrierepfad_typ_kurzbz character varying(32) NOT NULL,
bezeichnung_mehrsprachig character varying(256)[] NOT NULL,
CONSTRAINT pk_tbl_karrierepfad_typ PRIMARY KEY (karrierepfad_typ_kurzbz)
);
COMMENT ON TABLE public.tbl_karrierepfad_typ IS 'Key Table of Karrierepfad types';
INSERT INTO public.tbl_karrierepfad_typ(karrierepfad_typ_kurzbz, bezeichnung_mehrsprachig) VALUES('marketing', '{Marketing, Marketing}');
GRANT SELECT, INSERT, UPDATE, DELETE ON public.tbl_karrierepfad_typ TO vilesci;
GRANT SELECT ON public.tbl_karrierepfad_typ TO web;
";
if (!$db->db_query($qry))
echo '<strong>public.tbl_karrierepfad_typ: '.$db->db_last_error().'</strong><br>';
else
echo 'public.tbl_karrierepfad_typ: Tabelle hinzugefuegt<br>';
}
// Add table public.tbl_karrierepfad
if (!$result = @$db->db_query("SELECT 1 FROM public.tbl_karrierepfad LIMIT 1"))
{
$qry = "
CREATE SEQUENCE public.tbl_karrierepfad_karrierepfad_id_seq
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;
CREATE TABLE public.tbl_karrierepfad
(
karrierepfad_id integer NOT NULL DEFAULT nextval('public.tbl_karrierepfad_karrierepfad_id_seq'),
karrierepfad_kurzbz character varying(32) NOT NULL,
karrierepfad_typ_kurzbz character varying(32) NOT NULL,
studiengang_kz integer NOT NULL,
bezeichnung_mehrsprachig character varying(256)[] NOT NULL,
sort smallint,
aktiv boolean NOT NULL DEFAULT true,
insertamum timestamp without time zone DEFAULT now(),
insertvon character varying(32),
updateamum timestamp without time zone,
updatevon character varying(32),
CONSTRAINT pk_tbl_karrierepfad PRIMARY KEY (karrierepfad_id),
CONSTRAINT uk_tbl_karrierepfad_karrierepfad_kurzbz UNIQUE (karrierepfad_kurzbz)
);
COMMENT ON TABLE public.tbl_karrierepfad IS 'Marketing specialisations of a Studiengang. Not official, no Zeugnis, no BIS';
COMMENT ON COLUMN public.tbl_karrierepfad.karrierepfad_kurzbz IS 'URL param value for Bewerbungstool';
ALTER TABLE public.tbl_karrierepfad ADD CONSTRAINT fk_tbl_karrierepfad_karrierepfad_typ_kurzbz FOREIGN KEY (karrierepfad_typ_kurzbz)
REFERENCES public.tbl_karrierepfad_typ(karrierepfad_typ_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT;
ALTER TABLE public.tbl_karrierepfad ADD CONSTRAINT fk_tbl_karrierepfad_studiengang_kz FOREIGN KEY (studiengang_kz)
REFERENCES public.tbl_studiengang(studiengang_kz) ON UPDATE CASCADE ON DELETE RESTRICT;
GRANT SELECT, INSERT, UPDATE, DELETE ON public.tbl_karrierepfad TO vilesci;
GRANT SELECT ON public.tbl_karrierepfad TO web;
GRANT SELECT, UPDATE ON public.tbl_karrierepfad_karrierepfad_id_seq TO vilesci;
";
if (!$db->db_query($qry))
echo '<strong>public.tbl_karrierepfad: '.$db->db_last_error().'</strong><br>';
else
echo 'public.tbl_karrierepfad: Tabelle hinzugefuegt<br>';
}
// Add table public.tbl_karrierepfad_studienplan
if (!$result = @$db->db_query("SELECT 1 FROM public.tbl_karrierepfad_studienplan LIMIT 1"))
{
$qry = "
CREATE TABLE public.tbl_karrierepfad_studienplan
(
karrierepfad_id integer NOT NULL,
studienplan_id integer NOT NULL,
CONSTRAINT pk_tbl_karrierepfad_studienplan PRIMARY KEY (karrierepfad_id, studienplan_id)
);
COMMENT ON TABLE public.tbl_karrierepfad_studienplan IS 'Studienpläne in which a Karrierepfad is selectable';
ALTER TABLE public.tbl_karrierepfad_studienplan ADD CONSTRAINT fk_tbl_karrierepfad_studienplan_karrierepfad_id FOREIGN KEY (karrierepfad_id)
REFERENCES public.tbl_karrierepfad(karrierepfad_id) ON UPDATE CASCADE ON DELETE RESTRICT;
ALTER TABLE public.tbl_karrierepfad_studienplan ADD CONSTRAINT fk_tbl_karrierepfad_studienplan_studienplan_id FOREIGN KEY (studienplan_id)
REFERENCES lehre.tbl_studienplan(studienplan_id) ON UPDATE CASCADE ON DELETE RESTRICT;
GRANT SELECT, INSERT, UPDATE, DELETE ON public.tbl_karrierepfad_studienplan TO vilesci;
GRANT SELECT ON public.tbl_karrierepfad_studienplan TO web;
";
if (!$db->db_query($qry))
echo '<strong>public.tbl_karrierepfad_studienplan: '.$db->db_last_error().'</strong><br>';
else
echo 'public.tbl_karrierepfad_studienplan: Tabelle hinzugefuegt<br>';
}
// Add column karrierepfad_id to public.tbl_prestudent
if ($result = $db->db_query("SELECT 1 FROM information_schema.columns WHERE table_schema='public' AND table_name='tbl_prestudent' AND column_name='karrierepfad_id'"))
{
if ($db->db_num_rows($result) == 0)
{
$qry = "
ALTER TABLE public.tbl_prestudent ADD COLUMN karrierepfad_id integer;
COMMENT ON COLUMN public.tbl_prestudent.karrierepfad_id IS 'Karrierepfad chosen by the applicant';
ALTER TABLE public.tbl_prestudent ADD CONSTRAINT fk_tbl_prestudent_karrierepfad_id FOREIGN KEY (karrierepfad_id)
REFERENCES public.tbl_karrierepfad(karrierepfad_id) ON UPDATE CASCADE ON DELETE RESTRICT;
";
if (!$db->db_query($qry))
echo '<strong>public.tbl_prestudent.karrierepfad_id: '.$db->db_last_error().'</strong><br>';
else
echo 'public.tbl_prestudent: Spalte karrierepfad_id hinzugefuegt<br>';
}
}
// Add "Karrierepfad DE" and "Karrierepfad EN" to public.vw_msg_vars: definition of dbupdate_3.3.php plus two columns at the end
if (!$result = @$db->db_query('SELECT "Karrierepfad DE", "Karrierepfad EN" FROM public.vw_msg_vars WHERE person_id=-1 LIMIT 1'))
{
$qry = '
CREATE OR REPLACE VIEW public.vw_msg_vars AS (
SELECT DISTINCT ON(p.person_id, pr.prestudent_id) p.person_id,
pr.prestudent_id AS prestudent_id,
p.nachname AS "Nachname",
p.vorname AS "Vorname",
p.anrede AS "Anrede",
a.strasse AS "Strasse",
a.ort AS "Ort",
a.plz AS "PLZ",
a.gemeinde AS "Gemeinde",
a.langtext AS "Nation",
ke.kontakt AS "Email",
kt.kontakt AS "Telefon",
s.bezeichnung AS "Studiengang DE",
s.english AS "Studiengang EN",
st.bezeichnung AS "Typ",
last_prestudent_status.orgform_kurzbz AS "Orgform",
p.zugangscode AS "Zugangscode",
bk.iban AS "IBAN Studiengang",
bk.bic AS "BIC Studiengang",
s.studiengang_kz AS "Studiengangskennzahl",
first_prestudent_status.ausbildungssemester AS "Einstiegssemester",
first_prestudent_status.studiensemester AS "Einstiegsstudiensemester",
ass.vorname AS "Vorname Studiengangsassistenz",
ass.nachname AS "Nachname Studiengangsassistenz",
ass.telefonklappe AS "Durchwahl Studiengangsassistenz",
ass.alias AS "Alias Studiengangsassistenz",
(SELECT count(*)
FROM (
SELECT pss.prestudent_id, pss.person_id, priorisierung,
(
SELECT status_kurzbz
FROM public.tbl_prestudentstatus
WHERE prestudent_id = pss.prestudent_id
ORDER BY datum DESC,
tbl_prestudentstatus.insertamum DESC LIMIT 1
) AS laststatus
FROM public.tbl_prestudent pss
JOIN public.tbl_prestudentstatus USING (prestudent_id)
WHERE person_id = (
SELECT person_id
FROM public.tbl_prestudent
WHERE prestudent_id = pr.prestudent_id
)
AND studiensemester_kurzbz = (
SELECT studiensemester_kurzbz
FROM public.tbl_prestudentstatus
WHERE prestudent_id = pr.prestudent_id
AND status_kurzbz = \'Interessent\' LIMIT 1
)
AND status_kurzbz = \'Interessent\'
) prest
WHERE laststatus NOT IN (\'Abbrecher\', \'Abgewiesener\', \'Absolvent\')
AND priorisierung <= pr.priorisierung) AS "Relative Prio",
last_prestudent_status.orgform_bezeichnung_de AS "Orgform DE",
last_prestudent_status.orgform_bezeichnung_en AS "Orgform EN",
kp.bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE content=TRUE AND sprache=\'German\' LIMIT 1)] AS "Karrierepfad DE",
kp.bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE content=TRUE AND sprache=\'English\' LIMIT 1)] AS "Karrierepfad EN"
FROM public.tbl_person p
LEFT JOIN (
SELECT person_id,
kontakt
FROM public.tbl_kontakt
WHERE zustellung = TRUE
AND kontakttyp = \'email\'
ORDER BY kontakt_id DESC
) ke USING(person_id)
LEFT JOIN (
SELECT person_id,
kontakt
FROM public.tbl_kontakt
WHERE zustellung = TRUE
AND kontakttyp IN (\'telefon\', \'mobil\')
ORDER BY kontakt_id DESC
) kt USING(person_id)
LEFT JOIN (
SELECT person_id,
strasse,
ort,
plz,
gemeinde,
langtext
FROM public.tbl_adresse
LEFT JOIN bis.tbl_nation ON(bis.tbl_nation.nation_code = public.tbl_adresse.nation)
WHERE public.tbl_adresse.heimatadresse = TRUE
ORDER BY adresse_id DESC
) a USING(person_id)
LEFT JOIN public.tbl_prestudent pr USING(person_id)
INNER JOIN public.tbl_studiengang s USING(studiengang_kz)
INNER JOIN public.tbl_studiengangstyp st USING(typ)
LEFT JOIN (
SELECT DISTINCT ON (ps.prestudent_id) ps.prestudent_id, tbl_studienplan.orgform_kurzbz,
tbl_orgform.bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE content=TRUE AND sprache=\'German\' LIMIT 1)] AS orgform_bezeichnung_de,
tbl_orgform.bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE content=TRUE AND sprache=\'English\' LIMIT 1)] AS orgform_bezeichnung_en
FROM public.tbl_prestudent ps
JOIN public.tbl_prestudentstatus ON ps.prestudent_id = tbl_prestudentstatus.prestudent_id
JOIN lehre.tbl_studienplan USING(studienplan_id)
LEFT JOIN bis.tbl_orgform ON tbl_studienplan.orgform_kurzbz = tbl_orgform.orgform_kurzbz
ORDER BY ps.prestudent_id DESC,
tbl_prestudentstatus.datum DESC,
tbl_prestudentstatus.insertamum DESC,
tbl_prestudentstatus.ext_id DESC
) last_prestudent_status ON pr.prestudent_id = last_prestudent_status.prestudent_id
LEFT JOIN (
SELECT DISTINCT ON (ps.prestudent_id) ps.prestudent_id, tbl_prestudentstatus.ausbildungssemester,
studiensemester_kurzbz, tbl_studiensemester.bezeichnung AS studiensemester,
tbl_studienordnung.studiengang_kz
FROM public.tbl_prestudent ps
JOIN public.tbl_prestudentstatus ON ps.prestudent_id = tbl_prestudentstatus.prestudent_id
JOIN public.tbl_studiensemester USING (studiensemester_kurzbz)
JOIN lehre.tbl_studienplan USING(studienplan_id)
JOIN lehre.tbl_studienordnung USING (studienordnung_id)
WHERE tbl_prestudentstatus.status_kurzbz = \'Interessent\'
ORDER BY ps.prestudent_id ASC,
tbl_prestudentstatus.datum ASC,
tbl_prestudentstatus.insertamum ASC,
tbl_prestudentstatus.ext_id ASC
) first_prestudent_status ON pr.prestudent_id = first_prestudent_status.prestudent_id
LEFT JOIN (
SELECT DISTINCT ON (tbl_benutzerfunktion.oe_kurzbz) vorname, nachname, oe_kurzbz, telefonklappe, alias
FROM public.tbl_benutzerfunktion
JOIN public.tbl_benutzer USING (uid)
JOIN public.tbl_person USING (person_id)
JOIN public.tbl_mitarbeiter on tbl_benutzer.uid = tbl_mitarbeiter.mitarbeiter_uid
WHERE tbl_benutzerfunktion.funktion_kurzbz = \'ass\'
AND NOW() BETWEEN COALESCE(datum_von, NOW()) AND COALESCE(datum_bis, NOW())
ORDER BY tbl_benutzerfunktion.oe_kurzbz, tbl_benutzerfunktion.insertamum DESC NULLS LAST, datum_von DESC NULLS LAST
) ass ON s.oe_kurzbz = ass.oe_kurzbz
LEFT JOIN (
SELECT DISTINCT ON (oe_kurzbz, orgform_kurzbz) oe_kurzbz, orgform_kurzbz, iban, bic
FROM tbl_bankverbindung
WHERE oe_kurzbz IS NOT NULL
ORDER BY oe_kurzbz, orgform_kurzbz, tbl_bankverbindung.insertamum DESC,tbl_bankverbindung.iban
)bk ON s.oe_kurzbz = bk.oe_kurzbz AND (last_prestudent_status.orgform_kurzbz = bk.orgform_kurzbz OR bk.orgform_kurzbz IS NULL)
LEFT JOIN public.tbl_karrierepfad kp ON kp.karrierepfad_id = pr.karrierepfad_id
WHERE p.aktiv = TRUE
ORDER BY p.person_id ASC, pr.prestudent_id ASC
);';
if (!$db->db_query($qry))
echo '<strong>public.vw_msg_vars: '.$db->db_last_error().'</strong><br>';
else
echo 'public.vw_msg_vars: Spalten "Karrierepfad DE" und "Karrierepfad EN" hinzugefuegt<br>';
}
@@ -0,0 +1,19 @@
-- Test data Karrierepfade (ticket 84049) for Studiengang 3, Studienplan 3011 (VZ)
-- 31-33 active, 34 inactive; Studienplan 4011 has no Karrierepfade
INSERT INTO public.tbl_karrierepfad (karrierepfad_id, karrierepfad_kurzbz, karrierepfad_typ_kurzbz, studiengang_kz, bezeichnung_mehrsprachig, sort, aktiv, insertvon) VALUES
(31, 'TSTITSEC', 'marketing', 3, '{IT Security, IT Security}', 1, true, 'seeder'),
(32, 'TSTAIDS', 'marketing', 3, '{AI und Data Science, AI and Data Science}', 2, true, 'seeder'),
(33, 'TSTSWE', 'marketing', 3, '{Software Engineering, Software Engineering}', 3, true, 'seeder'),
(34, 'TSTINAKTIV', 'marketing', 3, '{Inaktiver Karrierepfad, Inactive Karrierepfad}', 4, false, 'seeder');
SELECT setval('public.tbl_karrierepfad_karrierepfad_id_seq', (SELECT max(karrierepfad_id) FROM public.tbl_karrierepfad));
INSERT INTO public.tbl_karrierepfad_studienplan (karrierepfad_id, studienplan_id) VALUES
(31, 3011),
(32, 3011),
(33, 3011),
(34, 3011);
-- One prestudent with a Karrierepfad for the display in Infocenter, StV and Reihungstest
UPDATE public.tbl_prestudent SET karrierepfad_id = 31 WHERE prestudent_id = 3301;