icon fixes in request anrechnung; block request dispaly reason when lv is not in studienplan of logged in users prestudent history; added mehrsprachigkeit to anrechnung begruendung options in db; more phrasen;

This commit is contained in:
Johann Hoffmann
2026-10-05 17:04:22 +02:00
parent 663430b462
commit a87266c325
17 changed files with 243 additions and 105 deletions
@@ -21,7 +21,7 @@ class NotizAnrechnung extends Notiz_Controller
// Load language phrases
$this->loadPhrases([
'ui'
'ui', 'lehre'
]);
}
@@ -25,7 +25,7 @@ class Anrechnungen extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
'ui', 'lehre'
'ui', 'lehre', 'anrechnung'
]);
// Load models
@@ -45,6 +45,12 @@ class Anrechnungen extends FHCAPI_Controller
{
$this->load->model('education/Anrechnungbegruendung_model', 'AnrechnungbegrueundungsModel');
// Begruendung in the users language, German name if no translation exists
$language_index = getUserLanguage() == 'German' ? 1 : 2;
$this->AnrechnungbegrueundungsModel->addSelect(
'begruendung_id, COALESCE(bezeichnung_mehrsprachig[' . $language_index . '], bezeichnung) AS bezeichnung',
false
);
$result = $this->AnrechnungbegrueundungsModel->load();
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
@@ -118,22 +124,22 @@ class Anrechnungen extends FHCAPI_Controller
: null;
$this->form_validation->set_rules('lehrveranstaltung_id', 'Lehrveranstaltung_id', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung'])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehrveranstaltung')])
]);
$this->form_validation->set_rules('begruendung', 'Begruendung', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Begruendung'])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('anrechnung', 'begruendung')])
]);
if($_POST['begruendung'] == 2)
{
$this->form_validation->set_rules('lehrveranstaltung_id_kompatibel', 'Lehrveranstaltung_id', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung Kompatibel'])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('anrechnung', 'lehrveranstaltung_bez_kompatibel')])
]);
}
$this->form_validation->set_rules('genehmigtVon', 'GenehmigtVon', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'GenehmigtVon'])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('anrechnung', 'genehmigtVon')])
]);
if ($this->form_validation->run() == false)
@@ -190,22 +196,22 @@ class Anrechnungen extends FHCAPI_Controller
$_POST['genehmigtVon'] = (isset($formData['genehmigt_von']) && !empty($formData['genehmigt_von'])) ? $formData['genehmigt_von'] : null;
$this->form_validation->set_rules('lehrveranstaltung_id', 'Lehrveranstaltung_id', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung'])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehrveranstaltung')])
]);
$this->form_validation->set_rules('begruendung', 'Begruendung', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Begruendung'])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('anrechnung', 'begruendung')])
]);
if($_POST['begruendung'] == 2)
{
$this->form_validation->set_rules('lehrveranstaltung_id_kompatibel', 'Lehrveranstaltung_id', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung Kompatibel'])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('anrechnung', 'lehrveranstaltung_bez_kompatibel')])
]);
}
$this->form_validation->set_rules('genehmigtVon', 'GenehmigtVon', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'GenehmigtVon'])
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('anrechnung', 'genehmigtVon')])
]);
if ($this->form_validation->run() == false)
@@ -76,6 +76,13 @@ class CreateAnrechnung extends Auth_Controller
// Get Anrechnungsbegruendungen
$this->load->model('education/Anrechnungbegruendung_model', 'AnrechnungbegruendungModel');
// Begruendung in the users language, German name if no translation exists
$language_index = getUserLanguage() == 'German' ? 1 : 2;
$this->AnrechnungbegruendungModel->addSelect(
'begruendung_id, COALESCE(bezeichnung_mehrsprachig[' . $language_index . '], bezeichnung) AS bezeichnung',
false
);
$begruendung_arr = getData($this->AnrechnungbegruendungModel->load());
$viewData = array(
@@ -94,6 +101,12 @@ class CreateAnrechnung extends Auth_Controller
{
$prestudent_id = $this->input->post('prestudent_id');
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
// Exit if user has no permission for the Studiengang of the student
if (!$this->anrechnunglib->isBerechtigtForPrestudent(self::BERECHTIGUNG_ANRECHNUNG_ANLEGEN, 's', $prestudent_id))
{
$this->terminateWithJsonError($this->p->t('ui', 'keineBerechtigung'));
}
// Get Student UID
$student_uid = $this->StudentModel->getUID($prestudent_id);
@@ -136,6 +149,19 @@ class CreateAnrechnung extends Auth_Controller
{
$this->terminateWithJsonError($this->p->t('ui', 'errorFelderFehlen'));
}
// Exit if user has no write permission for the Studiengang of the student
if (!$this->anrechnunglib->isBerechtigtForPrestudent(self::BERECHTIGUNG_ANRECHNUNG_ANLEGEN, 'suid', $prestudent_id))
{
$this->terminateWithJsonError($this->p->t('ui', 'keineBerechtigung'));
}
// Exit if the Lehrveranstaltung is not one of the LVs the form offers for this student
$result = $this->LehrveranstaltungModel->getLvsByStudent($this->StudentModel->getUID($prestudent_id), $studiensemester_kurzbz);
if (!in_array($lehrveranstaltung_id, array_column(hasData($result) ? getData($result) : array(), 'lehrveranstaltung_id')))
{
$this->terminateWithJsonError($this->p->t('anrechnung', 'lvNichtZugeteilt'));
}
// Exit if application already exists
if (self::_applicationExists($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id))
@@ -88,6 +88,10 @@ class requestAnrechnung extends Auth_Controller
// Get Anrechung data
$anrechnungData = $this->anrechnunglib->getAnrechnungDataByLv($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id);
// Check if a new Antrag is for a Lehrveranstaltung outside the Studienplan (e.g. LV of a parallel study)
$is_not_in_studienplan = !is_numeric($anrechnungData->anrechnung_id)
&& !hasData($this->LehrveranstaltungModel->getLvInStudienplan($prestudent_id, $lehrveranstaltung_id));
// Get Antrag data
$antragData = $this->anrechnunglib->getAntragData($prestudent_id, $studiensemester_kurzbz, $lehrveranstaltung_id, $anrechnungData->anrechnung_id);
@@ -95,7 +99,8 @@ class requestAnrechnung extends Auth_Controller
'antragData' => $antragData,
'anrechnungData' => $anrechnungData,
'is_expired' => $is_expired,
'is_blocked' => $is_blocked
'is_blocked' => $is_blocked,
'is_not_in_studienplan' => $is_not_in_studienplan
);
$this->load->view('lehre/anrechnung/requestAnrechnung.php', $viewData);
@@ -154,7 +159,7 @@ class requestAnrechnung extends Auth_Controller
// Exit if application already exists
if (self::_applicationExists($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id))
{
return $this->outputJsonError($this->p->t('anrechnung', 'antragBereitsGestellt'));
return $this->outputJsonError($this->p->t('global', 'antragBereitsGestellt'));
}
// Exit if application is a past ( < actual ) studysemester
@@ -162,6 +167,30 @@ class requestAnrechnung extends Auth_Controller
{
return $this->outputJsonError($this->p->t('anrechnung', 'antragNichtFuerVerganganeSS'));
}
// Exit if student is not assigned to the Lehrveranstaltung
if (!hasData($this->LehrveranstaltungModel->getLvByStudent($this->_uid, $studiensemester_kurzbz, $lehrveranstaltung_id)))
{
return $this->outputJsonError($this->p->t('anrechnung', 'lvNichtZugeteilt'));
}
// Exit if Lehrveranstaltung is not in the Studienplan of the student (e.g. LV of a parallel study)
if (!hasData($this->LehrveranstaltungModel->getLvInStudienplan($prestudent_id, $lehrveranstaltung_id)))
{
return $this->outputJsonError($this->p->t('anrechnung', 'lvNichtImStudienplan'));
}
// Exit if application deadline is expired
if ($this->_isExpired($studiensemester_kurzbz))
{
return $this->outputJsonError($this->p->t('anrechnung', 'deadlineUeberschritten'));
}
// Exit if Lehrveranstaltung was already graded with application blocking grades
if (self::_LVhasBlockingGrades($studiensemester_kurzbz, $lehrveranstaltung_id))
{
return $this->outputJsonError($this->p->t('anrechnung', 'antragBenotungBlockiert'));
}
// Upload document
$result = self::_uploadFile();
+2 -2
View File
@@ -59,7 +59,7 @@ class AnrechnungLib
// Load LV, but check if student is assigned to that LV. Break, if not.
if(!$lv = getData($this->ci->LehrveranstaltungModel->getLvByStudent($uid, $studiensemester_kurzbz, $lv_id))[0])
{
show_error('You are not assigned to this course yet.');
show_error($this->ci->p->t('anrechnung', 'lvNichtZugeteilt'));
}
}
@@ -788,7 +788,7 @@ class AnrechnungLib
$result = $this->ci->AnrechnungModel->load($anrechnung_id);
if (!hasData($result))
{
showError('Anrechnung existiert nicht');
show_error('Failed loading Anrechnung');
}
// Get lectors of lehrveranstaltung
@@ -61,7 +61,7 @@ class Anrechnung_model extends DB_Model
if ($this->db->trans_status() === false)
{
$this->db->trans_rollback();
return error('Failed inserting Anrechnung', EXIT_ERROR);
return error($this->p->t('ui', 'fehlerBeimSpeichern'), EXIT_ERROR);
}
return success($lastInsert_anrechnung_id);
@@ -166,7 +166,7 @@ class Anrechnung_model extends DB_Model
// Get last Anrechnungstatus
if (!$result = getData($this->AnrechnungModel->getLastAnrechnungstatus($anrechnung_id))[0])
{
return error('Failed loading Anrechnung');
return error($this->p->t('ui', 'fehlerBeimLesen'));
}
$last_status = $result->status_kurzbz;
@@ -175,7 +175,7 @@ class Anrechnung_model extends DB_Model
// Exit, if last status is not approved / rejected
if ($last_status != self::ANRECHNUNGSTATUS_APPROVED && $last_status != self::ANRECHNUNGSTATUS_REJECTED)
{
return error('Nothing to withdraw. Application is still in progress');
return error($this->p->t('anrechnung', 'keineGenehmigungZumZuruecknehmen'));
}
// Start DB transaction
@@ -197,7 +197,7 @@ class Anrechnung_model extends DB_Model
if ($this->db->trans_status() === false)
{
$this->db->trans_rollback();
return error('Failed withdrawing Genehmigung', EXIT_ERROR);
return error($this->p->t('anrechnung', 'antragNichtZurueckgenommen'), EXIT_ERROR);
}
return success();
@@ -211,21 +211,31 @@ class Anrechnung_model extends DB_Model
*/
public function getAnrechnungsData($prestudent_id)
{
// Names in the users language, German if no translation exists
$english = getUserLanguage() != 'German';
$language_index = $english ? 2 : 1;
$lv_bezeichnung = $english
? 'COALESCE(NULLIF(lehre.tbl_lehrveranstaltung.bezeichnung_english, \'\'), lehre.tbl_lehrveranstaltung.bezeichnung)'
: 'lehre.tbl_lehrveranstaltung.bezeichnung';
$lv_comp_bezeichnung = $english
? 'COALESCE(NULLIF(lv_comp.bezeichnung_english, \'\'), lv_comp.bezeichnung)'
: 'lv_comp.bezeichnung';
$qry = '
SELECT
lehre.tbl_anrechnung.anrechnung_id,
lehre.tbl_anrechnung.prestudent_id,
lehre.tbl_anrechnung.lehrveranstaltung_id,
lehre.tbl_lehrveranstaltung.bezeichnung AS bez_lehrveranstaltung,
lehre.tbl_anrechnung_begruendung.bezeichnung AS begruendung,
lehre.tbl_anrechnung_anrechnungstatus.status_kurzbz AS status,
' . $lv_bezeichnung . ' AS bez_lehrveranstaltung,
COALESCE(lehre.tbl_anrechnung_begruendung.bezeichnung_mehrsprachig[' . $language_index . '], lehre.tbl_anrechnung_begruendung.bezeichnung) AS begruendung,
COALESCE(lehre.tbl_anrechnungstatus.bezeichnung_mehrsprachig[' . $language_index . '], lehre.tbl_anrechnung_anrechnungstatus.status_kurzbz) AS status,
genehmigt_von,
lehre.tbl_anrechnung.insertamum,
lehre.tbl_anrechnung.insertvon,
lehre.tbl_anrechnung.updateamum,
lehre.tbl_anrechnung.updatevon,
lehrveranstaltung_id_kompatibel,
lv_comp.bezeichnung as lehrveranstaltung_bez_kompatibel,
' . $lv_comp_bezeichnung . ' as lehrveranstaltung_bez_kompatibel,
count(nz.notizzuordnung_id) AS notizen_anzahl
FROM
lehre.tbl_anrechnung
@@ -31,7 +31,7 @@ class Anrechnungszeitraum_model extends DB_Model
if (isError($result))
{
return error('Fehler bei Anrechnungszeitraum speichern.');
return error($this->p->t('ui', 'fehlerBeimSpeichern'));
}
// Return new anrechnungszeitraum_id
@@ -50,7 +50,7 @@ class Anrechnungszeitraum_model extends DB_Model
if (isError($result))
{
return error('Fehler bei Anrechnungszeitraum löschen.');
return error($this->p->t('anrechnung', 'fehlerBeimLoeschen'));
}
return success($result->retval);
@@ -78,7 +78,7 @@ class Anrechnungszeitraum_model extends DB_Model
if (isError($result))
{
return error('Fehler bei Anrechnungszeitraum update.');
return error($this->p->t('ui', 'fehlerBeimSpeichern'));
}
return success($result->retval);
@@ -658,6 +658,26 @@ class Lehrveranstaltung_model extends DB_Model
return $this->execQuery($query, array($uid, $studiensemester_kurzbz, $lehrveranstaltung_id));
}
/**
* Gets the Lehrveranstaltung if it is in a Studienplan of the prestudent.
* Checks the Studienplaene of all statuses, because the status of a future semester can be missing.
* @param $prestudent_id
* @param $lehrveranstaltung_id
* @return array|null
*/
public function getLvInStudienplan($prestudent_id, $lehrveranstaltung_id)
{
$query = '
SELECT DISTINCT spl.lehrveranstaltung_id
FROM public.tbl_prestudentstatus ps
JOIN lehre.tbl_studienplan_lehrveranstaltung spl USING (studienplan_id)
WHERE ps.prestudent_id = ?
AND spl.lehrveranstaltung_id = ?;
';
return $this->execQuery($query, array($prestudent_id, $lehrveranstaltung_id));
}
/**
* Get Lehreinheit.
*
@@ -141,7 +141,8 @@ if (defined("CIS4")) {
</div>
<button type="submit"
class="btn btn-outline-secondary col-auto"><?php echo ucfirst($this->p->t('ui', 'anzeigen')); ?></button>
class="btn btn-outline-secondary col-auto"><?php echo ucfirst($this->p->t('ui', 'anzeigen')); ?>
</button>
</form>
</div>
</div>
@@ -179,9 +180,11 @@ if (defined("CIS4")) {
</li>
<li class="list-group-item list-group-item-secondary"><?php echo $this->p->t('anrechnung', 'genehmigungNegativKenntnisseNichtGleichwertigWeilHinweis'); ?></li>
</ol>
<textarea class="form-control" name="begruendung" id="approveAnrechnungUebersicht-begruendung"
<textarea class="form-control"
name="begruendung" id="approveAnrechnungUebersicht-begruendung"
rows="2"
placeholder="<?php echo $this->p->t('anrechnung', 'textUebernehmenOderEigenenBegruendungstext'); ?>" required></textarea>
placeholder="<?php echo $this->p->t('anrechnung', 'textUebernehmenOderEigenenBegruendungstext'); ?>"
required></textarea>
</div>
<!-- Action Button 'Abbrechen'-->
@@ -11,7 +11,7 @@ $includesArray = array(
'jquery3' => true,
'jqueryui1' => true,
'bootstrap5' => true,
'fontawesome4' => true,
'fontawesome6' => true,
'ajaxlib' => true,
'dialoglib' => true,
'cis'=>true,
@@ -36,8 +36,10 @@ $includesArray = array(
'anrechnung' => array(
'deadlineUeberschritten',
'benotungDerLV',
'lvNichtImStudienplan',
'anrechnungEctsTextBeiUeberschreitung',
'anrechnungEctsTooltipTextBeiUeberschreitung'
'anrechnungEctsTooltipTextBeiUeberschreitung',
'hoechstgrenzeUeberschritten'
),
'person' => array(
'student',
@@ -158,9 +160,9 @@ else
</div>
</th>
<td colspan="3">
Total ECTS: <span id="sumEctsTotal"><?php echo number_format($antragData->sumEctsSchulisch + $antragData->sumEctsBeruflich, 1) ?></span>
[ Schulisch: <span id="sumEctsSchulisch"><?php echo $antragData->sumEctsSchulisch ?></span> |
Beruflich: <span id="sumEctsBeruflich"><?php echo $antragData->sumEctsBeruflich ?></span> ]
<?php echo $this->p->t('anrechnung', 'totalEcts'); ?>: <span id="sumEctsTotal"><?php echo number_format($antragData->sumEctsSchulisch + $antragData->sumEctsBeruflich, 1) ?></span>
[ <?php echo $this->p->t('anrechnung', 'schulisch'); ?>: <span id="sumEctsSchulisch"><?php echo $antragData->sumEctsSchulisch ?></span> |
<?php echo $this->p->t('anrechnung', 'beruflich'); ?>: <span id="sumEctsBeruflich"><?php echo $antragData->sumEctsBeruflich ?></span> ]
<div class="p-1 align-items-center" id="requestAnrechnung-maxEctsUeberschrittenMsg"></div>
</td>
</tr>
@@ -184,43 +186,31 @@ else
<div class="col-lg-12">
<div class="border border-dark border-3 rounded p-3" >
<p ><?php echo $this->p->t('anrechnung', 'antragStellenText'); ?></p>
<div class="ps-3 ">
<div class="form-check mb-1">
<input class="form-check-input" type="radio" name="begruendung" value="1" <?php echo $anrechnungData->begruendung_id == '1' ? 'checked' : ''; ?> required />
<?php echo $this->p->t('anrechnung', 'antragStellenWegenZeugnis'); ?>&emsp;
<div class="d-inline" id="requestAnrechnung-anrechnungGrundZeugnisTooltip" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true"
data-bs-title="<?php echo $this->p->t('anrechnung', 'anrechnungGrundZeugnisTooltipText'); ?>" >
<i class="fa fa-lg fa-info-circle" aria-hidden="true"></i>
</div>
</div>
<div class="form-check mb-1">
<input class="form-check-input" type="radio" name="begruendung" value="5" <?php echo $anrechnungData->begruendung_id == '5' ? 'checked' : ''; ?> required />
<?php echo $this->p->t('anrechnung', 'antragStellenWegenHochschulzeugnis'); ?>&emsp;
<div class="d-inline" id="requestAnrechnung-anrechnungGrundHochschulzeugnisTooltip" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true"
data-bs-title="<?php echo $this->p->t('anrechnung', 'anrechnungGrundZeugnisTooltipText'); ?>">
<i class="fa fa-lg fa-info-circle" aria-hidden="true"></i>
</div>
</div>
<div class="form-check mb-1">
<input class="form-check-input" type="radio" name="begruendung" value="4" <?php echo $anrechnungData->begruendung_id == '4' ? 'checked' : ''; ?> required />
<?php echo $this->p->t('anrechnung', 'antragStellenWegenPraxis'); ?>&emsp;
<div class="d-inline" id="requestAnrechnung-anrechnungGrundBerufTooltip" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true"
data-bs-title="<?php echo $this->p->t('anrechnung', 'anrechnungGrundBerufTooltipText'); ?>">
<i class="fa fa-lg fa-info-circle" aria-hidden="true"></i>
</div>
</div>
</div>
</div>
</div>
@@ -285,7 +275,7 @@ else
required>
<div class="mx-4 " id="requestAnrechnung-uploadTooltip" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true"
data-bs-title="<?php echo $this->p->t('ui', 'uploadTooltipText'); ?>">
<i class="fa fa-lg fa-question-circle-o" aria-hidden="true"></i>
<i class="fa-regular fa-lg fa-circle-question" aria-hidden="true"></i>
</div>
<a class="mx-4 float-end <?php echo !empty($anrechnungData->dms_id) ? '' : 'visually-hidden' ?>"
id="requestAnrechnung-downloadDocLink"
@@ -293,9 +283,6 @@ else
target="_blank"><?php echo htmlentities($anrechnungData->dokumentname) ?>
</a>
</div>
</div>
</div>
</div>
@@ -303,38 +290,35 @@ else
<!-- Herkunft der Kenntnisse -->
<div class="row mb-3">
<div class="col-lg-12">
<div class="card">
<div class="card-header">
<span class="fw-bold"><?php echo $this->p->t('anrechnung', 'herkunftDerKenntnisse'); ?></span>&emsp;
<div class="d-inline" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true" data-bs-title="<?php echo $this->p->t('anrechnung', 'anrechnungInfoTooltipText'); ?>">
<i class="fa fa-lg fa-info-circle" aria-hidden="true"></i>
</div>
</div>
<div class="card-body">
<textarea class="form-control" name="anmerkung" rows="1" id="requestAnrechnung-herkunftDerKenntnisse"
maxlength="<?php echo CHAR_LENGTH125 ?>" required><?php echo $anrechnungData->anmerkung; ?></textarea>
<small><span class="text-muted float-end"><?php echo $this->p->t('ui', 'maxZeichen'); ?> :<span id="requestAnrechnung-herkunftDerKenntnisse-charCounter"><?php echo CHAR_LENGTH125 ?></span></span></small>
</div>
<div class="card">
<div class="card-header">
<span class="fw-bold"><?php echo $this->p->t('anrechnung', 'herkunftDerKenntnisse'); ?></span>&emsp;
<div class="d-inline" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true" data-bs-title="<?php echo $this->p->t('anrechnung', 'anrechnungInfoTooltipText'); ?>">
<i class="fa fa-lg fa-info-circle" aria-hidden="true"></i>
</div>
</div>
<div class="card-body">
<textarea class="form-control" name="anmerkung" rows="1" id="requestAnrechnung-herkunftDerKenntnisse"
maxlength="<?php echo CHAR_LENGTH125 ?>" required><?php echo $anrechnungData->anmerkung; ?></textarea>
<small><span class="text-muted float-end"><?php echo $this->p->t('ui', 'maxZeichen'); ?> :<span id="requestAnrechnung-herkunftDerKenntnisse-charCounter"><?php echo CHAR_LENGTH125 ?></span></span></small>
</div>
</div>
</div>
</div>
<!-- Bestaetigung-->
<div class="row mb-3">
<div class="col-lg-12">
<div class="border border-3 rounded border-dark p-3" >
<div class="form-check">
<div class="form-check">
<input class="form-check-input border-3" type="checkbox" name="bestaetigung" required>
<small class=" fw-bold"><?php echo $this->p->t('anrechnung', 'bestaetigungstext'); ?></small>
</div>
</div>
</div>
</div>
</div>
<!-- Button 'Anrechnung beantragen'-->
<div class="float-end">
<input type="submit" id="requestAnrechnung-apply-anrechnung" class="btn btn-primary"
<input type="submit" id="requestAnrechnung-apply-anrechnung" class="btn btn-primary"
value="<?php echo $this->p->t('anrechnung', 'anrechnungBeantragen'); ?>">
</div>
</form>
@@ -343,16 +327,18 @@ else
</div>
<div class="col-4">
<!-- Status panel -->
<div class="alert text-center" id="requestAnrechnung-status">Status: <span class="fw-bold text-uppercase" id="requestAnrechnung-status_kurzbz"
data-status_kurzbz="<?php echo $anrechnungData->status_kurzbz ?>">
<?php echo $anrechnungData->status; ?>
</span>
<div class="alert text-center" id="requestAnrechnung-status"><?php echo $this->p->t('global', 'status'); ?>:
<span class="fw-bold text-uppercase" id="requestAnrechnung-status_kurzbz"
data-status_kurzbz="<?php echo $anrechnungData->status_kurzbz ?>">
<?php echo $anrechnungData->status; ?>
</span>
</div>
<!-- Sperregrund panel (hidden by default) -->
<div class="alert bg-danger-subtle text-center visually-hidden" id="requestAnrechnung-sperre"
data-anrechnung_id="<?php echo empty($anrechnungData->anrechnung_id) ? '' : $anrechnungData->anrechnung_id; ?>"
data-expired="<?php echo json_encode($is_expired); ?>"
data-blocked="<?php echo json_encode($is_blocked) ?>">
data-blocked="<?php echo json_encode($is_blocked) ?>"
data-not_in_studienplan="<?php echo json_encode($is_not_in_studienplan) ?>">
</div>
<?php $this->load->view('lehre/anrechnung/requestAnrechnungImportant'); ?>
</div>
@@ -3,10 +3,10 @@
<?php if (isset($this->config->item('display_infobox')['fristen']) && $this->config->item('display_infobox')['fristen'] === true): ?>
<div class="accordion-item">
<h2 class="accordion-header">
<div class="bg-info-subtle accordion-button" type="button" data-bs-toggle="collapse"
data-bs-target="#Beantragung" aria-expanded="true" aria-controls="Beantragung">
<div class="d-flex">
<div class="d-flex">
<div class="bg-info-subtle accordion-button" type="button" data-bs-toggle="collapse"
data-bs-target="#Beantragung" aria-expanded="true" aria-controls="Beantragung">
<i class="me-2 fa fa-lg fa-info-circle" aria-hidden="true"></i>&ensp;
<?php echo $this->p->t('anrechnung', 'requestAnrechnungInfoFristenTitle'); ?>
</div>
@@ -23,9 +23,10 @@
<?php if (isset($this->config->item('display_infobox')['referenzbeispiele_ects']) && $this->config->item('display_infobox')['referenzbeispiele_ects'] === true): ?>
<div class="accordion-item">
<h2 class="accordion-header">
<div class="bg-info-subtle accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#Referenzbeispiele" aria-expanded="false" aria-controls="Referenzbeispiele">
<div class="d-flex">
<div class="d-flex">
<div class="bg-info-subtle accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#Referenzbeispiele" aria-expanded="false" aria-controls="Referenzbeispiele">
<i class="me-2 fa fa-lg fa-info-circle" aria-hidden="true"></i>&ensp;
<?php echo $this->p->t('anrechnung', 'requestAnrechnungInfoEctsBerechnungTitle'); ?>
</div>
@@ -63,9 +64,10 @@
<?php if (isset($this->config->item('display_infobox')['herkunft_kenntnisse']) && $this->config->item('display_infobox')['herkunft_kenntnisse'] === true): ?>
<div class="accordion-item">
<h2 class="accordion-header">
<div class="bg-info-subtle accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#HerkunftKenntnisse" aria-expanded="false" aria-controls="HerkunftKenntnisse">
<div class="d-flex">
<div class="d-flex">
<div class="bg-info-subtle accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#HerkunftKenntnisse" aria-expanded="false" aria-controls="HerkunftKenntnisse">
<i class="me-2 fa fa-lg fa-info-circle" aria-hidden="true"></i>&ensp;
<?php echo $this->p->t('anrechnung', 'requestAnrechnungInfoHerkunftKenntnisseTitle'); ?>
</div>
@@ -152,7 +152,6 @@ if (defined("CIS4")) {
<div class="col-lg-8">
<table class="table table-bordered table-condensed table-fixed mb-0">
<tbody>
<tr>
<th class="col-4">
<?php echo ucfirst($this->p->t('global', 'zgv')); ?>
@@ -192,7 +191,6 @@ if (defined("CIS4")) {
<?php endif; ?>
</tbody>
</table>
</div>
</div>
</div>
@@ -215,7 +213,6 @@ if (defined("CIS4")) {
<?php echo $this->p->t('anrechnung', 'empfehlungdatum'); ?>:
<span
id="reviewAnrechnungDetail-empfehlungAm"><?php echo $empfehlungData->empfehlung_am ?></span>
</div>
</div>
<div class="card-body">
@@ -383,9 +380,9 @@ if (defined("CIS4")) {
<div class="mb-5 alert text-center">
<?php echo $this->p->t('global', 'status'); ?>:
<b><span class="text-uppercase" id="reviewAnrechnungDetail-status_kurzbz"
data-status_kurzbz="<?php echo $anrechnungData->status_kurzbz ?>">
<?php echo $anrechnungData->status; ?>
</span></b>
data-status_kurzbz="<?php echo $anrechnungData->status_kurzbz ?>">
<?php echo $anrechnungData->status; ?>
</span></b>
</div>
<?php $this->load->view('lehre/anrechnung/reviewAnrechnungInfo'); ?>
@@ -106,7 +106,8 @@ if (defined("CIS4")) {
<h3 class="fw-normal">
<?php echo $this->p->t('anrechnung', 'anrechnungenPruefen'); ?>
<small class="text-secondary fs-6">|
<?php echo ucfirst($this->p->t('global', 'uebersicht')); ?></small>
<?php echo ucfirst($this->p->t('global', 'uebersicht')); ?>
</small>
</h3>
</div>
</div>
@@ -130,7 +131,8 @@ if (defined("CIS4")) {
?>
</div>
<button type="submit"
class="btn btn-outline-secondary col-auto"><?php echo ucfirst($this->p->t('ui', 'anzeigen')); ?></button>
class="btn btn-outline-secondary col-auto"><?php echo ucfirst($this->p->t('ui', 'anzeigen')); ?>
</button>
</form>
</div>
</div>
@@ -148,10 +150,12 @@ if (defined("CIS4")) {
<?php echo $this->p->t('anrechnung', 'empfehlungenNegativQuestion'); ?>
</h4>
<div class="mb-4">
<b><span>&ensp;<?php echo $this->p->t('anrechnung', 'bitteBegruendungAngeben'); ?></span>
<b>
<span>&ensp;<?php echo $this->p->t('anrechnung', 'bitteBegruendungAngeben'); ?></span>
<span class="text-danger">
<?php echo $this->p->t('anrechnung', 'begruendungWirdFuerAlleUebernommen'); ?>
</span></b>
</span>
</b>
</div>
<ul class="list-group mb-4">
@@ -134,7 +134,7 @@ export default {
event: 'tableBuilt',
handler: async () => {
await this.$p.loadCategory(['anrechnungen', 'global', 'ui', 'lehre']);
await this.$p.loadCategory(['anrechnung', 'global', 'ui', 'lehre']);
const setHeader = (field, text) => {
const col = this.$refs.table.tabulator.getColumn(field);
@@ -158,6 +158,10 @@ export default {
setHeader( 'genehmigt_von', this.$p.t('anrechnung', 'genehmigtVon'));
setHeader( 'notizen_anzahl', this.$p.t('anrechnung', 'existingNotes'));
setHeader( 'insertamum', this.$p.t('global', 'datum'));
setHeader( 'actions', this.$p.t('global', 'aktionen'));
// Render the action buttons again, their phrases can arrive after the data
this.$refs.table.tabulator.redraw(true);
}
}
];
@@ -280,6 +284,12 @@ export default {
resetLvKompatibel(){
this.formData.lehrveranstaltung_id_kompatibel = null;
this.handleInput();
},
lvBezeichnung(lv) {
// English name only if the LV has one
return this.$p.user_language.value != 'German' && lv.bezeichnung_english
? lv.bezeichnung_english
: lv.bezeichnung;
}
},
created() {
@@ -380,7 +390,7 @@ export default {
:key="entry.lehrveranstaltung_id"
:value="entry.lehrveranstaltung_id"
>
{{entry.bezeichnung}} Semester {{entry.semester}} {{entry.lehrform_kurzbz}}
{{lvBezeichnung(entry)}} Semester {{entry.semester}} {{entry.lehrform_kurzbz}}
</option>
</form-input>
</div>
@@ -407,7 +417,7 @@ export default {
<div v-if="formData.begruendung_id == '2'" class="row mb-3">
<form-input
type="select"
label="Lehrveranstaltung Kompatibel"
:label="$p.t('anrechnung/lehrveranstaltung_bez_kompatibel')"
name="lehrveranstaltung_id_kompatibel"
v-model="formData.lehrveranstaltung_id_kompatibel"
>
@@ -416,7 +426,7 @@ export default {
:key="entry.lehrveranstaltung_id"
:value="entry.lehrveranstaltung_id"
>
{{entry.bezeichnung}} Semester {{entry.semester}} {{entry.lehrform_kurzbz}}
{{lvBezeichnung(entry)}} Semester {{entry.semester}} {{entry.lehrform_kurzbz}}
</option>
</form-input>
</div>
@@ -181,9 +181,10 @@ var requestAnrechnung = {
const anrechnung_id = $('#requestAnrechnung-sperre').data('anrechnung_id');
const is_expired = $('#requestAnrechnung-sperre').data('expired');
const is_blocked = $('#requestAnrechnung-sperre').data('blocked');
const is_not_in_studienplan = $('#requestAnrechnung-sperre').data('not_in_studienplan');
// If Deadline is expired or is blocked by grades of LV, AND not already angerechnet
if ((is_expired || is_blocked) && anrechnung_id == '')
// If Deadline is expired, LV is blocked by grades or LV is not in the Studienplan, AND not already angerechnet
if ((is_expired || is_blocked || is_not_in_studienplan) && anrechnung_id == '')
{
// Hide status panel
$('#requestAnrechnung-status').hide();
@@ -194,7 +195,10 @@ var requestAnrechnung = {
.html(function(){
let sperregrund = FHC_PhrasesLib.t('global', 'bearbeitungGesperrt') + ': ';
if (is_expired) {
if (is_not_in_studienplan) {
sperregrund += FHC_PhrasesLib.t('anrechnung', 'lvNichtImStudienplan');
}
else if (is_expired) {
sperregrund += FHC_PhrasesLib.t('anrechnung', 'deadlineUeberschritten');
}
else if (is_blocked){
@@ -294,7 +298,7 @@ var requestAnrechnung = {
)
{
$('#requestAnrechnung-maxEctsUeberschrittenMsg')
.html("<span class='flex-fill fw-bold'>Die Höchstgrenze für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz ist überschritten. </span><i class='mx-4 fa fa-lg fa-info-circle'></i>")
.html("<span class='flex-fill fw-bold'>" + FHC_PhrasesLib.t("anrechnung", "hoechstgrenzeUeberschritten") + " </span><i class='mx-4 fa fa-lg fa-info-circle'></i>")
.addClass('bg-danger-subtle')
.tooltip({
title: FHC_PhrasesLib.t("anrechnung", "anrechnungEctsTooltipTextBeiUeberschreitung"),
@@ -351,11 +355,12 @@ var requestAnrechnung = {
},
getMsgBeiEctsUeberschreitung: function(begruendung_id, ects, sumEctsSchulisch, sumEctsBeruflich){
const phraseUsed = '<span class="d-block">Die Höchstgrenze für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz wird überschritten.</span><span class=" fw-bold">Bisherige ECTS + ECTS dieser LV: Total: {0} [ Schulisch: {1} | Beruflich: {2} ]</span>&emsp;';
return $('<div class="p-1" id="sumEctsMsg"></div>')
.html(phraseUsed) // schulisch
.append('<i class="fa fa-lg fa-info-circle"></i>')
.html(FHC_PhrasesLib.t("anrechnung", "anrechnungEctsTextBeiUeberschreitung",
begruendung_id == 4
? [(sumEctsSchulisch + sumEctsBeruflich + ects), sumEctsSchulisch, (sumEctsBeruflich + ects)] // beruflich
: [(sumEctsSchulisch + sumEctsBeruflich + ects), (sumEctsSchulisch + ects), sumEctsBeruflich])) // schulisch
.append('&emsp;<i class="fa fa-lg fa-info-circle"></i>')
.addClass('bg-danger-subtle')
.tooltip({
title: FHC_PhrasesLib.t("anrechnung", "anrechnungEctsTooltipTextBeiUeberschreitung"),
@@ -13,7 +13,7 @@ if ($result = $db->db_query("SELECT 1 FROM information_schema.columns WHERE tabl
UPDATE lehre.tbl_anrechnung_begruendung SET bezeichnung_mehrsprachig = ARRAY[
bezeichnung,
CASE bezeichnung
WHEN 'externes Zeugnis' THEN 'external certificate'
WHEN 'schulisches Zeugnis' THEN 'school certificate'
WHEN 'kompatible Lehrveranstaltung' THEN 'compatible course'
WHEN 'Prüfung' THEN 'examination'
WHEN 'berufliche Praxis' THEN 'professional practice'
+40
View File
@@ -13742,6 +13742,46 @@ Any unusual occurrences
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'keineGenehmigungZumZuruecknehmen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Es gibt keine Genehmigung oder Ablehnung zum Zurücknehmen. Der Antrag ist noch in Bearbeitung.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'There is no approval or rejection to withdraw. The application is still in progress.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',
'phrase' => 'fehlerBeimLoeschen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Fehler beim Löschen',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Error while deleting',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'anrechnung',