From f0d0c0837a2de5e916149b61d86dd3282075553e Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Sat, 17 Jun 2023 20:51:33 +0200 Subject: [PATCH 01/86] added Filter for Software Management --- system/filtersupdate.php | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/system/filtersupdate.php b/system/filtersupdate.php index 241e44f2f..8652f4316 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -1256,6 +1256,30 @@ $filters = array( } ', 'oe_kurzbz' => null, + ), + array( + 'app' => 'core', + 'dataset_name' => 'softwareManagement', + 'filter_kurzbz' => 'SoftwareManagement', + 'description' => '{Software Verwaltung}', + 'sort' => 1, + 'default_filter' => true, + 'filter' => ' + { + "name": "SoftwareManagement", + "columns": [ + {"name": "Software Kurzbezeichnung"}, + {"name": "Version"}, + {"name": "Beschreibung"}, + {"name": "Hersteller"}, + {"name": "Betriebssystem"}, + {"name": "Aktiv"}, + {"name": "Softwarestatus Kurzbezeichnung"} + ], + "filters": [] + } + ', + 'oe_kurzbz' => null, ) ); From 7356b17688cf0356bcc8012aaa8aebde87068aab Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 3 Jul 2023 09:37:32 +0200 Subject: [PATCH 02/86] Added SW-ID column to SW-Table --- system/filtersupdate.php | 1 + 1 file changed, 1 insertion(+) diff --git a/system/filtersupdate.php b/system/filtersupdate.php index 8652f4316..d226e9996 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -1268,6 +1268,7 @@ $filters = array( { "name": "SoftwareManagement", "columns": [ + {"name": "ID"}, {"name": "Software Kurzbezeichnung"}, {"name": "Version"}, {"name": "Beschreibung"}, From 71e86cfcdeb93ce26184e58f5065837a2d964d60 Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Mon, 3 Jul 2023 11:45:15 +0200 Subject: [PATCH 03/86] filter.js bugfixes: saving customfilter, and set columns before data (necessary e.g. for nested tabulator) --- public/js/components/filter/Filter.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/js/components/filter/Filter.js b/public/js/components/filter/Filter.js index 2bf878e5a..3b5760f93 100644 --- a/public/js/components/filter/Filter.js +++ b/public/js/components/filter/Filter.js @@ -194,8 +194,8 @@ export const CoreFilterCmpt = { } }, _updateTabulator() { - this.tabulator.setData(this.filteredData); this.tabulator.setColumns(this.filteredColumns); + this.tabulator.setData(this.filteredData); }, /** * @@ -371,7 +371,7 @@ export const CoreFilterCmpt = { this.startFetchCmpt( CoreFilterAPIs.saveCustomFilter, { - customFilterName: this.$refscustomFilterName.value + customFilterName: this.$refs.customFilterName.value }, this.getFilter ); From fc147f577ab8fe529bad4ced7bd9d8f022bf649e Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Tue, 4 Jul 2023 12:17:15 +0200 Subject: [PATCH 04/86] filter.js: fix for nested tabulator: set columns before set data, filtersupdate: renamed columns --- public/js/components/filter/Filter.js | 2 +- system/filtersupdate.php | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/public/js/components/filter/Filter.js b/public/js/components/filter/Filter.js index 776405614..9c53afdef 100644 --- a/public/js/components/filter/Filter.js +++ b/public/js/components/filter/Filter.js @@ -226,9 +226,9 @@ export const CoreFilterCmpt = { } }, _updateTabulator() { + this.tabulator.setColumns(this.filteredColumns); this.tabulator.setData(this.filteredData); this.tabulatorHasSelector = this.filteredColumns.filter(el => el.formatter == 'rowSelection').length; - this.tabulator.setColumns(this.filteredColumns); }, /** * diff --git a/system/filtersupdate.php b/system/filtersupdate.php index 8652f4316..1c303ad43 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -1268,13 +1268,12 @@ $filters = array( { "name": "SoftwareManagement", "columns": [ - {"name": "Software Kurzbezeichnung"}, - {"name": "Version"}, - {"name": "Beschreibung"}, - {"name": "Hersteller"}, - {"name": "Betriebssystem"}, - {"name": "Aktiv"}, - {"name": "Softwarestatus Kurzbezeichnung"} + {"name": "software_kurzbz"}, + {"name": "version"}, + {"name": "beschreibung"}, + {"name": "hersteller"}, + {"name": "os"}, + {"name": "aktiv"} ], "filters": [] } From 539efcb6ecfeb0d9e54d9a4d07949964b268bb87 Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Thu, 6 Jul 2023 12:03:38 +0200 Subject: [PATCH 05/86] added Modal.js to Bootstrap components --- public/js/components/Bootstrap/Modal.js | 109 ++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 public/js/components/Bootstrap/Modal.js diff --git a/public/js/components/Bootstrap/Modal.js b/public/js/components/Bootstrap/Modal.js new file mode 100644 index 000000000..90cec2d50 --- /dev/null +++ b/public/js/components/Bootstrap/Modal.js @@ -0,0 +1,109 @@ +export default { + data: () => ({ + modal: null + }), + props: { + backdrop: { + type: [Boolean,String], + default: true, + validator(value) { + return ['static', true, false].includes(value); + } + }, + focus: { + type: Boolean, + default: true + }, + keyboard: { + type: Boolean, + default: true + }, + noCloseBtn: Boolean, + dialogClass: [String,Array,Object] + }, + emits: [ + "hideBsModal", + "hiddenBsModal", + "hidePreventedBsModal", + "showBsModal", + "shownBsModal" + ], + methods: { + dispose() { + return this.modal.dispose(); + }, + handleUpdate() { + return this.modal.handleUpdate(); + }, + hide() { + return this.modal.hide(); + }, + show(relatedTarget) { + return this.modal.show(relatedTarget); + }, + toggle() { + return this.modal.toggle(); + } + }, + mounted() { + if(this.$refs.modal) + { + this.modal = new bootstrap.Modal(this.$refs.modal, { + backdrop: this.backdrop, + focus: this.focus, + keyboard: this.keyboard + }); + } + }, + popup(body, options, title, footer) { + const BsModal = this, + slots = {}; + if (body !== undefined) + slots.default = () => body; + if (title !== undefined) + slots.title = () => title; + if (footer !== undefined) + slots.footer = () => footer; + return new Promise((resolve,reject) => { + const instance = Vue.createApp({ + setup() { + return () => Vue.h(BsModal, {...{ + class: 'fade' + },...options, ...{ + ref: 'modal', + 'onHidden.bs.modal': instance.unmount + }}, slots); + }, + mounted() { + this.$refs.modal.show(); + }, + beforeUnmount() { + if (this.$refs.modal) + this.$refs.modal.result !== false ? resolve(this.$refs.modal.result) : reject(); + }, + unmounted() { + wrapper.parentElement.removeChild(wrapper); + } + }); + const wrapper = document.createElement("div"); + instance.mount(wrapper); + document.body.appendChild(wrapper); + }); + }, + template: `` +} From d88ff104a318950ca55cccb2a7f22cd6f2ab1804 Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Tue, 18 Jul 2023 19:11:10 +0200 Subject: [PATCH 06/86] filter component: added property tabulatorAdditionalColumns for displaying additional columns not in filter --- public/js/components/filter/Filter.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/public/js/components/filter/Filter.js b/public/js/components/filter/Filter.js index fbd9ee268..2a0791537 100644 --- a/public/js/components/filter/Filter.js +++ b/public/js/components/filter/Filter.js @@ -55,6 +55,7 @@ export const CoreFilterCmpt = { }, tabulatorOptions: Object, tabulatorEvents: Array, + tabulatorAdditionalColumns: Array, tableOnly: Boolean, reload: Boolean, download: { @@ -137,7 +138,10 @@ export const CoreFilterCmpt = { { // If the column has to be displayed or not col.visible = selectedFields.indexOf(col.field) >= 0; - if (col.formatter == 'rowSelection') + if ( + col.formatter == 'rowSelection' + || (this.tabulatorAdditionalColumns && this.tabulatorAdditionalColumns.indexOf(col.title) >= 0) + ) col.visible = true; if (col.hasOwnProperty('resizable')) From 44182af5fa2cbb4641a7d33fff48f0e51faa01d0 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 31 Jul 2023 09:30:45 +0200 Subject: [PATCH 07/86] Formatted Tabulator Header: Abstaende vergroessert Abstand Titel zu Actionbuttons und zwischen Actionbuttons untereinander vergroessert --- public/js/components/filter/Filter.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/js/components/filter/Filter.js b/public/js/components/filter/Filter.js index 2a0791537..240410677 100644 --- a/public/js/components/filter/Filter.js +++ b/public/js/components/filter/Filter.js @@ -507,7 +507,7 @@ export const CoreFilterCmpt = {
-
@@ -516,7 +516,7 @@ export const CoreFilterCmpt = {
-
+
- Mit {{selectedData.length}} ausgewählten: + Mit {{selectedData.length}} ausgewählten:
From b70011436e57ee5236bd25c941fb99b547501dec Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 2 Aug 2023 13:39:47 +0200 Subject: [PATCH 08/86] Added column 'softwarestatus_kurzbz' to filtersupdate --- system/filtersupdate.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/filtersupdate.php b/system/filtersupdate.php index 1c303ad43..872e2b95b 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -1273,7 +1273,8 @@ $filters = array( {"name": "beschreibung"}, {"name": "hersteller"}, {"name": "os"}, - {"name": "aktiv"} + {"name": "aktiv"}, + {"name": "softwarestatus_kurzbz"} ], "filters": [] } From 553f2feaa4495ae9be80dd967fd47403db3b6048 Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Wed, 2 Aug 2023 16:22:10 +0200 Subject: [PATCH 09/86] filter component: enabled nested tabulator --- public/js/components/filter/Filter.js | 66 ++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/public/js/components/filter/Filter.js b/public/js/components/filter/Filter.js index 240410677..93bb69274 100644 --- a/public/js/components/filter/Filter.js +++ b/public/js/components/filter/Filter.js @@ -65,7 +65,9 @@ export const CoreFilterCmpt = { newBtnShow: Boolean, newBtnClass: [String, Array, Object], newBtnDisabled: Boolean, - newBtnLabel: String + newBtnLabel: String, + idField: String, + parentIdField: String }, data: function() { return { @@ -198,6 +200,13 @@ export const CoreFilterCmpt = { if (tabulatorOptions.columns && tabulatorOptions.columns.filter(el => el.formatter == 'rowSelection').length) this.tabulatorHasSelector = true; + if (this.idField) { + // enable nested tabulator if parent Id given + if (this.parentIdField) tabulatorOptions.dataTree = true; + // set tabulator index + tabulatorOptions.index = this.idField; + } + // Start the tabulator with the build options this.tabulator = new Tabulator( this.$refs.table, @@ -214,6 +223,32 @@ export const CoreFilterCmpt = { this.tabulator.on("rowSelectionChanged", data => { this.selectedData = data; }); + // if nested tabulator, restructure data + if (this.parentIdField && this.idField) { + this.tabulator.on("dataLoading", data => { + let toDelete = []; + + // loop through all data + for (let childIdx = 0; childIdx < data.length; childIdx++) + { + let child = data[childIdx]; + + // if it has parent id, it is a child + if (child[this.parentIdField]) + { + // append the child on the right place. If parent found, mark original sw child on 0 level for deleting + if (this.appendChild(data, child)) toDelete.push(childIdx); + } + } + + // delete the marked children from 0 level + for (let counter = 0; counter < toDelete.length; counter++) + { + // decrease index by counter as index of data array changes after every deletion + data.splice(toDelete[counter] - counter, 1); + } + }); + } if (this.tableOnly) { this.tabulator.on('tableBuilt', () => { const cols = this.tabulator.getColumns(); @@ -479,6 +514,35 @@ export const CoreFilterCmpt = { }, this.getFilter ); + }, + // append child to it's parent + appendChild(data, child) { + // get parent id + let parentId = child[this.parentIdField]; + + // loop thorugh all data + for (let parentIdx = 0; parentIdx < data.length; parentIdx++) + { + let parent = data[parentIdx]; + + // if it's the parent + if (parent[this.idField] == parentId) + { + // create children array if not done yet + if (!parent._children) parent._children = []; + + // append the child + parent._children.push(child); + + // parent found + return true; + } + // search children for parents + else if (parent._children) this.appendChild(parent._children, child); + } + + // parent not found + return false; } }, beforeCreate() { From 2f001987f34379aac2605c8803c91b3a47b88424 Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Wed, 2 Aug 2023 19:14:58 +0200 Subject: [PATCH 10/86] Filter.js additional columns: additional columns are displayed based on field name, not title --- public/js/components/filter/Filter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/js/components/filter/Filter.js b/public/js/components/filter/Filter.js index 93bb69274..4c54c94fc 100644 --- a/public/js/components/filter/Filter.js +++ b/public/js/components/filter/Filter.js @@ -142,7 +142,7 @@ export const CoreFilterCmpt = { col.visible = selectedFields.indexOf(col.field) >= 0; if ( col.formatter == 'rowSelection' - || (this.tabulatorAdditionalColumns && this.tabulatorAdditionalColumns.indexOf(col.title) >= 0) + || (this.tabulatorAdditionalColumns && this.tabulatorAdditionalColumns.indexOf(col.field) >= 0) ) col.visible = true; From 4e17be39f65bc5e4e043c2b15a7674520d0eb727 Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 3 Aug 2023 09:44:28 +0200 Subject: [PATCH 11/86] Added column 'actions' to filtersupdate --- system/filtersupdate.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/filtersupdate.php b/system/filtersupdate.php index 872e2b95b..741f09ef6 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -1274,7 +1274,8 @@ $filters = array( {"name": "hersteller"}, {"name": "os"}, {"name": "aktiv"}, - {"name": "softwarestatus_kurzbz"} + {"name": "softwarestatus_kurzbz"}, + {"name": "actions"} ], "filters": [] } From 56230e3752ad01c52b7c33d7a1f971f9b52498a6 Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 3 Aug 2023 09:45:45 +0200 Subject: [PATCH 12/86] Changed button-color of Tabulators Header-'ADD Button' to primary color --- public/js/components/filter/Filter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/js/components/filter/Filter.js b/public/js/components/filter/Filter.js index 240410677..72eae8123 100644 --- a/public/js/components/filter/Filter.js +++ b/public/js/components/filter/Filter.js @@ -517,7 +517,7 @@ export const CoreFilterCmpt = {
- From 4a2cdaf52ae7d3d6eb5a53c314de9fa2f6202e05 Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Fri, 4 Aug 2023 14:46:53 +0200 Subject: [PATCH 13/86] added primevue autocomplete --- application/views/templates/FHC-Footer.php | 3 ++- composer.json | 2 +- public/js/components/filter/API.js | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/application/views/templates/FHC-Footer.php b/application/views/templates/FHC-Footer.php index c461dd8b0..f360861e5 100644 --- a/application/views/templates/FHC-Footer.php +++ b/application/views/templates/FHC-Footer.php @@ -107,7 +107,7 @@ if ($tinymce5 === true) generateJSsInclude('vendor/tinymce/tinymce5/tinymce.min.js'); // Vue 3 JS - if ($vue3 === true) + if ($vue3 === true) { generateJSsInclude('vendor/vuejs/vuejs3/vue.global.prod.js'); generateJSsInclude('vendor/vuejs/vuerouter4/vue-router.global.js'); @@ -122,6 +122,7 @@ generateJSsInclude('vendor/npm-asset/primevue/column/column.min.js'); generateJSsInclude('vendor/npm-asset/primevue/calendar/calendar.min.js'); generateJSsInclude('vendor/npm-asset/primevue/skeleton/skeleton.min.js'); + generateJSsInclude('vendor/npm-asset/primevue/autocomplete/autocomplete.min.js'); } // -------------------------------------------------------------------------------------------------------- diff --git a/composer.json b/composer.json index 825ed5625..840a53124 100644 --- a/composer.json +++ b/composer.json @@ -400,7 +400,7 @@ "nategood/httpful": "0.2.*", "netcarver/textile": "3.7.*", "nicolaskruchten/pivottable": "2.23.0", - "npm-asset/primevue": "3.15.*", + "npm-asset/primevue": "3.29.*", "npm-asset/primeicons": "5.0.0", "olifolkerd/tabulator4": "4.9.*", diff --git a/public/js/components/filter/API.js b/public/js/components/filter/API.js index ff09c452d..cc3f229b4 100644 --- a/public/js/components/filter/API.js +++ b/public/js/components/filter/API.js @@ -17,7 +17,7 @@ import {CoreRESTClient} from '../../RESTClient.js'; -// +// const CORE_FILTER_CMPT_TIMEOUT = 7000; /** From b7a3d2dcb4cc89c7f6e37d3cc1367267ddcc9b07 Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 9 Aug 2023 10:57:06 +0200 Subject: [PATCH 14/86] Removed column 'actions' from filtersupdate --- system/filtersupdate.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/system/filtersupdate.php b/system/filtersupdate.php index 741f09ef6..872e2b95b 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -1274,8 +1274,7 @@ $filters = array( {"name": "hersteller"}, {"name": "os"}, {"name": "aktiv"}, - {"name": "softwarestatus_kurzbz"}, - {"name": "actions"} + {"name": "softwarestatus_kurzbz"} ], "filters": [] } From e1c23fc6fa80032da7b5455e837bb030634a9871 Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 10 Aug 2023 11:34:54 +0200 Subject: [PATCH 15/86] Added Filter ImageVerwaltung --- system/filtersupdate.php | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/system/filtersupdate.php b/system/filtersupdate.php index 872e2b95b..0fe7e11c5 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -1280,6 +1280,30 @@ $filters = array( } ', 'oe_kurzbz' => null, + ), + array( + 'app' => 'core', + 'dataset_name' => 'imageVerwaltung', + 'filter_kurzbz' => 'ImageVerwaltung', + 'description' => '{Image Verwaltung}', + 'sort' => 1, + 'default_filter' => true, + 'filter' => ' + { + "name": "ImageVerwaltung", + "columns": [ + {"name": "bezeichnung"}, + {"name": "betriebssystem"}, + {"name": "verfuegbarkeit_start"}, + {"name": "verfuegbarkeit_ende"}, + {"name": "anmerkung"}, + {"name": "ort_count"}, + {"name": "software_count"} + ], + "filters": [] + } + ', + 'oe_kurzbz' => null, ) ); From fa3a718ad4e0e8859e5e453ef327277e2d6b012f Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 21 Sep 2023 14:40:05 +0200 Subject: [PATCH 16/86] Added getAutocompleteSuggestions method to OE Model Get OEs by eventQuery string. Use with autocomplete event queries. --- .../organisation/Organisationseinheit_model.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/application/models/organisation/Organisationseinheit_model.php b/application/models/organisation/Organisationseinheit_model.php index bec4aee47..4a64ee055 100644 --- a/application/models/organisation/Organisationseinheit_model.php +++ b/application/models/organisation/Organisationseinheit_model.php @@ -188,4 +188,20 @@ class Organisationseinheit_model extends DB_Model } return $this->loadWhere($condition); } + + /** + * Get OEs by eventQuery string. Use with autocomplete event queries. + * @param $eventQuery String + * @return array + */ + public function getAutocompleteSuggestions($eventQuery) + { + $this->addSelect('oe_kurzbz'); + $this->addSelect('organisationseinheittyp_kurzbz, oe_kurzbz, bezeichnung, aktiv, lehre'); + $this->addOrder('organisationseinheittyp_kurzbz, bezeichnung'); + + return $this->loadWhere(" + oe_kurzbz ILIKE '%". $this->escapeLike($eventQuery). "%' + "); + } } From 4e11e12c9962fad6bf6d7f574f2922ed97e2fcef Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 21 Sep 2023 14:40:50 +0200 Subject: [PATCH 17/86] Removed aktiv column from SoftwareManagement Filter Not used anymore. --- system/filtersupdate.php | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/system/filtersupdate.php b/system/filtersupdate.php index 0fe7e11c5..909dfc601 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -1273,7 +1273,6 @@ $filters = array( {"name": "beschreibung"}, {"name": "hersteller"}, {"name": "os"}, - {"name": "aktiv"}, {"name": "softwarestatus_kurzbz"} ], "filters": [] @@ -1304,6 +1303,30 @@ $filters = array( } ', 'oe_kurzbz' => null, + ), + array( + 'app' => 'core', + 'dataset_name' => 'lizenzserverVerwaltung', + 'filter_kurzbz' => 'LizenzserverVerwaltung', + 'description' => '{Lizenzserver Verwaltung}', + 'sort' => 1, + 'default_filter' => true, + 'filter' => ' + { + "name": "LizenzserverVerwaltung", + "columns": [ + {"name": "lizenzserver_kurzbz"}, + {"name": "bezeichnung"}, + {"name": "macadresse"}, + {"name": "ipadresse"}, + {"name": "ansprechpartner"}, + {"name": "anmerkung"}, + {"name": "location"} + ], + "filters": [] + } + ', + 'oe_kurzbz' => null, ) ); From af678b3c562ee58588b42833ffc2b45c796e0c47 Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Mon, 9 Oct 2023 14:29:38 +0200 Subject: [PATCH 18/86] added vue datepicker to composer --- composer.json | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 840a53124..256aaba74 100644 --- a/composer.json +++ b/composer.json @@ -348,6 +348,28 @@ } } }, + { + "type": "package", + "package": { + "name": "vuejs/vuedatepicker_js", + "version": "5.4.0", + "dist": { + "url": "https://unpkg.com/@vuepic/vue-datepicker@4.2.3/dist/vue-datepicker.iife.js", + "type": "file" + } + } + }, + { + "type": "package", + "package": { + "name": "vuejs/vuedatepicker_css", + "version": "5.4.0", + "dist": { + "url": "https://unpkg.com/@vuepic/vue-datepicker@4.2.3/dist/main.css", + "type": "file" + } + } + }, { "type": "composer", "url": "https://asset-packagist.org" @@ -420,7 +442,9 @@ "twbs/bootstrap5": "5.1.*", "vuejs/vuejs3": "3.2.33", - "vuejs/vuerouter4": "4.1.3" + "vuejs/vuerouter4": "4.1.3", + "vuejs/vuedatepicker_js": "5.4.0", + "vuejs/vuedatepicker_css": "5.4.0" }, "config": { "bin-dir": "vendor/bin" From 0f80b9d31b337766da425b90cc0c3ae20c489972 Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 17 Oct 2023 11:30:35 +0200 Subject: [PATCH 19/86] Added Primevue-Toast and -Confirmdialog libraries to FHC-Footer --- application/views/templates/FHC-Footer.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/application/views/templates/FHC-Footer.php b/application/views/templates/FHC-Footer.php index f360861e5..e7e593d42 100644 --- a/application/views/templates/FHC-Footer.php +++ b/application/views/templates/FHC-Footer.php @@ -123,6 +123,10 @@ generateJSsInclude('vendor/npm-asset/primevue/calendar/calendar.min.js'); generateJSsInclude('vendor/npm-asset/primevue/skeleton/skeleton.min.js'); generateJSsInclude('vendor/npm-asset/primevue/autocomplete/autocomplete.min.js'); + generateJSsInclude('vendor/npm-asset/primevue/toast/toast.min.js'); + generateJSsInclude('vendor/npm-asset/primevue/toastservice/toastservice.min.js'); + generateJSsInclude('vendor/npm-asset/primevue/confirmdialog/confirmdialog.min.js'); + generateJSsInclude('vendor/npm-asset/primevue/confirmationservice/confirmationservice.min.js'); } // -------------------------------------------------------------------------------------------------------- From b01cd99a93715dde6f21ebea666d90fbc3143164 Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Thu, 19 Oct 2023 14:10:55 +0200 Subject: [PATCH 20/86] Plugin: Fhc Alert --- public/js/plugin/FhcAlert.js | 369 +++++++++++++++++++++++++++++++++++ 1 file changed, 369 insertions(+) create mode 100644 public/js/plugin/FhcAlert.js diff --git a/public/js/plugin/FhcAlert.js b/public/js/plugin/FhcAlert.js new file mode 100644 index 000000000..5e1111dd6 --- /dev/null +++ b/public/js/plugin/FhcAlert.js @@ -0,0 +1,369 @@ +/** + * Copyright (C) 2022 fhcomplete.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * @usage: + * Preperations: + * Be sure to have PrimeVue loaded with the toast and confirmdialog + * components as primevue variable + * Install: + * Import this Plugin and install it with the app.use() function. + * Use: + * In your component you can call now the global property $fhcAlert + * which has the following functions: + * + * alertSuccess + * ------------ + * Displays a success message + * @param string message + * @return void + * + * alertInfo + * --------- + * Displays an info message + * @param string message + * @return void + * + * alertWarning + * ------------ + * Displays a warning + * @param string message + * @return void + * + * alertError + * ---------- + * Displays an error + * @param string message + * @return void + * + * alertSystemError + * ---------------- + * Displays an alert with the error details and a button to mail + * the error to the Support Team + * @param string message + * @return void + * + * confirmDelete + * ------------- + * Displays a confirmation dialog and returns a Promise which resolves + * with true or false depending und the pressed button. + * @return Promise + * + * alertDefault + * ------------ + * Displays an alert + * @param string severity can be 'success', 'info', 'warning', 'error' + * @param string title + * @param string message + * @param boolean sticky (optional) defaults to false + * @return void + * + * alertMultiple + * ------------- + * Displays multiple alerts + * @param array messageArray + * @param string severity (optional) defaults to 'info' + * @param string title (optional) defaults to 'Info' + * @param boolean sticky (optional) defaults to false + * @return void + * + * handleSystemError + * ----------------- + * Automatiticly determine how to display an system error and display it. + * This would be used in a catch block of an ajax call. + * @param mixed error + * @return void + * + * handleSystemMessage + * ------------------- + * Automatiticly determine how to display a message and display it. + * @param mixed message + * @return void + */ + +let toast_component = null; +const toast_queue = []; + +function _add_to_toast(...args) { + toast_component.add.apply(toast_component, args); +} +let toast_add = function _add_to_toast_queue(...args) { + toast_queue.push(args); +}; + +let alert_component = null; +const alert_queue = []; + +function _add_to_alert(...args) { + alert_component.add.apply(alert_component, args); +} +let alert_add = function _add_to_alert_queue(...args) { + alert_queue.push(args); +}; + +let confirm_component = null; +const confirm_queue = []; + +function _require_confirm(...args) { + confirm_component.confirm.apply(confirm_component, args); +} +let confirm_require = function _add_to_confirm_queue(...args) { + confirm_queue.push(args); +}; + + +const helperAppContainer = document.createElement('div'); + +const helperApp = Vue.createApp({ + setup() { + return self => { + return [ + Vue.h(primevue.toast, { + ref: 'toast', + baseZIndex: 99999 + }), + Vue.h(primevue.toast, { + ref: 'alert', + baseZIndex: 99999, + position: 'center', + }, { + message: slotProps => { + const messageCard = Vue.h('div', { + ref: 'messageCard', + id: 'collapseMessageCard', + class: 'collapse mt-3' + }, [ + Vue.h('div', {class: 'card card-body text-body small', style: 'white-space: pre-wrap'}, slotProps.message.detail) + ]); + return [ + Vue.h('i', {class: 'fa fa-circle-exclamation fa-2xl mt-3'}), + Vue.h('div', {class: 'p-toast-message-text'}, [ + Vue.h('span', {class: 'p-toast-summary'}, slotProps.message.summary), + Vue.h('div', {class: 'p-toast-detail my-3'}, 'Sorry! Ein interner technischer Fehler ist aufgetreten.'), + Vue.h('div', {class: 'd-flex justify-content-between align-items-center'}, [ + Vue.h('a', { + class: 'align-bottom flex-fill me-2', + dataBsToggle: 'collapse', + href: '#collapseMessageCard', + role: 'button', + ariaExpanded: 'false', + ariaControls: 'collapseMessageCard', + onClick: () => { bootstrap.Collapse.getOrCreateInstance(messageCard.el).toggle(); } + }, 'Fehler anzeigen'), + Vue.h('a', { + class: 'btn btn-primary flex-fill', + target: '_blank', + href: self.mailToUrl(slotProps), + }, 'Fehler melden') + ]), + messageCard, + ]), + ]; + } + }), + Vue.h(primevue.confirmdialog, { + ref: 'pvConfirmdialog' + }) + ]; + }; + }, + methods: { + mailToUrl(slotProps) { + let mailTo = 'noreply@technikum-wien.at'; // TODO domain anpassen + let subject = 'Meldung%20Systemfehler'; + let body = ` + Danke, dass Sie uns den Fehler melden. %0D%0A %0D%0A + Bitte beschreiben Sie uns ausführlich das Problem.%0D%0A + Bsp: Ich habe X ausgewählt und Y angelegt. Beim Speichern erhielt ich die Fehlermeldung. [Optional: Ich habe den Browser Z verwendet.]%0D%0A + -----------------------------------------------------------------------------------------------------------------------------------%0D%0A + PROBLEM: ... %0D%0A %0D%0A %0D%0A + + -----------------------------------------------------------------------------------------------------------------------------------%0D%0A + Fehler URL: ` + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method + `%0D%0A + Fehler Meldung: ` + slotProps.message.detail + `%0D%0A + -----------------------------------------------------------------------------------------------------------------------------------%0D%0A %0D%0A + Wir kümmern uns um eine rasche Behebung des Problems!` + + return "mailto:" + mailTo + "?subject=" + subject + "&body=" + body; + } + }, + mounted() { + toast_component = this.$refs.toast; + toast_add = _add_to_toast; + while (toast_queue.length) + _add_to_toast(toast_queue.unshift()); + + alert_component = this.$refs.alert; + alert_add = _add_to_alert; + while (alert_queue.length) + _add_to_alert(alert_queue.unshift()); + + confirm_component = this.$refs.confirm; + confirm_require = _require_confirm; + while (confirm_queue.length) + _require_confirm(confirm_queue.unshift()); + }, + beforeUnmount() { + toast_add = _add_to_toast_queue; + toast_component = null; + + alert_add = _add_to_alert_queue; + alert_component = null; + + confirm_require = _add_to_confirm_queue; + confirm_component = null; + }, + unmounted() { + helperAppContainer.parentElement.removeChild(helperAppContainer); + } +}); + +helperApp + .use(primevue.config.default) + .mount(helperAppContainer); + +document.body.appendChild(helperAppContainer); + +export default { + install: (app, options) => { + const $fhcAlert = { + alertSuccess(message) { + toast_add({ severity: 'success', summary: 'Info', detail: message, life: 1000}); + }, + alertInfo(message) { + toast_add({ severity: 'info', summary: 'Info', detail: message, life: 3000 }); + }, + alertWarning(message) { + toast_add({ severity: 'warn', summary: 'Achtung', detail: message, life: 7000 }); + }, + alertError(message) { + toast_add({ severity: 'error', summary: 'Achtung', detail: message }); + }, + alertSystemError(message) { + alert_add({ severity: 'error', summary: 'Systemfehler', detail: message}); + }, + confirmDelete() { + return new Promise((resolve, reject) => { + confirm_require({ + header: 'Achtung', + message: 'Möchten Sie sicher löschen?', + acceptLabel: 'Löschen', + acceptClass: 'btn btn-danger', + rejectLabel: 'Abbrechen', + rejectClass: 'btn btn-outline-secondary', + accept() { + resolve(true); + }, + reject() { + resolve(false); + }, + }); + }); + }, + alertDefault(severity, title, message, sticky = false) { + let options = { severity: severity, summary: title, detail: message}; + + if (!sticky) + options.life = 3000; + + toast_add(options); + }, + alertMultiple(messageArray, severity = 'info', title = 'Info', sticky = false){ + // Check, if array has only string values + if (messageArray.every(message => typeof message === 'string')) { + messageArray.every(message => this.alertDefault(severity, title, message, sticky)); + return true; + } + return false; + }, + handleSystemError(error) { + // Error is string + if (typeof error === 'string') + return $fhcAlert.alertSystemError(error); + + // Error is array of strings + if (Array.isArray(error) && error.every(err => typeof err === 'string')) + return error.every($fhcAlert.alertSystemError); + + // Error is object + if (typeof error === 'object' && error !== null) { + let errMsg = ''; + + if (error.hasOwnProperty('message')) + errMsg += 'Error Message: ' + error.message.toUpperCase() + '\r\n'; + + if (error.hasOwnProperty('config') && error.config.hasOwnProperty('url')) + errMsg += 'Error ConfigURL: ' + error.config.url + '\r\n'; + + if (error.hasOwnProperty('stack')) + errMsg += 'Error Stack: ' + error.stack + '\r\n'; + + // Fallback object error message + if (errMsg == '') + errMsg = 'Error Message: ' + JSON.stringify(error) + '\r\n'; + + errMsg += 'Error Controller Path: ' + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method; + + return $fhcAlert.alertSystemError(errMsg); + } + + // Fallback + $fhcAlert.alertSystemError('alertSystemError throws Generic Error\r\nError Controller Path: ' + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method); + }, + handleSystemMessage(message) { + // Message is string + if (typeof message === 'string') + return fhcerror.alertWarning(message); + + // Message is array of strings + if (Array.isArray(message)) { + // If Array has only Strings + if (message.every(msg => typeof msg === 'string')) + return message.every(fhcerror.alertWarning); + + // If Array has only Objects + if (message.every(msg => typeof msg === 'object') && msg !== null) { + return message.every(msg => { + if (msg.hasOwnProperty('data')) { + if (msg.data.hasOwnProperty('retval')) + fhcerror.alertWarning(JSON.stringify(msg.data.retval)); + // TODO(chris): there is no else here! join ifs? + } else { + fhcerror.alertSystemError(JSON.stringify(msg)); + } + }); + } + } + + // Message is Object with data property TODO: check object handling + if (typeof message === 'object' && message !== null){ + if (message.hasOwnProperty('data')) { + if (message.data.hasOwnProperty('retval')) + // NOTE(chris): changed: alertSystemError => alertWarning + fhcerror.alertWarning(JSON.stringify(message.data.retval)); + // TODO(chris): there is no else here! join ifs? + } else { + fhcerror.alertSystemError(JSON.stringify(message)); + } + return; + } + + // Fallback + fhcerror.alertSystemError('alertSystemError throws Generic Error\r\nError Controller Path: ' + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method); + } + }; + app.config.globalProperties.$fhcAlert = $fhcAlert; + } +} \ No newline at end of file From d57fd9eb609de807c823738d2391f5d13e473c0d Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Tue, 24 Oct 2023 12:23:12 +0200 Subject: [PATCH 21/86] fhcAlert: slight improvements --- public/js/plugin/FhcAlert.js | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/public/js/plugin/FhcAlert.js b/public/js/plugin/FhcAlert.js index 5e1111dd6..8ff45f717 100644 --- a/public/js/plugin/FhcAlert.js +++ b/public/js/plugin/FhcAlert.js @@ -117,7 +117,7 @@ let confirm_component = null; const confirm_queue = []; function _require_confirm(...args) { - confirm_component.confirm.apply(confirm_component, args); + confirm_component.confirmListener.apply(confirm_component, args); } let confirm_require = function _add_to_confirm_queue(...args) { confirm_queue.push(args); @@ -174,7 +174,7 @@ const helperApp = Vue.createApp({ } }), Vue.h(primevue.confirmdialog, { - ref: 'pvConfirmdialog' + ref: 'confirm' }) ]; }; @@ -246,7 +246,7 @@ export default { toast_add({ severity: 'info', summary: 'Info', detail: message, life: 3000 }); }, alertWarning(message) { - toast_add({ severity: 'warn', summary: 'Achtung', detail: message, life: 7000 }); + toast_add({ severity: 'warn', summary: 'Achtung', detail: message}); }, alertError(message) { toast_add({ severity: 'error', summary: 'Achtung', detail: message }); @@ -336,10 +336,8 @@ export default { // If Array has only Objects if (message.every(msg => typeof msg === 'object') && msg !== null) { return message.every(msg => { - if (msg.hasOwnProperty('data')) { - if (msg.data.hasOwnProperty('retval')) - fhcerror.alertWarning(JSON.stringify(msg.data.retval)); - // TODO(chris): there is no else here! join ifs? + if (msg.hasOwnProperty('data') && msg.data.hasOwnProperty('retval')) { + fhcerror.alertWarning(JSON.stringify(msg.data.retval)); } else { fhcerror.alertSystemError(JSON.stringify(msg)); } @@ -347,13 +345,11 @@ export default { } } - // Message is Object with data property TODO: check object handling + // Message is Object with data property if (typeof message === 'object' && message !== null){ - if (message.hasOwnProperty('data')) { - if (message.data.hasOwnProperty('retval')) - // NOTE(chris): changed: alertSystemError => alertWarning - fhcerror.alertWarning(JSON.stringify(message.data.retval)); - // TODO(chris): there is no else here! join ifs? + if (message.hasOwnProperty('data') && message.data.hasOwnProperty('retval')) { + // NOTE(chris): changed: alertSystemError => alertWarning + fhcerror.alertWarning(JSON.stringify(message.data.retval)); } else { fhcerror.alertSystemError(JSON.stringify(message)); } From 22453c71b4aafe690ee386f2a1cf77a6b7e027b4 Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Tue, 24 Oct 2023 13:35:50 +0200 Subject: [PATCH 22/86] fhcAlert: slight improvements 2 --- public/js/plugin/FhcAlert.js | 176 ++++++++++++----------------------- 1 file changed, 57 insertions(+), 119 deletions(-) diff --git a/public/js/plugin/FhcAlert.js b/public/js/plugin/FhcAlert.js index 8ff45f717..6ff54061d 100644 --- a/public/js/plugin/FhcAlert.js +++ b/public/js/plugin/FhcAlert.js @@ -93,91 +93,12 @@ * @return void */ -let toast_component = null; -const toast_queue = []; - -function _add_to_toast(...args) { - toast_component.add.apply(toast_component, args); -} -let toast_add = function _add_to_toast_queue(...args) { - toast_queue.push(args); -}; - -let alert_component = null; -const alert_queue = []; - -function _add_to_alert(...args) { - alert_component.add.apply(alert_component, args); -} -let alert_add = function _add_to_alert_queue(...args) { - alert_queue.push(args); -}; - -let confirm_component = null; -const confirm_queue = []; - -function _require_confirm(...args) { - confirm_component.confirmListener.apply(confirm_component, args); -} -let confirm_require = function _add_to_confirm_queue(...args) { - confirm_queue.push(args); -}; - - const helperAppContainer = document.createElement('div'); const helperApp = Vue.createApp({ - setup() { - return self => { - return [ - Vue.h(primevue.toast, { - ref: 'toast', - baseZIndex: 99999 - }), - Vue.h(primevue.toast, { - ref: 'alert', - baseZIndex: 99999, - position: 'center', - }, { - message: slotProps => { - const messageCard = Vue.h('div', { - ref: 'messageCard', - id: 'collapseMessageCard', - class: 'collapse mt-3' - }, [ - Vue.h('div', {class: 'card card-body text-body small', style: 'white-space: pre-wrap'}, slotProps.message.detail) - ]); - return [ - Vue.h('i', {class: 'fa fa-circle-exclamation fa-2xl mt-3'}), - Vue.h('div', {class: 'p-toast-message-text'}, [ - Vue.h('span', {class: 'p-toast-summary'}, slotProps.message.summary), - Vue.h('div', {class: 'p-toast-detail my-3'}, 'Sorry! Ein interner technischer Fehler ist aufgetreten.'), - Vue.h('div', {class: 'd-flex justify-content-between align-items-center'}, [ - Vue.h('a', { - class: 'align-bottom flex-fill me-2', - dataBsToggle: 'collapse', - href: '#collapseMessageCard', - role: 'button', - ariaExpanded: 'false', - ariaControls: 'collapseMessageCard', - onClick: () => { bootstrap.Collapse.getOrCreateInstance(messageCard.el).toggle(); } - }, 'Fehler anzeigen'), - Vue.h('a', { - class: 'btn btn-primary flex-fill', - target: '_blank', - href: self.mailToUrl(slotProps), - }, 'Fehler melden') - ]), - messageCard, - ]), - ]; - } - }), - Vue.h(primevue.confirmdialog, { - ref: 'confirm' - }) - ]; - }; + components: { + PvToast: primevue.toast, + PvConfirm: primevue.confirmdialog }, methods: { mailToUrl(slotProps) { @@ -197,66 +118,83 @@ const helperApp = Vue.createApp({ Wir kümmern uns um eine rasche Behebung des Problems!` return "mailto:" + mailTo + "?subject=" + subject + "&body=" + body; + }, + openMessagecard() { + bootstrap.Collapse.getOrCreateInstance(this.$refs.messageCard).toggle(); } }, - mounted() { - toast_component = this.$refs.toast; - toast_add = _add_to_toast; - while (toast_queue.length) - _add_to_toast(toast_queue.unshift()); - - alert_component = this.$refs.alert; - alert_add = _add_to_alert; - while (alert_queue.length) - _add_to_alert(alert_queue.unshift()); - - confirm_component = this.$refs.confirm; - confirm_require = _require_confirm; - while (confirm_queue.length) - _require_confirm(confirm_queue.unshift()); - }, - beforeUnmount() { - toast_add = _add_to_toast_queue; - toast_component = null; - - alert_add = _add_to_alert_queue; - alert_component = null; - - confirm_require = _add_to_confirm_queue; - confirm_component = null; - }, unmounted() { helperAppContainer.parentElement.removeChild(helperAppContainer); - } + }, + template: ` + + + + + ` }); -helperApp - .use(primevue.config.default) - .mount(helperAppContainer); +helperApp.use(primevue.config.default) +helperApp.use(primevue.confirmationservice) + +const helperAppInstance = helperApp.mount(helperAppContainer); document.body.appendChild(helperAppContainer); + export default { install: (app, options) => { const $fhcAlert = { alertSuccess(message) { - toast_add({ severity: 'success', summary: 'Info', detail: message, life: 1000}); + helperAppInstance.$refs.toast.add({ severity: 'success', summary: 'Info', detail: message, life: 1000}); }, alertInfo(message) { - toast_add({ severity: 'info', summary: 'Info', detail: message, life: 3000 }); + helperAppInstance.$refs.toast.add({ severity: 'info', summary: 'Info', detail: message, life: 3000 }); }, alertWarning(message) { - toast_add({ severity: 'warn', summary: 'Achtung', detail: message}); + helperAppInstance.$refs.toast.add({ severity: 'warn', summary: 'Achtung', detail: message}); }, alertError(message) { - toast_add({ severity: 'error', summary: 'Achtung', detail: message }); + helperAppInstance.$refs.toast.add({ severity: 'error', summary: 'Achtung', detail: message }); }, alertSystemError(message) { - alert_add({ severity: 'error', summary: 'Systemfehler', detail: message}); + helperAppInstance.$refs.alert.add({ severity: 'error', summary: 'Systemfehler', detail: message}); }, confirmDelete() { return new Promise((resolve, reject) => { - confirm_require({ + helperAppInstance.$confirm.require({ + group: 'fhcAlertConfirm', header: 'Achtung', message: 'Möchten Sie sicher löschen?', acceptLabel: 'Löschen', @@ -278,7 +216,7 @@ export default { if (!sticky) options.life = 3000; - toast_add(options); + helperAppInstance.$refs.toast.add(options); }, alertMultiple(messageArray, severity = 'info', title = 'Info', sticky = false){ // Check, if array has only string values From 6b2150b06694fa48842593bf12d19971419acdeb Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 25 Oct 2023 12:48:00 +0200 Subject: [PATCH 23/86] Fixed: unknown 'fhcerror' to this --- public/js/plugin/FhcAlert.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/public/js/plugin/FhcAlert.js b/public/js/plugin/FhcAlert.js index 6ff54061d..ababd0d34 100644 --- a/public/js/plugin/FhcAlert.js +++ b/public/js/plugin/FhcAlert.js @@ -263,21 +263,23 @@ export default { handleSystemMessage(message) { // Message is string if (typeof message === 'string') - return fhcerror.alertWarning(message); + { + return this.alertWarning(message); + } // Message is array of strings if (Array.isArray(message)) { // If Array has only Strings if (message.every(msg => typeof msg === 'string')) - return message.every(fhcerror.alertWarning); + return message.every(this.alertWarning); // If Array has only Objects if (message.every(msg => typeof msg === 'object') && msg !== null) { return message.every(msg => { if (msg.hasOwnProperty('data') && msg.data.hasOwnProperty('retval')) { - fhcerror.alertWarning(JSON.stringify(msg.data.retval)); + this.alertWarning(JSON.stringify(msg.data.retval)); } else { - fhcerror.alertSystemError(JSON.stringify(msg)); + this.alertSystemError(JSON.stringify(msg)); } }); } @@ -287,15 +289,15 @@ export default { if (typeof message === 'object' && message !== null){ if (message.hasOwnProperty('data') && message.data.hasOwnProperty('retval')) { // NOTE(chris): changed: alertSystemError => alertWarning - fhcerror.alertWarning(JSON.stringify(message.data.retval)); + this.alertWarning(JSON.stringify(message.data.retval)); } else { - fhcerror.alertSystemError(JSON.stringify(message)); + this.alertSystemError(JSON.stringify(message)); } return; } // Fallback - fhcerror.alertSystemError('alertSystemError throws Generic Error\r\nError Controller Path: ' + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method); + this.alertSystemError('alertSystemError throws Generic Error\r\nError Controller Path: ' + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method); } }; app.config.globalProperties.$fhcAlert = $fhcAlert; From c6d82fe029bb99c73ece04232caec2bd4eaf0198 Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 25 Oct 2023 12:49:37 +0200 Subject: [PATCH 24/86] Minor style change of confirmDelete message --- public/js/plugin/FhcAlert.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/js/plugin/FhcAlert.js b/public/js/plugin/FhcAlert.js index ababd0d34..21238c676 100644 --- a/public/js/plugin/FhcAlert.js +++ b/public/js/plugin/FhcAlert.js @@ -195,11 +195,12 @@ export default { return new Promise((resolve, reject) => { helperAppInstance.$confirm.require({ group: 'fhcAlertConfirm', - header: 'Achtung', + header: ' ', message: 'Möchten Sie sicher löschen?', acceptLabel: 'Löschen', acceptClass: 'btn btn-danger', rejectLabel: 'Abbrechen', + acceptIcon: 'fa fa-xmark', rejectClass: 'btn btn-outline-secondary', accept() { resolve(true); From fbb00be7cda562895ac7d4041a40911067f9d16a Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 25 Oct 2023 12:55:35 +0200 Subject: [PATCH 25/86] Added slot 'search' to Filterwidget.js Slot to inject a autoselect / inputfield to search tabulator, if tabulator should stay empty until search results are provided. (Example: performance reasons if too many data; search for multiple at once) --- public/js/components/filter/Filter.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/js/components/filter/Filter.js b/public/js/components/filter/Filter.js index 16d8d4616..4e04ed4b4 100644 --- a/public/js/components/filter/Filter.js +++ b/public/js/components/filter/Filter.js @@ -580,7 +580,7 @@ export const CoreFilterCmpt = {
-
+
Mit {{selectedData.length}} ausgewählten: +
[ {{ filterName }} ] From 5a002c0f048c0c515d1abb24067514e7dc3480bb Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 31 Oct 2023 10:40:06 +0100 Subject: [PATCH 26/86] Minor change: Adapted mail-text --- public/js/plugin/FhcAlert.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/js/plugin/FhcAlert.js b/public/js/plugin/FhcAlert.js index 21238c676..e4aaddb73 100644 --- a/public/js/plugin/FhcAlert.js +++ b/public/js/plugin/FhcAlert.js @@ -106,7 +106,7 @@ const helperApp = Vue.createApp({ let subject = 'Meldung%20Systemfehler'; let body = ` Danke, dass Sie uns den Fehler melden. %0D%0A %0D%0A - Bitte beschreiben Sie uns ausführlich das Problem.%0D%0A + Bitte hängen Sie ein screenshot des Fehlers an und beschreiben Sie uns ausführlich das Problem.%0D%0A Bsp: Ich habe X ausgewählt und Y angelegt. Beim Speichern erhielt ich die Fehlermeldung. [Optional: Ich habe den Browser Z verwendet.]%0D%0A -----------------------------------------------------------------------------------------------------------------------------------%0D%0A PROBLEM: ... %0D%0A %0D%0A %0D%0A From c494dd1cdc938c9338b70dcfb78161f8a1d354f7 Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 31 Oct 2023 10:41:00 +0100 Subject: [PATCH 27/86] Added handleFormErrors- and resetFormErrors method to FhcAlert Plugin --- public/js/plugin/FhcAlert.js | 59 ++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/public/js/plugin/FhcAlert.js b/public/js/plugin/FhcAlert.js index e4aaddb73..d07ed0d47 100644 --- a/public/js/plugin/FhcAlert.js +++ b/public/js/plugin/FhcAlert.js @@ -299,6 +299,65 @@ export default { // Fallback this.alertSystemError('alertSystemError throws Generic Error\r\nError Controller Path: ' + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method); + }, + handleFormErrors(errors, formRef){ + // Reset previous error messages, if present + this.resetFormErrors(formRef); + + // If errors is object + if (typeof errors === 'object' && !Array.isArray(errors) && errors !== null) + { + // Loop through errors + for (let key in errors) { + + let input = formRef.querySelector('[name="' + key + '"]'); + + // If key is an input field name, display error above field + if (input) { + input.classList.add("is-invalid"); + input.classList.add("form-control"); + + const feedback = document.createElement("div"); + feedback.innerHTML = errors[key]; + feedback.classList.add("invalid-feedback"); + + input.after(feedback); + } + // ...else display error on top of the form + else { + const feedback = document.createElement("div"); + feedback.classList.add("d-flex"); + feedback.classList.add("align-items-center"); + feedback.classList.add("alert"); + feedback.classList.add("alert-danger"); + feedback.innerHTML = errors[key]; + + formRef.prepend(feedback); + } + } + } + // else, display on top of the form + else { + const feedback = document.createElement("div"); + feedback.classList.add("d-flex"); + feedback.classList.add("align-items-center"); + feedback.classList.add("alert"); + feedback.classList.add("alert-danger"); + feedback.innerHTML = errors; + + formRef.prepend(feedback); + } + }, + resetFormErrors(formRef){ + // Remove all errors above input fields + Array.from(formRef.getElementsByClassName('is-invalid')).forEach(el => el.classList.remove('is-invalid')); + Array.from(formRef.getElementsByClassName('invalid-feedback')).forEach(el => el.remove()); + + // Check if there is a prepended alert-danger div, and remove it if it exists + const prependedAlert = formRef.querySelector('.alert.alert-danger'); + if (prependedAlert) { + prependedAlert.remove(); + } } }; app.config.globalProperties.$fhcAlert = $fhcAlert; From 6140e15139e56765f41414e16a1f9fa79d0e80e1 Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 13 Feb 2024 14:50:26 +0100 Subject: [PATCH 28/86] Removed unused tabulatorAdditionalColumns property. Instead additional cols like 'action buttons' are now checked by index. --- public/js/components/filter/Filter.js | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/public/js/components/filter/Filter.js b/public/js/components/filter/Filter.js index efb24fb57..69b64d383 100644 --- a/public/js/components/filter/Filter.js +++ b/public/js/components/filter/Filter.js @@ -55,8 +55,6 @@ export const CoreFilterCmpt = { }, tabulatorOptions: Object, tabulatorEvents: Array, - // TODO check to remove - tabulatorAdditionalColumns: Array, tableOnly: Boolean, reload: Boolean, download: { @@ -141,15 +139,12 @@ export const CoreFilterCmpt = { for (let col of columns) { // If the column has to be displayed or not - col.visible = selectedFields.indexOf(col.field) >= 0; - // TODO additionalCols wieder löschen? - // if (col.formatter == 'rowSelection') - // col.visible = true; - if ( - col.formatter == 'rowSelection' - || (this.tabulatorAdditionalColumns && this.tabulatorAdditionalColumns.indexOf(col.field) >= 0) - ) + /* fields.indexOf(col.field) == -1; ensures displaying formatter colums + e.g. column with rowSelection checkboxes or with custom formatted action buttons */ + col.visible = selectedFields.indexOf(col.field) >= 0 || fields.indexOf(col.field) == -1; + if (col.formatter == 'rowSelection') + col.visible = true; if (col.hasOwnProperty('resizable')) col.resizable = col.visible; From 8f81426fa4e7d1c32c94183ff72dbd9e45d0b72d Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 13 Feb 2024 14:54:42 +0100 Subject: [PATCH 29/86] Corrected error when using alertMultiple and handleSystemMessage --- public/js/plugin/FhcAlert.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/public/js/plugin/FhcAlert.js b/public/js/plugin/FhcAlert.js index 079039aed..307064d76 100644 --- a/public/js/plugin/FhcAlert.js +++ b/public/js/plugin/FhcAlert.js @@ -237,7 +237,7 @@ export default { alertMultiple(messageArray, severity = 'info', title = 'Info', sticky = false){ // Check, if array has only string values if (messageArray.every(message => typeof message === 'string')) { - messageArray.every(message => this.alertDefault(severity, title, message, sticky)); + messageArray.forEach(message => this.alertDefault(severity, title, message, sticky)); return true; } return false; @@ -281,21 +281,24 @@ export default { handleSystemMessage(message) { // Message is string if (typeof message === 'string') - return fhcerror.alertWarning(message); + return $fhcAlert.alertWarning(message); // Message is array of strings if (Array.isArray(message)) { // If Array has only Strings if (message.every(msg => typeof msg === 'string')) - return message.every(fhcerror.alertWarning); + return message.every($fhcAlert.alertWarning); // If Array has only Objects if (message.every(msg => typeof msg === 'object') && msg !== null) { return message.every(msg => { if (msg.hasOwnProperty('data') && msg.data.hasOwnProperty('retval')) { - fhcerror.alertWarning(JSON.stringify(msg.data.retval)); + $fhcAlert.alertWarning(JSON.stringify(msg.data.retval)); } else { - fhcerror.alertSystemError(JSON.stringify(msg)); + console.log('FhcAlert systemError'); + console.log(msg); + console.log(JSON.stringify(msg)); + $fhcAlert.alertSystemError(JSON.stringify(msg)); } }); } @@ -305,15 +308,15 @@ export default { if (typeof message === 'object' && message !== null){ if (message.hasOwnProperty('data') && message.data.hasOwnProperty('retval')) { // NOTE(chris): changed: alertSystemError => alertWarning - fhcerror.alertWarning(JSON.stringify(message.data.retval)); + $fhcAlert.alertWarning(JSON.stringify(message.data.retval)); } else { - fhcerror.alertSystemError(JSON.stringify(message)); + $fhcAlert.alertSystemError(JSON.stringify(message)); } return; } // Fallback - fhcerror.alertSystemError('alertSystemError throws Generic Error\r\nError Controller Path: ' + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method); + $fhcAlert.alertSystemError('alertSystemError throws Generic Error\r\nError Controller Path: ' + FHC_JS_DATA_STORAGE_OBJECT.called_path + '/' + FHC_JS_DATA_STORAGE_OBJECT.called_method); }, resetFormValidation(form) { const event = new Event('fhc-form-reset'); From 7a6d095b780e426bc3fefda216317d8a740e6c2e Mon Sep 17 00:00:00 2001 From: Werner Masik Date: Thu, 29 Feb 2024 17:09:59 +0100 Subject: [PATCH 30/86] create db tables for fristenmanagement --- .../dbupdate_3.4/37107_fristenmanagement.php | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 system/dbupdate_3.4/37107_fristenmanagement.php diff --git a/system/dbupdate_3.4/37107_fristenmanagement.php b/system/dbupdate_3.4/37107_fristenmanagement.php new file mode 100644 index 000000000..84b828008 --- /dev/null +++ b/system/dbupdate_3.4/37107_fristenmanagement.php @@ -0,0 +1,62 @@ +db_query("SELECT * FROM information_schema.tables WHERE table_name='tbl_dienstverhaeltnis' AND table_schema='hr'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = " + CREATE TABLE IF NOT EXISTS hr.tbl_frist ( + frist_id bigserial NOT NULL, + mitarbeiter_uid character varying(32) NOT NULL, + ereignis_kurzbz character varying(32) NOT NULL, + bezeichnung varchar(255), + datum date, + status_kurzbz character varying(32) NOT NULL, + parameter jsonb NOT NULL, + insertvon character varying(32) NOT NULL, + insertamum timestamp without time zone DEFAULT now() NOT NULL, + updatevon character varying(32), + updateamum timestamp without time zone, + CONSTRAINT tbl_frist_pkey PRIMARY KEY (frist_id) + ); + + CREATE TABLE IF NOT EXISTS hr.tbl_frist_ereignis ( + ereignis_kurzbz character varying(32) NOT NULL, + bezeichnung varchar(32) NOT NULL, + manuell boolean DEFAULT FALSE, + CONSTRAINT tbl_ereignis_pkey PRIMARY KEY (ereignis_kurzbz) + ); + + COMMENT ON TABLE hr.tbl_frist_status IS E'Key-Table of fristen (deadline) events'; + + CREATE TABLE IF NOT EXISTS hr.tbl_frist_status + status_kurzbz character varying(32) NOT NULL, + bezeichnung varchar(32), + CONSTRAINT tbl_frist_status_pk PRIMARY KEY (status_kurzbz) + ); + + COMMENT ON TABLE hr.tbl_frist_status IS E'Key-Table of fristen status (new, done)'; + + ALTER TABLE hr.tbl_frist ADD CONSTRAINT hr.tbl_frist_mitarbeiter_uid_fk FOREIGN KEY (mitarbeiter_uid) + REFERENCES public.tbl_mitarbeiter (mitarbeiter_uid) MATCH FULL + ON DELETE SET NULL ON UPDATE CASCADE; + + ALTER TABLE hr.tbl_frist ADD CONSTRAINT hr.tbl_frist_ereignis_kurzbz_fk FOREIGN KEY (ereignis_kurzbz) + REFERENCES hr.tbl_frist_ereignis (ereignis_kurzbz) MATCH FULL + ON DELETE SET NULL ON UPDATE CASCADE; + + ALTER TABLE hr.tbl_frist ADD CONSTRAINT hr.tbl_frist_status_kurzbz_fk FOREIGN KEY (status_kurzbz) + REFERENCES hr.tbl_frist_status (status_kurzbz) MATCH FULL + ON DELETE SET NULL ON UPDATE CASCADE; + + + + "; + + if (! $db->db_query($qry)) + echo 'Fristenmanagement: ' . $db->db_last_error() . '
'; + else + echo 'Fristenmanagementtabellen wurden neu erstellt'; + } +} From c60f7ed8b0e467644299be9233cf8e8adee1cf3a Mon Sep 17 00:00:00 2001 From: Werner Masik Date: Fri, 1 Mar 2024 15:43:15 +0100 Subject: [PATCH 31/86] dbUpdate for fristenmanagement completed --- system/dbupdate_3.4.php | 4 ++++ .../dbupdate_3.4/37107_fristenmanagement.php | 20 ++++++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index c8669de28..d32185c6e 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -49,6 +49,7 @@ require_once('dbupdate_3.4/30181_tabelle_anrechnung_neue_attribute_fuer_begruend require_once('dbupdate_3.4/29529_infocenter_anpassungen.php'); require_once('dbupdate_3.4/29835_uhstat1_erfassung_der_uhstat1_daten_ueber_das_bewerbungstool.php'); require_once('dbupdate_3.4/33714_erhoehter_studienbeitrag_fuer_drittsaatenangehoerig.php'); +require_once('dbupdate_3.4/37107_fristenmanagement.php'); // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen @@ -176,6 +177,9 @@ $tabellen=array( "hr.tbl_gehaltsbestandteil" => array("gehaltsbestandteil_id","dienstverhaeltnis_id","vertragsbestandteil_id","gehaltstyp_kurzbz","von","bis","anmerkung","grundbetrag","betrag_valorisiert","valorisierungssperre","insertamum", "insertvon","updateamum","updatevon","valorisierung","auszahlungen"), "hr.tbl_gehaltshistorie" => array("gehaltshistorie_id", "datum","betrag","gehaltsbestandteil_id","mitarbeiter_uid"), "hr.tbl_gehaltstyp" => array("gehaltstyp_kurzbz","bezeichnung","valorisierung","sort","aktiv"), + "hr.tbl_frist" => array("frist_id","mitarbeiter_uid","ereignis_kurzbz","bezeichnung","datum","status_kurzbz","parameter","insertvon","insertamum","updatevon","updateamum"), + "hr.tbl_frist_ereignis" => array("ereignis_kurzbz","bezeichnung","manuell"), + "hr.tbl_frist_status" => array("status_kurzbz", "bezeichnung"), "lehre.tbl_abschlussbeurteilung" => array("abschlussbeurteilung_kurzbz","bezeichnung","bezeichnung_english","sort"), "lehre.tbl_abschlusspruefung" => array("abschlusspruefung_id","student_uid","vorsitz","pruefer1","pruefer2","pruefer3","abschlussbeurteilung_kurzbz","akadgrad_id","pruefungstyp_kurzbz","datum","uhrzeit","sponsion","anmerkung","updateamum","updatevon","insertamum","insertvon","ext_id","note","protokoll","endezeit","pruefungsantritt_kurzbz","freigabedatum"), "lehre.tbl_abschlusspruefung_antritt" => array("pruefungsantritt_kurzbz","bezeichnung","bezeichnung_english","sort"), diff --git a/system/dbupdate_3.4/37107_fristenmanagement.php b/system/dbupdate_3.4/37107_fristenmanagement.php index 84b828008..678f41d67 100644 --- a/system/dbupdate_3.4/37107_fristenmanagement.php +++ b/system/dbupdate_3.4/37107_fristenmanagement.php @@ -28,9 +28,9 @@ if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table CONSTRAINT tbl_ereignis_pkey PRIMARY KEY (ereignis_kurzbz) ); - COMMENT ON TABLE hr.tbl_frist_status IS E'Key-Table of fristen (deadline) events'; + COMMENT ON TABLE hr.tbl_frist_ereignis IS E'Key-Table of fristen (deadline) events'; - CREATE TABLE IF NOT EXISTS hr.tbl_frist_status + CREATE TABLE IF NOT EXISTS hr.tbl_frist_status ( status_kurzbz character varying(32) NOT NULL, bezeichnung varchar(32), CONSTRAINT tbl_frist_status_pk PRIMARY KEY (status_kurzbz) @@ -38,18 +38,28 @@ if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table COMMENT ON TABLE hr.tbl_frist_status IS E'Key-Table of fristen status (new, done)'; - ALTER TABLE hr.tbl_frist ADD CONSTRAINT hr.tbl_frist_mitarbeiter_uid_fk FOREIGN KEY (mitarbeiter_uid) + ALTER TABLE hr.tbl_frist ADD CONSTRAINT tbl_frist_mitarbeiter_uid_fk FOREIGN KEY (mitarbeiter_uid) REFERENCES public.tbl_mitarbeiter (mitarbeiter_uid) MATCH FULL ON DELETE SET NULL ON UPDATE CASCADE; - ALTER TABLE hr.tbl_frist ADD CONSTRAINT hr.tbl_frist_ereignis_kurzbz_fk FOREIGN KEY (ereignis_kurzbz) + ALTER TABLE hr.tbl_frist ADD CONSTRAINT tbl_frist_ereignis_kurzbz_fk FOREIGN KEY (ereignis_kurzbz) REFERENCES hr.tbl_frist_ereignis (ereignis_kurzbz) MATCH FULL ON DELETE SET NULL ON UPDATE CASCADE; - ALTER TABLE hr.tbl_frist ADD CONSTRAINT hr.tbl_frist_status_kurzbz_fk FOREIGN KEY (status_kurzbz) + ALTER TABLE hr.tbl_frist ADD CONSTRAINT tbl_frist_status_kurzbz_fk FOREIGN KEY (status_kurzbz) REFERENCES hr.tbl_frist_status (status_kurzbz) MATCH FULL ON DELETE SET NULL ON UPDATE CASCADE; + GRANT SELECT, UPDATE, INSERT, DELETE ON hr.tbl_frist TO vilesci; + GRANT SELECT, UPDATE, INSERT, DELETE ON hr.tbl_frist_status TO vilesci; + GRANT SELECT, UPDATE, INSERT, DELETE ON hr.tbl_frist_ereignis TO vilesci; + + INSERT INTO hr.tbl_frist_status(status_kurzbz, bezeichnung) VALUES('neu','Neu'); + INSERT INTO hr.tbl_frist_status(status_kurzbz, bezeichnung) VALUES('erledigt','Erledigt'); + + INSERT INTO hr.tbl_frist_ereignis(ereignis_kurzbz, bezeichnung) VALUES('dv_beginn','DV Beginn'); + INSERT INTO hr.tbl_frist_ereignis(ereignis_kurzbz, bezeichnung) VALUES('dv_ende','DV Ende'); + "; From 77666e5210d7616453bd69390b5a2183f4b169c0 Mon Sep 17 00:00:00 2001 From: Werner Masik Date: Wed, 6 Mar 2024 08:27:39 +0100 Subject: [PATCH 32/86] added column verantwortlich_uid --- system/dbupdate_3.4/37107_fristenmanagement.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/system/dbupdate_3.4/37107_fristenmanagement.php b/system/dbupdate_3.4/37107_fristenmanagement.php index 678f41d67..d63bae80d 100644 --- a/system/dbupdate_3.4/37107_fristenmanagement.php +++ b/system/dbupdate_3.4/37107_fristenmanagement.php @@ -8,7 +8,8 @@ if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table $qry = " CREATE TABLE IF NOT EXISTS hr.tbl_frist ( frist_id bigserial NOT NULL, - mitarbeiter_uid character varying(32) NOT NULL, + mitarbeiter_uid character varying(32), + verantwortlich_uid character varying(32), ereignis_kurzbz character varying(32) NOT NULL, bezeichnung varchar(255), datum date, @@ -42,6 +43,10 @@ if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table REFERENCES public.tbl_mitarbeiter (mitarbeiter_uid) MATCH FULL ON DELETE SET NULL ON UPDATE CASCADE; + ALTER TABLE hr.tbl_frist ADD CONSTRAINT tbl_frist_verantwortlich_uid_fk FOREIGN KEY (verantwortlich_uid) + REFERENCES public.tbl_mitarbeiter (mitarbeiter_uid) MATCH FULL + ON DELETE SET NULL ON UPDATE CASCADE; + ALTER TABLE hr.tbl_frist ADD CONSTRAINT tbl_frist_ereignis_kurzbz_fk FOREIGN KEY (ereignis_kurzbz) REFERENCES hr.tbl_frist_ereignis (ereignis_kurzbz) MATCH FULL ON DELETE SET NULL ON UPDATE CASCADE; @@ -55,6 +60,7 @@ if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table GRANT SELECT, UPDATE, INSERT, DELETE ON hr.tbl_frist_ereignis TO vilesci; INSERT INTO hr.tbl_frist_status(status_kurzbz, bezeichnung) VALUES('neu','Neu'); + INSERT INTO hr.tbl_frist_status(status_kurzbz, bezeichnung) VALUES('in_bearbeitung','In Bearbeitung'); INSERT INTO hr.tbl_frist_status(status_kurzbz, bezeichnung) VALUES('erledigt','Erledigt'); INSERT INTO hr.tbl_frist_ereignis(ereignis_kurzbz, bezeichnung) VALUES('dv_beginn','DV Beginn'); From e28627a676d78bfc25ba0b82a55db1c5e9deddb7 Mon Sep 17 00:00:00 2001 From: Werner Masik Date: Tue, 12 Mar 2024 17:34:13 +0100 Subject: [PATCH 33/86] removed verantwortlich column from tbl_frist --- system/dbupdate_3.4/37107_fristenmanagement.php | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/system/dbupdate_3.4/37107_fristenmanagement.php b/system/dbupdate_3.4/37107_fristenmanagement.php index d63bae80d..68811fd18 100644 --- a/system/dbupdate_3.4/37107_fristenmanagement.php +++ b/system/dbupdate_3.4/37107_fristenmanagement.php @@ -1,15 +1,14 @@ db_query("SELECT * FROM information_schema.tables WHERE table_name='tbl_dienstverhaeltnis' AND table_schema='hr'")) +if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table_name='tbl_frist' AND table_schema='hr'")) { if ($db->db_num_rows($result) == 0) { $qry = " CREATE TABLE IF NOT EXISTS hr.tbl_frist ( frist_id bigserial NOT NULL, - mitarbeiter_uid character varying(32), - verantwortlich_uid character varying(32), + mitarbeiter_uid character varying(32), ereignis_kurzbz character varying(32) NOT NULL, bezeichnung varchar(255), datum date, @@ -43,10 +42,6 @@ if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table REFERENCES public.tbl_mitarbeiter (mitarbeiter_uid) MATCH FULL ON DELETE SET NULL ON UPDATE CASCADE; - ALTER TABLE hr.tbl_frist ADD CONSTRAINT tbl_frist_verantwortlich_uid_fk FOREIGN KEY (verantwortlich_uid) - REFERENCES public.tbl_mitarbeiter (mitarbeiter_uid) MATCH FULL - ON DELETE SET NULL ON UPDATE CASCADE; - ALTER TABLE hr.tbl_frist ADD CONSTRAINT tbl_frist_ereignis_kurzbz_fk FOREIGN KEY (ereignis_kurzbz) REFERENCES hr.tbl_frist_ereignis (ereignis_kurzbz) MATCH FULL ON DELETE SET NULL ON UPDATE CASCADE; From 426a43955247d8b7e3ad1ae09881186886b75608 Mon Sep 17 00:00:00 2001 From: Werner Masik Date: Wed, 20 Mar 2024 00:13:55 +0100 Subject: [PATCH 34/86] added sort column to frist --- .../dbupdate_3.4/37107_fristenmanagement.php | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/system/dbupdate_3.4/37107_fristenmanagement.php b/system/dbupdate_3.4/37107_fristenmanagement.php index 68811fd18..eeb32380e 100644 --- a/system/dbupdate_3.4/37107_fristenmanagement.php +++ b/system/dbupdate_3.4/37107_fristenmanagement.php @@ -25,6 +25,7 @@ if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table ereignis_kurzbz character varying(32) NOT NULL, bezeichnung varchar(32) NOT NULL, manuell boolean DEFAULT FALSE, + sort smallint, CONSTRAINT tbl_ereignis_pkey PRIMARY KEY (ereignis_kurzbz) ); @@ -33,6 +34,7 @@ if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table CREATE TABLE IF NOT EXISTS hr.tbl_frist_status ( status_kurzbz character varying(32) NOT NULL, bezeichnung varchar(32), + sort smallint, CONSTRAINT tbl_frist_status_pk PRIMARY KEY (status_kurzbz) ); @@ -54,13 +56,19 @@ if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table GRANT SELECT, UPDATE, INSERT, DELETE ON hr.tbl_frist_status TO vilesci; GRANT SELECT, UPDATE, INSERT, DELETE ON hr.tbl_frist_ereignis TO vilesci; - INSERT INTO hr.tbl_frist_status(status_kurzbz, bezeichnung) VALUES('neu','Neu'); - INSERT INTO hr.tbl_frist_status(status_kurzbz, bezeichnung) VALUES('in_bearbeitung','In Bearbeitung'); - INSERT INTO hr.tbl_frist_status(status_kurzbz, bezeichnung) VALUES('erledigt','Erledigt'); - - INSERT INTO hr.tbl_frist_ereignis(ereignis_kurzbz, bezeichnung) VALUES('dv_beginn','DV Beginn'); - INSERT INTO hr.tbl_frist_ereignis(ereignis_kurzbz, bezeichnung) VALUES('dv_ende','DV Ende'); + INSERT INTO hr.tbl_frist_status(status_kurzbz, bezeichnung, sort) VALUES('neu','Neu', 1); + INSERT INTO hr.tbl_frist_status(status_kurzbz, bezeichnung, sort) VALUES('in_bearbeitung','In Bearbeitung', 2); + INSERT INTO hr.tbl_frist_status(status_kurzbz, bezeichnung, sort) VALUES('erledigt','Erledigt', 3); + INSERT INTO hr.tbl_frist_ereignis(ereignis_kurzbz, bezeichnung, sort) VALUES('dv_beginn','DV Beginn', 1); + INSERT INTO hr.tbl_frist_ereignis(ereignis_kurzbz, bezeichnung, sort) VALUES('dv_ende','DV Ende', 2); + INSERT INTO hr.tbl_frist_ereignis(ereignis_kurzbz, bezeichnung, sort) VALUES('stunden_beginn','Stunden Beginn', 3); + INSERT INTO hr.tbl_frist_ereignis(ereignis_kurzbz, bezeichnung, sort) VALUES('stunden_ende','Stunden Ende', 4); + INSERT INTO hr.tbl_frist_ereignis(ereignis_kurzbz, bezeichnung, sort) VALUES('karenz_beginn','Karenz Beginn', 5); + INSERT INTO hr.tbl_frist_ereignis(ereignis_kurzbz, bezeichnung, sort) VALUES('karenz_ende','Karenz Ende', 6); + INSERT INTO hr.tbl_frist_ereignis(ereignis_kurzbz, bezeichnung, sort) VALUES('zeitaufzeichnung_beginn','Zeitaufzeichnung Beginn', 7); + INSERT INTO hr.tbl_frist_ereignis(ereignis_kurzbz, bezeichnung, sort) VALUES('zeitaufzeichnung_ende','Zeitaufzeichnung Ende', 8); + INSERT INTO hr.tbl_frist_ereignis (ereignis_kurzbz , bezeichnung, manuell, sort) VALUES('manuell','Manuell', true, 9); "; From 10e57dae2de4ec405964059ef33b8792931f8307 Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 20 Mar 2024 09:38:08 +0100 Subject: [PATCH 35/86] Adapted style of .tabulator-cell .btn to be squared and increased padding --- public/css/Tabulator5.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/css/Tabulator5.css b/public/css/Tabulator5.css index b755f0d76..49e15ab37 100644 --- a/public/css/Tabulator5.css +++ b/public/css/Tabulator5.css @@ -40,7 +40,7 @@ } .tabulator-cell .btn { - padding: 0 .5rem; - max-height: 22px; - min-width: 30px; + padding: 0 .7rem; + min-height: 25px; + min-width: 25px; } From 842e62b0dd4ae5173f97a816e9fc2d610958ff92 Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 20 Mar 2024 09:42:23 +0100 Subject: [PATCH 36/86] Fixed Input.js error causing to keep last entries' first letter in form inputs, even when formdata was emptied --- public/js/components/Form/Input.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/js/components/Form/Input.js b/public/js/components/Form/Input.js index 11ad357a5..b4f87f501 100644 --- a/public/js/components/Form/Input.js +++ b/public/js/components/Form/Input.js @@ -160,12 +160,12 @@ export default { }, modelValueCmp: { get() { - if (this.$attrs.modelValue === undefined) + if (!this.$attrs.hasOwnProperty('modelValue')) return this.modelValueDummy; return this.$attrs.modelValue; }, set(v) { - if (this.$attrs.modelValue === undefined) + if (!this.$attrs.hasOwnProperty('modelValue')) this.modelValueDummy = v; this.$emit('update:modelValue', v); } From 6eae83f4eba76848ca63eae121de16d43d72dc43 Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 20 Mar 2024 09:45:25 +0100 Subject: [PATCH 37/86] Added primevues autocomplete slot template to Input.js Now, when using the Input Component with type 'autocomplete', it is possible to add also primevues built in slot templates there --- public/js/components/Form/Input.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/public/js/components/Form/Input.js b/public/js/components/Form/Input.js index b4f87f501..ccd7e856d 100644 --- a/public/js/components/Form/Input.js +++ b/public/js/components/Form/Input.js @@ -242,6 +242,7 @@ export default { + + + + + + + + + + + + Date: Wed, 20 Mar 2024 09:52:26 +0100 Subject: [PATCH 38/86] Added label property 'class' to Input.js ...which fixes style issues when creating input-group buttons using the Input.js component --- public/js/components/Form/Input.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/js/components/Form/Input.js b/public/js/components/Form/Input.js index ccd7e856d..0940701a5 100644 --- a/public/js/components/Form/Input.js +++ b/public/js/components/Form/Input.js @@ -236,7 +236,7 @@ export default { }, template: ` - + '; - sort($projekt->result); $projektfound = false; foreach ($projekt->result as $row_projekt) { @@ -1976,7 +1975,6 @@ function getDataForProjectOverviewCSV($user) } } - sort($csvData); //headers schreiben $header = array('PROJEKT', 'PROJEKT KURZBEZEICHNUNG', 'PROJEKTPHASE', 'PROJEKTPHASEN ID', 'START', 'PROJEKT ENDE'); diff --git a/include/projekt.class.php b/include/projekt.class.php index 389d7140c..1dd7f60fb 100644 --- a/include/projekt.class.php +++ b/include/projekt.class.php @@ -413,6 +413,8 @@ class projekt extends basis_db AND mitarbeiter_uid=" . $this->db_add_param($mitarbeiter_uid); } + $qry .= ' ORDER BY titel'; + if ($result = $this->db_query($qry)) { while ($row = $this->db_fetch_object($result)) From cfe73b361effaac44c201a3f447c0750e83a5056 Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 3 Apr 2024 14:35:27 +0200 Subject: [PATCH 45/86] Sorted project phases by start date and bezeichnung in Zeitaufzeichnung Sorted within dropdown --- include/projektphase.class.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/include/projektphase.class.php b/include/projektphase.class.php index c1cd8322c..c7b224861 100644 --- a/include/projektphase.class.php +++ b/include/projektphase.class.php @@ -190,7 +190,7 @@ class projektphase extends basis_db if(!is_null($foreignkey)) $qry .= " and projektphase_fk is NULL"; - $qry .= " ORDER BY start, projektphase_fk DESC;"; + $qry .= " ORDER BY tbl_projektphase.start, tbl_projektphase.bezeichnung, projektphase_fk DESC;"; if($this->db_query($qry)) { @@ -794,7 +794,8 @@ class projektphase extends basis_db ) ) AND mitarbeiter_uid = ".$this->db_add_param($mitarbeiter_uid)." - AND tbl_projekt.projekt_kurzbz = ".$this->db_add_param($projekt_kurzbz); + AND tbl_projekt.projekt_kurzbz = ".$this->db_add_param($projekt_kurzbz). " + ORDER BY tbl_projektphase.start, tbl_projektphase.bezeichnung"; if($result = $this->db_query($qry)) { From 2132fe76ae556d1c0769e794071ba9be966aa318 Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Wed, 3 Apr 2024 17:39:00 +0200 Subject: [PATCH 46/86] added Plausicheck: students in DUAL Studiengang should have set boolean value dual to true, plausicheck bugfixes (loading model, remove unnecessary property) --- .../controllers/jobs/IssueResolver.php | 1 + .../issues/PlausicheckDefinitionLib.php | 3 +- .../issues/PlausicheckProducerLib.php | 3 +- .../DualesStudiumOhneMarkierung.php | 143 ++++++++++++++++++ .../InaktiverStudentAktiverStatus.php | 1 + .../resolvers/CORE_STUDENTSTATUS_0016.php | 36 +++++ system/fehlerupdate.php | 8 + 7 files changed, 192 insertions(+), 3 deletions(-) create mode 100644 application/libraries/issues/plausichecks/DualesStudiumOhneMarkierung.php create mode 100644 application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0016.php diff --git a/application/controllers/jobs/IssueResolver.php b/application/controllers/jobs/IssueResolver.php index cf97b7f68..be66a6b23 100755 --- a/application/controllers/jobs/IssueResolver.php +++ b/application/controllers/jobs/IssueResolver.php @@ -45,6 +45,7 @@ class IssueResolver extends IssueResolver_Controller 'CORE_STUDENTSTATUS_0013' => 'CORE_STUDENTSTATUS_0013', 'CORE_STUDENTSTATUS_0014' => 'CORE_STUDENTSTATUS_0014', 'CORE_STUDENTSTATUS_0015' => 'CORE_STUDENTSTATUS_0015', + 'CORE_STUDENTSTATUS_0016' => 'CORE_STUDENTSTATUS_0016', 'CORE_PERSON_0001' => 'CORE_PERSON_0001', 'CORE_PERSON_0002' => 'CORE_PERSON_0002', 'CORE_PERSON_0003' => 'CORE_PERSON_0003', diff --git a/application/libraries/issues/PlausicheckDefinitionLib.php b/application/libraries/issues/PlausicheckDefinitionLib.php index cef28a736..b44a5ce19 100644 --- a/application/libraries/issues/PlausicheckDefinitionLib.php +++ b/application/libraries/issues/PlausicheckDefinitionLib.php @@ -33,7 +33,8 @@ class PlausicheckDefinitionLib 'PrestudentMischformOhneOrgform' => 'PrestudentMischformOhneOrgform', 'StgPrestudentUngleichStgStudienplan' => 'StgPrestudentUngleichStgStudienplan', 'StgPrestudentUngleichStgStudent' => 'StgPrestudentUngleichStgStudent', - 'StudentstatusNachAbbrecher' => 'StudentstatusNachAbbrecher' + 'StudentstatusNachAbbrecher' => 'StudentstatusNachAbbrecher', + 'DualesStudiumOhneMarkierung' => 'DualesStudiumOhneMarkierung' //'StudienplanUngueltig' => 'StudienplanUngueltig' ); diff --git a/application/libraries/issues/PlausicheckProducerLib.php b/application/libraries/issues/PlausicheckProducerLib.php index c32f1f863..3a51e2b1e 100644 --- a/application/libraries/issues/PlausicheckProducerLib.php +++ b/application/libraries/issues/PlausicheckProducerLib.php @@ -12,8 +12,7 @@ class PlausicheckProducerLib private $_ci; // ci instance private $_extensionName; // name of extension - private $_app; // name of application - private $_konfiguration = array(); // konfigratio parameters + private $_konfiguration = array(); // configuration parameters public function __construct($params = null) { diff --git a/application/libraries/issues/plausichecks/DualesStudiumOhneMarkierung.php b/application/libraries/issues/plausichecks/DualesStudiumOhneMarkierung.php new file mode 100644 index 000000000..3951f6d76 --- /dev/null +++ b/application/libraries/issues/plausichecks/DualesStudiumOhneMarkierung.php @@ -0,0 +1,143 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->getDualesStudiumOhneMarkierung( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + 'fehlertext_params' => array( + 'prestudent_id' => $prestudent->prestudent_id, + 'studienplan' => $prestudent->studienplan + ), + 'resolution_params' => array( + 'prestudent_id' => $prestudent->prestudent_id, + 'studiensemester_kurzbz' => $prestudent->studiensemester_kurzbz + ) + ); + } + } + + // return the results + return success($results); + } + + /** + * All prestudents in dual Studiengang should have set the dual flag to true. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getDualesStudiumOhneMarkierung( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + DISTINCT pre.person_id, pre.prestudent_id, + stpl.bezeichnung AS studienplan, + status.studiensemester_kurzbz, + status.ausbildungssemester, + stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_person USING(person_id) + JOIN lehre.tbl_studienplan stpl USING(studienplan_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN public.tbl_studiensemester sem USING(studiensemester_kurzbz) + WHERE + (stpl.orgform_kurzbz = 'DUA' OR status.orgform_kurzbz = 'DUA') + AND pre.dual = FALSE + AND status.studiensemester_kurzbz=? + AND pre.bismelden + AND stg.melderelevant + AND NOT EXISTS ( + SELECT 1 + FROM + public.tbl_prestudentstatus + JOIN lehre.tbl_studienplan USING(studienplan_id) + JOIN public.tbl_studiensemester USING(studiensemester_kurzbz) + WHERE + prestudent_id = pre.prestudent_id + AND + ( + -- if there is a newer non-dual status, dual has not to be set + ( + ( + tbl_studienplan.orgform_kurzbz <> stpl.orgform_kurzbz + OR status.orgform_kurzbz <> tbl_prestudentstatus.orgform_kurzbz + ) + AND + ( + tbl_studiensemester.ende::date > sem.ende::date + OR (tbl_studiensemester.ende::date = sem.ende::date AND tbl_prestudentstatus.datum::date > status.datum::date) + ) + ) + OR + -- exclude Abgewiesene - they are not reported + tbl_prestudentstatus.status_kurzbz = 'Abgewiesener' + ) + )"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php b/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php index dead2b1e7..59965e238 100644 --- a/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php +++ b/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php @@ -67,6 +67,7 @@ class InaktiverStudentAktiverStatus extends PlausiChecker $prestudent_id = null, $exkludierte_studiengang_kz = null ) { + $this->_ci->load->model('organisation/studiensemester_model', 'StudiensemesterModel'); $aktStudiensemesterRes = $this->_ci->StudiensemesterModel->getAkt(); if (isError($aktStudiensemesterRes)) return $aktStudiensemesterRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0016.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0016.php new file mode 100644 index 000000000..0bba1ddff --- /dev/null +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0016.php @@ -0,0 +1,36 @@ +_ci =& get_instance(); // get code igniter instance + + $this->_ci->load->library('issues/plausichecks/DualesStudiumOhneMarkierung'); + + // check if issue persists + $checkRes = $this->_ci->dualesstudiumohnemarkierung->getDualesStudiumOhneMarkierung( + $params['studiensemester_kurzbz'], + null, + $params['prestudent_id'] + ); + + if (isError($checkRes)) return $checkRes; + + if (hasData($checkRes)) + return success(false); // not resolved if issue is still present + else + return success(true); // resolved otherwise + } +} diff --git a/system/fehlerupdate.php b/system/fehlerupdate.php index f29323c7c..89446982d 100644 --- a/system/fehlerupdate.php +++ b/system/fehlerupdate.php @@ -285,6 +285,14 @@ $fehlerArr = array( 'fehlertyp_kurzbz' => 'error', 'app' => 'core' ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0016', + 'fehler_kurzbz' => 'DualesStudiumOhneMarkierung', + 'fehlercode_extern' => null, + 'fehlertext' => 'StudentIn in dualem Studiengang nicht als dual markiert (prestudent_id %s, Studienplan %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core' + ), array( 'fehlercode' => 'CORE_PERSON_0001', 'fehler_kurzbz' => 'GbDatumWeitZurueck', From f2ba0fd4694fb212fe3eb7293125aa7a61c0865f Mon Sep 17 00:00:00 2001 From: Werner Masik Date: Sun, 7 Apr 2024 00:33:25 +0200 Subject: [PATCH 47/86] update phrases and added events for fristenmanagement --- .../dbupdate_3.4/37107_fristenmanagement.php | 5 +- system/phrasesupdate.php | 202 +++++++++++++++++- 2 files changed, 205 insertions(+), 2 deletions(-) diff --git a/system/dbupdate_3.4/37107_fristenmanagement.php b/system/dbupdate_3.4/37107_fristenmanagement.php index c1b465107..68eda70b0 100644 --- a/system/dbupdate_3.4/37107_fristenmanagement.php +++ b/system/dbupdate_3.4/37107_fristenmanagement.php @@ -70,7 +70,10 @@ if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table INSERT INTO hr.tbl_frist_ereignis(ereignis_kurzbz, bezeichnung, sort) VALUES('zeitaufzeichnung_ende','Zeitaufzeichnung Ende', 8); INSERT INTO hr.tbl_frist_ereignis(ereignis_kurzbz, bezeichnung, sort) VALUES('befristung_beginn','Befristung Beginn', 9); INSERT INTO hr.tbl_frist_ereignis(ereignis_kurzbz, bezeichnung, sort) VALUES('befristung_ende','Befristung Ende', 10); - INSERT INTO hr.tbl_frist_ereignis (ereignis_kurzbz , bezeichnung, manuell, sort) VALUES('manuell','Manuell', true, 11); + INSERT INTO hr.tbl_frist_ereignis (ereignis_kurzbz , bezeichnung, manuell, sort) VALUES('manuell1','Manuell 1', true, 11); + INSERT INTO hr.tbl_frist_ereignis (ereignis_kurzbz , bezeichnung, manuell, sort) VALUES('manuell2','Manuell 2', true, 12); + INSERT INTO hr.tbl_frist_ereignis (ereignis_kurzbz , bezeichnung, manuell, sort) VALUES('manuell3','Manuell 3', true, 13); + INSERT INTO hr.tbl_frist_ereignis (ereignis_kurzbz , bezeichnung, manuell, sort) VALUES('manuell4','Manuell 4', true, 14); "; diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 631ca9627..52c0dd758 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -24074,7 +24074,207 @@ array( 'insertvon' => 'system' ) ) - ), + ), + array( + 'app' => 'personalverwaltung', + 'category' => 'fristenmanagement', + 'phrase' => 'frist', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Frist', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Deadline', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'personalverwaltung', + 'category' => 'fristenmanagement', + 'phrase' => 'todo', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'To Do', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'To Do', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'personalverwaltung', + 'category' => 'fristenmanagement', + 'phrase' => 'fristStatusGespeichert', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Status gespeichert.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Status saved.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'personalverwaltung', + 'category' => 'fristenmanagement', + 'phrase' => 'fristGespeichert', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Frist gespeichert.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Deadline saved.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'personalverwaltung', + 'category' => 'fristenmanagement', + 'phrase' => 'fristGeloescht', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Frist gelöscht.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Deadline deleted.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'personalverwaltung', + 'category' => 'fristenmanagement', + 'phrase' => 'fristenAktualisiert', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Fristen aktualisiert.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Deadlines updated.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'personalverwaltung', + 'category' => 'fristenmanagement', + 'phrase' => 'termin_frist', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Termin/Frist', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Date/Deadline', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'personalverwaltung', + 'category' => 'fristenmanagement', + 'phrase' => 'ereignis', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ereignis', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Event', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'personalverwaltung', + 'category' => 'fristenmanagement', + 'phrase' => 'status', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Status', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Status', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'personalverwaltung', + 'category' => 'fristenmanagement', + 'phrase' => 'mitarbeiterin', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'MitarbeiterIn', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Employee', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), // Personalverwaltung end array( 'app' => 'core', From 026a276c020486ad89913dcd24dcbf8971993ec4 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Tue, 9 Apr 2024 11:11:03 +0200 Subject: [PATCH 48/86] add grant on frist_id sequence --- system/dbupdate_3.4/37107_fristenmanagement.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/system/dbupdate_3.4/37107_fristenmanagement.php b/system/dbupdate_3.4/37107_fristenmanagement.php index 68eda70b0..ee023b13e 100644 --- a/system/dbupdate_3.4/37107_fristenmanagement.php +++ b/system/dbupdate_3.4/37107_fristenmanagement.php @@ -56,6 +56,8 @@ if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table GRANT SELECT, UPDATE, INSERT, DELETE ON hr.tbl_frist_status TO vilesci; GRANT SELECT, UPDATE, INSERT, DELETE ON hr.tbl_frist_ereignis TO vilesci; + GRANT USAGE ON hr.tbl_frist_frist_id_seq TO vilesci; + INSERT INTO hr.tbl_frist_status(status_kurzbz, bezeichnung, sort) VALUES('neu','Neu', 1); INSERT INTO hr.tbl_frist_status(status_kurzbz, bezeichnung, sort) VALUES('in_bearbeitung','In Bearbeitung', 2); INSERT INTO hr.tbl_frist_status(status_kurzbz, bezeichnung, sort) VALUES('erledigt','Erledigt', 3); From 56900e31dbb326acdbb3f961a6b02ed9fd9508c3 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Tue, 9 Apr 2024 15:08:32 +0200 Subject: [PATCH 49/86] add table hr.tbl_dvendegrund, add columns dvendegrund_kurzbz and dvendegrund_anmerkung to hr.tbl_dienstverhaeltnis --- system/dbupdate_3.4/28260_vertraege.php | 64 +++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/system/dbupdate_3.4/28260_vertraege.php b/system/dbupdate_3.4/28260_vertraege.php index 91a9e2cc9..73ff02608 100644 --- a/system/dbupdate_3.4/28260_vertraege.php +++ b/system/dbupdate_3.4/28260_vertraege.php @@ -440,3 +440,67 @@ if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table echo 'HR Schema und Vertagstabellen wurden neu erstellt'; } } + +if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table_name='tbl_dvendegrund' AND table_schema='hr'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = " + CREATE TABLE hr.tbl_dvendegrund ( + dvendegrund_kurzbz character varying(32) NOT NULL , + bezeichnung character varying(255) NOT NULL, + bezeichnung_mehrsprachig character varying(255)[] NOT NULL, + aktiv boolean DEFAULT true NOT NULL, + sort integer DEFAULT 1 NOT NULL, + PRIMARY KEY (dvendegrund_kurzbz), + CONSTRAINT tbl_dvendegrund_bezeichnung_key UNIQUE (bezeichnung) + ); + "; + if (! $db->db_query($qry)) + echo 'Vertraege: ' . $db->db_last_error() . '
'; + else + echo 'Tabelle tbl_dvendegrund wurde im HR Schema neu erstellt'; + } +} + +if ($result = $db->db_query("SELECT * FROM information_schema.columns WHERE column_name='dvendegrund_kurzbz' AND table_name='tbl_dienstverhaeltnis' AND table_schema='hr'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = " + ALTER TABLE + hr.tbl_dienstverhaeltnis + ADD COLUMN + dvendegrund_kurzbz character varying(255) + CONSTRAINT + tbl_dvendegrund_fk + REFERENCES + hr.tbl_dvendegrund(dvendegrund_kurzbz) + ON UPDATE + cascade + ON DELETE + restrict + "; + if (! $db->db_query($qry)) + echo 'Vertraege: ' . $db->db_last_error() . '
'; + else + echo 'Spalte dvendegrund_kurzbz wurde in hr.tbl_dienstverhaeltnis neu erstellt'; + } +} + +if ($result = $db->db_query("SELECT * FROM information_schema.columns WHERE column_name='dvendegrund_anmerkung' AND table_name='tbl_dienstverhaeltnis' AND table_schema='hr'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = " + ALTER TABLE + hr.tbl_dienstverhaeltnis + ADD COLUMN + dvendegrund_anmerkung character varying(255) + "; + if (! $db->db_query($qry)) + echo 'Vertraege: ' . $db->db_last_error() . '
'; + else + echo 'Spalte dvendegrund_anmerkung wurde in hr.tbl_dienstverhaeltnis neu erstellt'; + } +} \ No newline at end of file From a9818e1f63720838918f493a7cf002d4a8bec3d6 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Tue, 9 Apr 2024 15:27:47 +0200 Subject: [PATCH 50/86] add initial values to hr.tbl_dvendegrund --- system/dbupdate_3.4/28260_vertraege.php | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/system/dbupdate_3.4/28260_vertraege.php b/system/dbupdate_3.4/28260_vertraege.php index 73ff02608..8f1b81290 100644 --- a/system/dbupdate_3.4/28260_vertraege.php +++ b/system/dbupdate_3.4/28260_vertraege.php @@ -437,7 +437,7 @@ if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table if (! $db->db_query($qry)) echo 'Vertraege: ' . $db->db_last_error() . '
'; else - echo 'HR Schema und Vertagstabellen wurden neu erstellt'; + echo 'HR Schema und Vertagstabellen wurden neu erstellt
'; } } @@ -455,11 +455,20 @@ if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table PRIMARY KEY (dvendegrund_kurzbz), CONSTRAINT tbl_dvendegrund_bezeichnung_key UNIQUE (bezeichnung) ); + + INSERT INTO + hr.tbl_dvendegrund (dvendegrund_kurzbz, bezeichnung, bezeichnung_mehrsprachig) + VALUES + ('kuendigung_arbeitnehmer', 'Kündigung durch Arbeitnehmer', ARRAY['Kündigung durch Arbeitnehmer', 'Cancellation by Employee']), + ('kuendigung_arbeitgeber', 'Kündigung durch Arbeitgeber', ARRAY['Kündigung durch Arbeitgeber', 'Cancellation by Employer']), + ('entlassung', 'Entlassung', ARRAY['Entlassung', 'Dismissal']), + ('sonstige', 'Sonstige', ARRAY['Sonstige', 'Miscellaneous']), + ('einvernehmlich', 'Einvernehmliche Auflösung', ARRAY['Einvernehmliche Auflösung', 'Rescission']); "; if (! $db->db_query($qry)) echo 'Vertraege: ' . $db->db_last_error() . '
'; else - echo 'Tabelle tbl_dvendegrund wurde im HR Schema neu erstellt'; + echo 'Tabelle tbl_dvendegrund wurde im HR Schema neu erstellt
'; } } @@ -484,7 +493,7 @@ if ($result = $db->db_query("SELECT * FROM information_schema.columns WHERE colu if (! $db->db_query($qry)) echo 'Vertraege: ' . $db->db_last_error() . '
'; else - echo 'Spalte dvendegrund_kurzbz wurde in hr.tbl_dienstverhaeltnis neu erstellt'; + echo 'Spalte dvendegrund_kurzbz wurde in hr.tbl_dienstverhaeltnis neu erstellt
'; } } @@ -501,6 +510,6 @@ if ($result = $db->db_query("SELECT * FROM information_schema.columns WHERE colu if (! $db->db_query($qry)) echo 'Vertraege: ' . $db->db_last_error() . '
'; else - echo 'Spalte dvendegrund_anmerkung wurde in hr.tbl_dienstverhaeltnis neu erstellt'; + echo 'Spalte dvendegrund_anmerkung wurde in hr.tbl_dienstverhaeltnis neu erstellt
'; } } \ No newline at end of file From 1a1cd76bc4fb6f882c6d9eac527577badd93b8c5 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Tue, 9 Apr 2024 15:42:00 +0200 Subject: [PATCH 51/86] add grant on hr.tbl_dvendegrund to user vilesci --- system/dbupdate_3.4/28260_vertraege.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/system/dbupdate_3.4/28260_vertraege.php b/system/dbupdate_3.4/28260_vertraege.php index 8f1b81290..58a895483 100644 --- a/system/dbupdate_3.4/28260_vertraege.php +++ b/system/dbupdate_3.4/28260_vertraege.php @@ -455,7 +455,9 @@ if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table PRIMARY KEY (dvendegrund_kurzbz), CONSTRAINT tbl_dvendegrund_bezeichnung_key UNIQUE (bezeichnung) ); - + + GRANT SELECT, UPDATE, INSERT, DELETE ON hr.tbl_dvendegrund TO vilesci; + INSERT INTO hr.tbl_dvendegrund (dvendegrund_kurzbz, bezeichnung, bezeichnung_mehrsprachig) VALUES From e11dd21a1e43fe019772f72c7028049bd5fcb394 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Tue, 9 Apr 2024 16:35:00 +0200 Subject: [PATCH 52/86] add parameter dvendegrund_kurzbz and dvendegrund_anmerkung --- .../vertragsbestandteil/Dienstverhaeltnis.php | 33 ++++++++++++++++++- .../VertragsbestandteilLib.php | 10 +++++- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php b/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php index 309d3dfdc..07c417077 100644 --- a/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php +++ b/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php @@ -29,6 +29,9 @@ class Dienstverhaeltnis extends AbstractBestandteil { protected $updateamum; protected $updatevon; + protected $dvendegrund_kurzbz; + protected $dvendegrund_anmerkung; + public function __construct() { parent::__construct(); @@ -49,6 +52,8 @@ class Dienstverhaeltnis extends AbstractBestandteil { isset($data->insertvon) && $this->setInsertvon($data->insertvon); isset($data->updateamum) && $this->setUpdateamum($data->updateamum); isset($data->updatevon) && $this->setUpdatevon($data->updatevon); + isset($data->dvendegrund_kurzbz) && $this->setDvendegrund_kurzbz($data->dvendegrund_kurzbz); + isset($data->dvendegrund_anmerkung) && $this->setDvendegrund_anmerkung($data->dvendegrund_anmerkung); $this->fromdb = false; } @@ -64,7 +69,9 @@ class Dienstverhaeltnis extends AbstractBestandteil { 'insertamum' => $this->getInsertamum(), 'insertvon' => $this->getInsertvon(), 'updateamum' => $this->getUpdateamum(), - 'updatevon' => $this->getUpdatevon() + 'updatevon' => $this->getUpdatevon(), + 'dvendegrund_kurzbz' => $this->getDvendegrund_kurzbz(), + 'dvendegrund_anmerkung' => $this->getDvendegrund_anmerkung() ); $tmp = array_filter($tmp, function($k) { @@ -139,6 +146,16 @@ EOTXT; return $this->updatevon; } + public function getDvendegrund_kurzbz() + { + return $this->dvendegrund_kurzbz; + } + + public function getDvendegrund_anmerkung() + { + return $this->dvendegrund_anmerkung; + } + public function setDienstverhaeltnis_id($dienstverhaeltnis_id) { $this->markDirty('dienstverhaeltnis_id', $this->dienstverhaeltnis_id, $dienstverhaeltnis_id); @@ -214,6 +231,20 @@ EOTXT; return $this; } + public function setDvendegrund_kurzbz($dvendegrund_kurzbz) + { + $this->markDirty('dvendegrund_kurzbz', $this->dvendegrund_kurzbz, $dvendegrund_kurzbz); + $this->dvendegrund_kurzbz = $dvendegrund_kurzbz; + return $this; + } + + public function setDvendegrund_anmerkung($dvendegrund_anmerkung) + { + $this->markDirty('dvendegrund_anmerkung', $this->dvendegrund_anmerkung, $dvendegrund_anmerkung); + $this->dvendegrund_anmerkung = $dvendegrund_anmerkung; + return $this; + } + public function validate() { //do Validation here $ci = get_instance(); diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php b/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php index 297896a02..b58c514e1 100644 --- a/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php +++ b/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php @@ -435,7 +435,7 @@ class VertragsbestandteilLib return $result; } - public function endDienstverhaeltnis(Dienstverhaeltnis $dv, $enddate) + public function endDienstverhaeltnis(Dienstverhaeltnis $dv, $enddate, $dvendegrund_kurzbz=null, $dvendegrund_anmerkung=null) { if( $dv->getBis() !== null && $dv->getBis() < $enddate ) { @@ -460,6 +460,14 @@ class VertragsbestandteilLib $this->endVertragsbestandteil($vb, $enddate); } + if( $dvendegrund_kurzbz !== null ) + { + $dv->setDvendegrund_kurzbz($dvendegrund_kurzbz); + } + if( $dvendegrund_anmerkung !== null ) + { + $dv->setDvendegrund_anmerkung($dvendegrund_anmerkung); + } $dv->setBis($enddate); $this->updateDienstverhaeltnis($dv); From f51f00637743614ea1a28bcbbd12b57256393bf6 Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 10 Apr 2024 14:07:41 +0200 Subject: [PATCH 53/86] Corrected phrase anmerkungIntern --- system/phrasesupdate.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 6a631d5d2..17daf06a4 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -25367,13 +25367,13 @@ array( 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'anmerkungIntern', + 'text' => 'Anmerkung intern', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => 'Note internal', + 'text' => 'Internal note', 'description' => '', 'insertvon' => 'system' ) From 94224f7ef753d5f52911d3079617325957f4a6d9 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Wed, 10 Apr 2024 14:28:07 +0200 Subject: [PATCH 54/86] dvendegrund Ablauf durch Zeit added --- system/dbupdate_3.4/28260_vertraege.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/system/dbupdate_3.4/28260_vertraege.php b/system/dbupdate_3.4/28260_vertraege.php index 58a895483..d6729f7e3 100644 --- a/system/dbupdate_3.4/28260_vertraege.php +++ b/system/dbupdate_3.4/28260_vertraege.php @@ -465,7 +465,8 @@ if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table ('kuendigung_arbeitgeber', 'Kündigung durch Arbeitgeber', ARRAY['Kündigung durch Arbeitgeber', 'Cancellation by Employer']), ('entlassung', 'Entlassung', ARRAY['Entlassung', 'Dismissal']), ('sonstige', 'Sonstige', ARRAY['Sonstige', 'Miscellaneous']), - ('einvernehmlich', 'Einvernehmliche Auflösung', ARRAY['Einvernehmliche Auflösung', 'Rescission']); + ('einvernehmlich', 'Einvernehmliche Auflösung', ARRAY['Einvernehmliche Auflösung', 'Rescission']), + ('ablaufzeit', 'Ablauf durch Zeit', ARRAY['Ablauf durch Zeit', 'Expired by lapse of time']); "; if (! $db->db_query($qry)) echo 'Vertraege: ' . $db->db_last_error() . '
'; @@ -514,4 +515,4 @@ if ($result = $db->db_query("SELECT * FROM information_schema.columns WHERE colu else echo 'Spalte dvendegrund_anmerkung wurde in hr.tbl_dienstverhaeltnis neu erstellt
'; } -} \ No newline at end of file +} From b2deea69623674030a71c1dbbdf471857d592943 Mon Sep 17 00:00:00 2001 From: Werner Masik Date: Wed, 17 Apr 2024 16:40:12 +0200 Subject: [PATCH 55/86] added db schema for Gehaltsbaender --- system/dbupdate_3.4/37133_gehaltsbaender.php | 85 ++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 system/dbupdate_3.4/37133_gehaltsbaender.php diff --git a/system/dbupdate_3.4/37133_gehaltsbaender.php b/system/dbupdate_3.4/37133_gehaltsbaender.php new file mode 100644 index 000000000..3c34883f6 --- /dev/null +++ b/system/dbupdate_3.4/37133_gehaltsbaender.php @@ -0,0 +1,85 @@ +db_query("SELECT * FROM information_schema.tables WHERE table_name='tbl_frist' AND table_schema='hr'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = " + + CREATE TABLE IF NOT EXISTS hr.tbl_gehaltsband ( + gehaltsband_kurzbz character varying(32) NOT NULL, + bezeichnung varchar(32) NOT NULL, + aktiv boolean DEFAULT FALSE, + sort smallint, + insertvon character varying(32) NOT NULL, + insertamum timestamp without time zone DEFAULT now() NOT NULL, + updatevon character varying(32), + updateamum timestamp without time zone, + CONSTRAINT tbl_gehaltsband_pkey PRIMARY KEY (gehaltsband_kurzbz) + ); + + CREATE TABLE IF NOT EXISTS hr.tbl_gehaltsband_funktion ( + gehaltsband_funktion_id bigserial NOT NULL, + gehaltsband_kurzbz varchar(32) NOT NULL, + funktion_kurzbz varchar(32) NOT NULL, + oe_kurzbz varchar(32), + organisationseinheittyp_kurzbz varchar(32), + insertvon character varying(32) NOT NULL, + insertamum timestamp without time zone DEFAULT now() NOT NULL, + updatevon character varying(32), + updateamum timestamp without time zone + ); + + CREATE TABLE IF NOT EXISTS hr.tbl_gehaltsband_betrag ( + gehaltsband_betrag_id bigserial NOT NULL, + gehaltsband_kurzbz character varying(32) NOT NULL, + von date, + bis date, + betrag_von numeric(9,5), + betrag_bis numeric(9,5), + insertvon character varying(32) NOT NULL, + insertamum timestamp without time zone DEFAULT now() NOT NULL, + updatevon character varying(32), + updateamum timestamp without time zone, + CONSTRAINT tbl_gehaltsband_betrag_pkey PRIMARY KEY (gehaltsband_betrag_id) + ); + + ALTER TABLE hr.tbl_gehaltsband_betrag ADD CONSTRAINT tbl_gehaltsband_betrag_gehaltsband_kurzbz_fk FOREIGN KEY (gehaltsband_kurzbz) + REFERENCES hr.tbl_gehaltsband (gehaltsband_kurzbz) MATCH FULL + ON DELETE SET NULL ON UPDATE CASCADE; + + ALTER TABLE hr.tbl_gehaltsband_funktion ADD CONSTRAINT tbl_gehaltsband_funktion_oe_kurzbz_fk FOREIGN KEY (oe_kurzbz) + REFERENCES public.tbl_organisationseinheit (oe_kurzbz) MATCH FULL + ON DELETE SET NULL ON UPDATE CASCADE; + + ALTER TABLE hr.tbl_gehaltsband_funktion ADD CONSTRAINT tbl_gehaltsband_funktion_organisationseinheittyp_kurzbz_fk FOREIGN KEY (organisationseinheittyp_kurzbz) + REFERENCES public.tbl_organisationseinheittyp (organisationseinheittyp_kurzbz) MATCH FULL + ON DELETE SET NULL ON UPDATE CASCADE; + + COMMENT ON TABLE hr.tbl_gehaltsband IS E'Definition of salary range types'; + COMMENT ON TABLE hr.tbl_gehaltsband_funktion IS E'job functions assigned to salary range'; + COMMENT ON TABLE hr.tbl_gehaltsband_betrag IS E'salary range (time dependend)'; + + GRANT SELECT, UPDATE, INSERT, DELETE ON hr.tbl_gehaltsband TO vilesci; + GRANT SELECT, UPDATE, INSERT, DELETE ON hr.tbl_gehaltsband_betrag TO vilesci; + GRANT USAGE ON hr.tbl_gehaltsband_betrag_gehaltsband_betrag_id_seq TO vilesci; + GRANT USAGE ON hr.tbl_gehaltsband_funktion_gehaltsband_funktion_id_seq TO vilesci; + + INSERT INTO hr.tbl_gehaltsband(gehaltsband_kurzbz, bezeichnung, aktiv, sort, insertvon) VALUES('ASSISTENTIN','AssistentIn', 't', 1, 'system'); + INSERT INTO hr.tbl_gehaltsband(gehaltsband_kurzbz, bezeichnung, aktiv, sort, insertvon) VALUES('JUNIOR_LECTURER_RESEARCHER','Junior Lecturer/Researcher', 't', 2, 'system'); + INSERT INTO hr.tbl_gehaltsband(gehaltsband_kurzbz, bezeichnung, aktiv, sort, insertvon) VALUES('LECTURER_RESEARCHER','Lecturer/Researcher', 't', 3, 'system'); + INSERT INTO hr.tbl_gehaltsband(gehaltsband_kurzbz, bezeichnung, aktiv, sort, insertvon) VALUES('SENIOR_LECTURER_RESEARCHER','Senior Lecturer/Researcher', 't', 4, 'system'); + INSERT INTO hr.tbl_gehaltsband(gehaltsband_kurzbz, bezeichnung, aktiv, sort, insertvon) VALUES('STUDIENGANGSLEITERIN','StudiengangsleiterIn', 't', 5, 'system'); + INSERT INTO hr.tbl_gehaltsband(gehaltsband_kurzbz, bezeichnung, aktiv, sort, insertvon) VALUES('KOMPETENZFELDLEITERIN','KompetanzfeldleiterIn', 't', 6, 'system'); + INSERT INTO hr.tbl_gehaltsband(gehaltsband_kurzbz, bezeichnung, aktiv, sort, insertvon) VALUES('DEPARTMENTLEITERIN','DepartmentleiterIn', 't', 7, 'system'); + INSERT INTO hr.tbl_gehaltsband(gehaltsband_kurzbz, bezeichnung, aktiv, sort, insertvon) VALUES('FAKULTAETSLEITERIN','FakultätsleiterIn', 't', 8, 'system'); + + "; + + if (! $db->db_query($qry)) + echo 'Fristenmanagement: ' . $db->db_last_error() . '
'; + else + echo 'Fristenmanagementtabellen wurden neu erstellt'; + } +} From c15a350392d9801cc4eb9156b652ef881e8a2da0 Mon Sep 17 00:00:00 2001 From: Werner Masik Date: Wed, 24 Apr 2024 14:55:22 +0200 Subject: [PATCH 56/86] moved dbUpdate for gehaltsband to extension --- system/dbupdate_3.4/37133_gehaltsbaender.php | 85 -------------------- 1 file changed, 85 deletions(-) delete mode 100644 system/dbupdate_3.4/37133_gehaltsbaender.php diff --git a/system/dbupdate_3.4/37133_gehaltsbaender.php b/system/dbupdate_3.4/37133_gehaltsbaender.php deleted file mode 100644 index 3c34883f6..000000000 --- a/system/dbupdate_3.4/37133_gehaltsbaender.php +++ /dev/null @@ -1,85 +0,0 @@ -db_query("SELECT * FROM information_schema.tables WHERE table_name='tbl_frist' AND table_schema='hr'")) -{ - if ($db->db_num_rows($result) == 0) - { - $qry = " - - CREATE TABLE IF NOT EXISTS hr.tbl_gehaltsband ( - gehaltsband_kurzbz character varying(32) NOT NULL, - bezeichnung varchar(32) NOT NULL, - aktiv boolean DEFAULT FALSE, - sort smallint, - insertvon character varying(32) NOT NULL, - insertamum timestamp without time zone DEFAULT now() NOT NULL, - updatevon character varying(32), - updateamum timestamp without time zone, - CONSTRAINT tbl_gehaltsband_pkey PRIMARY KEY (gehaltsband_kurzbz) - ); - - CREATE TABLE IF NOT EXISTS hr.tbl_gehaltsband_funktion ( - gehaltsband_funktion_id bigserial NOT NULL, - gehaltsband_kurzbz varchar(32) NOT NULL, - funktion_kurzbz varchar(32) NOT NULL, - oe_kurzbz varchar(32), - organisationseinheittyp_kurzbz varchar(32), - insertvon character varying(32) NOT NULL, - insertamum timestamp without time zone DEFAULT now() NOT NULL, - updatevon character varying(32), - updateamum timestamp without time zone - ); - - CREATE TABLE IF NOT EXISTS hr.tbl_gehaltsband_betrag ( - gehaltsband_betrag_id bigserial NOT NULL, - gehaltsband_kurzbz character varying(32) NOT NULL, - von date, - bis date, - betrag_von numeric(9,5), - betrag_bis numeric(9,5), - insertvon character varying(32) NOT NULL, - insertamum timestamp without time zone DEFAULT now() NOT NULL, - updatevon character varying(32), - updateamum timestamp without time zone, - CONSTRAINT tbl_gehaltsband_betrag_pkey PRIMARY KEY (gehaltsband_betrag_id) - ); - - ALTER TABLE hr.tbl_gehaltsband_betrag ADD CONSTRAINT tbl_gehaltsband_betrag_gehaltsband_kurzbz_fk FOREIGN KEY (gehaltsband_kurzbz) - REFERENCES hr.tbl_gehaltsband (gehaltsband_kurzbz) MATCH FULL - ON DELETE SET NULL ON UPDATE CASCADE; - - ALTER TABLE hr.tbl_gehaltsband_funktion ADD CONSTRAINT tbl_gehaltsband_funktion_oe_kurzbz_fk FOREIGN KEY (oe_kurzbz) - REFERENCES public.tbl_organisationseinheit (oe_kurzbz) MATCH FULL - ON DELETE SET NULL ON UPDATE CASCADE; - - ALTER TABLE hr.tbl_gehaltsband_funktion ADD CONSTRAINT tbl_gehaltsband_funktion_organisationseinheittyp_kurzbz_fk FOREIGN KEY (organisationseinheittyp_kurzbz) - REFERENCES public.tbl_organisationseinheittyp (organisationseinheittyp_kurzbz) MATCH FULL - ON DELETE SET NULL ON UPDATE CASCADE; - - COMMENT ON TABLE hr.tbl_gehaltsband IS E'Definition of salary range types'; - COMMENT ON TABLE hr.tbl_gehaltsband_funktion IS E'job functions assigned to salary range'; - COMMENT ON TABLE hr.tbl_gehaltsband_betrag IS E'salary range (time dependend)'; - - GRANT SELECT, UPDATE, INSERT, DELETE ON hr.tbl_gehaltsband TO vilesci; - GRANT SELECT, UPDATE, INSERT, DELETE ON hr.tbl_gehaltsband_betrag TO vilesci; - GRANT USAGE ON hr.tbl_gehaltsband_betrag_gehaltsband_betrag_id_seq TO vilesci; - GRANT USAGE ON hr.tbl_gehaltsband_funktion_gehaltsband_funktion_id_seq TO vilesci; - - INSERT INTO hr.tbl_gehaltsband(gehaltsband_kurzbz, bezeichnung, aktiv, sort, insertvon) VALUES('ASSISTENTIN','AssistentIn', 't', 1, 'system'); - INSERT INTO hr.tbl_gehaltsband(gehaltsband_kurzbz, bezeichnung, aktiv, sort, insertvon) VALUES('JUNIOR_LECTURER_RESEARCHER','Junior Lecturer/Researcher', 't', 2, 'system'); - INSERT INTO hr.tbl_gehaltsband(gehaltsband_kurzbz, bezeichnung, aktiv, sort, insertvon) VALUES('LECTURER_RESEARCHER','Lecturer/Researcher', 't', 3, 'system'); - INSERT INTO hr.tbl_gehaltsband(gehaltsband_kurzbz, bezeichnung, aktiv, sort, insertvon) VALUES('SENIOR_LECTURER_RESEARCHER','Senior Lecturer/Researcher', 't', 4, 'system'); - INSERT INTO hr.tbl_gehaltsband(gehaltsband_kurzbz, bezeichnung, aktiv, sort, insertvon) VALUES('STUDIENGANGSLEITERIN','StudiengangsleiterIn', 't', 5, 'system'); - INSERT INTO hr.tbl_gehaltsband(gehaltsband_kurzbz, bezeichnung, aktiv, sort, insertvon) VALUES('KOMPETENZFELDLEITERIN','KompetanzfeldleiterIn', 't', 6, 'system'); - INSERT INTO hr.tbl_gehaltsband(gehaltsband_kurzbz, bezeichnung, aktiv, sort, insertvon) VALUES('DEPARTMENTLEITERIN','DepartmentleiterIn', 't', 7, 'system'); - INSERT INTO hr.tbl_gehaltsband(gehaltsband_kurzbz, bezeichnung, aktiv, sort, insertvon) VALUES('FAKULTAETSLEITERIN','FakultätsleiterIn', 't', 8, 'system'); - - "; - - if (! $db->db_query($qry)) - echo 'Fristenmanagement: ' . $db->db_last_error() . '
'; - else - echo 'Fristenmanagementtabellen wurden neu erstellt'; - } -} From 3b06519f2f62ee496a9c998edf87474d24913b0c Mon Sep 17 00:00:00 2001 From: Werner Masik Date: Wed, 24 Apr 2024 15:25:42 +0200 Subject: [PATCH 57/86] updated phrases for salary range --- system/phrasesupdate.php | 161 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index a0fd65819..38f42e6b8 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -24337,7 +24337,168 @@ array( 'insertvon' => 'system' ) ) + ), + // Gehaltsband + array( + 'app' => 'personalverwaltung', + 'category' => 'gehaltsband', + 'phrase' => 'gehaltsband', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Gehaltsband', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Salary Range', + 'description' => '', + 'insertvon' => 'system' + ) + ) ), + array( + 'app' => 'personalverwaltung', + 'category' => 'gehaltsband', + 'phrase' => 'gueltig_von', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Gültig von', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Valid from', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'personalverwaltung', + 'category' => 'gehaltsband', + 'phrase' => 'gueltig_bis', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Gültig bis', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Valid to', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'personalverwaltung', + 'category' => 'gehaltsband', + 'phrase' => 'betrag_von', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Betrag von', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Amount from', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'personalverwaltung', + 'category' => 'gehaltsband', + 'phrase' => 'betrag_bis', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Gültig bis', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Valid to', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'personalverwaltung', + 'category' => 'gehaltsband', + 'phrase' => 'gehaltsband_gespeichert', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Gehaltsband gespeichert.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Salary range saved.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'personalverwaltung', + 'category' => 'gehaltsband', + 'phrase' => 'gehaltsband_erstellt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Gehaltsband hinzugefügt.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Salary range created.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'personalverwaltung', + 'category' => 'gehaltsband', + 'phrase' => 'gehaltsband_geloescht', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Gehaltsband gelöscht.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Salary range deleted.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), // Personalverwaltung end array( 'app' => 'core', From 08dd6a7783f29b43061acd7ccfce87a348e0fb79 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Thu, 25 Apr 2024 15:11:16 +0200 Subject: [PATCH 58/86] add dvendegrund_kurzbz and dvendegrund_anmerkung when reading dvs from db --- .../models/vertragsbestandteil/Dienstverhaeltnis_model.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php index 2fdfcffe2..12f7af220 100644 --- a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php +++ b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php @@ -31,6 +31,8 @@ class Dienstverhaeltnis_model extends DB_Model org.bezeichnung oe_bezeichnung, dv.von, dv.bis, + dv.dvendegrund_kurzbz, + dv.dvendegrund_anmerkung, dv.vertragsart_kurzbz, dv.updateamum, dv.updatevon From 56436078456e7d7ead05440f12b7b53d103797f0 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 13 May 2024 11:06:32 +0200 Subject: [PATCH 59/86] Added phrases 'statusErfolgreichUebertragen' and 'statusUebertragenMsg' to Softwarebereitstellung app --- system/phrasesupdate.php | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 17daf06a4..90b16bac4 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -25919,6 +25919,46 @@ array( ) ) ), + array( + 'app' => 'softwarebereitstellung', + 'category' => 'global', + 'phrase' => 'statusErfolgreichUebertragen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Status erfolgreich übertragen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Status successfully transferred', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'softwarebereitstellung', + 'category' => 'global', + 'phrase' => 'statusUebertragenMsg', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Der Status {status} wurde erfolgreich von der übergeordneten Software mit ID {parentSoftware} auch auf die untergeordnete Software übertragen.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Status {status} has been successfully transferred from the parent software with ID {parentSoftware} to the child software.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), ); From 8a0d2a2f1065dc3dfb9d6843f26e19f0be714b4e Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 13 May 2024 14:02:05 +0200 Subject: [PATCH 60/86] Refactored Tabs title assignment to utilize computed property This is necessary to render language phrases correctly --- public/js/components/Tabs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/js/components/Tabs.js b/public/js/components/Tabs.js index b9a07e370..cde12e02b 100644 --- a/public/js/components/Tabs.js +++ b/public/js/components/Tabs.js @@ -75,7 +75,7 @@ export default { tabs[key] = { component: Vue.markRaw(Vue.defineAsyncComponent(() => import(item.component))), - title: item.title || key, + title: Vue.computed(() => item.title || key), config: item.config, key } From c4c17f69c7606aa2b9087b6098b496a6809cfa6a Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 14 May 2024 13:41:33 +0200 Subject: [PATCH 61/86] Added phrase softwaretypKurzbz --- system/phrasesupdate.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index b4a087fc8..5a6101181 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -25279,6 +25279,26 @@ array( ) ) ), + array( + 'app' => 'softwarebereitstellung', + 'category' => 'global', + 'phrase' => 'softwaretypKurzbz', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Softwaretyp Kurzbz', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Softwaretype short', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'softwarebereitstellung', 'category' => 'global', From f2a2469e6e9610373035100cdb500c794f7e1fe5 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Wed, 15 May 2024 17:25:26 +0200 Subject: [PATCH 62/86] MigrateContract: keine ZeitaufzeichnungsVbs erstellen wenn za oder azg flag null ist. MigrateHourlyRate: kalkulatorische Stundensaetze nur migrieren wenn SAP Sync Tabelle existiert. --- .../controllers/system/MigrateContract.php | 5 ++ .../controllers/system/MigrateHourlyRate.php | 60 +++++++++++++++---- 2 files changed, 55 insertions(+), 10 deletions(-) diff --git a/application/controllers/system/MigrateContract.php b/application/controllers/system/MigrateContract.php index f011be356..93fd275a3 100644 --- a/application/controllers/system/MigrateContract.php +++ b/application/controllers/system/MigrateContract.php @@ -400,6 +400,11 @@ class MigrateContract extends CLI_Controller */ private function _addVertragsbestandteilZeitaufzeichnung(&$contracts, $dv, $row_verwendung) { + if( is_null($row_verwendung->zeitaufzeichnungspflichtig) || is_null($row_verwendung->azgrelevant) ) + { + return; + } + if (isset($contracts['dv'][$dv]['vbs'])) { foreach ($contracts['dv'][$dv]['vbs'] as $index_vbs=>$row_vbs) diff --git a/application/controllers/system/MigrateHourlyRate.php b/application/controllers/system/MigrateHourlyRate.php index 4fed2f585..734934ad0 100644 --- a/application/controllers/system/MigrateHourlyRate.php +++ b/application/controllers/system/MigrateHourlyRate.php @@ -25,6 +25,7 @@ class MigrateHourlyRate extends CLI_Controller public function index($user = null) { + echo "Lehre Stundensaetze werden migriert.\n"; $mitarbeiterResult = $this->_getMitarbeiterStunden($user); if (isError($mitarbeiterResult)) return $mitarbeiterResult; if (!hasData($mitarbeiterResult)) return error('Keine Mitarbeiterstunden gefunden'); @@ -38,20 +39,59 @@ class MigrateHourlyRate extends CLI_Controller if (isError($insertResult)) return $insertResult; } - $sapResult = $this->_getSapStunden($user); - if (isError($sapResult)) return $sapResult; - if (!hasData($sapResult)) return error('Keinen kalkulatorischen Stundensaetze gefunden'); - - $mitarbeiterArray = getData($sapResult); - - foreach ($mitarbeiterArray as $mitarbeiter) + if( $this->checkIfSAPSyncTableExists() ) { - $this->_getUnternehmen($mitarbeiter); - $insertResult = $this->_addStundensatz($mitarbeiter, self::STUNDENSTAZTYP_KALKULATORISCH, date_format(date_create($mitarbeiter->beginn), 'Y-m-d')); - if (isError($insertResult)) return $insertResult; + echo "SAP Sync Tabelle gefunden. SAP Stundensaetze werden migriert.\n"; + $sapResult = $this->_getSapStunden($user); + if (isError($sapResult)) return $sapResult; + if (!hasData($sapResult)) return error('Keinen kalkulatorischen Stundensaetze gefunden'); + + $mitarbeiterArray = getData($sapResult); + + foreach ($mitarbeiterArray as $mitarbeiter) + { + $this->_getUnternehmen($mitarbeiter); + $insertResult = $this->_addStundensatz($mitarbeiter, self::STUNDENSTAZTYP_KALKULATORISCH, date_format(date_create($mitarbeiter->beginn), 'Y-m-d')); + if (isError($insertResult)) return $insertResult; + } + } + else + { + echo "SAP Sync Tabelle nicht gefunden. Ignoriere SAP Stundensaetze.\n"; } } + protected function checkIfSAPSyncTableExists() + { + $dbModel = new DB_Model(); + $params = array( + DB_NAME, + 'sync', + 'tbl_sap_stundensatz' + ); + + $sql = "SELECT + 1 AS exists + FROM + information_schema.tables + WHERE + table_catalog = ? AND + table_schema = ? AND + table_name = ?"; + + $res = $dbModel->execReadOnlyQuery($sql, $params); + + if( hasData($res) ) + { + return true; + } + else + { + return false; + } + } + + private function _getSapStunden($user = null) { $dbModel = new DB_Model(); From 706dad6df6878c1b3b3dcdb2345b76124bd632a1 Mon Sep 17 00:00:00 2001 From: Werner Masik Date: Thu, 16 May 2024 21:58:34 +0200 Subject: [PATCH 63/86] added DV Ende --- .../models/vertragsbestandteil/Dienstverhaeltnis_model.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php index 2fdfcffe2..d9fa4a6cd 100644 --- a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php +++ b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php @@ -33,7 +33,9 @@ class Dienstverhaeltnis_model extends DB_Model dv.bis, dv.vertragsart_kurzbz, dv.updateamum, - dv.updatevon + dv.updatevon, + dv.dvendegrund_kurzbz, + dv.dvendegrund_anmerkung FROM tbl_mitarbeiter JOIN tbl_benutzer ON tbl_mitarbeiter.mitarbeiter_uid::text = tbl_benutzer.uid::text JOIN tbl_person USING (person_id) From 559a6b317d2af0937b0b7cd120568e24a50602cb Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 21 May 2024 14:03:40 +0200 Subject: [PATCH 64/86] Fixed multiple display of child software --- public/js/components/filter/Filter.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/js/components/filter/Filter.js b/public/js/components/filter/Filter.js index b4440cac1..a7d93523e 100644 --- a/public/js/components/filter/Filter.js +++ b/public/js/components/filter/Filter.js @@ -543,8 +543,8 @@ export const CoreFilterCmpt = { // create children array if not done yet if (!parent._children) parent._children = []; - // append the child - parent._children.push(child); + // if child is not included in children array, append the child + if (!parent._children.includes(child)) parent._children.push(child); // parent found return true; From 8cba0aec5a1e6afcde5e385a860487a81b2411cf Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Wed, 22 May 2024 15:32:28 +0200 Subject: [PATCH 65/86] vertragsarten dvbund, dvanderegk und dvanderebet hinzugefuegt, MigrateContract default oe und ba1code mapping in config verschoben und config check implementiert --- application/config/migratecontract.php | 36 ++++++++++ .../controllers/system/MigrateContract.php | 71 +++++++++++++++---- system/dbupdate_3.4/28260_vertraege.php | 56 ++++++++++++++- 3 files changed, 148 insertions(+), 15 deletions(-) create mode 100644 application/config/migratecontract.php diff --git a/application/config/migratecontract.php b/application/config/migratecontract.php new file mode 100644 index 000000000..75ba2f505 --- /dev/null +++ b/application/config/migratecontract.php @@ -0,0 +1,36 @@ +. + */ + +if (!defined('BASEPATH')) exit('No direct script access allowed'); + +$config['migratecontract_oe_default'] = 'TODO_OE_DEFAULT'; + +$config['migratecontract_matching_ba1_vertragsart'] = array( + '101'=>'dvbund', + '102'=>'dvanderengk', + '103'=>'echterdv', + '104'=>'studentischehilfskr', + '105'=>'externerlehrender', + '106'=>'dvanderenbet', + '107'=>'werkvertrag', + '108'=>'studentischehilfskr', + '109'=>'ueberlassungsvertrag', + '110'=>'echterfreier', + '111'=>'echterdv' //All-In +); \ No newline at end of file diff --git a/application/controllers/system/MigrateContract.php b/application/controllers/system/MigrateContract.php index 93fd275a3..817eaa4f0 100644 --- a/application/controllers/system/MigrateContract.php +++ b/application/controllers/system/MigrateContract.php @@ -16,7 +16,9 @@ class MigrateContract extends CLI_Controller { private $matching_ba1_vertragsart; - private $OE_DEFAULT = 'gst'; + private $OE_DEFAULT; + + protected $configerrors; /** * Constructor @@ -28,29 +30,70 @@ class MigrateContract extends CLI_Controller $this->load->model('codex/bisverwendung_model', 'BisVerwendungModel'); $this->load->model('person/benutzerfunktion_model', 'BenutzerfunktionModel'); - $this->matching_ba1_vertragsart = array( - '101'=>'externerlehrender', - '102'=>'DV anderen Gebietskörperschaft', - '103'=>'echterdv', - '104'=>'studentischehilfskr', - '105'=>'externerlehrender', - '106'=>'Andere Bildungseinrichtung', - '107'=>'werkvertrag', - '108'=>'studentischehilfskr', - '109'=>'ueberlassungsvertrag', - '110'=>'echterfreier', - '111'=>'echterdv', //All-In - ); + $this->load->config('migratecontract'); + + $this->OE_DEFAULT = $this->config->item('migratecontract_oe_default'); + $this->matching_ba1_vertragsart = $this->config->item('migratecontract_matching_ba1_vertragsart'); + $this->configerrors = array(); } // ----------------------------------------------------------------------------------------------------------------- // Public methods + public function checkConfig() + { + echo "OE_DEFAULT: " . $this->OE_DEFAULT . "\n"; + echo "matching_ba1_vertragsart: " . print_r($this->matching_ba1_vertragsart, true); + + $this->checkOE_DEFAULT(); + $this->checkMatching_ba1_vertragsart(); + + if( count($this->configerrors) > 0 ) + { + foreach($this->configerrors AS $configerror) + { + echo $configerror . "\n"; + } + die("Fehler in der Konfiguration. Abbruch!\n"); + } + else + { + echo "Konfiguration OK.\n"; + } + } + + protected function checkOE_DEFAULT() + { + $db = new DB_Model(); + $oesql = 'SELECT * FROM public.tbl_organisationseinheit WHERE oe_kurzbz = ?'; + $oeres = $db->execReadOnlyQuery($oesql, array($this->OE_DEFAULT)); + if( !hasData($oeres) ) + { + $this->configerrors[] = 'Default Organisationseinheit: "' + . $this->OE_DEFAULT . '" nicht gefunden.'; + } + } + + protected function checkMatching_ba1_vertragsart() { + $db = new DB_Model(); + foreach( $this->matching_ba1_vertragsart AS $vertragsart_kurzbz ) + { + $vasql = 'SELECT * FROM hr.tbl_vertragsart WHERE vertragsart_kurzbz = ?'; + $vares = $db->execReadOnlyQuery($vasql, array($vertragsart_kurzbz)); + if( !hasData($vares) ) + { + $this->configerrors[] = 'Vertragsart "' . $vertragsart_kurzbz + . '" nicht gefunden.'; + } + } + } /** * Everything has a beginning */ public function index($user = null) { + $this->checkConfig(); + if (!is_null($user)) { $contracts = $this->_transformUser($user); diff --git a/system/dbupdate_3.4/28260_vertraege.php b/system/dbupdate_3.4/28260_vertraege.php index 91a9e2cc9..dd43f362e 100644 --- a/system/dbupdate_3.4/28260_vertraege.php +++ b/system/dbupdate_3.4/28260_vertraege.php @@ -437,6 +437,60 @@ if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table if (! $db->db_query($qry)) echo 'Vertraege: ' . $db->db_last_error() . '
'; else - echo 'HR Schema und Vertagstabellen wurden neu erstellt'; + echo 'HR Schema und Vertagstabellen wurden neu erstellt
'; } } + +if ($result = $db->db_query("SELECT * FROM hr.tbl_vertragsart WHERE vertragsart_kurzbz='dvbund'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = " + INSERT INTO hr.tbl_vertragsart + (vertragsart_kurzbz, bezeichnung, anmerkung, dienstverhaeltnis, vertragsart_kurzbz_parent, aktiv, sort) + VALUES + ('dvbund','DV zum Bund','Dienstverhältnis zum Bund', true, null, true, 400); + "; + + if (! $db->db_query($qry)) + echo 'Vertraege: ' . $db->db_last_error() . '
'; + else + echo 'Vertragsart "Dienstverhältnis zum Bund" erstellt.
'; + } +} + +if ($result = $db->db_query("SELECT * FROM hr.tbl_vertragsart WHERE vertragsart_kurzbz='dvanderengk'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = " + INSERT INTO hr.tbl_vertragsart + (vertragsart_kurzbz, bezeichnung, anmerkung, dienstverhaeltnis, vertragsart_kurzbz_parent, aktiv, sort) + VALUES + ('dvanderengk','DV anderen Gebietskörperschaft','Dienstverhältnis zu einer anderen Gebietskörperschaft', true, null, true, 500); + "; + + if (! $db->db_query($qry)) + echo 'Vertraege: ' . $db->db_last_error() . '
'; + else + echo 'Vertragsart "Dienstverhältnis zu einer anderen Gebietskörperschaft" erstellt.
'; + } +} + +if ($result = $db->db_query("SELECT * FROM hr.tbl_vertragsart WHERE vertragsart_kurzbz='dvanderenbet'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = " + INSERT INTO hr.tbl_vertragsart + (vertragsart_kurzbz, bezeichnung, anmerkung, dienstverhaeltnis, vertragsart_kurzbz_parent, aktiv, sort) + VALUES + ('dvanderenbet','DV anderen Bildungseinrichtung','Dienstverhältnis zu einer anderen Bildungseinrichtung oder einem anderen Träger', true, null, true, 600); + "; + + if (! $db->db_query($qry)) + echo 'Vertraege: ' . $db->db_last_error() . '
'; + else + echo 'Vertragsart "Dienstverhältnis zu einer anderen Bildungseinrichtung oder einem anderen Träger" erstellt.
'; + } +} \ No newline at end of file From d5e82279180bc10afbde10793097fbea19728e6f Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Mon, 27 May 2024 12:45:10 +0200 Subject: [PATCH 66/86] Bugfix: api/frontend/fas controller do not inherit from FHCAPI_Controller --- .../controllers/api/frontend/fas/studstatus/Wiederholung.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/application/controllers/api/frontend/fas/studstatus/Wiederholung.php b/application/controllers/api/frontend/fas/studstatus/Wiederholung.php index c6e5a4fa9..19ace3d0d 100644 --- a/application/controllers/api/frontend/fas/studstatus/Wiederholung.php +++ b/application/controllers/api/frontend/fas/studstatus/Wiederholung.php @@ -63,7 +63,9 @@ class Wiederholung extends Auth_Controller $result = $this->antraglib->getLvsForPrestudent($prestudent_id, $sem_akt); - $lvs = $this->getDataOrTerminateWithError($result) ?: []; + if (isError($result)) + return $result; + $lvs = $result->retval; $rdf_url = 'http://www.technikum-wien.at/antragnote'; From 9652f480447912a590d9ccf37280f53f8b7bc317 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 3 Jun 2024 16:27:31 +0200 Subject: [PATCH 67/86] Added phrases 'zugeklappt', 'softwareliste', 'raumverfuegbarkeit' --- system/phrasesupdate.php | 60 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 5a6101181..8baf66909 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -24859,6 +24859,26 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'global', + 'phrase' => 'zugeklappt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'zugeklappt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'folded', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'softwarebereitstellung', 'category' => 'global', @@ -26039,6 +26059,46 @@ array( ) ) ), + array( + 'app' => 'softwarebereitstellung', + 'category' => 'global', + 'phrase' => 'softwareliste', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Softwareliste', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Softwarelist', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'softwarebereitstellung', + 'category' => 'global', + 'phrase' => 'raumverfuegbarkeit', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Raumverfügbarkeit', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Room Availability', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), ); From 512002c0e80218b35ac3fc41515f03a73899330e Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 3 Jun 2024 16:40:35 +0200 Subject: [PATCH 68/86] Created init.js file and changed link url in stpl_week to open Software-Raumsuche by OrtKurzbz --- cis/private/lvplan/stpl_week.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cis/private/lvplan/stpl_week.php b/cis/private/lvplan/stpl_week.php index e58ce03ed..6836bbd76 100644 --- a/cis/private/lvplan/stpl_week.php +++ b/cis/private/lvplan/stpl_week.php @@ -269,8 +269,8 @@ if (isset($_POST['titel'])) $addon_obj->loadAddons(); foreach($addon_obj->result as $addon) { - if(file_exists('../../../addons/'.$addon->kurzbz.'/cis/init.js.php')) - echo ''; + if(file_exists('../../../addons/'.$addon->kurzbz.'/cis/softwarebereitstellung/init.js.php')) + echo ''; } // Wenn Seite fertig geladen ist Addons aufrufen From 0cbb8997e29aede63ae789580786e5009bf055d7 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Mon, 3 Jun 2024 17:14:55 +0200 Subject: [PATCH 69/86] migratecontract config und config check auch in MigrateHourlyRate verwenden --- .../controllers/system/MigrateHourlyRate.php | 46 +++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/application/controllers/system/MigrateHourlyRate.php b/application/controllers/system/MigrateHourlyRate.php index 734934ad0..dbc8f1416 100644 --- a/application/controllers/system/MigrateHourlyRate.php +++ b/application/controllers/system/MigrateHourlyRate.php @@ -4,14 +4,15 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); class MigrateHourlyRate extends CLI_Controller { - - CONST DEFAULT_OE = 'gst'; CONST DEFAULT_DATE = '1970-01-01'; CONST STUNDENSTAZTYP_LEHRE = 'lehre'; CONST STUNDENSTAZTYP_KALKULATORISCH = 'kalkulatorisch'; + private $OE_DEFAULT; private $_ci; + protected $configerrors; + public function __construct() { parent::__construct(); @@ -21,10 +22,37 @@ class MigrateHourlyRate extends CLI_Controller $this->load->model('codex/Bisverwendung_model', 'BisVerwendungModel'); $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); $this->load->model('ressource/Stundensatz_model', 'StundensatzModel'); + + $this->load->config('migratecontract'); + + $this->OE_DEFAULT = $this->config->item('migratecontract_oe_default'); + $this->configerrors = array(); + } + + public function checkConfig() + { + echo "OE_DEFAULT: " . $this->OE_DEFAULT . "\n"; + + $this->checkOE_DEFAULT(); + + if( count($this->configerrors) > 0 ) + { + foreach($this->configerrors AS $configerror) + { + echo $configerror . "\n"; + } + die("Fehler in der Konfiguration. Abbruch!\n"); + } + else + { + echo "Konfiguration OK.\n"; + } } public function index($user = null) { + $this->checkConfig(); + echo "Lehre Stundensaetze werden migriert.\n"; $mitarbeiterResult = $this->_getMitarbeiterStunden($user); if (isError($mitarbeiterResult)) return $mitarbeiterResult; @@ -61,6 +89,18 @@ class MigrateHourlyRate extends CLI_Controller } } + protected function checkOE_DEFAULT() + { + $db = new DB_Model(); + $oesql = 'SELECT * FROM public.tbl_organisationseinheit WHERE oe_kurzbz = ?'; + $oeres = $db->execReadOnlyQuery($oesql, array($this->OE_DEFAULT)); + if( !hasData($oeres) ) + { + $this->configerrors[] = 'Default Organisationseinheit: "' + . $this->OE_DEFAULT . '" nicht gefunden.'; + } + } + protected function checkIfSAPSyncTableExists() { $dbModel = new DB_Model(); @@ -167,7 +207,7 @@ class MigrateHourlyRate extends CLI_Controller $unternehmenResult = $this->_findUnternehmen($mitarbeiter->uid, "'kstzuordnung', 'oezuordnung'"); } - $unternehmen = self::DEFAULT_OE; + $unternehmen = $this->OE_DEFAULT; if (hasData($unternehmenResult)) $unternehmen = getData($unternehmenResult)[0]->oe_kurzbz; From 46b7dc1ce78738441ebda90a34d7d6b41486368f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Fri, 7 Jun 2024 10:19:12 +0200 Subject: [PATCH 70/86] =?UTF-8?q?Dauer=20f=C3=BCr=20die=20Anzeige=20von=20?= =?UTF-8?q?abgelaufenen=20Projekten=20in=20der=20Zeitaufzeichnung=20auf=20?= =?UTF-8?q?2=20Monate=20verl=C3=A4ngert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/projekt.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/projekt.class.php b/include/projekt.class.php index 1dd7f60fb..79b706be9 100644 --- a/include/projekt.class.php +++ b/include/projekt.class.php @@ -382,7 +382,7 @@ class projekt extends basis_db JOIN fue.tbl_projekt_ressource USING(ressource_id) JOIN fue.tbl_projekt USING(projekt_kurzbz) WHERE (beginn<=now() or beginn is null) - AND (ende + interval '1 month 1 day' >=now() OR ende is null) + AND (ende + interval '2 month 1 day' >=now() OR ende is null) AND ( mitarbeiter_uid=" . $this->db_add_param($mitarbeiter_uid) . " OR From dd47cd2a7c19d0b41a4b0815488c4081a056c89e Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 11 Jun 2024 13:51:03 +0200 Subject: [PATCH 71/86] Updated filter: Added lizenzserver_kurzbz and lizenzserver_port to SoftwareManagement filter --- system/filtersupdate.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/system/filtersupdate.php b/system/filtersupdate.php index bc67e9dae..fa8a361f4 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -1296,6 +1296,8 @@ $filters = array( {"name": "beschreibung"}, {"name": "hersteller"}, {"name": "os"}, + {"name": "lizenzserver_kurzbz"}, + {"name": "lizenzserver_port"}, {"name": "softwarestatus_kurzbz"} ], "filters": [] From cd0eacf947383d0572dcf68133fbf29c805ef835 Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 11 Jun 2024 13:52:03 +0200 Subject: [PATCH 72/86] Updated phrases: Added phrases 'lizenzserverPort' and 'raumSwZuordnung' --- system/phrasesupdate.php | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 8baf66909..20f155afe 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -25539,6 +25539,46 @@ array( ) ) ), + array( + 'app' => 'softwarebereitstellung', + 'category' => 'global', + 'phrase' => 'lizenzserverPort', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Lizenzserver Port', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'License server port', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'softwarebereitstellung', + 'category' => 'global', + 'phrase' => 'raumSwZuordnung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Raum-/SW-Zuordnung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Location-/SW Assignment', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'softwarebereitstellung', 'category' => 'global', From f8d8a44a3cabe3fad2b7b83103fa9819b388d5c4 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Tue, 11 Jun 2024 14:47:54 +0200 Subject: [PATCH 73/86] student_uid zu sancho message Abmeldung StG Ablauf Einspruchsfrist --- application/controllers/jobs/AntragJob.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php index 717561589..57230ed92 100644 --- a/application/controllers/jobs/AntragJob.php +++ b/application/controllers/jobs/AntragJob.php @@ -412,6 +412,8 @@ class AntragJob extends JOB_Controller $this->StudierendenantragModel->addSelect('studiensemester_kurzbz'); $this->StudierendenantragModel->addSelect('s.insertamum'); $this->StudierendenantragModel->addSelect('s.insertvon'); + $this->StudierendenantragModel->addJoin('public.tbl_student pts', 'prestudent_id'); + $this->StudierendenantragModel->addSelect('pts.student_uid'); $this->StudierendenantragModel->db->where_in( 'public.get_rolle_prestudent(prestudent_id, studiensemester_kurzbz)', @@ -484,7 +486,7 @@ class AntragJob extends JOB_Controller $person = current(getData($result)); $email = $studiengang->email; $dataMail = array( - 'prestudent' => $antrag->prestudent_id, + 'prestudent' => $antrag->student_uid . ' / ' . $antrag->prestudent_id, 'studiensemester' => $antrag->studiensemester_kurzbz, 'name' => trim($person->vorname . ' '. $person->nachname), ); From 0b8191a435fd976767a461b63331335152867c54 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Tue, 11 Jun 2024 16:26:52 +0200 Subject: [PATCH 74/86] Beschriftung zu IDs in Sancho Message hinzugefuegt --- application/controllers/jobs/AntragJob.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php index 57230ed92..dbd0c5283 100644 --- a/application/controllers/jobs/AntragJob.php +++ b/application/controllers/jobs/AntragJob.php @@ -486,7 +486,7 @@ class AntragJob extends JOB_Controller $person = current(getData($result)); $email = $studiengang->email; $dataMail = array( - 'prestudent' => $antrag->student_uid . ' / ' . $antrag->prestudent_id, + 'prestudent' => 'UID: '$antrag->student_uid . ', PreStudentId' . $antrag->prestudent_id, 'studiensemester' => $antrag->studiensemester_kurzbz, 'name' => trim($person->vorname . ' '. $person->nachname), ); From 6816a300f60c6b4be9d7897cf42857306d20c011 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Tue, 11 Jun 2024 16:39:20 +0200 Subject: [PATCH 75/86] Beschriftung korrigiert --- application/controllers/jobs/AntragJob.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php index dbd0c5283..0bac8794f 100644 --- a/application/controllers/jobs/AntragJob.php +++ b/application/controllers/jobs/AntragJob.php @@ -486,7 +486,7 @@ class AntragJob extends JOB_Controller $person = current(getData($result)); $email = $studiengang->email; $dataMail = array( - 'prestudent' => 'UID: '$antrag->student_uid . ', PreStudentId' . $antrag->prestudent_id, + 'prestudent' => 'UID: ' . $antrag->student_uid . ', PreStudentId: ' . $antrag->prestudent_id, 'studiensemester' => $antrag->studiensemester_kurzbz, 'name' => trim($person->vorname . ' '. $person->nachname), ); From 93d0f88b0dc77654a1827c8e9a7a317fbf862f1b Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Fri, 14 Jun 2024 10:48:43 +0200 Subject: [PATCH 76/86] function getDVByPersonUID: add dvendegrund_kurzbz and dvendegrund_anmerkung to select --- .../models/vertragsbestandteil/Dienstverhaeltnis_model.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php index 12f7af220..6827beaa4 100644 --- a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php +++ b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php @@ -35,7 +35,9 @@ class Dienstverhaeltnis_model extends DB_Model dv.dvendegrund_anmerkung, dv.vertragsart_kurzbz, dv.updateamum, - dv.updatevon + dv.updatevon, + dv.dvendegrund_kurzbz, + dv.dvendegrund_anmerkung FROM tbl_mitarbeiter JOIN tbl_benutzer ON tbl_mitarbeiter.mitarbeiter_uid::text = tbl_benutzer.uid::text JOIN tbl_person USING (person_id) From c3278ad30f392ea68642ac94ee241de90cd58d74 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Fri, 14 Jun 2024 11:44:26 +0200 Subject: [PATCH 77/86] add app softwarebereitstellung to prevent checksystem errors when adding phrases for softwarebereitstellung while not having installed the extension --- system/dbupdate_3.4.php | 1 + .../28575_softwarebereitstellung.php | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 system/dbupdate_3.4/28575_softwarebereitstellung.php diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index 3a3f0be78..acb27977a 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -54,6 +54,7 @@ require_once('dbupdate_3.4/21620_neues_feld_zum_erfassen_des_ESI.php'); require_once('dbupdate_3.4/36530_bis_internationsalisierung_codextabelle_neuerungen.php'); require_once('dbupdate_3.4/34543_ux_template.php'); require_once('dbupdate_3.4/17513_Entwicklungsteam.php'); +require_once('dbupdate_3.4/28575_softwarebereitstellung.php'); // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; diff --git a/system/dbupdate_3.4/28575_softwarebereitstellung.php b/system/dbupdate_3.4/28575_softwarebereitstellung.php new file mode 100644 index 000000000..9cccc77fa --- /dev/null +++ b/system/dbupdate_3.4/28575_softwarebereitstellung.php @@ -0,0 +1,16 @@ +db_query("SELECT 1 FROM system.tbl_app WHERE app='softwarebereitstellung'")) +{ + if($db->db_num_rows($result) === 0) + { + $qry = "INSERT INTO system.tbl_app (app) VALUES('softwarebereitstellung');"; + + if(!$db->db_query($qry)) + echo 'System Tabelle app: '.$db->db_last_error().'
'; + else + echo '
app softwarebereitstellung hinzugefuegt
'; + } +} From 3e0c15e18f4ea64dd8790fc132b5e1c61414aca7 Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Tue, 18 Jun 2024 11:12:12 +0200 Subject: [PATCH 78/86] Datum bei Abmeldung d StgL PDF --- rdf/AntragAbmeldungStgl.xml.php | 22 ++++++++++++---------- system/xsl/AntragAbmeldungStgl.xsl | 10 ++++++++++ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/rdf/AntragAbmeldungStgl.xml.php b/rdf/AntragAbmeldungStgl.xml.php index 1e18e798b..854121b5d 100644 --- a/rdf/AntragAbmeldungStgl.xml.php +++ b/rdf/AntragAbmeldungStgl.xml.php @@ -36,7 +36,7 @@ else $query = " - SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, pss.ausbildungssemester AS semester, a.grund + SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, pss.ausbildungssemester AS semester, pss.bestaetigtam, a.grund FROM campus.tbl_studierendenantrag a JOIN public.tbl_student USING (prestudent_id) @@ -56,15 +56,17 @@ if (!$db->db_query($query) || !$db->db_num_rows()) db_fetch_object()) { ?> - - vorname . ' ' . $row->nachname); ?>]]> - bezeichnung; ?>]]> - bezeichnung_mehrsprachig; ?>]]> - matrikelnr; ?>]]> - studienjahr_kurzbz; ?>]]> - studiensemester_kurzbz; ?>]]> - semester; ?>]]> - grund; ?>]]> + bestaetigtam); ?> + + vorname . ' ' . $row->nachname); ?>]]> + bezeichnung; ?>]]> + bezeichnung_mehrsprachig; ?>]]> + matrikelnr; ?>]]> + studienjahr_kurzbz; ?>]]> + studiensemester_kurzbz; ?>]]> + semester; ?>]]> + format('d.m.Y'); ?>]]> + grund; ?>]]> diff --git a/system/xsl/AntragAbmeldungStgl.xsl b/system/xsl/AntragAbmeldungStgl.xsl index aa6a28073..58ce56dfb 100644 --- a/system/xsl/AntragAbmeldungStgl.xsl +++ b/system/xsl/AntragAbmeldungStgl.xsl @@ -345,6 +345,16 @@ + + + Abmeldedatum + + + + + + + Grund der Abmeldung: From 0aa53f64ff5646997b021fe8bfb945cb61e2cc33 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Wed, 19 Jun 2024 08:51:34 +0200 Subject: [PATCH 79/86] db Aenderungen Gegenpruefung hinzugefuegt --- system/dbupdate_3.4.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index 3a3f0be78..144ea1d44 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -171,7 +171,8 @@ $tabellen=array( "hr.tbl_sachaufwandtyp" => array("sachaufwandtyp_kurzbz","bezeichnung","sort", "aktiv"), "hr.tbl_stundensatz" => array("stundensatz_id","uid","stundensatztyp","stundensatz","oe_kurzbz","gueltig_von","gueltig_bis","insertamum","insertvon","updateamum","updatevon"), "hr.tbl_stundensatztyp" => array("stundensatztyp","bezeichnung","aktiv","insertamum","insertvon","updateamum","updatevon"), - "hr.tbl_dienstverhaeltnis" => array("dienstverhaeltnis_id","mitarbeiter_uid","vertragsart_kurzbz","oe_kurzbz","von","bis","insertamum","insertvon","updateamum","updatevon"), + "hr.tbl_dienstverhaeltnis" => array("dienstverhaeltnis_id","mitarbeiter_uid","vertragsart_kurzbz","oe_kurzbz","von","bis","insertamum","insertvon","updateamum","updatevon","dvendegrund_kurzbz","dvendegrund_anmerkung"), + "hr.tbl_dvendegrund" => array("dvendegrund_kurzbz", "bezeichnung", "bezeichnung_mehrsprachig", "aktiv", "sort"), "hr.tbl_vertragsart" => array("vertragsart_kurzbz","bezeichnung","anmerkung","dienstverhaeltnis","vertragsart_kurzbz_parent","aktiv","sort"), "hr.tbl_vertragsbestandteil" => array("vertragsbestandteil_id","dienstverhaeltnis_id","vertragsbestandteiltyp_kurzbz","von", "bis","insertamum", "insertvon","updateamum","updatevon"), "hr.tbl_vertragsbestandteiltyp" => array("vertragsbestandteiltyp_kurzbz","bezeichnung","ueberlappend"), From fb77ab67e7af04d28e49fce6044846a41347ee5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Wed, 19 Jun 2024 09:05:08 +0200 Subject: [PATCH 80/86] =?UTF-8?q?Pr=C3=BCfungshonorare=20im=20Notenkarteir?= =?UTF-8?q?eiter=20zeigen=20nur=20aktive=20Mitarbeiter=20an?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lvplanung/lehrveranstaltungnotenoverlay.xul.php | 4 ++-- include/mitarbeiter.class.php | 10 +++++++++- rdf/mitarbeiter.rdf.php | 7 ++++++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/content/lvplanung/lehrveranstaltungnotenoverlay.xul.php b/content/lvplanung/lehrveranstaltungnotenoverlay.xul.php index 925f744fb..033bd7344 100644 --- a/content/lvplanung/lehrveranstaltungnotenoverlay.xul.php +++ b/content/lvplanung/lehrveranstaltungnotenoverlay.xul.php @@ -122,7 +122,7 @@ echo " + + + Abmeldedatum + + + + + + + Grund der Abmeldung: From 04c006a733c30444bef80a821cf2a3fbef822b4a Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Wed, 19 Jun 2024 10:28:03 +0200 Subject: [PATCH 82/86] do not create dummy manual events --- system/dbupdate_3.4/37107_fristenmanagement.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/system/dbupdate_3.4/37107_fristenmanagement.php b/system/dbupdate_3.4/37107_fristenmanagement.php index ee023b13e..7d2e8bddb 100644 --- a/system/dbupdate_3.4/37107_fristenmanagement.php +++ b/system/dbupdate_3.4/37107_fristenmanagement.php @@ -72,11 +72,6 @@ if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table INSERT INTO hr.tbl_frist_ereignis(ereignis_kurzbz, bezeichnung, sort) VALUES('zeitaufzeichnung_ende','Zeitaufzeichnung Ende', 8); INSERT INTO hr.tbl_frist_ereignis(ereignis_kurzbz, bezeichnung, sort) VALUES('befristung_beginn','Befristung Beginn', 9); INSERT INTO hr.tbl_frist_ereignis(ereignis_kurzbz, bezeichnung, sort) VALUES('befristung_ende','Befristung Ende', 10); - INSERT INTO hr.tbl_frist_ereignis (ereignis_kurzbz , bezeichnung, manuell, sort) VALUES('manuell1','Manuell 1', true, 11); - INSERT INTO hr.tbl_frist_ereignis (ereignis_kurzbz , bezeichnung, manuell, sort) VALUES('manuell2','Manuell 2', true, 12); - INSERT INTO hr.tbl_frist_ereignis (ereignis_kurzbz , bezeichnung, manuell, sort) VALUES('manuell3','Manuell 3', true, 13); - INSERT INTO hr.tbl_frist_ereignis (ereignis_kurzbz , bezeichnung, manuell, sort) VALUES('manuell4','Manuell 4', true, 14); - "; From 631a5527089de1d68a2b8f30569f0bdca3549d25 Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Wed, 19 Jun 2024 10:55:48 +0200 Subject: [PATCH 83/86] Datum bei Abmeldung d Stud PDF --- rdf/AntragAbmeldung.xml.php | 24 +++++++++++++----------- system/xsl/AntragAbmeldung.xsl | 10 ++++++++++ 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/rdf/AntragAbmeldung.xml.php b/rdf/AntragAbmeldung.xml.php index 28210d280..6615ac046 100644 --- a/rdf/AntragAbmeldung.xml.php +++ b/rdf/AntragAbmeldung.xml.php @@ -36,7 +36,7 @@ else $query = " - SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, pss.ausbildungssemester AS semester, a.grund + SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, pss.ausbildungssemester AS semester, pss.datum, a.grund FROM campus.tbl_studierendenantrag a JOIN public.tbl_student USING (prestudent_id) @@ -56,16 +56,18 @@ if (!$db->db_query($query) || !$db->db_num_rows()) db_fetch_object()) { ?> - - vorname . ' ' . $row->nachname); ?>]]> - bezeichnung; ?>]]> - bezeichnung_mehrsprachig; ?>]]> - matrikelnr; ?>]]> - studienjahr_kurzbz; ?>]]> - studiensemester_kurzbz; ?>]]> - semester; ?>]]> - grund; ?>]]> - + datum); ?> + + vorname . ' ' . $row->nachname); ?>]]> + bezeichnung; ?>]]> + bezeichnung_mehrsprachig; ?>]]> + matrikelnr; ?>]]> + studienjahr_kurzbz; ?>]]> + studiensemester_kurzbz; ?>]]> + semester; ?>]]> + format('d.m.Y'); ?>]]> + grund; ?>]]> + diff --git a/system/xsl/AntragAbmeldung.xsl b/system/xsl/AntragAbmeldung.xsl index ef67d6f15..c03265c2b 100644 --- a/system/xsl/AntragAbmeldung.xsl +++ b/system/xsl/AntragAbmeldung.xsl @@ -345,6 +345,16 @@ + + + Abmeldedatum + + + + + + + Grund der Abmeldung: From 9c53a7a75b38b089b3dd3610046b3b10691cef2a Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Wed, 19 Jun 2024 14:02:20 +0200 Subject: [PATCH 84/86] =?UTF-8?q?PDF=20Download=20Button=20w=C3=A4hrend=20?= =?UTF-8?q?Einspruchsfrist=20verbergen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/views/lehre/Antrag/Student/List.php | 2 -- public/js/components/Studierendenantrag/Leitung/Table.js | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/application/views/lehre/Antrag/Student/List.php b/application/views/lehre/Antrag/Student/List.php index 614af5d79..4a4b4f064 100644 --- a/application/views/lehre/Antrag/Student/List.php +++ b/application/views/lehre/Antrag/Student/List.php @@ -150,8 +150,6 @@ $this->load->view( break; case Studierendenantrag_model::TYP_ABMELDUNG_STGL: $allowed = [ - Studierendenantragstatus_model::STATUS_APPROVED, - Studierendenantragstatus_model::STATUS_OBJECTED, Studierendenantragstatus_model::STATUS_OBJECTION_DENIED, Studierendenantragstatus_model::STATUS_DEREGISTERED ]; diff --git a/public/js/components/Studierendenantrag/Leitung/Table.js b/public/js/components/Studierendenantrag/Leitung/Table.js index 45c8f373a..778f91c00 100644 --- a/public/js/components/Studierendenantrag/Leitung/Table.js +++ b/public/js/components/Studierendenantrag/Leitung/Table.js @@ -265,7 +265,7 @@ export default { allowed_status_for_download = ['Genehmigt']; break; case 'AbmeldungStgl': - allowed_status_for_download = ['Genehmigt', 'Beeinsprucht', 'EinspruchAbgelehnt', 'Abgemeldet']; + allowed_status_for_download = ['EinspruchAbgelehnt', 'Abgemeldet']; break; case 'Unterbrechung': allowed_status_for_download = ['Genehmigt', 'EmailVersandt']; From b56e8c5f9fa95e24ab90c1d9cde62b9e91d86852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Fri, 21 Jun 2024 13:02:55 +0200 Subject: [PATCH 85/86] Im Abschlusspruefung Karteireiter wird in der Liste bei der Beurteilung jetzt die Bezeichnung der Note angezeigt anstatt der Kurzbz --- content/student/studentabschlusspruefungoverlay.xul.php | 2 +- rdf/abschlusspruefung.rdf.php | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/content/student/studentabschlusspruefungoverlay.xul.php b/content/student/studentabschlusspruefungoverlay.xul.php index 90ca765d8..6ef1f62d4 100644 --- a/content/student/studentabschlusspruefungoverlay.xul.php +++ b/content/student/studentabschlusspruefungoverlay.xul.php @@ -137,7 +137,7 @@ echo ''; - + diff --git a/rdf/abschlusspruefung.rdf.php b/rdf/abschlusspruefung.rdf.php index 8c2764d86..039b0bca0 100644 --- a/rdf/abschlusspruefung.rdf.php +++ b/rdf/abschlusspruefung.rdf.php @@ -343,7 +343,7 @@ if ($xmlformat=='rdf') $rdf_url='http://www.technikum-wien.at/abschlusspruefung'; function draw_content($row) { - global $rdf_url, $datum_obj; + global $rdf_url, $datum_obj, $abschlussbeurteilung_arr; $vorsitz = ''; $pruefer1= ''; $pruefer2= ''; @@ -380,6 +380,7 @@ if ($xmlformat=='rdf') pruefer3.']]> abschlussbeurteilung_kurzbz.']]> + abschlussbeurteilung_kurzbz!=''?$abschlussbeurteilung_arr[$row->abschlussbeurteilung_kurzbz]:'').']]> note.']]> akadgrad_id.']]> convertISODate($row->datum).']]> From 37fb9dd851e6e04905e28ae724db9c3725a7d47e Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Tue, 9 Jul 2024 11:38:16 +0200 Subject: [PATCH 86/86] use date that seems more stable than one that depends on a config entry that may change over time and then change the date in previous documents --- rdf/AntragWiederholung.xml.php | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/rdf/AntragWiederholung.xml.php b/rdf/AntragWiederholung.xml.php index e972a46a2..d38775020 100644 --- a/rdf/AntragWiederholung.xml.php +++ b/rdf/AntragWiederholung.xml.php @@ -78,15 +78,14 @@ if ($config['note_blacklist_wiederholung']) { $query = " SELECT stg.bezeichnung, tbl_orgform.bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, pss.ausbildungssemester AS semester, ( - SELECT pr.datum - FROM lehre.tbl_pruefung pr - JOIN lehre.tbl_note n USING (note) - WHERE pr.student_uid = tbl_student.student_uid - AND pr.datum <= a.datum - AND pr.pruefungstyp_kurzbz IN ('kommPruef', 'zusKommPruef') - AND n.positiv=FALSE - " . $blacklist . " - ORDER BY datum DESC + SELECT + insertamum::date + FROM + campus.tbl_studierendenantrag_status + WHERE + studierendenantrag_id = a.studierendenantrag_id AND studierendenantrag_statustyp_kurzbz = 'Abgemeldet' + ORDER BY + insertamum DESC LIMIT 1 ) AS abmeldedatum, (SELECT pt.text FROM system.tbl_phrase p JOIN system.tbl_phrasentext pt USING(phrase_id) WHERE p.category=" . $db->db_add_param('studierendenantrag', FHC_STRING) . " AND p.phrase=" . $db->db_add_param('grund_Wiederholung_deadline', FHC_STRING) . " AND pt.sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . " LIMIT 1) AS grund FROM @@ -110,7 +109,6 @@ if (!$db->db_query($query) || !$db->db_num_rows()) db_fetch_object()) { ?> abmeldedatum); - $abmeldedatum->modify($config['wiederholung_job_deadline_date_modifier']); ?> vorname . ' ' . $row->nachname); ?>]]>