p->t('anrechnung', 'empfehlungNegativQuestion'); ?>
-
-
p->t('anrechnung', 'bitteBegruendungAngeben'); ?>
-
- -
+
+ -
p->t('anrechnung', 'empfehlungNegativPruefungNichtMoeglich'); ?>
-
-
+
- -
+
-
p->t('anrechnung', 'empfehlungNegativKenntnisseNichtGleichwertig'); ?>
-
-
+
- - p->t('anrechnung', 'andereBegruendung'); ?>
-
+ rows="2"
+ placeholder="p->t('anrechnung', 'textUebernehmenOderEigenenBegruendungstext'); ?>"
+ required>
diff --git a/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php b/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php
index 3337c4a83..9d0c84de8 100644
--- a/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php
+++ b/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php
@@ -127,30 +127,31 @@ $this->load->view(
id="reviewAnrechnungUebersicht-begruendung-panel">
p->t('anrechnung', 'empfehlungenNegativQuestion'); ?>
-
p->t('anrechnung', 'bitteBegruendungAngeben'); ?>
-
- -
- p->t('anrechnung', 'empfehlungNegativPruefungNichtMoeglich'); ?>
-
-
-
-
- -
- p->t('anrechnung', 'empfehlungNegativKenntnisseNichtGleichwertig'); ?>
-
-
-
-
- - p->t('anrechnung', 'andereBegruendung'); ?>
-
-
-
+ p->t('anrechnung', 'bitteBegruendungAngeben'); ?>
+
p->t('anrechnung', 'begruendungWirdFuerAlleUebernommen'); ?>
-
+
+
+
+ -
+ p->t('anrechnung', 'empfehlungNegativPruefungNichtMoeglich'); ?>
+
+
+
+
+ -
+ p->t('anrechnung', 'empfehlungNegativKenntnisseNichtGleichwertig'); ?>
+
+
+
+
+
+ rows="2"
+ placeholder="p->t('anrechnung', 'textUebernehmenOderEigenenBegruendungstext'); ?>"
+ required>
diff --git a/application/views/system/infocenter/infocenter.php b/application/views/system/infocenter/infocenter.php
index 47c154d81..0b7a20c2c 100644
--- a/application/views/system/infocenter/infocenter.php
+++ b/application/views/system/infocenter/infocenter.php
@@ -18,7 +18,8 @@
'global' => array('mailAnXversandt'),
'ui' => array('bitteEintragWaehlen')
),
- 'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css', 'public/css/infocenter/infocenterPersonDataset.css')
+ 'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css', 'public/css/infocenter/infocenterPersonDataset.css'),
+ 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/infocenterPersonDataset.js')
);
$this->load->view('templates/FHC-Header', $includesArray);
diff --git a/application/views/templates/FHC-Footer.php b/application/views/templates/FHC-Footer.php
index fb5724ff0..f4e36af8e 100644
--- a/application/views/templates/FHC-Footer.php
+++ b/application/views/templates/FHC-Footer.php
@@ -87,6 +87,7 @@
{
generateJSsInclude('vendor/mottie/tablesorter/dist/js/jquery.tablesorter.min.js');
generateJSsInclude('vendor/mottie/tablesorter/dist/js/jquery.tablesorter.widgets.min.js');
+ generateJSsInclude('vendor/mottie/tablesorter/dist/js/extras/jquery.tablesorter.pager.min.js');
}
// Tabulator 4 JS
diff --git a/public/js/lehre/anrechnung/approveAnrechnungDetail.js b/public/js/lehre/anrechnung/approveAnrechnungDetail.js
index c5c0519f3..641cc0933 100644
--- a/public/js/lehre/anrechnung/approveAnrechnungDetail.js
+++ b/public/js/lehre/anrechnung/approveAnrechnungDetail.js
@@ -4,8 +4,6 @@ const ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR = 'inProgressLektor';
const ANRECHNUNGSTATUS_APPROVED = 'approved';
const ANRECHNUNGSTATUS_REJECTED = 'rejected';
-
-
$(function(){
const genehmigung_panel = $('#approveAnrechnungDetail-genehmigung-panel');
@@ -36,6 +34,8 @@ $(function(){
// Init tooltips
approveAnrechnungDetail.initTooltips();
+ approveAnrechnungDetail.alertIfMaxEctsExceeded();
+
// Ask if Approve Anrechnungen
$("#approveAnrechnungDetail-approve-anrechnung-ask").click(function(){
@@ -91,8 +91,12 @@ $(function(){
approveAnrechnungDetail.formatGenehmigungIsPositiv(
data.retval[0].abgeschlossen_am,
data.retval[0].abgeschlossen_von,
- data.retval[0].status_bezeichnung
+ data.retval[0].status_kurzbz,
+ data.retval[0].status_bezeichnung,
);
+
+ approveAnrechnungDetail.sumUpEcts();
+ approveAnrechnungDetail.alertIfMaxEctsExceeded();
}
},
errorCallback: function (jqXHR, textStatus, errorThrown)
@@ -168,6 +172,7 @@ $(function(){
approveAnrechnungDetail.formatGenehmigungIsNegativ(
data.retval[0].abgeschlossen_am,
data.retval[0].abgeschlossen_von,
+ data.retval[0].status_kurzbz,
data.retval[0].status_bezeichnung,
begruendung
);
@@ -236,6 +241,7 @@ $(function(){
// Get form data
let form_data = $('form').serializeArray();
+ var init_status_kurzbz = $('#approveAnrechnungDetail-status_kurzbz').data('status_kurzbz');
// Prepare data object for ajax call
let data = {
@@ -248,21 +254,24 @@ $(function(){
{
successCallback: function (data, textStatus, jqXHR)
{
- console.log(data);
if (data.error && data.retval != null)
{
- console.log('inside error');
// Print error message
FHC_DialogLib.alertWarning(data.retval);
}
if (!data.error && data.retval != null)
{
- console.log('inside success');
approveAnrechnungDetail.formatGenehmigungIsWithdrawed(
data.retval.status_bezeichnung
);
+ if (init_status_kurzbz == 'approved')
+ {
+ approveAnrechnungDetail.substractEcts(ects, sumEctsSchulisch, sumEctsBeruflich);
+ approveAnrechnungDetail.alertIfMaxEctsExceeded();
+ }
+
FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("anrechnung", "erfolgreichZurueckgenommen"));
}
@@ -477,12 +486,13 @@ var approveAnrechnungDetail = {
$('#approveAnrechnungDetail-reject-anrechnung-ask').prop('disabled', true);
$('#approveAnrechnungDetail-withdraw-request-recommedation').removeClass('hidden');
},
- formatGenehmigungIsPositiv: function(abgeschlossenAm, abgeschlossenVon, statusBezeichnung){
+ formatGenehmigungIsPositiv: function(abgeschlossenAm, abgeschlossenVon, statusKurzbz, statusBezeichnung){
$('#approveAnrechnungDetail-genehmigungDetail-genehmigungIsNull').addClass('hidden');
$('#approveAnrechnungDetail-genehmigungDetail-genehmigungIsNegativ').addClass('hidden');
$('#approveAnrechnungDetail-genehmigungDetail-genehmigungIsPositiv').removeClass('hidden');
$('#approveAnrechnungDetail-status_kurzbz').text(statusBezeichnung);
$('#approveAnrechnungDetail-status_kurzbz').closest('div').removeClass('alert-warning').addClass('alert-success');
+ $('#approveAnrechnungDetail-status_kurzbz').data('status_kurzbz', statusKurzbz);
$('#approveAnrechnungDetail-abgeschlossenAm').text(abgeschlossenAm);
$('#approveAnrechnungDetail-abgeschlossenVon').text(abgeschlossenVon);
$('#approveAnrechnungDetail-request-recommendation').prop('disabled', true);
@@ -492,12 +502,13 @@ var approveAnrechnungDetail = {
// Show button to withdraw approval
$('#approveAnrechnungDetail-withdraw-anrechnung-approvement').removeClass('hidden');
},
- formatGenehmigungIsNegativ: function(abgeschlossenAm, abgeschlossenVon, statusBezeichnung, begruendung){
+ formatGenehmigungIsNegativ: function(abgeschlossenAm, abgeschlossenVon, statusKurzbz, statusBezeichnung, begruendung){
$('#approveAnrechnungDetail-genehmigungDetail-genehmigungIsNull').addClass('hidden');
$('#approveAnrechnungDetail-genehmigungDetail-genehmigungIsPositiv').addClass('hidden');
$('#approveAnrechnungDetail-genehmigungDetail-genehmigungIsNegativ').removeClass('hidden');
$('#approveAnrechnungDetail-status_kurzbz').text(statusBezeichnung);
$('#approveAnrechnungDetail-status_kurzbz').closest('div').removeClass('alert-warning').addClass('alert-danger');
+ $('#approveAnrechnungDetail-status_kurzbz').data('status_kurzbz', statusKurzbz);
$('#approveAnrechnungDetail-abgeschlossenAm').text(abgeschlossenAm);
$('#approveAnrechnungDetail-abgeschlossenVon').text(abgeschlossenVon);
$('#approveAnrechnungDetail-genehmigungDetail-begruendung').text(begruendung);
@@ -544,5 +555,76 @@ var approveAnrechnungDetail = {
$('#approveAnrechnungDetail-reject-anrechnung-ask').prop('disabled', false);
// Hide button to withdraw approval
$('#approveAnrechnungDetail-withdraw-request-recommedation').addClass('hidden');
+ },
+ sumUpEcts: function(){
+ var ects = parseFloat($('#ects').text());
+ var sumEctsSchulisch = parseFloat($('#sumEctsSchulisch').text());
+ var sumEctsBeruflich = parseFloat($('#sumEctsBeruflich').text());
+ var begruendung_id = $('#begruendung_id').data('begruendung_id');
+
+ if (begruendung_id == 5)
+ {
+ return;
+ }
+
+ if (begruendung_id == 4)
+ {
+ $('#sumEctsBeruflich').text(sumEctsBeruflich + ects);
+ }
+ else
+ {
+ $('#sumEctsSchulisch').text(sumEctsSchulisch + ects);
+ }
+
+ $('#sumEctsTotal').text(sumEctsSchulisch + sumEctsBeruflich + ects);
+
+ },
+ substractEcts: function(ects, sumEctsSchulisch, sumEctsBeruflich){
+ var ects = parseFloat($('#ects').text());
+ var sumEctsSchulisch = parseFloat($('#sumEctsSchulisch').text());
+ var sumEctsBeruflich = parseFloat($('#sumEctsBeruflich').text());
+ var begruendung_id = $('#begruendung_id').data('begruendung_id');
+
+ if (begruendung_id == 5)
+ {
+ return;
+ }
+
+ if (begruendung_id == 4)
+ {
+ $('#sumEctsBeruflich').text(sumEctsBeruflich - ects);
+ }
+ else
+ {
+ $('#sumEctsSchulisch').text(sumEctsSchulisch - ects);
+ }
+
+ $('#sumEctsTotal').text(sumEctsSchulisch + sumEctsBeruflich - ects);
+ },
+ alertIfMaxEctsExceeded: function(){
+ var begruendung_id = $('#begruendung_id').data('begruendung_id');
+ if (begruendung_id == 5)
+ {
+ return;
+ }
+ if(
+ (parseFloat($('#ects').text()) + parseFloat($('#sumEctsSchulisch').text())) > 60 ||
+ (parseFloat($('#ects').text()) + parseFloat($('#sumEctsBeruflich').text())) > 60 ||
+ (parseFloat($('#ects').text()) + parseFloat($('#sumEctsSchulisch').text()) + parseFloat($('#sumEctsBeruflich').text())) > 90
+ )
+ {
+ $('#sumEctsMsg')
+ .html("
ACHTUNG! Bei Anrechnung von LV: Überschreitung der Höchstgrenze für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz")
+ .addClass('bg-danger text-danger')
+ .tooltip({
+ title: FHC_PhrasesLib.t("anrechnung", "anrechnungEctsTooltipTextBeiUeberschreitung"),
+ placement: 'right',
+ html: true
+ });
+ }
+ else
+ {
+ $('#sumEctsMsg').html('').css('border', 'none');
+ }
}
}
\ No newline at end of file
diff --git a/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js b/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js
index fe78217b9..e831856d8 100644
--- a/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js
+++ b/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js
@@ -8,6 +8,12 @@ const ANRECHNUNGSTATUS_APPROVED = 'approved';
const ANRECHNUNGSTATUS_REJECTED = 'rejected';
const COLOR_LIGHTGREY = "#f5f5f5";
+const COLOR_DANGER = '#f2dede';
+
+var tabulator = null; // Set in tableBuilt function.
+
+// Array with accumulated LV ECTS by Prestudent. Used to find out if max ECTS are exceeded.
+var selectedPrestudentWithAccumulatedLvEcts = [];
// -----------------------------------------------------------------------------------------------------------------
// Mutators - setter methods to manipulate table data when entering the tabulator
@@ -52,6 +58,10 @@ function hf_filterTrueFalse(headerValue, rowValue){
// Adds column details
// Sets focus on filterbutton, if table starts with stored filter.
function func_tableBuilt(table) {
+
+ // Store table in global var
+ tabulator = table;
+
table.addColumn(
{
title: "Details",
@@ -66,7 +76,7 @@ function func_tableBuilt(table) {
},
target:"_blank"
}
- }, false, "status" // place column after status
+ }, true // place column on the very left
);
// Set focus on filterbutton
@@ -76,16 +86,74 @@ function func_tableBuilt(table) {
}
}
+/**
+ * Formats column ECTS (LV + Bisher).
+ */
+var format_ectsSumBisherUndNeu = function(cell, formatterParams, onRendered){
+ let row = cell.getRow();
+ let rowData = row.getData();
+
+ let begruendung_id = (rowData.begruendung_id);
+ let ectsSumBisherUndNeuTotal = (rowData.ectsSumSchulisch + rowData.ectsSumBeruflich);
+ let ectsSumBisherUndNeuSchulisch = rowData.ectsSumSchulisch;
+ let ectsSumBisherUndNeuBeruflich = rowData.ectsSumBeruflich;
+
+ // If exists, add accumulated LV ECTS to bisherige ECTS
+ if (selectedPrestudentWithAccumulatedLvEcts.length > 0)
+ {
+ let selectedPrestudent = selectedPrestudentWithAccumulatedLvEcts.find(x => x.prestudent_id === rowData.prestudent_id);
+
+ if (selectedPrestudent != undefined)
+ {
+ ectsSumBisherUndNeuTotal = (rowData.ectsSumSchulisch + rowData.ectsSumBeruflich) + selectedPrestudent.ectsSumAnzurechnendeLvsSchulisch + selectedPrestudent.ectsSumAnzurechnendeLvsBeruflich;
+ ectsSumBisherUndNeuSchulisch = rowData.ectsSumSchulisch + selectedPrestudent.ectsSumAnzurechnendeLvsSchulisch;
+ ectsSumBisherUndNeuBeruflich = rowData.ectsSumBeruflich + selectedPrestudent.ectsSumAnzurechnendeLvsBeruflich;
+ }
+
+ // Color column if maximum ECTS exceeded
+ if (begruendung_id != 5 && row.isSelected())
+ {
+
+ if (
+ (ectsSumBisherUndNeuSchulisch + ectsSumBisherUndNeuBeruflich) > 90 ||
+ ectsSumBisherUndNeuSchulisch > 60 ||
+ ectsSumBisherUndNeuBeruflich > 60
+ )
+ {
+ cell.getElement().style["background-color"] = COLOR_DANGER;
+ }
+ }
+ else
+ {
+ cell.getElement().style.removeProperty('background-color');
+ }
+ }
+
+ // If max ECTS is exceeded, format font color / weight
+ ectsSumBisherUndNeuTotal = (ectsSumBisherUndNeuTotal > 90) ? "
" + ectsSumBisherUndNeuTotal + "" : ectsSumBisherUndNeuTotal;
+ ectsSumBisherUndNeuSchulisch = (ectsSumBisherUndNeuSchulisch > 60) ? "
" + ectsSumBisherUndNeuSchulisch + "" : ectsSumBisherUndNeuSchulisch;
+ ectsSumBisherUndNeuBeruflich = (ectsSumBisherUndNeuBeruflich > 60) ? "
" + ectsSumBisherUndNeuBeruflich + "" : ectsSumBisherUndNeuBeruflich;
+
+ return "T: " + ectsSumBisherUndNeuTotal + " [ S: " + ectsSumBisherUndNeuSchulisch + " | B: " + ectsSumBisherUndNeuBeruflich + " ]";
+}
+
// Formats the rows
function func_rowFormatter(row){
let status_kurzbz = row.getData().status_kurzbz;
- row.getCells().forEach(function(cell){
- if (status_kurzbz != ANRECHNUNGSTATUS_PROGRESSED_BY_STGL)
- {
- row.getElement().style["background-color"] = COLOR_LIGHTGREY; // default
- }
- });
+ // If status is anything else then 'Bearbeitet von STGL-Leitung'
+ if (status_kurzbz != ANRECHNUNGSTATUS_PROGRESSED_BY_STGL)
+ {
+ // Disable new selection of updated rows
+ row.getElement().style["pointerEvents"] = "none";
+
+ // ...but leave url links selectable
+ row.getCell('dokument_bezeichnung').getElement().firstChild.style["pointerEvents"] = "auto";
+ row.getCell('details').getElement().firstChild.style["pointerEvents"] = "auto";
+
+ // Color background grey
+ row.getElement().style["background-color"] = COLOR_LIGHTGREY; // default
+ }
}
// Formats row selectable/unselectable
@@ -99,18 +167,23 @@ function func_selectableCheck(row){
);
}
-// Performes after row was updated
-function func_rowUpdated(row){
- // Refresh row formatters
- row.reformat();
+// Calculate dynamically sum of all LV ECTS by Student and display, when maximum ECTS are exceeded.
+// data = selected data, rows = selected rows
+function func_rowSelectionChanged(data, rows){
- // Deselect and disable new selection of updated rows
- row.deselect();
- row.getElement().style["pointerEvents"] = "none";
+ // Sum up over all anzurechnenden LV-ECTS by Prestudent
+ selectedPrestudentWithAccumulatedLvEcts = approveAnrechnung.getSumLvEctsByPreStudent(data);
- // ...but leave url links selectable
- row.getCell('dokument_bezeichnung').getElement().firstChild.style["pointerEvents"] = "auto";
- row.getCell('details').getElement().firstChild.style["pointerEvents"] = "auto";
+ // Loop through all active rows
+ var rowManager = tabulator.rowManager;
+ for (var i = 0; i < rowManager.activeRows.length; i++) {
+
+ // Reinitialize row -> triggers formatters.
+ rowManager.activeRows[i].reinitialize();
+ }
+
+ // Show number of selected rows.
+ approveAnrechnung.showNumberSelectedRows(rows);
}
// Returns tooltip
@@ -136,11 +209,12 @@ var format_empfehlung_anrechnung = function(cell, formatterParams){
* (Ignore rows that are approved, rejected or in request for recommendation)
*/
function tableWidgetHook_selectAllButton(tableWidgetDiv){
- tableWidgetDiv.find("#tableWidgetTabulator").tabulator('getRows', true)
+ var resultRows = tableWidgetDiv.find("#tableWidgetTabulator").tabulator('getRows', true)
.filter(row =>
row.getData().status_kurzbz == ANRECHNUNGSTATUS_PROGRESSED_BY_STGL
- )
- .forEach((row => row.select()));
+ );
+
+ tableWidgetDiv.find("#tableWidgetTabulator").tabulator('selectRow', resultRows);
}
@@ -275,13 +349,7 @@ $(function(){
e.stopImmediatePropagation();
// Get selected rows data
- let selected_data = $('#tableWidgetTabulator').tabulator('getSelectedData')
- .map(function(data){
- // reduce to necessary fields
- return {
- 'anrechnung_id' : data.anrechnung_id,
- }
- });
+ let selected_data = $('#tableWidgetTabulator').tabulator('getSelectedData');
// Alert and exit if no anrechnung is selected
if (selected_data.length == 0)
@@ -304,19 +372,70 @@ $(function(){
{
successCallback: function (data, textStatus, jqXHR)
{
- if (data.error && data.retval != null)
+ if (FHC_AjaxClient.isError(data))
{
// Print error message
- FHC_DialogLib.alertWarning(data.retval);
+ FHC_DialogLib.alertError(FHC_AjaxClient.getError(data));
}
-
- if (!data.error && data.retval != null)
+ else if (FHC_AjaxClient.hasData(data))
{
- // Update status 'genehmigt'
- $('#tableWidgetTabulator').tabulator('updateData', data.retval);
+ data = FHC_AjaxClient.getData(data);
+
+ var prestudenten = Object.keys(data.prestudenten);
+
+ // Find intersection of selected and in fact updated Anrechnungen (in case server did not approve all).
+ var updatedData = selected_data.filter(x => prestudenten.some(prestudent => x.prestudent_id == prestudent));
+
+ // Sum up over all anzurechnenden LV-ECTS by Prestudent
+ var sumLvEctsByPrestudent = approveAnrechnung.getSumLvEctsByPreStudent(updatedData);
+
+ // Loop through Prestudenten
+ // key = Prestudent, value = Approved Anrechnungen of Prestudent
+ Object.entries(data.prestudenten).forEach(([key, value]) => {
+
+ var rowsToDeselect = [];
+
+ // Get accumulated sum of all LV ECTS
+ var sumLvEcts = sumLvEctsByPrestudent.find(x => x.prestudent_id == key);
+
+ // Get ALL rows of that Prestudent
+ var rows = $('#tableWidgetTabulator').tabulator('searchRows', 'prestudent_id', '=', key);
+
+ // Loop through the rows
+ rows.forEach(row => {
+ var updateData = {};
+
+ // If Anrechnung was approved...
+ if ((value.findIndex(anrechnung_id => row.getData().anrechnung_id == anrechnung_id)) !== -1)
+ {
+ // ...update status
+ updateData.status_kurzbz = data.status_kurzbz;
+ updateData.status_bezeichnung = data.status_bezeichnung;
+
+ // ...and store row to be deselected later on
+ rowsToDeselect.push(row);
+ }
+
+ // Update 'Bisher schulische ECTS' and 'Bisher berufliche ECTS' with the Sum of new approved ECTS
+ updateData.ectsSumSchulisch = row.getData().ectsSumSchulisch + sumLvEcts.ectsSumAnzurechnendeLvsSchulisch,
+ updateData.ectsSumBeruflich = row.getData().ectsSumBeruflich + sumLvEcts.ectsSumAnzurechnendeLvsBeruflich
+
+
+ // Update row
+ row.update(updateData);
+
+ // Reformat row
+ row.reformat();
+
+ })
+
+ // Deselect rows
+ $("#tableWidgetTabulator").tabulator('deselectRow', rowsToDeselect);
+
+ })
// Print success message
- FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "anrechnungenWurdenGenehmigt"));
+ FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "anrechnungenWurdenGenehmigt"));
}
},
errorCallback: function (jqXHR, textStatus, errorThrown)
@@ -393,16 +512,21 @@ $(function(){
{
successCallback: function (data, textStatus, jqXHR)
{
- if (data.error && data.retval != null)
+ if (FHC_AjaxClient.isError(data))
{
// Print error message
- FHC_DialogLib.alertWarning(data.retval);
+ FHC_DialogLib.alertError(FHC_AjaxClient.getError(data));
}
-
- if (!data.error && data.retval != null)
+ else if (FHC_AjaxClient.hasData(data))
{
+ data = FHC_AjaxClient.getData(data);
+
// Update status 'genehmigt'
- $('#tableWidgetTabulator').tabulator('updateData', data.retval);
+ $('#tableWidgetTabulator').tabulator('updateData', data);
+
+ // Deselect rows
+ var indexesToDeselect = data.map(x => x.anrechnung_id);
+ $("#tableWidgetTabulator").tabulator('deselectRow', indexesToDeselect);
// Print success message
FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "anrechnungenWurdenAbgelehnt"));
@@ -457,20 +581,21 @@ $(function(){
{
successCallback: function (data, textStatus, jqXHR)
{
- if (data.error && data.retval != null)
+ if (FHC_AjaxClient.isError(data))
{
// Print error message
- FHC_DialogLib.alertWarning(data.retval);
+ FHC_DialogLib.alertError(FHC_AjaxClient.getError(data));
}
-
- if (!data.error && data.retval != null)
+ else if (FHC_AjaxClient.hasData(data))
{
+ data = FHC_AjaxClient.getData(data);
+
// Print info message, if not all selected recommendations were requested
- if (data.retval.length < selected_data.length){
+ if (data.length < selected_data.length){
FHC_DialogLib.alertInfo(
FHC_PhrasesLib.t(
"ui", "empfehlungWurdeAngefordertAusnahmeWoKeineLektoren",
- [selected_data.length, data.retval.length, selected_data.length - data.retval.length])
+ [selected_data.length, data.length, selected_data.length - data.length])
);
}
else
@@ -481,7 +606,11 @@ $(function(){
}
//Update status 'genehmigt'
- $('#tableWidgetTabulator').tabulator('updateData', data.retval);
+ $('#tableWidgetTabulator').tabulator('updateData', data);
+
+ // Deselect rows
+ var indexesToDeselect = data.map(x => x.anrechnung_id);
+ $("#tableWidgetTabulator").tabulator('deselectRow', indexesToDeselect);
},
errorCallback: function (jqXHR, textStatus, errorThrown)
{
@@ -595,5 +724,47 @@ var approveAnrechnung = {
break;
}
+ },
+ getSumLvEctsByPreStudent(data){
+
+ var result = [];
+
+ // Berechne für jeden Prestudenten die kumulierte Summe aller selektierten LV ECTS
+ data.reduce((prev, curr) => {
+
+ if (!prev[curr.prestudent_id])
+ {
+ prev[curr.prestudent_id] = {
+ prestudent_id: curr.prestudent_id,
+ ectsSumAnzurechnendeLvsSchulisch: 0,
+ ectsSumAnzurechnendeLvsBeruflich: 0
+ };
+
+ result.push(prev[curr.prestudent_id])
+ }
+
+ // Kumulierte Summe aller selektierten LVs, die angerechnet werden sollen, getrennt nach
+ // schulischer und beruflicher Qualifikation.
+ // Ausgenommen ist die universitäre Qualifikation (5), da diese unbegrenzt möglich sind.
+ if (curr.begruendung_id != 5)
+ {
+ if (curr.begruendung_id == 4)
+ {
+ prev[curr.prestudent_id].ectsSumAnzurechnendeLvsBeruflich += curr.ects;
+ }
+ else
+ {
+ prev[curr.prestudent_id].ectsSumAnzurechnendeLvsSchulisch += curr.ects;
+ }
+ }
+
+ return prev;
+
+ }, {});
+
+ return result;
+ },
+ showNumberSelectedRows(rows){
+ $('#number-selected').html("Ausgewählte Zeilen:
" + rows.length + "");
}
}
\ No newline at end of file
diff --git a/public/js/lehre/anrechnung/requestAnrechnung.js b/public/js/lehre/anrechnung/requestAnrechnung.js
index b664812dc..dd93394d4 100644
--- a/public/js/lehre/anrechnung/requestAnrechnung.js
+++ b/public/js/lehre/anrechnung/requestAnrechnung.js
@@ -2,9 +2,54 @@ const ANRECHNUNGSTATUS_APPROVED = 'approved';
const ANRECHNUNGSTATUS_REJECTED = 'rejected';
const HERKUNFT_DER_KENNTNISSE_MAX_LENGTH = 125;
+const COLOR_DANGER = '#f2dede';
+
$(function(){
const uploadMaxFilesize = $('#requestAnrechnung-uploadfile').data('maxsize') ; // in byte
+ let status_kurzbz = $('#requestAnrechnung-status_kurzbz').data('status_kurzbz');
+ if (status_kurzbz != ' ' && status_kurzbz != ANRECHNUNGSTATUS_APPROVED)
+ {
+ var ectsLv = parseFloat($('#ects').text());
+ var sumEctsSchulisch = parseFloat($('#sumEctsSchulisch').text());
+ var sumEctsBeruflich = parseFloat($('#sumEctsBeruflich').text());
+ var begruendung_id = $('#requestAnrechnung-form :input[name="begruendung"]:checked').val();
+
+ // If Begründung is 'Hochschulzeugnis', return. They are accepted without limit.
+ if (begruendung_id == 5)
+ {
+ exit;
+ }
+
+ // If max ECTS is ecceeded
+ if (begruendung_id == 4)
+ {
+ if ((sumEctsSchulisch + sumEctsBeruflich + ectsLv) > 90 ||
+ (sumEctsBeruflich + ectsLv) > 60
+ )
+ {
+ // Get ECTS Überschreitungs-message, depending on schulische or berufliche Qualifikation
+ var msgBeiEctsUeberschreitung = requestAnrechnung.getMsgBeiEctsUeberschreitung(begruendung_id, ectsLv, sumEctsSchulisch, sumEctsBeruflich);
+
+ // Add to Checkbox text
+ $('#requestAnrechnung-form :input[name="begruendung"]:checked').closest('label').append(msgBeiEctsUeberschreitung);
+ }
+ }
+ else
+ {
+ if ((sumEctsSchulisch + sumEctsBeruflich + ectsLv) > 90 ||
+ (sumEctsSchulisch + ectsLv) > 60
+ )
+ {
+ // Get ECTS Überschreitungs-message, depending on schulische or berufliche Qualifikation
+ var msgBeiEctsUeberschreitung = requestAnrechnung.getMsgBeiEctsUeberschreitung(begruendung_id, ectsLv, sumEctsSchulisch, sumEctsBeruflich);
+
+ // Add to Checkbox text
+ $('#requestAnrechnung-form :input[name="begruendung"]:checked').closest('label').append(msgBeiEctsUeberschreitung);
+ }
+ }
+ }
+
// Set status alert color
requestAnrechnung.setStatusAlertColor();
@@ -17,12 +62,64 @@ $(function(){
// Init tooltips
requestAnrechnung.initTooltips();
+ // // Alert message, if maximum ECTS exceeded
+ requestAnrechnung.alertIfMaxEctsExceeded();
+
// Set chars counter for textarea 'Herkunft der Kenntnisse'
requestAnrechnung.setCharsCounter();
// If Sperregrund exists: display Sperre panel, hide Status panel and disable all form elements
requestAnrechnung.displaySperreIfHasSperregrund();
+
+ $('#requestAnrechnung-form :input[name="begruendung"]').click(function(e){
+ var ectsLv = parseFloat($('#ects').text());
+ var sumEctsSchulisch = parseFloat($('#sumEctsSchulisch').text());
+ var sumEctsBeruflich = parseFloat($('#sumEctsBeruflich').text());
+ var begruendung_id = $(this).val();
+
+ if ($(this).is(':checked'))
+ {
+ $('#sumEctsMsg').remove();
+
+ // If Begründung is 'Hochschulzeugnis', return. They are accepted without limit.
+ if (begruendung_id == 5)
+ {
+ return;
+ }
+
+ // If max ECTS is ecceeded
+ if (begruendung_id == 4)
+ {
+ if ((sumEctsSchulisch + sumEctsBeruflich + ectsLv) > 90 ||
+ (sumEctsBeruflich + ectsLv) > 60
+ )
+ {
+ // Get ECTS Überschreitungs-message for berufliche Qualifikation
+ var msgBeiEctsUeberschreitung = requestAnrechnung.getMsgBeiEctsUeberschreitung(begruendung_id, ectsLv, sumEctsSchulisch, sumEctsBeruflich);
+
+ // Add to Checkbox text
+ $(this).closest('label').append(msgBeiEctsUeberschreitung);
+ }
+ return;
+ }
+ else
+ {
+ if ((sumEctsSchulisch + sumEctsBeruflich + ectsLv) > 90 ||
+ (sumEctsSchulisch + ectsLv) > 60
+ )
+ {
+ // Get ECTS Überschreitungs-message for schulische Qualifikation
+ var msgBeiEctsUeberschreitung = requestAnrechnung.getMsgBeiEctsUeberschreitung(begruendung_id, ectsLv, sumEctsSchulisch, sumEctsBeruflich);
+
+ // Add to Checkbox text
+ $(this).closest('label').append(msgBeiEctsUeberschreitung);
+ }
+ }
+
+ }
+ })
+
$('#requestAnrechnung-form').submit(function(e){
// Avoid form redirecting automatically
@@ -183,5 +280,57 @@ var requestAnrechnung = {
return true;
}
+ },
+ sumUpEcts: function(begruendung_id, ects, sumEctsSchulisch, sumEctsBeruflich){
+ if (begruendung_id == 5)
+ {
+ return;
+ }
+
+ if (begruendung_id == 4)
+ {
+ $('#sumEctsBeruflich').text(parseFloat(sumEctsBeruflich) + parseFloat(ects));
+ }
+ else
+ {
+ $('#sumEctsSchulisch').text(parseFloat(sumEctsSchulisch) + parseFloat(ects));
+ }
+
+ $('#sumEctsTotal').text(parseFloat(sumEctsSchulisch) + parseFloat(sumEctsBeruflich) + parseFloat(ects));
+
+
+ },
+ alertIfMaxEctsExceeded: function(){
+
+ if(
+ (parseFloat($('#sumEctsSchulisch').text())) > 60 ||
+ (parseFloat($('#sumEctsBeruflich').text())) > 60 ||
+ (parseFloat($('#sumEctsSchulisch').text()) + parseFloat($('#sumEctsBeruflich').text())) > 90
+ )
+ {
+ $('#requestAnrechnung-maxEctsUeberschrittenMsg')
+ .html("
Die Höchstgrenze für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz ist überschritten. ")
+ .addClass('bg-danger text-danger')
+ .tooltip({
+ title: FHC_PhrasesLib.t("anrechnung", "anrechnungEctsTooltipTextBeiUeberschreitung"),
+ placement: 'right',
+ html: true
+ });
+ }
+ },
+ getMsgBeiEctsUeberschreitung: function(begruendung_id, ects, sumEctsSchulisch, sumEctsBeruflich){
+
+ return $('
')
+ .html(FHC_PhrasesLib.t("anrechnung", "anrechnungEctsTextBeiUeberschreitung",
+ begruendung_id == 4
+ ? [(sumEctsSchulisch + sumEctsBeruflich + ects), sumEctsSchulisch, (sumEctsBeruflich + ects)] // beruflich
+ : [(sumEctsSchulisch + sumEctsBeruflich + ects), (sumEctsSchulisch + ects), sumEctsBeruflich])) // schulisch
+ .append('
')
+ .addClass('bg-danger text-danger')
+ .tooltip({
+ title: FHC_PhrasesLib.t("anrechnung", "anrechnungEctsTooltipTextBeiUeberschreitung"),
+ placement: 'right',
+ html: true
+ });
}
}
\ No newline at end of file
diff --git a/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js b/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js
index 2cf7c1623..fd7155fa0 100644
--- a/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js
+++ b/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js
@@ -65,7 +65,7 @@ function func_tableBuilt(table) {
},
target:"_blank"
}
- }, false, "status" // place column after status
+ }, true // place column on the very left
);
}
@@ -127,11 +127,12 @@ var format_empfehlung_anrechnung = function(cell, formatterParams){
* (Ignore rows that are approved, rejected or in request for recommendation)
*/
function tableWidgetHook_selectAllButton(tableWidgetDiv){
- tableWidgetDiv.find("#tableWidgetTabulator").tabulator('getRows', true)
+ var resultRows = tableWidgetDiv.find("#tableWidgetTabulator").tabulator('getRows', true)
.filter(row =>
row.getData().status_kurzbz == ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR
- )
- .forEach((row => row.select()));
+ );
+
+ tableWidgetDiv.find("#tableWidgetTabulator").tabulator('selectRow', resultRows);
}
diff --git a/public/js/lehre/lehrauftrag/acceptLehrauftrag.js b/public/js/lehre/lehrauftrag/acceptLehrauftrag.js
index a39fe3667..08a0645bc 100644
--- a/public/js/lehre/lehrauftrag/acceptLehrauftrag.js
+++ b/public/js/lehre/lehrauftrag/acceptLehrauftrag.js
@@ -274,12 +274,13 @@ function func_renderComplete(table){
* Select all (filtered) rows and ignore rows that are bestellt and erteilt
*/
function tableWidgetHook_selectAllButton(tableWidgetDiv){
- tableWidgetDiv.find("#tableWidgetTabulator").tabulator('getRows', true)
+ var resultRows = tableWidgetDiv.find("#tableWidgetTabulator").tabulator('getRows', true)
.filter(row => row.getData().bestellt != null && // bestellt
row.getData().erteilt != null && // AND erteilt
row.getData().akzeptiert == null && // AND NOT akzeptiert
- row.getData().status != 'Geändert') // AND NOT geändert
- .forEach((row => row.select()));
+ row.getData().status != 'Geändert'); // AND NOT geändert
+
+ tableWidgetDiv.find("#tableWidgetTabulator").tabulator('selectRow', resultRows);
}
// -----------------------------------------------------------------------------------------------------------------
diff --git a/public/js/lehre/lehrauftrag/approveLehrauftrag.js b/public/js/lehre/lehrauftrag/approveLehrauftrag.js
index cd8816c1e..c16016cf5 100644
--- a/public/js/lehre/lehrauftrag/approveLehrauftrag.js
+++ b/public/js/lehre/lehrauftrag/approveLehrauftrag.js
@@ -319,12 +319,13 @@ function func_rowUpdated(row){
* Select all (filtered) rows that are bestellt
*/
function tableWidgetHook_selectAllButton(tableWidgetDiv){
- tableWidgetDiv.find("#tableWidgetTabulator").tabulator('getRows', true)
+ var resultRows = tableWidgetDiv.find("#tableWidgetTabulator").tabulator('getRows', true)
.filter(row => row.getData().personalnummer >= 0 && // NOT dummies
row.getData().bestellt != null && // AND bestellt
row.getData().erteilt == null && // AND NOT erteilt
- row.getData().status != 'Geändert') // AND NOT geaendert
- .forEach((row => row.select()));
+ row.getData().status != 'Geändert'); // AND NOT geaendert
+
+ tableWidgetDiv.find("#tableWidgetTabulator").tabulator('selectRow', resultRows);
}
// -----------------------------------------------------------------------------------------------------------------
diff --git a/public/js/lehre/lehrauftrag/orderLehrauftrag.js b/public/js/lehre/lehrauftrag/orderLehrauftrag.js
index d6b165b65..06db3ce60 100644
--- a/public/js/lehre/lehrauftrag/orderLehrauftrag.js
+++ b/public/js/lehre/lehrauftrag/orderLehrauftrag.js
@@ -343,7 +343,7 @@ function func_rowUpdated(row){
* Select all (filtered) rows and ignore rows which have status bestellt
*/
function tableWidgetHook_selectAllButton(tableWidgetDiv){
- tableWidgetDiv.find("#tableWidgetTabulator").tabulator('getRows', true)
+ var resultRows = tableWidgetDiv.find("#tableWidgetTabulator").tabulator('getRows', true)
.filter(row => (
row.getData().personalnummer > 0 || // not dummies
row.getData().personalnummer == null) && // include Projektbetreuer
@@ -355,8 +355,9 @@ function tableWidgetHook_selectAllButton(tableWidgetDiv){
(row.getData().bestellt != null && // OR (bestellt
row.getData().status == 'Geändert') // AND geaendert)
)
- )
- .forEach((row => row.select()));
+ );
+
+ tableWidgetDiv.find("#tableWidgetTabulator").tabulator('selectRow', resultRows);
}
// -----------------------------------------------------------------------------------------------------------------
diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php
index 6824d350f..14193b32e 100644
--- a/system/dbupdate_3.3.php
+++ b/system/dbupdate_3.3.php
@@ -5169,6 +5169,19 @@ if ($result = @$db->db_query("SELECT 1 FROM lehre.tbl_anrechnung_begruendung WHE
}
}
+// Added Bezeichnung 'Hochschulzeugnis' to Anrechnungbegruendung
+if ($result = @$db->db_query("SELECT 1 FROM lehre.tbl_anrechnung_begruendung WHERE bezeichnung = 'Hochschulzeugnis';"))
+{
+ if ($db->db_num_rows($result) == 0)
+ {
+ $qry = "INSERT INTO lehre.tbl_anrechnung_begruendung (bezeichnung) VALUES('Hochschulzeugnis');";
+ if (!$db->db_query($qry))
+ echo '
lehre.tbl_anrechnung_begruendung '.$db->db_last_error().'';
+ else
+ echo ' lehre.tbl_anrechnung_begruendung: Added bezeichnung "Hochschulzeugnis"
';
+ }
+}
+
// Add permission to apply for Anrechnung
if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'student/anrechnung_beantragen';"))
{
@@ -6259,6 +6272,175 @@ if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berecht
}
}
+// Neue Funktion get_ects_summe_schulisch
+if(!@$db->db_query("SELECT public.get_ects_summe_schulisch('', 0, 0)"))
+{
+ $qry = 'CREATE FUNCTION public.get_ects_summe_schulisch(character varying, integer, integer) RETURNS numeric
+ LANGUAGE plpgsql
+ AS $_$
+ DECLARE var_student_uid ALIAS FOR $1;
+ DECLARE var_prestudent_id ALIAS FOR $2;
+ DECLARE var_studiengang_kz ALIAS FOR $3;
+ DECLARE var_einstiegsausbildungssemester integer;
+ DECLARE var_einstiegsstudiensemester_kurzbz varchar(32);
+ DECLARE var_einstiegsorgform_kurzbz varchar(32);
+ DECLARE rec_quereinstiegs_studiensemester RECORD;
+ DECLARE sum_quereinstiegs_ects numeric(4, 1) := 0;
+ DECLARE sum_schulische_ects numeric(4, 1) := 0;
+
+
+ BEGIN
+
+ -- IF STUDENT IS QUEREINSTEIGER, GET ECTS SUMME OF ANGERECHNETE SEMESTER
+ -- Get Einstiegssemester
+ SELECT INTO var_einstiegsausbildungssemester , var_einstiegsstudiensemester_kurzbz, var_einstiegsorgform_kurzbz ausbildungssemester, studiensemester_kurzbz, orgform_kurzbz from public.tbl_prestudentstatus
+ WHERE prestudent_id = var_prestudent_id
+ AND status_kurzbz = \'Student\'
+ ORDER BY datum, insertamum, ext_id
+ LIMIT 1;
+
+ -- If Einstiegssemester > 1 (= Quereinsteiger)
+ IF (var_einstiegsausbildungssemester > 1) THEN
+ -- ...get all Quereinstiegssemester
+ FOR rec_quereinstiegs_studiensemester IN SELECT studiensemester_kurzbz FROM public.tbl_studiensemester
+ WHERE ende <= (select start from public.tbl_studiensemester WHERE studiensemester_kurzbz = var_einstiegsstudiensemester_kurzbz )
+ ORDER BY start DESC
+ LIMIT (var_einstiegsausbildungssemester -1)
+ -- ...loop the Quereinstiegssemester
+ LOOP
+ -- ...and sum up ECTS of each Quereinstiegssemester
+ sum_quereinstiegs_ects = sum_quereinstiegs_ects + (SELECT
+ SUM(tbl_lehrveranstaltung.ects)
+ FROM
+ lehre.tbl_studienplan
+ JOIN lehre.tbl_studienplan_lehrveranstaltung USING (studienplan_id)
+ JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
+ WHERE
+ tbl_studienplan.studienplan_id = (
+ SELECT
+ studienplan_id
+ FROM
+ lehre.tbl_studienordnung
+ JOIN lehre.tbl_studienplan USING (studienordnung_id)
+ JOIN lehre.tbl_studienplan_semester USING (studienplan_id)
+ WHERE tbl_studienordnung.studiengang_kz = var_studiengang_kz
+ AND tbl_studienplan_semester.semester = var_einstiegsausbildungssemester - 1
+ AND tbl_studienplan_semester.studiensemester_kurzbz = rec_quereinstiegs_studiensemester.studiensemester_kurzbz
+ AND tbl_studienplan.orgform_kurzbz = var_einstiegsorgform_kurzbz
+
+ LIMIT 1
+ )
+ AND tbl_studienplan_lehrveranstaltung.semester = var_einstiegsausbildungssemester
+ AND studienplan_lehrveranstaltung_id_parent IS NULL -- auf Modulebene
+ AND tbl_studienplan_lehrveranstaltung.export = TRUE);
+
+ var_einstiegsausbildungssemester = var_einstiegsausbildungssemester - 1;
+ END LOOP;
+ END IF;
+
+
+ -- GET ECTS SUMME OF ALLE BISHER ANGERECHNETEN LEHRVERANSTALTUNGEN. ANRECHNUNGSGRUND: SCHULISCH.
+ SELECT INTO sum_schulische_ects COALESCE(SUM(ects), 0) FROM (
+ SELECT
+ lehrveranstaltung_id, studiensemester_kurzbz, ects
+ FROM
+ lehre.tbl_zeugnisnote
+ LEFT JOIN lehre.tbl_anrechnung USING(lehrveranstaltung_id, studiensemester_kurzbz)
+ JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
+ JOIN public.tbl_student USING(student_uid)
+ WHERE
+ tbl_zeugnisnote.note = 6
+ AND student_uid = var_student_uid
+ AND lehre.tbl_anrechnung.prestudent_id IN (tbl_student.prestudent_id, NULL)
+ AND begruendung_id != 5 -- universitäre ECTS nicht mitrechnen
+ AND begruendung_id != 4 -- berufliche ECTS nicht mitrechnen
+ AND (anrechnung_id IS NULL OR (anrechnung_id IS NOT NULL AND genehmigt_von IS NOT NULL )) -- Anrechnungen aus Zeit vor Anrechnungstool ODER digitale Anrechnungen mit Noteneintrag UND Genehmigung (wichtig, um zurückgenommene Genehmigungen, die in der Notentabelle noch als angerechnet eingetragen sind, rauszufiltern)
+
+ UNION
+
+ SELECT
+ lehrveranstaltung_id, studiensemester_kurzbz, ects
+ FROM
+ lehre.tbl_anrechnung
+ JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
+ JOIN public.tbl_student USING(prestudent_id)
+ WHERE
+ genehmigt_von IS NOT NULL
+ AND student_uid = var_student_uid
+ AND begruendung_id != 5 -- universitäre ECTS nicht mitrechnen
+ AND begruendung_id != 4 -- berufliche ECTS nicht mitrechnen
+ ) lvsangerechnet;
+
+ -- BUILD ECTS SUMME OF QUEREINSTIEGSSEMESTER- + ANGERECHNETEN LVs-ECTS
+ -- Summe aller bisher schulisch begründet angerechneten LVs + der Quereinstiegssemester
+ sum_schulische_ects = sum_schulische_ects + sum_quereinstiegs_ects;
+
+ RETURN sum_schulische_ects ;
+
+ END;
+ $_$;
+
+ ALTER FUNCTION public.get_ects_summe_schulisch(character varying, integer, integer) OWNER TO fhcomplete;';
+
+ if(!$db->db_query($qry))
+ echo '
public.get_ects_summe_schulisch(student_uid, prestudent_id, studiengang_kz): '.$db->db_last_error().'';
+ else
+ echo '
Funktion
public.get_ects_summe_schulisch(student_uid, prestudent_id, studiengang_kz) hinzugefügt';
+}
+
+// Neue Funktion get_ects_summe_beruflich
+if(!@$db->db_query("SELECT public.get_ects_summe_beruflich('')"))
+{
+ $qry = 'CREATE FUNCTION public.get_ects_summe_beruflich(character varying) RETURNS numeric
+ LANGUAGE plpgsql
+ AS $_$
+ DECLARE var_student_uid ALIAS FOR $1;
+ DECLARE sum_berufliche_ects numeric(4, 1) := 0;
+
+ BEGIN
+
+ SELECT INTO sum_berufliche_ects COALESCE(SUM(ects), 0) FROM (
+ SELECT
+ lehrveranstaltung_id, studiensemester_kurzbz, ects
+ FROM
+ lehre.tbl_zeugnisnote
+ LEFT JOIN lehre.tbl_anrechnung USING(lehrveranstaltung_id, studiensemester_kurzbz)
+ JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
+ JOIN public.tbl_student USING(student_uid)
+ WHERE
+ tbl_zeugnisnote.note = 6
+ AND student_uid = var_student_uid
+ AND lehre.tbl_anrechnung.prestudent_id IN (tbl_student.prestudent_id, NULL)
+ AND begruendung_id = 4 -- beruflich
+ AND (anrechnung_id IS NULL OR (anrechnung_id IS NOT NULL AND genehmigt_von IS NOT NULL )) -- Anrechnungen aus Zeit vor Anrechnungstool ODER digitale Anrechnungen mit Noteneintrag UND Genehmigung (wichtig, um zurückgenommene Genehmigungen, die in der Notentabelle noch als angerechnet eingetragen sind, rauszufiltern)
+
+ UNION
+
+ SELECT
+ lehrveranstaltung_id, studiensemester_kurzbz, ects
+ FROM
+ lehre.tbl_anrechnung
+ JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
+ JOIN public.tbl_student USING(prestudent_id)
+ WHERE
+ genehmigt_von is not null
+ AND student_uid = var_student_uid
+ AND begruendung_id = 4 -- beruflich
+ ) lvsangerechnet;
+
+ RETURN sum_berufliche_ects;
+
+ END;
+ $_$;
+
+ ALTER FUNCTION public.get_ects_summe_beruflich(character varying) OWNER TO fhcomplete;';
+
+ if(!$db->db_query($qry))
+ echo '
public.get_ects_summe_beruflich(student_uid): '.$db->db_last_error().'';
+ else
+ echo '
Funktion
public.get_ects_summe_beruflich(student_uid) hinzugefügt';
+}
+
// Grant SELECT to bis.tbl_gsprogramm for web-user
if($result = @$db->db_query("SELECT * FROM information_schema.role_table_grants WHERE table_name='tbl_gsprogramm' AND table_schema='bis' AND grantee='web' AND privilege_type in ('SELECT')"))
{
diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php
index ca59997fa..b1f22c473 100644
--- a/system/phrasesupdate.php
+++ b/system/phrasesupdate.php
@@ -10569,6 +10569,26 @@ Any unusual occurrences
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'anrechnung',
+ 'phrase' => 'antragStellenWegenHochschulzeugnis',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'eines Hochschulzeugnisses (vgl. § 4 Abs. 5 Satzung „Studienrechtliche Bestimmungen / Prüfungsordnung)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'a university certificate (see § 4 para. 5, Statute on Studies Act Provisions / Examination Regulations of the UASTW)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'core',
'category' => 'anrechnung',
@@ -10589,6 +10609,106 @@ Any unusual occurrences
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'anrechnung',
+ 'phrase' => 'bisherAngerechneteEcts',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Bisher angerechnete ECTS',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'All previous recognized ECTS',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'anrechnung',
+ 'phrase' => 'anrechnungEctsTooltipText',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Anzeige der Summe der bisher angerechneten ECTS. Für Quereinsteiger in ein höheres Semester werden die ECTS der angerechneten Semester berücksichtigt.
Seit Oktober 2021 gelten Höchstgrenzen für Anrechnungen:
max. 60 ECTS für schulische Zeugnisse (anrechenbar sind nur BHS- und AHS-Zeugnisse!)
max. 60 ECTS für berufliche Qualifikationen
max. 90 ECTS INSGESAMT für schulische und berufliche Qualifikationen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Sum of previous recognized ECTS. Lateral Entries are considered with ECTS of the recognized semester.
Maximum ECTS limits are applied since Octobre 2021:
max. 60 ECTS school qualification (BHS and AHS only)
max. 60 ECTS professional qualification
max. 90 ECTS OVERALL for school and professional qualification',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'anrechnung',
+ 'phrase' => 'anrechnungEctsTooltipTextBeiUeberschreitung',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Seit Oktober 2021 gelten Höchstgrenzen für Anrechnungen:
max. 60 ECTS für schulische Zeugnisse (anrechenbar sind nur BHS- und AHS-Zeugnisse!)
max. 60 ECTS für berufliche Qualifikationen
max. 90 ECTS INSGESAMT für schulische Zeugnisse und berufliche Qualifikationen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Maximum ECTS limits are applied since Octobre 2021:
max. 60 ECTS school qualification (BHS and AHS only)
max. 60 ECTS professional qualification
max. 90 ECTS OVERALL for school and professional qualification',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'anrechnung',
+ 'phrase' => 'anrechnungEctsTextBeiUeberschreitung',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => '
Die Höchstgrenze für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz wird überschritten.
Bisherige ECTS + ECTS dieser LV: Total: {0} [ Schulisch: {1} | Beruflich: {2} ] ',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => '
Exceedance of maximum limit for exemption (see § 12 para. 3, Regulations of the UASTW).
Former ECTS + ECTS of this course: Total: {0} [ School qualification: {1} | Professional qualification: {2} ] ',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'anrechnung',
+ 'phrase' => 'textUebernehmenOderEigenenBegruendungstext',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Begründungstext aus Liste übernehmen oder eigene Begründung angeben',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Copy reason from list above or write your own reason',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'core',
'category' => 'anrechnung',
@@ -11609,6 +11729,26 @@ Any unusual occurrences
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'anrechnung',
+ 'phrase' => 'genehmigungNegativEctsHoechstgrenzeUeberschritten',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Anrechnung wird nicht genehmigt aufgrund einer Überschreitung der Höchstgrenzen für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Recognition and exemption is rejected because of exceedance of maximum limit for exemption (see § 12 para. 3, Regulations of the UASTW).',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'core',
'category' => 'anrechnung',
@@ -12114,18 +12254,15 @@ Any unusual occurrences
'phrases' => array(
array(
'sprache' => 'German',
- 'text' => "
Beantragung aufgrund nachgewiesener beruflicher Praxis
- Soll die Anrechnung auf der Grundlage der beruflichen Praxis erfolgen, laden Sie bitte eine detaillierte
- Tätigkeitsbeschreibung hoch. Dies kann durch betriebliche Ausbildungsnachweise und / oder Nachweise von
- einschlägigen beruflichen Tätigkeiten mit Zeitangaben (z. B. durch ein qualifiziertes Arbeitszeugnis
- oder durch Bestätigungen des Arbeitgebers) erfolgen.",
+ 'text' => "
Beantragung aufgrund beruflicher Praxis
+ Bitte erstellen Sie eine detaillierte Tätigkeitsbeschreibung. Dafür steht im CIS ein Formular zur Verfügung, das in ein PDF-Dokument umzuwandeln und gemeinsam mit dem Lebenslauf hochzuladen ist.",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => "
Application for recognition based on professional practice
- If the exemption is to be based on professional practice, please upload a detailed job description. This can be done through proof of company training and / or proof of relevant occupational activities with time information (e.g. through a qualified job reference or through confirmation from the employer).",
+ Please supply a detailed job description. Therefore a formular is provided in CIS, that should be converted as pdf file and supplied together with your CV.",
'description' => '',
'insertvon' => 'system'
)
@@ -12263,7 +12400,7 @@ array(
Wirtschaftsinformatik
Bei Anrechnungen von beruflicher Praxis
- Bitte geben Sie Unternehmen, Position und Funktion sowie Dauer der Beschäftigung an.",
+ Bitte erstellen Sie eine detaillierte Tätigkeitsbeschreibung. Dafür steht im CIS ein Formular zur Verfügung, das in ein PDF-Dokument umzuwandeln und gemeinsam mit dem Lebenslauf hochzuladen ist.",
'description' => '',
'insertvon' => 'system'
),
@@ -12273,7 +12410,7 @@ array(
Please indicate where you acquired the knowledge: type of (university) school, location, subject area. Example school: HTL Mödling, vehicle technology; Example university: Vienna University of Technology, Bachelor of Business Informatics
If professional practice is to be recognized
- Please state company, position and function as well as length of employment.",
+ Please supply a detailed job description. Therefore a formular is provided on CIS, that should be converted as pdf file and supplied together with the CV.",
'description' => '',
'insertvon' => 'system'
)
@@ -12414,10 +12551,8 @@ array(
Zeitlicher Umfang der Lehrveranstaltung (z. B. SWS, ECTS, Unterrichtsstunden…)
-
Beantragung aufgrund nachgewiesener beruflicher Praxis
- Es wird eine detaillierte Tätigkeitsbeschreibung benötigt. Dies kann durch betriebliche Ausbildungsnachweise und / oder Nachweise von
- einschlägigen beruflichen Tätigkeiten mit Zeitangaben (z. B. durch ein qualifiziertes Arbeitszeugnis
- oder durch Bestätigungen des Arbeitgebers) erfolgen.
+
Beantragung aufgrund beruflicher Praxis
+ Es wird eine detaillierte Tätigkeitsbeschreibung benötigt. Dafür steht im CIS ein Formular zur Verfügung, das in ein PDF-Dokument umzuwandeln und gemeinsam mit dem Lebenslauf hochzuladen ist.
Falls diese Informationen nicht enthalten sind, kann der Antrag nicht geprüft werden und er wird abgelehnt.",
'description' => '',
'insertvon' => 'system'
@@ -12434,7 +12569,7 @@ array(
Application for recognition based on professional practice
- If the exemption is to be based on professional practice, an upload of a detailed job description is required. This can be done through proof of company training and / or proof of relevant occupational activities with time information (e.g. through a qualified job reference or through confirmation from the employer).
+ If the exemption is to be based on professional practice, an upload of a detailed job description is required. Therefore a formular is provided in CIS, that should be converted as pdf file and supplied together with the CV.
If this information is not included, the application can not be checked adequately and it might need to be rejected.',
'description' => '',
'insertvon' => 'system'