infocenter new column for karrierepfade; added a new karrierepfade dropdown into the zgv panel to be shown/edited; udf widget save button now says "zusatzfelder speichern" and only shows if the widget actually has editable udfs;

This commit is contained in:
Johann Hoffmann
2026-10-27 16:42:21 +01:00
parent 077acab558
commit ae85f7bec6
5 changed files with 134 additions and 5 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
@@ -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">
+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() {
@@ -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