diff --git a/application/config/navigation.php b/application/config/navigation.php index 84004b58e..31cf9a0b0 100644 --- a/application/config/navigation.php +++ b/application/config/navigation.php @@ -23,6 +23,14 @@ $config['navigation_header'] = array( 'expand' => true, 'sort' => 10, 'requiredPermissions' => 'basis/vilesci:r' + ), + 'oehbeitragsverwaltung' => array( + 'link' => site_url('codex/Oehbeitrag'), + 'icon' => '', + 'description' => 'Öhbeitragsverwaltung', + 'expand' => true, + 'sort' => 20, + 'requiredPermissions' => 'admin:w' ) ) ), diff --git a/application/controllers/codex/Oehbeitrag.php b/application/controllers/codex/Oehbeitrag.php new file mode 100644 index 000000000..f1e5bf508 --- /dev/null +++ b/application/controllers/codex/Oehbeitrag.php @@ -0,0 +1,218 @@ + 'admin:r',// TODO which Berechtigung? + 'getValidStudiensemester' => 'admin:r', + 'addOehbeitrag' => 'admin:rw', + 'updateOehbeitrag' => 'admin:rw', + 'deleteOehbeitrag' => 'admin:rw' + ) + ); + + $this->load->model('codex/Oehbeitrag_model', 'OehbeitragModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + $this->load->library('WidgetLib'); + } + + public function index() + { + $oehbeitraege = array(); + + $oehbeitragRes = $this->_loadOehbeitraege(); + + if (isError($oehbeitragRes)) + show_error(getError($oehbeitragRes)); + + if (hasData($oehbeitragRes)) + $oehbeitraege = getData($oehbeitragRes); + + $this->load->view("codex/oehbeitrag.php", array('oehbeitraege' => $oehbeitraege)); + } + + public function getValidStudiensemester() + { + $oehbeitrag_id = $this->input->get('oehbeitrag_id'); + $oehbeitrag_id_arr = isset($oehbeitrag_id) ? array($oehbeitrag_id) : null; + + $studiensemester = array(); + + $studiensemesterres = $this->OehbeitragModel->getUnassignedStudiensemester(self::STUDIENSEMESTER_START, $oehbeitrag_id_arr); + if (isError($studiensemesterres)) + { + $this->outputJsonError(getError($studiensemesterres)); + return; + } + + if (hasData($studiensemesterres)) + $studiensemester = getData($studiensemesterres); + + $this->outputJsonSuccess($studiensemester); + } + + public function addOehbeitrag() + { + $studierendenbeitrag = $this->input->post('studierendenbeitrag'); + $versicherung = $this->input->post('versicherung'); + $von_studiensemester_kurzbz = $this->input->post('von_studiensemester_kurzbz'); + $bis_studiensemester_kurzbz = $this->input->post('bis_studiensemester_kurzbz'); + if ($bis_studiensemester_kurzbz == 'null') + $bis_studiensemester_kurzbz = null; + + if (!$this->_checkAmount($studierendenbeitrag)) + $this->outputJsonError('Ungültiger Studierendenbeitrag'); + elseif (!$this->_checkAmount($versicherung)) + $this->outputJsonError('Ungültige Versicherung'); + else + { + $vonBisCheck = $this->_checkVonBisStudiensemester($von_studiensemester_kurzbz, $bis_studiensemester_kurzbz); + + if (isError($vonBisCheck)) + $this->outputJsonError(getError($vonBisCheck)); + else + { + $data = array( + 'studierendenbeitrag' => $studierendenbeitrag, + 'versicherung' => $versicherung, + 'von_studiensemester_kurzbz' => $von_studiensemester_kurzbz, + 'bis_studiensemester_kurzbz' => $bis_studiensemester_kurzbz + ); + + $this->outputJson($this->OehbeitragModel->insert($data)); + } + } + } + + public function updateOehbeitrag() + { + $oehbeitrag_id = $this->input->post("oehbeitrag_id"); + $data = $this->input->post("data"); + + if (!is_numeric($oehbeitrag_id) || isEmptyArray($data)) + { + $this->outputJsonError("Ungültige Parameter"); + return; + } + + foreach ($data as $idx => $value) + { + if ($idx == 'studierendenbeitrag' || $idx == 'versicherung') + { + if (!$this->_checkAmount($value)) + { + $this->outputJsonError("Ungültige(r) $idx"); + return; + } + } + elseif ($idx == 'von_studiensemester_kurzbz' || $idx == 'bis_studiensemester_kurzbz') + { + $this->OehbeitragModel->addSelect('von_studiensemester_kurzbz, bis_studiensemester_kurzbz'); + $vonBisStudiensemesterRes = $this->OehbeitragModel->load($oehbeitrag_id); + + if (!hasData($vonBisStudiensemesterRes)) + { + $this->outputJsonError("Fehler beim Holen des Öhbeitrags"); + return; + } + + $vonBisStudiensemester = getData($vonBisStudiensemesterRes); + + $von_studiensemester_kurzbz = $idx == 'von_studiensemester_kurzbz' ? $value : $vonBisStudiensemester[0]->von_studiensemester_kurzbz; + + if ($idx == 'bis_studiensemester_kurzbz') + $bis_studiensemester_kurzbz = $data[$idx] = $value == 'null' ? null : $value; + else + $bis_studiensemester_kurzbz = $vonBisStudiensemester[0]->bis_studiensemester_kurzbz; + + $checkStudiensemester = $this->_checkVonBisStudiensemester($von_studiensemester_kurzbz, $bis_studiensemester_kurzbz, $oehbeitrag_id); + + if (isError($checkStudiensemester)) + { + $this->outputJsonError(getError($checkStudiensemester)); + return; + } + } + } + + $this->outputJson($this->OehbeitragModel->update($oehbeitrag_id, $data)); + } + + public function deleteOehbeitrag() + { + $oehbeitrag_id = $this->input->post("oehbeitrag_id"); + + $this->outputJson($this->OehbeitragModel->delete($oehbeitrag_id)); + } + + 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'); + $this->OehbeitragModel->addJoin('public.tbl_studiensemester sem_von', 'tbl_oehbeitrag.von_studiensemester_kurzbz = sem_von.studiensemester_kurzbz'); + $this->OehbeitragModel->addJoin('public.tbl_studiensemester sem_bis', 'tbl_oehbeitrag.bis_studiensemester_kurzbz = sem_bis.studiensemester_kurzbz', 'LEFT'); + $this->OehbeitragModel->addOrder('sem_von.start', 'DESC'); + return $this->OehbeitragModel->load(); + } + + private function _checkAmount($amount) + { + return is_numeric($amount) && (float) $amount <= 99999.99; + } + + private function _checkVonBisStudiensemester($von_studiensemester_kurzbz, $bis_studiensemester_kurzbz, $oehbeitrag_id = null) + { + $regex = "/^(WS|SS)\d{4}$/"; + if (!preg_match($regex, $von_studiensemester_kurzbz)) + return error("Ungültiges Von-Studiensemester"); + + if (!preg_match($regex, $bis_studiensemester_kurzbz) && $bis_studiensemester_kurzbz != null) + return error("Ungültiges Bis-Studiensemester"); + + $this->StudiensemesterModel->addSelect("start"); + $vonStudiensemesterRes = $this->StudiensemesterModel->load($von_studiensemester_kurzbz); + + if (!hasData($vonStudiensemesterRes)) + return error("Fehler beim Holen von Von-Studiensemester"); + + $this->StudiensemesterModel->addSelect("start"); + $bisStudiensemesterRes = $this->StudiensemesterModel->load($bis_studiensemester_kurzbz); + + if (!hasData($bisStudiensemesterRes)) + return error("Fehler beim Holen von Bis-Studiensemester"); + + $vonStudiensemester = getData($vonStudiensemesterRes)[0]->start; + $bisStudiensemester = getData($bisStudiensemesterRes)[0]->start; + + if ($bis_studiensemester_kurzbz != null && new DateTime($vonStudiensemester) > new DateTime($bisStudiensemester)) + return error("Von-Studiensemester größer als Bis-Studiensemester"); + + $oehbeitrag_id_arr = isset($oehbeitrag_id) ? array($oehbeitrag_id) : null; + + $assignableRes = $this->OehbeitragModel->checkIfStudiensemesterAssignable( + $von_studiensemester_kurzbz, + $bis_studiensemester_kurzbz, + $oehbeitrag_id_arr + ); + + if (isError($assignableRes)) + return $assignableRes; + + if (hasData($assignableRes)) + { + $assignable = getData($assignableRes)[0]; + + if (!$assignable) + return error("Keine Zuweisung möglich, Semesterüberschneidung"); + } + + return success("Studiensemester gültig"); + } +} diff --git a/application/models/codex/Oehbeitrag_model.php b/application/models/codex/Oehbeitrag_model.php index d12dbf23f..0df016ba8 100644 --- a/application/models/codex/Oehbeitrag_model.php +++ b/application/models/codex/Oehbeitrag_model.php @@ -32,4 +32,76 @@ class Oehbeitrag_model extends DB_Model return $this->execQuery($qry, array($studiensemester_kurzbz)); } + + /** + * Gets all Studiensemester for which no Oehbeitrag value assignment exists. + * @param string $start_studiensemester_kurzbz semester before the given semester are ignored + * @param array $excluded_oehbeitrag_id oehbeitraege to be ignored, i.e. which are assigned + * @return object + */ + public function getUnassignedStudiensemester($start_studiensemester_kurzbz, $excluded_oehbeitrag_id = array()) + { + $params = array($start_studiensemester_kurzbz); + + $qry = "SELECT * FROM public.tbl_studiensemester sem + WHERE sem.start >= (SELECT start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz = ?) + AND NOT EXISTS (SELECT 1 FROM bis.tbl_oehbeitrag oeh + JOIN public.tbl_studiensemester oeh_von ON oeh.von_studiensemester_kurzbz = oeh_von.studiensemester_kurzbz + LEFT JOIN public.tbl_studiensemester oeh_bis ON oeh.bis_studiensemester_kurzbz = oeh_bis.studiensemester_kurzbz + WHERE sem.start::date >= oeh_von.start::date AND (sem.start::date <= oeh_bis.start::date OR oeh_bis.studiensemester_kurzbz IS NULL)"; + + if (!isEmptyArray($excluded_oehbeitrag_id)) + { + $qry .= " AND oehbeitrag_id NOT IN ?"; + $params[] = $excluded_oehbeitrag_id; + } + + $qry .= ") ORDER BY sem.start"; + + return $this->execQuery($qry, $params); + } + + /** + * Checks if a Öhbeitrag can be assigned for a Studiensemester range. + * @param string $von_studiensemester_kurzbz + * @param string $bis_studiensemester_kurzbz + * @param array $excluded_oehbeitrag_id oehbeitraege to ignore, i.e. which are assignable + * @return object array with true if assignable, with false if not + */ + public function checkIfStudiensemesterAssignable($von_studiensemester_kurzbz, $bis_studiensemester_kurzbz = null, $excluded_oehbeitrag_id = array()) + { + $params = array($von_studiensemester_kurzbz); + + $allStdSemSpanQry = "SELECT count(studiensemester_kurzbz) as number_assigned FROM public.tbl_studiensemester sem + WHERE start >= (SELECT start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz = ?)"; + + if ($bis_studiensemester_kurzbz != null) + { + $allStdSemSpanQry .= " AND (start <= (SELECT start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz = ?))"; + $params[] = $bis_studiensemester_kurzbz; + } + + $allStdSemSpanQry .= " AND EXISTS (SELECT 1 FROM bis.tbl_oehbeitrag + JOIN public.tbl_studiensemester sem_von ON tbl_oehbeitrag.von_studiensemester_kurzbz = sem_von.studiensemester_kurzbz + LEFT JOIN public.tbl_studiensemester sem_bis ON tbl_oehbeitrag.bis_studiensemester_kurzbz = sem_bis.studiensemester_kurzbz + WHERE sem.start >= sem_von.start AND (sem.start <= sem_bis.start OR sem_bis.studiensemester_kurzbz IS NULL)"; + + if (!isEmptyArray($excluded_oehbeitrag_id)) + { + $allStdSemSpanQry .= " AND oehbeitrag_id NOT IN ?"; + $params[] = $excluded_oehbeitrag_id; + } + + $allStdSemSpanQry .= ")"; + + $nrAssigned = $this->execQuery($allStdSemSpanQry, $params); + + if (isError($nrAssigned)) + return $nrAssigned; + + if (!hasData($nrAssigned)) + return error("Fehler bei Überprüfung der Möglichkeit der Semesterzuweisung"); + + return success(array(getData($nrAssigned)[0]->number_assigned == 0)); + } } diff --git a/application/views/codex/oehbeitrag.php b/application/views/codex/oehbeitrag.php new file mode 100644 index 000000000..675a06c95 --- /dev/null +++ b/application/views/codex/oehbeitrag.php @@ -0,0 +1,77 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => 'ÖH-Beitragsverwaltung', + 'jquery' => true, + 'jqueryui' => true, + 'bootstrap' => true, + 'fontawesome' => true, + 'sbadmintemplate' => true, + 'tablesorter' => true, + 'dialoglib' => true, + 'ajaxlib' => true, + 'navigationwidget' => true, + 'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css', 'public/css/codex/oehbeitrag.css'), + 'customJSs' => array('public/js/tablesort/tablesort.js', 'public/js/codex/oehbeitrag.js') + ) +); +?> + + +
+ + widgetlib->widget('NavigationWidget'); ?> + +
+
+
+
+ +
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
Gültig vonGültig bisStudierendenbetragVersicherungsbetragAktion
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, ',', '.') ?> + +
+
+
+
+
+
+ + +load->view('templates/FHC-Footer'); ?> diff --git a/public/css/codex/oehbeitrag.css b/public/css/codex/oehbeitrag.css new file mode 100644 index 000000000..103c5d367 --- /dev/null +++ b/public/css/codex/oehbeitrag.css @@ -0,0 +1,14 @@ +.inline-inputfield { + width: auto; + display: inline; +} + +.fa-edit { + cursor: pointer; + font-size: 1.2em; +} + +.fa-check { + cursor: pointer; + font-size: 1.4em; +} diff --git a/public/js/codex/oehbeitrag.js b/public/js/codex/oehbeitrag.js new file mode 100644 index 000000000..f8fc403f0 --- /dev/null +++ b/public/js/codex/oehbeitrag.js @@ -0,0 +1,415 @@ +const BASE_URL = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router; +const CALLED_PATH = FHC_JS_DATA_STORAGE_OBJECT.called_path; +const CONTROLLER_URL = BASE_URL + "/"+CALLED_PATH; + +/** + * javascript file for Öhbeitrag GUI + */ +$(document).ready(function () +{ + //initialise table sorter + Oehbeitrag._addTablesorter(); + + // set trigger for adding new Oehhbeitrag + $("#addNewOeh").click( + function() + { + let callback = function(data) + { + if (FHC_AjaxClient.hasData(data)) + { + let studiensemester = FHC_AjaxClient.getData(data); + let nextOehbeitragId = Oehbeitrag.newBeitragId; + + let newRowHtml = ""+ + ""; + newRowHtml += Oehbeitrag._getStudiensemesterDropdown(Oehbeitrag.newBeitragId, 'von_studiensemester_kurzbz', studiensemester); + newRowHtml += ""; + newRowHtml += Oehbeitrag._getStudiensemesterDropdown(Oehbeitrag.newBeitragId, 'bis_studiensemester_kurzbz', studiensemester); + newRowHtml += ""; + newRowHtml += ""+ + ""+ + " " + + " "+ + ""; + +/* $("#saveHeading, .saveCell").show();*/ + $("#oehbeitraegeTbl tbody").prepend(newRowHtml); + $("#addOeh_"+Oehbeitrag.newBeitragId).click( + function() + { + // get form data into object + let oehbeitrag = { + "von_studiensemester_kurzbz": $("#input_von_studiensemester_kurzbz_"+nextOehbeitragId).val(), + "bis_studiensemester_kurzbz": $("#input_bis_studiensemester_kurzbz_"+nextOehbeitragId).val(), + "studierendenbeitrag": $("#input_studierendenbeitrag_"+nextOehbeitragId).val().replace(",", "."), + "versicherung": $("#input_versicherung_"+nextOehbeitragId).val().replace(",", ".") + } + + let studiensemester_von_bis = { + "von_semester_with_date": $("#input_von_studiensemester_kurzbz_"+nextOehbeitragId+" option:selected").text(), + "bis_semester_with_date": $("#input_bis_studiensemester_kurzbz_"+nextOehbeitragId+" option:selected").text() + } + + Oehbeitrag.addOehbeitrag(oehbeitrag, studiensemester_von_bis, nextOehbeitragId); + } + ); + + $("#delete_"+nextOehbeitragId).click( + function() + { + $(this).parent('td').parent('tr').remove(); + } + ); + + // increase counter for newly added rows + Oehbeitrag.newBeitragId++; + } + else + FHC_DialogLib.alertInfo("ÖH-Beiträge für alle Studiensemester festgelegt"); + } + + 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 + getValidStudiensemester: function(callback, oehbeitrag_id) + { + let params = oehbeitrag_id ? {"oehbeitrag_id": oehbeitrag_id} : null; + + FHC_AjaxClient.ajaxCallGet( + CALLED_PATH + "/getValidStudiensemester", + params, + { + successCallback: callback, + errorCallback: function() + { + FHC_DialogLib.alertError('Fehler beim Holen der Semester'); + } + } + ); + }, + addOehbeitrag: function(oehbeitrag, studiensemester_von_bis, nextOehbeitragId) + { + FHC_AjaxClient.ajaxCallPost( + CALLED_PATH + '/addOehbeitrag', + oehbeitrag, + { + successCallback: function(data, textStatus, jqXHR) { + if (FHC_AjaxClient.isError(data)) + { + FHC_DialogLib.alertError(FHC_AjaxClient.getError(data)); + } + 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(); + } + else + { + FHC_DialogLib.alertError('Fehler beim Hinzufügen des Öhbeitrags'); + } + }, + errorCallback: function() + { + FHC_DialogLib.alertError('Fehler beim Hinzufügen des Öhbeitrags'); + } + } + ); + }, + updateOehbeitrag(oehbeitrag_id, fieldname, fieldelement, inputtype) + { + let oehbeitragdata = {}; + let fieldvalue = fieldelement.val(); + + if (inputtype != 'semester') // formal number as decimal with point separator + fieldvalue = Oehbeitrag._formatDecimal(fieldvalue, "."); + + oehbeitragdata[fieldname] = fieldvalue; + + 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)) + { + if (inputtype == 'semester') + fieldvalue = $(fieldelement).find("option:selected").text(); + else + fieldvalue = Oehbeitrag._formatDecimal(fieldvalue); + $("#confirm_"+fieldname+"_"+oehbeitrag_id).parent('td').html( + fieldvalue+" " + ); + $("#edit_"+fieldname+"_"+oehbeitrag_id).click( + function() + { + Oehbeitrag._setUpdateEvent($(this).prop("id"), fieldname, inputtype); + } + ); + + Oehbeitrag._addTablesorter(); + } + else + { + FHC_DialogLib.alertError('Fehler beim Hinzufügen des Öhbeitrags'); + } + }, + errorCallback: function() + { + FHC_DialogLib.alertError('Fehler beim Hinzufügen des Öhbeitrags'); + } + } + ); + }, + deleteOehbeitrag: function(oehbeitrag_id) + { + FHC_AjaxClient.ajaxCallPost( + CALLED_PATH + '/deleteOehbeitrag', + {"oehbeitrag_id": oehbeitrag_id}, + { + successCallback: function(data, textStatus, jqXHR) { + if (FHC_AjaxClient.hasData(data)) + { + $("#delete_"+oehbeitrag_id).closest("tr").remove(); + Oehbeitrag._addTablesorter(); + } + else + { + FHC_DialogLib.alertError('Fehler beim Löschen des Öhbeitrags'); + } + }, + errorCallback: function() + { + FHC_DialogLib.alertError('Fehler beim Löschen des Öhbeitrags'); + } + } + ); + }, + + // ----------------------------------------------------------------------------------------------------------------- + // (private) methods + _setUpdateEvents() + { + $(".editStudierendenbeitrag").off('click').click( + function() + { + Oehbeitrag._setUpdateEvent($(this).prop("id"), 'studierendenbeitrag'); + } + ); + + $(".editVersicherung").off('click').click( + function() + { + Oehbeitrag._setUpdateEvent($(this).prop("id"), 'versicherung'); + } + ); + + $(".editBisStudiensemester").off('click').click( + function() + { + Oehbeitrag._setUpdateEvent($(this).prop("id"), 'bis_studiensemester_kurzbz', 'semester'); + } + ); + + $(".editVonStudiensemester").off('click').click( + function() + { + Oehbeitrag._setUpdateEvent($(this).prop("id"), 'von_studiensemester_kurzbz', 'semester'); + } + ); + + }, + _setUpdateEvent(oehbeitrag_id_prefixed, fieldname, inputtype) + { + 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 callback = function(validSemesterData) + { + let inputHtml = ""; + + // if semester dropdown, retrieve valid semester + if (inputtype === 'semester') + { + if (FHC_AjaxClient.hasData(validSemesterData)) + { + let studiensemester = FHC_AjaxClient.getData(validSemesterData); + + inputHtml = Oehbeitrag._getStudiensemesterDropdown(oehbeitrag_id, fieldname, studiensemester, currFieldvalue, 'inline-inputfield'); + } + } + else // otherwise display textfield + { + inputHtml = ""; + } + + inputHtml += " "; + + initElement.parent('td').html(inputHtml); + + // set the update event + $("#confirm_"+fieldname+"_"+oehbeitrag_id).click( + function() + { + Oehbeitrag.updateOehbeitrag(oehbeitrag_id, fieldname, $("#input_" + fieldname + "_" + oehbeitrag_id), inputtype); + } + ); + } + + if (inputtype == 'semester') + { + Oehbeitrag.getValidStudiensemester(callback, oehbeitrag_id); + } + else + callback(null); + }, + _getStudiensemesterDropdown(oehbeitrag_id, name, studiensemester, selectedDateSemester, formatclass) + { + let selectedDateSemesterArr = null; + if (selectedDateSemester) + { + selectedDateSemesterArr = selectedDateSemester.split('/'); + } + + let rowHtml = ""; + let inlineClass = formatclass != null ? ' '+formatclass : ''; + + rowHtml += ""; + + return rowHtml; + }, + _compareGermanDates: function(datea, dateb) + { + return datea.split(".").reverse().join("") < dateb.split(".").reverse().join(""); + }, + _addTablesorter: function() + { + // add parser through the tablesorter addParser method + $.tablesorter.addParser({ + // set a unique id + id: 'germandatesort', + is: function(s, table, cell, $cell) { + // return false so this parser is not auto detected + return false; + }, + format: function(s, table, cell, cellIndex) { + // format data, should sort by leading german date + return s.substring(0, 10).split(".").reverse().join(""); + }, + // set type, either numeric or text + type: 'numeric' + }); + + let headers = {headers: { 0: {sorter: "germandatesort"}, 1: {sorter: "germandatesort"}, 4: {sorter: false}}}; + + 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 + */ + _formatDecimal: function(value, decSeparator) + { + let dec = null; + let prevSeparator = "."; + + if (decSeparator === ".") + prevSeparator = ","; + else + decSeparator = ","; + + dec = value.split(prevSeparator); + if (dec.length === 2) + { + dec = parseFloat(dec[0] + '.' + dec[1]).toFixed(2); + dec = dec.replace(prevSeparator, decSeparator); + } + else if (Math.floor(value) == value) // if integer, add zeros + dec = value + decSeparator + '00'; + else + dec = value; + + return dec; + }, + _formatDateToGerman: function(date) + { + return date.substring(8, 10) + "." + date.substring(5, 7) + "." + date.substring(0, 4); + } +};