diff --git a/application/controllers/codex/Oehbeitrag.php b/application/controllers/codex/Oehbeitrag.php index f1e5bf508..fa27d1ebb 100644 --- a/application/controllers/codex/Oehbeitrag.php +++ b/application/controllers/codex/Oehbeitrag.php @@ -11,6 +11,7 @@ class Oehbeitrag extends Auth_Controller parent::__construct( array( 'index' => 'admin:r',// TODO which Berechtigung? + 'getOehbeitraege' => 'admin:r', 'getValidStudiensemester' => 'admin:r', 'addOehbeitrag' => 'admin:rw', 'updateOehbeitrag' => 'admin:rw', @@ -39,6 +40,9 @@ class Oehbeitrag extends Auth_Controller $this->load->view("codex/oehbeitrag.php", array('oehbeitraege' => $oehbeitraege)); } + /** + * Gets all valid, i.e. unassigned, Studiensemester. + */ public function getValidStudiensemester() { $oehbeitrag_id = $this->input->get('oehbeitrag_id'); @@ -59,6 +63,17 @@ class Oehbeitrag extends Auth_Controller $this->outputJsonSuccess($studiensemester); } + /** + * Gets all Öhbeiträge. Wrapper function for output as JSON. + */ + public function getOehbeitraege() + { + $this->outputJson($this->_loadOehbeitraege()); + } + + /** + * Adds an Öhbeitrag. Checks for errors beforehand. + */ public function addOehbeitrag() { $studierendenbeitrag = $this->input->post('studierendenbeitrag'); @@ -92,6 +107,9 @@ class Oehbeitrag extends Auth_Controller } } + /** + * Updates an Öhbeitrag. Checks for errors beforehand. + */ public function updateOehbeitrag() { $oehbeitrag_id = $this->input->post("oehbeitrag_id"); @@ -126,10 +144,14 @@ class Oehbeitrag extends Auth_Controller $vonBisStudiensemester = getData($vonBisStudiensemesterRes); - $von_studiensemester_kurzbz = $idx == 'von_studiensemester_kurzbz' ? $value : $vonBisStudiensemester[0]->von_studiensemester_kurzbz; + $von_studiensemester_kurzbz = isset($data['von_studiensemester_kurzbz']) + ? $data['von_studiensemester_kurzbz'] + : $vonBisStudiensemester[0]->von_studiensemester_kurzbz; - if ($idx == 'bis_studiensemester_kurzbz') - $bis_studiensemester_kurzbz = $data[$idx] = $value == 'null' ? null : $value; + if (isset($data['bis_studiensemester_kurzbz'])) + { + $bis_studiensemester_kurzbz = $data['bis_studiensemester_kurzbz'] = $data['bis_studiensemester_kurzbz'] == 'null' ? null : $data['bis_studiensemester_kurzbz']; + } else $bis_studiensemester_kurzbz = $vonBisStudiensemester[0]->bis_studiensemester_kurzbz; @@ -146,6 +168,9 @@ class Oehbeitrag extends Auth_Controller $this->outputJson($this->OehbeitragModel->update($oehbeitrag_id, $data)); } + /** + * Deletes an Öhbeitrag. + */ public function deleteOehbeitrag() { $oehbeitrag_id = $this->input->post("oehbeitrag_id"); @@ -153,6 +178,10 @@ class Oehbeitrag extends Auth_Controller $this->outputJson($this->OehbeitragModel->delete($oehbeitrag_id)); } + /** + * Loads all Öhbeiträge sorted by date descending. + * @return object + */ private function _loadOehbeitraege() { $this->OehbeitragModel->addSelect('oehbeitrag_id, von_studiensemester_kurzbz, bis_studiensemester_kurzbz, studierendenbeitrag, versicherung, sem_von.start as von_datum, sem_bis.ende as bis_datum'); @@ -162,11 +191,25 @@ class Oehbeitrag extends Auth_Controller return $this->OehbeitragModel->load(); } + /** + * Checks if an amount is numeric and not too big. + * @param $amount + * @return bool true if valid amount, false otherwise + */ private function _checkAmount($amount) { return is_numeric($amount) && (float) $amount <= 99999.99; } + /** + * Checks if a certain Von-Studiensemester is valid together with a Bis-Studiensemester. + * Checks for correct format, Von-Studiensemester cannot be after the Bis-Studiensemester, + * checks that semester are not overlapping with semester for existent Öhbeiträge. + * @param string $von_studiensemester_kurzbz + * @param string $bis_studiensemester_kurzbz + * @param int $oehbeitrag_id öhbeitrag to ignore, i.e. which is assignable (id of Öhbeitrag of the passed semesters) + * @return object array with true if assignable, with false if not + */ private function _checkVonBisStudiensemester($von_studiensemester_kurzbz, $bis_studiensemester_kurzbz, $oehbeitrag_id = null) { $regex = "/^(WS|SS)\d{4}$/"; diff --git a/application/views/codex/oehbeitrag.php b/application/views/codex/oehbeitrag.php index 675a06c95..7cfb18fe8 100644 --- a/application/views/codex/oehbeitrag.php +++ b/application/views/codex/oehbeitrag.php @@ -48,23 +48,6 @@ $this->load->view( - - - von_datum), 'd.m.Y') . '/' . $oehbeitrag->von_studiensemester_kurzbz ?> - - - bis_studiensemester_kurzbz == null ? 'unbeschränkt' : (date_format(date_create($oehbeitrag->bis_datum), 'd.m.Y') . '/' . $oehbeitrag->bis_studiensemester_kurzbz) ?> - - - studierendenbeitrag, 2, ',', '.') ?> - - - versicherung, 2, ',', '.') ?> - - - - - diff --git a/public/js/codex/oehbeitrag.js b/public/js/codex/oehbeitrag.js index f8fc403f0..77a98a27b 100644 --- a/public/js/codex/oehbeitrag.js +++ b/public/js/codex/oehbeitrag.js @@ -7,10 +7,10 @@ const CONTROLLER_URL = BASE_URL + "/"+CALLED_PATH; */ $(document).ready(function () { - //initialise table sorter - Oehbeitrag._addTablesorter(); + // get Öhbeiträge and show them in table + Oehbeitrag.getOehBeitraege(); - // set trigger for adding new Oehhbeitrag + // set event for adding new Oehhbeitrag $("#addNewOeh").click( function() { @@ -21,6 +21,7 @@ $(document).ready(function () let studiensemester = FHC_AjaxClient.getData(data); let nextOehbeitragId = Oehbeitrag.newBeitragId; + // add new table row let newRowHtml = ""+ ""; newRowHtml += Oehbeitrag._getStudiensemesterDropdown(Oehbeitrag.newBeitragId, 'von_studiensemester_kurzbz', studiensemester); @@ -33,7 +34,6 @@ $(document).ready(function () " "+ ""; -/* $("#saveHeading, .saveCell").show();*/ $("#oehbeitraegeTbl tbody").prepend(newRowHtml); $("#addOeh_"+Oehbeitrag.newBeitragId).click( function() @@ -55,6 +55,7 @@ $(document).ready(function () } ); + // remove html row if delete button clicked $("#delete_"+nextOehbeitragId).click( function() { @@ -62,7 +63,7 @@ $(document).ready(function () } ); - // increase counter for newly added rows + // increase counter for newly added rows id Oehbeitrag.newBeitragId++; } else @@ -72,26 +73,72 @@ $(document).ready(function () Oehbeitrag.getValidStudiensemester(callback); } ) - - // set trigger for deleting Oehhbeitrag - $(".deleteBtn").click( - function() - { - let oehbeitrag_id_prefixed = $(this).prop("id"); - let oehbeitrag_id = oehbeitrag_id_prefixed.substr(oehbeitrag_id_prefixed.lastIndexOf('_')+1); - - Oehbeitrag.deleteOehbeitrag(oehbeitrag_id); - } - ); - - // set trigger for updating Oehhbeitrag - Oehbeitrag._setUpdateEvents(); }); var Oehbeitrag = { newBeitragId: 0, // ----------------------------------------------------------------------------------------------------------------- // ajax calls + getOehBeitraege: function() + { + FHC_AjaxClient.ajaxCallGet( + CALLED_PATH + "/getOehbeitraege", + null, + { + successCallback: function(data, textStatus, jqXHR) + { + if (FHC_AjaxClient.isError(data)) + { + FHC_DialogLib.alertError(FHC_AjaxClient.getError(data)); + } + else if (FHC_AjaxClient.hasData(data)) + { + let oehbeitraege = FHC_AjaxClient.getData(data); + + let oehbeitrStr = ''; + for (let idx in oehbeitraege) + { + let oehbeitrag = oehbeitraege[idx]; + + // add Öhbeitrag row + oehbeitrStr += '' + + '' + + Oehbeitrag._formatDateToGerman(oehbeitrag.von_datum) + '/' + oehbeitrag.von_studiensemester_kurzbz + + ' '+ + '' + + '' + (oehbeitrag.bis_studiensemester_kurzbz == null ? 'unbeschränkt' : + Oehbeitrag._formatDateToGerman(oehbeitrag.bis_datum) + '/' + oehbeitrag.bis_studiensemester_kurzbz) + + ' '+ + '' + + '' + Oehbeitrag._formatDecimal(oehbeitrag.studierendenbeitrag) + + ' '+ + '' + + '' + Oehbeitrag._formatDecimal(oehbeitrag.versicherung) + + ' '+ + '' + + '' + + '' + + ' ' + + '' + + ''; + } + $("#oehbeitraegeTbl tbody").html(oehbeitrStr); + + // set events for editing, deleting etc. + Oehbeitrag._setUpdateEvents(); + + //initialise table sorter + Oehbeitrag._addTablesorter(); + } + }, + errorCallback: function() + { + FHC_DialogLib.alertError('Fehler beim Holen der Öhbeiträge'); + } + } + ); + }, + // get all Studiensemester which are valid for assignment (where no Öhbeitrag is assigned) getValidStudiensemester: function(callback, oehbeitrag_id) { let params = oehbeitrag_id ? {"oehbeitrag_id": oehbeitrag_id} : null; @@ -121,42 +168,8 @@ var Oehbeitrag = { } else if (FHC_AjaxClient.hasData(data)) { - let inserted_id = FHC_AjaxClient.getData(data); - - // refresh table row in GUI - let bis_studiensemester_kurzbz = oehbeitrag.bis_studiensemester_kurzbz == 'null' ? 'unbeschränkt' : studiensemester_von_bis.bis_semester_with_date; - - $("#input_studierendenbeitrag_"+nextOehbeitragId).parent('td').html( - Oehbeitrag._formatDecimal(oehbeitrag.studierendenbeitrag)+" " - ); - $("#input_versicherung_"+nextOehbeitragId).parent('td').html( - Oehbeitrag._formatDecimal(oehbeitrag.versicherung)+" " - ); - $("#input_von_studiensemester_kurzbz_"+nextOehbeitragId).parent('td').html( - studiensemester_von_bis.von_semester_with_date+" " - ); - $("#input_bis_studiensemester_kurzbz_"+nextOehbeitragId).parent('td').html( - bis_studiensemester_kurzbz+" " - ); - - // add delete button instead of save btn - $("#addOeh_"+nextOehbeitragId).parent('td').html(""); - - // add update and delete events - Oehbeitrag._setUpdateEvents(); - - $("#delete_"+inserted_id).click( - function() - { - let oehbeitrag_id_prefixed = $(this).prop("id"); - let oehbeitrag_id = oehbeitrag_id_prefixed.substr(oehbeitrag_id_prefixed.indexOf('_')+1); - - Oehbeitrag.deleteOehbeitrag(oehbeitrag_id); - } - ) - - // refresh tablesorter - Oehbeitrag._addTablesorter(); + // refresh Öhbeitragstable + Oehbeitrag.getOehBeitraege(); } else { @@ -170,7 +183,40 @@ var Oehbeitrag = { } ); }, - updateOehbeitrag(oehbeitrag_id, fieldname, fieldelement, inputtype) + // update whole Öhbeitrag + updateOehbeitrag: function(oehbeitrag_id, oehbeitragData) + { + FHC_AjaxClient.ajaxCallPost( + CALLED_PATH + '/updateOehbeitrag', + { + "oehbeitrag_id": oehbeitrag_id, + "data": oehbeitragData + }, + { + successCallback: function(data, textStatus, jqXHR) { + if (FHC_AjaxClient.isError(data)) + { + FHC_DialogLib.alertError(FHC_AjaxClient.getError(data)); + } + else if (FHC_AjaxClient.hasData(data)) + { + // refresh Öhbeitragstable + Oehbeitrag.getOehBeitraege(); + } + else + { + FHC_DialogLib.alertError('Fehler beim Aktualisieren des Öhbeitrags'); + } + }, + errorCallback: function() + { + FHC_DialogLib.alertError('Fehler beim Aktualisieren des Öhbeitrags'); + } + } + ); + }, + // update one field of Öhbeitrag (e.g. only semester or only Betrag) + updateOehbeitragField: function(oehbeitrag_id, fieldname, fieldelement, inputtype) { let oehbeitragdata = {}; let fieldvalue = fieldelement.val(); @@ -194,6 +240,7 @@ var Oehbeitrag = { } else if (FHC_AjaxClient.hasData(data)) { + // refresh table cell with correct value and set edit event and tablesorter if (inputtype == 'semester') fieldvalue = $(fieldelement).find("option:selected").text(); else @@ -204,7 +251,7 @@ var Oehbeitrag = { $("#edit_"+fieldname+"_"+oehbeitrag_id).click( function() { - Oehbeitrag._setUpdateEvent($(this).prop("id"), fieldname, inputtype); + Oehbeitrag._makeFieldEditable($(this).prop("id"), fieldname, inputtype, true); } ); @@ -212,12 +259,12 @@ var Oehbeitrag = { } else { - FHC_DialogLib.alertError('Fehler beim Hinzufügen des Öhbeitrags'); + FHC_DialogLib.alertError('Fehler beim Aktualisieren des Öhbeitrags'); } }, errorCallback: function() { - FHC_DialogLib.alertError('Fehler beim Hinzufügen des Öhbeitrags'); + FHC_DialogLib.alertError('Fehler beim Aktualisieren des Öhbeitrags'); } } ); @@ -248,43 +295,92 @@ var Oehbeitrag = { }, // ----------------------------------------------------------------------------------------------------------------- - // (private) methods - _setUpdateEvents() + /** + * Sets click events for updating, deleting Oehbeitrag + */ + _setUpdateEvents: function() { + // set edit event for whole row + $(".editBtn").click( + function() + { + let id = $(this).prop("id"); + let oehbeitrag_id = id.substr(id.lastIndexOf('_')+1); + Oehbeitrag._makeFieldEditable(id, 'von_studiensemester_kurzbz', 'semester'); + Oehbeitrag._makeFieldEditable(id, 'bis_studiensemester_kurzbz', 'semester'); + Oehbeitrag._makeFieldEditable(id, 'studierendenbeitrag'); + Oehbeitrag._makeFieldEditable(id, 'versicherung'); + $(this).after(" "); + $(this).remove(); + $("#delete_" + oehbeitrag_id).remove(); + + $("#save_"+oehbeitrag_id).click( + function() + { + let von_studiensemester_kurzbz = $("#input_von_studiensemester_kurzbz_"+oehbeitrag_id+" option:selected").val(); + let bis_studiensemester_kurzbz = $("#input_bis_studiensemester_kurzbz_"+oehbeitrag_id+" option:selected").val(); + let studierendenbeitrag = Oehbeitrag._formatDecimal($("#input_studierendenbeitrag_"+oehbeitrag_id).val(), '.'); + let versicherung = Oehbeitrag._formatDecimal($("#input_versicherung_"+oehbeitrag_id).val(), '.'); + + let oehbeitragData = { + "von_studiensemester_kurzbz": von_studiensemester_kurzbz, + "bis_studiensemester_kurzbz": bis_studiensemester_kurzbz, + "studierendenbeitrag": studierendenbeitrag, + "versicherung": versicherung + } + + Oehbeitrag.updateOehbeitrag(oehbeitrag_id, oehbeitragData); + } + ) + } + ); + + // set delete event for all rows + $(".deleteBtn").click( + function() + { + let oehbeitrag_id_prefixed = $(this).prop("id"); + let oehbeitrag_id = oehbeitrag_id_prefixed.substr(oehbeitrag_id_prefixed.lastIndexOf('_')+1); + + Oehbeitrag.deleteOehbeitrag(oehbeitrag_id); + } + ) + + // set edit events for single cells $(".editStudierendenbeitrag").off('click').click( function() { - Oehbeitrag._setUpdateEvent($(this).prop("id"), 'studierendenbeitrag'); + Oehbeitrag._makeFieldEditable($(this).prop("id"), 'studierendenbeitrag', null, true); } ); $(".editVersicherung").off('click').click( function() { - Oehbeitrag._setUpdateEvent($(this).prop("id"), 'versicherung'); + Oehbeitrag._makeFieldEditable($(this).prop("id"), 'versicherung', null, true); } ); $(".editBisStudiensemester").off('click').click( function() { - Oehbeitrag._setUpdateEvent($(this).prop("id"), 'bis_studiensemester_kurzbz', 'semester'); + Oehbeitrag._makeFieldEditable($(this).prop("id"), 'bis_studiensemester_kurzbz', 'semester', true); } ); $(".editVonStudiensemester").off('click').click( function() { - Oehbeitrag._setUpdateEvent($(this).prop("id"), 'von_studiensemester_kurzbz', 'semester'); + Oehbeitrag._makeFieldEditable($(this).prop("id"), 'von_studiensemester_kurzbz', 'semester', true); } ); - }, - _setUpdateEvent(oehbeitrag_id_prefixed, fieldname, inputtype) + // make Öhbeitrag field editable, i.e. show input field instead of text + _makeFieldEditable: function(oehbeitrag_id_prefixed, fieldname, inputtype, singleUpdate) { - let initElement = $("#"+oehbeitrag_id_prefixed); // clicked element triggering event let oehbeitrag_id = oehbeitrag_id_prefixed.substr(oehbeitrag_id_prefixed.lastIndexOf('_')+1); - let currFieldvalue = initElement.parent('td').text().trim(); + let initElement = $("#cell_"+fieldname+"_"+oehbeitrag_id); // clicked element triggering event + let currFieldvalue = initElement.text().trim(); let callback = function(validSemesterData) { @@ -306,19 +402,24 @@ var Oehbeitrag = { " value='"+currFieldvalue+"' placeholder='0,00'>"; } - inputHtml += " "; + if (singleUpdate === true) + inputHtml += " "; - initElement.parent('td').html(inputHtml); + initElement.html(inputHtml); - // set the update event - $("#confirm_"+fieldname+"_"+oehbeitrag_id).click( - function() - { - Oehbeitrag.updateOehbeitrag(oehbeitrag_id, fieldname, $("#input_" + fieldname + "_" + oehbeitrag_id), inputtype); - } - ); + if (singleUpdate === true) + { + // set the update event if single field update + $("#confirm_" + fieldname + "_" + oehbeitrag_id).click( + function() + { + Oehbeitrag.updateOehbeitragField(oehbeitrag_id, fieldname, $("#input_" + fieldname + "_" + oehbeitrag_id), inputtype); + } + ); + } } + // get valid Studiensemester with no Öhbeitrag assigned if (inputtype == 'semester') { Oehbeitrag.getValidStudiensemester(callback, oehbeitrag_id); @@ -379,12 +480,7 @@ var Oehbeitrag = { Tablesort.addTablesorter("oehbeitraegeTbl", [[0,1]], ["zebra"], 8, headers); }, - /** - * Formats a numeric value as a float with two decimals - * @param value - * @param decSeparator the new decimal separator - * @returns {string} formatted value - */ + // Formats a numeric value as a float with two decimals _formatDecimal: function(value, decSeparator) { let dec = null; @@ -408,6 +504,7 @@ var Oehbeitrag = { return dec; }, + // formats english date to as german _formatDateToGerman: function(date) { return date.substring(8, 10) + "." + date.substring(5, 7) + "." + date.substring(0, 4);