diff --git a/application/controllers/codex/Oehbeitrag.php b/application/controllers/codex/Oehbeitrag.php new file mode 100644 index 000000000..818815e95 --- /dev/null +++ b/application/controllers/codex/Oehbeitrag.php @@ -0,0 +1,148 @@ + 'admin:r',// TODO which Berechtigung? + 'getValidStudiensemester' => 'admin:r', + 'addOehbeitrag' => 'admin:rw', + 'deleteOehbeitrag' => 'admin:rw' + ) + ); + + $this->load->model('codex/Oehbeitrag_model', 'OehbeitragModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + } + + 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() + { + $studiensemester = array(); + + $studiensemesterres = $this->OehbeitragModel->getUnassignedStudiensemester(self::STUDIENSEMESTER_START); + + if (isError($studiensemesterres)) + { + $this->outputJsonError(getError($studiensemesterres)); + die(); + } + + 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 (!is_numeric($studierendenbeitrag)) + $this->outputJsonError('Ungültiger Studierendenbeitrag'); + elseif (!is_numeric($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 + ); + + $insertRes = $this->OehbeitragModel->insert($data); + + $this->outputJson($insertRes); + } + } + } + + public function deleteOehbeitrag() + { + $oehbeitrag_id = $this->input->post("oehbeitrag_id"); + + $this->outputJson($this->OehbeitragModel->delete($oehbeitrag_id)); + } + + private function _loadOehbeitraege() + { + $this->OehbeitragModel->addJoin('public.tbl_studiensemester', 'tbl_oehbeitrag.von_studiensemester_kurzbz = tbl_studiensemester.studiensemester_kurzbz'); + $this->OehbeitragModel->addOrder('public.tbl_studiensemester.start', 'DESC'); + return $this->OehbeitragModel->load(); + } + + private function _checkVonBisStudiensemester($von_studiensemester_kurzbz, $bis_studiensemester_kurzbz) + { + $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"); + + $assignableRes = $this->OehbeitragModel->checkIfStudiensemesterAssignable($von_studiensemester_kurzbz, $bis_studiensemester_kurzbz); + + 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..ace532908 100644 --- a/application/models/codex/Oehbeitrag_model.php +++ b/application/models/codex/Oehbeitrag_model.php @@ -32,4 +32,57 @@ class Oehbeitrag_model extends DB_Model return $this->execQuery($qry, array($studiensemester_kurzbz)); } + + /** + * Gets all Studiensemester for which no Oehbeitrag value assignment. + * @param string $start_studiensemester_kurzbz semester before the given semester are ignored + * @return object + */ + public function getUnassignedStudiensemester($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)) + ORDER BY sem.start"; + + return $this->execQuery($qry, array($start_studiensemester_kurzbz)); + } + + /** + * Checks if a Öhbeitrag can be assigned for a Studiensemester range. + * @param string $von_studiensemester_kurzbz + * @param string $bis_studiensemester_kurzbz + * @return object + */ + public function checkIfStudiensemesterAssignable($von_studiensemester_kurzbz, $bis_studiensemester_kurzbz = null) + { + $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))"; + + $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..afb2170ff --- /dev/null +++ b/application/views/codex/oehbeitrag.php @@ -0,0 +1,69 @@ +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 bis (inkl.)StudierendenbetragVersicherungsbetragAktion
von_studiensemester_kurzbz ?>bis_studiensemester_kurzbz == null ? 'unbeschränkt' : $oehbeitrag->bis_studiensemester_kurzbz ?>studierendenbeitrag, 2, ',', '.') ?>versicherung, 2, ',', '.') ?>
+
+
+
+
+
+ + +load->view('templates/FHC-Footer'); ?> diff --git a/public/js/codex/oehbeitrag.js b/public/js/codex/oehbeitrag.js new file mode 100644 index 000000000..6346c8ba0 --- /dev/null +++ b/public/js/codex/oehbeitrag.js @@ -0,0 +1,217 @@ +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 + //Tablesort.addTablesorter("oehbeitraegeTbl", [], ["zebra"]); + + $("#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 += ""; + newRowHtml += ""; + newRowHtml += ""; + newRowHtml += ""; + newRowHtml += ""+ + ""+ + ""+ + ""; + +/* $("#saveHeading, .saveCell").show();*/ + $("#oehbeitraegeTbl tbody").prepend(newRowHtml); + $("#addOeh_"+Oehbeitrag.newBeitragId).click( + function() + { + // get form data into object + let oehbeitrag = { + "von_studiensemester_kurzbz": $("#von_studiensemester_kurzbz_"+nextOehbeitragId).val(), + "bis_studiensemester_kurzbz": $("#bis_studiensemester_kurzbz_"+nextOehbeitragId).val(), + "studierendenbeitrag": $("#studierendenbeitrag_"+nextOehbeitragId).val().replace(",", "."), + "versicherung": $("#versicherung_"+nextOehbeitragId).val().replace(",", ".") + } + + Oehbeitrag.addOehbeitrag(oehbeitrag, nextOehbeitragId); + } + ); + + // increase counter for newly added rows + Oehbeitrag.newBeitragId++; + } + else + FHC_DialogLib.alertInfo("ÖH-Beiträge für alle Studiensemester festgelegt"); + } + + Oehbeitrag.getValidStudiensemester(callback); + } + ) + + $(".deleteBtn").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); + } + ) +}); + +var Oehbeitrag = { + newBeitragId: 0, + // ----------------------------------------------------------------------------------------------------------------- + // ajax calls + getValidStudiensemester: function(callback) + { + FHC_AjaxClient.ajaxCallGet( + CALLED_PATH + "/getValidStudiensemester", + null, + { + successCallback: callback, + errorCallback: function() + { + FHC_DialogLib.alertError('Fehler beim Holen der Semester'); + } + } + ); + }, + addOehbeitrag: function(oehbeitrag, nextOehbeitragId) + { + FHC_AjaxClient.ajaxCallPost( + CALLED_PATH + '/addOehbeitrag', + oehbeitrag, + { + successCallback: function(data, textStatus, jqXHR) { + console.log(data); + if (FHC_AjaxClient.isError(data)) + { + FHC_DialogLib.alertError(FHC_AjaxClient.getError(data)); + } + else if (FHC_AjaxClient.hasData(data)) + { + console.log(data); + let inserted_id = FHC_AjaxClient.getData(data); + + // refresh table row in GUI + let bis_studiensemester_kurzbz = oehbeitrag.bis_studiensemester_kurzbz == 'null' ? 'unbeschränkt' : oehbeitrag.bis_studiensemester_kurzbz; + + $("#studierendenbeitrag_"+nextOehbeitragId).parent().html(Oehbeitrag._formatDecimalGerman(oehbeitrag.studierendenbeitrag)); + $("#versicherung_"+nextOehbeitragId).parent().html(Oehbeitrag._formatDecimalGerman(oehbeitrag.versicherung)); + $("#von_studiensemester_kurzbz_"+nextOehbeitragId).parent().html(oehbeitrag.von_studiensemester_kurzbz); + $("#bis_studiensemester_kurzbz_"+nextOehbeitragId).parent().html(bis_studiensemester_kurzbz); + + // add delete button instead of save btn + $("#addOeh_"+nextOehbeitragId).parent().html(""); + + $("#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); + } + ) + } + 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)) + { + console.log(data); + $("#delete_"+oehbeitrag_id).closest("tr").remove(); + } + else + { + FHC_DialogLib.alertError('Fehler beim Löschen des Öhbeitrags'); + } + }, + errorCallback: function() + { + FHC_DialogLib.alertError('Fehler beim Löschen des Öhbeitrags'); + } + } + ); + }, + + // ----------------------------------------------------------------------------------------------------------------- + // (private) methods + _printStudiensemesterDropdown(name, studiensemester) + { + let rowHtml = ""; + let first = true; + for (let idx in studiensemester) + { + let selected = first ? ' selected' : ''; + let studiensemester_kurzbz = studiensemester[idx].studiensemester_kurzbz; + rowHtml += ""; + first = false; + } + + return rowHtml; + }, + /** + * Formats a numeric value as a float with two decimals + * @param sum + * @returns {string} + */ + _formatDecimalGerman: function(sum) + { + var dec = null; + + if(sum === null) + dec = parseFloat(0).toFixed(2).replace(".", ","); + else if(sum === '') + { + dec = '' + } + else + { + dec = parseFloat(sum).toFixed(2); + + dec = dec.split('.'); + var dec1 = dec[0]; + var dec2 = ',' + dec[1]; + var rgx = /(\d+)(\d{3})/; + while (rgx.test(dec1)) { + dec1 = dec1.replace(rgx, '$1' + '.' + '$2'); + } + dec = dec1 + dec2; + } + return dec; + } +};