diff --git a/application/views/lehre/lehrauftrag/acceptLehrauftrag.php b/application/views/lehre/lehrauftrag/acceptLehrauftrag.php index ad563bd5b..0d0b8aee4 100644 --- a/application/views/lehre/lehrauftrag/acceptLehrauftrag.php +++ b/application/views/lehre/lehrauftrag/acceptLehrauftrag.php @@ -1,3 +1,11 @@ + + load->view( 'templates/FHC-Header', @@ -18,8 +26,9 @@ $this->load->view( 'phrases' => array( 'global' => array('lehrauftraegeAnnehmen'), ), - // 'customCSSs' => 'public/css/sbadmin2/tablesort_bootstrap.css', - 'customJSs' => array('public/js/bootstrapper.js') + 'customJSs' => array( + 'public/js/bootstrapper.js', + 'public/js/lehre/lehrauftrag/acceptLehrauftrag.js') ) ); @@ -92,561 +101,3 @@ $this->load->view( load->view('templates/FHC-Footer'); ?> - - diff --git a/application/views/lehre/lehrauftrag/approveLehrauftrag.php b/application/views/lehre/lehrauftrag/approveLehrauftrag.php index 156c379c0..6ceb6b24a 100644 --- a/application/views/lehre/lehrauftrag/approveLehrauftrag.php +++ b/application/views/lehre/lehrauftrag/approveLehrauftrag.php @@ -18,7 +18,10 @@ $this->load->view( 'phrases' => array( 'global' => array('lehrauftraegeErteilen'), ), - 'customJSs' => array('public/js/bootstrapper.js') + 'customJSs' => array( + 'public/js/bootstrapper.js', + 'public/js/lehre/lehrauftrag/approveLehrauftrag.js' + ) ) ); @@ -123,605 +126,3 @@ $this->load->view( load->view('templates/FHC-Footer'); ?> - - - diff --git a/application/views/lehre/lehrauftrag/orderLehrauftrag.php b/application/views/lehre/lehrauftrag/orderLehrauftrag.php index 10ae6a443..5902b7767 100644 --- a/application/views/lehre/lehrauftrag/orderLehrauftrag.php +++ b/application/views/lehre/lehrauftrag/orderLehrauftrag.php @@ -19,7 +19,10 @@ $this->load->view( 'phrases' => array( 'global' => array('lehrauftraegeBestellen'), ), - 'customJSs' => array('public/js/bootstrapper.js') + 'customJSs' => array( + 'public/js/bootstrapper.js', + 'public/js/lehre/lehrauftrag/orderLehrauftrag.js' + ) ) ); ?> @@ -121,629 +124,4 @@ $this->load->view( -load->view('templates/FHC-Footer'); ?> - - - +load->view('templates/FHC-Footer'); ?> \ No newline at end of file diff --git a/public/js/lehre/lehrauftrag/acceptLehrauftrag.js b/public/js/lehre/lehrauftrag/acceptLehrauftrag.js new file mode 100644 index 000000000..bc025ba35 --- /dev/null +++ b/public/js/lehre/lehrauftrag/acceptLehrauftrag.js @@ -0,0 +1,562 @@ +/** + * Javascript file for Lehrauftraege annehmen view and tabulator + * Lehrauftraege annehmen: acceptLehrauftrag.php + * Lehrauftraege annehmen - Tabulator: acceptLehrauftragData.php + */ + + +// ----------------------------------------------------------------------------------------------------------------- +// Global vars +// ----------------------------------------------------------------------------------------------------------------- + +const COLOR_LIGHTGREY = "#f5f5f5"; + +// Store boolean has_inkludierteLehre. If true, used to hide column Betrag. +// has_inkludierteLehre is defined in acceptLehrauftrag.php BEFORE loading this js-script (to pass php variable) + +/** + * PNG icons used in status- and filter buttons + * Setting png icons is a workaround to use font-awsome 5.9.0 icons until system can be updated to newer font awsome version. + * */ +const ICON_LEHRAUFTRAG_ORDERED = ''; +const ICON_LEHRAUFTRAG_APPROVED = ''; +const ICON_LEHRAUFTRAG_CHANGED = ''; + + +// ----------------------------------------------------------------------------------------------------------------- +// Mutators - setter methods to manipulate table data when entering the tabulator +// ----------------------------------------------------------------------------------------------------------------- + +// Converts string date postgre style to string DD.MM.YYYY. +// This will allow correct filtering. +var mut_formatStringDate = function(value, data, type, params, component) { + if (value != null) + { + var d = new Date(value); + return ("0" + (d.getDate())).slice(-2) + "." + ("0"+(d.getMonth()+1)).slice(-2) + "." + d.getFullYear(); + } +} + +// ----------------------------------------------------------------------------------------------------------------- +// Formatters - changes display information, not the data itself +// ----------------------------------------------------------------------------------------------------------------- + +// Formats null values to a string number '0.00' +var form_formatNulltoStringNumber = function(cell){ + if (cell.getValue() == null){ + return '0.00'; + } + else { + return cell.getValue(); + } +} + +// ----------------------------------------------------------------------------------------------------------------- +// Header filter +// ----------------------------------------------------------------------------------------------------------------- + +// Filters values using comparison operator or just by string comparison +function hf_filterStringnumberWithOperator(headerValue, rowValue, rowData){ + + // If string starts with <, <=, >, >=, !=, ==, compare values with that operator + var operator = ''; + if (headerValue.match(/([<=>!]{1,2})/g)) { + var operator_arr = headerValue.match(/([<=>!]{1,2})/g); + operator = operator_arr[0]; + + headerValue = headerValue + .replace(operator, '') + .trim() + ; + + // return if value comparison is true + return eval(rowValue + operator + headerValue); + } + + // If just a stringnumber, return if exact match found + return parseFloat(rowValue) == headerValue; +} + +// ----------------------------------------------------------------------------------------------------------------- +// Custom filters +// ----------------------------------------------------------------------------------------------------------------- + +// Filters erteilte initially +function func_initialFilter(){ + return [ + {field: 'bestellt', type: '!=', value: null}, // bestellt + {field: 'erteilt', type: '!=', value: null}, // AND erteilt + {field: 'akzeptiert', type: '=', value: null} // AND NOT akzeptiert + ] +} + +// ----------------------------------------------------------------------------------------------------------------- +// Tabulator table format functions +// ----------------------------------------------------------------------------------------------------------------- + +// Formats the rows +function func_rowFormatter(row){ + var bestellt = row.getData().bestellt; + var erteilt = row.getData().erteilt; + var akzeptiert = row.getData().akzeptiert; + + var stunden = parseFloat(row.getData().stunden); + var vertrag_stunden = parseFloat(row.getData().vertrag_stunden); + + var betrag = parseFloat(row.getData().betrag); + var vertrag_betrag = parseFloat(row.getData().vertrag_betrag); + + if (isNaN(betrag)) + { + betrag = 0; + } + + /* + Formats the color of the rows depending on their status + - orange: geaendert + - default: bestellte und erteilte (= zu akzeptierende) + - green: akzeptierte + - grey: all other (marks unselectable) + */ + row.getCells().forEach(function(cell){ + if (bestellt != null && (betrag != vertrag_betrag) || + bestellt != null && stunden != vertrag_stunden) + { + cell.getElement().classList.add('bg-warning'); // geaenderte + } + else if(bestellt != null && erteilt != null && akzeptiert == null) + { + return; // bestellte + erteilte + } + else if(bestellt != null && erteilt != null && akzeptiert != null) + { + cell.getElement().classList.add('bg-success') // akzeptierte + } + else + { + row.getElement().style["background-color"] = COLOR_LIGHTGREY; // default + } + }); +} + +// Formats row selectable/unselectable +function func_selectableCheck(row){ + var stunden = parseFloat(row.getData().stunden); + var vertrag_stunden = parseFloat(row.getData().vertrag_stunden); + + var betrag = parseFloat(row.getData().betrag); + var vertrag_betrag = parseFloat(row.getData().vertrag_betrag); + + if (isNaN(betrag)) + { + betrag = 0; + } + + // only allow to select bestellte && erteilte && nicht geaenderte Lehraufträge + return row.getData().bestellt != null && // bestellt + row.getData().erteilt != null && // AND erteilt + row.getData().akzeptiert == null && // AND nicht akzeptiert + betrag == vertrag_betrag && + stunden == vertrag_stunden; // OR nicht geaenderte +} + +// Adds column status +function func_tableBuilt(table) { + // Add status column to table + table.addColumn( + { + title: "", + field: "status", + width:40, + align:"center", + downloadTitle: 'Status', + formatter: status_formatter, + tooltip: status_tooltip + }, true + ); +} + +// Sets status values into column status +function func_renderStarted(table){ + // Set literally status to each row - this enables sorting by status despite using icons + table.getRows().forEach(function(row){ + var bestellt = row.getData().bestellt; + var erteilt = row.getData().erteilt; + var akzeptiert = row.getData().akzeptiert; + + var stunden = parseFloat(row.getData().stunden); + var vertrag_stunden = parseFloat(row.getData().vertrag_stunden); + + var betrag = parseFloat(row.getData().betrag); + var vertrag_betrag = parseFloat(row.getData().vertrag_betrag); + + if (isNaN(betrag)) + { + betrag = 0; + } + + if ((bestellt != null && betrag != vertrag_betrag) || + (bestellt != null && stunden != vertrag_stunden)) + { + row.getData().status = 'Geändert'; // geaendert + } + else if (bestellt == null && erteilt == null && akzeptiert == null) + { + row.getData().status = 'Neu'; // neu + } + else if (bestellt != null && erteilt == null && akzeptiert == null) + { + row.getData().status = 'Bestellt'; // bestellt + } + else if (bestellt != null && erteilt != null && akzeptiert == null) + { + row.getData().status = 'Erteilt'; // erteilt + } + else if (bestellt != null && erteilt != null && akzeptiert != null) + { + row.getData().status = 'Akzeptiert'; // akzeptiert + } + else + { + row.getData().status = null; // default + } + }); +} + +// Performes after row was updated +function func_rowUpdated(row){ + + // Refresh status icon and row color + row.reformat(); // retriggers cell formatters and rowFormatter callback + + // Deselect and disable new selection of updated rows + row.deselect(); + row.getElement().style["pointerEvents"] = "none"; +} + +// Hide betrag, if lector has inkludierte Lehre +function func_renderComplete(table){ + + // If the lectors actual Verwendung has inkludierte Lehre, hide the column betrag + if (has_inkludierteLehre) + { + table.hideColumn("betrag"); + } +} + +// Tabulator footer element +// ----------------------------------------------------------------------------------------------------------------- + +// Adds a footer with buttons select all / deselect all / download +function func_footerElement(){ + + var footer_html = '
'; + footer_html += '
'; + + footer_html += ''; + + footer_html += ''; + + footer_html += '
'; + footer_html += '
'; + + return footer_html; +} + +// Performs download CSV +function footer_downloadCSV(){ + $('#filterTabulator').tabulator("download", "csv", "data.csv", {bom:true}); // BOM for correct UTF-8 char output +} + +/* + * Performs select all + * Select all (filtered) rows and ignore rows that are bestellt and erteilt + */ +function footer_selectAll(){ + $('#filterTabulator').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())); +} + +/* + * Performs deselect all + * Deselect all (filtered) rows + */ +function footer_deselectAll(){ + $('#filterTabulator').tabulator('deselectRow'); +} + +// Displays number of selected rows on row selection change +function func_rowSelectionChanged(data, rows){ + $('#number-selected').html("Für Annehmen ausgewählt: " + rows.length + ""); +} + +// ----------------------------------------------------------------------------------------------------------------- +// Tabulator columns format functions +// ----------------------------------------------------------------------------------------------------------------- +// Generates status icons +status_formatter = function(cell, formatterParams, onRendered){ + + var bestellt = cell.getRow().getData().bestellt; + var erteilt = cell.getRow().getData().erteilt; + var akzeptiert = cell.getRow().getData().akzeptiert; + + var stunden = parseFloat(cell.getRow().getData().stunden); + var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden); + + var betrag = parseFloat(cell.getRow().getData().betrag); + var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag); + + if (isNaN(betrag)) + { + betrag = 0; + } + + // commented icons would be so nice to have with fontawsome 5.11... + if (bestellt != null && isNaN(vertrag_betrag)) + { + return ""; // kein Vertrag + } + else if (bestellt != null && (betrag != vertrag_betrag) || + bestellt != null && stunden != vertrag_stunden) + { + return ICON_LEHRAUFTRAG_CHANGED; // geaendert + // return ""; + } + else if (bestellt == null && erteilt == null && akzeptiert == null) + { + return ""; // neu + } + else if (bestellt != null && erteilt == null && akzeptiert == null) + { + return ICON_LEHRAUFTRAG_ORDERED; // bestellt + // return ""; + } + else if (bestellt != null && erteilt != null && akzeptiert == null) + { + return ICON_LEHRAUFTRAG_APPROVED; // erteilt + // return ""; + } + else if (bestellt != null && erteilt != null && akzeptiert != null) + { + return ""; // akzeptiert + // return ""; + } + else + { + return ""; // default + } +}; + +// Generates status tooltip +status_tooltip = function(cell){ + var bestellt = cell.getRow().getData().bestellt; + var erteilt = cell.getRow().getData().erteilt; + var akzeptiert = cell.getRow().getData().akzeptiert; + + var stunden = parseFloat(cell.getRow().getData().stunden); + var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden); + + var betrag = parseFloat(cell.getRow().getData().betrag); + var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag); + + if (isNaN(betrag)) + { + betrag = 0; + } + + var text = 'Lehrauftrag in Bearbeitung. '; + + if (bestellt != null && erteilt == null && akzeptiert == null + && (betrag != vertrag_betrag || stunden != vertrag_stunden)) // geaendert (when never erteilt before) + { + text += 'Wartet auf Erteilung.'; + return text; + } + else if (bestellt != null && erteilt != null && akzeptiert == null + && (betrag != vertrag_betrag || stunden != vertrag_stunden)) // geaendert (when has been erteilt once) + { + text += 'Wartet auf erneute Erteilung.'; + return text; + } + else if (bestellt != null && erteilt == null && akzeptiert == null) // bestellt + { + return 'Letzter Status: Bestellt. Wartet auf Erteilung.'; + } + else if (bestellt != null && erteilt != null && akzeptiert == null) // erteilt + { + return 'Letzter Status: Erteilt. Wartet auf Annahme durch Lektor.'; + } + else if (bestellt != null && erteilt != null && akzeptiert != null) // akzeptiert + { + return 'Letzter Status: Angenommen. Vertrag wurde beidseitig abgeschlossen.'; + } +} + +// Generates bestellt tooltip +bestellt_tooltip = function(cell){ + if (cell.getRow().getData().bestellt_von != null) + { + return 'Bestellt von: ' + cell.getRow().getData().bestellt_von; + } +} + +// Generates erteilt tooltip +erteilt_tooltip = function(cell){ + if (cell.getRow().getData().erteilt_von != null) { + return 'Erteilt von: ' + cell.getRow().getData().erteilt_von; + } +} + +// Generates akzeptiert tooltip +akzeptiert_tooltip = function(cell){ + if (cell.getRow().getData().akzeptiert_von != null) { + return 'Angenommen von: ' + cell.getRow().getData().akzeptiert_von; + } +} + +$(function() { + + // Show all rows + $("#show-all").click(function(){ + $('#filterTabulator').tabulator('clearFilter'); + }); + + // Show only rows with ordered lehrauftraege + $("#show-ordered").click(function(){ + $('#filterTabulator').tabulator('setFilter', + [ + {field: 'bestellt', type: '!=', value: null}, + {field: 'erteilt', type: '=', value: null}, + {field: 'akzeptiert', type: '=', value: null} + ] + ); + }); + + // Show only rows with erteilte lehrauftraege + $("#show-approved").click(function(){ + $('#filterTabulator').tabulator('setFilter', [ + {field: 'bestellt', type: '!=', value: null}, // filter when is bestellt + {field: 'erteilt', type: '!=', value: null}, // and is erteilt + {field: 'akzeptiert', type: '=', value: null} // and is not akzeptiert + ] + ); + }); + + // Show only rows with akzeptierte lehrauftraege + $("#show-accepted").click(function(){ + $('#filterTabulator').tabulator('setFilter', + [ + {field: 'bestellt', type: '!=', value: null}, + {field: 'erteilt', type: '!=', value: null}, + {field: 'akzeptiert', type: '!=', value: null} + ] + ); + }); + + // Set png-icons into filter-buttons + $(".btn-lehrauftrag").each(function(){ + switch(this.id) { + case 'show-ordered': + this.innerHTML = ICON_LEHRAUFTRAG_ORDERED; + break; + case 'show-approved': + this.innerHTML = ICON_LEHRAUFTRAG_APPROVED; + break; + } + }); + + // De/activate and un/focus on clicked button + $(".btn-lehrauftrag").click(function() { + + // De/activate and un/focus on clicked button + $(".btn-lehrauftrag").removeClass('focus').removeClass('active'); + $(this).addClass('focus').addClass('active'); + }); + + // Approve Lehrauftraege + $("#accept-lehrauftraege").click(function(){ + + // Get selected rows data + var selected_data = $('#filterTabulator').tabulator('getSelectedData') + .map(function(data){ + // reduce to necessary fields + return { + 'row_index' : data.row_index, + 'vertrag_id' : data.vertrag_id + } + }); + + // Alert and exit if no lehraufgang is selected + if (selected_data.length == 0) + { + FHC_DialogLib.alertInfo('Bitte wählen Sie erst zumindest einen Lehrauftrag'); + + // Emtpy password field + $("#password").val(''); + + return; + } + + // Get password for verification + var password = $("#password").val(); + if (password == '') + { + FHC_DialogLib.alertInfo('Bitte verifizieren Sie sich mit Ihrem Login Passwort.'); + + // Focus on password field + $("#password").focus(); + + return; + } + + // Prepare data object for ajax call + var data = { + 'password': password, + 'selected_data': selected_data + }; + + FHC_AjaxClient.ajaxCallPost( + FHC_JS_DATA_STORAGE_OBJECT.called_path + "/acceptLehrauftrag", + data, + { + successCallback: function (data, textStatus, jqXHR) + { + if (data.error) + { + // Password not verified + FHC_DialogLib.alertWarning(data.retval); + } + if (!data.error && data.retval != null) + { + // Update status 'Erteilt' + $('#filterTabulator').tabulator('updateData', data.retval); + FHC_DialogLib.alertSuccess(data.retval.length + " Lehraufträge wurden akzeptiert."); + } + }, + errorCallback: function (jqXHR, textStatus, errorThrown) + { + FHC_DialogLib.alertError("Systemfehler
Bitte kontaktieren Sie Ihren Administrator."); + } + } + ); + + // Empty password field + $("#password").val(''); + + }); + +}); \ No newline at end of file diff --git a/public/js/lehre/lehrauftrag/approveLehrauftrag.js b/public/js/lehre/lehrauftrag/approveLehrauftrag.js new file mode 100644 index 000000000..a9479a0db --- /dev/null +++ b/public/js/lehre/lehrauftrag/approveLehrauftrag.js @@ -0,0 +1,608 @@ +/** + * Javascript file for Lehrauftraege erteilen view and tabulator + * Lehrauftraege erteilen: approveLehrauftrag.php + * Lehrauftraege erteilen - Tabulator: approveLehrauftragData.php + */ + + +// ----------------------------------------------------------------------------------------------------------------- +// Global vars +// ----------------------------------------------------------------------------------------------------------------- + +const COLOR_LIGHTGREY = "#f5f5f5"; + +/** + * PNG icons used in status- and filter buttons + * Setting png icons is a workaround to use font-awsome 5.9.0 icons until system can be updated to newer font awsome version. + * */ +const ICON_LEHRAUFTRAG_ORDERED = ''; +const ICON_LEHRAUFTRAG_APPROVED = ''; +const ICON_LEHRAUFTRAG_CHANGED = ''; + +// ----------------------------------------------------------------------------------------------------------------- +// Mutators - setter methods to manipulate table data when entering the tabulator +// ----------------------------------------------------------------------------------------------------------------- + +// Converts string date postgre style to string DD.MM.YYYY. +// This will allow correct filtering. +var mut_formatStringDate = function(value, data, type, params, component) { + if (value != null) + { + var d = new Date(value); + return ("0" + (d.getDate())).slice(-2) + "." + ("0" + (d.getMonth() + 1)).slice(-2) + "." + d.getFullYear(); + } +} + +// ----------------------------------------------------------------------------------------------------------------- +// Formatters - changes display information, not the data itself +// ----------------------------------------------------------------------------------------------------------------- + +// Formats null values to a string number '0.00' +var form_formatNulltoStringNumber = function(cell){ + if (cell.getValue() == null){ + return '0.00'; + } + else { + return cell.getValue(); + } +} + +// ----------------------------------------------------------------------------------------------------------------- +// Header filter +// ----------------------------------------------------------------------------------------------------------------- + +// Filters values using comparison operator or just by string comparison +function hf_filterStringnumberWithOperator(headerValue, rowValue, rowData){ + + // If string starts with <, <=, >, >=, !=, ==, compare values with that operator + var operator = ''; + if (headerValue.match(/([<=>!]{1,2})/g)) { + var operator_arr = headerValue.match(/([<=>!]{1,2})/g); + operator = operator_arr[0]; + + headerValue = headerValue + .replace(operator, '') + .trim() + ; + + // return if value comparison is true + return eval(rowValue + operator + headerValue); + } + + // If just a stringnumber, return if exact match found + return parseFloat(rowValue) == headerValue; +} + +// ----------------------------------------------------------------------------------------------------------------- +// Custom filters +// ----------------------------------------------------------------------------------------------------------------- + +// Filters bestellte initially +function func_initialFilter(){ + return [ + {field: 'personalnummer', type: '>=', value: 0}, // NOT dummy lector + {field: 'bestellt', type: '!=', value: null}, // AND bestellt + {field: 'erteilt', type: '=', value: null}, // AND NOT erteilt + {field: 'akzeptiert', type: '=', value: null} // AND NOT akzeptiert + ] +} + +// ----------------------------------------------------------------------------------------------------------------- +// Tabulator table format functions +// ----------------------------------------------------------------------------------------------------------------- +// Formats the group header +function func_groupHeader(data){ + return data[0].lv_bezeichnung; // change name to lehrveranstaltung +}; + +// Formats the rows +function func_rowFormatter(row){ + var is_dummy = (row.getData().personalnummer <= 0 && row.getData().personalnummer != null); + + var bestellt = row.getData().bestellt; + var erteilt = row.getData().erteilt; + var akzeptiert = row.getData().akzeptiert; + + var stunden = parseFloat(row.getData().stunden); + var vertrag_stunden = parseFloat(row.getData().vertrag_stunden); + + var betrag = parseFloat(row.getData().betrag); + var vertrag_betrag = parseFloat(row.getData().vertrag_betrag); + + if (isNaN(betrag)) + { + betrag = 0; + } + + /* + Formats the color of the rows depending on their status + - blue: dummy lectors + - orange: geaendert + - default (white) : bestellte + - green: akzeptiert + - grey: all other (marks unselectable) + */ + row.getCells().forEach(function(cell){ + if(is_dummy) + { + cell.getElement().classList.add('bg-info'); // dummy lectors + } + else if (bestellt != null && (betrag != vertrag_betrag) || + bestellt != null && stunden != vertrag_stunden && + !row._row.element.classList.contains('tabulator-calcs')) // exclude calculation rows + { + cell.getElement().classList.add('bg-warning'); // geaenderte + } + else if(bestellt != null && erteilt == null) + { + return; // bestellt + } + else if(bestellt != null && erteilt != null && akzeptiert != null) + { + cell.getElement().classList.add('bg-success') // akzeptiert + } + else + { + row.getElement().style["background-color"] = COLOR_LIGHTGREY; // default + } + }); +} + +// Formats row selectable/unselectable +function func_selectableCheck(row){ + var is_dummy = (row.getData().personalnummer <= 0 && row.getData().personalnummer != null); + + var stunden = parseFloat(row.getData().stunden); + var vertrag_stunden = parseFloat(row.getData().vertrag_stunden); + + var betrag = parseFloat(row.getData().betrag); + var vertrag_betrag = parseFloat(row.getData().vertrag_betrag); + + if (isNaN(betrag)) + { + betrag = 0; + } + + // only allow to select bestellte Lehraufträge + return !is_dummy && // NOT dummy lector + row.getData().bestellt != null && // AND NOT neue + row.getData().erteilt == null && // AND bestellt + betrag == vertrag_betrag && + stunden == vertrag_stunden; // AND nicht geändert +} + +// Adds column status +function func_tableBuilt(table) { + // Add status column to table + table.addColumn( + { + title: "", + field: "status", + width:40, + align:"center", + downloadTitle: 'Status', + formatter: status_formatter, + tooltip: status_tooltip + }, true + ); +} + +// Sets status values into column status +function func_renderStarted(table){ + // set literally status to each row - this enables sorting by status despite using icons + table.getRows().forEach(function(row){ + var bestellt = row.getData().bestellt; + var erteilt = row.getData().erteilt; + var akzeptiert = row.getData().akzeptiert; + + var stunden = parseFloat(row.getData().stunden); + var vertrag_stunden = parseFloat(row.getData().vertrag_stunden); + + var betrag = parseFloat(row.getData().betrag); + var vertrag_betrag = parseFloat(row.getData().vertrag_betrag); + + if (isNaN(betrag)) + { + betrag = 0; + } + + if ((bestellt != null && betrag != vertrag_betrag) || + (bestellt != null && stunden != vertrag_stunden)) + { + row.getData().status = 'Geändert'; // geaendert + } + else if (bestellt == null && erteilt == null && akzeptiert == null) + { + row.getData().status = 'Neu'; // neu + } + else if (bestellt != null && erteilt == null && akzeptiert == null) + { + row.getData().status = 'Bestellt'; // bestellt + } + else if (bestellt != null && erteilt != null && akzeptiert == null) + { + row.getData().status = 'Erteilt'; // erteilt + } + else if (bestellt != null && erteilt != null && akzeptiert != null) + { + row.getData().status = 'Akzeptiert'; // akzeptiert + } + else + { + row.getData().status = null; // default + } + }); +} + +// Performes after row was updated +function func_rowUpdated(row){ + + // Refresh status icon and row color + row.reformat(); // retriggers cell formatters and rowFormatter callback + + // Deselect and disable new selection of updated rows + row.deselect(); + row.getElement().style["pointerEvents"] = "none"; +} + + +// Tabulator footer element +// ----------------------------------------------------------------------------------------------------------------- + +// Adds a footer with buttons select all / deselect all / download +function func_footerElement(){ + + var footer_html = '
'; + footer_html += '
'; + + footer_html += ''; + + footer_html += ''; + + footer_html += '
'; + footer_html += '
'; + + return footer_html; +} + +// Performs download CSV +function footer_downloadCSV(){ + $('#filterTabulator').tabulator("download", "csv", "data.csv", {bom:true}); // BOM for correct UTF-8 char output +} + +/* + * Performs select all + * Select all (filtered) rows that are bestellt + */ +function footer_selectAll(){ + $('#filterTabulator').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())); +} + +/* + * Performs deselect all + * Deselect all (filtered) rows + */ +function footer_deselectAll(){ + $('#filterTabulator').tabulator('deselectRow'); +} + +// Displays number of selected rows on row selection change +function func_rowSelectionChanged(data, rows){ + $('#number-selected').html("Für Erteilung ausgewählt: " + rows.length + ""); +} + +// ----------------------------------------------------------------------------------------------------------------- +// Tabulator columns format functions +// ----------------------------------------------------------------------------------------------------------------- +// Generates status icons +status_formatter = function(cell, formatterParams, onRendered){ + var is_dummy = (cell.getRow().getData().personalnummer <= 0 && cell.getRow().getData().personalnummer != null); + + var bestellt = cell.getRow().getData().bestellt; + var erteilt = cell.getRow().getData().erteilt; + var akzeptiert = cell.getRow().getData().akzeptiert; + + var stunden = parseFloat(cell.getRow().getData().stunden); + var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden); + + var betrag = parseFloat(cell.getRow().getData().betrag); + var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag); + + if (isNaN(betrag)) + { + betrag = 0; + } + + // commented icons would be so nice to have with fontawsome 5.11... + if (is_dummy) + { + return ""; // dummy lector + } + else if (bestellt != null && (betrag != vertrag_betrag) || // geaendert + bestellt != null && stunden != vertrag_stunden) // geaendert ((if betrag is 0 or null) + { + return ICON_LEHRAUFTRAG_CHANGED; // geaendert + // return ""; + } + else if (bestellt == null && erteilt == null && akzeptiert == null) + { + return ""; // neu + } + else if (bestellt != null && erteilt == null && akzeptiert == null) + { + return ICON_LEHRAUFTRAG_ORDERED; // bestellt + // return ""; + } + else if (bestellt != null && erteilt != null && akzeptiert == null) + { + return ICON_LEHRAUFTRAG_APPROVED; // erteilt + // return ""; + } + else if (bestellt != null && erteilt != null && akzeptiert != null) + { + return ""; // akzeptiert + // return ""; + } + else + { + return ""; // default + } +}; + +// Generates status tooltip +status_tooltip = function(cell){ + var is_dummy = (cell.getRow().getData().personalnummer <= 0 && cell.getRow().getData().personalnummer != null); + + var bestellt = cell.getRow().getData().bestellt; + var erteilt = cell.getRow().getData().erteilt; + var akzeptiert = cell.getRow().getData().akzeptiert; + + var betrag = parseFloat(cell.getRow().getData().betrag); + var stunden = parseFloat(cell.getRow().getData().stunden); + + var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag); + var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden); + + if (isNaN(betrag)) + { + betrag = 0; + } + + if (isNaN(vertrag_stunden)){ + vertrag_stunden = 0; + } + + var text = 'Lehrauftragstunden/-stundensatz geändert.'; + text += "\n"; + + if (is_dummy) // dummy (no lector) + { + return 'Neuer Lehrauftrag. Ohne Lektor verplant.' + } + else if ((bestellt != null && erteilt == null && betrag != vertrag_betrag) || + (bestellt != null && erteilt == null && stunden != vertrag_stunden)) // geaendert (when never erteilt before) + { + return text += 'Wartet auf Bestellung, danach Erteilen möglich.'; + } + else if ((bestellt != null && erteilt != null && betrag != vertrag_betrag) || + (bestellt != null && erteilt != null && stunden != vertrag_stunden)) // geaendert (when has been erteilt once) + { + return text += 'Wartet auf neuerliche Bestellung, danach erneut Erteilen möglich.'; + } + else if (bestellt == null) // neu + { + return 'Neuer Lehrauftrag. Wartet auf Bestellung.'; + } + else if (bestellt != null && erteilt == null && akzeptiert == null) // bestellt + { + return 'Letzter Status: Bestellt. Wartet auf Erteilung.'; + } + else if (bestellt != null && erteilt != null && akzeptiert == null) // erteilt + { + return 'Letzter Status: Erteilt. Wartet auf Annahme durch Lektor.'; + } + else if (bestellt != null && erteilt != null && akzeptiert != null) // akzeptiert + { + return 'Letzter Status: Angenommen. Vertrag wurde beidseitig abgeschlossen.'; + } +} + +// Generates bestellt tooltip +bestellt_tooltip = function(cell){ + if (cell.getRow().getData().bestellt_von != null) + { + return 'Bestellt von: ' + cell.getRow().getData().bestellt_von; + } +} + +// Generates erteilt tooltip +erteilt_tooltip = function(cell){ + if (cell.getRow().getData().erteilt_von != null) { + return 'Erteilt von: ' + cell.getRow().getData().erteilt_von; + } +} + +// Generates akzeptiert tooltip +akzeptiert_tooltip = function(cell){ + if (cell.getRow().getData().akzeptiert_von != null) { + return 'Angenommen von: ' + cell.getRow().getData().akzeptiert_von; + } +} +$(function() { + + // Show all rows + $("#show-all").click(function(){ + $('#filterTabulator').tabulator('clearFilter'); + }); + + // Show only rows with new lehrauftraege (not dummy lectors) + $("#show-new").click(function(){ + $('#filterTabulator').tabulator('setFilter', + [ + {field: 'personalnummer', type: '>=', value: 0}, + {field: 'bestellt', type: '=', value: null}, + {field: 'erteilt', type: '=', value: null}, + {field: 'akzeptiert', type: '=', value: null} + ] + ); + }); + + // Show only rows with ordered lehrauftraege + $("#show-ordered").click(function(){ + $('#filterTabulator').tabulator('setFilter', + [ + {field: 'personalnummer', type: '>=', value: 0}, + {field: 'bestellt', type: '!=', value: null}, + {field: 'erteilt', type: '=', value: null}, + {field: 'akzeptiert', type: '=', value: null} + ] + ); + }); + + // Show only rows with erteilte lehrauftraege + $("#show-approved").click(function(){ + $('#filterTabulator').tabulator('setFilter', + [ + {field: 'bestellt', type: '!=', value: null}, + {field: 'erteilt', type: '!=', value: null}, + {field: 'akzeptiert', type: '=', value: null} + ] + ); + }); + + // Show only rows with accepted lehrauftraege + $("#show-accepted").click(function(){ + $('#filterTabulator').tabulator('setFilter', + [ + {field: 'bestellt', type: '!=', value: null}, + {field: 'erteilt', type: '!=', value: null}, + {field: 'akzeptiert', type: '!=', value: null} + ] + ); + }); + + // Show only rows with dummy lectors + $("#show-dummies").click(function(){ + $('#filterTabulator').tabulator('setFilter', + [ + {field: 'personalnummer', type: '!=', value: null}, + {field: 'personalnummer', type: '<=', value: 0}, + ] + ); + }); + + // Show only rows with dummy lectors + $("#show-changed").click(function(){ + // needs custom filter to compare fields betrag and vertrag_betrag + $('#filterTabulator').tabulator('setFilter', + [ + {field: 'personalnummer', type: '>=', value: 0}, // NOT dummy lector AND + {field: 'bestellt', type: '!=', value: null}, // bestellt AND + {field: 'status', type: '=', value: 'Geändert'} // geaendert + ] + ); + }); + + // Set png-icons into filter-buttons + $(".btn-lehrauftrag").each(function(){ + switch(this.id) { + case 'show-ordered': + this.innerHTML = ICON_LEHRAUFTRAG_ORDERED; + break; + case 'show-approved': + this.innerHTML = ICON_LEHRAUFTRAG_APPROVED; + break; + case 'show-changed': + this.innerHTML = ICON_LEHRAUFTRAG_CHANGED; + break; + } + }); + + // De/activate and un/focus on clicked button, En-/Disable 'Lehrauftrag erteilen' + $(".btn-lehrauftrag").click(function() { + + // De/activate and un/focus on clicked button + $(".btn-lehrauftrag").removeClass('focus').removeClass('active'); + $(this).addClass('focus').addClass('active'); + + // Enable button 'Lehrauftrag bestellen' by default + $('#approve-lehrauftraege').attr('disabled', false).attr('title', ''); + + // Disable button Lehrauftrag bestellen for dummies + if (this.id == 'show-dummies') + { + $('#approve-lehrauftraege').attr('disabled', true).attr('title', 'Lehraufträge ohne Lektorzuteilung können nicht bestellt werden.'); + } + }); + + // Approve Lehrauftraege + $("#approve-lehrauftraege").click(function(){ + + var selected_data = $('#filterTabulator').tabulator('getSelectedData') + .filter(function(val){ + // filter pseudo lines of groupBy (e.g. the bottom calculations lines) + return val.row_index != null || typeof(val.row_index) !== 'undefined'; + }) + .map(function(data){ + // reduce to necessary fields + return { + 'row_index': data.row_index, + 'mitarbeiter_uid' : data.mitarbeiter_uid, + 'vertrag_id' : data.vertrag_id + } + }); + + // Alert and exit if no lehraufgang is selected + if (selected_data.length == 0) + { + FHC_DialogLib.alertInfo('Bitte wählen Sie erst zumindest einen Lehrauftrag'); + return; + } + + /* + * Prepare data object for ajax call + * NOTE: Stringify to send only ONE post param (json string) instead of many single post params. + * This avoids issues with POST param limitation. + */ + var data = { + 'selected_data': JSON.stringify(selected_data) + }; + + FHC_AjaxClient.ajaxCallPost( + FHC_JS_DATA_STORAGE_OBJECT.called_path + "/approveLehrauftrag", + data, + { + successCallback: function (data, textStatus, jqXHR) + { + if (!data.error && data.retval != null) + { + // Update status 'Erteilt' + $('#filterTabulator').tabulator('updateData', data.retval); + } + + FHC_DialogLib.alertSuccess(data.retval.length + " Lehraufträge wurden erteilt."); + }, + errorCallback: function (jqXHR, textStatus, errorThrown) + { + FHC_DialogLib.alertError("Systemfehler
Bitte kontaktieren Sie Ihren Administrator."); + } + } + ); + + }); +}); \ No newline at end of file diff --git a/public/js/lehre/lehrauftrag/orderLehrauftrag.js b/public/js/lehre/lehrauftrag/orderLehrauftrag.js new file mode 100644 index 000000000..4e788eac7 --- /dev/null +++ b/public/js/lehre/lehrauftrag/orderLehrauftrag.js @@ -0,0 +1,630 @@ +/** + * Javascript file for Lehrauftraege bestellen view and tabulator + * Lehrauftraege bestellen: orderLehrauftrag.php + * Lehrauftraege bestellen - Tabulator: orderLehrauftragData.php + */ + +// ----------------------------------------------------------------------------------------------------------------- +// Global vars +// ----------------------------------------------------------------------------------------------------------------- + +const COLOR_LIGHTGREY = "#f5f5f5"; + +/** + * PNG icons used in status- and filter buttons + * Setting png icons is a workaround to use font-awsome 5.9.0 icons until system can be updated to newer font awsome version. + * */ +const ICON_LEHRAUFTRAG_ORDERED = ''; +const ICON_LEHRAUFTRAG_APPROVED = ''; +const ICON_LEHRAUFTRAG_CHANGED = ''; + +// ----------------------------------------------------------------------------------------------------------------- +// Mutators - setter methods to manipulate table data when entering the tabulator +// ----------------------------------------------------------------------------------------------------------------- + +// Converts string date postgre style to string DD.MM.YYYY. +// This will allow correct filtering. +var mut_formatStringDate = function(value, data, type, params, component) { + if (value != null) + { + var d = new Date(value); + return ("0" + (d.getDate())).slice(-2) + "." + ("0" + (d.getMonth() + 1)).slice(-2) + "." + d.getFullYear(); + } +} + +// ----------------------------------------------------------------------------------------------------------------- +// Formatters - changes display information, not the data itself +// ----------------------------------------------------------------------------------------------------------------- + +// Formats null values to a string number '0.00' +var form_formatNulltoStringNumber = function(cell){ + if (cell.getValue() == null){ + return '0.00'; + } + else { + return cell.getValue(); + } +} + +// ----------------------------------------------------------------------------------------------------------------- +// Header filter +// ----------------------------------------------------------------------------------------------------------------- + +// Filters values using comparison operator or just by string comparison +function hf_filterStringnumberWithOperator(headerValue, rowValue, rowData){ + + // If string starts with <, <=, >, >=, !=, ==, compare values with that operator + var operator = ''; + if (headerValue.match(/([<=>!]{1,2})/g)) { + var operator_arr = headerValue.match(/([<=>!]{1,2})/g); + operator = operator_arr[0]; + + headerValue = headerValue + .replace(operator, '') + .trim() + ; + + // return if value comparison is true + return eval(rowValue + operator + headerValue); + } + + // If just a stringnumber, return if exact match found + return parseFloat(rowValue) == headerValue; +} + +// ----------------------------------------------------------------------------------------------------------------- +// Custom filters +// ----------------------------------------------------------------------------------------------------------------- + +/* + * Filters neue AND geaenderte initially + * NOTE: This is a workaround. The tabulators callback initialFilter is not used here because + * it is processed before the callback tableBuilt, where the status is going to be built. + * The callback dataLoaded is processed after tableBuild and provides the status. + */ +function func_dataLoaded(data, table){ + table.setFilter([ + {field: 'personalnummer', type: '>=', value: 0}, // not dummy lector AND + [ + {field: 'status', type: '=', value: 'Neu'}, // neu OR + {field: 'status', type: '=', value: 'Geändert'} // geaendert + ] + ]); +} + +// ----------------------------------------------------------------------------------------------------------------- +// Tabulator table format functions +// ----------------------------------------------------------------------------------------------------------------- +// Formats the group header +function func_groupHeader(data){ + return data[0].lv_bezeichnung; // change name to lehrveranstaltung +}; + +// Formats the rows +function func_rowFormatter(row){ + var is_dummy = (row.getData().personalnummer <= 0 && row.getData().personalnummer != null); + + var bestellt = row.getData().bestellt; + var erteilt = row.getData().erteilt; + var akzeptiert = row.getData().akzeptiert; + + var stunden = parseFloat(row.getData().stunden); + var vertrag_stunden = parseFloat(row.getData().vertrag_stunden); + + var betrag = parseFloat(row.getData().betrag); + var vertrag_betrag = parseFloat(row.getData().vertrag_betrag); + + // console.log(betrag); + // console.log(vertrag_betrag); + + if (isNaN(betrag)) + { + betrag = 0; + } + + /* + Formats the color of the rows depending on their status + - blue: dummy lectors + - bold: geaendert + - default (white): neu und erteilt + - green: akzeptiert + - grey: all other (marks unselectable) + */ + row.getCells().forEach(function(cell){ + if(is_dummy) + { + cell.getElement().classList.add('bg-info'); // dummy lectors + } + else if (bestellt != null && (betrag != vertrag_betrag) || + bestellt != null && stunden != vertrag_stunden && + !row._row.element.classList.contains('tabulator-calcs')) // exclude calculation rows + { + row.getElement().style['font-weight'] = 'bold'; // geaendert + } + else if(bestellt == null) + { + return; // neu und erteilt + } + else if(bestellt != null && erteilt != null && akzeptiert != null) + { + cell.getElement().classList.add('bg-success') // akzeptiert + } + else + { + row.getElement().style["background-color"] = COLOR_LIGHTGREY; // default + } + }); +} + +// Formats row selectable/unselectable +function func_selectableCheck(row){ + var is_dummy = (row.getData().personalnummer <= 0 && row.getData().personalnummer != null); + + var stunden = parseFloat(row.getData().stunden); + var vertrag_stunden = parseFloat(row.getData().vertrag_stunden); + + var betrag = parseFloat(row.getData().betrag); + var vertrag_betrag = parseFloat(row.getData().vertrag_betrag); + + if (isNaN(betrag)) + { + betrag = 0; + } + + // Only allow to select neue and geaenderte + return !is_dummy && // NOT dummy lector + row.getData().bestellt == null || // AND neue + row.getData().bestellt != null && betrag != vertrag_betrag || // OR geaenderte + row.getData().bestellt != null && stunden != vertrag_stunden // OR geanderte (if betrag is 0 or null) +} + +// Adds column status +function func_tableBuilt(table) { + // Add status column to table + table.addColumn( + { + title: "", + field: "status", + width:40, + align:"center", + downloadTitle: 'Status', + formatter: status_formatter, + tooltip: status_tooltip + }, true + ); +} + +// Sets status values into column status +function func_renderStarted(table){ + // set literally status to each row - this enables sorting by status despite using icons + table.getRows().forEach(function(row){ + var bestellt = row.getData().bestellt; + var erteilt = row.getData().erteilt; + var akzeptiert = row.getData().akzeptiert; + + var stunden = parseFloat(row.getData().stunden); + var vertrag_stunden = parseFloat(row.getData().vertrag_stunden); + + var betrag = parseFloat(row.getData().betrag); + var vertrag_betrag = parseFloat(row.getData().vertrag_betrag); + + if (isNaN(betrag)) + { + betrag = 0; + } + + if ((bestellt != null && betrag != vertrag_betrag) || + (bestellt != null && stunden != vertrag_stunden)) + { + row.getData().status = 'Geändert'; // geaendert + } + else if (bestellt == null && erteilt == null && akzeptiert == null) + { + row.getData().status = 'Neu'; // neu + } + else if (bestellt != null && erteilt == null && akzeptiert == null) + { + row.getData().status = 'Bestellt'; // bestellt + } + else if (bestellt != null && erteilt != null && akzeptiert == null) + { + row.getData().status = 'Erteilt'; // erteilt + } + else if (bestellt != null && erteilt != null && akzeptiert != null) + { + row.getData().status = 'Akzeptiert'; // akzeptiert + } + else + { + row.getData().status = null; // default + } + }); +} + +// Performes after row was updated +function func_rowUpdated(row){ + + // Refresh status icon and row color + row.reformat(); // retriggers cell formatters and rowFormatter callback + + // Format font-weight normal (needed after geaenderte were bestellt) + row.getElement().style['font-weight'] = 'normal'; + + // Deselect and disable new selection of updated rows (ordering done) + row.deselect(); + row.getElement().style["pointerEvents"] = "none"; +} + +// Tabulator footer element +// ----------------------------------------------------------------------------------------------------------------- + +// Adds a footer with buttons select all / deselect all / download +function func_footerElement(){ + + var footer_html = '
'; + footer_html += '
'; + + footer_html += ''; + + footer_html += ''; + + footer_html += '
'; + footer_html += '
'; + + return footer_html; +} + +// Performs download CSV +function footer_downloadCSV(){ + $('#filterTabulator').tabulator("download", "csv", "data.csv", {bom:true}); // BOM for correct UTF-8 char output +} + +/* + * Performs select all + * Select all (filtered) rows and ignore rows which have status bestellt + */ +function footer_selectAll(){ + $('#filterTabulator').tabulator('getRows', true) + .filter(row => row.getData().personalnummer >= 0 && // NOT dummies + row.getData().bestellt == null || // AND neu + row.getData().bestellt != null && // OR (bestellt + row.getData().status == 'Geändert') // AND geaendert) + .forEach((row => row.select())); +} + +/* + * Performs deselect all + * Deselect all (filtered) rows + */ +function footer_deselectAll(){ + $('#filterTabulator').tabulator('deselectRow'); +} + +// Displays number of selected rows on row selection change +function func_rowSelectionChanged(data, rows){ + $('#number-selected').html("Für Bestellung ausgewählt: " + rows.length + ""); +} + +// ----------------------------------------------------------------------------------------------------------------- +// Tabulator columns format functions +// ----------------------------------------------------------------------------------------------------------------- +// Generates status icons +status_formatter = function(cell, formatterParams, onRendered){ + var is_dummy = (cell.getRow().getData().personalnummer <= 0 && cell.getRow().getData().personalnummer != null); + + var bestellt = cell.getRow().getData().bestellt; + var erteilt = cell.getRow().getData().erteilt; + var akzeptiert = cell.getRow().getData().akzeptiert; + + var stunden = parseFloat(cell.getRow().getData().stunden); + var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden); + + var betrag = parseFloat(cell.getRow().getData().betrag); + var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag); + + if (isNaN(betrag)) + { + betrag = 0; + } + + // commented icons would be so nice to have with fontawsome 5.11... + if (is_dummy) + { + return ""; // dummy lector + } + else if (bestellt != null && isNaN(vertrag_betrag)) + { + return ""; // kein Vertrag + } + else if (bestellt != null && (betrag != vertrag_betrag) || // geaendert + bestellt != null && stunden != vertrag_stunden) // geaendert ((if betrag is 0 or null) + { + return ICON_LEHRAUFTRAG_CHANGED; // geaendert + // return ""; + } + else if (bestellt == null && erteilt == null && akzeptiert == null) + { + return ""; // neu + } + else if (bestellt != null && erteilt == null && akzeptiert == null) + { + return ICON_LEHRAUFTRAG_ORDERED; // bestellt + // return ""; + } + else if (bestellt != null && erteilt != null && akzeptiert == null) + { + return ICON_LEHRAUFTRAG_APPROVED; // erteilt + // return ""; + } + else if (bestellt != null && erteilt != null && akzeptiert != null) + { + return ""; // akzeptiert + } + else + { + return ""; // default + } +}; + +// Generates status tooltip +status_tooltip = function(cell){ + var is_dummy = (cell.getRow().getData().personalnummer <= 0 && cell.getRow().getData().personalnummer != null); + + var bestellt = cell.getRow().getData().bestellt; + var erteilt = cell.getRow().getData().erteilt; + var akzeptiert = cell.getRow().getData().akzeptiert; + + var betrag = parseFloat(cell.getRow().getData().betrag); + var stunden = parseFloat(cell.getRow().getData().stunden); + var stundensatz = cell.getRow().getData().stundensatz; + + var vertrag_betrag = parseFloat(cell.getRow().getData().vertrag_betrag); + var vertrag_stunden = parseFloat(cell.getRow().getData().vertrag_stunden); + var vertrag_stundensatz = 0; + + if (isNaN(betrag)) + { + betrag = 0; + } + + // Calculate vertrag stundensatz + if (vertrag_stunden != 0) + { + vertrag_stundensatz = vertrag_betrag/vertrag_stunden; + } + + // Return tooltip message + if (is_dummy) // dummy (no lector) + { + return 'Neuer Lehrauftrag. Ohne Lektor verplant.' + } + else if (isNaN(vertrag_betrag)) // neu + { + return 'Neuer Lehrauftrag. Wartet auf Bestellung.' + } + else if (betrag != vertrag_betrag || // geaendert + bestellt != null && stunden != vertrag_stunden) // geaendert (if betrag is 0 or null) + { + var text = 'NACH Änderung: Stundensatz: ' + stundensatz + ' Stunden: ' + stunden; + text += "\n"; + text += 'VOR Änderung:' + '\xa0\xa0\xa0' + 'Stundensatz: ' + vertrag_stundensatz + ' Stunden: ' + vertrag_stunden; + return text; + } + else if (bestellt != null && erteilt == null && akzeptiert == null) // bestellt + { + return 'Letzter Status: Bestellt. Wartet auf Erteilung.'; + } + else if (bestellt != null && erteilt != null && akzeptiert == null) // erteilt + { + return 'Letzter Status: Erteilt. Wartet auf Annahme durch Lektor.'; + } + else if (bestellt != null && erteilt != null && akzeptiert != null) // akzeptiert + { + return 'Letzter Status: Angenommen. Vertrag wurde beidseitig abgeschlossen.'; + } +} + +// Generates bestellt tooltip +bestellt_tooltip = function(cell){ + if (cell.getRow().getData().bestellt_von != null) + { + return 'Bestellt von: ' + cell.getRow().getData().bestellt_von; + } +} + +// Generates erteilt tooltip +erteilt_tooltip = function(cell){ + if (cell.getRow().getData().erteilt_von != null) { + return 'Erteilt von: ' + cell.getRow().getData().erteilt_von; + } +} + +// Generates akzeptiert tooltip +akzeptiert_tooltip = function(cell){ + if (cell.getRow().getData().akzeptiert_von != null) { + return 'Angenommen von: ' + cell.getRow().getData().akzeptiert_von; + } +} + +$(function() { + + // Show all rows + $("#show-all").click(function(){ + $('#filterTabulator').tabulator('clearFilter'); + }); + + // Show only rows with new lehrauftraege (not dummy lectors) + $("#show-new").click(function(){ + $('#filterTabulator').tabulator('setFilter', + [ + {field: 'personalnummer', type: '>=', value: 0}, + {field: 'bestellt', type: '=', value: null}, + {field: 'erteilt', type: '=', value: null}, + {field: 'akzeptiert', type: '=', value: null} + ] + ); + }); + + // Show only rows with ordered lehrauftraege + $("#show-ordered").click(function(){ + $('#filterTabulator').tabulator('setFilter', + [ + {field: 'personalnummer', type: '>=', value: 0}, + {field: 'bestellt', type: '!=', value: null}, + {field: 'erteilt', type: '=', value: null}, + {field: 'akzeptiert', type: '=', value: null} + ] + ); + }); + + // Show only rows with erteilte lehrauftraege + $("#show-approved").click(function(){ + $('#filterTabulator').tabulator('setFilter', + [ + {field: 'bestellt', type: '!=', value: null}, + {field: 'erteilt', type: '!=', value: null}, + {field: 'akzeptiert', type: '=', value: null} + ] + ); + }); + + // Show only rows with akzeptierte lehrauftraege + $("#show-accepted").click(function(){ + $('#filterTabulator').tabulator('setFilter', + [ + {field: 'bestellt', type: '!=', value: null}, + {field: 'erteilt', type: '!=', value: null}, + {field: 'akzeptiert', type: '!=', value: null} + ] + ); + }); + + // Show only rows with geaenderte lectors + $("#show-changed").click(function(){ + // needs custom filter to compare fields betrag and vertrag_betrag + $('#filterTabulator').tabulator('setFilter', + [ + {field: 'personalnummer', type: '>=', value: 0}, // NOT dummy lector AND + {field: 'bestellt', type: '!=', value: null}, // bestellt AND + {field: 'status', type: '=', value: 'Geändert'} // geaendert + ] + ); + }); + + // Show only rows with dummy lectors + $("#show-dummies").click(function(){ + $('#filterTabulator').tabulator('setFilter', + [ + {field: 'personalnummer', type: '!=', value: null}, + {field: 'personalnummer', type: '<=', value: 0}, + ] + ); + }); + + // Set png-icons into filter-buttons + $(".btn-lehrauftrag").each(function(){ + switch(this.id) { + case 'show-ordered': + this.innerHTML = ICON_LEHRAUFTRAG_ORDERED; + break; + case 'show-approved': + this.innerHTML = ICON_LEHRAUFTRAG_APPROVED; + break; + case 'show-changed': + this.innerHTML = ICON_LEHRAUFTRAG_CHANGED; + break; + } + }); + + // De/activate and un/focus on clicked button, En-/Disable 'Lehrauftrag bestellen' + $(".btn-lehrauftrag").click(function() { + + // De/activate and un/focus on clicked button + $(".btn-lehrauftrag").removeClass('focus').removeClass('active'); + $(this).addClass('focus').addClass('active'); + + //Enable button 'Lehrauftrag bestellen' by default + $('#order-lehrauftraege').attr('disabled', false).attr('title', ''); + + // Disable button Lehrauftrag bestellen for dummies + if (this.id == 'show-dummies') + { + $('#order-lehrauftraege').attr('disabled', true).attr('title', 'Lehraufträge ohne Lektorzuteilung können nicht bestellt werden.'); + } + }); + + // Order Lehrauftraege + $("#order-lehrauftraege").click(function(){ + + var selected_data = $('#filterTabulator').tabulator('getSelectedData') + .filter(function(val){ + // filter pseudo lines of groupBy (e.g. the bottom calculations lines) + return val.row_index != null || typeof(val.row_index) !== 'undefined'; + }) + .map(function(data){ + // reduce to necessary fields + return { + 'row_index' : data.row_index, + 'lehreinheit_id' : data.lehreinheit_id, + 'lehrveranstaltung_id' : data.lehrveranstaltung_id, + 'person_id' : data.person_id, + 'mitarbeiter_uid' : data.mitarbeiter_uid, + 'vertrag_id' : data.vertrag_id, + 'projektarbeit_id' : data.projektarbeit_id, + 'stunden' : data.stunden, + 'betrag' : data.betrag, + 'vertrag_betrag' : data.vertrag_betrag, + 'studiensemester_kurzbz' : data.studiensemester_kurzbz, + 'studiengang_kz' : data.studiengang_kz, + 'lv_oe_kurzbz' : data.lv_oe_kurzbz + } + }); + + // Alert and exit if no lehraufgang is selected + if (selected_data.length == 0) + { + FHC_DialogLib.alertInfo('Bitte wählen Sie erst zumindest einen Lehrauftrag'); + return; + } + + /* + * Prepare data object for ajax call + * NOTE: Stringify to send only ONE post param (json string) instead of many single post params. + * This avoids issues with POST param limitation. + */ + var data = { + 'selected_data': JSON.stringify(selected_data) + }; + + FHC_AjaxClient.ajaxCallPost( + FHC_JS_DATA_STORAGE_OBJECT.called_path + "/orderLehrauftrag", + data, + { + successCallback: function (data, textStatus, jqXHR) + { + if (!data.error && data.retval != null) + { + // Update status 'Bestellt' + $('#filterTabulator').tabulator('updateData', data.retval); + } + + FHC_DialogLib.alertSuccess("Alle " + data.retval.length + " Lehraufträge wurden bestellt.") + }, + errorCallback: function (jqXHR, textStatus, errorThrown) + { + FHC_DialogLib.alertError("Sytemfehler
Bitte kontaktieren Sie Ihren Administrator."); + } + } + ); + }); +}); \ No newline at end of file